Gui: Add Dragger placement preview in Transform dialog

This commit is contained in:
Kacper Donat
2024-12-08 17:44:22 +01:00
parent fab235682d
commit 25cf119c60
4 changed files with 57 additions and 16 deletions

View File

@@ -1044,7 +1044,7 @@ SoFCCSysDragger::SoFCCSysDragger()
SO_KIT_ADD_CATALOG_ENTRY(annotation, So3DAnnotation, TRUE, geomSeparator, "", TRUE);
SO_KIT_ADD_CATALOG_ENTRY(scaleNode, SoScale, TRUE, annotation, "", TRUE);
SO_KIT_ADD_CATALOG_ENTRY(pickStyle, SoPickStyle, TRUE, annotation, "", TRUE);
// Translator
SO_KIT_ADD_CATALOG_ENTRY(xTranslatorSwitch, SoSwitch, TRUE, annotation, "", TRUE);
@@ -1309,6 +1309,9 @@ SoFCCSysDragger::SoFCCSysDragger()
localScaleNode->scaleFactor.connectFrom(&scaleEngine->vector);
autoScaleResult.connectFrom(&draggerSize);
SoPickStyle* localPickStyle = SO_GET_ANY_PART(this, "pickStyle", SoPickStyle);
localPickStyle->style = SoPickStyle::SHAPE_ON_TOP;
addValueChangedCallback(&SoFCCSysDragger::valueChangedCB);
translationSensor.setFunction(&SoFCCSysDragger::translationSensorCB);

View File

@@ -217,6 +217,7 @@ class GuiExport SoFCCSysDragger : public SoDragger
SO_KIT_HEADER(SoFCCSysDragger);
SO_KIT_CATALOG_ENTRY_HEADER(annotation);
SO_KIT_CATALOG_ENTRY_HEADER(scaleNode);
SO_KIT_CATALOG_ENTRY_HEADER(pickStyle);
// Translator
SO_KIT_CATALOG_ENTRY_HEADER(xTranslatorSwitch);
SO_KIT_CATALOG_ENTRY_HEADER(yTranslatorSwitch);

View File

@@ -115,6 +115,8 @@ TaskTransform::~TaskTransform()
Gui::Application::Instance->commandManager()
.getCommandByName("Std_PerspectiveCamera")
->setEnabled(true);
savePreferences();
}
void TaskTransform::dragStartCallback(void*, SoDragger*)
@@ -244,12 +246,29 @@ void TaskTransform::setupGui()
ui->transformOriginLayout,
ui->referencePickerLayout});
loadPreferences();
updateInputLabels();
updateDraggerLabels();
updateIncrements();
updatePositionAndRotationUi();
}
void TaskTransform::loadPreferences()
{
double lastTranslationIncrement = hGrp->GetFloat("LastTranslationIncrement", 1.0);
double lastRotationIncrement = hGrp->GetFloat("LastRotationIncrement", 5.0);
ui->translationIncrementSpinBox->setValue(lastTranslationIncrement);
ui->rotationIncrementSpinBox->setValue(lastRotationIncrement);
}
void TaskTransform::savePreferences()
{
hGrp->SetFloat("LastTranslationIncrement", ui->translationIncrementSpinBox->rawValue());
hGrp->SetFloat("LastRotationIncrement", ui->rotationIncrementSpinBox->rawValue());
}
void TaskTransform::updatePositionAndRotationUi() const
{
@@ -338,22 +357,30 @@ void TaskTransform::setSelectionMode(SelectionMode mode)
{
Gui::Selection().clearSelection();
SoPickStyle* draggerPickStyle = SO_GET_PART(dragger, "pickStyle", SoPickStyle);
ui->pickTransformOriginButton->setText(tr("Pick reference"));
ui->alignToOtherObjectButton->setText(tr("Move to other object"));
switch (mode) {
case SelectionMode::SelectTransformOrigin:
draggerPickStyle->style = SoPickStyle::UNPICKABLE;
draggerPickStyle->setOverride(true);
blockSelection(false);
ui->referenceLineEdit->setText(tr("Select face, edge or vertex..."));
ui->pickTransformOriginButton->setText(tr("Cancel"));
break;
case SelectionMode::SelectAlignTarget:
draggerPickStyle->style = SoPickStyle::UNPICKABLE;
draggerPickStyle->setOverride(true);
ui->alignToOtherObjectButton->setText(tr("Cancel"));
blockSelection(false);
break;
case SelectionMode::None:
draggerPickStyle->style = SoPickStyle::SHAPE_ON_TOP;
draggerPickStyle->setOverride(false);
blockSelection(true);
break;
}
@@ -390,7 +417,10 @@ TaskTransform::CoordinateSystem TaskTransform::currentCoordinateSystem() const
void TaskTransform::onSelectionChanged(const SelectionChanges& msg)
{
if (msg.Type != SelectionChanges::AddSelection) {
const auto isSupportedMessage =
msg.Type == SelectionChanges::AddSelection || msg.Type == SelectionChanges::SetPreselect;
if (!isSupportedMessage) {
return;
}
@@ -416,18 +446,21 @@ void TaskTransform::onSelectionChanged(const SelectionChanges& msg)
auto selectedObjectPlacement = rootPlacement.inverse() * globalPlacement * attachedPlacement;
switch (selectionMode) {
case SelectionMode::SelectTransformOrigin: {auto label = QStringLiteral("%1#%2.%3")
auto label = QStringLiteral("%1#%2.%3")
.arg(QLatin1String(msg.pOriginalMsg->pObjectName),
QLatin1String(msg.pObjectName),
QLatin1String(msg.pSubName));
ui->referenceLineEdit->setText(label);
customTransformOrigin = selectedObjectPlacement;
updateTransformOrigin();
switch (selectionMode) {
case SelectionMode::SelectTransformOrigin: {
if (msg.Type == SelectionChanges::AddSelection) {
ui->referenceLineEdit->setText(label);
customTransformOrigin = selectedObjectPlacement;
updateTransformOrigin();
setSelectionMode(SelectionMode::None);
} else {
vp->setTransformOrigin(selectedObjectPlacement);
}
break;
}
@@ -435,8 +468,12 @@ void TaskTransform::onSelectionChanged(const SelectionChanges& msg)
case SelectionMode::SelectAlignTarget: {
vp->setDraggerPlacement(vp->getObjectPlacement() * selectedObjectPlacement);
vp->updateTransformFromDragger();
vp->updatePlacementFromDragger();
if (msg.Type == SelectionChanges::AddSelection) {
vp->updateTransformFromDragger();
vp->updatePlacementFromDragger();
setSelectionMode(SelectionMode::None);
}
break;
}
@@ -445,9 +482,6 @@ void TaskTransform::onSelectionChanged(const SelectionChanges& msg)
// no-op
break;
}
setSelectionMode(SelectionMode::None);
}
void TaskTransform::onAlignRotationChanged()
@@ -508,7 +542,8 @@ void TaskTransform::updateTransformOrigin()
ui->referencePickerWidget->setVisible(placementMode == PlacementMode::Custom);
if (placementMode == PlacementMode::Custom && !customTransformOrigin.has_value()) {
onPickTransformOrigin();
setSelectionMode(SelectionMode::SelectTransformOrigin);
return;
}
auto transformOrigin = getTransformOrigin(placementMode);

View File

@@ -134,6 +134,8 @@ private:
std::optional<Base::Placement> customTransformOrigin {};
Base::Placement originalPlacement {};
ParameterGrp::handle hGrp = App::GetApplication().GetParameterGroupByPath("User parameter:BaseApp/History/Dragger");
};
class TaskCSysDragger: public Gui::TaskView::TaskDialog