diff --git a/src/Mod/TechDraw/App/DrawProjGroup.cpp b/src/Mod/TechDraw/App/DrawProjGroup.cpp index 0a7fcf49ea..679772ffa7 100644 --- a/src/Mod/TechDraw/App/DrawProjGroup.cpp +++ b/src/Mod/TechDraw/App/DrawProjGroup.cpp @@ -583,74 +583,7 @@ std::pair DrawProjGroup::getDirsFromFront(std::s throw Base::RuntimeError("Project Group missing Anchor projection item"); } - Base::Vector3d org(0.0, 0.0, 0.0); - gp_Ax2 anchorCS = anch->getProjectionCS(org); - gp_Pnt gOrg(0.0, 0.0, 0.0); - gp_Dir gDir = anchorCS.Direction(); - gp_Dir gXDir = anchorCS.XDirection(); - gp_Dir gYDir = anchorCS.YDirection(); - gp_Ax1 gUpAxis(gOrg, gYDir); - gp_Ax2 newCS; - gp_Dir gNewDir; - gp_Dir gNewXDir; - - double angle = M_PI / 2.0;//90* - - if (viewType == "Right") { - newCS = anchorCS.Rotated(gUpAxis, angle); - projDir = dir2vec(newCS.Direction()); - rotVec = dir2vec(newCS.XDirection()); - } - else if (viewType == "Left") { - newCS = anchorCS.Rotated(gUpAxis, -angle); - projDir = dir2vec(newCS.Direction()); - rotVec = dir2vec(newCS.XDirection()); - } - else if (viewType == "Top") { - projDir = dir2vec(gYDir); - rotVec = dir2vec(gXDir); - } - else if (viewType == "Bottom") { - projDir = dir2vec(gYDir.Reversed()); - rotVec = dir2vec(gXDir); - } - else if (viewType == "Rear") { - projDir = dir2vec(gDir.Reversed()); - rotVec = dir2vec(gXDir.Reversed()); - } - else if (viewType == "FrontTopLeft") { - gp_Dir newDir = gp_Dir(gp_Vec(gDir) - gp_Vec(gXDir) + gp_Vec(gYDir)); - projDir = dir2vec(newDir); - gp_Dir newXDir = gp_Dir(gp_Vec(gXDir) + gp_Vec(gDir)); - rotVec = dir2vec(newXDir); - } - else if (viewType == "FrontTopRight") { - gp_Dir newDir = gp_Dir(gp_Vec(gDir) + gp_Vec(gXDir) + gp_Vec(gYDir)); - projDir = dir2vec(newDir); - gp_Dir newXDir = gp_Dir(gp_Vec(gXDir) - gp_Vec(gDir)); - rotVec = dir2vec(newXDir); - } - else if (viewType == "FrontBottomLeft") { - gp_Dir newDir = gp_Dir(gp_Vec(gDir) - gp_Vec(gXDir) - gp_Vec(gYDir)); - projDir = dir2vec(newDir); - gp_Dir newXDir = gp_Dir(gp_Vec(gXDir) + gp_Vec(gDir)); - rotVec = dir2vec(newXDir); - } - else if (viewType == "FrontBottomRight") { - gp_Dir newDir = gp_Dir(gp_Vec(gDir) + gp_Vec(gXDir) - gp_Vec(gYDir)); - projDir = dir2vec(newDir); - gp_Dir newXDir = gp_Dir(gp_Vec(gXDir) - gp_Vec(gDir)); - rotVec = dir2vec(newXDir); - } else { - // not one of the standard view directions, so complain and use the values for "Front" - Base::Console().Error("DrawProjGroup - %s unknown projection: %s\n", getNameInDocument(), - viewType.c_str()); - Base::Vector3d dirAnch = anch->Direction.getValue(); - Base::Vector3d rotAnch = anch->getXDirection(); - return std::make_pair(dirAnch, rotAnch); - } - - return std::make_pair(projDir, rotVec); + return anch->getDirsFromFront(viewType); } Base::Vector3d DrawProjGroup::dir2vec(gp_Dir d) diff --git a/src/Mod/TechDraw/App/DrawViewPart.cpp b/src/Mod/TechDraw/App/DrawViewPart.cpp index f2876419bb..07f43c5d4e 100644 --- a/src/Mod/TechDraw/App/DrawViewPart.cpp +++ b/src/Mod/TechDraw/App/DrawViewPart.cpp @@ -1263,6 +1263,124 @@ Base::Vector3d DrawViewPart::getXDirection() const return result; } + +void DrawViewPart::rotate(const std::string& rotationdirection) +{ + std::pair newDirs; + if (rotationdirection == "Right") + newDirs = getDirsFromFront("Left");// Front -> Right -> Rear -> Left -> Front + else if (rotationdirection == "Left") + newDirs = getDirsFromFront("Right");// Front -> Left -> Rear -> Right -> Front + else if (rotationdirection == "Up") + newDirs = getDirsFromFront("Bottom");// Front -> Top -> Rear -> Bottom -> Front + else if (rotationdirection == "Down") + newDirs = getDirsFromFront("Top");// Front -> Bottom -> Rear -> Top -> Front + + Direction.setValue(newDirs.first); + XDirection.setValue(newDirs.second); + recompute(); +} + +void DrawViewPart::spin(const std::string& spindirection) +{ + double angle; + if (spindirection == "CW") + angle = M_PI / 2.0;// Top -> Right -> Bottom -> Left -> Top + if (spindirection == "CCW") + angle = -M_PI / 2.0;// Top -> Left -> Bottom -> Right -> Top + + Base::Vector3d org(0.0, 0.0, 0.0); + Base::Vector3d curRot = getXDirection(); + Base::Vector3d curDir = Direction.getValue(); + Base::Vector3d newRot = DrawUtil::vecRotate(curRot, angle, curDir, org); + + XDirection.setValue(newRot); + recompute(); +} + +std::pair DrawViewPart::getDirsFromFront(std::string viewType) +{ + // Base::Console().Message("DVP::getDirsFromFront(%s)\n", viewType.c_str()); + std::pair result; + + Base::Vector3d projDir, rotVec; + + Base::Vector3d org(0.0, 0.0, 0.0); + gp_Ax2 anchorCS = getProjectionCS(org); + gp_Pnt gOrg(0.0, 0.0, 0.0); + gp_Dir gDir = anchorCS.Direction(); + gp_Dir gXDir = anchorCS.XDirection(); + gp_Dir gYDir = anchorCS.YDirection(); + gp_Ax1 gUpAxis(gOrg, gYDir); + gp_Ax2 newCS; + gp_Dir gNewDir; + gp_Dir gNewXDir; + + double angle = M_PI / 2.0;//90* + + if (viewType == "Right") { + newCS = anchorCS.Rotated(gUpAxis, angle); + projDir = dir2vec(newCS.Direction()); + rotVec = dir2vec(newCS.XDirection()); + } + else if (viewType == "Left") { + newCS = anchorCS.Rotated(gUpAxis, -angle); + projDir = dir2vec(newCS.Direction()); + rotVec = dir2vec(newCS.XDirection()); + } + else if (viewType == "Top") { + projDir = dir2vec(gYDir); + rotVec = dir2vec(gXDir); + } + else if (viewType == "Bottom") { + projDir = dir2vec(gYDir.Reversed()); + rotVec = dir2vec(gXDir); + } + else if (viewType == "Rear") { + projDir = dir2vec(gDir.Reversed()); + rotVec = dir2vec(gXDir.Reversed()); + } + else if (viewType == "FrontTopLeft") { + gp_Dir newDir = gp_Dir(gp_Vec(gDir) - gp_Vec(gXDir) + gp_Vec(gYDir)); + projDir = dir2vec(newDir); + gp_Dir newXDir = gp_Dir(gp_Vec(gXDir) + gp_Vec(gDir)); + rotVec = dir2vec(newXDir); + } + else if (viewType == "FrontTopRight") { + gp_Dir newDir = gp_Dir(gp_Vec(gDir) + gp_Vec(gXDir) + gp_Vec(gYDir)); + projDir = dir2vec(newDir); + gp_Dir newXDir = gp_Dir(gp_Vec(gXDir) - gp_Vec(gDir)); + rotVec = dir2vec(newXDir); + } + else if (viewType == "FrontBottomLeft") { + gp_Dir newDir = gp_Dir(gp_Vec(gDir) - gp_Vec(gXDir) - gp_Vec(gYDir)); + projDir = dir2vec(newDir); + gp_Dir newXDir = gp_Dir(gp_Vec(gXDir) + gp_Vec(gDir)); + rotVec = dir2vec(newXDir); + } + else if (viewType == "FrontBottomRight") { + gp_Dir newDir = gp_Dir(gp_Vec(gDir) + gp_Vec(gXDir) - gp_Vec(gYDir)); + projDir = dir2vec(newDir); + gp_Dir newXDir = gp_Dir(gp_Vec(gXDir) - gp_Vec(gDir)); + rotVec = dir2vec(newXDir); + } + else { + // not one of the standard view directions, so complain and use the values for "Front" + Base::Console().Error("DrawViewPart - %s unknown projection: %s\n", getNameInDocument(), + viewType.c_str()); + Base::Vector3d dirAnch = Direction.getValue(); + Base::Vector3d rotAnch = getXDirection(); + return std::make_pair(dirAnch, rotAnch); + } + + return std::make_pair(projDir, rotVec); +} + +Base::Vector3d DrawViewPart::dir2vec(gp_Dir d) +{ + return Base::Vector3d(d.X(), d.Y(), d.Z()); +} + Base::Vector3d DrawViewPart::getLegacyX(const Base::Vector3d& pt, const Base::Vector3d& axis, const bool flip) const { diff --git a/src/Mod/TechDraw/App/DrawViewPart.h b/src/Mod/TechDraw/App/DrawViewPart.h index 896261665b..32b321bfca 100644 --- a/src/Mod/TechDraw/App/DrawViewPart.h +++ b/src/Mod/TechDraw/App/DrawViewPart.h @@ -172,6 +172,11 @@ public: virtual Base::Vector3d getLegacyX(const Base::Vector3d& pt, const Base::Vector3d& axis, const bool flip = true) const; + void rotate(const std::string& rotationdirection); + void spin(const std::string& spindirection); + std::pair getDirsFromFront(std::string viewType); + Base::Vector3d dir2vec(gp_Dir d); + gp_Ax2 localVectorToCS(const Base::Vector3d localUnit) const; Base::Vector3d localVectorToDirection(const Base::Vector3d localUnit) const; diff --git a/src/Mod/TechDraw/Gui/Command.cpp b/src/Mod/TechDraw/Gui/Command.cpp index 0ef6802b3c..a14044c6e9 100644 --- a/src/Mod/TechDraw/Gui/Command.cpp +++ b/src/Mod/TechDraw/Gui/Command.cpp @@ -297,7 +297,7 @@ CmdTechDrawView::CmdTechDrawView() : Command("TechDraw_View") sGroup = QT_TR_NOOP("TechDraw"); sMenuText = QT_TR_NOOP("Insert View"); sToolTipText = QT_TR_NOOP("Insert a View in current page.\n" - "Selected objects, spreadsheets or Arch WB section planes will be added with the current camera orientation.\n" + "Selected objects, spreadsheets or Arch WB section planes will be added.\n" "Without a selection, a file browser lets you select a SVG or image file."); sWhatsThis = "TechDraw_View"; sStatusTip = sToolTipText; @@ -469,51 +469,72 @@ void CmdTechDrawView::activated(int iMsg) return; } - Base::Vector3d projDir; Gui::WaitCursor wc; - openCommand(QT_TRANSLATE_NOOP("Command", "Create view")); - std::string FeatName = getUniqueObjectName("View"); - doCommand(Doc, "App.activeDocument().addObject('TechDraw::DrawViewPart', '%s')", - FeatName.c_str()); - doCommand(Doc, "App.activeDocument().%s.translateLabel('DrawViewPart', 'View', '%s')", - FeatName.c_str(), FeatName.c_str()); - doCommand(Doc, "App.activeDocument().%s.addView(App.activeDocument().%s)", PageName.c_str(), - FeatName.c_str()); + bool createProjGroup = hGrp->GetBool("InsertAsProjGroup", true); + if (createProjGroup) { + openCommand(QT_TRANSLATE_NOOP("Command", "Create Projection Group")); + + std::string multiViewName = getUniqueObjectName("ProjGroup"); + doCommand(Doc, "App.activeDocument().addObject('TechDraw::DrawProjGroup', '%s')", + multiViewName.c_str()); + doCommand(Doc, "App.activeDocument().%s.addView(App.activeDocument().%s)", PageName.c_str(), + multiViewName.c_str()); + + App::DocumentObject* docObj = getDocument()->getObject(multiViewName.c_str()); + auto multiView(static_cast(docObj)); + multiView->Source.setValues(shapes); + multiView->XSource.setValues(xShapes); + doCommand(Doc, "App.activeDocument().%s.addProjection('Front')", multiViewName.c_str()); - App::DocumentObject* docObj = getDocument()->getObject(FeatName.c_str()); - TechDraw::DrawViewPart* dvp = dynamic_cast(docObj); - if (!dvp) { - throw Base::TypeError("CmdTechDrawView DVP not found\n"); - } - dvp->Source.setValues(shapes); - dvp->XSource.setValues(xShapes); - if (!faceName.empty()) { - std::pair dirs = - DrawGuiUtil::getProjDirFromFace(partObj, faceName); - projDir = dirs.first; getDocument()->setStatus(App::Document::Status::SkipRecompute, true); - doCommand(Doc, "App.activeDocument().%s.Direction = FreeCAD.Vector(%.12f, %.12f, %.12f)", - FeatName.c_str(), projDir.x, projDir.y, projDir.z); - //do something clever with dirs.second; - // dvp->setXDir(dirs.second); - doCommand(Doc, "App.activeDocument().%s.XDirection = FreeCAD.Vector(%.12f, %.12f, %.12f)", - FeatName.c_str(), dirs.second.x, dirs.second.y, dirs.second.z); - doCommand(Doc, "App.activeDocument().%s.recompute()", FeatName.c_str()); + doCommand(Doc, + "App.activeDocument().%s.Anchor.Direction = FreeCAD.Vector(0.0, -1.0, 0.0)", + multiViewName.c_str()); + doCommand(Doc, + "App.activeDocument().%s.Anchor.RotationVector = FreeCAD.Vector(1.0, 0.0, 0.0)", + multiViewName.c_str()); + doCommand(Doc, + "App.activeDocument().%s.Anchor.XDirection = FreeCAD.Vector(1.0, 0.0, 0.0)", + multiViewName.c_str()); getDocument()->setStatus(App::Document::Status::SkipRecompute, false); + + doCommand(Doc, "App.activeDocument().%s.Anchor.recompute()", multiViewName.c_str()); + commitCommand(); + updateActive(); + + // create the rest of the desired views + Gui::Control().showDialog(new TaskDlgProjGroup(multiView, true)); } else { - std::pair dirs = DrawGuiUtil::get3DDirAndRot(); - projDir = dirs.first; + openCommand(QT_TRANSLATE_NOOP("Command", "Create view")); + std::string FeatName = getUniqueObjectName("View"); + doCommand(Doc, "App.activeDocument().addObject('TechDraw::DrawViewPart', '%s')", + FeatName.c_str()); + doCommand(Doc, "App.activeDocument().%s.translateLabel('DrawViewPart', 'View', '%s')", + FeatName.c_str(), FeatName.c_str()); + doCommand(Doc, "App.activeDocument().%s.addView(App.activeDocument().%s)", PageName.c_str(), + FeatName.c_str()); + + App::DocumentObject* docObj = getDocument()->getObject(FeatName.c_str()); + auto* dvp = dynamic_cast(docObj); + if (!dvp) { + throw Base::TypeError("CmdTechDrawView DVP not found\n"); + } + dvp->Source.setValues(shapes); + dvp->XSource.setValues(xShapes); + getDocument()->setStatus(App::Document::Status::SkipRecompute, true); - doCommand(Doc, "App.activeDocument().%s.Direction = FreeCAD.Vector(%.12f, %.12f, %.12f)", - FeatName.c_str(), projDir.x, projDir.y, projDir.z); - doCommand(Doc, "App.activeDocument().%s.XDirection = FreeCAD.Vector(%.12f, %.12f, %.12f)", - FeatName.c_str(), dirs.second.x, dirs.second.y, dirs.second.z); - // dvp->setXDir(dirs.second); + doCommand(Doc, "App.activeDocument().%s.Direction = FreeCAD.Vector(0.0, -1.0, 0.0)", + FeatName.c_str()); + doCommand(Doc, "App.activeDocument().%s.XDirection = FreeCAD.Vector(1.0, 0.0, 0.0)", + FeatName.c_str()); getDocument()->setStatus(App::Document::Status::SkipRecompute, false); doCommand(Doc, "App.activeDocument().%s.recompute()", FeatName.c_str()); + commitCommand(); + + // create the rest of the desired views + Gui::Control().showDialog(new TaskDlgProjGroup(dvp, true)); } - commitCommand(); } bool CmdTechDrawView::isActive() { return DrawGuiUtil::needPage(this); } @@ -1106,37 +1127,21 @@ void CmdTechDrawProjectionGroup::activated(int iMsg) multiView->XSource.setValues(xShapes); doCommand(Doc, "App.activeDocument().%s.addProjection('Front')", multiViewName.c_str()); - if (!faceName.empty()) { - std::pair dirs = - DrawGuiUtil::getProjDirFromFace(partObj, faceName); - getDocument()->setStatus(App::Document::Status::SkipRecompute, true); - doCommand(Doc, - "App.activeDocument().%s.Anchor.Direction = FreeCAD.Vector(%.12f, %.12f, %.12f)", - multiViewName.c_str(), dirs.first.x, dirs.first.y, dirs.first.z); - doCommand( - Doc, - "App.activeDocument().%s.Anchor.RotationVector = FreeCAD.Vector(%.12f, %.12f, %.12f)", - multiViewName.c_str(), dirs.second.x, dirs.second.y, dirs.second.z); - doCommand(Doc, - "App.activeDocument().%s.Anchor.XDirection = FreeCAD.Vector(%.12f, %.12f, %.12f)", - multiViewName.c_str(), dirs.second.x, dirs.second.y, dirs.second.z); - getDocument()->setStatus(App::Document::Status::SkipRecompute, false); - } - else { - std::pair dirs = DrawGuiUtil::get3DDirAndRot(); - getDocument()->setStatus(App::Document::Status::SkipRecompute, true); - doCommand(Doc, - "App.activeDocument().%s.Anchor.Direction = FreeCAD.Vector(%.12f, %.12f, %.12f)", - multiViewName.c_str(), dirs.first.x, dirs.first.y, dirs.first.z); - doCommand( - Doc, - "App.activeDocument().%s.Anchor.RotationVector = FreeCAD.Vector(%.12f, %.12f, %.12f)", - multiViewName.c_str(), dirs.second.x, dirs.second.y, dirs.second.z); - doCommand(Doc, - "App.activeDocument().%s.Anchor.XDirection = FreeCAD.Vector(%.12f, %.12f, %.12f)", - multiViewName.c_str(), dirs.second.x, dirs.second.y, dirs.second.z); - getDocument()->setStatus(App::Document::Status::SkipRecompute, false); - } + std::pair dirs = !faceName.empty() ? + DrawGuiUtil::getProjDirFromFace(partObj, faceName) + : DrawGuiUtil::get3DDirAndRot(); + + getDocument()->setStatus(App::Document::Status::SkipRecompute, true); + doCommand(Doc, + "App.activeDocument().%s.Anchor.Direction = FreeCAD.Vector(%.12f, %.12f, %.12f)", + multiViewName.c_str(), dirs.first.x, dirs.first.y, dirs.first.z); + doCommand(Doc, + "App.activeDocument().%s.Anchor.RotationVector = FreeCAD.Vector(%.12f, %.12f, %.12f)", + multiViewName.c_str(), dirs.second.x, dirs.second.y, dirs.second.z); + doCommand(Doc, + "App.activeDocument().%s.Anchor.XDirection = FreeCAD.Vector(%.12f, %.12f, %.12f)", + multiViewName.c_str(), dirs.second.x, dirs.second.y, dirs.second.z); + getDocument()->setStatus(App::Document::Status::SkipRecompute, false); doCommand(Doc, "App.activeDocument().%s.Anchor.recompute()", multiViewName.c_str()); commitCommand(); diff --git a/src/Mod/TechDraw/Gui/Resources/TechDraw.qrc b/src/Mod/TechDraw/Gui/Resources/TechDraw.qrc index df640134ff..82812f4187 100644 --- a/src/Mod/TechDraw/Gui/Resources/TechDraw.qrc +++ b/src/Mod/TechDraw/Gui/Resources/TechDraw.qrc @@ -87,6 +87,7 @@ icons/TechDraw_3PtAngleDimension.svg icons/TechDraw_AngleDimension.svg icons/TechDraw_Balloon.svg + icons/TechDraw_CameraOrientation.svg icons/TechDraw_DiameterDimension.svg icons/TechDraw_Dimension.svg icons/TechDraw_DimensionRepair.svg diff --git a/src/Mod/TechDraw/Gui/Resources/icons/TechDraw_CameraOrientation.svg b/src/Mod/TechDraw/Gui/Resources/icons/TechDraw_CameraOrientation.svg new file mode 100644 index 0000000000..1c103f40dc --- /dev/null +++ b/src/Mod/TechDraw/Gui/Resources/icons/TechDraw_CameraOrientation.svg @@ -0,0 +1,195 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Mod/TechDraw/Gui/TaskProjGroup.cpp b/src/Mod/TechDraw/Gui/TaskProjGroup.cpp index 043810c0f7..8b285dc2b5 100644 --- a/src/Mod/TechDraw/Gui/TaskProjGroup.cpp +++ b/src/Mod/TechDraw/Gui/TaskProjGroup.cpp @@ -27,6 +27,7 @@ # include #endif // #ifndef _PreComp_ +#include #include #include #include @@ -36,37 +37,41 @@ #include #include -#include +#include +#include #include +#include #include +#include "DrawGuiUtil.h" #include "TaskProjGroup.h" #include "ui_TaskProjGroup.h" #include "MDIViewPage.h" #include "ViewProviderPage.h" -#include "ViewProviderProjGroup.h" +#include "ViewProviderDrawingView.h" using namespace Gui; using namespace TechDraw; using namespace TechDrawGui; -TaskProjGroup::TaskProjGroup(TechDraw::DrawProjGroup* featView, bool mode) : +TaskProjGroup::TaskProjGroup(TechDraw::DrawView* featView, bool mode) : ui(new Ui_TaskProjGroup), - multiView(featView), + view(featView), + multiView(nullptr), m_createMode(mode) { ui->setupUi(this); blockUpdate = true; + multiView = dynamic_cast(view); + updateUi(); - ui->projection->setCurrentIndex(multiView->ProjectionType.getValue()); - - setFractionalScale(multiView->getScale()); - ui->cmbScaleType->setCurrentIndex(multiView->ScaleType.getValue()); + setFractionalScale(view->getScale()); + ui->cmbScaleType->setCurrentIndex(view->ScaleType.getValue()); //Allow or prevent scale changing initially - if (multiView->ScaleType.isValue("Custom")) { + if (view->ScaleType.isValue("Custom")) { ui->sbScaleNum->setEnabled(true); ui->sbScaleDen->setEnabled(true); } @@ -75,12 +80,6 @@ TaskProjGroup::TaskProjGroup(TechDraw::DrawProjGroup* featView, bool mode) : ui->sbScaleDen->setEnabled(false); } - ui->cbAutoDistribute->setChecked(multiView->AutoDistribute.getValue()); - // disable if no AutoDistribute - ui->sbXSpacing->setEnabled(multiView->AutoDistribute.getValue()); - ui->sbYSpacing->setEnabled(multiView->AutoDistribute.getValue()); - ui->sbXSpacing->setValue(multiView->spacingX.getValue()); - ui->sbYSpacing->setValue(multiView->spacingY.getValue()); // Initially toggle view checkboxes if needed setupViewCheckboxes(true); @@ -95,6 +94,8 @@ TaskProjGroup::TaskProjGroup(TechDraw::DrawProjGroup* featView, bool mode) : connect(ui->butDownRotate, &QPushButton::clicked, this, &TaskProjGroup::rotateButtonClicked); connect(ui->butLeftRotate, &QPushButton::clicked, this, &TaskProjGroup::rotateButtonClicked); connect(ui->butCCWRotate, &QPushButton::clicked, this, &TaskProjGroup::rotateButtonClicked); + connect(ui->butFront, &QPushButton::clicked, this, &TaskProjGroup::rotateButtonClicked); + connect(ui->butCam, &QPushButton::clicked, this, &TaskProjGroup::rotateButtonClicked); // //Reset button // connect(ui->butReset, SIGNAL(clicked()), this, SLOT(onResetClicked())); @@ -120,36 +121,71 @@ TaskProjGroup::TaskProjGroup(TechDraw::DrawProjGroup* featView, bool mode) : ui->sbXSpacing->setUnit(Base::Unit::Length); ui->sbYSpacing->setUnit(Base::Unit::Length); - m_page = multiView->findParentPage(); + m_page = view->findParentPage(); Gui::Document* activeGui = Gui::Application::Instance->getDocument(m_page->getDocument()); Gui::ViewProvider* vp = activeGui->getViewProvider(m_page); - ViewProviderPage* dvp = static_cast(vp); + auto* dvp = static_cast(vp); m_mdi = dvp->getMDIViewPage(); setUiPrimary(); saveGroupState(); } +void TaskProjGroup::updateUi() +{ + if (multiView) { + setWindowTitle(QObject::tr("Projection Group")); + ui->projection->show(); + ui->cbAutoDistribute->show(); + ui->sbXSpacing->show(); + ui->sbYSpacing->show(); + ui->label_7->show(); + ui->label_10->show(); + ui->label_11->show(); + + ui->projection->setCurrentIndex(multiView->ProjectionType.getValue()); + ui->cbAutoDistribute->setChecked(multiView->AutoDistribute.getValue()); + // disable if no AutoDistribute + ui->sbXSpacing->setEnabled(multiView->AutoDistribute.getValue()); + ui->sbYSpacing->setEnabled(multiView->AutoDistribute.getValue()); + ui->sbXSpacing->setValue(multiView->spacingX.getValue()); + ui->sbYSpacing->setValue(multiView->spacingY.getValue()); + } + else { + setWindowTitle(QObject::tr("Part View")); + ui->projection->hide(); + ui->cbAutoDistribute->hide(); + ui->sbXSpacing->hide(); + ui->sbYSpacing->hide(); + ui->label_7->hide(); + ui->label_10->hide(); + ui->label_11->hide(); + } +} + void TaskProjGroup::saveGroupState() { // Base::Console().Message("TPG::saveGroupState()\n"); - if (!multiView) + if (!view) return; - m_saveSource = multiView->Source.getValues(); - m_saveProjType = multiView->ProjectionType.getValueAsString(); - m_saveScaleType = multiView->ScaleType.getValueAsString(); - m_saveScale = multiView->Scale.getValue(); - m_saveAutoDistribute = multiView->AutoDistribute.getValue(); - m_saveSpacingX = multiView->spacingX.getValue(); - m_saveSpacingY = multiView->spacingY.getValue(); - DrawProjGroupItem* anchor = multiView->getAnchor(); - m_saveDirection = anchor->Direction.getValue(); + m_saveScaleType = view->ScaleType.getValueAsString(); + m_saveScale = view->Scale.getValue(); - for( const auto it : multiView->Views.getValues() ) { - auto view( dynamic_cast(it) ); - if (view) { - m_saveViewNames.emplace_back(view->Type.getValueAsString()); + if (multiView) { + m_saveSource = multiView->Source.getValues(); + m_saveProjType = multiView->ProjectionType.getValueAsString(); + m_saveAutoDistribute = multiView->AutoDistribute.getValue(); + m_saveSpacingX = multiView->spacingX.getValue(); + m_saveSpacingY = multiView->spacingY.getValue(); + DrawProjGroupItem* anchor = multiView->getAnchor(); + m_saveDirection = anchor->Direction.getValue(); + + for( const auto it : multiView->Views.getValues() ) { + auto view( dynamic_cast(it) ); + if (view) { + m_saveViewNames.emplace_back(view->Type.getValueAsString()); + } } } } @@ -158,19 +194,22 @@ void TaskProjGroup::saveGroupState() void TaskProjGroup::restoreGroupState() { Base::Console().Message("TPG::restoreGroupState()\n"); - if (!multiView) + if (!view) return; - multiView->ProjectionType.setValue(m_saveProjType.c_str()); - multiView->ScaleType.setValue(m_saveScaleType.c_str()); - multiView->Scale.setValue(m_saveScale); - multiView->AutoDistribute.setValue(m_saveAutoDistribute); - multiView->spacingX.setValue(m_saveSpacingX); - multiView->spacingY.setValue(m_saveSpacingY); - multiView->purgeProjections(); - for(auto & sv : m_saveViewNames) { - if (sv != "Front") { - multiView->addProjection(sv.c_str()); + view->ScaleType.setValue(m_saveScaleType.c_str()); + view->Scale.setValue(m_saveScale); + + if (multiView) { + multiView->ProjectionType.setValue(m_saveProjType.c_str()); + multiView->AutoDistribute.setValue(m_saveAutoDistribute); + multiView->spacingX.setValue(m_saveSpacingX); + multiView->spacingY.setValue(m_saveSpacingY); + multiView->purgeProjections(); + for(auto & sv : m_saveViewNames) { + if (sv != "Front") { + multiView->addProjection(sv.c_str()); + } } } } @@ -180,42 +219,147 @@ void TaskProjGroup::viewToggled(bool toggle) Gui::WaitCursor wc; bool changed = false; // Obtain name of checkbox - QString viewName = sender()->objectName(); - int index = viewName.mid(7).toInt(); + int index = sender()->objectName().mid(7).toInt(); const char *viewNameCStr = viewChkIndexToCStr(index); - if ( toggle && !multiView->hasProjection( viewNameCStr ) ) { + + if (multiView) { + // Check if only front is now available. If so switch to normal view. + } + else { + // If toggle then we remove the view object and create a proj group instead. + + App::Document* doc = view->getDocument(); + + std::string multiViewName = doc->getUniqueObjectName("ProjGroup"); + Gui::Command::doCommand(Gui::Command::Gui, "App.activeDocument().addObject('TechDraw::DrawProjGroup', '%s')", multiViewName.c_str()); + Gui::Command::doCommand(Gui::Command::Gui, "App.activeDocument().%s.addView(App.activeDocument().%s)", view->findParentPage()->getNameInDocument(), multiViewName.c_str()); + + auto* viewPart = static_cast(view); + multiView = static_cast(doc->getObject(multiViewName.c_str())); + multiView->Source.setValues(viewPart->Source.getValues()); + multiView->XSource.setValues(viewPart->XSource.getValues()); + multiView->X.setValue(viewPart->X.getValue()); + multiView->Y.setValue(viewPart->Y.getValue()); + Gui::Command::doCommand(Gui::Command::Gui, "App.activeDocument().%s.addProjection('Front')", multiViewName.c_str()); + + Base::Vector3d dir1 = viewPart->Direction.getValue(); + Base::Vector3d dir2 = viewPart->XDirection.getValue(); + + doc->setStatus(App::Document::Status::SkipRecompute, true); + Gui::Command::doCommand(Gui::Command::Gui, + "App.activeDocument().%s.Anchor.Direction = FreeCAD.Vector(%.12f, %.12f, %.12f)", + multiViewName.c_str(), dir1.x, dir1.y, dir1.z); + Gui::Command::doCommand(Gui::Command::Gui, + "App.activeDocument().%s.Anchor.RotationVector = FreeCAD.Vector(%.12f, %.12f, %.12f)", + multiViewName.c_str(), dir2.x, dir2.y, dir2.z); + Gui::Command::doCommand(Gui::Command::Gui, + "App.activeDocument().%s.Anchor.XDirection = FreeCAD.Vector(%.12f, %.12f, %.12f)", + multiViewName.c_str(), dir2.x, dir2.y, dir2.z); + doc->setStatus(App::Document::Status::SkipRecompute, false); + + Gui::Command::doCommand(Gui::Command::Gui, "App.activeDocument().%s.Anchor.recompute()", multiViewName.c_str()); + + Gui::Command::doCommand(Gui::Command::Gui, "App.activeDocument().removeObject('%s')", view->getNameInDocument()); + view = multiView; + + updateUi(); + } + + + if (toggle && !multiView->hasProjection(viewNameCStr)) { Gui::Command::doCommand(Gui::Command::Doc, "App.activeDocument().%s.addProjection('%s')", multiView->getNameInDocument(), viewNameCStr); changed = true; - } else if ( !toggle && multiView->hasProjection( viewNameCStr ) ) { + } + else if (!toggle && multiView->hasProjection(viewNameCStr)) { if (multiView->canDelete(viewNameCStr)) { multiView->removeProjection( viewNameCStr ); changed = true; } } + if (changed) { - if (multiView->ScaleType.isValue("Automatic")) { - double scale = multiView->getScale(); + if (view->ScaleType.isValue("Automatic")) { + double scale = view->getScale(); setFractionalScale(scale); } - multiView->recomputeFeature(); + view->recomputeFeature(); } wc.restoreCursor(); } void TaskProjGroup::rotateButtonClicked() { - if ( multiView && ui ) { + if ( view && ui ) { const QObject *clicked = sender(); - //change Front View Dir by 90 - if ( clicked == ui->butTopRotate ) multiView->rotate("Up"); - else if (clicked == ui->butDownRotate) multiView->rotate("Down"); - else if (clicked == ui->butRightRotate) multiView->rotate("Right"); - else if (clicked == ui->butLeftRotate) multiView->rotate("Left"); - else if (clicked == ui->butCWRotate ) multiView->spin("CW"); - else if (clicked == ui->butCCWRotate) multiView->spin("CCW"); + auto handleCameraButton = [&]() { + std::string faceName; + App::DocumentObject* obj = nullptr; + auto selection = Gui::Command::getSelection().getSelectionEx(); + for (auto& sel : selection) { + for (auto& sub : sel.getSubNames()) { + if (TechDraw::DrawUtil::getGeomTypeFromName(sub) == "Face") { + obj = sel.getObject(); + faceName = sub; + break; + } + } + if (!faceName.empty()) { + break; + } + } + + std::pair dirs = !faceName.empty() ? + DrawGuiUtil::getProjDirFromFace(obj, faceName) + : DrawGuiUtil::get3DDirAndRot(); + return dirs; + }; + + if (multiView) { + //change Front View Dir by 90 + if (clicked == ui->butTopRotate) multiView->rotate("Up"); + else if (clicked == ui->butDownRotate) multiView->rotate("Down"); + else if (clicked == ui->butRightRotate) multiView->rotate("Right"); + else if (clicked == ui->butLeftRotate) multiView->rotate("Left"); + else if (clicked == ui->butCWRotate) multiView->spin("CW"); + else if (clicked == ui->butCCWRotate) multiView->spin("CCW"); + else if (clicked == ui->butFront) { + multiView->getAnchor()->Direction.setValue(Base::Vector3d(0.0, -1.0, 0.0)); + multiView->getAnchor()->RotationVector.setValue(Base::Vector3d(1.0, 0.0, 0.0)); + multiView->getAnchor()->XDirection.setValue(Base::Vector3d(1.0, 0.0, 0.0)); + multiView->updateSecondaryDirs(); + } + else if (clicked == ui->butCam) { + std::pair dirs = handleCameraButton(); + multiView->getAnchor()->Direction.setValue(dirs.first); + multiView->getAnchor()->RotationVector.setValue(dirs.second); + multiView->getAnchor()->XDirection.setValue(dirs.second); + multiView->updateSecondaryDirs(); + } + } + else { + auto* viewPart = static_cast(view); + if (clicked == ui->butTopRotate) viewPart->rotate("Up"); + else if (clicked == ui->butDownRotate) viewPart->rotate("Down"); + else if (clicked == ui->butRightRotate) viewPart->rotate("Right"); + else if (clicked == ui->butLeftRotate) viewPart->rotate("Left"); + else if (clicked == ui->butCWRotate) viewPart->spin("CW"); + else if (clicked == ui->butCCWRotate) viewPart->spin("CCW"); + else if (clicked == ui->butFront) { + viewPart->Direction.setValue(Base::Vector3d(0.0,-1.0,0.0)); + viewPart->XDirection.setValue(Base::Vector3d(1.0, 0.0, 0.0)); + viewPart->recomputeFeature(); + } + else if (clicked == ui->butCam) { + std::pair dirs = handleCameraButton(); + + viewPart->Direction.setValue(dirs.first); + viewPart->XDirection.setValue(dirs.second); + viewPart->recomputeFeature(); + } + } setUiPrimary(); } @@ -224,7 +368,7 @@ void TaskProjGroup::rotateButtonClicked() //void TaskProjGroup::projectionTypeChanged(int index) void TaskProjGroup::projectionTypeChanged(QString qText) { - if(blockUpdate) { + if(blockUpdate || !multiView) { return; } @@ -250,7 +394,7 @@ void TaskProjGroup::projectionTypeChanged(QString qText) ui->chkView8->setToolTip(getToolTipForBox(8)); ui->chkView9->setToolTip(getToolTipForBox(9)); - multiView->recomputeFeature(); + view->recomputeFeature(); } void TaskProjGroup::scaleTypeChanged(int index) @@ -264,33 +408,35 @@ void TaskProjGroup::scaleTypeChanged(int index) if (index == 0) { // Document Scale Type - multiView->ScaleType.setValue("Page"); - } else if (index == 1) { + view->ScaleType.setValue("Page"); + } + else if (index == 1) { // Automatic Scale Type //block recompute - multiView->ScaleType.setValue("Automatic"); - double autoScale = multiView->autoScale(); - multiView->Scale.setValue(autoScale); + view->ScaleType.setValue("Automatic"); + double autoScale = view->autoScale(); + view->Scale.setValue(autoScale); //unblock recompute - } else if (index == 2) { + } + else if (index == 2) { // Custom Scale Type //block recompute - multiView->ScaleType.setValue("Custom"); + view->ScaleType.setValue("Custom"); ui->sbScaleNum->setEnabled(true); ui->sbScaleDen->setEnabled(true); int a = ui->sbScaleNum->value(); int b = ui->sbScaleDen->value(); double scale = (double) a / (double) b; - multiView->Scale.setValue(scale); + view->Scale.setValue(scale); //unblock recompute } } void TaskProjGroup::AutoDistributeClicked(bool clicked) { - if (blockUpdate) { + if (blockUpdate || !multiView) { return; } multiView->AutoDistribute.setValue(clicked); @@ -299,7 +445,7 @@ void TaskProjGroup::AutoDistributeClicked(bool clicked) void TaskProjGroup::spacingChanged() { - if (blockUpdate) { + if (blockUpdate || !multiView) { return; } multiView->spacingX.setValue(ui->sbXSpacing->value().getValue()); @@ -311,10 +457,10 @@ void TaskProjGroup::updateTask() { // Update the scale type blockUpdate = true; - ui->cmbScaleType->setCurrentIndex(multiView->ScaleType.getValue()); + ui->cmbScaleType->setCurrentIndex(view->ScaleType.getValue()); // Update the scale value - setFractionalScale(multiView->getScale()); + setFractionalScale(view->getScale()); blockUpdate = false; } @@ -336,7 +482,7 @@ void TaskProjGroup::scaleManuallyChanged(int unused) Q_UNUSED(unused); if(blockUpdate) return; - if (!multiView->ScaleType.isValue("Custom")) { //ignore if not custom! + if (!view->ScaleType.isValue("Custom")) { //ignore if not custom! return; } @@ -345,9 +491,9 @@ void TaskProjGroup::scaleManuallyChanged(int unused) double scale = (double) a / (double) b; - Gui::Command::doCommand(Gui::Command::Doc, "App.activeDocument().%s.Scale = %f", multiView->getNameInDocument() + Gui::Command::doCommand(Gui::Command::Doc, "App.activeDocument().%s.Scale = %f", view->getNameInDocument() , scale); - multiView->recomputeFeature(); + view->recomputeFeature(); } void TaskProjGroup::changeEvent(QEvent *event) @@ -366,9 +512,8 @@ const char * TaskProjGroup::viewChkIndexToCStr(int index) // First Angle: FBRight B FBL // Right F L Rear // FTRight T FTL - assert (multiView); - bool thirdAngle = multiView->usedProjectionType().isValue("Third Angle"); + bool thirdAngle = multiView ? multiView->usedProjectionType().isValue("Third Angle") : false; switch(index) { case 0: return (thirdAngle ? "FrontTopLeft" : "FrontBottomRight"); case 1: return (thirdAngle ? "Top" : "Bottom"); @@ -386,7 +531,7 @@ const char * TaskProjGroup::viewChkIndexToCStr(int index) QString TaskProjGroup::getToolTipForBox(int boxNumber) { - bool thirdAngle = multiView->usedProjectionType().isValue("Third Angle"); + bool thirdAngle = multiView ? multiView->usedProjectionType().isValue("Third Angle") : false; switch(boxNumber) { case 0: {return (thirdAngle ? tr("FrontTopLeft") : tr("FrontBottomRight")); break;} case 1: {return (thirdAngle ? tr("Top") : tr("Bottom")); break;} @@ -404,7 +549,7 @@ QString TaskProjGroup::getToolTipForBox(int boxNumber) void TaskProjGroup::setupViewCheckboxes(bool addConnections) { - if (!multiView) + if (!view) return; // There must be a better way to construct this list... @@ -419,29 +564,44 @@ void TaskProjGroup::setupViewCheckboxes(bool addConnections) ui->chkView8, ui->chkView9 }; - for (int i = 0; i < 10; ++i) { QCheckBox *box = viewCheckboxes[i]; + box->setToolTip(getToolTipForBox(i)); + const char *viewStr = viewChkIndexToCStr(i); + + if (!multiView) { + box->setCheckState(viewStr == "Front" ? Qt::Checked : Qt::Unchecked); + } + if (addConnections) { connect(box, &QCheckBox::toggled, this, &TaskProjGroup::viewToggled); } - const char *viewStr = viewChkIndexToCStr(i); - if (viewStr && multiView->hasProjection(viewStr)) { - box->setCheckState(Qt::Checked); - if (!multiView->canDelete(viewStr)) { - box->setEnabled(false); + if (multiView) { + if (viewStr && multiView->hasProjection(viewStr)) { + box->setCheckState(Qt::Checked); + if (!multiView->canDelete(viewStr)) { + box->setEnabled(false); + } + } else { + box->setCheckState(Qt::Unchecked); } - } else { - box->setCheckState(Qt::Unchecked); } - box->setToolTip(getToolTipForBox(i)); } } void TaskProjGroup::setUiPrimary() { - Base::Vector3d frontDir = multiView->getAnchorDirection(); + Base::Vector3d frontDir; + if (multiView) { + frontDir = multiView->getAnchorDirection(); + } + else { + auto* viewPart = static_cast(view); + if (viewPart) { + frontDir = viewPart->Direction.getValue(); + } + } ui->lePrimary->setText(formatVector(frontDir)); } @@ -467,8 +627,10 @@ void TaskProjGroup::saveButtons(QPushButton* btnOK, bool TaskProjGroup::apply() { // Base::Console().Message("TPG::apply()\n"); - multiView->recomputeChildren(); - multiView->recomputeFeature(); + if (multiView) { + multiView->recomputeChildren(); + } + view->recomputeFeature(); return true; } @@ -476,12 +638,14 @@ bool TaskProjGroup::apply() bool TaskProjGroup::accept() { // Base::Console().Message("TPG::accept()\n"); - Gui::Document* doc = Gui::Application::Instance->getDocument(multiView->getDocument()); + Gui::Document* doc = Gui::Application::Instance->getDocument(view->getDocument()); if (!doc) return false; - multiView->recomputeChildren(); - multiView->recomputeFeature(); + if (multiView) { + multiView->recomputeChildren(); + } + view->recomputeFeature(); Gui::Command::doCommand(Gui::Command::Gui, "Gui.ActiveDocument.resetEdit()"); @@ -490,28 +654,31 @@ bool TaskProjGroup::accept() bool TaskProjGroup::reject() { - Gui::Document* doc = Gui::Application::Instance->getDocument(multiView->getDocument()); + Gui::Document* doc = Gui::Application::Instance->getDocument(view->getDocument()); if (!doc) return false; if (getCreateMode()) { //remove the object completely from the document - std::string multiViewName = multiView->getNameInDocument(); - std::string PageName = multiView->findParentPage()->getNameInDocument(); + const char* viewName = view->getNameInDocument(); + const char* PageName = view->findParentPage()->getNameInDocument(); - Gui::Command::doCommand(Gui::Command::Gui, "App.activeDocument().%s.purgeProjections()", - multiViewName.c_str()); - Gui::Command::doCommand(Gui::Command::Gui, "App.activeDocument().%s.removeView(App.activeDocument().%s)", - PageName.c_str(), multiViewName.c_str()); - Gui::Command::doCommand(Gui::Command::Gui, "App.activeDocument().removeObject('%s')", multiViewName.c_str()); + if (multiView) { + Gui::Command::doCommand(Gui::Command::Gui, "App.activeDocument().%s.purgeProjections()", + viewName); + Gui::Command::doCommand(Gui::Command::Gui, "App.activeDocument().%s.removeView(App.activeDocument().%s)", + PageName, viewName); + } + Gui::Command::doCommand(Gui::Command::Gui, "App.activeDocument().removeObject('%s')", viewName); Gui::Command::doCommand(Gui::Command::Gui, "Gui.ActiveDocument.resetEdit()"); - } else { + } + else { //set the DPG and its views back to entry state. if (Gui::Command::hasPendingCommand()) { Gui::Command::abortCommand(); // std::vector undos = Gui::Application::Instance->activeDocument()->getUndoVector(); // Gui::Application::Instance->activeDocument()->undo(1); -// multiView->rebuildViewList(); +// view->rebuildViewList(); // apply(); } } @@ -521,12 +688,12 @@ bool TaskProjGroup::reject() ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //TODO: Do we really need to hang on to the TaskDlgProjGroup in this class? IR -TaskDlgProjGroup::TaskDlgProjGroup(TechDraw::DrawProjGroup* featView, bool mode) +TaskDlgProjGroup::TaskDlgProjGroup(TechDraw::DrawView* featView, bool mode) : TaskDialog() , viewProvider(nullptr) - , multiView(featView) + , view(featView) { - //viewProvider = dynamic_cast(featView); + //viewProvider = dynamic_cast(featView); widget = new TaskProjGroup(featView, mode); taskbox = new Gui::TaskView::TaskBox(Gui::BitmapFactory().pixmap("actions/TechDraw_ProjectionGroup"), widget->windowTitle(), true, nullptr); @@ -559,8 +726,13 @@ void TaskDlgProjGroup::modifyStandardButtons(QDialogButtonBox* box) //==== calls from the TaskView =============================================================== void TaskDlgProjGroup::open() { - if (!widget->getCreateMode()) { //this is an edit session, start a transaction - App::GetApplication().setActiveTransaction("Edit Projection Group", true); + if (!widget->getCreateMode()) { //this is an edit session, start a transaction + if (dynamic_cast(view)) { + App::GetApplication().setActiveTransaction("Edit Projection Group", true); + } + else { + App::GetApplication().setActiveTransaction("Edit Part View", true); + } } } diff --git a/src/Mod/TechDraw/Gui/TaskProjGroup.h b/src/Mod/TechDraw/Gui/TaskProjGroup.h index 7a3062443c..663974e7ec 100644 --- a/src/Mod/TechDraw/Gui/TaskProjGroup.h +++ b/src/Mod/TechDraw/Gui/TaskProjGroup.h @@ -33,6 +33,7 @@ namespace TechDraw { +class DrawView; class DrawProjGroup; class DrawPage; } @@ -41,14 +42,14 @@ namespace TechDrawGui { class MDIViewPage; class Ui_TaskProjGroup; -class ViewProviderProjGroup; +class ViewProviderDrawingView; class TaskProjGroup : public QWidget { Q_OBJECT public: - TaskProjGroup(TechDraw::DrawProjGroup* featView, bool mode); + TaskProjGroup(TechDraw::DrawView* featView, bool mode); ~TaskProjGroup() override = default; virtual bool accept(); @@ -77,6 +78,7 @@ protected: void setUiPrimary(); void saveGroupState(); void restoreGroupState(); + void updateUi(); QString formatVector(Base::Vector3d vec); @@ -98,6 +100,7 @@ private: MDIViewPage* m_mdi; std::unique_ptr ui; + TechDraw::DrawView* view; TechDraw::DrawProjGroup* multiView; bool m_createMode; @@ -126,11 +129,11 @@ class TaskDlgProjGroup : public Gui::TaskView::TaskDialog Q_OBJECT public: - TaskDlgProjGroup(TechDraw::DrawProjGroup* featView, bool mode); + TaskDlgProjGroup(TechDraw::DrawView* featView, bool mode); ~TaskDlgProjGroup() override; - const ViewProviderProjGroup * getViewProvider() const { return viewProvider; } - TechDraw::DrawProjGroup * getMultiView() const { return multiView; } + const ViewProviderDrawingView* getViewProvider() const { return viewProvider; } + TechDraw::DrawView* getView() const { return view; } QDialogButtonBox::StandardButtons getStandardButtons() const override { return QDialogButtonBox::Ok | QDialogButtonBox::Apply | QDialogButtonBox::Cancel; } @@ -152,8 +155,8 @@ public: void update(); protected: - const ViewProviderProjGroup *viewProvider; - TechDraw::DrawProjGroup *multiView; + const ViewProviderDrawingView *viewProvider; + TechDraw::DrawView* view; private: TaskProjGroup * widget; diff --git a/src/Mod/TechDraw/Gui/TaskProjGroup.ui b/src/Mod/TechDraw/Gui/TaskProjGroup.ui index c644fe3e4f..481b26ecf4 100644 --- a/src/Mod/TechDraw/Gui/TaskProjGroup.ui +++ b/src/Mod/TechDraw/Gui/TaskProjGroup.ui @@ -26,39 +26,6 @@ Projection Group - - - - - - Projection - - - - - - - First or Third Angle - - - - First Angle - - - - - Third Angle - - - - - Page - - - - - - @@ -90,17 +57,6 @@ - - - - - - - - Custom Scale - - - @@ -176,7 +132,7 @@ - Adjust Primary Direction + Adjust Direction true @@ -193,6 +149,27 @@ + + + + Spin clock wise + + + + + + + :/icons/arrow-cw.svg + + + + + 24 + 24 + + + + @@ -220,6 +197,27 @@ + + + + Spin counter clock wise + + + + + + + :/icons/arrow-ccw.svg + + + + + 24 + 24 + + + + @@ -290,17 +288,25 @@ - - - Qt::Horizontal + + + Set document front view as primary direction. - + + + + + + :/icons/view-front.svg + + + - 40 - 20 + 24 + 24 - + @@ -324,17 +330,25 @@ - - - Qt::Horizontal + + + Set direction of the camera, or selected face if any, as primary direction. - + + + + + + :/icons/TechDraw_CameraOrientation.svg + + + - 40 - 20 + 24 + 24 - + @@ -575,76 +589,36 @@ height: 24px; - + - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Spin CW - + - - - - - :/icons/arrow-cw.svg - + Projection - - - Qt::Horizontal - - - - 40 - 20 - - - - - - + - Spin CCW - - - - - - - :/icons/arrow-ccw.svg - + First or Third Angle + + + First Angle + + + + + Third Angle + + + + + Page + + - - - - Qt::Horizontal - - - - 40 - 20 - - - - diff --git a/src/Mod/TechDraw/Gui/ViewProviderViewPart.cpp b/src/Mod/TechDraw/Gui/ViewProviderViewPart.cpp index 9575d0ca97..488ff1bff3 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderViewPart.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderViewPart.cpp @@ -56,6 +56,7 @@ #include "PreferencesGui.h" #include "QGIView.h" #include "TaskDetail.h" +#include "TaskProjGroup.h" #include "ViewProviderViewPart.h" #include "ViewProviderPage.h" #include "QGIViewDimension.h" @@ -264,6 +265,10 @@ bool ViewProviderViewPart::setEdit(int ModNum) if (Gui::Control().activeDialog()) { //TaskPanel already open! return false; } + + // clear the selection (convenience) + Gui::Selection().clearSelection(); + TechDraw::DrawViewPart* dvp = getViewObject(); TechDraw::DrawViewDetail* dvd = dynamic_cast(dvp); if (dvd) { @@ -271,13 +276,15 @@ bool ViewProviderViewPart::setEdit(int ModNum) Base::Console().Error("DrawViewDetail - %s - has no BaseView!\n", dvd->getNameInDocument()); return false; } - // clear the selection (convenience) - Gui::Selection().clearSelection(); Gui::Control().showDialog(new TaskDlgDetail(dvd)); Gui::Selection().clearSelection(); Gui::Selection().addSelection(dvd->getDocument()->getName(), dvd->getNameInDocument()); } + else { + auto* view = dynamic_cast(getObject()); + Gui::Control().showDialog(new TaskDlgProjGroup(view, false)); + } return true; } diff --git a/src/Mod/TechDraw/Gui/Workbench.cpp b/src/Mod/TechDraw/Gui/Workbench.cpp index 08bb9fd11c..d5dd37fbae 100644 --- a/src/Mod/TechDraw/Gui/Workbench.cpp +++ b/src/Mod/TechDraw/Gui/Workbench.cpp @@ -294,7 +294,6 @@ Gui::ToolBarItem* Workbench::setupToolBars() const *views << "TechDraw_View"; *views << "TechDraw_BrokenView"; *views << "TechDraw_ActiveView"; - *views << "TechDraw_ProjectionGroup"; *views << "TechDraw_SectionGroup"; *views << "TechDraw_DetailView"; *views << "TechDraw_DraftView"; @@ -397,7 +396,6 @@ Gui::ToolBarItem* Workbench::setupCommandBars() const views->setCommand("Views"); *views << "TechDraw_View"; *views << "TechDraw_ActiveView"; - *views << "TechDraw_ProjectionGroup"; *views << "TechDraw_SectionGroup"; *views << "TechDraw_DetailView"; *views << "TechDraw_DraftView";