#include #include "lc_dlgsplinepoints.h" #include "lc_splinepoints.h" #include "rs_graphic.h" #include "rs_math.h" #include "ui_lc_dlgsplinepoints.h" LC_DlgSplinePoints::LC_DlgSplinePoints(QWidget* parent, bool modal, Qt::WindowFlags fl) : QDialog(parent, fl) , ui(new Ui::DlgSplinePoints{}) { setModal(modal); ui->setupUi(this); connect(ui->rbSplinePoints, SIGNAL(toggled(bool)), this, SLOT(updatePoints()) ); } LC_DlgSplinePoints::~LC_DlgSplinePoints() = default; void LC_DlgSplinePoints::languageChange() { ui->retranslateUi(this); } void LC_DlgSplinePoints::setSpline(LC_SplinePoints& b) { bezier = &b; //pen = spline->getPen(); ui->wPen->setPen(b.getPen(false), true, false, "Pen"); RS_Graphic* graphic = b.getGraphic(); if (graphic) { ui->cbLayer->init(*(graphic->getLayerList()), false, false); } RS_Layer* lay = b.getLayer(false); if (lay) { ui->cbLayer->setLayer(*lay); } ui->cbClosed->setChecked(b.isClosed()); //number of control points auto const& bData = b.getData(); auto const n = bData.splinePoints.size(); if (n <= 2) { ui->rbControlPoints->setChecked(true); ui->rbSplinePoints->setEnabled(false); } else ui->rbSplinePoints->setChecked(true); updatePoints(); } void LC_DlgSplinePoints::updatePoints() { bool const useSpline = ui->rbSplinePoints->isChecked(); auto const& bData = bezier->getData(); auto const& pts = useSpline?bData.splinePoints:bData.controlPoints; auto model = new QStandardItemModel(pts.size(), 2, this); model->setHorizontalHeaderLabels({"x", "y"}); //set spline data for (size_t row = 0; row < pts.size(); ++row) { auto const& vp = pts.at(row); QStandardItem* x = new QStandardItem(QString::number(vp.x)); model->setItem(row, 0, x); QStandardItem* y = new QStandardItem(QString::number(vp.y)); model->setItem(row, 1, y); } ui->tvPoints->setModel(model); } void LC_DlgSplinePoints::updateSpline() { if (!bezier) return; //update closed bezier->setClosed(ui->cbClosed->isChecked()); //update pen bezier->setPen(ui->wPen->getPen()); //update layer bezier->setLayer(ui->cbLayer->currentText()); //update Spline Points auto model = static_cast(ui->tvPoints->model()); size_t const n = model->rowCount(); auto& d = bezier->getData(); //update points bool const useSpline = ui->rbSplinePoints->isChecked(); auto& vps = useSpline?d.splinePoints:d.controlPoints; size_t const n0 = vps.size(); //update points for (size_t i = 0; i < n; ++i) { auto& vp = vps.at(iitem(i, 0)->text(); vp.x = RS_Math::eval(vpx, vp.x); auto const& vpy = model->item(i, 1)->text(); vp.y = RS_Math::eval(vpy, vp.y); } bezier->update(); }