PeriDyno 1.2.1
Loading...
Searching...
No Matches
QRampWidget.cpp
Go to the documentation of this file.
1#include "QRampWidget.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("QRampWidget\n");
24 if (f == nullptr)
25 {
26 printf("QRamp Nullptr\n");
27 return;
28
29 }
30
31
32
33 //Enum List InterpMode
34 int curIndex2 = int(f->getValue().getInterpMode());
35 int enumNum = f->getValue().InterpolationCount;
36 QComboBox* combox2 = new QComboBox;
37 combox2->setMaximumWidth(256);
38 combox2->addItem(QString::fromStdString("Linear"));
39 combox2->addItem(QString::fromStdString("Bezier"));
40
41 combox2->setCurrentIndex(curIndex2);
42 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)); ");
43
44 auto s = f->getValue();
45
46 //build RampWidget by field
47 //RampWidget name
48 QLabel* name = new QLabel();
49 name->setFixedSize(80, 18);
50 name->setText(FormatFieldWidgetName(field->getObjectName()));
51 name->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);//
52
53 //build DrawLabel
54 QDrawLabel* DrawLabel = new QDrawLabel();
55 DrawLabel->useBezier = f->getValue().getInterpMode() == Canvas::Interpolation::Bezier ? true : false;
56
57 DrawLabel->setField(f);
58
59 DrawLabel->copySettingFromField();
60
61 DrawLabel->updateLabelShape(f->getValue().isSquard());
62
63 connect(combox2, SIGNAL(currentIndexChanged(int)), DrawLabel, SLOT(changeInterpValue(int)));
64
65 //VLayout : combox2 / SquardButton / CloseButton
66 QVBoxLayout* VLayout = new QVBoxLayout();
67 QSpacerItem* VSpacer = new QSpacerItem(10, 380, QSizePolicy::Minimum, QSizePolicy::Expanding);
68 VLayout->addItem(VSpacer);
69 VLayout->addWidget(combox2);
70 VLayout->setSpacing(5);
71
72
73 QGridLayout* Gridlayout = new QGridLayout;
74 Gridlayout->setContentsMargins(0, 0, 0, 0);
75 Gridlayout->setSpacing(5);
76 Gridlayout->addWidget(name, 0, 0,3,1, Qt::AlignLeft);
77 Gridlayout->addWidget(DrawLabel,0,1, Qt::AlignCenter);
78 Gridlayout->addLayout(VLayout,0,2, Qt::AlignRight);
79 Gridlayout->setColumnStretch(0, 0);
80 Gridlayout->setColumnStretch(1, 5);
81 Gridlayout->setColumnStretch(2, 0);
82
83
84 QLabel* spacingName = new QLabel("Spacing");
85
86 mQDoubleSlider* spacingSlider = new mQDoubleSlider;
87 spacingSlider->nameLabel = spacingName;
88 spacingSlider->setRange(1, 40);
89 spacingSlider->setValue(f->getValue().getSpacing());
90 spacingSlider->id = -1;
91 mQDoubleSpinner* spacingSpinner = new mQDoubleSpinner;
92 spacingSpinner->setRange(1, 40);
93 spacingSpinner->setValue(f->getValue().getSpacing());
94 spacingSpinner->id = -1;
95 QObject::connect(spacingSlider, SIGNAL(valueChanged(double)), spacingSpinner, SLOT(setValue(double)));
96 QObject::connect(spacingSpinner, SIGNAL(valueChanged(double)), spacingSlider, SLOT(setValue(double)));
97 QObject::connect(spacingSpinner, SIGNAL(valueChangedAndID(double, int)), DrawLabel, SLOT(setSpacingToDrawLabel(double,int)));
98
99 QHBoxLayout* SpacingHlayout = new QHBoxLayout;
100 SpacingHlayout->setContentsMargins(0, 0, 0, 0);
101 SpacingHlayout->setSpacing(0);
102 SpacingHlayout->addWidget(spacingName);
103 SpacingHlayout->addWidget(spacingSlider);
104 SpacingHlayout->addWidget(spacingSpinner);
105
106 QHBoxLayout* Hlayout1 = new QHBoxLayout;
107 Hlayout1->setContentsMargins(0, 0, 0, 0);
108 Hlayout1->setSpacing(0);
109
110
111 //Bool
112 QHBoxLayout* boolLayout = new QHBoxLayout;
113 boolLayout->setContentsMargins(0, 0, 0, 0);
114 boolLayout->setSpacing(0);
115
116 QLabel* boolName = new QLabel();
117 boolName->setFixedHeight(24);
118 boolName->setText("Resample");
119 mQCheckBox* Checkbox = new mQCheckBox();
120 Checkbox->nameLabel = boolName;
121 Checkbox->QWidget::setFixedWidth(20);
122 Checkbox->QAbstractButton::setChecked(f->getValue().getResample());
123
124 connect(Checkbox, SIGNAL(mValueChanged(int)), DrawLabel, SLOT(setLinearResample(int)));
125 connect(Checkbox, SIGNAL(mValueChanged(int)), spacingSlider, SLOT(setNewVisable(int)));
126 connect(Checkbox, SIGNAL(mValueChanged(int)), spacingSpinner, SLOT(setNewVisable(int)));
127
128 if (f->getValue().getResample() == false)
129 {
130 spacingSlider->setVisible(false);
131 spacingSpinner->setVisible(false);
132 spacingName->setVisible(false);
133 }
134
135
136 boolLayout->addWidget(boolName, 0);
137 boolLayout->addStretch(1);
138 boolLayout->addWidget(Checkbox, 0);
139
140 //if (f->getDataPtr()->InterpMode == Ramp::Interpolation::Bezier) { boolName->setVisible(0); Checkbox->setVisible(0); }
141
142
143 QVBoxLayout* TotalLayout = new QVBoxLayout();
144 TotalLayout->setContentsMargins(0, 0, 0, 0);
145 TotalLayout->setSpacing(5);
146 TotalLayout->addLayout(Gridlayout);
147 TotalLayout->addLayout(Hlayout1);
148 TotalLayout->addLayout(boolLayout);
149 TotalLayout->addLayout(SpacingHlayout);
150
151 this->setLayout(TotalLayout);
152
153 }
154
156 {
158 if (f == nullptr)
159 {
160 return;
161 }
162
163 }
164
165 void QDrawLabel::paintEvent(QPaintEvent* event)
166 {
167
168 //设置半径
169 radius = 4;
170 int w = this->width();
171 int h = this->height();
172
173 //设置最大最小坐标
174 minX = 0 + 1.5 * radius;
175 maxX = w - 2 * radius;
176 minY = 0 + 2 * radius;
177 maxY = h - 1.5 * radius;
178
179 //如果CoordArray为空,则从field中取数据
180 if (mCoordArray.empty())
181 {
182 if (mField->getValue().getUserPoints().empty()) //如果field中没有Widget传回的数据,则从field本身的Coord进行初始化
183 {
184 this->copyFromField(mField->getValue().FE_MyCoord, mCoordArray);
185 mReSortCoordArray.assign(mCoordArray.begin(), mCoordArray.end());
188 this->copyFromField(mField->getValue().FE_HandleCoord, mHandlePoints);
189 }
190 else //否则直接取field存的qt坐标
191 {
192 this->copyFromField(mField->getValue().getUserPoints(), mCoordArray);
193 //this->copyFromField(field->getDataPtr()->OriginalHandlePoint, HandlePoints);
194 this->copyFromField(mField->getValue().getUserHandles(), mHandlePoints);
195 }
196
197 }
198
199
200 if (mCoordArray.empty()) //如果是close模式,且没有初始化数据,则在空画布创建两个点,作为边界点
201 {
202 if (mMode == x) //direction为x创建点的逻辑
203 {
204 if (mGeneratorXmin)
205 {
206 MyCoord FirstCoord;
207 mCoordArray.push_back(FirstCoord);
208
209 mCoordArray[mCoordArray.size() - 1].x = minX;
210 mCoordArray[mCoordArray.size() - 1].y = (maxY + minY) / 2;
212 mGeneratorXmin = 0;
213 }
214 if (mGeneratorXmax)
215 {
216 MyCoord LastCoord;
217 mCoordArray.push_back(LastCoord);
218
219 mCoordArray[mCoordArray.size() - 1].x = maxX;
220 mCoordArray[mCoordArray.size() - 1].y = (maxY + minY) / 2;
222 mGeneratorXmax = 0;
223 }
224 }
225 }
226
227 mReSortCoordArray.assign(mCoordArray.begin(), mCoordArray.end()); //用CoordArray为reSortCoordArray赋值
228 reSort(mReSortCoordArray); //对reSortCoordArray重排序
229
230
231 QPainter painter(this);
232 painter.setRenderHint(QPainter::Antialiasing, true);
233
234 //Background
235 QBrush brush = QBrush(Qt::black, Qt::SolidPattern);
236 painter.setBrush(brush);
237 QRectF Bound = QRectF(QPointF(minX, minY), QPointF(maxX, maxY));
238 painter.drawRect(Bound);
239
240 //Grid
241 QBrush brush2 = QBrush(QColor(100,100,100), Qt::CrossPattern);
242 painter.setBrush(brush2);
243 painter.drawRect(Bound);
244
245 //Draw Ellipse
246 size_t ptNum = mCoordArray.size();
247
248 QVector<QPointF> QCoordArray;//创建QPointF以绘制点
249 for (size_t i = 0; i < mReSortCoordArray.size(); i++)
250 {
251 QCoordArray.push_back(QPointF(mReSortCoordArray[i].x, mReSortCoordArray[i].y));
252 }
253
254
255 buildCoordToResortMap(); //构建map用以通过CoordArray查找排序后reSortCoordArray的元素id
256
257 if (mHandlePoints.empty()) //通过CoordArray构建贝塞尔控制柄的点HandlePoints
258 {
260 }
261
262 //绘制曲线
263 QPen LinePen = QPen(QPen(QBrush(QColor(200,200,200)), 2, Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin));
264 painter.setPen(LinePen);
265
266 mPath.clear();
267 if (useBezier) //画贝塞尔曲线或折线
268 {
269 //绘制贝塞尔曲线
270 for (size_t i = 1; i < mReSortCoordArray.size(); i++)
271 {
272 int ptnum = i - 1;
273 mPath.moveTo(mReSortCoordArray[ptnum].x, mReSortCoordArray[ptnum].y);
274
275 auto it = mMapResortIDtoOriginalID.find(i);
276 int id = it->second;
277 int s = id * 2;
278
279 auto itf = mMapResortIDtoOriginalID.find(ptnum);
280 int idf = itf->second;
281 int f = idf * 2 + 1;
282
283 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));
284 painter.drawPath(mPath);
285 }
286
287 }
288 else
289 {
290 if (QCoordArray.size() >= 2)
291 {
292 for (size_t i = 1; i < QCoordArray.size(); i++)
293 {
294 //painter.drawLine(QCoordArray[i], QCoordArray[i + 1]);
295
296 int ptnum = i - 1;
297 mPath.moveTo(mReSortCoordArray[ptnum].x, mReSortCoordArray[ptnum].y);
298 mPath.lineTo(QPointF(mReSortCoordArray[ptnum + 1].x, mReSortCoordArray[ptnum + 1].y));
299 painter.drawPath(mPath);
300 }
301
302 }
303 }
304
305 QPen LinePenWhite = QPen(QPen(QBrush(Qt::white), 2, Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin));
306 painter.setPen(LinePenWhite);
307
308 //绘制点
309 for (size_t i = 0; i < ptNum; i++)
310 {
311 painter.setBrush(QBrush(Qt::gray, Qt::SolidPattern));
312 painter.drawEllipse(mCoordArray[i].x - radius, mCoordArray[i].y - radius, 2 * radius, 2 * radius);
313 painter.setPen(QPen(QBrush(QColor(200, 200, 200), Qt::SolidPattern), 2, Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin));
314 painter.drawEllipse(mCoordArray[i].x - radius, mCoordArray[i].y - radius, 2 * radius, 2 * radius);
315 }
316
317 //Paint SelectPoint
318 if (mSelectPointID != -1)
319 {
320 painter.setBrush(QBrush(QColor(80, 179, 255), Qt::SolidPattern));
321 painter.drawEllipse(mCoordArray[mSelectPointID].x - radius, mCoordArray[mSelectPointID].y - radius, 2 * radius, 2 * radius);
322 painter.setPen(QPen(QBrush(Qt::white, Qt::SolidPattern), 2, Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin));
323 painter.drawEllipse(mCoordArray[mSelectPointID].x - radius, mCoordArray[mSelectPointID].y - radius, 2 * radius, 2 * radius);
324 }
325 //Paint hoverPoint
326 if (mHoverPoint != -1)
327 {
328 painter.setBrush(QBrush(QColor(80, 179, 255), Qt::SolidPattern));
329 painter.drawEllipse(mCoordArray[mHoverPoint].x - radius, mCoordArray[mHoverPoint].y - radius, 2 * radius, 2 * radius);
330 painter.setPen(QPen(QBrush(Qt::white, Qt::SolidPattern), 2, Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin));
331 painter.drawEllipse(mCoordArray[mHoverPoint].x - radius, mCoordArray[mHoverPoint].y - radius, 2 * radius, 2 * radius);
332 }
333
334 //绘制控制柄
335 if (useBezier)
336 {
338 //{
339 // for (size_t i = 0; i < CoordArray.size(); i++)
340 // {
341 // int f = i * 2;
342 // int s = i * 2 + 1;
343 // painter.drawLine(QPointF(CoordArray[i].x, CoordArray[i].y), QPointF(HandlePoints[f].x, HandlePoints[f].y));
344 // painter.drawLine(QPointF(CoordArray[i].x, CoordArray[i].y), QPointF(HandlePoints[s].x, HandlePoints[s].y));
345 // }
346 // for (size_t i = 0; i < HandlePoints.size(); i++)
347 // {
348 // painter.drawEllipse(HandlePoints[i].x - radius, HandlePoints[i].y - radius, 2 * radius, 2 * radius);
349 // }
350 //}
351
352 if (mHandleParent != -1)
353 {
354 int f = mHandleParent * 2;
355 int s = mHandleParent * 2 + 1;
356 //绘制控制柄
357 painter.drawLine(QPointF(mCoordArray[mHandleParent].x, mCoordArray[mHandleParent].y), QPointF(mHandlePoints[f].x, mHandlePoints[f].y));
358 painter.drawLine(QPointF(mCoordArray[mHandleParent].x, mCoordArray[mHandleParent].y), QPointF(mHandlePoints[s].x, mHandlePoints[s].y));
359 //绘制控制点
360 painter.drawEllipse(mHandlePoints[f].x - radius, mHandlePoints[f].y - radius, 2 * radius, 2 * radius);
361 painter.drawEllipse(mHandlePoints[s].x - radius, mHandlePoints[s].y - radius, 2 * radius, 2 * radius);
362 // 绘制父点
363 painter.setBrush(QBrush(QColor(80, 179, 255), Qt::SolidPattern));
364 painter.drawEllipse(mCoordArray[mHandleParent].x - radius, mCoordArray[mHandleParent].y - radius, 2 * radius, 2 * radius);
365
366
367 QPen LinePen2 = QPen(QPen(QBrush(QColor(255, 255, 255)), 2, Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin));
368 painter.setPen(LinePen2);
369 painter.drawEllipse(mCoordArray[mHandleParent].x - radius, mCoordArray[mHandleParent].y - radius, 2 * radius, 2 * radius);
370 }
371 if (mSelectHandlePoint != -1 )
372 {
373 QPen LinePen2 = QPen(QPen(QBrush(QColor(255, 255, 255)), 2, Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin));
374 painter.setPen(LinePen2);
376
377 }
378 }
379
380 if (mForceUpdate)
381 {
382
385 mForceUpdate = false;
386
387 }
388
389 painter.setBrush(QBrush(QColor(80, 179, 255), Qt::SolidPattern));
390 painter.setPen(QPen(QPen(QBrush(QColor(255, 255, 255)), 2, Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin)));
391
392 //绘制选中点
393 if (mMultiSelectID.size())
394 {
395 for (auto it : mMultiSelectID)
396 {
397 painter.drawEllipse(mCoordArray[it].x - radius, mCoordArray[it].y - radius, 2 * radius, 2 * radius);
398 }
399 }
400
401
402 painter.setBrush(QBrush(QColor(255, 0, 0), Qt::SolidPattern));
403 painter.setPen(QPen(QPen(QBrush(QColor(255, 0, 0)), 1, Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin)));
404
405
406
407 }
408
410 {
411
412 }
413
414
415 QDrawLabel::QDrawLabel(QWidget* parent)
416 {
417 this->setLabelSize(w, h, w, w);
418 this->setStyleSheet("background:rgba(110,115,100,1)");
419 this->setMouseTracking(true);
420
421
422 if (mMode == x)
423 {
424 for (auto it : mCoordArray)
425 {
426 if (it.x == minX)
427 {
428 mGeneratorXmin = 0;
429 }
430 else
431 {
432 if (!mGeneratorXmin) { mMinIndex++; }
433 }
434 if (it.x == maxX)
435 {
436 mGeneratorXmax = 0;
437 }
438 else
439 {
440 if (!mGeneratorXmax) { mMaxIndex++; }
441 }
442 }
443
444 if (!mGeneratorXmin)
445 {
447 }
448 if (!mGeneratorXmax)
449 {
451 }
452 }
453 if (mMode == y)
454 {
455 for (auto it : mCoordArray)
456 {
457 if (it.y == minY) { mGeneratorYmin = 0; }
458 if (it.y == maxY) { mGeneratorYmax = 0; }
459 }
460
461 if (!mGeneratorYmin)
462 {
464 }
465 if (!mGeneratorYmax)
466 {
468 }
469 }
470 }
471
472
473
474 void QDrawLabel::mousePressEvent(QMouseEvent* event)
475 {
476
477 //鼠标左键
478
479 mPressCoord.x = event->pos().x();
480 mPressCoord.y = event->pos().y();
481
482 if (mShiftKey) //多选
483 {
484 for (size_t i = 0; i < mCoordArray.size(); i++)
485 {
486 int temp = sqrt(std::pow((mPressCoord.x - mCoordArray[i].x), 2) + std::pow((mPressCoord.y - mCoordArray[i].y), 2));
487 if (temp < selectDistance)
488 {
489 mSelectPointID = i;
490 mIsSelect = true;
493
494 bool elementInMulti = false;
495
496 std::vector<int>::iterator iter;
497 iter = mMultiSelectID.begin();
498 while (iter != mMultiSelectID.end())
499 {
500 if (*iter == i)
501 {
502 elementInMulti = true;
503 break;
504 }
505 iter++;
506 }
507 if (elementInMulti)
508 {
509
510 mMultiSelectID.erase(iter);
511 elementInMulti = false;
512 }
513 else
514 {
515 mMultiSelectID.push_back(i);
516 }
517 break;
518 }
519 }
520 }
521 else if (!mShiftKey && !mAltKey) //单选
522 {
523 for (size_t i = 0; i < mCoordArray.size(); i++)
524 {
525 int temp = sqrt(std::pow((mPressCoord.x - mCoordArray[i].x), 2) + std::pow((mPressCoord.y - mCoordArray[i].y), 2));
526
527 if (temp < selectDistance)
528 {
529 mSelectPointID = i;
530 mIsSelect = true;
533 {
534 if (std::find(mMultiSelectID.begin(), mMultiSelectID.end(), i) != mMultiSelectID.end())
535 {
536 }
537 else
538 {
539 mMultiSelectID.clear();
540 mMultiSelectID.push_back(i);
541 }
542 }
543
544 if (mSelectPointID == 0)
545 {
546 mInsertAtBegin = true;
547 }
548 else if (mSelectPointID == mCoordArray.size() - 1)
549 {
550 mInsertAtBegin = false;
551 }
552
553 break;
554 }
555 }
556 }
557
558 //判断是否点击贝塞尔控制柄
559 if (useBezier)
560 {
561 int displayHandle[2] = { mHandleParent * 2 ,mHandleParent * 2 + 1};
562 for (size_t k = 0; k < 2; k++)
563 {
564 int i = displayHandle[k];
565
566 if (i < 0) { break; }
567
568 int temp = sqrt(std::pow((mPressCoord.x - mHandlePoints[i].x), 2) + std::pow((mPressCoord.y - mHandlePoints[i].y), 2));
569
570 if (temp < selectDistance && mIsSelect != true)
571 {
573 mIsHandleSelect = true;
575
577 else { mHandleParent = (mSelectHandlePoint - 1) / 2; }
578
579
580 if (mSelectHandlePoint % 2 == 0)
581 {
583 }
584 else
585 {
587 }
588
590
591 mConnectLength = V2.norm();
592
593 {//判断Handle是否联动
596 V4.normalize();
597 Vec2f N = -1 * V3.normalize();
598 float angle = acos(V4.dot(N)) / M_PI * 180;
599 if (angle <= HandleAngleThreshold) { mHandleConnection = true; }
600 else { mHandleConnection = false; }
601 }
602
603 break;
604 }
605 }
606 }
607 //未点击任何点则插入点
608 if (!mIsSelect && !mIsHandleSelect)
609 {
610 //close模式下插入点并自动排序
612 }
613 //鼠标右键
614 else if(event->button() == Qt::RightButton)
615 {
616 if (mSelectPointID > 1)
617 {
618 deletePoint();
619 }
620 }
621
622 this->update();
623 }
624
625 //尾插
627 {
628
629 mCoordArray.push_back(mPressCoord);
632
634 {
636 mSelectPointID = -1;
637 mIsSelect = false;
638 mHandleParent = mCoordArray.size() - 1;
641 mIsHandleSelect = true;
642 }
644 {
646 mSelectPointID = mCoordArray.size() - 1;
647 mIsSelect = true;
651 mIsHandleSelect = false;
653 }
654
655 mMultiSelectID.clear();
656 mMultiSelectID.push_back(mCoordArray.size() - 1);
657
658
659
660 return mHandleParent;
661
662 }
663
664
665
666 void QDrawLabel::mouseMoveEvent(QMouseEvent* event)
667 {
668 this->grabKeyboard();
669 //移动约束
670 if (mIsSelect)
671 {
672 //首位移动约束 ——单选
673
674 if (mSelectPointID <= 1)
675 {
676 if (mMode == Dir::x)
677 {
678 mCoordArray[mSelectPointID].y = dyno::clamp(event->pos().y(), minY, maxY);
679 }
680 else if (mMode == Dir::y)
681 {
682 mCoordArray[mSelectPointID].x = dyno::clamp(event->pos().x(), minX, maxX);
683 }
684 }
685 else
686 {
687 mCoordArray[mSelectPointID].x = dyno::clamp(event->pos().x(), minX, maxX);
688 mCoordArray[mSelectPointID].y = dyno::clamp(event->pos().y(), minY, maxY);
689 }
690
692
695
698
700
701 //多选
702 if (mMultiSelectID.size() > 1)
703 {
704 for (size_t i = 0; i < mMultiSelectID.size(); i++)
705 {
706 int tempSelect = mMultiSelectID[i];
707 if (tempSelect != mSelectPointID)
708 {
709 if (tempSelect <= 1)
710 {
711 if (mMode == Dir::x)
712 {
713 mCoordArray[tempSelect].y = dyno::clamp(mCoordArray[tempSelect].y + mDtPosition.y, minY, maxY);
714 }
715 else if (mMode == Dir::y)
716 {
717 mCoordArray[tempSelect].x = dyno::clamp(mCoordArray[tempSelect].x + mDtPosition.x, minX, maxX);
718 }
719 }
720 else
721 {
722 mCoordArray[tempSelect].x = dyno::clamp(mCoordArray[tempSelect].x + mDtPosition.x, minX, maxX);
723 mCoordArray[tempSelect].y = dyno::clamp(mCoordArray[tempSelect].y + mDtPosition.y, minY, maxY);
724 }
725
726 mHandlePoints[tempSelect * 2].x = dyno::clamp(mHandlePoints[tempSelect * 2].x + mDtPosition.x, minX, maxX);
727 mHandlePoints[tempSelect * 2].y = dyno::clamp(mHandlePoints[tempSelect * 2].y + mDtPosition.y, minY, maxY);
728
729 mHandlePoints[tempSelect * 2 + 1].x = dyno::clamp(mHandlePoints[tempSelect * 2 + 1].x + mDtPosition.x, minX, maxX);
730 mHandlePoints[tempSelect * 2 + 1].y = dyno::clamp(mHandlePoints[tempSelect * 2 + 1].y + mDtPosition.y, minY, maxY);
731 }
732 }
733
734 }
735
736
737
738
739
740 update();
741 }
742 //控制柄移动
743 if (mIsHandleSelect)
744 {
745 //首位移动约束
746 mHandlePoints[mSelectHandlePoint].x = dyno::clamp(event->pos().x(), minX, maxX);
747 mHandlePoints[mSelectHandlePoint].y = dyno::clamp(event->pos().y(), minY, maxY);
748
750 Vec2f V2 = V1;
752 V3.normalize();
754 Vec2f N = -1 * V1.normalize();
755 float angle = acos(V3.dot(N))/ M_PI *180;
756
757 if (!mAltKey && mHandleConnection)
758 {
760 {
761 mHandlePoints[mConnectHandlePoint] = N * (V2.norm()) + P;
762 }
763 else
764 {
768 }
769 }
770
771
772 update();
773 }
774
775
776 if (mIsHover == true)
777 {
778 int tempHover = sqrt(std::pow((event->pos().x() - mCoordArray[mHoverPoint].x), 2) + std::pow((event->pos().y() - mCoordArray[mHoverPoint].y), 2));
779 if (tempHover >= selectDistance)
780 {
781 mHoverPoint = -1;
782 mIsHover = false;
783 }
784 }
785 else
786 {
787 for (size_t i = 0; i < mCoordArray.size(); i++)
788 {
789 int temp = sqrt(std::pow((event->pos().x() - mCoordArray[i].x), 2) + std::pow((event->pos().y() - mCoordArray[i].y), 2));
790
791 if (temp < selectDistance)
792 {
793 mHoverPoint = i;
794 mIsHover = true;
795 break;
796 }
797 }
798 update();
799 }
800
801 }
802
804 {
805 Ramp s;
806
807 //更新数据到field
808 if (mField == nullptr) { return; }
809 else
810 {
813
814 CoordtoField(s);
815 }
816
817
818
819 mField->setValue(s);
820
821 }
822
824 {
825 this->mMode = (Dir)s;
826 Ramp ras;
827
829
830 if (mField == nullptr) { return; }
831 else
832 {
834 if (!mFloatCoord.empty()) { CoordtoField(ras); }
835 }
836
837 this->mForceUpdate = true;
838 update();
839
840 }
841
843 {
844 this->InterpMode = (Interpolation)s;
846 else if (InterpMode == Interpolation::Bezier) { useBezier = 1; }
847 this->mForceUpdate = true;
848 update();
849 }
850
851
852
853
854
856 {
857 s.clearMyCoord();
858 for (auto it : mFloatCoord)
859 {
860 s.addFloatItemToCoord(it.x, it.y, s.getUserPoints());
861 }
862
863 for (size_t i = 0; i < mReSortCoordArray.size(); i++)
864 {
865 int sa = mMapResortIDtoOriginalID.find(i)->second;
866
867 int f = 2 * sa;
868 int e = 2 * sa + 1;
869
872 }
873
874
876 s.getSpacing() = spacing;
877
878 s.getClose() = curveClose;
879
882
885 }
886
887
888
890 {
891 LineResample = mField->getValue().getResample();
892 spacing = mField->getValue().getSpacing();
893 curveClose = mField->getValue().getClose();
894
895 if (mField->getValue().getInterpMode() == Canvas::Interpolation::Bezier) { InterpMode = Bezier; }
896 else { InterpMode = Linear; }
897
898 useSort = true;
899
900 }
901
902}
903
#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
std::vector< Coord2D > & getUserPoints()
Definition Canvas.h:203
std::vector< Coord2D > & getUserHandles()
Definition Canvas.h:204
void clearMyCoord()
Definition Canvas.cpp:271
T getValue()
Definition Field.h:136
void setRange(double Min, double Max)
void setValue(int value)
void changeInterpValue(int s)
void updateDataToField() override
QDrawLabel(QWidget *parent=nullptr)
void mousePressEvent(QMouseEvent *event) override
void mouseMoveEvent(QMouseEvent *event) override
void CoordtoField(Ramp &s)
int addPointtoEnd() override
void changeValue(int s)
void paintEvent(QPaintEvent *event)
FVar< Ramp > * mField
Definition QRampWidget.h:77
void copySettingFromField()
void setField(FVar< Ramp > *f)
Definition QRampWidget.h:66
QFieldWidget(FBase *field)
DECLARE_FIELD_WIDGET QRampWidget(FBase *field)
void updateBezierCurve() override
Update the data of the Bezier curve points.
Definition Ramp.cpp:70
void UpdateFieldFinalCoord() override
Updating the data of a Field.
Definition Ramp.cpp:225
bool mInsertBezierOpenPoint
Definition QComponent.h:907
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 insertElementToHandlePointSet(int i)
Definition QComponent.h:708
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
void swap(Wt::Guid &lhs, Wt::Guid &rhs) noexcept
Definition guid.cpp:138