diff --git a/src/app/geometry/vdetail.cpp b/src/app/geometry/vdetail.cpp index 4169fcf68..48303e819 100644 --- a/src/app/geometry/vdetail.cpp +++ b/src/app/geometry/vdetail.cpp @@ -289,10 +289,10 @@ VDetail VDetail::RemoveEdge(const quint32 &index) const VDetail det(*this); det.ClearNodes(); - QVector list = this->listNodePoint(); - quint32 edge = static_cast(list.size()); + // Edge can be only segment. We ignore all curves inside segments. + const quint32 edges = static_cast(listNodePoint().size()); quint32 k = 0; - for (quint32 i=0; iNodeOnEdge(i, p1, p2); - int j1 = this->indexOfNode(p1.getId()); + const int j1 = this->indexOfNode(p1.getId()); int j2 = this->indexOfNode(p2.getId()); if (j2 == 0) { j2 = this->CountNode()-1; - if (j1 == j2) - { - det.append(this->at(j1)); - ++k; - continue; - } } for (int j=j1; jat(j)); ++k; } diff --git a/src/app/tools/vtooluniondetails.cpp b/src/app/tools/vtooluniondetails.cpp index 80da08f26..e50f64b15 100644 --- a/src/app/tools/vtooluniondetails.cpp +++ b/src/app/tools/vtooluniondetails.cpp @@ -511,6 +511,7 @@ VToolUnionDetails* VToolUnionDetails::Create(const quint32 _id, const VDetail &d doc->UpdateToolData(id, data); } } + //First add tool to file VAbstractTool::AddRecord(id, Tool::UnionDetails, doc); if (parse == Document::FullParse) { @@ -528,6 +529,7 @@ VToolUnionDetails* VToolUnionDetails::Create(const quint32 _id, const VDetail &d } } + //Then create new details VNodeDetail det1p1; VNodeDetail det1p2; d1.NodeOnEdge(indexD1, det1p1, det1p2); @@ -550,28 +552,42 @@ VToolUnionDetails* VToolUnionDetails::Create(const quint32 _id, const VDetail &d point4.setX(point4.x()+dx); point4.setY(point4.y()+dy); - const qreal angle = QLineF(point4.toQPointF(), point3.toQPointF()).angleTo(QLineF(point1.toQPointF(), - point2.toQPointF())); - qint32 pointsD2 = 0; //Keeps count points second detail, what we already add. + const QLineF p4p3 = QLineF(point4.toQPointF(), point3.toQPointF()); + const QLineF p1p2 = QLineF(point1.toQPointF(), point2.toQPointF()); + + // How many points do we need to skip? + // If lengths of edges not equal we should left the second point of the second detail. + qint32 skip; + if (qFuzzyCompare(p1p2.length(), p4p3.length())) + { + skip = 2; + } + else + { + skip = 1; + } + + const qreal angle = p4p3.angleTo(p1p2); + qint32 pointsD2 = 0; //Keeps number points the second detail, what we have already added. + + const qint32 countNodeD1 = d1.RemoveEdge(indexD1).CountNode(); + const qint32 countNodeD2 = d2.RemoveEdge(indexD2).CountNode(); if (typeCreation == Source::FromGui) { - qint32 j = 0, i = 0; + qint32 i = 0; VDetail newDetail; do { AddToNewDetail(unionDetails, doc, data, newDetail, d1.RemoveEdge(indexD1), i, id); ++i; - if (i > d1.indexOfNode(det1p1.getId()) && pointsD2 < d2.RemoveEdge(indexD2).CountNode()-2) + if (i > d1.indexOfNode(det1p1.getId()) && pointsD2 < countNodeD2-2) { + qint32 j = 0; + FindIndexJ(pointsD2, d2, indexD2, j); do { - FindJ(pointsD2, d2, indexD2, j); - if (pointsD2 == d2.RemoveEdge(indexD2).CountNode() -2) - { - break; - } - if (j >= d2.RemoveEdge(indexD2).CountNode()) + if (j >= countNodeD2) { j=0; } @@ -579,9 +595,9 @@ VToolUnionDetails* VToolUnionDetails::Create(const quint32 _id, const VDetail &d det1p1.getId(), angle); ++pointsD2; ++j; - } while (pointsD2 < d2.RemoveEdge(indexD2).CountNode()); + } while (pointsD2 <= countNodeD2-skip); } - } while (i < d1.RemoveEdge(indexD1).CountNode()); + } while (i < countNodeD1); newDetail.setName("Detail"); newDetail.setWidth(d1.getWidth()); @@ -604,20 +620,17 @@ VToolUnionDetails* VToolUnionDetails::Create(const quint32 _id, const VDetail &d else { quint32 idCount = 0; - qint32 j = 0, i = 0; + qint32 i = 0; do { UpdatePoints(id, data, d1.RemoveEdge(indexD1), i, idCount); ++i; - if (i > d1.indexOfNode(det1p1.getId()) && pointsD2 < d2.RemoveEdge(indexD2).CountNode()-2) + if (i > d1.indexOfNode(det1p1.getId()) && pointsD2 < countNodeD2-2) { + qint32 j = 0; + FindIndexJ(pointsD2, d2, indexD2, j); do { - FindJ(pointsD2, d2, indexD2, j); - if (pointsD2 == d2.RemoveEdge(indexD2).CountNode()-2) - { - break; - } if (j >= d2.RemoveEdge(indexD2).CountNode()) { j=0; @@ -625,9 +638,9 @@ VToolUnionDetails* VToolUnionDetails::Create(const quint32 _id, const VDetail &d UpdatePoints(id, data, d2.RemoveEdge(indexD2), j, idCount, dx, dy, det1p1.getId(), angle); ++pointsD2; ++j; - } while (pointsD2 < d2.RemoveEdge(indexD2).CountNode()); + } while (pointsD2 <= countNodeD2-skip); } - } while (i GetDetailFromFile(VPattern *doc, const QDomElement &domElement); static const QString TagName; static const QString ToolType;