From 592f9b635dddfc888cc2e14d8e996e0e21d904b3 Mon Sep 17 00:00:00 2001 From: mpv Date: Thu, 17 Dec 2015 12:30:17 +0300 Subject: [PATCH] Fix for the issue #1045 --- .../ConnectorPlugin_ExportFeature.py | 54 ++++++++++--------- .../GeomAlgoAPI_CompoundBuilder.cpp | 20 +++++-- src/GeomAlgoAPI/GeomAlgoAPI_CompoundBuilder.h | 6 +++ 3 files changed, 52 insertions(+), 28 deletions(-) diff --git a/src/ConnectorPlugin/ConnectorPlugin_ExportFeature.py b/src/ConnectorPlugin/ConnectorPlugin_ExportFeature.py index 30844b674..ee7dafeb7 100644 --- a/src/ConnectorPlugin/ConnectorPlugin_ExportFeature.py +++ b/src/ConnectorPlugin/ConnectorPlugin_ExportFeature.py @@ -4,6 +4,7 @@ import EventsAPI import ModelAPI +import GeomAlgoAPI import salome from salome.geom import geomBuilder @@ -39,10 +40,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 @@ -57,24 +54,38 @@ class ExportFeature(ModelAPI.ModelAPI_Feature): return 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() + 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) + # Make unique name + aId = getObjectIndex(aName) + if aId != 0: + aName = aName + '_' + str(aId) - self.geompy.addToStudy(aBrep, aName) - self.geomObjects.append([aShape, aBrep]) + self.geompy.addToStudy(aBrep, aName) + self.brep = aBrep ## Exports all groups def exportGroups(self): @@ -102,8 +113,7 @@ class ExportFeature(ModelAPI.ModelAPI_Feature): Ids = [] for aSelIndex in range(0, aSelectionNum): aSelection = theSelectionList.value(aSelIndex) - aSelectionContext = aSelection.context() - anID = aSelection.Id() + anID = GeomAlgoAPI.GeomAlgoAPI_CompoundBuilder.id(self.shape, aSelection.value()) Ids.append(anID) if aSelection.value().isVertex(): groupType = "VERTEX" @@ -114,15 +124,9 @@ class ExportFeature(ModelAPI.ModelAPI_Feature): else: groupType = "SOLID" - aContextBody = ModelAPI.modelAPI_ResultBody(aSelectionContext) - if aContextBody is not None: - # iterate on exported objects and check if the current - # group refers to this object - for obj in self.geomObjects: - if aContextBody.isLatestEqual(obj[0]): - aGroup = self.geompy.CreateGroup(obj[1], self.geompy.ShapeType[groupType]) - self.geompy.UnionIDs(aGroup,Ids) - self.geompy.addToStudyInFather(obj[1], aGroup, theGroupName) + 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): diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_CompoundBuilder.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_CompoundBuilder.cpp index a988d3bb2..48d430fad 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_CompoundBuilder.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_CompoundBuilder.cpp @@ -5,11 +5,10 @@ // Author: Natalia ERMOLAEVA #include -//#include -//#include -//#include #include #include +#include +#include std::shared_ptr GeomAlgoAPI_CompoundBuilder::compound( std::list > theShapes) @@ -28,3 +27,18 @@ std::shared_ptr GeomAlgoAPI_CompoundBuilder::compound( aRes->setImpl(new TopoDS_Shape(aComp)); return aRes; } + +int GeomAlgoAPI_CompoundBuilder::id( + std::shared_ptr theContext, std::shared_ptr theSub) +{ + int anID = 0; + TopoDS_Shape aMainShape = theContext->impl(); + const TopoDS_Shape& aSubShape = theSub->impl(); + if (!aMainShape.IsNull() && !aSubShape.IsNull()) { + TopTools_IndexedMapOfShape aSubShapesMap; + TopExp::MapShapes(aMainShape, aSubShapesMap); + anID = aSubShapesMap.FindIndex(aSubShape); + } + + return anID; +} diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_CompoundBuilder.h b/src/GeomAlgoAPI/GeomAlgoAPI_CompoundBuilder.h index 5e863f34c..36caf8779 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_CompoundBuilder.h +++ b/src/GeomAlgoAPI/GeomAlgoAPI_CompoundBuilder.h @@ -27,6 +27,12 @@ class GEOMALGOAPI_EXPORT GeomAlgoAPI_CompoundBuilder /// \param theShapes a list of shapes static std::shared_ptr compound( std::list > theShapes); + + /// Produces the integerr identifier of the shape theSub in theContext (needed for + /// groups export to old GEOM) + /// \returns zero if theSub not found in theContext + static int id( + std::shared_ptr theContext, std::shared_ptr theSub); }; #endif -- 2.39.2