1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-04 18:06:22 +03:00

0030738: Data Exchange - XCAFDoc_ShapeTool::updateComponent() is too long

Cache subshapes list into map instead of re-iterating it multiple times within the loop.
Avoid iteration at all if modified state has been already detected.

XCAFDoc now returns GUIDs by const reference instead of a copy.
This commit is contained in:
kgv 2019-05-23 22:46:58 +03:00 committed by bugmaster
parent 9369e98a62
commit f6973d9054
3 changed files with 89 additions and 122 deletions

View File

@ -25,9 +25,9 @@
//purpose : //purpose :
//======================================================================= //=======================================================================
Standard_GUID XCAFDoc::ShapeRefGUID () const Standard_GUID& XCAFDoc::ShapeRefGUID ()
{ {
static Standard_GUID ID ("5b896afe-3adf-11d4-b9b7-0060b0ee281b"); static const Standard_GUID ID ("5b896afe-3adf-11d4-b9b7-0060b0ee281b");
return ID; return ID;
} }
@ -37,9 +37,9 @@ Standard_GUID XCAFDoc::ShapeRefGUID ()
//purpose : //purpose :
//======================================================================= //=======================================================================
Standard_GUID XCAFDoc::AssemblyGUID () const Standard_GUID& XCAFDoc::AssemblyGUID ()
{ {
static Standard_GUID ID ("5b896b00-3adf-11d4-b9b7-0060b0ee281b"); static const Standard_GUID ID ("5b896b00-3adf-11d4-b9b7-0060b0ee281b");
return ID; return ID;
} }
@ -49,9 +49,9 @@ Standard_GUID XCAFDoc::AssemblyGUID ()
//purpose : //purpose :
//======================================================================= //=======================================================================
Standard_GUID XCAFDoc::ExternRefGUID () const Standard_GUID& XCAFDoc::ExternRefGUID ()
{ {
static Standard_GUID ID ("6b896b01-3adf-11d4-b9b7-0060b0ee281b"); static const Standard_GUID ID ("6b896b01-3adf-11d4-b9b7-0060b0ee281b");
return ID; return ID;
} }
@ -61,11 +61,11 @@ Standard_GUID XCAFDoc::ExternRefGUID ()
//purpose : //purpose :
//======================================================================= //=======================================================================
Standard_GUID XCAFDoc::ColorRefGUID (const XCAFDoc_ColorType type) const Standard_GUID& XCAFDoc::ColorRefGUID (const XCAFDoc_ColorType type)
{ {
static Standard_GUID IDcol ("efd212e4-6dfd-11d4-b9c8-0060b0ee281b"); static const Standard_GUID IDcol ("efd212e4-6dfd-11d4-b9c8-0060b0ee281b");
static Standard_GUID IDcolSurf ("efd212e5-6dfd-11d4-b9c8-0060b0ee281b"); static const Standard_GUID IDcolSurf ("efd212e5-6dfd-11d4-b9c8-0060b0ee281b");
static Standard_GUID IDcolCurv ("efd212e6-6dfd-11d4-b9c8-0060b0ee281b"); static const Standard_GUID IDcolCurv ("efd212e6-6dfd-11d4-b9c8-0060b0ee281b");
switch ( type ) { switch ( type ) {
default: default:
@ -81,10 +81,10 @@ Standard_GUID XCAFDoc::ColorRefGUID (const XCAFDoc_ColorType type)
//purpose : //purpose :
//======================================================================= //=======================================================================
Standard_GUID XCAFDoc::DimTolRefGUID() const Standard_GUID& XCAFDoc::DimTolRefGUID()
{ {
//static Standard_GUID IDDimTol("58ed092d-44de-11d8-8776-001083004c77"); //static const Standard_GUID IDDimTol("58ed092d-44de-11d8-8776-001083004c77");
static Standard_GUID ID("efd212e9-6dfd-11d4-b9c8-0060b0ee281b"); static const Standard_GUID ID("efd212e9-6dfd-11d4-b9c8-0060b0ee281b");
//return IDDimTol; //return IDDimTol;
return ID; return ID;
} }
@ -94,9 +94,9 @@ Standard_GUID XCAFDoc::DimTolRefGUID()
//purpose : //purpose :
//======================================================================= //=======================================================================
Standard_GUID XCAFDoc::DimensionRefFirstGUID() const Standard_GUID& XCAFDoc::DimensionRefFirstGUID()
{ {
static Standard_GUID ID("efd212e3-6dfd-11d4-b9c8-0060b0ee281b"); static const Standard_GUID ID("efd212e3-6dfd-11d4-b9c8-0060b0ee281b");
return ID; return ID;
} }
@ -105,9 +105,9 @@ Standard_GUID XCAFDoc::DimensionRefFirstGUID()
//purpose : //purpose :
//======================================================================= //=======================================================================
Standard_GUID XCAFDoc::DimensionRefSecondGUID() const Standard_GUID& XCAFDoc::DimensionRefSecondGUID()
{ {
static Standard_GUID ID("efd212e0-6dfd-11d4-b9c8-0060b0ee281b"); static const Standard_GUID ID("efd212e0-6dfd-11d4-b9c8-0060b0ee281b");
return ID; return ID;
} }
@ -116,9 +116,9 @@ Standard_GUID XCAFDoc::DimensionRefSecondGUID()
//purpose : //purpose :
//======================================================================= //=======================================================================
Standard_GUID XCAFDoc::GeomToleranceRefGUID() const Standard_GUID& XCAFDoc::GeomToleranceRefGUID()
{ {
static Standard_GUID ID("efd213e3-6dfd-11d4-b9c8-0060b0ee281b"); static const Standard_GUID ID("efd213e3-6dfd-11d4-b9c8-0060b0ee281b");
return ID; return ID;
} }
@ -127,9 +127,9 @@ Standard_GUID XCAFDoc::GeomToleranceRefGUID()
//purpose : //purpose :
//======================================================================= //=======================================================================
Standard_GUID XCAFDoc::DatumRefGUID() const Standard_GUID& XCAFDoc::DatumRefGUID()
{ {
static Standard_GUID ID("efd212e2-6dfd-11d4-b9c8-0060b0ee281b"); static const Standard_GUID ID("efd212e2-6dfd-11d4-b9c8-0060b0ee281b");
return ID; return ID;
} }
@ -139,10 +139,10 @@ Standard_GUID XCAFDoc::DatumRefGUID()
//purpose : //purpose :
//======================================================================= //=======================================================================
Standard_GUID XCAFDoc::DatumTolRefGUID() const Standard_GUID& XCAFDoc::DatumTolRefGUID()
{ {
//static Standard_GUID IDDimTol("58ed092d-44de-11d8-8776-001083004c77"); //static const Standard_GUID IDDimTol("58ed092d-44de-11d8-8776-001083004c77");
static Standard_GUID ID("efd212e7-6dfd-11d4-b9c8-0060b0ee281b"); static const Standard_GUID ID("efd212e7-6dfd-11d4-b9c8-0060b0ee281b");
//return IDDimTol; //return IDDimTol;
return ID; return ID;
} }
@ -153,9 +153,9 @@ Standard_GUID XCAFDoc::DatumTolRefGUID()
//purpose : //purpose :
//======================================================================= //=======================================================================
Standard_GUID XCAFDoc::LayerRefGUID () const Standard_GUID& XCAFDoc::LayerRefGUID ()
{ {
static Standard_GUID ID ("efd212e8-6dfd-11d4-b9c8-0060b0ee281b"); static const Standard_GUID ID ("efd212e8-6dfd-11d4-b9c8-0060b0ee281b");
return ID; return ID;
} }
@ -165,9 +165,9 @@ Standard_GUID XCAFDoc::LayerRefGUID ()
//purpose : //purpose :
//======================================================================= //=======================================================================
Standard_GUID XCAFDoc::MaterialRefGUID () const Standard_GUID& XCAFDoc::MaterialRefGUID ()
{ {
static Standard_GUID ID ("efd212f7-6dfd-11d4-b9c8-0060b0ee281b"); static const Standard_GUID ID ("efd212f7-6dfd-11d4-b9c8-0060b0ee281b");
return ID; return ID;
} }
@ -177,9 +177,9 @@ Standard_GUID XCAFDoc::MaterialRefGUID ()
//purpose : //purpose :
//======================================================================= //=======================================================================
Standard_GUID XCAFDoc::NoteRefGUID() const Standard_GUID& XCAFDoc::NoteRefGUID()
{ {
static Standard_GUID ID ("F3599E50-F84A-493e-8D1B-1284E79322F1"); static const Standard_GUID ID ("F3599E50-F84A-493e-8D1B-1284E79322F1");
return ID; return ID;
} }
@ -188,9 +188,9 @@ Standard_GUID XCAFDoc::NoteRefGUID()
//purpose : //purpose :
//======================================================================= //=======================================================================
Standard_GUID XCAFDoc::InvisibleGUID () const Standard_GUID& XCAFDoc::InvisibleGUID ()
{ {
static Standard_GUID ID ("5b896aff-3adf-11d4-b9b7-0060b0ee281b"); static const Standard_GUID ID ("5b896aff-3adf-11d4-b9b7-0060b0ee281b");
return ID; return ID;
} }
@ -200,9 +200,9 @@ Standard_GUID XCAFDoc::InvisibleGUID ()
//purpose : //purpose :
//======================================================================= //=======================================================================
Standard_GUID XCAFDoc::ColorByLayerGUID () const Standard_GUID& XCAFDoc::ColorByLayerGUID ()
{ {
static Standard_GUID ID ("279e8c1e-70af-4130-b626-9cc52a537db8"); static const Standard_GUID ID ("279e8c1e-70af-4130-b626-9cc52a537db8");
return ID; return ID;
} }
@ -212,9 +212,9 @@ Standard_GUID XCAFDoc::ColorByLayerGUID ()
//purpose : //purpose :
//======================================================================= //=======================================================================
Standard_GUID XCAFDoc::SHUORefGUID () const Standard_GUID& XCAFDoc::SHUORefGUID ()
{ {
static Standard_GUID ID ("efd212ea-6dfd-11d4-b9c8-0060b0ee281b"); static const Standard_GUID ID ("efd212ea-6dfd-11d4-b9c8-0060b0ee281b");
return ID; return ID;
} }
@ -223,9 +223,9 @@ Standard_GUID XCAFDoc::SHUORefGUID ()
//purpose : //purpose :
//======================================================================= //=======================================================================
Standard_GUID XCAFDoc::ViewRefGUID() const Standard_GUID& XCAFDoc::ViewRefGUID()
{ {
static Standard_GUID ID("efd213e5-6dfd-11d4-b9c8-0060b0ee281b"); static const Standard_GUID ID("efd213e5-6dfd-11d4-b9c8-0060b0ee281b");
return ID; return ID;
} }
@ -234,9 +234,9 @@ Standard_GUID XCAFDoc::ViewRefGUID()
//purpose : //purpose :
//======================================================================= //=======================================================================
Standard_GUID XCAFDoc::ViewRefShapeGUID() const Standard_GUID& XCAFDoc::ViewRefShapeGUID()
{ {
static Standard_GUID ID("efd213e6-6dfd-11d4-b9c8-0060b0ee281b"); static const Standard_GUID ID("efd213e6-6dfd-11d4-b9c8-0060b0ee281b");
return ID; return ID;
} }
@ -245,9 +245,9 @@ Standard_GUID XCAFDoc::ViewRefShapeGUID()
//purpose : //purpose :
//======================================================================= //=======================================================================
Standard_GUID XCAFDoc::ViewRefGDTGUID() const Standard_GUID& XCAFDoc::ViewRefGDTGUID()
{ {
static Standard_GUID ID("efd213e7-6dfd-11d4-b9c8-0060b0ee281b"); static const Standard_GUID ID("efd213e7-6dfd-11d4-b9c8-0060b0ee281b");
return ID; return ID;
} }
@ -256,9 +256,9 @@ Standard_GUID XCAFDoc::ViewRefGDTGUID()
//purpose : //purpose :
//======================================================================= //=======================================================================
Standard_GUID XCAFDoc::ViewRefPlaneGUID() const Standard_GUID& XCAFDoc::ViewRefPlaneGUID()
{ {
static Standard_GUID ID("efd213e9-6dfd-11d4-b9c8-0060b0ee281b"); static const Standard_GUID ID("efd213e9-6dfd-11d4-b9c8-0060b0ee281b");
return ID; return ID;
} }
@ -267,9 +267,9 @@ Standard_GUID XCAFDoc::ViewRefPlaneGUID()
//purpose : //purpose :
//======================================================================= //=======================================================================
Standard_GUID XCAFDoc::ViewRefNoteGUID() const Standard_GUID& XCAFDoc::ViewRefNoteGUID()
{ {
static Standard_GUID ID("C814ACC6-43AC-4812-9B2A-4E9A2A549354"); static const Standard_GUID ID("C814ACC6-43AC-4812-9B2A-4E9A2A549354");
return ID; return ID;
} }
@ -278,9 +278,9 @@ Standard_GUID XCAFDoc::ViewRefNoteGUID()
//purpose : //purpose :
//======================================================================= //=======================================================================
Standard_GUID XCAFDoc::ViewRefAnnotationGUID() const Standard_GUID& XCAFDoc::ViewRefAnnotationGUID()
{ {
static Standard_GUID ID("A2B5BA42-DD00-43f5-8882-4B5F8E76B9D2"); static const Standard_GUID ID("A2B5BA42-DD00-43f5-8882-4B5F8E76B9D2");
return ID; return ID;
} }
@ -289,8 +289,8 @@ Standard_GUID XCAFDoc::ViewRefAnnotationGUID()
//purpose : //purpose :
//======================================================================= //=======================================================================
Standard_GUID XCAFDoc::LockGUID() const Standard_GUID& XCAFDoc::LockGUID()
{ {
static Standard_GUID ID("efd213eb-6dfd-11d4-b9c8-0060b0ee281b"); static const Standard_GUID ID("efd213eb-6dfd-11d4-b9c8-0060b0ee281b");
return ID; return ID;
} }

View File

@ -68,105 +68,68 @@ public:
//! class for containing GraphNodes. //! class for containing GraphNodes.
//! Returns GUID for UAttribute identifying assembly //! Returns GUID for UAttribute identifying assembly
Standard_EXPORT static Standard_GUID AssemblyGUID(); Standard_EXPORT static const Standard_GUID& AssemblyGUID();
//! Returns GUID for TreeNode representing assembly link //! Returns GUID for TreeNode representing assembly link
Standard_EXPORT static Standard_GUID ShapeRefGUID(); Standard_EXPORT static const Standard_GUID& ShapeRefGUID();
//! Return GUIDs for TreeNode representing specified types of colors //! Return GUIDs for TreeNode representing specified types of colors
Standard_EXPORT static Standard_GUID ColorRefGUID (const XCAFDoc_ColorType type); Standard_EXPORT static const Standard_GUID& ColorRefGUID (const XCAFDoc_ColorType type);
//! Return GUIDs for TreeNode representing specified types of DGT //! Return GUIDs for TreeNode representing specified types of DGT
Standard_EXPORT static Standard_GUID DimTolRefGUID(); Standard_EXPORT static const Standard_GUID& DimTolRefGUID();
//! Return GUIDs for TreeNode representing specified types of Dimension //! Return GUIDs for TreeNode representing specified types of Dimension
Standard_EXPORT static Standard_GUID DimensionRefFirstGUID() ; Standard_EXPORT static const Standard_GUID& DimensionRefFirstGUID() ;
//! Return GUIDs for TreeNode representing specified types of Dimension //! Return GUIDs for TreeNode representing specified types of Dimension
Standard_EXPORT static Standard_GUID DimensionRefSecondGUID() ; Standard_EXPORT static const Standard_GUID& DimensionRefSecondGUID() ;
//! Return GUIDs for TreeNode representing specified types of GeomTolerance //! Return GUIDs for TreeNode representing specified types of GeomTolerance
Standard_EXPORT static Standard_GUID GeomToleranceRefGUID() ; Standard_EXPORT static const Standard_GUID& GeomToleranceRefGUID() ;
//! Return GUIDs for TreeNode representing specified types of datum //! Return GUIDs for TreeNode representing specified types of datum
Standard_EXPORT static Standard_GUID DatumRefGUID(); Standard_EXPORT static const Standard_GUID& DatumRefGUID();
//! Return GUIDs for TreeNode representing connections Datum-Toler //! Return GUIDs for TreeNode representing connections Datum-Toler
Standard_EXPORT static Standard_GUID DatumTolRefGUID(); Standard_EXPORT static const Standard_GUID& DatumTolRefGUID();
Standard_EXPORT static Standard_GUID LayerRefGUID(); Standard_EXPORT static const Standard_GUID& LayerRefGUID();
Standard_EXPORT static Standard_GUID MaterialRefGUID(); Standard_EXPORT static const Standard_GUID& MaterialRefGUID();
//! Return GUIDs for representing notes //! Return GUIDs for representing notes
Standard_EXPORT static Standard_GUID NoteRefGUID(); Standard_EXPORT static const Standard_GUID& NoteRefGUID();
Standard_EXPORT static Standard_GUID InvisibleGUID(); Standard_EXPORT static const Standard_GUID& InvisibleGUID();
Standard_EXPORT static Standard_GUID ColorByLayerGUID(); Standard_EXPORT static const Standard_GUID& ColorByLayerGUID();
//! Returns GUID for UAttribute identifying external reference on no-step file //! Returns GUID for UAttribute identifying external reference on no-step file
Standard_EXPORT static Standard_GUID ExternRefGUID(); Standard_EXPORT static const Standard_GUID& ExternRefGUID();
//! Returns GUID for UAttribute identifying specified higher usage occurrence //! Returns GUID for UAttribute identifying specified higher usage occurrence
Standard_EXPORT static Standard_GUID SHUORefGUID(); Standard_EXPORT static const Standard_GUID& SHUORefGUID();
//! Return GUIDs for TreeNode representing specified types of View //! Return GUIDs for TreeNode representing specified types of View
Standard_EXPORT static Standard_GUID ViewRefGUID(); Standard_EXPORT static const Standard_GUID& ViewRefGUID();
//! Return GUIDs for TreeNode representing specified types of View //! Return GUIDs for TreeNode representing specified types of View
Standard_EXPORT static Standard_GUID ViewRefShapeGUID(); Standard_EXPORT static const Standard_GUID& ViewRefShapeGUID();
//! Return GUIDs for TreeNode representing specified types of View //! Return GUIDs for TreeNode representing specified types of View
Standard_EXPORT static Standard_GUID ViewRefGDTGUID(); Standard_EXPORT static const Standard_GUID& ViewRefGDTGUID();
//! Return GUIDs for TreeNode representing specified types of View //! Return GUIDs for TreeNode representing specified types of View
Standard_EXPORT static Standard_GUID ViewRefPlaneGUID(); Standard_EXPORT static const Standard_GUID& ViewRefPlaneGUID();
//! Return GUIDs for GraphNode representing specified types of View //! Return GUIDs for GraphNode representing specified types of View
Standard_EXPORT static Standard_GUID ViewRefNoteGUID(); Standard_EXPORT static const Standard_GUID& ViewRefNoteGUID();
Standard_EXPORT static Standard_GUID ViewRefAnnotationGUID(); Standard_EXPORT static const Standard_GUID& ViewRefAnnotationGUID();
//! Returns GUID for UAttribute identifying lock flag //! Returns GUID for UAttribute identifying lock flag
Standard_EXPORT static Standard_GUID LockGUID(); Standard_EXPORT static const Standard_GUID& LockGUID();
protected:
private:
friend class XCAFDoc_DocumentTool;
friend class XCAFDoc_Location;
friend class XCAFDoc_Color;
friend class XCAFDoc_DimTol;
friend class XCAFDoc_Datum;
friend class XCAFDoc_Material;
friend class XCAFDoc_Volume;
friend class XCAFDoc_Area;
friend class XCAFDoc_Centroid;
friend class XCAFDoc_ClippingPlaneTool;
friend class XCAFDoc_ShapeTool;
friend class XCAFDoc_ShapeMapTool;
friend class XCAFDoc_ColorTool;
friend class XCAFDoc_DimTolTool;
friend class XCAFDoc_LayerTool;
friend class XCAFDoc_MaterialTool;
friend class XCAFDoc_GraphNode;
friend class XCAFDoc_Editor;
friend class XCAFDoc_ViewTool;
}; };
#endif // _XCAFDoc_HeaderFile #endif // _XCAFDoc_HeaderFile

View File

@ -46,6 +46,7 @@
#include <TopoDS_Iterator.hxx> #include <TopoDS_Iterator.hxx>
#include <TopoDS_Shape.hxx> #include <TopoDS_Shape.hxx>
#include <TopTools_ListOfShape.hxx> #include <TopTools_ListOfShape.hxx>
#include <TopTools_MapOfOrientedShape.hxx>
#include <XCAFDoc.hxx> #include <XCAFDoc.hxx>
#include <XCAFDoc_GraphNode.hxx> #include <XCAFDoc_GraphNode.hxx>
#include <XCAFDoc_Location.hxx> #include <XCAFDoc_Location.hxx>
@ -1971,6 +1972,7 @@ Standard_Boolean XCAFDoc_ShapeTool::updateComponent(const TDF_Label& theItemLabe
// Get the currently stored compound for the assembly // Get the currently stored compound for the assembly
TopoDS_Shape aCurrentRootShape; TopoDS_Shape aCurrentRootShape;
GetShape(theItemLabel, aCurrentRootShape); GetShape(theItemLabel, aCurrentRootShape);
TopTools_MapOfOrientedShape aCurrentRootShapeMap (aCurrentRootShape.NbChildren());
// Get components of the assembly // Get components of the assembly
TDF_LabelSequence aComponentLabs; TDF_LabelSequence aComponentLabs;
@ -1982,7 +1984,7 @@ Standard_Boolean XCAFDoc_ShapeTool::updateComponent(const TDF_Label& theItemLabe
// Compare the number of components in XDE structure with the number of // Compare the number of components in XDE structure with the number of
// components in topological structure. A component may happen to be removed, // components in topological structure. A component may happen to be removed,
// so we have to update the assembly compound // so we have to update the assembly compound
Standard_Integer aNumTopoComponents = aCurrentRootShape.NbChildren(); const Standard_Integer aNumTopoComponents = aCurrentRootShape.NbChildren();
// //
if ( aNumTopoComponents != aComponentLabs.Length() ) if ( aNumTopoComponents != aComponentLabs.Length() )
isModified = Standard_True; isModified = Standard_True;
@ -2021,21 +2023,23 @@ Standard_Boolean XCAFDoc_ShapeTool::updateComponent(const TDF_Label& theItemLabe
else else
{ {
// Search for a part in the actual compound of the ultimate assembly. // Search for a part in the actual compound of the ultimate assembly.
// If the part is there, then the compound is up-to-date, so it does // If the part is there, then the compound is up-to-date, so it does not require rebuilding
// not require rebuilding if (!isModified)
Standard_Boolean isPartFound = Standard_False; {
if (aCurrentRootShapeMap.IsEmpty())
{
// optimize search for next labels in aComponentLabs
for (TopoDS_Iterator aTopoIt(aCurrentRootShape); aTopoIt.More(); aTopoIt.Next()) for (TopoDS_Iterator aTopoIt(aCurrentRootShape); aTopoIt.More(); aTopoIt.Next())
{ {
if ( aTopoIt.Value() == aComponentShape ) aCurrentRootShapeMap.Add (aTopoIt.Value());
}
}
if (!aCurrentRootShapeMap.Contains (aComponentShape))
{ {
isPartFound = Standard_True; // Part has been modified somewhere, so the compound has to be rebuilt
break; isModified = Standard_True;
} }
} }
if ( !isPartFound && !isModified )
isModified = Standard_True; // Part has been modified somewhere, so the compound
// has to be rebuilt
} }
// Fill the list of shapes composing a new compound for the assembly // Fill the list of shapes composing a new compound for the assembly