Gui: Add Dragger placement preview in Transform dialog
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user