UnderAutomation.ABB 1.0.2.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- underautomation/__init__.py +0 -0
- underautomation/abb/__init__.py +7 -0
- underautomation/abb/abb_controller.py +81 -0
- underautomation/abb/common/__init__.py +0 -0
- underautomation/abb/common/external_joints.py +91 -0
- underautomation/abb/common/joint_target.py +50 -0
- underautomation/abb/common/pose.py +46 -0
- underautomation/abb/common/position.py +58 -0
- underautomation/abb/common/quaternion.py +68 -0
- underautomation/abb/common/rob_target.py +56 -0
- underautomation/abb/common/robot_configuration.py +68 -0
- underautomation/abb/common/robot_joints.py +88 -0
- underautomation/abb/connection_parameters.py +57 -0
- underautomation/abb/discovery/__init__.py +0 -0
- underautomation/abb/discovery/discovered_controller.py +85 -0
- underautomation/abb/lib/UnderAutomation.Abb.dll +0 -0
- underautomation/abb/lib/version.txt +1 -0
- underautomation/abb/license/__init__.py +0 -0
- underautomation/abb/license/invalid_license_exception.py +31 -0
- underautomation/abb/license/license_info.py +93 -0
- underautomation/abb/license/license_state.py +11 -0
- underautomation/abb/rws/__init__.py +0 -0
- underautomation/abb/rws/data/__init__.py +0 -0
- underautomation/abb/rws/data/axis_info.py +55 -0
- underautomation/abb/rws/data/backup_restore_ignore.py +8 -0
- underautomation/abb/rws/data/backup_restore_include.py +7 -0
- underautomation/abb/rws/data/backup_state.py +11 -0
- underautomation/abb/rws/data/backup_system_info.py +76 -0
- underautomation/abb/rws/data/base_frame.py +36 -0
- underautomation/abb/rws/data/calibration_info.py +77 -0
- underautomation/abb/rws/data/calibration_joint_info.py +62 -0
- underautomation/abb/rws/data/check_restore_result.py +51 -0
- underautomation/abb/rws/data/check_restore_status.py +10 -0
- underautomation/abb/rws/data/collision_detection_state.py +9 -0
- underautomation/abb/rws/data/controller_identity.py +75 -0
- underautomation/abb/rws/data/controller_info.py +76 -0
- underautomation/abb/rws/data/controller_level.py +7 -0
- underautomation/abb/rws/data/controller_restart_mode.py +10 -0
- underautomation/abb/rws/data/controller_state.py +12 -0
- underautomation/abb/rws/data/controller_type.py +7 -0
- underautomation/abb/rws/data/coordinate_system.py +9 -0
- underautomation/abb/rws/data/cyclic_brake_check_state.py +8 -0
- underautomation/abb/rws/data/cyclic_brake_check_status.py +66 -0
- underautomation/abb/rws/data/cyclic_brake_check_test_status.py +9 -0
- underautomation/abb/rws/data/device_item.py +74 -0
- underautomation/abb/rws/data/device_type.py +9 -0
- underautomation/abb/rws/data/directory_item.py +36 -0
- underautomation/abb/rws/data/directory_listing.py +81 -0
- underautomation/abb/rws/data/elog_domain.py +62 -0
- underautomation/abb/rws/data/elog_message.py +143 -0
- underautomation/abb/rws/data/elog_message_argument.py +53 -0
- underautomation/abb/rws/data/elog_message_order.py +6 -0
- underautomation/abb/rws/data/elog_message_type.py +8 -0
- underautomation/abb/rws/data/file_item.py +45 -0
- underautomation/abb/rws/data/file_system_item.py +53 -0
- underautomation/abb/rws/data/io_client_action.py +8 -0
- underautomation/abb/rws/data/io_device_configuration.py +125 -0
- underautomation/abb/rws/data/io_device_item.py +129 -0
- underautomation/abb/rws/data/io_device_logical_state.py +7 -0
- underautomation/abb/rws/data/io_device_physical_state.py +13 -0
- underautomation/abb/rws/data/io_device_upgrade_info.py +63 -0
- underautomation/abb/rws/data/io_firmware_module_info.py +93 -0
- underautomation/abb/rws/data/io_firmware_upgrade_state.py +19 -0
- underautomation/abb/rws/data/io_firmware_upgrade_status.py +9 -0
- underautomation/abb/rws/data/io_network_configuration.py +53 -0
- underautomation/abb/rws/data/io_network_configuration_type.py +9 -0
- underautomation/abb/rws/data/io_network_item.py +66 -0
- underautomation/abb/rws/data/io_network_logical_state.py +7 -0
- underautomation/abb/rws/data/io_network_physical_state.py +10 -0
- underautomation/abb/rws/data/io_signal_configuration.py +98 -0
- underautomation/abb/rws/data/io_signal_item.py +176 -0
- underautomation/abb/rws/data/io_signal_logical_state.py +7 -0
- underautomation/abb/rws/data/io_signal_physical_state.py +7 -0
- underautomation/abb/rws/data/io_signal_search_criteria.py +100 -0
- underautomation/abb/rws/data/io_signal_type.py +11 -0
- underautomation/abb/rws/data/jog_increment_mode.py +9 -0
- underautomation/abb/rws/data/jog_mode.py +11 -0
- underautomation/abb/rws/data/joint_solution.py +37 -0
- underautomation/abb/rws/data/lead_through_status.py +7 -0
- underautomation/abb/rws/data/mastership_domain.py +8 -0
- underautomation/abb/rws/data/mastership_holder.py +9 -0
- underautomation/abb/rws/data/mastership_info.py +93 -0
- underautomation/abb/rws/data/mechanical_unit_info.py +171 -0
- underautomation/abb/rws/data/mechanical_unit_item.py +64 -0
- underautomation/abb/rws/data/mechanical_unit_mode.py +7 -0
- underautomation/abb/rws/data/mechanical_unit_status.py +14 -0
- underautomation/abb/rws/data/mechanical_unit_type.py +10 -0
- underautomation/abb/rws/data/motion_error_state.py +13 -0
- underautomation/abb/rws/data/motion_supervision.py +44 -0
- underautomation/abb/rws/data/motion_system_error_state.py +55 -0
- underautomation/abb/rws/data/motion_system_info.py +71 -0
- underautomation/abb/rws/data/motor_calibration_name.py +53 -0
- underautomation/abb/rws/data/network_configuration_method.py +7 -0
- underautomation/abb/rws/data/network_interface_item.py +107 -0
- underautomation/abb/rws/data/operation_mode.py +12 -0
- underautomation/abb/rws/data/operation_mode_acknowledgement.py +7 -0
- underautomation/abb/rws/data/operation_mode_lock_state.py +10 -0
- underautomation/abb/rws/data/path_supervision.py +44 -0
- underautomation/abb/rws/data/rapid_activation_record.py +91 -0
- underautomation/abb/rws/data/rapid_alias_io_item.py +55 -0
- underautomation/abb/rws/data/rapid_breakpoint.py +71 -0
- underautomation/abb/rws/data/rapid_build_error.py +71 -0
- underautomation/abb/rws/data/rapid_execution_cycle.py +9 -0
- underautomation/abb/rws/data/rapid_execution_info.py +48 -0
- underautomation/abb/rws/data/rapid_execution_level.py +9 -0
- underautomation/abb/rws/data/rapid_execution_mode.py +11 -0
- underautomation/abb/rws/data/rapid_execution_state.py +7 -0
- underautomation/abb/rws/data/rapid_execution_type.py +11 -0
- underautomation/abb/rws/data/rapid_external_joint_states.py +82 -0
- underautomation/abb/rws/data/rapid_hold_to_run_state.py +7 -0
- underautomation/abb/rws/data/rapid_instruction_template.py +81 -0
- underautomation/abb/rws/data/rapid_instruction_template_argument.py +116 -0
- underautomation/abb/rws/data/rapid_joint_state.py +9 -0
- underautomation/abb/rws/data/rapid_mechanical_unit_item.py +57 -0
- underautomation/abb/rws/data/rapid_modifiable_position_item.py +80 -0
- underautomation/abb/rws/data/rapid_modifiable_positions.py +71 -0
- underautomation/abb/rws/data/rapid_module_attribute.py +11 -0
- underautomation/abb/rws/data/rapid_module_extension.py +53 -0
- underautomation/abb/rws/data/rapid_module_info.py +52 -0
- underautomation/abb/rws/data/rapid_module_item.py +46 -0
- underautomation/abb/rws/data/rapid_module_symbol.py +136 -0
- underautomation/abb/rws/data/rapid_module_text.py +53 -0
- underautomation/abb/rws/data/rapid_module_type.py +7 -0
- underautomation/abb/rws/data/rapid_object_child.py +59 -0
- underautomation/abb/rws/data/rapid_object_child_range.py +50 -0
- underautomation/abb/rws/data/rapid_object_list_extension.py +54 -0
- underautomation/abb/rws/data/rapid_object_list_type.py +13 -0
- underautomation/abb/rws/data/rapid_pallet_head_item.py +44 -0
- underautomation/abb/rws/data/rapid_pallet_item.py +71 -0
- underautomation/abb/rws/data/rapid_pointer_position.py +109 -0
- underautomation/abb/rws/data/rapid_pointer_sync_state.py +7 -0
- underautomation/abb/rws/data/rapid_pointers.py +45 -0
- underautomation/abb/rws/data/rapid_preferred_data_type_item.py +44 -0
- underautomation/abb/rws/data/rapid_program_counter_position.py +80 -0
- underautomation/abb/rws/data/rapid_program_info.py +44 -0
- underautomation/abb/rws/data/rapid_program_load_mode.py +6 -0
- underautomation/abb/rws/data/rapid_regain_mode.py +8 -0
- underautomation/abb/rws/data/rapid_routine_argument.py +116 -0
- underautomation/abb/rws/data/rapid_routine_info.py +82 -0
- underautomation/abb/rws/data/rapid_service_routine_item.py +53 -0
- underautomation/abb/rws/data/rapid_set_text_range_result.py +53 -0
- underautomation/abb/rws/data/rapid_spy_status.py +7 -0
- underautomation/abb/rws/data/rapid_start_condition.py +6 -0
- underautomation/abb/rws/data/rapid_stop_mode.py +8 -0
- underautomation/abb/rws/data/rapid_structural_change_count.py +44 -0
- underautomation/abb/rws/data/rapid_symbol_properties.py +154 -0
- underautomation/abb/rws/data/rapid_symbol_search_criteria.py +140 -0
- underautomation/abb/rws/data/rapid_symbol_search_view.py +8 -0
- underautomation/abb/rws/data/rapid_symbol_type.py +22 -0
- underautomation/abb/rws/data/rapid_symbol_value.py +54 -0
- underautomation/abb/rws/data/rapid_symbol_variable_type.py +9 -0
- underautomation/abb/rws/data/rapid_task_execution_mode.py +12 -0
- underautomation/abb/rws/data/rapid_task_execution_state.py +9 -0
- underautomation/abb/rws/data/rapid_task_info.py +118 -0
- underautomation/abb/rws/data/rapid_task_item.py +86 -0
- underautomation/abb/rws/data/rapid_task_scope.py +6 -0
- underautomation/abb/rws/data/rapid_task_selection_item.py +62 -0
- underautomation/abb/rws/data/rapid_task_state.py +10 -0
- underautomation/abb/rws/data/rapid_task_trust_level.py +9 -0
- underautomation/abb/rws/data/rapid_task_type.py +8 -0
- underautomation/abb/rws/data/rapid_text_position.py +49 -0
- underautomation/abb/rws/data/rapid_text_query_mode.py +6 -0
- underautomation/abb/rws/data/rapid_text_range.py +62 -0
- underautomation/abb/rws/data/rapid_text_replace_mode.py +7 -0
- underautomation/abb/rws/data/rapid_ui_instruction.py +75 -0
- underautomation/abb/rws/data/rapid_ui_instruction_event.py +8 -0
- underautomation/abb/rws/data/rapid_ui_instruction_parameter.py +44 -0
- underautomation/abb/rws/data/safety_configuration.py +126 -0
- underautomation/abb/rws/data/safety_load_operation_status.py +11 -0
- underautomation/abb/rws/data/safety_mode.py +9 -0
- underautomation/abb/rws/data/safety_mode_status.py +46 -0
- underautomation/abb/rws/data/safety_violation_info.py +154 -0
- underautomation/abb/rws/data/safety_violation_type.py +19 -0
- underautomation/abb/rws/data/smb_data.py +181 -0
- underautomation/abb/rws/data/smb_data_memory.py +6 -0
- underautomation/abb/rws/data/smb_data_status.py +9 -0
- underautomation/abb/rws/data/smb_data_transfer.py +6 -0
- underautomation/abb/rws/data/system_energy.py +121 -0
- underautomation/abb/rws/data/system_energy_axis.py +44 -0
- underautomation/abb/rws/data/system_energy_mechanical_unit.py +50 -0
- underautomation/abb/rws/data/system_energy_state.py +12 -0
- underautomation/abb/rws/data/system_info.py +203 -0
- underautomation/abb/rws/data/system_product.py +53 -0
- underautomation/abb/rws/data/time_server_info.py +45 -0
- underautomation/abb/rws/data/virtual_time_state.py +9 -0
- underautomation/abb/rws/internal/__init__.py +0 -0
- underautomation/abb/rws/internal/rws_client_base.py +115 -0
- underautomation/abb/rws/internal/rws_client_internal.py +26 -0
- underautomation/abb/rws/internal/rws_connect_parameters_base.py +81 -0
- underautomation/abb/rws/rws_client.py +42 -0
- underautomation/abb/rws/rws_connect_parameters.py +47 -0
- underautomation/abb/rws/rws_exception.py +51 -0
- underautomation/abb/rws/rws_version.py +6 -0
- underautomation/abb/rws/services/__init__.py +0 -0
- underautomation/abb/rws/services/controller_service.py +355 -0
- underautomation/abb/rws/services/elog_service.py +88 -0
- underautomation/abb/rws/services/file_service.py +124 -0
- underautomation/abb/rws/services/io_service.py +260 -0
- underautomation/abb/rws/services/mastership_service.py +57 -0
- underautomation/abb/rws/services/motion_system_service.py +438 -0
- underautomation/abb/rws/services/panel_service.py +124 -0
- underautomation/abb/rws/services/rapid_service.py +770 -0
- underautomation/abb/rws/services/system_service.py +82 -0
- underautomation_abb-1.0.2.0.dist-info/METADATA +583 -0
- underautomation_abb-1.0.2.0.dist-info/RECORD +207 -0
- underautomation_abb-1.0.2.0.dist-info/WHEEL +5 -0
- underautomation_abb-1.0.2.0.dist-info/top_level.txt +1 -0
|
File without changes
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
import typing
|
|
3
|
+
from underautomation.abb.connection_parameters import ConnectionParameters
|
|
4
|
+
from underautomation.abb.rws.internal.rws_client_internal import RwsClientInternal
|
|
5
|
+
from underautomation.abb.discovery.discovered_controller import DiscoveredController
|
|
6
|
+
from underautomation.abb.license.license_info import LicenseInfo
|
|
7
|
+
from UnderAutomation.ABB import AbbController as abb_controller
|
|
8
|
+
|
|
9
|
+
class AbbController:
|
|
10
|
+
'''Main class of the SDK that represents a connection to an ABB robot controller'''
|
|
11
|
+
def __init__(self, _internal = 0):
|
|
12
|
+
'''Instantiate a new ABB robot controller connection'''
|
|
13
|
+
if(_internal == 0):
|
|
14
|
+
self._instance = abb_controller()
|
|
15
|
+
else:
|
|
16
|
+
self._instance = _internal
|
|
17
|
+
|
|
18
|
+
def connect(self, ip_or_parameters: str | ConnectionParameters) -> None:
|
|
19
|
+
'''Connect to robot by IP with default connection parameters
|
|
20
|
+
Initialize a connection to the robot with specified parameters
|
|
21
|
+
|
|
22
|
+
:param ip_or_parameters: IP address or hostname of the robot controller — or — Connection parameters
|
|
23
|
+
'''
|
|
24
|
+
self._instance.Connect(getattr(ip_or_parameters, '_instance', ip_or_parameters))
|
|
25
|
+
|
|
26
|
+
def disconnect(self) -> None:
|
|
27
|
+
'''Disconnect from the robot controller'''
|
|
28
|
+
self._instance.Disconnect()
|
|
29
|
+
|
|
30
|
+
@staticmethod
|
|
31
|
+
def discover(timeoutMilliseconds: int=2000) -> typing.List[DiscoveredController]:
|
|
32
|
+
'''Search the local network for ABB robot controllers, during the given time. Two ways of finding a controller run together: the announcements the controllers of the network send, and a test of the ports this machine serves, which is what finds the virtual controllers of RobotStudio whatever port they were given. No license is needed.
|
|
33
|
+
|
|
34
|
+
:param timeoutMilliseconds: How long the search lasts, in milliseconds. Below 1000 ms a slow controller may be missed. Default is 2000 ms.
|
|
35
|
+
:returns: The controllers that answered, or an empty array when none did
|
|
36
|
+
'''
|
|
37
|
+
return [DiscoveredController(x) for x in abb_controller.Discover(timeoutMilliseconds)]
|
|
38
|
+
|
|
39
|
+
@staticmethod
|
|
40
|
+
def register_license(licensee: str, key: str) -> LicenseInfo:
|
|
41
|
+
'''If you have a license and a key, please call this static method to register the product and exit the trial period. You can register a product even if the trial period has ended.
|
|
42
|
+
|
|
43
|
+
:param licensee: Your organization name
|
|
44
|
+
:param key: The associated key supplied by UnderAutomation
|
|
45
|
+
:returns: Information about the supplied license
|
|
46
|
+
'''
|
|
47
|
+
return LicenseInfo(None, None, abb_controller.RegisterLicense(licensee, key))
|
|
48
|
+
|
|
49
|
+
@property
|
|
50
|
+
def address(self) -> str:
|
|
51
|
+
'''IP or robot name'''
|
|
52
|
+
return self._instance.Address
|
|
53
|
+
|
|
54
|
+
@property
|
|
55
|
+
def enabled(self) -> bool:
|
|
56
|
+
'''Check if the robot controller is connected'''
|
|
57
|
+
return self._instance.Enabled
|
|
58
|
+
|
|
59
|
+
@property
|
|
60
|
+
def rws(self) -> RwsClientInternal:
|
|
61
|
+
'''RWS client providing access to Robot Web Services API (controller, panel, IO, RAPID, file system, subscriptions)'''
|
|
62
|
+
return RwsClientInternal(self._instance.Rws)
|
|
63
|
+
|
|
64
|
+
@property
|
|
65
|
+
def license_info(self) -> LicenseInfo:
|
|
66
|
+
'''Return information about your license'''
|
|
67
|
+
return LicenseInfo(None, None, self._instance.LicenseInfo)
|
|
68
|
+
|
|
69
|
+
def __str__(self):
|
|
70
|
+
return self._instance.ToString() if self._instance is not None else ""
|
|
71
|
+
|
|
72
|
+
def __repr__(self):
|
|
73
|
+
return self.__str__()
|
|
74
|
+
|
|
75
|
+
def __eq__(self, other) -> bool:
|
|
76
|
+
if not isinstance(other, AbbController):
|
|
77
|
+
NotImplemented
|
|
78
|
+
return self._instance.Equals(other._instance)
|
|
79
|
+
|
|
80
|
+
def __hash__(self) -> int:
|
|
81
|
+
return self._instance.GetHashCode() if self._instance is not None else 0
|
|
File without changes
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
import typing
|
|
3
|
+
from UnderAutomation.ABB.Common import ExternalJoints as external_joints
|
|
4
|
+
|
|
5
|
+
class ExternalJoints:
|
|
6
|
+
'''The six external axis values that travel with a robot position. An axis the robot system does not define comes back as 9E9, which is how the controller says "not in use" rather than an actual position.'''
|
|
7
|
+
def __init__(self, axisA: float, axisB: float, axisC: float, axisD: float, axisE: float, axisF: float, _internal = 0):
|
|
8
|
+
'''Initializes the six external axes
|
|
9
|
+
|
|
10
|
+
:param axisA: Value of external axis A
|
|
11
|
+
:param axisB: Value of external axis B
|
|
12
|
+
:param axisC: Value of external axis C
|
|
13
|
+
:param axisD: Value of external axis D
|
|
14
|
+
:param axisE: Value of external axis E
|
|
15
|
+
:param axisF: Value of external axis F
|
|
16
|
+
'''
|
|
17
|
+
if(_internal == 0):
|
|
18
|
+
self._instance = external_joints(axisA, axisB, axisC, axisD, axisE, axisF)
|
|
19
|
+
else:
|
|
20
|
+
self._instance = _internal
|
|
21
|
+
|
|
22
|
+
@property
|
|
23
|
+
def axis_a(self) -> float:
|
|
24
|
+
'''Value of external axis A'''
|
|
25
|
+
return self._instance.AxisA
|
|
26
|
+
|
|
27
|
+
@axis_a.setter
|
|
28
|
+
def axis_a(self, value: float):
|
|
29
|
+
self._instance.AxisA = value
|
|
30
|
+
|
|
31
|
+
@property
|
|
32
|
+
def axis_b(self) -> float:
|
|
33
|
+
'''Value of external axis B'''
|
|
34
|
+
return self._instance.AxisB
|
|
35
|
+
|
|
36
|
+
@axis_b.setter
|
|
37
|
+
def axis_b(self, value: float):
|
|
38
|
+
self._instance.AxisB = value
|
|
39
|
+
|
|
40
|
+
@property
|
|
41
|
+
def axis_c(self) -> float:
|
|
42
|
+
'''Value of external axis C'''
|
|
43
|
+
return self._instance.AxisC
|
|
44
|
+
|
|
45
|
+
@axis_c.setter
|
|
46
|
+
def axis_c(self, value: float):
|
|
47
|
+
self._instance.AxisC = value
|
|
48
|
+
|
|
49
|
+
@property
|
|
50
|
+
def axis_d(self) -> float:
|
|
51
|
+
'''Value of external axis D'''
|
|
52
|
+
return self._instance.AxisD
|
|
53
|
+
|
|
54
|
+
@axis_d.setter
|
|
55
|
+
def axis_d(self, value: float):
|
|
56
|
+
self._instance.AxisD = value
|
|
57
|
+
|
|
58
|
+
@property
|
|
59
|
+
def axis_e(self) -> float:
|
|
60
|
+
'''Value of external axis E'''
|
|
61
|
+
return self._instance.AxisE
|
|
62
|
+
|
|
63
|
+
@axis_e.setter
|
|
64
|
+
def axis_e(self, value: float):
|
|
65
|
+
self._instance.AxisE = value
|
|
66
|
+
|
|
67
|
+
@property
|
|
68
|
+
def axis_f(self) -> float:
|
|
69
|
+
'''Value of external axis F'''
|
|
70
|
+
return self._instance.AxisF
|
|
71
|
+
|
|
72
|
+
@axis_f.setter
|
|
73
|
+
def axis_f(self, value: float):
|
|
74
|
+
self._instance.AxisF = value
|
|
75
|
+
|
|
76
|
+
def __str__(self):
|
|
77
|
+
return self._instance.ToString() if self._instance is not None else ""
|
|
78
|
+
|
|
79
|
+
def __repr__(self):
|
|
80
|
+
return self.__str__()
|
|
81
|
+
|
|
82
|
+
def __eq__(self, other) -> bool:
|
|
83
|
+
if not isinstance(other, ExternalJoints):
|
|
84
|
+
NotImplemented
|
|
85
|
+
return self._instance.Equals(other._instance)
|
|
86
|
+
|
|
87
|
+
def __hash__(self) -> int:
|
|
88
|
+
return self._instance.GetHashCode() if self._instance is not None else 0
|
|
89
|
+
|
|
90
|
+
# Value the controller reports for an external axis that is not in use
|
|
91
|
+
ExternalJoints.NotInUse = external_joints.NotInUse
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
import typing
|
|
3
|
+
from underautomation.abb.common.robot_joints import RobotJoints
|
|
4
|
+
from underautomation.abb.common.external_joints import ExternalJoints
|
|
5
|
+
from UnderAutomation.ABB.Common import JointTarget as joint_target
|
|
6
|
+
|
|
7
|
+
class JointTarget:
|
|
8
|
+
'''A robot position expressed joint by joint: the six axes of the arm and the six external axes.'''
|
|
9
|
+
def __init__(self, robotAxes: RobotJoints, externalAxes: ExternalJoints, _internal = 0):
|
|
10
|
+
'''Initializes a new joint target
|
|
11
|
+
|
|
12
|
+
:param robotAxes: Values of the six axes of the robot arm, zero when null
|
|
13
|
+
:param externalAxes: Values of the six external axes, zero when null
|
|
14
|
+
'''
|
|
15
|
+
if(_internal == 0):
|
|
16
|
+
self._instance = joint_target(robotAxes._instance if robotAxes else None, externalAxes._instance if externalAxes else None)
|
|
17
|
+
else:
|
|
18
|
+
self._instance = _internal
|
|
19
|
+
|
|
20
|
+
@property
|
|
21
|
+
def robot_axes(self) -> RobotJoints:
|
|
22
|
+
'''Values of the six axes of the robot arm. Never null.'''
|
|
23
|
+
return RobotJoints(None, None, None, None, None, None, self._instance.RobotAxes)
|
|
24
|
+
|
|
25
|
+
@robot_axes.setter
|
|
26
|
+
def robot_axes(self, value: RobotJoints):
|
|
27
|
+
self._instance.RobotAxes = value._instance if value else None
|
|
28
|
+
|
|
29
|
+
@property
|
|
30
|
+
def external_axes(self) -> ExternalJoints:
|
|
31
|
+
'''Values of the six external axes. Never null.'''
|
|
32
|
+
return ExternalJoints(None, None, None, None, None, None, self._instance.ExternalAxes)
|
|
33
|
+
|
|
34
|
+
@external_axes.setter
|
|
35
|
+
def external_axes(self, value: ExternalJoints):
|
|
36
|
+
self._instance.ExternalAxes = value._instance if value else None
|
|
37
|
+
|
|
38
|
+
def __str__(self):
|
|
39
|
+
return self._instance.ToString() if self._instance is not None else ""
|
|
40
|
+
|
|
41
|
+
def __repr__(self):
|
|
42
|
+
return self.__str__()
|
|
43
|
+
|
|
44
|
+
def __eq__(self, other) -> bool:
|
|
45
|
+
if not isinstance(other, JointTarget):
|
|
46
|
+
NotImplemented
|
|
47
|
+
return self._instance.Equals(other._instance)
|
|
48
|
+
|
|
49
|
+
def __hash__(self) -> int:
|
|
50
|
+
return self._instance.GetHashCode() if self._instance is not None else 0
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
import typing
|
|
3
|
+
from underautomation.abb.common.quaternion import Quaternion
|
|
4
|
+
from underautomation.abb.common.position import Position
|
|
5
|
+
from UnderAutomation.ABB.Common import Pose as pose
|
|
6
|
+
|
|
7
|
+
class Pose(Position):
|
|
8
|
+
'''A position and the orientation the robot holds there: a Position extended with a Quaternion.'''
|
|
9
|
+
def __init__(self, x: float, y: float, z: float, q1: float, q2: float, q3: float, q4: float, _internal = 0):
|
|
10
|
+
'''Initializes a new pose
|
|
11
|
+
|
|
12
|
+
:param x: Coordinate along the X axis
|
|
13
|
+
:param y: Coordinate along the Y axis
|
|
14
|
+
:param z: Coordinate along the Z axis
|
|
15
|
+
:param q1: Real component of the orientation
|
|
16
|
+
:param q2: First imaginary component of the orientation
|
|
17
|
+
:param q3: Second imaginary component of the orientation
|
|
18
|
+
:param q4: Third imaginary component of the orientation
|
|
19
|
+
'''
|
|
20
|
+
if(_internal == 0):
|
|
21
|
+
self._instance = pose(x, y, z, q1, q2, q3, q4)
|
|
22
|
+
else:
|
|
23
|
+
self._instance = _internal
|
|
24
|
+
|
|
25
|
+
@property
|
|
26
|
+
def orientation(self) -> Quaternion:
|
|
27
|
+
'''Orientation held at this position. Never null: a pose built without one carries the identity rotation.'''
|
|
28
|
+
return Quaternion(None, None, None, None, self._instance.Orientation)
|
|
29
|
+
|
|
30
|
+
@orientation.setter
|
|
31
|
+
def orientation(self, value: Quaternion):
|
|
32
|
+
self._instance.Orientation = value._instance if value else None
|
|
33
|
+
|
|
34
|
+
def __str__(self):
|
|
35
|
+
return self._instance.ToString() if self._instance is not None else ""
|
|
36
|
+
|
|
37
|
+
def __repr__(self):
|
|
38
|
+
return self.__str__()
|
|
39
|
+
|
|
40
|
+
def __eq__(self, other) -> bool:
|
|
41
|
+
if not isinstance(other, Pose):
|
|
42
|
+
NotImplemented
|
|
43
|
+
return self._instance.Equals(other._instance)
|
|
44
|
+
|
|
45
|
+
def __hash__(self) -> int:
|
|
46
|
+
return self._instance.GetHashCode() if self._instance is not None else 0
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
import typing
|
|
3
|
+
from UnderAutomation.ABB.Common import Position as position
|
|
4
|
+
|
|
5
|
+
class Position:
|
|
6
|
+
'''A point in space, expressed in the coordinate system of whoever produced it. Most readings of the controller express a position in millimetres, while the kinematics calculations work in metres. The method that returns or takes a position says which one it uses.'''
|
|
7
|
+
def __init__(self, x: float, y: float, z: float, _internal = 0):
|
|
8
|
+
'''Initializes a new position
|
|
9
|
+
|
|
10
|
+
:param x: Coordinate along the X axis
|
|
11
|
+
:param y: Coordinate along the Y axis
|
|
12
|
+
:param z: Coordinate along the Z axis
|
|
13
|
+
'''
|
|
14
|
+
if(_internal == 0):
|
|
15
|
+
self._instance = position(x, y, z)
|
|
16
|
+
else:
|
|
17
|
+
self._instance = _internal
|
|
18
|
+
|
|
19
|
+
@property
|
|
20
|
+
def x(self) -> float:
|
|
21
|
+
'''Coordinate along the X axis'''
|
|
22
|
+
return self._instance.X
|
|
23
|
+
|
|
24
|
+
@x.setter
|
|
25
|
+
def x(self, value: float):
|
|
26
|
+
self._instance.X = value
|
|
27
|
+
|
|
28
|
+
@property
|
|
29
|
+
def y(self) -> float:
|
|
30
|
+
'''Coordinate along the Y axis'''
|
|
31
|
+
return self._instance.Y
|
|
32
|
+
|
|
33
|
+
@y.setter
|
|
34
|
+
def y(self, value: float):
|
|
35
|
+
self._instance.Y = value
|
|
36
|
+
|
|
37
|
+
@property
|
|
38
|
+
def z(self) -> float:
|
|
39
|
+
'''Coordinate along the Z axis'''
|
|
40
|
+
return self._instance.Z
|
|
41
|
+
|
|
42
|
+
@z.setter
|
|
43
|
+
def z(self, value: float):
|
|
44
|
+
self._instance.Z = value
|
|
45
|
+
|
|
46
|
+
def __str__(self):
|
|
47
|
+
return self._instance.ToString() if self._instance is not None else ""
|
|
48
|
+
|
|
49
|
+
def __repr__(self):
|
|
50
|
+
return self.__str__()
|
|
51
|
+
|
|
52
|
+
def __eq__(self, other) -> bool:
|
|
53
|
+
if not isinstance(other, Position):
|
|
54
|
+
NotImplemented
|
|
55
|
+
return self._instance.Equals(other._instance)
|
|
56
|
+
|
|
57
|
+
def __hash__(self) -> int:
|
|
58
|
+
return self._instance.GetHashCode() if self._instance is not None else 0
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
import typing
|
|
3
|
+
from UnderAutomation.ABB.Common import Quaternion as quaternion
|
|
4
|
+
|
|
5
|
+
class Quaternion:
|
|
6
|
+
'''An orientation in space, expressed as a unit quaternion. The controller rejects a quaternion that is not normalized, so keep ² + ² + ² + ² equal to 1.'''
|
|
7
|
+
def __init__(self, q1: float, q2: float, q3: float, q4: float, _internal = 0):
|
|
8
|
+
'''Initializes a new quaternion
|
|
9
|
+
|
|
10
|
+
:param q1: Real component
|
|
11
|
+
:param q2: First imaginary component
|
|
12
|
+
:param q3: Second imaginary component
|
|
13
|
+
:param q4: Third imaginary component
|
|
14
|
+
'''
|
|
15
|
+
if(_internal == 0):
|
|
16
|
+
self._instance = quaternion(q1, q2, q3, q4)
|
|
17
|
+
else:
|
|
18
|
+
self._instance = _internal
|
|
19
|
+
|
|
20
|
+
@property
|
|
21
|
+
def q1(self) -> float:
|
|
22
|
+
'''Real component of the quaternion'''
|
|
23
|
+
return self._instance.Q1
|
|
24
|
+
|
|
25
|
+
@q1.setter
|
|
26
|
+
def q1(self, value: float):
|
|
27
|
+
self._instance.Q1 = value
|
|
28
|
+
|
|
29
|
+
@property
|
|
30
|
+
def q2(self) -> float:
|
|
31
|
+
'''First imaginary component of the quaternion'''
|
|
32
|
+
return self._instance.Q2
|
|
33
|
+
|
|
34
|
+
@q2.setter
|
|
35
|
+
def q2(self, value: float):
|
|
36
|
+
self._instance.Q2 = value
|
|
37
|
+
|
|
38
|
+
@property
|
|
39
|
+
def q3(self) -> float:
|
|
40
|
+
'''Second imaginary component of the quaternion'''
|
|
41
|
+
return self._instance.Q3
|
|
42
|
+
|
|
43
|
+
@q3.setter
|
|
44
|
+
def q3(self, value: float):
|
|
45
|
+
self._instance.Q3 = value
|
|
46
|
+
|
|
47
|
+
@property
|
|
48
|
+
def q4(self) -> float:
|
|
49
|
+
'''Third imaginary component of the quaternion'''
|
|
50
|
+
return self._instance.Q4
|
|
51
|
+
|
|
52
|
+
@q4.setter
|
|
53
|
+
def q4(self, value: float):
|
|
54
|
+
self._instance.Q4 = value
|
|
55
|
+
|
|
56
|
+
def __str__(self):
|
|
57
|
+
return self._instance.ToString() if self._instance is not None else ""
|
|
58
|
+
|
|
59
|
+
def __repr__(self):
|
|
60
|
+
return self.__str__()
|
|
61
|
+
|
|
62
|
+
def __eq__(self, other) -> bool:
|
|
63
|
+
if not isinstance(other, Quaternion):
|
|
64
|
+
NotImplemented
|
|
65
|
+
return self._instance.Equals(other._instance)
|
|
66
|
+
|
|
67
|
+
def __hash__(self) -> int:
|
|
68
|
+
return self._instance.GetHashCode() if self._instance is not None else 0
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
import typing
|
|
3
|
+
from underautomation.abb.common.robot_configuration import RobotConfiguration
|
|
4
|
+
from underautomation.abb.common.external_joints import ExternalJoints
|
|
5
|
+
from underautomation.abb.common.quaternion import Quaternion
|
|
6
|
+
from underautomation.abb.common.pose import Pose
|
|
7
|
+
from UnderAutomation.ABB.Common import RobTarget as rob_target
|
|
8
|
+
|
|
9
|
+
class RobTarget(Pose):
|
|
10
|
+
'''A complete robot target: a Pose extended with the axis configuration used to reach it and the external axis values that travel with it.'''
|
|
11
|
+
def __init__(self, x: float, y: float, z: float, orientation: Quaternion, configuration: RobotConfiguration, externalAxes: ExternalJoints, _internal = 0):
|
|
12
|
+
'''Initializes a new target
|
|
13
|
+
|
|
14
|
+
:param x: Coordinate along the X axis
|
|
15
|
+
:param y: Coordinate along the Y axis
|
|
16
|
+
:param z: Coordinate along the Z axis
|
|
17
|
+
:param orientation: Orientation held at that position, the identity rotation when null
|
|
18
|
+
:param configuration: Axis configuration used to reach the pose, all zero when null
|
|
19
|
+
:param externalAxes: Values of the six external axes
|
|
20
|
+
'''
|
|
21
|
+
if(_internal == 0):
|
|
22
|
+
self._instance = rob_target(x, y, z, orientation._instance if orientation else None, configuration._instance if configuration else None, externalAxes._instance if externalAxes else None)
|
|
23
|
+
else:
|
|
24
|
+
self._instance = _internal
|
|
25
|
+
|
|
26
|
+
@property
|
|
27
|
+
def configuration(self) -> RobotConfiguration:
|
|
28
|
+
'''Axis configuration used to reach the pose. Never null.'''
|
|
29
|
+
return RobotConfiguration(None, None, None, None, self._instance.Configuration)
|
|
30
|
+
|
|
31
|
+
@configuration.setter
|
|
32
|
+
def configuration(self, value: RobotConfiguration):
|
|
33
|
+
self._instance.Configuration = value._instance if value else None
|
|
34
|
+
|
|
35
|
+
@property
|
|
36
|
+
def external_axes(self) -> ExternalJoints:
|
|
37
|
+
'''Values of the six external axes, null when the reading does not report them'''
|
|
38
|
+
return ExternalJoints(None, None, None, None, None, None, self._instance.ExternalAxes)
|
|
39
|
+
|
|
40
|
+
@external_axes.setter
|
|
41
|
+
def external_axes(self, value: ExternalJoints):
|
|
42
|
+
self._instance.ExternalAxes = value._instance if value else None
|
|
43
|
+
|
|
44
|
+
def __str__(self):
|
|
45
|
+
return self._instance.ToString() if self._instance is not None else ""
|
|
46
|
+
|
|
47
|
+
def __repr__(self):
|
|
48
|
+
return self.__str__()
|
|
49
|
+
|
|
50
|
+
def __eq__(self, other) -> bool:
|
|
51
|
+
if not isinstance(other, RobTarget):
|
|
52
|
+
NotImplemented
|
|
53
|
+
return self._instance.Equals(other._instance)
|
|
54
|
+
|
|
55
|
+
def __hash__(self) -> int:
|
|
56
|
+
return self._instance.GetHashCode() if self._instance is not None else 0
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
import typing
|
|
3
|
+
from UnderAutomation.ABB.Common import RobotConfiguration as robot_configuration
|
|
4
|
+
|
|
5
|
+
class RobotConfiguration:
|
|
6
|
+
'''The axis configuration the robot uses to reach a pose. Several joint combinations reach the same tool position and orientation. The configuration names the one to use, as the quarter revolution each of the deciding axes sits in.'''
|
|
7
|
+
def __init__(self, quarter1: int, quarter4: int, quarter6: int, quarterX: int, _internal = 0):
|
|
8
|
+
'''Initializes a new configuration
|
|
9
|
+
|
|
10
|
+
:param quarter1: Quarter revolution axis 1 sits in
|
|
11
|
+
:param quarter4: Quarter revolution axis 4 sits in
|
|
12
|
+
:param quarter6: Quarter revolution axis 6 sits in
|
|
13
|
+
:param quarterX: Index of the arm configuration
|
|
14
|
+
'''
|
|
15
|
+
if(_internal == 0):
|
|
16
|
+
self._instance = robot_configuration(quarter1, quarter4, quarter6, quarterX)
|
|
17
|
+
else:
|
|
18
|
+
self._instance = _internal
|
|
19
|
+
|
|
20
|
+
@property
|
|
21
|
+
def quarter1(self) -> int:
|
|
22
|
+
'''Quarter revolution axis 1 sits in'''
|
|
23
|
+
return self._instance.Quarter1
|
|
24
|
+
|
|
25
|
+
@quarter1.setter
|
|
26
|
+
def quarter1(self, value: int):
|
|
27
|
+
self._instance.Quarter1 = value
|
|
28
|
+
|
|
29
|
+
@property
|
|
30
|
+
def quarter4(self) -> int:
|
|
31
|
+
'''Quarter revolution axis 4 sits in'''
|
|
32
|
+
return self._instance.Quarter4
|
|
33
|
+
|
|
34
|
+
@quarter4.setter
|
|
35
|
+
def quarter4(self, value: int):
|
|
36
|
+
self._instance.Quarter4 = value
|
|
37
|
+
|
|
38
|
+
@property
|
|
39
|
+
def quarter6(self) -> int:
|
|
40
|
+
'''Quarter revolution axis 6 sits in'''
|
|
41
|
+
return self._instance.Quarter6
|
|
42
|
+
|
|
43
|
+
@quarter6.setter
|
|
44
|
+
def quarter6(self, value: int):
|
|
45
|
+
self._instance.Quarter6 = value
|
|
46
|
+
|
|
47
|
+
@property
|
|
48
|
+
def quarter_x(self) -> int:
|
|
49
|
+
'''Index of the arm configuration, which tells the remaining joint combinations apart'''
|
|
50
|
+
return self._instance.QuarterX
|
|
51
|
+
|
|
52
|
+
@quarter_x.setter
|
|
53
|
+
def quarter_x(self, value: int):
|
|
54
|
+
self._instance.QuarterX = value
|
|
55
|
+
|
|
56
|
+
def __str__(self):
|
|
57
|
+
return self._instance.ToString() if self._instance is not None else ""
|
|
58
|
+
|
|
59
|
+
def __repr__(self):
|
|
60
|
+
return self.__str__()
|
|
61
|
+
|
|
62
|
+
def __eq__(self, other) -> bool:
|
|
63
|
+
if not isinstance(other, RobotConfiguration):
|
|
64
|
+
NotImplemented
|
|
65
|
+
return self._instance.Equals(other._instance)
|
|
66
|
+
|
|
67
|
+
def __hash__(self) -> int:
|
|
68
|
+
return self._instance.GetHashCode() if self._instance is not None else 0
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
import typing
|
|
3
|
+
from UnderAutomation.ABB.Common import RobotJoints as robot_joints
|
|
4
|
+
|
|
5
|
+
class RobotJoints:
|
|
6
|
+
'''The six joint values of a robot arm. Readings of the controller express them in degrees, while the kinematics calculations work in radians. The method that returns or takes them says which one it uses.'''
|
|
7
|
+
def __init__(self, axis1: float, axis2: float, axis3: float, axis4: float, axis5: float, axis6: float, _internal = 0):
|
|
8
|
+
'''Initializes the six axes
|
|
9
|
+
|
|
10
|
+
:param axis1: Value of axis 1
|
|
11
|
+
:param axis2: Value of axis 2
|
|
12
|
+
:param axis3: Value of axis 3
|
|
13
|
+
:param axis4: Value of axis 4
|
|
14
|
+
:param axis5: Value of axis 5
|
|
15
|
+
:param axis6: Value of axis 6
|
|
16
|
+
'''
|
|
17
|
+
if(_internal == 0):
|
|
18
|
+
self._instance = robot_joints(axis1, axis2, axis3, axis4, axis5, axis6)
|
|
19
|
+
else:
|
|
20
|
+
self._instance = _internal
|
|
21
|
+
|
|
22
|
+
@property
|
|
23
|
+
def axis1(self) -> float:
|
|
24
|
+
'''Value of axis 1'''
|
|
25
|
+
return self._instance.Axis1
|
|
26
|
+
|
|
27
|
+
@axis1.setter
|
|
28
|
+
def axis1(self, value: float):
|
|
29
|
+
self._instance.Axis1 = value
|
|
30
|
+
|
|
31
|
+
@property
|
|
32
|
+
def axis2(self) -> float:
|
|
33
|
+
'''Value of axis 2'''
|
|
34
|
+
return self._instance.Axis2
|
|
35
|
+
|
|
36
|
+
@axis2.setter
|
|
37
|
+
def axis2(self, value: float):
|
|
38
|
+
self._instance.Axis2 = value
|
|
39
|
+
|
|
40
|
+
@property
|
|
41
|
+
def axis3(self) -> float:
|
|
42
|
+
'''Value of axis 3'''
|
|
43
|
+
return self._instance.Axis3
|
|
44
|
+
|
|
45
|
+
@axis3.setter
|
|
46
|
+
def axis3(self, value: float):
|
|
47
|
+
self._instance.Axis3 = value
|
|
48
|
+
|
|
49
|
+
@property
|
|
50
|
+
def axis4(self) -> float:
|
|
51
|
+
'''Value of axis 4'''
|
|
52
|
+
return self._instance.Axis4
|
|
53
|
+
|
|
54
|
+
@axis4.setter
|
|
55
|
+
def axis4(self, value: float):
|
|
56
|
+
self._instance.Axis4 = value
|
|
57
|
+
|
|
58
|
+
@property
|
|
59
|
+
def axis5(self) -> float:
|
|
60
|
+
'''Value of axis 5'''
|
|
61
|
+
return self._instance.Axis5
|
|
62
|
+
|
|
63
|
+
@axis5.setter
|
|
64
|
+
def axis5(self, value: float):
|
|
65
|
+
self._instance.Axis5 = value
|
|
66
|
+
|
|
67
|
+
@property
|
|
68
|
+
def axis6(self) -> float:
|
|
69
|
+
'''Value of axis 6'''
|
|
70
|
+
return self._instance.Axis6
|
|
71
|
+
|
|
72
|
+
@axis6.setter
|
|
73
|
+
def axis6(self, value: float):
|
|
74
|
+
self._instance.Axis6 = value
|
|
75
|
+
|
|
76
|
+
def __str__(self):
|
|
77
|
+
return self._instance.ToString() if self._instance is not None else ""
|
|
78
|
+
|
|
79
|
+
def __repr__(self):
|
|
80
|
+
return self.__str__()
|
|
81
|
+
|
|
82
|
+
def __eq__(self, other) -> bool:
|
|
83
|
+
if not isinstance(other, RobotJoints):
|
|
84
|
+
NotImplemented
|
|
85
|
+
return self._instance.Equals(other._instance)
|
|
86
|
+
|
|
87
|
+
def __hash__(self) -> int:
|
|
88
|
+
return self._instance.GetHashCode() if self._instance is not None else 0
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
import typing
|
|
3
|
+
from underautomation.abb.rws.rws_connect_parameters import RwsConnectParameters
|
|
4
|
+
from UnderAutomation.ABB import ConnectionParameters as connection_parameters
|
|
5
|
+
|
|
6
|
+
class ConnectionParameters:
|
|
7
|
+
'''Connection parameters for an ABB robot controller'''
|
|
8
|
+
def __init__(self, address: str, _internal = 0):
|
|
9
|
+
'''Instantiate new connection parameters with a specified address
|
|
10
|
+
|
|
11
|
+
:param address: IP address or hostname of the robot controller
|
|
12
|
+
'''
|
|
13
|
+
if(_internal == 0):
|
|
14
|
+
self._instance = connection_parameters(address)
|
|
15
|
+
else:
|
|
16
|
+
self._instance = _internal
|
|
17
|
+
|
|
18
|
+
@property
|
|
19
|
+
def address(self) -> str:
|
|
20
|
+
'''Address of the robot controller (IP or host name), default value is 127.0.0.1'''
|
|
21
|
+
return self._instance.Address
|
|
22
|
+
|
|
23
|
+
@address.setter
|
|
24
|
+
def address(self, value: str):
|
|
25
|
+
self._instance.Address = value
|
|
26
|
+
|
|
27
|
+
@property
|
|
28
|
+
def ping_before_connect(self) -> bool:
|
|
29
|
+
'''Send a ping command before initializing any connections'''
|
|
30
|
+
return self._instance.PingBeforeConnect
|
|
31
|
+
|
|
32
|
+
@ping_before_connect.setter
|
|
33
|
+
def ping_before_connect(self, value: bool):
|
|
34
|
+
self._instance.PingBeforeConnect = value
|
|
35
|
+
|
|
36
|
+
@property
|
|
37
|
+
def rws(self) -> RwsConnectParameters:
|
|
38
|
+
'''RWS2 (Robot Web Services 2) connection parameters'''
|
|
39
|
+
return RwsConnectParameters(self._instance.Rws)
|
|
40
|
+
|
|
41
|
+
@rws.setter
|
|
42
|
+
def rws(self, value: RwsConnectParameters):
|
|
43
|
+
self._instance.Rws = value._instance if value else None
|
|
44
|
+
|
|
45
|
+
def __str__(self):
|
|
46
|
+
return self._instance.ToString() if self._instance is not None else ""
|
|
47
|
+
|
|
48
|
+
def __repr__(self):
|
|
49
|
+
return self.__str__()
|
|
50
|
+
|
|
51
|
+
def __eq__(self, other) -> bool:
|
|
52
|
+
if not isinstance(other, ConnectionParameters):
|
|
53
|
+
NotImplemented
|
|
54
|
+
return self._instance.Equals(other._instance)
|
|
55
|
+
|
|
56
|
+
def __hash__(self) -> int:
|
|
57
|
+
return self._instance.GetHashCode() if self._instance is not None else 0
|
|
File without changes
|