DipsScripting 9.1.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.
- dips/AnchorPointVal.py +103 -0
- dips/AngleDataVal.py +62 -0
- dips/AnnotativeTools2DVal.py +273 -0
- dips/ApplicationManager.py +89 -0
- dips/ArrowToolEntityInfoRef.py +43 -0
- dips/ArrowToolEntityInfoVal.py +155 -0
- dips/AutomaticClusterAnalysisSettingsVal.py +161 -0
- dips/BuiltInDataDescriptors.py +81 -0
- dips/BuiltInDataFormatters.py +81 -0
- dips/CircularWindowVal.py +103 -0
- dips/ClusterWindowVal.py +190 -0
- dips/ColorSurrogateVal.py +95 -0
- dips/ConeToolEntityInfoRef.py +43 -0
- dips/ConeToolEntityInfoVal.py +114 -0
- dips/ConeVal.py +92 -0
- dips/ContourEntityVisibilityVal.py +132 -0
- dips/ContourOptionsVal.py +193 -0
- dips/CumulativeChartViewRef.py +42 -0
- dips/CumulativeChartViewVal.py +100 -0
- dips/CumulativePlotSettingsVal.py +94 -0
- dips/CurvedWindowVal.py +102 -0
- dips/CustomColumnCollectionVal.py +69 -0
- dips/CustomHistogramOptionsVal.py +103 -0
- dips/CustomRangeVal.py +84 -0
- dips/CustomRowRawDataVal.py +74 -0
- dips/DataDescriptorVal.py +83 -0
- dips/DataFilterRef.py +23 -0
- dips/DataFilterVal.py +73 -0
- dips/DataFormatterVal.py +62 -0
- dips/DataIdentifierVal.py +62 -0
- dips/DipsAPI_pb2.py +817 -0
- dips/DipsAPI_pb2_grpc.py +12363 -0
- dips/DipsApp.py +81 -0
- dips/DiscontinuityDataVal.py +164 -0
- dips/EllipseToolEntityInfoRef.py +43 -0
- dips/EllipseToolEntityInfoVal.py +153 -0
- dips/FillFormatVal.py +83 -0
- dips/FoldEntityInfoRef.py +23 -0
- dips/FoldEntityInfoVal.py +103 -0
- dips/FoldEntityOptionsVal.py +106 -0
- dips/FoldEntityVisibilityRef.py +38 -0
- dips/FoldEntityVisibilityVal.py +100 -0
- dips/FoldWindowEntityInfoVal.py +92 -0
- dips/FoldWindowEntityVisibilityRef.py +29 -0
- dips/FoldWindowEntityVisibilityVal.py +80 -0
- dips/FreehandWindowVal.py +80 -0
- dips/FullDataFormatVal.py +92 -0
- dips/GlobalPlaneEntityVisibilityVal.py +103 -0
- dips/HistogramChartViewRef.py +42 -0
- dips/HistogramChartViewVal.py +100 -0
- dips/HistogramPlotSettingsVal.py +136 -0
- dips/IntersectionEntityVisibilityVal.py +83 -0
- dips/IntersectionOptionsVal.py +83 -0
- dips/IntervalVal.py +102 -0
- dips/JointFrequencyAnalysisSettingsVal.py +102 -0
- dips/JointFrequencyChartViewRef.py +42 -0
- dips/JointFrequencyChartViewVal.py +100 -0
- dips/JointSpacingAnalysisSettingsVal.py +138 -0
- dips/JointSpacingChartViewRef.py +42 -0
- dips/JointSpacingChartViewVal.py +100 -0
- dips/KinematicAnalysisEntityVisibilityVal.py +73 -0
- dips/KinematicAnalysisSettingsVal.py +140 -0
- dips/LatLongVal.py +84 -0
- dips/LengthDataVal.py +83 -0
- dips/LineFormatVal.py +83 -0
- dips/LineIntersectionCalculatorToolEntityInfoRef.py +43 -0
- dips/LineIntersectionCalculatorToolEntityInfoVal.py +133 -0
- dips/LineToolEntityInfoRef.py +43 -0
- dips/LineToolEntityInfoVal.py +133 -0
- dips/LineationVal.py +83 -0
- dips/MeasureAngleToolEntityInfoRef.py +43 -0
- dips/MeasureAngleToolEntityInfoVal.py +133 -0
- dips/OrientationDataSetRef.py +23 -0
- dips/OrientationDataSetVal.py +453 -0
- dips/PitchGridToolEntityInfoRef.py +43 -0
- dips/PitchGridToolEntityInfoVal.py +114 -0
- dips/PlaneEntityInfoRef.py +23 -0
- dips/PlaneEntityInfoVal.py +92 -0
- dips/PlaneEntityVisibilityRef.py +38 -0
- dips/PlaneEntityVisibilityVal.py +100 -0
- dips/PlaneIntersectionCalculatorToolEntityInfoRef.py +43 -0
- dips/PlaneIntersectionCalculatorToolEntityInfoVal.py +133 -0
- dips/PlaneOptionsVal.py +117 -0
- dips/PlaneVal.py +105 -0
- dips/PoleEntityOptionsVal.py +84 -0
- dips/PoleEntityVisibilityVal.py +83 -0
- dips/PolygonToolEntityInfoRef.py +43 -0
- dips/PolygonToolEntityInfoVal.py +131 -0
- dips/PolylineToolEntityInfoRef.py +43 -0
- dips/PolylineToolEntityInfoVal.py +111 -0
- dips/ProcessedDataVal.py +94 -0
- dips/ProjStubRef.py +388 -0
- dips/ProjStubVal.py +52 -0
- dips/ProtobufCollectionWrappers.py +108 -0
- dips/QualitativeQuantitativeAnalysisSettingsVal.py +151 -0
- dips/QualitativeQuantitativeChartViewRef.py +42 -0
- dips/QualitativeQuantitativeChartViewVal.py +111 -0
- dips/QuantitativeContourSettingsVal.py +103 -0
- dips/RQDAnalysisChartViewRef.py +42 -0
- dips/RQDAnalysisChartViewVal.py +100 -0
- dips/RQDAnalysisSettingsVal.py +111 -0
- dips/RectangleToolEntityInfoRef.py +43 -0
- dips/RectangleToolEntityInfoVal.py +153 -0
- dips/ReportingConventionResultVal.py +62 -0
- dips/RosettePresetOptionsVal.py +227 -0
- dips/RosetteSettingsVal.py +174 -0
- dips/RosetteViewRef.py +296 -0
- dips/RosetteViewVal.py +177 -0
- dips/ScatterChartViewRef.py +42 -0
- dips/ScatterChartViewVal.py +100 -0
- dips/ScatterPlotSettingsVal.py +113 -0
- dips/SetEntityInfoRef.py +23 -0
- dips/SetEntityInfoVal.py +103 -0
- dips/SetEntityOptionsVal.py +133 -0
- dips/SetEntityVisibilityRef.py +38 -0
- dips/SetEntityVisibilityVal.py +100 -0
- dips/SetStatisticsSettingsVal.py +106 -0
- dips/SetVersusSetVal.py +82 -0
- dips/SetWindowEntityInfoVal.py +183 -0
- dips/SetWindowEntityVisibilityRef.py +29 -0
- dips/SetWindowEntityVisibilityVal.py +80 -0
- dips/StatisticalDistributionFilterVal.py +128 -0
- dips/Stereonet2DPresetOptionsVal.py +488 -0
- dips/Stereonet2DViewRef.py +612 -0
- dips/Stereonet2DViewVal.py +363 -0
- dips/Stereonet3DPresetOptionsVal.py +281 -0
- dips/Stereonet3DViewRef.py +440 -0
- dips/Stereonet3DViewVal.py +303 -0
- dips/StereonetOverlayEntityVisibilityVal.py +83 -0
- dips/StereonetOverlaySettingsVal.py +103 -0
- dips/StereonetProjectionModeVal.py +73 -0
- dips/SurveyDataVal.py +103 -0
- dips/SymbolDisplaySettingVal.py +124 -0
- dips/SymbolicSettingsVal.py +89 -0
- dips/TextFormatVal.py +105 -0
- dips/TextToolEntityInfoRef.py +43 -0
- dips/TextToolEntityInfoVal.py +176 -0
- dips/TraverseEntityOptionsVal.py +84 -0
- dips/TraverseEntityVisibilityRef.py +38 -0
- dips/TraverseEntityVisibilityVal.py +100 -0
- dips/TrendLineToolEntityInfoRef.py +43 -0
- dips/TrendLineToolEntityInfoVal.py +114 -0
- dips/TrendPlungeVal.py +91 -0
- dips/UnitSystemResultVal.py +62 -0
- dips/UserPlaneEntityOptionsVal.py +100 -0
- dips/ValidatableResultVal.py +69 -0
- dips/ValidatableResult_ProtoReference_ArrowToolEntityInfoVal.py +86 -0
- dips/ValidatableResult_ProtoReference_ConeToolEntityInfoVal.py +86 -0
- dips/ValidatableResult_ProtoReference_EllipseToolEntityInfoVal.py +86 -0
- dips/ValidatableResult_ProtoReference_FoldEntityInfoVal.py +86 -0
- dips/ValidatableResult_ProtoReference_LineIntersectionCalculatorToolEntityInfoVal.py +86 -0
- dips/ValidatableResult_ProtoReference_LineToolEntityInfoVal.py +86 -0
- dips/ValidatableResult_ProtoReference_MeasureAngleToolEntityInfoVal.py +86 -0
- dips/ValidatableResult_ProtoReference_OrientationDataSetVal.py +86 -0
- dips/ValidatableResult_ProtoReference_PitchGridToolEntityInfoVal.py +86 -0
- dips/ValidatableResult_ProtoReference_PlaneEntityInfoVal.py +86 -0
- dips/ValidatableResult_ProtoReference_PlaneIntersectionCalculatorToolEntityInfoVal.py +86 -0
- dips/ValidatableResult_ProtoReference_PolygonToolEntityInfoVal.py +86 -0
- dips/ValidatableResult_ProtoReference_PolylineToolEntityInfoVal.py +86 -0
- dips/ValidatableResult_ProtoReference_RectangleToolEntityInfoVal.py +86 -0
- dips/ValidatableResult_ProtoReference_SetEntityInfoVal.py +86 -0
- dips/ValidatableResult_ProtoReference_TextToolEntityInfoVal.py +86 -0
- dips/ValidatableResult_ProtoReference_TrendLineToolEntityInfoVal.py +86 -0
- dips/ValidationErrorVal.py +73 -0
- dips/Vector2DVal.py +73 -0
- dips/Vector3Val.py +84 -0
- dips/VectorDensityContourSettingsVal.py +73 -0
- dips/WeightingSettingsVal.py +83 -0
- dips/WrappedFreehandWindowVal.py +102 -0
- dips/__init__.py +29 -0
- dipsscripting-9.1.0.dist-info/METADATA +29 -0
- dipsscripting-9.1.0.dist-info/RECORD +175 -0
- dipsscripting-9.1.0.dist-info/WHEEL +5 -0
- dipsscripting-9.1.0.dist-info/licenses/License.txt +20 -0
- dipsscripting-9.1.0.dist-info/top_level.txt +1 -0
dips/DipsApp.py
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import grpc
|
|
2
|
+
from .DipsAPI_pb2_grpc import AppServiceStub
|
|
3
|
+
from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
|
|
4
|
+
from .ApplicationManager import ApplicationManager
|
|
5
|
+
from .ProjStubRef import ProjStubRef
|
|
6
|
+
from logging import Logger
|
|
7
|
+
import winreg
|
|
8
|
+
|
|
9
|
+
class DipsApp:
|
|
10
|
+
@staticmethod
|
|
11
|
+
def AttachToExisting(port):
|
|
12
|
+
ret = DipsApp(port)
|
|
13
|
+
return ret
|
|
14
|
+
|
|
15
|
+
@staticmethod
|
|
16
|
+
def LaunchApp(port, overridePathToExecutable : str = None, timeout : float = 120, headless : bool = False, fileToOpen : str = None):
|
|
17
|
+
DipsApp.startApplication(port, overridePathToExecutable, timeout, headless, fileToOpen)
|
|
18
|
+
ret = DipsApp(port)
|
|
19
|
+
return ret
|
|
20
|
+
|
|
21
|
+
def __init__(self, port):
|
|
22
|
+
channel = grpc.insecure_channel('localhost:{port}'.format(port = port))
|
|
23
|
+
self.__stub = AppServiceStub(channel)
|
|
24
|
+
self.__channel = channel
|
|
25
|
+
|
|
26
|
+
@staticmethod
|
|
27
|
+
def startApplication(port : int, overridePathToExecutable : str = None, timeout : float = 120, headless : bool = False, fileToOpen : str = None) -> None:
|
|
28
|
+
"""Opens the most recently installed RS2 application. Starts the python server and binds it to the given port.
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
port (int): the port to bind the python server to. Use this same port when initializing RS2Modeler
|
|
32
|
+
overridePathToExecutable (str, optional): full path to the desired executable to be opened. If not provided, the latest installation of rs2 is used
|
|
33
|
+
timeout (float, optional): the maximum amount of time to wait for the application and server to start.
|
|
34
|
+
|
|
35
|
+
Raises:
|
|
36
|
+
ValueError: Port range must be between 49152 and 65535, otherwise ValueError is raised
|
|
37
|
+
TimeoutError: if timeout is provided, raises TimeoutError if not able to connect to the server within that time.
|
|
38
|
+
"""
|
|
39
|
+
appManager = ApplicationManager()
|
|
40
|
+
if overridePathToExecutable is None:
|
|
41
|
+
executablePath = DipsApp._getApplicationPath()
|
|
42
|
+
else:
|
|
43
|
+
executablePath = overridePathToExecutable
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
appManager.startApplication(executablePath, port, DipsApp._isServerRunning, Logger("Test"), timeout, headless, fileToOpen)
|
|
47
|
+
|
|
48
|
+
@staticmethod
|
|
49
|
+
def _getApplicationPath() -> str:
|
|
50
|
+
registry = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE)
|
|
51
|
+
key = winreg.OpenKey(registry, r'SOFTWARE\Rocscience\Dips 9.0')
|
|
52
|
+
installationLocation, type = winreg.QueryValueEx(key, "Install")
|
|
53
|
+
dipsModelerInstallLocation = rf"{installationLocation}\Dips.exe"
|
|
54
|
+
return dipsModelerInstallLocation
|
|
55
|
+
|
|
56
|
+
@staticmethod
|
|
57
|
+
def _isServerRunning(port) -> bool:
|
|
58
|
+
channel = grpc.insecure_channel('localhost:{port}'.format(port = port))
|
|
59
|
+
stub = AppServiceStub(channel)
|
|
60
|
+
stub.Ping(google_dot_protobuf_dot_empty__pb2.Empty())
|
|
61
|
+
channel.close()
|
|
62
|
+
return True
|
|
63
|
+
|
|
64
|
+
def GetModel(self) -> ProjStubRef:
|
|
65
|
+
model = self.__stub.GetProjectReference(google_dot_protobuf_dot_empty__pb2.Empty())
|
|
66
|
+
return ProjStubRef(self.__channel, model)
|
|
67
|
+
|
|
68
|
+
def Show(self):
|
|
69
|
+
self.__stub.Show(google_dot_protobuf_dot_empty__pb2.Empty())
|
|
70
|
+
|
|
71
|
+
def Hide(self):
|
|
72
|
+
self.__stub.Hide(google_dot_protobuf_dot_empty__pb2.Empty())
|
|
73
|
+
|
|
74
|
+
def Ping(self):
|
|
75
|
+
self.__stub.Ping(google_dot_protobuf_dot_empty__pb2.Empty())
|
|
76
|
+
|
|
77
|
+
def Close(self):
|
|
78
|
+
self.__stub.Close(google_dot_protobuf_dot_empty__pb2.Empty())
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"""Generated wrapper for DiscontinuityData protobuf message."""
|
|
2
|
+
|
|
3
|
+
from typing import Any, Optional, List, Dict
|
|
4
|
+
from . import DipsAPI_pb2
|
|
5
|
+
|
|
6
|
+
from .ProtobufCollectionWrappers import _ProtobufListWrapper, _ProtobufMapWrapper
|
|
7
|
+
|
|
8
|
+
from .AngleDataVal import AngleDataVal
|
|
9
|
+
from .CustomRowRawDataVal import CustomRowRawDataVal
|
|
10
|
+
from .Vector3Val import Vector3Val
|
|
11
|
+
|
|
12
|
+
class DiscontinuityDataVal:
|
|
13
|
+
"""Simple wrapper for DiscontinuityData with Pythonic getters and setters."""
|
|
14
|
+
|
|
15
|
+
_proto_class = DipsAPI_pb2.DiscontinuityData
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def __init__(self, orientation1: Optional[AngleDataVal] = None, orientation2: Optional[AngleDataVal] = None, position: Optional[Vector3Val] = None, extra_data: Optional[CustomRowRawDataVal] = None, proto_message: Optional[Any] = None):
|
|
19
|
+
"""Initialize the DiscontinuityData wrapper."""
|
|
20
|
+
# Initialize the protobuf message
|
|
21
|
+
if proto_message is not None:
|
|
22
|
+
self._proto_message = proto_message
|
|
23
|
+
else:
|
|
24
|
+
self._proto_message = self._proto_class()
|
|
25
|
+
|
|
26
|
+
if orientation1 is not None:
|
|
27
|
+
self._proto_message.Orientation1.CopyFrom(orientation1.to_proto())
|
|
28
|
+
self._orientation1_wrapper = orientation1
|
|
29
|
+
if orientation2 is not None:
|
|
30
|
+
self._proto_message.Orientation2.CopyFrom(orientation2.to_proto())
|
|
31
|
+
self._orientation2_wrapper = orientation2
|
|
32
|
+
if position is not None:
|
|
33
|
+
self._proto_message.Position.CopyFrom(position.to_proto())
|
|
34
|
+
self._position_wrapper = position
|
|
35
|
+
if extra_data is not None:
|
|
36
|
+
self._proto_message.ExtraData.CopyFrom(extra_data.to_proto())
|
|
37
|
+
self._extra_data_wrapper = extra_data
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
# Properties
|
|
41
|
+
|
|
42
|
+
@property
|
|
43
|
+
def orientation1(self) -> AngleDataVal:
|
|
44
|
+
"""Get the Orientation1 field as a wrapper."""
|
|
45
|
+
if not hasattr(self, '_orientation1_wrapper'):
|
|
46
|
+
self._orientation1_wrapper = AngleDataVal(proto_message=self._proto_message.Orientation1)
|
|
47
|
+
return self._orientation1_wrapper
|
|
48
|
+
|
|
49
|
+
@orientation1.setter
|
|
50
|
+
def orientation1(self, value: AngleDataVal) -> None:
|
|
51
|
+
"""Set the Orientation1 field to a wrapper."""
|
|
52
|
+
self._proto_message.Orientation1.CopyFrom(value.to_proto())
|
|
53
|
+
# Update the cached wrapper if it exists
|
|
54
|
+
if hasattr(self, '_orientation1_wrapper'):
|
|
55
|
+
self._orientation1_wrapper._proto_message.CopyFrom(self._proto_message.Orientation1)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
@property
|
|
59
|
+
def orientation2(self) -> AngleDataVal:
|
|
60
|
+
"""Get the Orientation2 field as a wrapper."""
|
|
61
|
+
if not hasattr(self, '_orientation2_wrapper'):
|
|
62
|
+
self._orientation2_wrapper = AngleDataVal(proto_message=self._proto_message.Orientation2)
|
|
63
|
+
return self._orientation2_wrapper
|
|
64
|
+
|
|
65
|
+
@orientation2.setter
|
|
66
|
+
def orientation2(self, value: AngleDataVal) -> None:
|
|
67
|
+
"""Set the Orientation2 field to a wrapper."""
|
|
68
|
+
self._proto_message.Orientation2.CopyFrom(value.to_proto())
|
|
69
|
+
# Update the cached wrapper if it exists
|
|
70
|
+
if hasattr(self, '_orientation2_wrapper'):
|
|
71
|
+
self._orientation2_wrapper._proto_message.CopyFrom(self._proto_message.Orientation2)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
@property
|
|
75
|
+
def quantity(self) -> float:
|
|
76
|
+
"""Get the Quantity field value."""
|
|
77
|
+
return self._proto_message.Quantity
|
|
78
|
+
|
|
79
|
+
@quantity.setter
|
|
80
|
+
def quantity(self, value: float) -> None:
|
|
81
|
+
"""Set the Quantity field value."""
|
|
82
|
+
self._proto_message.Quantity = value
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
@property
|
|
86
|
+
def persistence(self) -> float:
|
|
87
|
+
"""Get the Persistence field value."""
|
|
88
|
+
return self._proto_message.Persistence
|
|
89
|
+
|
|
90
|
+
@persistence.setter
|
|
91
|
+
def persistence(self, value: float) -> None:
|
|
92
|
+
"""Set the Persistence field value."""
|
|
93
|
+
self._proto_message.Persistence = value
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
@property
|
|
97
|
+
def distance(self) -> float:
|
|
98
|
+
"""Get the Distance field value."""
|
|
99
|
+
return self._proto_message.Distance
|
|
100
|
+
|
|
101
|
+
@distance.setter
|
|
102
|
+
def distance(self, value: float) -> None:
|
|
103
|
+
"""Set the Distance field value."""
|
|
104
|
+
self._proto_message.Distance = value
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
@property
|
|
108
|
+
def position(self) -> Vector3Val:
|
|
109
|
+
"""Get the Position field as a wrapper."""
|
|
110
|
+
if not hasattr(self, '_position_wrapper'):
|
|
111
|
+
self._position_wrapper = Vector3Val(proto_message=self._proto_message.Position)
|
|
112
|
+
return self._position_wrapper
|
|
113
|
+
|
|
114
|
+
@position.setter
|
|
115
|
+
def position(self, value: Vector3Val) -> None:
|
|
116
|
+
"""Set the Position field to a wrapper."""
|
|
117
|
+
self._proto_message.Position.CopyFrom(value.to_proto())
|
|
118
|
+
# Update the cached wrapper if it exists
|
|
119
|
+
if hasattr(self, '_position_wrapper'):
|
|
120
|
+
self._position_wrapper._proto_message.CopyFrom(self._proto_message.Position)
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
@property
|
|
124
|
+
def extra_data(self) -> CustomRowRawDataVal:
|
|
125
|
+
"""Get the ExtraData field as a wrapper."""
|
|
126
|
+
if not hasattr(self, '_extra_data_wrapper'):
|
|
127
|
+
self._extra_data_wrapper = CustomRowRawDataVal(proto_message=self._proto_message.ExtraData)
|
|
128
|
+
return self._extra_data_wrapper
|
|
129
|
+
|
|
130
|
+
@extra_data.setter
|
|
131
|
+
def extra_data(self, value: CustomRowRawDataVal) -> None:
|
|
132
|
+
"""Set the ExtraData field to a wrapper."""
|
|
133
|
+
self._proto_message.ExtraData.CopyFrom(value.to_proto())
|
|
134
|
+
# Update the cached wrapper if it exists
|
|
135
|
+
if hasattr(self, '_extra_data_wrapper'):
|
|
136
|
+
self._extra_data_wrapper._proto_message.CopyFrom(self._proto_message.ExtraData)
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
# Utility methods
|
|
140
|
+
|
|
141
|
+
def to_proto(self):
|
|
142
|
+
"""Get the underlying protobuf message."""
|
|
143
|
+
return self._proto_message
|
|
144
|
+
|
|
145
|
+
@classmethod
|
|
146
|
+
def from_proto(cls, proto_message):
|
|
147
|
+
"""Create wrapper from existing protobuf message."""
|
|
148
|
+
wrapper = cls()
|
|
149
|
+
wrapper._proto_message.CopyFrom(proto_message)
|
|
150
|
+
return wrapper
|
|
151
|
+
|
|
152
|
+
def copy(self):
|
|
153
|
+
"""Create a copy of this wrapper."""
|
|
154
|
+
new_wrapper = self.__class__()
|
|
155
|
+
new_wrapper._proto_message.CopyFrom(self._proto_message)
|
|
156
|
+
return new_wrapper
|
|
157
|
+
|
|
158
|
+
def __str__(self) -> str:
|
|
159
|
+
"""String representation."""
|
|
160
|
+
return f"{self.__class__.__name__}({self._proto_message})"
|
|
161
|
+
|
|
162
|
+
def __repr__(self) -> str:
|
|
163
|
+
"""Detailed string representation."""
|
|
164
|
+
return f"{self.__class__.__name__}({self._proto_message})"
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
from typing import List
|
|
2
|
+
from . import DipsAPI_pb2_grpc
|
|
3
|
+
from . import DipsAPI_pb2
|
|
4
|
+
from .EllipseToolEntityInfoVal import EllipseToolEntityInfoVal
|
|
5
|
+
from .EllipseToolEntityInfoVal import EllipseToolEntityInfoVal
|
|
6
|
+
from .ValidatableResultVal import ValidatableResultVal
|
|
7
|
+
|
|
8
|
+
class EllipseToolEntityInfoRef:
|
|
9
|
+
def __init__(self, channelToConnectOn, ref: DipsAPI_pb2.ProtoReference_EllipseToolEntityInfo):
|
|
10
|
+
self.__modelRef = ref
|
|
11
|
+
self.__refManagerStub = DipsAPI_pb2_grpc.nSameModuleReferenceAccessorStub(channelToConnectOn)
|
|
12
|
+
self.__channelToConnectOn = channelToConnectOn
|
|
13
|
+
self.__EntityServicesStubLocal = DipsAPI_pb2_grpc.EntityServicesStub(channelToConnectOn)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def GetValue(self) -> EllipseToolEntityInfoVal:
|
|
17
|
+
bytes = self.__refManagerStub.GetValue(self.__modelRef.ID)
|
|
18
|
+
ret = DipsAPI_pb2.EllipseToolEntityInfo()
|
|
19
|
+
ret.MergeFromString(bytes.data)
|
|
20
|
+
return EllipseToolEntityInfoVal.from_proto(ret)
|
|
21
|
+
|
|
22
|
+
def get_model_ref(self):
|
|
23
|
+
"""Get the underlying model reference for direct protobuf operations."""
|
|
24
|
+
return self.__modelRef
|
|
25
|
+
|
|
26
|
+
def RemoveEllipseTool(self):
|
|
27
|
+
functionParam = DipsAPI_pb2.ProtoMemberFunction_ProtoReference_EllipseToolEntityInfo(This=self.__modelRef)
|
|
28
|
+
ret = self.__EntityServicesStubLocal.RemoveEllipseTool(functionParam)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def SetEllipseToolVisibility(self, Boolean: bool):
|
|
32
|
+
functionParam = DipsAPI_pb2.ProtoMemberFunction_ProtoReference_EllipseToolEntityInfo_Boolean(This=self.__modelRef, Input1=Boolean)
|
|
33
|
+
ret = self.__EntityServicesStubLocal.SetEllipseToolVisibility(functionParam)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def UpdateEllipseTool(self, EllipseToolEntityInfo: EllipseToolEntityInfoVal) -> ValidatableResultVal:
|
|
37
|
+
functionParam = DipsAPI_pb2.ProtoMemberFunction_ProtoReference_EllipseToolEntityInfo_EllipseToolEntityInfo(This=self.__modelRef, Input1=(EllipseToolEntityInfo.to_proto() if hasattr(EllipseToolEntityInfo, 'to_proto') else EllipseToolEntityInfo))
|
|
38
|
+
ret = self.__EntityServicesStubLocal.UpdateEllipseTool(functionParam)
|
|
39
|
+
|
|
40
|
+
return ValidatableResultVal.from_proto(ret)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"""Generated wrapper for EllipseToolEntityInfo protobuf message."""
|
|
2
|
+
|
|
3
|
+
from typing import Any, Optional, List, Dict
|
|
4
|
+
from . import DipsAPI_pb2
|
|
5
|
+
|
|
6
|
+
from .ProtobufCollectionWrappers import _ProtobufListWrapper, _ProtobufMapWrapper
|
|
7
|
+
|
|
8
|
+
from .FillFormatVal import FillFormatVal
|
|
9
|
+
from .LineFormatVal import LineFormatVal
|
|
10
|
+
from .Vector2DVal import Vector2DVal
|
|
11
|
+
|
|
12
|
+
class EllipseToolEntityInfoVal:
|
|
13
|
+
"""Simple wrapper for EllipseToolEntityInfo with Pythonic getters and setters."""
|
|
14
|
+
|
|
15
|
+
_proto_class = DipsAPI_pb2.EllipseToolEntityInfo
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def __init__(self, line_format: Optional[LineFormatVal] = None, fill_format: Optional[FillFormatVal] = None, first_corner: Optional[Vector2DVal] = None, second_corner: Optional[Vector2DVal] = None, proto_message: Optional[Any] = None):
|
|
19
|
+
"""Initialize the EllipseToolEntityInfo wrapper."""
|
|
20
|
+
# Initialize the protobuf message
|
|
21
|
+
if proto_message is not None:
|
|
22
|
+
self._proto_message = proto_message
|
|
23
|
+
else:
|
|
24
|
+
self._proto_message = self._proto_class()
|
|
25
|
+
|
|
26
|
+
if line_format is not None:
|
|
27
|
+
self._proto_message.LineFormat.CopyFrom(line_format.to_proto())
|
|
28
|
+
self._line_format_wrapper = line_format
|
|
29
|
+
if fill_format is not None:
|
|
30
|
+
self._proto_message.FillFormat.CopyFrom(fill_format.to_proto())
|
|
31
|
+
self._fill_format_wrapper = fill_format
|
|
32
|
+
if first_corner is not None:
|
|
33
|
+
self._proto_message.FirstCorner.CopyFrom(first_corner.to_proto())
|
|
34
|
+
self._first_corner_wrapper = first_corner
|
|
35
|
+
if second_corner is not None:
|
|
36
|
+
self._proto_message.SecondCorner.CopyFrom(second_corner.to_proto())
|
|
37
|
+
self._second_corner_wrapper = second_corner
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
# Properties
|
|
41
|
+
|
|
42
|
+
@property
|
|
43
|
+
def is_visible(self) -> bool:
|
|
44
|
+
"""Get the IsVisible field value."""
|
|
45
|
+
return self._proto_message.IsVisible
|
|
46
|
+
|
|
47
|
+
@is_visible.setter
|
|
48
|
+
def is_visible(self, value: bool) -> None:
|
|
49
|
+
"""Set the IsVisible field value."""
|
|
50
|
+
self._proto_message.IsVisible = value
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
@property
|
|
54
|
+
def name(self) -> str:
|
|
55
|
+
"""Get the Name field value."""
|
|
56
|
+
return self._proto_message.Name
|
|
57
|
+
|
|
58
|
+
@name.setter
|
|
59
|
+
def name(self, value: str) -> None:
|
|
60
|
+
"""Set the Name field value."""
|
|
61
|
+
self._proto_message.Name = value
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
@property
|
|
65
|
+
def line_format(self) -> LineFormatVal:
|
|
66
|
+
"""Get the LineFormat field as a wrapper."""
|
|
67
|
+
if not hasattr(self, '_line_format_wrapper'):
|
|
68
|
+
self._line_format_wrapper = LineFormatVal(proto_message=self._proto_message.LineFormat)
|
|
69
|
+
return self._line_format_wrapper
|
|
70
|
+
|
|
71
|
+
@line_format.setter
|
|
72
|
+
def line_format(self, value: LineFormatVal) -> None:
|
|
73
|
+
"""Set the LineFormat field to a wrapper."""
|
|
74
|
+
self._proto_message.LineFormat.CopyFrom(value.to_proto())
|
|
75
|
+
# Update the cached wrapper if it exists
|
|
76
|
+
if hasattr(self, '_line_format_wrapper'):
|
|
77
|
+
self._line_format_wrapper._proto_message.CopyFrom(self._proto_message.LineFormat)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
@property
|
|
81
|
+
def fill_format(self) -> FillFormatVal:
|
|
82
|
+
"""Get the FillFormat field as a wrapper."""
|
|
83
|
+
if not hasattr(self, '_fill_format_wrapper'):
|
|
84
|
+
self._fill_format_wrapper = FillFormatVal(proto_message=self._proto_message.FillFormat)
|
|
85
|
+
return self._fill_format_wrapper
|
|
86
|
+
|
|
87
|
+
@fill_format.setter
|
|
88
|
+
def fill_format(self, value: FillFormatVal) -> None:
|
|
89
|
+
"""Set the FillFormat field to a wrapper."""
|
|
90
|
+
self._proto_message.FillFormat.CopyFrom(value.to_proto())
|
|
91
|
+
# Update the cached wrapper if it exists
|
|
92
|
+
if hasattr(self, '_fill_format_wrapper'):
|
|
93
|
+
self._fill_format_wrapper._proto_message.CopyFrom(self._proto_message.FillFormat)
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
@property
|
|
97
|
+
def first_corner(self) -> Vector2DVal:
|
|
98
|
+
"""Get the FirstCorner field as a wrapper."""
|
|
99
|
+
if not hasattr(self, '_first_corner_wrapper'):
|
|
100
|
+
self._first_corner_wrapper = Vector2DVal(proto_message=self._proto_message.FirstCorner)
|
|
101
|
+
return self._first_corner_wrapper
|
|
102
|
+
|
|
103
|
+
@first_corner.setter
|
|
104
|
+
def first_corner(self, value: Vector2DVal) -> None:
|
|
105
|
+
"""Set the FirstCorner field to a wrapper."""
|
|
106
|
+
self._proto_message.FirstCorner.CopyFrom(value.to_proto())
|
|
107
|
+
# Update the cached wrapper if it exists
|
|
108
|
+
if hasattr(self, '_first_corner_wrapper'):
|
|
109
|
+
self._first_corner_wrapper._proto_message.CopyFrom(self._proto_message.FirstCorner)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
@property
|
|
113
|
+
def second_corner(self) -> Vector2DVal:
|
|
114
|
+
"""Get the SecondCorner field as a wrapper."""
|
|
115
|
+
if not hasattr(self, '_second_corner_wrapper'):
|
|
116
|
+
self._second_corner_wrapper = Vector2DVal(proto_message=self._proto_message.SecondCorner)
|
|
117
|
+
return self._second_corner_wrapper
|
|
118
|
+
|
|
119
|
+
@second_corner.setter
|
|
120
|
+
def second_corner(self, value: Vector2DVal) -> None:
|
|
121
|
+
"""Set the SecondCorner field to a wrapper."""
|
|
122
|
+
self._proto_message.SecondCorner.CopyFrom(value.to_proto())
|
|
123
|
+
# Update the cached wrapper if it exists
|
|
124
|
+
if hasattr(self, '_second_corner_wrapper'):
|
|
125
|
+
self._second_corner_wrapper._proto_message.CopyFrom(self._proto_message.SecondCorner)
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
# Utility methods
|
|
129
|
+
|
|
130
|
+
def to_proto(self):
|
|
131
|
+
"""Get the underlying protobuf message."""
|
|
132
|
+
return self._proto_message
|
|
133
|
+
|
|
134
|
+
@classmethod
|
|
135
|
+
def from_proto(cls, proto_message):
|
|
136
|
+
"""Create wrapper from existing protobuf message."""
|
|
137
|
+
wrapper = cls()
|
|
138
|
+
wrapper._proto_message.CopyFrom(proto_message)
|
|
139
|
+
return wrapper
|
|
140
|
+
|
|
141
|
+
def copy(self):
|
|
142
|
+
"""Create a copy of this wrapper."""
|
|
143
|
+
new_wrapper = self.__class__()
|
|
144
|
+
new_wrapper._proto_message.CopyFrom(self._proto_message)
|
|
145
|
+
return new_wrapper
|
|
146
|
+
|
|
147
|
+
def __str__(self) -> str:
|
|
148
|
+
"""String representation."""
|
|
149
|
+
return f"{self.__class__.__name__}({self._proto_message})"
|
|
150
|
+
|
|
151
|
+
def __repr__(self) -> str:
|
|
152
|
+
"""Detailed string representation."""
|
|
153
|
+
return f"{self.__class__.__name__}({self._proto_message})"
|
dips/FillFormatVal.py
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"""Generated wrapper for FillFormat protobuf message."""
|
|
2
|
+
|
|
3
|
+
from typing import Any, Optional, List, Dict
|
|
4
|
+
from . import DipsAPI_pb2
|
|
5
|
+
|
|
6
|
+
from .ProtobufCollectionWrappers import _ProtobufListWrapper, _ProtobufMapWrapper
|
|
7
|
+
|
|
8
|
+
from .ColorSurrogateVal import ColorSurrogateVal
|
|
9
|
+
|
|
10
|
+
class FillFormatVal:
|
|
11
|
+
"""Simple wrapper for FillFormat with Pythonic getters and setters."""
|
|
12
|
+
|
|
13
|
+
_proto_class = DipsAPI_pb2.FillFormat
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def __init__(self, fill_color: Optional[ColorSurrogateVal] = None, proto_message: Optional[Any] = None):
|
|
17
|
+
"""Initialize the FillFormat wrapper."""
|
|
18
|
+
# Initialize the protobuf message
|
|
19
|
+
if proto_message is not None:
|
|
20
|
+
self._proto_message = proto_message
|
|
21
|
+
else:
|
|
22
|
+
self._proto_message = self._proto_class()
|
|
23
|
+
|
|
24
|
+
if fill_color is not None:
|
|
25
|
+
self._proto_message.FillColor.CopyFrom(fill_color.to_proto())
|
|
26
|
+
self._fill_color_wrapper = fill_color
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
# Properties
|
|
30
|
+
|
|
31
|
+
@property
|
|
32
|
+
def apply_fill(self) -> bool:
|
|
33
|
+
"""Get the ApplyFill field value."""
|
|
34
|
+
return self._proto_message.ApplyFill
|
|
35
|
+
|
|
36
|
+
@apply_fill.setter
|
|
37
|
+
def apply_fill(self, value: bool) -> None:
|
|
38
|
+
"""Set the ApplyFill field value."""
|
|
39
|
+
self._proto_message.ApplyFill = value
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
@property
|
|
43
|
+
def fill_color(self) -> ColorSurrogateVal:
|
|
44
|
+
"""Get the FillColor field as a wrapper."""
|
|
45
|
+
if not hasattr(self, '_fill_color_wrapper'):
|
|
46
|
+
self._fill_color_wrapper = ColorSurrogateVal(proto_message=self._proto_message.FillColor)
|
|
47
|
+
return self._fill_color_wrapper
|
|
48
|
+
|
|
49
|
+
@fill_color.setter
|
|
50
|
+
def fill_color(self, value: ColorSurrogateVal) -> None:
|
|
51
|
+
"""Set the FillColor field to a wrapper."""
|
|
52
|
+
self._proto_message.FillColor.CopyFrom(value.to_proto())
|
|
53
|
+
# Update the cached wrapper if it exists
|
|
54
|
+
if hasattr(self, '_fill_color_wrapper'):
|
|
55
|
+
self._fill_color_wrapper._proto_message.CopyFrom(self._proto_message.FillColor)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
# Utility methods
|
|
59
|
+
|
|
60
|
+
def to_proto(self):
|
|
61
|
+
"""Get the underlying protobuf message."""
|
|
62
|
+
return self._proto_message
|
|
63
|
+
|
|
64
|
+
@classmethod
|
|
65
|
+
def from_proto(cls, proto_message):
|
|
66
|
+
"""Create wrapper from existing protobuf message."""
|
|
67
|
+
wrapper = cls()
|
|
68
|
+
wrapper._proto_message.CopyFrom(proto_message)
|
|
69
|
+
return wrapper
|
|
70
|
+
|
|
71
|
+
def copy(self):
|
|
72
|
+
"""Create a copy of this wrapper."""
|
|
73
|
+
new_wrapper = self.__class__()
|
|
74
|
+
new_wrapper._proto_message.CopyFrom(self._proto_message)
|
|
75
|
+
return new_wrapper
|
|
76
|
+
|
|
77
|
+
def __str__(self) -> str:
|
|
78
|
+
"""String representation."""
|
|
79
|
+
return f"{self.__class__.__name__}({self._proto_message})"
|
|
80
|
+
|
|
81
|
+
def __repr__(self) -> str:
|
|
82
|
+
"""Detailed string representation."""
|
|
83
|
+
return f"{self.__class__.__name__}({self._proto_message})"
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
from typing import List
|
|
2
|
+
from . import DipsAPI_pb2_grpc
|
|
3
|
+
from . import DipsAPI_pb2
|
|
4
|
+
from .FoldEntityInfoVal import FoldEntityInfoVal
|
|
5
|
+
|
|
6
|
+
class FoldEntityInfoRef:
|
|
7
|
+
def __init__(self, channelToConnectOn, ref: DipsAPI_pb2.ProtoReference_FoldEntityInfo):
|
|
8
|
+
self.__modelRef = ref
|
|
9
|
+
self.__refManagerStub = DipsAPI_pb2_grpc.nSameModuleReferenceAccessorStub(channelToConnectOn)
|
|
10
|
+
self.__channelToConnectOn = channelToConnectOn
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def GetValue(self) -> FoldEntityInfoVal:
|
|
14
|
+
bytes = self.__refManagerStub.GetValue(self.__modelRef.ID)
|
|
15
|
+
ret = DipsAPI_pb2.FoldEntityInfo()
|
|
16
|
+
ret.MergeFromString(bytes.data)
|
|
17
|
+
return FoldEntityInfoVal.from_proto(ret)
|
|
18
|
+
|
|
19
|
+
def get_model_ref(self):
|
|
20
|
+
"""Get the underlying model reference for direct protobuf operations."""
|
|
21
|
+
return self.__modelRef
|
|
22
|
+
|
|
23
|
+
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"""Generated wrapper for FoldEntityInfo protobuf message."""
|
|
2
|
+
|
|
3
|
+
from typing import Any, Optional, List, Dict
|
|
4
|
+
from . import DipsAPI_pb2
|
|
5
|
+
|
|
6
|
+
from .ProtobufCollectionWrappers import _ProtobufListWrapper, _ProtobufMapWrapper
|
|
7
|
+
|
|
8
|
+
from .ColorSurrogateVal import ColorSurrogateVal
|
|
9
|
+
from .FoldWindowEntityInfoVal import FoldWindowEntityInfoVal
|
|
10
|
+
|
|
11
|
+
class FoldEntityInfoVal:
|
|
12
|
+
"""Simple wrapper for FoldEntityInfo with Pythonic getters and setters."""
|
|
13
|
+
|
|
14
|
+
_proto_class = DipsAPI_pb2.FoldEntityInfo
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def __init__(self, color: Optional[ColorSurrogateVal] = None, fold_window_entity_info: Optional[FoldWindowEntityInfoVal] = None, proto_message: Optional[Any] = None):
|
|
18
|
+
"""Initialize the FoldEntityInfo wrapper."""
|
|
19
|
+
# Initialize the protobuf message
|
|
20
|
+
if proto_message is not None:
|
|
21
|
+
self._proto_message = proto_message
|
|
22
|
+
else:
|
|
23
|
+
self._proto_message = self._proto_class()
|
|
24
|
+
|
|
25
|
+
if color is not None:
|
|
26
|
+
self._proto_message.Color.CopyFrom(color.to_proto())
|
|
27
|
+
self._color_wrapper = color
|
|
28
|
+
if fold_window_entity_info is not None:
|
|
29
|
+
self._proto_message.FoldWindowEntityInfo.CopyFrom(fold_window_entity_info.to_proto())
|
|
30
|
+
self._fold_window_entity_info_wrapper = fold_window_entity_info
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
# Properties
|
|
34
|
+
|
|
35
|
+
@property
|
|
36
|
+
def id(self) -> str:
|
|
37
|
+
"""Get the ID field value."""
|
|
38
|
+
return self._proto_message.ID
|
|
39
|
+
|
|
40
|
+
@id.setter
|
|
41
|
+
def id(self, value: str) -> None:
|
|
42
|
+
"""Set the ID field value."""
|
|
43
|
+
self._proto_message.ID = value
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
@property
|
|
47
|
+
def color(self) -> ColorSurrogateVal:
|
|
48
|
+
"""Get the Color field as a wrapper."""
|
|
49
|
+
if not hasattr(self, '_color_wrapper'):
|
|
50
|
+
self._color_wrapper = ColorSurrogateVal(proto_message=self._proto_message.Color)
|
|
51
|
+
return self._color_wrapper
|
|
52
|
+
|
|
53
|
+
@color.setter
|
|
54
|
+
def color(self, value: ColorSurrogateVal) -> None:
|
|
55
|
+
"""Set the Color field to a wrapper."""
|
|
56
|
+
self._proto_message.Color.CopyFrom(value.to_proto())
|
|
57
|
+
# Update the cached wrapper if it exists
|
|
58
|
+
if hasattr(self, '_color_wrapper'):
|
|
59
|
+
self._color_wrapper._proto_message.CopyFrom(self._proto_message.Color)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
@property
|
|
63
|
+
def fold_window_entity_info(self) -> FoldWindowEntityInfoVal:
|
|
64
|
+
"""Get the FoldWindowEntityInfo field as a wrapper."""
|
|
65
|
+
if not hasattr(self, '_fold_window_entity_info_wrapper'):
|
|
66
|
+
self._fold_window_entity_info_wrapper = FoldWindowEntityInfoVal(proto_message=self._proto_message.FoldWindowEntityInfo)
|
|
67
|
+
return self._fold_window_entity_info_wrapper
|
|
68
|
+
|
|
69
|
+
@fold_window_entity_info.setter
|
|
70
|
+
def fold_window_entity_info(self, value: FoldWindowEntityInfoVal) -> None:
|
|
71
|
+
"""Set the FoldWindowEntityInfo field to a wrapper."""
|
|
72
|
+
self._proto_message.FoldWindowEntityInfo.CopyFrom(value.to_proto())
|
|
73
|
+
# Update the cached wrapper if it exists
|
|
74
|
+
if hasattr(self, '_fold_window_entity_info_wrapper'):
|
|
75
|
+
self._fold_window_entity_info_wrapper._proto_message.CopyFrom(self._proto_message.FoldWindowEntityInfo)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
# Utility methods
|
|
79
|
+
|
|
80
|
+
def to_proto(self):
|
|
81
|
+
"""Get the underlying protobuf message."""
|
|
82
|
+
return self._proto_message
|
|
83
|
+
|
|
84
|
+
@classmethod
|
|
85
|
+
def from_proto(cls, proto_message):
|
|
86
|
+
"""Create wrapper from existing protobuf message."""
|
|
87
|
+
wrapper = cls()
|
|
88
|
+
wrapper._proto_message.CopyFrom(proto_message)
|
|
89
|
+
return wrapper
|
|
90
|
+
|
|
91
|
+
def copy(self):
|
|
92
|
+
"""Create a copy of this wrapper."""
|
|
93
|
+
new_wrapper = self.__class__()
|
|
94
|
+
new_wrapper._proto_message.CopyFrom(self._proto_message)
|
|
95
|
+
return new_wrapper
|
|
96
|
+
|
|
97
|
+
def __str__(self) -> str:
|
|
98
|
+
"""String representation."""
|
|
99
|
+
return f"{self.__class__.__name__}({self._proto_message})"
|
|
100
|
+
|
|
101
|
+
def __repr__(self) -> str:
|
|
102
|
+
"""Detailed string representation."""
|
|
103
|
+
return f"{self.__class__.__name__}({self._proto_message})"
|