// Copyright (c) 2026 OPEN CASCADE SAS // // This file is part of Open CASCADE Technology software library. // // This library is free software; you can redistribute it and/or modify it under // the terms of the GNU Lesser General Public License version 2.1 as published // by the Free Software Foundation, with special exception defined in the file // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT // distribution for complete text of the license and disclaimer of any warranty. // // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. #ifndef _BRepGraphInc_Storage_HeaderFile #define _BRepGraphInc_Storage_HeaderFile #include "BRepGraph_ItemId.hxx" #include "BRepGraph_NodeId.hxx" #include "BRepGraph_RefUID.hxx" #include "BRepGraph_UID.hxx" #include "BRepGraphInc_BitFlags.hxx" #include "BRepGraphInc_Definition.hxx" #include "BRepGraphInc_Load.hxx" #include "BRepGraphInc_Reference.hxx" #include "BRepGraphInc_Relations.hxx" #include "BRepGraphInc_Representation.hxx" #include "NCollection_Array1.hxx" #include "NCollection_IncAllocator.hxx" #include "NCollection_DataMap.hxx" #include "NCollection_FlatDataMap.hxx" #include "NCollection_DynamicArray.hxx" #include "NCollection_LinearVector.hxx" #include "Standard_GUID.hxx" #include "Standard_Assert.hxx" #include "Standard_DefineAlloc.hxx" #include "TopoDS_Shape.hxx" #include "TopoDS_TShape.hxx" #include "TopTools_ShapeMapHasher.hxx" #include #include #include //! @brief Central backend storage container for the incidence-table topology model. //! //! Holds all entity vectors (Vertex through Occurrence), representation //! vectors (Surface, Curve3D, Curve2D, Triangulation, Polygon), relation //! tables for connectivity navigation, TShape deduplication maps, original //! shape bindings, and per-kind UID vectors. Provides typed accessors //! enforcing compile-time safety for backend code. External callers should //! normally use the BRepGraph facade rather than reaching into this storage //! directly. BRepGraphInc_Populate has friend access for efficient bulk writes //! during graph population. class BRepGraphInc_Storage { public: DEFINE_STANDARD_ALLOC //! Gen-validated shape cache entry. struct CachedShape { //! Reconstructed shape cached for a node id. TopoDS_Shape Shape; //! Subtree generation captured when the cached shape was built. uint32_t StoredSubtreeGen = 0; }; //! Construct an empty storage with no entities or representations. Standard_EXPORT BRepGraphInc_Storage(); //! Clear allocator-backed containers before member destructors walk them. Standard_EXPORT ~BRepGraphInc_Storage(); //! Return the allocator used for backend storage. [[nodiscard]] const occ::handle& Allocator() const { return myAllocator; } //! Return products not referenced by any active occurrence. [[nodiscard]] const NCollection_LinearVector& RootProductIds() const { return myRootProductIds; } //! Return products not referenced by any active occurrence. NCollection_LinearVector& ChangeRootProductIds() { return myRootProductIds; } //! Return nodes accumulated during deferred invalidation. [[nodiscard]] const NCollection_LinearVector& DeferredModified() const { return myDeferredModified; } //! Return nodes accumulated during deferred invalidation. NCollection_LinearVector& ChangeDeferredModified() { return myDeferredModified; } //! Return refs accumulated during deferred invalidation. [[nodiscard]] const NCollection_LinearVector& DeferredRefModified() const { return myDeferredRefModified; } //! Return refs accumulated during deferred invalidation. NCollection_LinearVector& ChangeDeferredRefModified() { return myDeferredRefModified; } //! Return true when the graph contains no topology definitions. //! Checks whether any node kind (Vertex, Edge, Wire, Face, Shell, Solid, //! Compound, CompSolid, Product, Occurrence) has been allocated. [[nodiscard]] Standard_EXPORT bool IsEmpty() const; //! Return the next UID counter for a given node kind. [[nodiscard]] Standard_EXPORT uint32_t NextNodeUIDCounter(BRepGraph_NodeId::Kind theKind) const; //! Override the next UID counter for a given node kind. Standard_EXPORT void SetNextNodeUIDCounter(BRepGraph_NodeId::Kind theKind, uint32_t theCounter); //! Return the next UID counter for a given reference kind. [[nodiscard]] Standard_EXPORT uint32_t NextRefUIDCounter(BRepGraph_RefId::Kind theKind) const; //! Override the next UID counter for a given reference kind. Standard_EXPORT void SetNextRefUIDCounter(BRepGraph_RefId::Kind theKind, uint32_t theCounter); //! Allocate a node UID: write counter into the entity, bind reverse map, advance counter. Standard_EXPORT BRepGraph_UID AllocateNodeUID(BRepGraph_NodeId theNodeId); //! Allocate a reference UID: write counter into the ref, bind reverse map, advance counter. Standard_EXPORT BRepGraph_RefUID AllocateRefUID(BRepGraph_RefId theRefId); //! Return the current graph generation used by VersionStamp staleness checks. [[nodiscard]] uint32_t Generation() const { return myGeneration.load(std::memory_order_relaxed); } //! Override the current graph generation. void SetGeneration(const uint32_t theGeneration) { myGeneration.store(theGeneration, std::memory_order_relaxed); } //! Increment the graph generation after a structural mutation batch. void IncrementGeneration() { myGeneration.fetch_add(1, std::memory_order_relaxed); } //! Return the stable graph instance GUID. [[nodiscard]] const Standard_GUID& GraphGUID() const { return myGraphGUID; } //! Override the stable graph instance GUID. void SetGraphGUID(const Standard_GUID& theGuid) { myGraphGUID = theGuid; } //! Return whether invalidation is currently deferred. [[nodiscard]] bool DeferredMode() const { return myDeferredMode.load(std::memory_order_relaxed); } //! Enable or disable deferred invalidation mode. void SetDeferredMode(const bool theEnabled) { myDeferredMode.store(theEnabled, std::memory_order_relaxed); } //! Return the current propagation wave id used to avoid revisiting parents. [[nodiscard]] uint32_t PropagationWave() const { return myPropagationWave.load(std::memory_order_relaxed); } //! Increment the propagation wave and return the new value. [[nodiscard]] uint32_t AdvancePropagationWave() { return myPropagationWave.fetch_add(1, std::memory_order_relaxed) + 1; } //! Increment the propagation wave without reading it back. void IncrementPropagationWave() { myPropagationWave.fetch_add(1, std::memory_order_relaxed); } //! Return the recursion depth of the active RemoveSubgraph cascade. [[nodiscard]] uint32_t RemoveSubgraphDepth() const { return myRemoveSubgraphDepth; } //! Enter one nested RemoveSubgraph scope. void IncrementRemoveSubgraphDepth() { ++myRemoveSubgraphDepth; } //! Leave one nested RemoveSubgraph scope. void DecrementRemoveSubgraphDepth() { Standard_ASSERT_VOID(myRemoveSubgraphDepth > 0, "RemoveSubgraphDepth underflow"); if (myRemoveSubgraphDepth > 0) { --myRemoveSubgraphDepth; } } //! Returns the total number of vertex entities (including removed). [[nodiscard]] uint32_t NbVertices() const { return myVertices.Nb(); } //! Returns the total number of edge entities (including removed). [[nodiscard]] uint32_t NbEdges() const { return myEdges.Nb(); } //! Returns the total number of coedge entities (including removed). [[nodiscard]] uint32_t NbCoEdges() const { return myCoEdges.Nb(); } //! Returns the total number of wire entities (including removed). [[nodiscard]] uint32_t NbWires() const { return myWires.Nb(); } //! Returns the total number of face entities (including removed). [[nodiscard]] uint32_t NbFaces() const { return myFaces.Nb(); } //! Returns the total number of shell entities (including removed). [[nodiscard]] uint32_t NbShells() const { return myShells.Nb(); } //! Returns the total number of solid entities (including removed). [[nodiscard]] uint32_t NbSolids() const { return mySolids.Nb(); } //! Returns the total number of compound entities (including removed). [[nodiscard]] uint32_t NbCompounds() const { return myCompounds.Nb(); } //! Returns the total number of compsolid entities (including removed). [[nodiscard]] uint32_t NbCompSolids() const { return myCompSolids.Nb(); } //! Returns the total number of product entities (including removed). [[nodiscard]] uint32_t NbProducts() const { return myProducts.Nb(); } //! Returns the total number of occurrence entities (including removed). [[nodiscard]] uint32_t NbOccurrences() const { return myOccurrences.Nb(); } //! Returns the total number of shell reference entries (including removed). [[nodiscard]] uint32_t NbShellRefs() const { return myShellRefs.Nb(); } //! Returns the total number of face reference entries (including removed). [[nodiscard]] uint32_t NbFaceRefs() const { return myFaceRefs.Nb(); } //! Returns the total number of wire reference entries (including removed). [[nodiscard]] uint32_t NbWireRefs() const { return myWireRefs.Nb(); } //! Returns the total number of vertex reference entries (including removed). [[nodiscard]] uint32_t NbVertexRefs() const { return myVertexRefs.Nb(); } //! Returns the total number of solid reference entries (including removed). [[nodiscard]] uint32_t NbSolidRefs() const { return mySolidRefs.Nb(); } //! Returns the total number of child reference entries (including removed). [[nodiscard]] uint32_t NbChildRefs() const { return myChildRefs.Nb(); } //! Returns the total number of occurrence reference entries (including removed). [[nodiscard]] uint32_t NbOccurrenceRefs() const { return myOccurrenceRefs.Nb(); } //! Returns the number of active vertex entities (excluding removed). [[nodiscard]] uint32_t NbActiveVertices() const { return myVertices.NbActive; } //! Returns the number of active edge entities (excluding removed). [[nodiscard]] uint32_t NbActiveEdges() const { return myEdges.NbActive; } //! Returns the number of active coedge entities (excluding removed). [[nodiscard]] uint32_t NbActiveCoEdges() const { return myCoEdges.NbActive; } //! Returns the number of active wire entities (excluding removed). [[nodiscard]] uint32_t NbActiveWires() const { return myWires.NbActive; } //! Returns the number of active face entities (excluding removed). [[nodiscard]] uint32_t NbActiveFaces() const { return myFaces.NbActive; } //! Returns the number of active shell entities (excluding removed). [[nodiscard]] uint32_t NbActiveShells() const { return myShells.NbActive; } //! Returns the number of active solid entities (excluding removed). [[nodiscard]] uint32_t NbActiveSolids() const { return mySolids.NbActive; } //! Returns the number of active compound entities (excluding removed). [[nodiscard]] uint32_t NbActiveCompounds() const { return myCompounds.NbActive; } //! Returns the number of active compsolid entities (excluding removed). [[nodiscard]] uint32_t NbActiveCompSolids() const { return myCompSolids.NbActive; } //! Returns the number of active product entities (excluding removed). [[nodiscard]] uint32_t NbActiveProducts() const { return myProducts.NbActive; } //! Returns the number of active occurrence entities (excluding removed). [[nodiscard]] uint32_t NbActiveOccurrences() const { return myOccurrences.NbActive; } //! Returns the number of active shell reference entries (excluding removed). [[nodiscard]] uint32_t NbActiveShellRefs() const { return myShellRefs.NbActive; } //! Returns the number of active face reference entries (excluding removed). [[nodiscard]] uint32_t NbActiveFaceRefs() const { return myFaceRefs.NbActive; } //! Returns the number of active wire reference entries (excluding removed). [[nodiscard]] uint32_t NbActiveWireRefs() const { return myWireRefs.NbActive; } //! Returns the number of active vertex reference entries (excluding removed). [[nodiscard]] uint32_t NbActiveVertexRefs() const { return myVertexRefs.NbActive; } //! Returns the number of active solid reference entries (excluding removed). [[nodiscard]] uint32_t NbActiveSolidRefs() const { return mySolidRefs.NbActive; } //! Returns the number of active child reference entries (excluding removed). [[nodiscard]] uint32_t NbActiveChildRefs() const { return myChildRefs.NbActive; } //! Returns the number of active occurrence reference entries (excluding removed). [[nodiscard]] uint32_t NbActiveOccurrenceRefs() const { return myOccurrenceRefs.NbActive; } //! Mark an entity node as removed and decrement its active counter once. //! @param[in] theNodeId typed entity id //! @return true if the node transitioned from active to removed Standard_EXPORT bool MarkRemoved(const BRepGraph_NodeId theNodeId); //! Mark a reference entry as removed and decrement its active counter once. //! @param[in] theRefId typed reference id //! @return true if the ref transitioned from active to removed Standard_EXPORT bool MarkRemovedRef(const BRepGraph_RefId theRefId); //! Returns the number of edge 3D curve use records. [[nodiscard]] uint32_t NbEdgeCurves3D() const { return myEdgeCurves3D.Nb(); } //! Returns the number of edge 3D polygon use records. [[nodiscard]] uint32_t NbEdgePolygons3D() const { return myEdgePolygons3D.Nb(); } //! Returns the number of coedge 2D curve use records. [[nodiscard]] uint32_t NbCoEdgeCurves2D() const { return myCoEdgeCurves2D.Nb(); } //! Returns the number of coedge 2D polygon use records. [[nodiscard]] uint32_t NbCoEdgePolygons2D() const { return myCoEdgePolygons2D.Nb(); } //! Returns the number of coedge polygon-on-triangulation use records. [[nodiscard]] uint32_t NbCoEdgePolygonsOnTri() const { return myCoEdgePolygonsOnTri.Nb(); } //! Returns the number of face surface use records. [[nodiscard]] uint32_t NbFaceSurfaces() const { return myFaceSurfaces.Nb(); } //! Returns the number of face triangulation use records. [[nodiscard]] uint32_t NbFaceTriangulations() const { return myFaceTriangulations.Nb(); } //! Returns the number of active (parent-valid) edge 3D curve use records. [[nodiscard]] Standard_EXPORT uint32_t NbActiveEdgeCurves3D() const; //! Returns the number of active (parent-valid) coedge 2D curve use records. [[nodiscard]] Standard_EXPORT uint32_t NbActiveCoEdgeCurves2D() const; //! Returns the number of active (parent-valid) face surface use records. [[nodiscard]] Standard_EXPORT uint32_t NbActiveFaceSurfaces() const; //! Returns the number of active (parent-valid) face triangulation use records. [[nodiscard]] Standard_EXPORT uint32_t NbActiveFaceTriangulations() const; //! Returns the number of active (parent-valid) edge 3D polygon use records. [[nodiscard]] Standard_EXPORT uint32_t NbActiveEdgePolygons3D() const; //! Returns the number of active (parent-valid) coedge 2D polygon use records. [[nodiscard]] Standard_EXPORT uint32_t NbActiveCoEdgePolygons2D() const; //! Returns the number of active (parent-valid) coedge polygon-on-triangulation use records. [[nodiscard]] Standard_EXPORT uint32_t NbActiveCoEdgePolygonsOnTri() const; //! Returns the edge 3D curve use at the given id. [[nodiscard]] const BRepGraphInc::EdgeCurve3DRep& EdgeCurve3DRep( const BRepGraph_EdgeCurve3DRepId theId) const { return myEdgeCurves3D.Get(theId); } //! Returns a mutable reference to the edge 3D curve use at the given id. BRepGraphInc::EdgeCurve3DRep& ChangeEdgeCurve3DRep(const BRepGraph_EdgeCurve3DRepId theId) { return myEdgeCurves3D.Change(theId); } //! Returns the edge 3D polygon use at the given id. [[nodiscard]] const BRepGraphInc::EdgePolygon3DRep& EdgePolygon3DRep( const BRepGraph_EdgePolygon3DRepId theId) const { return myEdgePolygons3D.Get(theId); } //! Returns a mutable reference to the edge 3D polygon use at the given id. BRepGraphInc::EdgePolygon3DRep& ChangeEdgePolygon3DRep(const BRepGraph_EdgePolygon3DRepId theId) { return myEdgePolygons3D.Change(theId); } //! Returns the coedge 2D curve use at the given id. [[nodiscard]] const BRepGraphInc::CoEdgeCurve2DRep& CoEdgeCurve2DRep( const BRepGraph_CoEdgeCurve2DRepId theId) const { return myCoEdgeCurves2D.Get(theId); } //! Returns a mutable reference to the coedge 2D curve use at the given id. BRepGraphInc::CoEdgeCurve2DRep& ChangeCoEdgeCurve2DRep(const BRepGraph_CoEdgeCurve2DRepId theId) { return myCoEdgeCurves2D.Change(theId); } //! Returns the coedge 2D polygon use at the given id. [[nodiscard]] const BRepGraphInc::CoEdgePolygon2DRep& CoEdgePolygon2DRep( const BRepGraph_CoEdgePolygon2DRepId theId) const { return myCoEdgePolygons2D.Get(theId); } //! Returns a mutable reference to the coedge 2D polygon use at the given id. BRepGraphInc::CoEdgePolygon2DRep& ChangeCoEdgePolygon2DRep( const BRepGraph_CoEdgePolygon2DRepId theId) { return myCoEdgePolygons2D.Change(theId); } //! Returns the coedge polygon-on-triangulation use at the given id. [[nodiscard]] const BRepGraphInc::CoEdgePolygonOnTriRep& CoEdgePolygonOnTriRep( const BRepGraph_CoEdgePolygonOnTriRepId theId) const { return myCoEdgePolygonsOnTri.Get(theId); } //! Returns a mutable reference to the coedge polygon-on-triangulation use at the given id. BRepGraphInc::CoEdgePolygonOnTriRep& ChangeCoEdgePolygonOnTriRep( const BRepGraph_CoEdgePolygonOnTriRepId theId) { return myCoEdgePolygonsOnTri.Change(theId); } //! Returns the face surface use at the given id. [[nodiscard]] const BRepGraphInc::FaceSurfaceRep& FaceSurfaceRep( const BRepGraph_FaceSurfaceRepId theId) const { return myFaceSurfaces.Get(theId); } //! Returns a mutable reference to the face surface use at the given id. BRepGraphInc::FaceSurfaceRep& ChangeFaceSurfaceRep(const BRepGraph_FaceSurfaceRepId theId) { return myFaceSurfaces.Change(theId); } //! Returns the face triangulation use at the given id. [[nodiscard]] const BRepGraphInc::FaceTriangulationRep& FaceTriangulationRep( const BRepGraph_FaceTriangulationRepId theId) const { return myFaceTriangulations.Get(theId); } //! Returns a mutable reference to the face triangulation use at the given id. BRepGraphInc::FaceTriangulationRep& ChangeFaceTriangulationRep( const BRepGraph_FaceTriangulationRepId theId) { return myFaceTriangulations.Change(theId); } //! Appends a new edge 3D curve use record and returns its id. BRepGraph_EdgeCurve3DRepId AppendEdgeCurve3DRep() { return myEdgeCurves3D.Append(); } //! Appends a new edge 3D polygon use record and returns its id. BRepGraph_EdgePolygon3DRepId AppendEdgePolygon3DRep() { return myEdgePolygons3D.Append(); } //! Appends a new coedge 2D curve use record and returns its id. BRepGraph_CoEdgeCurve2DRepId AppendCoEdgeCurve2DRep() { return myCoEdgeCurves2D.Append(); } //! Appends a new coedge 2D polygon use record and returns its id. BRepGraph_CoEdgePolygon2DRepId AppendCoEdgePolygon2DRep() { return myCoEdgePolygons2D.Append(); } //! Appends a new coedge polygon-on-triangulation use record and returns its id. BRepGraph_CoEdgePolygonOnTriRepId AppendCoEdgePolygonOnTriRep() { return myCoEdgePolygonsOnTri.Append(); } //! Appends a new face surface use record and returns its id. BRepGraph_FaceSurfaceRepId AppendFaceSurfaceRep() { return myFaceSurfaces.Append(); } //! Appends a new face triangulation use record and returns its id. BRepGraph_FaceTriangulationRepId AppendFaceTriangulationRep() { return myFaceTriangulations.Append(); } //! Mark a representation-use record as removed and decrement its active counter once. //! @param[in] theRepId typed use id //! @return true if the use transitioned from active to removed Standard_EXPORT bool MarkRemoved(const BRepGraph_RepId theRepId); //! Set or clear the soft-removal flag for a representation-use record. //! @param[in] theRepId typed use id //! @param[in] theVal true to mark removed, false to mark active Standard_EXPORT void SetRemoved(const BRepGraph_RepId theRepId, const bool theVal); //! Returns the vertex entity at the given typed id. //! @param[in] theVertex typed vertex id [[nodiscard]] const BRepGraphInc::VertexDef& Vertex(const BRepGraph_VertexId theVertex) const { return myVertices.Get(theVertex); } //! Returns the edge entity at the given typed id. //! @param[in] theEdge typed edge id [[nodiscard]] const BRepGraphInc::EdgeDef& Edge(const BRepGraph_EdgeId theEdge) const { return myEdges.Get(theEdge); } //! Returns the coedge entity at the given typed id. //! @param[in] theCoEdge typed coedge id [[nodiscard]] const BRepGraphInc::CoEdgeDef& CoEdge(const BRepGraph_CoEdgeId theCoEdge) const { return myCoEdges.Get(theCoEdge); } //! Returns the wire entity at the given typed id. //! @param[in] theWire typed wire id [[nodiscard]] const BRepGraphInc::WireDef& Wire(const BRepGraph_WireId theWire) const { return myWires.Get(theWire); } //! Returns the face entity at the given typed id. //! @param[in] theFace typed face id [[nodiscard]] const BRepGraphInc::FaceDef& Face(const BRepGraph_FaceId theFace) const { return myFaces.Get(theFace); } //! Returns the shell entity at the given typed id. //! @param[in] theShell typed shell id [[nodiscard]] const BRepGraphInc::ShellDef& Shell(const BRepGraph_ShellId theShell) const { return myShells.Get(theShell); } //! Returns the solid entity at the given typed id. //! @param[in] theSolid typed solid id [[nodiscard]] const BRepGraphInc::SolidDef& Solid(const BRepGraph_SolidId theSolid) const { return mySolids.Get(theSolid); } //! Returns the compound entity at the given typed id. //! @param[in] theCompound typed compound id [[nodiscard]] const BRepGraphInc::CompoundDef& Compound( const BRepGraph_CompoundId theCompound) const { return myCompounds.Get(theCompound); } //! Returns the compsolid entity at the given typed id. //! @param[in] theCompSolid typed comp-solid id [[nodiscard]] const BRepGraphInc::CompSolidDef& CompSolid( const BRepGraph_CompSolidId theCompSolid) const { return myCompSolids.Get(theCompSolid); } //! Returns the product entity at the given typed id. //! @param[in] theProduct typed product id [[nodiscard]] const BRepGraphInc::ProductDef& Product(const BRepGraph_ProductId theProduct) const { return myProducts.Get(theProduct); } //! Returns the occurrence entity at the given typed id. //! @param[in] theOccurrence typed occurrence id [[nodiscard]] const BRepGraphInc::OccurrenceDef& Occurrence( const BRepGraph_OccurrenceId theOccurrence) const { return myOccurrences.Get(theOccurrence); } //! Returns the shell reference entry at the given typed id. [[nodiscard]] const BRepGraphInc::ShellRef& ShellRef(const BRepGraph_ShellRefId theRefId) const { return myShellRefs.Get(theRefId); } //! Returns the face reference entry at the given typed id. [[nodiscard]] const BRepGraphInc::FaceRef& FaceRef(const BRepGraph_FaceRefId theRefId) const { return myFaceRefs.Get(theRefId); } //! Returns the wire reference entry at the given typed id. [[nodiscard]] const BRepGraphInc::WireRef& WireRef(const BRepGraph_WireRefId theRefId) const { return myWireRefs.Get(theRefId); } //! Returns the vertex reference entry at the given typed id. [[nodiscard]] const BRepGraphInc::VertexRef& VertexRef(const BRepGraph_VertexRefId theRefId) const { return myVertexRefs.Get(theRefId); } //! Returns the solid reference entry at the given typed id. [[nodiscard]] const BRepGraphInc::SolidRef& SolidRef(const BRepGraph_SolidRefId theRefId) const { return mySolidRefs.Get(theRefId); } //! Returns the child reference entry at the given typed id. [[nodiscard]] const BRepGraphInc::ChildRef& ChildRef(const BRepGraph_ChildRefId theRefId) const { return myChildRefs.Get(theRefId); } //! Returns the occurrence reference entry at the given typed id. [[nodiscard]] const BRepGraphInc::OccurrenceRef& OccurrenceRef( const BRepGraph_OccurrenceRefId theRefId) const { return myOccurrenceRefs.Get(theRefId); } //! Returns a mutable reference to the vertex entity at the given typed id. //! @param[in] theVertex typed vertex id BRepGraphInc::VertexDef& ChangeVertex(const BRepGraph_VertexId theVertex) { return myVertices.Change(theVertex); } //! Returns a mutable reference to the edge entity at the given typed id. //! @param[in] theEdge typed edge id BRepGraphInc::EdgeDef& ChangeEdge(const BRepGraph_EdgeId theEdge) { return myEdges.Change(theEdge); } //! Returns a mutable reference to the coedge entity at the given typed id. //! @param[in] theCoEdge typed coedge id BRepGraphInc::CoEdgeDef& ChangeCoEdge(const BRepGraph_CoEdgeId theCoEdge) { return myCoEdges.Change(theCoEdge); } //! Returns a mutable reference to the wire entity at the given typed id. //! @param[in] theWire typed wire id BRepGraphInc::WireDef& ChangeWire(const BRepGraph_WireId theWire) { return myWires.Change(theWire); } //! Returns a mutable reference to the face entity at the given typed id. //! @param[in] theFace typed face id BRepGraphInc::FaceDef& ChangeFace(const BRepGraph_FaceId theFace) { return myFaces.Change(theFace); } //! Returns a mutable reference to the shell entity at the given typed id. //! @param[in] theShell typed shell id BRepGraphInc::ShellDef& ChangeShell(const BRepGraph_ShellId theShell) { return myShells.Change(theShell); } //! Returns a mutable reference to the solid entity at the given typed id. //! @param[in] theSolid typed solid id BRepGraphInc::SolidDef& ChangeSolid(const BRepGraph_SolidId theSolid) { return mySolids.Change(theSolid); } //! Returns a mutable reference to the compound entity at the given typed id. //! @param[in] theCompound typed compound id BRepGraphInc::CompoundDef& ChangeCompound(const BRepGraph_CompoundId theCompound) { return myCompounds.Change(theCompound); } //! Returns a mutable reference to the compsolid entity at the given typed id. //! @param[in] theCompSolid typed comp-solid id BRepGraphInc::CompSolidDef& ChangeCompSolid(const BRepGraph_CompSolidId theCompSolid) { return myCompSolids.Change(theCompSolid); } //! Returns a mutable reference to the product entity at the given typed id. //! @param[in] theProduct typed product id BRepGraphInc::ProductDef& ChangeProduct(const BRepGraph_ProductId theProduct) { return myProducts.Change(theProduct); } //! Returns a mutable reference to the occurrence entity at the given typed id. //! @param[in] theOccurrence typed occurrence id BRepGraphInc::OccurrenceDef& ChangeOccurrence(const BRepGraph_OccurrenceId theOccurrence) { return myOccurrences.Change(theOccurrence); } //! Returns a mutable reference to the shell reference entry at the given typed id. BRepGraphInc::ShellRef& ChangeShellRef(const BRepGraph_ShellRefId theRefId) { return myShellRefs.Change(theRefId); } //! Returns a mutable reference to the face reference entry at the given typed id. BRepGraphInc::FaceRef& ChangeFaceRef(const BRepGraph_FaceRefId theRefId) { return myFaceRefs.Change(theRefId); } //! Returns a mutable reference to the wire reference entry at the given typed id. BRepGraphInc::WireRef& ChangeWireRef(const BRepGraph_WireRefId theRefId) { return myWireRefs.Change(theRefId); } //! Returns a mutable reference to the vertex reference entry at the given typed id. BRepGraphInc::VertexRef& ChangeVertexRef(const BRepGraph_VertexRefId theRefId) { return myVertexRefs.Change(theRefId); } //! Returns a mutable reference to the solid reference entry at the given typed id. BRepGraphInc::SolidRef& ChangeSolidRef(const BRepGraph_SolidRefId theRefId) { return mySolidRefs.Change(theRefId); } //! Returns a mutable reference to the child reference entry at the given typed id. BRepGraphInc::ChildRef& ChangeChildRef(const BRepGraph_ChildRefId theRefId) { return myChildRefs.Change(theRefId); } //! Returns a mutable reference to the occurrence reference entry at the given typed id. BRepGraphInc::OccurrenceRef& ChangeOccurrenceRef(const BRepGraph_OccurrenceRefId theRefId) { return myOccurrenceRefs.Change(theRefId); } //! Return the face relations for a given face identifier. //! @param[in] theId face identifier //! @return const reference to the face relation representation [[nodiscard]] const BRepGraphInc::FaceRelations& FaceRelations(const BRepGraph_FaceId theId) const { return myFaceRelations.Value(static_cast(theId.Index)); } //! Return the wire relations for a given wire identifier. //! @param[in] theId wire identifier //! @return const reference to the wire relation representation [[nodiscard]] const BRepGraphInc::WireRelations& WireRelations(const BRepGraph_WireId theId) const { return myWireRelations.Value(static_cast(theId.Index)); } //! Return the edge relations for a given edge identifier. //! @param[in] theId edge identifier //! @return const reference to the edge relation representation [[nodiscard]] const BRepGraphInc::EdgeRelations& EdgeRelations(const BRepGraph_EdgeId theId) const { return myEdgeRelations.Value(static_cast(theId.Index)); } //! Return the shell relations for a given shell identifier. //! @param[in] theId shell identifier //! @return const reference to the shell relation representation [[nodiscard]] const BRepGraphInc::ShellRelations& ShellRelations( const BRepGraph_ShellId theId) const { return myShellRelations.Value(static_cast(theId.Index)); } //! Return the solid relations for a given solid identifier. //! @param[in] theId solid identifier //! @return const reference to the solid relation representation [[nodiscard]] const BRepGraphInc::SolidRelations& SolidRelations( const BRepGraph_SolidId theId) const { return mySolidRelations.Value(static_cast(theId.Index)); } //! Return the compound relations for a given compound identifier. //! @param[in] theId compound identifier //! @return const reference to the compound relation representation [[nodiscard]] const BRepGraphInc::CompoundRelations& CompoundRelations( const BRepGraph_CompoundId theId) const { return myCompoundRelations.Value(static_cast(theId.Index)); } //! Return the compsolid relations for a given compsolid identifier. //! @param[in] theId compsolid identifier //! @return const reference to the compsolid relation representation [[nodiscard]] const BRepGraphInc::CompSolidRelations& CompSolidRelations( const BRepGraph_CompSolidId theId) const { return myCompSolidRelations.Value(static_cast(theId.Index)); } //! Return the vertex relations for a given vertex identifier. //! @param[in] theId vertex identifier //! @return const reference to the vertex relation representation [[nodiscard]] const BRepGraphInc::VertexRelations& VertexRelations( const BRepGraph_VertexId theId) const { return myVertexRelations.Value(static_cast(theId.Index)); } //! Return the product relations for a given product identifier. //! @param[in] theId product identifier //! @return const reference to the product relation representation [[nodiscard]] const BRepGraphInc::ProductRelations& ProductRelations( const BRepGraph_ProductId theId) const { return myProductRelations.Value(static_cast(theId.Index)); } //! Return the occurrence relations for a given occurrence identifier. //! @param[in] theId occurrence identifier //! @return const reference to the occurrence relation representation [[nodiscard]] const BRepGraphInc::OccurrenceRelations& OccurrenceRelations( const BRepGraph_OccurrenceId theId) const { return myOccurrenceRelations.Value(static_cast(theId.Index)); } //! Return the compound child reference identifiers that point to a given node. //! @param[in] theNode node identifier //! @return const reference to the list of child reference identifiers [[nodiscard]] Standard_EXPORT const NCollection_LinearVector& CompoundRefsOfNode(const BRepGraph_NodeId theNode) const; //! Return the occurrence reference identifiers that point to a given node. //! @param[in] theNode node identifier //! @return const reference to the list of occurrence reference identifiers [[nodiscard]] Standard_EXPORT const NCollection_LinearVector& OccurrenceRefsOfNode(const BRepGraph_NodeId theNode) const; //! Appends a new vertex entity and returns its typed id. BRepGraph_VertexId AppendVertex() { const BRepGraph_VertexId anId = myVertices.Append(); myVertexRelations.Appended(); return anId; } //! Appends a new edge entity and returns its typed id. BRepGraph_EdgeId AppendEdge() { const BRepGraph_EdgeId anId = myEdges.Append(); myEdgeRelations.Appended(); return anId; } //! Appends a new coedge entity and returns its typed id. BRepGraph_CoEdgeId AppendCoEdge() { return myCoEdges.Append(); } //! Appends a new wire entity and returns its typed id. BRepGraph_WireId AppendWire() { const BRepGraph_WireId anId = myWires.Append(); myWireRelations.Appended(); return anId; } //! Appends a new face entity and returns its typed id. BRepGraph_FaceId AppendFace() { const BRepGraph_FaceId anId = myFaces.Append(); myFaceRelations.Appended(); return anId; } //! Appends a new shell entity and returns its typed id. BRepGraph_ShellId AppendShell() { const BRepGraph_ShellId anId = myShells.Append(); myShellRelations.Appended(); return anId; } //! Appends a new solid entity and returns its typed id. BRepGraph_SolidId AppendSolid() { const BRepGraph_SolidId anId = mySolids.Append(); mySolidRelations.Appended(); return anId; } //! Appends a new compound entity and returns its typed id. BRepGraph_CompoundId AppendCompound() { const BRepGraph_CompoundId anId = myCompounds.Append(); myCompoundRelations.Appended(); return anId; } //! Appends a new compsolid entity and returns its typed id. BRepGraph_CompSolidId AppendCompSolid() { const BRepGraph_CompSolidId anId = myCompSolids.Append(); myCompSolidRelations.Appended(); return anId; } //! Appends a new product entity and returns its typed id. BRepGraph_ProductId AppendProduct() { const BRepGraph_ProductId anId = myProducts.Append(); myProductRelations.Appended(); return anId; } //! Appends a new occurrence entity and returns its typed id. BRepGraph_OccurrenceId AppendOccurrence() { const BRepGraph_OccurrenceId anId = myOccurrences.Append(); myOccurrenceRelations.Appended(); return anId; } //! Appends a new shell reference entry and returns its typed id. BRepGraph_ShellRefId AppendShellRef() { return myShellRefs.Append(); } //! Appends a new face reference entry and returns its typed id. BRepGraph_FaceRefId AppendFaceRef() { return myFaceRefs.Append(); } //! Appends a new wire reference entry and returns its typed id. BRepGraph_WireRefId AppendWireRef() { return myWireRefs.Append(); } //! Appends a new vertex reference entry and returns its typed id. BRepGraph_VertexRefId AppendVertexRef() { return myVertexRefs.Append(); } //! Appends a new solid reference entry and returns its typed id. BRepGraph_SolidRefId AppendSolidRef() { return mySolidRefs.Append(); } //! Appends a new child reference entry and returns its typed id. BRepGraph_ChildRefId AppendChildRef() { return myChildRefs.Append(); } //! Appends a new occurrence reference entry and returns its typed id. BRepGraph_OccurrenceRefId AppendOccurrenceRef() { return myOccurrenceRefs.Append(); } //! Create a coedge use record binding an edge to a wire within a face context. //! @param[in] theParentWireId owning wire identifier //! @param[in] theChildEdgeId referenced edge identifier //! @param[in] theFaceId face context identifier //! @param[in] theOrientation orientation of the coedge //! @return the newly created coedge identifier Standard_EXPORT BRepGraph_CoEdgeId CreateCoEdgeUse(const BRepGraph_WireId theParentWireId, const BRepGraph_EdgeId theChildEdgeId, const BRepGraph_FaceId theFaceId, const BRepGraphInc::ParityOrientation theOrientation); //! Attach an edge to a vertex by creating a vertex reference. //! @param[in] theEdgeId edge identifier //! @param[in] theVertexId vertex identifier Standard_EXPORT void AttachEdgeToVertex(const BRepGraph_EdgeId theEdgeId, const BRepGraph_VertexId theVertexId); //! Attach a wire to a face by creating a wire reference. //! @param[in] theParentFaceId parent face identifier //! @param[in] theChildWireId child wire identifier //! @param[in] theOrientation orientation within parent //! @return the newly created wire reference identifier Standard_EXPORT BRepGraph_WireRefId AttachWireToFace(const BRepGraph_FaceId theParentFaceId, const BRepGraph_WireId theChildWireId, const BRepGraphInc::ParityOrientation theOrientation = TopAbs_FORWARD); //! Attach a face to a shell by creating a face reference. //! @param[in] theParentShellId parent shell identifier //! @param[in] theChildFaceId child face identifier //! @param[in] theOrientation orientation within parent //! @return the newly created face reference identifier Standard_EXPORT BRepGraph_FaceRefId AttachFaceToShell(const BRepGraph_ShellId theParentShellId, const BRepGraph_FaceId theChildFaceId, const BRepGraphInc::ParityOrientation theOrientation = TopAbs_FORWARD); //! Attach a shell to a solid by creating a shell reference. //! @param[in] theParentSolidId parent solid identifier //! @param[in] theChildShellId child shell identifier //! @param[in] theOrientation orientation within parent //! @return the newly created shell reference identifier Standard_EXPORT BRepGraph_ShellRefId AttachShellToSolid(const BRepGraph_SolidId theParentSolidId, const BRepGraph_ShellId theChildShellId, const BRepGraphInc::ParityOrientation theOrientation = TopAbs_FORWARD); //! Attach a solid to a compsolid by creating a solid reference. //! @param[in] theParentCompSolidId parent compsolid identifier //! @param[in] theChildSolidId child solid identifier //! @param[in] theOrientation orientation within parent //! @return the newly created solid reference identifier Standard_EXPORT BRepGraph_SolidRefId AttachSolidToCompSolid(const BRepGraph_CompSolidId theParentCompSolidId, const BRepGraph_SolidId theChildSolidId, const BRepGraphInc::ParityOrientation theOrientation = TopAbs_FORWARD); //! Attach a child node to a compound by creating a child reference. //! @param[in] theParentCompoundId parent compound identifier //! @param[in] theChildNodeId child node identifier //! @param[in] theLocation optional location transformation //! @param[in] theOrientation orientation within parent //! @return the newly created child reference identifier Standard_EXPORT BRepGraph_ChildRefId AttachChildToCompound(const BRepGraph_CompoundId theParentCompoundId, const BRepGraph_NodeId theChildNodeId, const TopLoc_Location& theLocation = TopLoc_Location(), const BRepGraphInc::ParityOrientation theOrientation = TopAbs_FORWARD); //! Attach an occurrence to a product by creating an occurrence reference. //! @param[in] theParentProductId parent product identifier //! @param[in] theChildOccurrenceId child occurrence identifier //! @param[in] theLocation optional location transformation //! @return the newly created occurrence reference identifier Standard_EXPORT BRepGraph_OccurrenceRefId AttachOccurrenceToProduct(const BRepGraph_ProductId theParentProductId, const BRepGraph_OccurrenceId theChildOccurrenceId, const TopLoc_Location& theLocation = TopLoc_Location()); //! Detach a coedge use from its parent wire. //! @param[in] theParentWireId owning wire identifier //! @param[in] theCoEdgeId coedge identifier to detach //! @return true if the coedge was found and removed Standard_EXPORT bool DetachCoEdgeUse(const BRepGraph_WireId theParentWireId, const BRepGraph_CoEdgeId theCoEdgeId); //! Replace a single coedge with a pair of new coedges in a wire. //! @param[in] theParentWireId owning wire identifier //! @param[in] theOldCoEdgeId coedge to replace //! @param[in] theNewFirstCoEdgeId first replacement coedge //! @param[in] theNewSecondCoEdgeId second replacement coedge //! @return true if the replacement succeeded Standard_EXPORT bool ReplaceCoEdgeUseWithPair(const BRepGraph_WireId theParentWireId, const BRepGraph_CoEdgeId theOldCoEdgeId, const BRepGraph_CoEdgeId theNewFirstCoEdgeId, const BRepGraph_CoEdgeId theNewSecondCoEdgeId); //! Detach a wire reference from its parent face. //! @param[in] theParentFaceId parent face identifier //! @param[in] theRefId wire reference identifier to detach //! @return true if the reference was found and removed Standard_EXPORT bool DetachWireFromFace(const BRepGraph_FaceId theParentFaceId, const BRepGraph_WireRefId theRefId); //! Detach a face reference from its parent shell. //! @param[in] theParentShellId parent shell identifier //! @param[in] theRefId face reference identifier to detach //! @return true if the reference was found and removed Standard_EXPORT bool DetachFaceFromShell(const BRepGraph_ShellId theParentShellId, const BRepGraph_FaceRefId theRefId); //! Detach a shell reference from its parent solid. //! @param[in] theParentSolidId parent solid identifier //! @param[in] theRefId shell reference identifier to detach //! @return true if the reference was found and removed Standard_EXPORT bool DetachShellFromSolid(const BRepGraph_SolidId theParentSolidId, const BRepGraph_ShellRefId theRefId); //! Detach a solid reference from its parent compsolid. //! @param[in] theParentCompSolidId parent compsolid identifier //! @param[in] theRefId solid reference identifier to detach //! @return true if the reference was found and removed Standard_EXPORT bool DetachSolidFromCompSolid(const BRepGraph_CompSolidId theParentCompSolidId, const BRepGraph_SolidRefId theRefId); //! Detach a child reference from its parent compound. //! @param[in] theParentCompoundId parent compound identifier //! @param[in] theRefId child reference identifier to detach //! @return true if the reference was found and removed Standard_EXPORT bool DetachChildFromCompound(const BRepGraph_CompoundId theParentCompoundId, const BRepGraph_ChildRefId theRefId); //! Detach an occurrence reference from its parent product. //! @param[in] theParentProductId parent product identifier //! @param[in] theRefId occurrence reference identifier to detach //! @return true if the reference was found and removed Standard_EXPORT bool DetachOccurrenceFromProduct(const BRepGraph_ProductId theParentProductId, const BRepGraph_OccurrenceRefId theRefId); //! Rebind the child node of an occurrence to a new node. //! @param[in] theOccurrence occurrence identifier //! @param[in] theOldChild old child node identifier //! @param[in] theNewChild new child node identifier Standard_EXPORT void RebindOccurrenceChild(const BRepGraph_OccurrenceId theOccurrence, const BRepGraph_NodeId theOldChild, const BRepGraph_NodeId theNewChild); //! Rebind vertex edge references from one vertex to another, excluding a specific ref. //! @param[in] theOldVertex old vertex identifier //! @param[in] theNewVertex new vertex identifier //! @param[in] theEdge edge identifier //! @param[in] theExcludingRef reference identifier to exclude from rebinding Standard_EXPORT void RebindVertexEdge(const BRepGraph_VertexId theOldVertex, const BRepGraph_VertexId theNewVertex, const BRepGraph_EdgeId theEdge, const BRepGraph_VertexRefId theExcludingRef); //! Rebind a vertex reference to point to a new vertex. //! @param[in] theRefId vertex reference identifier //! @param[in] theOldVertex old vertex identifier //! @param[in] theNewVertex new vertex identifier Standard_EXPORT void RebindVertexRef(const BRepGraph_VertexRefId theRefId, const BRepGraph_VertexId theOldVertex, const BRepGraph_VertexId theNewVertex); //! Rebind a coedge to reference a different edge. //! @param[in] theCoEdge coedge identifier //! @param[in] theOldEdge old edge identifier //! @param[in] theNewEdge new edge identifier Standard_EXPORT void RebindCoEdgeEdge(const BRepGraph_CoEdgeId theCoEdge, const BRepGraph_EdgeId theOldEdge, const BRepGraph_EdgeId theNewEdge); //! Rebind a wire reference to point to a new wire. //! @param[in] theRefId wire reference identifier //! @param[in] theOldWire old wire identifier //! @param[in] theNewWire new wire identifier Standard_EXPORT void RebindWireRef(const BRepGraph_WireRefId theRefId, const BRepGraph_WireId theOldWire, const BRepGraph_WireId theNewWire); //! Rebind a face reference to point to a new face. //! @param[in] theRefId face reference identifier //! @param[in] theOldFace old face identifier //! @param[in] theNewFace new face identifier Standard_EXPORT void RebindFaceRef(const BRepGraph_FaceRefId theRefId, const BRepGraph_FaceId theOldFace, const BRepGraph_FaceId theNewFace); //! Rebind a shell reference to point to a new shell. //! @param[in] theRefId shell reference identifier //! @param[in] theOldShell old shell identifier //! @param[in] theNewShell new shell identifier Standard_EXPORT void RebindShellRef(const BRepGraph_ShellRefId theRefId, const BRepGraph_ShellId theOldShell, const BRepGraph_ShellId theNewShell); //! Rebind a solid reference to point to a new solid. //! @param[in] theRefId solid reference identifier //! @param[in] theOldSolid old solid identifier //! @param[in] theNewSolid new solid identifier Standard_EXPORT void RebindSolidRef(const BRepGraph_SolidRefId theRefId, const BRepGraph_SolidId theOldSolid, const BRepGraph_SolidId theNewSolid); //! Rebind a child reference to point to a new child node. //! @param[in] theRefId child reference identifier //! @param[in] theOldChild old child node identifier //! @param[in] theNewChild new child node identifier Standard_EXPORT void RebindChildRef(const BRepGraph_ChildRefId theRefId, const BRepGraph_NodeId theOldChild, const BRepGraph_NodeId theNewChild); //! Rebind an occurrence reference to point to a new occurrence. //! @param[in] theRefId occurrence reference identifier //! @param[in] theOldOccurrence old occurrence identifier //! @param[in] theNewOccurrence new occurrence identifier Standard_EXPORT void RebindOccurrenceRef(const BRepGraph_OccurrenceRefId theRefId, const BRepGraph_OccurrenceId theOldOccurrence, const BRepGraph_OccurrenceId theNewOccurrence); //! Reverse the order of coedges in a wire. //! @param[in] theWireId wire identifier Standard_EXPORT void ReverseWireCoEdges(const BRepGraph_WireId theWireId); //! Replace the coedge list of a wire with a new set. //! @param[in] theWireId wire identifier //! @param[in] theCoEdgeIds new coedge identifiers Standard_EXPORT void SetWireCoEdges(const BRepGraph_WireId theWireId, const NCollection_Array1& theCoEdgeIds); //! Replace the wire reference list of a face with a new set. //! @param[in] theFaceId face identifier //! @param[in] theWireRefIds new wire reference identifiers Standard_EXPORT void SetFaceWireRefs( const BRepGraph_FaceId theFaceId, const NCollection_Array1& theWireRefIds); //! Replace the face reference list of a shell with a new set. //! @param[in] theShellId shell identifier //! @param[in] theFaceRefIds new face reference identifiers Standard_EXPORT void SetShellFaceRefs( const BRepGraph_ShellId theShellId, const NCollection_Array1& theFaceRefIds); //! Replace the shell reference list of a solid with a new set. //! @param[in] theSolidId solid identifier //! @param[in] theShellRefIds new shell reference identifiers Standard_EXPORT void SetSolidShellRefs( const BRepGraph_SolidId theSolidId, const NCollection_Array1& theShellRefIds); //! Replace the solid reference list of a compsolid with a new set. //! @param[in] theCompSolidId compsolid identifier //! @param[in] theSolidRefIds new solid reference identifiers Standard_EXPORT void SetCompSolidSolidRefs( const BRepGraph_CompSolidId theCompSolidId, const NCollection_Array1& theSolidRefIds); //! Replace the child reference list of a compound with a new set. //! @param[in] theCompoundId compound identifier //! @param[in] theChildRefIds new child reference identifiers Standard_EXPORT void SetCompoundChildRefs( const BRepGraph_CompoundId theCompoundId, const NCollection_Array1& theChildRefIds); //! Replace the occurrence reference list of a product with a new set. //! @param[in] theProductId product identifier //! @param[in] theOccurrenceRefIds new occurrence reference identifiers Standard_EXPORT void SetProductOccurrenceRefs( const BRepGraph_ProductId theProductId, const NCollection_Array1& theOccurrenceRefIds); //! Return the BaseRef portion of any ref entry by generic RefId. //! @param[in] theRefId generic reference identifier //! @return const reference to the BaseRef base of the ref entry [[nodiscard]] Standard_EXPORT const BRepGraphInc::BaseRef& BaseRef( const BRepGraph_RefId theRefId) const; //! Return the mutable BaseRef portion of any ref entry by generic RefId. //! @param[in] theRefId generic reference identifier //! @return mutable pointer to the BaseRef base of the ref entry, or nullptr if not found [[nodiscard]] Standard_EXPORT BRepGraphInc::BaseRef* ChangeBaseRef( const BRepGraph_RefId theRefId); //! Resolve an active node UID through storage reverse maps. [[nodiscard]] Standard_EXPORT BRepGraph_NodeId FindNodeIdByUID(const BRepGraph_UID& theUID) const; //! Resolve an active reference UID through storage reverse maps. [[nodiscard]] Standard_EXPORT BRepGraph_RefId FindRefIdByUID(const BRepGraph_RefUID& theUID) const; //! Returns the node id bound to the given shape definition key, or invalid if not bound. [[nodiscard]] Standard_EXPORT BRepGraph_NodeId FindDefinitionByShape(const TopoDS_Shape& theShape) const; //! Returns true if the given shape definition key is bound to a node. [[nodiscard]] Standard_EXPORT bool HasShapeBinding(const TopoDS_Shape& theShape) const; //! Set or update the shape-to-node binding. Uses replacement semantics: //! binds if absent, updates if already bound. Standard_EXPORT void SetDefinitionShapeBinding(const TopoDS_Shape& theShape, const BRepGraph_NodeId theNodeId); //! Remove the shape-to-node binding only if it points to the expected node. //! Returns true if the binding was removed. Standard_EXPORT bool RemoveDefinitionShapeBinding(const TopoDS_Shape& theShape, const BRepGraph_NodeId theExpectedNodeId); //! Back-reference to the construction-time `TopoDS_Shape` key a node was built from. //! Only populated during graph construction; absent bindings are a valid state. //! Returns the original shape for the given node id, or a null shape if not bound. [[nodiscard]] Standard_EXPORT TopoDS_Shape FindOriginal(const BRepGraph_NodeId theNodeId) const; //! Returns true if the given node id has an original shape binding. [[nodiscard]] Standard_EXPORT bool HasOriginal(const BRepGraph_NodeId theNodeId) const; //! Binds the given node id to its construction-time shape key. Standard_EXPORT void BindOriginal(const BRepGraph_NodeId theNodeId, const TopoDS_Shape& theShape); //! Removes the original shape binding for the given node id. Standard_EXPORT void UnBindOriginal(const BRepGraph_NodeId theNodeId); //! Iterate all shape-to-NodeId bindings, invoking theFunc(shape, NodeId) for each entry. //! Used by Compact to rebuild the map after the rebuild-and-swap. template void ForEachShapeBinding(FuncT&& theFunc) const { std::shared_lock aLock(myShapeBindingsMutex); for (NCollection_FlatDataMap::Iterator anIt(myShapeToNodeId); anIt.More(); anIt.Next()) { theFunc(anIt.Key(), anIt.Value()); } } //! Iterate all NodeId-to-OriginalShape bindings, invoking theFunc(NodeId, Shape) for each entry. //! Used by Compact to rebuild the map after the rebuild-and-swap. template void ForEachOriginalBinding(FuncT&& theFunc) const { std::shared_lock aLock(myShapeBindingsMutex); for (NCollection_FlatDataMap::Iterator anIt(myOriginalShapes); anIt.More(); anIt.Next()) { theFunc(anIt.Key(), anIt.Value()); } } //! Copy shape-to-NodeId and Original shape bindings from another storage. //! Used by identity copy to preserve shape reconstruction bindings. Standard_EXPORT void CopyShapeBindingsFrom(const BRepGraphInc_Storage& theSource); //! Return the generation-validated node-to-shape reconstruction cache. [[nodiscard]] const NCollection_FlatDataMap& CurrentShapes() const { return myCurrentShapes; } //! Return the mutable generation-validated node-to-shape reconstruction cache. NCollection_FlatDataMap& ChangeCurrentShapes() { return myCurrentShapes; } //! Return the mutex protecting the reconstruction cache. [[nodiscard]] std::shared_mutex& CurrentShapesMutex() const { return myCurrentShapesMutex; } //! Clear the generation-validated shape reconstruction cache. Standard_EXPORT void ClearCurrentShapes(); //! Remove one entry from the generation-validated shape reconstruction cache. Standard_EXPORT void UnbindCurrentShape(const BRepGraph_NodeId theNode); //! Clear deferred invalidation queues and release their batch allocator. Standard_EXPORT void ClearDeferredQueues(); //! Clear all storage. Standard_EXPORT void Clear(); //! Prepare fixed-size destination ranges for indexed load. //! //! This is an internal backend preparation API intended for persistence read //! paths that know final section sizes in advance. It clears previous content, //! pre-sizes defs/refs/reps and UID vectors, and initializes relation tables //! exactly once. The load path then restores serialized relation lists and //! calls RebuildDerivedRelations() once to refresh derived incoming maps. //! @param theCounts final per-section slot counts. Standard_EXPORT void PrepareForLoad(const BRepGraphInc_Load::Counts& theCounts); //! Override active-slot counters after a trusted indexed load path. //! //! This is intended for persistence backends that already touched every slot //! during load and therefore know exact active counts without rescanning //! storage after relation construction. //! @param theCounts trusted active per-section counts. Standard_EXPORT void SetActiveCounts(const BRepGraphInc_Load::Counts& theCounts); //! Build a Counts struct from current allocated slot counts. [[nodiscard]] Standard_EXPORT BRepGraphInc_Load::Counts Counts() const; //! Build a Counts struct from current active (non-removed) counts. [[nodiscard]] Standard_EXPORT BRepGraphInc_Load::Counts ActiveCounts() const; //! Recount active-slot counters from current `IsRemoved` flags without rebuilding indexes. Standard_EXPORT void RecountActiveCounts(); //! Rebuild centralized relation tables from entity and reference endpoints. //! This is intended for raw load, compact, and explicit repair paths only; //! editor mutations maintain relation containers incrementally. Standard_EXPORT void RebuildDerivedRelations(); //! Rebuild relation maps after a trusted load already restored active counts. Standard_EXPORT void RebuildDerivedRelationsPreservingActiveCounts(); //! Bulk-copy all RemovedFlags bit-planes from theSource. //! Source must have been loaded with the same entity counts (identity copy path). Standard_EXPORT void CopyRemovedFlagsFrom(const BRepGraphInc_Storage& theSource); //! Debug: verify relation-table consistency against entity/reference endpoints. //! @return true if all relations are consistent Standard_EXPORT bool ValidateRelations() const; //! Verify coedge ordering consistency for a specific wire. //! @param[in] theWireId wire identifier //! @return true if the coedge order is valid Standard_EXPORT bool ValidateWireCoEdgeOrder(const BRepGraph_WireId theWireId) const; //! Verify coedge ordering consistency for all wires. //! @return true if all wire coedge orders are valid Standard_EXPORT bool ValidateWireCoEdgeOrders() const; //! Result of wire coedge order canonicalization. enum class WireCoEdgeOrderStatus { Connected, //!< Stored order was already connected. Reordered, //!< Stored coedges were reordered into an exactly connected chain. ToleranceOrdered, //!< Stored coedges were ordered using tolerance-equivalent endpoints. Partial, //!< Stored coedges were grouped into best-effort connected runs. InvalidInput //!< Wire or coedge ownership/input data is invalid. }; //! Canonicalize the coedge ordering of a wire and report the achieved order quality. //! @param[in] theWireId wire identifier //! @return canonicalization status Standard_EXPORT WireCoEdgeOrderStatus CanonicalizeWireCoEdgeOrderStatus(const BRepGraph_WireId theWireId); //! Canonicalize the coedge ordering of a wire to a consistent form. //! @param[in] theWireId wire identifier //! @return true if canonicalization succeeded Standard_EXPORT bool CanonicalizeWireCoEdgeOrder(const BRepGraph_WireId theWireId); //! Rebuild UID reverse indexes (UID->NodeId, RefUID->RefId) //! from the current UID vectors. Clears indexes and resets allocators before rebuilding. //! Called after Compact, Load, etc. where UID vectors have been modified externally. Standard_EXPORT void RebuildUIDReverseIndexes(); //! Mark UID reverse indexes stale after bulk UID-vector replacement. Standard_EXPORT void MarkUIDReverseIndexesDirty(); //! Lazily rebuild the node UID reverse index if it is stale. Standard_EXPORT void EnsureUIDReverseIndex() const; //! Lazily rebuild the reference UID reverse index if it is stale. Standard_EXPORT void EnsureRefUIDReverseIndex() const; //! Copy all forward/reverse relation vectors directly from theSource. //! Used by identity copy to avoid the clear+rebuild cycle. Standard_EXPORT void CopyDerivedRelationsFrom(const BRepGraphInc_Storage& theSource); private: friend class BRepGraphInc_Populate; friend class BRepGraph; Standard_EXPORT void ClearStorageForReuse(); Standard_EXPORT void ClearUIDIndexes(); Standard_EXPORT void ClearShapeCache(); Standard_EXPORT void ClearRelations(); BRepGraphInc::FaceRelations& ChangeFaceRelationsInternal(const BRepGraph_FaceId theId) { return myFaceRelations.ChangeValue(static_cast(theId.Index)); } BRepGraphInc::WireRelations& ChangeWireRelationsInternal(const BRepGraph_WireId theId) { return myWireRelations.ChangeValue(static_cast(theId.Index)); } BRepGraphInc::EdgeRelations& ChangeEdgeRelationsInternal(const BRepGraph_EdgeId theId) { return myEdgeRelations.ChangeValue(static_cast(theId.Index)); } BRepGraphInc::ShellRelations& ChangeShellRelationsInternal(const BRepGraph_ShellId theId) { return myShellRelations.ChangeValue(static_cast(theId.Index)); } BRepGraphInc::SolidRelations& ChangeSolidRelationsInternal(const BRepGraph_SolidId theId) { return mySolidRelations.ChangeValue(static_cast(theId.Index)); } BRepGraphInc::CompoundRelations& ChangeCompoundRelationsInternal(const BRepGraph_CompoundId theId) { return myCompoundRelations.ChangeValue(static_cast(theId.Index)); } BRepGraphInc::CompSolidRelations& ChangeCompSolidRelationsInternal( const BRepGraph_CompSolidId theId) { return myCompSolidRelations.ChangeValue(static_cast(theId.Index)); } BRepGraphInc::VertexRelations& ChangeVertexRelationsInternal(const BRepGraph_VertexId theId) { return myVertexRelations.ChangeValue(static_cast(theId.Index)); } BRepGraphInc::ProductRelations& ChangeProductRelationsInternal(const BRepGraph_ProductId theId) { return myProductRelations.ChangeValue(static_cast(theId.Index)); } BRepGraphInc::OccurrenceRelations& ChangeOccurrenceRelationsInternal( const BRepGraph_OccurrenceId theId) { return myOccurrenceRelations.ChangeValue(static_cast(theId.Index)); } Standard_EXPORT NCollection_LinearVector& ChangeCompoundRefsOfNodeInternal( const BRepGraph_NodeId theNode); Standard_EXPORT NCollection_LinearVector& ChangeOccurrenceRefsOfNodeInternal(const BRepGraph_NodeId theNode); Standard_EXPORT void rebuildDerivedRelationsInternal(const bool theRecountActiveCounts); //! Return true if the typed entity has at least one parent compound (internal). template [[nodiscard]] bool HasCompoundParentTyped(const T theId) const; //! Set or clear the "has parent compound" flag for a typed entity (internal). template void SetHasCompoundParentTyped(const T theId, const bool theVal); //! Return true if the typed entity has at least one parent occurrence (internal). template [[nodiscard]] bool HasOccurrenceParentTyped(const T theId) const; //! Set or clear the "has parent occurrence" flag for a typed entity (internal). template void SetHasOccurrenceParentTyped(const T theId, const bool theVal); //! Set or clear the "has parent compound" flag for a generic NodeId (internal dispatch). Standard_EXPORT void SetHasCompoundParent(const BRepGraph_NodeId theNode, bool theVal); //! Set or clear the "has parent occurrence" flag for a generic NodeId (internal dispatch). Standard_EXPORT void SetHasOccurrenceParent(const BRepGraph_NodeId theNode, bool theVal); //! Template store for topology entity kinds. template struct DefStore { using TypeId = typename EntityT::TypeId; using ValueType = EntityT; //! Entity representations stored by typed id index. NCollection_DynamicArray Entities; //! Bit-flag plane for soft-removal status. BRepGraphInc_BitFlags RemovedFlags; //! Bit-flag plane for ownership status. BRepGraphInc_BitFlags OwnedFlags; //! Bit-flag plane for active MutGuard tracking. BRepGraphInc_BitFlags GuardFlags; //! Bit-flag plane: node has at least one parent compound (ChildRef). BRepGraphInc_BitFlags HasCompoundParentFlags; //! Bit-flag plane: node has at least one parent occurrence (OccurrenceRef). BRepGraphInc_BitFlags HasOccurrenceParentFlags; //! Number of non-removed entities currently present in the store. uint32_t NbActive = 0; //! Per-kind monotonic UID counter. Valid UIDs start at 1. std::atomic NextUIDCounter{1}; DefStore() = delete; DefStore(const int theBlockSize, const occ::handle& theAlloc) : Entities(theBlockSize, theAlloc) { } uint32_t Nb() const { return static_cast(Entities.Size()); } const EntityT& Get(const TypeId theId) const { return Entities.Value(static_cast(theId.Index)); } EntityT& Change(const TypeId theId) { return Entities.ChangeValue(static_cast(theId.Index)); } //! Append a default-constructed entity and return its typed slot id. TypeId Append() { const TypeId anId(static_cast(Entities.Size())); ++NbActive; Entities.Appended(); RemovedFlags.Resize(static_cast(anId.Index) + 1); OwnedFlags.Resize(static_cast(anId.Index) + 1); GuardFlags.Resize(static_cast(anId.Index) + 1); HasCompoundParentFlags.Resize(static_cast(anId.Index) + 1); HasOccurrenceParentFlags.Resize(static_cast(anId.Index) + 1); return anId; } void DecrementActive() { Standard_ASSERT_VOID(NbActive > 0u, "DefStore::DecrementActive: underflow"); if (NbActive > 0u) { --NbActive; } } bool MarkRemoved(const TypeId theId) { if (!theId.IsValid(Nb())) { return false; } if (RemovedFlags.Test(theId.Index)) { return false; } RemovedFlags.Set(theId.Index); DecrementActive(); return true; } void Clear(const bool theReleaseMemory = false) { Entities.Clear(theReleaseMemory); RemovedFlags.ClearAll(); OwnedFlags.ClearAll(); GuardFlags.ClearAll(); HasCompoundParentFlags.ClearAll(); HasOccurrenceParentFlags.ClearAll(); NbActive = 0; // Note: NextUIDCounter is NOT reset. UIDs stay monotonic across Clear() cycles. // Generation + GraphGUID protect against stale UID aliasing. } }; //! Template store for transitional reference kinds. template struct RefStore { using TypeId = typename RefT::TypeId; using ValueType = RefT; //! Reference representations stored by typed id index. NCollection_DynamicArray Refs; //! Bit-flag plane for soft-removal status. BRepGraphInc_BitFlags RemovedFlags; //! Bit-flag plane for ownership status. BRepGraphInc_BitFlags OwnedFlags; //! Bit-flag plane for active MutGuard tracking. BRepGraphInc_BitFlags GuardFlags; //! Bit-flag plane: ref has at least one parent compound (unused for refs, kept for macro //! uniformity). BRepGraphInc_BitFlags HasCompoundParentFlags; //! Bit-flag plane: ref has at least one parent occurrence (unused for refs, kept for macro //! uniformity). BRepGraphInc_BitFlags HasOccurrenceParentFlags; //! Number of non-removed references currently present in the store. uint32_t NbActive = 0; //! Per-kind monotonic UID counter. Valid UIDs start at 1. std::atomic NextUIDCounter{1}; RefStore() = delete; RefStore(const int theBlockSize, const occ::handle& theAlloc) : Refs(theBlockSize, theAlloc) { } uint32_t Nb() const { return static_cast(Refs.Size()); } const RefT& Get(const TypeId theId) const { return Refs.Value(static_cast(theId.Index)); } RefT& Change(const TypeId theId) { return Refs.ChangeValue(static_cast(theId.Index)); } //! Append a default-constructed ref entry and return its typed slot id. TypeId Append() { const TypeId anId(static_cast(Refs.Size())); ++NbActive; Refs.Appended(); RemovedFlags.Resize(static_cast(anId.Index) + 1); OwnedFlags.Resize(static_cast(anId.Index) + 1); GuardFlags.Resize(static_cast(anId.Index) + 1); HasCompoundParentFlags.Resize(static_cast(anId.Index) + 1); HasOccurrenceParentFlags.Resize(static_cast(anId.Index) + 1); return anId; } void DecrementActive() { Standard_ASSERT_VOID(NbActive > 0u, "RefStore::DecrementActive: underflow"); if (NbActive > 0u) { --NbActive; } } bool MarkRemoved(const TypeId theId) { if (!theId.IsValid(Nb())) { return false; } if (RemovedFlags.Test(theId.Index)) { return false; } RemovedFlags.Set(theId.Index); DecrementActive(); return true; } void Clear(const bool theReleaseMemory = false) { Refs.Clear(theReleaseMemory); RemovedFlags.ClearAll(); OwnedFlags.ClearAll(); GuardFlags.ClearAll(); HasCompoundParentFlags.ClearAll(); HasOccurrenceParentFlags.ClearAll(); NbActive = 0; // Note: NextUIDCounter is NOT reset. UIDs stay monotonic across Clear() cycles. } }; //! Primary allocator for backend arrays, stores, and transient backend maps. occ::handle myAllocator = new NCollection_IncAllocator; //! Backend-owned root products and deferred invalidation queues. NCollection_LinearVector myRootProductIds; NCollection_LinearVector myDeferredModified; NCollection_LinearVector myDeferredRefModified; //! Vertex definition store. DefStore myVertices; //! Edge definition store. DefStore myEdges; //! Coedge definition store. DefStore myCoEdges; //! Wire definition store. DefStore myWires; //! Face definition store. DefStore myFaces; //! Shell definition store. DefStore myShells; //! Solid definition store. DefStore mySolids; //! Compound definition store. DefStore myCompounds; //! CompSolid definition store. DefStore myCompSolids; //! Product definition store. DefStore myProducts; //! Occurrence definition store. DefStore myOccurrences; //! Shell reference store. RefStore myShellRefs; //! Face reference store. RefStore myFaceRefs; //! Wire reference store. RefStore myWireRefs; //! Vertex reference store. RefStore myVertexRefs; //! Solid reference store. RefStore mySolidRefs; //! Child reference store. RefStore myChildRefs; //! Occurrence reference store. RefStore myOccurrenceRefs; //! Centralized relation tables parallel to entity stores. NCollection_DynamicArray myFaceRelations; NCollection_DynamicArray myWireRelations; NCollection_DynamicArray myEdgeRelations; NCollection_DynamicArray myShellRelations; NCollection_DynamicArray mySolidRelations; NCollection_DynamicArray myCompoundRelations; NCollection_DynamicArray myCompSolidRelations; NCollection_DynamicArray myVertexRelations; NCollection_DynamicArray myProductRelations; NCollection_DynamicArray myOccurrenceRelations; //! Sparse incoming compound child refs keyed by referenced node. NCollection_DataMap> myNodeToCompounds; //! Sparse incoming product occurrence refs keyed by occurrence child node. NCollection_DataMap> myNodeToOccurrences; //! Representation-use store with removal tracking. template struct RepStore { using TypeId = typename UseT::TypeId; NCollection_DynamicArray Uses; BRepGraphInc_BitFlags RemovedFlags; uint32_t NbActive = 0; RepStore() = delete; RepStore(const int theBlockSize, const occ::handle& theAlloc) : Uses(theBlockSize, theAlloc) { } uint32_t Nb() const { return static_cast(Uses.Size()); } const UseT& Get(const TypeId theId) const { return Uses.Value(static_cast(theId.Index)); } UseT& Change(const TypeId theId) { return Uses.ChangeValue(static_cast(theId.Index)); } TypeId Append() { const TypeId anId(static_cast(Uses.Size())); ++NbActive; Uses.Appended(); RemovedFlags.Resize(static_cast(anId.Index) + 1); return anId; } void DecrementActive() { Standard_ASSERT_VOID(NbActive > 0u, "RepStore::DecrementActive: underflow"); if (NbActive > 0u) { --NbActive; } } bool MarkRemoved(const TypeId theId) { if (!theId.IsValid(Nb())) { return false; } if (RemovedFlags.Test(theId.Index)) { return false; } RemovedFlags.Set(theId.Index); DecrementActive(); return true; } bool IsRemoved(const TypeId theId) const { return theId.IsValid(Nb()) && RemovedFlags.Test(theId.Index); } void Clear(const bool theReleaseMemory = false) { Uses.Clear(theReleaseMemory); RemovedFlags.ClearAll(); NbActive = 0; } }; //! Edge 3D curve use store. RepStore myEdgeCurves3D; //! Edge 3D polygon use store. RepStore myEdgePolygons3D; //! CoEdge 2D curve use store. RepStore myCoEdgeCurves2D; //! CoEdge 2D polygon use store. RepStore myCoEdgePolygons2D; //! CoEdge polygon-on-triangulation use store. RepStore myCoEdgePolygonsOnTri; //! Face surface use store. RepStore myFaceSurfaces; //! Face triangulation use store. RepStore myFaceTriangulations; //! UID reverse indexes: eagerly maintained on allocate/remove, rebuilt on compact/load. mutable NCollection_FlatDataMap myUIDToNodeId; mutable std::shared_mutex myUIDToNodeIdMutex; mutable NCollection_FlatDataMap myRefUIDToRefId; mutable std::shared_mutex myRefUIDToRefIdMutex; mutable std::atomic myUIDToNodeIdDirty{false}; mutable std::atomic myRefUIDToRefIdDirty{false}; //! Bindings from reconstructed / source OCCT shapes back to backend ids. NCollection_FlatDataMap myShapeToNodeId; NCollection_FlatDataMap myOriginalShapes; mutable std::shared_mutex myShapeBindingsMutex; //! Persistent backend identity state. std::atomic myGeneration{0}; Standard_GUID myGraphGUID; //! Transient mutation-control state used by EditorView invalidation paths. std::atomic myDeferredMode{false}; std::atomic myPropagationWave{0}; uint32_t myRemoveSubgraphDepth = 0; //! Transient generation-validated shape reconstruction cache. mutable NCollection_FlatDataMap myCurrentShapes; mutable std::shared_mutex myCurrentShapesMutex; private: //! Trait mapping a typed identifier to its store's bit-flag planes. //! One specialization per typed ID type provides O(1) compile-time dispatch. template struct TypedStorePlanes; template friend struct TypedStorePlanes; template [[nodiscard]] bool isInRange(const T theId) const; template [[nodiscard]] bool dispatchItemId(const BRepGraph_ItemId& theId, FuncT&& theFunc) const; public: //! Return true if the entity identified by the given typed ID is soft-removed. //! @param[in] theId typed entity identifier template [[nodiscard]] bool IsRemoved(const T theId) const; //! Set or clear the soft-removal flag for the entity identified by the given typed ID. //! @param[in] theId typed entity identifier //! @param[in] theVal true to mark removed, false to mark active template void SetRemoved(const T theId, const bool theVal); //! Return true if the entity identified by the given typed ID has a registered owner. //! @param[in] theId typed entity identifier template [[nodiscard]] bool IsOwned(const T theId) const; //! Set or clear the ownership flag for the entity identified by the given typed ID. //! @param[in] theId typed entity identifier //! @param[in] theVal true to mark owned, false to mark unowned template void SetOwned(const T theId, const bool theVal); //! Return true if the entity identified by the given typed ID has an active MutGuard. //! @param[in] theId typed entity identifier template [[nodiscard]] bool IsGuarded(const T theId) const; //! Register an active MutGuard on the entity identified by the given typed ID. //! @param[in] theId typed entity identifier template void SetGuarded(const T theId); //! Deregister an active MutGuard from the entity identified by the given typed ID. //! @param[in] theId typed entity identifier template void ClearGuarded(const T theId); //! Return true if the node identified by the given generic NodeId has a parent compound. //! Dispatches by node kind to the appropriate per-kind bitset. //! @param[in] theNode generic node identifier [[nodiscard]] Standard_EXPORT bool HasCompoundParent(const BRepGraph_NodeId theNode) const; //! Return true if the node identified by the given generic NodeId has a parent occurrence. //! Dispatches by node kind to the appropriate per-kind bitset. //! @param[in] theNode generic node identifier [[nodiscard]] Standard_EXPORT bool HasOccurrenceParent(const BRepGraph_NodeId theNode) const; //! Return true if the entity identified by the given generic item id has an active MutGuard. //! @param[in] theId generic item identifier (node, reference, or representation) [[nodiscard]] bool IsGuarded(const BRepGraph_ItemId& theId) const; //! Register an active MutGuard on the entity identified by the given generic item id. //! @param[in] theId generic item identifier (node, reference, or representation) void SetGuarded(const BRepGraph_ItemId& theId); //! Deregister an active MutGuard from the entity identified by the given generic item id. //! @param[in] theId generic item identifier (node, reference, or representation) void ClearGuarded(const BRepGraph_ItemId& theId); //! Return true if any entity in any store has an active MutGuard. //! Used to assert no guards are active before Clear(). [[nodiscard]] Standard_EXPORT bool HasAnyGuard() const; }; #include "BRepGraphInc_Storage.lxx" #endif // _BRepGraphInc_Storage_HeaderFile