Merge pull request #8238 from MaelRL/Lab-Fix_components-GF

Fix CC selection in selection item
This commit is contained in:
Laurent Rineau 2024-06-03 17:40:27 +02:00
commit 2c13f1fe6b
8 changed files with 304 additions and 342 deletions

View File

@ -211,8 +211,13 @@ public:
connect(ui_widget.selectionOrEuler, SIGNAL(currentChanged(int)), this, SLOT(on_SelectionOrEuler_changed(int))); connect(ui_widget.selectionOrEuler, SIGNAL(currentChanged(int)), this, SLOT(on_SelectionOrEuler_changed(int)));
connect(ui_widget.editionBox, SIGNAL(currentIndexChanged(int)), this, SLOT(on_editionBox_changed(int))); connect(ui_widget.editionBox, SIGNAL(currentIndexChanged(int)), this, SLOT(on_editionBox_changed(int)));
ui_widget.Sharp_edges_label->hide();
ui_widget.Sharp_angle_spinbox->hide();
ui_widget.Select_sharp_edges_button->hide();
ui_widget.Select_boundaryButton->hide();
ui_widget.Add_to_selection_button->hide(); ui_widget.Add_to_selection_button->hide();
ui_widget.Select_all_NTButton->hide(); ui_widget.Select_all_NTButton->hide();
QObject* scene = dynamic_cast<QObject*>(scene_interface); QObject* scene = dynamic_cast<QObject*>(scene_interface);
if(scene) { if(scene) {
connect(scene, SIGNAL(itemAboutToBeDestroyed(CGAL::Three::Scene_item*)), this, SLOT(item_about_to_be_destroyed(CGAL::Three::Scene_item*))); connect(scene, SIGNAL(itemAboutToBeDestroyed(CGAL::Three::Scene_item*)), this, SLOT(item_about_to_be_destroyed(CGAL::Three::Scene_item*)));
@ -544,55 +549,84 @@ public Q_SLOTS:
for(Selection_item_map::iterator it = selection_item_map.begin(); it != selection_item_map.end(); ++it) for(Selection_item_map::iterator it = selection_item_map.begin(); it != selection_item_map.end(); ++it)
{ {
it->second->set_lasso_mode(b); it->second->set_lasso_mode(b);
ui_widget.Brush_label->setEnabled(!b);
ui_widget.Brush_size_spin_box->setEnabled(!b);
ui_widget.Brush_size_spin_box->setValue(0);
} }
} }
void on_Selection_type_combo_box_changed(int index) { void on_Selection_type_combo_box_changed(int index) {
std::cout << "on_Selection_type_combo_box_changed(" << index << ")" << std::endl;
typedef Scene_polyhedron_selection_item::Active_handle Active_handle; typedef Scene_polyhedron_selection_item::Active_handle Active_handle;
for(Selection_item_map::iterator it = selection_item_map.begin(); it != selection_item_map.end(); ++it) { for(Selection_item_map::iterator it = selection_item_map.begin(); it != selection_item_map.end(); ++it) {
it->second->set_active_handle_type(static_cast<Active_handle::Type>(index)); it->second->set_active_handle_type(static_cast<Active_handle::Type>(index));
Q_EMIT save_handleType(); Q_EMIT save_handleType();
it->second->setPathSelection(false);
ui_widget.Sharp_edges_label->hide();
ui_widget.Sharp_angle_spinbox->hide();
ui_widget.Select_sharp_edges_button->hide();
ui_widget.Select_boundaryButton->hide();
ui_widget.Add_to_selection_button->hide();
ui_widget.Select_all_NTButton->hide();
ui_widget.Get_minimum_button->setEnabled(false);
ui_widget.Select_isolated_components_button->setEnabled(false);
switch(index) switch(index)
{ {
case 0: case 0: // vertex
case 1: case 1: // face
case 2: case 2: // edge
ui_widget.lassoCheckBox->show(); ui_widget.lassoCheckBox->show();
ui_widget.Brush_label->show();
ui_widget.Brush_size_spin_box->show();
ui_widget.Get_minimum_button->setEnabled(true);
ui_widget.Select_isolated_components_button->setEnabled(true);
break; break;
case 3: // CC of faces
case 4: // Path of edges
default: default:
ui_widget.lassoCheckBox->hide(); ui_widget.lassoCheckBox->hide();
ui_widget.lassoCheckBox->setChecked(false); ui_widget.lassoCheckBox->setChecked(false);
it->second->set_lasso_mode(false); it->second->set_lasso_mode(false);
ui_widget.Brush_label->hide();
ui_widget.Brush_size_spin_box->hide();
ui_widget.Brush_size_spin_box->setValue(0);
break; break;
} }
if(index == 1)
if(index == 0) // vertex
{
Q_EMIT set_operation_mode(-1);
}
else if(index == 1) // face
{ {
ui_widget.Select_all_NTButton->show(); ui_widget.Select_all_NTButton->show();
ui_widget.Add_to_selection_button->hide();
ui_widget.Select_boundaryButton->hide();
Q_EMIT set_operation_mode(-1); Q_EMIT set_operation_mode(-1);
} }
else if(index == 2) else if(index == 2) // edge
{ {
ui_widget.Select_all_NTButton->hide();
ui_widget.Add_to_selection_button->hide();
ui_widget.Select_boundaryButton->show(); ui_widget.Select_boundaryButton->show();
ui_widget.Sharp_angle_spinbox->show();
ui_widget.Select_sharp_edges_button->show();
Q_EMIT set_operation_mode(-1); Q_EMIT set_operation_mode(-1);
} }
else if(index == 4) else if(index == 3) // CC of faces
{
Q_EMIT set_operation_mode(-1);
}
else if(index == 4) // Path of edges
{ {
it->second->setPathSelection(true); it->second->setPathSelection(true);
ui_widget.Select_all_NTButton->hide();
ui_widget.Add_to_selection_button->show(); ui_widget.Add_to_selection_button->show();
ui_widget.Select_boundaryButton->show();
Q_EMIT set_operation_mode(-2); Q_EMIT set_operation_mode(-2);
} }
else else
{ {
ui_widget.Add_to_selection_button->hide(); std::cerr << "Error: unknown selection type" << std::endl;
ui_widget.Select_all_NTButton->hide();
ui_widget.Select_boundaryButton->hide();
it->second->setPathSelection(false);
Q_EMIT set_operation_mode(-1);
} }
} }
filter_operations(); filter_operations();

View File

@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>613</width> <width>630</width>
<height>409</height> <height>532</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -21,7 +21,6 @@
<widget class="QPushButton" name="Create_selection_item_button"> <widget class="QPushButton" name="Create_selection_item_button">
<property name="font"> <property name="font">
<font> <font>
<weight>75</weight>
<bold>true</bold> <bold>true</bold>
</font> </font>
</property> </property>
@ -30,20 +29,20 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="QPushButton" name="Clear_all_button">
<property name="toolTip">
<string extracomment="Clear selection for All Types"/>
</property>
<property name="text">
<string>Clear Selection</string>
</property>
</widget>
</item>
</layout> </layout>
</item> </item>
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout_2"> <layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QCheckBox" name="hl_checkBox">
<property name="text">
<string>Show selector</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item> <item>
<spacer name="horizontalSpacer"> <spacer name="horizontalSpacer">
<property name="orientation"> <property name="orientation">
@ -57,16 +56,6 @@
</property> </property>
</spacer> </spacer>
</item> </item>
<item>
<widget class="QCheckBox" name="hl_checkBox">
<property name="text">
<string>Highlight</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
</layout> </layout>
</item> </item>
<item> <item>
@ -79,6 +68,46 @@
<string>Selection</string> <string>Selection</string>
</attribute> </attribute>
<layout class="QVBoxLayout" name="verticalLayout_5"> <layout class="QVBoxLayout" name="verticalLayout_5">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_9" stretch="1,1">
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>Selection Type :</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="Selection_type_combo_box">
<item>
<property name="text">
<string>Vertex</string>
</property>
</item>
<item>
<property name="text">
<string>Facet</string>
</property>
</item>
<item>
<property name="text">
<string>Edge</string>
</property>
</item>
<item>
<property name="text">
<string>Facet Connected Component</string>
</property>
</item>
<item>
<property name="text">
<string>Edge Path Between Vertices</string>
</property>
</item>
</widget>
</item>
</layout>
</item>
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout_3"> <layout class="QHBoxLayout" name="horizontalLayout_3">
<item> <item>
@ -92,42 +121,55 @@
</attribute> </attribute>
<layout class="QVBoxLayout" name="verticalLayout_2"> <layout class="QVBoxLayout" name="verticalLayout_2">
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout_9" stretch="1,1"> <layout class="QVBoxLayout" name="verticalLayout_10">
<item> <item>
<widget class="QLabel" name="label_2"> <layout class="QHBoxLayout" name="horizontalLayout">
<property name="text"> <item>
<string>Selection Type :</string> <widget class="QRadioButton" name="Insertion_radio_button">
</property> <property name="text">
</widget> <string>Insertion</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="Removal_radio_button">
<property name="text">
<string>Removal</string>
</property>
</widget>
</item>
</layout>
</item> </item>
<item> <item>
<widget class="QComboBox" name="Selection_type_combo_box"> <layout class="QHBoxLayout" name="horizontalLayout_12">
<item> <item>
<property name="text"> <widget class="QCheckBox" name="lassoCheckBox">
<string>Vertex</string> <property name="text">
</property> <string>Lasso</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_14">
<item>
<widget class="QLabel" name="Brush_label">
<property name="text">
<string>Brush &amp;size:</string>
</property>
<property name="buddy">
<cstring>Brush_size_spin_box</cstring>
</property>
</widget>
</item> </item>
<item> <item>
<property name="text"> <widget class="QSpinBox" name="Brush_size_spin_box"/>
<string>Facet</string>
</property>
</item> </item>
<item> </layout>
<property name="text">
<string>Edge</string>
</property>
</item>
<item>
<property name="text">
<string>Connected Component (Facet)</string>
</property>
</item>
<item>
<property name="text">
<string>Path Between Vertices</string>
</property>
</item>
</widget>
</item> </item>
</layout> </layout>
</item> </item>
@ -145,36 +187,9 @@
</spacer> </spacer>
</item> </item>
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout_11" stretch="0,1,0,1"> <layout class="QHBoxLayout" name="horizontalLayout_11" stretch="0">
<item>
<widget class="QCheckBox" name="lassoCheckBox">
<property name="text">
<string>Lasso</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item> <item>
<layout class="QVBoxLayout" name="verticalLayout_7"> <layout class="QVBoxLayout" name="verticalLayout_7">
<item>
<widget class="QPushButton" name="Select_all_NTButton">
<property name="text">
<string>Select All Non Triangle</string>
</property>
</widget>
</item>
<item> <item>
<widget class="QPushButton" name="Select_boundaryButton"> <widget class="QPushButton" name="Select_boundaryButton">
<property name="text"> <property name="text">
@ -182,21 +197,78 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_7">
<item>
<widget class="QLabel" name="Sharp_edges_label">
<property name="text">
<string>Sharp edges angle:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="Sharp_angle_spinbox">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximum">
<number>180</number>
</property>
<property name="value">
<number>60</number>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="Select_sharp_edges_button">
<property name="text">
<string>Select</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QPushButton" name="Add_to_selection_button">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Add Path to Selection</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="Select_all_NTButton">
<property name="text">
<string>Select All Non Triangle Facets</string>
</property>
</widget>
</item>
</layout> </layout>
</item> </item>
<item>
<widget class="QPushButton" name="Add_to_selection_button">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Add to Selection</string>
</property>
</widget>
</item>
</layout> </layout>
</item> </item>
<item> <item>
@ -212,40 +284,6 @@
</property> </property>
</spacer> </spacer>
</item> </item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QRadioButton" name="Insertion_radio_button">
<property name="text">
<string>Insertion</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="Removal_radio_button">
<property name="text">
<string>Removal</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Brush &amp;size:</string>
</property>
<property name="buddy">
<cstring>Brush_size_spin_box</cstring>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="Brush_size_spin_box"/>
</item>
</layout>
</item>
</layout> </layout>
</widget> </widget>
<widget class="QWidget" name="tab_2"> <widget class="QWidget" name="tab_2">
@ -253,55 +291,6 @@
<string>Components</string> <string>Components</string>
</attribute> </attribute>
<layout class="QVBoxLayout" name="verticalLayout_3"> <layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="QLabel" name="label_3">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Threshold:</string>
</property>
<property name="buddy">
<cstring>Threshold_size_spin_box</cstring>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="Threshold_size_spin_box">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximum">
<number>999999999</number>
</property>
<property name="value">
<number>8</number>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="Get_minimum_button">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>&amp;Get Minimum</string>
</property>
</widget>
</item>
</layout>
</item>
<item> <item>
<spacer name="verticalSpacer_7"> <spacer name="verticalSpacer_7">
<property name="orientation"> <property name="orientation">
@ -316,11 +305,64 @@
</spacer> </spacer>
</item> </item>
<item> <item>
<widget class="QPushButton" name="Select_isolated_components_button"> <layout class="QVBoxLayout" name="verticalLayout_11">
<property name="text"> <item>
<string>Select &amp;Isolated Components Below Threshold</string> <layout class="QHBoxLayout" name="horizontalLayout_5">
</property> <item>
</widget> <widget class="QLabel" name="label_3">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Threshold:</string>
</property>
<property name="buddy">
<cstring>Threshold_size_spin_box</cstring>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="Threshold_size_spin_box">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximum">
<number>999999999</number>
</property>
<property name="value">
<number>8</number>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QPushButton" name="Get_minimum_button">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Set Threshold to Simplex Count of Smallest CC</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="Select_isolated_components_button">
<property name="text">
<string>Select CCs With Simplex Count Below Threshold</string>
</property>
</widget>
</item>
</layout>
</item> </item>
<item> <item>
<spacer name="verticalSpacer_6"> <spacer name="verticalSpacer_6">
@ -335,43 +377,6 @@
</property> </property>
</spacer> </spacer>
</item> </item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_7">
<item>
<widget class="QLabel" name="label_6">
<property name="text">
<string>Sharp edges angle:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="Sharp_angle_spinbox">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximum">
<number>180</number>
</property>
<property name="value">
<number>60</number>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="Select_sharp_edges_button">
<property name="text">
<string>Select</string>
</property>
</widget>
</item>
</layout>
</item>
</layout> </layout>
</widget> </widget>
</widget> </widget>
@ -432,12 +437,12 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QPushButton" name="Clear_button"> <widget class="QPushButton" name="Select_all_button">
<property name="toolTip"> <property name="toolTip">
<string extracomment="Clear selection for Selection Type"/> <string extracomment="Select all simplices of Selection Type"/>
</property> </property>
<property name="text"> <property name="text">
<string>&amp;Clear Current Type</string> <string>Select &amp;All Current Type</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -452,12 +457,22 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QPushButton" name="Select_all_button"> <widget class="QPushButton" name="Clear_button">
<property name="toolTip"> <property name="toolTip">
<string extracomment="Select all simplices of Selection Type"/> <string extracomment="Clear selection for Selection Type"/>
</property> </property>
<property name="text"> <property name="text">
<string>Select &amp;All</string> <string>&amp;Clear Current Type</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="Clear_all_button">
<property name="toolTip">
<string extracomment="Clear selection for All Types"/>
</property>
<property name="text">
<string>Clear All</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -638,7 +653,7 @@
<item> <item>
<widget class="QLabel" name="instructionsLabel"> <widget class="QLabel" name="instructionsLabel">
<property name="text"> <property name="text">
<string>Instructions <string>Instructions
</string> </string>
</property> </property>

View File

@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>547</width> <width>561</width>
<height>347</height> <height>294</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -135,45 +135,6 @@
</item> </item>
</layout> </layout>
</item> </item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_8" stretch="0,1,0">
<item>
<widget class="QLabel" name="label_3">
<property name="text">
<string>Isolated Component Size:</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="Threshold_size_spin_box">
<property name="maximum">
<number>999999999</number>
</property>
<property name="value">
<number>8</number>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="Get_minimum_button">
<property name="text">
<string>Get Minimum</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QPushButton" name="Select_isolated_components_button">
<property name="text">
<string>Select Isolated Components Below Threshold</string>
</property>
</widget>
</item>
</layout>
</item>
</layout> </layout>
</widget> </widget>
<widget class="QWidget" name="tab_2"> <widget class="QWidget" name="tab_2">

View File

@ -62,8 +62,6 @@ public Q_SLOTS:
void on_SaveROIPushButton_clicked(); void on_SaveROIPushButton_clicked();
void on_ReadROIPushButton_clicked(); void on_ReadROIPushButton_clicked();
void dock_widget_visibility_changed(bool visible); void dock_widget_visibility_changed(bool visible);
void on_Select_isolated_components_button_clicked();
void on_Get_minimum_button_clicked();
void on_BrushSpinBoxCtrlVert_changed(int); void on_BrushSpinBoxCtrlVert_changed(int);
void on_BrushSpinBoxRoi_changed(int); void on_BrushSpinBoxRoi_changed(int);
@ -150,8 +148,6 @@ void CGAL_Lab_edit_cgal_lab_plugin::init(QMainWindow* mainWindow, CGAL::Three::S
connect(ui_widget.ActivateFixedPlaneCheckBox, SIGNAL(stateChanged(int)), this, SLOT(on_ActivateFixedPlaneCheckBox_stateChanged(int))); connect(ui_widget.ActivateFixedPlaneCheckBox, SIGNAL(stateChanged(int)), this, SLOT(on_ActivateFixedPlaneCheckBox_stateChanged(int)));
connect(ui_widget.ActivatePivotingCheckBox, SIGNAL(stateChanged(int)), this, SLOT(on_ActivatePivotingCheckBox_stateChanged(int))); connect(ui_widget.ActivatePivotingCheckBox, SIGNAL(stateChanged(int)), this, SLOT(on_ActivatePivotingCheckBox_stateChanged(int)));
connect(ui_widget.OverwritePushButton, SIGNAL(clicked()), this, SLOT(on_OverwritePushButton_clicked())); connect(ui_widget.OverwritePushButton, SIGNAL(clicked()), this, SLOT(on_OverwritePushButton_clicked()));
connect(ui_widget.Select_isolated_components_button, SIGNAL(clicked()), this, SLOT(on_Select_isolated_components_button_clicked()));
connect(ui_widget.Get_minimum_button, SIGNAL(clicked()), this, SLOT(on_Get_minimum_button_clicked()));
connect(ui_widget.SaveROIPushButton, SIGNAL(clicked()), this, SLOT(on_SaveROIPushButton_clicked())); connect(ui_widget.SaveROIPushButton, SIGNAL(clicked()), this, SLOT(on_SaveROIPushButton_clicked()));
connect(ui_widget.ReadROIPushButton, SIGNAL(clicked()), this, SLOT(on_ReadROIPushButton_clicked())); connect(ui_widget.ReadROIPushButton, SIGNAL(clicked()), this, SLOT(on_ReadROIPushButton_clicked()));
@ -304,28 +300,6 @@ void CGAL_Lab_edit_cgal_lab_plugin::on_OverwritePushButton_clicked()
edit_item->overwrite_deform_object(); edit_item->overwrite_deform_object();
} }
void CGAL_Lab_edit_cgal_lab_plugin::on_Select_isolated_components_button_clicked() {
int item_id = scene->selectionIndices().front();
Scene_edit_polyhedron_item* edit_item = qobject_cast<Scene_edit_polyhedron_item*>(scene->item(item_id));
if(!edit_item) return; // the selected item is not of the right type
std::optional<std::size_t> minimum =
edit_item->select_isolated_components(ui_widget.Threshold_size_spin_box->value());
if(minimum) {
ui_widget.Threshold_size_spin_box->setValue((int) *minimum);
}
}
void CGAL_Lab_edit_cgal_lab_plugin::on_Get_minimum_button_clicked() {
int item_id = scene->selectionIndices().front();
Scene_edit_polyhedron_item* edit_item = qobject_cast<Scene_edit_polyhedron_item*>(scene->item(item_id));
if(!edit_item) return; // the selected item is not of the right type
std::optional<std::size_t> minimum = edit_item->get_minimum_isolated_component();
if(minimum) {
ui_widget.Threshold_size_spin_box->setValue((int) *minimum);
}
}
void CGAL_Lab_edit_cgal_lab_plugin::on_SaveROIPushButton_clicked() void CGAL_Lab_edit_cgal_lab_plugin::on_SaveROIPushButton_clicked()
{ {

View File

@ -1621,28 +1621,6 @@ void Scene_edit_polyhedron_item::reset_deform_object()
refresh_all_group_centers(); refresh_all_group_centers();
} }
std::optional<std::size_t> Scene_edit_polyhedron_item::get_minimum_isolated_component() {
Travel_isolated_components<SMesh>::Minimum_visitor visitor;
Travel_isolated_components<SMesh>(*surface_mesh()).travel<sm_vertex_descriptor>
(vertices(*surface_mesh()).first, vertices(*surface_mesh()).second,
num_vertices(*surface_mesh()), Is_selected<SMesh>(d->deform_sm_mesh), visitor);
return visitor.minimum;
}
std::optional<std::size_t> Scene_edit_polyhedron_item::select_isolated_components(std::size_t threshold) {
typedef boost::function_output_iterator<Select_roi_output<SMesh> > Output_iterator;
Output_iterator out(d->deform_sm_mesh);
Travel_isolated_components<SMesh>::Selection_visitor<Output_iterator> visitor(threshold, out);
Travel_isolated_components<SMesh>(*surface_mesh()).travel<sm_vertex_descriptor>
(vertices(*surface_mesh()).first, vertices(*surface_mesh()).second,
num_vertices(*surface_mesh()), Is_selected<SMesh>(d->deform_sm_mesh), visitor);
if(visitor.any_inserted) { invalidateOpenGLBuffers(); Q_EMIT itemChanged(); }
return visitor.minimum_visitor.minimum;
}
bool Scene_edit_polyhedron_item::is_there_any_ctrl_vertices_group() bool Scene_edit_polyhedron_item::is_there_any_ctrl_vertices_group()
{ {
if(d->sm_item) if(d->sm_item)

View File

@ -379,7 +379,6 @@ public:
} }
}; };
std::optional<std::size_t> get_minimum_isolated_component();
template<typename Mesh> template<typename Mesh>
struct Select_roi_output{ struct Select_roi_output{
typedef typename CGAL::Surface_mesh_deformation<Mesh, CGAL::Default, CGAL::Default, CGAL::ORIGINAL_ARAP typedef typename CGAL::Surface_mesh_deformation<Mesh, CGAL::Default, CGAL::Default, CGAL::ORIGINAL_ARAP

View File

@ -501,7 +501,7 @@ public:
Selection_traits<HandleType, Scene_polyhedron_selection_item> tr(this); Selection_traits<HandleType, Scene_polyhedron_selection_item> tr(this);
Travel_isolated_components<Face_graph>::Minimum_visitor visitor; Travel_isolated_components<Face_graph>::Minimum_visitor visitor;
Travel_isolated_components<Face_graph>(*polyhedron()).travel<HandleType> Travel_isolated_components<Face_graph>(*polyhedron()).travel<HandleType>
(tr.iterator_begin(), tr.iterator_end(), tr.size(), tr.container(), visitor); (tr.iterator_begin(), tr.iterator_end(), tr.size(), visitor);
return visitor.minimum; return visitor.minimum;
} }
@ -516,7 +516,8 @@ public:
} }
} }
template<class HandleType> // use fg_vertex_descriptor, fg_face_descriptor, fg_edge_descriptor template<class HandleType> // use fg_vertex_descriptor, fg_face_descriptor, fg_edge_descriptor
std::optional<std::size_t> select_isolated_components(std::size_t threshold) { std::optional<std::size_t> select_isolated_components(std::size_t threshold)
{
typedef Selection_traits<HandleType, Scene_polyhedron_selection_item> Tr; typedef Selection_traits<HandleType, Scene_polyhedron_selection_item> Tr;
Tr tr(this); Tr tr(this);
typedef std::insert_iterator<typename Tr::Container> Output_iterator; typedef std::insert_iterator<typename Tr::Container> Output_iterator;
@ -524,7 +525,7 @@ public:
Travel_isolated_components<Face_graph>::Selection_visitor<Output_iterator> visitor(threshold , out); Travel_isolated_components<Face_graph>::Selection_visitor<Output_iterator> visitor(threshold , out);
Travel_isolated_components<Face_graph>(*polyhedron()).travel<HandleType> Travel_isolated_components<Face_graph>(*polyhedron()).travel<HandleType>
(tr.iterator_begin(), tr.iterator_end(), tr.size(), tr.container(), visitor); (tr.iterator_begin(), tr.iterator_end(), tr.size(), visitor);
if(visitor.any_inserted) { invalidateOpenGLBuffers(); Q_EMIT itemChanged(); } if(visitor.any_inserted) { invalidateOpenGLBuffers(); Q_EMIT itemChanged(); }
return visitor.minimum_visitor.minimum; return visitor.minimum_visitor.minimum;

View File

@ -110,11 +110,10 @@ public:
} }
*/ */
// NOTE: prior to call this function, id fields should be updated // NOTE: prior to call this function, id fields should be updated
template<class Descriptor, class InputIterator, class IsSelected, class Visitor> template<class Descriptor, class InputIterator, class Visitor>
void travel(InputIterator begin, void travel(InputIterator begin,
InputIterator end, InputIterator end,
std::size_t size, std::size_t size,
const IsSelected& selection,
Visitor& visitor) Visitor& visitor)
{ {
std::vector<bool> mark(size, false); std::vector<bool> mark(size, false);
@ -123,28 +122,29 @@ public:
{ {
Descriptor h = *begin; Descriptor h = *begin;
if(mark[id(h)] || selection.count(h)) { continue; } if(mark[id(h)])
continue;
std::vector<Descriptor> C; std::vector<Descriptor> C;
C.push_back(h); C.push_back(h);
mark[id(h)] = true; mark[id(h)] = true;
std::size_t current_index = 0; std::size_t current_index = 0;
bool neigh_to_selection = false;
while(current_index < C.size()) { while(current_index < C.size()) {
Descriptor current = C[current_index++]; Descriptor current = C[current_index++];
for(One_ring_iterator<Mesh, Descriptor> circ(current, mesh); circ; ++circ) for(One_ring_iterator<Mesh, Descriptor> circ(current, mesh); circ; ++circ)
{ {
Descriptor nv = circ; Descriptor nv = circ;
neigh_to_selection |= (selection.count(nv)!=0); if(!mark[id(nv)])
if(!mark[id(nv)] && !selection.count(nv)) { {
mark[id(nv)] = true; mark[id(nv)] = true;
C.push_back(nv); C.push_back(nv);
} }
} }
} }
if(neigh_to_selection) { visitor(C); }
visitor(C);
} }
} }
}; };