From 6fa8bba4fd2cf557e6c6db6cccb5f99604db7aac Mon Sep 17 00:00:00 2001 From: "Zheng, Lei" Date: Tue, 20 Apr 2021 05:24:17 +0800 Subject: [PATCH] Part/Sketcher: change geometry extensions APIs for topo naming support --- src/Mod/Part/App/Geometry.cpp | 2 -- .../Part/App/GeometryMigrationExtension.cpp | 5 ++++ src/Mod/Part/App/GeometryMigrationExtension.h | 25 ++++++++++++++++--- .../Sketcher/App/ExternalGeometryExtension.h | 11 ++++++++ .../Sketcher/App/ExternalGeometryFacade.cpp | 21 ++++++++++++++-- src/Mod/Sketcher/App/ExternalGeometryFacade.h | 9 ++++++- src/Mod/Sketcher/App/GeometryFacade.cpp | 12 +++++++++ src/Mod/Sketcher/App/GeometryFacade.h | 2 ++ .../Sketcher/App/SketchGeometryExtension.cpp | 18 ++++++++++--- .../Sketcher/App/SketchGeometryExtension.h | 2 +- 10 files changed, 94 insertions(+), 13 deletions(-) diff --git a/src/Mod/Part/App/Geometry.cpp b/src/Mod/Part/App/Geometry.cpp index 16159134bb..bf9a6f91ee 100644 --- a/src/Mod/Part/App/Geometry.cpp +++ b/src/Mod/Part/App/Geometry.cpp @@ -338,9 +338,7 @@ void Geometry::Restore(Base::XMLReader &reader) auto ext = std::static_pointer_cast(this->getExtension(GeometryMigrationExtension::getClassTypeId()).lock()); - ext->setMigrationType(GeometryMigrationExtension::Construction); ext->setConstruction(construction); - } } diff --git a/src/Mod/Part/App/GeometryMigrationExtension.cpp b/src/Mod/Part/App/GeometryMigrationExtension.cpp index b39c635a96..229b1e75f1 100644 --- a/src/Mod/Part/App/GeometryMigrationExtension.cpp +++ b/src/Mod/Part/App/GeometryMigrationExtension.cpp @@ -42,6 +42,11 @@ void GeometryMigrationExtension::copyAttributes(Part::GeometryExtension * cpy) c Part::GeometryExtension::copyAttributes(cpy); static_cast(cpy)->ConstructionState = this->ConstructionState; static_cast(cpy)->GeometryMigrationFlags = this->GeometryMigrationFlags; + + static_cast(cpy)->Id = this->Id; + static_cast(cpy)->Flags = this->Flags; + static_cast(cpy)->Ref = this->Ref; + static_cast(cpy)->RefIndex = this->RefIndex; } std::unique_ptr GeometryMigrationExtension::copy(void) const diff --git a/src/Mod/Part/App/GeometryMigrationExtension.h b/src/Mod/Part/App/GeometryMigrationExtension.h index 77f03546af..0b5ea21afd 100644 --- a/src/Mod/Part/App/GeometryMigrationExtension.h +++ b/src/Mod/Part/App/GeometryMigrationExtension.h @@ -48,6 +48,8 @@ public: enum MigrationType { None = 0, Construction = 1, + GeometryId = 2, + ExternalReference = 3, NumMigrationType // Must be the last }; @@ -60,12 +62,26 @@ public: virtual bool getConstruction() const {return ConstructionState;} - virtual void setConstruction(bool construction) {ConstructionState = construction;} + virtual void setConstruction(bool construction) + {ConstructionState = construction; setMigrationType(Construction);} + + long getId() const {return Id;} + void setId(long id) {Id = id; setMigrationType(GeometryId);} + + const std::string &getRef() const {return Ref;} + int getRefIndex() const {return RefIndex;} + unsigned long getFlags() const {return Flags;} + void setReference(const char *ref, int index, unsigned long flags) { + Ref = ref ? ref : ""; + RefIndex = index; + Flags = flags; + setMigrationType(ExternalReference); + } virtual bool testMigrationType(int flag) const { return GeometryMigrationFlags.test((size_t)(flag)); }; - virtual void setMigrationType(int flag, bool v=true) { GeometryMigrationFlags.set((size_t)(flag), v); }; protected: + virtual void setMigrationType(int flag, bool v=true) { GeometryMigrationFlags.set((size_t)(flag), v); }; virtual void copyAttributes(Part::GeometryExtension * cpy) const override; private: @@ -75,7 +91,10 @@ private: using MigrationTypeFlagType = std::bitset<32>; MigrationTypeFlagType GeometryMigrationFlags; bool ConstructionState; - + long Id = 0; + int RefIndex = -1; + unsigned long Flags = 0; + std::string Ref; }; } //namespace Part diff --git a/src/Mod/Sketcher/App/ExternalGeometryExtension.h b/src/Mod/Sketcher/App/ExternalGeometryExtension.h index 1c0422996f..ba8b4fcdc3 100644 --- a/src/Mod/Sketcher/App/ExternalGeometryExtension.h +++ b/src/Mod/Sketcher/App/ExternalGeometryExtension.h @@ -38,6 +38,8 @@ public: // START_CREDIT_BLOCK: Credit under LGPL for this block to Zheng, Lei (realthunder) virtual bool testFlag(int flag) const = 0; virtual void setFlag(int flag, bool v=true) = 0; + virtual unsigned long getFlags() const = 0; + virtual void setFlags(unsigned long flags) = 0; // END_CREDIT_BLOCK: Credit under LGPL for this block to Zheng, Lei (realthunder) virtual bool isClear() const = 0; @@ -45,6 +47,9 @@ public: virtual const std::string& getRef() const = 0; virtual void setRef(const std::string & ref) = 0; + + virtual int getRefIndex() const = 0; + virtual void setRefIndex(int index) = 0; }; class SketcherExport ExternalGeometryExtension : public Part::GeometryPersistenceExtension, private ISketchExternalGeometryExtension @@ -75,6 +80,8 @@ public: // START_CREDIT_BLOCK: Credit under LGPL for this block to Zheng, Lei (realthunder) virtual bool testFlag(int flag) const override { return Flags.test((size_t)(flag)); } virtual void setFlag(int flag, bool v=true) override { Flags.set((size_t)(flag),v); } + virtual unsigned long getFlags() const override { return Flags.to_ulong(); } + virtual void setFlags(unsigned long flags) override { Flags = flags; } // END_CREDIT_BLOCK: Credit under LGPL for this block to Zheng, Lei (realthunder) virtual bool isClear() const override {return Flags.none();} @@ -83,6 +90,9 @@ public: virtual const std::string& getRef() const override {return Ref;} virtual void setRef(const std::string & ref) override {Ref = ref;} + virtual int getRefIndex() const override {return RefIndex;} + virtual void setRefIndex(int index) override {RefIndex = index;} + static bool getFlagsFromName(std::string str, ExternalGeometryExtension::Flag &flag); protected: @@ -97,6 +107,7 @@ private: using FlagType = std::bitset<32>; // START_CREDIT_BLOCK: Credit under LGPL for this block to Zheng, Lei (realthunder) std::string Ref; + int RefIndex = -1; FlagType Flags; // END_CREDIT_BLOCK: Credit under LGPL for this block to Zheng, Lei (realthunder) diff --git a/src/Mod/Sketcher/App/ExternalGeometryFacade.cpp b/src/Mod/Sketcher/App/ExternalGeometryFacade.cpp index a60d60e464..c7edeaaf59 100644 --- a/src/Mod/Sketcher/App/ExternalGeometryFacade.cpp +++ b/src/Mod/Sketcher/App/ExternalGeometryFacade.cpp @@ -34,6 +34,8 @@ #include "ExternalGeometryFacadePy.h" +FC_LOG_LEVEL_INIT("Sketch", true, true); + using namespace Sketcher; TYPESYSTEM_SOURCE(Sketcher::ExternalGeometryFacade,Base::BaseClass) @@ -84,14 +86,14 @@ void ExternalGeometryFacade::initExtensions() getGeo()->setExtension(std::make_unique()); // Create getExtension - Base::Console().Warning("%s\nSketcher External Geometry without Geometry Extension: %s \n", boost::uuids::to_string(Geo->getTag()).c_str()); + // Base::Console().Warning("%s\nSketcher External Geometry without Geometry Extension: %s \n", boost::uuids::to_string(Geo->getTag()).c_str()); } if(!Geo->hasExtension(ExternalGeometryExtension::getClassTypeId())) { getGeo()->setExtension(std::make_unique()); // Create getExtension - Base::Console().Warning("%s\nSketcher External Geometry without ExternalGeometryExtension: %s \n", boost::uuids::to_string(Geo->getTag()).c_str()); + // Base::Console().Warning("%s\nSketcher External Geometry without ExternalGeometryExtension: %s \n", boost::uuids::to_string(Geo->getTag()).c_str()); } SketchGeoExtension = @@ -140,6 +142,21 @@ void ExternalGeometryFacade::copyId(const Part::Geometry * src, Part::Geometry * gfdst->setId(gfsrc->getId()); } +void ExternalGeometryFacade::copyFlags(const Part::Geometry * src, Part::Geometry * dst) +{ + auto gfsrc = ExternalGeometryFacade::getFacade(src); + auto gfdst = ExternalGeometryFacade::getFacade(dst); + gfdst->setFlags(gfsrc->getFlags()); +} + +void ExternalGeometryFacade::setRef(const std::string &ref) +{ + if (ref.size() && getId() < 0) + FC_ERR("Cannot set reference on root geometries"); + else + getExternalGeoExt()->setRef(ref); +} + PyObject * ExternalGeometryFacade::getPyObject(void) { return new ExternalGeometryFacadePy(new ExternalGeometryFacade(this->Geo)); diff --git a/src/Mod/Sketcher/App/ExternalGeometryFacade.h b/src/Mod/Sketcher/App/ExternalGeometryFacade.h index 8db4252fa3..fc10df316c 100644 --- a/src/Mod/Sketcher/App/ExternalGeometryFacade.h +++ b/src/Mod/Sketcher/App/ExternalGeometryFacade.h @@ -66,6 +66,7 @@ public: // Factory methods public: // Utility methods static void ensureSketchGeometryExtensions(Part::Geometry * geometry); static void copyId(const Part::Geometry * src, Part::Geometry * dst); + static void copyFlags(const Part::Geometry * src, Part::Geometry * dst); public: void setGeometry(Part::Geometry *geometry); @@ -74,11 +75,17 @@ public: virtual bool testFlag(int flag) const override { return getExternalGeoExt()->testFlag(flag); } virtual void setFlag(int flag, bool v=true) override { getExternalGeoExt()->setFlag(flag, v); } + virtual unsigned long getFlags() const override { return getExternalGeoExt()->getFlags(); } + virtual void setFlags(unsigned long flags) override { getExternalGeoExt()->setFlags(flags); } + virtual bool isClear() const override {return getExternalGeoExt()->isClear();} virtual size_t flagSize() const override {return getExternalGeoExt()->flagSize();} virtual const std::string& getRef() const override {return getExternalGeoExt()->getRef();} - virtual void setRef(const std::string & ref) override {getExternalGeoExt()->setRef(ref);} + virtual void setRef(const std::string & ref) override; + + virtual int getRefIndex() const override {return getExternalGeoExt()->getRefIndex();} + virtual void setRefIndex(int index) override {getExternalGeoExt()->setRefIndex(index);} /** GeometryExtension Interface **/ inline virtual long getId() const override {return getGeoExt()->getId();} diff --git a/src/Mod/Sketcher/App/GeometryFacade.cpp b/src/Mod/Sketcher/App/GeometryFacade.cpp index e86baed471..0421ee31b3 100644 --- a/src/Mod/Sketcher/App/GeometryFacade.cpp +++ b/src/Mod/Sketcher/App/GeometryFacade.cpp @@ -136,6 +136,18 @@ void GeometryFacade::copyId(const Part::Geometry * src, Part::Geometry * dst) gfdst->setId(gfsrc->getId()); } +int GeometryFacade::getId(const Part::Geometry * geometry) +{ + auto gf = GeometryFacade::getFacade(geometry); + return gf->getId(); +} + +void GeometryFacade::setId(Part::Geometry * geometry, int id) +{ + auto gf = GeometryFacade::getFacade(geometry); + return gf->setId(id); +} + bool GeometryFacade::getConstruction(const Part::Geometry * geometry) { throwOnNullPtr(geometry); diff --git a/src/Mod/Sketcher/App/GeometryFacade.h b/src/Mod/Sketcher/App/GeometryFacade.h index 4ca789bdbb..1721cdf887 100644 --- a/src/Mod/Sketcher/App/GeometryFacade.h +++ b/src/Mod/Sketcher/App/GeometryFacade.h @@ -124,6 +124,8 @@ public: // Utility methods static void setConstruction(Part::Geometry * geometry, bool construction); static bool isInternalType(const Part::Geometry * geometry, InternalType::InternalType type); static bool getBlocked(const Part::Geometry * geometry); + static int getId(const Part::Geometry * geometry); + static void setId(Part::Geometry * geometry, int id); public: // Explicit deletion to show intent (not that it is needed) diff --git a/src/Mod/Sketcher/App/SketchGeometryExtension.cpp b/src/Mod/Sketcher/App/SketchGeometryExtension.cpp index 9ed69b1757..d9486198c9 100644 --- a/src/Mod/Sketcher/App/SketchGeometryExtension.cpp +++ b/src/Mod/Sketcher/App/SketchGeometryExtension.cpp @@ -70,22 +70,32 @@ void SketchGeometryExtension::restoreAttributes(Base::XMLReader &reader) Part::GeometryPersistenceExtension::restoreAttributes(reader); if(reader.hasAttribute("id")) - Id = reader.getAttributeAsInteger("id"); + this->setId(reader.getAttributeAsInteger("id")); - InternalGeometryType = (InternalType::InternalType) reader.getAttributeAsInteger("internalGeometryType"); + InternalGeometryType = (InternalType::InternalType) + reader.getAttributeAsInteger("internalGeometryType", "0"); - GeometryModeFlags = GeometryModeFlagType(reader.getAttribute("geometryModeFlags")); + if (reader.hasAttribute("geometryModeFlags")) + GeometryModeFlags = GeometryModeFlagType( + reader.getAttribute("geometryModeFlags")); if(reader.hasAttribute("geometryLayer")) GeometryLayer = reader.getAttributeAsInteger("geometryLayer"); +} +void SketchGeometryExtension::setId(long id) +{ + Id = id; + long v = _GeometryID; + while(v < Id && !_GeometryID.compare_exchange_weak(v, id)) + ; } void SketchGeometryExtension::saveAttributes(Base::Writer &writer) const { Part::GeometryPersistenceExtension::saveAttributes(writer); - writer.Stream() // << "\" id=\"" << Id // This is removed as the stored Id is not used and it may interfere with RT's future implementation + writer.Stream() << "\" id=\"" << Id << "\" internalGeometryType=\"" << (int) InternalGeometryType << "\" geometryModeFlags=\"" << GeometryModeFlags.to_string() << "\" geometryLayer=\"" << GeometryLayer; diff --git a/src/Mod/Sketcher/App/SketchGeometryExtension.h b/src/Mod/Sketcher/App/SketchGeometryExtension.h index 9276c1d849..d10e129b51 100644 --- a/src/Mod/Sketcher/App/SketchGeometryExtension.h +++ b/src/Mod/Sketcher/App/SketchGeometryExtension.h @@ -91,7 +91,7 @@ public: virtual PyObject *getPyObject(void) override; virtual long getId() const override {return Id;} - virtual void setId(long id) override {Id = id;} + virtual void setId(long id) override; virtual InternalType::InternalType getInternalType() const override {return InternalGeometryType;} virtual void setInternalType(InternalType::InternalType type) override {InternalGeometryType = type;}