Resolved issue #726. Improve Move tool. Add optional rotate option.
--HG-- branch : develop
|
@ -30,6 +30,7 @@
|
|||
- [#759] Add place label tool.
|
||||
- [#771] Improve tool Point at intersection of arc and line.
|
||||
- [#772] New tool Duplicate detail.
|
||||
- [#726] Improve Move tool. Add optional rotate option.
|
||||
|
||||
# Version 0.5.1
|
||||
- [#683] Tool Seam allowance's dialog is off screen on small resolutions.
|
||||
|
|
|
@ -1849,6 +1849,9 @@ void VToolOptionsPropertyBrowser::ChangeDataToolMove(VPE::VProperty *property)
|
|||
case 4: // AttrLength
|
||||
i->SetFormulaLength(value.value<VFormula>());
|
||||
break;
|
||||
case 42: // AttrRotationAngle
|
||||
i->SetFormulaRotationAngle(value.value<VFormula>());
|
||||
break;
|
||||
default:
|
||||
qWarning()<<"Unknown property type. id = "<<id;
|
||||
break;
|
||||
|
@ -2416,6 +2419,7 @@ void VToolOptionsPropertyBrowser::ShowOptionsToolMove(QGraphicsItem *item)
|
|||
AddPropertyOperationSuffix(i, tr("Suffix:"));
|
||||
AddPropertyFormula(tr("Angle:"), i->GetFormulaAngle(), AttrAngle);
|
||||
AddPropertyFormula(tr("Length:"), i->GetFormulaLength(), AttrLength);
|
||||
AddPropertyFormula(tr("Rotation angle:"), i->GetFormulaRotationAngle(), AttrRotationAngle);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
|
@ -3232,6 +3236,10 @@ void VToolOptionsPropertyBrowser::UpdateOptionsToolMove()
|
|||
QVariant valueLength;
|
||||
valueLength.setValue(i->GetFormulaLength());
|
||||
idToProperty[AttrLength]->setValue(valueLength);
|
||||
|
||||
QVariant valueRotationAngle;
|
||||
valueRotationAngle.setValue(i->GetFormulaRotationAngle());
|
||||
idToProperty[AttrRotationAngle]->setValue(valueRotationAngle);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
|
|
Before Width: | Height: | Size: 447 B After Width: | Height: | Size: 694 B |
Before Width: | Height: | Size: 963 B After Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 519 B After Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 963 B After Width: | Height: | Size: 2.2 KiB |
|
@ -13,11 +13,11 @@
|
|||
width="32"
|
||||
height="32"
|
||||
id="svg2985"
|
||||
inkscape:version="0.91 r"
|
||||
sodipodi:docname="moving.svg"
|
||||
inkscape:export-filename="/home/dismine/CAD/Valentina_0.5.x/valentina/src/app/valentina/share/resources/toolicon/32x32/moving@2x.png"
|
||||
inkscape:export-xdpi="183.09656"
|
||||
inkscape:export-ydpi="183.09656">
|
||||
inkscape:version="0.92.2 (unknown)"
|
||||
sodipodi:docname="move.svg"
|
||||
inkscape:export-filename="/home/dismine/CAD/Valentina_0.5.x/valentina/src/app/valentina/share/resources/toolicon/32x32/moving.png"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-ydpi="96">
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
|
@ -31,9 +31,9 @@
|
|||
inkscape:window-height="1056"
|
||||
id="namedview12"
|
||||
showgrid="false"
|
||||
inkscape:zoom="11.189427"
|
||||
inkscape:cx="-20.65711"
|
||||
inkscape:cy="17.916139"
|
||||
inkscape:zoom="7.9121197"
|
||||
inkscape:cx="26.876036"
|
||||
inkscape:cy="2.994024"
|
||||
inkscape:window-x="65"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-maximized="1"
|
||||
|
@ -125,17 +125,22 @@
|
|||
</metadata>
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#f70000;fill-opacity:1;stroke:#f70000;stroke-width:2.40142107;stroke-linejoin:round;stroke-miterlimit:4.9000001;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
style="fill:none;fill-opacity:1;stroke:#f70000;stroke-width:0.942;stroke-linejoin:round;stroke-miterlimit:4.9000001;stroke-dasharray:1.884,0.942;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="path2985-2-9-3-5"
|
||||
d="m 30.568187,4.1706391 a 2.6159858,2.697521 0 0 1 -5.231971,0 2.6159858,2.697521 0 1 1 5.231971,0 z" />
|
||||
d="m 27.614916,7.8995439 a 3.6438753,3.4726345 0 0 1 -7.28775,0 3.6438753,3.4726345 0 1 1 7.28775,0 z" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:2.56853676;stroke-linejoin:round;stroke-miterlimit:4.9000001;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1.99787223;stroke-linejoin:round;stroke-miterlimit:4.9000001;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="path2985-2-9-3"
|
||||
d="m 7.2847855,27.609193 a 2.8452232,2.8373884 0 0 1 -5.6904461,0 2.8452232,2.8373884 0 1 1 5.6904461,0 z" />
|
||||
d="m 5.8006808,28.556891 a 2.245837,2.1748076 0 0 1 -4.491674,0 2.245837,2.1748076 0 1 1 4.491674,0 z" />
|
||||
<path
|
||||
style="fill:#000000"
|
||||
d="m 11.486434,17.126775 c 2.481404,-2.537702 4.476369,-4.643916 4.433253,-4.680479 -0.04311,-0.03657 -1.317602,-0.561306 -2.832196,-1.166099 -1.514591,-0.604792 -2.814212,-1.144975 -2.88805,-1.200408 -0.160041,-0.1201531 -0.19441,-0.5437624 -0.0514,-0.6335841 0.05555,-0.034889 3.284489,-0.5101456 7.175416,-1.0561174 4.929476,-0.6916999 7.132384,-0.9638939 7.265617,-0.8977485 0.105166,0.052213 0.193428,0.1730439 0.196138,0.2685214 0.01187,0.4157045 -1.315064,13.7895066 -1.378777,13.8970036 -0.0937,0.158105 -0.525661,0.158503 -0.662446,6.27e-4 -0.05963,-0.06883 -0.656883,-1.257143 -1.327228,-2.640692 -0.670344,-1.383553 -1.268068,-2.600588 -1.328272,-2.704524 -0.09543,-0.164748 -0.696798,0.411264 -4.69077,4.492961 -2.519722,2.575067 -4.623899,4.682504 -4.675953,4.683197 -0.05205,6.8e-4 -0.9128181,-0.749445 -1.912808,-1.666958 C 7.6399461,22.749856 6.987936,22.08043 6.9827926,21.947499 6.9774627,21.809845 8.4825598,20.198776 11.486437,17.126747 Z"
|
||||
style="fill:#000000;stroke-width:0.76000571"
|
||||
d="m 8.1563158,20.824225 c 1.9000532,-1.914281 3.4276332,-3.503077 3.3946172,-3.530658 -0.03301,-0.02758 -1.008909,-0.423413 -2.1686596,-0.87963 -1.1597492,-0.456218 -2.1548917,-0.863698 -2.2114305,-0.905511 -0.1225468,-0.09064 -0.1488639,-0.41018 -0.03936,-0.477937 0.042538,-0.0263 2.5149915,-0.38482 5.4943411,-0.796669 3.774587,-0.521773 5.461392,-0.727099 5.56341,-0.677201 0.08053,0.03939 0.148112,0.130531 0.150187,0.202554 0.0091,0.313581 -1.006966,10.401929 -1.055753,10.483017 -0.07175,0.119264 -0.402509,0.11956 -0.507247,4.72e-4 -0.04566,-0.05192 -0.502986,-0.948309 -1.016282,-1.991969 -0.513294,-1.043666 -0.970982,-1.961719 -1.017081,-2.040122 -0.07306,-0.124274 -0.533551,0.310232 -3.591805,3.389206 -1.9293941,1.942465 -3.5405993,3.532182 -3.5804585,3.532705 -0.039858,5.13e-4 -0.6989601,-0.565333 -1.4646707,-1.257448 -0.8951316,-0.809115 -1.3943872,-1.314087 -1.3983256,-1.414362 -0.00408,-0.103826 1.148398,-1.319126 3.4485193,-3.63647 z"
|
||||
id="path3347"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3349"
|
||||
d="m 21.919204,15.169117 c -0.500441,-0.09947 -1.256361,-0.327666 -1.679806,-0.507122 -0.923565,-0.391401 -2.391376,-1.418481 -2.733125,-1.912462 -0.243152,-0.351474 -0.241173,-0.359861 0.158579,-0.672502 1.006199,-0.786947 0.958824,-0.782458 1.696912,-0.160744 0.839415,0.707067 2.114156,1.283502 3.261752,1.474958 1.756792,0.29309 3.647412,-0.308109 5.015549,-1.594906 2.386176,-2.2443084 2.398812,-5.737581 0.02892,-7.980996 -1.847632,-1.7489854 -4.518348,-2.1808945 -6.838263,-1.105887 -0.883611,0.4094496 -2.270077,1.6049981 -2.270077,1.9574827 0,0.1553101 0.301473,0.3650914 0.916178,0.6375406 0.503907,0.2233338 0.892626,0.4730278 0.863813,0.5548694 -0.08519,0.2421216 -4.873593,2.9103535 -4.99881,2.7854932 -0.09626,-0.095946 -0.843558,-4.938914 -0.84141,-5.4526815 3.79e-4,-0.1093782 0.291196,-0.028742 0.836603,0.2320163 0.45975,0.2198108 0.950253,0.3996539 1.089994,0.3996539 0.141775,0 0.484162,-0.2918891 0.774601,-0.6603454 0.902641,-1.1451311 2.290162,-2.0430747 4.018728,-2.60076543 1.066196,-0.3439928 3.407251,-0.3451049 4.479479,-0.002 2.699424,0.86346213 4.629396,2.71545813 5.404033,5.18567723 0.37727,1.2030819 0.34503,3.0596182 -0.07438,4.286049 -1.247296,3.646887 -5.24965,5.903878 -9.109162,5.136802 z"
|
||||
style="fill:#4c4c4e;stroke-width:0.1044118;stroke-miterlimit:4.9000001;stroke-dasharray:none" />
|
||||
</svg>
|
||||
|
|
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 7.1 KiB |
|
@ -3157,6 +3157,8 @@ void VPattern::ParseToolMove(VMainGraphicsScene *scene, QDomElement &domElement,
|
|||
ToolsCommonAttributes(domElement, initData.id);
|
||||
initData.formulaAngle = GetParametrString(domElement, AttrAngle, "0");
|
||||
const QString a = initData.formulaAngle;//need for saving fixed formula;
|
||||
initData.formulaRotationAngle = GetParametrString(domElement, AttrRotationAngle, "0");
|
||||
const QString r = initData.formulaRotationAngle;//need for saving fixed formula;
|
||||
initData.formulaLength = GetParametrString(domElement, AttrLength, "0");
|
||||
const QString len = initData.formulaLength;//need for saving fixed formula;
|
||||
initData.suffix = GetParametrString(domElement, AttrSuffix, "");
|
||||
|
@ -3165,9 +3167,10 @@ void VPattern::ParseToolMove(VMainGraphicsScene *scene, QDomElement &domElement,
|
|||
|
||||
VToolMove::Create(initData);
|
||||
//Rewrite attribute formula. Need for situation when we have wrong formula.
|
||||
if (a != initData.formulaAngle || len != initData.formulaLength)
|
||||
if (a != initData.formulaAngle || r != initData.formulaRotationAngle || len != initData.formulaLength)
|
||||
{
|
||||
SetAttribute(domElement, AttrAngle, initData.formulaAngle);
|
||||
SetAttribute(domElement, AttrRotationAngle, initData.formulaRotationAngle);
|
||||
SetAttribute(domElement, AttrLength, initData.formulaLength);
|
||||
modified = true;
|
||||
haveLiteChange();
|
||||
|
|
|
@ -43,6 +43,7 @@
|
|||
<file>schema/pattern/v0.6.6.xsd</file>
|
||||
<file>schema/pattern/v0.7.0.xsd</file>
|
||||
<file>schema/pattern/v0.7.1.xsd</file>
|
||||
<file>schema/pattern/v0.7.2.xsd</file>
|
||||
<file>schema/standard_measurements/v0.3.0.xsd</file>
|
||||
<file>schema/standard_measurements/v0.4.0.xsd</file>
|
||||
<file>schema/standard_measurements/v0.4.1.xsd</file>
|
||||
|
|
1044
src/libs/ifc/schema/pattern/v0.7.2.xsd
Normal file
|
@ -58,8 +58,8 @@ class QDomElement;
|
|||
*/
|
||||
|
||||
const QString VPatternConverter::PatternMinVerStr = QStringLiteral("0.1.0");
|
||||
const QString VPatternConverter::PatternMaxVerStr = QStringLiteral("0.7.1");
|
||||
const QString VPatternConverter::CurrentSchema = QStringLiteral("://schema/pattern/v0.7.1.xsd");
|
||||
const QString VPatternConverter::PatternMaxVerStr = QStringLiteral("0.7.2");
|
||||
const QString VPatternConverter::CurrentSchema = QStringLiteral("://schema/pattern/v0.7.2.xsd");
|
||||
|
||||
//VPatternConverter::PatternMinVer; // <== DON'T FORGET TO UPDATE TOO!!!!
|
||||
//VPatternConverter::PatternMaxVer; // <== DON'T FORGET TO UPDATE TOO!!!!
|
||||
|
@ -260,6 +260,8 @@ QString VPatternConverter::XSDSchema(int ver) const
|
|||
case (0x000700):
|
||||
return QStringLiteral("://schema/pattern/v0.7.0.xsd");
|
||||
case (0x000701):
|
||||
return QStringLiteral("://schema/pattern/v0.7.1.xsd");
|
||||
case (0x000702):
|
||||
return CurrentSchema;
|
||||
default:
|
||||
InvalidVersion(ver);
|
||||
|
@ -440,6 +442,10 @@ void VPatternConverter::ApplyPatches()
|
|||
ValidateXML(XSDSchema(0x000701), m_convertedFileName);
|
||||
V_FALLTHROUGH
|
||||
case (0x000701):
|
||||
ToV0_7_2();
|
||||
ValidateXML(XSDSchema(0x000702), m_convertedFileName);
|
||||
V_FALLTHROUGH
|
||||
case (0x000702):
|
||||
break;
|
||||
default:
|
||||
InvalidVersion(m_ver);
|
||||
|
@ -457,7 +463,7 @@ void VPatternConverter::DowngradeToCurrentMaxVersion()
|
|||
bool VPatternConverter::IsReadOnly() const
|
||||
{
|
||||
// Check if attribute readOnly was not changed in file format
|
||||
Q_STATIC_ASSERT_X(VPatternConverter::PatternMaxVer == CONVERTER_VERSION_CHECK(0, 7, 1),
|
||||
Q_STATIC_ASSERT_X(VPatternConverter::PatternMaxVer == CONVERTER_VERSION_CHECK(0, 7, 2),
|
||||
"Check attribute readOnly.");
|
||||
|
||||
// Possibly in future attribute readOnly will change position etc.
|
||||
|
@ -941,6 +947,16 @@ void VPatternConverter::ToV0_7_1()
|
|||
Save();
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void VPatternConverter::ToV0_7_2()
|
||||
{
|
||||
// TODO. Delete if minimal supported version is 0.7.2
|
||||
Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < CONVERTER_VERSION_CHECK(0, 7, 2),
|
||||
"Time to refactor the code.");
|
||||
SetVersion(QStringLiteral("0.7.2"));
|
||||
Save();
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void VPatternConverter::TagUnitToV0_2_0()
|
||||
{
|
||||
|
|
|
@ -53,7 +53,7 @@ public:
|
|||
static const QString PatternMaxVerStr;
|
||||
static const QString CurrentSchema;
|
||||
static Q_DECL_CONSTEXPR const int PatternMinVer = CONVERTER_VERSION_CHECK(0, 1, 0);
|
||||
static Q_DECL_CONSTEXPR const int PatternMaxVer = CONVERTER_VERSION_CHECK(0, 7, 1);
|
||||
static Q_DECL_CONSTEXPR const int PatternMaxVer = CONVERTER_VERSION_CHECK(0, 7, 2);
|
||||
|
||||
protected:
|
||||
virtual int MinVer() const Q_DECL_OVERRIDE;
|
||||
|
@ -114,6 +114,7 @@ private:
|
|||
void ToV0_6_6();
|
||||
void ToV0_7_0();
|
||||
void ToV0_7_1();
|
||||
void ToV0_7_2();
|
||||
|
||||
void TagUnitToV0_2_0();
|
||||
void TagIncrementToV0_2_0();
|
||||
|
|
|
@ -67,15 +67,20 @@ DialogMove::DialogMove(const VContainer *data, quint32 toolId, QWidget *parent)
|
|||
: DialogTool(data, toolId, parent),
|
||||
ui(new Ui::DialogMove),
|
||||
flagAngle(false),
|
||||
flagRotationAngle(false),
|
||||
flagLength(false),
|
||||
timerAngle(nullptr),
|
||||
timerRotationAngle(nullptr),
|
||||
timerLength(nullptr),
|
||||
formulaAngle(),
|
||||
formulaRotationAngle(),
|
||||
formulaLength(),
|
||||
formulaBaseHeightAngle(0),
|
||||
formulaBaseHeightRotationAngle(0),
|
||||
formulaBaseHeightLength(0),
|
||||
objects(),
|
||||
stage1(true),
|
||||
stage2(false),
|
||||
m_suffix()
|
||||
{
|
||||
ui->setupUi(this);
|
||||
|
@ -83,6 +88,9 @@ DialogMove::DialogMove(const VContainer *data, quint32 toolId, QWidget *parent)
|
|||
this->formulaBaseHeightAngle = ui->plainTextEditAngle->height();
|
||||
ui->plainTextEditAngle->installEventFilter(this);
|
||||
|
||||
this->formulaBaseHeightRotationAngle = ui->plainTextEditRotationAngle->height();
|
||||
ui->plainTextEditRotationAngle->installEventFilter(this);
|
||||
|
||||
this->formulaBaseHeightLength = ui->plainTextEditLength->height();
|
||||
ui->plainTextEditLength->installEventFilter(this);
|
||||
|
||||
|
@ -91,6 +99,9 @@ DialogMove::DialogMove(const VContainer *data, quint32 toolId, QWidget *parent)
|
|||
timerAngle = new QTimer(this);
|
||||
connect(timerAngle, &QTimer::timeout, this, &DialogMove::EvalAngle);
|
||||
|
||||
timerRotationAngle = new QTimer(this);
|
||||
connect(timerRotationAngle, &QTimer::timeout, this, &DialogMove::EvalRotationAngle);
|
||||
|
||||
timerLength = new QTimer(this);
|
||||
connect(timerLength, &QTimer::timeout, this, &DialogMove::EvalLength);
|
||||
|
||||
|
@ -101,10 +112,13 @@ DialogMove::DialogMove(const VContainer *data, quint32 toolId, QWidget *parent)
|
|||
|
||||
connect(ui->lineEditSuffix, &QLineEdit::textChanged, this, &DialogMove::SuffixChanged);
|
||||
connect(ui->toolButtonExprAngle, &QPushButton::clicked, this, &DialogMove::FXAngle);
|
||||
connect(ui->toolButtonExprRotationAngle, &QPushButton::clicked, this, &DialogMove::FXRotationAngle);
|
||||
connect(ui->toolButtonExprLength, &QPushButton::clicked, this, &DialogMove::FXLength);
|
||||
connect(ui->plainTextEditAngle, &QPlainTextEdit::textChanged, this, &DialogMove::AngleChanged);
|
||||
connect(ui->plainTextEditRotationAngle, &QPlainTextEdit::textChanged, this, &DialogMove::RotationAngleChanged);
|
||||
connect(ui->plainTextEditLength, &QPlainTextEdit::textChanged, this, &DialogMove::LengthChanged);
|
||||
connect(ui->pushButtonGrowAngle, &QPushButton::clicked, this, &DialogMove::DeployAngleTextEdit);
|
||||
connect(ui->pushButtonGrowRotationAngle, &QPushButton::clicked, this, &DialogMove::DeployRotationAngleTextEdit);
|
||||
connect(ui->pushButtonGrowLength, &QPushButton::clicked, this, &DialogMove::DeployLengthTextEdit);
|
||||
|
||||
vis = new VisToolMove(data);
|
||||
|
@ -164,6 +178,30 @@ void DialogMove::SetLength(const QString &value)
|
|||
MoveCursorToEnd(ui->plainTextEditLength);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
QString DialogMove::GetRotationAngle() const
|
||||
{
|
||||
return qApp->TrVars()->TryFormulaFromUser(formulaRotationAngle, qApp->Settings()->GetOsSeparator());
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void DialogMove::SetRotationAngle(const QString &value)
|
||||
{
|
||||
formulaRotationAngle = qApp->TrVars()->FormulaToUser(value, qApp->Settings()->GetOsSeparator());
|
||||
// increase height if needed.
|
||||
if (formulaRotationAngle.length() > 80)
|
||||
{
|
||||
this->DeployAngleTextEdit();
|
||||
}
|
||||
ui->plainTextEditRotationAngle->setPlainText(formulaRotationAngle);
|
||||
|
||||
VisToolMove *operation = qobject_cast<VisToolMove *>(vis);
|
||||
SCASSERT(operation != nullptr)
|
||||
operation->SetRotationAngle(formulaRotationAngle);
|
||||
|
||||
MoveCursorToEnd(ui->plainTextEditRotationAngle);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
QString DialogMove::GetSuffix() const
|
||||
{
|
||||
|
@ -219,22 +257,37 @@ void DialogMove::ShowDialog(bool click)
|
|||
scene->ToggleSplineHover(false);
|
||||
scene->ToggleSplinePathHover(false);
|
||||
}
|
||||
else if (not stage1 && prepare && click)
|
||||
else if (not stage2 && not stage1 && prepare && click)
|
||||
{
|
||||
VisToolMove *operation = qobject_cast<VisToolMove *>(vis);
|
||||
SCASSERT(operation != nullptr)
|
||||
|
||||
if (operation->LengthValue() > 0)
|
||||
{
|
||||
SetAngle(operation->Angle());//Show in dialog angle that a user choose
|
||||
SetLength(operation->Length());
|
||||
setModal(true);
|
||||
emit ToolTip("");
|
||||
timerAngle->start();
|
||||
timerLength->start();
|
||||
show();
|
||||
formulaAngle = qApp->TrVars()->FormulaToUser(operation->Angle(), qApp->Settings()->GetOsSeparator());
|
||||
formulaLength = qApp->TrVars()->FormulaToUser(operation->Length(), qApp->Settings()->GetOsSeparator());
|
||||
operation->SetAngle(formulaAngle);
|
||||
operation->SetLength(formulaLength);
|
||||
operation->RefreshGeometry();
|
||||
emit ToolTip(operation->CurrentToolTip());
|
||||
stage2 = true;
|
||||
}
|
||||
}
|
||||
else if (not stage1 && stage2 && prepare && click)
|
||||
{
|
||||
VisToolMove *operation = qobject_cast<VisToolMove *>(vis);
|
||||
SCASSERT(operation != nullptr)
|
||||
|
||||
SetAngle(qApp->TrVars()->FormulaFromUser(formulaAngle, qApp->Settings()->GetOsSeparator()));
|
||||
SetLength(qApp->TrVars()->FormulaFromUser(formulaLength, qApp->Settings()->GetOsSeparator()));
|
||||
SetRotationAngle(operation->RotationAngle());
|
||||
setModal(true);
|
||||
emit ToolTip("");
|
||||
timerAngle->start();
|
||||
timerRotationAngle->start();
|
||||
timerLength->start();
|
||||
show();
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
|
@ -271,6 +324,12 @@ void DialogMove::DeployAngleTextEdit()
|
|||
DeployFormula(ui->plainTextEditAngle, ui->pushButtonGrowAngle, formulaBaseHeightAngle);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void DialogMove::DeployRotationAngleTextEdit()
|
||||
{
|
||||
DeployFormula(ui->plainTextEditRotationAngle, ui->pushButtonGrowRotationAngle, formulaBaseHeightRotationAngle);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void DialogMove::DeployLengthTextEdit()
|
||||
{
|
||||
|
@ -285,6 +344,14 @@ void DialogMove::AngleChanged()
|
|||
ValFormulaChanged(flagAngle, ui->plainTextEditAngle, timerAngle, degreeSymbol);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void DialogMove::RotationAngleChanged()
|
||||
{
|
||||
labelEditFormula = ui->labelEditRotationAngle;
|
||||
labelResultCalculation = ui->labelResultRotationAngle;
|
||||
ValFormulaChanged(flagRotationAngle, ui->plainTextEditRotationAngle, timerRotationAngle, degreeSymbol);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void DialogMove::LengthChanged()
|
||||
{
|
||||
|
@ -307,6 +374,20 @@ void DialogMove::FXAngle()
|
|||
delete dialog;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void DialogMove::FXRotationAngle()
|
||||
{
|
||||
DialogEditWrongFormula *dialog = new DialogEditWrongFormula(data, toolId, this);
|
||||
dialog->setWindowTitle(tr("Edit rotation angle"));
|
||||
dialog->SetFormula(GetRotationAngle());
|
||||
dialog->setPostfix(degreeSymbol);
|
||||
if (dialog->exec() == QDialog::Accepted)
|
||||
{
|
||||
SetRotationAngle(dialog->GetFormula());
|
||||
}
|
||||
delete dialog;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void DialogMove::FXLength()
|
||||
{
|
||||
|
@ -365,7 +446,7 @@ void DialogMove::SuffixChanged()
|
|||
void DialogMove::CheckState()
|
||||
{
|
||||
SCASSERT(bOk != nullptr)
|
||||
bOk->setEnabled(flagAngle && flagLength && flagName);
|
||||
bOk->setEnabled(flagAngle && flagRotationAngle && flagLength && flagName);
|
||||
SCASSERT(bApply != nullptr)
|
||||
bApply->setEnabled(bOk->isEnabled());
|
||||
}
|
||||
|
@ -384,6 +465,9 @@ void DialogMove::SaveData()
|
|||
formulaAngle = ui->plainTextEditAngle->toPlainText();
|
||||
formulaAngle.replace("\n", " ");
|
||||
|
||||
formulaRotationAngle = ui->plainTextEditRotationAngle->toPlainText();
|
||||
formulaRotationAngle.replace("\n", " ");
|
||||
|
||||
formulaLength = ui->plainTextEditLength->toPlainText();
|
||||
formulaLength.replace("\n", " ");
|
||||
|
||||
|
@ -393,6 +477,7 @@ void DialogMove::SaveData()
|
|||
operation->SetObjects(objects.toVector());
|
||||
operation->SetAngle(formulaAngle);
|
||||
operation->SetLength(formulaLength);
|
||||
operation->SetRotationAngle(formulaRotationAngle);
|
||||
operation->RefreshGeometry();
|
||||
}
|
||||
|
||||
|
@ -400,6 +485,7 @@ void DialogMove::SaveData()
|
|||
void DialogMove::closeEvent(QCloseEvent *event)
|
||||
{
|
||||
ui->plainTextEditAngle->blockSignals(true);
|
||||
ui->plainTextEditRotationAngle->blockSignals(true);
|
||||
ui->plainTextEditLength->blockSignals(true);
|
||||
DialogTool::closeEvent(event);
|
||||
}
|
||||
|
@ -411,6 +497,14 @@ void DialogMove::EvalAngle()
|
|||
Eval(ui->plainTextEditAngle->toPlainText(), flagAngle, ui->labelResultAngle, degreeSymbol, false);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void DialogMove::EvalRotationAngle()
|
||||
{
|
||||
labelEditFormula = ui->labelEditRotationAngle;
|
||||
Eval(ui->plainTextEditRotationAngle->toPlainText(), flagRotationAngle, ui->labelResultRotationAngle, degreeSymbol,
|
||||
false);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void DialogMove::EvalLength()
|
||||
{
|
||||
|
|
|
@ -59,6 +59,9 @@ public:
|
|||
QString GetLength() const;
|
||||
void SetLength(const QString &value);
|
||||
|
||||
QString GetRotationAngle() const;
|
||||
void SetRotationAngle(const QString &value);
|
||||
|
||||
QString GetSuffix() const;
|
||||
void SetSuffix(const QString &value);
|
||||
|
||||
|
@ -73,12 +76,15 @@ public slots:
|
|||
private slots:
|
||||
/** @brief DeployAngleTextEdit grow or shrink formula input */
|
||||
void DeployAngleTextEdit();
|
||||
void DeployRotationAngleTextEdit();
|
||||
void DeployLengthTextEdit();
|
||||
|
||||
void AngleChanged();
|
||||
void RotationAngleChanged();
|
||||
void LengthChanged();
|
||||
|
||||
void FXAngle();
|
||||
void FXRotationAngle();
|
||||
void FXLength();
|
||||
|
||||
void SuffixChanged();
|
||||
|
@ -97,31 +103,33 @@ private:
|
|||
|
||||
/** @brief flagAngle true if value of angle is correct */
|
||||
bool flagAngle;
|
||||
|
||||
bool flagRotationAngle;
|
||||
bool flagLength;
|
||||
|
||||
/** @brief timerAngle timer of check formula of angle */
|
||||
QTimer *timerAngle;
|
||||
|
||||
QTimer *timerRotationAngle;
|
||||
QTimer *timerLength;
|
||||
|
||||
/** @brief angle formula of angle */
|
||||
QString formulaAngle;
|
||||
|
||||
QString formulaRotationAngle;
|
||||
QString formulaLength;
|
||||
|
||||
/** @brief formulaBaseHeightAngle base height defined by dialogui */
|
||||
int formulaBaseHeightAngle;
|
||||
|
||||
int formulaBaseHeightRotationAngle;
|
||||
int formulaBaseHeightLength;
|
||||
|
||||
QList<quint32> objects;
|
||||
|
||||
bool stage1;
|
||||
bool stage2;
|
||||
|
||||
QString m_suffix;
|
||||
|
||||
void EvalAngle();
|
||||
void EvalRotationAngle();
|
||||
void EvalLength();
|
||||
};
|
||||
|
||||
|
|
|
@ -6,8 +6,8 @@
|
|||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>285</width>
|
||||
<height>232</height>
|
||||
<width>292</width>
|
||||
<height>301</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
|
@ -378,6 +378,186 @@
|
|||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_4">
|
||||
<item alignment="Qt::AlignLeft">
|
||||
<widget class="QLabel" name="labelEditRotationAngle">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="palette">
|
||||
<palette>
|
||||
<active>
|
||||
<colorrole role="WindowText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</active>
|
||||
<inactive>
|
||||
<colorrole role="WindowText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</inactive>
|
||||
<disabled>
|
||||
<colorrole role="WindowText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>159</red>
|
||||
<green>158</green>
|
||||
<blue>158</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</disabled>
|
||||
</palette>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Rotation angle:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_3">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item alignment="Qt::AlignRight">
|
||||
<widget class="QToolButton" name="toolButtonExprRotationAngle">
|
||||
<property name="toolTip">
|
||||
<string>Formula wizard</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string notr="true">...</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../../../vmisc/share/resources/icon.qrc">
|
||||
<normaloff>:/icon/24x24/fx.png</normaloff>:/icon/24x24/fx.png</iconset>
|
||||
</property>
|
||||
<property name="iconSize">
|
||||
<size>
|
||||
<width>24</width>
|
||||
<height>24</height>
|
||||
</size>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item alignment="Qt::AlignRight">
|
||||
<widget class="QLabel" name="label_4">
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="pixmap">
|
||||
<pixmap resource="../../../vmisc/share/resources/icon.qrc">:/icon/24x24/equal.png</pixmap>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item alignment="Qt::AlignRight">
|
||||
<widget class="QLabel" name="labelResultRotationAngle">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>87</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Value</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string notr="true">_</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_8">
|
||||
<item>
|
||||
<widget class="QPlainTextEdit" name="plainTextEditRotationAngle">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>16777215</width>
|
||||
<height>28</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Calculation</string>
|
||||
</property>
|
||||
<property name="tabChangesFocus">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButtonGrowRotationAngle">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>18</width>
|
||||
<height>18</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="sizeIncrement">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string><html><head/><body><p>Show full calculation in message box</p></body></html></string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string notr="true"/>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset theme="go-down">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="iconSize">
|
||||
<size>
|
||||
<width>16</width>
|
||||
<height>16</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="flat">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
||||
<item>
|
||||
|
|
|
@ -74,6 +74,50 @@ template <class T> class QSharedPointer;
|
|||
|
||||
const QString VToolMove::ToolType = QStringLiteral("moving");
|
||||
|
||||
namespace
|
||||
{
|
||||
QT_WARNING_PUSH
|
||||
QT_WARNING_DISABLE_GCC("-Wswitch-default")
|
||||
QPointF GetOriginPoint(const QVector<quint32> objects, const VContainer *data, qreal calcLength, qreal calcAngle)
|
||||
{
|
||||
QPolygonF originObjects;
|
||||
|
||||
for (int i = 0; i < objects.size(); ++i)
|
||||
{
|
||||
const quint32 id = objects.at(i);
|
||||
const QSharedPointer<VGObject> obj = data->GetGObject(id);
|
||||
|
||||
// This check helps to find missed objects in the switch
|
||||
Q_STATIC_ASSERT_X(static_cast<int>(GOType::Unknown) == 8, "Not all objects were handled.");
|
||||
|
||||
switch(static_cast<GOType>(obj->getType()))
|
||||
{
|
||||
case GOType::Point:
|
||||
originObjects.append(data->GeometricObject<VPointF>(id)->toQPointF());
|
||||
break;
|
||||
case GOType::Arc:
|
||||
case GOType::EllipticalArc:
|
||||
case GOType::Spline:
|
||||
case GOType::SplinePath:
|
||||
case GOType::CubicBezier:
|
||||
case GOType::CubicBezierPath:
|
||||
originObjects.append(data->GeometricObject<VAbstractCurve>(id)->GetPoints());
|
||||
break;
|
||||
case GOType::Unknown:
|
||||
case GOType::PlaceLabel:
|
||||
Q_UNREACHABLE();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
QPointF rotationOrigin = originObjects.boundingRect().center();
|
||||
QLineF move(rotationOrigin, QPointF(rotationOrigin.x()+calcLength, rotationOrigin.y()));
|
||||
move.setAngle(calcAngle);
|
||||
return move.p2();
|
||||
}
|
||||
QT_WARNING_POP
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void VToolMove::setDialog()
|
||||
{
|
||||
|
@ -81,6 +125,7 @@ void VToolMove::setDialog()
|
|||
QSharedPointer<DialogMove> dialogTool = m_dialog.objectCast<DialogMove>();
|
||||
SCASSERT(not dialogTool.isNull())
|
||||
dialogTool->SetAngle(formulaAngle);
|
||||
dialogTool->SetRotationAngle(formulaRotationAngle);
|
||||
dialogTool->SetLength(formulaLength);
|
||||
dialogTool->SetSuffix(suffix);
|
||||
}
|
||||
|
@ -95,6 +140,7 @@ VToolMove *VToolMove::Create(QSharedPointer<DialogTool> dialog, VMainGraphicsSce
|
|||
|
||||
VToolMoveInitData initData;
|
||||
initData.formulaAngle = dialogTool->GetAngle();
|
||||
initData.formulaRotationAngle = dialogTool->GetRotationAngle();
|
||||
initData.formulaLength = dialogTool->GetLength();
|
||||
initData.suffix = dialogTool->GetSuffix();
|
||||
initData.source = dialogTool->GetObjects();
|
||||
|
@ -116,11 +162,15 @@ VToolMove *VToolMove::Create(QSharedPointer<DialogTool> dialog, VMainGraphicsSce
|
|||
VToolMove *VToolMove::Create(VToolMoveInitData &initData)
|
||||
{
|
||||
qreal calcAngle = 0;
|
||||
qreal calcRotationAngle = 0;
|
||||
qreal calcLength = 0;
|
||||
|
||||
calcAngle = CheckFormula(initData.id, initData.formulaAngle, initData.data);
|
||||
calcRotationAngle = CheckFormula(initData.id, initData.formulaRotationAngle, initData.data);
|
||||
calcLength = qApp->toPixel(CheckFormula(initData.id, initData.formulaLength, initData.data));
|
||||
|
||||
const QPointF rotationOrigin = GetOriginPoint(initData.source, initData.data, calcLength, calcAngle);
|
||||
|
||||
if (initData.typeCreation == Source::FromGui)
|
||||
{
|
||||
initData.destination.clear();// Try to avoid mistake, value must be empty
|
||||
|
@ -141,32 +191,40 @@ QT_WARNING_DISABLE_GCC("-Wswitch-default")
|
|||
{
|
||||
case GOType::Point:
|
||||
initData.destination.append(CreatePoint(initData.id, idObject, calcAngle, calcLength,
|
||||
initData.suffix, initData.data));
|
||||
calcRotationAngle, rotationOrigin, initData.suffix,
|
||||
initData.data));
|
||||
break;
|
||||
case GOType::Arc:
|
||||
initData.destination.append(CreateArc<VArc>(initData.id, idObject, calcAngle, calcLength,
|
||||
initData.suffix, initData.data));
|
||||
calcRotationAngle, rotationOrigin, initData.suffix,
|
||||
initData.data));
|
||||
break;
|
||||
case GOType::EllipticalArc:
|
||||
initData.destination.append(CreateArc<VEllipticalArc>(initData.id, idObject, calcAngle, calcLength,
|
||||
calcRotationAngle, rotationOrigin,
|
||||
initData.suffix, initData.data));
|
||||
break;
|
||||
case GOType::Spline:
|
||||
initData.destination.append(CreateCurve<VSpline>(initData.id, idObject, calcAngle, calcLength,
|
||||
initData.suffix, initData.data));
|
||||
calcRotationAngle, rotationOrigin, initData.suffix,
|
||||
initData.data));
|
||||
break;
|
||||
case GOType::SplinePath:
|
||||
initData.destination.append(CreateCurveWithSegments<VSplinePath>(initData.id, idObject, calcAngle,
|
||||
calcLength, initData.suffix,
|
||||
calcLength, calcRotationAngle,
|
||||
rotationOrigin, initData.suffix,
|
||||
initData.data));
|
||||
break;
|
||||
case GOType::CubicBezier:
|
||||
initData.destination.append(CreateCurve<VCubicBezier>(initData.id, idObject, calcAngle, calcLength,
|
||||
calcRotationAngle, rotationOrigin,
|
||||
initData.suffix, initData.data));
|
||||
break;
|
||||
case GOType::CubicBezierPath:
|
||||
initData.destination.append(CreateCurveWithSegments<VCubicBezierPath>(initData.id, idObject,
|
||||
calcAngle, calcLength,
|
||||
calcRotationAngle,
|
||||
rotationOrigin,
|
||||
initData.suffix,
|
||||
initData.data));
|
||||
break;
|
||||
|
@ -193,31 +251,35 @@ QT_WARNING_DISABLE_GCC("-Wswitch-default")
|
|||
switch(static_cast<GOType>(obj->getType()))
|
||||
{
|
||||
case GOType::Point:
|
||||
UpdatePoint(initData.id, idObject, calcAngle, calcLength, initData.suffix, initData.data,
|
||||
initData.destination.at(i));
|
||||
UpdatePoint(initData.id, idObject, calcAngle, calcLength, calcRotationAngle, rotationOrigin,
|
||||
initData.suffix, initData.data, initData.destination.at(i));
|
||||
break;
|
||||
case GOType::Arc:
|
||||
UpdateArc<VArc>(initData.id, idObject, calcAngle, calcLength, initData.suffix, initData.data,
|
||||
initData.destination.at(i).id);
|
||||
UpdateArc<VArc>(initData.id, idObject, calcAngle, calcLength, calcRotationAngle, rotationOrigin,
|
||||
initData.suffix, initData.data, initData.destination.at(i).id);
|
||||
break;
|
||||
case GOType::EllipticalArc:
|
||||
UpdateArc<VEllipticalArc>(initData.id, idObject, calcAngle, calcLength, initData.suffix,
|
||||
initData.data, initData.destination.at(i).id);
|
||||
UpdateArc<VEllipticalArc>(initData.id, idObject, calcAngle, calcLength, calcRotationAngle,
|
||||
rotationOrigin, initData.suffix, initData.data,
|
||||
initData.destination.at(i).id);
|
||||
break;
|
||||
case GOType::Spline:
|
||||
UpdateCurve<VSpline>(initData.id, idObject, calcAngle, calcLength, initData.suffix, initData.data,
|
||||
initData.destination.at(i).id);
|
||||
UpdateCurve<VSpline>(initData.id, idObject, calcAngle, calcLength, calcRotationAngle,
|
||||
rotationOrigin, initData.suffix, initData.data, initData.destination.at(i).id);
|
||||
break;
|
||||
case GOType::SplinePath:
|
||||
UpdateCurveWithSegments<VSplinePath>(initData.id, idObject, calcAngle, calcLength, initData.suffix,
|
||||
UpdateCurveWithSegments<VSplinePath>(initData.id, idObject, calcAngle, calcLength,
|
||||
calcRotationAngle, rotationOrigin,initData.suffix,
|
||||
initData.data, initData.destination.at(i).id);
|
||||
break;
|
||||
case GOType::CubicBezier:
|
||||
UpdateCurve<VCubicBezier>(initData.id, idObject, calcAngle, calcLength, initData.suffix,
|
||||
initData.data, initData.destination.at(i).id);
|
||||
UpdateCurve<VCubicBezier>(initData.id, idObject, calcAngle, calcLength, calcRotationAngle,
|
||||
rotationOrigin,initData.suffix, initData.data,
|
||||
initData.destination.at(i).id);
|
||||
break;
|
||||
case GOType::CubicBezierPath:
|
||||
UpdateCurveWithSegments<VCubicBezierPath>(initData.id, idObject, calcAngle, calcLength,
|
||||
calcRotationAngle, rotationOrigin,
|
||||
initData.suffix, initData.data,
|
||||
initData.destination.at(i).id);
|
||||
break;
|
||||
|
@ -272,6 +334,28 @@ void VToolMove::SetFormulaAngle(const VFormula &value)
|
|||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
VFormula VToolMove::GetFormulaRotationAngle() const
|
||||
{
|
||||
VFormula fAngle(formulaRotationAngle, getData());
|
||||
fAngle.setCheckZero(false);
|
||||
fAngle.setToolId(m_id);
|
||||
fAngle.setPostfix(degreeSymbol);
|
||||
return fAngle;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void VToolMove::SetFormulaRotationAngle(const VFormula &value)
|
||||
{
|
||||
if (value.error() == false)
|
||||
{
|
||||
formulaRotationAngle = value.GetFormula(FormulaType::FromUser);
|
||||
|
||||
QSharedPointer<VGObject> obj = VContainer::GetFakeGObject(m_id);
|
||||
SaveOption(obj);
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
VFormula VToolMove::GetFormulaLength() const
|
||||
{
|
||||
|
@ -324,6 +408,8 @@ void VToolMove::SetVisualization()
|
|||
|
||||
visual->SetObjects(source);
|
||||
visual->SetAngle(qApp->TrVars()->FormulaToUser(formulaAngle, qApp->Settings()->GetOsSeparator()));
|
||||
visual->SetRotationAngle(qApp->TrVars()->FormulaToUser(formulaRotationAngle,
|
||||
qApp->Settings()->GetOsSeparator()));
|
||||
visual->SetLength(qApp->TrVars()->FormulaToUser(formulaLength, qApp->Settings()->GetOsSeparator()));
|
||||
visual->RefreshGeometry();
|
||||
}
|
||||
|
@ -349,6 +435,7 @@ void VToolMove::SaveDialog(QDomElement &domElement, QList<quint32> &oldDependenc
|
|||
void VToolMove::ReadToolAttributes(const QDomElement &domElement)
|
||||
{
|
||||
formulaAngle = doc->GetParametrString(domElement, AttrAngle, "0");
|
||||
formulaRotationAngle = doc->GetParametrString(domElement, AttrRotationAngle, "0");
|
||||
formulaLength = doc->GetParametrString(domElement, AttrLength, "0");
|
||||
suffix = doc->GetParametrString(domElement, AttrSuffix);
|
||||
}
|
||||
|
@ -360,6 +447,7 @@ void VToolMove::SaveOptions(QDomElement &tag, QSharedPointer<VGObject> &obj)
|
|||
|
||||
doc->SetAttribute(tag, AttrType, ToolType);
|
||||
doc->SetAttribute(tag, AttrAngle, formulaAngle);
|
||||
doc->SetAttribute(tag, AttrRotationAngle, formulaRotationAngle);
|
||||
doc->SetAttribute(tag, AttrLength, formulaLength);
|
||||
doc->SetAttribute(tag, AttrSuffix, suffix);
|
||||
|
||||
|
@ -384,6 +472,7 @@ VToolMove::VToolMove(const VToolMoveInitData &initData, QGraphicsItem *parent)
|
|||
: VAbstractOperation(initData.doc, initData.data, initData.id, initData.suffix, initData.source,
|
||||
initData.destination, parent),
|
||||
formulaAngle(initData.formulaAngle),
|
||||
formulaRotationAngle(initData.formulaRotationAngle),
|
||||
formulaLength(initData.formulaLength)
|
||||
{
|
||||
InitOperatedObjects();
|
||||
|
@ -392,10 +481,11 @@ VToolMove::VToolMove(const VToolMoveInitData &initData, QGraphicsItem *parent)
|
|||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
DestinationItem VToolMove::CreatePoint(quint32 idTool, quint32 idItem, qreal angle,
|
||||
qreal length, const QString &suffix, VContainer *data)
|
||||
qreal length, qreal rotationAngle, const QPointF &rotationOrigin,
|
||||
const QString &suffix, VContainer *data)
|
||||
{
|
||||
const QSharedPointer<VPointF> point = data->GeometricObject<VPointF>(idItem);
|
||||
VPointF moved = point->Move(length, angle, suffix);
|
||||
VPointF moved = point->Move(length, angle, suffix).Rotate(rotationOrigin, rotationAngle);
|
||||
moved.setIdObject(idTool);
|
||||
|
||||
DestinationItem item;
|
||||
|
@ -408,20 +498,22 @@ DestinationItem VToolMove::CreatePoint(quint32 idTool, quint32 idItem, qreal ang
|
|||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
template <class Item>
|
||||
DestinationItem VToolMove::CreateArc(quint32 idTool, quint32 idItem, qreal angle, qreal length, const QString &suffix,
|
||||
VContainer *data)
|
||||
DestinationItem VToolMove::CreateArc(quint32 idTool, quint32 idItem, qreal angle, qreal length, qreal rotationAngle,
|
||||
const QPointF &rotationOrigin, const QString &suffix, VContainer *data)
|
||||
{
|
||||
const DestinationItem item = CreateItem<Item>(idTool, idItem, angle, length, suffix, data);
|
||||
const DestinationItem item = CreateItem<Item>(idTool, idItem, angle, length, rotationAngle, rotationOrigin, suffix,
|
||||
data);
|
||||
data->AddArc(data->GeometricObject<Item>(item.id), item.id);
|
||||
return item;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void VToolMove::UpdatePoint(quint32 idTool, quint32 idItem, qreal angle, qreal length, const QString &suffix,
|
||||
VContainer *data, const DestinationItem &item)
|
||||
void VToolMove::UpdatePoint(quint32 idTool, quint32 idItem, qreal angle, qreal length, qreal rotationAngle,
|
||||
const QPointF &rotationOrigin, const QString &suffix, VContainer *data,
|
||||
const DestinationItem &item)
|
||||
{
|
||||
const QSharedPointer<VPointF> point = data->GeometricObject<VPointF>(idItem);
|
||||
VPointF moved = point->Move(length, angle, suffix);
|
||||
VPointF moved = point->Move(length, angle, suffix).Rotate(rotationOrigin, rotationAngle);
|
||||
moved.setIdObject(idTool);
|
||||
moved.setMx(item.mx);
|
||||
moved.setMy(item.my);
|
||||
|
@ -431,20 +523,20 @@ void VToolMove::UpdatePoint(quint32 idTool, quint32 idItem, qreal angle, qreal l
|
|||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
template <class Item>
|
||||
void VToolMove::UpdateArc(quint32 idTool, quint32 idItem, qreal angle, qreal length, const QString &suffix,
|
||||
VContainer *data, quint32 id)
|
||||
void VToolMove::UpdateArc(quint32 idTool, quint32 idItem, qreal angle, qreal length, qreal rotationAngle,
|
||||
const QPointF &rotationOrigin, const QString &suffix, VContainer *data, quint32 id)
|
||||
{
|
||||
UpdateItem<Item>(idTool, idItem, angle, length, suffix, data, id);
|
||||
UpdateItem<Item>(idTool, idItem, angle, length, rotationAngle, rotationOrigin, suffix, data, id);
|
||||
data->AddArc(data->GeometricObject<Item>(id), id);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
template <class Item>
|
||||
DestinationItem VToolMove::CreateItem(quint32 idTool, quint32 idItem, qreal angle,
|
||||
qreal length, const QString &suffix, VContainer *data)
|
||||
DestinationItem VToolMove::CreateItem(quint32 idTool, quint32 idItem, qreal angle, qreal length, qreal rotationAngle,
|
||||
const QPointF &rotationOrigin, const QString &suffix, VContainer *data)
|
||||
{
|
||||
const QSharedPointer<Item> i = data->GeometricObject<Item>(idItem);
|
||||
Item moved = i->Move(length, angle, suffix);
|
||||
Item moved = i->Move(length, angle, suffix).Rotate(rotationOrigin, rotationAngle);
|
||||
moved.setIdObject(idTool);
|
||||
|
||||
DestinationItem item;
|
||||
|
@ -456,10 +548,11 @@ DestinationItem VToolMove::CreateItem(quint32 idTool, quint32 idItem, qreal angl
|
|||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
template <class Item>
|
||||
DestinationItem VToolMove::CreateCurve(quint32 idTool, quint32 idItem, qreal angle, qreal length,
|
||||
const QString &suffix, VContainer *data)
|
||||
DestinationItem VToolMove::CreateCurve(quint32 idTool, quint32 idItem, qreal angle, qreal length, qreal rotationAngle,
|
||||
const QPointF &rotationOrigin, const QString &suffix, VContainer *data)
|
||||
{
|
||||
const DestinationItem item = CreateItem<Item>(idTool, idItem, angle, length, suffix, data);
|
||||
const DestinationItem item = CreateItem<Item>(idTool, idItem, angle, length, rotationAngle, rotationOrigin, suffix,
|
||||
data);
|
||||
data->AddSpline(data->GeometricObject<Item>(item.id), item.id);
|
||||
return item;
|
||||
}
|
||||
|
@ -467,39 +560,42 @@ DestinationItem VToolMove::CreateCurve(quint32 idTool, quint32 idItem, qreal ang
|
|||
//---------------------------------------------------------------------------------------------------------------------
|
||||
template <class Item>
|
||||
DestinationItem VToolMove::CreateCurveWithSegments(quint32 idTool, quint32 idItem, qreal angle,
|
||||
qreal length, const QString &suffix,
|
||||
VContainer *data)
|
||||
qreal length, qreal rotationAngle,
|
||||
const QPointF &rotationOrigin, const QString &suffix,
|
||||
VContainer *data)
|
||||
{
|
||||
const DestinationItem item = CreateItem<Item>(idTool, idItem, angle, length, suffix, data);
|
||||
const DestinationItem item = CreateItem<Item>(idTool, idItem, angle, length, rotationAngle, rotationOrigin, suffix,
|
||||
data);
|
||||
data->AddCurveWithSegments(data->GeometricObject<Item>(item.id), item.id);
|
||||
return item;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
template <class Item>
|
||||
void VToolMove::UpdateItem(quint32 idTool, quint32 idItem, qreal angle, qreal length, const QString &suffix,
|
||||
VContainer *data, quint32 id)
|
||||
void VToolMove::UpdateItem(quint32 idTool, quint32 idItem, qreal angle, qreal length, qreal rotationAngle,
|
||||
const QPointF &rotationOrigin, const QString &suffix, VContainer *data, quint32 id)
|
||||
{
|
||||
const QSharedPointer<Item> i = data->GeometricObject<Item>(idItem);
|
||||
Item moved = i->Move(length, angle, suffix);
|
||||
Item moved = i->Move(length, angle, suffix).Rotate(rotationOrigin, rotationAngle);;
|
||||
moved.setIdObject(idTool);
|
||||
data->UpdateGObject(id, new Item(moved));
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
template <class Item>
|
||||
void VToolMove::UpdateCurve(quint32 idTool, quint32 idItem, qreal angle, qreal length, const QString &suffix,
|
||||
VContainer *data, quint32 id)
|
||||
void VToolMove::UpdateCurve(quint32 idTool, quint32 idItem, qreal angle, qreal length, qreal rotationAngle,
|
||||
const QPointF &rotationOrigin, const QString &suffix, VContainer *data, quint32 id)
|
||||
{
|
||||
UpdateItem<Item>(idTool, idItem, angle, length, suffix, data, id);
|
||||
UpdateItem<Item>(idTool, idItem, angle, length, rotationAngle, rotationOrigin, suffix, data, id);
|
||||
data->AddSpline(data->GeometricObject<Item>(id), id);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
template <class Item>
|
||||
void VToolMove::UpdateCurveWithSegments(quint32 idTool, quint32 idItem, qreal angle, qreal length,
|
||||
const QString &suffix, VContainer *data, quint32 id)
|
||||
void VToolMove::UpdateCurveWithSegments(quint32 idTool, quint32 idItem, qreal angle, qreal length, qreal rotationAngle,
|
||||
const QPointF &rotationOrigin, const QString &suffix, VContainer *data,
|
||||
quint32 id)
|
||||
{
|
||||
UpdateItem<Item>(idTool, idItem, angle, length, suffix, data, id);
|
||||
UpdateItem<Item>(idTool, idItem, angle, length, rotationAngle, rotationOrigin, suffix, data, id);
|
||||
data->AddCurveWithSegments(data->GeometricObject<Item>(id), id);
|
||||
}
|
||||
|
|
|
@ -50,10 +50,12 @@ struct VToolMoveInitData : VAbstractOperationInitData
|
|||
VToolMoveInitData()
|
||||
: VAbstractOperationInitData(),
|
||||
formulaAngle(),
|
||||
formulaRotationAngle(),
|
||||
formulaLength()
|
||||
{}
|
||||
|
||||
QString formulaAngle;
|
||||
QString formulaRotationAngle;
|
||||
QString formulaLength;
|
||||
};
|
||||
|
||||
|
@ -75,6 +77,9 @@ public:
|
|||
VFormula GetFormulaAngle() const;
|
||||
void SetFormulaAngle(const VFormula &value);
|
||||
|
||||
VFormula GetFormulaRotationAngle() const;
|
||||
void SetFormulaRotationAngle(const VFormula &value);
|
||||
|
||||
VFormula GetFormulaLength() const;
|
||||
void SetFormulaLength(const VFormula &value);
|
||||
|
||||
|
@ -91,40 +96,44 @@ protected:
|
|||
private:
|
||||
Q_DISABLE_COPY(VToolMove)
|
||||
QString formulaAngle;
|
||||
QString formulaRotationAngle;
|
||||
QString formulaLength;
|
||||
|
||||
VToolMove(const VToolMoveInitData &initData, QGraphicsItem *parent = nullptr);
|
||||
|
||||
static DestinationItem CreatePoint(quint32 idTool, quint32 idItem, qreal angle, qreal length, const QString &suffix,
|
||||
VContainer *data);
|
||||
static DestinationItem CreatePoint(quint32 idTool, quint32 idItem, qreal angle, qreal length, qreal rotationAngle,
|
||||
const QPointF &rotationOrigin, const QString &suffix, VContainer *data);
|
||||
|
||||
template <class Item>
|
||||
static DestinationItem CreateItem(quint32 idTool, quint32 idItem, qreal angle, qreal length, const QString &suffix,
|
||||
VContainer *data);
|
||||
static DestinationItem CreateItem(quint32 idTool, quint32 idItem, qreal angle, qreal length, qreal rotationAngle,
|
||||
const QPointF &rotationOrigin, const QString &suffix, VContainer *data);
|
||||
template <class Item>
|
||||
static DestinationItem CreateArc(quint32 idTool, quint32 idItem, qreal angle, qreal length, const QString &suffix,
|
||||
VContainer *data);
|
||||
static DestinationItem CreateArc(quint32 idTool, quint32 idItem, qreal angle, qreal length, qreal rotationAngle,
|
||||
const QPointF &rotationOrigin, const QString &suffix, VContainer *data);
|
||||
template <class Item>
|
||||
static DestinationItem CreateCurve(quint32 idTool, quint32 idItem, qreal angle, qreal length, const QString &suffix,
|
||||
VContainer *data);
|
||||
static DestinationItem CreateCurve(quint32 idTool, quint32 idItem, qreal angle, qreal length, qreal rotationAngle,
|
||||
const QPointF &rotationOrigin,const QString &suffix, VContainer *data);
|
||||
template <class Item>
|
||||
static DestinationItem CreateCurveWithSegments(quint32 idTool, quint32 idItem, qreal angle, qreal length,
|
||||
qreal rotationAngle, const QPointF &rotationOrigin,
|
||||
const QString &suffix, VContainer *data);
|
||||
|
||||
static void UpdatePoint(quint32 idTool, quint32 idItem, qreal angle, qreal length, const QString &suffix,
|
||||
VContainer *data, const DestinationItem &item);
|
||||
static void UpdatePoint(quint32 idTool, quint32 idItem, qreal angle, qreal length, qreal rotationAngle,
|
||||
const QPointF &rotationOrigin, const QString &suffix, VContainer *data,
|
||||
const DestinationItem &item);
|
||||
template <class Item>
|
||||
static void UpdateItem(quint32 idTool, quint32 idItem, qreal angle, qreal length, const QString &suffix,
|
||||
VContainer *data, quint32 id);
|
||||
static void UpdateItem(quint32 idTool, quint32 idItem, qreal angle, qreal length, qreal rotationAngle,
|
||||
const QPointF &rotationOrigin, const QString &suffix, VContainer *data, quint32 id);
|
||||
template <class Item>
|
||||
static void UpdateArc(quint32 idTool, quint32 idItem, qreal angle, qreal length, const QString &suffix,
|
||||
VContainer *data, quint32 id);
|
||||
static void UpdateArc(quint32 idTool, quint32 idItem, qreal angle, qreal length, qreal rotationAngle,
|
||||
const QPointF &rotationOrigin, const QString &suffix, VContainer *data, quint32 id);
|
||||
template <class Item>
|
||||
static void UpdateCurve(quint32 idTool, quint32 idItem, qreal angle, qreal length, const QString &suffix,
|
||||
VContainer *data, quint32 id);
|
||||
static void UpdateCurve(quint32 idTool, quint32 idItem, qreal angle, qreal length, qreal rotationAngle,
|
||||
const QPointF &rotationOrigin, const QString &suffix, VContainer *data, quint32 id);
|
||||
template <class Item>
|
||||
static void UpdateCurveWithSegments(quint32 idTool, quint32 idItem, qreal angle, qreal length,
|
||||
const QString &suffix, VContainer *data, quint32 id);
|
||||
static void UpdateCurveWithSegments(quint32 idTool, quint32 idItem, qreal angle, qreal length, qreal rotationAngle,
|
||||
const QPointF &rotationOrigin, const QString &suffix, VContainer *data,
|
||||
quint32 id);
|
||||
};
|
||||
|
||||
#endif // VTOOLMOVING_H
|
||||
|
|
|
@ -43,6 +43,7 @@ VisOperation::VisOperation(const VContainer *data, QGraphicsItem *parent)
|
|||
: VisLine(data, parent),
|
||||
objects(),
|
||||
supportColor2(Qt::darkGreen),
|
||||
supportColor3(Qt::darkBlue),
|
||||
points(),
|
||||
curves()
|
||||
{
|
||||
|
|
|
@ -50,6 +50,7 @@ public:
|
|||
protected:
|
||||
QVector<quint32> objects;
|
||||
QColor supportColor2;
|
||||
QColor supportColor3;
|
||||
|
||||
QVector<VScaledEllipse *> points;
|
||||
QVector<VCurvePathItem *> curves;
|
||||
|
|
|
@ -51,6 +51,7 @@
|
|||
#include "../vgeometry/vpointf.h"
|
||||
#include "../vgeometry/vspline.h"
|
||||
#include "../vgeometry/vsplinepath.h"
|
||||
#include "../vgeometry/varc.h"
|
||||
#include "../vmisc/vabstractapplication.h"
|
||||
#include "../vpatterndb/vcontainer.h"
|
||||
#include "../vwidgets/vmaingraphicsscene.h"
|
||||
|
@ -60,17 +61,19 @@
|
|||
VisToolMove::VisToolMove(const VContainer *data, QGraphicsItem *parent)
|
||||
: VisOperation(data, parent),
|
||||
angle(0),
|
||||
rotationAngle(INT_MIN),
|
||||
length(0),
|
||||
pointOrigin(nullptr),
|
||||
pointFinish(nullptr)
|
||||
pointFinish(nullptr),
|
||||
angleArc(nullptr),
|
||||
rotationLine(nullptr),
|
||||
xAxis(nullptr)
|
||||
{
|
||||
pointOrigin = InitPoint(supportColor2, this);
|
||||
pointFinish = InitPoint(supportColor, this);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
VisToolMove::~VisToolMove()
|
||||
{
|
||||
angleArc = InitItem<VCurvePathItem>(supportColor3, this);
|
||||
rotationLine = InitItem<VScaledLine>(supportColor3, this);
|
||||
xAxis = InitItem<VScaledLine>(supportColor3, this);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
|
@ -91,6 +94,7 @@ void VisToolMove::RefreshGeometry()
|
|||
|
||||
qreal tempAngle = 0;
|
||||
qreal tempLength = 0;
|
||||
qreal tempRoationAngle = 0;
|
||||
|
||||
QLineF line;
|
||||
if (qFuzzyIsNull(length))
|
||||
|
@ -113,19 +117,67 @@ void VisToolMove::RefreshGeometry()
|
|||
line = VGObject::BuildLine(origin, length, angle);
|
||||
tempAngle = angle;
|
||||
tempLength = length;
|
||||
|
||||
QLineF rLine;
|
||||
if (VFuzzyComparePossibleNulls(rotationAngle, INT_MIN))
|
||||
{
|
||||
rLine = QLineF(line.p2(), Visualization::scenePos);
|
||||
|
||||
if (QGuiApplication::keyboardModifiers() == Qt::ShiftModifier)
|
||||
{
|
||||
rLine.setAngle(CorrectAngle(rLine.angle()));
|
||||
}
|
||||
|
||||
qreal cursorLength = rLine.length();
|
||||
rLine.setP2(Ray(line.p2(), rLine.angle()));
|
||||
//Radius of point circle, but little bigger. Need handle with hover sizes.
|
||||
qreal minL = ScaledRadius(SceneScale(qApp->getCurrentScene()))*1.5;
|
||||
if (cursorLength > minL)
|
||||
{
|
||||
tempRoationAngle = rLine.angle();
|
||||
}
|
||||
else
|
||||
{
|
||||
rLine.setAngle(0);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
rLine = QLineF(line.p2(), Ray(line.p2(), rotationAngle));
|
||||
tempRoationAngle = rotationAngle;
|
||||
}
|
||||
|
||||
DrawLine(rotationLine, rLine, supportColor3, Qt::DashLine);
|
||||
DrawLine(xAxis, QLineF(line.p2(), Ray(line.p2(), 0)), supportColor3, Qt::DashLine);
|
||||
|
||||
VArc arc(VPointF(line.p2()), ScaledRadius(SceneScale(qApp->getCurrentScene()))*2, 0, tempRoationAngle);
|
||||
DrawPath(angleArc, arc.GetPath(), supportColor3, Qt::SolidLine, Qt::RoundCap);
|
||||
}
|
||||
DrawLine(this, line, supportColor2, Qt::DashLine);
|
||||
DrawPoint(pointFinish, line.p2(), supportColor);
|
||||
|
||||
static const QString prefix = UnitsToStr(qApp->patternUnit(), true);
|
||||
Visualization::toolTip = tr("Length = %1%2, angle = %3°, <b>Shift</b> - sticking angle, "
|
||||
"<b>Mouse click</b> - finish creation")
|
||||
.arg(qApp->TrVars()->FormulaToUser(QString::number(qApp->fromPixel(tempLength)),
|
||||
qApp->Settings()->GetOsSeparator()))
|
||||
.arg(prefix)
|
||||
.arg(tempAngle);
|
||||
if (qFuzzyIsNull(length))
|
||||
{
|
||||
Visualization::toolTip = tr("Length = %1%2, angle = %3°, <b>Shift</b> - sticking angle, "
|
||||
"<b>Mouse click</b> - finish selecting a position")
|
||||
.arg(qApp->TrVars()->FormulaToUser(QString::number(qApp->fromPixel(tempLength)),
|
||||
qApp->Settings()->GetOsSeparator()))
|
||||
.arg(prefix)
|
||||
.arg(tempAngle);
|
||||
}
|
||||
else
|
||||
{
|
||||
Visualization::toolTip = tr("Length = %1%2, angle = %3°, rotation angle = %4°, <b>Shift</b> - sticking angle, "
|
||||
"<b>Mouse click</b> - finish creating")
|
||||
.arg(qApp->TrVars()->FormulaToUser(QString::number(qApp->fromPixel(tempLength)),
|
||||
qApp->Settings()->GetOsSeparator()))
|
||||
.arg(prefix)
|
||||
.arg(tempAngle)
|
||||
.arg(tempRoationAngle);
|
||||
}
|
||||
|
||||
CreateMovedObjects(iPoint, iCurve, tempLength, tempAngle);
|
||||
CreateMovedRotatedObjects(iPoint, iCurve, tempLength, tempAngle, tempRoationAngle, line.p2());
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
|
@ -140,6 +192,18 @@ void VisToolMove::SetAngle(const QString &expression)
|
|||
angle = FindValFromUser(expression, Visualization::data->DataVariables());
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
QString VisToolMove::RotationAngle() const
|
||||
{
|
||||
return QString::number(rotationLine->line().angle());
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void VisToolMove::SetRotationAngle(const QString &expression)
|
||||
{
|
||||
rotationAngle = FindValFromUser(expression, Visualization::data->DataVariables());
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
QString VisToolMove::Length() const
|
||||
{
|
||||
|
@ -173,13 +237,14 @@ QGraphicsPathItem *VisToolMove::AddOriginCurve(quint32 id, int &i)
|
|||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
template <class Item>
|
||||
int VisToolMove::AddMovedCurve(qreal angle, qreal length, quint32 id, int i)
|
||||
int VisToolMove::AddMovedRotatedCurve(qreal angle, qreal length, quint32 id, int i, qreal rotationAngle,
|
||||
const QPointF &rotationOrigin)
|
||||
{
|
||||
const QSharedPointer<Item> curve = Visualization::data->template GeometricObject<Item>(id);
|
||||
|
||||
++i;
|
||||
VCurvePathItem *path = GetCurve(static_cast<quint32>(i), supportColor);
|
||||
const Item moved = curve->Move(length, angle);
|
||||
const Item moved = curve->Move(length, angle).Rotate(rotationOrigin, rotationAngle);
|
||||
DrawPath(path, moved.GetPath(), moved.DirectionArrows(), supportColor, Qt::SolidLine, Qt::RoundCap);
|
||||
|
||||
return i;
|
||||
|
@ -273,7 +338,8 @@ QT_WARNING_POP
|
|||
QT_WARNING_PUSH
|
||||
QT_WARNING_DISABLE_GCC("-Wswitch-default")
|
||||
|
||||
void VisToolMove::CreateMovedObjects(int &iPoint, int &iCurve, qreal length, qreal angle)
|
||||
void VisToolMove::CreateMovedRotatedObjects(int &iPoint, int &iCurve, qreal length, qreal angle, qreal rotationAngle,
|
||||
const QPointF &rotationOrigin)
|
||||
{
|
||||
for (int i = 0; i < objects.size(); ++i)
|
||||
{
|
||||
|
@ -291,26 +357,28 @@ void VisToolMove::CreateMovedObjects(int &iPoint, int &iCurve, qreal length, qre
|
|||
|
||||
++iPoint;
|
||||
VScaledEllipse *point = GetPoint(static_cast<quint32>(iPoint), supportColor);
|
||||
DrawPoint(point, static_cast<QPointF>(p->Move(length, angle)), supportColor);
|
||||
DrawPoint(point, static_cast<QPointF>(p->Move(length, angle).Rotate(rotationOrigin, rotationAngle)),
|
||||
supportColor);
|
||||
break;
|
||||
}
|
||||
case GOType::Arc:
|
||||
iCurve = AddMovedCurve<VArc>(angle, length, id, iCurve);
|
||||
iCurve = AddMovedRotatedCurve<VArc>(angle, length, id, iCurve, rotationAngle, rotationOrigin);
|
||||
break;
|
||||
case GOType::EllipticalArc:
|
||||
iCurve = AddMovedCurve<VEllipticalArc>(angle, length, id, iCurve);
|
||||
iCurve = AddMovedRotatedCurve<VEllipticalArc>(angle, length, id, iCurve, rotationAngle, rotationOrigin);
|
||||
break;
|
||||
case GOType::Spline:
|
||||
iCurve = AddMovedCurve<VSpline>(angle, length, id, iCurve);
|
||||
iCurve = AddMovedRotatedCurve<VSpline>(angle, length, id, iCurve, rotationAngle, rotationOrigin);
|
||||
break;
|
||||
case GOType::SplinePath:
|
||||
iCurve = AddMovedCurve<VSplinePath>(angle, length, id, iCurve);
|
||||
iCurve = AddMovedRotatedCurve<VSplinePath>(angle, length, id, iCurve, rotationAngle, rotationOrigin);
|
||||
break;
|
||||
case GOType::CubicBezier:
|
||||
iCurve = AddMovedCurve<VCubicBezier>(angle, length, id, iCurve);
|
||||
iCurve = AddMovedRotatedCurve<VCubicBezier>(angle, length, id, iCurve, rotationAngle, rotationOrigin);
|
||||
break;
|
||||
case GOType::CubicBezierPath:
|
||||
iCurve = AddMovedCurve<VCubicBezierPath>(angle, length, id, iCurve);
|
||||
iCurve = AddMovedRotatedCurve<VCubicBezierPath>(angle, length, id, iCurve, rotationAngle,
|
||||
rotationOrigin);
|
||||
break;
|
||||
case GOType::Unknown:
|
||||
case GOType::PlaceLabel:
|
||||
|
|
|
@ -48,13 +48,16 @@ class VisToolMove : public VisOperation
|
|||
Q_OBJECT
|
||||
public:
|
||||
explicit VisToolMove(const VContainer *data, QGraphicsItem *parent = nullptr);
|
||||
virtual ~VisToolMove();
|
||||
virtual ~VisToolMove() = default;
|
||||
|
||||
virtual void RefreshGeometry() Q_DECL_OVERRIDE;
|
||||
|
||||
QString Angle() const;
|
||||
void SetAngle(const QString &expression);
|
||||
|
||||
QString RotationAngle() const;
|
||||
void SetRotationAngle(const QString &expression);
|
||||
|
||||
QString Length() const;
|
||||
qreal LengthValue() const;
|
||||
void SetLength(const QString &expression);
|
||||
|
@ -64,20 +67,26 @@ public:
|
|||
private:
|
||||
Q_DISABLE_COPY(VisToolMove)
|
||||
qreal angle;
|
||||
qreal rotationAngle;
|
||||
qreal length;
|
||||
VScaledEllipse *pointOrigin;
|
||||
VScaledEllipse *pointFinish;
|
||||
VCurvePathItem *angleArc;
|
||||
VScaledLine *rotationLine;
|
||||
VScaledLine *xAxis;
|
||||
|
||||
template <class Item>
|
||||
QGraphicsPathItem *AddOriginCurve(quint32 id, int &i);
|
||||
|
||||
template <class Item>
|
||||
int AddMovedCurve(qreal angle, qreal length, quint32 id, int i);
|
||||
int AddMovedRotatedCurve(qreal angle, qreal length, quint32 id, int i, qreal rotationAngle,
|
||||
const QPointF &rotationOrigin);
|
||||
|
||||
static QPointF GetOriginPoint(const QVector<QGraphicsItem *> &objects);
|
||||
|
||||
QVector<QGraphicsItem *> CreateOriginObjects(int &iPoint, int &iCurve);
|
||||
void CreateMovedObjects(int &iPoint, int &iCurve, qreal length, qreal angle);
|
||||
void CreateMovedRotatedObjects(int &iPoint, int &iCurve, qreal length, qreal angle, qreal rotationAngle,
|
||||
const QPointF &rotationOrigin);
|
||||
};
|
||||
|
||||
#endif // VISTOOLMOVE_H
|
||||
|
|
|
@ -76,6 +76,8 @@ public:
|
|||
QSharedPointer<VInternalVariable> > *vars, bool fromUser = true);
|
||||
static qreal FindValFromUser(const QString &expression, const QHash<QString,
|
||||
QSharedPointer<VInternalVariable> > *vars, bool fromUser = true);
|
||||
|
||||
QString CurrentToolTip() const {return toolTip;}
|
||||
signals:
|
||||
void ToolTip(const QString &toolTip);
|
||||
public slots:
|
||||
|
|