FreeCAD

Форк
0
/
CommandExtensionDims.cpp 
2491 строка · 102.7 Кб
1
/***************************************************************************
2
 *   Copyright (c) 2021 edi                                                *
3
 *                                                                         *
4
 *   This file is part of the FreeCAD CAx development system.              *
5
 *                                                                         *
6
 *   This library is free software; you can redistribute it and/or         *
7
 *   modify it under the terms of the GNU Library General Public           *
8
 *   License as published by the Free Software Foundation; either          *
9
 *   version 2 of the License, or (at your option) any later version.      *
10
 *                                                                         *
11
 *   This library  is distributed in the hope that it will be useful,      *
12
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
13
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
14
 *   GNU Library General Public License for more details.                  *
15
 *                                                                         *
16
 *   You should have received a copy of the GNU Library General Public     *
17
 *   License along with this library; see the file COPYING.LIB. If not,    *
18
 *   write to the Free Software Foundation, Inc., 59 Temple Place,         *
19
 *   Suite 330, Boston, MA  02111-1307, USA                                *
20
 *                                                                         *
21
 ***************************************************************************/
22

23
#include "PreCompiled.h"
24
#ifndef _PreComp_
25
# include <QApplication>
26
# include <QMessageBox>
27
# include <sstream>
28
#endif
29

30
# include <App/Document.h>
31
# include <App/DocumentObject.h>
32
# include <Base/Console.h>
33
# include <Base/Type.h>
34
# include <Gui/Action.h>
35
# include <Gui/Application.h>
36
# include <Gui/BitmapFactory.h>
37
# include <Gui/Command.h>
38
# include <Gui/Control.h>
39
# include <Gui/MainWindow.h>
40
# include <Gui/Selection.h>
41
# include <Gui/SelectionObject.h>
42

43
# include <Mod/TechDraw/App/Cosmetic.h>
44
# include <Mod/TechDraw/App/DrawViewBalloon.h>
45
# include <Mod/TechDraw/App/DrawViewDimension.h>
46
# include <Mod/TechDraw/App/DrawPage.h>
47
# include <Mod/TechDraw/App/DrawUtil.h>
48
# include <Mod/TechDraw/App/DrawViewPart.h>
49
# include <Mod/TechDraw/App/Preferences.h>
50

51
#include "DlgTemplateField.h"
52
#include "DrawGuiUtil.h"
53
#include "TaskCustomizeFormat.h"
54
#include "TaskSelectLineAttributes.h"
55

56

57
using namespace TechDrawGui;
58
using namespace TechDraw;
59

60
namespace TechDrawGui {
61
    //internal structures and sort functions
62
    struct dimVertex {
63
        // save a dimension defining vertex and its point
64
        std::string name;
65
        Base::Vector3d point;
66
    };
67

68
    struct {
69
        bool operator()(dimVertex a, dimVertex b) const { return a.point.x < b.point.x; }
70
    } sortX;
71

72
    struct {
73
        bool operator()(dimVertex a, dimVertex b) const { return a.point.y < b.point.y; }
74
    } sortY;
75

76
    //internal helper functions
77
    void _selectDimensionAttributes(Gui::Command* cmd);
78
    std::vector<TechDraw::DrawViewDimension*>_getDimensions(std::vector<Gui::SelectionObject> selection, std::string needDimType);
79
    std::vector<dimVertex> _getVertexInfo(TechDraw::DrawViewPart* objFeat,
80
        std::vector<std::string> subNames);
81
    TechDraw::DrawViewDimension* _createLinDimension(Gui::Command* cmd,
82
        TechDraw::DrawViewPart* objFeat,
83
        std::string startVertex,
84
        std::string endVertex,
85
        std::string dimType);
86
    bool _checkSelection(Gui::Command* cmd,
87
        std::vector<Gui::SelectionObject>& selection,
88
        std::string message);
89
    bool _checkSelAndObj(Gui::Command* cmd,
90
        std::vector<Gui::SelectionObject>& selection,
91
        TechDraw::DrawViewPart*& objFeat,
92
        std::string message);
93
    bool _checkSelObjAndSubs(Gui::Command* cmd,
94
        std::vector<Gui::SelectionObject>& selection,
95
        TechDraw::DrawViewPart*& objFeat,
96
        std::string message);
97
}
98

99
//===========================================================================
100
// TechDraw_ExtensionInsertDiameter
101
//===========================================================================
102

103
void execInsertPrefixChar(Gui::Command* cmd, std::string prefixFormat, const QAction *action = nullptr) {
104
    // insert a prefix character into the format specifier
105
    std::vector<Gui::SelectionObject> selection;
106
    if (!_checkSelection(cmd, selection, QT_TRANSLATE_NOOP("Command","TechDraw Insert Prefix"))) {
107
        return;
108
    }
109

110
    std::string prefixText(prefixFormat);
111
    if (prefixFormat.find("%s") != std::string::npos) {
112
        DlgTemplateField ui;
113
        const int MAX_PREFIX_LENGTH = 31;
114

115
        if (action) {
116
            if (action->objectName() == QString::fromUtf8("TechDraw_ExtensionInsertRepetition")) {
117
                ui.setFieldName(QT_TR_NOOP("Repeat Count"));
118
            }
119
        }
120

121
        ui.setFieldLength(MAX_PREFIX_LENGTH);
122
        ui.setFieldContent("");
123
        if (ui.exec() != QDialog::Accepted) {
124
            return;
125
        }
126

127
        char prefixData[(MAX_PREFIX_LENGTH + 1)*4];
128
        snprintf(prefixData, sizeof(prefixData), prefixFormat.c_str(), ui.getFieldContent().toUtf8().constData());
129
        prefixText = prefixData;
130
    }
131

132
    Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Insert Prefix"));
133
    for (auto selected : selection) {
134
        auto object = selected.getObject();
135
        if (object->isDerivedFrom(TechDraw::DrawViewDimension::getClassTypeId())) {
136
            auto dim = static_cast<TechDraw::DrawViewDimension*>(selected.getObject());
137
            std::string formatSpec = dim->FormatSpec.getStrValue();
138
            formatSpec = prefixText + formatSpec;
139
            dim->FormatSpec.setValue(formatSpec);
140
        }
141
    }
142
    Gui::Command::commitCommand();
143
}
144

145
DEF_STD_CMD_A(CmdTechDrawExtensionInsertDiameter)
146

147
CmdTechDrawExtensionInsertDiameter::CmdTechDrawExtensionInsertDiameter()
148
    : Command("TechDraw_ExtensionInsertDiameter")
149
{
150
    sAppModule      = "TechDraw";
151
    sGroup          = QT_TR_NOOP("TechDraw");
152
    sMenuText       = QT_TR_NOOP("Insert '⌀' Prefix");
153
    sToolTipText    = QT_TR_NOOP("Insert a '⌀' symbol at the beginning of the dimension text:<br>\
154
- Select one or more dimensions<br>\
155
- Click this tool");
156
    sWhatsThis      = "TechDraw_ExtensionInsertDiameter";
157
    sStatusTip      = sMenuText;
158
    sPixmap         = "TechDraw_ExtensionInsertDiameter";
159
}
160

161
void CmdTechDrawExtensionInsertDiameter::activated(int iMsg)
162
{
163
    Q_UNUSED(iMsg);
164
    execInsertPrefixChar(this, "⌀");
165
}
166

167
bool CmdTechDrawExtensionInsertDiameter::isActive()
168
{
169
    bool havePage = DrawGuiUtil::needPage(this);
170
    bool haveView = DrawGuiUtil::needView(this);
171
    return (havePage && haveView);
172
}
173

174
//===========================================================================
175
// TechDraw_ExtensionInsertSquare
176
//===========================================================================
177

178
DEF_STD_CMD_A(CmdTechDrawExtensionInsertSquare)
179

180
CmdTechDrawExtensionInsertSquare::CmdTechDrawExtensionInsertSquare()
181
    : Command("TechDraw_ExtensionInsertSquare")
182
{
183
    sAppModule      = "TechDraw";
184
    sGroup          = QT_TR_NOOP("TechDraw");
185
    sMenuText       = QT_TR_NOOP("Insert '□' Prefix");
186
    sToolTipText    = QT_TR_NOOP("Insert a '□' symbol at the beginning of the dimension text:<br>\
187
- Select one or more dimensions<br>\
188
- Click this tool");
189
    sWhatsThis      = "TechDraw_ExtensionInsertSquare";
190
    sStatusTip      = sMenuText;
191
    sPixmap         = "TechDraw_ExtensionInsertSquare";
192
}
193

194
void CmdTechDrawExtensionInsertSquare::activated(int iMsg)
195
{
196
    Q_UNUSED(iMsg);
197
    execInsertPrefixChar(this, "□");    //□ white square U+25A1
198
}
199

200
bool CmdTechDrawExtensionInsertSquare::isActive()
201
{
202
    bool havePage = DrawGuiUtil::needPage(this);
203
    bool haveView = DrawGuiUtil::needView(this);
204
    return (havePage && haveView);
205
}
206

207
//===========================================================================
208
// TechDraw_ExtensionInsertRepetition
209
//===========================================================================
210

211
DEF_STD_CMD_A(CmdTechDrawExtensionInsertRepetition)
212

213
CmdTechDrawExtensionInsertRepetition::CmdTechDrawExtensionInsertRepetition()
214
    : Command("TechDraw_ExtensionInsertRepetition")
215
{
216
    sAppModule      = "TechDraw";
217
    sGroup          = QT_TR_NOOP("TechDraw");
218
    sMenuText       = QT_TR_NOOP("Insert 'n×' Prefix");
219
    sToolTipText    = QT_TR_NOOP("Insert repeated feature count at the beginning of the dimension text:<br>\
220
- Select one or more dimensions<br>\
221
- Click this tool");
222
    sWhatsThis      = "TechDraw_ExtensionInsertRepetition";
223
    sStatusTip      = sMenuText;
224
    sPixmap         = "TechDraw_ExtensionInsertRepetition";
225
}
226

227
void CmdTechDrawExtensionInsertRepetition::activated(int iMsg)
228
{
229
    Q_UNUSED(iMsg);
230

231
    execInsertPrefixChar(this, "%s× ", this->getAction()->action()); //× Multiplication sign U+00D7
232
}
233

234
bool CmdTechDrawExtensionInsertRepetition::isActive()
235
{
236
    bool havePage = DrawGuiUtil::needPage(this);
237
    bool haveView = DrawGuiUtil::needView(this);
238
    return (havePage && haveView);
239
}
240

241
//===========================================================================
242
// TechDraw_ExtensionRemovePrefixChar
243
//===========================================================================
244

245
void execRemovePrefixChar(Gui::Command* cmd) {
246
    // remove a prefix character from the format specifier
247
    std::vector<Gui::SelectionObject> selection;
248
    if (!_checkSelection(cmd, selection, QT_TRANSLATE_NOOP("Command","TechDraw Remove Prefix"))) {
249
        return;
250
    }
251

252
    Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Remove Prefix"));
253
    for (auto selected : selection)
254
    {
255
        auto object = selected.getObject();
256
        if (object->isDerivedFrom(TechDraw::DrawViewDimension::getClassTypeId())) {
257
            auto dim = static_cast<TechDraw::DrawViewDimension*>(selected.getObject());
258
            std::string formatSpec = dim->FormatSpec.getStrValue();
259
            int pos = formatSpec.find("%.");
260
            if (pos != 0)
261
            {
262
                formatSpec = formatSpec.substr(pos);
263
                dim->FormatSpec.setValue(formatSpec);
264
            }
265
        }
266
    }
267
    Gui::Command::commitCommand();
268
}
269

270
DEF_STD_CMD_A(CmdTechDrawExtensionRemovePrefixChar)
271

272
CmdTechDrawExtensionRemovePrefixChar::CmdTechDrawExtensionRemovePrefixChar()
273
    : Command("TechDraw_ExtensionRemovePrefixChar")
274
{
275
    sAppModule      = "TechDraw";
276
    sGroup          = QT_TR_NOOP("TechDraw");
277
    sMenuText       = QT_TR_NOOP("Remove Prefix");
278
    sToolTipText    = QT_TR_NOOP("Remove prefix symbols at the beginning of the dimension text:<br>\
279
- Select one or more dimensions<br>\
280
- Click this tool");
281
    sWhatsThis      = "TechDraw_ExtensionRemovePrefixChar";
282
    sStatusTip      = sMenuText;
283
    sPixmap         = "TechDraw_ExtensionRemovePrefixChar";
284
}
285

286
void CmdTechDrawExtensionRemovePrefixChar::activated(int iMsg)
287
{
288
    Q_UNUSED(iMsg);
289
    execRemovePrefixChar(this);
290
}
291

292
bool CmdTechDrawExtensionRemovePrefixChar::isActive()
293
{
294
    bool havePage = DrawGuiUtil::needPage(this);
295
    bool haveView = DrawGuiUtil::needView(this);
296
    return (havePage && haveView);
297
}
298

299
//===========================================================================
300
// TechDraw_ExtensionInsertPrefixGroup
301
//===========================================================================
302

303
DEF_STD_CMD_ACL(CmdTechDrawExtensionInsertPrefixGroup)
304

305
CmdTechDrawExtensionInsertPrefixGroup::CmdTechDrawExtensionInsertPrefixGroup()
306
    : Command("TechDraw_ExtensionInsertPrefixGroup")
307
{
308
    sAppModule      = "TechDraw";
309
    sGroup          = QT_TR_NOOP("TechDraw");
310
    sMenuText       = QT_TR_NOOP("Insert '⌀' Prefix");
311
    sToolTipText    = QT_TR_NOOP("Insert a '⌀' symbol at the beginning of the dimension text:<br>\
312
- Select one or more dimensions<br>\
313
- Click this tool");
314
    sWhatsThis      = "TechDraw_ExtensionInsertPrefixGroup";
315
    sStatusTip      = sMenuText;
316
}
317

318
void CmdTechDrawExtensionInsertPrefixGroup::activated(int iMsg)
319
{
320
    //    Base::Console().Message("CMD::ExtensionLinePPGroup - activated(%d)\n", iMsg);
321
    Gui::TaskView::TaskDialog* dlg = Gui::Control().activeDialog();
322
    if (dlg) {
323
        QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Task In Progress"),
324
            QObject::tr("Close active task dialog and try again."));
325
        return;
326
    }
327

328
    Gui::ActionGroup* pcAction = qobject_cast<Gui::ActionGroup*>(_pcAction);
329
    pcAction->setIcon(pcAction->actions().at(iMsg)->icon());
330
    switch (iMsg) {
331
    case 0:                 //insert "⌀" as prefix
332
        execInsertPrefixChar(this, "⌀");
333
        break;
334
    case 1:                 //insert "□" as prefix
335
        execInsertPrefixChar(this, "□");
336
        break;
337
    case 2:                 //insert "n×" as prefix
338
        execInsertPrefixChar(this, "%s× ", pcAction->actions().at(iMsg));
339
        break;
340
    case 3:                 //remove prefix characters
341
        execRemovePrefixChar(this);
342
        break;
343
    default:
344
        Base::Console().Message("CMD::CVGrp - invalid iMsg: %d\n", iMsg);
345
    };
346
}
347

348
Gui::Action* CmdTechDrawExtensionInsertPrefixGroup::createAction()
349
{
350
    Gui::ActionGroup* pcAction = new Gui::ActionGroup(this, Gui::getMainWindow());
351
    pcAction->setDropDownMenu(true);
352
    applyCommandData(this->className(), pcAction);
353

354
    QAction* p1 = pcAction->addAction(QString());
355
    p1->setIcon(Gui::BitmapFactory().iconFromTheme("TechDraw_ExtensionInsertDiameter"));
356
    p1->setObjectName(QString::fromLatin1("TechDraw_ExtensionInsertDiameter"));
357
    p1->setWhatsThis(QString::fromLatin1("TechDraw_ExtensionInsertDiameter"));
358
    QAction* p2 = pcAction->addAction(QString());
359
    p2->setIcon(Gui::BitmapFactory().iconFromTheme("TechDraw_ExtensionInsertSquare"));
360
    p2->setObjectName(QString::fromLatin1("TechDraw_ExtensionInsertSquare"));
361
    p2->setWhatsThis(QString::fromLatin1("TechDraw_ExtensionInsertSquare"));
362
    QAction* p3 = pcAction->addAction(QString());
363
    p3->setIcon(Gui::BitmapFactory().iconFromTheme("TechDraw_ExtensionInsertRepetition"));
364
    p3->setObjectName(QString::fromLatin1("TechDraw_ExtensionInsertRepetition"));
365
    p3->setWhatsThis(QString::fromLatin1("TechDraw_ExtensionInsertRepetition"));
366
    QAction* p4 = pcAction->addAction(QString());
367
    p4->setIcon(Gui::BitmapFactory().iconFromTheme("TechDraw_ExtensionRemovePrefixChar"));
368
    p4->setObjectName(QString::fromLatin1("TechDraw_ExtensionRemovePrefixChar"));
369
    p4->setWhatsThis(QString::fromLatin1("TechDraw_ExtensionRemovePrefixChar"));
370

371
    _pcAction = pcAction;
372
    languageChange();
373

374
    pcAction->setIcon(p1->icon());
375
    int defaultId = 0;
376
    pcAction->setProperty("defaultAction", QVariant(defaultId));
377

378
    return pcAction;
379
}
380

381
void CmdTechDrawExtensionInsertPrefixGroup::languageChange()
382
{
383
    Command::languageChange();
384

385
    if (!_pcAction)
386
        return;
387
    Gui::ActionGroup* pcAction = qobject_cast<Gui::ActionGroup*>(_pcAction);
388
    QList<QAction*> a = pcAction->actions();
389

390
    QAction* arc1 = a[0];
391
    arc1->setText(QApplication::translate("CmdTechDrawExtensionInsertDiameter", "Insert '⌀' Prefix"));
392
    arc1->setToolTip(QApplication::translate("CmdTechDrawExtensionInsertDiameter",
393
"Insert a '⌀' symbol at the beginning of the dimension text:<br>\
394
- Select one or more dimensions<br>\
395
- Click this tool"));
396
    arc1->setStatusTip(arc1->text());
397
    QAction* arc2 = a[1];
398
    arc2->setText(QApplication::translate("CmdTechDrawExtensionInsertSquare", "Insert '□' Prefix"));
399
    arc2->setToolTip(QApplication::translate("CmdTechDrawExtensionInsertSquare",
400
"Insert a '□' symbol at the beginning of the dimension text:<br>\
401
- Select one or more dimensions<br>\
402
- Click this tool"));
403
    arc2->setStatusTip(arc2->text());
404
    QAction* arc3 = a[2];
405
    arc3->setText(QApplication::translate("CmdTechDrawExtensionInsertRepetition", "Insert 'n×' Prefix"));
406
    arc3->setToolTip(QApplication::translate("CmdTechDrawExtensionInsertRepetition",
407
"Insert repeated feature count at the beginning of the dimension text:<br>\
408
- Select one or more dimensions<br>\
409
- Click this tool"));
410
    arc3->setStatusTip(arc3->text());
411
    QAction* arc4 = a[3];
412
    arc4->setText(QApplication::translate("TechDraw_ExtensionremovePrefixChar", "Remove Prefix"));
413
    arc4->setToolTip(QApplication::translate("TechDraw_ExtensionremovePrefixChar",
414
"Remove prefix symbols at the beginning of the dimension text:<br>\
415
- Select one or more dimensions<br>\
416
- Click this tool"));
417
    arc4->setStatusTip(arc4->text());
418
}
419

420
bool CmdTechDrawExtensionInsertPrefixGroup::isActive()
421
{
422
    bool havePage = DrawGuiUtil::needPage(this);
423
    bool haveView = DrawGuiUtil::needView(this, true);
424
    return (havePage && haveView);
425
}
426

427
//===========================================================================
428
// TechDraw_ExtensionIncreaseDecimal
429
//===========================================================================
430

431
void execIncreaseDecreaseDecimal(Gui::Command* cmd, int delta) {
432
    // increase or decrease number of decimal places of a measure
433
    std::vector<Gui::SelectionObject> selection;
434
    if (!_checkSelection(cmd, selection, QT_TRANSLATE_NOOP("QObject","TechDraw Increase/Decrease Decimal"))) {
435
        return;
436
    }
437

438
    Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Increase/Decrease Decimal"));
439
    std::string numStr;
440
    for (auto selected : selection) {
441
        auto object = selected.getObject();
442
        if (object->isDerivedFrom(TechDraw::DrawViewDimension::getClassTypeId())) {
443
            auto dim = static_cast<TechDraw::DrawViewDimension*>(selected.getObject());
444
            std::string formatSpec = dim->FormatSpec.getStrValue();
445
            std::string searchStr("%.");
446
            int numFound = formatSpec.find(searchStr) + 2;
447
            numStr = formatSpec[numFound];
448
            int numInt = std::stoi(numStr, nullptr);
449
            numInt = numInt + delta;
450
            if (numInt >= 0 && numInt <= 9) {
451
                numStr = std::to_string(numInt);
452
                formatSpec.replace(numFound, 1, numStr);
453
                dim->FormatSpec.setValue(formatSpec);
454
            }
455
        }
456
    }
457
    Gui::Command::commitCommand();
458
}
459

460
DEF_STD_CMD_A(CmdTechDrawExtensionIncreaseDecimal)
461

462
CmdTechDrawExtensionIncreaseDecimal::CmdTechDrawExtensionIncreaseDecimal()
463
    : Command("TechDraw_ExtensionIncreaseDecimal")
464
{
465
    sAppModule      = "TechDraw";
466
    sGroup          = QT_TR_NOOP("TechDraw");
467
    sMenuText       = QT_TR_NOOP("Increase Decimal Places");
468
    sToolTipText    = QT_TR_NOOP("Increase the number of decimal places of the dimension text:<br>\
469
- Select one or more dimensions<br>\
470
- Click this tool");
471
    sWhatsThis      = "TechDraw_ExtensionIncreaseDecimal";
472
    sStatusTip      = sMenuText;
473
    sPixmap         = "TechDraw_ExtensionIncreaseDecimal";
474
}
475

476
void CmdTechDrawExtensionIncreaseDecimal::activated(int iMsg)
477
{
478
    Q_UNUSED(iMsg);
479
    execIncreaseDecreaseDecimal(this, 1);
480
}
481

482
bool CmdTechDrawExtensionIncreaseDecimal::isActive()
483
{
484
    bool havePage = DrawGuiUtil::needPage(this);
485
    bool haveView = DrawGuiUtil::needView(this);
486
    return (havePage && haveView);
487
}
488

489
//===========================================================================
490
// TechDraw_ExtensionDecreaseDecimal
491
//===========================================================================
492

493
DEF_STD_CMD_A(CmdTechDrawExtensionDecreaseDecimal)
494

495
CmdTechDrawExtensionDecreaseDecimal::CmdTechDrawExtensionDecreaseDecimal()
496
    : Command("TechDraw_ExtensionDecreaseDecimal")
497
{
498
    sAppModule      = "TechDraw";
499
    sGroup          = QT_TR_NOOP("TechDraw");
500
    sMenuText       = QT_TR_NOOP("Decrease Decimal Places");
501
    sToolTipText    = QT_TR_NOOP("Decrease the number of decimal places of the dimension text:<br>\
502
- Select one or more dimensions<br>\
503
- Click this tool");
504
    sWhatsThis      = "TechDraw_ExtensionDecreaseDecimal";
505
    sStatusTip      = sMenuText;
506
    sPixmap         = "TechDraw_ExtensionDecreaseDecimal";
507
}
508

509
void CmdTechDrawExtensionDecreaseDecimal::activated(int iMsg)
510
{
511
    Q_UNUSED(iMsg);
512
    execIncreaseDecreaseDecimal(this, -1);
513
}
514

515
bool CmdTechDrawExtensionDecreaseDecimal::isActive()
516
{
517
    bool havePage = DrawGuiUtil::needPage(this);
518
    bool haveView = DrawGuiUtil::needView(this);
519
    return (havePage && haveView);
520
}
521

522
//===========================================================================
523
// TechDraw_ExtensionIncreaseDecreaseGroup
524
//===========================================================================
525

526
DEF_STD_CMD_ACL(CmdTechDrawExtensionIncreaseDecreaseGroup)
527

528
CmdTechDrawExtensionIncreaseDecreaseGroup::CmdTechDrawExtensionIncreaseDecreaseGroup()
529
    : Command("TechDraw_ExtensionIncreaseDecreaseGroup")
530
{
531
    sAppModule      = "TechDraw";
532
    sGroup          = QT_TR_NOOP("TechDraw");
533
    sMenuText       = QT_TR_NOOP("Increase Decimal Places");
534
    sToolTipText    = QT_TR_NOOP("Increase the number of decimal places of the dimension text:<br>\
535
- Select one or more dimensions<br>\
536
- Click this tool");
537
    sWhatsThis      = "TechDraw_ExtensionIncreaseDecreaseGroup";
538
    sStatusTip      = sMenuText;
539
}
540

541
void CmdTechDrawExtensionIncreaseDecreaseGroup::activated(int iMsg)
542
{
543
    //    Base::Console().Message("CMD::ExtensionIncreaseDecreaseGroup - activated(%d)\n", iMsg);
544
    Gui::TaskView::TaskDialog* dlg = Gui::Control().activeDialog();
545
    if (dlg) {
546
        QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Task In Progress"),
547
            QObject::tr("Close active task dialog and try again."));
548
        return;
549
    }
550

551
    Gui::ActionGroup* pcAction = qobject_cast<Gui::ActionGroup*>(_pcAction);
552
    pcAction->setIcon(pcAction->actions().at(iMsg)->icon());
553
    switch (iMsg) {
554
    case 0:                 //increase decimal places
555
        execIncreaseDecreaseDecimal(this, 1);
556
        break;
557
    case 1:                 //decrease decimal places
558
        execIncreaseDecreaseDecimal(this, -1);
559
        break;
560
    default:
561
        Base::Console().Message("CMD::CVGrp - invalid iMsg: %d\n", iMsg);
562
    };
563
}
564

565
Gui::Action* CmdTechDrawExtensionIncreaseDecreaseGroup::createAction()
566
{
567
    Gui::ActionGroup* pcAction = new Gui::ActionGroup(this, Gui::getMainWindow());
568
    pcAction->setDropDownMenu(true);
569
    applyCommandData(this->className(), pcAction);
570

571
    QAction* p1 = pcAction->addAction(QString());
572
    p1->setIcon(Gui::BitmapFactory().iconFromTheme("TechDraw_ExtensionIncreaseDecimal"));
573
    p1->setObjectName(QString::fromLatin1("TechDraw_ExtensionIncreaseDecimal"));
574
    p1->setWhatsThis(QString::fromLatin1("TechDraw_ExtensionIncreaseDecimal"));
575
    QAction* p2 = pcAction->addAction(QString());
576
    p2->setIcon(Gui::BitmapFactory().iconFromTheme("TechDraw_ExtensionDecreaseDecimal"));
577
    p2->setObjectName(QString::fromLatin1("TechDraw_ExtensionDecreaseDecimal"));
578
    p2->setWhatsThis(QString::fromLatin1("TechDraw_ExtensionDecreaseDecimal"));
579

580
    _pcAction = pcAction;
581
    languageChange();
582

583
    pcAction->setIcon(p1->icon());
584
    int defaultId = 0;
585
    pcAction->setProperty("defaultAction", QVariant(defaultId));
586

587
    return pcAction;
588
}
589

590
void CmdTechDrawExtensionIncreaseDecreaseGroup::languageChange()
591
{
592
    Command::languageChange();
593

594
    if (!_pcAction)
595
        return;
596
    Gui::ActionGroup* pcAction = qobject_cast<Gui::ActionGroup*>(_pcAction);
597
    QList<QAction*> a = pcAction->actions();
598

599
    QAction* arc1 = a[0];
600
    arc1->setText(QApplication::translate("CmdTechDrawExtensionIncreaseDecimal", "Increase Decimal Places"));
601
    arc1->setToolTip(QApplication::translate("CmdTechDrawExtensionIncreaseDecimal",
602
"Increase the number of decimal places of the dimension text:<br>\
603
- Select one or more dimensions<br>\
604
- Click this tool"));
605
    arc1->setStatusTip(arc1->text());
606
    QAction* arc2 = a[1];
607
    arc2->setText(QApplication::translate("CmdTechDrawExtensionDecreaseDecimal", "Decrease Decimal Places"));
608
    arc2->setToolTip(QApplication::translate("CmdTechDrawExtensionDecreaseDecimal",
609
"Decrease the number of decimal places of the dimension text:<br>\
610
- Select one or more dimensions<br>\
611
- Click this tool"));
612
    arc2->setStatusTip(arc2->text());
613
}
614

615
bool CmdTechDrawExtensionIncreaseDecreaseGroup::isActive()
616
{
617
    bool havePage = DrawGuiUtil::needPage(this);
618
    bool haveView = DrawGuiUtil::needView(this, true);
619
    return (havePage && haveView);
620
}
621

622
//===========================================================================
623
// TechDraw_ExtensionPosHorizChainDimension
624
//===========================================================================
625

626
void execPosHorizChainDimension(Gui::Command* cmd) {
627
    // position a horizontal dimension chain
628
    std::vector<Gui::SelectionObject> selection;
629
    if (!_checkSelection(cmd, selection, QT_TRANSLATE_NOOP("QObject","TechDraw PosHorizChainDimension"))) {
630
        return;
631
    }
632

633
    Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Pos Horiz Chain Dim"));
634
    std::vector<TechDraw::DrawViewDimension*> validDimension;
635
    validDimension = _getDimensions(selection, "DistanceX");
636
    if (validDimension.empty()) {
637
        QMessageBox::warning(Gui::getMainWindow(),
638
            QObject::tr("TechDraw PosHorizChainDimension"),
639
            QObject::tr("No horizontal dimensions selected"));
640
        return;
641
    }
642
    float yMaster = validDimension[0]->Y.getValue();
643
    for (auto dim : validDimension) {
644
        dim->Y.setValue(yMaster);
645
        pointPair pp = dim->getLinearPoints();
646
        Base::Vector3d p1 = pp.first();
647
        Base::Vector3d p2 = pp.second();
648
        dim->X.setValue((p1.x + p2.x) / 2.0);
649
    }
650
    Gui::Command::commitCommand();
651
}
652

653
DEF_STD_CMD_A(CmdTechDrawExtensionPosHorizChainDimension)
654

655
CmdTechDrawExtensionPosHorizChainDimension::CmdTechDrawExtensionPosHorizChainDimension()
656
    : Command("TechDraw_ExtensionPosHorizChainDimension")
657
{
658
    sAppModule      = "TechDraw";
659
    sGroup          = QT_TR_NOOP("TechDraw");
660
    sMenuText       = QT_TR_NOOP("Position Horizontal Chain Dimensions");
661
    sToolTipText    = QT_TR_NOOP("Align horizontal dimensions to create a chain dimension:<br>\
662
- Select two or more horizontal dimensions<br>\
663
- The first dimension defines the position<br>\
664
- Click this tool");
665
    sWhatsThis      = "TechDraw_ExtensionPosHorizChainDimension";
666
    sStatusTip      = sMenuText;
667
    sPixmap         = "TechDraw_ExtensionPosHorizChainDimension";
668
}
669

670
void CmdTechDrawExtensionPosHorizChainDimension::activated(int iMsg)
671
{
672
    Q_UNUSED(iMsg);
673
    execPosHorizChainDimension(this);
674
}
675

676
bool CmdTechDrawExtensionPosHorizChainDimension::isActive()
677
{
678
    bool havePage = DrawGuiUtil::needPage(this);
679
    bool haveView = DrawGuiUtil::needView(this);
680
    return (havePage && haveView);
681
}
682

683
//===========================================================================
684
// TechDraw_ExtensionPosVertChainDimension
685
//===========================================================================
686

687
void execPosVertChainDimension(Gui::Command* cmd) {
688
    // position a vertical dimension chain
689
    std::vector<Gui::SelectionObject> selection;
690
    if (!_checkSelection(cmd, selection, QT_TRANSLATE_NOOP("QObject","TechDraw PosVertChainDimension"))) {
691
        return;
692
    }
693

694
    Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Pos Vert Chain Dim"));
695
    std::vector<TechDraw::DrawViewDimension*> validDimension;
696
    validDimension = _getDimensions(selection, "DistanceY");
697
    if (validDimension.empty()) {
698
        QMessageBox::warning(Gui::getMainWindow(),
699
            QObject::tr("TechDraw PosVertChainDimension"),
700
            QObject::tr("No vertical dimensions selected"));
701
        return;
702
    }
703
    float xMaster = validDimension[0]->X.getValue();
704
    double fontSize = Preferences::dimFontSizeMM();
705
    for (auto dim : validDimension) {
706
        dim->X.setValue(xMaster);
707
        pointPair pp = dim->getLinearPoints();
708
        Base::Vector3d p1 = pp.first();
709
        Base::Vector3d p2 = pp.second();
710
        dim->Y.setValue((p1.y + p2.y) / -2.0 + 0.5 * fontSize);
711
    }
712
    Gui::Command::commitCommand();
713
}
714

715
DEF_STD_CMD_A(CmdTechDrawExtensionPosVertChainDimension)
716

717
CmdTechDrawExtensionPosVertChainDimension::CmdTechDrawExtensionPosVertChainDimension()
718
    : Command("TechDraw_ExtensionPosVertChainDimension")
719
{
720
    sAppModule      = "TechDraw";
721
    sGroup          = QT_TR_NOOP("TechDraw");
722
    sMenuText       = QT_TR_NOOP("Position Vertical Chain Dimensions");
723
    sToolTipText    = QT_TR_NOOP("Align vertical dimensions to create a chain dimension:<br>\
724
- Select two or more vertical dimensions<br>\
725
- The first dimension defines the position<br>\
726
- Click this tool");
727
    sWhatsThis      = "TechDraw_ExtensionPosVertChainDimension";
728
    sStatusTip      = sMenuText;
729
    sPixmap         = "TechDraw_ExtensionPosVertChainDimension";
730
}
731

732
void CmdTechDrawExtensionPosVertChainDimension::activated(int iMsg)
733
{
734
    Q_UNUSED(iMsg);
735
    execPosVertChainDimension(this);
736
}
737

738
bool CmdTechDrawExtensionPosVertChainDimension::isActive()
739
{
740
    bool havePage = DrawGuiUtil::needPage(this);
741
    bool haveView = DrawGuiUtil::needView(this);
742
    return (havePage && haveView);
743
}
744

745
//===========================================================================
746
// TechDraw_ExtensionPosObliqueChainDimension
747
//===========================================================================
748

749
void execPosObliqueChainDimension(Gui::Command* cmd) {
750
    // position an oblique dimension chain
751
    std::vector<Gui::SelectionObject> selection;
752
    if (!_checkSelection(cmd, selection, QT_TRANSLATE_NOOP("QObject","TechDraw PosObliqueChainDimension"))) {
753
        return;
754
    }
755

756
    Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Pos Oblique Chain Dim"));
757
    std::vector<TechDraw::DrawViewDimension*> validDimension;
758
    validDimension = _getDimensions(selection, "Distance");
759
    if (validDimension.empty()) {
760
        QMessageBox::warning(Gui::getMainWindow(),
761
            QObject::tr("TechDraw PosObliqueChainDimension"),
762
            QObject::tr("No oblique dimensions selected"));
763
        return;
764
    }
765
    float xMaster = validDimension[0]->X.getValue();
766
    float yMaster = validDimension[0]->Y.getValue();
767
    Base::Vector3d pMaster(xMaster, yMaster, 0.0);
768
    pointPair pp = validDimension[0]->getLinearPoints();
769
    Base::Vector3d dirMaster = pp.second() - pp.first();
770
    dirMaster.y = -dirMaster.y;
771
    for (auto dim : validDimension) {
772
        float xDim = dim->X.getValue();
773
        float yDim = dim->Y.getValue();
774
        Base::Vector3d pDim(xDim, yDim, 0.0);
775
        Base::Vector3d p3 = DrawUtil::getTrianglePoint(pMaster, dirMaster, pDim);
776
        dim->X.setValue(p3.x);
777
        dim->Y.setValue(p3.y);
778
    }
779
    Gui::Command::commitCommand();
780
}
781

782
DEF_STD_CMD_A(CmdTechDrawExtensionPosObliqueChainDimension)
783

784
CmdTechDrawExtensionPosObliqueChainDimension::CmdTechDrawExtensionPosObliqueChainDimension()
785
    : Command("TechDraw_ExtensionPosObliqueChainDimension")
786
{
787
    sAppModule      = "TechDraw";
788
    sGroup          = QT_TR_NOOP("TechDraw");
789
    sMenuText       = QT_TR_NOOP("Position Oblique Chain Dimensions");
790
    sToolTipText    = QT_TR_NOOP("Align oblique dimensions to create a chain dimension:<br>\
791
- Select two or more parallel oblique dimensions<br>\
792
- The first dimension defines the position<br>\
793
- Click this tool");
794
    sWhatsThis      = "TechDraw_ExtensionPosObliqueChainDimension";
795
    sStatusTip      = sMenuText;
796
    sPixmap         = "TechDraw_ExtensionPosObliqueChainDimension";
797
}
798

799
void CmdTechDrawExtensionPosObliqueChainDimension::activated(int iMsg)
800
{
801
    Q_UNUSED(iMsg);
802
    execPosObliqueChainDimension(this);
803
    ///Base::Console().Message("TechDraw_ExtensionPosObliqueChainDimension started\n");
804
}
805

806
bool CmdTechDrawExtensionPosObliqueChainDimension::isActive()
807
{
808
    bool havePage = DrawGuiUtil::needPage(this);
809
    bool haveView = DrawGuiUtil::needView(this);
810
    return (havePage && haveView);
811
}
812

813
//===========================================================================
814
// TechDraw_ExtensionPosChainDimensionGroup
815
//===========================================================================
816

817
DEF_STD_CMD_ACL(CmdTechDrawExtensionPosChainDimensionGroup)
818

819
CmdTechDrawExtensionPosChainDimensionGroup::CmdTechDrawExtensionPosChainDimensionGroup()
820
    : Command("TechDraw_ExtensionPosChainDimensionGroup")
821
{
822
    sAppModule      = "TechDraw";
823
    sGroup          = QT_TR_NOOP("TechDraw");
824
    sMenuText       = QT_TR_NOOP("Position Horizontal Chain Dimensions");
825
    sToolTipText    = QT_TR_NOOP("Align horizontal dimensions to create a chain dimension:<br>\
826
- Select two or more horizontal dimensions<br>\
827
- The first dimension defines the position<br>\
828
- Click this tool");
829
    sWhatsThis      = "TechDraw_ExtensionPosChainDimensionGroup";
830
    sStatusTip      = sMenuText;
831
}
832

833
void CmdTechDrawExtensionPosChainDimensionGroup::activated(int iMsg)
834
{
835
    //    Base::Console().Message("CMD::ExtensionPosChainDimensionGroup - activated(%d)\n", iMsg);
836
    Gui::TaskView::TaskDialog* dlg = Gui::Control().activeDialog();
837
    if (dlg) {
838
        QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Task In Progress"),
839
            QObject::tr("Close active task dialog and try again."));
840
        return;
841
    }
842

843
    Gui::ActionGroup* pcAction = qobject_cast<Gui::ActionGroup*>(_pcAction);
844
    pcAction->setIcon(pcAction->actions().at(iMsg)->icon());
845
    switch (iMsg) {
846
    case 0:                 //position horizontal chain dimensions
847
        execPosHorizChainDimension(this);
848
        break;
849
    case 1:                 //position vertical chain dimensions
850
        execPosVertChainDimension(this);
851
        break;
852
    case 2:                 //position oblique chain dimensions
853
        execPosObliqueChainDimension(this);
854
        break;
855
    default:
856
        Base::Console().Message("CMD::CVGrp - invalid iMsg: %d\n", iMsg);
857
    };
858
}
859

860
Gui::Action* CmdTechDrawExtensionPosChainDimensionGroup::createAction()
861
{
862
    Gui::ActionGroup* pcAction = new Gui::ActionGroup(this, Gui::getMainWindow());
863
    pcAction->setDropDownMenu(true);
864
    applyCommandData(this->className(), pcAction);
865

866
    QAction* p1 = pcAction->addAction(QString());
867
    p1->setIcon(Gui::BitmapFactory().iconFromTheme("TechDraw_ExtensionPosHorizChainDimension"));
868
    p1->setObjectName(QString::fromLatin1("TechDraw_ExtensionPosHorizChainDimension"));
869
    p1->setWhatsThis(QString::fromLatin1("TechDraw_ExtensionPosHorizChainDimension"));
870
    QAction* p2 = pcAction->addAction(QString());
871
    p2->setIcon(Gui::BitmapFactory().iconFromTheme("TechDraw_ExtensionPosVertChainDimension"));
872
    p2->setObjectName(QString::fromLatin1("TechDraw_ExtensionPosVertChainDimension"));
873
    p2->setWhatsThis(QString::fromLatin1("TechDraw_ExtensionPosVertChainDimension"));
874
    QAction* p3 = pcAction->addAction(QString());
875
    p3->setIcon(Gui::BitmapFactory().iconFromTheme("TechDraw_ExtensionPosObliqueChainDimension"));
876
    p3->setObjectName(QString::fromLatin1("TechDraw_ExtensionPosObliqueChainDimension"));
877
    p3->setWhatsThis(QString::fromLatin1("TechDraw_ExtensionPosObliqueChainDimension"));
878

879
    _pcAction = pcAction;
880
    languageChange();
881

882
    pcAction->setIcon(p1->icon());
883
    int defaultId = 0;
884
    pcAction->setProperty("defaultAction", QVariant(defaultId));
885

886
    return pcAction;
887
}
888

889
void CmdTechDrawExtensionPosChainDimensionGroup::languageChange()
890
{
891
    Command::languageChange();
892

893
    if (!_pcAction)
894
        return;
895
    Gui::ActionGroup* pcAction = qobject_cast<Gui::ActionGroup*>(_pcAction);
896
    QList<QAction*> a = pcAction->actions();
897

898
    QAction* arc1 = a[0];
899
    arc1->setText(QApplication::translate("CmdTechDrawExtensionPosHorizChainDimension", "Position Horizontal Chain Dimensions"));
900
    arc1->setToolTip(QApplication::translate("CmdTechDrawExtensionPosHorizChainDimension",
901
"Align horizontal dimensions to create a chain dimension:<br>\
902
- Select two or more horizontal dimensions<br>\
903
- The first dimension defines the position<br>\
904
- Click this tool"));
905
    arc1->setStatusTip(arc1->text());
906
    QAction* arc2 = a[1];
907
    arc2->setText(QApplication::translate("CmdTechDrawExtensionPosVertChainDimension", "Position Vertical Chain Dimensions"));
908
    arc2->setToolTip(QApplication::translate("CmdTechDrawExtensionPosVertChainDimension",
909
"Align vertical dimensions to create a chain dimension:<br>\
910
- Select two or more vertical dimensions<br>\
911
- The first dimension defines the position<br>\
912
- Click this tool"));
913
    arc2->setStatusTip(arc2->text());
914
    QAction* arc3 = a[2];
915
    arc3->setText(QApplication::translate("CmdTechDrawExtensionPosObliqueChainDimension", "Position Oblique Chain Dimensions"));
916
    arc3->setToolTip(QApplication::translate("CmdTechDrawExtensionPosObliqueChainDimension",
917
"Align oblique dimensions to create a chain dimension:<br>\
918
- Select two or more parallel oblique dimensions<br>\
919
- The first dimension defines the position<br>\
920
- Click this tool"));
921
    arc3->setStatusTip(arc3->text());
922
}
923

924
bool CmdTechDrawExtensionPosChainDimensionGroup::isActive()
925
{
926
    bool havePage = DrawGuiUtil::needPage(this);
927
    bool haveView = DrawGuiUtil::needView(this, true);
928
    return (havePage && haveView);
929
}
930

931
//===========================================================================
932
// TechDraw_ExtensionCascadeHorizDimension
933
//===========================================================================
934

935
void execCascadeHorizDimension(Gui::Command* cmd) {
936
    // cascade horizontal dimensions
937
    std::vector<Gui::SelectionObject> selection;
938
    if (!_checkSelection(cmd, selection, QT_TRANSLATE_NOOP("QObject","TechDraw CascadeHorizDimension"))) {
939
        return;
940
    }
941

942
    Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Cascade Horiz Dim"));
943
    std::vector<TechDraw::DrawViewDimension*> validDimension;
944
    validDimension = _getDimensions(selection, "DistanceX");
945
    if (validDimension.empty()) {
946
        QMessageBox::warning(Gui::getMainWindow(),
947
            QObject::tr("TechDraw CascadeHorizDimension"),
948
            QObject::tr("No horizontal dimensions selected"));
949
        return;
950
    }
951
    float yMaster = validDimension[0]->Y.getValue();
952
    float dimDistance = activeDimAttributes.getCascadeSpacing();
953
    if (std::signbit(yMaster))
954
        dimDistance = -dimDistance;
955
    for (auto dim : validDimension) {
956
        dim->Y.setValue(yMaster);
957
        pointPair pp = dim->getLinearPoints();
958
        Base::Vector3d p1 = pp.first();
959
        Base::Vector3d p2 = pp.second();
960
        dim->X.setValue((p1.x + p2.x) / 2.0);
961
        yMaster = yMaster + dimDistance;
962
    }
963
    Gui::Command::commitCommand();
964
}
965

966
DEF_STD_CMD_A(CmdTechDrawExtensionCascadeHorizDimension)
967

968
CmdTechDrawExtensionCascadeHorizDimension::CmdTechDrawExtensionCascadeHorizDimension()
969
    : Command("TechDraw_ExtensionCascadeHorizDimension")
970
{
971
    sAppModule      = "TechDraw";
972
    sGroup          = QT_TR_NOOP("TechDraw");
973
    sMenuText       = QT_TR_NOOP("Cascade Horizontal Dimensions");
974
    sToolTipText    = QT_TR_NOOP("Evenly space horizontal dimensions:<br>\
975
- Specify the cascade spacing (optional)<br>\
976
- Select two or more horizontal dimensions<br>\
977
- The first dimension defines the position<br>\
978
- Click this tool");
979
    sWhatsThis      = "TechDraw_ExtensionCascadeHorizDimension";
980
    sStatusTip      = sMenuText;
981
    sPixmap         = "TechDraw_ExtensionCascadeHorizDimension";
982
}
983

984
void CmdTechDrawExtensionCascadeHorizDimension::activated(int iMsg)
985
{
986
    Q_UNUSED(iMsg);
987
    execCascadeHorizDimension(this);
988
}
989

990
bool CmdTechDrawExtensionCascadeHorizDimension::isActive()
991
{
992
    bool havePage = DrawGuiUtil::needPage(this);
993
    bool haveView = DrawGuiUtil::needView(this);
994
    return (havePage && haveView);
995
}
996

997
//===========================================================================
998
// TechDraw_ExtensionCascadeVertDimension
999
//===========================================================================
1000

1001
void execCascadeVertDimension(Gui::Command* cmd) {
1002
    // cascade vertical dimensions
1003
    std::vector<Gui::SelectionObject> selection;
1004
    if (!_checkSelection(cmd, selection, QT_TRANSLATE_NOOP("QObject","TechDraw CascadeVertDimension"))) {
1005
        return;
1006
    }
1007

1008
    Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Cascade Vert Dim"));
1009
    std::vector<TechDraw::DrawViewDimension*> validDimension;
1010
    validDimension = _getDimensions(selection, "DistanceY");
1011
    if (validDimension.empty()) {
1012
        QMessageBox::warning(Gui::getMainWindow(),
1013
            QObject::tr("TechDraw CascadeVertDimension"),
1014
            QObject::tr("No vertical dimensions selected"));
1015
        return;
1016
    }
1017
    float xMaster = validDimension[0]->X.getValue();
1018
    float dimDistance = activeDimAttributes.getCascadeSpacing();
1019
    if (std::signbit(xMaster))
1020
        dimDistance = -dimDistance;
1021
    double fontSize = Preferences::dimFontSizeMM();
1022
    for (auto dim : validDimension) {
1023
        dim->X.setValue(xMaster);
1024
        pointPair pp = dim->getLinearPoints();
1025
        Base::Vector3d p1 = pp.first();
1026
        Base::Vector3d p2 = pp.second();
1027
        dim->Y.setValue((p1.y + p2.y) / -2.0 + 0.5 * fontSize);
1028
        xMaster = xMaster + dimDistance;
1029
    }
1030
    Gui::Command::commitCommand();
1031
}
1032

1033
DEF_STD_CMD_A(CmdTechDrawExtensionCascadeVertDimension)
1034

1035
CmdTechDrawExtensionCascadeVertDimension::CmdTechDrawExtensionCascadeVertDimension()
1036
    : Command("TechDraw_ExtensionCascadeVertDimension")
1037
{
1038
    sAppModule      = "TechDraw";
1039
    sGroup          = QT_TR_NOOP("TechDraw");
1040
    sMenuText       = QT_TR_NOOP("Cascade Vertical Dimensions");
1041
    sToolTipText    = QT_TR_NOOP("Evenly space vertical dimensions:<br>\
1042
- Specify the cascade spacing (optional)<br>\
1043
- Select two or more vertical dimensions<br>\
1044
- The first dimension defines the position<br>\
1045
- Click this tool");
1046
    sWhatsThis      = "TechDraw_ExtensionCascadeVertDimension";
1047
    sStatusTip      = sMenuText;
1048
    sPixmap         = "TechDraw_ExtensionCascadeVertDimension";
1049
}
1050

1051
void CmdTechDrawExtensionCascadeVertDimension::activated(int iMsg)
1052
{
1053
    Q_UNUSED(iMsg);
1054
    execCascadeVertDimension(this);
1055
}
1056

1057
bool CmdTechDrawExtensionCascadeVertDimension::isActive()
1058
{
1059
    bool havePage = DrawGuiUtil::needPage(this);
1060
    bool haveView = DrawGuiUtil::needView(this);
1061
    return (havePage && haveView);
1062
}
1063

1064
//===========================================================================
1065
// TechDraw_ExtensionCascadeObliqueDimension
1066
//===========================================================================
1067

1068
void execCascadeObliqueDimension(Gui::Command* cmd) {
1069
    // cascade oblique dimensions
1070
    std::vector<Gui::SelectionObject> selection;
1071
    if (!_checkSelection(cmd, selection, QT_TRANSLATE_NOOP("QObject","TechDraw CascadeObliqueDimension"))) {
1072
        return;
1073
    }
1074

1075
    Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Cascade Oblique Dim"));
1076
    std::vector<TechDraw::DrawViewDimension*> validDimension;
1077
    validDimension = _getDimensions(selection, "Distance");
1078
    if (validDimension.empty()) {
1079
        QMessageBox::warning(Gui::getMainWindow(),
1080
            QObject::tr("TechDraw CascadeObliqueDimension"),
1081
            QObject::tr("No oblique dimensions selected"));
1082
        return;
1083
    }
1084
    float xMaster = validDimension[0]->X.getValue();
1085
    float yMaster = validDimension[0]->Y.getValue();
1086
    Base::Vector3d pMaster(xMaster, yMaster, 0.0);
1087
    pointPair pp = validDimension[0]->getLinearPoints();
1088
    Base::Vector3d dirMaster = pp.second() - pp.first();
1089
    dirMaster.y = -dirMaster.y;
1090
    Base::Vector3d origin(0.0, 0.0, 0.0);
1091
    Base::Vector3d ipDelta = DrawUtil::getTrianglePoint(pMaster, dirMaster, origin);
1092
    float dimDistance = activeDimAttributes.getCascadeSpacing();
1093
    Base::Vector3d delta = ipDelta.Normalize() * dimDistance;
1094
    int i = 0;
1095
    for (auto dim : validDimension) {
1096
        float xDim = dim->X.getValue();
1097
        float yDim = dim->Y.getValue();
1098
        Base::Vector3d pDim(xDim, yDim, 0.0);
1099
        Base::Vector3d p3 = DrawUtil::getTrianglePoint(pMaster, dirMaster, pDim);
1100
        p3 = p3 + delta * i;
1101
        dim->X.setValue(p3.x);
1102
        dim->Y.setValue(p3.y);
1103
        i = i + 1;
1104
    }
1105
    Gui::Command::commitCommand();
1106
}
1107

1108
DEF_STD_CMD_A(CmdTechDrawExtensionCascadeObliqueDimension)
1109

1110
CmdTechDrawExtensionCascadeObliqueDimension::CmdTechDrawExtensionCascadeObliqueDimension()
1111
    : Command("TechDraw_ExtensionCascadeObliqueDimension")
1112
{
1113
    sAppModule      = "TechDraw";
1114
    sGroup          = QT_TR_NOOP("TechDraw");
1115
    sMenuText       = QT_TR_NOOP("Cascade Oblique Dimensions");
1116
    sToolTipText    = QT_TR_NOOP("Evenly space oblique dimensions:<br>\
1117
- Specify the cascade spacing (optional)<br>\
1118
- Select two or more parallel oblique dimensions<br>\
1119
- The first dimension defines the position<br>\
1120
- Click this tool");
1121
    sWhatsThis      = "TechDraw_ExtensionCascadeObliqueDimension";
1122
    sStatusTip      = sMenuText;
1123
    sPixmap         = "TechDraw_ExtensionCascadeObliqueDimension";
1124
}
1125

1126
void CmdTechDrawExtensionCascadeObliqueDimension::activated(int iMsg)
1127
{
1128
    Q_UNUSED(iMsg);
1129
    execCascadeObliqueDimension(this);
1130
    ///Base::Console().Message("TechDraw_ExtensionPosObliqueChainDimension started\n");
1131
}
1132

1133
bool CmdTechDrawExtensionCascadeObliqueDimension::isActive()
1134
{
1135
    bool havePage = DrawGuiUtil::needPage(this);
1136
    bool haveView = DrawGuiUtil::needView(this);
1137
    return (havePage && haveView);
1138
}
1139

1140
//===========================================================================
1141
// TechDraw_ExtensionCascadeDimensionGroup
1142
//===========================================================================
1143

1144
DEF_STD_CMD_ACL(CmdTechDrawExtensionCascadeDimensionGroup)
1145

1146
CmdTechDrawExtensionCascadeDimensionGroup::CmdTechDrawExtensionCascadeDimensionGroup()
1147
    : Command("TechDraw_ExtensionCascadeDimensionGroup")
1148
{
1149
    sAppModule      = "TechDraw";
1150
    sGroup          = QT_TR_NOOP("TechDraw");
1151
    sMenuText       = QT_TR_NOOP("Cascade Horizontal Dimensions");
1152
    sToolTipText    = QT_TR_NOOP("Evenly space horizontal dimensions:<br>\
1153
- Specify the cascade spacing (optional)<br>\
1154
- Select two or more horizontal dimensions<br>\
1155
- The first dimension defines the position<br>\
1156
- Click this tool");
1157
    sWhatsThis      = "TechDraw_ExtensionCascadeDimensionGroup";
1158
    sStatusTip      = sMenuText;
1159
}
1160

1161
void CmdTechDrawExtensionCascadeDimensionGroup::activated(int iMsg)
1162
{
1163
    //    Base::Console().Message("CMD::ExtensionCascadeDimansionGroup - activated(%d)\n", iMsg);
1164
    Gui::TaskView::TaskDialog* dlg = Gui::Control().activeDialog();
1165
    if (dlg) {
1166
        QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Task In Progress"),
1167
            QObject::tr("Close active task dialog and try again."));
1168
        return;
1169
    }
1170

1171
    Gui::ActionGroup* pcAction = qobject_cast<Gui::ActionGroup*>(_pcAction);
1172
    pcAction->setIcon(pcAction->actions().at(iMsg)->icon());
1173
    switch (iMsg) {
1174
    case 0:                 //cascade horizontal dimensions
1175
        execCascadeHorizDimension(this);
1176
        break;
1177
    case 1:                 //cascade vertical dimensions
1178
        execCascadeVertDimension(this);
1179
        break;
1180
    case 2:                 //cascade oblique dimensions
1181
        execCascadeObliqueDimension(this);
1182
        break;
1183
    default:
1184
        Base::Console().Message("CMD::CVGrp - invalid iMsg: %d\n", iMsg);
1185
    };
1186
}
1187

1188
Gui::Action* CmdTechDrawExtensionCascadeDimensionGroup::createAction()
1189
{
1190
    Gui::ActionGroup* pcAction = new Gui::ActionGroup(this, Gui::getMainWindow());
1191
    pcAction->setDropDownMenu(true);
1192
    applyCommandData(this->className(), pcAction);
1193

1194
    QAction* p1 = pcAction->addAction(QString());
1195
    p1->setIcon(Gui::BitmapFactory().iconFromTheme("TechDraw_ExtensionCascadeHorizDimension"));
1196
    p1->setObjectName(QString::fromLatin1("TechDraw_ExtensionCascadeHorizDimension"));
1197
    p1->setWhatsThis(QString::fromLatin1("TechDraw_ExtensionCascadeHorizDimension"));
1198
    QAction* p2 = pcAction->addAction(QString());
1199
    p2->setIcon(Gui::BitmapFactory().iconFromTheme("TechDraw_ExtensionCascadeVertDimension"));
1200
    p2->setObjectName(QString::fromLatin1("TechDraw_ExtensionCascadeVertDimension"));
1201
    p2->setWhatsThis(QString::fromLatin1("TechDraw_ExtensionCascadeVertDimension"));
1202
    QAction* p3 = pcAction->addAction(QString());
1203
    p3->setIcon(Gui::BitmapFactory().iconFromTheme("TechDraw_ExtensionCascadeObliqueDimension"));
1204
    p3->setObjectName(QString::fromLatin1("TechDraw_ExtensionCascadeObliqueDimension"));
1205
    p3->setWhatsThis(QString::fromLatin1("TechDraw_ExtensionCascadeObliqueDimension"));
1206

1207
    _pcAction = pcAction;
1208
    languageChange();
1209

1210
    pcAction->setIcon(p1->icon());
1211
    int defaultId = 0;
1212
    pcAction->setProperty("defaultAction", QVariant(defaultId));
1213

1214
    return pcAction;
1215
}
1216

1217
void CmdTechDrawExtensionCascadeDimensionGroup::languageChange()
1218
{
1219
    Command::languageChange();
1220

1221
    if (!_pcAction)
1222
        return;
1223
    Gui::ActionGroup* pcAction = qobject_cast<Gui::ActionGroup*>(_pcAction);
1224
    QList<QAction*> a = pcAction->actions();
1225

1226
    QAction* arc1 = a[0];
1227
    arc1->setText(QApplication::translate("CmdTechDrawExtensionCascadeHorizDimension", "Cascade Horizontal Dimensions"));
1228
    arc1->setToolTip(QApplication::translate("CmdTechDrawExtensionCascadeHorizDimension",
1229
"Evenly space horizontal dimensions:<br>\
1230
- Specify the cascade spacing (optional)<br>\
1231
- Select two or more horizontal dimensions<br>\
1232
- The first dimension defines the position<br>\
1233
- Click this tool"));
1234
    arc1->setStatusTip(arc1->text());
1235
    QAction* arc2 = a[1];
1236
    arc2->setText(QApplication::translate("CmdTechDrawExtensionCascadeVertDimension", "Cascade Vertical Dimensions"));
1237
    arc2->setToolTip(QApplication::translate("CmdTechDrawExtensionCascadeVertDimension",
1238
"Evenly space vertical dimensions:<br>\
1239
- Specify the cascade spacing (optional)<br>\
1240
- Select two or more vertical dimensions<br>\
1241
- The first dimension defines the position<br>\
1242
- Click this tool"));
1243
    arc2->setStatusTip(arc2->text());
1244
    QAction* arc3 = a[2];
1245
    arc3->setText(QApplication::translate("CmdTechDrawExtensionCascadeObliqueDimension", "Cascade Oblique Dimensions"));
1246
    arc3->setToolTip(QApplication::translate("CmdTechDrawExtensionCascadeObliqueDimension",
1247
"Evenly space oblique dimensions:<br>\
1248
- Specify the cascade spacing (optional)<br>\
1249
- Select two or more parallel oblique dimensions<br>\
1250
- The first dimension defines the position<br>\
1251
- Click this tool"));
1252
    arc3->setStatusTip(arc3->text());
1253
}
1254

1255
bool CmdTechDrawExtensionCascadeDimensionGroup::isActive()
1256
{
1257
    bool havePage = DrawGuiUtil::needPage(this);
1258
    bool haveView = DrawGuiUtil::needView(this, true);
1259
    return (havePage && haveView);
1260
}
1261

1262
//===========================================================================
1263
// TechDraw_ExtensionCreateHorizChainDimension
1264
//===========================================================================
1265

1266
void execCreateHorizChainDimension(Gui::Command* cmd) {
1267
    //create a horizontal chain dimension
1268
    std::vector<Gui::SelectionObject> selection;
1269
    TechDraw::DrawViewPart* objFeat;
1270
    if (!_checkSelObjAndSubs(cmd, selection, objFeat, QT_TRANSLATE_NOOP("QObject","TechDraw Create Horizontal Chain Dimension"))) {
1271
        return;
1272
    }
1273

1274
    Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Create Horiz Chain Dim"));
1275
    const std::vector<std::string> subNames = selection[0].getSubNames();
1276
    std::vector<dimVertex> allVertexes;
1277
    allVertexes = _getVertexInfo(objFeat, subNames);
1278
    if (!allVertexes.empty() && allVertexes.size() > 1) {
1279
        std::sort(allVertexes.begin(), allVertexes.end(), sortX);
1280
        float yMaster = 0.0;
1281
        for (long unsigned int n = 0; n < allVertexes.size() - 1; n++) {
1282
            TechDraw::DrawViewDimension* dim;
1283
            dim = _createLinDimension(cmd, objFeat, allVertexes[n].name, allVertexes[n + 1].name, "DistanceX");
1284
            TechDraw::pointPair pp = dim->getLinearPoints();
1285
            Base::Vector3d mid = (pp.first() + pp.second()) / 2.0;
1286
            dim->X.setValue(mid.x);
1287
            if (n == 0)
1288
                yMaster = -mid.y;
1289
            dim->Y.setValue(yMaster);
1290
        }
1291
    }
1292
    objFeat->refreshCEGeoms();
1293
    objFeat->requestPaint();
1294
    cmd->getSelection().clearSelection();
1295
    Gui::Command::commitCommand();
1296
}
1297

1298
DEF_STD_CMD_A(CmdTechDrawExtensionCreateHorizChainDimension)
1299

1300
CmdTechDrawExtensionCreateHorizChainDimension::CmdTechDrawExtensionCreateHorizChainDimension()
1301
    : Command("TechDraw_ExtensionCreateHorizChainDimension")
1302
{
1303
    sAppModule      = "TechDraw";
1304
    sGroup          = QT_TR_NOOP("TechDraw");
1305
    sMenuText       = QT_TR_NOOP("Create Horizontal Chain Dimensions");
1306
    sToolTipText    = QT_TR_NOOP("Create a sequence of aligned horizontal dimensions:<br>\
1307
- Select three or more vertexes<br>\
1308
- Click this tool");
1309
    sWhatsThis      = "TechDraw_ExtensionCreateHorizChainDimension";
1310
    sStatusTip      = sMenuText;
1311
    sPixmap         = "TechDraw_ExtensionCreateHorizChainDimension";
1312
}
1313

1314
void CmdTechDrawExtensionCreateHorizChainDimension::activated(int iMsg)
1315
{
1316
    Q_UNUSED(iMsg);
1317
    execCreateHorizChainDimension(this);
1318
    //execSortieren(this);
1319
}
1320

1321
bool CmdTechDrawExtensionCreateHorizChainDimension::isActive()
1322
{
1323
    bool havePage = DrawGuiUtil::needPage(this);
1324
    bool haveView = DrawGuiUtil::needView(this);
1325
    return (havePage && haveView);
1326
}
1327

1328
//===========================================================================
1329
// TechDraw_ExtensionCreateVertChainDimension
1330
//===========================================================================
1331

1332
void execCreateVertChainDimension(Gui::Command* cmd) {
1333
    //create a vertical chain dimension
1334
    std::vector<Gui::SelectionObject> selection;
1335
    TechDraw::DrawViewPart* objFeat;
1336
    if (!_checkSelObjAndSubs(cmd, selection, objFeat, QT_TRANSLATE_NOOP("QObject","TechDraw Create Vertical Chain Dimension"))) {
1337
        return;
1338
    }
1339

1340
    Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Create Vert Chain Dim"));
1341
    const std::vector<std::string> subNames = selection[0].getSubNames();
1342
    std::vector<dimVertex> allVertexes;
1343
    allVertexes = _getVertexInfo(objFeat, subNames);
1344
    if (!allVertexes.empty() && allVertexes.size() > 1) {
1345
        std::sort(allVertexes.begin(), allVertexes.end(), sortY);
1346
        float xMaster = 0.0;
1347
        double fontSize = Preferences::dimFontSizeMM();
1348
        for (long unsigned int n = 0; n < allVertexes.size() - 1; n++) {
1349
            TechDraw::DrawViewDimension* dim;
1350
            dim = _createLinDimension(cmd, objFeat, allVertexes[n].name, allVertexes[n + 1].name, "DistanceY");
1351
            TechDraw::pointPair pp = dim->getLinearPoints();
1352
            Base::Vector3d mid = (pp.first() + pp.second()) / 2.0;
1353
            if (n == 0)
1354
                xMaster = mid.x;
1355
            dim->X.setValue(xMaster);
1356
            dim->Y.setValue(-mid.y + 0.5 * fontSize);
1357
        }
1358
    }
1359
    objFeat->refreshCEGeoms();
1360
    objFeat->requestPaint();
1361
    cmd->getSelection().clearSelection();
1362
    Gui::Command::commitCommand();
1363
}
1364

1365
DEF_STD_CMD_A(CmdTechDrawExtensionCreateVertChainDimension)
1366

1367
CmdTechDrawExtensionCreateVertChainDimension::CmdTechDrawExtensionCreateVertChainDimension()
1368
    : Command("TechDraw_ExtensionCreateVertChainDimension")
1369
{
1370
    sAppModule      = "TechDraw";
1371
    sGroup          = QT_TR_NOOP("TechDraw");
1372
    sMenuText       = QT_TR_NOOP("Create Vertical Chain Dimensions");
1373
    sToolTipText    = QT_TR_NOOP("Create a sequence of aligned vertical dimensions:<br>\
1374
- Select three or more vertexes<br>\
1375
- Click this tool");
1376
    sWhatsThis      = "TechDraw_ExtensionCreateVertChainDimension";
1377
    sStatusTip      = sMenuText;
1378
    sPixmap         = "TechDraw_ExtensionCreateVertChainDimension";
1379
}
1380

1381
void CmdTechDrawExtensionCreateVertChainDimension::activated(int iMsg)
1382
{
1383
    Q_UNUSED(iMsg);
1384
    execCreateVertChainDimension(this);
1385
}
1386

1387
bool CmdTechDrawExtensionCreateVertChainDimension::isActive()
1388
{
1389
    bool havePage = DrawGuiUtil::needPage(this);
1390
    bool haveView = DrawGuiUtil::needView(this);
1391
    return (havePage && haveView);
1392
}
1393

1394
//===========================================================================
1395
// TechDraw_ExtensionCreateObliqueChainDimension
1396
//===========================================================================
1397

1398
void execCreateObliqueChainDimension(Gui::Command* cmd) {
1399
    // create an oblique chain dimension
1400
    std::vector<Gui::SelectionObject> selection;
1401
    TechDraw::DrawViewPart* objFeat;
1402
    if (!_checkSelObjAndSubs(cmd, selection, objFeat, QT_TRANSLATE_NOOP("QObject","TechDraw Create Oblique Chain Dimension"))){
1403
        return;
1404
    }
1405

1406
    Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Create Oblique Chain Dim"));
1407
    const std::vector<std::string> subNames = selection[0].getSubNames();
1408
    std::vector<dimVertex> allVertexes, carrierVertexes;
1409
    allVertexes = _getVertexInfo(objFeat, subNames);
1410
    if (!allVertexes.empty() && allVertexes.size() > 1) {
1411
        Base::Vector3d pMaster = allVertexes[0].point;
1412
        Base::Vector3d dirMaster = pMaster - allVertexes[1].point;
1413
        Base::Vector3d origin(0.0, 0.0, 0.0);
1414
        Base::Vector3d delta = DrawUtil::getTrianglePoint(pMaster, dirMaster, origin);
1415
        float dimDistance = activeDimAttributes.getCascadeSpacing();
1416
        delta = delta.Normalize() * dimDistance;
1417
        double scale = objFeat->getScale();
1418
        for (dimVertex oldVertex : allVertexes) {
1419
            Base::Vector3d nextPoint = DrawUtil::getTrianglePoint(pMaster, dirMaster, oldVertex.point);
1420
            nextPoint.y = -nextPoint.y;
1421
            oldVertex.point.y = -oldVertex.point.y;
1422
            if ((oldVertex.point - nextPoint).Length() > 0.01) {
1423
                Base::Vector3d cvPoint = CosmeticVertex::makeCanonicalPoint(objFeat, nextPoint);
1424
                std::string vertTag = objFeat->addCosmeticVertex(cvPoint);
1425
                int vertNumber = objFeat->add1CVToGV(vertTag);
1426
                std::stringstream ss;
1427
                ss << "Vertex" << vertNumber;
1428
                dimVertex newVertex;
1429
                newVertex.name = ss.str();
1430
                newVertex.point = nextPoint;
1431
                carrierVertexes.push_back(newVertex);
1432
                std::string edgeTag = objFeat->addCosmeticEdge(oldVertex.point / scale, nextPoint / scale);
1433
                auto edge = objFeat->getCosmeticEdge(edgeTag);
1434
                edge->m_format.m_style = 1;
1435
                edge->m_format.m_lineNumber = 1;
1436
                edge->m_format.m_weight = 0.15;
1437
                edge->m_format.m_color = App::Color(0.0f, 0.0f, 0.0f);
1438
            }
1439
            else
1440
                carrierVertexes.push_back(oldVertex);
1441
        }
1442
        std::sort(carrierVertexes.begin(), carrierVertexes.end(), sortX);
1443
        double fontSize = Preferences::dimFontSizeMM();
1444
        for (long unsigned int n = 0; n < allVertexes.size() - 1; n++) {
1445
            TechDraw::DrawViewDimension* dim;
1446
            dim = _createLinDimension(cmd, objFeat, carrierVertexes[n].name, carrierVertexes[n + 1].name, "Distance");
1447
            TechDraw::pointPair pp = dim->getLinearPoints();
1448
            Base::Vector3d mid = (pp.first() + pp.second()) / 2.0 + delta;
1449
            dim->X.setValue(mid.x);
1450
            dim->Y.setValue(-mid.y + 0.5 * fontSize);
1451
        }
1452
        objFeat->refreshCEGeoms();
1453
        objFeat->requestPaint();
1454
        cmd->getSelection().clearSelection();
1455
        Gui::Command::commitCommand();
1456
    }
1457
}
1458

1459
DEF_STD_CMD_A(CmdTechDrawExtensionCreateObliqueChainDimension)
1460

1461
CmdTechDrawExtensionCreateObliqueChainDimension::CmdTechDrawExtensionCreateObliqueChainDimension()
1462
    : Command("TechDraw_ExtensionCreateObliqueChainDimension")
1463
{
1464
    sAppModule      = "TechDraw";
1465
    sGroup          = QT_TR_NOOP("TechDraw");
1466
    sMenuText       = QT_TR_NOOP("Create Oblique Chain Dimensions");
1467
    sToolTipText    = QT_TR_NOOP("Create a sequence of aligned oblique dimensions:<br>\
1468
- Select three or more vertexes<br>\
1469
- The first two vertexes define the direction<br>\
1470
- Click this tool");
1471
    sWhatsThis      = "TechDraw_ExtensionCreateObliqueChainDimension";
1472
    sStatusTip      = sMenuText;
1473
    sPixmap         = "TechDraw_ExtensionCreateObliqueChainDimension";
1474
}
1475

1476
void CmdTechDrawExtensionCreateObliqueChainDimension::activated(int iMsg)
1477
{
1478
    Q_UNUSED(iMsg);
1479
    execCreateObliqueChainDimension(this);
1480
}
1481

1482
bool CmdTechDrawExtensionCreateObliqueChainDimension::isActive()
1483
{
1484
    bool havePage = DrawGuiUtil::needPage(this);
1485
    bool haveView = DrawGuiUtil::needView(this);
1486
    return (havePage && haveView);
1487
}
1488

1489
//===========================================================================
1490
// TechDraw_ExtensionCreateChainDimensionGroup
1491
//===========================================================================
1492

1493
DEF_STD_CMD_ACL(CmdTechDrawExtensionCreateChainDimensionGroup)
1494

1495
CmdTechDrawExtensionCreateChainDimensionGroup::CmdTechDrawExtensionCreateChainDimensionGroup()
1496
    : Command("TechDraw_ExtensionCreateChainDimensionGroup")
1497
{
1498
    sAppModule      = "TechDraw";
1499
    sGroup          = QT_TR_NOOP("TechDraw");
1500
    sMenuText       = QT_TR_NOOP("Create Horizontal Chain Dimensions");
1501
    sToolTipText    = QT_TR_NOOP("Create a sequence of aligned horizontal dimensions:<br>\
1502
- Select three or more vertexes<br>\
1503
- Click this tool");
1504
    sWhatsThis      = "TechDraw_ExtensionCreateChainDimensionGroup";
1505
    sStatusTip      = sMenuText;
1506
}
1507

1508
void CmdTechDrawExtensionCreateChainDimensionGroup::activated(int iMsg)
1509
{
1510
    //    Base::Console().Message("CMD::ExtensionCascadeDimansionGroup - activated(%d)\n", iMsg);
1511
    Gui::TaskView::TaskDialog* dlg = Gui::Control().activeDialog();
1512
    if (dlg) {
1513
        QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Task In Progress"),
1514
            QObject::tr("Close active task dialog and try again."));
1515
        return;
1516
    }
1517

1518
    Gui::ActionGroup* pcAction = qobject_cast<Gui::ActionGroup*>(_pcAction);
1519
    pcAction->setIcon(pcAction->actions().at(iMsg)->icon());
1520
    switch (iMsg) {
1521
    case 0:                 //create horizontal chain dimensions
1522
        execCreateHorizChainDimension(this);
1523
        break;
1524
    case 1:                 //create vertical chain dimensions
1525
        execCreateVertChainDimension(this);
1526
        break;
1527
    case 2:                 //create oblique chain dimensions
1528
        execCreateObliqueChainDimension(this);
1529
        break;
1530
    default:
1531
        Base::Console().Message("CMD::CVGrp - invalid iMsg: %d\n", iMsg);
1532
    };
1533
}
1534

1535
Gui::Action* CmdTechDrawExtensionCreateChainDimensionGroup::createAction()
1536
{
1537
    Gui::ActionGroup* pcAction = new Gui::ActionGroup(this, Gui::getMainWindow());
1538
    pcAction->setDropDownMenu(true);
1539
    applyCommandData(this->className(), pcAction);
1540

1541
    QAction* p1 = pcAction->addAction(QString());
1542
    p1->setIcon(Gui::BitmapFactory().iconFromTheme("TechDraw_ExtensionCreateHorizChainDimension"));
1543
    p1->setObjectName(QString::fromLatin1("TechDraw_ExtensionCreateHorizChainDimension"));
1544
    p1->setWhatsThis(QString::fromLatin1("TechDraw_ExtensionCreateHorizChainDimension"));
1545
    QAction* p2 = pcAction->addAction(QString());
1546
    p2->setIcon(Gui::BitmapFactory().iconFromTheme("TechDraw_ExtensionCreateVertChainDimension"));
1547
    p2->setObjectName(QString::fromLatin1("TechDraw_ExtensionCreateVertChainDimension"));
1548
    p2->setWhatsThis(QString::fromLatin1("TechDraw_ExtensionCreateVertChainDimension"));
1549
    QAction* p3 = pcAction->addAction(QString());
1550
    p3->setIcon(Gui::BitmapFactory().iconFromTheme("TechDraw_ExtensionCreateObliqueChainDimension"));
1551
    p3->setObjectName(QString::fromLatin1("TechDraw_ExtensionCreateObliqueChainDimension"));
1552
    p3->setWhatsThis(QString::fromLatin1("TechDraw_ExtensionCreateObliqueChainDimension"));
1553

1554
    _pcAction = pcAction;
1555
    languageChange();
1556

1557
    pcAction->setIcon(p1->icon());
1558
    int defaultId = 0;
1559
    pcAction->setProperty("defaultAction", QVariant(defaultId));
1560

1561
    return pcAction;
1562
}
1563

1564
void CmdTechDrawExtensionCreateChainDimensionGroup::languageChange()
1565
{
1566
    Command::languageChange();
1567

1568
    if (!_pcAction)
1569
        return;
1570
    Gui::ActionGroup* pcAction = qobject_cast<Gui::ActionGroup*>(_pcAction);
1571
    QList<QAction*> a = pcAction->actions();
1572

1573
    QAction* arc1 = a[0];
1574
    arc1->setText(QApplication::translate("CmdTechDrawExtensionCreateHorizChainDimension", "Create Horizontal Chain Dimensions"));
1575
    arc1->setToolTip(QApplication::translate("CmdTechDrawExtensionCreateHorizChainDimension",
1576
"Create a sequence of aligned horizontal dimensions:<br>\
1577
- Select three or more vertexes<br>\
1578
- Click this tool"));
1579
    arc1->setStatusTip(arc1->text());
1580
    QAction* arc2 = a[1];
1581
    arc2->setText(QApplication::translate("CmdTechDrawExtensionCreateVertChainDimension", "Create Vertical Chain Dimensions"));
1582
    arc2->setToolTip(QApplication::translate("CmdTechDrawExtensionCreateVertChainDimension",
1583
"Create a sequence of aligned vertical dimensions:<br>\
1584
- Select three or more vertexes<br>\
1585
- Click this tool"));
1586
    arc2->setStatusTip(arc2->text());
1587
    QAction* arc3 = a[2];
1588
    arc3->setText(QApplication::translate("CmdTechDrawExtensionCreateObliqueChainDimension", "Create Oblique Chain Dimensions"));
1589
    arc3->setToolTip(QApplication::translate("CmdTechDrawExtensionCreateObliqueChainDimension",
1590
"Create a sequence of aligned oblique dimensions:<br>\
1591
- Select three or more vertexes<br>\
1592
- The first two vertexes define the direction<br>\
1593
- Click this tool"));
1594
    arc3->setStatusTip(arc3->text());
1595
}
1596

1597
bool CmdTechDrawExtensionCreateChainDimensionGroup::isActive()
1598
{
1599
    bool havePage = DrawGuiUtil::needPage(this);
1600
    bool haveView = DrawGuiUtil::needView(this, true);
1601
    return (havePage && haveView);
1602
}
1603

1604
//===========================================================================
1605
// TechDraw_ExtensionCreateHorizCoordDimension
1606
//===========================================================================
1607

1608
void execCreateHorizCoordDimension(Gui::Command* cmd) {
1609
    //create horizontal coordinate dimensions
1610
    std::vector<Gui::SelectionObject> selection;
1611
    TechDraw::DrawViewPart* objFeat;
1612
    if (!_checkSelObjAndSubs(cmd, selection, objFeat, QT_TRANSLATE_NOOP("QObject","TechDraw Create Horizontal Coord Dimension"))) {
1613
        return;
1614
    }
1615

1616
    Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Create Horiz Coord Dim"));
1617
    const std::vector<std::string> subNames = selection[0].getSubNames();
1618
    std::vector<dimVertex> allVertexes;
1619
    allVertexes = _getVertexInfo(objFeat, subNames);
1620
    if (!allVertexes.empty() && allVertexes.size() > 1) {
1621
        dimVertex firstVertex = allVertexes[0];
1622
        dimVertex secondVertex = allVertexes[1];
1623
        std::sort(allVertexes.begin(), allVertexes.end(), sortX);
1624
        if (firstVertex.point.x > secondVertex.point.x) {
1625
            std::reverse(allVertexes.begin(), allVertexes.end());
1626
        }
1627
        float dimDistance = activeDimAttributes.getCascadeSpacing();
1628
        float yMaster = allVertexes[0].point.y - dimDistance;
1629
        if (std::signbit(yMaster))
1630
            dimDistance = -dimDistance;
1631
        for (long unsigned int n = 0; n < allVertexes.size() - 1; n++) {
1632
            TechDraw::DrawViewDimension* dim;
1633
            dim = _createLinDimension(cmd, objFeat, allVertexes[0].name, allVertexes[n + 1].name, "DistanceX");
1634
            TechDraw::pointPair pp = dim->getLinearPoints();
1635
            Base::Vector3d mid = (pp.first() + pp.second()) / 2.0;
1636
            dim->X.setValue(mid.x);
1637
            dim->Y.setValue(-yMaster - dimDistance * n);
1638
        }
1639
    }
1640
    objFeat->refreshCEGeoms();
1641
    objFeat->requestPaint();
1642
    cmd->getSelection().clearSelection();
1643
    Gui::Command::commitCommand();
1644
}
1645

1646
DEF_STD_CMD_A(CmdTechDrawExtensionCreateHorizCoordDimension)
1647

1648
CmdTechDrawExtensionCreateHorizCoordDimension::CmdTechDrawExtensionCreateHorizCoordDimension()
1649
    : Command("TechDraw_ExtensionCreateHorizCoordDimension")
1650
{
1651
    sAppModule      = "TechDraw";
1652
    sGroup          = QT_TR_NOOP("TechDraw");
1653
    sMenuText       = QT_TR_NOOP("Create Horizontal Coordinate Dimensions");
1654
    sToolTipText    = QT_TR_NOOP("Create multiple evenly spaced horizontal dimensions starting from the same baseline:<br>\
1655
- Specify the cascade spacing (optional)<br>\
1656
- Select three or more vertexes<br>\
1657
- The selection order of the first two vertexes determines the position of the baseline<br>\
1658
- Click this tool");
1659
    sWhatsThis      = "TechDraw_ExtensionCreateHorizCoordDimension";
1660
    sStatusTip      = sMenuText;
1661
    sPixmap         = "TechDraw_ExtensionCreateHorizCoordDimension";
1662
}
1663

1664
void CmdTechDrawExtensionCreateHorizCoordDimension::activated(int iMsg)
1665
{
1666
    Q_UNUSED(iMsg);
1667
    execCreateHorizCoordDimension(this);
1668
}
1669

1670
bool CmdTechDrawExtensionCreateHorizCoordDimension::isActive()
1671
{
1672
    bool havePage = DrawGuiUtil::needPage(this);
1673
    bool haveView = DrawGuiUtil::needView(this);
1674
    return (havePage && haveView);
1675
}
1676

1677
//===========================================================================
1678
// TechDraw_ExtensionCreateVertCoordDimension
1679
//===========================================================================
1680

1681
void execCreateVertCoordDimension(Gui::Command* cmd) {
1682
    //create vertical coordinate dimensions
1683
    std::vector<Gui::SelectionObject> selection;
1684
    TechDraw::DrawViewPart* objFeat;
1685
    if (!_checkSelObjAndSubs(cmd, selection, objFeat, QT_TRANSLATE_NOOP("QObject","TechDraw Create Vertical Coord Dimension"))) {
1686
        return;
1687
    }
1688
    Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Create Vert Coord Dim"));
1689
    const std::vector<std::string> subNames = selection[0].getSubNames();
1690
    std::vector<dimVertex> allVertexes;
1691
    allVertexes = _getVertexInfo(objFeat, subNames);
1692
    if (!allVertexes.empty() && allVertexes.size() > 1) {
1693
        dimVertex firstVertex = allVertexes[0];
1694
        dimVertex secondVertex = allVertexes[1];
1695
        std::sort(allVertexes.begin(), allVertexes.end(), sortY);
1696
        if (firstVertex.point.y > secondVertex.point.y) {
1697
            std::reverse(allVertexes.begin(), allVertexes.end());
1698
        }
1699
        float dimDistance = activeDimAttributes.getCascadeSpacing();
1700
        float xMaster = allVertexes[0].point.x + dimDistance;
1701
        if (std::signbit(xMaster))
1702
            dimDistance = -dimDistance;
1703
        double fontSize = Preferences::dimFontSizeMM();
1704
        for (long unsigned int n = 0; n < allVertexes.size() - 1; n++) {
1705
            TechDraw::DrawViewDimension* dim;
1706
            dim = _createLinDimension(cmd, objFeat, allVertexes[0].name, allVertexes[n + 1].name, "DistanceY");
1707
            TechDraw::pointPair pp = dim->getLinearPoints();
1708
            Base::Vector3d mid = (pp.first() + pp.second()) / 2.0;
1709
            dim->X.setValue(xMaster + dimDistance * n);
1710
            dim->Y.setValue(-mid.y + 0.5 * fontSize);
1711
        }
1712
    }
1713
    objFeat->refreshCEGeoms();
1714
    objFeat->requestPaint();
1715
    cmd->getSelection().clearSelection();
1716
    Gui::Command::commitCommand();
1717
}
1718

1719
DEF_STD_CMD_A(CmdTechDrawExtensionCreateVertCoordDimension)
1720

1721
CmdTechDrawExtensionCreateVertCoordDimension::CmdTechDrawExtensionCreateVertCoordDimension()
1722
    : Command("TechDraw_ExtensionCreateVertCoordDimension")
1723
{
1724
    sAppModule      = "TechDraw";
1725
    sGroup          = QT_TR_NOOP("TechDraw");
1726
    sMenuText       = QT_TR_NOOP("Create Vertical Coordinate Dimensions");
1727
    sToolTipText    = QT_TR_NOOP("Create multiple evenly spaced vertical dimensions starting from the same baseline:<br>\
1728
- Specify the cascade spacing (optional)<br>\
1729
- Select three or more vertexes<br>\
1730
- The selection order of the first two vertexes determines the position of the baseline<br>\
1731
- Click this tool");
1732
    sWhatsThis      = "TechDraw_ExtensionCreateVertCoordDimension";
1733
    sStatusTip      = sMenuText;
1734
    sPixmap         = "TechDraw_ExtensionCreateVertCoordDimension";
1735
}
1736

1737
void CmdTechDrawExtensionCreateVertCoordDimension::activated(int iMsg)
1738
{
1739
    Q_UNUSED(iMsg);
1740
    execCreateVertCoordDimension(this);
1741
}
1742

1743
bool CmdTechDrawExtensionCreateVertCoordDimension::isActive()
1744
{
1745
    bool havePage = DrawGuiUtil::needPage(this);
1746
    bool haveView = DrawGuiUtil::needView(this);
1747
    return (havePage && haveView);
1748
}
1749

1750
//===========================================================================
1751
// TechDraw_ExtensionCreateObliqueCoordDimension
1752
//===========================================================================
1753

1754
void execCreateObliqueCoordDimension(Gui::Command* cmd) {
1755
    //create oblique coordinate dimensions
1756
    std::vector<Gui::SelectionObject> selection;
1757
    TechDraw::DrawViewPart* objFeat;
1758
    if (!_checkSelObjAndSubs(cmd, selection, objFeat, QT_TRANSLATE_NOOP("QObject","TechDraw Create Oblique Coord Dimension"))) {
1759
        return;
1760
    }
1761

1762
    Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Create Oblique Coord Dim"));
1763
    const std::vector<std::string> subNames = selection[0].getSubNames();
1764
    std::vector<dimVertex> allVertexes, carrierVertexes;
1765
    allVertexes = _getVertexInfo(objFeat, subNames);
1766
    if (!allVertexes.empty() && allVertexes.size() > 1) {
1767
        Base::Vector3d pMaster = allVertexes[0].point;
1768
        Base::Vector3d dirMaster = pMaster - allVertexes[1].point;
1769
        Base::Vector3d origin(0.0, 0.0, 0.0);
1770
        Base::Vector3d delta = DrawUtil::getTrianglePoint(pMaster, dirMaster, origin);
1771
        float dimDistance = activeDimAttributes.getCascadeSpacing();
1772
        delta = delta.Normalize() * dimDistance;
1773
        double scale = objFeat->getScale();
1774
        for (dimVertex oldVertex : allVertexes) {
1775
            Base::Vector3d nextPoint = DrawUtil::getTrianglePoint(pMaster, dirMaster, oldVertex.point);
1776
            nextPoint.y = -nextPoint.y;
1777
            oldVertex.point.y = -oldVertex.point.y;
1778
            if ((oldVertex.point - nextPoint).Length() > 0.01) {
1779
                Base::Vector3d cvPoint = CosmeticVertex::makeCanonicalPoint(objFeat, nextPoint);
1780
                std::string vertTag = objFeat->addCosmeticVertex(cvPoint);
1781
                int vertNumber = objFeat->add1CVToGV(vertTag);
1782
                std::stringstream ss;
1783
                ss << "Vertex" << vertNumber;
1784
                dimVertex newVertex;
1785
                newVertex.name = ss.str();
1786
                newVertex.point = nextPoint;
1787
                carrierVertexes.push_back(newVertex);
1788
                std::string edgeTag = objFeat->addCosmeticEdge(oldVertex.point / scale, nextPoint / scale);
1789
                auto edge = objFeat->getCosmeticEdge(edgeTag);
1790
                edge->m_format.m_style = 1;
1791
                edge->m_format.m_lineNumber = 1;
1792
                edge->m_format.m_weight = 0.15;
1793
                edge->m_format.m_color = App::Color(0.0f, 0.0f, 0.0f);
1794
            }
1795
            else
1796
                carrierVertexes.push_back(oldVertex);
1797
        }
1798
        dimVertex firstVertex = carrierVertexes[0];
1799
        dimVertex secondVertex = carrierVertexes[1];
1800
        std::sort(carrierVertexes.begin(), carrierVertexes.end(), sortX);
1801
        if (firstVertex.point.x > secondVertex.point.x) {
1802
            std::reverse(carrierVertexes.begin(), carrierVertexes.end());
1803
        }
1804
        double fontSize = Preferences::dimFontSizeMM();
1805
        for (long unsigned int n = 0; n < allVertexes.size() - 1; n++) {
1806
            TechDraw::DrawViewDimension* dim;
1807
            dim = _createLinDimension(cmd, objFeat, carrierVertexes[0].name, carrierVertexes[n + 1].name, "Distance");
1808
            TechDraw::pointPair pp = dim->getLinearPoints();
1809
            Base::Vector3d mid = (pp.first() + pp.second()) / 2.0 + delta * (n + 1);
1810
            dim->X.setValue(mid.x);
1811
            dim->Y.setValue(-mid.y + 0.5 * fontSize);
1812
        }
1813
    }
1814
    objFeat->refreshCEGeoms();
1815
    objFeat->requestPaint();
1816
    cmd->getSelection().clearSelection();
1817
    Gui::Command::commitCommand();
1818
}
1819

1820
DEF_STD_CMD_A(CmdTechDrawExtensionCreateObliqueCoordDimension)
1821

1822
CmdTechDrawExtensionCreateObliqueCoordDimension::CmdTechDrawExtensionCreateObliqueCoordDimension()
1823
    : Command("TechDraw_ExtensionCreateObliqueCoordDimension")
1824
{
1825
    sAppModule      = "TechDraw";
1826
    sGroup          = QT_TR_NOOP("TechDraw");
1827
    sMenuText       = QT_TR_NOOP("Create Oblique Coordinate Dimensions");
1828
    sToolTipText    = QT_TR_NOOP("Create multiple evenly spaced oblique dimensions starting from the same baseline:<br>\
1829
- Specify the cascade spacing (optional)<br>\
1830
- Select three or more vertexes<br>\
1831
- The selection order of the first two vertexes determines the position of the baseline<br>\
1832
- The first two vertexes also define the direction<br>\
1833
- Click this tool");
1834
    sWhatsThis      = "TechDraw_ExtensionCreateObliqueCoordDimension";
1835
    sStatusTip      = sMenuText;
1836
    sPixmap         = "TechDraw_ExtensionCreateObliqueCoordDimension";
1837
}
1838

1839
void CmdTechDrawExtensionCreateObliqueCoordDimension::activated(int iMsg)
1840
{
1841
    Q_UNUSED(iMsg);
1842
    execCreateObliqueCoordDimension(this);
1843
}
1844

1845
bool CmdTechDrawExtensionCreateObliqueCoordDimension::isActive()
1846
{
1847
    bool havePage = DrawGuiUtil::needPage(this);
1848
    bool haveView = DrawGuiUtil::needView(this);
1849
    return (havePage && haveView);
1850
}
1851

1852
//===========================================================================
1853
// TechDraw_ExtensionCreateCoordDimensionGroup
1854
//===========================================================================
1855

1856
DEF_STD_CMD_ACL(CmdTechDrawExtensionCreateCoordDimensionGroup)
1857

1858
CmdTechDrawExtensionCreateCoordDimensionGroup::CmdTechDrawExtensionCreateCoordDimensionGroup()
1859
    : Command("TechDraw_ExtensionCreateCoordDimensionGroup")
1860
{
1861
    sAppModule      = "TechDraw";
1862
    sGroup          = QT_TR_NOOP("TechDraw");
1863
    sMenuText       = QT_TR_NOOP("Create Horizontal Coordinate Dimensions");
1864
    sToolTipText    = QT_TR_NOOP("Create multiple evenly spaced horizontal dimensions starting from the same baseline:<br>\
1865
- Specify the cascade spacing (optional)<br>\
1866
- Select three or more vertexes<br>\
1867
- The selection order of the first two vertexes determines the position of the baseline<br>\
1868
- Click this tool");
1869
    sWhatsThis      = "TechDraw_ExtensionCreateCoordDimensionGroup";
1870
    sStatusTip      = sMenuText;
1871
}
1872

1873
void CmdTechDrawExtensionCreateCoordDimensionGroup::activated(int iMsg)
1874
{
1875
    //    Base::Console().Message("CMD::ExtensionCascadeDimansionGroup - activated(%d)\n", iMsg);
1876
    Gui::TaskView::TaskDialog* dlg = Gui::Control().activeDialog();
1877
    if (dlg) {
1878
        QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Task In Progress"),
1879
            QObject::tr("Close active task dialog and try again."));
1880
        return;
1881
    }
1882

1883
    Gui::ActionGroup* pcAction = qobject_cast<Gui::ActionGroup*>(_pcAction);
1884
    pcAction->setIcon(pcAction->actions().at(iMsg)->icon());
1885
    switch (iMsg) {
1886
    case 0:                 //create horizontal coordinate dimensions
1887
        execCreateHorizCoordDimension(this);
1888
        break;
1889
    case 1:                 //create vertical coordinate dimensions
1890
        execCreateVertCoordDimension(this);
1891
        break;
1892
    case 2:                 //create oblique coordinate dimensions
1893
        execCreateObliqueCoordDimension(this);
1894
        break;
1895
    default:
1896
        Base::Console().Message("CMD::CVGrp - invalid iMsg: %d\n", iMsg);
1897
    };
1898
}
1899

1900
Gui::Action* CmdTechDrawExtensionCreateCoordDimensionGroup::createAction()
1901
{
1902
    Gui::ActionGroup* pcAction = new Gui::ActionGroup(this, Gui::getMainWindow());
1903
    pcAction->setDropDownMenu(true);
1904
    applyCommandData(this->className(), pcAction);
1905

1906
    QAction* p1 = pcAction->addAction(QString());
1907
    p1->setIcon(Gui::BitmapFactory().iconFromTheme("TechDraw_ExtensionCreateHorizCoordDimension"));
1908
    p1->setObjectName(QString::fromLatin1("TechDraw_ExtensionCreateHorizCoordDimension"));
1909
    p1->setWhatsThis(QString::fromLatin1("TechDraw_ExtensionCreateHorizCoordDimension"));
1910
    QAction* p2 = pcAction->addAction(QString());
1911
    p2->setIcon(Gui::BitmapFactory().iconFromTheme("TechDraw_ExtensionCreateVertCoordDimension"));
1912
    p2->setObjectName(QString::fromLatin1("TechDraw_ExtensionCreateVertCoordDimension"));
1913
    p2->setWhatsThis(QString::fromLatin1("TechDraw_ExtensionCreateVertCoordDimension"));
1914
    QAction* p3 = pcAction->addAction(QString());
1915
    p3->setIcon(Gui::BitmapFactory().iconFromTheme("TechDraw_ExtensionCreateObliqueCoordDimension"));
1916
    p3->setObjectName(QString::fromLatin1("TechDraw_ExtensionCreateObliqueCoordDimension"));
1917
    p3->setWhatsThis(QString::fromLatin1("TechDraw_ExtensionCreateObliqueCoordDimension"));
1918

1919
    _pcAction = pcAction;
1920
    languageChange();
1921

1922
    pcAction->setIcon(p1->icon());
1923
    int defaultId = 0;
1924
    pcAction->setProperty("defaultAction", QVariant(defaultId));
1925

1926
    return pcAction;
1927
}
1928

1929
void CmdTechDrawExtensionCreateCoordDimensionGroup::languageChange()
1930
{
1931
    Command::languageChange();
1932

1933
    if (!_pcAction)
1934
        return;
1935
    Gui::ActionGroup* pcAction = qobject_cast<Gui::ActionGroup*>(_pcAction);
1936
    QList<QAction*> a = pcAction->actions();
1937

1938
    QAction* arc1 = a[0];
1939
    arc1->setText(QApplication::translate("CmdTechDrawExtensionCreateHorizCoordDimension", "Create Horizontal Coordinate Dimensions"));
1940
    arc1->setToolTip(QApplication::translate("CmdTechDrawExtensionCreateHorizCoordDimension",
1941
"Create multiple evenly spaced horizontal dimensions starting from the same baseline:<br>\
1942
- Specify the cascade spacing (optional)<br>\
1943
- Select three or more vertexes<br>\
1944
- The selection order of the first two vertexes determines the position of the baseline<br>\
1945
- Click this tool"));
1946
    arc1->setStatusTip(arc1->text());
1947
    QAction* arc2 = a[1];
1948
    arc2->setText(QApplication::translate("CmdTechDrawExtensionCreateVertCoordDimension", "Create Vertical Coordinate Dimensions"));
1949
    arc2->setToolTip(QApplication::translate("CmdTechDrawExtensionCreateVertCoordDimension",
1950
"Create multiple evenly spaced vertical dimensions starting from the same baseline:<br>\
1951
- Specify the cascade spacing (optional)<br>\
1952
- Select three or more vertexes<br>\
1953
- The selection order of the first two vertexes determines the position of the baseline<br>\
1954
- Click this tool"));
1955
    arc2->setStatusTip(arc2->text());
1956
    QAction* arc3 = a[2];
1957
    arc3->setText(QApplication::translate("CmdTechDrawExtensionCreateObliqueCoordDimension", "Create Oblique Coordinate Dimensions"));
1958
    arc3->setToolTip(QApplication::translate("CmdTechDrawExtensionCreateObliqueCoordDimension",
1959
"Create multiple evenly spaced oblique dimensions starting from the same baseline:<br>\
1960
- Specify the cascade spacing (optional)<br>\
1961
- Select three or more vertexes<br>\
1962
- The selection order of the first two vertexes determines the position of the baseline<br>\
1963
- The first two vertexes also define the direction<br>\
1964
- Click this tool"));
1965
    arc3->setStatusTip(arc3->text());
1966
}
1967

1968
bool CmdTechDrawExtensionCreateCoordDimensionGroup::isActive()
1969
{
1970
    bool havePage = DrawGuiUtil::needPage(this);
1971
    bool haveView = DrawGuiUtil::needView(this, true);
1972
    return (havePage && haveView);
1973
}
1974

1975
//===========================================================================
1976
// TechDraw_ExtensionCreateHorizChamferDimension
1977
//===========================================================================
1978

1979
void execCreateHorizChamferDimension(Gui::Command* cmd) {
1980
    //create a horizontal chamfer dimension
1981
    std::vector<Gui::SelectionObject> selection;
1982
    TechDraw::DrawViewPart* objFeat;
1983
    if (!_checkSelObjAndSubs(cmd, selection, objFeat, QT_TRANSLATE_NOOP("QObject","TechDraw Create Horizontal Chamfer Dimension"))) {
1984
        return;
1985
    }
1986

1987
    Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Create Horiz Chamfer Dim"));
1988
    const std::vector<std::string> subNames = selection[0].getSubNames();
1989
    std::vector<dimVertex> allVertexes;
1990
    allVertexes = _getVertexInfo(objFeat, subNames);
1991
    if (!allVertexes.empty() && allVertexes.size() > 1) {
1992
        const auto Pi180 = 180.0 / M_PI;
1993
        TechDraw::DrawViewDimension* dim;
1994
        dim = _createLinDimension(cmd, objFeat, allVertexes[0].name, allVertexes[1].name, "DistanceX");
1995
        float yMax = std::max(abs(allVertexes[0].point.y), abs(allVertexes[1].point.y)) + 7.0;
1996
        if (std::signbit(allVertexes[0].point.y))
1997
            yMax = -yMax;
1998
        TechDraw::pointPair pp = dim->getLinearPoints();
1999
        Base::Vector3d mid = (pp.first() + pp.second()) / 2.0;
2000
        dim->X.setValue(mid.x);
2001
        dim->Y.setValue(-yMax);
2002
        float dx = allVertexes[0].point.x - allVertexes[1].point.x;
2003
        float dy = allVertexes[0].point.y - allVertexes[1].point.y;
2004
        float alpha = round(abs(atan(dy / dx)) * Pi180);
2005
        std::string sAlpha = std::to_string((int)alpha);
2006
        std::string formatSpec = dim->FormatSpec.getStrValue();
2007
        formatSpec = formatSpec + " x" + sAlpha + "°";
2008
        dim->FormatSpec.setValue(formatSpec);
2009
        objFeat->requestPaint();
2010
        cmd->getSelection().clearSelection();
2011
    }
2012
    Gui::Command::commitCommand();
2013
}
2014

2015
DEF_STD_CMD_A(CmdTechDrawExtensionCreateHorizChamferDimension)
2016

2017
CmdTechDrawExtensionCreateHorizChamferDimension::CmdTechDrawExtensionCreateHorizChamferDimension()
2018
    : Command("TechDraw_ExtensionCreateHorizChamferDimension")
2019
{
2020
    sAppModule      = "TechDraw";
2021
    sGroup          = QT_TR_NOOP("TechDraw");
2022
    sMenuText       = QT_TR_NOOP("Create Horizontal Chamfer Dimension");
2023
    sToolTipText    = QT_TR_NOOP("Create a horizontal size and angle dimension for a chamfer:<br>\
2024
- Select two vertexes<br>\
2025
- Click this tool");
2026
    sWhatsThis      = "TechDraw_ExtensionCreateHorizChamferDimension";
2027
    sStatusTip      = sMenuText;
2028
    sPixmap         = "TechDraw_ExtensionCreateHorizChamferDimension";
2029
}
2030

2031
void CmdTechDrawExtensionCreateHorizChamferDimension::activated(int iMsg)
2032
{
2033
    Q_UNUSED(iMsg);
2034
    execCreateHorizChamferDimension(this);
2035
}
2036

2037
bool CmdTechDrawExtensionCreateHorizChamferDimension::isActive()
2038
{
2039
    bool havePage = DrawGuiUtil::needPage(this);
2040
    bool haveView = DrawGuiUtil::needView(this);
2041
    return (havePage && haveView);
2042
}
2043

2044
//===========================================================================
2045
// TechDraw_ExtensionCreateVertChamferDimension
2046
//===========================================================================
2047

2048
void execCreateVertChamferDimension(Gui::Command* cmd) {
2049
    //create a vertical chamfer dimension
2050
    std::vector<Gui::SelectionObject> selection;
2051
    TechDraw::DrawViewPart* objFeat;
2052
    if (!_checkSelObjAndSubs(cmd, selection, objFeat, QT_TRANSLATE_NOOP("QObject","TechDraw Create Vertical Chamfer Dimension"))) {
2053
        return;
2054
    }
2055

2056
    Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Create Vert Chamfer Dim"));
2057
    const std::vector<std::string> subNames = selection[0].getSubNames();
2058
    std::vector<dimVertex> allVertexes;
2059
    allVertexes = _getVertexInfo(objFeat, subNames);
2060
    if (!allVertexes.empty() && allVertexes.size() > 1) {
2061
        const auto Pi180 = 180.0 / M_PI;
2062
        TechDraw::DrawViewDimension* dim;
2063
        dim = _createLinDimension(cmd, objFeat, allVertexes[0].name, allVertexes[1].name, "DistanceY");
2064
        float xMax = std::max(abs(allVertexes[0].point.x), abs(allVertexes[1].point.x)) + 7.0;
2065
        if (std::signbit(allVertexes[0].point.x))
2066
            xMax = -xMax;
2067
        TechDraw::pointPair pp = dim->getLinearPoints();
2068
        Base::Vector3d mid = (pp.first() + pp.second()) / 2.0;
2069
        dim->X.setValue(xMax);
2070
        dim->Y.setValue(-mid.y);
2071
        float dx = allVertexes[0].point.x - allVertexes[1].point.x;
2072
        float dy = allVertexes[0].point.y - allVertexes[1].point.y;
2073
        float alpha = round(abs(atan(dx / dy)) * Pi180);
2074
        std::string sAlpha = std::to_string((int)alpha);
2075
        std::string formatSpec = dim->FormatSpec.getStrValue();
2076
        formatSpec = formatSpec + " x" + sAlpha + "°";
2077
        dim->FormatSpec.setValue(formatSpec);
2078
        objFeat->requestPaint();
2079
        cmd->getSelection().clearSelection();
2080
    }
2081
    Gui::Command::commitCommand();
2082
}
2083

2084
DEF_STD_CMD_A(CmdTechDrawExtensionCreateVertChamferDimension)
2085

2086
CmdTechDrawExtensionCreateVertChamferDimension::CmdTechDrawExtensionCreateVertChamferDimension()
2087
    : Command("TechDraw_ExtensionCreateVertChamferDimension")
2088
{
2089
    sAppModule      = "TechDraw";
2090
    sGroup          = QT_TR_NOOP("TechDraw");
2091
    sMenuText       = QT_TR_NOOP("Create Vertical Chamfer Dimension");
2092
    sToolTipText    = QT_TR_NOOP("Create a vertical size and angle dimension for a chamfer:<br>\
2093
- Select two vertexes<br>\
2094
- Click this tool");
2095
    sWhatsThis      = "TechDraw_ExtensionCreateVertChamferDimension";
2096
    sStatusTip      = sMenuText;
2097
    sPixmap         = "TechDraw_ExtensionCreateVertChamferDimension";
2098
}
2099

2100
void CmdTechDrawExtensionCreateVertChamferDimension::activated(int iMsg)
2101
{
2102
    Q_UNUSED(iMsg);
2103
    execCreateVertChamferDimension(this);
2104
}
2105

2106
bool CmdTechDrawExtensionCreateVertChamferDimension::isActive()
2107
{
2108
    bool havePage = DrawGuiUtil::needPage(this);
2109
    bool haveView = DrawGuiUtil::needView(this);
2110
    return (havePage && haveView);
2111
}
2112

2113
//===========================================================================
2114
// TechDraw_ExtensionChamferDimensionGroup
2115
//===========================================================================
2116

2117
DEF_STD_CMD_ACL(CmdTechDrawExtensionChamferDimensionGroup)
2118

2119
CmdTechDrawExtensionChamferDimensionGroup::CmdTechDrawExtensionChamferDimensionGroup()
2120
    : Command("TechDraw_ExtensionChamferDimensionGroup")
2121
{
2122
    sAppModule      = "TechDraw";
2123
    sGroup          = QT_TR_NOOP("TechDraw");
2124
    sMenuText       = QT_TR_NOOP("Create Horizontal Chamfer Dimension");
2125
    sToolTipText    = QT_TR_NOOP("Create a horizontal size and angle dimension for a chamfer:<br>\
2126
- Select two vertexes<br>\
2127
- Click this tool");
2128
    sWhatsThis      = "TechDraw_ExtensionChamferDimensionGroup";
2129
    sStatusTip      = sMenuText;
2130
}
2131

2132
void CmdTechDrawExtensionChamferDimensionGroup::activated(int iMsg)
2133
{
2134
    //    Base::Console().Message("CMD::ExtensionIncreaseDecreaseGroup - activated(%d)\n", iMsg);
2135
    Gui::TaskView::TaskDialog* dlg = Gui::Control().activeDialog();
2136
    if (dlg) {
2137
        QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Task In Progress"),
2138
            QObject::tr("Close active task dialog and try again."));
2139
        return;
2140
    }
2141

2142
    Gui::ActionGroup* pcAction = qobject_cast<Gui::ActionGroup*>(_pcAction);
2143
    pcAction->setIcon(pcAction->actions().at(iMsg)->icon());
2144
    switch (iMsg) {
2145
    case 0:                 //create a horizontal chamfer dimension
2146
        execCreateHorizChamferDimension(this);
2147
        break;
2148
    case 1:                 //create a vertical chamfer dimension
2149
        execCreateVertChamferDimension(this);
2150
        break;
2151
    default:
2152
        Base::Console().Message("CMD::CVGrp - invalid iMsg: %d\n", iMsg);
2153
    };
2154
}
2155

2156
Gui::Action* CmdTechDrawExtensionChamferDimensionGroup::createAction()
2157
{
2158
    Gui::ActionGroup* pcAction = new Gui::ActionGroup(this, Gui::getMainWindow());
2159
    pcAction->setDropDownMenu(true);
2160
    applyCommandData(this->className(), pcAction);
2161

2162
    QAction* p1 = pcAction->addAction(QString());
2163
    p1->setIcon(Gui::BitmapFactory().iconFromTheme("TechDraw_ExtensionCreateHorizChamferDimension"));
2164
    p1->setObjectName(QString::fromLatin1("TechDraw_ExtensionCreateHorizChamferDimension"));
2165
    p1->setWhatsThis(QString::fromLatin1("TechDraw_ExtensionCreateHorizChamferDimension"));
2166
    QAction* p2 = pcAction->addAction(QString());
2167
    p2->setIcon(Gui::BitmapFactory().iconFromTheme("TechDraw_ExtensionCreateVertChamferDimension"));
2168
    p2->setObjectName(QString::fromLatin1("TechDraw_ExtensionCreateVertChamferDimension"));
2169
    p2->setWhatsThis(QString::fromLatin1("TechDraw_ExtensionCreateVertChamferDimension"));
2170

2171
    _pcAction = pcAction;
2172
    languageChange();
2173

2174
    pcAction->setIcon(p1->icon());
2175
    int defaultId = 0;
2176
    pcAction->setProperty("defaultAction", QVariant(defaultId));
2177

2178
    return pcAction;
2179
}
2180

2181
void CmdTechDrawExtensionChamferDimensionGroup::languageChange()
2182
{
2183
    Command::languageChange();
2184

2185
    if (!_pcAction)
2186
        return;
2187
    Gui::ActionGroup* pcAction = qobject_cast<Gui::ActionGroup*>(_pcAction);
2188
    QList<QAction*> a = pcAction->actions();
2189

2190
    QAction* arc1 = a[0];
2191
    arc1->setText(QApplication::translate("CmdTechDrawExtensionCreateHorizChamferDimension", "Create Horizontal Chamfer Dimension"));
2192
    arc1->setToolTip(QApplication::translate("CmdTechDrawExtensionCreateHorizChamferDimension",
2193
"Create a horizontal size and angle dimension for a chamfer:<br>\
2194
- Select two vertexes<br>\
2195
- Click this tool"));
2196
    arc1->setStatusTip(arc1->text());
2197
    QAction* arc2 = a[1];
2198
    arc2->setText(QApplication::translate("CmdTechDrawExtensionCreateVertChamferDimension", "Create Vertical Chamfer Dimension"));
2199
    arc2->setToolTip(QApplication::translate("CmdTechDrawExtensionCreateVertChamferDimension",
2200
"Create a vertical size and angle dimension for a chamfer:<br>\
2201
- Select two vertexes<br>\
2202
- Click this tool"));
2203
    arc2->setStatusTip(arc2->text());
2204
}
2205

2206
bool CmdTechDrawExtensionChamferDimensionGroup::isActive()
2207
{
2208
    bool havePage = DrawGuiUtil::needPage(this);
2209
    bool haveView = DrawGuiUtil::needView(this, true);
2210
    return (havePage && haveView);
2211
}
2212

2213
//===========================================================================
2214
// TechDraw_ExtensionCreateLengthArc
2215
//===========================================================================
2216

2217
DEF_STD_CMD_A(CmdTechDrawExtensionCreateLengthArc)
2218

2219
CmdTechDrawExtensionCreateLengthArc::CmdTechDrawExtensionCreateLengthArc()
2220
    : Command("TechDraw_ExtensionCreateLengthArc")
2221
{
2222
    sAppModule      = "TechDraw";
2223
    sGroup          = QT_TR_NOOP("TechDraw");
2224
    sMenuText       = QT_TR_NOOP("Create Arc Length Dimension");
2225
    sToolTipText    = QT_TR_NOOP("Create an arc length dimension:<br>\
2226
- Select a single arc<br>\
2227
- Click this tool");
2228
    sWhatsThis      = "TechDraw_ExtensionCreateLengthArc";
2229
    sStatusTip      = sMenuText;
2230
    sPixmap         = "TechDraw_ExtensionCreateLengthArc";
2231
}
2232

2233
void CmdTechDrawExtensionCreateLengthArc::activated(int iMsg) {
2234
    // create arc length dimension
2235
    Q_UNUSED(iMsg);
2236
    std::vector<Gui::SelectionObject> selection;
2237
    TechDraw::DrawViewPart* objFeat;
2238
    if (!_checkSelObjAndSubs(this, selection, objFeat, QT_TRANSLATE_NOOP("QObject","TechDraw Create Arc Length Dimension"))) {
2239
        return;
2240
    }
2241

2242
    Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Create Arc Length Dim"));
2243
    const std::vector<std::string> subNames = selection[0].getSubNames();
2244
    int geoId = TechDraw::DrawUtil::getIndexFromName(subNames[0]);
2245
    TechDraw::BaseGeomPtr geom = objFeat->getGeomByIndex(geoId);
2246
    std::string geoType = TechDraw::DrawUtil::getGeomTypeFromName(subNames[0]);
2247
    if (geoType == "Edge" && geom->getGeomType() == TechDraw::ARCOFCIRCLE) {
2248
        TechDraw::AOCPtr arcTag = std::static_pointer_cast<TechDraw::AOC>(geom);
2249
        float radius = arcTag->radius;
2250
        Base::Vector3d centerPt = arcTag->center;
2251
        centerPt.y = -centerPt.y;
2252
        Base::Vector3d startPt = arcTag->startPnt;
2253
        startPt.y = -startPt.y;
2254
        Base::Vector3d endPt = arcTag->endPnt;
2255
        endPt.y = -endPt.y;
2256
        std::stringstream startName, endName, formatSpec;
2257
        double scale = objFeat->getScale();
2258
        Base::Vector3d cvPoint = CosmeticVertex::makeCanonicalPoint(objFeat, startPt);
2259
        std::string startVertTag = objFeat->addCosmeticVertex(cvPoint);
2260
        int startVertNumber = objFeat->add1CVToGV(startVertTag);
2261
        startName << "Vertex" << startVertNumber;
2262
        cvPoint = CosmeticVertex::makeCanonicalPoint(objFeat, endPt);
2263
        std::string endVertTag = objFeat->addCosmeticVertex(cvPoint);
2264
        int endVertNumber = objFeat->add1CVToGV(endVertTag);
2265
        endName << "Vertex" << endVertNumber;
2266
        TechDraw::DrawViewDimension* dim;
2267
        dim = _createLinDimension(this, objFeat, startName.str(), endName.str(), "Distance");
2268
        TechDraw::pointPair pp = dim->getLinearPoints();
2269
        Base::Vector3d mid = (pp.first() + pp.second()) / 2.0;
2270
        dim->X.setValue(mid.x);
2271
        dim->Y.setValue(-mid.y);
2272
        Base::Vector3d radVec1 = startPt - centerPt;
2273
        Base::Vector3d radVec2 = endPt - centerPt;
2274
        float alpha = acos((radVec1 * radVec2) / (radVec1.Length() * radVec2.Length()));
2275
        float arcLength = alpha * radius / scale;
2276
        dim->Arbitrary.setValue(true);
2277
        formatSpec << "◠ " << arcLength;
2278
        dim->FormatSpec.setValue(formatSpec.str());
2279
        objFeat->refreshCEGeoms();
2280
        objFeat->requestPaint();
2281
        getSelection().clearSelection();
2282
    }
2283
    Gui::Command::commitCommand();
2284
}
2285

2286
bool CmdTechDrawExtensionCreateLengthArc::isActive()
2287
{
2288
    bool havePage = DrawGuiUtil::needPage(this);
2289
    bool haveView = DrawGuiUtil::needView(this);
2290
    return (havePage && haveView);
2291
}
2292

2293
//===========================================================================
2294
// TechDraw_ExtensionCustomizeFormat
2295
//===========================================================================
2296

2297
DEF_STD_CMD_A(CmdTechDrawExtensionCustomizeFormat)
2298

2299
CmdTechDrawExtensionCustomizeFormat::CmdTechDrawExtensionCustomizeFormat()
2300
  : Command("TechDraw_ExtensionCustomizeFormat")
2301
{
2302
    sAppModule      = "TechDraw";
2303
    sGroup          = QT_TR_NOOP("TechDraw");
2304
    sMenuText       = QT_TR_NOOP("Customize Format Label");
2305
    sToolTipText    = QT_TR_NOOP("Select a dimension or a balloon<br>\
2306
    - click this tool<br>\
2307
    - edit the Format field, using the keyboard and/or the special buttons");
2308
    sWhatsThis      = "TechDraw_ExtensionCustomizeFormat";
2309
    sStatusTip      = sToolTipText;
2310
    sPixmap         = "TechDraw_ExtensionCustomizeFormat";
2311
}
2312

2313
void CmdTechDrawExtensionCustomizeFormat::activated(int iMsg)
2314
{
2315
    Q_UNUSED(iMsg);
2316
    std::vector<Gui::SelectionObject> selected;
2317
    if (!_checkSelection(this, selected, QT_TRANSLATE_NOOP("QObject","TechDraw Customize Format")))
2318
        return;
2319
    auto object = selected[0].getObject();
2320
    if (object->isDerivedFrom(TechDraw::DrawViewDimension::getClassTypeId()) ||
2321
        object->isDerivedFrom(TechDraw::DrawViewBalloon::getClassTypeId()))
2322
        Gui::Control().showDialog(new TaskDlgCustomizeFormat(object));
2323
}
2324

2325
bool CmdTechDrawExtensionCustomizeFormat::isActive()
2326
{
2327
    bool havePage = DrawGuiUtil::needPage(this);
2328
    bool haveView = DrawGuiUtil::needView(this);
2329
    return (havePage && haveView);
2330
}
2331

2332
namespace TechDrawGui {
2333
    //===========================================================================
2334
    // internal helper routines
2335
    //===========================================================================
2336

2337
    bool _checkSelection(Gui::Command* cmd,
2338
        std::vector<Gui::SelectionObject>& selection,
2339
        std::string message) {
2340
        // check selection of getSelectionEx()
2341
        selection = cmd->getSelection().getSelectionEx();
2342
        if (selection.empty()) {
2343
            QMessageBox::warning(Gui::getMainWindow(),
2344
                QObject::tr(message.c_str()),
2345
                QObject::tr("Selection is empty"));
2346
            return false;
2347
        }
2348
        return true;
2349
    }
2350

2351
    bool _checkSelAndObj(Gui::Command* cmd,
2352
        std::vector<Gui::SelectionObject>& selection,
2353
        TechDraw::DrawViewPart*& objFeat,
2354
        std::string message) {
2355
        // check selection of getSelectionEx() and selection[0].getObject()
2356
        if (_checkSelection(cmd, selection, message)) {
2357
            objFeat = dynamic_cast<TechDraw::DrawViewPart*>(selection[0].getObject());
2358
            if (!objFeat) {
2359
                QMessageBox::warning(Gui::getMainWindow(),
2360
                    QObject::tr(message.c_str()),
2361
                    QObject::tr("No object selected"));
2362
                return false;
2363
            }
2364
        } else {
2365
            // nothing selected
2366
            return false;
2367
        }
2368
        return true;
2369
    }
2370

2371
    bool _checkSelObjAndSubs(Gui::Command* cmd,
2372
        std::vector<Gui::SelectionObject>& selection,
2373
        TechDraw::DrawViewPart*& objFeat,
2374
        std::string message) {
2375
        // check selection of getSelectionEx() and selection[0].getObject()
2376
        if (_checkSelAndObj(cmd, selection, objFeat, message)) {
2377
            auto subs = selection[0].getSubNames();
2378
            if (subs.empty()) {
2379
                QMessageBox::warning(Gui::getMainWindow(),
2380
                    QObject::tr(message.c_str()),
2381
                    QObject::tr("No subelements selected"));
2382
                return false;
2383
            }
2384
        } else {
2385
            // nothing selected
2386
            return false;
2387
        }
2388
        return true;
2389
    }
2390
    TechDraw::DrawViewDimension* _createLinDimension(Gui::Command* cmd,
2391
        TechDraw::DrawViewPart* objFeat,
2392
        std::string startVertex,
2393
        std::string endVertex,
2394
        std::string dimType)
2395
        // create a new linear dimension
2396
    {
2397
        TechDraw::DrawPage* page = objFeat->findParentPage();
2398
        std::string PageName = page->getNameInDocument();
2399
        TechDraw::DrawViewDimension* dim = nullptr;
2400
        std::string FeatName = cmd->getUniqueObjectName("Dimension");
2401
        std::vector<App::DocumentObject*> objs;
2402
        std::vector<std::string> subs;
2403
        objs.push_back(objFeat);
2404
        objs.push_back(objFeat);
2405
        subs.push_back(startVertex);
2406
        subs.push_back(endVertex);
2407
        cmd->doCommand(cmd->Doc, "App.activeDocument().addObject('TechDraw::DrawViewDimension', '%s')", FeatName.c_str());
2408
        cmd->doCommand(cmd->Doc, "App.activeDocument().%s.Type = '%s'", FeatName.c_str(), dimType.c_str());
2409
        dim = dynamic_cast<TechDraw::DrawViewDimension*>(cmd->getDocument()->getObject(FeatName.c_str()));
2410
        if (!dim)
2411
            throw Base::TypeError("CmdTechDrawExtensionCreateLinDimension - dim not found\n");
2412
        dim->References2D.setValues(objs, subs);
2413
        cmd->doCommand(cmd->Doc, "App.activeDocument().%s.addView(App.activeDocument().%s)", PageName.c_str(), FeatName.c_str());
2414

2415
        // Touch the parent feature so the dimension in tree view appears as a child
2416
        objFeat->touch();
2417
        dim->recomputeFeature();
2418
        return dim;
2419
    }
2420

2421
    std::vector<dimVertex> _getVertexInfo(TechDraw::DrawViewPart* objFeat,
2422
        std::vector<std::string> subNames) {
2423
        // get subNames and coordinates of all selected vertexes
2424
        std::vector<dimVertex> vertexes;
2425
        dimVertex nextVertex;
2426
        for (const std::string& name : subNames) {
2427
            std::string geoType = TechDraw::DrawUtil::getGeomTypeFromName(name);
2428
            if (geoType == "Vertex") {
2429
                int geoId = TechDraw::DrawUtil::getIndexFromName(name);
2430
                TechDraw::VertexPtr vert = objFeat->getProjVertexByIndex(geoId);
2431
                nextVertex.name = name;
2432
                nextVertex.point.x = vert->point().x;
2433
                nextVertex.point.y = vert->point().y;
2434
                nextVertex.point.z = 0.0;
2435
                vertexes.push_back(nextVertex);
2436
            }
2437
        }
2438
        return vertexes;
2439
    }
2440

2441
    std::vector<TechDraw::DrawViewDimension*>_getDimensions(std::vector<Gui::SelectionObject> selection, std::string needDimType) {
2442
        // get all selected dimensions of type needDimType
2443
        std::vector<TechDraw::DrawViewDimension*> validDimension;
2444
        for (auto selected : selection) {
2445
            auto object = selected.getObject();
2446
            if (object->isDerivedFrom(TechDraw::DrawViewDimension::getClassTypeId())) {
2447
                auto dim = static_cast<TechDraw::DrawViewDimension*>(selected.getObject());
2448
                std::string dimType = dim->Type.getValueAsString();
2449
                if (dimType == needDimType)
2450
                    validDimension.push_back(dim);
2451
            }
2452
        }
2453
        return validDimension;
2454
    }
2455
}
2456

2457
//------------------------------------------------------------------------------
2458
void CreateTechDrawCommandsExtensionDims()
2459
{
2460
    Gui::CommandManager& rcCmdMgr = Gui::Application::Instance->commandManager();
2461

2462
    rcCmdMgr.addCommand(new CmdTechDrawExtensionInsertPrefixGroup());
2463
    rcCmdMgr.addCommand(new CmdTechDrawExtensionInsertDiameter());
2464
    rcCmdMgr.addCommand(new CmdTechDrawExtensionInsertSquare());
2465
    rcCmdMgr.addCommand(new CmdTechDrawExtensionInsertRepetition());
2466
    rcCmdMgr.addCommand(new CmdTechDrawExtensionRemovePrefixChar());
2467
    rcCmdMgr.addCommand(new CmdTechDrawExtensionIncreaseDecreaseGroup());
2468
    rcCmdMgr.addCommand(new CmdTechDrawExtensionIncreaseDecimal());
2469
    rcCmdMgr.addCommand(new CmdTechDrawExtensionDecreaseDecimal());
2470
    rcCmdMgr.addCommand(new CmdTechDrawExtensionPosChainDimensionGroup());
2471
    rcCmdMgr.addCommand(new CmdTechDrawExtensionPosHorizChainDimension());
2472
    rcCmdMgr.addCommand(new CmdTechDrawExtensionPosVertChainDimension());
2473
    rcCmdMgr.addCommand(new CmdTechDrawExtensionPosObliqueChainDimension());
2474
    rcCmdMgr.addCommand(new CmdTechDrawExtensionCascadeDimensionGroup());
2475
    rcCmdMgr.addCommand(new CmdTechDrawExtensionCascadeHorizDimension());
2476
    rcCmdMgr.addCommand(new CmdTechDrawExtensionCascadeVertDimension());
2477
    rcCmdMgr.addCommand(new CmdTechDrawExtensionCascadeObliqueDimension());
2478
    rcCmdMgr.addCommand(new CmdTechDrawExtensionCreateChainDimensionGroup());
2479
    rcCmdMgr.addCommand(new CmdTechDrawExtensionCreateHorizChainDimension());
2480
    rcCmdMgr.addCommand(new CmdTechDrawExtensionCreateVertChainDimension());
2481
    rcCmdMgr.addCommand(new CmdTechDrawExtensionCreateObliqueChainDimension());
2482
    rcCmdMgr.addCommand(new CmdTechDrawExtensionCreateCoordDimensionGroup());
2483
    rcCmdMgr.addCommand(new CmdTechDrawExtensionCreateHorizCoordDimension());
2484
    rcCmdMgr.addCommand(new CmdTechDrawExtensionCreateVertCoordDimension());
2485
    rcCmdMgr.addCommand(new CmdTechDrawExtensionCreateObliqueCoordDimension());
2486
    rcCmdMgr.addCommand(new CmdTechDrawExtensionChamferDimensionGroup());
2487
    rcCmdMgr.addCommand(new CmdTechDrawExtensionCreateHorizChamferDimension());
2488
    rcCmdMgr.addCommand(new CmdTechDrawExtensionCreateVertChamferDimension());
2489
    rcCmdMgr.addCommand(new CmdTechDrawExtensionCreateLengthArc());
2490
    rcCmdMgr.addCommand(new CmdTechDrawExtensionCustomizeFormat());
2491
}
2492

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.