From ec7b67521bbba95ea528fc5a08ee3f655098e1c3 Mon Sep 17 00:00:00 2001 From: mpv Date: Mon, 21 Dec 2015 16:57:33 +0300 Subject: [PATCH] Fix for the issue #1146 : ability to export groups that has been created on the previous topology and moved to the end --- .../ConnectorPlugin_ExportFeature.py | 48 +++++++++++++------ src/GeomAPI/GeomAPI_ShapeExplorer.cpp | 21 +++++++- 2 files changed, 52 insertions(+), 17 deletions(-) diff --git a/src/ConnectorPlugin/ConnectorPlugin_ExportFeature.py b/src/ConnectorPlugin/ConnectorPlugin_ExportFeature.py index ee7dafeb7..46cc4daa0 100644 --- a/src/ConnectorPlugin/ConnectorPlugin_ExportFeature.py +++ b/src/ConnectorPlugin/ConnectorPlugin_ExportFeature.py @@ -4,6 +4,7 @@ import EventsAPI import ModelAPI +import GeomAPI import GeomAlgoAPI import salome @@ -52,8 +53,8 @@ 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): @@ -78,12 +79,12 @@ class ExportFeature(ModelAPI.ModelAPI_Feature): 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 @@ -102,7 +103,18 @@ class ExportFeature(ModelAPI.ModelAPI_Feature): 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 @@ -111,23 +123,29 @@ 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) anID = GeomAlgoAPI.GeomAlgoAPI_CompoundBuilder.id(self.shape, aSelection.value()) - Ids.append(anID) - if aSelection.value().isVertex(): - groupType = "VERTEX" - elif aSelection.value().isEdge(): - groupType = "EDGE" - elif aSelection.value().isFace(): - groupType = "FACE" + 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" + Ids.append(anID) + groupType = self.shapeType(aSelection.value()) + 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() @@ -137,7 +155,7 @@ class ExportFeature(ModelAPI.ModelAPI_Feature): self.geomObjects = [] ## geomBuilder tool self.geompy = geomBuilder.New(salome.myStudy) - + # Export bodies and groups self.exportBodies() self.exportGroups() diff --git a/src/GeomAPI/GeomAPI_ShapeExplorer.cpp b/src/GeomAPI/GeomAPI_ShapeExplorer.cpp index 6b94439c0..bf6ca1727 100644 --- a/src/GeomAPI/GeomAPI_ShapeExplorer.cpp +++ b/src/GeomAPI/GeomAPI_ShapeExplorer.cpp @@ -17,12 +17,29 @@ GeomAPI_ShapeExplorer::GeomAPI_ShapeExplorer() { } +// returns a type of shape to expolode, but if toFind==SHAPE, it will return the type +// of the first sub-element of compoud if theSHape is compound +static TopAbs_ShapeEnum ShapeType(const std::shared_ptr& theShape, + const GeomAPI_Shape::ShapeType toFind) +{ + if (toFind == GeomAPI_Shape::SHAPE) { + TopoDS_Shape aShape = theShape->impl(); + if (!aShape.IsNull() && aShape.ShapeType() == TopAbs_COMPOUND) { + TopoDS_Iterator anIter(aShape); + if (anIter.More()) { + return anIter.Value().ShapeType(); + } + } + } + return (TopAbs_ShapeEnum)toFind; +} + //================================================================================================= GeomAPI_ShapeExplorer::GeomAPI_ShapeExplorer(const std::shared_ptr& theShape, const GeomAPI_Shape::ShapeType toFind, const GeomAPI_Shape::ShapeType toAvoid) : GeomAPI_Interface(new TopExp_Explorer(theShape->impl(), - (TopAbs_ShapeEnum)toFind, + ShapeType(theShape, toFind), (TopAbs_ShapeEnum)toAvoid)) { } @@ -33,7 +50,7 @@ void GeomAPI_ShapeExplorer::init(const std::shared_ptr& theShape, const GeomAPI_Shape::ShapeType toAvoid) { MY_EXPLORER->Init(theShape->impl(), - (TopAbs_ShapeEnum)toFind, + ShapeType(theShape, toFind), (TopAbs_ShapeEnum)toAvoid); } -- 2.39.2