diff --git a/src/app/dialogs/tools/dialogpointofintersectionarcs.cpp b/src/app/dialogs/tools/dialogpointofintersectionarcs.cpp index b232a79c9..d6b2ba7a7 100644 --- a/src/app/dialogs/tools/dialogpointofintersectionarcs.cpp +++ b/src/app/dialogs/tools/dialogpointofintersectionarcs.cpp @@ -106,7 +106,7 @@ void DialogPointOfIntersectionArcs::SetSecondArcId(const quint32 &value) } //--------------------------------------------------------------------------------------------------------------------- -CrossArcPoint DialogPointOfIntersectionArcs::GetCrossArcPoint() const +CrossArcsPoint DialogPointOfIntersectionArcs::GetCrossArcPoint() const { int value; bool ok = false; @@ -117,25 +117,25 @@ CrossArcPoint DialogPointOfIntersectionArcs::GetCrossArcPoint() const #endif if (not ok) { - return CrossArcPoint::FirstPoint; + return CrossArcsPoint::FirstPoint; } switch(value) { case 1: - return CrossArcPoint::FirstPoint; + return CrossArcsPoint::FirstPoint; break; case 2: - return CrossArcPoint::SecondPoint; + return CrossArcsPoint::SecondPoint; break; default: - return CrossArcPoint::FirstPoint; + return CrossArcsPoint::FirstPoint; break; } } //--------------------------------------------------------------------------------------------------------------------- -void DialogPointOfIntersectionArcs::SetCrossArcPoint(CrossArcPoint &p) +void DialogPointOfIntersectionArcs::SetCrossArcPoint(CrossArcsPoint &p) { const qint32 index = ui->comboBoxResult->findData(static_cast(p)); if (index != -1) @@ -164,15 +164,15 @@ void DialogPointOfIntersectionArcs::ChosenObject(quint32 id, const SceneObject & if (SetObject(id, ui->comboBoxArc1, tr("Select second an arc"))) { number++; - point->setArc1Id(id); - point->RefreshGeometry(); + point->VisualMode(id); } break; case 1: - if (getCurrentObjectId(ui->comboBoxArc2) != id) + if (getCurrentObjectId(ui->comboBoxArc1) != id) { if (SetObject(id, ui->comboBoxArc2, "")) { + number = 0; point->setArc2Id(id); point->RefreshGeometry(); prepare = true; @@ -229,6 +229,6 @@ void DialogPointOfIntersectionArcs::SaveData() //--------------------------------------------------------------------------------------------------------------------- void DialogPointOfIntersectionArcs::FillComboBoxCrossArcPoints() { - ui->comboBoxResult->addItem(tr("First point"), QVariant(static_cast(CrossArcPoint::FirstPoint))); - ui->comboBoxResult->addItem(tr("Second point"), QVariant(static_cast(CrossArcPoint::SecondPoint))); + ui->comboBoxResult->addItem(tr("First point"), QVariant(static_cast(CrossArcsPoint::FirstPoint))); + ui->comboBoxResult->addItem(tr("Second point"), QVariant(static_cast(CrossArcsPoint::SecondPoint))); } diff --git a/src/app/dialogs/tools/dialogpointofintersectionarcs.h b/src/app/dialogs/tools/dialogpointofintersectionarcs.h index 1b89df131..a555e42c3 100644 --- a/src/app/dialogs/tools/dialogpointofintersectionarcs.h +++ b/src/app/dialogs/tools/dialogpointofintersectionarcs.h @@ -53,8 +53,8 @@ public: quint32 GetSecondArcId() const; void SetSecondArcId(const quint32 &value); - CrossArcPoint GetCrossArcPoint() const; - void SetCrossArcPoint(CrossArcPoint &p); + CrossArcsPoint GetCrossArcPoint() const; + void SetCrossArcPoint(CrossArcsPoint &p); public slots: virtual void ChosenObject(quint32 id, const SceneObject &type); diff --git a/src/app/dialogs/tools/dialogpointofintersectionarcs.ui b/src/app/dialogs/tools/dialogpointofintersectionarcs.ui index eafdf1e12..f6f9ebc12 100644 --- a/src/app/dialogs/tools/dialogpointofintersectionarcs.ui +++ b/src/app/dialogs/tools/dialogpointofintersectionarcs.ui @@ -6,19 +6,19 @@ 0 0 - 285 + 300 179 - 285 + 300 179 - 285 + 300 179 diff --git a/src/app/mainwindow.cpp b/src/app/mainwindow.cpp index d85447891..d95c618e2 100644 --- a/src/app/mainwindow.cpp +++ b/src/app/mainwindow.cpp @@ -696,7 +696,7 @@ void MainWindow::ToolCurveIntersectAxis(bool checked) } //--------------------------------------------------------------------------------------------------------------------- -void MainWindow::PointOfIntersectionArcs(bool checked) +void MainWindow::ToolPointOfIntersectionArcs(bool checked) { SetToolButtonWithApply(checked, Tool::PointOfIntersectionArcs, "://cursor/point_of_intersection_arcs.png", @@ -1000,7 +1000,7 @@ void MainWindow::InitToolButtons() connect(ui->toolButtonCurveIntersectAxis, &QToolButton::clicked, this, &MainWindow::ToolCurveIntersectAxis); connect(ui->toolButtonArcIntersectAxis, &QToolButton::clicked, this, &MainWindow::ToolCurveIntersectAxis); connect(ui->toolButtonLayoutSettings, &QToolButton::clicked, this, &MainWindow::ToolLayoutSettings); - connect(ui->toolButtonPointOfIntersectionArcs, &QToolButton::clicked, this, &MainWindow::PointOfIntersectionArcs); + connect(ui->toolButtonPointOfIntersectionArcs, &QToolButton::clicked, this, &MainWindow::ToolPointOfIntersectionArcs); } //--------------------------------------------------------------------------------------------------------------------- @@ -2477,6 +2477,10 @@ void MainWindow::LastUsedTool() ui->toolButtonPointOfIntersection->setChecked(true); ToolPointOfIntersection(true); break; + case Tool::PointOfIntersectionArcs: + ui->toolButtonPointOfIntersectionArcs->setChecked(true); + ToolPointOfIntersectionArcs(true); + break; case Tool::CutSpline: ui->toolButtonSplineCutPoint->setChecked(true); ToolCutSpline(true); diff --git a/src/app/mainwindow.h b/src/app/mainwindow.h index b42907978..077115283 100644 --- a/src/app/mainwindow.h +++ b/src/app/mainwindow.h @@ -115,13 +115,13 @@ public slots: void ToolCutArc(bool checked); void ToolLineIntersectAxis(bool checked); void ToolCurveIntersectAxis(bool checked); - void PointOfIntersectionArcs(bool checked); + void ToolPointOfIntersectionArcs(bool checked); void ClosedDialogDetail(int result); void ClosedDialogUnionDetails(int result); //tmp - void LastUsedTool(); + void LastUsedTool(); /** * @brief Edit XML code of pattern diff --git a/src/app/mainwindow.ui b/src/app/mainwindow.ui index b04af4683..b4dc108bb 100644 --- a/src/app/mainwindow.ui +++ b/src/app/mainwindow.ui @@ -50,7 +50,7 @@ 0 0 - 105 + 100 272 @@ -337,7 +337,7 @@ 0 0 - 105 + 100 58 @@ -413,7 +413,7 @@ 0 0 - 105 + 100 156 @@ -683,6 +683,9 @@ 32 + + true + @@ -692,7 +695,7 @@ 0 0 - 105 + 100 58 @@ -768,8 +771,8 @@ 0 0 - 105 - 380 + 98 + 58 diff --git a/src/app/tools/drawTools/vtoolpointofintersectionarcs.cpp b/src/app/tools/drawTools/vtoolpointofintersectionarcs.cpp index 781170840..d20d33509 100644 --- a/src/app/tools/drawTools/vtoolpointofintersectionarcs.cpp +++ b/src/app/tools/drawTools/vtoolpointofintersectionarcs.cpp @@ -37,7 +37,7 @@ const QString VToolPointOfIntersectionArcs::ToolType = QStringLiteral("pointOfIn //--------------------------------------------------------------------------------------------------------------------- VToolPointOfIntersectionArcs::VToolPointOfIntersectionArcs(VPattern *doc, VContainer *data, const quint32 &id, const quint32 &firstArcId, const quint32 &secondArcId, - CrossArcPoint pType, const Source &typeCreation, + CrossArcsPoint pType, const Source &typeCreation, QGraphicsItem *parent) :VToolPoint(doc, data, id, parent), firstArcId(firstArcId), secondArcId(secondArcId), crossPoint(pType) { @@ -73,7 +73,7 @@ VToolPointOfIntersectionArcs *VToolPointOfIntersectionArcs::Create(DialogTool *d SCASSERT(dialogTool != nullptr); const quint32 firstArcId = dialogTool->GetFirstArcId(); const quint32 secondArcId = dialogTool->GetSecondArcId(); - const CrossArcPoint pType = dialogTool->GetCrossArcPoint(); + const CrossArcsPoint pType = dialogTool->GetCrossArcPoint(); const QString pointName = dialogTool->getPointName(); VToolPointOfIntersectionArcs *point = nullptr; point = Create(0, pointName, firstArcId, secondArcId, pType, 5, 10, scene, doc, data, Document::FullParse, @@ -88,7 +88,7 @@ VToolPointOfIntersectionArcs *VToolPointOfIntersectionArcs::Create(DialogTool *d //--------------------------------------------------------------------------------------------------------------------- VToolPointOfIntersectionArcs *VToolPointOfIntersectionArcs::Create(const quint32 _id, const QString &pointName, const quint32 &firstArcId, - const quint32 &secondArcId, CrossArcPoint pType, + const quint32 &secondArcId, CrossArcsPoint pType, const qreal &mx, const qreal &my, VMainGraphicsScene *scene, VPattern *doc, VContainer *data, const Document &parse, @@ -130,7 +130,7 @@ VToolPointOfIntersectionArcs *VToolPointOfIntersectionArcs::Create(const quint32 } //--------------------------------------------------------------------------------------------------------------------- -QPointF VToolPointOfIntersectionArcs::FindPoint(const VArc *arc1, const VArc *arc2, const CrossArcPoint pType) +QPointF VToolPointOfIntersectionArcs::FindPoint(const VArc *arc1, const VArc *arc2, const CrossArcsPoint pType) { QPointF p1, p2; const int res = VGObject::IntersectionCircles(arc1->GetCenter().toQPointF(), arc1->GetRadius(), @@ -139,7 +139,7 @@ QPointF VToolPointOfIntersectionArcs::FindPoint(const VArc *arc1, const VArc *ar switch(res) { case 2: - if (pType == CrossArcPoint::FirstPoint) + if (pType == CrossArcsPoint::FirstPoint) { return p1; } @@ -196,13 +196,13 @@ void VToolPointOfIntersectionArcs::SetSecondArcId(const quint32 &value) } //--------------------------------------------------------------------------------------------------------------------- -CrossArcPoint VToolPointOfIntersectionArcs::GetCrossArcPoint() const +CrossArcsPoint VToolPointOfIntersectionArcs::GetCrossArcsPoint() const { return crossPoint; } //--------------------------------------------------------------------------------------------------------------------- -void VToolPointOfIntersectionArcs::SetCrossArcPoint(CrossArcPoint &value) +void VToolPointOfIntersectionArcs::SetCrossArcsPoint(CrossArcsPoint &value) { crossPoint = value; @@ -271,7 +271,7 @@ void VToolPointOfIntersectionArcs::ReadToolAttributes(const QDomElement &domElem { firstArcId = doc->GetParametrUInt(domElement, AttrFirstArc, NULL_ID_STR); secondArcId = doc->GetParametrUInt(domElement, AttrSecondArc, NULL_ID_STR); - crossPoint = static_cast(doc->GetParametrUInt(domElement, AttrCrossPoint, "1")); + crossPoint = static_cast(doc->GetParametrUInt(domElement, AttrCrossPoint, "1")); } //--------------------------------------------------------------------------------------------------------------------- diff --git a/src/app/tools/drawTools/vtoolpointofintersectionarcs.h b/src/app/tools/drawTools/vtoolpointofintersectionarcs.h index 3d208b23a..0a942ad8b 100644 --- a/src/app/tools/drawTools/vtoolpointofintersectionarcs.h +++ b/src/app/tools/drawTools/vtoolpointofintersectionarcs.h @@ -40,17 +40,17 @@ class VToolPointOfIntersectionArcs : public VToolPoint public: VToolPointOfIntersectionArcs(VPattern *doc, VContainer *data, const quint32 &id, const quint32 &firstArcId, - const quint32 &secondArcId, CrossArcPoint crossPoint, const Source &typeCreation, + const quint32 &secondArcId, CrossArcsPoint crossPoint, const Source &typeCreation, QGraphicsItem * parent = nullptr); virtual void setDialog(); static VToolPointOfIntersectionArcs *Create(DialogTool *dialog, VMainGraphicsScene *scene, VPattern *doc, VContainer *data); static VToolPointOfIntersectionArcs *Create(const quint32 _id, const QString &pointName, const quint32 &firstArcId, - const quint32 &secondArcId, CrossArcPoint crossPoint, + const quint32 &secondArcId, CrossArcsPoint crossPoint, const qreal &mx, const qreal &my, VMainGraphicsScene *scene, VPattern *doc, VContainer *data, const Document &parse, const Source &typeCreation); - static QPointF FindPoint(const VArc *arc1, const VArc *arc2, const CrossArcPoint crossPoint); + static QPointF FindPoint(const VArc *arc1, const VArc *arc2, const CrossArcsPoint crossPoint); static const QString ToolType; virtual int type() const {return Type;} enum { Type = UserType + static_cast(Tool::PointOfIntersectionArcs) }; @@ -61,8 +61,8 @@ public: quint32 GetSecondArcId() const; void SetSecondArcId(const quint32 &value); - CrossArcPoint GetCrossArcPoint() const; - void SetCrossArcPoint(CrossArcPoint &value); + CrossArcsPoint GetCrossArcsPoint() const; + void SetCrossArcsPoint(CrossArcsPoint &value); virtual void ShowVisualization(bool show); public slots: @@ -83,7 +83,7 @@ private: /** @brief secondArcId id second arc. */ quint32 secondArcId; - CrossArcPoint crossPoint; + CrossArcsPoint crossPoint; }; #endif // VTOOLPOINTOFINTERSECTIONARCS_H diff --git a/src/app/visualization/vistoolpointofintersectionarcs.cpp b/src/app/visualization/vistoolpointofintersectionarcs.cpp index b0f043cc1..6c9309219 100644 --- a/src/app/visualization/vistoolpointofintersectionarcs.cpp +++ b/src/app/visualization/vistoolpointofintersectionarcs.cpp @@ -33,7 +33,7 @@ //--------------------------------------------------------------------------------------------------------------------- VisToolPointOfIntersectionArcs::VisToolPointOfIntersectionArcs(const VContainer *data, QGraphicsItem *parent) - : VisLine(data, parent), arc1Id(NULL_ID), arc2Id(NULL_ID), crossPoint(CrossArcPoint::FirstPoint), point(nullptr), + : VisLine(data, parent), arc1Id(NULL_ID), arc2Id(NULL_ID), crossPoint(CrossArcsPoint::FirstPoint), point(nullptr), arc1Path(nullptr), arc2Path(nullptr) { arc1Path = InitItem(Qt::darkGreen, this); @@ -56,12 +56,12 @@ void VisToolPointOfIntersectionArcs::RefreshGeometry() if (arc1Id > NULL_ID) { const QSharedPointer arc1 = Visualization::data->GeometricObject(arc1Id); - DrawPath(arc1Path, arc1->GetPath(PathDirection::Hide), supportColor, Qt::SolidLine, Qt::RoundCap); + DrawPath(arc1Path, arc1->GetPath(PathDirection::Hide), Qt::darkGreen, Qt::SolidLine, Qt::RoundCap); if (arc2Id > NULL_ID) { const QSharedPointer arc2 = Visualization::data->GeometricObject(arc2Id); - DrawPath(arc2Path, arc2->GetPath(PathDirection::Hide), supportColor, Qt::SolidLine, Qt::RoundCap); + DrawPath(arc2Path, arc2->GetPath(PathDirection::Hide), Qt::darkRed, Qt::SolidLine, Qt::RoundCap); const QPointF fPoint = VToolPointOfIntersectionArcs::FindPoint(arc1.data(), arc2.data(), crossPoint); DrawPoint(point, fPoint, mainColor); @@ -69,6 +69,19 @@ void VisToolPointOfIntersectionArcs::RefreshGeometry() } } +//--------------------------------------------------------------------------------------------------------------------- +void VisToolPointOfIntersectionArcs::VisualMode(const quint32 &id) +{ + VMainGraphicsScene *scene = qobject_cast(qApp->getCurrentScene()); + SCASSERT(scene != nullptr); + + this->arc1Id = id; + Visualization::scenePos = scene->getScenePos(); + RefreshGeometry(); + + AddOnScene(); +} + //--------------------------------------------------------------------------------------------------------------------- void VisToolPointOfIntersectionArcs::setArc1Id(const quint32 &value) { @@ -82,7 +95,7 @@ void VisToolPointOfIntersectionArcs::setArc2Id(const quint32 &value) } //--------------------------------------------------------------------------------------------------------------------- -void VisToolPointOfIntersectionArcs::setCrossPoint(const CrossArcPoint &value) +void VisToolPointOfIntersectionArcs::setCrossPoint(const CrossArcsPoint &value) { crossPoint = value; } diff --git a/src/app/visualization/vistoolpointofintersectionarcs.h b/src/app/visualization/vistoolpointofintersectionarcs.h index 88375b032..fb20ecfd2 100644 --- a/src/app/visualization/vistoolpointofintersectionarcs.h +++ b/src/app/visualization/vistoolpointofintersectionarcs.h @@ -40,10 +40,11 @@ public: virtual ~VisToolPointOfIntersectionArcs(); virtual void RefreshGeometry(); + virtual void VisualMode(const quint32 &id); void setArc1Id(const quint32 &value); void setArc2Id(const quint32 &value); - void setCrossPoint(const CrossArcPoint &value); + void setCrossPoint(const CrossArcsPoint &value); virtual int type() const {return Type;} enum { Type = UserType + static_cast(Vis::ToolPointOfIntersection)}; @@ -51,7 +52,7 @@ private: Q_DISABLE_COPY(VisToolPointOfIntersectionArcs) quint32 arc1Id; quint32 arc2Id; - CrossArcPoint crossPoint; + CrossArcsPoint crossPoint; QGraphicsEllipseItem *point; QGraphicsPathItem *arc1Path; QGraphicsPathItem *arc2Path; diff --git a/src/app/visualization/visualization.h b/src/app/visualization/visualization.h index c72d21ad2..5596084db 100644 --- a/src/app/visualization/visualization.h +++ b/src/app/visualization/visualization.h @@ -52,7 +52,7 @@ public: void setPoint1Id(const quint32 &value); void setLineStyle(const Qt::PenStyle &value); void setScenePos(const QPointF &value); - void VisualMode(const quint32 &pointId); + virtual void VisualMode(const quint32 &pointId); void setMainColor(const QColor &value); signals: void ToolTip(const QString &toolTip); diff --git a/src/app/widgets/vtooloptionspropertybrowser.cpp b/src/app/widgets/vtooloptionspropertybrowser.cpp index 5b71762aa..9bcb69c90 100644 --- a/src/app/widgets/vtooloptionspropertybrowser.cpp +++ b/src/app/widgets/vtooloptionspropertybrowser.cpp @@ -116,6 +116,9 @@ void VToolOptionsPropertyBrowser::ShowItemOptions(QGraphicsItem *item) case VToolPointOfIntersection::Type: ShowOptionsToolPointOfIntersection(item); break; + case VToolPointOfIntersectionArcs::Type: + ShowOptionsToolPointOfIntersectionArcs(item); + break; case VToolShoulderPoint::Type: ShowOptionsToolShoulderPoint(item); break; @@ -203,6 +206,9 @@ void VToolOptionsPropertyBrowser::UpdateOptions() case VToolPointOfIntersection::Type: UpdateOptionsToolPointOfIntersection(); break; + case VToolPointOfIntersectionArcs::Type: + UpdateOptionsToolPointOfIntersectionArcs(); + break; case VToolShoulderPoint::Type: UpdateOptionsToolShoulderPoint(); break; @@ -305,6 +311,9 @@ void VToolOptionsPropertyBrowser::userChangedData(VProperty *property) case VToolPointOfIntersection::Type: ChangeDataToolPointOfIntersection(prop); break; + case VToolPointOfIntersectionArcs::Type: + ChangeDataToolPointOfIntersectionArcs(prop); + break; case VToolShoulderPoint::Type: ChangeDataToolShoulderPoint(prop); break; @@ -388,6 +397,16 @@ void VToolOptionsPropertyBrowser::AddPropertyPointName(Tool *i, const QString &p AddProperty(itemName, VAbstractTool::AttrName); } +//--------------------------------------------------------------------------------------------------------------------- +template +void VToolOptionsPropertyBrowser::AddPropertyCrossPoint(Tool *i, const QString &propertyName) +{ + VEnumProperty* itemProperty = new VEnumProperty(propertyName); + itemProperty->setLiterals(QStringList()<< tr("First point") << tr("Second point")); + itemProperty->setValue(static_cast(i->GetCrossArcsPoint())-1); + AddProperty(itemProperty, VAbstractTool::AttrCrossPoint); +} + //--------------------------------------------------------------------------------------------------------------------- template void VToolOptionsPropertyBrowser::AddPropertyLineType(Tool *i, const QString &propertyName, @@ -827,6 +846,49 @@ void VToolOptionsPropertyBrowser::ChangeDataToolPointOfIntersection(VProperty *p } } +//--------------------------------------------------------------------------------------------------------------------- +void VToolOptionsPropertyBrowser::ChangeDataToolPointOfIntersectionArcs(VProperty *property) +{ + SCASSERT(property != nullptr) + + const QVariant value = property->data(VProperty::DPC_Data, Qt::DisplayRole); + const QString id = propertyToId[property]; + + VToolPointOfIntersectionArcs *i = qgraphicsitem_cast(currentItem); + SCASSERT(i != nullptr); + switch (PropertiesList().indexOf(id)) + { + case 0: // VAbstractTool::AttrName + SetPointName(value.toString()); + break; + case 28: // VAbstractTool::AttrCrossPoint + { + const QVariant value = property->data(VProperty::DPC_Data, Qt::EditRole); + bool ok = false; + const int val = value.toInt(&ok); + + CrossArcsPoint cross = CrossArcsPoint::FirstPoint; + if (ok) + { + switch(val) + { + case 0: + cross = CrossArcsPoint::FirstPoint; + case 1: + cross = CrossArcsPoint::SecondPoint; + default: + cross = CrossArcsPoint::FirstPoint; + } + } + i->SetCrossArcsPoint(cross); + break; + } + default: + qWarning()<<"Unknown property type. id = "<(item); + i->ShowVisualization(true); + formView->setTitle(tr("Tool to make point from intersection two arcs")); + + AddPropertyPointName(i, tr("Point label")); + AddPropertyCrossPoint(i, tr("Take")); +} + //--------------------------------------------------------------------------------------------------------------------- void VToolOptionsPropertyBrowser::ShowOptionsToolShoulderPoint(QGraphicsItem *item) { @@ -1485,6 +1558,15 @@ void VToolOptionsPropertyBrowser::UpdateOptionsToolPointOfIntersection() idToProperty[VAbstractTool::AttrName]->setValue(i->name()); } +//--------------------------------------------------------------------------------------------------------------------- +void VToolOptionsPropertyBrowser::UpdateOptionsToolPointOfIntersectionArcs() +{ + VToolPointOfIntersectionArcs *i = qgraphicsitem_cast(currentItem); + + idToProperty[VAbstractTool::AttrName]->setValue(i->name()); + idToProperty[VAbstractTool::AttrCrossPoint]->setValue(static_cast(i->GetCrossArcsPoint())-1); +} + //--------------------------------------------------------------------------------------------------------------------- void VToolOptionsPropertyBrowser::UpdateOptionsToolShoulderPoint() { @@ -1611,6 +1693,7 @@ QStringList VToolOptionsPropertyBrowser::PropertiesList() const << VAbstractTool::AttrAxisP2 /* 24 */ << VAbstractTool::AttrKCurve /* 25 */ << VAbstractTool::AttrLineColor /* 26 */ - << VAbstractTool::AttrColor; /* 27 */ + << VAbstractTool::AttrColor /* 27 */ + << VAbstractTool::AttrCrossPoint; /* 28 */ return attr; } diff --git a/src/app/widgets/vtooloptionspropertybrowser.h b/src/app/widgets/vtooloptionspropertybrowser.h index e0830771a..f12b9d86f 100644 --- a/src/app/widgets/vtooloptionspropertybrowser.h +++ b/src/app/widgets/vtooloptionspropertybrowser.h @@ -71,6 +71,9 @@ private: template void AddPropertyPointName(Tool *i, const QString &propertyName); + template + void AddPropertyCrossPoint(Tool *i, const QString &propertyName); + template void AddPropertyLineType(Tool *i, const QString &propertyName, const QMap &styles); @@ -96,6 +99,7 @@ private: void ChangeDataToolNormal(VPE::VProperty *property); void ChangeDataToolPointOfContact(VPE::VProperty *property); void ChangeDataToolPointOfIntersection(VPE::VProperty *property); + void ChangeDataToolPointOfIntersectionArcs(VPE::VProperty *property); void ChangeDataToolShoulderPoint(VPE::VProperty *property); void ChangeDataToolSpline(VPE::VProperty *property); void ChangeDataToolSplinePath(VPE::VProperty *property); @@ -117,6 +121,7 @@ private: void ShowOptionsToolNormal(QGraphicsItem *item); void ShowOptionsToolPointOfContact(QGraphicsItem *item); void ShowOptionsToolPointOfIntersection(QGraphicsItem *item); + void ShowOptionsToolPointOfIntersectionArcs(QGraphicsItem *item); void ShowOptionsToolShoulderPoint(QGraphicsItem *item); void ShowOptionsToolSpline(QGraphicsItem *item); void ShowOptionsToolSplinePath(QGraphicsItem *item); @@ -138,6 +143,7 @@ private: void UpdateOptionsToolNormal(); void UpdateOptionsToolPointOfContact(); void UpdateOptionsToolPointOfIntersection(); + void UpdateOptionsToolPointOfIntersectionArcs(); void UpdateOptionsToolShoulderPoint(); void UpdateOptionsToolSpline(); void UpdateOptionsToolSplinePath(); diff --git a/src/app/xml/vpattern.h b/src/app/xml/vpattern.h index c532f4250..04e9b1ba8 100644 --- a/src/app/xml/vpattern.h +++ b/src/app/xml/vpattern.h @@ -38,7 +38,7 @@ class VMainGraphicsScene; enum class Document : char { LiteParse, LitePPParse, FullParse }; enum class LabelType : char {NewPatternPiece, NewLabel}; -enum class CrossArcPoint : char {FirstPoint = 1, SecondPoint = 2}; +enum class CrossArcsPoint : char {FirstPoint = 1, SecondPoint = 2}; /** * @brief The VPattern class working with pattern file. diff --git a/src/libs/vgeometry/vgobject.cpp b/src/libs/vgeometry/vgobject.cpp index 6046fe5bf..c0000900b 100644 --- a/src/libs/vgeometry/vgobject.cpp +++ b/src/libs/vgeometry/vgobject.cpp @@ -267,10 +267,36 @@ int VGObject::IntersectionCircles(const QPointF &c1, double r1, const QPointF &c { return 3;// Circles are equal } - const double a = 2.0 * (c2.x() - c1.x()); - const double b = 2.0 * (c2.y() - c1.y()); - const double c = c1.x() * c1.x() + c1.y() * c1.y() - r1 * r1 - (c2.x() * c2.x() + c2.y() * c2.y() - r2 * r2); - return LineIntersectCircle (c1, r1, CreateSegment(a, b, c), p1, p2); + const double a = - 2.0 * (c2.x() - c1.x()); + const double b = - 2.0 * (c2.y() - c1.y()); + const double c = (c2.x() - c1.x())* (c2.x() - c1.x()) + (c2.y() - c1.y()) * (c2.y() - c1.y()) + r1 * r1 - r2 * r2; + + const double x0 = -a*c/(a*a+b*b); + const double y0 = -b*c/(a*a+b*b); + + if (c*c > r1*r1*(a*a+b*b)) + { + return 0; + } + else if (qFuzzyCompare(c*c, r1*r1*(a*a+b*b))) + { + p1 = QPointF(x0 + c1.x(), y0 + c1.y()); + return 1; + } + else + { + const double d = r1*r1 - c*c/(a*a+b*b); + const double mult = sqrt (d / (a*a+b*b)); + + const double ax = x0 + b * mult; + const double bx = x0 - b * mult; + const double ay = y0 - a * mult; + const double by = y0 + a * mult; + + p1 = QPointF(ax + c1.x(), ay + c1.y()); + p2 = QPointF(bx + c1.x(), by + c1.y()); + return 2; + } } //--------------------------------------------------------------------------------------------------------------------- @@ -429,18 +455,6 @@ double VGObject::GetEpsilon(const QPointF &p1, const QPointF &p2) return epsilon; } -//--------------------------------------------------------------------------------------------------------------------- -QLineF VGObject::CreateSegment(double a, double b, double c) -{ - const double x1 = 0; - const double y1 = (-a*x1-c)/b; - - const double x2 = 1000; - const double y2 = (-a*x2-c)/b; - - return QLineF(x1, y1, x2, y2); -} - //--------------------------------------------------------------------------------------------------------------------- /** * @brief GetReversePoint return revers container of points. diff --git a/src/libs/vgeometry/vgobject.h b/src/libs/vgeometry/vgobject.h index 2e32741b3..de8075a76 100644 --- a/src/libs/vgeometry/vgobject.h +++ b/src/libs/vgeometry/vgobject.h @@ -90,7 +90,6 @@ private: static bool IsPointOnLineviaPDP(const QPointF &t, const QPointF &p1, const QPointF &p2); static double PerpDotProduct(const QPointF &t, const QPointF &p1, const QPointF &p2); static double GetEpsilon(const QPointF &p1, const QPointF &p2); - static QLineF CreateSegment(double a, double b, double c); }; #endif // VGOBJECT_H