Skip to content

Commit de533fb

Browse files
committed
Address #2443 - Studio: Add ability to fill all (inclusive or exclusive) for FFC painting
1 parent 67d3f2d commit de533fb

File tree

10 files changed

+64
-0
lines changed

10 files changed

+64
-0
lines changed

Libs/Analyze/StudioMesh.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,14 @@ void StudioMesh::paint_ffc(double world_pos[], double radius, bool inclusive) {
137137
scalars->Modified();
138138
}
139139

140+
//---------------------------------------------------------------------------
141+
void StudioMesh::fill_ffc(bool inclusive) {
142+
auto scalars = get_or_create_array(FFC_PAINT, 1.0);
143+
float value = inclusive ? 1.0f : 0.0f;
144+
scalars->FillComponent(0, value);
145+
scalars->Modified();
146+
}
147+
140148
//---------------------------------------------------------------------------
141149
bool StudioMesh::has_ffc_paint() {
142150
auto result = poly_data_->GetPointData()->GetArray(FFC_PAINT);

Libs/Analyze/StudioMesh.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@ class StudioMesh {
6666
//! Paint free form constraint
6767
void paint_ffc(double world_pos[], double radius, bool inclusive);
6868

69+
//! Fill all vertices with specified inclusion/exclusion value
70+
void fill_ffc(bool inclusive);
71+
6972
//! Does this mesh have free form constraint paint?
7073
bool has_ffc_paint();
7174

Studio/Data/DataTool.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ void DataTool::set_session(QSharedPointer<Session> session) {
146146
connect(ui_->ffc_brush_size_, &CustomSlider::valueChanged, session.data(), &Session::set_ffc_paint_size);
147147
connect(ui_->ffc_included_mode_, &QRadioButton::toggled, session.data(), &Session::set_ffc_paint_mode_inclusive);
148148
connect(ui_->ffc_active_, &QCheckBox::toggled, session.data(), &Session::set_ffc_paint_active);
149+
connect(ui_->ffc_fill_all_button_, &QPushButton::clicked, session.data(), &Session::trigger_fill_all_ffc);
149150

150151
update_table();
151152
handle_landmark_mode_changed();

Studio/Data/DataTool.ui

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -933,6 +933,16 @@ QWidget#specificity_panel {
933933
</property>
934934
</widget>
935935
</item>
936+
<item row="3" column="0" colspan="3">
937+
<widget class="QPushButton" name="ffc_fill_all_button_">
938+
<property name="text">
939+
<string>Fill All (Visible Shapes)</string>
940+
</property>
941+
<property name="toolTip">
942+
<string>Fill entire mesh of currently displayed shape(s) with selected paint type (Included/Excluded)</string>
943+
</property>
944+
</widget>
945+
</item>
936946
</layout>
937947
</widget>
938948
</item>

Studio/Data/Session.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1004,6 +1004,9 @@ void Session::trigger_save() { Q_EMIT save(); }
10041004
//---------------------------------------------------------------------------
10051005
void Session::trigger_data_changed() { Q_EMIT data_changed(); }
10061006

1007+
//---------------------------------------------------------------------------
1008+
void Session::trigger_fill_all_ffc() { Q_EMIT fill_all_ffc_requested(); }
1009+
10071010
//---------------------------------------------------------------------------
10081011
void Session::reload_particles() {
10091012
int num_subjects = project_->get_number_of_subjects();

Studio/Data/Session.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ class Session : public QObject, public QEnableSharedFromThis<Session> {
172172
void trigger_save();
173173
void trigger_data_changed();
174174
void reload_particles();
175+
void trigger_fill_all_ffc();
175176

176177
void set_active_landmark_domain(int id);
177178
int get_active_landmark_domain();
@@ -323,6 +324,7 @@ class Session : public QObject, public QEnableSharedFromThis<Session> {
323324
void save();
324325
void session_title_changed();
325326
void image_name_changed();
327+
void fill_all_ffc_requested();
326328

327329
public:
328330
// constants

Studio/Visualization/Viewer.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -594,6 +594,31 @@ void Viewer::handle_paint(double display_pos[2], double world_pos[3]) {
594594
session_->set_modified(true);
595595
}
596596

597+
//-----------------------------------------------------------------------------
598+
void Viewer::fill_all_ffc() {
599+
// fill all vertices of all meshes with the current paint mode (included/excluded)
600+
if (!meshes_.valid()) {
601+
return;
602+
}
603+
604+
bool inclusive = session_->get_ffc_paint_mode_inclusive();
605+
606+
for (int domain = 0; domain < meshes_.meshes().size(); domain++) {
607+
auto mesh = meshes_.meshes()[domain];
608+
mesh->fill_ffc(inclusive);
609+
610+
auto& ffc = shape_->get_constraints(domain).getFreeformConstraint();
611+
ffc.setDefinition(mesh->get_poly_data());
612+
if (!ffc.isSet()) {
613+
ffc.setPainted(true);
614+
session_->trigger_ffc_changed();
615+
}
616+
}
617+
618+
session_->set_modified(true);
619+
session_->trigger_repaint();
620+
}
621+
597622
//-----------------------------------------------------------------------------
598623
void Viewer::update_landmarks() { landmark_widget_->update_landmarks(); }
599624

Studio/Visualization/Viewer.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,8 @@ class Viewer {
145145

146146
void handle_paint(double display_pos[2], double world_pos[3]);
147147

148+
void fill_all_ffc();
149+
148150
static bool is_reverse(vtkSmartPointer<vtkTransform> transform);
149151

150152
void update_actors();

Studio/Visualization/Visualizer.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,15 @@ void Visualizer::set_session(SessionHandle session) {
5353
connect(session_.data(), &Session::paint_mode_changed, this, &Visualizer::update_paint_mode);
5454
connect(session_.data(), &Session::repaint, this, &Visualizer::redraw);
5555
connect(session_.data(), &Session::annotations_changed, this, &Visualizer::update_annotations);
56+
connect(session_.data(), &Session::fill_all_ffc_requested, this, &Visualizer::handle_fill_all_ffc);
57+
}
58+
59+
//-----------------------------------------------------------------------------
60+
void Visualizer::handle_fill_all_ffc() {
61+
Q_FOREACH (ViewerHandle viewer, lightbox_->get_viewers()) {
62+
viewer->fill_all_ffc();
63+
}
64+
lightbox_->redraw();
5665
}
5766

5867
//-----------------------------------------------------------------------------

Studio/Visualization/Visualizer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ class Visualizer : public QObject {
5656
void update_landmarks();
5757
void update_planes();
5858
void update_paint_mode();
59+
void handle_fill_all_ffc();
5960

6061
void display_sample(int i);
6162

0 commit comments

Comments
 (0)