diff --git a/src/Mod/Sketcher/App/SketchObject.cpp b/src/Mod/Sketcher/App/SketchObject.cpp index fdbc880252..812a39519b 100644 --- a/src/Mod/Sketcher/App/SketchObject.cpp +++ b/src/Mod/Sketcher/App/SketchObject.cpp @@ -147,6 +147,7 @@ SketchObject::SketchObject() internaltransaction=false; managedoperation=false; + afterRestoreMigration=false; } SketchObject::~SketchObject() @@ -7339,6 +7340,9 @@ void SketchObject::onUndoRedoFinished() void SketchObject::onDocumentRestored() { try { + if(afterRestoreMigration) + migrateSketch(); + validateExternalLinks(); rebuildExternalGeometry(); Constraints.acceptGeometry(getCompleteGeometry()); @@ -7358,6 +7362,9 @@ void SketchObject::onDocumentRestored() void SketchObject::restoreFinished() { try { + if(afterRestoreMigration) + migrateSketch(); + validateExternalLinks(); rebuildExternalGeometry(); Constraints.acceptGeometry(getCompleteGeometry()); @@ -7372,6 +7379,90 @@ void SketchObject::restoreFinished() } } +void SketchObject::migrateSketch(void) +{ + const std::vector< Part::Geometry * > &vals = getInternalGeometry(); + + for( auto c : Constraints.getValues()) { + + // Assign correct Internal Geometry Type + switch(c->AlignmentType){ + case Undef: + { + auto gf = GeometryFacade::getFacade(vals[c->First]); + gf->setInternalType(InternalType::None); + break; + } + case EllipseMajorDiameter: + { + auto gf = GeometryFacade::getFacade(vals[c->First]); + gf->setInternalType(InternalType::EllipseMajorDiameter); + break; + } + case EllipseMinorDiameter: + { + auto gf = GeometryFacade::getFacade(vals[c->First]); + gf->setInternalType(InternalType::EllipseMinorDiameter); + break; + } + case EllipseFocus1: + { + auto gf = GeometryFacade::getFacade(vals[c->First]); + gf->setInternalType(InternalType::EllipseFocus1); + break; + } + case EllipseFocus2: + { + auto gf = GeometryFacade::getFacade(vals[c->First]); + gf->setInternalType(InternalType::EllipseFocus2); + break; + } + case HyperbolaMajor: + { + auto gf = GeometryFacade::getFacade(vals[c->First]); + gf->setInternalType(InternalType::HyperbolaMajor); + break; + } + case HyperbolaMinor: + { + auto gf = GeometryFacade::getFacade(vals[c->First]); + gf->setInternalType(InternalType::HyperbolaMinor); + break; + } + case HyperbolaFocus: + { + auto gf = GeometryFacade::getFacade(vals[c->First]); + gf->setInternalType(InternalType::HyperbolaFocus); + break; + } + case ParabolaFocus: + { + auto gf = GeometryFacade::getFacade(vals[c->First]); + gf->setInternalType(InternalType::ParabolaFocus); + break; + } + case BSplineControlPoint: + { + auto gf = GeometryFacade::getFacade(vals[c->First]); + gf->setInternalType(InternalType::BSplineControlPoint); + break; + } + case BSplineKnotPoint: + { + auto gf = GeometryFacade::getFacade(vals[c->First]); + gf->setInternalType(InternalType::BSplineKnotPoint); + break; + } + } + + // Assign Blocked geometry mode + if(c->Type == Block){ + auto gf = GeometryFacade::getFacade(vals[c->First]); + gf->setBlocked(); + } + } +} + void SketchObject::getGeoVertexIndex(int VertexId, int &GeoId, PointPos &PosId) const { if (VertexId < 0 || VertexId >= int(VertexId2GeoId.size())) { diff --git a/src/Mod/Sketcher/App/SketchObject.h b/src/Mod/Sketcher/App/SketchObject.h index d9b2ebb36c..9c9f13019a 100644 --- a/src/Mod/Sketcher/App/SketchObject.h +++ b/src/Mod/Sketcher/App/SketchObject.h @@ -450,6 +450,9 @@ protected: virtual void onUndoRedoFinished() override; + // migration functions + void migrateSketch(void); + private: /// Flag to allow external geometry from other bodies than the one this sketch belongs to bool allowOtherBody; @@ -488,6 +491,8 @@ private: bool internaltransaction; bool managedoperation; // indicates whether changes to properties are the deed of SketchObject or not (for input validation) + + bool afterRestoreMigration; }; typedef App::FeaturePythonT SketchObjectPython;