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 SetAutoColor(self, *args): return
346 def GetAutoColor(self, *args): return False
347 def SetMarkerStd(self, *args): return
348 def SetMarkerTexture(self, *args): return
349 def GetMarkerType(self, *args): return GEOM.MT_NONE
350 def GetMarkerSize(self, *args): return GEOM.MS_NONE
351 def GetMarkerTexture(self, *args): return 0
355 class SHAPERSTUDY_Group(SHAPERSTUDY_ORB__POA.SHAPER_Group, SHAPERSTUDY_Object):
357 Constructs an instance of SHAPERSTUDY Group
359 def __init__ ( self, *args):
360 SHAPERSTUDY_GenericObject.__init__(self)
363 self.selectionTick = -2 # tick of the main shape when the current selection is set
364 self.selectionOld = [] # keep selection for breaking link
368 self.type = 37 # a group type
371 def SetSelectionType(self, theType):
373 Sets what is returned in the GEOM_IGroupOperations::GetType
375 self.seltype = theType
377 def GetSelectionType(self):
379 Returns the type of the selected sub-shapes
383 def SetSelection(self, theSelection):
385 Sets what is returned in the GEOM_IGroupOperations::GetObjects
389 aMainShape = self.GetMainShape()
391 aTick = aMainShape.GetTick()
392 if aTick > self.selectionTick or aTick == -2:
393 self.selectionOld = self.selection
394 self.selection = theSelection
395 self.selectionTick = aTick
396 #print("Set selection " + self.entry + " old = " + str(self.selectionOld) + " new = " + str(self.selection) + " tick = " + str(aTick))
397 elif self.selection != theSelection:
398 self.selectionOld = self.selection
399 self.selection = theSelection
400 if self.selectionTick < 0:
401 self.selectionTick = aTick + 1
403 self.selectionTick = self.selectionTick + 1 # when the group is changed, but the main shape stays the same, make tick + 1
404 #print("Set selection " + self.entry + " old = " + str(self.selectionOld) + " new = " + str(self.selection) + " tick = " + str(self.selectionTick))
407 def GetSelection(self):
409 Returns the selected sub-shapes indices
411 return self.selection
413 def GetSelectionOld(self):
415 Returns the previously selected sub-shapes indices
417 #print("get selection OLD " + self.entry + " old = " + str(self.selectionOld) + " new = " + str(self.selection))
418 return self.selectionOld
420 def IsMainShape( self ):
422 Returns True if this object is not a sub-shape of another object.
426 def GetMainShape( self ):
428 Main shape is groups owner
430 return self.SO.GetFather().GetObject()
432 def GetSubShapeIndices( self ):
434 Get a list of ID's of sub-shapes in the main shape.
436 return self.selection
438 def getShape( self ):
440 Redefinition of the getShape method: here it creates a shape by the
441 main shape and the group index.
444 self.data = StudyData_Swig.StudyData_Object()
445 # convert selection to long list
446 anArg = StudyData_Swig.LongList()
447 for l in self.selection:
449 return self.data.groupShape(self.GetMainShape().getShape(), anArg)
451 def GetShapeType( self ):
453 Group shape type is always compound.
455 return GEOM.COMPOUND;
461 Get value of a modification counter of the group
463 return self.selectionTick
465 def SetTick( self, theValue ):
467 Sets value of a modification counter of the group
469 #print("Set tick " + self.entry + " tick = " + str(theValue))
470 self.selectionTick = theValue
472 class SHAPERSTUDY_Field(SHAPERSTUDY_ORB__POA.SHAPER_Field, SHAPERSTUDY_Group):
474 Constructs an instance of SHAPERSTUDY Field (inherits selection from a Group object)
476 def __init__ ( self, *args):
477 SHAPERSTUDY_GenericObject.__init__(self)
480 self.selectionTick = -2 # tick of the main shape when the current selection is set
481 self.selectionOld = [] # keep selection for breaking link
485 self.type = 52 # a field type
486 self.valtype = None # type of the values
487 self.steps = [] # list of long
488 self.components = [] # string array, names of the components
489 self.name = None # name, string
490 self.fieldsteps = {} # FieldSteps objects identified by step ID
493 def SetValuesType( self, theType ):
495 Sets the type of values in the field
497 self.valtype = theType
499 def GetValuesType( self ):
501 Returns the type of values in the field
506 def GetDataType( self ):
508 Returns the type of values in the field in terms of GEOM enumeration
510 if self.valtype == 0:
512 elif self.valtype == 1:
514 elif self.valtype == 2:
515 return GEOM.FDT_Double
516 elif self.valtype == 3:
517 return GEOM.FDT_String
518 return None # unknown case
520 def GetShape ( self ):
522 Returns the shape the field lies on
524 return super().GetMainShape()
526 def SetSteps( self, theSteps ):
527 self.steps = theSteps
529 def GetSteps( self ):
532 def SetComponents( self, theComponents ):
533 self.components = theComponents
535 def GetComponents( self ):
536 return self.components
538 def GetDimension( self ):
539 aShapeType = super().GetSelectionType()
541 return -1 # whole part
542 elif aShapeType == 7:
544 elif aShapeType == 6:
546 elif aShapeType == 4:
548 elif aShapeType == 2:
550 return None # unknown case
552 def ClearFieldSteps( self ):
555 def AddFieldStep( self, theStampID, theStepID, theValues):
557 if self.valtype == 0:
558 aFieldStep = SHAPER_BoolFieldStep()
559 elif self.valtype == 1:
560 aFieldStep = SHAPER_IntFieldStep()
561 elif self.valtype == 2:
562 aFieldStep = SHAPER_DoubleFieldStep()
564 aFieldStep.SetStep(theStampID, theStepID, theValues)
565 self.fieldsteps[theStepID] = aFieldStep._this()
567 def GetStep( self, theStepID ):
568 return self.fieldsteps[theStepID]
572 class SHAPER_FieldStep:
574 Base class for all step-classes
576 def __init__ ( self, *args):
577 self.stamp = None # long, ID of stamp
578 self.step = None # long, ID of step
579 self.values = None # array of values of the needed type
582 Defines all parameters of the step
584 def SetStep( self, theStamp, theStep, theValues ):
585 self.stamp = theStamp
587 self.values = theValues
592 def GetStamp( self ):
600 Returns a name of a sub-shape if the sub-shape is published in the study
602 def GetSubShape(self, theSubID):
603 # the SHAPER study does not support sub-shapes for now
607 class SHAPER_DoubleFieldStep(SHAPERSTUDY_ORB__POA.SHAPER_DoubleFieldStep, SHAPER_FieldStep):
609 Constructs an instance of SHAPERSTUDY Field step of type Double
611 def __init__ ( self, *args):
615 Returns values as an array of the needed type
617 def GetValues( self ):
618 aResult = [] # to make any type of result, create a corba-type
619 for i in self.values:
620 aResult.append(float(i))
625 class SHAPER_IntFieldStep(SHAPERSTUDY_ORB__POA.SHAPER_IntFieldStep, SHAPER_FieldStep):
627 Constructs an instance of SHAPERSTUDY Field step of type Double
629 def __init__ ( self, *args):
633 Returns values as an array of the needed type
635 def GetValues( self ):
636 aResult = [] # to make any type of result, create a corba-type
637 for i in self.values:
638 aResult.append(int(i))
643 class SHAPER_BoolFieldStep(SHAPERSTUDY_ORB__POA.SHAPER_BoolFieldStep, SHAPER_FieldStep):
645 Constructs an instance of SHAPERSTUDY Field step of type Double
647 def __init__ ( self, *args):
651 Returns values as an array of the needed type
653 def GetValues( self ):
654 aResult = [] # to make any type of result, create a corba-type
655 for i in self.values:
656 aResult.append(int(i))