From 6347fe8c8691b9ae0d12784f618ed948d06a6c05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Tr=C3=B6ger?= Date: Mon, 25 May 2015 16:12:27 +0200 Subject: [PATCH] make origin work correct with multiple parts --- src/Gui/ViewProviderPart.cpp | 56 +++++++++------ src/Gui/ViewProviderPart.h | 2 +- src/Mod/PartDesign/App/DatumCS.cpp | 12 ++-- src/Mod/PartDesign/App/DatumLine.cpp | 14 ++-- src/Mod/PartDesign/App/DatumPlane.cpp | 12 ++-- src/Mod/PartDesign/App/DatumPoint.cpp | 12 ++-- src/Mod/PartDesign/App/FeatureSketchBased.cpp | 6 +- src/Mod/PartDesign/Gui/Command.cpp | 48 ++++++++----- .../PartDesign/Gui/TaskDatumParameters.cpp | 43 +++++------ .../PartDesign/Gui/TaskGrooveParameters.cpp | 63 ++++++++-------- .../Gui/TaskLinearPatternParameters.cpp | 71 +++++++++---------- .../PartDesign/Gui/TaskMirroredParameters.cpp | 59 ++++++++------- .../Gui/TaskPolarPatternParameters.cpp | 71 +++++++++---------- .../Gui/TaskRevolutionParameters.cpp | 68 ++++++++---------- .../Gui/TaskSketchBasedParameters.cpp | 48 +++++++++++++ .../Gui/TaskSketchBasedParameters.h | 3 + .../Gui/TaskTransformedParameters.cpp | 49 ++++++++++++- .../Gui/TaskTransformedParameters.h | 3 + src/Mod/PartDesign/Gui/Workbench.cpp | 43 +++++++++++ src/Mod/PartDesign/Gui/Workbench.h | 2 + 20 files changed, 416 insertions(+), 269 deletions(-) diff --git a/src/Gui/ViewProviderPart.cpp b/src/Gui/ViewProviderPart.cpp index b15499d29..15223d532 100644 --- a/src/Gui/ViewProviderPart.cpp +++ b/src/Gui/ViewProviderPart.cpp @@ -67,6 +67,7 @@ ViewProviderPart::ViewProviderPart() ViewProviderPart::~ViewProviderPart() { + connection.disconnect(); } /** @@ -80,7 +81,7 @@ void ViewProviderPart::onChanged(const App::Property* prop) void ViewProviderPart::attach(App::DocumentObject *pcObj) { - pcObj->getDocument()->signalChangedObject.connect(boost::bind(&ViewProviderPart::onObjectChanged, this, _1, _2)); + connection = pcObj->getDocument()->signalChangedObject.connect(boost::bind(&ViewProviderPart::onObjectChanged, this, _1, _2)); ViewProviderGeoFeatureGroup::attach(pcObj); } @@ -100,7 +101,7 @@ void ViewProviderPart::onObjectChanged(const App::DocumentObject& obj, const App View3DInventorViewer* viewer = static_cast(this->getActiveView())->getViewer(); SoGetBoundingBoxAction bboxAction(viewer->getSoRenderManager()->getViewportRegion()); - //calculate for everything but planes + //calculate for everything but datums SbBox3f bbox(1e-9, 1e-9, 1e-9, 1e-9, 1e-9, 1e-9); for(App::DocumentObject* obj : part->getObjects()) { if(obj->getTypeId() != App::Origin::getClassTypeId() && @@ -139,11 +140,11 @@ void ViewProviderPart::onObjectChanged(const App::DocumentObject& obj, const App Gui::ViewProviderPlane* vp = dynamic_cast(Gui::Application::Instance->getViewProvider(*p)); if(vp) { - if (strcmp(App::Part::BaseplaneTypes[0], dynamic_cast(*p)->getNameInDocument()) == 0) + if (strcmp(App::Part::BaseplaneTypes[0], dynamic_cast(*p)->PlaneType.getValue()) == 0) vp->Size.setValue(std::max(std::abs(std::min(min[0], min[1])),std::max(max[0], max[1]))); - else if (strcmp(App::Part::BaseplaneTypes[1], dynamic_cast(*p)->getNameInDocument()) == 0) + else if (strcmp(App::Part::BaseplaneTypes[1], dynamic_cast(*p)->PlaneType.getValue()) == 0) vp->Size.setValue(std::max(std::abs(std::min(min[0], min[2])),std::max(max[0], max[2]))); - else if (strcmp(App::Part::BaseplaneTypes[2], dynamic_cast(*p)->getNameInDocument()) == 0) + else if (strcmp(App::Part::BaseplaneTypes[2], dynamic_cast(*p)->PlaneType.getValue()) == 0) vp->Size.setValue(std::max(std::abs(std::min(min[1], min[2])),std::max(max[1], max[2]))); } } @@ -154,11 +155,11 @@ void ViewProviderPart::onObjectChanged(const App::DocumentObject& obj, const App Gui::ViewProviderLine* vp = dynamic_cast(Gui::Application::Instance->getViewProvider(*p)); if(vp) { - if (strcmp(App::Part::BaselineTypes[0], dynamic_cast(*p)->getNameInDocument()) == 0) + if (strcmp(App::Part::BaselineTypes[0], dynamic_cast(*p)->LineType.getValue()) == 0) vp->Size.setValue(std::max(std::abs(std::min(min[0], min[1])),std::max(max[0], max[1]))); - else if (strcmp(App::Part::BaselineTypes[1], dynamic_cast(*p)->getNameInDocument()) == 0) + else if (strcmp(App::Part::BaselineTypes[1], dynamic_cast(*p)->LineType.getValue()) == 0) vp->Size.setValue(std::max(std::abs(std::min(min[0], min[2])),std::max(max[0], max[2]))); - else if (strcmp(App::Part::BaselineTypes[2], dynamic_cast(*p)->getNameInDocument()) == 0) + else if (strcmp(App::Part::BaselineTypes[2], dynamic_cast(*p)->LineType.getValue()) == 0) vp->Size.setValue(std::max(std::abs(std::min(min[1], min[2])),std::max(max[1], max[2]))); } } @@ -223,39 +224,52 @@ void ViewProviderPart::setUpPart(const App::Part *part) if (!found) { // ... and put them in the 'Origin' group - Gui::Command::doCommand(Gui::Command::Doc,"Origin = App.activeDocument().addObject('App::Origin','%s')", "Origin"); + std::string oname = part->getDocument()->getUniqueObjectName("Origin"); + Gui::Command::doCommand(Gui::Command::Doc,"Origin = App.activeDocument().addObject('App::Origin','%s')", oname.c_str()); Gui::Command::doCommand(Gui::Command::Doc,"Origin.Label = '%s'", QObject::tr("Origin").toStdString().c_str()); Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().%s.addObject(Origin)", part->getNameInDocument()); // Add the planes ... - Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().addObject('App::Plane','%s')", App::Part::BaseplaneTypes[0]); + std::string pname = part->getDocument()->getUniqueObjectName(App::Part::BaseplaneTypes[0]); + Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().addObject('App::Plane','%s')", pname.c_str()); + Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().ActiveObject.PlaneType = '%s'", App::Part::BaseplaneTypes[0]); Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().ActiveObject.Label = '%s'", QObject::tr("XY-Plane").toStdString().c_str()); - Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().Origin.addObject(App.activeDocument().ActiveObject)"); + Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().%s.addObject(App.activeDocument().ActiveObject)", oname.c_str()); - Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().addObject('App::Plane','%s')", App::Part::BaseplaneTypes[1]); + pname = part->getDocument()->getUniqueObjectName(App::Part::BaseplaneTypes[1]); + Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().addObject('App::Plane','%s')", pname.c_str()); Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().ActiveObject.Placement = App.Placement(App.Vector(),App.Rotation(App.Vector(1,0,0),90))"); + Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().ActiveObject.PlaneType = '%s'", App::Part::BaseplaneTypes[1]); Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().ActiveObject.Label = '%s'", QObject::tr("XZ-Plane").toStdString().c_str()); - Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().Origin.addObject(App.activeDocument().ActiveObject)"); + Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().%s.addObject(App.activeDocument().ActiveObject)", oname.c_str()); - Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().addObject('App::Plane','%s')", App::Part::BaseplaneTypes[2]); + pname = part->getDocument()->getUniqueObjectName(App::Part::BaseplaneTypes[2]); + Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().addObject('App::Plane','%s')", pname.c_str()); Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().ActiveObject.Placement = App.Placement(App.Vector(),App.Rotation(App.Vector(1,1,1),120))"); + Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().ActiveObject.PlaneType = '%s'", App::Part::BaseplaneTypes[2]); Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().ActiveObject.Label = '%s'", QObject::tr("YZ-Plane").toStdString().c_str()); - Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().Origin.addObject(App.activeDocument().ActiveObject)"); + Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().%s.addObject(App.activeDocument().ActiveObject)", oname.c_str()); // Add the lines ... - Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().addObject('App::Line','%s')", App::Part::BaselineTypes[0]); + std::string lname = part->getDocument()->getUniqueObjectName(App::Part::BaselineTypes[0]); + Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().addObject('App::Line','%s')", lname.c_str()); + Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().ActiveObject.LineType = '%s'", App::Part::BaselineTypes[0]); Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().ActiveObject.Label = '%s'", QObject::tr("X-Axis").toStdString().c_str()); - Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().Origin.addObject(App.activeDocument().ActiveObject)"); + Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().%s.addObject(App.activeDocument().ActiveObject)", oname.c_str()); - Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().addObject('App::Line','%s')", App::Part::BaselineTypes[1]); + lname = part->getDocument()->getUniqueObjectName(App::Part::BaselineTypes[1]); + Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().addObject('App::Line','%s')", lname.c_str()); Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().ActiveObject.Placement = App.Placement(App.Vector(),App.Rotation(App.Vector(0,0,1),90))"); + Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().ActiveObject.LineType = '%s'", App::Part::BaselineTypes[1]); Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().ActiveObject.Label = '%s'", QObject::tr("Y-Axis").toStdString().c_str()); - Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().Origin.addObject(App.activeDocument().ActiveObject)"); + Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().%s.addObject(App.activeDocument().ActiveObject)", oname.c_str()); - Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().addObject('App::Line','%s')", App::Part::BaselineTypes[2]); + lname = part->getDocument()->getUniqueObjectName(App::Part::BaselineTypes[2]); + Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().addObject('App::Line','%s')", lname.c_str()); Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().ActiveObject.Placement = App.Placement(App.Vector(),App.Rotation(App.Vector(0,1,0),90))"); + Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().ActiveObject.LineType = '%s'", App::Part::BaselineTypes[2]); Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().ActiveObject.Label = '%s'", QObject::tr("Z-Axis").toStdString().c_str()); - Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().Origin.addObject(App.activeDocument().ActiveObject)"); + Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().%s.addObject(App.activeDocument().ActiveObject)", oname.c_str()); } diff --git a/src/Gui/ViewProviderPart.h b/src/Gui/ViewProviderPart.h index c936993ac..0e2fb65f5 100644 --- a/src/Gui/ViewProviderPart.h +++ b/src/Gui/ViewProviderPart.h @@ -72,7 +72,7 @@ protected: void onObjectChanged(const App::DocumentObject&, const App::Property&); private: - + boost::signals::connection connection; }; typedef ViewProviderPythonFeatureT ViewProviderPartPython; diff --git a/src/Mod/PartDesign/App/DatumCS.cpp b/src/Mod/PartDesign/App/DatumCS.cpp index e5d89c0d3..05c7b4e17 100644 --- a/src/Mod/PartDesign/App/DatumCS.cpp +++ b/src/Mod/PartDesign/App/DatumCS.cpp @@ -342,11 +342,11 @@ void CoordinateSystem::onChanged(const App::Property *prop) if(!plane) { gp_Pnt base(0,0,0); gp_Dir dir(0,0,1); - if (strcmp(p->getNameInDocument(), App::Part::BaseplaneTypes[0]) == 0) + if (strcmp(p->PlaneType.getValue(), App::Part::BaseplaneTypes[0]) == 0) dir = gp_Dir(0,0,1); - else if (strcmp(p->getNameInDocument(), App::Part::BaseplaneTypes[1]) == 0) + else if (strcmp(p->PlaneType.getValue(), App::Part::BaseplaneTypes[1]) == 0) dir = gp_Dir(0,1,0); - else if (strcmp(p->getNameInDocument(), App::Part::BaseplaneTypes[2]) == 0) + else if (strcmp(p->PlaneType.getValue(), App::Part::BaseplaneTypes[2]) == 0) dir = gp_Dir(1,0,0); pln = gp_Pln(base, dir); @@ -372,11 +372,11 @@ void CoordinateSystem::onChanged(const App::Property *prop) App::Line* p = static_cast(refs[i]); gp_Pnt base(0,0,0); gp_Dir dir(0,0,1); - if (strcmp(p->getNameInDocument(), App::Part::BaselineTypes[0]) == 0) + if (strcmp(p->LineType.getValue(), App::Part::BaselineTypes[0]) == 0) dir = gp_Dir(1,0,0); - else if (strcmp(p->getNameInDocument(), App::Part::BaselineTypes[1]) == 0) + else if (strcmp(p->LineType.getValue(), App::Part::BaselineTypes[1]) == 0) dir = gp_Dir(0,1,0); - else if (strcmp(p->getNameInDocument(), App::Part::BaselineTypes[2]) == 0) + else if (strcmp(p->LineType.getValue(), App::Part::BaselineTypes[2]) == 0) dir = gp_Dir(0,0,1); if(!line1) { diff --git a/src/Mod/PartDesign/App/DatumLine.cpp b/src/Mod/PartDesign/App/DatumLine.cpp index 047563dd5..eddcee4c7 100644 --- a/src/Mod/PartDesign/App/DatumLine.cpp +++ b/src/Mod/PartDesign/App/DatumLine.cpp @@ -166,7 +166,7 @@ void Line::onChanged(const App::Property *prop) std::set hint = getHint(); if (!((hint.size() == 1) && (hint.find(QObject::tr("Done")) != hint.end()))) - throw Base::Exception("Incomplete References"); // incomplete references + return; // incomplete references // Extract the geometry of the references Base::Vector3d* base = NULL; @@ -212,11 +212,11 @@ void Line::onChanged(const App::Property *prop) } else if (refs[i]->getTypeId().isDerivedFrom(App::Line::getClassTypeId())) { App::Line* l = static_cast(refs[i]); gp_Dir ldir; - if (strcmp(l->getNameInDocument(), App::Part::BaselineTypes[0]) == 0) + if (strcmp(l->LineType.getValue(), App::Part::BaselineTypes[0]) == 0) ldir = gp_Dir(1,0,0); - else if (strcmp(l->getNameInDocument(), App::Part::BaselineTypes[1]) == 0) + else if (strcmp(l->LineType.getValue(), App::Part::BaselineTypes[1]) == 0) ldir = gp_Dir(0,1,0); - else if (strcmp(l->getNameInDocument(), App::Part::BaselineTypes[2]) == 0) + else if (strcmp(l->LineType.getValue(), App::Part::BaselineTypes[2]) == 0) ldir = gp_Dir(0,0,1); if (s1.IsNull()) { @@ -259,11 +259,11 @@ void Line::onChanged(const App::Property *prop) // Note: We only handle the three base planes here gp_Pnt base(0,0,0); gp_Dir normal; - if (strcmp(p->getNameInDocument(), App::Part::BaseplaneTypes[0]) == 0) + if (strcmp(p->PlaneType.getValue(), App::Part::BaseplaneTypes[0]) == 0) normal = gp_Dir(0,0,1); - else if (strcmp(p->getNameInDocument(), App::Part::BaseplaneTypes[2]) == 0) + else if (strcmp(p->PlaneType.getValue(), App::Part::BaseplaneTypes[2]) == 0) normal = gp_Dir(1,0,0); - else if (strcmp(p->getNameInDocument(), App::Part::BaseplaneTypes[1]) == 0) + else if (strcmp(p->PlaneType.getValue(), App::Part::BaseplaneTypes[1]) == 0) normal = gp_Dir(0,1,0); double offset1 = Offset.getValue(); diff --git a/src/Mod/PartDesign/App/DatumPlane.cpp b/src/Mod/PartDesign/App/DatumPlane.cpp index 1e5ae1733..0f00df51c 100644 --- a/src/Mod/PartDesign/App/DatumPlane.cpp +++ b/src/Mod/PartDesign/App/DatumPlane.cpp @@ -226,11 +226,11 @@ void Plane::onChanged(const App::Property *prop) App::Line* l = static_cast(refs[i]); Base::Vector3d base = Base::Vector3d(0,0,0); gp_Dir dir; - if (strcmp(l->getNameInDocument(), App::Part::BaselineTypes[0]) == 0) + if (strcmp(l->LineType.getValue(), App::Part::BaselineTypes[0]) == 0) dir = gp_Dir(1,0,0); - else if (strcmp(l->getNameInDocument(), App::Part::BaselineTypes[1]) == 0) + else if (strcmp(l->LineType.getValue(), App::Part::BaselineTypes[1]) == 0) dir = gp_Dir(0,1,0); - else if (strcmp(l->getNameInDocument(), App::Part::BaselineTypes[2]) == 0) + else if (strcmp(l->LineType.getValue(), App::Part::BaselineTypes[2]) == 0) dir = gp_Dir(0,0,1); line = new gp_Lin(gp_Pnt(base.x, base.y, base.z), gp_Dir(dir.X(), dir.Y(), dir.Z())); } else if (refs[i]->getTypeId().isDerivedFrom(PartDesign::Plane::getClassTypeId())) { @@ -242,11 +242,11 @@ void Plane::onChanged(const App::Property *prop) // Note: We only handle the three base planes here p1 = new Base::Vector3d(0,0,0); normal = new Base::Vector3d; - if (strcmp(p->getNameInDocument(), App::Part::BaseplaneTypes[0]) == 0) + if (strcmp(p->PlaneType.getValue(), App::Part::BaseplaneTypes[0]) == 0) *normal = Base::Vector3d(0,0,1); - else if (strcmp(p->getNameInDocument(), App::Part::BaseplaneTypes[2]) == 0) + else if (strcmp(p->PlaneType.getValue(), App::Part::BaseplaneTypes[2]) == 0) *normal = Base::Vector3d(0,1,0); - else if (strcmp(p->getNameInDocument(), App::Part::BaseplaneTypes[1]) == 0) + else if (strcmp(p->PlaneType.getValue(), App::Part::BaseplaneTypes[1]) == 0) *normal = Base::Vector3d(1,0,0); } else if (refs[i]->getTypeId().isDerivedFrom(Part::Feature::getClassTypeId())) { Part::Feature* feature = static_cast(refs[i]); diff --git a/src/Mod/PartDesign/App/DatumPoint.cpp b/src/Mod/PartDesign/App/DatumPoint.cpp index 86fbd11cb..340c143d6 100644 --- a/src/Mod/PartDesign/App/DatumPoint.cpp +++ b/src/Mod/PartDesign/App/DatumPoint.cpp @@ -205,11 +205,11 @@ void Point::onChanged(const App::Property* prop) // Note: We only handle the three base planes here gp_Pnt base(0,0,0); gp_Dir normal; - if (strcmp(l->getNameInDocument(), App::Part::BaselineTypes[0]) == 0) + if (strcmp(l->LineType.getValue(), App::Part::BaselineTypes[0]) == 0) normal = gp_Dir(1,0,0); - else if (strcmp(l->getNameInDocument(), App::Part::BaselineTypes[1]) == 0) + else if (strcmp(l->LineType.getValue(), App::Part::BaselineTypes[1]) == 0) normal = gp_Dir(0,1,0); - else if (strcmp(l->getNameInDocument(), App::Part::BaselineTypes[2]) == 0) + else if (strcmp(l->LineType.getValue(), App::Part::BaselineTypes[2]) == 0) normal = gp_Dir(0,0,1); if (s1.IsNull()) @@ -222,11 +222,11 @@ void Point::onChanged(const App::Property* prop) // Note: We only handle the three base planes here gp_Pnt base(0,0,0); gp_Dir normal; - if (strcmp(p->getNameInDocument(), App::Part::BaseplaneTypes[0]) == 0) + if (strcmp(p->PlaneType.getValue(), App::Part::BaseplaneTypes[0]) == 0) normal = gp_Dir(0,0,1); - else if (strcmp(p->getNameInDocument(), App::Part::BaseplaneTypes[2]) == 0) + else if (strcmp(p->PlaneType.getValue(), App::Part::BaseplaneTypes[2]) == 0) normal = gp_Dir(1,0,0); - else if (strcmp(p->getNameInDocument(), App::Part::BaseplaneTypes[1]) == 0) + else if (strcmp(p->PlaneType.getValue(), App::Part::BaseplaneTypes[1]) == 0) normal = gp_Dir(0,1,0); if (s1.IsNull()) diff --git a/src/Mod/PartDesign/App/FeatureSketchBased.cpp b/src/Mod/PartDesign/App/FeatureSketchBased.cpp index aafc88876..de240c674 100644 --- a/src/Mod/PartDesign/App/FeatureSketchBased.cpp +++ b/src/Mod/PartDesign/App/FeatureSketchBased.cpp @@ -1048,11 +1048,11 @@ void SketchBased::getAxis(const App::DocumentObject *pcReferenceAxis, const std: else if (pcReferenceAxis->getTypeId().isDerivedFrom(App::Line::getClassTypeId())) { const App::Line* line = static_cast(pcReferenceAxis); base = Base::Vector3d(0,0,0); - if( strcmp(line->getNameInDocument(), App::Part::BaselineTypes[0]) == 0) + if( strcmp(line->LineType.getValue(), App::Part::BaselineTypes[0]) == 0) dir = Base::Vector3d(1,0,0); - else if( strcmp(line->getNameInDocument(), App::Part::BaselineTypes[1]) == 0) + else if( strcmp(line->LineType.getValue(), App::Part::BaselineTypes[1]) == 0) dir = Base::Vector3d(0,1,0); - else if( strcmp(line->getNameInDocument(), App::Part::BaselineTypes[2]) == 0) + else if( strcmp(line->LineType.getValue(), App::Part::BaselineTypes[2]) == 0) dir = Base::Vector3d(0,0,1); // Check that axis is perpendicular with sketch plane! diff --git a/src/Mod/PartDesign/Gui/Command.cpp b/src/Mod/PartDesign/Gui/Command.cpp index 8904d7662..d70ab8853 100644 --- a/src/Mod/PartDesign/Gui/Command.cpp +++ b/src/Mod/PartDesign/Gui/Command.cpp @@ -732,10 +732,16 @@ void CmdPartDesignNewSketch::activated(int iMsg) else if (FaceFilter.match() || PlaneFilter.match()) { // get the selected object std::string supportString; - Part::Feature* feat; + App::DocumentObject* obj; if (FaceFilter.match()) { - feat = static_cast(FaceFilter.Result[0][0].getObject()); + obj = FaceFilter.Result[0][0].getObject(); + + if(!obj->isDerivedFrom(Part::Feature::getClassTypeId())) + return; + + Part::Feature* feat = static_cast(obj); + // FIXME: Reject or warn about feature that is outside of active body, and feature // that comes after the current insert point (Tip) const std::vector &sub = FaceFilter.Result[0][0].getSubNames(); @@ -765,17 +771,20 @@ void CmdPartDesignNewSketch::activated(int iMsg) supportString = FaceFilter.Result[0][0].getAsPropertyLinkSubString(); } else { - feat = static_cast(PlaneFilter.Result[0][0].getObject()); + obj = static_cast(PlaneFilter.Result[0][0].getObject()); // TODO: Find out whether the user picked front or back of this plane - supportString = std::string("(App.activeDocument().") + feat->getNameInDocument() + ", ['front'])"; + supportString = std::string("(App.activeDocument().") + obj->getNameInDocument() + ", ['front'])"; } - if (!pcActiveBody->hasFeature(feat)) { + if (!pcActiveBody->hasFeature(obj)) { bool isBasePlane = false; - for (unsigned i = 0; i < 3; i++) { - if (strcmp(App::Part::BaseplaneTypes[i], feat->getNameInDocument()) == 0) { - isBasePlane = true; - break; + if(obj->isDerivedFrom(App::Plane::getClassTypeId())) { + App::Plane* pfeat = static_cast(obj); + for (unsigned i = 0; i < 3; i++) { + if (strcmp(App::Part::BaseplaneTypes[i], pfeat->PlaneType.getValue()) == 0) { + isBasePlane = true; + break; + } } } if (!isBasePlane) { @@ -783,7 +792,7 @@ void CmdPartDesignNewSketch::activated(int iMsg) QObject::tr("You have to select a face or plane from the active body!")); return; } - } else if (pcActiveBody->isAfterTip(feat)) { + } else if (pcActiveBody->isAfterTip(obj)) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Selection from inactive feature"), QObject::tr("You have to select a face or plane before the current insert point, or move the insert point")); return; @@ -814,14 +823,17 @@ void CmdPartDesignNewSketch::activated(int iMsg) for (std::vector::iterator p = planes.begin(); p != planes.end(); p++) { // Check whether this plane is a base plane bool base = false; - for (unsigned i = 0; i < 3; i++) { - if (strcmp(App::Part::BaseplaneTypes[i], (*p)->getNameInDocument()) == 0) { - status.push_back(PartDesignGui::TaskFeaturePick::basePlane); - if (firstValidPlane == planes.end()) - firstValidPlane = p; - validPlanes++; - base = true; - break; + if((*p)->isDerivedFrom(App::Plane::getClassTypeId())) { + App::Plane* pfeat = static_cast(*p); + for (unsigned i = 0; i < 3; i++) { + if (strcmp(App::Part::BaseplaneTypes[i], pfeat->PlaneType.getValue()) == 0) { + status.push_back(PartDesignGui::TaskFeaturePick::basePlane); + if (firstValidPlane == planes.end()) + firstValidPlane = p; + validPlanes++; + base = true; + break; + } } } if (base) continue; diff --git a/src/Mod/PartDesign/Gui/TaskDatumParameters.cpp b/src/Mod/PartDesign/Gui/TaskDatumParameters.cpp index 9a60616e5..704ef87f4 100644 --- a/src/Mod/PartDesign/Gui/TaskDatumParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskDatumParameters.cpp @@ -189,20 +189,16 @@ TaskDatumParameters::TaskDatumParameters(ViewProviderDatum *DatumView,QWidget *p updateUI(); //temporary show coordinate systems for selection - for(App::Part* part : App::GetApplication().getActiveDocument()->getObjectsOfType()) { - - if(part->hasObject(DatumView->getObject(), true)) { - auto app_origin = part->getObjectsOfType(App::Origin::getClassTypeId()); - if(!app_origin.empty()) { - ViewProviderOrigin* origin; - origin = static_cast(Gui::Application::Instance->activeDocument()->getViewProvider(app_origin[0])); - static_cast(origin)->setTemporaryVisibilityMode(true, Gui::Application::Instance->activeDocument()); - static_cast(origin)->setTemporaryVisibilityAxis(true); - static_cast(origin)->setTemporaryVisibilityPlanes(true); - } - break; - } - } + App::Part* part = getPartFor(DatumView->getObject(), false); + if(part) { + auto app_origin = part->getObjectsOfType(App::Origin::getClassTypeId()); + if(!app_origin.empty()) { + ViewProviderOrigin* origin; + origin = static_cast(Gui::Application::Instance->activeDocument()->getViewProvider(app_origin[0])); + origin->setTemporaryVisibilityMode(true, Gui::Application::Instance->activeDocument()); + origin->setTemporaryVisibilityAxis(true); + } + } } const QString makeRefText(std::set hint) @@ -669,17 +665,14 @@ QString TaskDatumParameters::getReference(const int idx) const TaskDatumParameters::~TaskDatumParameters() { //end temporary view mode of coordinate system - for(App::Part* part : App::GetApplication().getActiveDocument()->getObjectsOfType()) { - - if(part->hasObject(DatumView->getObject(), true)) { - auto app_origin = part->getObjectsOfType(App::Origin::getClassTypeId()); - if(!app_origin.empty()) { - ViewProviderOrigin* origin; - origin = static_cast(Gui::Application::Instance->activeDocument()->getViewProvider(app_origin[0])); - static_cast(origin)->setTemporaryVisibilityMode(false); - } - break; - } + App::Part* part = getPartFor(DatumView->getObject(), false); + if(part) { + auto app_origin = part->getObjectsOfType(App::Origin::getClassTypeId()); + if(!app_origin.empty()) { + ViewProviderOrigin* origin; + origin = static_cast(Gui::Application::Instance->activeDocument()->getViewProvider(app_origin[0])); + origin->setTemporaryVisibilityMode(false); + } } delete ui; diff --git a/src/Mod/PartDesign/Gui/TaskGrooveParameters.cpp b/src/Mod/PartDesign/Gui/TaskGrooveParameters.cpp index 2652f1698..927d9b023 100644 --- a/src/Mod/PartDesign/Gui/TaskGrooveParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskGrooveParameters.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -105,19 +106,16 @@ TaskGrooveParameters::TaskGrooveParameters(ViewProviderGroove *GrooveView,QWidge setFocus (); //show the parts coordinate system axis for selection - for(App::Part* part : App::GetApplication().getActiveDocument()->getObjectsOfType()) { - - if(part->hasObject(vp->getObject(), true)) { - auto app_origin = part->getObjectsOfType(App::Origin::getClassTypeId()); - if(!app_origin.empty()) { - ViewProviderOrigin* origin; - origin = static_cast(Gui::Application::Instance->activeDocument()->getViewProvider(app_origin[0])); - origin->setTemporaryVisibilityMode(true, Gui::Application::Instance->activeDocument()); - origin->setTemporaryVisibilityAxis(true); - } - break; - } - } + App::Part* part = getPartFor(vp->getObject(), false); + if(part) { + auto app_origin = part->getObjectsOfType(App::Origin::getClassTypeId()); + if(!app_origin.empty()) { + ViewProviderOrigin* origin; + origin = static_cast(Gui::Application::Instance->activeDocument()->getViewProvider(app_origin[0])); + origin->setTemporaryVisibilityMode(true, Gui::Application::Instance->activeDocument()); + origin->setTemporaryVisibilityAxis(true); + } + } } void TaskGrooveParameters::updateUI() @@ -145,11 +143,13 @@ void TaskGrooveParameters::updateUI() bool undefined = false; if (pcReferenceAxis != NULL) { - if(strcmp(pcReferenceAxis->getNameInDocument(), App::Part::BaselineTypes[0])==0) + bool is_base_line = pcReferenceAxis->isDerivedFrom(App::Line::getClassTypeId()); + + if(is_base_line && strcmp(static_cast(pcReferenceAxis)->LineType.getValue(), App::Part::BaselineTypes[0])==0) ui->axis->setCurrentIndex(0); - else if(strcmp(pcReferenceAxis->getNameInDocument(), App::Part::BaselineTypes[1])==0) + else if(is_base_line && strcmp(static_cast(pcReferenceAxis)->LineType.getValue(), App::Part::BaselineTypes[1])==0) ui->axis->setCurrentIndex(1); - else if(strcmp(pcReferenceAxis->getNameInDocument(), App::Part::BaselineTypes[2])==0) + else if(is_base_line && strcmp(static_cast(pcReferenceAxis)->LineType.getValue(), App::Part::BaselineTypes[2])==0) ui->axis->setCurrentIndex(2); else if (!sub.empty() && sub.front() == "H_Axis") ui->axis->setCurrentIndex(3); @@ -228,15 +228,15 @@ void TaskGrooveParameters::onAxisChanged(int num) int maxcount = pcSketch->getAxisCount()+2; if (num == 0) { - pcGroove->ReferenceAxis.setValue(pcGroove->getDocument()->getObject(App::Part::BaselineTypes[0]), + pcGroove->ReferenceAxis.setValue(getPartLines(App::Part::BaselineTypes[0]), std::vector(1,"")); } else if (num == 1) { - pcGroove->ReferenceAxis.setValue(pcGroove->getDocument()->getObject(App::Part::BaselineTypes[1]), + pcGroove->ReferenceAxis.setValue(getPartLines(App::Part::BaselineTypes[1]), std::vector(1,"")); } else if (num == 2) { - pcGroove->ReferenceAxis.setValue(pcGroove->getDocument()->getObject(App::Part::BaselineTypes[2]), + pcGroove->ReferenceAxis.setValue(getPartLines(App::Part::BaselineTypes[2]), std::vector(1,"")); } else if (num == 3) { @@ -307,11 +307,11 @@ void TaskGrooveParameters::getReferenceAxis(App::DocumentObject*& obj, std::vect if (obj) { int num = ui->axis->currentIndex(); if(num == 0) - obj = pcGroove->getDocument()->getObject(App::Part::BaselineTypes[0]); + obj = getPartLines(App::Part::BaselineTypes[0]); else if(num == 1) - obj = pcGroove->getDocument()->getObject(App::Part::BaselineTypes[1]); + obj = getPartLines(App::Part::BaselineTypes[1]); else if(num == 2) - obj = pcGroove->getDocument()->getObject(App::Part::BaselineTypes[2]); + obj = getPartLines(App::Part::BaselineTypes[2]); else if (num == 3) sub[0] = "H_Axis"; else if (num == 4) @@ -345,18 +345,15 @@ bool TaskGrooveParameters::getReversed(void) const TaskGrooveParameters::~TaskGrooveParameters() { //hide the parts coordinate system axis for selection - for(App::Part* part : App::GetApplication().getActiveDocument()->getObjectsOfType()) { - - if(part->hasObject(vp->getObject(), true)) { - auto app_origin = part->getObjectsOfType(App::Origin::getClassTypeId()); - if(!app_origin.empty()) { - ViewProviderOrigin* origin; - origin = static_cast(Gui::Application::Instance->activeDocument()->getViewProvider(app_origin[0])); - origin->setTemporaryVisibilityMode(false); - } - break; + App::Part* part = getPartFor(vp->getObject(), false); + if(part) { + auto app_origin = part->getObjectsOfType(App::Origin::getClassTypeId()); + if(!app_origin.empty()) { + ViewProviderOrigin* origin; + origin = static_cast(Gui::Application::Instance->activeDocument()->getViewProvider(app_origin[0])); + origin->setTemporaryVisibilityMode(false); } - } + } delete ui; } diff --git a/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.cpp b/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.cpp index 1f7e65214..dd786263d 100644 --- a/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.cpp @@ -38,6 +38,7 @@ #include #include #include +#include #include #include #include @@ -166,19 +167,16 @@ void TaskLinearPatternParameters::setupUI() updateUI(); //show the parts coordinate system axis for selection - for(App::Part* part : App::GetApplication().getActiveDocument()->getObjectsOfType()) { - - if(part->hasObject(getObject(), true)) { - auto app_origin = part->getObjectsOfType(App::Origin::getClassTypeId()); - if(!app_origin.empty()) { - ViewProviderOrigin* origin; - origin = static_cast(Gui::Application::Instance->activeDocument()->getViewProvider(app_origin[0])); - origin->setTemporaryVisibilityMode(true, Gui::Application::Instance->activeDocument()); - origin->setTemporaryVisibilityAxis(true); - } - break; - } - } + App::Part* part = getPartFor(getObject(), false); + if(part) { + auto app_origin = part->getObjectsOfType(App::Origin::getClassTypeId()); + if(!app_origin.empty()) { + ViewProviderOrigin* origin; + origin = static_cast(Gui::Application::Instance->activeDocument()->getViewProvider(app_origin[0])); + origin->setTemporaryVisibilityMode(true, Gui::Application::Instance->activeDocument()); + origin->setTemporaryVisibilityAxis(true); + } + } } void TaskLinearPatternParameters::updateUI() @@ -210,15 +208,17 @@ void TaskLinearPatternParameters::updateUI() bool undefined = false; if (directionFeature != NULL && !directions.empty()) { + bool is_base_line = directionFeature->isDerivedFrom(App::Line::getClassTypeId()); + if (directions.front() == "H_Axis") ui->comboDirection->setCurrentIndex(0); else if (directions.front() == "V_Axis") ui->comboDirection->setCurrentIndex(1); - else if (strcmp(directionFeature->getNameInDocument(), App::Part::BaselineTypes[0]) == 0) + else if (is_base_line && strcmp(static_cast(directionFeature)->LineType.getValue(), App::Part::BaselineTypes[0]) == 0) ui->comboDirection->setCurrentIndex( sketch ? 2 : 0); - else if (strcmp(directionFeature->getNameInDocument(), App::Part::BaselineTypes[1]) == 0) + else if (is_base_line && strcmp(static_cast(directionFeature)->LineType.getValue(), App::Part::BaselineTypes[1]) == 0) ui->comboDirection->setCurrentIndex(sketch ? 3 : 1); - else if (strcmp(directionFeature->getNameInDocument(), App::Part::BaselineTypes[2]) == 0) + else if (is_base_line && strcmp(static_cast(directionFeature)->LineType.getValue(), App::Part::BaselineTypes[2]) == 0) ui->comboDirection->setCurrentIndex(sketch ? 4 : 2); else if (directions.front().size() > (sketch ? 4 : 2) && directions.front().substr(0,4) == "Axis") { int pos = (sketch ? 5 : 3) + std::atoi(directions.front().substr(4,4000).c_str()); @@ -301,9 +301,9 @@ void TaskLinearPatternParameters::onSelectionChanged(const Gui::SelectionChanges ui->comboDirection->setCurrentIndex(maxcount); ui->comboDirection->addItem(tr("Select reference...")); } - } else if( strcmp(msg.pObjectName, App::Part::BaselineTypes[0]) == 0 || - strcmp(msg.pObjectName, App::Part::BaselineTypes[1]) == 0 || - strcmp(msg.pObjectName, App::Part::BaselineTypes[2]) == 0) { + } else if( strstr(msg.pObjectName, App::Part::BaselineTypes[0]) == nullptr || + strstr(msg.pObjectName, App::Part::BaselineTypes[1]) == nullptr || + strstr(msg.pObjectName, App::Part::BaselineTypes[2]) == nullptr) { std::vector directions; App::DocumentObject* selObj; @@ -376,17 +376,17 @@ void TaskLinearPatternParameters::onDirectionChanged(int num) { } } if (num == (pcSketch ? 2 : 0)) { - pcLinearPattern->Direction.setValue(getObject()->getDocument()->getObject(App::Part::BaselineTypes[0]), + pcLinearPattern->Direction.setValue(getPartLines(App::Part::BaselineTypes[0]), std::vector(1,"")); exitSelectionMode(); } else if (num == (pcSketch ? 3 : 1)) { - pcLinearPattern->Direction.setValue(getObject()->getDocument()->getObject(App::Part::BaselineTypes[1]), + pcLinearPattern->Direction.setValue(getPartLines(App::Part::BaselineTypes[1]), std::vector(1,"")); exitSelectionMode(); } else if (num == (pcSketch ? 4 : 2)) { - pcLinearPattern->Direction.setValue(getObject()->getDocument()->getObject(App::Part::BaselineTypes[2]), + pcLinearPattern->Direction.setValue(getPartLines(App::Part::BaselineTypes[2]), std::vector(1,"")); exitSelectionMode(); } @@ -457,11 +457,11 @@ void TaskLinearPatternParameters::getDirection(App::DocumentObject*& obj, std::v sub[0] = "V_Axis"; } if (num == (obj ? 2 : 0)) - obj = getObject()->getDocument()->getObject(App::Part::BaselineTypes[0]); + obj = getPartLines(App::Part::BaselineTypes[0]); else if (num == (obj ? 3 : 1)) - obj = getObject()->getDocument()->getObject(App::Part::BaselineTypes[1]); + obj = getPartLines(App::Part::BaselineTypes[1]); else if (num == (obj ? 4 : 2)) - obj = getObject()->getDocument()->getObject(App::Part::BaselineTypes[2]); + obj = getPartLines(App::Part::BaselineTypes[2]); else if (num >= (obj ? 5 : 3) && num < maxcount) { QString buf = QString::fromUtf8("Axis%1").arg(num-(obj ? 5 : 3)); sub[0] = buf.toStdString(); @@ -494,18 +494,15 @@ const unsigned TaskLinearPatternParameters::getOccurrences(void) const TaskLinearPatternParameters::~TaskLinearPatternParameters() { //hide the parts coordinate system axis for selection - for(App::Part* part : App::GetApplication().getActiveDocument()->getObjectsOfType()) { - - if(part->hasObject(getObject(), true)) { - auto app_origin = part->getObjectsOfType(App::Origin::getClassTypeId()); - if(!app_origin.empty()) { - ViewProviderOrigin* origin; - origin = static_cast(Gui::Application::Instance->activeDocument()->getViewProvider(app_origin[0])); - origin->setTemporaryVisibilityMode(false); - } - break; - } - } + App::Part* part = getPartFor(getObject(), false); + if(part) { + auto app_origin = part->getObjectsOfType(App::Origin::getClassTypeId()); + if(!app_origin.empty()) { + ViewProviderOrigin* origin; + origin = static_cast(Gui::Application::Instance->activeDocument()->getViewProvider(app_origin[0])); + origin->setTemporaryVisibilityMode(false); + } + } delete ui; if (proxy) diff --git a/src/Mod/PartDesign/Gui/TaskMirroredParameters.cpp b/src/Mod/PartDesign/Gui/TaskMirroredParameters.cpp index b7b626862..0a14046ca 100644 --- a/src/Mod/PartDesign/Gui/TaskMirroredParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskMirroredParameters.cpp @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include @@ -139,19 +140,16 @@ void TaskMirroredParameters::setupUI() updateUI(); //show the parts coordinate system axis for selection - for(App::Part* part : App::GetApplication().getActiveDocument()->getObjectsOfType()) { - - if(part->hasObject(getObject(), true)) { - auto app_origin = part->getObjectsOfType(App::Origin::getClassTypeId()); - if(!app_origin.empty()) { - ViewProviderOrigin* origin; - origin = static_cast(Gui::Application::Instance->activeDocument()->getViewProvider(app_origin[0])); - origin->setTemporaryVisibilityMode(true, Gui::Application::Instance->activeDocument()); - origin->setTemporaryVisibilityPlanes(true); - } - break; - } - } + App::Part* part = getPartFor(getObject(), false); + if(part) { + auto app_origin = part->getObjectsOfType(App::Origin::getClassTypeId()); + if(!app_origin.empty()) { + ViewProviderOrigin* origin; + origin = static_cast(Gui::Application::Instance->activeDocument()->getViewProvider(app_origin[0])); + origin->setTemporaryVisibilityMode(true, Gui::Application::Instance->activeDocument()); + origin->setTemporaryVisibilityAxis(true); + } + } } void TaskMirroredParameters::updateUI() @@ -180,15 +178,17 @@ void TaskMirroredParameters::updateUI() bool undefined = false; if (mirrorPlaneFeature != NULL && !mirrorPlanes.empty()) { + bool is_base_plane = mirrorPlaneFeature->isDerivedFrom(App::Plane::getClassTypeId()); + if (mirrorPlanes.front() == "H_Axis") ui->comboPlane->setCurrentIndex(0); else if (mirrorPlanes.front() == "V_Axis") ui->comboPlane->setCurrentIndex(1); - else if (strcmp(mirrorPlaneFeature->getNameInDocument(), App::Part::BaseplaneTypes[0]) == 0) + else if (is_base_plane && strcmp(static_cast(mirrorPlaneFeature)->PlaneType.getValue(), App::Part::BaseplaneTypes[0]) == 0) ui->comboPlane->setCurrentIndex((sketch ? 2 : 0)); - else if (strcmp(mirrorPlaneFeature->getNameInDocument(), App::Part::BaseplaneTypes[1]) == 0) + else if (is_base_plane && strcmp(static_cast(mirrorPlaneFeature)->PlaneType.getValue(), App::Part::BaseplaneTypes[1]) == 0) ui->comboPlane->setCurrentIndex((sketch ? 3 : 1)); - else if (strcmp(mirrorPlaneFeature->getNameInDocument(), App::Part::BaseplaneTypes[2]) == 0) + else if (is_base_plane && strcmp(static_cast(mirrorPlaneFeature)->PlaneType.getValue(), App::Part::BaseplaneTypes[2]) == 0) ui->comboPlane->setCurrentIndex((sketch ? 4 : 2)); else if (mirrorPlanes.front().size() > (sketch ? 4 : 2) && mirrorPlanes.front().substr(0,4) == "Axis") { int pos = (sketch ? 5 : 3) + std::atoi(mirrorPlanes.front().substr(4,4000).c_str()); @@ -257,9 +257,9 @@ void TaskMirroredParameters::onSelectionChanged(const Gui::SelectionChanges& msg ui->comboPlane->setCurrentIndex(maxcount); ui->comboPlane->addItem(tr("Select reference...")); } - } else if( strcmp(msg.pObjectName, App::Part::BaseplaneTypes[0]) == 0 || - strcmp(msg.pObjectName, App::Part::BaseplaneTypes[1]) == 0 || - strcmp(msg.pObjectName, App::Part::BaseplaneTypes[2]) == 0) { + } else if( strstr(msg.pObjectName, App::Part::BaseplaneTypes[0]) == nullptr || + strstr(msg.pObjectName, App::Part::BaseplaneTypes[1]) == nullptr || + strstr(msg.pObjectName, App::Part::BaseplaneTypes[2]) == nullptr) { std::vector planes; App::DocumentObject* selObj; @@ -405,18 +405,15 @@ void TaskMirroredParameters::apply() TaskMirroredParameters::~TaskMirroredParameters() { //hide the parts coordinate system axis for selection - for(App::Part* part : App::GetApplication().getActiveDocument()->getObjectsOfType()) { - - if(part->hasObject(getObject(), true)) { - auto app_origin = part->getObjectsOfType(App::Origin::getClassTypeId()); - if(!app_origin.empty()) { - ViewProviderOrigin* origin; - origin = static_cast(Gui::Application::Instance->activeDocument()->getViewProvider(app_origin[0])); - origin->setTemporaryVisibilityMode(false); - } - break; - } - } + App::Part* part = getPartFor(getObject(), false); + if(part) { + auto app_origin = part->getObjectsOfType(App::Origin::getClassTypeId()); + if(!app_origin.empty()) { + ViewProviderOrigin* origin; + origin = static_cast(Gui::Application::Instance->activeDocument()->getViewProvider(app_origin[0])); + origin->setTemporaryVisibilityMode(false); + } + } delete ui; diff --git a/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.cpp b/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.cpp index bf73280fc..e6b20e3da 100644 --- a/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskPolarPatternParameters.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -159,19 +160,16 @@ void TaskPolarPatternParameters::setupUI() updateUI(); //show the parts coordinate system axis for selection - for(App::Part* part : App::GetApplication().getActiveDocument()->getObjectsOfType()) { - - if(part->hasObject(getObject(), true)) { - auto app_origin = part->getObjectsOfType(App::Origin::getClassTypeId()); - if(!app_origin.empty()) { - ViewProviderOrigin* origin; - origin = static_cast(Gui::Application::Instance->activeDocument()->getViewProvider(app_origin[0])); - origin->setTemporaryVisibilityMode(true, Gui::Application::Instance->activeDocument()); - origin->setTemporaryVisibilityAxis(true); - } - break; - } - } + App::Part* part = getPartFor(getObject(), false); + if(part) { + auto app_origin = part->getObjectsOfType(App::Origin::getClassTypeId()); + if(!app_origin.empty()) { + ViewProviderOrigin* origin; + origin = static_cast(Gui::Application::Instance->activeDocument()->getViewProvider(app_origin[0])); + origin->setTemporaryVisibilityMode(true, Gui::Application::Instance->activeDocument()); + origin->setTemporaryVisibilityAxis(true); + } + } } void TaskPolarPatternParameters::updateUI() @@ -203,13 +201,15 @@ void TaskPolarPatternParameters::updateUI() bool undefined = false; if (axisFeature != NULL && !axes.empty()) { + bool is_base_line = axisFeature->isDerivedFrom(App::Line::getClassTypeId()); + if (axes.front() == "N_Axis") { ui->comboAxis->setCurrentIndex(0); - } else if (strcmp(axisFeature->getNameInDocument(), App::Part::BaselineTypes[0]) == 0) { + } else if (is_base_line && strcmp(static_cast(axisFeature)->LineType.getValue(), App::Part::BaselineTypes[0]) == 0) { ui->comboAxis->setCurrentIndex((sketch ? 1 : 0)); - } else if (strcmp(axisFeature->getNameInDocument(), App::Part::BaselineTypes[1]) == 0) { + } else if (is_base_line && strcmp(static_cast(axisFeature)->LineType.getValue(), App::Part::BaselineTypes[1]) == 0) { ui->comboAxis->setCurrentIndex((sketch ? 2 : 1)); - } else if (strcmp(axisFeature->getNameInDocument(), App::Part::BaselineTypes[2]) == 0) { + } else if (is_base_line && strcmp(static_cast(axisFeature)->LineType.getValue(), App::Part::BaselineTypes[2]) == 0) { ui->comboAxis->setCurrentIndex((sketch ? 3 : 2)); } else if (axes.front().size() > (sketch ? 4 : 3) && axes.front().substr(0,4) == "Axis") { int pos = (sketch ? 4 : 3) + std::atoi(axes.front().substr(4,4000).c_str()); @@ -292,9 +292,9 @@ void TaskPolarPatternParameters::onSelectionChanged(const Gui::SelectionChanges& ui->comboAxis->setCurrentIndex(1); ui->comboAxis->addItem(tr("Select reference...")); } - } else if( strcmp(msg.pObjectName, App::Part::BaselineTypes[0]) == 0 || - strcmp(msg.pObjectName, App::Part::BaselineTypes[1]) == 0 || - strcmp(msg.pObjectName, App::Part::BaselineTypes[2]) == 0) { + } else if( strstr(msg.pObjectName, App::Part::BaselineTypes[0]) == nullptr || + strstr(msg.pObjectName, App::Part::BaselineTypes[1]) == nullptr || + strstr(msg.pObjectName, App::Part::BaselineTypes[2]) == nullptr) { std::vector axes; App::DocumentObject* selObj; @@ -363,17 +363,17 @@ void TaskPolarPatternParameters::onAxisChanged(int num) { } } if (num == (pcSketch ? 1 : 0)) { - pcPolarPattern->Axis.setValue(getObject()->getDocument()->getObject(App::Part::BaselineTypes[0]), + pcPolarPattern->Axis.setValue(getPartLines(App::Part::BaselineTypes[0]), std::vector(1,"")); exitSelectionMode(); } else if (num == (pcSketch ? 2 : 1)) { - pcPolarPattern->Axis.setValue(getObject()->getDocument()->getObject(App::Part::BaselineTypes[1]), + pcPolarPattern->Axis.setValue(getPartLines(App::Part::BaselineTypes[1]), std::vector(1,"")); exitSelectionMode(); } else if (num == (pcSketch ? 3 : 2)) { - pcPolarPattern->Axis.setValue(getObject()->getDocument()->getObject(App::Part::BaselineTypes[2]), + pcPolarPattern->Axis.setValue(getPartLines(App::Part::BaselineTypes[2]), std::vector(1,"")); exitSelectionMode(); } @@ -443,11 +443,11 @@ void TaskPolarPatternParameters::getAxis(App::DocumentObject*& obj, std::vector< } } if (num == (obj ? 1 : 0)) - obj = getObject()->getDocument()->getObject(App::Part::BaselineTypes[0]); + obj = getPartLines(App::Part::BaselineTypes[0]); else if (num == (obj ? 2 : 1)) - obj = getObject()->getDocument()->getObject(App::Part::BaselineTypes[1]); + obj = getPartLines(App::Part::BaselineTypes[1]); else if (num == (obj ? 3 : 2)) - obj = getObject()->getDocument()->getObject(App::Part::BaselineTypes[2]); + obj = getPartLines(App::Part::BaselineTypes[2]); else if (num >= (obj ? 4 : 3) && num < maxcount) { QString buf = QString::fromUtf8("Axis%1").arg(num-(obj ? 4 : 3)); sub[0] = buf.toStdString(); @@ -481,18 +481,15 @@ const unsigned TaskPolarPatternParameters::getOccurrences(void) const TaskPolarPatternParameters::~TaskPolarPatternParameters() { //hide the parts coordinate system axis for selection - for(App::Part* part : App::GetApplication().getActiveDocument()->getObjectsOfType()) { - - if(part->hasObject(getObject(), true)) { - auto app_origin = part->getObjectsOfType(App::Origin::getClassTypeId()); - if(!app_origin.empty()) { - ViewProviderOrigin* origin; - origin = static_cast(Gui::Application::Instance->activeDocument()->getViewProvider(app_origin[0])); - origin->setTemporaryVisibilityMode(false); - } - break; - } - } + App::Part* part = getPartFor(getObject(), false); + if(part) { + auto app_origin = part->getObjectsOfType(App::Origin::getClassTypeId()); + if(!app_origin.empty()) { + ViewProviderOrigin* origin; + origin = static_cast(Gui::Application::Instance->activeDocument()->getViewProvider(app_origin[0])); + origin->setTemporaryVisibilityMode(false); + } + } delete ui; if (proxy) diff --git a/src/Mod/PartDesign/Gui/TaskRevolutionParameters.cpp b/src/Mod/PartDesign/Gui/TaskRevolutionParameters.cpp index 62c07f2e4..9d7e7b8f2 100644 --- a/src/Mod/PartDesign/Gui/TaskRevolutionParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskRevolutionParameters.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -105,19 +106,16 @@ TaskRevolutionParameters::TaskRevolutionParameters(ViewProviderRevolution *Revol setFocus (); //show the parts coordinate system axis for selection - for(App::Part* part : App::GetApplication().getActiveDocument()->getObjectsOfType()) { - - if(part->hasObject(RevolutionView->getObject(), true)) { - auto app_origin = part->getObjectsOfType(App::Origin::getClassTypeId()); - if(!app_origin.empty()) { - ViewProviderOrigin* origin; - origin = static_cast(Gui::Application::Instance->activeDocument()->getViewProvider(app_origin[0])); - origin->setTemporaryVisibilityMode(true, Gui::Application::Instance->activeDocument()); - origin->setTemporaryVisibilityAxis(true); - } - break; - } - } + App::Part* part = getPartFor(vp->getObject(), false); + if(part) { + auto app_origin = part->getObjectsOfType(App::Origin::getClassTypeId()); + if(!app_origin.empty()) { + ViewProviderOrigin* origin; + origin = static_cast(Gui::Application::Instance->activeDocument()->getViewProvider(app_origin[0])); + origin->setTemporaryVisibilityMode(true, Gui::Application::Instance->activeDocument()); + origin->setTemporaryVisibilityAxis(true); + } + } } void TaskRevolutionParameters::updateUI() @@ -144,11 +142,13 @@ void TaskRevolutionParameters::updateUI() bool undefined = false; if (pcReferenceAxis != NULL) { - if(strcmp(pcReferenceAxis->getNameInDocument(), App::Part::BaselineTypes[0])==0) + bool is_base_line = pcReferenceAxis->isDerivedFrom(App::Line::getClassTypeId()); + + if(is_base_line && strcmp(static_cast(pcReferenceAxis)->LineType.getValue(), App::Part::BaselineTypes[0])==0) ui->axis->setCurrentIndex(0); - else if(strcmp(pcReferenceAxis->getNameInDocument(), App::Part::BaselineTypes[1])==0) + else if(is_base_line && strcmp(static_cast(pcReferenceAxis)->LineType.getValue(), App::Part::BaselineTypes[1])==0) ui->axis->setCurrentIndex(1); - else if(strcmp(pcReferenceAxis->getNameInDocument(), App::Part::BaselineTypes[2])==0) + else if(is_base_line && strcmp(static_cast(pcReferenceAxis)->LineType.getValue(), App::Part::BaselineTypes[2])==0) ui->axis->setCurrentIndex(2); else if(!sub.empty() && sub.front() == "H_Axis") ui->axis->setCurrentIndex(3); @@ -228,16 +228,13 @@ void TaskRevolutionParameters::onAxisChanged(int num) int maxcount = pcSketch->getAxisCount()+5; if (num == 0) { - pcRevolution->ReferenceAxis.setValue(pcRevolution->getDocument()->getObject(App::Part::BaselineTypes[0]), - std::vector(1,"")); + pcRevolution->ReferenceAxis.setValue(getPartLines(App::Part::BaselineTypes[0]), std::vector(1,"")); } else if (num == 1) { - pcRevolution->ReferenceAxis.setValue(pcRevolution->getDocument()->getObject(App::Part::BaselineTypes[1]), - std::vector(1,"")); + pcRevolution->ReferenceAxis.setValue(getPartLines(App::Part::BaselineTypes[1]), std::vector(1,"")); } else if (num == 2) { - pcRevolution->ReferenceAxis.setValue(pcRevolution->getDocument()->getObject(App::Part::BaselineTypes[2]), - std::vector(1,"")); + pcRevolution->ReferenceAxis.setValue(getPartLines(App::Part::BaselineTypes[2]), std::vector(1,"")); } else if (num == 3) { pcRevolution->ReferenceAxis.setValue(pcSketch, std::vector(1,"H_Axis")); @@ -307,11 +304,11 @@ void TaskRevolutionParameters::getReferenceAxis(App::DocumentObject*& obj, std:: if (obj) { int num = ui->axis->currentIndex(); if(num == 0) - obj = pcRevolution->getDocument()->getObject(App::Part::BaselineTypes[0]); + obj = getPartLines(App::Part::BaselineTypes[0]); else if(num == 1) - obj = pcRevolution->getDocument()->getObject(App::Part::BaselineTypes[1]); + obj = getPartLines(App::Part::BaselineTypes[1]); else if(num == 2) - obj = pcRevolution->getDocument()->getObject(App::Part::BaselineTypes[2]); + obj = getPartLines(App::Part::BaselineTypes[2]); else if (num == 3) sub[0] = "H_Axis"; else if (num == 4) @@ -345,18 +342,15 @@ bool TaskRevolutionParameters::getReversed(void) const TaskRevolutionParameters::~TaskRevolutionParameters() { //hide the parts coordinate system axis for selection - for(App::Part* part : App::GetApplication().getActiveDocument()->getObjectsOfType()) { - - if(part->hasObject(vp->getObject(), true)) { - auto app_origin = part->getObjectsOfType(App::Origin::getClassTypeId()); - if(!app_origin.empty()) { - ViewProviderOrigin* origin; - origin = static_cast(Gui::Application::Instance->activeDocument()->getViewProvider(app_origin[0])); - origin->setTemporaryVisibilityMode(false); - } - break; - } - } + App::Part* part = getPartFor(vp->getObject(), false); + if(part) { + auto app_origin = part->getObjectsOfType(App::Origin::getClassTypeId()); + if(!app_origin.empty()) { + ViewProviderOrigin* origin; + origin = static_cast(Gui::Application::Instance->activeDocument()->getViewProvider(app_origin[0])); + origin->setTemporaryVisibilityMode(false); + } + } delete ui; } diff --git a/src/Mod/PartDesign/Gui/TaskSketchBasedParameters.cpp b/src/Mod/PartDesign/Gui/TaskSketchBasedParameters.cpp index 026903e4a..0d36070c3 100644 --- a/src/Mod/PartDesign/Gui/TaskSketchBasedParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskSketchBasedParameters.cpp @@ -35,6 +35,9 @@ #include #include #include +#include +#include +#include #include #include #include @@ -192,6 +195,51 @@ void TaskSketchBasedParameters::recomputeFeature() } } + +App::DocumentObject* TaskSketchBasedParameters::getPartPlanes(const char* str) const { + + //TODO: Adjust to GRAPH handling when available + App::DocumentObject* obj = vp->getObject(); + App::Part* part = getPartFor(obj, true); + + std::vector origs = part->getObjectsOfType(App::Origin::getClassTypeId()); + if(origs.size()<1) + return nullptr; + + App::Origin* orig = static_cast(origs[0]); + auto planes = orig->getObjectsOfType(App::Plane::getClassTypeId()); + for(App::DocumentObject* plane : planes) { + + if( strcmp(static_cast(plane)->PlaneType.getValue(), str) == 0) + return plane; + } + + return nullptr; +} + + +App::DocumentObject* TaskSketchBasedParameters::getPartLines(const char* str) const { + + //TODO: Adjust to GRAPH handling when available + App::DocumentObject* obj = vp->getObject(); + App::Part* part = getPartFor(obj, true); + + std::vector origs = part->getObjectsOfType(App::Origin::getClassTypeId()); + if(origs.size()<1) + return nullptr; + + App::Origin* orig = static_cast(origs[0]); + auto lines = orig->getObjectsOfType(App::Line::getClassTypeId()); + for(App::DocumentObject* line : lines) { + + if( strcmp(static_cast(line)->LineType.getValue(), str) == 0) + return line; + } + + return nullptr; +} + + TaskSketchBasedParameters::~TaskSketchBasedParameters() { } diff --git a/src/Mod/PartDesign/Gui/TaskSketchBasedParameters.h b/src/Mod/PartDesign/Gui/TaskSketchBasedParameters.h index 803b39b37..cd0d2a9b0 100644 --- a/src/Mod/PartDesign/Gui/TaskSketchBasedParameters.h +++ b/src/Mod/PartDesign/Gui/TaskSketchBasedParameters.h @@ -54,6 +54,9 @@ protected: const QByteArray onFaceName(const QString& text); QString getFaceReference(const QString& obj, const QString& sub) const; void recomputeFeature(); + + App::DocumentObject* getPartPlanes(const char* str) const; + App::DocumentObject* getPartLines(const char* str) const; protected Q_SLOTS: void onUpdateView(bool on); diff --git a/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp b/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp index b4c0e7a96..559c16981 100644 --- a/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskTransformedParameters.cpp @@ -24,7 +24,7 @@ #ifndef _PreComp_ # include -# include +# include # include # include # include @@ -36,6 +36,10 @@ #include "Workbench.h" #include #include +#include +#include +#include +#include #include #include #include @@ -174,6 +178,49 @@ PartDesign::Transformed *TaskTransformedParameters::getObject() const return static_cast(TransformedView->getObject()); } +App::DocumentObject* TaskTransformedParameters::getPartPlanes(const char* str) const { + + //TODO: Adjust to GRAPH handling when available + App::DocumentObject* obj = getObject(); + App::Part* part = getPartFor(obj, true); + + std::vector origs = part->getObjectsOfType(App::Origin::getClassTypeId()); + if(origs.size()<1) + return nullptr; + + App::Origin* orig = static_cast(origs[0]); + auto planes = orig->getObjectsOfType(App::Plane::getClassTypeId()); + for(App::DocumentObject* plane : planes) { + + if( strcmp(static_cast(plane)->PlaneType.getValue(), str) == 0) + return plane; + } + + return nullptr; +} + + +App::DocumentObject* TaskTransformedParameters::getPartLines(const char* str) const { + + //TODO: Adjust to GRAPH handling when available + App::DocumentObject* obj = getObject(); + App::Part* part = getPartFor(obj, true); + + std::vector origs = part->getObjectsOfType(App::Origin::getClassTypeId()); + if(origs.size()<1) + return nullptr; + + App::Origin* orig = static_cast(origs[0]); + auto lines = orig->getObjectsOfType(App::Line::getClassTypeId()); + for(App::DocumentObject* line : lines) { + + if( strcmp(static_cast(line)->LineType.getValue(), str) == 0) + return line; + } + + return nullptr; +} + void TaskTransformedParameters::recomputeFeature() { if (insideMultiTransform) { diff --git a/src/Mod/PartDesign/Gui/TaskTransformedParameters.h b/src/Mod/PartDesign/Gui/TaskTransformedParameters.h index e4170064f..fb24d4fbd 100644 --- a/src/Mod/PartDesign/Gui/TaskTransformedParameters.h +++ b/src/Mod/PartDesign/Gui/TaskTransformedParameters.h @@ -102,6 +102,9 @@ protected: virtual void clearButtons()=0; static void removeItemFromListWidget(QListWidget* widget, const char* itemstr); + App::DocumentObject* getPartPlanes(const char* str) const; + App::DocumentObject* getPartLines(const char* str) const; + protected: QWidget* proxy; ViewProviderTransformed *TransformedView; diff --git a/src/Mod/PartDesign/Gui/Workbench.cpp b/src/Mod/PartDesign/Gui/Workbench.cpp index 4d9b6e7a9..aaef4decc 100644 --- a/src/Mod/PartDesign/Gui/Workbench.cpp +++ b/src/Mod/PartDesign/Gui/Workbench.cpp @@ -89,6 +89,49 @@ PartDesign::Body *getBody(bool messageIfNot) } +PartDesign::Body *getBodyFor(App::DocumentObject* obj, bool messageIfNot) +{ + PartDesign::Body * activeBody = Gui::Application::Instance->activeView()->getActiveObject(PDBODYKEY); + if(activeBody && activeBody->hasFeature(obj)) + return activeBody; + + //try to find the part the object is in + for(PartDesign::Body* b : obj->getDocument()->getObjectsOfType()) { + if(b->isFeature(obj)) { + return b; + } + } + + if (messageIfNot){ + QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Feature is not in a body"), + QObject::tr("In order to use this feature it needs to belong to a body object in the document.")); + } + + return nullptr; +} + +App::Part* getPartFor(App::DocumentObject* obj, bool messageIfNot) { + + PartDesign::Body* body = getBodyFor(obj, false); + if(body) + obj = body; + + //get the part every body should belong to + for(App::Part* p : obj->getDocument()->getObjectsOfType()) { + if(p->hasObject(obj)) { + return p; + } + } + + if (messageIfNot){ + QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Feature is not in a part"), + QObject::tr("In order to use this feature it needs to belong to a part object in the document.")); + } + + return nullptr; +} + + } /// @namespace PartDesignGui @class Workbench diff --git a/src/Mod/PartDesign/Gui/Workbench.h b/src/Mod/PartDesign/Gui/Workbench.h index 3b9e36ac7..61444de56 100644 --- a/src/Mod/PartDesign/Gui/Workbench.h +++ b/src/Mod/PartDesign/Gui/Workbench.h @@ -52,6 +52,8 @@ namespace PartDesignGui { /// Return active body or show a warning message PartDesign::Body *getBody(bool messageIfNot); +PartDesign::Body *getBodyFor(App::DocumentObject*, bool messageIfNot); +App::Part *getPartFor(App::DocumentObject*, bool messageIfNot); /** * @author Werner Mayer