| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| |
|
| |
|
| | #include <QAction>
|
| | #include <QListWidget>
|
| | #include <QMessageBox>
|
| |
|
| |
|
| | #include <Base/Interpreter.h>
|
| | #include <Base/Converter.h>
|
| | #include <App/Document.h>
|
| | #include <App/DocumentObject.h>
|
| | #include <Gui/Selection/Selection.h>
|
| | #include <Gui/ViewProvider.h>
|
| | #include <Mod/PartDesign/App/FeatureFillet.h>
|
| | #include <Mod/Part/App/Attacher.h>
|
| | #include <Mod/Part/App/Geometry.h>
|
| | #include <Mod/Part/App/Tools.h>
|
| | #include <Mod/Part/App/GizmoHelper.h>
|
| |
|
| | #include "ui_TaskFilletParameters.h"
|
| | #include "TaskFilletParameters.h"
|
| |
|
| |
|
| | using namespace PartDesignGui;
|
| | using namespace Gui;
|
| |
|
| |
|
| |
|
| | TaskFilletParameters::TaskFilletParameters(ViewProviderDressUp* DressUpView, QWidget* parent)
|
| | : TaskDressUpParameters(DressUpView, true, true, parent)
|
| | , ui(new Ui_TaskFilletParameters)
|
| | {
|
| |
|
| | proxy = new QWidget(this);
|
| | ui->setupUi(proxy);
|
| | this->groupLayout()->addWidget(proxy);
|
| |
|
| | PartDesign::Fillet* pcFillet = DressUpView->getObject<PartDesign::Fillet>();
|
| | bool useAllEdges = pcFillet->UseAllEdges.getValue();
|
| | ui->checkBoxUseAllEdges->setChecked(useAllEdges);
|
| | ui->buttonRefSel->setEnabled(!useAllEdges);
|
| | ui->listWidgetReferences->setEnabled(!useAllEdges);
|
| | double r = pcFillet->Radius.getValue();
|
| |
|
| | ui->filletRadius->setUnit(Base::Unit::Length);
|
| | ui->filletRadius->setValue(r);
|
| | ui->filletRadius->setMinimum(0);
|
| | ui->filletRadius->selectNumber();
|
| | ui->filletRadius->bind(pcFillet->Radius);
|
| | QMetaObject::invokeMethod(ui->filletRadius, "setFocus", Qt::QueuedConnection);
|
| | std::vector<std::string> strings = pcFillet->Base.getSubValues();
|
| | for (const auto& string : strings) {
|
| | ui->listWidgetReferences->addItem(QString::fromStdString(string));
|
| | }
|
| |
|
| | QMetaObject::connectSlotsByName(this);
|
| |
|
| |
|
| | connect(ui->filletRadius, qOverload<double>(&Gui::QuantitySpinBox::valueChanged),
|
| | this, &TaskFilletParameters::onLengthChanged);
|
| | connect(ui->buttonRefSel, &QToolButton::toggled,
|
| | this, &TaskFilletParameters::onButtonRefSel);
|
| | connect(ui->checkBoxUseAllEdges, &QToolButton::toggled,
|
| | this, &TaskFilletParameters::onCheckBoxUseAllEdgesToggled);
|
| |
|
| |
|
| | createDeleteAction(ui->listWidgetReferences);
|
| | connect(deleteAction, &QAction::triggered, this, &TaskFilletParameters::onRefDeleted);
|
| |
|
| | createAddAllEdgesAction(ui->listWidgetReferences);
|
| | connect(addAllEdgesAction, &QAction::triggered, this, &TaskFilletParameters::onAddAllEdges);
|
| |
|
| | connect(ui->listWidgetReferences, &QListWidget::currentItemChanged,
|
| | this, &TaskFilletParameters::setSelection);
|
| | connect(ui->listWidgetReferences, &QListWidget::itemClicked,
|
| | this, &TaskFilletParameters::setSelection);
|
| | connect(ui->listWidgetReferences, &QListWidget::itemDoubleClicked,
|
| | this, &TaskFilletParameters::doubleClicked);
|
| |
|
| |
|
| | if (strings.empty()) {
|
| | setSelectionMode(refSel);
|
| | }
|
| | else {
|
| | hideOnError();
|
| | }
|
| |
|
| | setupGizmos(DressUpView);
|
| | }
|
| |
|
| | void TaskFilletParameters::onSelectionChanged(const Gui::SelectionChanges& msg)
|
| | {
|
| |
|
| |
|
| |
|
| | if (msg.Type == Gui::SelectionChanges::AddSelection) {
|
| | if (selectionMode == refSel) {
|
| | referenceSelected(msg, ui->listWidgetReferences);
|
| | }
|
| | }
|
| | else if (msg.Type == Gui::SelectionChanges::ClrSelection) {
|
| |
|
| |
|
| | setGizmoPositions();
|
| | }
|
| | }
|
| |
|
| | void TaskFilletParameters::onCheckBoxUseAllEdgesToggled(bool checked)
|
| | {
|
| | if (auto fillet = getObject<PartDesign::Fillet>()) {
|
| | if (checked) {
|
| | setSelectionMode(none);
|
| | }
|
| |
|
| | ui->buttonRefSel->setEnabled(!checked);
|
| | ui->listWidgetReferences->setEnabled(!checked);
|
| | fillet->UseAllEdges.setValue(checked);
|
| | fillet->recomputeFeature();
|
| | }
|
| | }
|
| |
|
| | void TaskFilletParameters::setButtons(const selectionModes mode)
|
| | {
|
| | ui->buttonRefSel->setChecked(mode == refSel);
|
| | ui->buttonRefSel->setText(mode == refSel ? stopSelectionLabel() : startSelectionLabel());
|
| | }
|
| |
|
| | void TaskFilletParameters::onRefDeleted()
|
| | {
|
| | TaskDressUpParameters::deleteRef(ui->listWidgetReferences);
|
| | setGizmoPositions();
|
| | }
|
| |
|
| | void TaskFilletParameters::onAddAllEdges()
|
| | {
|
| | TaskDressUpParameters::addAllEdges(ui->listWidgetReferences);
|
| | }
|
| |
|
| | void TaskFilletParameters::onLengthChanged(double len)
|
| | {
|
| | if (auto fillet = getObject<PartDesign::Fillet>()) {
|
| | setSelectionMode(none);
|
| | setupTransaction();
|
| | fillet->Radius.setValue(len);
|
| | fillet->recomputeFeature();
|
| |
|
| | hideOnError();
|
| | }
|
| | }
|
| |
|
| | double TaskFilletParameters::getLength() const
|
| | {
|
| | return ui->filletRadius->value().getValue();
|
| | }
|
| |
|
| | TaskFilletParameters::~TaskFilletParameters()
|
| | {
|
| | try {
|
| | Gui::Selection().clearSelection();
|
| | Gui::Selection().rmvSelectionGate();
|
| | }
|
| | catch (const Py::Exception&) {
|
| | Base::PyException e;
|
| | e.reportException();
|
| | }
|
| | }
|
| |
|
| | void TaskFilletParameters::changeEvent(QEvent* e)
|
| | {
|
| | TaskBox::changeEvent(e);
|
| | if (e->type() == QEvent::LanguageChange) {
|
| | ui->retranslateUi(proxy);
|
| | }
|
| | }
|
| |
|
| | void TaskFilletParameters::apply()
|
| | {
|
| | ui->filletRadius->apply();
|
| |
|
| |
|
| | if (ui->listWidgetReferences->count() == 0) {
|
| | std::string text = tr("Empty fillet created!").toStdString();
|
| | Base::Console().warning("%s\n", text.c_str());
|
| | }
|
| | }
|
| |
|
| | void TaskFilletParameters::setupGizmos(ViewProviderDressUp* vp)
|
| | {
|
| | if (!GizmoContainer::isEnabled()) {
|
| | return;
|
| | }
|
| |
|
| | radiusGizmo = new Gui::LinearGizmo(ui->filletRadius);
|
| | radiusGizmo2 = new Gui::LinearGizmo(ui->filletRadius);
|
| |
|
| | gizmoContainer = GizmoContainer::create({radiusGizmo, radiusGizmo2}, vp);
|
| |
|
| | setGizmoPositions();
|
| | }
|
| |
|
| | void TaskFilletParameters::setGizmoPositions()
|
| | {
|
| | if (!gizmoContainer) {
|
| | return;
|
| | }
|
| |
|
| | auto fillet = getObject<PartDesign::Fillet>();
|
| | if (!fillet || fillet->isError()) {
|
| | gizmoContainer->visible = false;
|
| | return;
|
| | }
|
| | Part::TopoShape baseShape = fillet->getBaseTopoShape(true);
|
| | std::vector<Part::TopoShape> shapes = fillet->getContinuousEdges(baseShape);
|
| |
|
| | if (shapes.size() == 0) {
|
| | gizmoContainer->visible = false;
|
| | return;
|
| | }
|
| | gizmoContainer->visible = true;
|
| |
|
| |
|
| | Part::TopoShape edge = shapes[0];
|
| | auto [face1, face2] = getAdjacentFacesFromEdge(edge, baseShape);
|
| |
|
| | DraggerPlacementProps props1 = getDraggerPlacementFromEdgeAndFace(edge, face1);
|
| | radiusGizmo->Gizmo::setDraggerPlacement(props1.position, props1.dir);
|
| |
|
| | DraggerPlacementProps props2 = getDraggerPlacementFromEdgeAndFace(edge, face2);
|
| | radiusGizmo2->Gizmo::setDraggerPlacement(props2.position, props2.dir);
|
| |
|
| |
|
| |
|
| | double angle = props1.dir.GetAngle(props2.dir);
|
| | double correction = 1 / std::tan(angle / 2);
|
| |
|
| | radiusGizmo->setMultFactor(correction);
|
| | radiusGizmo2->setMultFactor(correction);
|
| | }
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| | TaskDlgFilletParameters::TaskDlgFilletParameters(ViewProviderFillet* DressUpView)
|
| | : TaskDlgDressUpParameters(DressUpView)
|
| | {
|
| | parameter = new TaskFilletParameters(DressUpView);
|
| |
|
| | Content.push_back(parameter);
|
| | Content.push_back(preview);
|
| | }
|
| |
|
| | TaskDlgFilletParameters::~TaskDlgFilletParameters() = default;
|
| |
|
| |
|
| |
|
| | bool TaskDlgFilletParameters::accept()
|
| | {
|
| | auto obj = getObject();
|
| | if (!obj->isError()) {
|
| | getViewObject()->showPreviousFeature(false);
|
| | }
|
| |
|
| | parameter->apply();
|
| |
|
| | return TaskDlgDressUpParameters::accept();
|
| | }
|
| |
|
| | #include "moc_TaskFilletParameters.cpp"
|
| |
|