1 # Copyright (C) 2019-2020 CEA/DEN, EDF R&D
3 # This library is free software; you can redistribute it and/or
4 # modify it under the terms of the GNU Lesser General Public
5 # License as published by the Free Software Foundation; either
6 # version 2.1 of the License, or (at your option) any later version.
8 # This library is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 # Lesser General Public License for more details.
13 # You should have received a copy of the GNU Lesser General Public
14 # License along with this library; if not, write to the Free Software
15 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 import SHAPERSTUDY_ORB
21 import SHAPERSTUDY_ORB__POA
23 from SHAPERSTUDY_utils import getEngine, getStudy
28 # converter from the integer values to idl shape_type enumerations
30 0:GEOM.COMPOUND, 1:GEOM.COMPSOLID, 2:GEOM.SOLID,
31 3:GEOM.SHELL, 4:GEOM.FACE, 5:GEOM.WIRE,
32 6:GEOM.EDGE, 7:GEOM.VERTEX, 8:GEOM.SHAPE, 9:GEOM.FLAT}
34 class SHAPERSTUDY_GenericObject:
36 Implement methods of SALOME::GenericObj
43 Increase the reference count (mark as used by another object).
45 #print(self.GetEntry())
47 #print("Register() --------- ", id(self), self.cnt)
52 Decrease the reference count (release by another object)
55 #print("UnRegister() --------- ", id(self), self.cnt)
57 from SHAPERSTUDY_utils import getPOA
59 oid=poa.servant_to_id(self)
60 poa.deactivate_object(oid)
61 if hasattr(self,"SetSO"):
62 self.SetSO(None) # release a GenericObject SO
63 #print("UnRegister() --------- OK")
68 Obsolete, left for compatibility reasons only. Use UnRegister() instead
76 class SHAPERSTUDY_Object(SHAPERSTUDY_ORB__POA.SHAPER_Object,
77 SHAPERSTUDY_GenericObject):
79 Constructs an instance of SHAPERSTUDY Object.
81 def __init__ ( self, *args):
82 SHAPERSTUDY_GenericObject.__init__(self)
86 self.type = 1 # by default it is a shape (Import feature in GEOMImpl_Types.hxx)
89 def GetShapeType( self ):
91 Get a GEOM.shape_type of the object value.
95 global __shape_types__
96 return __shape_types__[self.data.type()];
98 def IsMainShape( self ):
100 Returns True if this object is not a sub-shape of another object.
104 def GetSubShapeIndices( self ):
106 Get a list of ID's of sub-shapes in the main shape.
110 def GetMainShape( self ):
112 Get a main shape object to which this object is a sub-shape.
116 def getShape( self ):
118 Get the TopoDS_Shape, for collocated case only.
119 Called by GEOM_Client to get TopoDS_Shape pointer
121 if self.data is None:
123 return self.data.shape()
125 def GetShapeStream( self ):
127 Get geometric shape of the object as a byte stream in BRep format
129 if self.data is None:
131 return self.data.shapeStream().encode()
133 def GetOldShapeStream( self ):
135 Get geometric shape of the object as a byte stream in BRep format
137 if self.data is None:
139 return self.data.oldShapeStream().encode()
141 def SetShapeByStream(self, theStream):
143 Sets geometric shape content of the object as a byte stream in BRep format
146 self.data.updateShape(theStream)
148 self.data = StudyData_Swig.StudyData_Object(theStream)
151 Methods from BaseObject
155 Get name of the object associated with this object.
157 return self.SO.GetName()
159 def SetEntry( self, theInternalEntry ):
161 Sets internal (unique) entry of the object in the component's data tree.
163 self.entry = theInternalEntry
165 def GetEntry( self ):
167 Get internal (unique) entry of the object in the component's data tree.
173 Get internal type of operation created this object.
174 In SMESH is used to find out if an object is GROUP (type == 37)
178 def SetType( self, theType ):
180 Sets internal type of operation created this object.
181 In SMESH is used to find out if an object is GROUP (type == 37, for shape it is default=1)
187 Get value of a modification counter of the object
190 return self.data.getTick()
193 def SetTick( self, theValue ):
195 Sets value of a modification counter of the object
198 return self.data.setTick(theValue)
201 def GetStudyEntry( self ):
203 Get a Study entry where this object was published.
206 return self.SO.GetID()
211 Return true if geom object represents a shape.
212 For example, method return false for GEOM_MARKER
216 def IsSame( self, other ):
218 Return true if passed object is identical to this object
220 return self.GetType() == other.GetType() and self.GetEntry() == other.GetEntry()
224 Return the engine creating this object
227 return e._duplicate( e )
229 def SetSO( self, theSO ):
231 Sets SObject of this object (when it is published)
234 theSO.Register() # I hold a GenericObject!
241 Returns SObject of this object
245 def IsParametrical(self):
247 Returns true if the current object has connection to a parametrical model
248 which can be modified by parameters change.
250 return not self.IsDead() and self.type == 1 # only break link for shapes are accessible now
254 Returns true if the shape is dead - no parametrical link to the SHAPER exists
256 return self.GetEntry().startswith("dead")
260 Makes the dead-copy of the shape and returns it.
263 aBuilder = aStudy.NewBuilder()
264 aRes, aHistSO = self.SO.FindSubObject(10000)
265 if not aRes: # create a "history" folder if it does not exist
266 aHistSO = aBuilder.NewObjectToTag(self.SO, 10000)
267 aHistSO.SetAttrString("AttributeName", "History")
269 aDeadSO = aBuilder.NewObject(aHistSO)
270 anIndex = aDeadSO.Tag()
271 aDeadSO.SetAttrString("AttributeName", self.SO.GetName() + " (" + str(anIndex) + ")")
272 aRes, aPixMap = aBuilder.FindAttribute(self.SO, "AttributePixMap")
274 aDeadPixMap = aBuilder.FindOrCreateAttribute(aDeadSO, "AttributePixMap")
275 aDeadPixMap.SetPixMap(aPixMap.GetPixMap())
276 aDead = SHAPERSTUDY_Object()
277 aDeadEntry = "dead" + str(anIndex) + "_" + self.GetEntry()
278 aDead.SetEntry(aDeadEntry)
279 aDead.SetShapeByStream(self.data.oldShapeStream())
280 aDeadObj = aDead._this()
281 anIOR = salome.orb.object_to_string(aDeadObj)
282 aDeadSO.SetAttrString("AttributeIOR", anIOR)
284 if self.GetTick() > 2:
285 aDead.data.setTick(self.GetTick() - 1) # set the tick of an old shape
286 # make dead-copy also sub-groups
287 aSOIter = aStudy.NewChildIterator(self.SO)
288 while aSOIter.More():
289 aGroupSO = aSOIter.Value()
290 anIOR = aGroupSO.GetIOR()
292 aGroup = salome.orb.string_to_object(anIOR)
293 if isinstance(aGroup, SHAPERSTUDY_ORB._objref_SHAPER_Group) or \
294 isinstance(aGroup, SHAPERSTUDY_ORB._objref_SHAPER_Field):
295 if isinstance(aGroup, SHAPERSTUDY_ORB._objref_SHAPER_Group):
296 aDeadGroup = SHAPERSTUDY_Group()
298 aDeadGroup = SHAPERSTUDY_Field()
299 aDeadGroupEntry = "dead" + str(anIndex) + "_" + aGroup.GetEntry()
300 aDeadGroup.SetEntry(aDeadGroupEntry)
301 aDeadGroup.SetSelectionType(aGroup.GetSelectionType())
302 anOldSelection = aGroup.GetSelectionOld()
303 if len(anOldSelection) == 0: # in case there is no old modification, get the current, same as in shape
304 anOldSelection = aGroup.GetSelection()
305 aDeadGroup.SetSelection(anOldSelection)
306 if isinstance(aGroup, SHAPERSTUDY_ORB._objref_SHAPER_Field): # additional field data
307 aDeadGroup.SetValuesType(aGroup.GetValuesType())
308 aDeadGroup.SetSteps(aGroup.GetSteps())
309 aDeadGroup.SetComponents(aGroup.GetComponents())
310 for aStep in aGroup.GetSteps():
311 aStepObj = aGroup.GetStep(aStep)
312 aDeadGroup.AddFieldStep(aStepObj.GetStamp(), aStep, aStepObj.GetValues())
313 aDeadGroupSO = aBuilder.NewObject(aDeadSO)
314 aDeadGroup.SetSO(aDeadGroupSO)
315 # 15.01.20 groups and fields names stays the same
316 #aDeadGroupSO.SetAttrString("AttributeName", aGroupSO.GetName() + " (" + str(anIndex) + ")")
317 aDeadGroupSO.SetAttrString("AttributeName", aGroupSO.GetName())
318 aRes, aPixMap = aBuilder.FindAttribute(aGroupSO, "AttributePixMap")
320 aDeadPixMap = aBuilder.FindOrCreateAttribute(aDeadGroupSO, "AttributePixMap")
321 aDeadPixMap.SetPixMap(aPixMap.GetPixMap())
322 aDeadGroupObj = aDeadGroup._this()
323 anIOR = salome.orb.object_to_string(aDeadGroupObj)
324 aDeadGroupSO.SetAttrString("AttributeIOR", anIOR)
329 def SetShapeByPointer(self, theShape):
331 Sets the shape by the pointer to the TopoDS_Shape
334 self.data = StudyData_Swig.StudyData_Object()
335 self.data.SetShapeByPointer(theShape)
338 ### unnecessary methods that can be accidentally called from any module
339 def GetTopologyType(self, *args): return GEOM.SHAPE
340 def GetMinShapeType(self, *args): return GEOM.SHAPE
341 def GetMaxShapeType(self, *args): return GEOM.SHAPE
342 def GetSubShapeName(self, *args): return ""
343 def SetColor(self, *args): return
344 #def GetColor(self, *args): import SALOMEDS; return SALOMEDS.Color( 0,0,0 )
345 def GetColor(self, *args): import SALOMEDS; return SALOMEDS.Color( -1,-1,-1 )
346 def SetAutoColor(self, *args): return
347 def GetAutoColor(self, *args): return False
348 def SetMarkerStd(self, *args): return
349 def SetMarkerTexture(self, *args): return
350 def GetMarkerType(self, *args): return GEOM.MT_NONE
351 def GetMarkerSize(self, *args): return GEOM.MS_NONE
352 def GetMarkerTexture(self, *args): return 0
356 class SHAPERSTUDY_Group(SHAPERSTUDY_ORB__POA.SHAPER_Group, SHAPERSTUDY_Object):
358 Constructs an instance of SHAPERSTUDY Group
360 def __init__ ( self, *args):
361 SHAPERSTUDY_GenericObject.__init__(self)
364 self.selectionTick = -2 # tick of the main shape when the current selection is set
365 self.selectionOld = [] # keep selection for breaking link
369 self.type = 37 # a group type
372 def SetSelectionType(self, theType):
374 Sets what is returned in the GEOM_IGroupOperations::GetType
376 self.seltype = theType
378 def GetSelectionType(self):
380 Returns the type of the selected sub-shapes
384 def SetSelection(self, theSelection):
386 Sets what is returned in the GEOM_IGroupOperations::GetObjects
390 aMainShape = self.GetMainShape()
392 aTick = aMainShape.GetTick()
393 if aTick > self.selectionTick or aTick == -2:
394 self.selectionOld = self.selection
395 self.selection = theSelection
396 self.selectionTick = aTick
397 #print("Set selection " + self.entry + " old = " + str(self.selectionOld) + " new = " + str(self.selection) + " tick = " + str(aTick))
398 elif self.selection != theSelection:
399 self.selectionOld = self.selection
400 self.selection = theSelection
401 if self.selectionTick < 0:
402 self.selectionTick = aTick + 1
404 self.selectionTick = self.selectionTick + 1 # when the group is changed, but the main shape stays the same, make tick + 1
405 #print("Set selection " + self.entry + " old = " + str(self.selectionOld) + " new = " + str(self.selection) + " tick = " + str(self.selectionTick))
408 def GetSelection(self):
410 Returns the selected sub-shapes indices
412 return self.selection
414 def GetSelectionOld(self):
416 Returns the previously selected sub-shapes indices
418 #print("get selection OLD " + self.entry + " old = " + str(self.selectionOld) + " new = " + str(self.selection))
419 return self.selectionOld
421 def IsMainShape( self ):
423 Returns True if this object is not a sub-shape of another object.
427 def GetMainShape( self ):
429 Main shape is groups owner
431 return self.SO.GetFather().GetObject()
433 def GetSubShapeIndices( self ):
435 Get a list of ID's of sub-shapes in the main shape.
437 return self.selection
439 def getShape( self ):
441 Redefinition of the getShape method: here it creates a shape by the
442 main shape and the group index.
445 self.data = StudyData_Swig.StudyData_Object()
446 # convert selection to long list
447 anArg = StudyData_Swig.LongList()
448 for l in self.selection:
450 return self.data.groupShape(self.GetMainShape().getShape(), anArg)
452 def GetShapeType( self ):
454 Group shape type is always compound.
456 return GEOM.COMPOUND;
462 Get value of a modification counter of the group
464 return self.selectionTick
466 def SetTick( self, theValue ):
468 Sets value of a modification counter of the group
470 #print("Set tick " + self.entry + " tick = " + str(theValue))
471 self.selectionTick = theValue
473 class SHAPERSTUDY_Field(SHAPERSTUDY_ORB__POA.SHAPER_Field, SHAPERSTUDY_Group):
475 Constructs an instance of SHAPERSTUDY Field (inherits selection from a Group object)
477 def __init__ ( self, *args):
478 SHAPERSTUDY_GenericObject.__init__(self)
481 self.selectionTick = -2 # tick of the main shape when the current selection is set
482 self.selectionOld = [] # keep selection for breaking link
486 self.type = 52 # a field type
487 self.valtype = None # type of the values
488 self.steps = [] # list of long
489 self.components = [] # string array, names of the components
490 self.name = None # name, string
491 self.fieldsteps = {} # FieldSteps objects identified by step ID
494 def SetValuesType( self, theType ):
496 Sets the type of values in the field
498 self.valtype = theType
500 def GetValuesType( self ):
502 Returns the type of values in the field
507 def GetDataType( self ):
509 Returns the type of values in the field in terms of GEOM enumeration
511 if self.valtype == 0:
513 elif self.valtype == 1:
515 elif self.valtype == 2:
516 return GEOM.FDT_Double
517 elif self.valtype == 3:
518 return GEOM.FDT_String
519 return None # unknown case
521 def GetShape ( self ):
523 Returns the shape the field lies on
525 return super().GetMainShape()
527 def SetSteps( self, theSteps ):
528 self.steps = theSteps
530 def GetSteps( self ):
533 def SetComponents( self, theComponents ):
534 self.components = theComponents
536 def GetComponents( self ):
537 return self.components
539 def GetDimension( self ):
540 aShapeType = super().GetSelectionType()
542 return -1 # whole part
543 elif aShapeType == 7:
545 elif aShapeType == 6:
547 elif aShapeType == 4:
549 elif aShapeType == 2:
551 return None # unknown case
553 def ClearFieldSteps( self ):
556 def AddFieldStep( self, theStampID, theStepID, theValues):
558 if self.valtype == 0:
559 aFieldStep = SHAPER_BoolFieldStep()
560 elif self.valtype == 1:
561 aFieldStep = SHAPER_IntFieldStep()
562 elif self.valtype == 2:
563 aFieldStep = SHAPER_DoubleFieldStep()
565 aFieldStep.SetStep(theStampID, theStepID, theValues)
566 self.fieldsteps[theStepID] = aFieldStep._this()
568 def GetStep( self, theStepID ):
569 return self.fieldsteps[theStepID]
573 class SHAPER_FieldStep:
575 Base class for all step-classes
577 def __init__ ( self, *args):
578 self.stamp = None # long, ID of stamp
579 self.step = None # long, ID of step
580 self.values = None # array of values of the needed type
583 Defines all parameters of the step
585 def SetStep( self, theStamp, theStep, theValues ):
586 self.stamp = theStamp
588 self.values = theValues
593 def GetStamp( self ):
601 Returns a name of a sub-shape if the sub-shape is published in the study
603 def GetSubShape(self, theSubID):
604 # the SHAPER study does not support sub-shapes for now
608 class SHAPER_DoubleFieldStep(SHAPERSTUDY_ORB__POA.SHAPER_DoubleFieldStep, SHAPER_FieldStep):
610 Constructs an instance of SHAPERSTUDY Field step of type Double
612 def __init__ ( self, *args):
616 Returns values as an array of the needed type
618 def GetValues( self ):
619 aResult = [] # to make any type of result, create a corba-type
620 for i in self.values:
621 aResult.append(float(i))
626 class SHAPER_IntFieldStep(SHAPERSTUDY_ORB__POA.SHAPER_IntFieldStep, SHAPER_FieldStep):
628 Constructs an instance of SHAPERSTUDY Field step of type Double
630 def __init__ ( self, *args):
634 Returns values as an array of the needed type
636 def GetValues( self ):
637 aResult = [] # to make any type of result, create a corba-type
638 for i in self.values:
639 aResult.append(int(i))
644 class SHAPER_BoolFieldStep(SHAPERSTUDY_ORB__POA.SHAPER_BoolFieldStep, SHAPER_FieldStep):
646 Constructs an instance of SHAPERSTUDY Field step of type Double
648 def __init__ ( self, *args):
652 Returns values as an array of the needed type
654 def GetValues( self ):
655 aResult = [] # to make any type of result, create a corba-type
656 for i in self.values:
657 aResult.append(int(i))