1 # Copyright (C) 2014-2019 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
21 # ExportFeature class definition
28 from salome.shaper import model
32 import SHAPERSTUDY_ORB
35 # Feature to export all shapes and groups into the GEOM module
36 class PublishToStudyFeature(ModelAPI.ModelAPI_Feature):
40 ModelAPI.ModelAPI_Feature.__init__(self)
44 ## Export kind. Static.
46 return "PublishToStudy"
48 ## Returns the kind of a feature.
50 return PublishToStudyFeature.ID()
52 ## This feature is action: has no property panel and executes immediately.
56 ## This feature has no attributes, as it is action.
57 def initAttributes(self):
60 ## Exports all shapes and groups into the GEOM module.
62 aSession = ModelAPI.ModelAPI_Session.get()
63 aPartSet = aSession.moduleDocument()
64 # check that the PartSet document current feature is the last to avoid problems with all
66 if aPartSet.size(model.ModelAPI_Feature_group()) > 0:
67 aLastFeature = ModelAPI.objectToFeature(aPartSet.object(model.ModelAPI_Feature_group(), aPartSet.size(model.ModelAPI_Feature_group()) - 1))
68 aCurrentFeature = aPartSet.currentFeature(True)
69 if aLastFeature.data().featureId() != aCurrentFeature.data().featureId():
70 EventsAPI.Events_InfoMessage("PublishToStudy", "Not all PartSet parts are up-to-date, nothing is published. Please, make the last PartSet feature as current.", self).send()
72 # find a shaper-study component
74 import SHAPERSTUDY_utils
75 aComponent = SHAPERSTUDY_utils.findOrCreateComponent()
76 anEngine = SHAPERSTUDY_utils.getEngine()
77 # collect all processed internal entries to break the link of unprocessed later
80 # iterate all parts and all results to publish them in SHAPER_STUDY
81 for aPartId in range(aPartSet.size(model.ModelAPI_ResultPart_group())):
82 aPartObject = aPartSet.object(model.ModelAPI_ResultPart_group(), aPartId)
83 aPartRes = ModelAPI.modelAPI_ResultPart(ModelAPI.modelAPI_Result(aPartObject))
84 aPartDoc = aPartRes.partDoc()
85 if aPartDoc is None and aPartObject is not None:
86 EventsAPI.Events_InfoMessage("PublishToStudy", "For publish to SHAPER-STUDY some Part is not activated", self).send()
88 aPartFeatureId = aPartSet.feature(aPartRes).data().featureId()
89 for aResId in range(aPartDoc.size(model.ModelAPI_ResultBody_group())):
90 aResObject = aPartDoc.object(model.ModelAPI_ResultBody_group(), aResId)
91 aRes = model.objectToResult(aResObject)
92 print("Found a result to publish ", aRes.data().name())
93 aResFeatureId = aPartDoc.feature(aRes).data().featureId()
94 aSSEntry = str(aPartFeatureId) + ":" + str(aResFeatureId)
95 aSShape = anEngine.FindOrCreateShape(aSSEntry)
96 aSShape.SetShapeByStream(aRes.shape().getShapeStream(False))
97 if not aSShape.GetSO(): # publish in case it is a new shape
98 anEngine.AddInStudy(aSShape, aRes.data().name(), None)
99 allProcessed.append(aSSEntry)
101 # process all SHAPER-STUDY shapes to find dead
103 aSOIter = SHAPERSTUDY_utils.getStudy().NewChildIterator(aComponent)
104 while aSOIter.More():
105 aSO = aSOIter.Value()
107 anObj = salome.orb.string_to_object(anIOR)
108 if isinstance(anObj, SHAPERSTUDY_ORB._objref_SHAPER_Object):
109 anEntry = anObj.GetEntry()
110 if len(anEntry) == 0:
112 elif anEntry.startswith("dead"):
113 deadNames.append(anObj.GetEntry())
114 elif anEntry not in allProcessed: # found a removed shape: make it dead
116 aName = "dead" + str(anIndex) + "_" + anEntry
117 while aName in deadNames:
118 anIndex = anIndex + 1
119 aName = "dead" + str(anIndex) + "_" + anEntry
120 anObj.SetEntry(aName)
121 aSO.SetAttrString("AttributeName", aSO.GetName() + " (" + str(anIndex) + ")")
122 # remove the reference - red node
123 aSOIter2 = SHAPERSTUDY_utils.getStudy().NewChildIterator(aSO)
124 while aSOIter2.More():
125 aSO2 = aSOIter2.Value()
126 if aSO2.ReferencedObject()[0] and aSO2.ReferencedObject()[1].GetID() == aSO.GetID():
127 aBuilder = SHAPERSTUDY_utils.getStudy().NewBuilder()
128 aBuilder.RemoveReference(aSO2)