diff --git a/src/Mod/TechDraw/App/DrawProjGroup.cpp b/src/Mod/TechDraw/App/DrawProjGroup.cpp index d8b22aeff..6354e0b71 100644 --- a/src/Mod/TechDraw/App/DrawProjGroup.cpp +++ b/src/Mod/TechDraw/App/DrawProjGroup.cpp @@ -117,18 +117,7 @@ Base::BoundBox3d DrawProjGroup::getBoundingBox() const TechDraw::DrawPage * DrawProjGroup::getPage(void) const { - //TODO: DrawView already has DrawPage* findParentPage() return findParentPage(); - //TechDraw::DrawPage *ret = NULL; - - //std::vector parent = getInList(); - //for (std::vector::iterator it = parent.begin(); it != parent.end(); ++it) { - // if ((*it)->getTypeId().isDerivedFrom(DrawPage::getClassTypeId())) { - // ret = static_cast(*it); - // } - //} - - //return ret; } // Function provided by Joe Dowsett, 2014 @@ -203,11 +192,13 @@ void DrawProjGroup::minimumBbViews(DrawProjGroupItem *viewPtrs[10], void DrawProjGroup::onChanged(const App::Property* prop) { //TODO: For some reason, when the projection type is changed, the isometric views show change appropriately, but the orthographic ones dont... Or vice-versa. - if ( prop == &ProjectionType || - prop == &ScaleType || - prop == &viewOrientationMatrix || - prop == &Scale ) { - if (!isRestoring()) { + if (!isRestoring()) { + if ( prop == &ProjectionType ) { + resetPositions(); + execute(); + } else if (prop == &ScaleType || + prop == &viewOrientationMatrix || + prop == &Scale ) { execute(); } } @@ -494,45 +485,45 @@ bool DrawProjGroup::distributeProjections() double xSpacing = spacingX.getValue(); //in mm double ySpacing = spacingY.getValue(); //in mm - if (viewPtrs[0]) { + if (viewPtrs[0] && viewPtrs[0]->allowAutoPos()) { double displace = std::max(bboxes[0].LengthX() + bboxes[4].LengthX(), bboxes[0].LengthY() + bboxes[4].LengthY()); viewPtrs[0]->X.setValue(displace / -2.0 - xSpacing); viewPtrs[0]->Y.setValue(displace / 2.0 + ySpacing); } - if (viewPtrs[1]) { + if (viewPtrs[1] && viewPtrs[1]->allowAutoPos()) { viewPtrs[1]->Y.setValue((bboxes[1].LengthY() + bboxes[4].LengthY()) / 2.0 + ySpacing); } - if (viewPtrs[2]) { + if (viewPtrs[2] && viewPtrs[2]->allowAutoPos()) { double displace = std::max(bboxes[2].LengthX() + bboxes[4].LengthX(), bboxes[2].LengthY() + bboxes[4].LengthY()); viewPtrs[2]->X.setValue(displace / 2.0 + xSpacing); viewPtrs[2]->Y.setValue(displace / 2.0 + ySpacing); } - if (viewPtrs[3]) { + if (viewPtrs[3] && viewPtrs[3]->allowAutoPos()) { viewPtrs[3]->X.setValue((bboxes[3].LengthX() + bboxes[4].LengthX()) / -2.0 - xSpacing); } if (viewPtrs[4]) { // TODO: Move this check above, and figure out a sane bounding box based on other existing views } - if (viewPtrs[5]) { + if (viewPtrs[5] && viewPtrs[5]->allowAutoPos()) { viewPtrs[5]->X.setValue((bboxes[5].LengthX() + bboxes[4].LengthX()) / 2.0 + xSpacing); } - if (viewPtrs[6]) { + if (viewPtrs[6] && viewPtrs[6]->allowAutoPos()) { //"Rear" if (viewPtrs[5]) - viewPtrs[6]->X.setValue((bboxes[6].LengthX() + bboxes[4].LengthX()) / 2.0 + bboxes[5].LengthX() + 2 * xSpacing); + viewPtrs[6]->X.setValue(viewPtrs[5]->X.getValue() + bboxes[5].LengthX()/2.0 + xSpacing + bboxes[6].LengthX() / 2.0 ); else viewPtrs[6]->X.setValue((bboxes[6].LengthX() + bboxes[4].LengthX()) / 2.0 + xSpacing); } - if (viewPtrs[7]) { + if (viewPtrs[7] && viewPtrs[7]->allowAutoPos()) { double displace = std::max(bboxes[7].LengthX() + bboxes[4].LengthX(), bboxes[7].LengthY() + bboxes[4].LengthY()); viewPtrs[7]->X.setValue(displace / -2.0 - xSpacing); viewPtrs[7]->Y.setValue(displace / -2.0 - ySpacing); } - if (viewPtrs[8]) { + if (viewPtrs[8] && viewPtrs[8]->allowAutoPos()) { viewPtrs[8]->Y.setValue((bboxes[8].LengthY() + bboxes[4].LengthY()) / -2.0 - ySpacing); } - if (viewPtrs[9]) { + if (viewPtrs[9] && viewPtrs[9]->allowAutoPos()) { double displace = std::max(bboxes[9].LengthX() + bboxes[4].LengthX(), bboxes[9].LengthY() + bboxes[4].LengthY()); viewPtrs[9]->X.setValue(displace / 2.0 + xSpacing); @@ -542,6 +533,17 @@ bool DrawProjGroup::distributeProjections() return true; } +void DrawProjGroup::resetPositions(void) +{ + const std::vector &views = Views.getValues(); + for(std::vector::const_iterator it = views.begin(); it != views.end(); ++it) { + DrawView *view = dynamic_cast(*it); + if(view->getTypeId() == DrawProjGroupItem::getClassTypeId()) { + view->setAutoPos(true); + } + } +} + //TODO: Turn this into a command so it can be issued from python void DrawProjGroup::setFrontViewOrientation(const Base::Matrix4D &newMat) { diff --git a/src/Mod/TechDraw/App/DrawProjGroup.h b/src/Mod/TechDraw/App/DrawProjGroup.h index 62b62222f..7dffd827c 100644 --- a/src/Mod/TechDraw/App/DrawProjGroup.h +++ b/src/Mod/TechDraw/App/DrawProjGroup.h @@ -82,7 +82,7 @@ public: /// Automatically position child views bool distributeProjections(void); - + void resetPositions(void); /// Changes child views' coordinate space /*! * Used to set the Direction and XAxisDirection in child views diff --git a/src/Mod/TechDraw/App/DrawView.cpp b/src/Mod/TechDraw/App/DrawView.cpp index ca5b25454..1ad37c70e 100644 --- a/src/Mod/TechDraw/App/DrawView.cpp +++ b/src/Mod/TechDraw/App/DrawView.cpp @@ -77,6 +77,8 @@ DrawView::DrawView(void) ADD_PROPERTY_TYPE(Scale ,(1.0),group,App::Prop_None,"Scale factor of the view"); Scale.setStatus(App::Property::ReadOnly,true); + autoPos = true; + } DrawView::~DrawView() @@ -136,9 +138,11 @@ void DrawView::onChanged(const App::Property* prop) //TODO else if (ScaleType.isValue("Automatic"))... DrawView::execute(); } else if (prop == &X || - prop == &Y || - prop == &Rotation) { - DrawView::execute(); //trigger stuff to happen on Gui side + prop == &Y) { + setAutoPos(false); + DrawView::execute(); + } else if (prop == &Rotation) { + DrawView::execute(); } } diff --git a/src/Mod/TechDraw/App/DrawView.h b/src/Mod/TechDraw/App/DrawView.h index 4e82832e5..b3ecbaf49 100644 --- a/src/Mod/TechDraw/App/DrawView.h +++ b/src/Mod/TechDraw/App/DrawView.h @@ -69,10 +69,13 @@ public: virtual PyObject *getPyObject(void); DrawPage* findParentPage() const; + bool allowAutoPos() {return autoPos;}; + void setAutoPos(bool state) {autoPos = state;}; protected: void onChanged(const App::Property* prop); std::string pageFeatName; + bool autoPos; private: static const char* ScaleTypeEnums[]; diff --git a/src/Mod/TechDraw/Gui/TaskProjGroup.cpp b/src/Mod/TechDraw/Gui/TaskProjGroup.cpp index d905da2b3..21a6d7b7a 100644 --- a/src/Mod/TechDraw/Gui/TaskProjGroup.cpp +++ b/src/Mod/TechDraw/Gui/TaskProjGroup.cpp @@ -62,10 +62,11 @@ TaskProjGroup::TaskProjGroup(TechDraw::DrawProjGroup* featView) : ui(new Ui_Task blockUpdate = true; - setFractionalScale(multiView->Scale.getValue()); + ui->projection->setCurrentIndex(multiView->ProjectionType.getValue()); + setFractionalScale(multiView->Scale.getValue()); ui->cmbScaleType->setCurrentIndex(multiView->ScaleType.getValue()); - + // Initially toggle view checkboxes if needed setupViewCheckboxes(true); @@ -357,7 +358,7 @@ void TaskProjGroup::setupViewCheckboxes(bool addConnections) if (addConnections) { connect(box, SIGNAL(toggled(bool)), this, SLOT(viewToggled(bool))); } - + const char *viewStr = viewChkIndexToCStr(i); if ( viewStr != NULL && multiView->hasProjection(viewStr) ) { box->setCheckState(Qt::Checked); @@ -369,7 +370,7 @@ void TaskProjGroup::setupViewCheckboxes(bool addConnections) ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //TODO: Do we really need to hang on to the TaskDlgProjGroup in this class? IR -TaskDlgProjGroup::TaskDlgProjGroup(TechDraw::DrawProjGroup* featView) : TaskDialog(), +TaskDlgProjGroup::TaskDlgProjGroup(TechDraw::DrawProjGroup* featView) : TaskDialog(), multiView(featView) { viewProvider = dynamic_cast(featView); @@ -410,4 +411,3 @@ bool TaskDlgProjGroup::reject() #include "moc_TaskProjGroup.cpp" -