From 256c5ed19893ba8979062c69a8234dc6c099a3c9 Mon Sep 17 00:00:00 2001 From: WandererFan Date: Mon, 31 Oct 2016 09:19:56 -0400 Subject: [PATCH] Allow True dimensions to reference multiple Parts --- src/Mod/Measure/App/Measurement.cpp | 6 ++ src/Mod/Measure/App/Measurement.h | 1 + src/Mod/TechDraw/App/DrawViewDimension.cpp | 23 ++++--- src/Mod/TechDraw/App/DrawViewDimension.h | 10 ++- src/Mod/TechDraw/Gui/CommandCreateDims.cpp | 14 +++-- src/Mod/TechDraw/Gui/TaskLinkDim.cpp | 72 +++++++++++++--------- src/Mod/TechDraw/Gui/TaskLinkDim.h | 8 +-- src/Mod/TechDraw/Gui/TaskLinkDim.ui | 63 +++++++++++++------ 8 files changed, 131 insertions(+), 66 deletions(-) diff --git a/src/Mod/Measure/App/Measurement.cpp b/src/Mod/Measure/App/Measurement.cpp index 57a4a9838..061dc2931 100644 --- a/src/Mod/Measure/App/Measurement.cpp +++ b/src/Mod/Measure/App/Measurement.cpp @@ -85,6 +85,12 @@ bool Measurement::has3DReferences() return (References3D.getSize() > 0); } +//add a 3D reference (obj+sub) to end of list +int Measurement::addReference3D(App::DocumentObject *obj, const std::string subName) +{ + return addReference3D(obj,subName.c_str()); +} + ///add a 3D reference (obj+sub) to end of list int Measurement::addReference3D(App::DocumentObject *obj, const char* subName) { diff --git a/src/Mod/Measure/App/Measurement.h b/src/Mod/Measure/App/Measurement.h index 29f7f20c1..9da4e8efb 100644 --- a/src/Mod/Measure/App/Measurement.h +++ b/src/Mod/Measure/App/Measurement.h @@ -58,6 +58,7 @@ public: bool has3DReferences(); /// Add a reference + int addReference3D(App::DocumentObject* obj, const std::string subName); int addReference3D(App::DocumentObject* obj, const char *subName); MeasureType getType(); diff --git a/src/Mod/TechDraw/App/DrawViewDimension.cpp b/src/Mod/TechDraw/App/DrawViewDimension.cpp index dd35cfe2b..13599633e 100644 --- a/src/Mod/TechDraw/App/DrawViewDimension.cpp +++ b/src/Mod/TechDraw/App/DrawViewDimension.cpp @@ -140,7 +140,7 @@ void DrawViewDimension::onChanged(const App::Property* prop) // MeasureType.getValue(),measurement->has3DReferences(),has3DReferences()); clear3DMeasurements(); //Measurement object if (!(References3D.getValues()).empty()) { - set3DMeasurement(References3D.getValues().at(0),References3D.getSubValues()); //Measurement object + setAll3DMeasurement(); } else { if (MeasureType.isValue("True")) { //empty 3dRefs, but True MeasureType.touch(); //run MeasureType logic for this case @@ -156,8 +156,7 @@ void DrawViewDimension::onChanged(const App::Property* prop) void DrawViewDimension::onDocumentRestored() { if (has3DReferences()) { - clear3DMeasurements(); - set3DMeasurement(References3D.getValues().at(0),References3D.getSubValues()); + setAll3DMeasurement(); } } @@ -254,6 +253,7 @@ double DrawViewDimension::getDimValue() const if (!measurement->has3DReferences()) { return result; } + if(Type.isValue("Distance")) { result = measurement->delta().Length(); } else if(Type.isValue("DistanceX")){ @@ -486,14 +486,17 @@ int DrawViewDimension::getRefType2(const std::string g1, const std::string g2) return refType; } -//!add 1 3D measurement Reference -void DrawViewDimension::set3DMeasurement(DocumentObject* const &obj, const std::vector& subElements) +//!add Dimension 3D references to measurement +void DrawViewDimension::setAll3DMeasurement() { - std::vector::const_iterator itSub = subElements.begin(); - for (; itSub != subElements.end(); itSub++) { - //int rc = - static_cast (measurement->addReference3D(obj,(*itSub).c_str())); - } + measurement->clear(); + const std::vector &Objs = References3D.getValues(); + const std::vector &Subs = References3D.getSubValues(); + int end = Objs.size(); + int i = 0; + for ( ; i < end; i++) { + static_cast (measurement->addReference3D(Objs.at(i), Subs.at(i))); + } } //delete all previous measurements diff --git a/src/Mod/TechDraw/App/DrawViewDimension.h b/src/Mod/TechDraw/App/DrawViewDimension.h index 0b1d4a652..4cd9b90ce 100644 --- a/src/Mod/TechDraw/App/DrawViewDimension.h +++ b/src/Mod/TechDraw/App/DrawViewDimension.h @@ -35,6 +35,12 @@ class Measurement; } namespace TechDraw { +class DrawViewPart; + +struct DimRef { + DrawViewPart* part; + std::string sub; +}; class DrawViewPart; @@ -86,6 +92,8 @@ public: static int getRefType1(const std::string s); static int getRefType2(const std::string s1, const std::string s2); int getRefType() const; //Vertex-Vertex, Edge, Edge-Edge + void setAll3DMeasurement(); + void clear3DMeasurements(void); protected: void onChanged(const App::Property* prop); @@ -95,8 +103,6 @@ protected: protected: Measure::Measurement *measurement; - void set3DMeasurement(DocumentObject* const &obj, const std::vector& subElements); - void clear3DMeasurements(void); double dist2Segs(Base::Vector2D s1, Base::Vector2D e1, Base::Vector2D s2, diff --git a/src/Mod/TechDraw/Gui/CommandCreateDims.cpp b/src/Mod/TechDraw/Gui/CommandCreateDims.cpp index 0bc328418..b6e5e5d45 100644 --- a/src/Mod/TechDraw/Gui/CommandCreateDims.cpp +++ b/src/Mod/TechDraw/Gui/CommandCreateDims.cpp @@ -865,14 +865,20 @@ void CmdTechDrawLinkDimension::activated(int iMsg) return; std::vector selection = getSelection().getSelectionEx(); - Part::Feature* obj3D = 0; + + App::DocumentObject* obj3D = 0; + std::vector parts; std::vector subs; std::vector::iterator itSel = selection.begin(); for (; itSel != selection.end(); itSel++) { if ((*itSel).getObject()->isDerivedFrom(Part::Feature::getClassTypeId())) { - obj3D = static_cast ((*itSel).getObject()); - subs = (*itSel).getSubNames(); + obj3D = ((*itSel).getObject()); + std::vector subList = (*itSel).getSubNames(); + for (auto& s:subList) { + parts.push_back(obj3D); + subs.push_back(s); + } } } @@ -890,7 +896,7 @@ void CmdTechDrawLinkDimension::activated(int iMsg) // dialog to select the Dimension to link - Gui::Control().showDialog(new TaskDlgLinkDim(obj3D,subs,page)); + Gui::Control().showDialog(new TaskDlgLinkDim(parts,subs,page)); page->getDocument()->recompute(); //still need to recompute in Gui. why? } diff --git a/src/Mod/TechDraw/Gui/TaskLinkDim.cpp b/src/Mod/TechDraw/Gui/TaskLinkDim.cpp index f5910ab67..bd822b7cb 100644 --- a/src/Mod/TechDraw/Gui/TaskLinkDim.cpp +++ b/src/Mod/TechDraw/Gui/TaskLinkDim.cpp @@ -54,9 +54,9 @@ using namespace TechDraw; using namespace TechDrawGui; -TaskLinkDim::TaskLinkDim(Part::Feature* part, std::vector& subs, TechDraw::DrawPage* page) : +TaskLinkDim::TaskLinkDim(std::vector parts, std::vector& subs, TechDraw::DrawPage* page) : ui(new Ui_TaskLinkDim), - m_part(part), + m_parts(parts), m_subs(subs), m_page(page) { @@ -71,11 +71,16 @@ TaskLinkDim::TaskLinkDim(Part::Feature* part, std::vector& subs, Te loadAvailDims(); - ui->leFeature->setText(QString::fromStdString(part->getNameInDocument())); + ui->leFeature1->setText(QString::fromStdString(parts.at(0)->getNameInDocument())); ui->leGeometry1->setText(QString::fromStdString(subs.at(0))); if (subs.size() > 1) { ui->leGeometry2->setText(QString::fromStdString(subs.at(1))); + if (parts.at(0)->getNameInDocument() != parts.at(1)->getNameInDocument()) { + ui->leFeature2->setText(QString::fromStdString(parts.at(1)->getNameInDocument())); + } else { + ui->leFeature2->clear(); + } } } @@ -149,26 +154,37 @@ bool TaskLinkDim::dimReferencesSelection(const TechDraw::DrawViewDimension* dim) return result; } - Part::Feature* refPart = static_cast(dim->References3D.getValues().at(0)); + //Part::Feature* refPart = static_cast(dim->References3D.getValues().at(0)); + std::vector refParts; + std::vector docObjs = dim->References3D.getValues(); + for (auto& d: docObjs) { + Part::Feature* part = static_cast(d); + refParts.push_back(part); + } std::vector refSubs = dim->References3D.getSubValues(); - if (refPart == m_part) { - if (refSubs.size() == m_subs.size()) { - if (m_subs.size() == 0) { - //we're done. why did we get here? - } else if (refSubs.size() == 1) { - if (refSubs[0] == m_subs[0]) { - result = true; - } - } else { - if ( ((refSubs[0] == m_subs[0]) && - (refSubs[1] == m_subs[1])) || - ((refSubs[0] == m_subs[1]) && - (refSubs[1] == m_subs[0])) ) { - result = true; - } + if (refParts.size() == m_parts.size()) { + if(refParts.size() == 0) { + //shouldn't happen! + } else if (refParts.size() == 1) { + if ((refParts[0] == m_parts[0]) && + (refSubs[0] == m_subs[0]) ) { //everything matches + result = true; + } + } else if (refParts.size() == 2) { + if (( (refParts[0] == m_parts[0]) && + (refParts[1] == m_parts[1]) ) && + ( (refSubs[0] == m_subs[0]) && + (refSubs[1] == m_subs[1]) ) ) { + result = true; + } else if (( (refParts[0] == m_parts[1]) && + (refParts[1] == m_parts[0]) ) && + ( (refSubs[0] == m_subs[1]) && + (refSubs[1] == m_subs[0]) ) ) { + result = true; } } } + return result; } @@ -182,11 +198,11 @@ void TaskLinkDim::updateDims() QString name = child->data(0, Qt::UserRole).toString(); App::DocumentObject* obj = m_page->getDocument()->getObject(name.toStdString().c_str()); TechDraw::DrawViewDimension* dim = dynamic_cast(obj); - std::vector parts; - for (unsigned int iPart = 0; iPart < m_subs.size(); iPart++) { - parts.push_back(m_part); - } - dim->References3D.setValues(parts,m_subs); +// std::vector parts; +// for (unsigned int iPart = 0; iPart < m_subs.size(); iPart++) { +// parts.push_back(m_part); +// } + dim->References3D.setValues(m_parts,m_subs); std::string DimName = dim->getNameInDocument(); std::string measureType = "True"; Gui::Command::doCommand(Gui::Command::Gui,"App.activeDocument().%s.MeasureType = \'%s\'", @@ -204,8 +220,8 @@ void TaskLinkDim::updateDims() std::string DimName = dim->getNameInDocument(); Gui::Command::doCommand(Gui::Command::Gui,"App.activeDocument().%s.MeasureType = \'%s\'", DimName.c_str(),measureType.c_str()); - dim->References3D.setValue(0,""); //set this property to "empty" - //dim->MeasureType.setValue("Projected"); + dim->References3D.setValue(0,""); //DVD.References3D + dim->clear3DMeasurements(); //DVD.measurement.References3D } } } @@ -256,10 +272,10 @@ void TaskLinkDim::changeEvent(QEvent *e) ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -TaskDlgLinkDim::TaskDlgLinkDim(Part::Feature* part,std::vector& subs, TechDraw::DrawPage* page) : +TaskDlgLinkDim::TaskDlgLinkDim(std::vector parts,std::vector& subs, TechDraw::DrawPage* page) : TaskDialog() { - widget = new TaskLinkDim(part,subs,page); + widget = new TaskLinkDim(parts,subs,page); taskbox = new Gui::TaskView::TaskBox(Gui::BitmapFactory().pixmap("TechDraw_Dimension_Link"), widget->windowTitle(), true, 0); taskbox->groupLayout()->addWidget(widget); diff --git a/src/Mod/TechDraw/Gui/TaskLinkDim.h b/src/Mod/TechDraw/Gui/TaskLinkDim.h index 2a0504b5b..ea52a585f 100644 --- a/src/Mod/TechDraw/Gui/TaskLinkDim.h +++ b/src/Mod/TechDraw/Gui/TaskLinkDim.h @@ -45,7 +45,7 @@ class TaskLinkDim : public QWidget Q_OBJECT public: - TaskLinkDim(Part::Feature* part,std::vector& subs, TechDraw::DrawPage* page); + TaskLinkDim(std::vector parts,std::vector& subs, TechDraw::DrawPage* page); ~TaskLinkDim(); public: @@ -64,8 +64,8 @@ protected: private: Ui_TaskLinkDim * ui; - Part::Feature* m_part; - std::vector m_subs; + const std::vector m_parts; + const std::vector m_subs; TechDraw::DrawPage* m_page; }; @@ -74,7 +74,7 @@ class TaskDlgLinkDim : public Gui::TaskView::TaskDialog Q_OBJECT public: - TaskDlgLinkDim(Part::Feature* part,std::vector& subs, TechDraw::DrawPage* page); + TaskDlgLinkDim(std::vector parts,std::vector& subs, TechDraw::DrawPage* page); ~TaskDlgLinkDim(); public: diff --git a/src/Mod/TechDraw/Gui/TaskLinkDim.ui b/src/Mod/TechDraw/Gui/TaskLinkDim.ui index 4e8a445a5..d4b21d5a4 100644 --- a/src/Mod/TechDraw/Gui/TaskLinkDim.ui +++ b/src/Mod/TechDraw/Gui/TaskLinkDim.ui @@ -6,8 +6,8 @@ 0 0 - 342 - 430 + 400 + 472 @@ -61,7 +61,7 @@ - + Qt::NoFocus @@ -74,10 +74,43 @@ - + - Geometry: + Feature2: + + + + + + + Qt::NoFocus + + + color: rgb(120, 120, 120); + + + true + + + + + + + Qt::NoFocus + + + color: rgb(120, 120, 120); + + + true + + + + + + + Feature1: @@ -94,23 +127,17 @@ - - - - Qt::NoFocus - - - color: rgb(120, 120, 120); - - - true + + + + Geometry1: - - + + - Feature: + Geometry2: