Transfer in code from linkstage3

This commit is contained in:
Zheng, Lei
2024-07-18 06:38:53 -04:00
committed by bgbsww
parent ff61f56d19
commit 1972156308
11 changed files with 181 additions and 9 deletions

View File

@@ -498,6 +498,7 @@ PyMOD_INIT_FUNC(Part)
Part::GeometryBoolExtension ::init();
Part::GeometryDoubleExtension ::init();
Part::GeometryMigrationExtension ::init();
Part::GeometryMigrationPersistenceExtension ::init();
Part::Geometry ::init();
Part::GeomPoint ::init();
Part::GeomCurve ::init();

View File

@@ -29,14 +29,22 @@
using namespace Part;
TYPESYSTEM_SOURCE_ABSTRACT(Part::GeometryMigrationPersistenceExtension, Part::GeometryPersistenceExtension)
//---------- Geometry Extension
TYPESYSTEM_SOURCE(Part::GeometryMigrationExtension,Part::GeometryExtension)
void GeometryMigrationExtension::copyAttributes(Part::GeometryExtension * cpy) const
{
Part::GeometryExtension::copyAttributes(cpy);
static_cast<GeometryMigrationExtension *>(cpy)->ConstructionState = this->ConstructionState;
static_cast<GeometryMigrationExtension *>(cpy)->GeometryMigrationFlags = this->GeometryMigrationFlags;
static_cast<GeometryMigrationExtension *>(cpy)->Id = this->Id;
static_cast<GeometryMigrationExtension *>(cpy)->Flags = this->Flags;
static_cast<GeometryMigrationExtension *>(cpy)->Ref = this->Ref;
static_cast<GeometryMigrationExtension *>(cpy)->RefIndex = this->RefIndex;
}
std::unique_ptr<Part::GeometryExtension> GeometryMigrationExtension::copy() const

View File

@@ -49,6 +49,8 @@ public:
enum MigrationType {
None = 0,
Construction = 1,
GeometryId = 2,
ExternalReference = 3,
NumMigrationType // Must be the last
};
@@ -61,7 +63,21 @@ 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); };
@@ -76,7 +92,21 @@ private:
using MigrationTypeFlagType = std::bitset<32>;
MigrationTypeFlagType GeometryMigrationFlags;
bool ConstructionState{false};
long Id = 0;
int RefIndex = -1;
unsigned long Flags = 0;
std::string Ref;
};
class PartExport GeometryMigrationPersistenceExtension : public Part::GeometryPersistenceExtension
{
TYPESYSTEM_HEADER();
public:
// Called to save data as attributes in 'Geometry' XML tag
virtual void preSave(Base::Writer &/*writer*/) const {}
// Called to save data after 'GeometryExtensions' XML elements
virtual void postSave(Base::Writer &/*writer*/) const {}
};
} //namespace Part

View File

@@ -36,13 +36,14 @@ using namespace Sketcher;
constexpr std::array<const char*, ExternalGeometryExtension::NumFlags>
ExternalGeometryExtension::flag2str;
TYPESYSTEM_SOURCE(Sketcher::ExternalGeometryExtension, Part::GeometryPersistenceExtension)
TYPESYSTEM_SOURCE(Sketcher::ExternalGeometryExtension, Part::GeometryMigrationPersistenceExtension)
void ExternalGeometryExtension::copyAttributes(Part::GeometryExtension* cpy) const
{
Part::GeometryPersistenceExtension::copyAttributes(cpy);
static_cast<ExternalGeometryExtension*>(cpy)->Ref = this->Ref;
static_cast<ExternalGeometryExtension*>(cpy)->RefIndex = this->RefIndex;
static_cast<ExternalGeometryExtension*>(cpy)->Flags = this->Flags;
}
@@ -50,15 +51,35 @@ void ExternalGeometryExtension::restoreAttributes(Base::XMLReader& reader)
{
Part::GeometryPersistenceExtension::restoreAttributes(reader);
Ref = reader.getAttribute("Ref");
Flags = FlagType(reader.getAttribute("Flags"));
Ref = reader.getAttribute("Ref", "");
RefIndex = reader.getAttributeAsInteger("RefIndex", "-1");
Flags = FlagType(reader.getAttributeAsUnsigned("Flags", "0"));
}
void ExternalGeometryExtension::saveAttributes(Base::Writer& writer) const
{
Part::GeometryPersistenceExtension::saveAttributes(writer);
// For compatibility with upstream FreeCAD, always save 'Ref' and 'Flags'.
// if (Ref.size())
writer.Stream() << "\" Ref=\"" << Base::Persistence::encodeAttribute(Ref);
// if (Flags.any())
writer.Stream() << "\" Flags=\"" << Flags.to_ulong();
if (RefIndex >= 0) {
writer.Stream() << "\" RefIndex=\"" << RefIndex;
}
}
writer.Stream() << "\" Ref=\"" << Ref << "\" Flags=\"" << Flags.to_string();
void ExternalGeometryExtension::preSave(Base::Writer& writer) const
{
if (Ref.size()) {
writer.Stream() << " ref=\"" << Base::Persistence::encodeAttribute(Ref) << "\"";
}
if (RefIndex >= 0) {
writer.Stream() << " refIndex=\"" << RefIndex << "\"";
}
if (Flags.any()) {
writer.Stream() << " flags=\"" << Flags.to_ulong() << "\"";
}
}
std::unique_ptr<Part::GeometryExtension> ExternalGeometryExtension::copy() const

View File

@@ -27,6 +27,7 @@
#include <bitset>
#include <Mod/Part/App/Geometry.h>
#include <Mod/Part/App/GeometryMigrationExtension.h>
#include <Mod/Sketcher/SketcherGlobal.h>
@@ -40,18 +41,29 @@ public:
// START_CREDIT_BLOCK: Credit under LGPL for this block to Zheng, Lei (realthunder)
// <realthunder.dev@gmail.com>
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)
// <realthunder.dev@gmail.com>
virtual bool isClear() const = 0;
virtual size_t flagSize() const = 0;
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,
class SketcherExport ExternalGeometryExtension: public Part::GeometryMigrationPersistenceExtension,
private ISketchExternalGeometryExtension
{
TYPESYSTEM_HEADER_WITH_OVERRIDE();
@@ -76,6 +88,7 @@ public:
public:
ExternalGeometryExtension() = default;
~ExternalGeometryExtension() override = default;
std::unique_ptr<Part::GeometryExtension> copy() const override;
@@ -88,10 +101,21 @@ public:
{
return Flags.test((size_t)(flag));
}
void setFlag(int flag, bool v = true) override
{
Flags.set((size_t)(flag), v);
}
unsigned long getFlags() const override
{
return Flags.to_ulong();
}
void setFlags(unsigned long flags) override
{
Flags = flags;
}
// END_CREDIT_BLOCK: Credit under LGPL for this block to Zheng, Lei (realthunder)
// <realthunder.dev@gmail.com>
@@ -99,6 +123,7 @@ public:
{
return Flags.none();
}
size_t flagSize() const override
{
return Flags.size();
@@ -108,18 +133,33 @@ public:
{
return Ref;
}
void setRef(const std::string& ref) override
{
Ref = ref;
}
int getRefIndex() const override
{
return RefIndex;
}
void setRefIndex(int index) override
{
RefIndex = index;
}
static bool getFlagsFromName(std::string str, ExternalGeometryExtension::Flag& flag);
protected:
void copyAttributes(Part::GeometryExtension* cpy) const override;
void restoreAttributes(Base::XMLReader& reader) override;
void saveAttributes(Base::Writer& writer) const override;
void preSave(Base::Writer& writer) const override;
private:
ExternalGeometryExtension(const ExternalGeometryExtension&) = default;
@@ -128,6 +168,7 @@ private:
// START_CREDIT_BLOCK: Credit under LGPL for this block to Zheng, Lei (realthunder)
// <realthunder.dev@gmail.com>
std::string Ref;
int RefIndex = -1;
FlagType Flags;
// END_CREDIT_BLOCK: Credit under LGPL for this block to Zheng, Lei (realthunder)
// <realthunder.dev@gmail.com>

View File

@@ -30,6 +30,7 @@
#include "ExternalGeometryFacade.h"
#include "ExternalGeometryFacadePy.h"
FC_LOG_LEVEL_INIT("Sketch", true, true);
using namespace Sketcher;
@@ -160,6 +161,31 @@ void ExternalGeometryFacade::copyId(const Part::Geometry* src, Part::Geometry* d
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);
}
}
// 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()
{
return new ExternalGeometryFacadePy(new ExternalGeometryFacade(this->Geo));

View File

@@ -68,6 +68,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);
@@ -82,6 +83,15 @@ public:
getExternalGeoExt()->setFlag(flag, v);
}
unsigned long getFlags() const override
{
return getExternalGeoExt()->getFlags();
}
void setFlags(unsigned long flags) override
{
getExternalGeoExt()->setFlags(flags);
}
bool isClear() const override
{
return getExternalGeoExt()->isClear();
@@ -95,9 +105,16 @@ public:
{
return getExternalGeoExt()->getRef();
}
void setRef(const std::string& ref) override
void setRef(const std::string& ref) override;
int getRefIndex() const override
{
getExternalGeoExt()->setRef(ref);
return getExternalGeoExt()->getRefIndex();
}
void setRefIndex(int index) override
{
getExternalGeoExt()->setRefIndex(index);
}
/** GeometryExtension Interface **/

View File

@@ -146,6 +146,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);

View File

@@ -131,6 +131,8 @@ public: // Utility methods
static InternalType::InternalType getInternalType(const Part::Geometry* geometry);
static void setInternalType(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)

View File

@@ -93,6 +93,17 @@ void SketchGeometryExtension::saveAttributes(Base::Writer& writer) const
<< GeometryModeFlags.to_string() << "\" geometryLayer=\"" << GeometryLayer;
}
void SketchGeometryExtension::preSave(Base::Writer& writer) const
{
writer.Stream() << " id=\"" << Id << "\"";
}
void SketchGeometryExtension::postSave(Base::Writer& writer) const
{
writer.Stream() << writer.ind() << "<Construction value=\""
<< (GeometryModeFlags.test(GeometryMode::Construction) ? 1 : 0) << "\"/>\n";
}
std::unique_ptr<Part::GeometryExtension> SketchGeometryExtension::copy() const
{
auto cpy = std::make_unique<SketchGeometryExtension>();

View File

@@ -28,6 +28,7 @@
#include <bitset>
#include <Mod/Part/App/Geometry.h>
#include <Mod/Part/App/GeometryMigrationExtension.h>
#include <Mod/Sketcher/SketcherGlobal.h>
@@ -84,7 +85,7 @@ public:
virtual void setGeometryLayerId(int geolayer) = 0;
};
class SketcherExport SketchGeometryExtension: public Part::GeometryPersistenceExtension,
class SketcherExport SketchGeometryExtension: public Part::GeometryMigrationPersistenceExtension,
private ISketchGeometryExtension
{
TYPESYSTEM_HEADER_WITH_OVERRIDE();
@@ -159,6 +160,8 @@ protected:
void copyAttributes(Part::GeometryExtension* cpy) const override;
void restoreAttributes(Base::XMLReader& reader) override;
void saveAttributes(Base::Writer& writer) const override;
void preSave(Base::Writer& writer) const override;
void postSave(Base::Writer& writer) const override;
private:
SketchGeometryExtension(const SketchGeometryExtension&) = default;