diff --git a/GUI/src/main/java/cz/fidentis/analyst/distance/DistanceAction.java b/GUI/src/main/java/cz/fidentis/analyst/distance/DistanceAction.java index 9ed0f49e1ffc1b4e13a6eb445fd62d21e31cd180..b2f1f80aead2a05b19d283f85ea679087c4a1fe9 100644 --- a/GUI/src/main/java/cz/fidentis/analyst/distance/DistanceAction.java +++ b/GUI/src/main/java/cz/fidentis/analyst/distance/DistanceAction.java @@ -37,11 +37,14 @@ public class DistanceAction extends ControlPanelAction { private String strategy = DistancePanel.STRATEGY_POINT_TO_POINT; private boolean relativeDist = false; private boolean weightedDist = false; + private boolean heatmapRender = false; private Map<MeshFacet, List<Double>> weightedHausdorffDistance = null; private final DistancePanel controlPanel; + private static final Color FEATURE_POINT_HIGHLIGHT_COLOR = Color.MAGENTA; + /** * Constructor. * @@ -51,6 +54,27 @@ public class DistanceAction extends ControlPanelAction { public DistanceAction(Canvas canvas, JTabbedPane topControlPanel) { super(canvas, topControlPanel); this.controlPanel = new DistancePanel(this, getSecondaryFeaturePoints().getFeaturePoints()); + + // Place control panel to the topControlPanel + topControlPanel.addTab(controlPanel.getName(), controlPanel.getIcon(), controlPanel); + topControlPanel.addChangeListener(e -> { + // If the distance panel is focused... + if (((JTabbedPane) e.getSource()).getSelectedComponent() instanceof DistancePanel) { + // ... display heatmap and feature points relevant to the Hausdorff distance + getCanvas().getScene().setDefaultColors(); + final List<FeaturePoint> secondaryFeaturePoints = getSecondaryFeaturePoints().getFeaturePoints(); + for (int i = 0; i < secondaryFeaturePoints.size(); i++) { + if (featurePointTypes.containsKey(secondaryFeaturePoints.get(i).getFeaturePointType())) { + getSecondaryFeaturePoints().setColor(i, FEATURE_POINT_HIGHLIGHT_COLOR); + } + } + visitor = null; // recompute (position of faces could have been changed in registration) + calculateHausdorffDistance(); + getSecondaryDrawableFace().setRenderHeatmap(heatmapRender); + renderScene(); + } + }); + topControlPanel.setSelectedComponent(controlPanel); // Focus Hausdorff distance panel } @Override @@ -58,16 +82,14 @@ public class DistanceAction extends ControlPanelAction { final String action = ae.getActionCommand(); switch (action) { - case DistancePanel.ACTION_COMMAND_SHOW_HIDE_PANEL: - hideShowPanelActionPerformed(ae, this.controlPanel); - break; case DistancePanel.ACTION_COMMAND_SHOW_HIDE_HEATMAP: if (((JToggleButton) ae.getSource()).isSelected()) { calculateHausdorffDistance(); - getSecondaryDrawableFace().setRenderHeatmap(true); + heatmapRender = true; } else { - getSecondaryDrawableFace().setRenderHeatmap(false); + heatmapRender = false; } + getSecondaryDrawableFace().setRenderHeatmap(heatmapRender); break; case DistancePanel.ACTION_COMMAND_SET_DISTANCE_STRATEGY: strategy = (String) ((JComboBox) ae.getSource()).getSelectedItem(); @@ -103,7 +125,7 @@ public class DistanceAction extends ControlPanelAction { * (Re)calculates the Hausdorff distance and updates the heat map of the secondary face * as well as values of all appropriate GUI elements of {@link DistancePanel}. */ - protected void calculateHausdorffDistance() { + private void calculateHausdorffDistance() { final Strategy useStrategy; switch (strategy) { case DistancePanel.STRATEGY_POINT_TO_POINT: @@ -213,7 +235,7 @@ public class DistanceAction extends ControlPanelAction { final DrawableFeaturePoints secondaryFeaturePoints = getSecondaryFeaturePoints(); if (((JToggleButton) actionEvent.getSource()).isSelected()) { - secondaryFeaturePoints.setColor(index, Color.MAGENTA); + secondaryFeaturePoints.setColor(index, FEATURE_POINT_HIGHLIGHT_COLOR); featurePointTypes.put(fpType, secondaryFeaturePoints.getSize(index)); } else { secondaryFeaturePoints.resetColorToDefault(index); diff --git a/GUI/src/main/java/cz/fidentis/analyst/registration/RegistrationAction.java b/GUI/src/main/java/cz/fidentis/analyst/registration/RegistrationAction.java index 3044b5613023b9e949ddbb5ae226f5a643e421b4..64637be639aeeba8969d28c7a41a3770ec39b33f 100644 --- a/GUI/src/main/java/cz/fidentis/analyst/registration/RegistrationAction.java +++ b/GUI/src/main/java/cz/fidentis/analyst/registration/RegistrationAction.java @@ -29,6 +29,7 @@ import javax.vecmath.Vector3d; * * @author Richard Pajersky * @author Radek Oslejsek + * @author Daniel Schramm */ public class RegistrationAction extends ControlPanelAction { @@ -42,6 +43,7 @@ public class RegistrationAction extends ControlPanelAction { private HausdorffDistance hdVisitor = null; private String strategy = RegistrationPanel.STRATEGY_POINT_TO_POINT; private boolean relativeDist = false; + private boolean heatmapRender = false; /* * Coloring threshold and statistical values of feature point distances: @@ -59,6 +61,22 @@ public class RegistrationAction extends ControlPanelAction { public RegistrationAction(Canvas canvas, JTabbedPane topControlPanel) { super(canvas, topControlPanel); this.controlPanel = new RegistrationPanel(this); + + // Place control panel to the topControlPanel + topControlPanel.addTab(controlPanel.getName(), controlPanel.getIcon(), controlPanel); + topControlPanel.addChangeListener(e -> { + // If the registration panel is focused... + if (((JTabbedPane) e.getSource()).getSelectedComponent() instanceof RegistrationPanel) { + // ... display heatmap and feature points relevant to the registration + getCanvas().getScene().setDefaultColors(); + calculateFeaturePoints(); + setHeatmap(); + getSecondaryDrawableFace().setRenderHeatmap(heatmapRender); + renderScene(); + } + }); + topControlPanel.setSelectedComponent(controlPanel); // Focus registration panel + calculateHausdorffDistance(); } @Override @@ -67,15 +85,6 @@ public class RegistrationAction extends ControlPanelAction { String action = ae.getActionCommand(); switch (action) { - case RegistrationPanel.ACTION_COMMAND_SHOW_HIDE_PANEL: - hideShowPanelActionPerformed(ae, this.controlPanel); - if (((JToggleButton) ae.getSource()).isSelected()) { - calculateFeaturePoints(); // color points - calculateHausdorffDistance(); - } else { - this.getCanvas().getScene().setDefaultColors(); - } - break; case RegistrationPanel.ACTION_COMMAND_APPLY_ICP: applyICP(); calculateFeaturePoints(); @@ -225,10 +234,11 @@ public class RegistrationAction extends ControlPanelAction { if (((JToggleButton) ae.getSource()).isSelected()) { calculateHausdorffDistance(); setHeatmap(); - getSecondaryDrawableFace().setRenderHeatmap(true); + heatmapRender = true; } else { - getSecondaryDrawableFace().setRenderHeatmap(false); + heatmapRender = false; } + getSecondaryDrawableFace().setRenderHeatmap(heatmapRender); break; case RegistrationPanel.ACTION_COMMAND_HD_STRATEGY: strategy = (String) ((JComboBox) ae.getSource()).getSelectedItem(); @@ -283,7 +293,7 @@ public class RegistrationAction extends ControlPanelAction { /** * Calculates feature points which are too far away - * and changes their color to red + * and changes their color to green * otherwise set color to default */ private void calculateFeaturePoints() { diff --git a/GUI/src/main/java/cz/fidentis/analyst/toolbar/FaceToFaceToolBar.java b/GUI/src/main/java/cz/fidentis/analyst/toolbar/FaceToFaceToolBar.java index 9df7b46ba231f59ed54401e0ea5db6a08a0f2ef6..5bed74a2a6f43f84d0f4f6692490452d3418ef6e 100644 --- a/GUI/src/main/java/cz/fidentis/analyst/toolbar/FaceToFaceToolBar.java +++ b/GUI/src/main/java/cz/fidentis/analyst/toolbar/FaceToFaceToolBar.java @@ -1,19 +1,15 @@ package cz.fidentis.analyst.toolbar; import cz.fidentis.analyst.canvas.Canvas; -import cz.fidentis.analyst.core.ControlPanel; import cz.fidentis.analyst.distance.DistanceAction; -import cz.fidentis.analyst.distance.DistancePanel; import cz.fidentis.analyst.registration.RegistrationAction; -import cz.fidentis.analyst.registration.RegistrationPanel; import javax.swing.JTabbedPane; -import javax.swing.JToggleButton; -import org.openide.util.NbBundle; /** * A toolbar extension for the analysis of two faces. * * @author Radek Oslejsek + * @author Daniel Schramm */ public class FaceToFaceToolBar extends RenderingToolBar { @@ -27,28 +23,9 @@ public class FaceToFaceToolBar extends RenderingToolBar { super(canvas); addPrimaryFaceButton(); addSecondaryFaceButton(); - addSeparator(); - addDistanceButton(controlPanel); - addRegistrationButton(controlPanel); - } - - private void addDistanceButton(JTabbedPane controlPanel) { - JToggleButton button = new JToggleButton(); - button.addActionListener(new DistanceAction(getCanvas(), controlPanel)); - button.setActionCommand(ControlPanel.ACTION_COMMAND_SHOW_HIDE_PANEL); - button.setIcon(DistancePanel.getStaticIcon()); - button.setToolTipText(NbBundle.getMessage(RenderingToolBar.class, "FaceToFaceToolBar.distance.text")); - add(button); - button.doClick(); // show - } - - private void addRegistrationButton(JTabbedPane controlPanel) { - JToggleButton button = new JToggleButton(); - button.addActionListener(new RegistrationAction(getCanvas(), controlPanel)); - button.setActionCommand(ControlPanel.ACTION_COMMAND_SHOW_HIDE_PANEL); - button.setIcon(RegistrationPanel.getStaticIcon()); - button.setToolTipText(NbBundle.getMessage(RenderingToolBar.class, "FaceToFaceToolBar.registration.text")); - add(button); - button.doClick(); // show + // Add distance panel to the control panel + new DistanceAction(getCanvas(), controlPanel); + // Add registration panel to the control panel + new RegistrationAction(getCanvas(), controlPanel); } }