/*************************************************************************** * Copyright (c) 2014 Luke Parry * * Copyright (c) 2022 WandererFan * * * * This file is part of the FreeCAD CAx development system. * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Library General Public * * License as published by the Free Software Foundation; either * * version 2 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU Library General Public License for more details. * * * * You should have received a copy of the GNU Library General Public * * License along with this library; see the file COPYING.LIB. If not, * * write to the Free Software Foundation, Inc., 59 Temple Place, * * Suite 330, Boston, MA 02111-1307, USA * * * ***************************************************************************/ #include "PreCompiled.h" #ifndef _PreComp_ #include #include #include #include #include #endif //#ifndef _PreComp_ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "DrawGuiUtil.h" #include "TaskLinkDim.h" #include "TaskDimRepair.h" #include "DimensionValidators.h" using namespace TechDrawGui; using namespace TechDraw; using namespace std; //=========================================================================== // utility routines //=========================================================================== //internal functions bool _checkSelection(Gui::Command* cmd, unsigned maxObjs = 2); bool _checkDrawViewPart(Gui::Command* cmd); void execDistance(Gui::Command* cmd); void execDistanceX(Gui::Command* cmd); void execDistanceY(Gui::Command* cmd); void execAngle(Gui::Command* cmd); void execAngle3Pt(Gui::Command* cmd); void execRadius(Gui::Command* cmd); void execDiameter(Gui::Command* cmd); void execExtent(Gui::Command* cmd, int direction); DrawViewDimension* dimensionMaker(TechDraw::DrawViewPart* dvp, std::string dimType, ReferenceVector references2d, ReferenceVector references3d); void positionDimText(DrawViewDimension* dim); //NOTE: this is not shown in toolbar and doesn't always work right in the menu. // should be removed. //=========================================================================== // TechDraw_NewDimension //=========================================================================== // this is deprecated. use individual add dimension commands. DEF_STD_CMD_A(CmdTechDrawDimension) CmdTechDrawDimension::CmdTechDrawDimension() : Command("TechDraw_Dimension") { sAppModule = "TechDraw"; sGroup = QT_TR_NOOP("TechDraw"); sMenuText = QT_TR_NOOP("Insert Dimension"); sToolTipText = sMenuText; sWhatsThis = "TechDraw_Dimension"; sStatusTip = sToolTipText; sPixmap = "TechDraw_Dimension"; } void CmdTechDrawDimension::activated(int iMsg) { Q_UNUSED(iMsg); } bool CmdTechDrawDimension::isActive() { bool havePage = DrawGuiUtil::needPage(this); bool haveView = DrawGuiUtil::needView(this); return (havePage && haveView); } //=========================================================================== // TechDraw_RadialGroup //=========================================================================== DEF_STD_CMD_ACL(CmdTechDrawRadialGroup) CmdTechDrawRadialGroup::CmdTechDrawRadialGroup() : Command("TechDraw_RadialGroup") { sAppModule = "TechDraw"; sGroup = QT_TR_NOOP("TechDraw"); sMenuText = QT_TR_NOOP("Insert Radius Dimension"); sToolTipText = sMenuText; sWhatsThis = "TechDraw_RadialGroup"; sStatusTip = sToolTipText; } void CmdTechDrawRadialGroup::activated(int iMsg) { // Base::Console().Message("CMD::LinearGrp - activated(%d)\n", iMsg); Gui::TaskView::TaskDialog *dlg = Gui::Control().activeDialog(); if (dlg) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Task In Progress"), QObject::tr("Close active task dialog and try again.")); return; } Gui::ActionGroup* pcAction = qobject_cast(_pcAction); pcAction->setIcon(pcAction->actions().at(iMsg)->icon()); switch(iMsg) { case 0: execRadius(this); break; case 1: execDiameter(this); break; default: Base::Console().Message("CMD::RadialGrp - invalid iMsg: %d\n", iMsg); }; } Gui::Action * CmdTechDrawRadialGroup::createAction() { Gui::ActionGroup* pcAction = new Gui::ActionGroup(this, Gui::getMainWindow()); pcAction->setDropDownMenu(true); applyCommandData(this->className(), pcAction); QAction* p0 = pcAction->addAction(QString()); p0->setIcon(Gui::BitmapFactory().iconFromTheme("TechDraw_RadiusDimension")); p0->setObjectName(QString::fromLatin1("TechDraw_RadiusDimension")); p0->setWhatsThis(QString::fromLatin1("TechDraw_RadiusDimension")); QAction* p1 = pcAction->addAction(QString()); p1->setIcon(Gui::BitmapFactory().iconFromTheme("TechDraw_DiameterDimension")); p1->setObjectName(QString::fromLatin1("TechDraw_DiameterDimension")); p1->setWhatsThis(QString::fromLatin1("TechDraw_DiameterDimension")); _pcAction = pcAction; languageChange(); pcAction->setIcon(p0->icon()); int defaultId = 0; pcAction->setProperty("defaultAction", QVariant(defaultId)); return pcAction; } void CmdTechDrawRadialGroup::languageChange() { Command::languageChange(); if (!_pcAction) return; Gui::ActionGroup* pcAction = qobject_cast(_pcAction); QList a = pcAction->actions(); QAction* arc0 = a[0]; arc0->setText(QApplication::translate("CmdTechDrawRadialGroup", "Radius Dimension")); arc0->setToolTip(QApplication::translate("TechDraw_RadiusDimension", "Insert Radius Dimension")); arc0->setStatusTip(arc0->toolTip()); QAction* arc1 = a[1]; arc1->setText(QApplication::translate("CmdTechDrawRadialGroup", "Diameter Linear")); arc1->setToolTip(QApplication::translate("TechDraw_DiameterDimension", "Insert Diameter Dimension")); arc1->setStatusTip(arc1->toolTip()); } bool CmdTechDrawRadialGroup::isActive() { bool havePage = DrawGuiUtil::needPage(this); bool haveView = DrawGuiUtil::needView(this, false); return (havePage && haveView); } //=========================================================================== // TechDraw_RadiusDimension //=========================================================================== DEF_STD_CMD_A(CmdTechDrawRadiusDimension) CmdTechDrawRadiusDimension::CmdTechDrawRadiusDimension() : Command("TechDraw_RadiusDimension") { sAppModule = "TechDraw"; sGroup = QT_TR_NOOP("TechDraw"); sMenuText = QT_TR_NOOP("Insert Radius Dimension"); sToolTipText = sMenuText; sWhatsThis = "TechDraw_RadiusDimension"; sStatusTip = sToolTipText; sPixmap = "TechDraw_RadiusDimension"; } void CmdTechDrawRadiusDimension::activated(int iMsg) { Q_UNUSED(iMsg); execRadius(this); } bool CmdTechDrawRadiusDimension::isActive() { bool havePage = DrawGuiUtil::needPage(this); bool haveView = DrawGuiUtil::needView(this); return (havePage && haveView); } void execRadius(Gui::Command* cmd) { bool result = _checkDrawViewPart(cmd); if (!result) { QMessageBox::warning( Gui::getMainWindow(), QObject::tr("Incorrect selection"), QObject::tr("No View of a Part in selection.") ); return; } ReferenceVector references2d; ReferenceVector references3d; TechDraw::DrawViewPart* partFeat = TechDraw::getReferencesFromSelection(references2d, references3d); //Define the geometric configuration required for a radius dimension StringVector acceptableGeometry( { "Edge" } ); std::vector minimumCounts( { 1 } ); std::vector acceptableDimensionGeometrys( { isCircle, isEllipse, isBSplineCircle } ); //what 2d geometry configuration did we receive? DimensionGeometryType geometryRefs2d = validateDimSelection(references2d, acceptableGeometry, minimumCounts, acceptableDimensionGeometrys); if ( geometryRefs2d == TechDraw::isInvalid ) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Incorrect Selection"), QObject::tr("Can not make 2d radius dimension from selection")); return; } //what 3d geometry configuration did we receive? DimensionGeometryType geometryRefs3d(isInvalid); if (geometryRefs2d == TechDraw::isViewReference && !references3d.empty()) { geometryRefs3d = validateDimSelection3d(partFeat, references3d, acceptableGeometry, minimumCounts, acceptableDimensionGeometrys); if ( geometryRefs3d == TechDraw::isInvalid ) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Incorrect Selection"), QObject::tr("Can not make 3d radius dimension from selection")); return; } } //errors and warnings if (geometryRefs2d == isEllipse || geometryRefs3d == isEllipse) { QMessageBox::StandardButton result = QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Ellipse Curve Warning"), QObject::tr("Selected edge is an Ellipse. Radius will be approximate. Continue?"), QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Cancel); if (result != QMessageBox::Ok) { return; } } if (geometryRefs2d == isBSplineCircle || geometryRefs3d == isBSplineCircle) { QMessageBox::StandardButton result = QMessageBox::warning(Gui::getMainWindow(), QObject::tr("BSpline Curve Warning"), QObject::tr("Selected edge is a BSpline. Radius will be approximate. Continue?"), QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Cancel); if (result != QMessageBox::Ok) { return; } } if (geometryRefs2d == isBSpline || geometryRefs3d == isBSpline) { QMessageBox::critical(Gui::getMainWindow(), QObject::tr("BSpline Curve Error"), QObject::tr("Selected edge is a BSpline and a radius can not be calculated.")); return; } //build the dimension // DrawViewDimension* dim = dimensionMaker(partFeat, "Radius", references2d, references3d); //Horrible hack to force Tree update double x = partFeat->X.getValue(); partFeat->X.setValue(x); } //=========================================================================== // TechDraw_DiameterDimension //=========================================================================== DEF_STD_CMD_A(CmdTechDrawDiameterDimension) CmdTechDrawDiameterDimension::CmdTechDrawDiameterDimension() : Command("TechDraw_DiameterDimension") { sAppModule = "TechDraw"; sGroup = QT_TR_NOOP("TechDraw"); sMenuText = QT_TR_NOOP("Insert Diameter Dimension"); sToolTipText = sMenuText; sWhatsThis = "TechDraw_DiameterDimension"; sStatusTip = sToolTipText; sPixmap = "TechDraw_DiameterDimension"; } void CmdTechDrawDiameterDimension::activated(int iMsg) { Q_UNUSED(iMsg); execDiameter(this); } bool CmdTechDrawDiameterDimension::isActive() { bool havePage = DrawGuiUtil::needPage(this); bool haveView = DrawGuiUtil::needView(this); return (havePage && haveView); } void execDiameter(Gui::Command* cmd) { bool result = _checkDrawViewPart(cmd); if (!result) { QMessageBox::warning( Gui::getMainWindow(), QObject::tr("Incorrect selection"), QObject::tr("No View of a Part in selection.") ); return; } ReferenceVector references2d; ReferenceVector references3d; TechDraw::DrawViewPart* partFeat = TechDraw::getReferencesFromSelection(references2d, references3d); //Define the geometric configuration required for a diameter dimension StringVector acceptableGeometry( { "Edge" } ); std::vector minimumCounts( { 1 } ); std::vector acceptableDimensionGeometrys( { isCircle, isEllipse, isBSplineCircle } ); //what 2d geometry configuration did we receive? DimensionGeometryType geometryRefs2d = validateDimSelection(references2d, acceptableGeometry, minimumCounts, acceptableDimensionGeometrys); if ( geometryRefs2d == TechDraw::isInvalid ) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Incorrect Selection"), QObject::tr("Can not make 2d diameter dimension from selection")); return; } //what 3d geometry configuration did we receive? DimensionGeometryType geometryRefs3d(isInvalid); if (geometryRefs2d == TechDraw::isViewReference && !references3d.empty()) { geometryRefs3d = validateDimSelection3d(partFeat, references3d, acceptableGeometry, minimumCounts, acceptableDimensionGeometrys); if ( geometryRefs3d == TechDraw::isInvalid ) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Incorrect Selection"), QObject::tr("Can not make 3d diameter dimension from selection")); return; } } //errors and warnings if (geometryRefs2d == isEllipse || geometryRefs3d == isEllipse) { QMessageBox::StandardButton result = QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Ellipse Curve Warning"), QObject::tr("Selected edge is an Ellipse. Diameter will be approximate. Continue?"), QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Cancel); if (result != QMessageBox::Ok) { return; } } if (geometryRefs2d == isBSplineCircle || geometryRefs3d == isBSplineCircle) { QMessageBox::StandardButton result = QMessageBox::warning(Gui::getMainWindow(), QObject::tr("BSpline Curve Warning"), QObject::tr("Selected edge is a BSpline. Diameter will be approximate. Continue?"), QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Cancel); if (result != QMessageBox::Ok) { return; } } if (geometryRefs2d == isBSpline || geometryRefs3d == isBSpline) { QMessageBox::critical(Gui::getMainWindow(), QObject::tr("BSpline Curve Error"), QObject::tr("Selected edge is a BSpline and a diameter can not be calculated.")); return; } //build the dimension // DrawViewDimension* dim = dimensionMaker(partFeat, "Diameter", references2d, references3d); //Horrible hack to force Tree update double x = partFeat->X.getValue(); partFeat->X.setValue(x); } //=========================================================================== // TechDraw_LinearGroup //=========================================================================== DEF_STD_CMD_ACL(CmdTechDrawLinearGroup) CmdTechDrawLinearGroup::CmdTechDrawLinearGroup() : Command("TechDraw_LinearGroup") { sAppModule = "TechDraw"; sGroup = QT_TR_NOOP("TechDraw"); sMenuText = QT_TR_NOOP("Insert Linear Dimension"); sToolTipText = sMenuText; sWhatsThis = "TechDraw_LinearGroup"; sStatusTip = sToolTipText; } void CmdTechDrawLinearGroup::activated(int iMsg) { // Base::Console().Message("CMD::LinearGrp - activated(%d)\n", iMsg); Gui::TaskView::TaskDialog *dlg = Gui::Control().activeDialog(); if (dlg) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Task In Progress"), QObject::tr("Close active task dialog and try again.")); return; } Gui::ActionGroup* pcAction = qobject_cast(_pcAction); pcAction->setIcon(pcAction->actions().at(iMsg)->icon()); switch(iMsg) { case 0: execDistance(this); break; case 1: execDistanceX(this); break; case 2: execDistanceY(this); break; default: Base::Console().Message("CMD::LinearGrp - invalid iMsg: %d\n", iMsg); }; } Gui::Action * CmdTechDrawLinearGroup::createAction() { Gui::ActionGroup* pcAction = new Gui::ActionGroup(this, Gui::getMainWindow()); pcAction->setDropDownMenu(true); applyCommandData(this->className(), pcAction); QAction* p0 = pcAction->addAction(QString()); p0->setIcon(Gui::BitmapFactory().iconFromTheme("TechDraw_LengthDimension")); p0->setObjectName(QString::fromLatin1("TechDraw_LengthDimension")); p0->setWhatsThis(QString::fromLatin1("TechDraw_LengthDimension")); QAction* p1 = pcAction->addAction(QString()); p1->setIcon(Gui::BitmapFactory().iconFromTheme("TechDraw_HorizontalDimension")); p1->setObjectName(QString::fromLatin1("TechDraw_HorizontalDimension")); p1->setWhatsThis(QString::fromLatin1("TechDraw_HorizontalDimension")); QAction* p2 = pcAction->addAction(QString()); p2->setIcon(Gui::BitmapFactory().iconFromTheme("TechDraw_VerticalDimension")); p2->setObjectName(QString::fromLatin1("TechDraw_VerticalDimension")); p2->setWhatsThis(QString::fromLatin1("TechDraw_VerticalDimension")); _pcAction = pcAction; languageChange(); pcAction->setIcon(p0->icon()); int defaultId = 0; pcAction->setProperty("defaultAction", QVariant(defaultId)); return pcAction; } void CmdTechDrawLinearGroup::languageChange() { Command::languageChange(); if (!_pcAction) return; Gui::ActionGroup* pcAction = qobject_cast(_pcAction); QList a = pcAction->actions(); QAction* arc0 = a[0]; arc0->setText(QApplication::translate("CmdTechDrawLinearGroup", "Linear Dimension")); arc0->setToolTip(QApplication::translate("TechDraw_LengthDimension", "Insert Linear Dimension")); arc0->setStatusTip(arc0->toolTip()); QAction* arc1 = a[1]; arc1->setText(QApplication::translate("CmdTechDrawLinearGroup", "Horizontal Linear")); arc1->setToolTip(QApplication::translate("TechDraw_HorizontalLinear", "Insert Horizontal Linear Dimension")); arc1->setStatusTip(arc1->toolTip()); QAction* arc2 = a[2]; arc2->setText(QApplication::translate("CmdTechDrawLinearGroup", "Vertical Linear")); arc2->setToolTip(QApplication::translate("TechDraw_VerticalDimension", "Insert Vertical Linear Dimension")); arc2->setStatusTip(arc2->toolTip()); } bool CmdTechDrawLinearGroup::isActive() { bool havePage = DrawGuiUtil::needPage(this); bool haveView = DrawGuiUtil::needView(this, false); return (havePage && haveView); } //=========================================================================== // TechDraw_LengthDimension //=========================================================================== DEF_STD_CMD_A(CmdTechDrawLengthDimension) CmdTechDrawLengthDimension::CmdTechDrawLengthDimension() : Command("TechDraw_LengthDimension") { sAppModule = "TechDraw"; sGroup = QT_TR_NOOP("TechDraw"); sMenuText = QT_TR_NOOP("Insert Length Dimension"); sToolTipText = sMenuText; sWhatsThis = "TechDraw_LengthDimension"; sStatusTip = sToolTipText; sPixmap = "TechDraw_LengthDimension"; } void CmdTechDrawLengthDimension::activated(int iMsg) { Q_UNUSED(iMsg); } bool CmdTechDrawLengthDimension::isActive() { bool havePage = DrawGuiUtil::needPage(this); bool haveView = DrawGuiUtil::needView(this); return (havePage && haveView); } void execDistance(Gui::Command* cmd) { bool result = _checkDrawViewPart(cmd); if (!result) { QMessageBox::warning( Gui::getMainWindow(), QObject::tr("Incorrect selection"), QObject::tr("No View of a Part in selection.") ); return; } ReferenceVector references2d; ReferenceVector references3d; TechDraw::DrawViewPart* partFeat = TechDraw::getReferencesFromSelection(references2d, references3d); //Define the geometric configuration required for a length dimension StringVector acceptableGeometry( { "Edge", "Vertex" } ); std::vector minimumCounts( { 1, 2 } ); std::vector acceptableDimensionGeometrys( { isVertical, isHorizontal, isDiagonal } ); //what 2d geometry configuration did we receive? DimensionGeometryType geometryRefs2d = validateDimSelection(references2d, acceptableGeometry, minimumCounts, acceptableDimensionGeometrys); if ( geometryRefs2d == TechDraw::isInvalid ) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Incorrect Selection"), QObject::tr("Can not make 2d linear dimension from selection")); return; } //what 3d geometry configuration did we receive? DimensionGeometryType geometryRefs3d; if (geometryRefs2d == TechDraw::isViewReference && !references3d.empty()) { geometryRefs3d = validateDimSelection3d(partFeat, references3d, acceptableGeometry, minimumCounts, acceptableDimensionGeometrys); if ( geometryRefs3d == TechDraw::isInvalid ) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Incorrect Selection"), QObject::tr("Can not make 3d linear dimension from selection")); return; } } //build the dimension DrawViewDimension* dim = dimensionMaker(partFeat, "Distance", references2d, references3d); //position the Dimension text on the view positionDimText(dim); //Horrible hack to force Tree update (claimChildren) double x = partFeat->X.getValue(); partFeat->X.setValue(x); } //=========================================================================== // TechDraw_HorizontalDimension //=========================================================================== DEF_STD_CMD_A(CmdTechDrawHorizontalDimension) CmdTechDrawHorizontalDimension::CmdTechDrawHorizontalDimension() : Command("TechDraw_HorizontalDimension") { sAppModule = "TechDraw"; sGroup = QT_TR_NOOP("TechDraw"); sMenuText = QT_TR_NOOP("Insert Horizontal Dimension"); sToolTipText = sMenuText; sWhatsThis = "TechDraw_HorizontalDimension"; sStatusTip = sToolTipText; sPixmap = "TechDraw_HorizontalDimension"; sAccel = "SHIFT+H"; } void CmdTechDrawHorizontalDimension::activated(int iMsg) { Q_UNUSED(iMsg); execDistanceX(this); } bool CmdTechDrawHorizontalDimension::isActive() { bool havePage = DrawGuiUtil::needPage(this); bool haveView = DrawGuiUtil::needView(this); return (havePage && haveView); } void execDistanceX(Gui::Command* cmd) { bool result = _checkDrawViewPart(cmd); if (!result) { QMessageBox::warning( Gui::getMainWindow(), QObject::tr("Incorrect selection"), QObject::tr("No View of a Part in selection.") ); return; } ReferenceVector references2d; ReferenceVector references3d; TechDraw::DrawViewPart* partFeat = TechDraw::getReferencesFromSelection(references2d, references3d); //Define the geometric configuration required for a length dimension StringVector acceptableGeometry( { "Edge", "Vertex" } ); std::vector minimumCounts( { 1, 2 } ); std::vector acceptableDimensionGeometrys( { isHorizontal, isDiagonal } ); //what 2d geometry configuration did we receive? DimensionGeometryType geometryRefs2d = validateDimSelection(references2d, acceptableGeometry, minimumCounts, acceptableDimensionGeometrys); if ( geometryRefs2d == TechDraw::isInvalid ) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Incorrect Selection"), QObject::tr("Can not make 2d horizontal dimension from selection")); return; } //what 3d geometry configuration did we receive? DimensionGeometryType geometryRefs3d; if (geometryRefs2d == TechDraw::isViewReference && !references3d.empty()) { geometryRefs3d = validateDimSelection3d(partFeat, references3d, acceptableGeometry, minimumCounts, acceptableDimensionGeometrys); if (geometryRefs3d == TechDraw::isInvalid) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Incorrect Selection"), QObject::tr("Can not make 3d horizontal dimension from selection")); return; } } //build the dimension DrawViewDimension* dim = dimensionMaker(partFeat, "DistanceX", references2d, references3d); //position the Dimension text on the view positionDimText(dim); //Horrible hack to force Tree update (claimChildren) double x = partFeat->X.getValue(); partFeat->X.setValue(x); } //=========================================================================== // TechDraw_VerticalDimension //=========================================================================== DEF_STD_CMD_A(CmdTechDrawVerticalDimension) CmdTechDrawVerticalDimension::CmdTechDrawVerticalDimension() : Command("TechDraw_VerticalDimension") { sAppModule = "TechDraw"; sGroup = QT_TR_NOOP("TechDraw"); sMenuText = QT_TR_NOOP("Insert Vertical Dimension"); sToolTipText = sMenuText; sWhatsThis = "TechDraw_VerticalDimension"; sStatusTip = sToolTipText; sPixmap = "TechDraw_VerticalDimension"; sAccel = "SHIFT+V"; } void CmdTechDrawVerticalDimension::activated(int iMsg) { Q_UNUSED(iMsg); execDistanceY(this); } bool CmdTechDrawVerticalDimension::isActive() { bool havePage = DrawGuiUtil::needPage(this); bool haveView = DrawGuiUtil::needView(this); return (havePage && haveView); } void execDistanceY(Gui::Command* cmd) { bool result = _checkDrawViewPart(cmd); if (!result) { QMessageBox::warning( Gui::getMainWindow(), QObject::tr("Incorrect selection"), QObject::tr("No View of a Part in selection.") ); return; } ReferenceVector references2d; ReferenceVector references3d; TechDraw::DrawViewPart* partFeat = TechDraw::getReferencesFromSelection(references2d, references3d); //Define the geometric configuration required for a length dimension StringVector acceptableGeometry( { "Edge", "Vertex" } ); std::vector minimumCounts( { 1, 2 } ); std::vector acceptableDimensionGeometrys( { isVertical, isDiagonal } ); //what 2d geometry configuration did we receive? DimensionGeometryType geometryRefs2d = validateDimSelection(references2d, acceptableGeometry, minimumCounts, acceptableDimensionGeometrys); if ( geometryRefs2d == TechDraw::isInvalid ) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Incorrect Selection"), QObject::tr("Can not make 2d vertical dimension from selection")); return; } //what 3d geometry configuration did we receive? DimensionGeometryType geometryRefs3d; if (geometryRefs2d == TechDraw::isViewReference && !references3d.empty()) { geometryRefs3d = validateDimSelection3d(partFeat, references3d, acceptableGeometry, minimumCounts, acceptableDimensionGeometrys); if ( geometryRefs3d == TechDraw::isVertical) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Incorrect Selection"), QObject::tr("Can not make 3d vertical dimension from selection")); return; } } //build the dimension DrawViewDimension* dim = dimensionMaker(partFeat, "DistanceY", references2d, references3d); //position the Dimension text on the view positionDimText(dim); //Horrible hack to force Tree update (claimChildren) double x = partFeat->X.getValue(); partFeat->X.setValue(x); } //=========================================================================== // TechDraw_AngularGroup //=========================================================================== DEF_STD_CMD_ACL(CmdTechDrawAngularGroup) CmdTechDrawAngularGroup::CmdTechDrawAngularGroup() : Command("TechDraw_AngularGroup") { sAppModule = "TechDraw"; sGroup = QT_TR_NOOP("TechDraw"); sMenuText = QT_TR_NOOP("Insert Angular Dimension"); sToolTipText = sMenuText; sWhatsThis = "TechDraw_AngularGroup"; sStatusTip = sToolTipText; } void CmdTechDrawAngularGroup::activated(int iMsg) { // Base::Console().Message("CMD::LinearGrp - activated(%d)\n", iMsg); Gui::TaskView::TaskDialog *dlg = Gui::Control().activeDialog(); if (dlg) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Task In Progress"), QObject::tr("Close active task dialog and try again.")); return; } Gui::ActionGroup* pcAction = qobject_cast(_pcAction); pcAction->setIcon(pcAction->actions().at(iMsg)->icon()); switch(iMsg) { case 0: execAngle(this); break; case 1: execAngle3Pt(this); break; default: Base::Console().Message("CMD::AngularGrp - invalid iMsg: %d\n", iMsg); }; } Gui::Action * CmdTechDrawAngularGroup::createAction() { Gui::ActionGroup* pcAction = new Gui::ActionGroup(this, Gui::getMainWindow()); pcAction->setDropDownMenu(true); applyCommandData(this->className(), pcAction); QAction* p0 = pcAction->addAction(QString()); p0->setIcon(Gui::BitmapFactory().iconFromTheme("TechDraw_AngleDimension")); p0->setObjectName(QString::fromLatin1("TechDraw_AngleDimension")); p0->setWhatsThis(QString::fromLatin1("TechDraw_AngleDimension")); QAction* p1 = pcAction->addAction(QString()); p1->setIcon(Gui::BitmapFactory().iconFromTheme("TechDraw_3PtAngleDimension")); p1->setObjectName(QString::fromLatin1("TechDraw_3PtAngleDimension")); p1->setWhatsThis(QString::fromLatin1("TechDraw_3PtAngleDimension")); _pcAction = pcAction; languageChange(); pcAction->setIcon(p0->icon()); int defaultId = 0; pcAction->setProperty("defaultAction", QVariant(defaultId)); return pcAction; } void CmdTechDrawAngularGroup::languageChange() { Command::languageChange(); if (!_pcAction) return; Gui::ActionGroup* pcAction = qobject_cast(_pcAction); QList a = pcAction->actions(); QAction* arc0 = a[0]; arc0->setText(QApplication::translate("CmdTechDrawAngularGroup", "Angular Dimension")); arc0->setToolTip(QApplication::translate("TechDraw_AngleDimension", "Insert Angle Dimension")); arc0->setStatusTip(arc0->toolTip()); QAction* arc1 = a[1]; arc1->setText(QApplication::translate("CmdTechDrawAngularGroup", "3Pt Angular Dimension")); arc1->setToolTip(QApplication::translate("TechDraw_3PtAngleDimension", "Insert 3-Point Angle Dimension")); arc1->setStatusTip(arc1->toolTip()); } bool CmdTechDrawAngularGroup::isActive() { bool havePage = DrawGuiUtil::needPage(this); bool haveView = DrawGuiUtil::needView(this, false); return (havePage && haveView); } //=========================================================================== // TechDraw_AngleDimension //=========================================================================== DEF_STD_CMD_A(CmdTechDrawAngleDimension) CmdTechDrawAngleDimension::CmdTechDrawAngleDimension() : Command("TechDraw_AngleDimension") { sAppModule = "TechDraw"; sGroup = QT_TR_NOOP("TechDraw"); sMenuText = QT_TR_NOOP("Insert Angle Dimension"); sToolTipText = sMenuText; sWhatsThis = "TechDraw_AngleDimension"; sStatusTip = sToolTipText; sPixmap = "TechDraw_AngleDimension"; } void CmdTechDrawAngleDimension::activated(int iMsg) { Q_UNUSED(iMsg); execAngle(this); } bool CmdTechDrawAngleDimension::isActive() { bool havePage = DrawGuiUtil::needPage(this); bool haveView = DrawGuiUtil::needView(this); return (havePage && haveView); } void execAngle(Gui::Command* cmd) { bool result = _checkDrawViewPart(cmd); if (!result) { QMessageBox::warning( Gui::getMainWindow(), QObject::tr("Incorrect selection"), QObject::tr("No View of a Part in selection.") ); return; } ReferenceVector references2d; ReferenceVector references3d; TechDraw::DrawViewPart* partFeat = TechDraw::getReferencesFromSelection(references2d, references3d); //Define the geometric configuration required for a length dimension StringVector acceptableGeometry( { "Edge" } ); std::vector minimumCounts( { 2 } ); std::vector acceptableDimensionGeometrys( { isAngle } ); //what 2d geometry configuration did we receive? DimensionGeometryType geometryRefs2d = validateDimSelection(references2d, acceptableGeometry, minimumCounts, acceptableDimensionGeometrys); if ( geometryRefs2d == TechDraw::isInvalid ) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Incorrect Selection"), QObject::tr("Can not make 2d angle dimension from selection")); return; } //what 3d geometry configuration did we receive? DimensionGeometryType geometryRefs3d; if (geometryRefs2d == TechDraw::isViewReference && !references3d.empty()) { geometryRefs3d = validateDimSelection3d(partFeat, references3d, acceptableGeometry, minimumCounts, acceptableDimensionGeometrys); if ( geometryRefs3d == TechDraw::isInvalid ) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Incorrect Selection"), QObject::tr("Can not make 3d angle dimension from selection")); return; } } //build the dimension DrawViewDimension* dim = dimensionMaker(partFeat, "Angle", references2d, references3d); //position the Dimension text on the view positionDimText(dim); //Horrible hack to force Tree update (claimChildren) double x = partFeat->X.getValue(); partFeat->X.setValue(x); } //=========================================================================== // TechDraw_3PtAngleDimension //=========================================================================== DEF_STD_CMD_A(CmdTechDraw3PtAngleDimension) CmdTechDraw3PtAngleDimension::CmdTechDraw3PtAngleDimension() : Command("TechDraw_3PtAngleDimension") { sAppModule = "TechDraw"; sGroup = QT_TR_NOOP("TechDraw"); sMenuText = QT_TR_NOOP("Insert 3-Point Angle Dimension"); sToolTipText = sMenuText; sWhatsThis = "TechDraw_3PtAngleDimension"; sStatusTip = sToolTipText; sPixmap = "TechDraw_3PtAngleDimension"; } void CmdTechDraw3PtAngleDimension::activated(int iMsg) { Q_UNUSED(iMsg); execAngle3Pt(this); } bool CmdTechDraw3PtAngleDimension::isActive() { bool havePage = DrawGuiUtil::needPage(this); bool haveView = DrawGuiUtil::needView(this); return (havePage && haveView); } void execAngle3Pt(Gui::Command* cmd) { bool result = _checkDrawViewPart(cmd); if (!result) { QMessageBox::warning( Gui::getMainWindow(), QObject::tr("Incorrect selection"), QObject::tr("No View of a Part in selection.") ); return; } ReferenceVector references2d; ReferenceVector references3d; TechDraw::DrawViewPart* partFeat = TechDraw::getReferencesFromSelection(references2d, references3d); //Define the geometric configuration required for a length dimension StringVector acceptableGeometry( { "Vertex" } ); std::vector minimumCounts( { 3 } ); std::vector acceptableDimensionGeometrys( { isAngle3Pt } ); //what 2d geometry configuration did we receive? DimensionGeometryType geometryRefs2d = validateDimSelection(references2d, acceptableGeometry, minimumCounts, acceptableDimensionGeometrys); if ( geometryRefs2d == TechDraw::isInvalid ) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Incorrect Selection"), QObject::tr("Can not make 2d angle dimension from selection")); return; } //what 3d geometry configuration did we receive? DimensionGeometryType geometryRefs3d; if (geometryRefs2d == TechDraw::isViewReference && !references3d.empty()) { geometryRefs3d = validateDimSelection3d(partFeat, references3d, acceptableGeometry, minimumCounts, acceptableDimensionGeometrys); if ( geometryRefs3d == TechDraw::isInvalid ) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Incorrect Selection"), QObject::tr("Can not make 3d angle dimension from selection")); return; } } //build the dimension DrawViewDimension* dim = dimensionMaker(partFeat, "Angle3Pt", references2d, references3d); //position the Dimension text on the view positionDimText(dim); //Horrible hack to force Tree update (claimChildren) double x = partFeat->X.getValue(); partFeat->X.setValue(x); } //! link 3D geometry to Dimension(s) on a Page //TODO: should we present all potential Dimensions from all Pages? //=========================================================================== // TechDraw_LinkDimension //=========================================================================== DEF_STD_CMD_A(CmdTechDrawLinkDimension) CmdTechDrawLinkDimension::CmdTechDrawLinkDimension() : Command("TechDraw_LinkDimension") { sAppModule = "TechDraw"; sGroup = QT_TR_NOOP("TechDraw"); sMenuText = QT_TR_NOOP("Link Dimension to 3D Geometry"); sToolTipText = sMenuText; sWhatsThis = "TechDraw_LinkDimension"; sStatusTip = sToolTipText; sPixmap = "TechDraw_LinkDimension"; } void CmdTechDrawLinkDimension::activated(int iMsg) { Q_UNUSED(iMsg); TechDraw::DrawPage* page = DrawGuiUtil::findPage(this); if (!page) { return; } bool result = _checkSelection(this, 2); if (!result) return; std::vector selection = getSelection().getSelectionEx(nullptr, App::DocumentObject::getClassTypeId(), Gui::ResolveMode::NoResolve); App::DocumentObject* obj3D = nullptr; std::vector parts; std::vector subs; std::vector::iterator itSel = selection.begin(); for (; itSel != selection.end(); itSel++) { obj3D = ((*itSel).getObject()); std::vector subList = (*itSel).getSubNames(); for (auto& s:subList) { parts.push_back(obj3D); subs.push_back(s); } } if (!obj3D) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Incorrect Selection"), QObject::tr("There is no 3D object in your selection")); return; } if (subs.empty()) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Incorrect Selection"), QObject::tr("There are no 3D Edges or Vertices in your selection")); return; } // dialog to select the Dimension to link Gui::Control().showDialog(new TaskDlgLinkDim(parts, subs, page)); page->getDocument()->recompute(); //still need to recompute in Gui. why? } bool CmdTechDrawLinkDimension::isActive() { bool havePage = DrawGuiUtil::needPage(this); bool haveView = DrawGuiUtil::needView(this); bool taskInProgress = false; if (havePage) { taskInProgress = Gui::Control().activeDialog(); } return (havePage && haveView && !taskInProgress); } //=========================================================================== // TechDraw_ExtentGroup //=========================================================================== DEF_STD_CMD_ACL(CmdTechDrawExtentGroup) CmdTechDrawExtentGroup::CmdTechDrawExtentGroup() : Command("TechDraw_ExtentGroup") { sAppModule = "TechDraw"; sGroup = QT_TR_NOOP("TechDraw"); sMenuText = QT_TR_NOOP("Insert Extent Dimension"); sToolTipText = sMenuText; sWhatsThis = "TechDraw_ExtentGroup"; sStatusTip = sToolTipText; // eType = ForEdit; } void CmdTechDrawExtentGroup::activated(int iMsg) { // Base::Console().Message("CMD::ExtentGrp - activated(%d)\n", iMsg); Gui::TaskView::TaskDialog *dlg = Gui::Control().activeDialog(); if (dlg) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Task In Progress"), QObject::tr("Close active task dialog and try again.")); return; } Gui::ActionGroup* pcAction = qobject_cast(_pcAction); pcAction->setIcon(pcAction->actions().at(iMsg)->icon()); switch(iMsg) { case 0: execExtent(this, 0); break; case 1: execExtent(this, 1); break; default: Base::Console().Message("CMD::ExtGrp - invalid iMsg: %d\n", iMsg); }; } Gui::Action * CmdTechDrawExtentGroup::createAction() { Gui::ActionGroup* pcAction = new Gui::ActionGroup(this, Gui::getMainWindow()); pcAction->setDropDownMenu(true); applyCommandData(this->className(), pcAction); QAction* p1 = pcAction->addAction(QString()); p1->setIcon(Gui::BitmapFactory().iconFromTheme("TechDraw_HorizontalExtentDimension")); p1->setObjectName(QString::fromLatin1("TechDraw_HorizontalExtentDimension")); p1->setWhatsThis(QString::fromLatin1("TechDraw_HorizontalExtentDimension")); QAction* p2 = pcAction->addAction(QString()); p2->setIcon(Gui::BitmapFactory().iconFromTheme("TechDraw_VerticalExtentDimension")); p2->setObjectName(QString::fromLatin1("TechDraw_VerticalExtentDimension")); p2->setWhatsThis(QString::fromLatin1("TechDraw_VerticalExtentDimension")); _pcAction = pcAction; languageChange(); pcAction->setIcon(p1->icon()); int defaultId = 0; pcAction->setProperty("defaultAction", QVariant(defaultId)); return pcAction; } void CmdTechDrawExtentGroup::languageChange() { Command::languageChange(); if (!_pcAction) return; Gui::ActionGroup* pcAction = qobject_cast(_pcAction); QList a = pcAction->actions(); QAction* arc1 = a[0]; arc1->setText(QApplication::translate("CmdTechDrawExtentGroup", "Horizontal Extent")); arc1->setToolTip(QApplication::translate("TechDraw_HorizontalExtent", "Insert Horizontal Extent Dimension")); arc1->setStatusTip(arc1->toolTip()); QAction* arc2 = a[1]; arc2->setText(QApplication::translate("CmdTechDrawExtentGroup", "Vertical Extent")); arc2->setToolTip(QApplication::translate("TechDraw_VerticalExtentDimension", "Insert Vertical Extent Dimension")); arc2->setStatusTip(arc2->toolTip()); } bool CmdTechDrawExtentGroup::isActive() { bool havePage = DrawGuiUtil::needPage(this); bool haveView = DrawGuiUtil::needView(this, false); return (havePage && haveView); } //=========================================================================== // TechDraw_HorizontalExtentDimension //=========================================================================== DEF_STD_CMD_A(CmdTechDrawHorizontalExtentDimension) CmdTechDrawHorizontalExtentDimension::CmdTechDrawHorizontalExtentDimension() : Command("TechDraw_HorizontalExtentDimension") { sAppModule = "TechDraw"; sGroup = QT_TR_NOOP("TechDraw"); sMenuText = QT_TR_NOOP("Insert Horizontal Extent Dimension"); sToolTipText = sMenuText; sWhatsThis = "TechDraw_HorizontalExtentDimension"; sStatusTip = sToolTipText; sPixmap = "TechDraw_HorizontalExtentDimension"; } void CmdTechDrawHorizontalExtentDimension::activated(int iMsg) { Q_UNUSED(iMsg); Gui::TaskView::TaskDialog *dlg = Gui::Control().activeDialog(); if (dlg) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Task In Progress"), QObject::tr("Close active task dialog and try again.")); return; } execExtent(this, 0); } bool CmdTechDrawHorizontalExtentDimension::isActive() { bool havePage = DrawGuiUtil::needPage(this); bool haveView = DrawGuiUtil::needView(this, false); return (havePage && haveView); } void execExtent(Gui::Command* cmd, int direction) { bool result = _checkDrawViewPart(cmd); if (!result) { QMessageBox::warning( Gui::getMainWindow(), QObject::tr("Incorrect selection"), QObject::tr("No View of a Part in selection.") ); return; } ReferenceVector references2d; ReferenceVector references3d; TechDraw::DrawViewPart* partFeat = TechDraw::getReferencesFromSelection(references2d, references3d); //Define the geometric configuration required for a extent dimension StringVector acceptableGeometry( { "Edge" } ); std::vector minimumCounts( { 1 } ); std::vector acceptableDimensionGeometrys( { isMultiEdge, isHorizontal, isVertical, isDiagonal, isCircle, isEllipse, isBSplineCircle, isBSpline, isZLimited } ); //what 2d geometry configuration did we receive? DimensionGeometryType geometryRefs2d = validateDimSelection(references2d, acceptableGeometry, minimumCounts, acceptableDimensionGeometrys); if ( geometryRefs2d == TechDraw::isInvalid) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Incorrect Selection"), QObject::tr("Can not make 2d extent dimension from selection")); return; } //what 3d geometry configuration did we receive? DimensionGeometryType geometryRefs3d; if (geometryRefs2d == TechDraw::isViewReference && !references3d.empty()) { geometryRefs3d = validateDimSelection3d(partFeat, references3d, acceptableGeometry, minimumCounts, acceptableDimensionGeometrys); if ( geometryRefs3d == isInvalid ) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Incorrect Selection"), QObject::tr("Can not make 3d extent dimension from selection")); return; } } if (references3d.empty()) { std::vector edgeNames; for (auto& ref : references2d) { if (ref.getSubName().empty()) { continue; } std::string geomType = DrawUtil::getGeomTypeFromName(ref.getSubName()); if (geomType == "Edge") { edgeNames.push_back(ref.getSubName()); } } DrawDimHelper::makeExtentDim(partFeat, edgeNames, direction); //0 - horizontal, 1 - vertical } else { DrawDimHelper::makeExtentDim3d(partFeat, references3d, direction); //0 - horizontal, 1 - vertical } } //=========================================================================== // TechDraw_VerticalExtentDimension //=========================================================================== DEF_STD_CMD_A(CmdTechDrawVerticalExtentDimension) CmdTechDrawVerticalExtentDimension::CmdTechDrawVerticalExtentDimension() : Command("TechDraw_VerticalExtentDimension") { sAppModule = "TechDraw"; sGroup = QT_TR_NOOP("TechDraw"); sMenuText = QT_TR_NOOP("Insert Vertical Extent Dimension"); sToolTipText = sMenuText; sWhatsThis = "TechDraw_VerticalExtentDimension"; sStatusTip = sToolTipText; sPixmap = "TechDraw_VerticalExtentDimension"; } void CmdTechDrawVerticalExtentDimension::activated(int iMsg) { Q_UNUSED(iMsg); Gui::TaskView::TaskDialog *dlg = Gui::Control().activeDialog(); if (dlg) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Task In Progress"), QObject::tr("Close active task dialog and try again.")); return; } execExtent(this, 1); } bool CmdTechDrawVerticalExtentDimension::isActive() { bool havePage = DrawGuiUtil::needPage(this); bool haveView = DrawGuiUtil::needView(this, false); return (havePage && haveView); } //=========================================================================== // TechDraw_DimensionRepair //=========================================================================== DEF_STD_CMD_A(CmdTechDrawDimensionRepair) CmdTechDrawDimensionRepair::CmdTechDrawDimensionRepair() : Command("TechDraw_DimensionRepair") { sAppModule = "TechDraw"; sGroup = QT_TR_NOOP("TechDraw"); sMenuText = QT_TR_NOOP("Repair Dimension References"); sToolTipText = sMenuText; sWhatsThis = "TechDraw_DimensionRepair"; sStatusTip = sToolTipText; sPixmap = "TechDraw_DimensionRepair"; } void CmdTechDrawDimensionRepair::activated(int iMsg) { Q_UNUSED(iMsg); std::vector dimObjs = getSelection().getObjectsOfType(TechDraw::DrawViewDimension::getClassTypeId()); TechDraw::DrawViewDimension* dim = nullptr; if (dimObjs.empty()) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Incorrect Selection"), QObject::tr("There is no Dimension in your selection")); return; } else { dim = static_cast(dimObjs.at(0)); } ReferenceVector references2d; ReferenceVector references3d; //TechDraw::DrawViewPart* partFeat = TechDraw::getReferencesFromSelection(references2d, references3d); Gui::Control().showDialog(new TaskDlgDimReference(dim, references2d, references3d)); } bool CmdTechDrawDimensionRepair::isActive(void) { bool havePage = DrawGuiUtil::needPage(this); bool haveView = DrawGuiUtil::needView(this); bool taskInProgress = false; if (havePage) { taskInProgress = Gui::Control().activeDialog(); } return (havePage && haveView && !taskInProgress); } //NOTE: to be deprecated. revisions to the basic dimension allows it to handle //everything that the Landmark Dimension was created to handle. //=========================================================================== // TechDraw_LandmarkDimension //=========================================================================== DEF_STD_CMD_A(CmdTechDrawLandmarkDimension) CmdTechDrawLandmarkDimension::CmdTechDrawLandmarkDimension() : Command("TechDraw_LandmarkDimension") { sAppModule = "TechDraw"; sGroup = QT_TR_NOOP("TechDraw"); sMenuText = QT_TR_NOOP("Insert Landmark Dimension - EXPERIMENTAL"); sToolTipText = sMenuText; sWhatsThis = "TechDraw_LandmarkDimension"; sStatusTip = sToolTipText; sPixmap = "TechDraw_LandmarkDimension"; } void CmdTechDrawLandmarkDimension::activated(int iMsg) { Q_UNUSED(iMsg); bool result = _checkSelection(this, 3); if (!result) return; const std::vector objects = getSelection(). getObjectsOfType(Part::Feature::getClassTypeId()); //?? if (objects.size() != 2) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"), QObject::tr("Select 2 point objects and 1 View. (1)")); return; } const std::vector views = getSelection(). getObjectsOfType(TechDraw::DrawViewPart::getClassTypeId()); if (views.size() != 1) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"), QObject::tr("Select 2 point objects and 1 View. (2)")); return; } TechDraw::DrawViewPart* dvp = static_cast(views.front()); std::vector refs2d; std::vector subs; subs.emplace_back("Vertex1"); subs.emplace_back("Vertex1"); TechDraw::DrawPage* page = dvp->findParentPage(); std::string parentName = dvp->getNameInDocument(); std::string PageName = page->getNameInDocument(); TechDraw::LandmarkDimension *dim = nullptr; std::string FeatName = getUniqueObjectName("LandmarkDim"); openCommand(QT_TRANSLATE_NOOP("Command", "Create Dimension")); doCommand(Doc, "App.activeDocument().addObject('TechDraw::LandmarkDimension', '%s')", FeatName.c_str()); if (objects.size() == 2) { //what about distanceX and distanceY?? doCommand(Doc, "App.activeDocument().%s.Type = '%s'", FeatName.c_str(), "Distance"); refs2d.push_back(dvp); refs2d.push_back(dvp); } // } else if (objects.size() == 3) { //not implemented yet // doCommand(Doc, "App.activeDocument().%s.Type = '%s'", FeatName.c_str(), "Angle3Pt"); // refs2d.push_back(dvp); // refs2d.push_back(dvp); // refs2d.push_back(dvp); // //subs.push_back("Vertex1"); // //subs.push_back("Vertex1"); // //subs.push_back("Vertex1"); // } dim = dynamic_cast(getDocument()->getObject(FeatName.c_str())); if (!dim) { throw Base::TypeError("CmdTechDrawLandmarkDimension - dim not found\n"); } dim->References2D.setValues(refs2d, subs); dim->References3D.setValues(objects, subs); doCommand(Doc, "App.activeDocument().%s.addView(App.activeDocument().%s)", PageName.c_str(), FeatName.c_str()); commitCommand(); dim->recomputeFeature(); //Horrible hack to force Tree update double x = dvp->X.getValue(); dvp->X.setValue(x); } bool CmdTechDrawLandmarkDimension::isActive() { bool havePage = DrawGuiUtil::needPage(this); bool haveView = DrawGuiUtil::needView(this); return (havePage && haveView); } //------------------------------------------------------------------------------ void CreateTechDrawCommandsDims() { Gui::CommandManager &rcCmdMgr = Gui::Application::Instance->commandManager(); rcCmdMgr.addCommand(new CmdTechDrawRadialGroup()); rcCmdMgr.addCommand(new CmdTechDrawDimension()); rcCmdMgr.addCommand(new CmdTechDrawRadiusDimension()); rcCmdMgr.addCommand(new CmdTechDrawDiameterDimension()); rcCmdMgr.addCommand(new CmdTechDrawLinearGroup()); rcCmdMgr.addCommand(new CmdTechDrawLengthDimension()); rcCmdMgr.addCommand(new CmdTechDrawHorizontalDimension()); rcCmdMgr.addCommand(new CmdTechDrawVerticalDimension()); rcCmdMgr.addCommand(new CmdTechDrawAngularGroup()); rcCmdMgr.addCommand(new CmdTechDrawAngleDimension()); rcCmdMgr.addCommand(new CmdTechDraw3PtAngleDimension()); rcCmdMgr.addCommand(new CmdTechDrawExtentGroup()); rcCmdMgr.addCommand(new CmdTechDrawVerticalExtentDimension()); rcCmdMgr.addCommand(new CmdTechDrawHorizontalExtentDimension()); rcCmdMgr.addCommand(new CmdTechDrawLinkDimension()); rcCmdMgr.addCommand(new CmdTechDrawLandmarkDimension()); rcCmdMgr.addCommand(new CmdTechDrawDimensionRepair()); } //------------------------------------------------------------------------------ //Common code to build a dimension feature DrawViewDimension* dimensionMaker(TechDraw::DrawViewPart* dvp, std::string dimType, ReferenceVector references2d, ReferenceVector references3d) { TechDraw::DrawPage* page = dvp->findParentPage(); std::string PageName = page->getNameInDocument(); TechDraw::DrawViewDimension *dim = nullptr; std::string dimName = dvp->getDocument()->getUniqueObjectName("Dimension"); Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Create Dimension")); Gui::Command::doCommand(Gui::Command::Doc, "App.activeDocument().addObject('TechDraw::DrawViewDimension', '%s')", dimName.c_str()); Gui::Command::doCommand(Gui::Command::Doc, "App.activeDocument().%s.Type = '%s'", dimName.c_str() ,dimType.c_str()); Gui::Command::doCommand(Gui::Command::Doc,"App.activeDocument().%s.MeasureType = '%s'", dimName.c_str(), "Projected"); dim = dynamic_cast(dvp->getDocument()->getObject(dimName.c_str())); if (!dim) { throw Base::TypeError("CmdTechDrawNewDiameterDimension - dim not found\n"); } //always have References2D, even if only for the parent DVP dim->setReferences2d(references2d); dim->setReferences3d(references3d); Gui::Command::doCommand(Gui::Command::Doc, "App.activeDocument().%s.addView(App.activeDocument().%s)", PageName.c_str(), dimName.c_str()); Gui::Command::commitCommand(); dim->recomputeFeature(); return dim; } //position the Dimension text on the view void positionDimText(DrawViewDimension* dim) { TechDraw::pointPair pp = dim->getLinearPoints(); Base::Vector3d mid = (pp.first() + pp.second())/2.0; dim->X.setValue(mid.x); double fontSize = Preferences::dimFontSizeMM(); dim->Y.setValue(-mid.y + 0.5 * fontSize); } //=========================================================================== // Selection Validation Helpers //=========================================================================== //! common checks of Selection for Dimension commands //non-empty selection, no more than maxObjs selected and at least 1 DrawingPage exists bool _checkSelection(Gui::Command* cmd, unsigned maxObjs) { std::vector selection = cmd->getSelection().getSelectionEx(); if (selection.empty()) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Incorrect selection"), QObject::tr("Select an object first")); return false; } const std::vector SubNames = selection[0].getSubNames(); if (SubNames.size() > maxObjs){ QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Incorrect selection"), QObject::tr("Too many objects selected")); return false; } std::vector pages = cmd->getDocument()->getObjectsOfType(TechDraw::DrawPage::getClassTypeId()); if (pages.empty()){ QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Incorrect selection"), QObject::tr("Create a page first.")); return false; } return true; } bool _checkDrawViewPart(Gui::Command* cmd) { std::vector selection = cmd->getSelection().getSelectionEx(); for (auto& sel : selection) { auto dvp = dynamic_cast( sel.getObject() ); if( dvp ) { return true; } } return false; }