Sketcher: Tracking of constraint visibility via contraint widget filter

=======================================================================

Add new option so that the 3D view constraint visibility track the constraint widget filter selection.

It maintains internally two mutually exclusive virtual spaces and the ability to select one as visible (the other remaining hiden).
This commit is contained in:
Abdullah Tahiri
2021-09-20 19:46:49 +02:00
parent 113b78c1d8
commit 0facbfc140
3 changed files with 261 additions and 73 deletions

View File

@@ -743,7 +743,13 @@ void TaskSketcherConstrains::onSelectionChanged(const Gui::SelectionChanges& msg
void TaskSketcherConstrains::on_comboBoxFilter_currentIndexChanged(int)
{
slotConstraintsChanged();
// enforce constraint visibility
bool visibilityTracksFilter = ui->visualisationTrackingFilter->isChecked();
if(visibilityTracksFilter)
change3DViewVisibilityToTrackFilter(); // it will call slotConstraintChanged via update mechanism
else
slotConstraintsChanged();
}
void TaskSketcherConstrains::on_filterInternalAlignment_stateChanged(int state)
@@ -872,54 +878,85 @@ void TaskSketcherConstrains::on_listWidgetConstraints_itemChanged(QListWidgetIte
inEditMode = false;
}
void TaskSketcherConstrains::slotConstraintsChanged(void)
void TaskSketcherConstrains::change3DViewVisibilityToTrackFilter()
{
assert(sketchView);
// Build up ListView with the constraints
const Sketcher::SketchObject * sketch = sketchView->getSketchObject();
const std::vector< Sketcher::Constraint * > &vals = sketch->Constraints.getValues();
/* Update constraint number and virtual space check status */
for (int i = 0; i < ui->listWidgetConstraints->count(); ++i) {
ConstraintItem * it = dynamic_cast<ConstraintItem*>(ui->listWidgetConstraints->item(i));
bool doCommit = false;
assert(it != 0);
Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Update constraint's virtual space"));
it->ConstraintNbr = i;
it->value = QVariant();
}
/* Remove entries, if any */
for (std::size_t i = ui->listWidgetConstraints->count(); i > vals.size(); --i)
delete ui->listWidgetConstraints->takeItem(i - 1);
/* Add new entries, if any */
for (std::size_t i = ui->listWidgetConstraints->count(); i < vals.size(); ++i)
ui->listWidgetConstraints->addItem(new ConstraintItem(sketch, sketchView, i));
/* Update the states */
ui->listWidgetConstraints->blockSignals(true);
for (int i = 0; i < ui->listWidgetConstraints->count(); ++i) {
ConstraintItem * it = static_cast<ConstraintItem*>(ui->listWidgetConstraints->item(i));
it->updateVirtualSpaceStatus();
}
ui->listWidgetConstraints->blockSignals(false);
/* Update filtering */
int Filter = ui->comboBoxFilter->currentIndex();
for(std::size_t i = 0; i < vals.size(); ++i) {
const Sketcher::Constraint * constraint = vals[i];
ConstraintItem * it = static_cast<ConstraintItem*>(ui->listWidgetConstraints->item(i));
bool visible = true;
bool showAll = (Filter == FilterValue::All);
bool showGeometric = (Filter == FilterValue::Geometric);
bool showDatums = (Filter == FilterValue::Datums);
bool showNamed = (Filter == FilterValue::Named && !(constraint->Name.empty()));
bool showNonDriving = (Filter == FilterValue::NonDriving && !constraint->isDriving);
bool hideInternalAlignment = this->ui->filterInternalAlignment->isChecked();
bool visible = !isConstraintFiltered(it);
switch(constraint->Type) {
// If the constraint is filteredout and it was previously shown in 3D view
if( !visible && it->isInVirtualSpace() == sketchView->getIsShownVirtualSpace()) {
try {
Gui::cmdAppObjectArgs(sketch, "setVirtualSpace(%d, %s)",
it->ConstraintNbr,
"True");
doCommit = true;
}
catch (const Base::Exception & e) {
Gui::Command::abortCommand();
QMessageBox::critical(Gui::MainWindow::getInstance(), tr("Error"),
QString::fromLatin1("Impossible to update visibility tracking"), QMessageBox::Ok, QMessageBox::Ok);
return;
}
}
else if( visible && it->isInVirtualSpace() != sketchView->getIsShownVirtualSpace() ) {
try {
Gui::cmdAppObjectArgs(sketch, "setVirtualSpace(%d, %s)",
it->ConstraintNbr,
"False");
doCommit = true;
}
catch (const Base::Exception & e) {
Gui::Command::abortCommand();
QMessageBox::critical(Gui::MainWindow::getInstance(), tr("Error"),
QString::fromLatin1("Impossible to update visibility tracking"), QMessageBox::Ok, QMessageBox::Ok);
return;
}
}
}
if(doCommit)
Gui::Command::commitCommand();
}
bool TaskSketcherConstrains::isConstraintFiltered(QListWidgetItem * item)
{
assert(sketchView);
const Sketcher::SketchObject * sketch = sketchView->getSketchObject();
const std::vector< Sketcher::Constraint * > &vals = sketch->Constraints.getValues();
ConstraintItem * it = static_cast<ConstraintItem*>(item);
const Sketcher::Constraint * constraint = vals[it->ConstraintNbr];
int Filter = ui->comboBoxFilter->currentIndex();
bool hideInternalAlignment = this->ui->filterInternalAlignment->isChecked();
bool visible = true;
bool showAll = (Filter == FilterValue::All);
bool showGeometric = (Filter == FilterValue::Geometric);
bool showDatums = (Filter == FilterValue::Datums);
bool showNamed = (Filter == FilterValue::Named && !(constraint->Name.empty()));
bool showNonDriving = (Filter == FilterValue::NonDriving && !constraint->isDriving);
switch(constraint->Type) {
case Sketcher::Horizontal:
visible = showAll || showGeometric || showNamed || (Filter == FilterValue::Horizontal);
break;
@@ -979,7 +1016,50 @@ void TaskSketcherConstrains::slotConstraintsChanged(void)
(!hideInternalAlignment || (Filter == FilterValue::InternalAlignment)));
default:
break;
}
}
return !visible;
}
void TaskSketcherConstrains::slotConstraintsChanged(void)
{
assert(sketchView);
// Build up ListView with the constraints
const Sketcher::SketchObject * sketch = sketchView->getSketchObject();
const std::vector< Sketcher::Constraint * > &vals = sketch->Constraints.getValues();
/* Update constraint number and virtual space check status */
for (int i = 0; i < ui->listWidgetConstraints->count(); ++i) {
ConstraintItem * it = dynamic_cast<ConstraintItem*>(ui->listWidgetConstraints->item(i));
assert(it != 0);
it->ConstraintNbr = i;
it->value = QVariant();
}
/* Remove entries, if any */
for (std::size_t i = ui->listWidgetConstraints->count(); i > vals.size(); --i)
delete ui->listWidgetConstraints->takeItem(i - 1);
/* Add new entries, if any */
for (std::size_t i = ui->listWidgetConstraints->count(); i < vals.size(); ++i)
ui->listWidgetConstraints->addItem(new ConstraintItem(sketch, sketchView, i));
/* Update the states */
ui->listWidgetConstraints->blockSignals(true);
for (int i = 0; i < ui->listWidgetConstraints->count(); ++i) {
ConstraintItem * it = static_cast<ConstraintItem*>(ui->listWidgetConstraints->item(i));
it->updateVirtualSpaceStatus();
}
ui->listWidgetConstraints->blockSignals(false);
/* Update filtering */
for(std::size_t i = 0; i < vals.size(); ++i) {
const Sketcher::Constraint * constraint = vals[i];
ConstraintItem * it = static_cast<ConstraintItem*>(ui->listWidgetConstraints->item(i));
bool visible = !isConstraintFiltered(it);
// block signals as there is no need to invoke the
// on_listWidgetConstraints_itemChanged() slot in
@@ -990,6 +1070,7 @@ void TaskSketcherConstrains::slotConstraintsChanged(void)
it->setHidden(!visible);
it->setData(Qt::EditRole, Base::Tools::fromStdString(constraint->Name));
model->blockSignals(block);
}
}

View File

@@ -107,6 +107,8 @@ public:
private:
void slotConstraintsChanged(void);
bool isConstraintFiltered(QListWidgetItem * item);
void change3DViewVisibilityToTrackFilter();
public Q_SLOTS:
void on_comboBoxFilter_currentIndexChanged(int);

View File

@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>212</width>
<height>288</height>
<width>234</width>
<height>388</height>
</rect>
</property>
<property name="sizePolicy">
@@ -19,7 +19,7 @@
<property name="maximumSize">
<size>
<width>16777215</width>
<height>288</height>
<height>388</height>
</size>
</property>
<property name="windowTitle">
@@ -165,41 +165,146 @@
</layout>
</item>
<item>
<widget class="Gui::PrefCheckBox" name="filterInternalAlignment">
<widget class="QTabWidget" name="tabWidget">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>95</height>
</size>
</property>
<property name="toolTip">
<string>Internal alignments will be hidden</string>
<string/>
</property>
<property name="text">
<string>Hide internal alignment</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
<property name="prefEntry" stdset="0">
<cstring>HideInternalAlignment</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/Sketcher</cstring>
</property>
</widget>
</item>
<item>
<widget class="Gui::PrefCheckBox" name="extendedInformation">
<property name="toolTip">
<string>Extended information will be added to the list</string>
</property>
<property name="text">
<string>Extended information</string>
</property>
<property name="checked">
<bool>false</bool>
</property>
<property name="prefEntry" stdset="0">
<cstring>ExtendedConstraintInformation</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/Sketcher</cstring>
<property name="currentIndex">
<number>1</number>
</property>
<widget class="QWidget" name="controlTab">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="toolTip">
<string>Controls widget list behaviour</string>
</property>
<attribute name="title">
<string>List control</string>
</attribute>
<widget class="Gui::PrefCheckBox" name="extendedInformation">
<property name="geometry">
<rect>
<x>0</x>
<y>30</y>
<width>189</width>
<height>36</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Extended information will be added to the list</string>
</property>
<property name="text">
<string>Extended information</string>
</property>
<property name="checked">
<bool>false</bool>
</property>
<property name="prefEntry" stdset="0">
<cstring>ExtendedConstraintInformation</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/Sketcher</cstring>
</property>
</widget>
<widget class="Gui::PrefCheckBox" name="filterInternalAlignment">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>189</width>
<height>36</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Internal alignments will be hidden</string>
</property>
<property name="text">
<string>Hide internal alignment</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
<property name="prefEntry" stdset="0">
<cstring>HideInternalAlignment</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/Sketcher</cstring>
</property>
</widget>
</widget>
<widget class="QWidget" name="visualisationTab">
<property name="toolTip">
<string>Controls visualisation in the 3D view</string>
</property>
<attribute name="title">
<string>Visualisation</string>
</attribute>
<widget class="Gui::PrefCheckBox" name="visualisationTrackingFilter">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>189</width>
<height>36</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Constraint visualisation tracks filter selection so that filtered out constraints are hidden</string>
</property>
<property name="text">
<string>Track filter selection</string>
</property>
<property name="checked">
<bool>false</bool>
</property>
<property name="prefEntry" stdset="0">
<cstring>VisualisationTrackingFilter</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/Sketcher</cstring>
</property>
</widget>
</widget>
</widget>
</item>
<item>