Sketcher: Constraint widget Multi Filter feature

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

This feature adds a new filter entry "Multiple Filters" in the combobox of the filter.

This enables to define a "Multiple Filter" based on the aggregation of individual filters. So it basically provides for a user defined filter based on constraint types.

This "Multiple Filter" defaults to "All Constraints", and can be defined using the button "..." next to the filter combobox.

The "Multiple Filter" works on the list of constraints, as any other filter, limiting the elements shown in the list to match the multi filter definition.

The "Multiple Filter" interacts with the visibility options as any other filter. This is, in visibility non-tracking mode, it does not change the visibility. The Buttons "Hide Listed" and
"Show Listed" can be operated in this mode as any other filter.

In visibility tracking-mode, it will adapt the visibility of the constraints in the 3D view to the "Multi Filter" definition (exactly as it would to any other filter with its own definition).
This commit is contained in:
Abdullah Tahiri
2021-10-02 17:43:05 +02:00
parent 14ff475192
commit 2f789e6ce7
8 changed files with 691 additions and 54 deletions

View File

@@ -46,6 +46,7 @@ set(SketcherGui_UIC_SRCS
SketcherSettingsDisplay.ui
SketchRectangularArrayDialog.ui
SketcherRegularPolygonDialog.ui
ConstraintMultiFilterDialog.ui
)
if(BUILD_QT5)
@@ -78,6 +79,7 @@ SET(SketcherGui_SRCS
PropertyConstraintListItem.cpp
TaskSketcherConstrains.ui
TaskSketcherConstrains.cpp
ConstraintFilters.h
TaskSketcherConstrains.h
TaskSketcherElements.ui
TaskSketcherElements.cpp
@@ -116,6 +118,8 @@ SET(SketcherGui_SRCS
SketchRectangularArrayDialog.cpp
SketcherRegularPolygonDialog.h
SketcherRegularPolygonDialog.cpp
ConstraintMultiFilterDialog.h
ConstraintMultiFilterDialog.cpp
TaskDlgEditSketch.cpp
TaskDlgEditSketch.h
ViewProviderPython.cpp

View File

@@ -0,0 +1,104 @@
/***************************************************************************
* Copyright (c) 2021 Abdullah Tahiri <abdullah.tahiri.yo@gmail.com> *
* *
* This file is part of the FreeCAD CAx development system. *
* *
* This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Library General Public *
* License as published by the Free Software Foundation; either *
* version 2 of the License, or (at your option) any later version. *
* *
* This library is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU Library General Public License for more details. *
* *
* You should have received a copy of the GNU Library General Public *
* License along with this library; see the file COPYING.LIB. If not, *
* write to the Free Software Foundation, Inc., 59 Temple Place, *
* Suite 330, Boston, MA 02111-1307, USA *
* *
***************************************************************************/
#ifndef SKETCHERGUI_ConstraintFilters_H
#define SKETCHERGUI_ConstraintFilters_H
#include <array>
#include <bitset>
namespace SketcherGui {
namespace ConstraintFilter {
enum FilterValue {
All = 0,
Geometric = 1,
Datums = 2,
Named = 3,
NonDriving = 4,
Horizontal = 5,
Vertical = 6,
Coincident = 7,
PointOnObject = 8,
Parallel = 9,
Perpendicular = 10,
Tangent = 11,
Equality = 12,
Symmetric = 13,
Block = 14,
Distance = 15,
HorizontalDistance = 16,
VerticalDistance = 17,
Radius = 18,
Weight = 19,
Diameter = 20,
Angle = 21,
SnellsLaw = 22,
InternalAlignment = 23,
NumFilterValue
};
enum SpecialFilterValue {
Multiple = 24,
NumSpecialFilterValue
};
constexpr std::array< std::bitset<FilterValue::NumFilterValue>, FilterValue::NumFilterValue> filterAggregates {
1 << FilterValue::All | 1 << FilterValue::Geometric | 1 << FilterValue::Datums | 1 << FilterValue::Named | 1 << FilterValue::NonDriving |
1 << FilterValue::Horizontal | 1 << FilterValue::Vertical | 1 << FilterValue::Coincident | 1 << FilterValue::PointOnObject |
1 << FilterValue::Parallel | 1 << FilterValue::Perpendicular | 1 << FilterValue::Tangent | 1 << FilterValue::Equality |
1 << FilterValue::Symmetric | 1 << FilterValue::Block | 1 << FilterValue::Distance | 1 << FilterValue::HorizontalDistance |
1 << FilterValue::VerticalDistance | 1 << FilterValue::Radius | 1 << FilterValue::Weight | 1 << FilterValue::Diameter |
1 << FilterValue::Angle | 1 << FilterValue::SnellsLaw | 1 << FilterValue::InternalAlignment, // All = All other groups are covered (0)
1 << FilterValue::Geometric | 1 << FilterValue::Horizontal | 1 << FilterValue::Vertical | 1 << FilterValue::Coincident |
1 << FilterValue::PointOnObject | 1 << FilterValue::Parallel | 1 << FilterValue::Perpendicular | 1 << FilterValue::Tangent |
1 << FilterValue::Equality | 1 << FilterValue::Symmetric | 1 << FilterValue::Block | 1 << FilterValue::InternalAlignment, // Geometric = All others not being datums (1)
1 << FilterValue::Datums | 1 << FilterValue::NonDriving | 1 << FilterValue::Distance | 1 << FilterValue::HorizontalDistance | 1 << FilterValue::VerticalDistance | 1 << FilterValue::Radius | 1 << FilterValue::Weight | 1 << FilterValue::Diameter | 1 << FilterValue::Angle | 1 << FilterValue::SnellsLaw, // Datum = all others not being geometric (2)
1 << FilterValue::Named, // Named = Just this (3)
1 << FilterValue::NonDriving, // NonDriving = Just this (4)
1 << FilterValue::Horizontal, // Horizontal = Just this (5)
1 << FilterValue::Vertical, // Vertical = Just this (6)
1 << FilterValue::Coincident, // Coincident = Just this (7)
1 << FilterValue::PointOnObject, // PointOnObject = Just this (8)
1 << FilterValue::Parallel, // Parallel = Just this (9)
1 << FilterValue::Perpendicular, // Perpendicular = Just this (10)
1 << FilterValue::Tangent, // Tangent = Just this (11)
1 << FilterValue::Equality, // Equality = Just this (12)
1 << FilterValue::Symmetric, // Symmetric = Just this (13)
1 << FilterValue::Block, // Block = Just this (14)
1 << FilterValue::Distance, // Distance = Just this (15)
1 << FilterValue::HorizontalDistance, // HorizontalDistance = Just this (16)
1 << FilterValue::VerticalDistance, // VerticalDistance = Just this (17)
1 << FilterValue::Radius, // Radius = Just this (18)
1 << FilterValue::Weight, // Weight = Just this (19)
1 << FilterValue::Diameter, // Diameter = Just this (20)
1 << FilterValue::Angle, // Angle = Just this (21)
1 << FilterValue::SnellsLaw, // SnellsLaw = Just this (22)
1 << FilterValue::InternalAlignment, // InternalAlignment = Just this (23)
};
}
}
#endif // SKETCHERGUI_ConstraintFilters_H

View File

@@ -0,0 +1,127 @@
/***************************************************************************
* Copyright (c) 2021 Abdullah Tahiri <abdullah.tahiri.yo@gmail.com> *
* *
* This file is part of the FreeCAD CAx development system. *
* *
* This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Library General Public *
* License as published by the Free Software Foundation; either *
* version 2 of the License, or (at your option) any later version. *
* *
* This library is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU Library General Public License for more details. *
* *
* You should have received a copy of the GNU Library General Public *
* License along with this library; see the file COPYING.LIB. If not, *
* write to the Free Software Foundation, Inc., 59 Temple Place, *
* Suite 330, Boston, MA 02111-1307, USA *
* *
***************************************************************************/
#include "PreCompiled.h"
#ifndef _PreComp_
# include <QPixmap>
# include <QDialog>
#endif
#include <Gui/BitmapFactory.h>
#include <Gui/MainWindow.h>
#include <Base/Tools.h>
#include <Base/UnitsApi.h>
#include "ui_ConstraintMultiFilterDialog.h"
#include "ConstraintMultiFilterDialog.h"
using namespace SketcherGui;
ConstraintMultiFilterDialog::ConstraintMultiFilterDialog(void)
: QDialog(Gui::getMainWindow()), ui(new Ui_ConstraintMultiFilterDialog)
{
ui->setupUi(this);
// make filter items checkable
ui->listMultiFilter->blockSignals(true);
for(int i = 0; i < ui->listMultiFilter->count(); i++) {
QListWidgetItem* item = ui->listMultiFilter->item(i);
item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
item->setCheckState(Qt::Unchecked);
}
ui->listMultiFilter->blockSignals(false);
QMetaObject::connectSlotsByName(this);
}
ConstraintMultiFilterDialog::~ConstraintMultiFilterDialog()
{
}
void ConstraintMultiFilterDialog::setMultiFilter(const std::bitset<FilterValue::NumFilterValue> & bitset)
{
ui->listMultiFilter->blockSignals(true);
for(int i = 0; i < ui->listMultiFilter->count(); i++) {
QListWidgetItem* item = ui->listMultiFilter->item(i);
if(bitset[i])
item->setCheckState(Qt::Checked);
else
item->setCheckState(Qt::Unchecked);
}
ui->listMultiFilter->blockSignals(false);
}
std::bitset<FilterValue::NumFilterValue> ConstraintMultiFilterDialog::getMultiFilter()
{
std::bitset<FilterValue::NumFilterValue> tmpBitset;
for(int i = 0; i < ui->listMultiFilter->count(); i++) {
QListWidgetItem* item = ui->listMultiFilter->item(i);
if(item->checkState() == Qt::Checked)
tmpBitset.set(i);
}
return tmpBitset;
}
void ConstraintMultiFilterDialog::on_listMultiFilter_itemChanged(QListWidgetItem * item)
{
int filterindex = ui->listMultiFilter->row(item);
auto aggregate = filterAggregates[filterindex];
ui->listMultiFilter->blockSignals(true);
if(item->checkState() == Qt::Checked) {
for(int i = 0; i < ui->listMultiFilter->count(); i++) {
if(aggregate[i])
ui->listMultiFilter->item(i)->setCheckState(Qt::Checked);
}
}
ui->listMultiFilter->blockSignals(false);
}
void ConstraintMultiFilterDialog::setCheckStateAll(Qt::CheckState state)
{
ui->listMultiFilter->blockSignals(true);
for(int i = 0; i < ui->listMultiFilter->count(); i++) {
ui->listMultiFilter->item(i)->setCheckState(state);
}
ui->listMultiFilter->blockSignals(false);
}
void ConstraintMultiFilterDialog::on_checkAllButton_clicked(bool)
{
setCheckStateAll(Qt::Checked);
}
void ConstraintMultiFilterDialog::on_uncheckAllButton_clicked(bool)
{
setCheckStateAll(Qt::Unchecked);
}
#include "moc_ConstraintMultiFilterDialog.cpp"

View File

@@ -0,0 +1,59 @@
/***************************************************************************
* Copyright (c) 2021 Abdullah Tahiri <abdullah.tahiri.yo@gmail.com> *
* *
* This file is part of the FreeCAD CAx development system. *
* *
* This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Library General Public *
* License as published by the Free Software Foundation; either *
* version 2 of the License, or (at your option) any later version. *
* *
* This library is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU Library General Public License for more details. *
* *
* You should have received a copy of the GNU Library General Public *
* License along with this library; see the file COPYING.LIB. If not, *
* write to the Free Software Foundation, Inc., 59 Temple Place, *
* Suite 330, Boston, MA 02111-1307, USA *
* *
***************************************************************************/
#ifndef SKETCHERGUI_ConstraintMultiFilter_H
#define SKETCHERGUI_ConstraintMultiFilter_H
#include <QDialog>
#include "ConstraintFilters.h"
namespace SketcherGui {
using namespace ConstraintFilter;
class Ui_ConstraintMultiFilterDialog;
class ConstraintMultiFilterDialog : public QDialog
{
Q_OBJECT
public:
ConstraintMultiFilterDialog(void);
~ConstraintMultiFilterDialog();
void setMultiFilter(const std::bitset<FilterValue::NumFilterValue> & bitset);
std::bitset<FilterValue::NumFilterValue> getMultiFilter();
public Q_SLOTS:
void on_listMultiFilter_itemChanged(QListWidgetItem * item);
void on_checkAllButton_clicked(bool);
void on_uncheckAllButton_clicked(bool);
protected:
void setCheckStateAll(Qt::CheckState);
private:
std::unique_ptr<Ui_ConstraintMultiFilterDialog> ui;
};
}
#endif // SKETCHERGUI_ConstraintMultiFilter_H

View File

@@ -0,0 +1,277 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>SketcherGui::ConstraintMultiFilterDialog</class>
<widget class="QWidget" name="SketcherGui::ConstraintMultiFilterDialog">
<property name="windowModality">
<enum>Qt::WindowModal</enum>
</property>
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>325</width>
<height>600</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>700</height>
</size>
</property>
<property name="windowTitle">
<string>Multiple filter selection</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Check the filters to aggregate:</string>
</property>
</widget>
</item>
<item>
<widget class="QListWidget" name="listMultiFilter">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>500</height>
</size>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::NoSelection</enum>
</property>
<property name="modelColumn">
<number>0</number>
</property>
<item>
<property name="text">
<string>All</string>
</property>
</item>
<item>
<property name="text">
<string>Geometric</string>
</property>
</item>
<item>
<property name="text">
<string>Datums</string>
</property>
</item>
<item>
<property name="text">
<string>Named</string>
</property>
</item>
<item>
<property name="text">
<string>Non-Driving</string>
</property>
</item>
<item>
<property name="text">
<string>Horizontal</string>
</property>
</item>
<item>
<property name="text">
<string>Vertical</string>
</property>
</item>
<item>
<property name="text">
<string>Coincident</string>
</property>
</item>
<item>
<property name="text">
<string>Point on Object</string>
</property>
</item>
<item>
<property name="text">
<string>Parallel</string>
</property>
</item>
<item>
<property name="text">
<string>Perpendicular</string>
</property>
</item>
<item>
<property name="text">
<string>Tangent</string>
</property>
</item>
<item>
<property name="text">
<string>Equality</string>
</property>
</item>
<item>
<property name="text">
<string>Symmetric</string>
</property>
</item>
<item>
<property name="text">
<string>Block</string>
</property>
</item>
<item>
<property name="text">
<string>Distance</string>
</property>
</item>
<item>
<property name="text">
<string>Horizontal Distance</string>
</property>
</item>
<item>
<property name="text">
<string>Vertical Distance</string>
</property>
</item>
<item>
<property name="text">
<string>Radius</string>
</property>
</item>
<item>
<property name="text">
<string>Weight</string>
</property>
</item>
<item>
<property name="text">
<string>Diameter</string>
</property>
</item>
<item>
<property name="text">
<string>Angle</string>
</property>
</item>
<item>
<property name="text">
<string>Snell's Law</string>
</property>
</item>
<item>
<property name="text">
<string>Internal Alignment</string>
</property>
</item>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="sizeConstraint">
<enum>QLayout::SetDefaultConstraint</enum>
</property>
<item>
<widget class="QPushButton" name="checkAllButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Shows all the constraints in the list</string>
</property>
<property name="text">
<string>Check All</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="uncheckAllButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Hides all the constraints in the list</string>
</property>
<property name="text">
<string>Uncheck All</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
<item alignment="Qt::AlignHCenter">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>SketcherGui::ConstraintMultiFilterDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>20</x>
<y>20</y>
</hint>
<hint type="destinationlabel">
<x>20</x>
<y>20</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>SketcherGui::ConstraintMultiFilterDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>20</x>
<y>20</y>
</hint>
<hint type="destinationlabel">
<x>20</x>
<y>20</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@@ -33,6 +33,7 @@
# include <QStyledItemDelegate>
# include <QPainter>
# include <QPixmapCache>
# include <QStringListModel>
# include <boost_bind_bind.hpp>
#endif
@@ -56,6 +57,8 @@
#include <Gui/MainWindow.h>
#include <Gui/PrefWidgets.h>
#include "ConstraintMultiFilterDialog.h"
using namespace SketcherGui;
using namespace Gui::TaskView;
@@ -691,6 +694,10 @@ TaskSketcherConstrains::TaskSketcherConstrains(ViewProviderSketch *sketchView) :
ui->visualisationTrackingFilter, SIGNAL(stateChanged(int)),
this , SLOT (on_visualisationTrackingFilter_stateChanged(int))
);
QObject::connect(
ui->multipleFilterButton, SIGNAL(clicked(bool)),
this , SLOT (on_multipleFilterButton_clicked(bool))
);
connectionConstraintsChanged = sketchView->signalConstraintsChanged.connect(
boost::bind(&SketcherGui::TaskSketcherConstrains::slotConstraintsChanged, this));
@@ -700,6 +707,8 @@ TaskSketcherConstrains::TaskSketcherConstrains(ViewProviderSketch *sketchView) :
this->ui->filterInternalAlignment->onRestore();
this->ui->extendedInformation->onRestore();
multiFilterStatus.set(); // Match 'All' selection, all bits set.
slotConstraintsChanged();
}
@@ -710,6 +719,46 @@ TaskSketcherConstrains::~TaskSketcherConstrains()
connectionConstraintsChanged.disconnect();
}
void TaskSketcherConstrains::updateMultiFilter()
{
int filterindex = ui->comboBoxFilter->currentIndex();
multiFilterStatus.reset();
multiFilterStatus.set(filterindex);
}
void TaskSketcherConstrains::updateList()
{
// enforce constraint visibility
bool visibilityTracksFilter = ui->visualisationTrackingFilter->isChecked();
if(visibilityTracksFilter)
change3DViewVisibilityToTrackFilter(); // it will call slotConstraintChanged via update mechanism
else
slotConstraintsChanged();
}
void TaskSketcherConstrains::on_multipleFilterButton_clicked(bool)
{
ConstraintMultiFilterDialog mf;
int filterindex = ui->comboBoxFilter->currentIndex();
if(filterindex != ConstraintFilter::SpecialFilterValue::Multiple) {
ui->comboBoxFilter->setCurrentIndex(ConstraintFilter::SpecialFilterValue::Multiple); // Change filter to multi filter selection
}
mf.setMultiFilter(multiFilterStatus);
if (mf.exec() == QDialog::Accepted) {
multiFilterStatus = mf.getMultiFilter();
// if tracking, it will call slotConstraintChanged via update mechanism as Multi Filter affects not only visibility, but also filtered list content, if not tracking will still update the list to match the multi-filter.
updateList();
}
}
void TaskSketcherConstrains::changeFilteredVisibility(bool show, ActionTarget target)
{
assert(sketchView);
@@ -846,15 +895,10 @@ void TaskSketcherConstrains::onSelectionChanged(const Gui::SelectionChanges& msg
}
}
void TaskSketcherConstrains::on_comboBoxFilter_currentIndexChanged(int)
{
// enforce constraint visibility
bool visibilityTracksFilter = ui->visualisationTrackingFilter->isChecked();
if(visibilityTracksFilter)
change3DViewVisibilityToTrackFilter(); // it will call slotConstraintChanged via update mechanism
else
slotConstraintsChanged();
updateList();
}
void TaskSketcherConstrains::on_filterInternalAlignment_stateChanged(int state)
@@ -1087,61 +1131,80 @@ bool TaskSketcherConstrains::isConstraintFiltered(QListWidgetItem * item)
switch(constraint->Type) {
case Sketcher::Horizontal:
visible = showAll || showGeometric || showNamed || (Filter == FilterValue::Horizontal);
visible = showAll || showGeometric || showNamed || (Filter == FilterValue::Horizontal) ||
(Filter == SpecialFilterValue::Multiple && multiFilterStatus[FilterValue::Horizontal]);
break;
case Sketcher::Vertical:
visible = showAll || showGeometric || showNamed || (Filter == FilterValue::Vertical);
visible = showAll || showGeometric || showNamed || (Filter == FilterValue::Vertical) ||
(Filter == SpecialFilterValue::Multiple && multiFilterStatus[FilterValue::Vertical]);
break;
case Sketcher::Coincident:
visible = showAll || showGeometric || showNamed || (Filter == FilterValue::Coincident);
visible = showAll || showGeometric || showNamed || (Filter == FilterValue::Coincident) ||
(Filter == SpecialFilterValue::Multiple && multiFilterStatus[FilterValue::Coincident]);
break;
case Sketcher::PointOnObject:
visible = showAll || showGeometric || showNamed || (Filter == FilterValue::PointOnObject);
visible = showAll || showGeometric || showNamed || (Filter == FilterValue::PointOnObject) ||
(Filter == SpecialFilterValue::Multiple && multiFilterStatus[FilterValue::PointOnObject]);
break;
case Sketcher::Parallel:
visible = showAll || showGeometric || showNamed || (Filter == FilterValue::Parallel);
visible = showAll || showGeometric || showNamed || (Filter == FilterValue::Parallel) ||
(Filter == SpecialFilterValue::Multiple && multiFilterStatus[FilterValue::Parallel]);
break;
case Sketcher::Perpendicular:
visible = showAll || showGeometric || showNamed || (Filter == FilterValue::Perpendicular);
visible = showAll || showGeometric || showNamed || (Filter == FilterValue::Perpendicular) ||
(Filter == SpecialFilterValue::Multiple && multiFilterStatus[FilterValue::Perpendicular]);
break;
case Sketcher::Tangent:
visible = showAll || showGeometric || showNamed || (Filter == FilterValue::Tangent);
visible = showAll || showGeometric || showNamed || (Filter == FilterValue::Tangent) ||
(Filter == SpecialFilterValue::Multiple && multiFilterStatus[FilterValue::Tangent]);
break;
case Sketcher::Equal:
visible = showAll || showGeometric || showNamed || (Filter == FilterValue::Equality);
visible = showAll || showGeometric || showNamed || (Filter == FilterValue::Equality) ||
(Filter == SpecialFilterValue::Multiple && multiFilterStatus[FilterValue::Equality]);
break;
case Sketcher::Symmetric:
visible = showAll || showGeometric || showNamed || (Filter == FilterValue::Symmetric);
visible = showAll || showGeometric || showNamed || (Filter == FilterValue::Symmetric) ||
(Filter == SpecialFilterValue::Multiple && multiFilterStatus[FilterValue::Symmetric]);
break;
case Sketcher::Block:
visible = showAll || showGeometric || showNamed || (Filter == FilterValue::Block);
visible = showAll || showGeometric || showNamed || (Filter == FilterValue::Block) ||
(Filter == SpecialFilterValue::Multiple && multiFilterStatus[FilterValue::Block]);
break;
case Sketcher::Distance:
visible = ( showAll || showDatums || showNamed || showNonDriving) || (Filter == FilterValue::Distance);
visible = ( showAll || showDatums || showNamed || showNonDriving) || (Filter == FilterValue::Distance) ||
(Filter == SpecialFilterValue::Multiple && multiFilterStatus[FilterValue::Distance]);
break;
case Sketcher::DistanceX:
visible = ( showAll || showDatums || showNamed || showNonDriving) || (Filter == FilterValue::HorizontalDistance);
visible = ( showAll || showDatums || showNamed || showNonDriving) || (Filter == FilterValue::HorizontalDistance) ||
(Filter == SpecialFilterValue::Multiple && multiFilterStatus[FilterValue::HorizontalDistance]);
break;
case Sketcher::DistanceY:
visible = ( showAll || showDatums || showNamed || showNonDriving) || (Filter == FilterValue::VerticalDistance);
visible = ( showAll || showDatums || showNamed || showNonDriving) || (Filter == FilterValue::VerticalDistance) ||
(Filter == SpecialFilterValue::Multiple && multiFilterStatus[FilterValue::VerticalDistance]);
break;
case Sketcher::Radius:
visible = ( showAll || showDatums || showNamed || showNonDriving) || (Filter == FilterValue::Radius);
visible = ( showAll || showDatums || showNamed || showNonDriving) || (Filter == FilterValue::Radius) ||
(Filter == SpecialFilterValue::Multiple && multiFilterStatus[FilterValue::Radius]);
break;
case Sketcher::Weight:
visible = ( showAll || showDatums || showNamed || showNonDriving) || (Filter == FilterValue::Weight);
visible = ( showAll || showDatums || showNamed || showNonDriving) || (Filter == FilterValue::Weight) ||
(Filter == SpecialFilterValue::Multiple && multiFilterStatus[FilterValue::Weight]);
break;
case Sketcher::Diameter:
visible = ( showAll || showDatums || showNamed || showNonDriving) || (Filter == FilterValue::Diameter);
visible = ( showAll || showDatums || showNamed || showNonDriving) || (Filter == FilterValue::Diameter) ||
(Filter == SpecialFilterValue::Multiple && multiFilterStatus[FilterValue::Diameter]);
break;
case Sketcher::Angle:
visible = ( showAll || showDatums || showNamed || showNonDriving) || (Filter == FilterValue::Angle);
visible = ( showAll || showDatums || showNamed || showNonDriving) || (Filter == FilterValue::Angle) ||
(Filter == SpecialFilterValue::Multiple && multiFilterStatus[FilterValue::Angle]);
break;
case Sketcher::SnellsLaw:
visible = ( showAll || showDatums || showNamed || showNonDriving) || (Filter == FilterValue::SnellsLaw);
visible = ( showAll || showDatums || showNamed || showNonDriving) || (Filter == FilterValue::SnellsLaw) ||
(Filter == SpecialFilterValue::Multiple && multiFilterStatus[FilterValue::SnellsLaw]);
break;
case Sketcher::InternalAlignment:
visible = (( showAll || showGeometric || showNamed || Filter == FilterValue::InternalAlignment) &&
visible = (( showAll || showGeometric || showNamed || Filter == FilterValue::InternalAlignment ||
(Filter == SpecialFilterValue::Multiple && multiFilterStatus[FilterValue::InternalAlignment])) &&
(!hideInternalAlignment || (Filter == FilterValue::InternalAlignment)));
default:
break;

View File

@@ -29,6 +29,8 @@
#include <boost_signals2.hpp>
#include <QListWidget>
#include "ConstraintFilters.h"
namespace App {
class Property;
}
@@ -73,33 +75,6 @@ class TaskSketcherConstrains : public Gui::TaskView::TaskBox, public Gui::Select
{
Q_OBJECT
enum FilterValue {
All = 0,
Geometric = 1,
Datums = 2,
Named = 3,
NonDriving = 4,
Horizontal = 5,
Vertical = 6,
Coincident = 7,
PointOnObject = 8,
Parallel = 9,
Perpendicular = 10,
Tangent = 11,
Equality = 12,
Symmetric = 13,
Block = 14,
Distance = 15,
HorizontalDistance = 16,
VerticalDistance = 17,
Radius = 18,
Weight = 19,
Diameter = 20,
Angle = 21,
SnellsLaw = 22,
InternalAlignment = 23
};
enum class ActionTarget {
All,
Selected
@@ -117,6 +92,8 @@ private:
bool isConstraintFiltered(QListWidgetItem * item);
void change3DViewVisibilityToTrackFilter();
void changeFilteredVisibility(bool show, ActionTarget target = ActionTarget::All);
void updateMultiFilter();
void updateList();
public Q_SLOTS:
void on_comboBoxFilter_currentIndexChanged(int);
@@ -133,6 +110,7 @@ public Q_SLOTS:
void on_hideAllButton_clicked(bool);
void on_listWidgetConstraints_emitShowSelection3DVisibility();
void on_listWidgetConstraints_emitHideSelection3DVisibility();
void on_multipleFilterButton_clicked(bool);
protected:
void changeEvent(QEvent *e);
@@ -144,6 +122,7 @@ private:
QWidget* proxy;
bool inEditMode;
std::unique_ptr<Ui_TaskSketcherConstrains> ui;
std::bitset<ConstraintFilter::FilterValue::NumFilterValue> multiFilterStatus;
};
} //namespace SketcherGui

View File

@@ -6,7 +6,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>319</width>
<width>325</width>
<height>388</height>
</rect>
</property>
@@ -160,6 +160,30 @@
<string>Internal Alignment</string>
</property>
</item>
<item>
<property name="text">
<string>Multiple Filters</string>
</property>
</item>
</widget>
</item>
<item>
<widget class="QPushButton" name="multipleFilterButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>...</string>
</property>
</widget>
</item>
</layout>