PeriDyno 1.0.0
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
34
35 //Enum List Direction Mode
36 int curIndex = int(f->getValue().Dirmode);
37 int enumNum = f->getValue().count;
38 QComboBox* combox = new QComboBox;
39 combox->setMaximumWidth(256);
40 for (size_t i = 0; i < enumNum; i++)
41 {
42 auto enumName = f->getValue().DirectionStrings[i];
43 combox->addItem(QString::fromStdString(enumName));
44 }
45 combox->setCurrentIndex(curIndex);
46
47
48 //Enum List InterpMode
49 int curIndex2 = int(f->getValue().mInterpMode);
50 int enumNum2 = f->getValue().InterpolationCount;
51 QComboBox* combox2 = new QComboBox;
52 combox2->setMaximumWidth(256);
53 for (size_t i = 0; i < enumNum; i++)
54 {
55 auto enumName2 = f->getValue().InterpStrings[i];
56 combox2->addItem(QString::fromStdString(enumName2));
57 }
58 combox2->setCurrentIndex(curIndex2);
59 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)); ");
60
61 auto s = f->getValue();
62
63 //build RampWidget by field
64 //RampWidget name
65 QLabel* name = new QLabel();
66 name->setFixedSize(80, 18);
67 name->setText(FormatFieldWidgetName(field->getObjectName()));
68 name->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);//
69
70
71
72 //build DrawLabel
73 QDrawLabel* DrawLabel = new QDrawLabel();
74
75 DrawLabel->setMode(combox->currentIndex());
76
77 //DrawLabel->setBorderMode(int(f->getValue().Bordermode));
78
79 DrawLabel->setField(f);
80
81 DrawLabel->copySettingFromField();
82
83 DrawLabel->updateLabelShape();
84 //printf("drawlabel %d : \n", int(DrawLabel->borderMode));
85
86
87 connect(combox, SIGNAL(currentIndexChanged(int)), DrawLabel, SLOT(changeValue(int)));
88 connect(combox2, SIGNAL(currentIndexChanged(int)), DrawLabel, SLOT(changeInterpValue(int)));
89
90 //VLayout : combox2 / SquardButton / CloseButton
91 QVBoxLayout* VLayout = new QVBoxLayout();
92 QSpacerItem* VSpacer = new QSpacerItem(10, 380, QSizePolicy::Minimum, QSizePolicy::Expanding);
93 VLayout->addItem(VSpacer);
94 VLayout->addWidget(combox2);
95 VLayout->setSpacing(5);
96
97
98 QGridLayout* Gridlayout = new QGridLayout;
99 Gridlayout->setContentsMargins(0, 0, 0, 0);
100 Gridlayout->setSpacing(5);
101 Gridlayout->addWidget(name, 0, 0,3,1, Qt::AlignLeft);
102 Gridlayout->addWidget(DrawLabel,0,1, Qt::AlignCenter);
103 Gridlayout->addLayout(VLayout,0,2, Qt::AlignRight);
104 Gridlayout->setColumnStretch(0, 0);
105 Gridlayout->setColumnStretch(1, 5);
106 Gridlayout->setColumnStretch(2, 0);
107
108
109 QLabel* spacingName = new QLabel("Spacing");
110
111 mQDoubleSlider* spacingSlider = new mQDoubleSlider;
112 spacingSlider->nameLabel = spacingName;
113 spacingSlider->setRange(1, 40);
114 spacingSlider->setValue(f->getValue().Spacing);
115 spacingSlider->id = -1;
116 mQDoubleSpinner* spacingSpinner = new mQDoubleSpinner;
117 spacingSpinner->setRange(1, 40);
118 spacingSpinner->setValue(f->getValue().Spacing);
119 spacingSpinner->id = -1;
120 QObject::connect(spacingSlider, SIGNAL(valueChanged(double)), spacingSpinner, SLOT(setValue(double)));
121 QObject::connect(spacingSpinner, SIGNAL(valueChanged(double)), spacingSlider, SLOT(setValue(double)));
122 QObject::connect(spacingSpinner, SIGNAL(valueChangedAndID(double, int)), DrawLabel, SLOT(setSpacingToDrawLabel(double,int)));
123
124 QHBoxLayout* SpacingHlayout = new QHBoxLayout;
125 SpacingHlayout->setContentsMargins(0, 0, 0, 0);
126 SpacingHlayout->setSpacing(0);
127 SpacingHlayout->addWidget(spacingName);
128 SpacingHlayout->addWidget(spacingSlider);
129 SpacingHlayout->addWidget(spacingSpinner);
130
131
132 QLabel* nameReal[4];
133 mQDoubleSlider* sliderReal[4];
134 mQDoubleSpinner* spinnerReal[4];
135 std::string nameString[4] = { "MinX","MinY","MaxX","MaxY" };
136
137 QHBoxLayout* Hlayout1 = new QHBoxLayout;
138 Hlayout1->setContentsMargins(0, 0, 0, 0);
139 Hlayout1->setSpacing(0);
140
141 QHBoxLayout* Hlayout2 = new QHBoxLayout;
142 Hlayout2->setContentsMargins(0, 0, 0, 0);
143 Hlayout2->setSpacing(0);
144
145 for (size_t i = 0; i < 4; i++)
146 {
147 nameReal[i] = new QLabel(QString::fromStdString(nameString[i]));
148
149 sliderReal[i] = new mQDoubleSlider;
150 sliderReal[i]->id = i;
151
152 spinnerReal[i] = new mQDoubleSpinner;
153 spinnerReal[i]->id = i;
154
155 auto rangeArray = f->getValue().remapRange;
156
157 sliderReal[i]->setRange(rangeArray[2 * i], rangeArray[2 * i + 1]);
158 spinnerReal[i]->setRange(rangeArray[2 * i], rangeArray[2 * i + 1]);
159
160 QObject::connect(sliderReal[i], SIGNAL(valueChanged(double)), spinnerReal[i], SLOT(setValue(double)));
161 QObject::connect(spinnerReal[i], SIGNAL(valueChanged(double)), sliderReal[i], SLOT(setValue(double)));
162 QObject::connect(spinnerReal[i], SIGNAL(valueChangedAndID(double, int)), DrawLabel, SLOT(SetValueToDrawLabel(double, int)));
163
164 switch (i)
165 {
166 case 0:
167 sliderReal[i]->setValue(f->getValue().NminX);
168 spinnerReal[i]->setValue(f->getValue().NminX);
169 break;
170
171 case 1:
172 sliderReal[i]->setValue(f->getValue().mNewMinY);
173 spinnerReal[i]->setValue(f->getValue().mNewMinY);
174 break;
175
176 case 2:
177 sliderReal[i]->setValue(f->getValue().NmaxX);
178 spinnerReal[i]->setValue(f->getValue().NmaxX);
179 break;
180
181 case 3:
182 sliderReal[i]->setValue(f->getValue().NmaxY);
183 spinnerReal[i]->setValue(f->getValue().NmaxY);
184 break;
185 }
186
187
188
189 if (i < 2)
190 {
191 Hlayout1->addWidget(nameReal[i]);
192 Hlayout1->addWidget(sliderReal[i]);
193 Hlayout1->addWidget(spinnerReal[i]);
194 }
195 else
196 {
197 Hlayout2->addWidget(nameReal[i]);
198 Hlayout2->addWidget(sliderReal[i]);
199 Hlayout2->addWidget(spinnerReal[i]);
200 }
201 }
202
203 //Bool
204 QHBoxLayout* boolLayout = new QHBoxLayout;
205 boolLayout->setContentsMargins(0, 0, 0, 0);
206 boolLayout->setSpacing(0);
207
208 QLabel* boolName = new QLabel();
209 boolName->setFixedHeight(24);
210 boolName->setText("Resample");
211 mQCheckBox* Checkbox = new mQCheckBox();
212 Checkbox->nameLabel = boolName;
213 Checkbox->QWidget::setFixedWidth(20);
214 Checkbox->QAbstractButton::setChecked(f->getValue().resample);
215
216 connect(Checkbox, SIGNAL(mValueChanged(int)), DrawLabel, SLOT(setLinearResample(int)));
217 connect(Checkbox, SIGNAL(mValueChanged(int)), spacingSlider, SLOT(setNewVisable(int)));
218 connect(Checkbox, SIGNAL(mValueChanged(int)), spacingSpinner, SLOT(setNewVisable(int)));
219
220 if (f->getValue().resample == false)
221 {
222 spacingSlider->setVisible(false);
223 spacingSpinner->setVisible(false);
224 spacingName->setVisible(false);
225 }
226
227
228 boolLayout->addWidget(boolName, 0);
229 boolLayout->addStretch(1);
230 boolLayout->addWidget(Checkbox, 0);
231
232 //if (f->getDataPtr()->InterpMode == Ramp::Interpolation::Bezier) { boolName->setVisible(0); Checkbox->setVisible(0); }
233
234
235 if (f->getValue().useSquardButton)
236 {
237 QToggleButton* unfold = new QToggleButton(f->getValue().useSquard);
238
239 unfold->setText("Squard", "Rect");
240 unfold->setStyleSheet(
241 "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));} "
242 );
243 connect(unfold, &QToggleButton::clicked, DrawLabel, &QDrawLabel::changeLabelSize);
244 unfold->setValue(f->getValue().useSquard);
245 VLayout->addWidget(unfold);
246 }
247
248
249 QVBoxLayout* TotalLayout = new QVBoxLayout();
250 TotalLayout->setContentsMargins(0, 0, 0, 0);
251 TotalLayout->setSpacing(5);
252 TotalLayout->addLayout(Gridlayout);
253 TotalLayout->addLayout(Hlayout1);
254 TotalLayout->addLayout(Hlayout2);
255 TotalLayout->addLayout(boolLayout);
256 TotalLayout->addLayout(SpacingHlayout);
257
258 this->setLayout(TotalLayout);
259
260 }
261
263 {
265 if (f == nullptr)
266 {
267 return;
268 }
269
270 }
271
272 void QDrawLabel::paintEvent(QPaintEvent* event)
273 {
274
275 //设置半径
276 radius = 4;
277 int w = this->width();
278 int h = this->height();
279
280 //设置最大最小坐标
281 minX = 0 + 1.5 * radius;
282 maxX = w - 2 * radius;
283 minY = 0 + 2 * radius;
284 maxY = h - 1.5 * radius;
285
286 //如果CoordArray为空,则从field中取数据
287 if (mCoordArray.empty())
288 {
289 if (mField->getValue().Originalcoord.empty()) //如果field中没有Widget传回的数据,则从field本身的Coord进行初始化
290 {
291 this->copyFromField(mField->getValue().FE_MyCoord, mCoordArray);
292 mReSortCoordArray.assign(mCoordArray.begin(), mCoordArray.end());
295 this->copyFromField(mField->getValue().FE_HandleCoord, mHandlePoints);
296 }
297 else //否则直接取field存的qt坐标
298 {
299 this->copyFromField(mField->getValue().Originalcoord, mCoordArray);
300 //this->copyFromField(field->getDataPtr()->OriginalHandlePoint, HandlePoints);
301 this->copyFromField(mField->getValue().OriginalHandlePoint, mHandlePoints);
302 }
303
304 }
305
306
307 if (mCoordArray.empty()) //如果是close模式,且没有初始化数据,则在空画布创建两个点,作为边界点
308 {
309 if (mMode == x) //direction为x创建点的逻辑
310 {
311 if (mGeneratorXmin)
312 {
313 MyCoord FirstCoord;
314 mCoordArray.push_back(FirstCoord);
315
316 mCoordArray[mCoordArray.size() - 1].x = minX;
317 mCoordArray[mCoordArray.size() - 1].y = (maxY + minY) / 2;
318 std::swap(mCoordArray[0], mCoordArray[mCoordArray.size() - 1]);
319 mGeneratorXmin = 0;
320 }
321 if (mGeneratorXmax)
322 {
323 MyCoord LastCoord;
324 mCoordArray.push_back(LastCoord);
325
326 mCoordArray[mCoordArray.size() - 1].x = maxX;
327 mCoordArray[mCoordArray.size() - 1].y = (maxY + minY) / 2;
328 std::swap(mCoordArray[1], mCoordArray[mCoordArray.size() - 1]);
329 mGeneratorXmax = 0;
330 }
331 }
332 }
333
334 mReSortCoordArray.assign(mCoordArray.begin(), mCoordArray.end()); //用CoordArray为reSortCoordArray赋值
335 reSort(mReSortCoordArray); //对reSortCoordArray重排序
336
337
338 QPainter painter(this);
339 painter.setRenderHint(QPainter::Antialiasing, true);
340
341 //Background
342 QBrush brush = QBrush(Qt::black, Qt::SolidPattern);
343 painter.setBrush(brush);
344 QRectF Bound = QRectF(QPointF(minX, minY), QPointF(maxX, maxY));
345 painter.drawRect(Bound);
346
347 //Grid
348 QBrush brush2 = QBrush(QColor(100,100,100), Qt::CrossPattern);
349 painter.setBrush(brush2);
350 painter.drawRect(Bound);
351
352 //Draw Ellipse
353 size_t ptNum = mCoordArray.size();
354
355 QVector<QPointF> QCoordArray;//创建QPointF以绘制点
356 for (size_t i = 0; i < mReSortCoordArray.size(); i++)
357 {
358 QCoordArray.push_back(QPointF(mReSortCoordArray[i].x, mReSortCoordArray[i].y));
359 }
360
361
362 buildCoordToResortMap(); //构建map用以通过CoordArray查找排序后reSortCoordArray的元素id
363
364 if (mHandlePoints.empty()) //通过CoordArray构建贝塞尔控制柄的点HandlePoints
365 {
367 }
368
369 //绘制曲线
370 QPen LinePen = QPen(QPen(QBrush(QColor(200,200,200)), 2, Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin));
371 painter.setPen(LinePen);
372
373 mPath.clear();
374 if (useBezier) //画贝塞尔曲线或折线
375 {
376 //绘制贝塞尔曲线
377 for (size_t i = 1; i < mReSortCoordArray.size(); i++)
378 {
379 int ptnum = i - 1;
380 mPath.moveTo(mReSortCoordArray[ptnum].x, mReSortCoordArray[ptnum].y);
381
382 auto it = mMapResortIDtoOriginalID.find(i);
383 int id = it->second;
384 int s = id * 2;
385
386 auto itf = mMapResortIDtoOriginalID.find(ptnum);
387 int idf = itf->second;
388 int f = idf * 2 + 1;
389
390 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));
391 painter.drawPath(mPath);
392 }
393
394 }
395 else
396 {
397 if (QCoordArray.size() >= 2)
398 {
399 for (size_t i = 1; i < QCoordArray.size(); i++)
400 {
401 //painter.drawLine(QCoordArray[i], QCoordArray[i + 1]);
402
403 int ptnum = i - 1;
404 mPath.moveTo(mReSortCoordArray[ptnum].x, mReSortCoordArray[ptnum].y);
405 mPath.lineTo(QPointF(mReSortCoordArray[ptnum + 1].x, mReSortCoordArray[ptnum + 1].y));
406 painter.drawPath(mPath);
407 }
408
409 }
410 }
411
412 QPen LinePenWhite = QPen(QPen(QBrush(Qt::white), 2, Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin));
413 painter.setPen(LinePenWhite);
414
415 //绘制点
416 for (size_t i = 0; i < ptNum; i++)
417 {
418 painter.setBrush(QBrush(Qt::gray, Qt::SolidPattern));
419 painter.drawEllipse(mCoordArray[i].x - radius, mCoordArray[i].y - radius, 2 * radius, 2 * radius);
420 painter.setPen(QPen(QBrush(QColor(200, 200, 200), Qt::SolidPattern), 2, Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin));
421 painter.drawEllipse(mCoordArray[i].x - radius, mCoordArray[i].y - radius, 2 * radius, 2 * radius);
422 }
423
424 //Paint SelectPoint
425 if (mSelectPointID != -1)
426 {
427 painter.setBrush(QBrush(QColor(80, 179, 255), Qt::SolidPattern));
428 painter.drawEllipse(mCoordArray[mSelectPointID].x - radius, mCoordArray[mSelectPointID].y - radius, 2 * radius, 2 * radius);
429 painter.setPen(QPen(QBrush(Qt::white, Qt::SolidPattern), 2, Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin));
430 painter.drawEllipse(mCoordArray[mSelectPointID].x - radius, mCoordArray[mSelectPointID].y - radius, 2 * radius, 2 * radius);
431 }
432 //Paint hoverPoint
433 if (mHoverPoint != -1)
434 {
435 painter.setBrush(QBrush(QColor(80, 179, 255), Qt::SolidPattern));
436 painter.drawEllipse(mCoordArray[mHoverPoint].x - radius, mCoordArray[mHoverPoint].y - radius, 2 * radius, 2 * radius);
437 painter.setPen(QPen(QBrush(Qt::white, Qt::SolidPattern), 2, Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin));
438 painter.drawEllipse(mCoordArray[mHoverPoint].x - radius, mCoordArray[mHoverPoint].y - radius, 2 * radius, 2 * radius);
439 }
440
441 //绘制控制柄
442 if (useBezier)
443 {
445 //{
446 // for (size_t i = 0; i < CoordArray.size(); i++)
447 // {
448 // int f = i * 2;
449 // int s = i * 2 + 1;
450 // painter.drawLine(QPointF(CoordArray[i].x, CoordArray[i].y), QPointF(HandlePoints[f].x, HandlePoints[f].y));
451 // painter.drawLine(QPointF(CoordArray[i].x, CoordArray[i].y), QPointF(HandlePoints[s].x, HandlePoints[s].y));
452 // }
453 // for (size_t i = 0; i < HandlePoints.size(); i++)
454 // {
455 // painter.drawEllipse(HandlePoints[i].x - radius, HandlePoints[i].y - radius, 2 * radius, 2 * radius);
456 // }
457 //}
458
459 if (mHandleParent != -1)
460 {
461 int f = mHandleParent * 2;
462 int s = mHandleParent * 2 + 1;
463 //绘制控制柄
464 painter.drawLine(QPointF(mCoordArray[mHandleParent].x, mCoordArray[mHandleParent].y), QPointF(mHandlePoints[f].x, mHandlePoints[f].y));
465 painter.drawLine(QPointF(mCoordArray[mHandleParent].x, mCoordArray[mHandleParent].y), QPointF(mHandlePoints[s].x, mHandlePoints[s].y));
466 //绘制控制点
467 painter.drawEllipse(mHandlePoints[f].x - radius, mHandlePoints[f].y - radius, 2 * radius, 2 * radius);
468 painter.drawEllipse(mHandlePoints[s].x - radius, mHandlePoints[s].y - radius, 2 * radius, 2 * radius);
469 // 绘制父点
470 painter.setBrush(QBrush(QColor(80, 179, 255), Qt::SolidPattern));
471 painter.drawEllipse(mCoordArray[mHandleParent].x - radius, mCoordArray[mHandleParent].y - radius, 2 * radius, 2 * radius);
472
473
474 QPen LinePen2 = QPen(QPen(QBrush(QColor(255, 255, 255)), 2, Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin));
475 painter.setPen(LinePen2);
476 painter.drawEllipse(mCoordArray[mHandleParent].x - radius, mCoordArray[mHandleParent].y - radius, 2 * radius, 2 * radius);
477 }
478 if (mSelectHandlePoint != -1 )
479 {
480 QPen LinePen2 = QPen(QPen(QBrush(QColor(255, 255, 255)), 2, Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin));
481 painter.setPen(LinePen2);
483
484 }
485 }
486
487 if (mForceUpdate)
488 {
489
492 mForceUpdate = false;
493
494 }
495
496 painter.setBrush(QBrush(QColor(80, 179, 255), Qt::SolidPattern));
497 painter.setPen(QPen(QPen(QBrush(QColor(255, 255, 255)), 2, Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin)));
498
499 //绘制选中点
500 if (mMultiSelectID.size())
501 {
502 for (auto it : mMultiSelectID)
503 {
504 painter.drawEllipse(mCoordArray[it].x - radius, mCoordArray[it].y - radius, 2 * radius, 2 * radius);
505 }
506 }
507
508
509 painter.setBrush(QBrush(QColor(255, 0, 0), Qt::SolidPattern));
510 painter.setPen(QPen(QPen(QBrush(QColor(255, 0, 0)), 1, Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin)));
511
512
513
514 }
515
517 {
518
519 }
520
521
522 QDrawLabel::QDrawLabel(QWidget* parent)
523 {
524 this->setLabelSize(w, h, w, w);
525 this->setStyleSheet("background:rgba(110,115,100,1)");
526 this->setMouseTracking(true);
527
528
529 if (mMode == x)
530 {
531 for (auto it : mCoordArray)
532 {
533 if (it.x == minX)
534 {
535 mGeneratorXmin = 0;
536 }
537 else
538 {
539 if (!mGeneratorXmin) { mMinIndex++; }
540 }
541 if (it.x == maxX)
542 {
543 mGeneratorXmax = 0;
544 }
545 else
546 {
547 if (!mGeneratorXmax) { mMaxIndex++; }
548 }
549 }
550
551 if (!mGeneratorXmin)
552 {
553 std::swap(mCoordArray[0], mCoordArray[mMinIndex++]);
554 }
555 if (!mGeneratorXmax)
556 {
557 std::swap(mCoordArray[1], mCoordArray[mMaxIndex++]);
558 }
559 }
560 if (mMode == y)
561 {
562 for (auto it : mCoordArray)
563 {
564 if (it.y == minY) { mGeneratorYmin = 0; }
565 if (it.y == maxY) { mGeneratorYmax = 0; }
566 }
567
568 if (!mGeneratorYmin)
569 {
570 std::swap(mCoordArray[0], mCoordArray[mMinIndex++]);
571 }
572 if (!mGeneratorYmax)
573 {
574 std::swap(mCoordArray[1], mCoordArray[mMaxIndex++]);
575 }
576 }
577 }
578
579
580
581 void QDrawLabel::mousePressEvent(QMouseEvent* event)
582 {
583
584 //鼠标左键
585
586 mPressCoord.x = event->pos().x();
587 mPressCoord.y = event->pos().y();
588
589 if (mShiftKey) //多选
590 {
591 for (size_t i = 0; i < mCoordArray.size(); i++)
592 {
593 int temp = sqrt(std::pow((mPressCoord.x - mCoordArray[i].x), 2) + std::pow((mPressCoord.y - mCoordArray[i].y), 2));
594 if (temp < selectDistance)
595 {
596 mSelectPointID = i;
597 mIsSelect = true;
600
601 bool elementInMulti = false;
602
603 std::vector<int>::iterator iter;
604 iter = mMultiSelectID.begin();
605 while (iter != mMultiSelectID.end())
606 {
607 if (*iter == i)
608 {
609 elementInMulti = true;
610 break;
611 }
612 iter++;
613 }
614 if (elementInMulti)
615 {
616
617 mMultiSelectID.erase(iter);
618 elementInMulti = false;
619 }
620 else
621 {
622 mMultiSelectID.push_back(i);
623 }
624 break;
625 }
626 }
627 }
628 else if (!mShiftKey && !mAltKey) //单选
629 {
630 for (size_t i = 0; i < mCoordArray.size(); i++)
631 {
632 int temp = sqrt(std::pow((mPressCoord.x - mCoordArray[i].x), 2) + std::pow((mPressCoord.y - mCoordArray[i].y), 2));
633
634 if (temp < selectDistance)
635 {
636 mSelectPointID = i;
637 mIsSelect = true;
640 {
641 if (std::find(mMultiSelectID.begin(), mMultiSelectID.end(), i) != mMultiSelectID.end())
642 {
643 }
644 else
645 {
646 mMultiSelectID.clear();
647 mMultiSelectID.push_back(i);
648 }
649 }
650
651 if (mSelectPointID == 0)
652 {
653 mInsertAtBegin = true;
654 }
655 else if (mSelectPointID == mCoordArray.size() - 1)
656 {
657 mInsertAtBegin = false;
658 }
659
660 break;
661 }
662 }
663 }
664
665 //判断是否点击贝塞尔控制柄
666 if (useBezier)
667 {
668 int displayHandle[2] = { mHandleParent * 2 ,mHandleParent * 2 + 1};
669 for (size_t k = 0; k < 2; k++)
670 {
671 int i = displayHandle[k];
672
673 if (i < 0) { break; }
674
675 int temp = sqrt(std::pow((mPressCoord.x - mHandlePoints[i].x), 2) + std::pow((mPressCoord.y - mHandlePoints[i].y), 2));
676
677 if (temp < selectDistance && mIsSelect != true)
678 {
680 mIsHandleSelect = true;
682
684 else { mHandleParent = (mSelectHandlePoint - 1) / 2; }
685
686
687 if (mSelectHandlePoint % 2 == 0)
688 {
690 }
691 else
692 {
694 }
695
697
698 mConnectLength = V2.norm();
699
700 {//判断Handle是否联动
703 V4.normalize();
704 Vec2f N = -1 * V3.normalize();
705 float angle = acos(V4.dot(N)) / M_PI * 180;
706 if (angle <= HandleAngleThreshold) { mHandleConnection = true; }
707 else { mHandleConnection = false; }
708 }
709
710 break;
711 }
712 }
713 }
714 //未点击任何点则插入点
715 if (!mIsSelect && !mIsHandleSelect)
716 {
717 //close模式下插入点并自动排序
719 }
720 //鼠标右键
721 else if(event->button() == Qt::RightButton)
722 {
723 if (mSelectPointID > 1)
724 {
725 deletePoint();
726 }
727 }
728
729 this->update();
730 }
731
732 //尾插
734 {
735
736 mCoordArray.push_back(mPressCoord);
739
741 {
743 mSelectPointID = -1;
744 mIsSelect = false;
745 mHandleParent = mCoordArray.size() - 1;
748 mIsHandleSelect = true;
749 }
751 {
753 mSelectPointID = mCoordArray.size() - 1;
754 mIsSelect = true;
758 mIsHandleSelect = false;
760 }
761
762 mMultiSelectID.clear();
763 mMultiSelectID.push_back(mCoordArray.size() - 1);
764
765
766
767 return mHandleParent;
768
769 }
770
771
772
773 void QDrawLabel::mouseMoveEvent(QMouseEvent* event)
774 {
775 this->grabKeyboard();
776 //移动约束
777 if (mIsSelect)
778 {
779 //首位移动约束 ——单选
780
781 if (mSelectPointID <= 1)
782 {
783 if (mMode == Dir::x)
784 {
785 mCoordArray[mSelectPointID].y = dyno::clamp(event->pos().y(), minY, maxY);
786 }
787 else if (mMode == Dir::y)
788 {
789 mCoordArray[mSelectPointID].x = dyno::clamp(event->pos().x(), minX, maxX);
790 }
791 }
792 else
793 {
794 mCoordArray[mSelectPointID].x = dyno::clamp(event->pos().x(), minX, maxX);
795 mCoordArray[mSelectPointID].y = dyno::clamp(event->pos().y(), minY, maxY);
796 }
797
799
802
805
807
808 //多选
809 if (mMultiSelectID.size() > 1)
810 {
811 for (size_t i = 0; i < mMultiSelectID.size(); i++)
812 {
813 int tempSelect = mMultiSelectID[i];
814 if (tempSelect != mSelectPointID)
815 {
816 if (tempSelect <= 1)
817 {
818 if (mMode == Dir::x)
819 {
820 mCoordArray[tempSelect].y = dyno::clamp(mCoordArray[tempSelect].y + mDtPosition.y, minY, maxY);
821 }
822 else if (mMode == Dir::y)
823 {
824 mCoordArray[tempSelect].x = dyno::clamp(mCoordArray[tempSelect].x + mDtPosition.x, minX, maxX);
825 }
826 }
827 else
828 {
829 mCoordArray[tempSelect].x = dyno::clamp(mCoordArray[tempSelect].x + mDtPosition.x, minX, maxX);
830 mCoordArray[tempSelect].y = dyno::clamp(mCoordArray[tempSelect].y + mDtPosition.y, minY, maxY);
831 }
832
833 mHandlePoints[tempSelect * 2].x = dyno::clamp(mHandlePoints[tempSelect * 2].x + mDtPosition.x, minX, maxX);
834 mHandlePoints[tempSelect * 2].y = dyno::clamp(mHandlePoints[tempSelect * 2].y + mDtPosition.y, minY, maxY);
835
836 mHandlePoints[tempSelect * 2 + 1].x = dyno::clamp(mHandlePoints[tempSelect * 2 + 1].x + mDtPosition.x, minX, maxX);
837 mHandlePoints[tempSelect * 2 + 1].y = dyno::clamp(mHandlePoints[tempSelect * 2 + 1].y + mDtPosition.y, minY, maxY);
838 }
839 }
840
841 }
842
843
844
845
846
847 update();
848 }
849 //控制柄移动
850 if (mIsHandleSelect)
851 {
852 //首位移动约束
853 mHandlePoints[mSelectHandlePoint].x = dyno::clamp(event->pos().x(), minX, maxX);
854 mHandlePoints[mSelectHandlePoint].y = dyno::clamp(event->pos().y(), minY, maxY);
855
857 Vec2f V2 = V1;
859 V3.normalize();
861 Vec2f N = -1 * V1.normalize();
862 float angle = acos(V3.dot(N))/ M_PI *180;
863
864 if (!mAltKey && mHandleConnection)
865 {
867 {
868 mHandlePoints[mConnectHandlePoint] = N * (V2.norm()) + P;
869 }
870 else
871 {
875 }
876 }
877
878
879 update();
880 }
881
882
883 if (mIsHover == true)
884 {
885 int tempHover = sqrt(std::pow((event->pos().x() - mCoordArray[mHoverPoint].x), 2) + std::pow((event->pos().y() - mCoordArray[mHoverPoint].y), 2));
886 if (tempHover >= selectDistance)
887 {
888 mHoverPoint = -1;
889 mIsHover = false;
890 }
891 }
892 else
893 {
894 for (size_t i = 0; i < mCoordArray.size(); i++)
895 {
896 int temp = sqrt(std::pow((event->pos().x() - mCoordArray[i].x), 2) + std::pow((event->pos().y() - mCoordArray[i].y), 2));
897
898 if (temp < selectDistance)
899 {
900 mHoverPoint = i;
901 mIsHover = true;
902 break;
903 }
904 }
905 update();
906 }
907
908 }
909
911 {
912 Ramp s;
913
914 //更新数据到field
915 if (mField == nullptr) { return; }
916 else
917 {
920
921 CoordtoField(s);
922 }
923
924
925
926 mField->setValue(s);
927
928 }
929
931 {
932 this->mMode = (Dir)s;
933 Ramp ras;
934
936
937 if (mField == nullptr) { return; }
938 else
939 {
941 if (!mFloatCoord.empty()) { CoordtoField(ras); }
942 }
943
944 this->mForceUpdate = true;
945 update();
946
947 }
948
950 {
951 this->InterpMode = (Interpolation)s;
953 else if (InterpMode == Interpolation::Bezier) { useBezier = 1; }
954 this->mForceUpdate = true;
955 update();
956 }
957
958
959
960
961
963 {
964 s.clearMyCoord();
965 for (auto it : mFloatCoord)
966 {
967 s.addFloatItemToCoord(it.x, it.y, s.mCoord);
968 }
969
970 for (size_t i = 0; i < mReSortCoordArray.size(); i++)
971 {
972 int sa = mMapResortIDtoOriginalID.find(i)->second;
973
974 int f = 2 * sa;
975 int e = 2 * sa + 1;
976
979 }
980
981 for (auto it : mCoordArray)
982 {
983 s.addItemOriginalCoord(it.x, it.y);
984 }
985 for (auto it : mHandlePoints)
986 {
987 s.addItemHandlePoint(it.x, it.y);
988 }
989
991
994 s.Spacing = spacing;
995
996 s.NminX = NminX;
997 s.NmaxX = NmaxX;
998 s.mNewMinY = mNewMinY;
999 s.NmaxY = NmaxY;
1000
1002
1005
1008 }
1009
1010
1011
1013 {
1014 useBezier = mField->getValue().useBezierInterpolation;
1015 LineResample = mField->getValue().resample;
1016 spacing = mField->getValue().Spacing;
1017 curveClose = mField->getValue().curveClose;
1018 isSquard = mField->getValue().useSquard;
1019 lockSize = mField->getValue().lockSize;
1020
1021 if (mField->getValue().mInterpMode == Canvas::Interpolation::Bezier) { InterpMode = Bezier; }
1022 else { InterpMode = Linear; }
1023
1024 if (mField->getValue().Dirmode == Canvas::Direction::x) { mMode = Dir::x; }
1025 else { mMode = Dir::y; }
1026 useSort = true;
1027
1028 }
1029
1030}
1031
#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
Canvas::Interpolation mInterpMode
Definition Canvas.h:242
bool resample
Definition Canvas.h:262
void addItemHandlePoint(int x, int y)
Definition Canvas.cpp:44
bool useBezierInterpolation
Definition Canvas.h:261
double NmaxX
Definition Canvas.h:256
double NmaxY
Definition Canvas.h:258
void addItemOriginalCoord(int x, int y)
Definition Canvas.cpp:37
std::vector< Coord2D > mCoord
Definition Canvas.h:243
bool curveClose
Definition Canvas.h:263
double mNewMinY
Definition Canvas.h:257
bool useSquard
Definition Canvas.h:265
double NminX
Definition Canvas.h:255
float Spacing
Definition Canvas.h:267
std::vector< Coord2D > myHandlePoint
Definition Canvas.h:248
void clearMyCoord()
Definition Canvas.cpp:292
T getValue()
Definition Field.h:130
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 setField(FVar< Ramp > *f)
Definition QRampWidget.h:66
QFieldWidget(FBase *field)
DECLARE_FIELD_WIDGET QRampWidget(FBase *field)
void setText(std::string textUnCheck, std::string textCheck)
void setValue(bool press)
void updateBezierCurve() override
Update the data of the Bezier curve points.
Definition Ramp.cpp:101
void UpdateFieldFinalCoord() override
Updating the data of a Field.
Definition Ramp.cpp:269
void updateLabelShape()
Definition QComponent.h:273
bool mInsertBezierOpenPoint
Definition QComponent.h:938
std::vector< MyCoord > mCoordArray
Definition QComponent.h:950
Interpolation InterpMode
Definition QComponent.h:901
void buildHandlePointSet()
Definition QComponent.h:783
void updateFloatCoordArray(std::vector< MyCoord > CoordArray, std::vector< Coord0_1 > &myfloatCoord)
Definition QComponent.h:830
MyCoord mInitPosition
Definition QComponent.h:943
void reSort(std::vector< MyCoord > &vector1)
Definition QComponent.h:397
Dir setMode(int s)
Definition QComponent.h:272
void initializeLine(Dir mode)
Definition QComponent.h:373
void buildCoordToResortMap()
Definition QComponent.h:693
void changeLabelSize()
Definition QComponent.h:303
std::map< int, int > mMapResortIDtoOriginalID
Definition QComponent.h:962
std::vector< Coord0_1 > mFloatCoord
Definition QComponent.h:953
std::vector< Coord0_1 > mHandleFloatCoord
Definition QComponent.h:954
MyCoord mPressCoord
Definition QComponent.h:946
std::vector< MyCoord > mReSortCoordArray
Definition QComponent.h:951
std::vector< MyCoord > mHandlePoints
Definition QComponent.h:952
MyCoord mInitHandlePos
Definition QComponent.h:945
void setLabelSize(int minX, int minY, int maxX, int maxY)
Definition QComponent.h:391
QPainterPath mPath
Definition QComponent.h:965
void insertElementToHandlePointSet(int i)
Definition QComponent.h:736
std::vector< int > mMultiSelectID
Definition QComponent.h:956
MyCoord mDtPosition
Definition QComponent.h:944
void copyFromField(std::vector< Canvas::Coord2D > coord01, std::vector< MyCoord > &thisArray)
Definition QComponent.h:348
void buildBezierPoint()
Definition QComponent.h:561
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