mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-04-07 18:30:55 +03:00
PRO file is added + a description of how to generate the Visual Studio projects and compile. In addition, the sample folder is renamed to FuncDemo. Adding 64 bit configuration to VC projects
122 lines
3.2 KiB
C++
122 lines
3.2 KiB
C++
/****************************************************************************
|
|
**
|
|
** Copyright (C) 2006-2007 Trolltech ASA. All rights reserved.
|
|
**
|
|
** This file is part of the example classes of the Qt Toolkit.
|
|
**
|
|
** Licensees holding a valid Qt License Agreement may use this file in
|
|
** accordance with the rights, responsibilities and obligations
|
|
** contained therein. Please consult your licensing agreement or
|
|
** contact sales@trolltech.com if any conditions of this licensing
|
|
** agreement are not clear to you.
|
|
**
|
|
** Further information about Qt licensing is available at:
|
|
** http://www.trolltech.com/products/qt/licensing.html or by
|
|
** contacting info@trolltech.com.
|
|
**
|
|
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
|
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
|
**
|
|
****************************************************************************/
|
|
|
|
#include <QPainter>
|
|
|
|
#include "edge.h"
|
|
#include "node.h"
|
|
|
|
#include <math.h>
|
|
|
|
static const double Pi = 3.14159265358979323846264338327950288419717;
|
|
static double TwoPi = 2.0 * Pi;
|
|
|
|
Edge::Edge(Node *sourceNode, Node *destNode)
|
|
: arrowSize(10)
|
|
{
|
|
setAcceptedMouseButtons(0);
|
|
source = sourceNode;
|
|
dest = destNode;
|
|
source->addEdge(this);
|
|
dest->addEdge(this);
|
|
adjust();
|
|
}
|
|
|
|
Edge::~Edge()
|
|
{
|
|
}
|
|
|
|
Node *Edge::sourceNode() const
|
|
{
|
|
return source;
|
|
}
|
|
|
|
void Edge::setSourceNode(Node *node)
|
|
{
|
|
source = node;
|
|
adjust();
|
|
}
|
|
|
|
Node *Edge::destNode() const
|
|
{
|
|
return dest;
|
|
}
|
|
|
|
void Edge::setDestNode(Node *node)
|
|
{
|
|
dest = node;
|
|
adjust();
|
|
}
|
|
|
|
void Edge::adjust()
|
|
{
|
|
if (!source || !dest)
|
|
return;
|
|
|
|
QLineF line(mapFromItem(source, 0, 0), mapFromItem(dest, 0, 0));
|
|
qreal length = line.length();
|
|
QPointF edgeOffset((line.dx() * 15) / length, (line.dy() * 15) / length);
|
|
|
|
prepareGeometryChange();
|
|
sourcePoint = line.p1() + edgeOffset;
|
|
destPoint = line.p2() - edgeOffset;
|
|
}
|
|
|
|
QRectF Edge::boundingRect() const
|
|
{
|
|
if (!source || !dest)
|
|
return QRectF();
|
|
|
|
qreal penWidth = 1;
|
|
qreal extra = (penWidth + arrowSize) / 2.0;
|
|
|
|
return QRectF(sourcePoint, QSizeF(destPoint.x() - sourcePoint.x(),
|
|
destPoint.y() - sourcePoint.y()))
|
|
.normalized()
|
|
.adjusted(-extra, -extra, extra, extra);
|
|
}
|
|
|
|
void Edge::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
|
|
{
|
|
if (!source || !dest)
|
|
return;
|
|
|
|
adjust();
|
|
|
|
// Draw the line itself
|
|
QLineF line(sourcePoint, destPoint);
|
|
painter->setPen(QPen(Qt::black, 1, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
|
|
painter->drawLine(line);
|
|
|
|
// Draw the arrows if there's enough room
|
|
double angle = ::acos(line.dx() / line.length());
|
|
if (line.dy() >= 0)
|
|
angle = TwoPi - angle;
|
|
|
|
QPointF destArrowP1 = destPoint + QPointF(sin(angle - Pi / 3) * arrowSize,
|
|
cos(angle - Pi / 3) * arrowSize);
|
|
QPointF destArrowP2 = destPoint + QPointF(sin(angle - Pi + Pi / 3) * arrowSize,
|
|
cos(angle - Pi + Pi / 3) * arrowSize);
|
|
|
|
painter->setBrush(Qt::black);
|
|
painter->drawPolygon(QPolygonF() << line.p2() << destArrowP1 << destArrowP2);
|
|
}
|