Visualization for VToolTriangle.

--HG--
branch : develop
This commit is contained in:
dismine 2014-08-14 14:16:02 +03:00
parent 16fa925021
commit ade24ab84d
20 changed files with 409 additions and 81 deletions

View File

@ -30,6 +30,8 @@
#include "ui_dialogtriangle.h" #include "ui_dialogtriangle.h"
#include "../../geometry/vpointf.h" #include "../../geometry/vpointf.h"
#include "../../container/vcontainer.h" #include "../../container/vcontainer.h"
#include "../../visualization/vistooltriangle.h"
#include "../../widgets/vmaingraphicsscene.h"
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
/** /**
@ -39,12 +41,12 @@
*/ */
DialogTriangle::DialogTriangle(const VContainer *data, const quint32 &toolId, QWidget *parent) DialogTriangle::DialogTriangle(const VContainer *data, const quint32 &toolId, QWidget *parent)
:DialogTool(data, toolId, parent), ui(new Ui::DialogTriangle), number(0), pointName(QString()), axisP1Id(0), :DialogTool(data, toolId, parent), ui(new Ui::DialogTriangle), number(0), pointName(QString()), axisP1Id(0),
axisP2Id(0), firstPointId(0), secondPointId(0) axisP2Id(0), firstPointId(0), secondPointId(0), line (nullptr)
{ {
ui->setupUi(this); ui->setupUi(this);
labelEditNamePoint = ui->labelEditNamePoint; labelEditNamePoint = ui->labelEditNamePoint;
InitOkCancel(ui); InitOkCancelApply(ui);
flagName = false; flagName = false;
CheckState(); CheckState();
@ -62,11 +64,14 @@ DialogTriangle::DialogTriangle(const VContainer *data, const quint32 &toolId, QW
this, &DialogTriangle::PointNameChanged); this, &DialogTriangle::PointNameChanged);
connect(ui->comboBoxAxisP2, static_cast<void (QComboBox::*)(const QString &)>(&QComboBox::currentIndexChanged), connect(ui->comboBoxAxisP2, static_cast<void (QComboBox::*)(const QString &)>(&QComboBox::currentIndexChanged),
this, &DialogTriangle::PointNameChanged); this, &DialogTriangle::PointNameChanged);
line = new VisToolTriangle(data);
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
DialogTriangle::~DialogTriangle() DialogTriangle::~DialogTriangle()
{ {
delete line;
delete ui; delete ui;
} }
@ -86,21 +91,29 @@ void DialogTriangle::ChosenObject(quint32 id, const SceneObject &type)
case (0): case (0):
ChangeCurrentText(ui->comboBoxAxisP1, point->name()); ChangeCurrentText(ui->comboBoxAxisP1, point->name());
number++; number++;
line->VisualMode(id);
emit ToolTip(tr("Select second point of axis")); emit ToolTip(tr("Select second point of axis"));
break; break;
case (1): case (1):
ChangeCurrentText(ui->comboBoxAxisP2, point->name()); ChangeCurrentText(ui->comboBoxAxisP2, point->name());
number++; number++;
line->setPoint2Id(id);
line->RefreshGeometry();
emit ToolTip(tr("Select first point")); emit ToolTip(tr("Select first point"));
break; break;
case (2): case (2):
ChangeCurrentText(ui->comboBoxFirstPoint, point->name()); ChangeCurrentText(ui->comboBoxFirstPoint, point->name());
number++; number++;
line->setHypotenuseP1Id(id);
line->RefreshGeometry();
emit ToolTip(tr("Select second point")); emit ToolTip(tr("Select second point"));
break; break;
case (3): case (3):
ChangeCurrentText(ui->comboBoxSecondPoint, point->name()); ChangeCurrentText(ui->comboBoxSecondPoint, point->name());
number = 0; number = 0;
line->setHypotenuseP2Id(id);
line->RefreshGeometry();
prepare = true;
emit ToolTip(tr("")); emit ToolTip(tr(""));
if (isInitialized == false) if (isInitialized == false)
{ {
@ -122,6 +135,12 @@ void DialogTriangle::SaveData()
secondPointId = getCurrentObjectId(ui->comboBoxSecondPoint); secondPointId = getCurrentObjectId(ui->comboBoxSecondPoint);
axisP1Id = getCurrentObjectId(ui->comboBoxAxisP1); axisP1Id = getCurrentObjectId(ui->comboBoxAxisP1);
axisP2Id = getCurrentObjectId(ui->comboBoxAxisP2); axisP2Id = getCurrentObjectId(ui->comboBoxAxisP2);
line->setPoint1Id(axisP1Id);
line->setPoint2Id(axisP2Id);
line->setHypotenuseP1Id(firstPointId);
line->setHypotenuseP2Id(secondPointId);
line->RefreshGeometry();
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
@ -134,7 +153,7 @@ void DialogTriangle::PointNameChanged()
set.insert(getCurrentObjectId(ui->comboBoxAxisP2)); set.insert(getCurrentObjectId(ui->comboBoxAxisP2));
QColor color = okColor; QColor color = okColor;
if (set.size() != 4) if (set.size() < 3)//Need tree or more unique points for creation triangle
{ {
flagError = false; flagError = false;
color = errorColor; color = errorColor;
@ -151,6 +170,18 @@ void DialogTriangle::PointNameChanged()
CheckState(); CheckState();
} }
//---------------------------------------------------------------------------------------------------------------------
void DialogTriangle::ShowVisualization()
{
if (prepare == false)
{
VMainGraphicsScene *scene = qApp->getCurrentScene();
connect(scene, &VMainGraphicsScene::NewFactor, line, &VisLine::SetFactor);
scene->addItem(line);
line->RefreshGeometry();
}
}
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
/** /**
* @brief setPointName set name of point * @brief setPointName set name of point
@ -170,6 +201,7 @@ void DialogTriangle::setPointName(const QString &value)
void DialogTriangle::setSecondPointId(const quint32 &value) void DialogTriangle::setSecondPointId(const quint32 &value)
{ {
setPointId(ui->comboBoxSecondPoint, secondPointId, value); setPointId(ui->comboBoxSecondPoint, secondPointId, value);
line->setHypotenuseP2Id(secondPointId);
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
@ -180,6 +212,7 @@ void DialogTriangle::setSecondPointId(const quint32 &value)
void DialogTriangle::setFirstPointId(const quint32 &value) void DialogTriangle::setFirstPointId(const quint32 &value)
{ {
setPointId(ui->comboBoxFirstPoint, firstPointId, value); setPointId(ui->comboBoxFirstPoint, firstPointId, value);
line->setHypotenuseP1Id(firstPointId);
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
@ -190,6 +223,7 @@ void DialogTriangle::setFirstPointId(const quint32 &value)
void DialogTriangle::setAxisP2Id(const quint32 &value) void DialogTriangle::setAxisP2Id(const quint32 &value)
{ {
setPointId(ui->comboBoxAxisP2, axisP2Id, value); setPointId(ui->comboBoxAxisP2, axisP2Id, value);
line->setPoint2Id(axisP2Id);
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
@ -200,4 +234,5 @@ void DialogTriangle::setAxisP2Id(const quint32 &value)
void DialogTriangle::setAxisP1Id(const quint32 &value) void DialogTriangle::setAxisP1Id(const quint32 &value)
{ {
setPointId(ui->comboBoxAxisP1, axisP1Id, value); setPointId(ui->comboBoxAxisP1, axisP1Id, value);
line->setPoint1Id(axisP1Id);
} }

View File

@ -36,6 +36,8 @@ namespace Ui
class DialogTriangle; class DialogTriangle;
} }
class VisToolTriangle;
/** /**
* @brief The DialogTriangle class dialog for ToolTriangle. Help create point and edit option. * @brief The DialogTriangle class dialog for ToolTriangle. Help create point and edit option.
*/ */
@ -64,6 +66,7 @@ public slots:
virtual void ChosenObject(quint32 id, const SceneObject &type); virtual void ChosenObject(quint32 id, const SceneObject &type);
virtual void PointNameChanged(); virtual void PointNameChanged();
protected: protected:
virtual void ShowVisualization();
/** /**
* @brief SaveData Put dialog data in local variables * @brief SaveData Put dialog data in local variables
*/ */
@ -91,6 +94,8 @@ private:
/** @brief secondPointId id second point of line */ /** @brief secondPointId id second point of line */
quint32 secondPointId; quint32 secondPointId;
VisToolTriangle *line;
}; };
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------

View File

@ -6,7 +6,7 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>267</width> <width>285</width>
<height>220</height> <height>220</height>
</rect> </rect>
</property> </property>
@ -82,6 +82,12 @@
<layout class="QHBoxLayout" name="horizontalLayout_5"> <layout class="QHBoxLayout" name="horizontalLayout_5">
<item> <item>
<widget class="QLabel" name="labelAxisP1"> <widget class="QLabel" name="labelAxisP1">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text"> <property name="text">
<string>First point of axis</string> <string>First point of axis</string>
</property> </property>
@ -100,6 +106,12 @@
<layout class="QHBoxLayout" name="horizontalLayout_6"> <layout class="QHBoxLayout" name="horizontalLayout_6">
<item> <item>
<widget class="QLabel" name="labelAxisP2"> <widget class="QLabel" name="labelAxisP2">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text"> <property name="text">
<string>Second point of axis</string> <string>Second point of axis</string>
</property> </property>
@ -118,6 +130,12 @@
<layout class="QHBoxLayout" name="horizontalLayout_7"> <layout class="QHBoxLayout" name="horizontalLayout_7">
<item> <item>
<widget class="QLabel" name="labelFirstPoint"> <widget class="QLabel" name="labelFirstPoint">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text"> <property name="text">
<string>First point</string> <string>First point</string>
</property> </property>
@ -136,6 +154,12 @@
<layout class="QHBoxLayout" name="horizontalLayout_8"> <layout class="QHBoxLayout" name="horizontalLayout_8">
<item> <item>
<widget class="QLabel" name="labelSecondPoint"> <widget class="QLabel" name="labelSecondPoint">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text"> <property name="text">
<string>Second point</string> <string>Second point</string>
</property> </property>
@ -156,7 +180,7 @@
<enum>Qt::Horizontal</enum> <enum>Qt::Horizontal</enum>
</property> </property>
<property name="standardButtons"> <property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> <set>QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property> </property>
</widget> </widget>
</item> </item>

View File

@ -580,8 +580,10 @@ void MainWindow::ToolHeight(bool checked)
*/ */
void MainWindow::ToolTriangle(bool checked) void MainWindow::ToolTriangle(bool checked)
{ {
SetToolButton<DialogTriangle>(checked, Tool::Triangle, ":/cursor/triangle_cursor.png", SetToolButtonWithApply<DialogTriangle>(checked, Tool::Triangle, ":/cursor/triangle_cursor.png",
tr("Select first point of axis"), &MainWindow::ClosedDialog<VToolTriangle>); tr("Select first point of axis"),
&MainWindow::ClosedDialogWithApply<VToolTriangle>,
&MainWindow::ApplyDialog<VToolTriangle>);
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------

View File

@ -30,6 +30,8 @@
#include "../../dialogs/tools/dialogtriangle.h" #include "../../dialogs/tools/dialogtriangle.h"
#include "../../geometry/vpointf.h" #include "../../geometry/vpointf.h"
#include <QtMath>
const QString VToolTriangle::ToolType = QStringLiteral("triangle"); const QString VToolTriangle::ToolType = QStringLiteral("triangle");
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
@ -86,8 +88,9 @@ void VToolTriangle::setDialog()
* @param scene pointer to scene. * @param scene pointer to scene.
* @param doc dom document container. * @param doc dom document container.
* @param data container with variables. * @param data container with variables.
* @return the created tool
*/ */
void VToolTriangle::Create(DialogTool *dialog, VMainGraphicsScene *scene, VPattern *doc, VContainer *data) VToolTriangle* VToolTriangle::Create(DialogTool *dialog, VMainGraphicsScene *scene, VPattern *doc, VContainer *data)
{ {
SCASSERT(dialog != nullptr); SCASSERT(dialog != nullptr);
DialogTriangle *dialogTool = qobject_cast<DialogTriangle*>(dialog); DialogTriangle *dialogTool = qobject_cast<DialogTriangle*>(dialog);
@ -97,8 +100,14 @@ void VToolTriangle::Create(DialogTool *dialog, VMainGraphicsScene *scene, VPatte
const quint32 firstPointId = dialogTool->getFirstPointId(); const quint32 firstPointId = dialogTool->getFirstPointId();
const quint32 secondPointId = dialogTool->getSecondPointId(); const quint32 secondPointId = dialogTool->getSecondPointId();
const QString pointName = dialogTool->getPointName(); const QString pointName = dialogTool->getPointName();
Create(0, pointName, axisP1Id, axisP2Id, firstPointId, secondPointId, 5, 10, scene, doc, data, VToolTriangle* point = nullptr;
Document::FullParse, Source::FromGui); point = Create(0, pointName, axisP1Id, axisP2Id, firstPointId, secondPointId, 5, 10, scene, doc, data,
Document::FullParse, Source::FromGui);
if (point != nullptr)
{
point->dialog=dialogTool;
}
return point;
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
@ -117,11 +126,12 @@ void VToolTriangle::Create(DialogTool *dialog, VMainGraphicsScene *scene, VPatte
* @param data container with variables. * @param data container with variables.
* @param parse parser file mode. * @param parse parser file mode.
* @param typeCreation way we create this tool. * @param typeCreation way we create this tool.
* @return the created tool
*/ */
void VToolTriangle::Create(const quint32 _id, const QString &pointName, const quint32 &axisP1Id, VToolTriangle* VToolTriangle::Create(const quint32 _id, const QString &pointName, const quint32 &axisP1Id,
const quint32 &axisP2Id, const quint32 &firstPointId, const quint32 &secondPointId, const quint32 &axisP2Id, const quint32 &firstPointId, const quint32 &secondPointId,
const qreal &mx, const qreal &my, VMainGraphicsScene *scene, VPattern *doc, const qreal &mx, const qreal &my, VMainGraphicsScene *scene, VPattern *doc,
VContainer *data, const Document &parse, const Source &typeCreation) VContainer *data, const Document &parse, const Source &typeCreation)
{ {
const VPointF *axisP1 = data->GeometricObject<const VPointF *>(axisP1Id); const VPointF *axisP1 = data->GeometricObject<const VPointF *>(axisP1Id);
const VPointF *axisP2 = data->GeometricObject<const VPointF *>(axisP2Id); const VPointF *axisP2 = data->GeometricObject<const VPointF *>(axisP2Id);
@ -157,7 +167,9 @@ void VToolTriangle::Create(const quint32 _id, const QString &pointName, const qu
doc->IncrementReferens(axisP2Id); doc->IncrementReferens(axisP2Id);
doc->IncrementReferens(firstPointId); doc->IncrementReferens(firstPointId);
doc->IncrementReferens(secondPointId); doc->IncrementReferens(secondPointId);
return point;
} }
return nullptr;
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
@ -172,39 +184,31 @@ void VToolTriangle::Create(const quint32 _id, const QString &pointName, const qu
QPointF VToolTriangle::FindPoint(const QPointF &axisP1, const QPointF &axisP2, const QPointF &firstPoint, QPointF VToolTriangle::FindPoint(const QPointF &axisP1, const QPointF &axisP2, const QPointF &firstPoint,
const QPointF &secondPoint) const QPointF &secondPoint)
{ {
qreal c = QLineF(firstPoint, secondPoint).length(); QLineF axis(axisP1, axisP2);
qreal a = QLineF(axisP2, firstPoint).length(); QLineF hypotenuse(firstPoint, secondPoint);
qreal b = QLineF(axisP2, secondPoint).length();
if (fabs(c*c - (a*a + b*b)) < 0.0001) QPointF startPoint;
QLineF::IntersectType intersect = axis.intersect(hypotenuse, &startPoint);
if (intersect != QLineF::UnboundedIntersection && intersect != QLineF::BoundedIntersection)
{ {
QLineF l1(axisP2, firstPoint); return QPointF();
QLineF l2(axisP2, secondPoint);
if (fabs(l1.angleTo(l2) - 90) < 0.1 || fabs(l2.angleTo(l1) - 90) < 0.1)
{
return axisP2;
}
} }
QLineF line = QLineF(axisP1, axisP2); qreal step = 1;
qreal step = 0.01;
QLineF line;
line.setP1(startPoint);
line.setAngle(axis.angle());
line.setLength(step);
int c = qFloor(hypotenuse.length());
while (1) while (1)
{ {
line.setLength(line.length()+step); line.setLength(line.length()+step);
a = QLineF(line.p2(), firstPoint).length(); int a = qFloor(QLineF(line.p2(), firstPoint).length());
b = QLineF(line.p2(), secondPoint).length(); int b = qFloor(QLineF(line.p2(), secondPoint).length());
if (qFuzzyCompare(c*c, a*a + b*b)) if (c*c <= (a*a + b*b))
{ {
QLineF l1(axisP2, firstPoint);
QLineF l2(axisP2, secondPoint);
if (fabs(l1.angleTo(l2) - 90) < 0.1 || fabs(l2.angleTo(l1) - 90) < 0.1)
{
return line.p2();
}
}
if (c*c < a*a + b*b)
{
//Still don't know why this code handled. Need to think about that.
qDebug()<<"Can't find point."<<Q_FUNC_INFO;
return line.p2(); return line.p2();
} }
} }

View File

@ -32,7 +32,8 @@
#include "vtoolpoint.h" #include "vtoolpoint.h"
/** /**
* @brief The VToolTriangle class tool for what find point intersection two foots right triangle. * @brief The VToolTriangle class for tool that find point intersection two foots right triangle
* (triangle with 90 degree).
*/ */
class VToolTriangle : public VToolPoint class VToolTriangle : public VToolPoint
{ {
@ -42,11 +43,11 @@ public:
const quint32 &firstPointId, const quint32 &secondPointId, const Source &typeCreation, const quint32 &firstPointId, const quint32 &secondPointId, const Source &typeCreation,
QGraphicsItem * parent = nullptr); QGraphicsItem * parent = nullptr);
virtual void setDialog(); virtual void setDialog();
static void Create(DialogTool *dialog, VMainGraphicsScene *scene, VPattern *doc, VContainer *data); static VToolTriangle *Create(DialogTool *dialog, VMainGraphicsScene *scene, VPattern *doc, VContainer *data);
static void Create(const quint32 _id, const QString &pointName, const quint32 &axisP1Id, const quint32 &axisP2Id, static VToolTriangle *Create(const quint32 _id, const QString &pointName, const quint32 &axisP1Id,
const quint32 &firstPointId, const quint32 &secondPointId, const qreal &mx, const qreal &my, const quint32 &axisP2Id, const quint32 &firstPointId, const quint32 &secondPointId,
VMainGraphicsScene *scene, VPattern *doc, VContainer *data, const qreal &mx, const qreal &my, VMainGraphicsScene *scene, VPattern *doc,
const Document &parse, const Source &typeCreation); VContainer *data, const Document &parse, const Source &typeCreation);
static QPointF FindPoint(const QPointF &axisP1, const QPointF &axisP2, const QPointF &firstPoint, static QPointF FindPoint(const QPointF &axisP1, const QPointF &axisP2, const QPointF &firstPoint,
const QPointF &secondPoint); const QPointF &secondPoint);
static const QString ToolType; static const QString ToolType;

View File

@ -28,7 +28,6 @@
#include "visline.h" #include "visline.h"
#include "../container/vcontainer.h" #include "../container/vcontainer.h"
#include "../widgets/vapplication.h"
#include "../tools/drawTools/vdrawtool.h" #include "../tools/drawTools/vdrawtool.h"
#include "../container/calculator.h" #include "../container/calculator.h"
@ -162,6 +161,7 @@ void VisLine::DrawPoint(QGraphicsEllipseItem *point, const QPointF &pos, const Q
point->setPos(pos); point->setPos(pos);
point->setPen(QPen(color, qApp->toPixel(qApp->widthMainLine())/factor)); point->setPen(QPen(color, qApp->toPixel(qApp->widthMainLine())/factor));
point->setVisible(true);
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
@ -183,19 +183,11 @@ QGraphicsEllipseItem *VisLine::InitPoint(const QColor &color)
point->setPen(QPen(color, qApp->toPixel(qApp->widthMainLine())/factor)); point->setPen(QPen(color, qApp->toPixel(qApp->widthMainLine())/factor));
point->setRect(PointRect()); point->setRect(PointRect());
point->setFlags(QGraphicsItem::ItemStacksBehindParent); point->setFlags(QGraphicsItem::ItemStacksBehindParent);
point->setVisible(false);
return point; return point;
} }
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
QGraphicsLineItem *VisLine::InitLine(const QColor &color)
{
QGraphicsLineItem *line = new QGraphicsLineItem(this);
line->setPen(QPen(color, qApp->toPixel(qApp->widthHairLine())/factor));
line->setZValue(1);
line->setFlags(QGraphicsItem::ItemStacksBehindParent);
return line;
}
qreal VisLine::CorrectAngle(const qreal &angle) const qreal VisLine::CorrectAngle(const qreal &angle) const
{ {
qreal ang = angle; qreal ang = angle;
@ -291,3 +283,18 @@ void VisLine::setPoint1Id(const quint32 &value)
{ {
point1Id = value; point1Id = value;
} }
//---------------------------------------------------------------------------------------------------------------------
QLineF VisLine::Axis(const QPointF &p, const qreal &angle) const
{
QPointF endP1 = Ray(p, angle+180);
QPointF endP2 = Ray(p, angle);
return QLineF(endP1, endP2);
}
//---------------------------------------------------------------------------------------------------------------------
QLineF VisLine::Axis(const QPointF &p1, const QPointF &p2) const
{
QLineF line(p1, p2);
return Axis(p1, line.angle());
}

View File

@ -33,6 +33,8 @@
#include <QGraphicsLineItem> #include <QGraphicsLineItem>
#include <QPointF> #include <QPointF>
#include "../widgets/vapplication.h"
class VContainer; class VContainer;
class VisLine: public QObject, public QGraphicsLineItem class VisLine: public QObject, public QGraphicsLineItem
@ -71,11 +73,21 @@ protected:
QLineF Line(const QPointF &p1, const qreal& length, const qreal &angle); QLineF Line(const QPointF &p1, const qreal& length, const qreal &angle);
QGraphicsEllipseItem *InitPoint(const QColor &color); QGraphicsEllipseItem *InitPoint(const QColor &color);
QGraphicsLineItem *InitLine(const QColor &color); template <class Item>
Item *InitItem(const QColor &color)
{
Item *item = new Item(this);
item->setPen(QPen(color, qApp->toPixel(qApp->widthHairLine())/factor));
item->setZValue(1);
item->setFlags(QGraphicsItem::ItemStacksBehindParent);
return item;
}
qreal CorrectAngle(const qreal &angle) const; qreal CorrectAngle(const qreal &angle) const;
QPointF Ray(const QPointF &firstPoint, const qreal &angle) const; QPointF Ray(const QPointF &firstPoint, const qreal &angle) const;
QPointF Ray(const QPointF &firstPoint) const; QPointF Ray(const QPointF &firstPoint) const;
QLineF Axis(const QPointF &p, const qreal &angle) const;
QLineF Axis(const QPointF &p1, const QPointF &p2) const;
private: private:
Q_DISABLE_COPY(VisLine) Q_DISABLE_COPY(VisLine)
}; };

View File

@ -29,7 +29,6 @@
#include "vistoolalongline.h" #include "vistoolalongline.h"
#include "../container/vcontainer.h" #include "../container/vcontainer.h"
#include "../geometry/vpointf.h" #include "../geometry/vpointf.h"
#include "../widgets/vapplication.h"
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
VisToolAlongLine::VisToolAlongLine(const VContainer *data, QGraphicsItem *parent) VisToolAlongLine::VisToolAlongLine(const VContainer *data, QGraphicsItem *parent)
@ -40,7 +39,7 @@ VisToolAlongLine::VisToolAlongLine(const VContainer *data, QGraphicsItem *parent
lineP1 = InitPoint(supportColor); lineP1 = InitPoint(supportColor);
lineP2 = InitPoint(supportColor); lineP2 = InitPoint(supportColor);
line = InitLine(supportColor); line = InitItem<QGraphicsLineItem>(supportColor);
point = InitPoint(mainColor); point = InitPoint(mainColor);
} }

View File

@ -38,10 +38,10 @@ VisToolBisector::VisToolBisector(const VContainer *data, QGraphicsItem *parent)
{ {
line1P1 = InitPoint(supportColor); line1P1 = InitPoint(supportColor);
line1P2 = InitPoint(supportColor); line1P2 = InitPoint(supportColor);
line1 = InitLine(supportColor); line1 = InitItem<QGraphicsLineItem>(supportColor);
line2P2 = InitPoint(supportColor); line2P2 = InitPoint(supportColor);
line2 = InitLine(supportColor); line2 = InitItem<QGraphicsLineItem>(supportColor);
point = InitPoint(mainColor); point = InitPoint(mainColor);
} }

View File

@ -29,7 +29,6 @@
#include "vistoolendline.h" #include "vistoolendline.h"
#include "../geometry/vpointf.h" #include "../geometry/vpointf.h"
#include "../container/vcontainer.h" #include "../container/vcontainer.h"
#include "../widgets/vapplication.h"
#include "../tools/vabstracttool.h" #include "../tools/vabstracttool.h"
#include <QGraphicsScene> #include <QGraphicsScene>

View File

@ -38,8 +38,8 @@ VisToolHeight::VisToolHeight(const VContainer *data, QGraphicsItem *parent)
base_point = InitPoint(supportColor); base_point = InitPoint(supportColor);
lineP1 = InitPoint(supportColor); lineP1 = InitPoint(supportColor);
lineP2 = InitPoint(supportColor); lineP2 = InitPoint(supportColor);
line = InitLine(supportColor); line = InitItem<QGraphicsLineItem>(supportColor);
line_intersection = InitLine(supportColor); line_intersection = InitItem<QGraphicsLineItem>(supportColor);
point = InitPoint(mainColor); point = InitPoint(mainColor);
} }

View File

@ -29,7 +29,6 @@
#include "vistoolline.h" #include "vistoolline.h"
#include "../container/vcontainer.h" #include "../container/vcontainer.h"
#include "../geometry/vpointf.h" #include "../geometry/vpointf.h"
#include "../widgets/vapplication.h"
#include "../tools/drawTools/vdrawtool.h" #include "../tools/drawTools/vdrawtool.h"
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------

View File

@ -39,7 +39,7 @@ VisToolNormal::VisToolNormal(const VContainer *data, QGraphicsItem *parent)
lineP1 = InitPoint(supportColor); lineP1 = InitPoint(supportColor);
lineP2 = InitPoint(supportColor); lineP2 = InitPoint(supportColor);
line = InitLine(supportColor); line = InitItem<QGraphicsLineItem>(supportColor);
point = InitPoint(mainColor); point = InitPoint(mainColor);
} }

View File

@ -36,7 +36,7 @@ VisToolPointOfIntersection::VisToolPointOfIntersection(const VContainer *data, Q
{ {
axisP1 = InitPoint(supportColor); axisP1 = InitPoint(supportColor);
axisP2 = InitPoint(supportColor); axisP2 = InitPoint(supportColor);
axis2 = InitLine(supportColor); axis2 = InitItem<QGraphicsLineItem>(supportColor);
point = InitPoint(mainColor); point = InitPoint(mainColor);
} }
@ -78,14 +78,6 @@ void VisToolPointOfIntersection::setPoint2Id(const quint32 &value)
point2Id = value; point2Id = value;
} }
//---------------------------------------------------------------------------------------------------------------------
QLineF VisToolPointOfIntersection::Axis(const QPointF &p, const qreal &angle) const
{
QPointF endP1 = Ray(p, angle);
QPointF endP2 = Ray(p, angle+180);
return QLineF(endP1, endP2);
}
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
void VisToolPointOfIntersection::ShowIntersection(const QLineF &axis1, const QLineF &axis2) void VisToolPointOfIntersection::ShowIntersection(const QLineF &axis1, const QLineF &axis2)
{ {

View File

@ -49,7 +49,6 @@ private:
QGraphicsEllipseItem *axisP2; QGraphicsEllipseItem *axisP2;
QGraphicsLineItem *axis2;//axis1 is class themself QGraphicsLineItem *axis2;//axis1 is class themself
QLineF Axis(const QPointF &p, const qreal &angle) const;
void ShowIntersection(const QLineF &axis1, const QLineF &axis2); void ShowIntersection(const QLineF &axis1, const QLineF &axis2);
}; };

View File

@ -37,11 +37,11 @@ VisToolShoulderPoint::VisToolShoulderPoint(const VContainer *data, QGraphicsItem
{ {
line1P1 = InitPoint(supportColor); line1P1 = InitPoint(supportColor);
line1P2 = InitPoint(supportColor); line1P2 = InitPoint(supportColor);
line1 = InitLine(supportColor); line1 = InitItem<QGraphicsLineItem>(supportColor);
line2P2 = InitPoint(supportColor); line2P2 = InitPoint(supportColor);
line2 = InitLine(supportColor); line2 = InitItem<QGraphicsLineItem>(supportColor);
line3 = InitLine(supportColor); line3 = InitItem<QGraphicsLineItem>(supportColor);
point = InitPoint(mainColor); point = InitPoint(mainColor);
} }

View File

@ -0,0 +1,183 @@
/************************************************************************
**
** @file vistooltriangle.cpp
** @author Roman Telezhynskyi <dismine(at)gmail.com>
** @date 13 8, 2014
**
** @brief
** @copyright
** This source code is part of the Valentine project, a pattern making
** program, whose allow create and modeling patterns of clothing.
** Copyright (C) 2014 Valentina project
** <https://bitbucket.org/dismine/valentina> All Rights Reserved.
**
** Valentina is free software: you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation, either version 3 of the License, or
** (at your option) any later version.
**
** Valentina is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with Valentina. If not, see <http://www.gnu.org/licenses/>.
**
*************************************************************************/
#include "vistooltriangle.h"
#include "../geometry/vpointf.h"
#include "../container/vcontainer.h"
#include "../tools/drawTools/vtooltriangle.h"
#include "QtMath"
//---------------------------------------------------------------------------------------------------------------------
VisToolTriangle::VisToolTriangle(const VContainer *data, QGraphicsItem *parent)
:VisLine(data, parent), point2Id(0), hypotenuseP1Id(0), hypotenuseP2Id(0), point(nullptr), axisP1(nullptr),
axisP2(nullptr), axis(nullptr), hypotenuseP1(nullptr), hypotenuseP2(nullptr), foot1(nullptr), foot2(nullptr)
{
axisP1 = InitPoint(supportColor);
axisP2 = InitPoint(supportColor);
axis = InitItem<QGraphicsPathItem>(supportColor);
hypotenuseP1 = InitPoint(supportColor);
hypotenuseP2 = InitPoint(supportColor);
foot1 = InitItem<QGraphicsLineItem>(supportColor);
foot2 = InitItem<QGraphicsLineItem>(supportColor);
point = InitPoint(mainColor);
}
//---------------------------------------------------------------------------------------------------------------------
VisToolTriangle::~VisToolTriangle()
{}
//---------------------------------------------------------------------------------------------------------------------
void VisToolTriangle::RefreshGeometry()
{
if (point1Id > 0)
{
const VPointF *first = data->GeometricObject<const VPointF *>(point1Id);
DrawPoint(axisP1, first->toQPointF(), supportColor);
if (point2Id <= 0)
{
DrawAimedAxis(axis, QLineF(first->toQPointF(), scenePos), supportColor);
}
else
{
const VPointF *second = data->GeometricObject<const VPointF *>(point2Id);
DrawPoint(axisP2, second->toQPointF(), supportColor);
DrawAimedAxis(axis, QLineF(first->toQPointF(), second->toQPointF()), supportColor);
if (hypotenuseP1Id <= 0)
{
return;
}
else
{
const VPointF *third = data->GeometricObject<const VPointF *>(hypotenuseP1Id);
DrawPoint(hypotenuseP1, third->toQPointF(), supportColor);
if (hypotenuseP2Id <= 0)
{
DrawLine(this, QLineF(third->toQPointF(), scenePos), supportColor, Qt::DashLine);
QPointF trPoint = VToolTriangle::FindPoint(first->toQPointF(), second->toQPointF(),
third->toQPointF(), scenePos);
DrawPoint(point, trPoint, mainColor);
DrawLine(foot1, QLineF(third->toQPointF(), trPoint), supportColor, Qt::DashLine);
DrawLine(foot2, QLineF(scenePos, trPoint), supportColor, Qt::DashLine);
}
else
{
const VPointF *forth = data->GeometricObject<const VPointF *>(hypotenuseP2Id);
DrawPoint(hypotenuseP2, forth->toQPointF(), supportColor);
DrawLine(this, QLineF(third->toQPointF(), forth->toQPointF()), supportColor, Qt::DashLine);
QPointF trPoint = VToolTriangle::FindPoint(first->toQPointF(), second->toQPointF(),
third->toQPointF(), forth->toQPointF());
DrawPoint(point, trPoint, mainColor);
DrawLine(foot1, QLineF(third->toQPointF(), trPoint), supportColor, Qt::DashLine);
DrawLine(foot2, QLineF(forth->toQPointF(), trPoint), supportColor, Qt::DashLine);
}
}
}
}
}
//---------------------------------------------------------------------------------------------------------------------
void VisToolTriangle::setPoint2Id(const quint32 &value)
{
point2Id = value;
}
//---------------------------------------------------------------------------------------------------------------------
void VisToolTriangle::setHypotenuseP1Id(const quint32 &value)
{
hypotenuseP1Id = value;
}
//---------------------------------------------------------------------------------------------------------------------
void VisToolTriangle::setHypotenuseP2Id(const quint32 &value)
{
hypotenuseP2Id = value;
}
//---------------------------------------------------------------------------------------------------------------------
void VisToolTriangle::DrawAimedAxis(QGraphicsPathItem *item, const QLineF &line, const QColor &color,
Qt::PenStyle style)
{
SCASSERT (item != nullptr);
item->setPen(QPen(color, qApp->toPixel(qApp->widthHairLine())/factor, style));
QPainterPath path;
path.moveTo(line.p1());
path.lineTo(line.p2());
qreal arrow_step = 60/factor;
qreal arrow_size = 10/factor;
if (line.length() < arrow_step)
{
DrawArrow(line, path, arrow_size);
}
QLineF axis;
axis.setP1(line.p1());
axis.setAngle(line.angle());
axis.setLength(arrow_step);
int steps = qFloor(line.length()/arrow_step);
for(int i=0; i<steps; ++i)
{
DrawArrow(axis, path, arrow_size);
axis.setLength(axis.length()+arrow_step);
}
item->setPath(path);
}
//---------------------------------------------------------------------------------------------------------------------
void VisToolTriangle::DrawArrow(const QLineF &axis, QPainterPath &path, const qreal &arrow_size)
{
QLineF arrowPart1;
arrowPart1.setP1(axis.p2());
arrowPart1.setLength(arrow_size);
arrowPart1.setAngle(axis.angle()+180+35);
path.moveTo(arrowPart1.p1());
path.lineTo(arrowPart1.p2());
QLineF arrowPart2;
arrowPart2.setP1(axis.p2());
arrowPart2.setLength(arrow_size);
arrowPart2.setAngle(axis.angle()+180-35);
path.moveTo(arrowPart2.p1());
path.lineTo(arrowPart2.p2());
}

View File

@ -0,0 +1,65 @@
/************************************************************************
**
** @file vistooltriangle.h
** @author Roman Telezhynskyi <dismine(at)gmail.com>
** @date 13 8, 2014
**
** @brief
** @copyright
** This source code is part of the Valentine project, a pattern making
** program, whose allow create and modeling patterns of clothing.
** Copyright (C) 2014 Valentina project
** <https://bitbucket.org/dismine/valentina> All Rights Reserved.
**
** Valentina is free software: you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation, either version 3 of the License, or
** (at your option) any later version.
**
** Valentina is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with Valentina. If not, see <http://www.gnu.org/licenses/>.
**
*************************************************************************/
#ifndef VISTOOLTRIANGLE_H
#define VISTOOLTRIANGLE_H
#include "visline.h"
class VisToolTriangle : public VisLine
{
Q_OBJECT
public:
VisToolTriangle(const VContainer *data, QGraphicsItem *parent = 0);
virtual ~VisToolTriangle();
virtual void RefreshGeometry();
void setPoint2Id(const quint32 &value);
void setHypotenuseP1Id(const quint32 &value);
void setHypotenuseP2Id(const quint32 &value);
private:
Q_DISABLE_COPY(VisToolTriangle)
quint32 point2Id;//axis second point
quint32 hypotenuseP1Id;
quint32 hypotenuseP2Id;
QGraphicsEllipseItem *point;
QGraphicsEllipseItem *axisP1;
QGraphicsEllipseItem *axisP2;
QGraphicsPathItem *axis;
QGraphicsEllipseItem *hypotenuseP1;
QGraphicsEllipseItem *hypotenuseP2;
QGraphicsLineItem *foot1;
QGraphicsLineItem *foot2;
void DrawAimedAxis(QGraphicsPathItem *item, const QLineF &line, const QColor &color,
Qt::PenStyle style = Qt::SolidLine);
void DrawArrow(const QLineF &axis, QPainterPath &path, const qreal &arrow_size);
};
#endif // VISTOOLTRIANGLE_H

View File

@ -11,7 +11,8 @@ HEADERS += \
visualization/vistoolshoulderpoint.h \ visualization/vistoolshoulderpoint.h \
visualization/vistoolnormal.h \ visualization/vistoolnormal.h \
visualization/vistoolheight.h \ visualization/vistoolheight.h \
visualization/vistoolpointofintersection.h visualization/vistoolpointofintersection.h \
visualization/vistooltriangle.h
SOURCES += \ SOURCES += \
visualization/vgraphicssimpletextitem.cpp \ visualization/vgraphicssimpletextitem.cpp \
@ -26,4 +27,5 @@ SOURCES += \
visualization/vistoolshoulderpoint.cpp \ visualization/vistoolshoulderpoint.cpp \
visualization/vistoolnormal.cpp \ visualization/vistoolnormal.cpp \
visualization/vistoolheight.cpp \ visualization/vistoolheight.cpp \
visualization/vistoolpointofintersection.cpp visualization/vistoolpointofintersection.cpp \
visualization/vistooltriangle.cpp