Fixed issue #521. Error: Can't create Seam Allowance after using Union Tool.
--HG-- branch : develop
This commit is contained in:
parent
14afb2ce9b
commit
0e24fae91c
|
@ -187,6 +187,7 @@ void DialogDetail::NameDetailChanged()
|
|||
void DialogDetail::NewItem(quint32 id, const Tool &typeTool, const NodeDetail &typeNode,
|
||||
qreal mx, qreal my, bool reverse)
|
||||
{
|
||||
SCASSERT(id > NULL_ID);
|
||||
QString name;
|
||||
switch (typeTool)
|
||||
{
|
||||
|
@ -214,8 +215,7 @@ void DialogDetail::NewItem(quint32 id, const Tool &typeTool, const NodeDetail &t
|
|||
}
|
||||
else
|
||||
{
|
||||
const QString previousItemName = ui.listWidget->item(ui.listWidget->count()-1)->text();
|
||||
if(QString::compare(previousItemName, name) != 0)
|
||||
if(RowId(ui.listWidget->count()-1) != id)
|
||||
{
|
||||
canAddNewPoint = true;
|
||||
}
|
||||
|
@ -289,6 +289,15 @@ void DialogDetail::EnableObjectGUI(bool value)
|
|||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
quint32 DialogDetail::RowId(int i) const
|
||||
{
|
||||
const QListWidgetItem *rowItem = ui.listWidget->item(i);
|
||||
SCASSERT(rowItem != nullptr);
|
||||
const VNodeDetail rowNode = qvariant_cast<VNodeDetail>(rowItem->data(Qt::UserRole));
|
||||
return rowNode.getId();
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
/**
|
||||
* @brief setDetails set detail
|
||||
|
@ -523,10 +532,7 @@ bool DialogDetail::DetailIsValid() const
|
|||
{
|
||||
for (int i=0, sz = ui.listWidget->count()-1; i<sz; ++i)
|
||||
{
|
||||
const QString previousRow = ui.listWidget->item(i)->text();
|
||||
const QString nextRow = ui.listWidget->item(i+1)->text();
|
||||
|
||||
if (QString::compare(previousRow, nextRow) == 0)
|
||||
if (RowId(i) == RowId(i+1))
|
||||
{
|
||||
url += tr("You have double points!");
|
||||
ui.helpLabel->setText(url);
|
||||
|
@ -544,10 +550,7 @@ bool DialogDetail::FirstPointEqualLast() const
|
|||
{
|
||||
if (ui.listWidget->count() > 1)
|
||||
{
|
||||
const QString firstDetailPoint = ui.listWidget->item(0)->text();
|
||||
const QString lastDetailPoint = ui.listWidget->item(ui.listWidget->count()-1)->text();
|
||||
|
||||
if (QString::compare(firstDetailPoint, lastDetailPoint) == 0)
|
||||
if (RowId(0) == RowId(ui.listWidget->count()-1))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -87,6 +87,7 @@ private:
|
|||
VDetail CreateDetail() const;
|
||||
void ValidObjects(bool value);
|
||||
void EnableObjectGUI(bool value);
|
||||
quint32 RowId(int i) const;
|
||||
};
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
|
|
|
@ -111,51 +111,45 @@ void VToolUnionDetails::AddToNewDetail(VMainGraphicsScene *scene, VAbstractPatte
|
|||
switch (det.at(i).getTypeTool())
|
||||
{
|
||||
case (Tool::NodePoint):
|
||||
{
|
||||
if ( qFuzzyIsNull(dx) && qFuzzyIsNull(dy) && (pRotate == 0))
|
||||
{
|
||||
id = det.at(i).getId();
|
||||
}
|
||||
else
|
||||
{
|
||||
VPointF *point = new VPointF(*data->GeometricObject<VPointF>(det.at(i).getId()));
|
||||
point->setMode(Draw::Modeling);
|
||||
|
||||
if (not qFuzzyIsNull(dx) || not qFuzzyIsNull(dy) || pRotate != NULL_ID)
|
||||
{
|
||||
BiasRotatePoint(point, dx, dy, *data->GeometricObject<VPointF>(pRotate), angle);
|
||||
}
|
||||
|
||||
idObject = data->AddGObject(point);
|
||||
children.append(idObject);
|
||||
VPointF *point1 = new VPointF(*point);
|
||||
point1->setMode(Draw::Modeling);
|
||||
id = data->AddGObject(point1);
|
||||
VNodePoint::Create(doc, data, scene, id, idObject, Document::FullParse, Source::FromGui, drawName,
|
||||
idTool);
|
||||
}
|
||||
VNodePoint::Create(doc, data, scene, id, idObject, Document::FullParse, Source::FromGui, drawName, idTool);
|
||||
}
|
||||
break;
|
||||
case (Tool::NodeArc):
|
||||
{
|
||||
if (qFuzzyIsNull(dx) && qFuzzyIsNull(dy) && pRotate == 0)
|
||||
{
|
||||
id = det.at(i).getId();
|
||||
}
|
||||
else
|
||||
{
|
||||
const QPointF p = *data->GeometricObject<VPointF>(pRotate);
|
||||
const QSharedPointer<VArc> arc = data->GeometricObject<VArc>(det.at(i).getId());
|
||||
VPointF p1 = VPointF(arc->GetP1(), "A", 0, 0);
|
||||
BiasRotatePoint(&p1, dx, dy, p, angle);
|
||||
VPointF p2 = VPointF(arc->GetP2(), "A", 0, 0);
|
||||
BiasRotatePoint(&p2, dx, dy, p, angle);
|
||||
VPointF *center = new VPointF(arc->GetCenter());
|
||||
|
||||
if (not qFuzzyIsNull(dx) || not qFuzzyIsNull(dy) || pRotate != NULL_ID)
|
||||
{
|
||||
BiasRotatePoint(&p1, dx, dy, p, angle);
|
||||
BiasRotatePoint(&p2, dx, dy, p, angle);
|
||||
BiasRotatePoint(center, dx, dy, p, angle);
|
||||
}
|
||||
|
||||
QLineF l1(*center, p1);
|
||||
QLineF l2(*center, p2);
|
||||
center->setMode(Draw::Modeling);
|
||||
quint32 idCenter = data->AddGObject(center);
|
||||
Q_UNUSED(idCenter);
|
||||
VArc *arc1 = new VArc(*center, arc->GetRadius(), arc->GetFormulaRadius(),
|
||||
l1.angle(), QString().setNum(l1.angle()), l2.angle(),
|
||||
QString().setNum(l2.angle()));
|
||||
VArc *arc1 = new VArc(*center, arc->GetRadius(), arc->GetFormulaRadius(), l1.angle(),
|
||||
QString().setNum(l1.angle()), l2.angle(), QString().setNum(l2.angle()));
|
||||
arc1->setMode(Draw::Modeling);
|
||||
idObject = data->AddGObject(arc1);
|
||||
children.append(idObject);
|
||||
|
@ -166,31 +160,25 @@ void VToolUnionDetails::AddToNewDetail(VMainGraphicsScene *scene, VAbstractPatte
|
|||
|
||||
VNodeArc::Create(doc, data, id, idObject, Document::FullParse, Source::FromGui, drawName, idTool);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case (Tool::NodeSpline):
|
||||
{
|
||||
if (qFuzzyIsNull(dx) && qFuzzyIsNull(dy) && pRotate == 0)
|
||||
{
|
||||
id = det.at(i).getId();
|
||||
}
|
||||
else
|
||||
{
|
||||
const QSharedPointer<VAbstractCubicBezier> spline =
|
||||
data->GeometricObject<VAbstractCubicBezier>(det.at(i).getId());
|
||||
|
||||
const QPointF p = *data->GeometricObject<VPointF>(pRotate);
|
||||
VPointF *p1 = new VPointF(spline->GetP1());
|
||||
BiasRotatePoint(p1, dx, dy, p, angle);
|
||||
|
||||
VPointF p2 = VPointF(spline->GetP2());
|
||||
BiasRotatePoint(&p2, dx, dy, p, angle);
|
||||
|
||||
VPointF p3 = VPointF(spline->GetP3());
|
||||
BiasRotatePoint(&p3, dx, dy, p, angle);
|
||||
|
||||
VPointF *p4 = new VPointF(spline->GetP4());
|
||||
|
||||
if (not qFuzzyIsNull(dx) || not qFuzzyIsNull(dy) || pRotate != NULL_ID)
|
||||
{
|
||||
BiasRotatePoint(p1, dx, dy, p, angle);
|
||||
BiasRotatePoint(&p2, dx, dy, p, angle);
|
||||
BiasRotatePoint(&p3, dx, dy, p, angle);
|
||||
BiasRotatePoint(p4, dx, dy, p, angle);
|
||||
}
|
||||
|
||||
VSpline *spl = new VSpline(*p1, p2, p3, *p4, 0, Draw::Modeling);
|
||||
idObject = data->AddGObject(spl);
|
||||
|
@ -204,15 +192,8 @@ void VToolUnionDetails::AddToNewDetail(VMainGraphicsScene *scene, VAbstractPatte
|
|||
delete p4;
|
||||
delete p1;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case (Tool::NodeSplinePath):
|
||||
{
|
||||
if (qFuzzyIsNull(dx) && qFuzzyIsNull(dy) && pRotate == 0)
|
||||
{
|
||||
id = det.at(i).getId();
|
||||
}
|
||||
else
|
||||
{
|
||||
VSplinePath *path = new VSplinePath();
|
||||
path->setMode(Draw::Modeling);
|
||||
|
@ -224,16 +205,16 @@ void VToolUnionDetails::AddToNewDetail(VMainGraphicsScene *scene, VAbstractPatte
|
|||
|
||||
const QPointF p = *data->GeometricObject<VPointF>(pRotate);
|
||||
VPointF *p1 = new VPointF(spline.GetP1());
|
||||
BiasRotatePoint(p1, dx, dy, p, angle);
|
||||
|
||||
VPointF p2 = VPointF(spline.GetP2());
|
||||
BiasRotatePoint(&p2, dx, dy, p, angle);
|
||||
|
||||
VPointF p3 = VPointF(spline.GetP3());
|
||||
BiasRotatePoint(&p3, dx, dy, p, angle);
|
||||
|
||||
VPointF *p4 = new VPointF(spline.GetP4());
|
||||
if (not qFuzzyIsNull(dx) || not qFuzzyIsNull(dy) || pRotate != NULL_ID)
|
||||
{
|
||||
BiasRotatePoint(p1, dx, dy, p, angle);
|
||||
BiasRotatePoint(&p2, dx, dy, p, angle);
|
||||
BiasRotatePoint(&p3, dx, dy, p, angle);
|
||||
BiasRotatePoint(p4, dx, dy, p, angle);
|
||||
}
|
||||
|
||||
VSpline spl = VSpline(*p1, p2, p3, *p4);
|
||||
if (i==1)
|
||||
|
@ -268,9 +249,7 @@ void VToolUnionDetails::AddToNewDetail(VMainGraphicsScene *scene, VAbstractPatte
|
|||
VSplinePath *path1 = new VSplinePath(*path);
|
||||
path1->setMode(Draw::Modeling);
|
||||
id = data->AddGObject(path1);
|
||||
VNodeSplinePath::Create(doc, data, id, idObject, Document::FullParse, Source::FromGui, drawName,
|
||||
idTool);
|
||||
}
|
||||
VNodeSplinePath::Create(doc, data, id, idObject, Document::FullParse, Source::FromGui, drawName, idTool);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
@ -300,30 +279,30 @@ void VToolUnionDetails::UpdatePoints(VContainer *data, const VDetail &det, const
|
|||
switch (det.at(i).getTypeTool())
|
||||
{
|
||||
case (Tool::NodePoint):
|
||||
{
|
||||
if (not qFuzzyIsNull(dx) || not qFuzzyIsNull(dy) || pRotate != 0)
|
||||
{
|
||||
VPointF *point = new VPointF(*data->GeometricObject<VPointF>(det.at(i).getId()));
|
||||
point->setMode(Draw::Modeling);
|
||||
if (not qFuzzyIsNull(dx) || not qFuzzyIsNull(dy) || pRotate != NULL_ID)
|
||||
{
|
||||
BiasRotatePoint(point, dx, dy, *data->GeometricObject<VPointF>(pRotate), angle);
|
||||
data->UpdateGObject(TakeNextId(children), point);
|
||||
}
|
||||
data->UpdateGObject(TakeNextId(children), point);
|
||||
}
|
||||
break;
|
||||
case (Tool::NodeArc):
|
||||
{
|
||||
if (not qFuzzyIsNull(dx) || not qFuzzyIsNull(dy) || pRotate != 0)
|
||||
{
|
||||
const QPointF p = *data->GeometricObject<VPointF>(pRotate);
|
||||
const QSharedPointer<VArc> arc = data->GeometricObject<VArc>(det.at(i).getId());
|
||||
VPointF p1 = VPointF(arc->GetP1());
|
||||
BiasRotatePoint(&p1, dx, dy, p, angle);
|
||||
|
||||
VPointF p2 = VPointF(arc->GetP2());
|
||||
BiasRotatePoint(&p2, dx, dy, p, angle);
|
||||
|
||||
VPointF *center = new VPointF(arc->GetCenter());
|
||||
|
||||
if (not qFuzzyIsNull(dx) || not qFuzzyIsNull(dy) || pRotate != NULL_ID)
|
||||
{
|
||||
BiasRotatePoint(&p1, dx, dy, p, angle);
|
||||
BiasRotatePoint(&p2, dx, dy, p, angle);
|
||||
BiasRotatePoint(center, dx, dy, p, angle);
|
||||
}
|
||||
|
||||
QLineF l1(*center, p1);
|
||||
QLineF l2(*center, p2);
|
||||
|
@ -334,38 +313,33 @@ void VToolUnionDetails::UpdatePoints(VContainer *data, const VDetail &det, const
|
|||
data->UpdateGObject(TakeNextId(children), arc1);
|
||||
delete center;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case (Tool::NodeSpline):
|
||||
{
|
||||
if (not qFuzzyIsNull(dx) || not qFuzzyIsNull(dy) || pRotate != 0)
|
||||
{
|
||||
const QSharedPointer<VAbstractCubicBezier> spline =
|
||||
data->GeometricObject<VAbstractCubicBezier>(det.at(i).getId());
|
||||
|
||||
const QPointF p = *data->GeometricObject<VPointF>(pRotate);
|
||||
VPointF *p1 = new VPointF(spline->GetP1());
|
||||
BiasRotatePoint(p1, dx, dy, p, angle);
|
||||
|
||||
VPointF p2 = VPointF(spline->GetP2());
|
||||
BiasRotatePoint(&p2, dx, dy, p, angle);
|
||||
|
||||
VPointF p3 = VPointF(spline->GetP3());
|
||||
BiasRotatePoint(&p3, dx, dy, p, angle);
|
||||
|
||||
VPointF *p4 = new VPointF(spline->GetP4());
|
||||
|
||||
if (not qFuzzyIsNull(dx) || not qFuzzyIsNull(dy) || pRotate != NULL_ID)
|
||||
{
|
||||
BiasRotatePoint(p1, dx, dy, p, angle);
|
||||
BiasRotatePoint(&p2, dx, dy, p, angle);
|
||||
BiasRotatePoint(&p3, dx, dy, p, angle);
|
||||
BiasRotatePoint(p4, dx, dy, p, angle);
|
||||
}
|
||||
|
||||
VSpline *spl = new VSpline(*p1, p2, p3, *p4, 0, Draw::Modeling);
|
||||
data->UpdateGObject(TakeNextId(children), spl);
|
||||
delete p1;
|
||||
delete p4;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case (Tool::NodeSplinePath):
|
||||
{
|
||||
if (not qFuzzyIsNull(dx) || not qFuzzyIsNull(dy) || pRotate != 0)
|
||||
{
|
||||
VSplinePath *path = new VSplinePath();
|
||||
path->setMode(Draw::Modeling);
|
||||
|
@ -378,16 +352,17 @@ void VToolUnionDetails::UpdatePoints(VContainer *data, const VDetail &det, const
|
|||
|
||||
const QPointF p = *data->GeometricObject<VPointF>(pRotate);
|
||||
VPointF *p1 = new VPointF(spline.GetP1());
|
||||
BiasRotatePoint(p1, dx, dy, p, angle);
|
||||
|
||||
VPointF p2 = VPointF(spline.GetP2());
|
||||
BiasRotatePoint(&p2, dx, dy, p, angle);
|
||||
|
||||
VPointF p3 = VPointF(spline.GetP3());
|
||||
BiasRotatePoint(&p3, dx, dy, p, angle);
|
||||
|
||||
VPointF *p4 = new VPointF(spline.GetP4());
|
||||
|
||||
if (not qFuzzyIsNull(dx) || not qFuzzyIsNull(dy) || pRotate != NULL_ID)
|
||||
{
|
||||
BiasRotatePoint(p1, dx, dy, p, angle);
|
||||
BiasRotatePoint(&p2, dx, dy, p, angle);
|
||||
BiasRotatePoint(&p3, dx, dy, p, angle);
|
||||
BiasRotatePoint(p4, dx, dy, p, angle);
|
||||
}
|
||||
|
||||
VSpline spl = VSpline(*p1, p2, p3, *p4);
|
||||
if (i==1)
|
||||
|
@ -419,7 +394,6 @@ void VToolUnionDetails::UpdatePoints(VContainer *data, const VDetail &det, const
|
|||
}
|
||||
data->UpdateGObject(TakeNextId(children), path);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
qDebug()<<"May be wrong tool type!!! Ignoring."<<Q_FUNC_INFO;
|
||||
|
@ -671,11 +645,17 @@ VToolUnionDetails* VToolUnionDetails::Create(const quint32 _id, const VDetail &d
|
|||
qint32 i = 0;
|
||||
do
|
||||
{
|
||||
//UpdatePoints(data, d1.RemoveEdge(indexD1), i, children);
|
||||
++i;
|
||||
if (i > d1.indexOfNode(det1p1.getId()))
|
||||
// This check need for backward compatibility
|
||||
// Remove it if min version is 0.3.2
|
||||
// Instead:
|
||||
// UpdatePoints(data, d1.RemoveEdge(indexD1), i, children);
|
||||
if (children.size() != countNodeD2)
|
||||
{
|
||||
UpdatePoints(data, d1.RemoveEdge(indexD1), i, children);
|
||||
}
|
||||
++i;
|
||||
if (i > d1.indexOfNode(det1p1.getId()) && pointsD2 < countNodeD2-1)
|
||||
{
|
||||
const int childrenCount = children.size();
|
||||
VDetail d2REdge = d2.RemoveEdge(indexD2);
|
||||
qint32 j = 0;
|
||||
FindIndexJ(pointsD2, d2, indexD2, j);
|
||||
|
@ -688,9 +668,14 @@ VToolUnionDetails* VToolUnionDetails::Create(const quint32 _id, const VDetail &d
|
|||
UpdatePoints(data, d2REdge, j, children, dx, dy, det1p1.getId(), angle);
|
||||
++pointsD2;
|
||||
++j;
|
||||
} while (pointsD2 < childrenCount);
|
||||
} while (pointsD2 < countNodeD2-1);
|
||||
// This check need for backward compatibility
|
||||
// Remove it if min version is 0.3.2
|
||||
if (children.size() == countNodeD2)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
} while (i<countNodeD1);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -72,10 +72,10 @@ public:
|
|||
static void AddToNewDetail(VMainGraphicsScene *scene, VAbstractPattern *doc, VContainer *data,
|
||||
VDetail &newDetail, const VDetail &det, const int &i, const quint32 &idTool,
|
||||
QVector<quint32> &children, const QString &drawName, const qreal &dx = 0,
|
||||
const qreal &dy = 0, const quint32 &pRotate = 0, const qreal &angle = 0);
|
||||
const qreal &dy = 0, const quint32 &pRotate = NULL_ID, const qreal &angle = 0);
|
||||
static void UpdatePoints(VContainer *data, const VDetail &det, const int &i,
|
||||
QVector<quint32> &children, const qreal &dx = 0, const qreal &dy = 0,
|
||||
const quint32 &pRotate = 0, const qreal &angle = 0);
|
||||
const quint32 &pRotate = NULL_ID, const qreal &angle = 0);
|
||||
static void BiasRotatePoint(VPointF *point, const qreal &dx, const qreal &dy, const QPointF &pRotate,
|
||||
const qreal &angle);
|
||||
virtual QString getTagName() const Q_DECL_OVERRIDE;
|
||||
|
|
Loading…
Reference in New Issue
Block a user