"Professional CMake" book suggest the following: "Targets should build successfully with or without compiler support for precompiled headers. It should be considered an optimization, not a requirement. In particular, do not explicitly include a precompile header (e.g. stdafx.h) in the source code, let CMake force-include an automatically generated precompile header on the compiler command line instead. This is more portable across the major compilers and is likely to be easier to maintain. It will also avoid warnings being generated from certain code checking tools like iwyu (include what you use)." Therefore, removed the "#include <PreCompiled.h>" from sources, also there is no need for the "#ifdef _PreComp_" anymore
2477 lines
101 KiB
C++
2477 lines
101 KiB
C++
/***************************************************************************
|
||
* Copyright (c) 2021 edi *
|
||
* *
|
||
* 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 <QApplication>
|
||
# include <QMessageBox>
|
||
# include <cmath>
|
||
# include <sstream>
|
||
# include <BRepGProp.hxx>
|
||
# include <GProp_GProps.hxx>
|
||
|
||
|
||
# include <App/Document.h>
|
||
# include <App/DocumentObject.h>
|
||
# include <Base/Console.h>
|
||
# include <Base/Type.h>
|
||
# include <Base/Tools.h>
|
||
# include <Gui/Action.h>
|
||
# include <Gui/Application.h>
|
||
# include <Gui/BitmapFactory.h>
|
||
# include <Gui/Command.h>
|
||
# include <Gui/Control.h>
|
||
# include <Gui/MainWindow.h>
|
||
# include <Gui/Selection/Selection.h>
|
||
# include <Gui/Selection/SelectionObject.h>
|
||
|
||
# include <Mod/TechDraw/App/Cosmetic.h>
|
||
# include <Mod/TechDraw/App/DrawViewBalloon.h>
|
||
# include <Mod/TechDraw/App/DrawViewDimension.h>
|
||
# include <Mod/TechDraw/App/DrawPage.h>
|
||
# include <Mod/TechDraw/App/DrawUtil.h>
|
||
# include <Mod/TechDraw/App/DrawViewPart.h>
|
||
# include <Mod/TechDraw/App/Preferences.h>
|
||
# include <Mod/TechDraw/App/LineGroup.h>
|
||
|
||
#include "DlgTemplateField.h"
|
||
#include "DrawGuiUtil.h"
|
||
#include "TaskCustomizeFormat.h"
|
||
#include "TaskSelectLineAttributes.h"
|
||
#include "CommandExtensionDims.h"
|
||
|
||
|
||
using namespace TechDrawGui;
|
||
using namespace TechDraw;
|
||
|
||
namespace TechDrawGui {
|
||
//internal structures and sort functions
|
||
struct dimVertex {
|
||
// save a dimension defining vertex and its point
|
||
std::string name;
|
||
Base::Vector3d point;
|
||
};
|
||
|
||
struct {
|
||
bool operator()(dimVertex a, dimVertex b) const { return a.point.x < b.point.x; }
|
||
} sortX;
|
||
|
||
struct {
|
||
bool operator()(dimVertex a, dimVertex b) const { return a.point.y < b.point.y; }
|
||
} sortY;
|
||
|
||
//internal helper functions
|
||
void _selectDimensionAttributes(Gui::Command* cmd);
|
||
std::vector<TechDraw::DrawViewDimension*>_getDimensions(std::vector<Gui::SelectionObject> selection, std::string needDimType);
|
||
std::vector<dimVertex> _getVertexInfo(TechDraw::DrawViewPart* objFeat,
|
||
std::vector<std::string> subNames);
|
||
TechDraw::DrawViewDimension* _createLinDimension(
|
||
TechDraw::DrawViewPart* objFeat,
|
||
std::string startVertex,
|
||
std::string endVertex,
|
||
std::string dimType);
|
||
bool _checkSelection(Gui::Command* cmd,
|
||
std::vector<Gui::SelectionObject>& selection,
|
||
std::string message);
|
||
bool _checkSelAndObj(Gui::Command* cmd,
|
||
std::vector<Gui::SelectionObject>& selection,
|
||
TechDraw::DrawViewPart*& objFeat,
|
||
std::string message);
|
||
bool _checkSelObjAndSubs(Gui::Command* cmd,
|
||
std::vector<Gui::SelectionObject>& selection,
|
||
TechDraw::DrawViewPart*& objFeat,
|
||
std::string message);
|
||
}
|
||
|
||
//===========================================================================
|
||
// TechDraw_ExtensionInsertDiameter
|
||
//===========================================================================
|
||
void execInsertPrefixChar(Gui::Command* cmd, const std::string& prefixFormat) {
|
||
// insert a prefix character into the format specifier
|
||
std::vector<Gui::SelectionObject> selection;
|
||
if (!_checkSelection(cmd, selection, QObject::tr("TechDraw Insert Prefix").toStdString())) {
|
||
return;
|
||
}
|
||
|
||
std::string prefixText(prefixFormat);
|
||
if (prefixFormat.find("%s") != std::string::npos) {
|
||
DlgTemplateField ui(Gui::getMainWindow());
|
||
ui.setFieldName(QObject::tr("Repeat count").toStdString());
|
||
ui.setFieldContent("1");
|
||
if (ui.exec() != QDialog::Accepted) {
|
||
return;
|
||
}
|
||
|
||
QString numberFromDialog = ui.getFieldContent();
|
||
QString qPrefixText = QStringLiteral("%1× ").arg(numberFromDialog);
|
||
prefixText = qPrefixText.toStdString();
|
||
}
|
||
size_t prefixSize = prefixText.capacity();
|
||
|
||
Gui::Command::openCommand(QObject::tr("Insert Prefix").toStdString().c_str());
|
||
for (auto selected : selection) {
|
||
auto object = selected.getObject();
|
||
if (object->isDerivedFrom<TechDraw::DrawViewDimension>()) {
|
||
auto dim = static_cast<TechDraw::DrawViewDimension*>(selected.getObject());
|
||
std::string formatSpec = dim->FormatSpec.getStrValue();
|
||
formatSpec.reserve(formatSpec.capacity() + prefixSize);
|
||
formatSpec.insert(0, prefixText);
|
||
dim->FormatSpec.setValue(formatSpec);
|
||
}
|
||
}
|
||
Gui::Command::commitCommand();
|
||
}
|
||
|
||
DEF_STD_CMD_A(CmdTechDrawExtensionInsertDiameter)
|
||
|
||
CmdTechDrawExtensionInsertDiameter::CmdTechDrawExtensionInsertDiameter()
|
||
: Command("TechDraw_ExtensionInsertDiameter")
|
||
{
|
||
sAppModule = "TechDraw";
|
||
sGroup = QT_TR_NOOP("TechDraw");
|
||
sMenuText = QT_TR_NOOP("Insert '⌀' Prefix");
|
||
sToolTipText = QT_TR_NOOP("Inserts a '⌀' symbol at the beginning of the dimension");
|
||
sWhatsThis = "TechDraw_ExtensionInsertDiameter";
|
||
sStatusTip = sMenuText;
|
||
sPixmap = "TechDraw_ExtensionInsertDiameter";
|
||
}
|
||
|
||
void CmdTechDrawExtensionInsertDiameter::activated(int iMsg)
|
||
{
|
||
Q_UNUSED(iMsg);
|
||
execInsertPrefixChar(this, "⌀");
|
||
}
|
||
|
||
bool CmdTechDrawExtensionInsertDiameter::isActive()
|
||
{
|
||
bool havePage = DrawGuiUtil::needPage(this);
|
||
bool haveView = DrawGuiUtil::needView(this);
|
||
return (havePage && haveView);
|
||
}
|
||
|
||
//===========================================================================
|
||
// TechDraw_ExtensionInsertSquare
|
||
//===========================================================================
|
||
|
||
DEF_STD_CMD_A(CmdTechDrawExtensionInsertSquare)
|
||
|
||
CmdTechDrawExtensionInsertSquare::CmdTechDrawExtensionInsertSquare()
|
||
: Command("TechDraw_ExtensionInsertSquare")
|
||
{
|
||
sAppModule = "TechDraw";
|
||
sGroup = QT_TR_NOOP("TechDraw");
|
||
sMenuText = QT_TR_NOOP("Insert '□' Prefix");
|
||
sToolTipText = QT_TR_NOOP("Inserts a '□' symbol at the beginning of the dimension");
|
||
sWhatsThis = "TechDraw_ExtensionInsertSquare";
|
||
sStatusTip = sMenuText;
|
||
sPixmap = "TechDraw_ExtensionInsertSquare";
|
||
}
|
||
|
||
void CmdTechDrawExtensionInsertSquare::activated(int iMsg)
|
||
{
|
||
Q_UNUSED(iMsg);
|
||
execInsertPrefixChar(this, "□"); //□ white square U+25A1
|
||
}
|
||
|
||
bool CmdTechDrawExtensionInsertSquare::isActive()
|
||
{
|
||
bool havePage = DrawGuiUtil::needPage(this);
|
||
bool haveView = DrawGuiUtil::needView(this);
|
||
return (havePage && haveView);
|
||
}
|
||
|
||
//===========================================================================
|
||
// TechDraw_ExtensionInsertRepetition
|
||
//===========================================================================
|
||
|
||
DEF_STD_CMD_A(CmdTechDrawExtensionInsertRepetition)
|
||
|
||
CmdTechDrawExtensionInsertRepetition::CmdTechDrawExtensionInsertRepetition()
|
||
: Command("TechDraw_ExtensionInsertRepetition")
|
||
{
|
||
sAppModule = "TechDraw";
|
||
sGroup = QT_TR_NOOP("TechDraw");
|
||
sMenuText = QT_TR_NOOP("Insert 'n×' Prefix");
|
||
sToolTipText = QT_TR_NOOP("Inserts a repeated feature count at the beginning of the dimension");
|
||
sWhatsThis = "TechDraw_ExtensionInsertRepetition";
|
||
sStatusTip = sMenuText;
|
||
sPixmap = "TechDraw_ExtensionInsertRepetition";
|
||
}
|
||
|
||
void CmdTechDrawExtensionInsertRepetition::activated(int iMsg)
|
||
{
|
||
Q_UNUSED(iMsg);
|
||
|
||
execInsertPrefixChar(this, "%s× "); //× Multiplication sign U+00D7
|
||
}
|
||
|
||
bool CmdTechDrawExtensionInsertRepetition::isActive()
|
||
{
|
||
bool havePage = DrawGuiUtil::needPage(this);
|
||
bool haveView = DrawGuiUtil::needView(this);
|
||
return (havePage && haveView);
|
||
}
|
||
|
||
//===========================================================================
|
||
// TechDraw_ExtensionRemovePrefixChar
|
||
//===========================================================================
|
||
|
||
void execRemovePrefixChar(Gui::Command* cmd) {
|
||
// remove a prefix character from the format specifier
|
||
std::vector<Gui::SelectionObject> selection;
|
||
if (!_checkSelection(cmd, selection, QT_TRANSLATE_NOOP("Command","TechDraw Remove Prefix"))) {
|
||
return;
|
||
}
|
||
|
||
Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Remove Prefix"));
|
||
for (auto selected : selection)
|
||
{
|
||
auto object = selected.getObject();
|
||
if (object->isDerivedFrom<TechDraw::DrawViewDimension>()) {
|
||
auto dim = static_cast<TechDraw::DrawViewDimension*>(selected.getObject());
|
||
std::string formatSpec = dim->FormatSpec.getStrValue();
|
||
int pos = formatSpec.find("%.");
|
||
if (pos != 0)
|
||
{
|
||
formatSpec = formatSpec.substr(pos);
|
||
dim->FormatSpec.setValue(formatSpec);
|
||
}
|
||
}
|
||
}
|
||
Gui::Command::commitCommand();
|
||
}
|
||
|
||
DEF_STD_CMD_A(CmdTechDrawExtensionRemovePrefixChar)
|
||
|
||
CmdTechDrawExtensionRemovePrefixChar::CmdTechDrawExtensionRemovePrefixChar()
|
||
: Command("TechDraw_ExtensionRemovePrefixChar")
|
||
{
|
||
sAppModule = "TechDraw";
|
||
sGroup = QT_TR_NOOP("TechDraw");
|
||
sMenuText = QT_TR_NOOP("Remove Prefix");
|
||
sToolTipText = QT_TR_NOOP("Removes the prefix symbols at the beginning of the dimension");
|
||
sWhatsThis = "TechDraw_ExtensionRemovePrefixChar";
|
||
sStatusTip = sMenuText;
|
||
sPixmap = "TechDraw_ExtensionRemovePrefixChar";
|
||
}
|
||
|
||
void CmdTechDrawExtensionRemovePrefixChar::activated(int iMsg)
|
||
{
|
||
Q_UNUSED(iMsg);
|
||
execRemovePrefixChar(this);
|
||
}
|
||
|
||
bool CmdTechDrawExtensionRemovePrefixChar::isActive()
|
||
{
|
||
bool havePage = DrawGuiUtil::needPage(this);
|
||
bool haveView = DrawGuiUtil::needView(this);
|
||
return (havePage && haveView);
|
||
}
|
||
|
||
//===========================================================================
|
||
// TechDraw_ExtensionInsertPrefixGroup
|
||
//===========================================================================
|
||
|
||
DEF_STD_CMD_ACL(CmdTechDrawExtensionInsertPrefixGroup)
|
||
|
||
CmdTechDrawExtensionInsertPrefixGroup::CmdTechDrawExtensionInsertPrefixGroup()
|
||
: Command("TechDraw_ExtensionInsertPrefixGroup")
|
||
{
|
||
sAppModule = "TechDraw";
|
||
sGroup = QT_TR_NOOP("TechDraw");
|
||
sMenuText = QT_TR_NOOP("Insert '⌀' Prefix");
|
||
sToolTipText = QT_TR_NOOP("Inserts a '⌀' symbol at the beginning of the dimension text");
|
||
sWhatsThis = "TechDraw_ExtensionInsertPrefixGroup";
|
||
sStatusTip = sMenuText;
|
||
}
|
||
|
||
void CmdTechDrawExtensionInsertPrefixGroup::activated(int iMsg)
|
||
{
|
||
// Base::Console().message("CMD::ExtensionLinePPGroup - 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<Gui::ActionGroup*>(_pcAction);
|
||
pcAction->setIcon(pcAction->actions().at(iMsg)->icon());
|
||
switch (iMsg) {
|
||
case 0: //insert "⌀" as prefix
|
||
execInsertPrefixChar(this, "⌀");
|
||
break;
|
||
case 1: //insert "□" as prefix
|
||
execInsertPrefixChar(this, "□");
|
||
break;
|
||
case 2: //insert "n×" as prefix
|
||
execInsertPrefixChar(this, "%s× ");
|
||
break;
|
||
case 3: //remove prefix characters
|
||
execRemovePrefixChar(this);
|
||
break;
|
||
default:
|
||
Base::Console().message("CMD::CVGrp - invalid iMsg: %d\n", iMsg);
|
||
};
|
||
}
|
||
|
||
Gui::Action* CmdTechDrawExtensionInsertPrefixGroup::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_ExtensionInsertDiameter"));
|
||
p1->setObjectName(QStringLiteral("TechDraw_ExtensionInsertDiameter"));
|
||
p1->setWhatsThis(QStringLiteral("TechDraw_ExtensionInsertDiameter"));
|
||
QAction* p2 = pcAction->addAction(QString());
|
||
p2->setIcon(Gui::BitmapFactory().iconFromTheme("TechDraw_ExtensionInsertSquare"));
|
||
p2->setObjectName(QStringLiteral("TechDraw_ExtensionInsertSquare"));
|
||
p2->setWhatsThis(QStringLiteral("TechDraw_ExtensionInsertSquare"));
|
||
QAction* p3 = pcAction->addAction(QString());
|
||
p3->setIcon(Gui::BitmapFactory().iconFromTheme("TechDraw_ExtensionInsertRepetition"));
|
||
p3->setObjectName(QStringLiteral("TechDraw_ExtensionInsertRepetition"));
|
||
p3->setWhatsThis(QStringLiteral("TechDraw_ExtensionInsertRepetition"));
|
||
QAction* p4 = pcAction->addAction(QString());
|
||
p4->setIcon(Gui::BitmapFactory().iconFromTheme("TechDraw_ExtensionRemovePrefixChar"));
|
||
p4->setObjectName(QStringLiteral("TechDraw_ExtensionRemovePrefixChar"));
|
||
p4->setWhatsThis(QStringLiteral("TechDraw_ExtensionRemovePrefixChar"));
|
||
|
||
_pcAction = pcAction;
|
||
languageChange();
|
||
|
||
pcAction->setIcon(p1->icon());
|
||
int defaultId = 0;
|
||
pcAction->setProperty("defaultAction", QVariant(defaultId));
|
||
|
||
return pcAction;
|
||
}
|
||
|
||
void CmdTechDrawExtensionInsertPrefixGroup::languageChange()
|
||
{
|
||
Command::languageChange();
|
||
|
||
if (!_pcAction)
|
||
return;
|
||
Gui::ActionGroup* pcAction = qobject_cast<Gui::ActionGroup*>(_pcAction);
|
||
QList<QAction*> a = pcAction->actions();
|
||
|
||
QAction* arc1 = a[0];
|
||
arc1->setText(QApplication::translate("CmdTechDrawExtensionInsertDiameter", "Insert '⌀' Prefix"));
|
||
arc1->setToolTip(QApplication::translate("CmdTechDrawExtensionInsertDiameter",
|
||
"Inserts a '⌀' symbol at the beginning of the dimension"));
|
||
arc1->setStatusTip(arc1->text());
|
||
QAction* arc2 = a[1];
|
||
arc2->setText(QApplication::translate("CmdTechDrawExtensionInsertSquare", "Insert '□' Prefix"));
|
||
arc2->setToolTip(QApplication::translate("CmdTechDrawExtensionInsertSquare",
|
||
"Inserts a '□' symbol at the beginning of the dimension"));
|
||
arc2->setStatusTip(arc2->text());
|
||
QAction* arc3 = a[2];
|
||
arc3->setText(QApplication::translate("CmdTechDrawExtensionInsertRepetition", "Insert 'n×' Prefix"));
|
||
arc3->setToolTip(QApplication::translate("CmdTechDrawExtensionInsertRepetition",
|
||
"Inserts a repeated feature count at the beginning of the dimension"));
|
||
arc3->setStatusTip(arc3->text());
|
||
QAction* arc4 = a[3];
|
||
arc4->setText(QApplication::translate("TechDraw_ExtensionremovePrefixChar", "Remove Prefix"));
|
||
arc4->setToolTip(QApplication::translate("TechDraw_ExtensionremovePrefixChar",
|
||
"Removes the prefix symbols at the beginning of the dimension"));
|
||
arc4->setStatusTip(arc4->text());
|
||
}
|
||
|
||
bool CmdTechDrawExtensionInsertPrefixGroup::isActive()
|
||
{
|
||
bool havePage = DrawGuiUtil::needPage(this);
|
||
bool haveView = DrawGuiUtil::needView(this, true);
|
||
return (havePage && haveView);
|
||
}
|
||
|
||
//===========================================================================
|
||
// TechDraw_ExtensionIncreaseDecimal
|
||
//===========================================================================
|
||
|
||
void execIncreaseDecreaseDecimal(Gui::Command* cmd, int delta) {
|
||
// increase or decrease number of decimal places of a measure
|
||
std::vector<Gui::SelectionObject> selection;
|
||
if (!_checkSelection(cmd, selection, QT_TRANSLATE_NOOP("QObject","TechDraw Increase/Decrease Decimal"))) {
|
||
return;
|
||
}
|
||
|
||
Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Increase/Decrease Decimal"));
|
||
std::string numStr;
|
||
for (auto selected : selection) {
|
||
auto object = selected.getObject();
|
||
if (object->isDerivedFrom<TechDraw::DrawViewDimension>()) {
|
||
auto dim = static_cast<TechDraw::DrawViewDimension*>(selected.getObject());
|
||
std::string formatSpec = dim->FormatSpec.getStrValue();
|
||
std::string searchStr("%.");
|
||
int numFound = formatSpec.find(searchStr) + 2;
|
||
numStr = formatSpec[numFound];
|
||
int numInt = std::stoi(numStr, nullptr);
|
||
numInt = numInt + delta;
|
||
if (numInt >= 0 && numInt <= 9) {
|
||
numStr = std::to_string(numInt);
|
||
formatSpec.replace(numFound, 1, numStr);
|
||
dim->FormatSpec.setValue(formatSpec);
|
||
}
|
||
}
|
||
}
|
||
Gui::Command::commitCommand();
|
||
}
|
||
|
||
DEF_STD_CMD_A(CmdTechDrawExtensionIncreaseDecimal)
|
||
|
||
CmdTechDrawExtensionIncreaseDecimal::CmdTechDrawExtensionIncreaseDecimal()
|
||
: Command("TechDraw_ExtensionIncreaseDecimal")
|
||
{
|
||
sAppModule = "TechDraw";
|
||
sGroup = QT_TR_NOOP("TechDraw");
|
||
sMenuText = QT_TR_NOOP("Increase Decimal Places");
|
||
sToolTipText = QT_TR_NOOP("Increases the number of decimal places of the dimension");
|
||
sWhatsThis = "TechDraw_ExtensionIncreaseDecimal";
|
||
sStatusTip = sMenuText;
|
||
sPixmap = "TechDraw_ExtensionIncreaseDecimal";
|
||
}
|
||
|
||
void CmdTechDrawExtensionIncreaseDecimal::activated(int iMsg)
|
||
{
|
||
Q_UNUSED(iMsg);
|
||
execIncreaseDecreaseDecimal(this, 1);
|
||
}
|
||
|
||
bool CmdTechDrawExtensionIncreaseDecimal::isActive()
|
||
{
|
||
bool havePage = DrawGuiUtil::needPage(this);
|
||
bool haveView = DrawGuiUtil::needView(this);
|
||
return (havePage && haveView);
|
||
}
|
||
|
||
//===========================================================================
|
||
// TechDraw_ExtensionDecreaseDecimal
|
||
//===========================================================================
|
||
|
||
DEF_STD_CMD_A(CmdTechDrawExtensionDecreaseDecimal)
|
||
|
||
CmdTechDrawExtensionDecreaseDecimal::CmdTechDrawExtensionDecreaseDecimal()
|
||
: Command("TechDraw_ExtensionDecreaseDecimal")
|
||
{
|
||
sAppModule = "TechDraw";
|
||
sGroup = QT_TR_NOOP("TechDraw");
|
||
sMenuText = QT_TR_NOOP("Decrease Decimal Places");
|
||
sToolTipText = QT_TR_NOOP("Decreases the number of decimal places of the dimension");
|
||
sWhatsThis = "TechDraw_ExtensionDecreaseDecimal";
|
||
sStatusTip = sMenuText;
|
||
sPixmap = "TechDraw_ExtensionDecreaseDecimal";
|
||
}
|
||
|
||
void CmdTechDrawExtensionDecreaseDecimal::activated(int iMsg)
|
||
{
|
||
Q_UNUSED(iMsg);
|
||
execIncreaseDecreaseDecimal(this, -1);
|
||
}
|
||
|
||
bool CmdTechDrawExtensionDecreaseDecimal::isActive()
|
||
{
|
||
bool havePage = DrawGuiUtil::needPage(this);
|
||
bool haveView = DrawGuiUtil::needView(this);
|
||
return (havePage && haveView);
|
||
}
|
||
|
||
//===========================================================================
|
||
// TechDraw_ExtensionIncreaseDecreaseGroup
|
||
//===========================================================================
|
||
|
||
DEF_STD_CMD_ACL(CmdTechDrawExtensionIncreaseDecreaseGroup)
|
||
|
||
CmdTechDrawExtensionIncreaseDecreaseGroup::CmdTechDrawExtensionIncreaseDecreaseGroup()
|
||
: Command("TechDraw_ExtensionIncreaseDecreaseGroup")
|
||
{
|
||
sAppModule = "TechDraw";
|
||
sGroup = QT_TR_NOOP("TechDraw");
|
||
sMenuText = QT_TR_NOOP("Increase Decimal Places");
|
||
sToolTipText = QT_TR_NOOP("Increases the number of decimal places of the dimension");
|
||
sWhatsThis = "TechDraw_ExtensionIncreaseDecreaseGroup";
|
||
sStatusTip = sMenuText;
|
||
}
|
||
|
||
void CmdTechDrawExtensionIncreaseDecreaseGroup::activated(int iMsg)
|
||
{
|
||
// Base::Console().message("CMD::ExtensionIncreaseDecreaseGroup - 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<Gui::ActionGroup*>(_pcAction);
|
||
pcAction->setIcon(pcAction->actions().at(iMsg)->icon());
|
||
switch (iMsg) {
|
||
case 0: //increase decimal places
|
||
execIncreaseDecreaseDecimal(this, 1);
|
||
break;
|
||
case 1: //decrease decimal places
|
||
execIncreaseDecreaseDecimal(this, -1);
|
||
break;
|
||
default:
|
||
Base::Console().message("CMD::CVGrp - invalid iMsg: %d\n", iMsg);
|
||
};
|
||
}
|
||
|
||
Gui::Action* CmdTechDrawExtensionIncreaseDecreaseGroup::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_ExtensionIncreaseDecimal"));
|
||
p1->setObjectName(QStringLiteral("TechDraw_ExtensionIncreaseDecimal"));
|
||
p1->setWhatsThis(QStringLiteral("TechDraw_ExtensionIncreaseDecimal"));
|
||
QAction* p2 = pcAction->addAction(QString());
|
||
p2->setIcon(Gui::BitmapFactory().iconFromTheme("TechDraw_ExtensionDecreaseDecimal"));
|
||
p2->setObjectName(QStringLiteral("TechDraw_ExtensionDecreaseDecimal"));
|
||
p2->setWhatsThis(QStringLiteral("TechDraw_ExtensionDecreaseDecimal"));
|
||
|
||
_pcAction = pcAction;
|
||
languageChange();
|
||
|
||
pcAction->setIcon(p1->icon());
|
||
int defaultId = 0;
|
||
pcAction->setProperty("defaultAction", QVariant(defaultId));
|
||
|
||
return pcAction;
|
||
}
|
||
|
||
void CmdTechDrawExtensionIncreaseDecreaseGroup::languageChange()
|
||
{
|
||
Command::languageChange();
|
||
|
||
if (!_pcAction)
|
||
return;
|
||
Gui::ActionGroup* pcAction = qobject_cast<Gui::ActionGroup*>(_pcAction);
|
||
QList<QAction*> a = pcAction->actions();
|
||
|
||
QAction* arc1 = a[0];
|
||
arc1->setText(QApplication::translate("CmdTechDrawExtensionIncreaseDecimal", "Increase Decimal Places"));
|
||
arc1->setToolTip(QApplication::translate("CmdTechDrawExtensionIncreaseDecimal",
|
||
"Increases the number of decimal places of the dimension"));
|
||
arc1->setStatusTip(arc1->text());
|
||
QAction* arc2 = a[1];
|
||
arc2->setText(QApplication::translate("CmdTechDrawExtensionDecreaseDecimal", "Decrease Decimal Places"));
|
||
arc2->setToolTip(QApplication::translate("CmdTechDrawExtensionDecreaseDecimal",
|
||
"Decreases the number of decimal places of the dimension"));
|
||
arc2->setStatusTip(arc2->text());
|
||
}
|
||
|
||
bool CmdTechDrawExtensionIncreaseDecreaseGroup::isActive()
|
||
{
|
||
bool havePage = DrawGuiUtil::needPage(this);
|
||
bool haveView = DrawGuiUtil::needView(this, true);
|
||
return (havePage && haveView);
|
||
}
|
||
|
||
//===========================================================================
|
||
// TechDraw_ExtensionPosHorizChainDimension
|
||
//===========================================================================
|
||
|
||
void execPosHorizChainDimension(Gui::Command* cmd) {
|
||
// position a horizontal dimension chain
|
||
std::vector<Gui::SelectionObject> selection;
|
||
if (!_checkSelection(cmd, selection, QT_TRANSLATE_NOOP("QObject","TechDraw PosHorizChainDimension"))) {
|
||
return;
|
||
}
|
||
|
||
Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Position Horizontal Chain Dimension"));
|
||
std::vector<TechDraw::DrawViewDimension*> validDimension;
|
||
validDimension = _getDimensions(selection, "DistanceX");
|
||
if (validDimension.empty()) {
|
||
QMessageBox::warning(Gui::getMainWindow(),
|
||
QObject::tr("TechDraw PosHorizChainDimension"),
|
||
QObject::tr("No horizontal dimensions selected"));
|
||
return;
|
||
}
|
||
float yMaster = validDimension[0]->Y.getValue();
|
||
for (auto dim : validDimension) {
|
||
dim->Y.setValue(yMaster);
|
||
pointPair pp = dim->getLinearPoints();
|
||
Base::Vector3d p1 = pp.first();
|
||
Base::Vector3d p2 = pp.second();
|
||
dim->X.setValue((p1.x + p2.x) / 2.0);
|
||
}
|
||
Gui::Command::commitCommand();
|
||
}
|
||
|
||
DEF_STD_CMD_A(CmdTechDrawExtensionPosHorizChainDimension)
|
||
|
||
CmdTechDrawExtensionPosHorizChainDimension::CmdTechDrawExtensionPosHorizChainDimension()
|
||
: Command("TechDraw_ExtensionPosHorizChainDimension")
|
||
{
|
||
sAppModule = "TechDraw";
|
||
sGroup = QT_TR_NOOP("TechDraw");
|
||
sMenuText = QT_TR_NOOP("Align Chain Dimensions Horizontally");
|
||
sToolTipText = QT_TR_NOOP("Aligns the horizontal dimensions to create a chain dimension:<br>\
|
||
- Select two or more horizontal dimensions<br>\
|
||
- The first dimension defines the position<br>\
|
||
- Click this tool");
|
||
sWhatsThis = "TechDraw_ExtensionPosHorizChainDimension";
|
||
sStatusTip = sMenuText;
|
||
sPixmap = "TechDraw_ExtensionPosHorizChainDimension";
|
||
}
|
||
|
||
void CmdTechDrawExtensionPosHorizChainDimension::activated(int iMsg)
|
||
{
|
||
Q_UNUSED(iMsg);
|
||
execPosHorizChainDimension(this);
|
||
}
|
||
|
||
bool CmdTechDrawExtensionPosHorizChainDimension::isActive()
|
||
{
|
||
bool havePage = DrawGuiUtil::needPage(this);
|
||
bool haveView = DrawGuiUtil::needView(this);
|
||
return (havePage && haveView);
|
||
}
|
||
|
||
//===========================================================================
|
||
// TechDraw_ExtensionPosVertChainDimension
|
||
//===========================================================================
|
||
|
||
void execPosVertChainDimension(Gui::Command* cmd) {
|
||
// position a vertical dimension chain
|
||
std::vector<Gui::SelectionObject> selection;
|
||
if (!_checkSelection(cmd, selection, QT_TRANSLATE_NOOP("QObject","TechDraw PosVertChainDimension"))) {
|
||
return;
|
||
}
|
||
|
||
Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Position Vert Chain Dimension"));
|
||
std::vector<TechDraw::DrawViewDimension*> validDimension;
|
||
validDimension = _getDimensions(selection, "DistanceY");
|
||
if (validDimension.empty()) {
|
||
QMessageBox::warning(Gui::getMainWindow(),
|
||
QObject::tr("TechDraw PosVertChainDimension"),
|
||
QObject::tr("No vertical dimensions selected"));
|
||
return;
|
||
}
|
||
float xMaster = validDimension[0]->X.getValue();
|
||
double fontSize = Preferences::dimFontSizeMM();
|
||
for (auto dim : validDimension) {
|
||
dim->X.setValue(xMaster);
|
||
pointPair pp = dim->getLinearPoints();
|
||
Base::Vector3d p1 = pp.first();
|
||
Base::Vector3d p2 = pp.second();
|
||
dim->Y.setValue((p1.y + p2.y) / -2.0 + 0.5 * fontSize);
|
||
}
|
||
Gui::Command::commitCommand();
|
||
}
|
||
|
||
DEF_STD_CMD_A(CmdTechDrawExtensionPosVertChainDimension)
|
||
|
||
CmdTechDrawExtensionPosVertChainDimension::CmdTechDrawExtensionPosVertChainDimension()
|
||
: Command("TechDraw_ExtensionPosVertChainDimension")
|
||
{
|
||
sAppModule = "TechDraw";
|
||
sGroup = QT_TR_NOOP("TechDraw");
|
||
sMenuText = QT_TR_NOOP("Align Chain Dimensions Vertically");
|
||
sToolTipText = QT_TR_NOOP("Aligns the vertical dimensions to create a chain dimension:<br>\
|
||
- Select two or more vertical dimensions<br>\
|
||
- The first dimension defines the position<br>\
|
||
- Click this tool");
|
||
sWhatsThis = "TechDraw_ExtensionPosVertChainDimension";
|
||
sStatusTip = sMenuText;
|
||
sPixmap = "TechDraw_ExtensionPosVertChainDimension";
|
||
}
|
||
|
||
void CmdTechDrawExtensionPosVertChainDimension::activated(int iMsg)
|
||
{
|
||
Q_UNUSED(iMsg);
|
||
execPosVertChainDimension(this);
|
||
}
|
||
|
||
bool CmdTechDrawExtensionPosVertChainDimension::isActive()
|
||
{
|
||
bool havePage = DrawGuiUtil::needPage(this);
|
||
bool haveView = DrawGuiUtil::needView(this);
|
||
return (havePage && haveView);
|
||
}
|
||
|
||
//===========================================================================
|
||
// TechDraw_ExtensionPosObliqueChainDimension
|
||
//===========================================================================
|
||
|
||
void execPosObliqueChainDimension(Gui::Command* cmd) {
|
||
// position an oblique dimension chain
|
||
std::vector<Gui::SelectionObject> selection;
|
||
if (!_checkSelection(cmd, selection, QT_TRANSLATE_NOOP("QObject","TechDraw PosObliqueChainDimension"))) {
|
||
return;
|
||
}
|
||
|
||
Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Position Oblique Chain Dimension"));
|
||
std::vector<TechDraw::DrawViewDimension*> validDimension;
|
||
validDimension = _getDimensions(selection, "Distance");
|
||
if (validDimension.empty()) {
|
||
QMessageBox::warning(Gui::getMainWindow(),
|
||
QObject::tr("TechDraw PosObliqueChainDimension"),
|
||
QObject::tr("No oblique dimensions selected"));
|
||
return;
|
||
}
|
||
float xMaster = validDimension[0]->X.getValue();
|
||
float yMaster = validDimension[0]->Y.getValue();
|
||
Base::Vector3d pMaster(xMaster, yMaster, 0.0);
|
||
pointPair pp = validDimension[0]->getLinearPoints();
|
||
Base::Vector3d dirMaster = pp.second() - pp.first();
|
||
dirMaster.y = -dirMaster.y;
|
||
for (auto dim : validDimension) {
|
||
float xDim = dim->X.getValue();
|
||
float yDim = dim->Y.getValue();
|
||
Base::Vector3d pDim(xDim, yDim, 0.0);
|
||
Base::Vector3d p3 = DrawUtil::getTrianglePoint(pMaster, dirMaster, pDim);
|
||
dim->X.setValue(p3.x);
|
||
dim->Y.setValue(p3.y);
|
||
}
|
||
Gui::Command::commitCommand();
|
||
}
|
||
|
||
DEF_STD_CMD_A(CmdTechDrawExtensionPosObliqueChainDimension)
|
||
|
||
CmdTechDrawExtensionPosObliqueChainDimension::CmdTechDrawExtensionPosObliqueChainDimension()
|
||
: Command("TechDraw_ExtensionPosObliqueChainDimension")
|
||
{
|
||
sAppModule = "TechDraw";
|
||
sGroup = QT_TR_NOOP("TechDraw");
|
||
sMenuText = QT_TR_NOOP("Align Oblique Chain Dimensions");
|
||
sToolTipText = QT_TR_NOOP("Aligns the oblique dimensions to create a chain dimension:<br>\
|
||
- Select two or more parallel oblique dimensions<br>\
|
||
- The first dimension defines the position<br>\
|
||
- Click this tool");
|
||
sWhatsThis = "TechDraw_ExtensionPosObliqueChainDimension";
|
||
sStatusTip = sMenuText;
|
||
sPixmap = "TechDraw_ExtensionPosObliqueChainDimension";
|
||
}
|
||
|
||
void CmdTechDrawExtensionPosObliqueChainDimension::activated(int iMsg)
|
||
{
|
||
Q_UNUSED(iMsg);
|
||
execPosObliqueChainDimension(this);
|
||
///Base::Console().message("TechDraw_ExtensionPosObliqueChainDimension started\n");
|
||
}
|
||
|
||
bool CmdTechDrawExtensionPosObliqueChainDimension::isActive()
|
||
{
|
||
bool havePage = DrawGuiUtil::needPage(this);
|
||
bool haveView = DrawGuiUtil::needView(this);
|
||
return (havePage && haveView);
|
||
}
|
||
|
||
//===========================================================================
|
||
// TechDraw_ExtensionPosChainDimensionGroup
|
||
//===========================================================================
|
||
|
||
DEF_STD_CMD_ACL(CmdTechDrawExtensionPosChainDimensionGroup)
|
||
|
||
CmdTechDrawExtensionPosChainDimensionGroup::CmdTechDrawExtensionPosChainDimensionGroup()
|
||
: Command("TechDraw_ExtensionPosChainDimensionGroup")
|
||
{
|
||
sAppModule = "TechDraw";
|
||
sGroup = QT_TR_NOOP("TechDraw");
|
||
sMenuText = QT_TR_NOOP("Align Horizontal Chain Dimensions");
|
||
sToolTipText = QT_TR_NOOP("Aligns the horizontal dimensions to create a chain dimension:<br>\
|
||
- Select two or more horizontal dimensions<br>\
|
||
- The first dimension defines the position<br>\
|
||
- Click this tool");
|
||
sWhatsThis = "TechDraw_ExtensionPosChainDimensionGroup";
|
||
sStatusTip = sMenuText;
|
||
}
|
||
|
||
void CmdTechDrawExtensionPosChainDimensionGroup::activated(int iMsg)
|
||
{
|
||
// Base::Console().message("CMD::ExtensionPosChainDimensionGroup - 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<Gui::ActionGroup*>(_pcAction);
|
||
pcAction->setIcon(pcAction->actions().at(iMsg)->icon());
|
||
switch (iMsg) {
|
||
case 0: //position horizontal chain dimensions
|
||
execPosHorizChainDimension(this);
|
||
break;
|
||
case 1: //position vertical chain dimensions
|
||
execPosVertChainDimension(this);
|
||
break;
|
||
case 2: //position oblique chain dimensions
|
||
execPosObliqueChainDimension(this);
|
||
break;
|
||
default:
|
||
Base::Console().message("CMD::CVGrp - invalid iMsg: %d\n", iMsg);
|
||
};
|
||
}
|
||
|
||
Gui::Action* CmdTechDrawExtensionPosChainDimensionGroup::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_ExtensionPosHorizChainDimension"));
|
||
p1->setObjectName(QStringLiteral("TechDraw_ExtensionPosHorizChainDimension"));
|
||
p1->setWhatsThis(QStringLiteral("TechDraw_ExtensionPosHorizChainDimension"));
|
||
QAction* p2 = pcAction->addAction(QString());
|
||
p2->setIcon(Gui::BitmapFactory().iconFromTheme("TechDraw_ExtensionPosVertChainDimension"));
|
||
p2->setObjectName(QStringLiteral("TechDraw_ExtensionPosVertChainDimension"));
|
||
p2->setWhatsThis(QStringLiteral("sion"));
|
||
QAction* p3 = pcAction->addAction(QString());
|
||
p3->setIcon(Gui::BitmapFactory().iconFromTheme("TechDraw_ExtensionPosObliqueChainDimension"));
|
||
p3->setObjectName(QStringLiteral("TechDraw_ExtensionPosObliqueChainDimension"));
|
||
p3->setWhatsThis(QStringLiteral("TechDraw_ExtensionPosObliqueChainDimension"));
|
||
|
||
_pcAction = pcAction;
|
||
languageChange();
|
||
|
||
pcAction->setIcon(p1->icon());
|
||
int defaultId = 0;
|
||
pcAction->setProperty("defaultAction", QVariant(defaultId));
|
||
|
||
return pcAction;
|
||
}
|
||
|
||
void CmdTechDrawExtensionPosChainDimensionGroup::languageChange()
|
||
{
|
||
Command::languageChange();
|
||
|
||
if (!_pcAction)
|
||
return;
|
||
Gui::ActionGroup* pcAction = qobject_cast<Gui::ActionGroup*>(_pcAction);
|
||
QList<QAction*> a = pcAction->actions();
|
||
|
||
QAction* arc1 = a[0];
|
||
arc1->setText(QApplication::translate("CmdTechDrawExtensionPosHorizChainDimension", "Position Horizontal Chain Dimensions"));
|
||
arc1->setToolTip(QApplication::translate("CmdTechDrawExtensionPosHorizChainDimension",
|
||
"Aligns the horizontal dimensions to create a chain dimension:<br>\
|
||
- Select two or more horizontal dimensions<br>\
|
||
- The first dimension defines the position<br>\
|
||
- Click this tool"));
|
||
arc1->setStatusTip(arc1->text());
|
||
QAction* arc2 = a[1];
|
||
arc2->setText(QApplication::translate("CmdTechDrawExtensionPosVertChainDimension", "Position Vertical Chain Dimensions"));
|
||
arc2->setToolTip(QApplication::translate("CmdTechDrawExtensionPosVertChainDimension",
|
||
"Aligns the vertical dimensions to create a chain dimension:<br>\
|
||
- Select two or more vertical dimensions<br>\
|
||
- The first dimension defines the position<br>\
|
||
- Click this tool"));
|
||
arc2->setStatusTip(arc2->text());
|
||
QAction* arc3 = a[2];
|
||
arc3->setText(QApplication::translate("CmdTechDrawExtensionPosObliqueChainDimension", "Position Oblique Chain Dimensions"));
|
||
arc3->setToolTip(QApplication::translate("CmdTechDrawExtensionPosObliqueChainDimension",
|
||
"Aligns the oblique dimensions to create a chain dimension:<br>\
|
||
- Select two or more parallel oblique dimensions<br>\
|
||
- The first dimension defines the position<br>\
|
||
- Click this tool"));
|
||
arc3->setStatusTip(arc3->text());
|
||
}
|
||
|
||
bool CmdTechDrawExtensionPosChainDimensionGroup::isActive()
|
||
{
|
||
bool havePage = DrawGuiUtil::needPage(this);
|
||
bool haveView = DrawGuiUtil::needView(this, true);
|
||
return (havePage && haveView);
|
||
}
|
||
|
||
//===========================================================================
|
||
// TechDraw_ExtensionCascadeHorizDimension
|
||
//===========================================================================
|
||
|
||
void execCascadeHorizDimension(Gui::Command* cmd) {
|
||
// cascade horizontal dimensions
|
||
std::vector<Gui::SelectionObject> selection;
|
||
if (!_checkSelection(cmd, selection, QT_TRANSLATE_NOOP("QObject","TechDraw CascadeHorizDimension"))) {
|
||
return;
|
||
}
|
||
|
||
Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Cascade Horizontal Dimension"));
|
||
std::vector<TechDraw::DrawViewDimension*> validDimension;
|
||
validDimension = _getDimensions(selection, "DistanceX");
|
||
if (validDimension.empty()) {
|
||
QMessageBox::warning(Gui::getMainWindow(),
|
||
QObject::tr("TechDraw CascadeHorizDimension"),
|
||
QObject::tr("No horizontal dimensions selected"));
|
||
return;
|
||
}
|
||
float yMaster = validDimension[0]->Y.getValue();
|
||
float dimDistance = activeDimAttributes.getCascadeSpacing();
|
||
if (std::signbit(yMaster))
|
||
dimDistance = -dimDistance;
|
||
for (auto dim : validDimension) {
|
||
dim->Y.setValue(yMaster);
|
||
pointPair pp = dim->getLinearPoints();
|
||
Base::Vector3d p1 = pp.first();
|
||
Base::Vector3d p2 = pp.second();
|
||
dim->X.setValue((p1.x + p2.x) / 2.0);
|
||
yMaster = yMaster + dimDistance;
|
||
}
|
||
Gui::Command::commitCommand();
|
||
}
|
||
|
||
DEF_STD_CMD_A(CmdTechDrawExtensionCascadeHorizDimension)
|
||
|
||
CmdTechDrawExtensionCascadeHorizDimension::CmdTechDrawExtensionCascadeHorizDimension()
|
||
: Command("TechDraw_ExtensionCascadeHorizDimension")
|
||
{
|
||
sAppModule = "TechDraw";
|
||
sGroup = QT_TR_NOOP("TechDraw");
|
||
sMenuText = QT_TR_NOOP("Cascade Horizontal Dimensions");
|
||
sToolTipText = QT_TR_NOOP("Evenly spaces the selected horizontal dimensions:<br>\
|
||
- Specify the cascade spacing (optional)<br>\
|
||
- Select two or more horizontal dimensions<br>\
|
||
- The first dimension defines the position<br>\
|
||
- Click this tool");
|
||
sWhatsThis = "TechDraw_ExtensionCascadeHorizDimension";
|
||
sStatusTip = sMenuText;
|
||
sPixmap = "TechDraw_ExtensionCascadeHorizDimension";
|
||
}
|
||
|
||
void CmdTechDrawExtensionCascadeHorizDimension::activated(int iMsg)
|
||
{
|
||
Q_UNUSED(iMsg);
|
||
execCascadeHorizDimension(this);
|
||
}
|
||
|
||
bool CmdTechDrawExtensionCascadeHorizDimension::isActive()
|
||
{
|
||
bool havePage = DrawGuiUtil::needPage(this);
|
||
bool haveView = DrawGuiUtil::needView(this);
|
||
return (havePage && haveView);
|
||
}
|
||
|
||
//===========================================================================
|
||
// TechDraw_ExtensionCascadeVertDimension
|
||
//===========================================================================
|
||
|
||
void execCascadeVertDimension(Gui::Command* cmd) {
|
||
// cascade vertical dimensions
|
||
std::vector<Gui::SelectionObject> selection;
|
||
if (!_checkSelection(cmd, selection, QT_TRANSLATE_NOOP("QObject","TechDraw CascadeVertDimension"))) {
|
||
return;
|
||
}
|
||
|
||
Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Cascade Vertical Dimension"));
|
||
std::vector<TechDraw::DrawViewDimension*> validDimension;
|
||
validDimension = _getDimensions(selection, "DistanceY");
|
||
if (validDimension.empty()) {
|
||
QMessageBox::warning(Gui::getMainWindow(),
|
||
QObject::tr("TechDraw CascadeVertDimension"),
|
||
QObject::tr("No vertical dimensions selected"));
|
||
return;
|
||
}
|
||
float xMaster = validDimension[0]->X.getValue();
|
||
float dimDistance = activeDimAttributes.getCascadeSpacing();
|
||
if (std::signbit(xMaster))
|
||
dimDistance = -dimDistance;
|
||
double fontSize = Preferences::dimFontSizeMM();
|
||
for (auto dim : validDimension) {
|
||
dim->X.setValue(xMaster);
|
||
pointPair pp = dim->getLinearPoints();
|
||
Base::Vector3d p1 = pp.first();
|
||
Base::Vector3d p2 = pp.second();
|
||
dim->Y.setValue((p1.y + p2.y) / -2.0 + 0.5 * fontSize);
|
||
xMaster = xMaster + dimDistance;
|
||
}
|
||
Gui::Command::commitCommand();
|
||
}
|
||
|
||
DEF_STD_CMD_A(CmdTechDrawExtensionCascadeVertDimension)
|
||
|
||
CmdTechDrawExtensionCascadeVertDimension::CmdTechDrawExtensionCascadeVertDimension()
|
||
: Command("TechDraw_ExtensionCascadeVertDimension")
|
||
{
|
||
sAppModule = "TechDraw";
|
||
sGroup = QT_TR_NOOP("TechDraw");
|
||
sMenuText = QT_TR_NOOP("Cascade Vertical Dimensions");
|
||
sToolTipText = QT_TR_NOOP("Evenly spaces the selected vertical dimensions:<br>\
|
||
- Specify the cascade spacing (optional)<br>\
|
||
- Select two or more vertical dimensions<br>\
|
||
- The first dimension defines the position<br>\
|
||
- Click this tool");
|
||
sWhatsThis = "TechDraw_ExtensionCascadeVertDimension";
|
||
sStatusTip = sMenuText;
|
||
sPixmap = "TechDraw_ExtensionCascadeVertDimension";
|
||
}
|
||
|
||
void CmdTechDrawExtensionCascadeVertDimension::activated(int iMsg)
|
||
{
|
||
Q_UNUSED(iMsg);
|
||
execCascadeVertDimension(this);
|
||
}
|
||
|
||
bool CmdTechDrawExtensionCascadeVertDimension::isActive()
|
||
{
|
||
bool havePage = DrawGuiUtil::needPage(this);
|
||
bool haveView = DrawGuiUtil::needView(this);
|
||
return (havePage && haveView);
|
||
}
|
||
|
||
//===========================================================================
|
||
// TechDraw_ExtensionCascadeObliqueDimension
|
||
//===========================================================================
|
||
|
||
void execCascadeObliqueDimension(Gui::Command* cmd) {
|
||
// cascade oblique dimensions
|
||
std::vector<Gui::SelectionObject> selection;
|
||
if (!_checkSelection(cmd, selection, QT_TRANSLATE_NOOP("QObject","TechDraw CascadeObliqueDimension"))) {
|
||
return;
|
||
}
|
||
|
||
Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Cascade Oblique Dimension"));
|
||
std::vector<TechDraw::DrawViewDimension*> validDimension;
|
||
validDimension = _getDimensions(selection, "Distance");
|
||
if (validDimension.empty()) {
|
||
QMessageBox::warning(Gui::getMainWindow(),
|
||
QObject::tr("TechDraw CascadeObliqueDimension"),
|
||
QObject::tr("No oblique dimensions selected"));
|
||
return;
|
||
}
|
||
float xMaster = validDimension[0]->X.getValue();
|
||
float yMaster = validDimension[0]->Y.getValue();
|
||
Base::Vector3d pMaster(xMaster, yMaster, 0.0);
|
||
pointPair pp = validDimension[0]->getLinearPoints();
|
||
Base::Vector3d dirMaster = pp.second() - pp.first();
|
||
dirMaster.y = -dirMaster.y;
|
||
Base::Vector3d origin(0.0, 0.0, 0.0);
|
||
Base::Vector3d ipDelta = DrawUtil::getTrianglePoint(pMaster, dirMaster, origin);
|
||
float dimDistance = activeDimAttributes.getCascadeSpacing();
|
||
Base::Vector3d delta = ipDelta.Normalize() * dimDistance;
|
||
int i = 0;
|
||
for (auto dim : validDimension) {
|
||
float xDim = dim->X.getValue();
|
||
float yDim = dim->Y.getValue();
|
||
Base::Vector3d pDim(xDim, yDim, 0.0);
|
||
Base::Vector3d p3 = DrawUtil::getTrianglePoint(pMaster, dirMaster, pDim);
|
||
p3 = p3 + delta * i;
|
||
dim->X.setValue(p3.x);
|
||
dim->Y.setValue(p3.y);
|
||
i = i + 1;
|
||
}
|
||
Gui::Command::commitCommand();
|
||
}
|
||
|
||
DEF_STD_CMD_A(CmdTechDrawExtensionCascadeObliqueDimension)
|
||
|
||
CmdTechDrawExtensionCascadeObliqueDimension::CmdTechDrawExtensionCascadeObliqueDimension()
|
||
: Command("TechDraw_ExtensionCascadeObliqueDimension")
|
||
{
|
||
sAppModule = "TechDraw";
|
||
sGroup = QT_TR_NOOP("TechDraw");
|
||
sMenuText = QT_TR_NOOP("Cascade Oblique Dimensions");
|
||
sToolTipText = QT_TR_NOOP("Evenly spaces the selected oblique dimensions:<br>\
|
||
- Specify the cascade spacing (optional)<br>\
|
||
- Select two or more parallel oblique dimensions<br>\
|
||
- The first dimension defines the position<br>\
|
||
- Click this tool");
|
||
sWhatsThis = "TechDraw_ExtensionCascadeObliqueDimension";
|
||
sStatusTip = sMenuText;
|
||
sPixmap = "TechDraw_ExtensionCascadeObliqueDimension";
|
||
}
|
||
|
||
void CmdTechDrawExtensionCascadeObliqueDimension::activated(int iMsg)
|
||
{
|
||
Q_UNUSED(iMsg);
|
||
execCascadeObliqueDimension(this);
|
||
///Base::Console().message("TechDraw_ExtensionPosObliqueChainDimension started\n");
|
||
}
|
||
|
||
bool CmdTechDrawExtensionCascadeObliqueDimension::isActive()
|
||
{
|
||
bool havePage = DrawGuiUtil::needPage(this);
|
||
bool haveView = DrawGuiUtil::needView(this);
|
||
return (havePage && haveView);
|
||
}
|
||
|
||
//===========================================================================
|
||
// TechDraw_ExtensionCascadeDimensionGroup
|
||
//===========================================================================
|
||
|
||
DEF_STD_CMD_ACL(CmdTechDrawExtensionCascadeDimensionGroup)
|
||
|
||
CmdTechDrawExtensionCascadeDimensionGroup::CmdTechDrawExtensionCascadeDimensionGroup()
|
||
: Command("TechDraw_ExtensionCascadeDimensionGroup")
|
||
{
|
||
sAppModule = "TechDraw";
|
||
sGroup = QT_TR_NOOP("TechDraw");
|
||
sMenuText = QT_TR_NOOP("Cascade Horizontal Dimensions");
|
||
sToolTipText = QT_TR_NOOP("Evenly spaces the selected horizontal dimensions:<br>\
|
||
- Specify the cascade spacing (optional)<br>\
|
||
- Select two or more horizontal dimensions<br>\
|
||
- The first dimension defines the position<br>\
|
||
- Click this tool");
|
||
sWhatsThis = "TechDraw_ExtensionCascadeDimensionGroup";
|
||
sStatusTip = sMenuText;
|
||
}
|
||
|
||
void CmdTechDrawExtensionCascadeDimensionGroup::activated(int iMsg)
|
||
{
|
||
// Base::Console().message("CMD::ExtensionCascadeDimansionGroup - 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<Gui::ActionGroup*>(_pcAction);
|
||
pcAction->setIcon(pcAction->actions().at(iMsg)->icon());
|
||
switch (iMsg) {
|
||
case 0: //cascade horizontal dimensions
|
||
execCascadeHorizDimension(this);
|
||
break;
|
||
case 1: //cascade vertical dimensions
|
||
execCascadeVertDimension(this);
|
||
break;
|
||
case 2: //cascade oblique dimensions
|
||
execCascadeObliqueDimension(this);
|
||
break;
|
||
default:
|
||
Base::Console().message("CMD::CVGrp - invalid iMsg: %d\n", iMsg);
|
||
};
|
||
}
|
||
|
||
Gui::Action* CmdTechDrawExtensionCascadeDimensionGroup::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_ExtensionCascadeHorizDimension"));
|
||
p1->setObjectName(QStringLiteral("TechDraw_ExtensionCascadeHorizDimension"));
|
||
p1->setWhatsThis(QStringLiteral("TechDraw_ExtensionCascadeHorizDimension"));
|
||
QAction* p2 = pcAction->addAction(QString());
|
||
p2->setIcon(Gui::BitmapFactory().iconFromTheme("TechDraw_ExtensionCascadeVertDimension"));
|
||
p2->setObjectName(QStringLiteral("TechDraw_ExtensionCascadeVertDimension"));
|
||
p2->setWhatsThis(QStringLiteral("TechDraw_ExtensionCascadeVertDimension"));
|
||
QAction* p3 = pcAction->addAction(QString());
|
||
p3->setIcon(Gui::BitmapFactory().iconFromTheme("TechDraw_ExtensionCascadeObliqueDimension"));
|
||
p3->setObjectName(QStringLiteral("TechDraw_ExtensionCascadeObliqueDimension"));
|
||
p3->setWhatsThis(QStringLiteral("TechDraw_ExtensionCascadeObliqueDimension"));
|
||
|
||
_pcAction = pcAction;
|
||
languageChange();
|
||
|
||
pcAction->setIcon(p1->icon());
|
||
int defaultId = 0;
|
||
pcAction->setProperty("defaultAction", QVariant(defaultId));
|
||
|
||
return pcAction;
|
||
}
|
||
|
||
void CmdTechDrawExtensionCascadeDimensionGroup::languageChange()
|
||
{
|
||
Command::languageChange();
|
||
|
||
if (!_pcAction)
|
||
return;
|
||
Gui::ActionGroup* pcAction = qobject_cast<Gui::ActionGroup*>(_pcAction);
|
||
QList<QAction*> a = pcAction->actions();
|
||
|
||
QAction* arc1 = a[0];
|
||
arc1->setText(QApplication::translate("CmdTechDrawExtensionCascadeHorizDimension", "Cascade Horizontal Dimensions"));
|
||
arc1->setToolTip(QApplication::translate("CmdTechDrawExtensionCascadeHorizDimension",
|
||
"Evenly spaces the selected horizontal dimensions:<br>\
|
||
- Specify the cascade spacing (optional)<br>\
|
||
- Select two or more horizontal dimensions<br>\
|
||
- The first dimension defines the position<br>\
|
||
- Click this tool"));
|
||
arc1->setStatusTip(arc1->text());
|
||
QAction* arc2 = a[1];
|
||
arc2->setText(QApplication::translate("CmdTechDrawExtensionCascadeVertDimension", "Cascade Vertical Dimensions"));
|
||
arc2->setToolTip(QApplication::translate("CmdTechDrawExtensionCascadeVertDimension",
|
||
"Evenly spaces the selected vertical dimensions:<br>\
|
||
- Specify the cascade spacing (optional)<br>\
|
||
- Select two or more vertical dimensions<br>\
|
||
- The first dimension defines the position<br>\
|
||
- Click this tool"));
|
||
arc2->setStatusTip(arc2->text());
|
||
QAction* arc3 = a[2];
|
||
arc3->setText(QApplication::translate("CmdTechDrawExtensionCascadeObliqueDimension", "Cascade Oblique Dimensions"));
|
||
arc3->setToolTip(QApplication::translate("CmdTechDrawExtensionCascadeObliqueDimension",
|
||
"Evenly spaces the selected oblique dimensions:<br>\
|
||
- Specify the cascade spacing (optional)<br>\
|
||
- Select two or more parallel oblique dimensions<br>\
|
||
- The first dimension defines the position<br>\
|
||
- Click this tool"));
|
||
arc3->setStatusTip(arc3->text());
|
||
}
|
||
|
||
bool CmdTechDrawExtensionCascadeDimensionGroup::isActive()
|
||
{
|
||
bool havePage = DrawGuiUtil::needPage(this);
|
||
bool haveView = DrawGuiUtil::needView(this, true);
|
||
return (havePage && haveView);
|
||
}
|
||
|
||
//===========================================================================
|
||
// TechDraw_ExtensionCreateHorizChainDimension
|
||
//===========================================================================
|
||
|
||
void execCreateHorizChainDimension(Gui::Command* cmd) {
|
||
//create a horizontal chain dimension
|
||
std::vector<Gui::SelectionObject> selection;
|
||
TechDraw::DrawViewPart* objFeat;
|
||
if (!_checkSelObjAndSubs(cmd, selection, objFeat, QT_TRANSLATE_NOOP("QObject","TechDraw Create Horizontal Chain Dimension"))) {
|
||
return;
|
||
}
|
||
|
||
Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Create Horizontal Chain Dimension"));
|
||
const std::vector<std::string> subNames = selection[0].getSubNames();
|
||
std::vector<dimVertex> allVertexes;
|
||
allVertexes = _getVertexInfo(objFeat, subNames);
|
||
if (!allVertexes.empty() && allVertexes.size() > 1) {
|
||
std::sort(allVertexes.begin(), allVertexes.end(), sortX);
|
||
float yMaster = 0.0;
|
||
for (long unsigned int n = 0; n < allVertexes.size() - 1; n++) {
|
||
TechDraw::DrawViewDimension* dim;
|
||
dim = _createLinDimension(objFeat, allVertexes[n].name, allVertexes[n + 1].name, "DistanceX");
|
||
TechDraw::pointPair pp = dim->getLinearPoints();
|
||
Base::Vector3d mid = (pp.first() + pp.second()) / 2.0;
|
||
dim->X.setValue(mid.x);
|
||
if (n == 0)
|
||
yMaster = -mid.y;
|
||
dim->Y.setValue(yMaster);
|
||
}
|
||
}
|
||
objFeat->refreshCEGeoms();
|
||
objFeat->requestPaint();
|
||
cmd->getSelection().clearSelection();
|
||
Gui::Command::commitCommand();
|
||
}
|
||
|
||
DEF_STD_CMD_A(CmdTechDrawExtensionCreateHorizChainDimension)
|
||
|
||
CmdTechDrawExtensionCreateHorizChainDimension::CmdTechDrawExtensionCreateHorizChainDimension()
|
||
: Command("TechDraw_ExtensionCreateHorizChainDimension")
|
||
{
|
||
sAppModule = "TechDraw";
|
||
sGroup = QT_TR_NOOP("TechDraw");
|
||
sMenuText = QT_TR_NOOP("Horizontal Chain Dimension");
|
||
sToolTipText = QT_TR_NOOP("Inserts a sequence of aligned horizontal dimensions to at least "
|
||
"three selected vertices");
|
||
sWhatsThis = "TechDraw_ExtensionCreateHorizChainDimension";
|
||
sStatusTip = sMenuText;
|
||
sPixmap = "TechDraw_ExtensionCreateHorizChainDimension";
|
||
}
|
||
|
||
void CmdTechDrawExtensionCreateHorizChainDimension::activated(int iMsg)
|
||
{
|
||
Q_UNUSED(iMsg);
|
||
execCreateHorizChainDimension(this);
|
||
//execSortieren(this);
|
||
}
|
||
|
||
bool CmdTechDrawExtensionCreateHorizChainDimension::isActive()
|
||
{
|
||
bool havePage = DrawGuiUtil::needPage(this);
|
||
bool haveView = DrawGuiUtil::needView(this);
|
||
return (havePage && haveView);
|
||
}
|
||
|
||
//===========================================================================
|
||
// TechDraw_ExtensionCreateVertChainDimension
|
||
//===========================================================================
|
||
|
||
void execCreateVertChainDimension(Gui::Command* cmd) {
|
||
//create a vertical chain dimension
|
||
std::vector<Gui::SelectionObject> selection;
|
||
TechDraw::DrawViewPart* objFeat;
|
||
if (!_checkSelObjAndSubs(cmd, selection, objFeat, QT_TRANSLATE_NOOP("QObject","TechDraw Create Vertical Chain Dimension"))) {
|
||
return;
|
||
}
|
||
|
||
Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Create Vert Chain dimension"));
|
||
const std::vector<std::string> subNames = selection[0].getSubNames();
|
||
std::vector<dimVertex> allVertexes;
|
||
allVertexes = _getVertexInfo(objFeat, subNames);
|
||
if (!allVertexes.empty() && allVertexes.size() > 1) {
|
||
std::sort(allVertexes.begin(), allVertexes.end(), sortY);
|
||
float xMaster = 0.0;
|
||
double fontSize = Preferences::dimFontSizeMM();
|
||
for (long unsigned int n = 0; n < allVertexes.size() - 1; n++) {
|
||
TechDraw::DrawViewDimension* dim;
|
||
dim = _createLinDimension(objFeat, allVertexes[n].name, allVertexes[n + 1].name, "DistanceY");
|
||
TechDraw::pointPair pp = dim->getLinearPoints();
|
||
Base::Vector3d mid = (pp.first() + pp.second()) / 2.0;
|
||
if (n == 0)
|
||
xMaster = mid.x;
|
||
dim->X.setValue(xMaster);
|
||
dim->Y.setValue(-mid.y + 0.5 * fontSize);
|
||
}
|
||
}
|
||
objFeat->refreshCEGeoms();
|
||
objFeat->requestPaint();
|
||
cmd->getSelection().clearSelection();
|
||
Gui::Command::commitCommand();
|
||
}
|
||
|
||
DEF_STD_CMD_A(CmdTechDrawExtensionCreateVertChainDimension)
|
||
|
||
CmdTechDrawExtensionCreateVertChainDimension::CmdTechDrawExtensionCreateVertChainDimension()
|
||
: Command("TechDraw_ExtensionCreateVertChainDimension")
|
||
{
|
||
sAppModule = "TechDraw";
|
||
sGroup = QT_TR_NOOP("TechDraw");
|
||
sMenuText = QT_TR_NOOP("Vertical Chain Dimension");
|
||
sToolTipText = QT_TR_NOOP("Inserts a sequence of aligned vertical dimensions to at least "
|
||
"three selected vertices");
|
||
sWhatsThis = "TechDraw_ExtensionCreateVertChainDimension";
|
||
sStatusTip = sMenuText;
|
||
sPixmap = "TechDraw_ExtensionCreateVertChainDimension";
|
||
}
|
||
|
||
void CmdTechDrawExtensionCreateVertChainDimension::activated(int iMsg)
|
||
{
|
||
Q_UNUSED(iMsg);
|
||
execCreateVertChainDimension(this);
|
||
}
|
||
|
||
bool CmdTechDrawExtensionCreateVertChainDimension::isActive()
|
||
{
|
||
bool havePage = DrawGuiUtil::needPage(this);
|
||
bool haveView = DrawGuiUtil::needView(this);
|
||
return (havePage && haveView);
|
||
}
|
||
|
||
//===========================================================================
|
||
// TechDraw_ExtensionCreateObliqueChainDimension
|
||
//===========================================================================
|
||
|
||
void execCreateObliqueChainDimension(Gui::Command* cmd) {
|
||
// create an oblique chain dimension
|
||
std::vector<Gui::SelectionObject> selection;
|
||
TechDraw::DrawViewPart* objFeat;
|
||
if (!_checkSelObjAndSubs(cmd, selection, objFeat, QT_TRANSLATE_NOOP("QObject","TechDraw Create Oblique Chain Dimension"))){
|
||
return;
|
||
}
|
||
|
||
Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Create oblique chain dimension"));
|
||
|
||
std::vector<TechDraw::ReferenceEntry> refs;
|
||
for (auto& subName : selection[0].getSubNames()) {
|
||
refs.push_back(ReferenceEntry(objFeat, subName));
|
||
}
|
||
|
||
auto dims = makeObliqueChainDimension(refs);
|
||
if(dims.empty()){
|
||
Gui::Command::abortCommand();
|
||
}
|
||
else {
|
||
objFeat->refreshCEGeoms();
|
||
objFeat->requestPaint();
|
||
cmd->getSelection().clearSelection();
|
||
Gui::Command::commitCommand();
|
||
}
|
||
}
|
||
|
||
std::vector<DrawViewDimension*> TechDrawGui::makeObliqueChainDimension(std::vector<TechDraw::ReferenceEntry> refs)
|
||
{
|
||
if (refs.empty()) {
|
||
return {};
|
||
}
|
||
|
||
std::vector<std::string> subNames;
|
||
auto* objFeat = static_cast<DrawViewPart*>(refs[0].getObject());
|
||
for (auto& ref : refs) {
|
||
subNames.push_back(ref.getSubName());
|
||
}
|
||
std::vector<DrawViewDimension*> dims;
|
||
|
||
std::vector<dimVertex> allVertexes, carrierVertexes;
|
||
allVertexes = _getVertexInfo(objFeat, subNames);
|
||
if (!allVertexes.empty() && allVertexes.size() > 1) {
|
||
Base::Vector3d pMaster = allVertexes[0].point;
|
||
Base::Vector3d dirMaster = pMaster - allVertexes[1].point;
|
||
Base::Vector3d origin(0.0, 0.0, 0.0);
|
||
Base::Vector3d delta = DrawUtil::getTrianglePoint(pMaster, dirMaster, origin);
|
||
float dimDistance = activeDimAttributes.getCascadeSpacing();
|
||
delta = delta.Normalize() * dimDistance;
|
||
for (dimVertex& oldVertex : allVertexes) {
|
||
Base::Vector3d nextPoint = DrawUtil::getTrianglePoint(pMaster, dirMaster, oldVertex.point);
|
||
// nextPoint.y = -nextPoint.y;
|
||
// oldVertex.point.y = -oldVertex.point.y;
|
||
if ((oldVertex.point - nextPoint).Length() > 0.01) {
|
||
Base::Vector3d cvPoint = CosmeticVertex::makeCanonicalPointInverted(objFeat, nextPoint);
|
||
std::string vertTag = objFeat->addCosmeticVertex(cvPoint, false);
|
||
int vertNumber = objFeat->add1CVToGV(vertTag);
|
||
std::stringstream ss;
|
||
ss << "Vertex" << vertNumber;
|
||
dimVertex newVertex;
|
||
newVertex.name = ss.str();
|
||
newVertex.point = nextPoint;
|
||
carrierVertexes.push_back(newVertex);
|
||
Base::Vector3d oldCanon = CosmeticVertex::makeCanonicalPointInverted(objFeat, oldVertex.point);
|
||
std::string edgeTag = objFeat->addCosmeticEdge(oldCanon, cvPoint);
|
||
auto edge = objFeat->getCosmeticEdge(edgeTag);
|
||
edge->m_format.setStyle(1);
|
||
edge->m_format.setLineNumber(1);
|
||
edge->m_format.setWidth(TechDraw::LineGroup::getDefaultWidth("Thin"));
|
||
edge->m_format.setColor(Base::Color(0.0f, 0.0f, 0.0f));
|
||
}
|
||
else
|
||
carrierVertexes.push_back(oldVertex);
|
||
}
|
||
std::sort(carrierVertexes.begin(), carrierVertexes.end(), sortX);
|
||
double fontSize = Preferences::dimFontSizeMM();
|
||
for (long unsigned int n = 0; n < allVertexes.size() - 1; n++) {
|
||
TechDraw::DrawViewDimension* dim;
|
||
dim = _createLinDimension(objFeat, carrierVertexes[n].name, carrierVertexes[n + 1].name, "Distance");
|
||
TechDraw::pointPair pp = dim->getLinearPoints();
|
||
Base::Vector3d mid = (pp.first() + pp.second()) / 2.0 + delta;
|
||
dim->X.setValue(mid.x);
|
||
dim->Y.setValue(-mid.y + 0.5 * fontSize);
|
||
dims.push_back(dim);
|
||
}
|
||
}
|
||
|
||
return dims;
|
||
}
|
||
|
||
DEF_STD_CMD_A(CmdTechDrawExtensionCreateObliqueChainDimension)
|
||
|
||
CmdTechDrawExtensionCreateObliqueChainDimension::CmdTechDrawExtensionCreateObliqueChainDimension()
|
||
: Command("TechDraw_ExtensionCreateObliqueChainDimension")
|
||
{
|
||
sAppModule = "TechDraw";
|
||
sGroup = QT_TR_NOOP("TechDraw");
|
||
sMenuText = QT_TR_NOOP("Oblique Chain Dimension");
|
||
sToolTipText = QT_TR_NOOP("Inserts a sequence of aligned oblique dimensions to at least "
|
||
"three selected vertices, where the first two define the direction");
|
||
sWhatsThis = "TechDraw_ExtensionCreateObliqueChainDimension";
|
||
sStatusTip = sMenuText;
|
||
sPixmap = "TechDraw_ExtensionCreateObliqueChainDimension";
|
||
}
|
||
|
||
void CmdTechDrawExtensionCreateObliqueChainDimension::activated(int iMsg)
|
||
{
|
||
Q_UNUSED(iMsg);
|
||
execCreateObliqueChainDimension(this);
|
||
}
|
||
|
||
bool CmdTechDrawExtensionCreateObliqueChainDimension::isActive()
|
||
{
|
||
bool havePage = DrawGuiUtil::needPage(this);
|
||
bool haveView = DrawGuiUtil::needView(this);
|
||
return (havePage && haveView);
|
||
}
|
||
|
||
//===========================================================================
|
||
// TechDraw_ExtensionCreateChainDimensionGroup
|
||
//===========================================================================
|
||
|
||
DEF_STD_CMD_ACL(CmdTechDrawExtensionCreateChainDimensionGroup)
|
||
|
||
CmdTechDrawExtensionCreateChainDimensionGroup::CmdTechDrawExtensionCreateChainDimensionGroup()
|
||
: Command("TechDraw_ExtensionCreateChainDimensionGroup")
|
||
{
|
||
sAppModule = "TechDraw";
|
||
sGroup = QT_TR_NOOP("TechDraw");
|
||
sMenuText = QT_TR_NOOP("Horizontal Chain Dimension");
|
||
sToolTipText = QT_TR_NOOP("Inserts a sequence of aligned horizontal dimensions to at least "
|
||
"three selected vertices, where the first two define the direction");
|
||
sWhatsThis = "TechDraw_ExtensionCreateChainDimensionGroup";
|
||
sStatusTip = sMenuText;
|
||
}
|
||
|
||
void CmdTechDrawExtensionCreateChainDimensionGroup::activated(int iMsg)
|
||
{
|
||
// Base::Console().message("CMD::ExtensionCascadeDimansionGroup - 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<Gui::ActionGroup*>(_pcAction);
|
||
pcAction->setIcon(pcAction->actions().at(iMsg)->icon());
|
||
switch (iMsg) {
|
||
case 0: //create horizontal chain dimensions
|
||
execCreateHorizChainDimension(this);
|
||
break;
|
||
case 1: //create vertical chain dimensions
|
||
execCreateVertChainDimension(this);
|
||
break;
|
||
case 2: //create oblique chain dimensions
|
||
execCreateObliqueChainDimension(this);
|
||
break;
|
||
default:
|
||
Base::Console().message("CMD::CVGrp - invalid iMsg: %d\n", iMsg);
|
||
};
|
||
}
|
||
|
||
Gui::Action* CmdTechDrawExtensionCreateChainDimensionGroup::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_ExtensionCreateHorizChainDimension"));
|
||
p1->setObjectName(QStringLiteral("TechDraw_ExtensionCreateHorizChainDimension"));
|
||
p1->setWhatsThis(QStringLiteral("TechDraw_ExtensionCreateHorizChainDimension"));
|
||
QAction* p2 = pcAction->addAction(QString());
|
||
p2->setIcon(Gui::BitmapFactory().iconFromTheme("TechDraw_ExtensionCreateVertChainDimension"));
|
||
p2->setObjectName(QStringLiteral("TechDraw_ExtensionCreateVertChainDimension"));
|
||
p2->setWhatsThis(QStringLiteral("TechDraw_ExtensionCreateVertChainDimension"));
|
||
QAction* p3 = pcAction->addAction(QString());
|
||
p3->setIcon(Gui::BitmapFactory().iconFromTheme("TechDraw_ExtensionCreateObliqueChainDimension"));
|
||
p3->setObjectName(QStringLiteral("TechDraw_ExtensionCreateObliqueChainDimension"));
|
||
p3->setWhatsThis(QStringLiteral("TechDraw_ExtensionCreateObliqueChainDimension"));
|
||
|
||
_pcAction = pcAction;
|
||
languageChange();
|
||
|
||
pcAction->setIcon(p1->icon());
|
||
int defaultId = 0;
|
||
pcAction->setProperty("defaultAction", QVariant(defaultId));
|
||
|
||
return pcAction;
|
||
}
|
||
|
||
void CmdTechDrawExtensionCreateChainDimensionGroup::languageChange()
|
||
{
|
||
Command::languageChange();
|
||
|
||
if (!_pcAction)
|
||
return;
|
||
Gui::ActionGroup* pcAction = qobject_cast<Gui::ActionGroup*>(_pcAction);
|
||
QList<QAction*> a = pcAction->actions();
|
||
|
||
QAction* arc1 = a[0];
|
||
arc1->setText(QApplication::translate("CmdTechDrawExtensionCreateHorizChainDimension", "Horizontal Chain Dimension"));
|
||
arc1->setToolTip(QApplication::translate("CmdTechDrawExtensionCreateHorizChainDimension",
|
||
"Inserts a sequence of aligned horizontal dimensions to at least three selected vertices, where the first two define the direction"));
|
||
arc1->setStatusTip(arc1->text());
|
||
QAction* arc2 = a[1];
|
||
arc2->setText(QApplication::translate("CmdTechDrawExtensionCreateVertChainDimension", "Vertical Chain Dimension"));
|
||
arc2->setToolTip(QApplication::translate("CmdTechDrawExtensionCreateVertChainDimension",
|
||
"Inserts a sequence of aligned vertical dimensions to at least three selected vertices, where the first two define the direction"));
|
||
arc2->setStatusTip(arc2->text());
|
||
QAction* arc3 = a[2];
|
||
arc3->setText(QApplication::translate("CmdTechDrawExtensionCreateObliqueChainDimension", "Oblique Chain Dimension"));
|
||
arc3->setToolTip(QApplication::translate("CmdTechDrawExtensionCreateObliqueChainDimension",
|
||
"Inserts a sequence of aligned oblique dimensions to at least three selected vertices, where the first two define the direction"));
|
||
arc3->setStatusTip(arc3->text());
|
||
}
|
||
|
||
bool CmdTechDrawExtensionCreateChainDimensionGroup::isActive()
|
||
{
|
||
bool havePage = DrawGuiUtil::needPage(this);
|
||
bool haveView = DrawGuiUtil::needView(this, true);
|
||
return (havePage && haveView);
|
||
}
|
||
|
||
//===========================================================================
|
||
// TechDraw_ExtensionCreateHorizCoordDimension
|
||
//===========================================================================
|
||
|
||
void execCreateHorizCoordDimension(Gui::Command* cmd) {
|
||
//create horizontal coordinate dimensions
|
||
std::vector<Gui::SelectionObject> selection;
|
||
TechDraw::DrawViewPart* objFeat;
|
||
if (!_checkSelObjAndSubs(cmd, selection, objFeat, QT_TRANSLATE_NOOP("QObject","TechDraw Create Horizontal Coordinate Dimension"))) {
|
||
return;
|
||
}
|
||
|
||
Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Create Horizontal Coord Dimension"));
|
||
const std::vector<std::string> subNames = selection[0].getSubNames();
|
||
std::vector<dimVertex> allVertexes;
|
||
allVertexes = _getVertexInfo(objFeat, subNames);
|
||
if (!allVertexes.empty() && allVertexes.size() > 1) {
|
||
dimVertex firstVertex = allVertexes[0];
|
||
dimVertex secondVertex = allVertexes[1];
|
||
std::sort(allVertexes.begin(), allVertexes.end(), sortX);
|
||
if (firstVertex.point.x > secondVertex.point.x) {
|
||
std::reverse(allVertexes.begin(), allVertexes.end());
|
||
}
|
||
float dimDistance = activeDimAttributes.getCascadeSpacing();
|
||
float yMaster = allVertexes[0].point.y - dimDistance;
|
||
if (std::signbit(yMaster))
|
||
dimDistance = -dimDistance;
|
||
for (long unsigned int n = 0; n < allVertexes.size() - 1; n++) {
|
||
TechDraw::DrawViewDimension* dim;
|
||
dim = _createLinDimension(objFeat, allVertexes[0].name, allVertexes[n + 1].name, "DistanceX");
|
||
TechDraw::pointPair pp = dim->getLinearPoints();
|
||
Base::Vector3d mid = (pp.first() + pp.second()) / 2.0;
|
||
dim->X.setValue(mid.x);
|
||
dim->Y.setValue(-yMaster - dimDistance * n);
|
||
}
|
||
}
|
||
objFeat->refreshCEGeoms();
|
||
objFeat->requestPaint();
|
||
cmd->getSelection().clearSelection();
|
||
Gui::Command::commitCommand();
|
||
}
|
||
|
||
DEF_STD_CMD_A(CmdTechDrawExtensionCreateHorizCoordDimension)
|
||
|
||
CmdTechDrawExtensionCreateHorizCoordDimension::CmdTechDrawExtensionCreateHorizCoordDimension()
|
||
: Command("TechDraw_ExtensionCreateHorizCoordDimension")
|
||
{
|
||
sAppModule = "TechDraw";
|
||
sGroup = QT_TR_NOOP("TechDraw");
|
||
sMenuText = QT_TR_NOOP("Horizontal Coordinate Dimension");
|
||
sToolTipText = QT_TR_NOOP("Adds evenly spaced horizontal dimensions between 3 or more vertices aligned to a shared baseline");
|
||
sWhatsThis = "TechDraw_ExtensionCreateHorizCoordDimension";
|
||
sStatusTip = sMenuText;
|
||
sPixmap = "TechDraw_ExtensionCreateHorizCoordDimension";
|
||
}
|
||
|
||
void CmdTechDrawExtensionCreateHorizCoordDimension::activated(int iMsg)
|
||
{
|
||
Q_UNUSED(iMsg);
|
||
execCreateHorizCoordDimension(this);
|
||
}
|
||
|
||
bool CmdTechDrawExtensionCreateHorizCoordDimension::isActive()
|
||
{
|
||
bool havePage = DrawGuiUtil::needPage(this);
|
||
bool haveView = DrawGuiUtil::needView(this);
|
||
return (havePage && haveView);
|
||
}
|
||
|
||
//===========================================================================
|
||
// TechDraw_ExtensionCreateVertCoordDimension
|
||
//===========================================================================
|
||
|
||
void execCreateVertCoordDimension(Gui::Command* cmd) {
|
||
//create vertical coordinate dimensions
|
||
std::vector<Gui::SelectionObject> selection;
|
||
TechDraw::DrawViewPart* objFeat;
|
||
if (!_checkSelObjAndSubs(cmd, selection, objFeat, QT_TRANSLATE_NOOP("QObject","TechDraw Create Vertical Coord dimension"))) {
|
||
return;
|
||
}
|
||
Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Create vert coord dimension"));
|
||
const std::vector<std::string> subNames = selection[0].getSubNames();
|
||
std::vector<dimVertex> allVertexes;
|
||
allVertexes = _getVertexInfo(objFeat, subNames);
|
||
if (!allVertexes.empty() && allVertexes.size() > 1) {
|
||
dimVertex firstVertex = allVertexes[0];
|
||
dimVertex secondVertex = allVertexes[1];
|
||
std::sort(allVertexes.begin(), allVertexes.end(), sortY);
|
||
if (firstVertex.point.y > secondVertex.point.y) {
|
||
std::reverse(allVertexes.begin(), allVertexes.end());
|
||
}
|
||
float dimDistance = activeDimAttributes.getCascadeSpacing();
|
||
float xMaster = allVertexes[0].point.x + dimDistance;
|
||
if (std::signbit(xMaster))
|
||
dimDistance = -dimDistance;
|
||
double fontSize = Preferences::dimFontSizeMM();
|
||
for (long unsigned int n = 0; n < allVertexes.size() - 1; n++) {
|
||
TechDraw::DrawViewDimension* dim;
|
||
dim = _createLinDimension(objFeat, allVertexes[0].name, allVertexes[n + 1].name, "DistanceY");
|
||
TechDraw::pointPair pp = dim->getLinearPoints();
|
||
Base::Vector3d mid = (pp.first() + pp.second()) / 2.0;
|
||
dim->X.setValue(xMaster + dimDistance * n);
|
||
dim->Y.setValue(-mid.y + 0.5 * fontSize);
|
||
}
|
||
}
|
||
objFeat->refreshCEGeoms();
|
||
objFeat->requestPaint();
|
||
cmd->getSelection().clearSelection();
|
||
Gui::Command::commitCommand();
|
||
}
|
||
|
||
DEF_STD_CMD_A(CmdTechDrawExtensionCreateVertCoordDimension)
|
||
|
||
CmdTechDrawExtensionCreateVertCoordDimension::CmdTechDrawExtensionCreateVertCoordDimension()
|
||
: Command("TechDraw_ExtensionCreateVertCoordDimension")
|
||
{
|
||
sAppModule = "TechDraw";
|
||
sGroup = QT_TR_NOOP("TechDraw");
|
||
sMenuText = QT_TR_NOOP("Vertical Coordinate Dimension");
|
||
sToolTipText = QT_TR_NOOP("Adds evenly spaced vertical dimensions between 3 or more vertices aligned to a shared baseline");
|
||
sWhatsThis = "TechDraw_ExtensionCreateVertCoordDimension";
|
||
sStatusTip = sMenuText;
|
||
sPixmap = "TechDraw_ExtensionCreateVertCoordDimension";
|
||
}
|
||
|
||
void CmdTechDrawExtensionCreateVertCoordDimension::activated(int iMsg)
|
||
{
|
||
Q_UNUSED(iMsg);
|
||
execCreateVertCoordDimension(this);
|
||
}
|
||
|
||
bool CmdTechDrawExtensionCreateVertCoordDimension::isActive()
|
||
{
|
||
bool havePage = DrawGuiUtil::needPage(this);
|
||
bool haveView = DrawGuiUtil::needView(this);
|
||
return (havePage && haveView);
|
||
}
|
||
|
||
//===========================================================================
|
||
// TechDraw_ExtensionCreateObliqueCoordDimension
|
||
//===========================================================================
|
||
|
||
void execCreateObliqueCoordDimension(Gui::Command* cmd) {
|
||
//create oblique coordinate dimensions
|
||
std::vector<Gui::SelectionObject> selection;
|
||
TechDraw::DrawViewPart* objFeat{nullptr};
|
||
if (!_checkSelObjAndSubs(cmd, selection, objFeat, QT_TRANSLATE_NOOP("QObject","TechDraw Create Oblique Coord Dimension"))) {
|
||
return;
|
||
}
|
||
|
||
Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Create oblique coord dimension"));
|
||
|
||
std::vector<TechDraw::ReferenceEntry> refs;
|
||
for (auto& subName : selection[0].getSubNames()) {
|
||
refs.push_back(ReferenceEntry(objFeat, subName));
|
||
}
|
||
|
||
auto dims = makeObliqueCoordDimension(refs);
|
||
if (dims.empty()) {
|
||
Gui::Command::abortCommand();
|
||
}
|
||
else {
|
||
objFeat->refreshCEGeoms();
|
||
objFeat->requestPaint();
|
||
cmd->getSelection().clearSelection();
|
||
Gui::Command::commitCommand();
|
||
}
|
||
}
|
||
|
||
std::vector<DrawViewDimension*> TechDrawGui::makeObliqueCoordDimension(std::vector<TechDraw::ReferenceEntry> refs)
|
||
{
|
||
if (refs.empty()) {
|
||
return {};
|
||
}
|
||
|
||
std::vector<std::string> subNames;
|
||
auto* objFeat = static_cast<DrawViewPart*>(refs[0].getObject());
|
||
for (auto& ref : refs) {
|
||
subNames.push_back(ref.getSubName());
|
||
}
|
||
std::vector<DrawViewDimension*> dims;
|
||
|
||
std::vector<dimVertex> allVertexes, carrierVertexes;
|
||
allVertexes = _getVertexInfo(objFeat, subNames);
|
||
if (!allVertexes.empty() && allVertexes.size() > 1) {
|
||
Base::Vector3d pMaster = allVertexes[0].point;
|
||
Base::Vector3d dirMaster = pMaster - allVertexes[1].point;
|
||
Base::Vector3d origin(0.0, 0.0, 0.0);
|
||
Base::Vector3d delta = DrawUtil::getTrianglePoint(pMaster, dirMaster, origin);
|
||
float dimDistance = activeDimAttributes.getCascadeSpacing();
|
||
delta = delta.Normalize() * dimDistance;
|
||
for (dimVertex& oldVertex : allVertexes) {
|
||
Base::Vector3d nextPoint = DrawUtil::getTrianglePoint(pMaster, dirMaster, oldVertex.point);
|
||
if ((oldVertex.point - nextPoint).Length() > 0.01) {
|
||
Base::Vector3d cvPoint = CosmeticVertex::makeCanonicalPointInverted(objFeat, nextPoint);
|
||
std::string vertTag = objFeat->addCosmeticVertex(cvPoint, false);
|
||
int vertNumber = objFeat->add1CVToGV(vertTag);
|
||
std::stringstream ss;
|
||
ss << "Vertex" << vertNumber;
|
||
dimVertex newVertex;
|
||
newVertex.name = ss.str();
|
||
newVertex.point = nextPoint;
|
||
carrierVertexes.push_back(newVertex);
|
||
Base::Vector3d oldCanon = CosmeticVertex::makeCanonicalPointInverted(objFeat, oldVertex.point);
|
||
std::string edgeTag = objFeat->addCosmeticEdge(oldCanon, cvPoint);
|
||
auto edge = objFeat->getCosmeticEdge(edgeTag);
|
||
edge->m_format.setStyle(1);
|
||
edge->m_format.setLineNumber(1);
|
||
edge->m_format.setWidth(TechDraw::LineGroup::getDefaultWidth("Thin"));
|
||
edge->m_format.setColor(Base::Color(0.0, 0.0, 0.0));
|
||
}
|
||
else {
|
||
carrierVertexes.push_back(oldVertex);
|
||
}
|
||
}
|
||
dimVertex firstVertex = carrierVertexes[0];
|
||
dimVertex secondVertex = carrierVertexes[1];
|
||
std::sort(carrierVertexes.begin(), carrierVertexes.end(), sortX);
|
||
if (firstVertex.point.x > secondVertex.point.x) {
|
||
std::reverse(carrierVertexes.begin(), carrierVertexes.end());
|
||
}
|
||
double fontSize = Preferences::dimFontSizeMM();
|
||
for (long unsigned int n = 0; n < allVertexes.size() - 1; n++) {
|
||
TechDraw::DrawViewDimension* dim;
|
||
dim = _createLinDimension(objFeat, carrierVertexes[0].name, carrierVertexes[n + 1].name, "Distance");
|
||
TechDraw::pointPair pp = dim->getLinearPoints();
|
||
Base::Vector3d mid = (pp.first() + pp.second()) / 2.0 + delta * (n + 1);
|
||
dim->X.setValue(mid.x);
|
||
dim->Y.setValue(-mid.y + 0.5 * fontSize);
|
||
dims.push_back(dim);
|
||
}
|
||
}
|
||
|
||
return dims;
|
||
}
|
||
|
||
DEF_STD_CMD_A(CmdTechDrawExtensionCreateObliqueCoordDimension)
|
||
|
||
CmdTechDrawExtensionCreateObliqueCoordDimension::CmdTechDrawExtensionCreateObliqueCoordDimension()
|
||
: Command("TechDraw_ExtensionCreateObliqueCoordDimension")
|
||
{
|
||
sAppModule = "TechDraw";
|
||
sGroup = QT_TR_NOOP("TechDraw");
|
||
sMenuText = QT_TR_NOOP("Oblique Coordinate Dimension");
|
||
sToolTipText = QT_TR_NOOP("Adds evenly spaced oblique dimensions between 3 or more vertices aligned to a shared baseline");
|
||
sWhatsThis = "TechDraw_ExtensionCreateObliqueCoordDimension";
|
||
sStatusTip = sMenuText;
|
||
sPixmap = "TechDraw_ExtensionCreateObliqueCoordDimension";
|
||
}
|
||
|
||
void CmdTechDrawExtensionCreateObliqueCoordDimension::activated(int iMsg)
|
||
{
|
||
Q_UNUSED(iMsg);
|
||
execCreateObliqueCoordDimension(this);
|
||
}
|
||
|
||
bool CmdTechDrawExtensionCreateObliqueCoordDimension::isActive()
|
||
{
|
||
bool havePage = DrawGuiUtil::needPage(this);
|
||
bool haveView = DrawGuiUtil::needView(this);
|
||
return (havePage && haveView);
|
||
}
|
||
|
||
//===========================================================================
|
||
// TechDraw_ExtensionCreateCoordDimensionGroup
|
||
//===========================================================================
|
||
|
||
DEF_STD_CMD_ACL(CmdTechDrawExtensionCreateCoordDimensionGroup)
|
||
|
||
CmdTechDrawExtensionCreateCoordDimensionGroup::CmdTechDrawExtensionCreateCoordDimensionGroup()
|
||
: Command("TechDraw_ExtensionCreateCoordDimensionGroup")
|
||
{
|
||
sAppModule = "TechDraw";
|
||
sGroup = QT_TR_NOOP("TechDraw");
|
||
sMenuText = QT_TR_NOOP("Horizontal Coordinate Dimension");
|
||
sToolTipText = QT_TR_NOOP("Adds evenly spaced horizontal dimensions between 3 or more vertices aligned to a shared baseline");
|
||
sWhatsThis = "TechDraw_ExtensionCreateCoordDimensionGroup";
|
||
sStatusTip = sMenuText;
|
||
}
|
||
|
||
void CmdTechDrawExtensionCreateCoordDimensionGroup::activated(int iMsg)
|
||
{
|
||
// Base::Console().message("CMD::ExtensionCascadeDimansionGroup - 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<Gui::ActionGroup*>(_pcAction);
|
||
pcAction->setIcon(pcAction->actions().at(iMsg)->icon());
|
||
switch (iMsg) {
|
||
case 0: //create horizontal coordinate dimensions
|
||
execCreateHorizCoordDimension(this);
|
||
break;
|
||
case 1: //create vertical coordinate dimensions
|
||
execCreateVertCoordDimension(this);
|
||
break;
|
||
case 2: //create oblique coordinate dimensions
|
||
execCreateObliqueCoordDimension(this);
|
||
break;
|
||
default:
|
||
Base::Console().message("CMD::CVGrp - invalid iMsg: %d\n", iMsg);
|
||
};
|
||
}
|
||
|
||
Gui::Action* CmdTechDrawExtensionCreateCoordDimensionGroup::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_ExtensionCreateHorizCoordDimension"));
|
||
p1->setObjectName(QStringLiteral("TechDraw_ExtensionCreateHorizCoordDimension"));
|
||
p1->setWhatsThis(QStringLiteral("TechDraw_ExtensionCreateHorizCoordDimension"));
|
||
QAction* p2 = pcAction->addAction(QString());
|
||
p2->setIcon(Gui::BitmapFactory().iconFromTheme("TechDraw_ExtensionCreateVertCoordDimension"));
|
||
p2->setObjectName(QStringLiteral("TechDraw_ExtensionCreateVertCoordDimension"));
|
||
p2->setWhatsThis(QStringLiteral("TechDraw_ExtensionCreateVertCoordDimension"));
|
||
QAction* p3 = pcAction->addAction(QString());
|
||
p3->setIcon(Gui::BitmapFactory().iconFromTheme("TechDraw_ExtensionCreateObliqueCoordDimension"));
|
||
p3->setObjectName(QStringLiteral("TechDraw_ExtensionCreateObliqueCoordDimension"));
|
||
p3->setWhatsThis(QStringLiteral("TechDraw_ExtensionCreateObliqueCoordDimension"));
|
||
|
||
_pcAction = pcAction;
|
||
languageChange();
|
||
|
||
pcAction->setIcon(p1->icon());
|
||
int defaultId = 0;
|
||
pcAction->setProperty("defaultAction", QVariant(defaultId));
|
||
|
||
return pcAction;
|
||
}
|
||
|
||
void CmdTechDrawExtensionCreateCoordDimensionGroup::languageChange()
|
||
{
|
||
Command::languageChange();
|
||
|
||
if (!_pcAction)
|
||
return;
|
||
Gui::ActionGroup* pcAction = qobject_cast<Gui::ActionGroup*>(_pcAction);
|
||
QList<QAction*> a = pcAction->actions();
|
||
|
||
QAction* arc1 = a[0];
|
||
arc1->setText(QApplication::translate("CmdTechDrawExtensionCreateHorizCoordDimension", "Horizontal Coordinate Dimension"));
|
||
arc1->setToolTip(QApplication::translate("CmdTechDrawExtensionCreateHorizCoordDimension",
|
||
"Adds evenly spaced horizontal dimensions between 3 or more vertices aligned to a shared baseline"));
|
||
arc1->setStatusTip(arc1->text());
|
||
QAction* arc2 = a[1];
|
||
arc2->setText(QApplication::translate("CmdTechDrawExtensionCreateVertCoordDimension", "Vertical Coordinate Dimension"));
|
||
arc2->setToolTip(QApplication::translate("CmdTechDrawExtensionCreateVertCoordDimension",
|
||
"Adds evenly spaced vertical dimensions between 3 or more vertices aligned to a shared baseline"));
|
||
arc2->setStatusTip(arc2->text());
|
||
QAction* arc3 = a[2];
|
||
arc3->setText(QApplication::translate("CmdTechDrawExtensionCreateObliqueCoordDimension", "Oblique Coordinate Dimension"));
|
||
arc3->setToolTip(QApplication::translate("CmdTechDrawExtensionCreateObliqueCoordDimension",
|
||
"Adds evenly spaced oblique dimensions between 3 or more vertices aligned to a shared baseline"));
|
||
arc3->setStatusTip(arc3->text());
|
||
}
|
||
|
||
bool CmdTechDrawExtensionCreateCoordDimensionGroup::isActive()
|
||
{
|
||
bool havePage = DrawGuiUtil::needPage(this);
|
||
bool haveView = DrawGuiUtil::needView(this, true);
|
||
return (havePage && haveView);
|
||
}
|
||
|
||
//===========================================================================
|
||
// TechDraw_ExtensionCreateHorizChamferDimension
|
||
//===========================================================================
|
||
|
||
void execCreateHorizChamferDimension(Gui::Command* cmd) {
|
||
//create a horizontal chamfer dimension
|
||
std::vector<Gui::SelectionObject> selection;
|
||
TechDraw::DrawViewPart* objFeat;
|
||
if (!_checkSelObjAndSubs(cmd, selection, objFeat, QT_TRANSLATE_NOOP("QObject","TechDraw Create Horizontal Chamfer Dimension"))) {
|
||
return;
|
||
}
|
||
|
||
Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Create Horizontal Chamfer Dimension"));
|
||
const std::vector<std::string> subNames = selection[0].getSubNames();
|
||
std::vector<dimVertex> allVertexes;
|
||
allVertexes = _getVertexInfo(objFeat, subNames);
|
||
if (!allVertexes.empty() && allVertexes.size() > 1) {
|
||
TechDraw::DrawViewDimension* dim;
|
||
dim = _createLinDimension(objFeat, allVertexes[0].name, allVertexes[1].name, "DistanceX");
|
||
float yMax = std::max(abs(allVertexes[0].point.y), abs(allVertexes[1].point.y)) + 7.0;
|
||
if (std::signbit(allVertexes[0].point.y))
|
||
yMax = -yMax;
|
||
TechDraw::pointPair pp = dim->getLinearPoints();
|
||
Base::Vector3d mid = (pp.first() + pp.second()) / 2.0;
|
||
dim->X.setValue(mid.x);
|
||
dim->Y.setValue(-yMax);
|
||
float dx = allVertexes[0].point.x - allVertexes[1].point.x;
|
||
float dy = allVertexes[0].point.y - allVertexes[1].point.y;
|
||
float alpha = std::round(Base::toDegrees(std::abs<float>(std::atan(dy / dx))));
|
||
std::string sAlpha = std::to_string((int)alpha);
|
||
std::string formatSpec = dim->FormatSpec.getStrValue();
|
||
formatSpec = formatSpec + " x" + sAlpha + "°";
|
||
dim->FormatSpec.setValue(formatSpec);
|
||
objFeat->requestPaint();
|
||
cmd->getSelection().clearSelection();
|
||
}
|
||
Gui::Command::commitCommand();
|
||
}
|
||
|
||
DEF_STD_CMD_A(CmdTechDrawExtensionCreateHorizChamferDimension)
|
||
|
||
CmdTechDrawExtensionCreateHorizChamferDimension::CmdTechDrawExtensionCreateHorizChamferDimension()
|
||
: Command("TechDraw_ExtensionCreateHorizChamferDimension")
|
||
{
|
||
sAppModule = "TechDraw";
|
||
sGroup = QT_TR_NOOP("TechDraw");
|
||
sMenuText = QT_TR_NOOP("Horizontal Chamfer Dimension");
|
||
sToolTipText = QT_TR_NOOP("Inserts a horizontal size and angle dimension for a chamfer from 2 selected vertices");
|
||
sWhatsThis = "TechDraw_ExtensionCreateHorizChamferDimension";
|
||
sStatusTip = sMenuText;
|
||
sPixmap = "TechDraw_ExtensionCreateHorizChamferDimension";
|
||
}
|
||
|
||
void CmdTechDrawExtensionCreateHorizChamferDimension::activated(int iMsg)
|
||
{
|
||
Q_UNUSED(iMsg);
|
||
execCreateHorizChamferDimension(this);
|
||
}
|
||
|
||
bool CmdTechDrawExtensionCreateHorizChamferDimension::isActive()
|
||
{
|
||
bool havePage = DrawGuiUtil::needPage(this);
|
||
bool haveView = DrawGuiUtil::needView(this);
|
||
return (havePage && haveView);
|
||
}
|
||
|
||
//===========================================================================
|
||
// TechDraw_ExtensionCreateVertChamferDimension
|
||
//===========================================================================
|
||
|
||
void execCreateVertChamferDimension(Gui::Command* cmd) {
|
||
//create a vertical chamfer dimension
|
||
std::vector<Gui::SelectionObject> selection;
|
||
TechDraw::DrawViewPart* objFeat;
|
||
if (!_checkSelObjAndSubs(cmd, selection, objFeat, QT_TRANSLATE_NOOP("QObject","TechDraw Create Vertical Chamfer Dimension"))) {
|
||
return;
|
||
}
|
||
|
||
Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Create Vert Chamfer Dimension"));
|
||
const std::vector<std::string> subNames = selection[0].getSubNames();
|
||
std::vector<dimVertex> allVertexes;
|
||
allVertexes = _getVertexInfo(objFeat, subNames);
|
||
if (!allVertexes.empty() && allVertexes.size() > 1) {
|
||
TechDraw::DrawViewDimension* dim;
|
||
dim = _createLinDimension(objFeat, allVertexes[0].name, allVertexes[1].name, "DistanceY");
|
||
float xMax = std::max(abs(allVertexes[0].point.x), abs(allVertexes[1].point.x)) + 7.0;
|
||
if (std::signbit(allVertexes[0].point.x))
|
||
xMax = -xMax;
|
||
TechDraw::pointPair pp = dim->getLinearPoints();
|
||
Base::Vector3d mid = (pp.first() + pp.second()) / 2.0;
|
||
dim->X.setValue(xMax);
|
||
dim->Y.setValue(-mid.y);
|
||
float dx = allVertexes[0].point.x - allVertexes[1].point.x;
|
||
float dy = allVertexes[0].point.y - allVertexes[1].point.y;
|
||
float alpha = std::round(Base::toDegrees(std::abs<float>(std::atan(dx / dy))));
|
||
std::string sAlpha = std::to_string((int)alpha);
|
||
std::string formatSpec = dim->FormatSpec.getStrValue();
|
||
formatSpec = formatSpec + " x" + sAlpha + "°";
|
||
dim->FormatSpec.setValue(formatSpec);
|
||
objFeat->requestPaint();
|
||
cmd->getSelection().clearSelection();
|
||
}
|
||
Gui::Command::commitCommand();
|
||
}
|
||
|
||
DEF_STD_CMD_A(CmdTechDrawExtensionCreateVertChamferDimension)
|
||
|
||
CmdTechDrawExtensionCreateVertChamferDimension::CmdTechDrawExtensionCreateVertChamferDimension()
|
||
: Command("TechDraw_ExtensionCreateVertChamferDimension")
|
||
{
|
||
sAppModule = "TechDraw";
|
||
sGroup = QT_TR_NOOP("TechDraw");
|
||
sMenuText = QT_TR_NOOP("Vertical Chamfer Dimension");
|
||
sToolTipText = QT_TR_NOOP("Inserts a vertical size and angle dimension for a chamfer from 2 selected vertices");
|
||
sWhatsThis = "TechDraw_ExtensionCreateVertChamferDimension";
|
||
sStatusTip = sMenuText;
|
||
sPixmap = "TechDraw_ExtensionCreateVertChamferDimension";
|
||
}
|
||
|
||
void CmdTechDrawExtensionCreateVertChamferDimension::activated(int iMsg)
|
||
{
|
||
Q_UNUSED(iMsg);
|
||
execCreateVertChamferDimension(this);
|
||
}
|
||
|
||
bool CmdTechDrawExtensionCreateVertChamferDimension::isActive()
|
||
{
|
||
bool havePage = DrawGuiUtil::needPage(this);
|
||
bool haveView = DrawGuiUtil::needView(this);
|
||
return (havePage && haveView);
|
||
}
|
||
|
||
//===========================================================================
|
||
// TechDraw_ExtensionChamferDimensionGroup
|
||
//===========================================================================
|
||
|
||
DEF_STD_CMD_ACL(CmdTechDrawExtensionChamferDimensionGroup)
|
||
|
||
CmdTechDrawExtensionChamferDimensionGroup::CmdTechDrawExtensionChamferDimensionGroup()
|
||
: Command("TechDraw_ExtensionChamferDimensionGroup")
|
||
{
|
||
sAppModule = "TechDraw";
|
||
sGroup = QT_TR_NOOP("TechDraw");
|
||
sMenuText = QT_TR_NOOP("Horizontal Chamfer Dimension");
|
||
sToolTipText = QT_TR_NOOP("Inserts a horizontal size and angle dimension for a chamfer from 2 selected vertices");
|
||
sWhatsThis = "TechDraw_ExtensionChamferDimensionGroup";
|
||
sStatusTip = sMenuText;
|
||
}
|
||
|
||
void CmdTechDrawExtensionChamferDimensionGroup::activated(int iMsg)
|
||
{
|
||
// Base::Console().message("CMD::ExtensionIncreaseDecreaseGroup - 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<Gui::ActionGroup*>(_pcAction);
|
||
pcAction->setIcon(pcAction->actions().at(iMsg)->icon());
|
||
switch (iMsg) {
|
||
case 0: //create a horizontal chamfer dimension
|
||
execCreateHorizChamferDimension(this);
|
||
break;
|
||
case 1: //create a vertical chamfer dimension
|
||
execCreateVertChamferDimension(this);
|
||
break;
|
||
default:
|
||
Base::Console().message("CMD::CVGrp - invalid iMsg: %d\n", iMsg);
|
||
};
|
||
}
|
||
|
||
Gui::Action* CmdTechDrawExtensionChamferDimensionGroup::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_ExtensionCreateHorizChamferDimension"));
|
||
p1->setObjectName(QStringLiteral("TechDraw_ExtensionCreateHorizChamferDimension"));
|
||
p1->setWhatsThis(QStringLiteral("TechDraw_ExtensionCreateHorizChamferDimension"));
|
||
QAction* p2 = pcAction->addAction(QString());
|
||
p2->setIcon(Gui::BitmapFactory().iconFromTheme("TechDraw_ExtensionCreateVertChamferDimension"));
|
||
p2->setObjectName(QStringLiteral("TechDraw_ExtensionCreateVertChamferDimension"));
|
||
p2->setWhatsThis(QStringLiteral("TechDraw_ExtensionCreateVertChamferDimension"));
|
||
|
||
_pcAction = pcAction;
|
||
languageChange();
|
||
|
||
pcAction->setIcon(p1->icon());
|
||
int defaultId = 0;
|
||
pcAction->setProperty("defaultAction", QVariant(defaultId));
|
||
|
||
return pcAction;
|
||
}
|
||
|
||
void CmdTechDrawExtensionChamferDimensionGroup::languageChange()
|
||
{
|
||
Command::languageChange();
|
||
|
||
if (!_pcAction)
|
||
return;
|
||
Gui::ActionGroup* pcAction = qobject_cast<Gui::ActionGroup*>(_pcAction);
|
||
QList<QAction*> a = pcAction->actions();
|
||
|
||
QAction* arc1 = a[0];
|
||
arc1->setText(QApplication::translate("CmdTechDrawExtensionCreateHorizChamferDimension", "Horizontal Chamfer Dimension"));
|
||
arc1->setToolTip(QApplication::translate("CmdTechDrawExtensionCreateHorizChamferDimension",
|
||
"Inserts a horizontal size and angle dimension for a chamfer from 2 selected vertices"));
|
||
arc1->setStatusTip(arc1->text());
|
||
QAction* arc2 = a[1];
|
||
arc2->setText(QApplication::translate("CmdTechDrawExtensionCreateVertChamferDimension", "Vertical Chamfer Dimension"));
|
||
arc2->setToolTip(QApplication::translate("CmdTechDrawExtensionCreateVertChamferDimension",
|
||
"Inserts a vertical size and angle dimension for a chamfer from 2 selected vertices"));
|
||
arc2->setStatusTip(arc2->text());
|
||
}
|
||
|
||
bool CmdTechDrawExtensionChamferDimensionGroup::isActive()
|
||
{
|
||
bool havePage = DrawGuiUtil::needPage(this);
|
||
bool haveView = DrawGuiUtil::needView(this, true);
|
||
return (havePage && haveView);
|
||
}
|
||
|
||
//===========================================================================
|
||
// TechDraw_ExtensionCreateLengthArc
|
||
//===========================================================================
|
||
|
||
DEF_STD_CMD_A(CmdTechDrawExtensionCreateLengthArc)
|
||
|
||
CmdTechDrawExtensionCreateLengthArc::CmdTechDrawExtensionCreateLengthArc()
|
||
: Command("TechDraw_ExtensionCreateLengthArc")
|
||
{
|
||
sAppModule = "TechDraw";
|
||
sGroup = QT_TR_NOOP("TechDraw");
|
||
sMenuText = QT_TR_NOOP("Arc Length Dimension");
|
||
sToolTipText = QT_TR_NOOP("Inserts an arc length dimension to the selected arc");
|
||
sWhatsThis = "TechDraw_ExtensionCreateLengthArc";
|
||
sStatusTip = sMenuText;
|
||
sPixmap = "TechDraw_ExtensionCreateLengthArc";
|
||
}
|
||
|
||
void CmdTechDrawExtensionCreateLengthArc::activated(int iMsg) {
|
||
// create arc length dimension
|
||
Q_UNUSED(iMsg);
|
||
std::vector<Gui::SelectionObject> selection;
|
||
TechDraw::DrawViewPart* objFeat;
|
||
if (!_checkSelObjAndSubs(this, selection, objFeat, QT_TRANSLATE_NOOP("QObject","TechDraw Create Arc Length Dimension"))) {
|
||
return;
|
||
}
|
||
|
||
Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Create Arc Length Dimension"));
|
||
ReferenceEntry ref(objFeat, selection[0].getSubNames()[0]);
|
||
|
||
TechDraw::DrawViewDimension* dim = makeArcLengthDimension(ref);
|
||
|
||
if (dim) {
|
||
objFeat->refreshCEGeoms();
|
||
objFeat->requestPaint();
|
||
Gui::Command::commitCommand();
|
||
}
|
||
else {
|
||
Gui::Command::abortCommand();
|
||
}
|
||
}
|
||
|
||
bool CmdTechDrawExtensionCreateLengthArc::isActive()
|
||
{
|
||
bool havePage = DrawGuiUtil::needPage(this);
|
||
bool haveView = DrawGuiUtil::needView(this);
|
||
return (havePage && haveView);
|
||
}
|
||
|
||
//===========================================================================
|
||
// TechDraw_ExtensionCustomizeFormat
|
||
//===========================================================================
|
||
|
||
DEF_STD_CMD_A(CmdTechDrawExtensionCustomizeFormat)
|
||
|
||
CmdTechDrawExtensionCustomizeFormat::CmdTechDrawExtensionCustomizeFormat()
|
||
: Command("TechDraw_ExtensionCustomizeFormat")
|
||
{
|
||
sAppModule = "TechDraw";
|
||
sGroup = QT_TR_NOOP("TechDraw");
|
||
sMenuText = QT_TR_NOOP("Customize Format Label");
|
||
sToolTipText = QT_TR_NOOP("Customizes the format label of a selected dimension or balloon");
|
||
sWhatsThis = "TechDraw_ExtensionCustomizeFormat";
|
||
sStatusTip = sToolTipText;
|
||
sPixmap = "TechDraw_ExtensionCustomizeFormat";
|
||
}
|
||
|
||
void CmdTechDrawExtensionCustomizeFormat::activated(int iMsg)
|
||
{
|
||
Q_UNUSED(iMsg);
|
||
std::vector<Gui::SelectionObject> selected;
|
||
if (!_checkSelection(this, selected, QT_TRANSLATE_NOOP("QObject","TechDraw Customize Format")))
|
||
return;
|
||
auto object = selected[0].getObject();
|
||
if (object->isDerivedFrom<TechDraw::DrawViewDimension>() ||
|
||
object->isDerivedFrom<TechDraw::DrawViewBalloon>())
|
||
Gui::Control().showDialog(new TaskDlgCustomizeFormat(object));
|
||
}
|
||
|
||
bool CmdTechDrawExtensionCustomizeFormat::isActive()
|
||
{
|
||
bool havePage = DrawGuiUtil::needPage(this);
|
||
bool haveView = DrawGuiUtil::needView(this);
|
||
return (havePage && haveView);
|
||
}
|
||
|
||
DrawViewDimension* TechDrawGui::makeArcLengthDimension(const ReferenceEntry& ref)
|
||
{
|
||
DrawViewDimension* dim = nullptr;
|
||
auto* dvp = static_cast<DrawViewPart*>(ref.getObject());
|
||
|
||
int geoId = DrawUtil::getIndexFromName(ref.getSubName());
|
||
BaseGeomPtr geom = dvp->getGeomByIndex(geoId);
|
||
|
||
// Find the edge length.
|
||
TechDraw::BaseGeomPtr edge = dvp->getEdge(ref.getSubName());
|
||
if (!edge) {
|
||
return nullptr;
|
||
}
|
||
GProp_GProps edgeProps;
|
||
BRepGProp::LinearProperties(edge->getOCCEdge(), edgeProps);
|
||
double length = edgeProps.Mass() / dvp->getScale();
|
||
|
||
Base::Vector3d startPt = edge->getStartPoint();
|
||
Base::Vector3d endPt = edge->getEndPoint();
|
||
startPt.y = -startPt.y;
|
||
endPt.y = -endPt.y;
|
||
|
||
std::stringstream startName, endName, formatSpec;
|
||
Base::Vector3d cvPoint = CosmeticVertex::makeCanonicalPoint(dvp, startPt);
|
||
std::string startVertTag = dvp->addCosmeticVertex(cvPoint);
|
||
int startVertNumber = dvp->add1CVToGV(startVertTag);
|
||
startName << "Vertex" << startVertNumber;
|
||
cvPoint = CosmeticVertex::makeCanonicalPoint(dvp, endPt);
|
||
std::string endVertTag = dvp->addCosmeticVertex(cvPoint);
|
||
int endVertNumber = dvp->add1CVToGV(endVertTag);
|
||
endName << "Vertex" << endVertNumber;
|
||
|
||
dim = _createLinDimension(dvp, startName.str(), endName.str(), "Distance");
|
||
TechDraw::pointPair pp = dim->getLinearPoints();
|
||
Base::Vector3d mid = (pp.first() + pp.second()) / 2.0;
|
||
dim->X.setValue(mid.x);
|
||
dim->Y.setValue(-mid.y);
|
||
|
||
dim->Arbitrary.setValue(true);
|
||
formatSpec << "◠ " << length;
|
||
dim->FormatSpec.setValue(formatSpec.str());
|
||
|
||
return dim;
|
||
}
|
||
|
||
namespace TechDrawGui {
|
||
//===========================================================================
|
||
// internal helper routines
|
||
//===========================================================================
|
||
|
||
bool _checkSelection(Gui::Command* cmd,
|
||
std::vector<Gui::SelectionObject>& selection,
|
||
std::string message) {
|
||
// check selection of getSelectionEx()
|
||
selection = cmd->getSelection().getSelectionEx();
|
||
if (selection.empty()) {
|
||
QMessageBox::warning(Gui::getMainWindow(),
|
||
QObject::tr(message.c_str()),
|
||
QObject::tr("Selection is empty"));
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
bool _checkSelAndObj(Gui::Command* cmd,
|
||
std::vector<Gui::SelectionObject>& selection,
|
||
TechDraw::DrawViewPart*& objFeat,
|
||
std::string message) {
|
||
// check selection of getSelectionEx() and selection[0].getObject()
|
||
if (_checkSelection(cmd, selection, message)) {
|
||
objFeat = dynamic_cast<TechDraw::DrawViewPart*>(selection[0].getObject());
|
||
if (!objFeat) {
|
||
QMessageBox::warning(Gui::getMainWindow(),
|
||
QObject::tr(message.c_str()),
|
||
QObject::tr("No object selected"));
|
||
return false;
|
||
}
|
||
} else {
|
||
// nothing selected
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
bool _checkSelObjAndSubs(Gui::Command* cmd,
|
||
std::vector<Gui::SelectionObject>& selection,
|
||
TechDraw::DrawViewPart*& objFeat,
|
||
std::string message) {
|
||
// check selection of getSelectionEx() and selection[0].getObject()
|
||
if (_checkSelAndObj(cmd, selection, objFeat, message)) {
|
||
auto subs = selection[0].getSubNames();
|
||
if (subs.empty()) {
|
||
QMessageBox::warning(Gui::getMainWindow(),
|
||
QObject::tr(message.c_str()),
|
||
QObject::tr("No sub-elements selected"));
|
||
return false;
|
||
}
|
||
} else {
|
||
// nothing selected
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
TechDraw::DrawViewDimension* _createLinDimension(
|
||
TechDraw::DrawViewPart* objFeat,
|
||
std::string startVertex,
|
||
std::string endVertex,
|
||
std::string dimType)
|
||
// create a new linear dimension
|
||
{
|
||
TechDraw::DrawPage* page = objFeat->findParentPage();
|
||
std::string PageName = page->getNameInDocument();
|
||
std::string FeatName = objFeat->getDocument()->getUniqueObjectName("Dimension");
|
||
std::vector<App::DocumentObject*> objs;
|
||
std::vector<std::string> subs;
|
||
objs.push_back(objFeat);
|
||
objs.push_back(objFeat);
|
||
subs.push_back(startVertex);
|
||
subs.push_back(endVertex);
|
||
Gui::Command::doCommand(Gui::Command::Doc, "App.activeDocument().addObject('TechDraw::DrawViewDimension', '%s')", FeatName.c_str());
|
||
Gui::Command::doCommand(Gui::Command::Doc, "App.activeDocument().%s.Type = '%s'", FeatName.c_str(), dimType.c_str());
|
||
auto dim = dynamic_cast<TechDraw::DrawViewDimension*>(objFeat->getDocument()->getObject(FeatName.c_str()));
|
||
if (!dim){
|
||
throw Base::TypeError("CmdTechDrawExtensionCreateLinDimension - dim not found\n");
|
||
}
|
||
dim->References2D.setValues(objs, subs);
|
||
Gui::Command::doCommand(Gui::Command::Doc, "App.activeDocument().%s.addView(App.activeDocument().%s)", PageName.c_str(), FeatName.c_str());
|
||
|
||
// Touch the parent feature so the dimension in tree view appears as a child
|
||
objFeat->touch();
|
||
dim->recomputeFeature();
|
||
return dim;
|
||
}
|
||
|
||
std::vector<dimVertex> _getVertexInfo(TechDraw::DrawViewPart* objFeat,
|
||
std::vector<std::string> subNames) {
|
||
// get subNames and coordinates of all selected vertexes
|
||
std::vector<dimVertex> vertexes;
|
||
dimVertex nextVertex;
|
||
for (const std::string& name : subNames) {
|
||
std::string geoType = TechDraw::DrawUtil::getGeomTypeFromName(name);
|
||
if (geoType == "Vertex") {
|
||
int geoId = TechDraw::DrawUtil::getIndexFromName(name);
|
||
TechDraw::VertexPtr vert = objFeat->getProjVertexByIndex(geoId);
|
||
nextVertex.name = name;
|
||
nextVertex.point.x = vert->point().x;
|
||
nextVertex.point.y = vert->point().y;
|
||
nextVertex.point.z = 0.0;
|
||
vertexes.push_back(nextVertex);
|
||
}
|
||
}
|
||
return vertexes;
|
||
}
|
||
|
||
std::vector<TechDraw::DrawViewDimension*>_getDimensions(std::vector<Gui::SelectionObject> selection, std::string needDimType) {
|
||
// get all selected dimensions of type needDimType
|
||
std::vector<TechDraw::DrawViewDimension*> validDimension;
|
||
for (auto selected : selection) {
|
||
auto object = selected.getObject();
|
||
if (object->isDerivedFrom<TechDraw::DrawViewDimension>()) {
|
||
auto dim = static_cast<TechDraw::DrawViewDimension*>(selected.getObject());
|
||
std::string dimType = dim->Type.getValueAsString();
|
||
if (dimType == needDimType)
|
||
validDimension.push_back(dim);
|
||
}
|
||
}
|
||
return validDimension;
|
||
}
|
||
}
|
||
|
||
//------------------------------------------------------------------------------
|
||
void CreateTechDrawCommandsExtensionDims()
|
||
{
|
||
Gui::CommandManager& rcCmdMgr = Gui::Application::Instance->commandManager();
|
||
|
||
rcCmdMgr.addCommand(new CmdTechDrawExtensionInsertPrefixGroup());
|
||
rcCmdMgr.addCommand(new CmdTechDrawExtensionInsertDiameter());
|
||
rcCmdMgr.addCommand(new CmdTechDrawExtensionInsertSquare());
|
||
rcCmdMgr.addCommand(new CmdTechDrawExtensionInsertRepetition());
|
||
rcCmdMgr.addCommand(new CmdTechDrawExtensionRemovePrefixChar());
|
||
rcCmdMgr.addCommand(new CmdTechDrawExtensionIncreaseDecreaseGroup());
|
||
rcCmdMgr.addCommand(new CmdTechDrawExtensionIncreaseDecimal());
|
||
rcCmdMgr.addCommand(new CmdTechDrawExtensionDecreaseDecimal());
|
||
rcCmdMgr.addCommand(new CmdTechDrawExtensionPosChainDimensionGroup());
|
||
rcCmdMgr.addCommand(new CmdTechDrawExtensionPosHorizChainDimension());
|
||
rcCmdMgr.addCommand(new CmdTechDrawExtensionPosVertChainDimension());
|
||
rcCmdMgr.addCommand(new CmdTechDrawExtensionPosObliqueChainDimension());
|
||
rcCmdMgr.addCommand(new CmdTechDrawExtensionCascadeDimensionGroup());
|
||
rcCmdMgr.addCommand(new CmdTechDrawExtensionCascadeHorizDimension());
|
||
rcCmdMgr.addCommand(new CmdTechDrawExtensionCascadeVertDimension());
|
||
rcCmdMgr.addCommand(new CmdTechDrawExtensionCascadeObliqueDimension());
|
||
rcCmdMgr.addCommand(new CmdTechDrawExtensionCreateChainDimensionGroup());
|
||
rcCmdMgr.addCommand(new CmdTechDrawExtensionCreateHorizChainDimension());
|
||
rcCmdMgr.addCommand(new CmdTechDrawExtensionCreateVertChainDimension());
|
||
rcCmdMgr.addCommand(new CmdTechDrawExtensionCreateObliqueChainDimension());
|
||
rcCmdMgr.addCommand(new CmdTechDrawExtensionCreateCoordDimensionGroup());
|
||
rcCmdMgr.addCommand(new CmdTechDrawExtensionCreateHorizCoordDimension());
|
||
rcCmdMgr.addCommand(new CmdTechDrawExtensionCreateVertCoordDimension());
|
||
rcCmdMgr.addCommand(new CmdTechDrawExtensionCreateObliqueCoordDimension());
|
||
rcCmdMgr.addCommand(new CmdTechDrawExtensionChamferDimensionGroup());
|
||
rcCmdMgr.addCommand(new CmdTechDrawExtensionCreateHorizChamferDimension());
|
||
rcCmdMgr.addCommand(new CmdTechDrawExtensionCreateVertChamferDimension());
|
||
rcCmdMgr.addCommand(new CmdTechDrawExtensionCreateLengthArc());
|
||
rcCmdMgr.addCommand(new CmdTechDrawExtensionCustomizeFormat());
|
||
}
|