When we unite two detalis don't skip a point of a second detail if edges length

don't equal.

--HG--
branch : develop
This commit is contained in:
Roman Telezhynskyi 2015-03-30 15:43:30 +03:00
parent b104f0dfa5
commit a38448623c
3 changed files with 45 additions and 38 deletions

View File

@ -289,10 +289,10 @@ VDetail VDetail::RemoveEdge(const quint32 &index) const
VDetail det(*this); VDetail det(*this);
det.ClearNodes(); det.ClearNodes();
QVector<VNodeDetail> list = this->listNodePoint(); // Edge can be only segment. We ignore all curves inside segments.
quint32 edge = static_cast<quint32>(list.size()); const quint32 edges = static_cast<quint32>(listNodePoint().size());
quint32 k = 0; quint32 k = 0;
for (quint32 i=0; i<edge; ++i) for (quint32 i=0; i<edges; ++i)
{ {
if (i == index) if (i == index)
{ {
@ -304,20 +304,14 @@ VDetail VDetail::RemoveEdge(const quint32 &index) const
VNodeDetail p1; VNodeDetail p1;
VNodeDetail p2; VNodeDetail p2;
this->NodeOnEdge(i, p1, p2); this->NodeOnEdge(i, p1, p2);
int j1 = this->indexOfNode(p1.getId()); const int j1 = this->indexOfNode(p1.getId());
int j2 = this->indexOfNode(p2.getId()); int j2 = this->indexOfNode(p2.getId());
if (j2 == 0) if (j2 == 0)
{ {
j2 = this->CountNode()-1; j2 = this->CountNode()-1;
if (j1 == j2)
{
det.append(this->at(j1));
++k;
continue;
}
} }
for (int j=j1; j<j2; ++j) for (int j=j1; j<j2; ++j)
{ {// Add "segment" except last point. Inside can be curves too.
det.append(this->at(j)); det.append(this->at(j));
++k; ++k;
} }

View File

@ -511,6 +511,7 @@ VToolUnionDetails* VToolUnionDetails::Create(const quint32 _id, const VDetail &d
doc->UpdateToolData(id, data); doc->UpdateToolData(id, data);
} }
} }
//First add tool to file
VAbstractTool::AddRecord(id, Tool::UnionDetails, doc); VAbstractTool::AddRecord(id, Tool::UnionDetails, doc);
if (parse == Document::FullParse) if (parse == Document::FullParse)
{ {
@ -528,6 +529,7 @@ VToolUnionDetails* VToolUnionDetails::Create(const quint32 _id, const VDetail &d
} }
} }
//Then create new details
VNodeDetail det1p1; VNodeDetail det1p1;
VNodeDetail det1p2; VNodeDetail det1p2;
d1.NodeOnEdge(indexD1, det1p1, 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.setX(point4.x()+dx);
point4.setY(point4.y()+dy); point4.setY(point4.y()+dy);
const qreal angle = QLineF(point4.toQPointF(), point3.toQPointF()).angleTo(QLineF(point1.toQPointF(), const QLineF p4p3 = QLineF(point4.toQPointF(), point3.toQPointF());
point2.toQPointF())); const QLineF p1p2 = QLineF(point1.toQPointF(), point2.toQPointF());
qint32 pointsD2 = 0; //Keeps count points second detail, what we already add.
// 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) if (typeCreation == Source::FromGui)
{ {
qint32 j = 0, i = 0; qint32 i = 0;
VDetail newDetail; VDetail newDetail;
do do
{ {
AddToNewDetail(unionDetails, doc, data, newDetail, d1.RemoveEdge(indexD1), i, id); AddToNewDetail(unionDetails, doc, data, newDetail, d1.RemoveEdge(indexD1), i, id);
++i; ++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 do
{ {
FindJ(pointsD2, d2, indexD2, j); if (j >= countNodeD2)
if (pointsD2 == d2.RemoveEdge(indexD2).CountNode() -2)
{
break;
}
if (j >= d2.RemoveEdge(indexD2).CountNode())
{ {
j=0; j=0;
} }
@ -579,9 +595,9 @@ VToolUnionDetails* VToolUnionDetails::Create(const quint32 _id, const VDetail &d
det1p1.getId(), angle); det1p1.getId(), angle);
++pointsD2; ++pointsD2;
++j; ++j;
} while (pointsD2 < d2.RemoveEdge(indexD2).CountNode()); } while (pointsD2 <= countNodeD2-skip);
} }
} while (i < d1.RemoveEdge(indexD1).CountNode()); } while (i < countNodeD1);
newDetail.setName("Detail"); newDetail.setName("Detail");
newDetail.setWidth(d1.getWidth()); newDetail.setWidth(d1.getWidth());
@ -604,20 +620,17 @@ VToolUnionDetails* VToolUnionDetails::Create(const quint32 _id, const VDetail &d
else else
{ {
quint32 idCount = 0; quint32 idCount = 0;
qint32 j = 0, i = 0; qint32 i = 0;
do do
{ {
UpdatePoints(id, data, d1.RemoveEdge(indexD1), i, idCount); UpdatePoints(id, data, d1.RemoveEdge(indexD1), i, idCount);
++i; ++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 do
{ {
FindJ(pointsD2, d2, indexD2, j);
if (pointsD2 == d2.RemoveEdge(indexD2).CountNode()-2)
{
break;
}
if (j >= d2.RemoveEdge(indexD2).CountNode()) if (j >= d2.RemoveEdge(indexD2).CountNode())
{ {
j=0; 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); UpdatePoints(id, data, d2.RemoveEdge(indexD2), j, idCount, dx, dy, det1p1.getId(), angle);
++pointsD2; ++pointsD2;
++j; ++j;
} while (pointsD2 < d2.RemoveEdge(indexD2).CountNode()); } while (pointsD2 <= countNodeD2-skip);
} }
} while (i<d1.RemoveEdge(indexD1).CountNode()); } while (i<countNodeD1);
} }
return nullptr; return nullptr;
} }
@ -643,20 +656,20 @@ void VToolUnionDetails::PointsOnEdge(const VDetail &d, const quint32 &index, VPo
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
void VToolUnionDetails::FindJ(const qint32 &pointsD2, const VDetail &d2, const quint32 &indexD2, qint32 &j) void VToolUnionDetails::FindIndexJ(const qint32 &pointsD2, const VDetail &d2, const quint32 &indexD2, qint32 &j)
{ {
if (pointsD2 == 0) if (pointsD2 == 0)
{ {
VNodeDetail node1; VNodeDetail node1;
VNodeDetail node2; VNodeDetail node2;
d2.NodeOnEdge(indexD2, node1, node2); d2.NodeOnEdge(indexD2, node1, node2);
int k = d2.RemoveEdge(indexD2).indexOfNode(node2.getId()); const int k = d2.RemoveEdge(indexD2).indexOfNode(node2.getId());
if (k == d2.RemoveEdge(indexD2).CountNode()-1) if (k == d2.RemoveEdge(indexD2).CountNode()-1)
{ {//We have last node in detail, we wil begin from 0
j = 0; j = 0;
} }
else else
{ {// Continue from next node
j = d2.RemoveEdge(indexD2).indexOfNode(node2.getId())+1; j = d2.RemoveEdge(indexD2).indexOfNode(node2.getId())+1;
} }
} }

View File

@ -56,7 +56,7 @@ public:
VMainGraphicsScene *scene, VPattern *doc, VContainer *data, const Document &parse, VMainGraphicsScene *scene, VPattern *doc, VContainer *data, const Document &parse,
const Source &typeCreation); const Source &typeCreation);
static void PointsOnEdge(const VDetail &d, const quint32 &index, VPointF &p1, VPointF &p2, VContainer *data); static void PointsOnEdge(const VDetail &d, const quint32 &index, VPointF &p1, VPointF &p2, VContainer *data);
static void FindJ(const qint32 &pointsD2, const VDetail &d2, const quint32 &indexD2, qint32 &j); static void FindIndexJ(const qint32 &pointsD2, const VDetail &d2, const quint32 &indexD2, qint32 &j);
static QVector<VDetail> GetDetailFromFile(VPattern *doc, const QDomElement &domElement); static QVector<VDetail> GetDetailFromFile(VPattern *doc, const QDomElement &domElement);
static const QString TagName; static const QString TagName;
static const QString ToolType; static const QString ToolType;