]> SALOME platform Git repositories - modules/shaper.git/blob - src/ConnectorPlugin/ConnectorPlugin_PublishToStudyFeature.py
Salome HOME
a6b8d91e0a8d8c3549cf6195ae5e7f3c10ce3700
[modules/shaper.git] / src / ConnectorPlugin / ConnectorPlugin_PublishToStudyFeature.py
1 # Copyright (C) 2014-2019  CEA/DEN, EDF R&D
2 #
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.
7 #
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.
12 #
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
16 #
17 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 #
19
20 ## @package Plugins
21 #  ExportFeature class definition
22
23 import ModelAPI
24 import ExchangeAPI
25 import EventsAPI
26
27 import salome
28 from salome.shaper import model
29
30 import os
31
32 import SHAPERSTUDY_ORB
33
34 ## @ingroup Plugins
35 #  Feature to export all shapes and groups into the GEOM module
36 class PublishToStudyFeature(ModelAPI.ModelAPI_Feature):
37
38     ## The constructor.
39     def __init__(self):
40         ModelAPI.ModelAPI_Feature.__init__(self)
41         pass
42
43     @staticmethod
44     ## Export kind. Static.
45     def ID():
46         return "PublishToStudy"
47
48     ## Returns the kind of a feature.
49     def getKind(self):
50         return PublishToStudyFeature.ID()
51
52     ## This feature is action: has no property panel and executes immediately.
53     def isAction(self):
54         return True
55
56     ## This feature has no attributes, as it is action.
57     def initAttributes(self):
58         pass
59
60     ## Exports all shapes and groups into the GEOM module.
61     def execute(self):
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
65         # features update
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()
71             return
72         # find a shaper-study component
73         salome.salome_init(1)
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
78         allProcessed = []
79
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()
87             break
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             else: # restore a red reference if it was deleted
100               aRes, aSO2 = aSShape.GetSO().FindSubObject(1)
101               if aRes:
102                 aRes, aRef = aSO2.ReferencedObject()
103                 if not aRes:
104                   aBuilder = SHAPERSTUDY_utils.getStudy().NewBuilder()
105                   aBuilder.Addreference(aSO2, aSShape.GetSO())
106
107             allProcessed.append(aSSEntry)
108
109         # process all SHAPER-STUDY shapes to find dead
110         aSOIter = SHAPERSTUDY_utils.getStudy().NewChildIterator(aComponent)
111         while aSOIter.More():
112           aSO = aSOIter.Value()
113           anIOR = aSO.GetIOR()
114           if len(anIOR):
115             anObj = salome.orb.string_to_object(anIOR)
116             if isinstance(anObj, SHAPERSTUDY_ORB._objref_SHAPER_Object):
117               anEntry = anObj.GetEntry()
118               if len(anEntry) == 0:
119                 continue;
120               elif anEntry not in allProcessed: # found a removed shape: make it dead for the moment
121                 # remove the reference - red node
122                 aRes, aSO2 = aSO.FindSubObject(1)
123                 if aRes:
124                   aRes, aRef = aSO2.ReferencedObject()
125                   if aRes:
126                     aBuilder = SHAPERSTUDY_utils.getStudy().NewBuilder()
127                     aBuilder.RemoveReference(aSO2)
128           aSOIter.Next()