diff --git a/src/Mod/PartDesign/App/FeatureSketchBased.cpp b/src/Mod/PartDesign/App/FeatureSketchBased.cpp index 4968a3484..3a51066bd 100644 --- a/src/Mod/PartDesign/App/FeatureSketchBased.cpp +++ b/src/Mod/PartDesign/App/FeatureSketchBased.cpp @@ -71,6 +71,8 @@ #include #include #include +#include +#include #include #include "FeatureSketchBased.h" #include "DatumPlane.h" @@ -1042,7 +1044,22 @@ void SketchBased::getAxis(const App::DocumentObject *pcReferenceAxis, const std: // Check that axis is co-planar with sketch plane! if (!sketchplane.Contains(gp_Lin(gp_Pnt(base.x, base.y, base.z), gp_Dir(dir.x, dir.y, dir.z)), Precision::Confusion(), Precision::Confusion())) throw Base::Exception("Rotation axis must be coplanar with the sketch plane"); - } else if (pcReferenceAxis->getTypeId().isDerivedFrom(PartDesign::Feature::getClassTypeId())) { + } + 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) + dir = Base::Vector3d(1,0,0); + else if( strcmp(line->getNameInDocument(), App::Part::BaselineTypes[1]) == 0) + dir = Base::Vector3d(0,1,0); + else if( strcmp(line->getNameInDocument(), App::Part::BaselineTypes[2]) == 0) + dir = Base::Vector3d(0,0,1); + + // Check that axis is co-planar with sketch plane! + if (!sketchplane.Contains(gp_Lin(gp_Pnt(base.x, base.y, base.z), gp_Dir(dir.x, dir.y, dir.z)), Precision::Confusion(), Precision::Confusion())) + throw Base::Exception("Rotation axis must be coplanar with the sketch plane"); + } + else if (pcReferenceAxis->getTypeId().isDerivedFrom(PartDesign::Feature::getClassTypeId())) { if (subReferenceAxis[0].empty()) throw Base::Exception("No rotation axis reference specified"); const Part::Feature* refFeature = static_cast(pcReferenceAxis); diff --git a/src/Mod/PartDesign/Gui/TaskRevolutionParameters.cpp b/src/Mod/PartDesign/Gui/TaskRevolutionParameters.cpp index 910f3cd96..62c07f2e4 100644 --- a/src/Mod/PartDesign/Gui/TaskRevolutionParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskRevolutionParameters.cpp @@ -31,6 +31,8 @@ #include #include #include +#include +#include #include #include #include @@ -39,6 +41,7 @@ #include #include #include +#include #include #include #include @@ -100,6 +103,21 @@ TaskRevolutionParameters::TaskRevolutionParameters(ViewProviderRevolution *Revol ui->checkBoxReversed->blockSignals(false); 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; + } + } } void TaskRevolutionParameters::updateUI() @@ -115,23 +133,29 @@ void TaskRevolutionParameters::updateUI() // Add user-defined sketch axes to the reference selection combo box Sketcher::SketchObject *pcSketch = static_cast(pcRevolution->Sketch.getValue()); - int maxcount=2; + int maxcount=5; if (pcSketch) maxcount += pcSketch->getAxisCount(); - for (int i=ui->axis->count()-1; i >= 2; i--) + for (int i=ui->axis->count()-1; i >= 5; i--) ui->axis->removeItem(i); for (int i=ui->axis->count(); i < maxcount; i++) ui->axis->addItem(QString::fromAscii("Sketch axis %1").arg(i-5)); bool undefined = false; - if (pcReferenceAxis != NULL && !sub.empty()) { - if (sub.front() == "H_Axis") + if (pcReferenceAxis != NULL) { + if(strcmp(pcReferenceAxis->getNameInDocument(), App::Part::BaselineTypes[0])==0) ui->axis->setCurrentIndex(0); - else if (sub.front() == "V_Axis") + else if(strcmp(pcReferenceAxis->getNameInDocument(), App::Part::BaselineTypes[1])==0) ui->axis->setCurrentIndex(1); - else if (sub.front().size() > 4 && sub.front().substr(0,4) == "Axis") { - int pos = 2 + std::atoi(sub.front().substr(4,4000).c_str()); + else if(strcmp(pcReferenceAxis->getNameInDocument(), App::Part::BaselineTypes[2])==0) + ui->axis->setCurrentIndex(2); + else if(!sub.empty() && sub.front() == "H_Axis") + ui->axis->setCurrentIndex(3); + else if(!sub.empty() && sub.front() == "V_Axis") + ui->axis->setCurrentIndex(4); + else if(!sub.empty() && sub.front().size() > 4 && sub.front().substr(0,4) == "Axis") { + int pos = 5 + std::atoi(sub.front().substr(4,4000).c_str()); if (pos <= maxcount) ui->axis->setCurrentIndex(pos); else @@ -167,7 +191,7 @@ void TaskRevolutionParameters::onSelectionChanged(const Gui::SelectionChanges& m } else { Sketcher::SketchObject *pcSketch = static_cast(pcRevolution->Sketch.getValue()); - int maxcount=2; + int maxcount=5; if (pcSketch) maxcount += pcSketch->getAxisCount(); for (int i=ui->axis->count()-1; i >= maxcount; i--) @@ -202,14 +226,26 @@ void TaskRevolutionParameters::onAxisChanged(int num) App::DocumentObject *oldRefAxis = pcRevolution->ReferenceAxis.getValue(); std::vector oldSubRefAxis = pcRevolution->ReferenceAxis.getSubValues(); - int maxcount = pcSketch->getAxisCount()+2; + int maxcount = pcSketch->getAxisCount()+5; if (num == 0) { + pcRevolution->ReferenceAxis.setValue(pcRevolution->getDocument()->getObject(App::Part::BaselineTypes[0]), + std::vector(1,"")); + } + else if (num == 1) { + pcRevolution->ReferenceAxis.setValue(pcRevolution->getDocument()->getObject(App::Part::BaselineTypes[1]), + std::vector(1,"")); + } + else if (num == 2) { + pcRevolution->ReferenceAxis.setValue(pcRevolution->getDocument()->getObject(App::Part::BaselineTypes[2]), + std::vector(1,"")); + } + else if (num == 3) { pcRevolution->ReferenceAxis.setValue(pcSketch, std::vector(1,"H_Axis")); exitSelectionMode(); - } else if (num == 1) { + } else if (num == 4) { pcRevolution->ReferenceAxis.setValue(pcSketch, std::vector(1,"V_Axis")); exitSelectionMode(); - } else if (num >= 2 && num < maxcount) { + } else if (num >= 5 && num < maxcount) { QString buf = QString::fromUtf8("Axis%1").arg(num-2); std::string str = buf.toStdString(); pcRevolution->ReferenceAxis.setValue(pcSketch, std::vector(1,str)); @@ -264,17 +300,23 @@ void TaskRevolutionParameters::getReferenceAxis(App::DocumentObject*& obj, std:: PartDesign::Revolution* pcRevolution = static_cast(vp->getObject()); obj = static_cast(pcRevolution->Sketch.getValue()); sub = std::vector(1,""); - int maxcount=2; + int maxcount=5; if (obj) maxcount += static_cast(obj)->getAxisCount(); if (obj) { int num = ui->axis->currentIndex(); - if (num == 0) + if(num == 0) + obj = pcRevolution->getDocument()->getObject(App::Part::BaselineTypes[0]); + else if(num == 1) + obj = pcRevolution->getDocument()->getObject(App::Part::BaselineTypes[1]); + else if(num == 2) + obj = pcRevolution->getDocument()->getObject(App::Part::BaselineTypes[2]); + else if (num == 3) sub[0] = "H_Axis"; - else if (num == 1) + else if (num == 4) sub[0] = "V_Axis"; - else if (num >= 2 && num < maxcount) { + else if (num >= 5 && num < maxcount) { QString buf = QString::fromUtf8("Axis%1").arg(num-2); sub[0] = buf.toStdString(); } else if (num == maxcount && ui->axis->count() == maxcount + 2) { @@ -302,6 +344,20 @@ 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; + } + } + delete ui; } diff --git a/src/Mod/PartDesign/Gui/TaskRevolutionParameters.ui b/src/Mod/PartDesign/Gui/TaskRevolutionParameters.ui index 23a640d2c..2fe1c4cbf 100644 --- a/src/Mod/PartDesign/Gui/TaskRevolutionParameters.ui +++ b/src/Mod/PartDesign/Gui/TaskRevolutionParameters.ui @@ -25,6 +25,21 @@ + + + Base X axis + + + + + Base Y axis + + + + + Base Z axis + + Horizontal sketch axis @@ -54,20 +69,20 @@ - + deg - + 0.000000000000000 - + 360.000000000000000 - + 10.000000000000000 - + 360.000000000000000