X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FConnectorPlugin%2FConnectorPlugin_ExportFeature.py;h=31db8fc9a78ee751798abeef284d32794b8af121;hb=fb54db5e1466b16dfc029c4a7364a67a9a6a8c24;hp=26ab3ca9fd49099ae27ac15dd0198b381852be41;hpb=a24b7e6f4d112d5e7889fd76f030298fc428cd01;p=modules%2Fshaper.git diff --git a/src/ConnectorPlugin/ConnectorPlugin_ExportFeature.py b/src/ConnectorPlugin/ConnectorPlugin_ExportFeature.py index 26ab3ca9f..31db8fc9a 100644 --- a/src/ConnectorPlugin/ConnectorPlugin_ExportFeature.py +++ b/src/ConnectorPlugin/ConnectorPlugin_ExportFeature.py @@ -4,6 +4,8 @@ import EventsAPI import ModelAPI +import GeomAPI +import GeomAlgoAPI import salome from salome.geom import geomBuilder @@ -39,10 +41,6 @@ class ExportFeature(ModelAPI.ModelAPI_Feature): def isAction(self): return True - # The action is not placed into the history anyway - #def isInHistory(self): - # return False - ## This feature has no attributes, as it is action. def initAttributes(self): pass @@ -55,26 +53,40 @@ class ExportFeature(ModelAPI.ModelAPI_Feature): if aPartSize == 0: EventsAPI.Events_Error_send("No results in the active document") return - - anObjList = [self.Part.object(kResultBodyType, idx) for idx in xrange(aPartSize)] + + anObjList = [self.Part.object(kResultBodyType, idx) for idx in xrange(aPartSize)] + aShapesList = GeomAlgoAPI.ShapeList() + aName = "" for idx, anObject in enumerate(anObjList): aResult = ModelAPI.modelAPI_Result(anObject) aBodyResult = ModelAPI.modelAPI_ResultBody(aResult) if not aBodyResult: continue aShape = aBodyResult.shape() - aDump = aShape.getShapeStream() - # Load shape to SALOME Geom - aBrep = self.geompy.RestoreShape(aDump) - aName = aBodyResult.data().name() - - # Make unique name - aId = getObjectIndex(aName) - if aId != 0: - aName = aName + '_' + str(aId) - - self.geompy.addToStudy(aBrep, aName) - self.geomObjects.append([aShape, aBrep]) + if aShape is not None and not aShape.isNull(): + aShapesList.append(aShape) + if len(aShapesList) == 1: + aName = aBodyResult.data().name() + + # issue 1045: create compound if there are more than one shape + if len(aShapesList) > 1: + self.shape = GeomAlgoAPI.GeomAlgoAPI_CompoundBuilder.compound(aShapesList) + aName = "ShaperResults" + elif len(aShapesList) == 1: + self.shape = aShapesList[0] + + # so, only one shape is always in the result + aDump = self.shape.getShapeStream() + # Load shape to SALOME Geom + aBrep = self.geompy.RestoreShape(aDump) + + # Make unique name + aId = getObjectIndex(aName) + if aId != 0: + aName = aName + '_' + str(aId) + + self.geompy.addToStudy(aBrep, aName) + self.brep = aBrep ## Exports all groups def exportGroups(self): @@ -84,12 +96,25 @@ class ExportFeature(ModelAPI.ModelAPI_Feature): for anIndex in range(0, aFeaturesNum): aFeature = self.Part.object("Features", anIndex) aSelectionList = aFeature.data().selectionList("group_list") - aName = aFeature.data().name() # if a group has been found if aSelectionList: + aFeature = ModelAPI.objectToFeature(aFeature) + if aFeature.firstResult() is not None: + aName = aFeature.firstResult().data().name() groupIndex = groupIndex + 1 self.createGroupFromList(aSelectionList, aName) - + + ## Returns a type of the shape in the old GEOM representation + def shapeType(self, shape): + if shape.isVertex(): + return "VERTEX" + elif shape.isEdge(): + return "EDGE" + elif shape.isFace(): + return "FACE" + + return "SOLID" + ## Creates a group by given list of selected objects and the name # @param theSelectionList: list of selected objects # @param theGroupName: name of the group to create @@ -98,28 +123,34 @@ class ExportFeature(ModelAPI.ModelAPI_Feature): # and get the corresponding ID aSelectionNum = theSelectionList.size() Ids = [] + groupType = "" for aSelIndex in range(0, aSelectionNum): aSelection = theSelectionList.value(aSelIndex) - aSelectionContext = aSelection.context() - anID = aSelection.Id() - Ids.append(anID) - if aSelection.value().isVertex(): - groupType = "VERTEX" - elif aSelection.value().isEdge(): - groupType = "EDGE" - elif aSelection.value().isFace(): - groupType = "FACE" + # issue 1326: bodies that are already concealed did not exported, so groups should not be invalid + aContext = ModelAPI.modelAPI_Result(aSelection.context()) + if aContext is None or aContext.isConcealed() or aContext.isDisabled(): + continue + + anID = GeomAlgoAPI.GeomAlgoAPI_CompoundBuilder.id(self.shape, aSelection.value()) + if anID == 0: + #it may be a compound of objects if movement of the group to the end + # splits the original element to several (issue 1146) + anExp = GeomAPI.GeomAPI_ShapeExplorer(aSelection.value(), GeomAPI.GeomAPI_Shape.SHAPE) + while anExp.more(): + anID = GeomAlgoAPI.GeomAlgoAPI_CompoundBuilder.id(self.shape, anExp.current()) + if anID != 0: + Ids.append(anID) + groupType = self.shapeType(anExp.current()) + anExp.next() else: - groupType = "SOLID" - - # iterate on exported objects and check if the current - # group refers to this object - for obj in self.geomObjects: - if aSelectionContext.shape().isEqual(obj[0]): - aGroup = self.geompy.CreateGroup(obj[1], self.geompy.ShapeType[groupType]) - self.geompy.UnionIDs(aGroup,Ids) - self.geompy.addToStudyInFather(obj[1], aGroup, theGroupName) - + Ids.append(anID) + groupType = self.shapeType(aSelection.value()) + + if len(Ids) <> 0: + aGroup = self.geompy.CreateGroup(self.brep, self.geompy.ShapeType[groupType]) + self.geompy.UnionIDs(aGroup,Ids) + self.geompy.addToStudyInFather(self.brep, aGroup, theGroupName) + ## Exports all shapes and groups into the GEOM module. def execute(self): aSession = ModelAPI.ModelAPI_Session.get() @@ -129,7 +160,7 @@ class ExportFeature(ModelAPI.ModelAPI_Feature): self.geomObjects = [] ## geomBuilder tool self.geompy = geomBuilder.New(salome.myStudy) - + # Export bodies and groups self.exportBodies() self.exportGroups()