From d6440b414356b1c0422a11c707b63641b9d0464c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Tr=C3=B6ger?= Date: Thu, 7 May 2015 06:53:41 +0200 Subject: [PATCH] switch linear pattern to coordinate system axis --- src/App/GeoFeatureGroup.cpp | 6 +- src/App/GeoFeatureGroup.h | 2 +- src/Gui/ViewProviderOrigin.cpp | 4 +- src/Mod/PartDesign/App/Feature.cpp | 2 + .../PartDesign/App/FeatureLinearPattern.cpp | 9 +-- .../PartDesign/Gui/TaskDatumParameters.cpp | 36 ++++++++--- .../Gui/TaskLinearPatternParameters.cpp | 61 ++++++++++++++++--- .../Gui/TaskLinearPatternParameters.ui | 10 +-- 8 files changed, 98 insertions(+), 32 deletions(-) diff --git a/src/App/GeoFeatureGroup.cpp b/src/App/GeoFeatureGroup.cpp index 6fdd4319b..feb88137f 100644 --- a/src/App/GeoFeatureGroup.cpp +++ b/src/App/GeoFeatureGroup.cpp @@ -109,12 +109,16 @@ DocumentObject *GeoFeatureGroup::getObject(const char *Name) const return 0; } -bool GeoFeatureGroup::hasObject(const DocumentObject* obj) const +bool GeoFeatureGroup::hasObject(const DocumentObject* obj, bool recursive) const { const std::vector& grp = Items.getValues(); for (std::vector::const_iterator it = grp.begin(); it != grp.end(); ++it) { if (*it == obj) return true; + if (recursive && (*it)->getTypeId().isDerivedFrom(GeoFeatureGroup::getClassTypeId())) { + if (this->hasObject(static_cast(*it), recursive)) + return true; + } } return false; diff --git a/src/App/GeoFeatureGroup.h b/src/App/GeoFeatureGroup.h index 13c7889cc..9b4edab08 100644 --- a/src/App/GeoFeatureGroup.h +++ b/src/App/GeoFeatureGroup.h @@ -72,7 +72,7 @@ public: /** * Checks whether the object \a obj is GeoFeatureGroup of this group. */ - bool hasObject(const DocumentObject* obj) const; + bool hasObject(const App::DocumentObject* obj, bool recursive = false) const; /** * Checks whether this group object is a child (or sub-child) * of the given group object. diff --git a/src/Gui/ViewProviderOrigin.cpp b/src/Gui/ViewProviderOrigin.cpp index 4878f9be6..ef18c1efc 100644 --- a/src/Gui/ViewProviderOrigin.cpp +++ b/src/Gui/ViewProviderOrigin.cpp @@ -127,7 +127,7 @@ bool ViewProviderOrigin::isTemporaryVisibilityMode() void ViewProviderOrigin::setTemporaryVisibilityAxis(bool onoff) { - for(App::DocumentObject* obj : static_cast(pcObject)->getObjectsOfType(App::Plane::getClassTypeId())) { + for(App::DocumentObject* obj : static_cast(pcObject)->getObjectsOfType(App::Line::getClassTypeId())) { Gui::ViewProvider* vp = tempVisDoc->getViewProvider(obj); vp->setVisible(onoff); @@ -136,7 +136,7 @@ void ViewProviderOrigin::setTemporaryVisibilityAxis(bool onoff) void ViewProviderOrigin::setTemporaryVisibilityPlanes(bool onoff) { - for(App::DocumentObject* obj : static_cast(pcObject)->getObjectsOfType(App::Line::getClassTypeId())) { + for(App::DocumentObject* obj : static_cast(pcObject)->getObjectsOfType(App::Plane::getClassTypeId())) { Gui::ViewProvider* vp = tempVisDoc->getViewProvider(obj); vp->setVisible(onoff); diff --git a/src/Mod/PartDesign/App/Feature.cpp b/src/Mod/PartDesign/App/Feature.cpp index da4990b11..b1cc95b1c 100644 --- a/src/Mod/PartDesign/App/Feature.cpp +++ b/src/Mod/PartDesign/App/Feature.cpp @@ -37,6 +37,7 @@ #include #include "App/Document.h" #include "App/Plane.h" +#include #include "Body.h" #include "Feature.h" #include "Mod/Part/App/DatumFeature.h" @@ -129,6 +130,7 @@ const Part::TopoShape Feature::getBaseTopoShape() const { bool Feature::isDatum(const App::DocumentObject* feature) { return feature->getTypeId().isDerivedFrom(App::Plane::getClassTypeId()) || + feature->getTypeId().isDerivedFrom(App::Line::getClassTypeId()) || feature->getTypeId().isDerivedFrom(Part::Datum::getClassTypeId()); } diff --git a/src/Mod/PartDesign/App/FeatureLinearPattern.cpp b/src/Mod/PartDesign/App/FeatureLinearPattern.cpp index f17846be4..557ad4166 100644 --- a/src/Mod/PartDesign/App/FeatureLinearPattern.cpp +++ b/src/Mod/PartDesign/App/FeatureLinearPattern.cpp @@ -37,6 +37,7 @@ #include "DatumPlane.h" #include "DatumLine.h" #include +#include #include #include #include @@ -112,10 +113,10 @@ const std::list LinearPattern::getTransformations(const std::vector(refObject); Base::Vector3d d = line->getDirection(); dir = gp_Dir(d.x, d.y, d.z); - } else if (refObject->getTypeId().isDerivedFrom(App::Plane::getClassTypeId())) { - App::Plane* plane = static_cast(refObject); - Base::Rotation rot = plane->Placement.getValue().getRotation(); - Base::Vector3d d(0,0,1); + } else if (refObject->getTypeId().isDerivedFrom(App::Line::getClassTypeId())) { + App::Line* line = static_cast(refObject); + Base::Rotation rot = line->Placement.getValue().getRotation(); + Base::Vector3d d(1,0,0); rot.multVec(d, d); dir = gp_Dir(d.x, d.y, d.z); } else if (refObject->getTypeId().isDerivedFrom(Part::Feature::getClassTypeId())) { diff --git a/src/Mod/PartDesign/Gui/TaskDatumParameters.cpp b/src/Mod/PartDesign/Gui/TaskDatumParameters.cpp index 09f0ad421..46ec22793 100644 --- a/src/Mod/PartDesign/Gui/TaskDatumParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskDatumParameters.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -187,14 +188,21 @@ TaskDatumParameters::TaskDatumParameters(ViewProviderDatum *DatumView,QWidget *p ui->lineRef3->blockSignals(false); updateUI(); - //temporary show all coordinate systems for selection - for(auto origin : Gui::Application::Instance->activeDocument()->getViewProvidersOfType(Gui::ViewProviderOrigin::getClassTypeId())) { - - static_cast(origin)->setTemporaryVisibilityMode(true, Gui::Application::Instance->activeDocument()); - static_cast(origin)->setTemporaryVisibilityAxis(true); - static_cast(origin)->setTemporaryVisibilityPlanes(true); - } + //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; + } + } } const QString makeRefText(std::set hint) @@ -641,10 +649,18 @@ QString TaskDatumParameters::getReference(const int idx) const TaskDatumParameters::~TaskDatumParameters() { - //end temporary view mode of all coordinate systems - for(auto origin : Gui::Application::Instance->activeDocument()->getViewProvidersOfType(Gui::ViewProviderOrigin::getClassTypeId())) { + //end temporary view mode of coordinate system + for(App::Part* part : App::GetApplication().getActiveDocument()->getObjectsOfType()) { - static_cast(origin)->setTemporaryVisibilityMode(false); + 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; + } } delete ui; diff --git a/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.cpp b/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.cpp index c439ef0d9..3e28289a4 100644 --- a/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -45,6 +46,7 @@ #include #include #include +#include #include #include #include @@ -150,6 +152,21 @@ void TaskLinearPatternParameters::setupUI() ui->spinLength->blockSignals(false); ui->spinOccurrences->setEnabled(true); 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; + } + } } void TaskLinearPatternParameters::updateUI() @@ -183,11 +200,11 @@ void TaskLinearPatternParameters::updateUI() ui->comboDirection->setCurrentIndex(0); else if (directions.front() == "V_Axis") ui->comboDirection->setCurrentIndex(1); - else if (strcmp(directionFeature->getNameInDocument(), App::Part::BaseplaneTypes[0]) == 0) + else if (strcmp(directionFeature->getNameInDocument(), App::Part::BaselineTypes[0]) == 0) ui->comboDirection->setCurrentIndex(2); - else if (strcmp(directionFeature->getNameInDocument(), App::Part::BaseplaneTypes[1]) == 0) + else if (strcmp(directionFeature->getNameInDocument(), App::Part::BaselineTypes[1]) == 0) ui->comboDirection->setCurrentIndex(3); - else if (strcmp(directionFeature->getNameInDocument(), App::Part::BaseplaneTypes[2]) == 0) + else if (strcmp(directionFeature->getNameInDocument(), App::Part::BaselineTypes[2]) == 0) ui->comboDirection->setCurrentIndex(4); else if (directions.front().size() > 4 && directions.front().substr(0,4) == "Axis") { int pos = 5 + std::atoi(directions.front().substr(4,4000).c_str()); @@ -270,6 +287,18 @@ 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) { + + std::vector directions; + App::DocumentObject* selObj; + PartDesign::LinearPattern* pcLinearPattern = static_cast(getObject()); + getReferencedSelection(pcLinearPattern, msg, selObj, directions); + pcLinearPattern->Direction.setValue(selObj, directions); + + recomputeFeature(); + updateUI(); } } } @@ -329,17 +358,17 @@ void TaskLinearPatternParameters::onDirectionChanged(int num) { exitSelectionMode(); } else if (num == 2) { - pcLinearPattern->Direction.setValue(getObject()->getDocument()->getObject(App::Part::BaseplaneTypes[0]), + pcLinearPattern->Direction.setValue(getObject()->getDocument()->getObject(App::Part::BaselineTypes[0]), std::vector(1,"")); exitSelectionMode(); } else if (num == 3) { - pcLinearPattern->Direction.setValue(getObject()->getDocument()->getObject(App::Part::BaseplaneTypes[1]), + pcLinearPattern->Direction.setValue(getObject()->getDocument()->getObject(App::Part::BaselineTypes[1]), std::vector(1,"")); exitSelectionMode(); } else if (num == 4) { - pcLinearPattern->Direction.setValue(getObject()->getDocument()->getObject(App::Part::BaseplaneTypes[2]), + pcLinearPattern->Direction.setValue(getObject()->getDocument()->getObject(App::Part::BaselineTypes[2]), std::vector(1,"")); exitSelectionMode(); } @@ -406,11 +435,11 @@ void TaskLinearPatternParameters::getDirection(App::DocumentObject*& obj, std::v else if (num == 1) sub[0] = "V_Axis"; else if (num == 2) - obj = getObject()->getDocument()->getObject(App::Part::BaseplaneTypes[0]); + obj = getObject()->getDocument()->getObject(App::Part::BaselineTypes[0]); else if (num == 3) - obj = getObject()->getDocument()->getObject(App::Part::BaseplaneTypes[1]); + obj = getObject()->getDocument()->getObject(App::Part::BaselineTypes[1]); else if (num == 4) - obj = getObject()->getDocument()->getObject(App::Part::BaseplaneTypes[2]); + obj = getObject()->getDocument()->getObject(App::Part::BaselineTypes[2]); else if (num >= 5 && num < maxcount) { QString buf = QString::fromUtf8("Axis%1").arg(num-5); sub[0] = buf.toStdString(); @@ -442,6 +471,20 @@ 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; + } + } + delete ui; if (proxy) delete proxy; diff --git a/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.ui b/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.ui index 578aa266d..2c1e034ef 100644 --- a/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.ui +++ b/src/Mod/PartDesign/Gui/TaskLinearPatternParameters.ui @@ -6,8 +6,8 @@ 0 0 - 266 - 333 + 270 + 366 @@ -64,17 +64,17 @@ - Base plane XY + Base X axis - Base plane XZ + Base Y axis - Base plane YZ + Base Z axis