PeriDyno 1.2.1
Loading...
Searching...
No Matches
QCurveWidget.cpp
Go to the documentation of this file.
1#include "QCurveWidget.h"
2
3#include <QComboBox>
4#include <QGridLayout>
5#include <QVBoxLayout>
6#include <QPainter>
7#include <QSpacerItem>
8#include <QPainterPath>
9#include "PCustomWidgets.h"
10#include <QCheckBox>
11#include "QToggleButton.h"
12
13#include "Field.h"
14
15namespace dyno
16{
18
21 {
22 printf("QCurveWidget\n");
24 if (f == nullptr)
25 {
26 printf("QCurve Nullptr\n");
27 return;
28
29 }
30
31 int curIndex2 = int(f->getValue().getInterpMode());
32 int enumNum2 = f->getValue().InterpolationCount;
33 QComboBox* combox2 = new QComboBox;
34 combox2->setMaximumWidth(256);
35 combox2->addItem(QString::fromStdString("Linear"));
36 combox2->addItem(QString::fromStdString("Bezier"));
37 combox2->setCurrentIndex(curIndex2);
38 combox2->setStyleSheet("background-color: qlineargradient(spread : pad, x1 : 0, y1 : 0, x2 : 0, y2 : 0.7, stop : 0 rgba(100, 100, 100, 255), stop : 1 rgba(35, 35, 35, 255)); ");
39
40 auto s = f->getValue();
41
42 QLabel* name = new QLabel();
43 name->setFixedSize(80, 18);
44 name->setText(FormatFieldWidgetName(field->getObjectName()));
45 name->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);//
46
47 //build DrawLabel
48 QCurveLabel* DrawLabel = new QCurveLabel(f);
49
50 connect(combox2, SIGNAL(currentIndexChanged(int)), DrawLabel, SLOT(changeInterpValue(int)));
51
52 //VLayout : combox2 / CloseButton
53 QVBoxLayout* VLayout = new QVBoxLayout();
54 QSpacerItem* VSpacer = new QSpacerItem(10, 380, QSizePolicy::Minimum, QSizePolicy::Expanding);
55 VLayout->addItem(VSpacer);
56 VLayout->addWidget(combox2);
57 VLayout->setSpacing(5);
58
59 QGridLayout* Gridlayout = new QGridLayout;
60 Gridlayout->setContentsMargins(0, 0, 0, 0);
61 Gridlayout->setSpacing(5);
62 Gridlayout->addWidget(name, 0, 0,3,1, Qt::AlignLeft);
63 Gridlayout->addWidget(DrawLabel,0,1, Qt::AlignCenter);
64 Gridlayout->addLayout(VLayout,0,2, Qt::AlignRight);
65 Gridlayout->setColumnStretch(0, 0);
66 Gridlayout->setColumnStretch(1, 5);
67 Gridlayout->setColumnStretch(2, 0);
68
69 QLabel* spacingName = new QLabel("Spacing");
70
71 mQDoubleSlider* spacingSlider = new mQDoubleSlider;
72 spacingSlider->nameLabel = spacingName;
73 spacingSlider->setRange(1, 40);
74 spacingSlider->setValue(f->getValue().getSpacing());
75 spacingSlider->id = -1;
76 mQDoubleSpinner* spacingSpinner = new mQDoubleSpinner;
77 spacingSpinner->setRange(1, 40);
78 spacingSpinner->setValue(f->getValue().getSpacing());
79 spacingSpinner->id = -1;
80 DrawLabel->updateLabelShape(f->getValue().isSquard());
81 DrawLabel->useBezier = f->getValue().getInterpMode() == Canvas::Interpolation::Bezier ? true : false;
82
83 QObject::connect(spacingSlider, SIGNAL(valueChanged(double)), spacingSpinner, SLOT(setValue(double)));
84 QObject::connect(spacingSpinner, SIGNAL(valueChanged(double)), spacingSlider, SLOT(setValue(double)));
85 QObject::connect(spacingSpinner, SIGNAL(valueChangedAndID(double, int)), DrawLabel, SLOT(setSpacingToDrawLabel(double,int)));
86
87 QHBoxLayout* SpacingHlayout = new QHBoxLayout;
88 SpacingHlayout->setContentsMargins(0, 0, 0, 0);
89 SpacingHlayout->setSpacing(0);
90 SpacingHlayout->addWidget(spacingName);
91 SpacingHlayout->addWidget(spacingSlider);
92 SpacingHlayout->addWidget(spacingSpinner);
93
94 QHBoxLayout* Hlayout1 = new QHBoxLayout;
95 Hlayout1->setContentsMargins(0, 0, 0, 0);
96 Hlayout1->setSpacing(0);
97
98 //Bool
99 QHBoxLayout* boolLayout = new QHBoxLayout;
100 boolLayout->setContentsMargins(0, 0, 0, 0);
101 boolLayout->setSpacing(0);
102
103 QLabel* boolName = new QLabel();
104 boolName->setFixedHeight(24);
105 boolName->setText("Resample");
106 mQCheckBox* Checkbox = new mQCheckBox();
107 Checkbox->nameLabel = boolName;
108 Checkbox->QWidget::setFixedWidth(20);
109 Checkbox->QAbstractButton::setChecked(f->getValue().getResample());
110
111 connect(Checkbox, SIGNAL(mValueChanged(int)), DrawLabel, SLOT(setLinearResample(int)));
112 connect(Checkbox, SIGNAL(mValueChanged(int)), spacingSlider, SLOT(setNewVisable(int)));
113 connect(Checkbox, SIGNAL(mValueChanged(int)), spacingSpinner, SLOT(setNewVisable(int)));
114
115 connect(combox2, SIGNAL(currentIndexChanged(int)), Checkbox, SLOT(updateChecked(int)));
116
117 if (f->getValue().getResample() == false)
118 {
119 spacingSlider->setVisible(false);
120 spacingSpinner->setVisible(false);
121 spacingName->setVisible(false);
122 }
123
124 boolLayout->addWidget(boolName, 0);
125 boolLayout->addStretch(1);
126 boolLayout->addWidget(Checkbox, 0);
127
128 {
129 QToggleButton* curveCloseButton = new QToggleButton(f->getValue().getClose());
130 curveCloseButton->setText("Close", "Open");
131 curveCloseButton->setStyleSheet
132 (
133 "QPushButton{background-color: qlineargradient(spread : pad, x1 : 0, y1 : 0, x2 : 0, y2 : 0.7, stop : 0 rgba(100, 100, 100, 255), stop : 1 rgba(35, 35, 35, 255));}QPushButton:hover{background-color: qlineargradient(spread : pad, x1 : 0, y1 : 0, x2 : 0, y2 : 0.7, stop : 0 rgba(120,120,120, 255), stop : 1 rgba(90, 90, 90, 255));} "
134 );
135 VLayout->addWidget(curveCloseButton);
136 connect(curveCloseButton, &QToggleButton::clicked, DrawLabel, &QCurveLabel::setCurveClose);
137 curveCloseButton->setValue(f->getValue().getClose());
138 }
139
140 QVBoxLayout* TotalLayout = new QVBoxLayout();
141 TotalLayout->setContentsMargins(0, 0, 0, 0);
142 TotalLayout->setSpacing(5);
143 TotalLayout->addLayout(Gridlayout);
144 TotalLayout->addLayout(Hlayout1);
145 TotalLayout->addLayout(boolLayout);
146 TotalLayout->addLayout(SpacingHlayout);
147
148 this->setLayout(TotalLayout);
149 }
150
152 {
154 if (f == nullptr)
155 {
156 return;
157 }
158
159 }
160
162 {
163 this->setField(f);
164 this->copySettingFromField();
165 this->setLabelSize(w, w, w, w);
166 this->setStyleSheet("background:rgba(110,115,100,1)");
167 this->setMouseTracking(true);
168 };
169
170 void QCurveLabel::paintEvent(QPaintEvent* event)
171 {
172
173 //set Point Radius
174 radius = 4;
175 int w = this->width();
176 int h = this->height();
177
178 //set border
179 minX = 0 + 1.5 * radius;
180 maxX = w - 2 * radius;
181 minY = 0 + 2 * radius;
182 maxY = h - 1.5 * radius;
183
184 //get data
185 if (mCoordArray.empty())
186 {
187 if (mField->getValue().getUserPoints().empty()) //If there is no data from the Widget in the field, it is initialized from the field
188 {
189
190 this->copyFromField(mField->getValue().getUserPoints(), mReSortCoordArray);
191 mCoordArray.assign(mReSortCoordArray.begin(), mReSortCoordArray.end());
193 this->copyFromField(mField->getValue().getUserHandles(), mHandlePoints);
194 }
195 else //use data from the Widget
196 {
197 this->copyFromField(mField->getValue().getUserPoints(), mCoordArray);
198 //this->copyFromField(field->getDataPtr()->OriginalHandlePoint, HandlePoints);
199 this->copyFromField(mField->getValue().getUserHandles(), mHandlePoints);
200 }
201
202 }
203
204 //if useClose,add end & start Point.
205 mReSortCoordArray.assign(mCoordArray.begin(), mCoordArray.end());
207
208
209 QPainter painter(this);
210 painter.setRenderHint(QPainter::Antialiasing, true);
211
212 //Background
213 QBrush brush = QBrush(Qt::black, Qt::SolidPattern);
214 painter.setBrush(brush);
215 QRectF Bound = QRectF(QPointF(minX, minY), QPointF(maxX, maxY));
216 painter.drawRect(Bound);
217
218 //Grid
219 QBrush brush2 = QBrush(QColor(100,100,100), Qt::CrossPattern);
220 painter.setBrush(brush2);
221 painter.drawRect(Bound);
222
223 //Draw Ellipse
224 size_t ptNum = mCoordArray.size();
225
226 QVector<QPointF> QCoordArray;
227 for (size_t i = 0; i < mReSortCoordArray.size(); i++)
228 {
229 QCoordArray.push_back(QPointF(mReSortCoordArray[i].x, mReSortCoordArray[i].y));
230 }
231
232
233 buildCoordToResortMap(); //Build map. find element id of sorted reSortCoordArray by CoordArray
234
235 if (mHandlePoints.empty()) //Build HandlePoints for Bezier handles from CoordArray.
236 {
238 }
239
240
241 QPen LinePen = QPen(QPen(QBrush(QColor(200,200,200)), 2, Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin));
242 painter.setPen(LinePen);
243
244 mPath.clear();
245 if (useBezier) //Draw Bezier or Line
246 {
247 //draw Bezier
248 for (size_t i = 1; i < mReSortCoordArray.size(); i++)
249 {
250 int ptnum = i - 1;
251 mPath.moveTo(mReSortCoordArray[ptnum].x, mReSortCoordArray[ptnum].y);
252
253 auto it = mMapResortIDtoOriginalID.find(i);
254 int id = it->second;
255 int s = id * 2;
256
257 auto itf = mMapResortIDtoOriginalID.find(ptnum);
258 int idf = itf->second;
259 int f = idf * 2 + 1;
260
261 mPath.cubicTo(QPointF(mHandlePoints[f].x, mHandlePoints[f].y), QPointF(mHandlePoints[s].x, mHandlePoints[s].y), QPointF(mReSortCoordArray[ptnum + 1].x, mReSortCoordArray[ptnum + 1].y));
262 painter.drawPath(mPath);
263 }
264 // use CurveClose?
265 if (curveClose && mReSortCoordArray.size()>=3)
266 {
267 int end = mReSortCoordArray.size() - 1;
268 int handleEnd = mHandlePoints.size() - 1;
269 mPath.moveTo(mReSortCoordArray[end].x, mReSortCoordArray[end].y);
270 mPath.cubicTo(QPointF(mHandlePoints[handleEnd].x, mHandlePoints[handleEnd].y), QPointF(mHandlePoints[0].x, mHandlePoints[0].y), QPointF(mReSortCoordArray[0].x, mReSortCoordArray[0].y));
271 painter.drawPath(mPath);
272 }
273 }
274 else
275 {
276 if (QCoordArray.size() >= 2)
277 {
278 for (size_t i = 1; i < QCoordArray.size(); i++)
279 {
280 //painter.drawLine(QCoordArray[i], QCoordArray[i + 1]);
281
282 int ptnum = i - 1;
283 mPath.moveTo(mReSortCoordArray[ptnum].x, mReSortCoordArray[ptnum].y);
284 mPath.lineTo(QPointF(mReSortCoordArray[ptnum + 1].x, mReSortCoordArray[ptnum + 1].y));
285 painter.drawPath(mPath);
286 }
287
288 if (curveClose && mReSortCoordArray.size() >= 3)
289 {
290 int end = mReSortCoordArray.size()-1;
291 mPath.moveTo(mReSortCoordArray[end].x, mReSortCoordArray[end].y);
292 mPath.lineTo(QPointF(mReSortCoordArray[0].x, mReSortCoordArray[0].y));
293 painter.drawPath(mPath);
294 }
295 }
296 }
297
298 QPen LinePenWhite = QPen(QPen(QBrush(Qt::white), 2, Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin));
299 painter.setPen(LinePenWhite);
300
301 //draw Point
302 for (size_t i = 0; i < ptNum; i++)
303 {
304 painter.setBrush(QBrush(Qt::gray, Qt::SolidPattern));
305 painter.drawEllipse(mCoordArray[i].x - radius, mCoordArray[i].y - radius, 2 * radius, 2 * radius);
306 painter.setPen(QPen(QBrush(QColor(200, 200, 200), Qt::SolidPattern), 2, Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin));
307 painter.drawEllipse(mCoordArray[i].x - radius, mCoordArray[i].y - radius, 2 * radius, 2 * radius);
308 }
309
310 //Paint SelectPoint
311 if (mSelectPointID != -1)
312 {
313 painter.setBrush(QBrush(QColor(80, 179, 255), Qt::SolidPattern));
314 painter.drawEllipse(mCoordArray[mSelectPointID].x - radius, mCoordArray[mSelectPointID].y - radius, 2 * radius, 2 * radius);
315 painter.setPen(QPen(QBrush(Qt::white, Qt::SolidPattern), 2, Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin));
316 painter.drawEllipse(mCoordArray[mSelectPointID].x - radius, mCoordArray[mSelectPointID].y - radius, 2 * radius, 2 * radius);
317 }
318 //Paint hoverPoint
319 if (mHoverPoint != -1)
320 {
321 painter.setBrush(QBrush(QColor(80, 179, 255), Qt::SolidPattern));
322 painter.drawEllipse(mCoordArray[mHoverPoint].x - radius, mCoordArray[mHoverPoint].y - radius, 2 * radius, 2 * radius);
323 painter.setPen(QPen(QBrush(Qt::white, Qt::SolidPattern), 2, Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin));
324 painter.drawEllipse(mCoordArray[mHoverPoint].x - radius, mCoordArray[mHoverPoint].y - radius, 2 * radius, 2 * radius);
325 }
326
327 //drawHandle
328 if (useBezier)
329 {
330
331
332 if (mHandleParent != -1)
333 {
334 int f = mHandleParent * 2;
335 int s = mHandleParent * 2 + 1;
336 //draw Handle
337 painter.drawLine(QPointF(mCoordArray[mHandleParent].x, mCoordArray[mHandleParent].y), QPointF(mHandlePoints[f].x, mHandlePoints[f].y));
338 painter.drawLine(QPointF(mCoordArray[mHandleParent].x, mCoordArray[mHandleParent].y), QPointF(mHandlePoints[s].x, mHandlePoints[s].y));
339 //draw ControlPoint
340 painter.drawEllipse(mHandlePoints[f].x - radius, mHandlePoints[f].y - radius, 2 * radius, 2 * radius);
341 painter.drawEllipse(mHandlePoints[s].x - radius, mHandlePoints[s].y - radius, 2 * radius, 2 * radius);
342 //draw ParentPoint
343 painter.setBrush(QBrush(QColor(80, 179, 255), Qt::SolidPattern));
344 painter.drawEllipse(mCoordArray[mHandleParent].x - radius, mCoordArray[mHandleParent].y - radius, 2 * radius, 2 * radius);
345
346
347 QPen LinePen2 = QPen(QPen(QBrush(QColor(255, 255, 255)), 2, Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin));
348 painter.setPen(LinePen2);
349 painter.drawEllipse(mCoordArray[mHandleParent].x - radius, mCoordArray[mHandleParent].y - radius, 2 * radius, 2 * radius);
350 }
351 if (mSelectHandlePoint != -1 )
352 {
353 QPen LinePen2 = QPen(QPen(QBrush(QColor(255, 255, 255)), 2, Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin));
354 painter.setPen(LinePen2);
356
357 }
358 }
359
360 if (mForceUpdate)
361 {
362
365 mForceUpdate = false;
366
367 }
368
369 painter.setBrush(QBrush(QColor(80, 179, 255), Qt::SolidPattern));
370 painter.setPen(QPen(QPen(QBrush(QColor(255, 255, 255)), 2, Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin)));
371
372 //draw selected point
373 if (mMultiSelectID.size())
374 {
375 for (auto it : mMultiSelectID)
376 {
377 painter.drawEllipse(mCoordArray[it].x - radius, mCoordArray[it].y - radius, 2 * radius, 2 * radius);
378 }
379 }
380
381
382 painter.setBrush(QBrush(QColor(255, 0, 0), Qt::SolidPattern));
383 painter.setPen(QPen(QPen(QBrush(QColor(255, 0, 0)), 1, Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin)));
384
385
386
387 }
388
390 {
391
392 }
393
394
396 {
397 this->setLabelSize(w, w, w, w);
398 this->setStyleSheet("background:rgba(110,115,100,1)");
399 this->setMouseTracking(true);
400
401 }
402
403
404 void QCurveLabel::mousePressEvent(QMouseEvent* event)
405 {
406 //MouseLeft
407 mPressCoord.x = event->pos().x();
408 mPressCoord.y = event->pos().y();
409
410 if (mShiftKey)
411 {
412 for (size_t i = 0; i < mCoordArray.size(); i++)
413 {
414 int temp = sqrt(std::pow((mPressCoord.x - mCoordArray[i].x), 2) + std::pow((mPressCoord.y - mCoordArray[i].y), 2));
415 if (temp < selectDistance)
416 {
417 mSelectPointID = i;
418 mIsSelect = true;
421
422 bool elementInMulti = false;
423
424 std::vector<int>::iterator iter;
425 iter = mMultiSelectID.begin();
426 while (iter != mMultiSelectID.end())
427 {
428 if (*iter == i)
429 {
430 elementInMulti = true;
431 break;
432 }
433 iter++;
434 }
435 if (elementInMulti)
436 {
437
438 mMultiSelectID.erase(iter);
439 elementInMulti = false;
440 }
441 else
442 {
443 mMultiSelectID.push_back(i);
444 }
445 break;
446 }
447 }
448 }
449 else if (!mShiftKey && !mAltKey) //
450 {
451 for (size_t i = 0; i < mCoordArray.size(); i++)
452 {
453 int temp = sqrt(std::pow((mPressCoord.x - mCoordArray[i].x), 2) + std::pow((mPressCoord.y - mCoordArray[i].y), 2));
454
455 if (temp < selectDistance)
456 {
457 mSelectPointID = i;
458 mIsSelect = true;
461 {
462 if (std::find(mMultiSelectID.begin(), mMultiSelectID.end(), i) != mMultiSelectID.end())
463 {
464 }
465 else
466 {
467 mMultiSelectID.clear();
468 mMultiSelectID.push_back(i);
469 }
470 }
471
472 if (mSelectPointID == 0)
473 {
474 mInsertAtBegin = true;
475 }
476 else if (mSelectPointID == mCoordArray.size() - 1)
477 {
478 mInsertAtBegin = false;
479 }
480
481 break;
482 }
483 }
484 }
485
486 //if select Handle
487 if (useBezier)
488 {
489 //printf("handle\n");
490 int displayHandle[2] = { mHandleParent * 2 ,mHandleParent * 2 + 1};
491 for (size_t k = 0; k < 2; k++)
492 {
493 int i = displayHandle[k];
494
495 if (i < 0) { break; }
496
497 int temp = sqrt(std::pow((mPressCoord.x - mHandlePoints[i].x), 2) + std::pow((mPressCoord.y - mHandlePoints[i].y), 2));
498
499 if (temp < selectDistance && mIsSelect != true)
500 {
502 mIsHandleSelect = true;
504
506 else { mHandleParent = (mSelectHandlePoint - 1) / 2; }
507
508
509 if (mSelectHandlePoint % 2 == 0)
510 {
512 }
513 else
514 {
516 }
517
519
520 mConnectLength = V2.norm();
521
522 {//handle Connect?
525 V4.normalize();
526 Vec2f N = -1 * V3.normalize();
527 float angle = acos(V4.dot(N)) / M_PI * 180;
528 if (angle <= HandleAngleThreshold) { mHandleConnection = true; }
529 else { mHandleConnection = false; }
530 }
531
532 break;
533 }
534 }
535 }
536 if (!mIsSelect && !mIsHandleSelect)
537 {
538
539 //pushback Point
540 if (!mCtrlKey)
541 {
543 }
544 //insert Point in Edge
545 else if (mCtrlKey)
546 {
547 if (mReSortCoordArray.size() >= 2)
548 {
550
552 {
553 mSelectPointID = -1;
554 mIsSelect = false;
556 mHandleParent = id;
557 mSelectHandlePoint = id * 2 + 1;
559 mIsHandleSelect = true;
560 }
562 {
563 mSelectPointID = id;
564 mIsSelect = true;
566 mHandleParent = id;
569 mIsHandleSelect = false;
570 }
571
572 mMultiSelectID.clear();
573 mMultiSelectID.push_back(id);
574 }
575 else
576 {
577 addPointtoEnd();
578 }
579
580 }
581
582 }
583
584 else if(event->button() == Qt::RightButton)
585 {
586
587 if(mSelectPointID >=0)
588 {
589 deletePoint();
590 }
591
592 }
593
594
595 this->update();
596 }
597
599 {
600 if (!mInsertAtBegin)
601 {
602 mCoordArray.push_back(mPressCoord);
605
607 {
609 mSelectPointID = -1;
610 mIsSelect = false;
611 mHandleParent = mCoordArray.size() - 1;
614 mIsHandleSelect = true;
615 }
617 {
619 mSelectPointID = mCoordArray.size() - 1;
620 mIsSelect = true;
624 mIsHandleSelect = false;
626 }
627
628 mMultiSelectID.clear();
629 mMultiSelectID.push_back(mCoordArray.size() - 1);
630 }
631 else if(mInsertAtBegin)
632 {
633 mCoordArray.insert(mCoordArray.begin(), mPressCoord);
636
637
639 {
641 mSelectPointID = -1;
642 mIsSelect = false;
643 mHandleParent = 0;
646 mIsHandleSelect = true;
647 }
649 {
651 mSelectPointID = 0;
652 mIsSelect = true;
656 mIsHandleSelect = false;
658 }
659 }
660
661
662 return mHandleParent;
663
664 }
665
666
667
668 void QCurveLabel::mouseMoveEvent(QMouseEvent* event)
669 {
670 this->grabKeyboard();
671 //constrained
672 if (mIsSelect)
673 {
674 mCoordArray[mSelectPointID].x = dyno::clamp(event->pos().x(), minX, maxX);
675 mCoordArray[mSelectPointID].y = dyno::clamp(event->pos().y(), minY, maxY);
676
678
681
684
686
687 if (mMultiSelectID.size() > 1)
688 {
689 for (size_t i = 0; i < mMultiSelectID.size(); i++)
690 {
691 int tempSelect = mMultiSelectID[i];
692 if (tempSelect != mSelectPointID)
693 {
694
695
696 mCoordArray[tempSelect].x = dyno::clamp(mCoordArray[tempSelect].x + mDtPosition.x, minX, maxX);
697 mCoordArray[tempSelect].y = dyno::clamp(mCoordArray[tempSelect].y + mDtPosition.y, minY, maxY);
698
699 //
700 mHandlePoints[tempSelect * 2].x = dyno::clamp(mHandlePoints[tempSelect * 2].x + mDtPosition.x, minX, maxX);
701 mHandlePoints[tempSelect * 2].y = dyno::clamp(mHandlePoints[tempSelect * 2].y + mDtPosition.y, minY, maxY);
702
703 mHandlePoints[tempSelect * 2 + 1].x = dyno::clamp(mHandlePoints[tempSelect * 2 + 1].x + mDtPosition.x, minX, maxX);
704 mHandlePoints[tempSelect * 2 + 1].y = dyno::clamp(mHandlePoints[tempSelect * 2 + 1].y + mDtPosition.y, minY, maxY);
705 }
706 }
707
708 }
709
710
711
712
713
714 update();
715 }
716 //constrained Handle
717 if (mIsHandleSelect)
718 {
719
720 mHandlePoints[mSelectHandlePoint].x = dyno::clamp(event->pos().x(), minX, maxX);
721 mHandlePoints[mSelectHandlePoint].y = dyno::clamp(event->pos().y(), minY, maxY);
722
724 Vec2f V2 = V1;
726 V3.normalize();
728 Vec2f N = -1 * V1.normalize();
729 float angle = acos(V3.dot(N))/ M_PI *180;
730
731 if (!mAltKey && mHandleConnection)
732 {
734 {
735 mHandlePoints[mConnectHandlePoint] = N * (V2.norm()) + P;
736 }
737 else
738 {
742 }
743 }
744
745
746 update();
747 }
748
749
750 if (mIsHover == true)
751 {
752 int tempHover = sqrt(std::pow((event->pos().x() - mCoordArray[mHoverPoint].x), 2) + std::pow((event->pos().y() - mCoordArray[mHoverPoint].y), 2));
753 if (tempHover >= selectDistance)
754 {
755 mHoverPoint = -1;
756 mIsHover = false;
757 }
758 }
759 else
760 {
761 for (size_t i = 0; i < mCoordArray.size(); i++)
762 {
763 int temp = sqrt(std::pow((event->pos().x() - mCoordArray[i].x), 2) + std::pow((event->pos().y() - mCoordArray[i].y), 2));
764
765 if (temp < selectDistance)
766 {
767 mHoverPoint = i;
768 mIsHover = true;
769 break;
770 }
771 }
772 update();
773 }
774
775 }
776
778 {
779 Curve s;
780 if (mField == nullptr) { return; }
781 else
782 {
785
786 CoordtoField(s);
787 }
788 mField->setValue(s);
789 }
790
792 {
793 this->mMode = (Dir)s;
794 Curve ras;
795
797
798 if (mField == nullptr) { return; }
799 else
800 {
802 if (!mFloatCoord.empty()) { CoordtoField(ras); }
803 }
804
805 this->mForceUpdate = true;
806 update();
807
808 }
809
811 {
812 this->InterpMode = (Interpolation)s;
814 else if (InterpMode == Interpolation::Bezier) { useBezier = 1; }
815 this->mForceUpdate = true;
816 update();
817 }
818
819
820
821
823 {
824 s.clearMyCoord();
825 for (auto it : mFloatCoord)
826 {
827 s.addFloatItemToCoord(it.x, it.y, s.getUserPoints());
828 }
829
830 for (auto it : mHandleFloatCoord)
831 {
832 s.addFloatItemToCoord(it.x, it.y, s.getUserHandles());
833 }
834
836 s.getSpacing() = spacing;
837
838 s.getClose() = curveClose;
839
842
845 }
846
847
849 {
850 LineResample = mField->getValue().getResample();
851 spacing = mField->getValue().getSpacing();
852 curveClose = mField->getValue().getClose();
853
854 if (mField->getValue().getInterpMode() == Canvas::Interpolation::Bezier) { InterpMode = Bezier; }
855 else { InterpMode = Linear; }
856
857 useSort = false;
858
859 }
860
861}
862
#define IMPL_FIELD_WIDGET(_data_type_, _type_)
#define M_PI
Definition Typedef.inl:36
void addFloatItemToCoord(float x, float y, std::vector< Coord2D > &coordArray)
Definition Canvas.cpp:20
bool & getClose()
Definition Canvas.h:207
bool & getResample()
Definition Canvas.h:206
float & getSpacing()
Definition Canvas.h:208
Canvas::Interpolation & getInterpMode()
Definition Canvas.h:121
virtual void updateBezierCurve()
Definition Canvas.cpp:38
std::vector< Coord2D > & getUserPoints()
Definition Canvas.h:203
std::vector< Coord2D > & getUserHandles()
Definition Canvas.h:204
void clearMyCoord()
Definition Canvas.cpp:271
void UpdateFieldFinalCoord() override
Updating the data of a Field.
Definition Curve.cpp:40
T getValue()
Definition Field.h:136
void changeValue(int s)
void changeInterpValue(int s)
void mouseMoveEvent(QMouseEvent *event) override
void mousePressEvent(QMouseEvent *event) override
void setField(FVar< Curve > *f)
int addPointtoEnd() override
void CoordtoField(Curve &s)
void paintEvent(QPaintEvent *event)
QCurveLabel(QWidget *parent=nullptr)
FVar< Curve > * mField
void updateDataToField() override
DECLARE_FIELD_WIDGET QCurveWidget(FBase *field)
void setRange(double Min, double Max)
void setValue(int value)
QFieldWidget(FBase *field)
void setText(std::string textUnCheck, std::string textCheck)
void setValue(bool press)
bool mInsertBezierOpenPoint
Definition QComponent.h:907
int insertCurvePoint(MyCoord pCoord)
Definition QComponent.h:566
std::vector< MyCoord > mCoordArray
Definition QComponent.h:919
Interpolation InterpMode
Definition QComponent.h:873
void buildHandlePointSet()
Definition QComponent.h:755
void updateFloatCoordArray(std::vector< MyCoord > CoordArray, std::vector< Coord0_1 > &myfloatCoord)
Definition QComponent.h:802
MyCoord mInitPosition
Definition QComponent.h:912
void reSort(std::vector< MyCoord > &vector1)
Definition QComponent.h:372
void updateLabelShape(bool squard)
Definition QComponent.h:273
void initializeLine(Dir mode)
Definition QComponent.h:348
void buildCoordToResortMap()
Definition QComponent.h:665
std::map< int, int > mMapResortIDtoOriginalID
Definition QComponent.h:931
std::vector< Coord0_1 > mFloatCoord
Definition QComponent.h:922
std::vector< Coord0_1 > mHandleFloatCoord
Definition QComponent.h:923
MyCoord mPressCoord
Definition QComponent.h:915
std::vector< MyCoord > mReSortCoordArray
Definition QComponent.h:920
std::vector< MyCoord > mHandlePoints
Definition QComponent.h:921
MyCoord mInitHandlePos
Definition QComponent.h:914
void setLabelSize(int minX, int minY, int maxX, int maxY)
Definition QComponent.h:366
QPainterPath mPath
Definition QComponent.h:934
void insertHandlePoint(int fp, MyCoord pCoord)
Definition QComponent.h:505
std::vector< int > mMultiSelectID
Definition QComponent.h:925
MyCoord mDtPosition
Definition QComponent.h:913
void copyFromField(std::vector< Canvas::Coord2D > coord01, std::vector< MyCoord > &thisArray)
Definition QComponent.h:323
void buildBezierPoint()
Definition QComponent.h:536
QLabel * nameLabel
Definition QComponent.h:149
void setValue(double Value, bool BlockSignals=false)
Definition QComponent.h:79
#define N(x, y, z)
TA * cast(TB *b)
Definition Typedef.inl:286
This is an implementation of AdditiveCCD based on peridyno.
Definition Array.h:25
QString FormatFieldWidgetName(std::string name)
Definition Format.cpp:9
Vector< float, 2 > Vec2f
Definition Vector2D.h:81
DYN_FUNC Complex< Real > acos(const Complex< Real > &)
Definition Complex.inl:519
DYN_FUNC T clamp(const T &v, const T &lo, const T &hi)
Definition SimpleMath.h:42
DYN_FUNC Complex< Real > sqrt(const Complex< Real > &)
Definition Complex.inl:321