|
|
|
|
#ifndef FAULT_H
|
|
|
|
|
#define FAULT_H
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//Qt
|
|
|
|
|
#include <QColor>
|
|
|
|
|
#include <QPainter>
|
|
|
|
|
#include <QPainterPath>
|
|
|
|
|
#include <QPaintEvent>
|
|
|
|
|
#include <QVector>
|
|
|
|
|
#include <QPainterPathStroker>
|
|
|
|
|
#include <QPen>
|
|
|
|
|
#include <QWidget>
|
|
|
|
|
#include <QPaintEngine>
|
|
|
|
|
#include <QPixmap>
|
|
|
|
|
|
|
|
|
|
class Fault
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
Fault(double scalex,double scaley,bool bmove,double tolerance, const QString& title){
|
|
|
|
|
_title = title;
|
|
|
|
|
_isGenerated = false;
|
|
|
|
|
_scalex = scalex;
|
|
|
|
|
_scaley = scaley;
|
|
|
|
|
_move = bmove;
|
|
|
|
|
_tolerance = tolerance;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Fault(QString title = "Fault_0"){
|
|
|
|
|
_scalex = 1;
|
|
|
|
|
_scaley = 1;
|
|
|
|
|
_title = title;
|
|
|
|
|
_isGenerated = false;
|
|
|
|
|
_tolerance = 15;
|
|
|
|
|
_move = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
~Fault(){
|
|
|
|
|
clear();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void addPoint(qreal x,qreal y){
|
|
|
|
|
if(_rectPath.elementCount()==0){
|
|
|
|
|
_rectPath.moveTo(x,y);
|
|
|
|
|
}else{
|
|
|
|
|
_rectPath.lineTo(x,y);
|
|
|
|
|
}
|
|
|
|
|
_points.push_back(QPointF(x,y));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void setPoint(int i,qreal x,qreal y){
|
|
|
|
|
_rectPath.setElementPositionAt(i,x,y);
|
|
|
|
|
_points[i] = QPointF(x,y);
|
|
|
|
|
|
|
|
|
|
if(_move){
|
|
|
|
|
getDotline();
|
|
|
|
|
setTitle(_title);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int pointCount(){
|
|
|
|
|
return _points.count();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int elementCount(){
|
|
|
|
|
return _rectPath.elementCount();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void setColor(int red,int green,int blue,int alpha = 50){
|
|
|
|
|
_faultColor.setRgb(red,green,blue,alpha);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QColor getColor() const{
|
|
|
|
|
return _faultColor;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QString getTitle() const{
|
|
|
|
|
return _title;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void setTitle(const QString& title){
|
|
|
|
|
_title = title;
|
|
|
|
|
_titlePath = QPainterPath();
|
|
|
|
|
_titlePath.addText(_rectPath.elementAt(_rectPath.elementCount()-1).x+1,
|
|
|
|
|
_rectPath.elementAt(_rectPath.elementCount()-1).y+1,
|
|
|
|
|
QFont(),_title);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void saveData(){
|
|
|
|
|
// TODO
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void setScalex(double scalex){
|
|
|
|
|
_scalex = scalex;
|
|
|
|
|
}
|
|
|
|
|
double getScalex() const{
|
|
|
|
|
return _scalex;
|
|
|
|
|
}
|
|
|
|
|
double getScaley() const{
|
|
|
|
|
return _scaley;
|
|
|
|
|
}
|
|
|
|
|
void setScaley(double scaley){
|
|
|
|
|
_scaley = scaley;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool isMove() const
|
|
|
|
|
{
|
|
|
|
|
return _move;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void setMove(bool move)
|
|
|
|
|
{
|
|
|
|
|
_move = move;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QPainterPath getRectPath() const
|
|
|
|
|
{
|
|
|
|
|
return _rectPath;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void addRectPath(const QPainterPath &rectPath)
|
|
|
|
|
{
|
|
|
|
|
_rectPath.addPath(rectPath);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QVector<QPointF> getPoints() const
|
|
|
|
|
{
|
|
|
|
|
return _points;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
double getTolerance() const
|
|
|
|
|
{
|
|
|
|
|
return _tolerance;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void setTolerance(double value)
|
|
|
|
|
{
|
|
|
|
|
_tolerance = value;
|
|
|
|
|
}
|
|
|
|
|
void clear(){
|
|
|
|
|
_titlePath = QPainterPath();
|
|
|
|
|
_rectPath = QPainterPath();
|
|
|
|
|
_dotPath = QPainterPath();
|
|
|
|
|
_points.clear();
|
|
|
|
|
_isGenerated = false;
|
|
|
|
|
_move = false;
|
|
|
|
|
_title = "Fault_0";
|
|
|
|
|
last = QPointF();
|
|
|
|
|
_tolerance = 30;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void generate(){
|
|
|
|
|
_isGenerated = true;
|
|
|
|
|
_points.pop_back();
|
|
|
|
|
int n = _points.count();
|
|
|
|
|
if(n < 2){
|
|
|
|
|
clear();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
_rectPath = QPainterPath();
|
|
|
|
|
_rectPath.addPolygon(_points);
|
|
|
|
|
_titlePath = QPainterPath();
|
|
|
|
|
_titlePath.addText(_rectPath.elementAt(_rectPath.elementCount()-1).x+1,
|
|
|
|
|
_rectPath.elementAt(_rectPath.elementCount()-1).y+1,
|
|
|
|
|
QFont(),_title);
|
|
|
|
|
getDotline();
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void move(QMouseEvent *event){
|
|
|
|
|
qreal x = event->posF().x();
|
|
|
|
|
qreal y = event->posF().y();
|
|
|
|
|
qreal tx = x - last.x();
|
|
|
|
|
qreal ty = y - last.y();
|
|
|
|
|
_rectPath.translate(tx,ty);
|
|
|
|
|
_dotPath.translate(tx,ty);
|
|
|
|
|
_titlePath.translate(tx,ty);
|
|
|
|
|
int n = _points.count();
|
|
|
|
|
for(int i=0;i<n;++i){
|
|
|
|
|
qreal rx = _points[i].x();
|
|
|
|
|
qreal ry = _points[i].y();
|
|
|
|
|
_points[i].setX(rx+tx);
|
|
|
|
|
_points[i].setY(ry+ty);
|
|
|
|
|
}
|
|
|
|
|
last = event->posF();
|
|
|
|
|
}
|
|
|
|
|
bool isGenerated(){
|
|
|
|
|
return _isGenerated;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void pick(QMouseEvent* event){
|
|
|
|
|
QPointF f = event->posF();
|
|
|
|
|
getDotline();
|
|
|
|
|
if(!contains(f)){
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
setMove(true);
|
|
|
|
|
last = f;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void getDotline(){
|
|
|
|
|
QPainterPathStroker stroker;
|
|
|
|
|
stroker.setCapStyle(Qt::RoundCap);
|
|
|
|
|
stroker.setDashPattern(Qt::DashLine);
|
|
|
|
|
stroker.setJoinStyle(Qt::RoundJoin);
|
|
|
|
|
stroker.setWidth(1);
|
|
|
|
|
_dotPath = stroker.createStroke(_rectPath);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void clearDotPath(){
|
|
|
|
|
_dotPath = QPainterPath();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool contains(const QPointF& f){
|
|
|
|
|
for(int i=0;i<=_tolerance;++i){
|
|
|
|
|
if(_dotPath.contains(f+QPointF(i,0))||
|
|
|
|
|
_dotPath.contains(f+QPointF(-i,0))||
|
|
|
|
|
_dotPath.contains(f+QPointF(0,-i))||
|
|
|
|
|
_dotPath.contains(f+QPointF(0,i))){
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int dotContains(const QPointF& f){
|
|
|
|
|
qreal x = f.x();
|
|
|
|
|
qreal y = f.y();
|
|
|
|
|
for(int j=0;j<_points.size();++j) {
|
|
|
|
|
qreal x1 = _points[j].x();
|
|
|
|
|
qreal y1 = _points[j].y();
|
|
|
|
|
for(int i=0;i<=_tolerance;++i){
|
|
|
|
|
if(x1 <= (x+i)&&
|
|
|
|
|
x1 >= (x-i)&&
|
|
|
|
|
y1 >= (y-i)&&
|
|
|
|
|
y1 <= (y+i)){
|
|
|
|
|
return j;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void paint(QPixmap& w, QPaintEvent *event=nullptr){
|
|
|
|
|
QPainter painter;
|
|
|
|
|
painter.begin(&w);
|
|
|
|
|
painter.scale(_scalex, _scaley);
|
|
|
|
|
painter.setRenderHint(QPainter::Antialiasing);
|
|
|
|
|
QPen pen;
|
|
|
|
|
pen.setWidth(2);
|
|
|
|
|
pen.setColor(_faultColor);
|
|
|
|
|
painter.setPen(pen);
|
|
|
|
|
int n = _points.count();
|
|
|
|
|
if(_move){
|
|
|
|
|
for(int i=0;i<n;++i){
|
|
|
|
|
painter.drawEllipse(QPointF(_rectPath.elementAt(i).x,_rectPath.elementAt(i).y),3,3);
|
|
|
|
|
}
|
|
|
|
|
painter.drawPath(_dotPath);
|
|
|
|
|
}
|
|
|
|
|
else{
|
|
|
|
|
painter.drawPath(_rectPath);
|
|
|
|
|
}
|
|
|
|
|
if(_titlePath.elementCount()>0){
|
|
|
|
|
pen.setWidth(1);
|
|
|
|
|
painter.setPen(pen);
|
|
|
|
|
painter.drawPath(_titlePath);
|
|
|
|
|
}
|
|
|
|
|
painter.end();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
QColor _faultColor;
|
|
|
|
|
|
|
|
|
|
// 记录标题,比如fault_1
|
|
|
|
|
QString _title;
|
|
|
|
|
QVector<QPointF> _points;
|
|
|
|
|
// QPainter *_painter;
|
|
|
|
|
|
|
|
|
|
QPointF last;
|
|
|
|
|
|
|
|
|
|
// 缩放
|
|
|
|
|
double _scalex;
|
|
|
|
|
double _scaley;
|
|
|
|
|
|
|
|
|
|
// 移动
|
|
|
|
|
bool _move;
|
|
|
|
|
|
|
|
|
|
bool _isGenerated;
|
|
|
|
|
|
|
|
|
|
// 容差
|
|
|
|
|
double _tolerance;
|
|
|
|
|
|
|
|
|
|
// fault的路径
|
|
|
|
|
QPainterPath _rectPath;
|
|
|
|
|
// title
|
|
|
|
|
QPainterPath _titlePath;
|
|
|
|
|
|
|
|
|
|
// fault的虚线框
|
|
|
|
|
QPainterPath _dotPath;
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
#endif // FAULT_H
|