else:
allRefGroups.append(ModelAPI.referencedFeatures(theRes, "Group", True))
allRefGroups.append(ModelAPI.referencedFeatures(theRes, "Shared_faces", True))
+ aResShape = theRes.shape()
+ aMapOfShape = GeomAPI_IndexedMapOfShape(aResShape)
for aRefGroups in allRefGroups:
for aRef in aRefGroups:
aGroupIndices = []
aGroupHasIndex = {}
- aResShape = theRes.shape()
if theFields:
aSelList = aRef.selectionList("selected")
else:
aShape = aGroupRes.shape()
anExplorer = GeomAPI_ShapeExplorer(aShape, aSelType)
while anExplorer.more():
- anId = GeomAlgoAPI.GeomAlgoAPI_CompoundBuilder.id(aResShape, anExplorer.current())
+ anId = aMapOfShape.FindIndexEqualLocations(anExplorer.current())
if anId > 0 and not anId in aGroupHasIndex:
aGroupIndices.append(anId)
aGroupHasIndex[anId] = 0
#include <GeomAlgoAPI_Tools.h>
#include <GeomAlgoAPI_XAOExport.h>
+#include <GeomAPI_IndexedMapOfShape.h>
#include <GeomAPI_Shape.h>
#include <GeomAPI_ShapeExplorer.h>
#include <GeomAPI_Trsf.h>
std::set<ResultPtr> allResultsCashed; // cash to speed up searching in all results selected
+ // [bos #38360] [CEA] improve performances of exportXAO and PublishToStudy
+ GeomAPI_IndexedMapOfShape aSubShapesMap;
+ bool isSubShapesMap = false; // we will init it only if required (for performance reason)
+
// iterate all documents used
if (aDocuments.empty())
aDocuments.push_back(document());
GeomShapePtr aGroupShape = aGroupResExplorer.current();
if (aDocTrsf.find(*aDoc) != aDocTrsf.end())
aGroupShape->move(aDocTrsf[*aDoc]);
- int aReferenceID = GeomAlgoAPI_CompoundBuilder::id(aShape, aGroupShape);
+
+ if (!isSubShapesMap) {
+ aSubShapesMap.MapShapes(aShape);
+ isSubShapesMap = true;
+ }
+ int aReferenceID = aSubShapesMap.FindIndexEqualLocations(aGroupShape);
if (aReferenceID == 0) // selected value does not found in the exported shape
continue;
std::string aReferenceString = XAO::XaoUtils::intToString(aReferenceID);
if (!isWholePart) {
// element index actually is the ID of the selection
AttributeSelectionPtr aSel = aSelectionList->value(aRow - 1);
- int aReferenceID = GeomAlgoAPI_CompoundBuilder::id(aShape, aSel->value());
+ if (!isSubShapesMap) {
+ aSubShapesMap.MapShapes(aShape);
+ isSubShapesMap = true;
+ }
+ int aReferenceID = aSubShapesMap.FindIndexEqualLocations(aSel->value());
if (aReferenceID == 0) // selected value does not found in the exported shape
continue;
GeomAPI_Curve.h
GeomAPI_DataMapOfShapeMapOfShapes.h
GeomAPI_DataMapOfShapeShape.h
+ GeomAPI_IndexedMapOfShape.h
GeomAPI_ICustomPrs.h
GeomAPI_Vertex.h
GeomAPI_Ax1.h
GeomAPI_Curve.cpp
GeomAPI_DataMapOfShapeMapOfShapes.cpp
GeomAPI_DataMapOfShapeShape.cpp
+ GeomAPI_IndexedMapOfShape.cpp
GeomAPI_Vertex.cpp
GeomAPI_ICustomPrs.cpp
GeomAPI_Ax1.cpp
%shared_ptr(GeomAPI_Cylinder)
%shared_ptr(GeomAPI_DataMapOfShapeMapOfShapes)
%shared_ptr(GeomAPI_DataMapOfShapeShape)
+%shared_ptr(GeomAPI_IndexedMapOfShape)
%shared_ptr(GeomAPI_Dir)
%shared_ptr(GeomAPI_Dir2d)
%shared_ptr(GeomAPI_Edge)
%include "GeomAPI_Cylinder.h"
%include "GeomAPI_DataMapOfShapeMapOfShapes.h"
%include "GeomAPI_DataMapOfShapeShape.h"
+%include "GeomAPI_IndexedMapOfShape.h"
%include "GeomAPI_Dir.h"
%include "GeomAPI_Dir2d.h"
%include "GeomAPI_Edge.h"
--- /dev/null
+// Copyright (C) 2014-2024 CEA, EDF
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#include <GeomAPI_IndexedMapOfShape.h>
+
+#include <gp_Trsf.hxx>
+#include <TopExp.hxx>
+#include <TopExp_Explorer.hxx>
+#include <TopLoc_Location.hxx>
+#include <TopoDS_Shape.hxx>
+#include <TopTools_IndexedMapOfShape.hxx>
+
+GeomAPI_IndexedMapOfShape::GeomAPI_IndexedMapOfShape(const std::shared_ptr<GeomAPI_Shape> theMainShape)
+{
+ MapShapes(theMainShape);
+}
+
+void GeomAPI_IndexedMapOfShape::MapShapes(const std::shared_ptr<GeomAPI_Shape> theMainShape)
+{
+ if (!empty()) {
+ implPtr<TopTools_IndexedMapOfShape>()->Clear();
+ }
+
+ TopoDS_Shape aMainShape = theMainShape->impl<TopoDS_Shape>();
+ if (!aMainShape.IsNull()) {
+ TopTools_IndexedMapOfShape aSubShapesMap;
+ TopExp::MapShapes(aMainShape, aSubShapesMap);
+
+ setImpl(new TopTools_IndexedMapOfShape(aSubShapesMap));
+ }
+}
+
+int GeomAPI_IndexedMapOfShape::FindIndex(std::shared_ptr<GeomAPI_Shape> theKey)
+{
+ return impl<TopTools_IndexedMapOfShape>().FindIndex(theKey->impl<TopoDS_Shape>());
+}
+
+// Returns true if transformations are equal with the given precision
+static bool isEqual(const gp_Trsf& theT1, const gp_Trsf& theT2, const double thePrecision)
+{
+ for(int aRow = 1; aRow < 4; aRow++) {
+ for(int aCol = 1; aCol < 5; aCol++) {
+ double aDiff = theT1.Value(aRow, aCol) - theT2.Value(aRow, aCol);
+ if (aDiff < 0) aDiff = -aDiff;
+ if (aDiff > thePrecision)
+ return false;
+ }
+ }
+ return true;
+}
+
+int GeomAPI_IndexedMapOfShape::FindIndexEqualLocations(std::shared_ptr<GeomAPI_Shape> theKey)
+{
+ int anID = impl<TopTools_IndexedMapOfShape>().FindIndex(theKey->impl<TopoDS_Shape>());
+ if (anID == 0) {
+ // Try to search shape with the same location if TopLoc_Location is different.
+ // It's a special fix for the problem related to the Placement of parts
+ // feature - it adds additional transformation to all results and groups.
+ const TopoDS_Shape& aMainShape = impl<TopTools_IndexedMapOfShape>().FindKey(1);
+ const TopoDS_Shape& aSubShape = theKey->impl<TopoDS_Shape>();
+ TopExp_Explorer anExp (aMainShape, aSubShape.ShapeType());
+ for (; anExp.More(); anExp.Next()) {
+ if (anExp.Current().TShape() == aSubShape.TShape()) {
+ const TopLoc_Location aLoc1 = anExp.Current().Location();
+ if (isEqual(aLoc1.Transformation(), aSubShape.Location().Transformation(), 1.e-7)) {
+ anID = impl<TopTools_IndexedMapOfShape>().FindIndex(anExp.Current());
+ break;
+ }
+ }
+ }
+ }
+ return anID;
+}
+
+GeomAPI_IndexedMapOfShape::~GeomAPI_IndexedMapOfShape()
+{
+ if (!empty()) {
+ implPtr<TopTools_IndexedMapOfShape>()->Clear();
+ }
+}
--- /dev/null
+// Copyright (C) 2014-2024 CEA, EDF
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#ifndef GeomAPI_IndexedMapOfShape_H_
+#define GeomAPI_IndexedMapOfShape_H_
+
+#include <GeomAPI_Interface.h>
+#include <GeomAPI_Shape.h>
+
+/**\class GeomAPI_IndexedMapOfShape
+ * \ingroup DataModel
+ * \brief IndexedMap of Shape defined by TopoDS_Shape
+ */
+class GeomAPI_IndexedMapOfShape : public GeomAPI_Interface
+{
+ public:
+ /// Constructor.
+ GEOMAPI_EXPORT
+ GeomAPI_IndexedMapOfShape() {};
+
+ /// Constructor.
+ GEOMAPI_EXPORT
+ GeomAPI_IndexedMapOfShape(const std::shared_ptr<GeomAPI_Shape> theMainShape);
+
+ /// Initialize the Map.
+ GEOMAPI_EXPORT
+ void MapShapes(const std::shared_ptr<GeomAPI_Shape> theMainShape);
+
+ /// \return index of the Key in the Map.
+ GEOMAPI_EXPORT
+ int FindIndex(const std::shared_ptr<GeomAPI_Shape> theKey);
+
+ /// \return index of the Key in the Map.
+ /// It works also for the case of equal locations
+ GEOMAPI_EXPORT
+ int FindIndexEqualLocations(const std::shared_ptr<GeomAPI_Shape> theKey);
+
+ /// Destructor
+ GEOMAPI_EXPORT
+ ~GeomAPI_IndexedMapOfShape();
+};
+
+#endif
+
#include "GeomAPI_Cylinder.h"
#include "GeomAPI_DataMapOfShapeMapOfShapes.h"
#include "GeomAPI_DataMapOfShapeShape.h"
+ #include "GeomAPI_IndexedMapOfShape.h"
#include "GeomAPI_Dir.h"
#include "GeomAPI_Dir2d.h"
#include "GeomAPI_Edge.h"
aRes->setImpl(new TopoDS_Shape(aComp));
return aRes;
}
-
-// Returns true if transformations are equal with the given precision
-static bool isEqual(const gp_Trsf& theT1, const gp_Trsf& theT2, const double thePrecision)
-{
- for(int aRow = 1; aRow < 4; aRow++) {
- for(int aCol = 1; aCol < 5; aCol++) {
- double aDiff = theT1.Value(aRow, aCol) - theT2.Value(aRow, aCol);
- if (aDiff < 0) aDiff = -aDiff;
- if (aDiff > thePrecision)
- return false;
- }
- }
- return true;
-}
-
-int GeomAlgoAPI_CompoundBuilder::id(
- std::shared_ptr<GeomAPI_Shape> theContext, std::shared_ptr<GeomAPI_Shape> theSub)
-{
- int anID = 0;
- TopoDS_Shape aMainShape = theContext->impl<TopoDS_Shape>();
- const TopoDS_Shape& aSubShape = theSub->impl<TopoDS_Shape>();
- if (!aMainShape.IsNull() && !aSubShape.IsNull()) {
- TopTools_IndexedMapOfShape aSubShapesMap;
- TopExp::MapShapes(aMainShape, aSubShapesMap);
- anID = aSubShapesMap.FindIndex(aSubShape);
- if (anID == 0) { // try to search shape with the same location if TopLoc_Location is different
- TopExp_Explorer anExp(aMainShape, aSubShape.ShapeType());
- for(; anExp.More(); anExp.Next()) {
- if (anExp.Current().TShape() == aSubShape.TShape()) {
- const TopLoc_Location aLoc1 = anExp.Current().Location();
- if (isEqual(aLoc1.Transformation(), aSubShape.Location().Transformation(), 1.e-7)) {
- anID = aSubShapesMap.FindIndex(anExp.Current());
- break;
- }
- }
- }
- }
- }
-
- return anID;
-}
/// \param theShapes a list of shapes
static std::shared_ptr<GeomAPI_Shape> compound(
std::list<std::shared_ptr<GeomAPI_Shape> > 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<GeomAPI_Shape> theContext, std::shared_ptr<GeomAPI_Shape> theSub);
};
#endif
#include <Events_InfoMessage.h>
#include <GeomAPI_Shape.h>
-#include <GeomAlgoAPI_CompoundBuilder.h>
+#include <GeomAPI_IndexedMapOfShape.h>
#include <TopoDS_Shape.hxx>
aTypeName = "shape";
break;
}
- int aId = GeomAlgoAPI_CompoundBuilder::id(aContext, aSubShape);
+ GeomAPI_IndexedMapOfShape aSubShapesMap (aContext);
+ int aId = aSubShapesMap.FindIndexEqualLocations(aSubShape);
aName += QString("/%1_%2").arg(aTypeName).arg(aId);
}
}