Skip to content

Commit

Permalink
Part: Geometry Extensions
Browse files Browse the repository at this point in the history
  • Loading branch information
abdullahtahiriyo authored and wwmayer committed Jul 14, 2019
1 parent 348160d commit 2400d63
Show file tree
Hide file tree
Showing 3 changed files with 100 additions and 3 deletions.
1 change: 1 addition & 0 deletions src/Mod/Part/App/AppPart.cpp
Expand Up @@ -477,6 +477,7 @@ PyMOD_INIT_FUNC(Part)
Part::Refine ::init();

// Geometry types
Part::GeometryExtension ::init();
Part::Geometry ::init();
Part::GeomPoint ::init();
Part::GeomCurve ::init();
Expand Down
78 changes: 75 additions & 3 deletions src/Mod/Part/App/Geometry.cpp
Expand Up @@ -180,6 +180,16 @@ const char* gce_ErrorStatusText(gce_ErrorType et)
}
}



// ---------------------------------------------------------------
TYPESYSTEM_SOURCE_ABSTRACT(Part::GeometryExtension,Base::Persistence)


GeometryExtension::~GeometryExtension()
{
}

// ---------------------------------------------------------------

TYPESYSTEM_SOURCE_ABSTRACT(Part::Geometry,Base::Persistence)
Expand All @@ -202,23 +212,84 @@ unsigned int Geometry::getMemSize (void) const

void Geometry::Save(Base::Writer &writer) const
{
if( extensions.size()>0 ) {

writer.incInd();

writer.Stream() << writer.ind() << "<GeoExtensions count=\"" << extensions.size() << "\">" << endl;

for(auto att:extensions) {
att.second->Save(writer);
}

writer.decInd();
writer.Stream() << writer.ind() << "</GeoExtensions>" << endl;
}

const char c = Construction?'1':'0';
writer.Stream() << writer.ind() << "<Construction value=\"" << c << "\"/>" << endl;
}

void Geometry::Restore(Base::XMLReader &reader)
{
// read my Element
reader.readElement("Construction");
// get the value of my Attribute
reader.readElement();

if(strcmp(reader.localName(),"GeoExtensions") == 0) {

int count = reader.getAttributeAsInteger("count");

for (int i = 0; i < count; i++) {
reader.readElement("GeoExtension");
const char* TypeName = reader.getAttribute("type");
Base::Type type = Base::Type::fromName(TypeName);
GeometryExtension *newE = (GeometryExtension *)type.createInstance();
newE->Restore(reader);

extensions[type] = newE;
}

reader.readEndElement("GeoExtensions");

reader.readElement("Construction"); // prepare for reading construction attribute
}
else if(strcmp(reader.localName(),"Construction") != 0) { // ignore anything not known
reader.readElement("Construction");
}

Construction = (int)reader.getAttributeAsInteger("value")==0?false:true;

}

boost::uuids::uuid Geometry::getTag() const
{
return tag;
}

std::map<Base::Type, GeometryExtension *> & Geometry::getExtensions()
{
return this->extensions;
}

void Geometry::setExtensions(std::map<Base::Type, GeometryExtension *> exts)
{
this->extensions=exts;
}

bool Geometry::hasExtension(Base::Type type) const
{
return this->extensions.find(type) != extensions.end();
}

GeometryExtension * Geometry::getExtension(Base::Type type)
{
return this->extensions[type];
}

void Geometry::setExtension(GeometryExtension *geo)
{
this->extensions[geo->getTypeId()]=geo;
}

void Geometry::createNewTag()
{
// Initialize a random number generator, to avoid Valgrind false positives.
Expand Down Expand Up @@ -246,6 +317,7 @@ Geometry *Geometry::clone(void) const
{
Geometry* cpy = this->copy();
cpy->tag = this->tag;
cpy->extensions = this->extensions;
return cpy;
}

Expand Down
24 changes: 24 additions & 0 deletions src/Mod/Part/App/Geometry.h
Expand Up @@ -56,6 +56,7 @@
#include <gp_Vec.hxx>
#include <list>
#include <vector>
#include <map>
#include <Base/Persistence.h>
#include <Base/Vector3D.h>

Expand All @@ -64,6 +65,20 @@

namespace Part {

class PartExport GeometryExtension: public Base::Persistence
{
TYPESYSTEM_HEADER();
public:
virtual ~GeometryExtension();

// Persistence implementer ---------------------
virtual unsigned int getMemSize(void) const = 0;
virtual void Save(Base::Writer &/*writer*/) const = 0;
virtual void Restore(Base::XMLReader &/*reader*/) = 0;

virtual PyObject *getPyObject(void) = 0;
};

class PartExport Geometry: public Base::Persistence
{
TYPESYSTEM_HEADER();
Expand Down Expand Up @@ -93,6 +108,14 @@ class PartExport Geometry: public Base::Persistence
bool Construction;
/// returns the tag of the geometry object
boost::uuids::uuid getTag() const;

std::map<Base::Type, GeometryExtension *> &getExtensions();
void setExtensions(std::map<Base::Type, GeometryExtension *> exts);

bool hasExtension(Base::Type type) const;
GeometryExtension * getExtension(Base::Type type);
void setExtension(GeometryExtension *geo);

protected:
/// create a new tag for the geometry object
void createNewTag();
Expand All @@ -104,6 +127,7 @@ class PartExport Geometry: public Base::Persistence

protected:
boost::uuids::uuid tag;
std::map<Base::Type, GeometryExtension *> extensions;

private:
Geometry(const Geometry&);
Expand Down

0 comments on commit 2400d63

Please sign in to comment.