Commit 340bb27c authored by Radek Ošlejšek's avatar Radek Ošlejšek
Browse files

Improved curvature coontrol panel

parent 610bcda4
Loading
Loading
Loading
Loading
+53 −0
Original line number Diff line number Diff line
@@ -14,9 +14,11 @@ import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import javax.swing.Box;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFormattedTextField;
import javax.swing.JLabel;
import javax.swing.JPanel;
@@ -250,6 +252,57 @@ public class ControlPanelBuilder {
        return retButtons;
    }
    
    /**
     * Adds a combo box
     * @param items Items
     * @param action Action listener invoked when some item is selected
     * @return 
     */
    public JComboBox addComboBox(List<String> items, ActionListener action) {
        GridBagConstraints c = new GridBagConstraints();
        c.insets = new Insets(0, 25, 0, 0);
        c.gridwidth = OPTION_TEXT_WIDTH;
        c.gridy = row;
        c.gridx = col;
        col += OPTION_TEXT_WIDTH;
        c.anchor = GridBagConstraints.CENTER;
        c.fill = GridBagConstraints.NONE;
        
        JComboBox cbox = new JComboBox(items.toArray(String[]::new));
        cbox.addActionListener(action);
        controlPanel.add(cbox, c);
        
        return cbox;
    }
    
    /**
     * Adds a horizontal strut that moves upper lines to the top of the panel
     */
    public void addVerticalStrut() {
        GridBagConstraints c = new GridBagConstraints();
        c.weighty = 1.0;
        c.gridwidth = 1;
        c.gridy = row;
        c.gridx = col++;
        c.anchor = GridBagConstraints.CENTER;
        c.fill = GridBagConstraints.BOTH;
        controlPanel.add(Box.createHorizontalStrut(5), c);
    }
    
    /**
     * Adds a gap occupying given number of grid cells
     */
    public void addGap() {
        GridBagConstraints c = new GridBagConstraints();
        c.weightx = 0.4;
        c.gridwidth = 1;
        c.gridy = row;
        c.gridx = col++;
        c.anchor = GridBagConstraints.CENTER;
        c.fill = GridBagConstraints.HORIZONTAL;
        controlPanel.add(Box.createVerticalStrut(5), c);
    }
    
    /**
     * Adds a check box.
     * 
+34 −5
Original line number Diff line number Diff line
package cz.fidentis.analyst.curvature;

import cz.fidentis.analyst.canvas.Canvas;
import static cz.fidentis.analyst.curvature.CurvaturePanel.GAUSSIAN_CURVATURE;
import cz.fidentis.analyst.mesh.core.MeshFacet;
import cz.fidentis.analyst.visitors.mesh.Curvature;
import java.awt.event.ActionEvent;
import java.util.List;
import java.util.Map;
import javax.swing.AbstractAction;
import javax.swing.JComboBox;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JToggleButton;
@@ -20,12 +22,14 @@ public class CurvatureAction extends AbstractAction {
    
    public static final String ACTION_COMMAND_SHOW_HIDE_PANEL = "show-hide curvature control panel";
    public static final String ACTION_COMMAND_SHOW_HIDE_HEATMAP = "show-hide heatmap";
    public static final String ACTION_COMMAND_SET_CURVATURE_TYPE = "set curvature type";
    
    private final CurvaturePanel controlPanel;
    private final JTabbedPane topControlPanel;
    private final Canvas canvas;
    
    private Curvature curvatureVisitor = null;
    private String curvatureType = CurvaturePanel.GAUSSIAN_CURVATURE;
    
    /**
     * Constructor.
@@ -56,19 +60,44 @@ public class CurvatureAction extends AbstractAction {
                break;
            case ACTION_COMMAND_SHOW_HIDE_HEATMAP:
                if (((JToggleButton) ae.getSource()).isSelected()) {
                    if (curvatureVisitor == null) { // compute missing curvature
                        this.curvatureVisitor = new Curvature();
                        canvas.getScene().getDrawableFace(0).getModel().compute(curvatureVisitor);
                        canvas.getScene().getDrawableFace(0).setHeatMap(curvatureVisitor.getGaussianCurvatures());
                    }
                    setHeatmap();
                    canvas.getScene().getDrawableFace(0).setRenderHeatmap(true);
                } else {
                    canvas.getScene().getDrawableFace(0).setRenderHeatmap(false);
                }
                break;
            case ACTION_COMMAND_SET_CURVATURE_TYPE:
                this.curvatureType = (String) ((JComboBox) ae.getSource()).getSelectedItem();
                setHeatmap();
                break;
            default:
                throw new UnsupportedOperationException(action);
        }
        canvas.renderScene();
    }
    
    protected void setHeatmap() {
        if (curvatureVisitor == null) { // compute missing curvature
            this.curvatureVisitor = new Curvature();
            canvas.getScene().getDrawableFace(0).getModel().compute(curvatureVisitor);
        }
        
        switch (this.curvatureType) {
            case CurvaturePanel.GAUSSIAN_CURVATURE:
                    canvas.getScene().getDrawableFace(0).setHeatMap(curvatureVisitor.getGaussianCurvatures());
                break;
            case CurvaturePanel.MEAN_CURVATURE:
                    canvas.getScene().getDrawableFace(0).setHeatMap(curvatureVisitor.getMeanCurvatures());
                break;
            case CurvaturePanel.MIN_CURVATURE:
                    canvas.getScene().getDrawableFace(0).setHeatMap(curvatureVisitor.getMinPrincipalCurvatures());
                break;
            case CurvaturePanel.MAX_CURVATURE:
                    canvas.getScene().getDrawableFace(0).setHeatMap(curvatureVisitor.getMaxPrincipalCurvatures());
                break;
            default:
                throw new UnsupportedOperationException(curvatureType);
        }
        
    }
}
+17 −1
Original line number Diff line number Diff line
@@ -2,6 +2,7 @@ package cz.fidentis.analyst.curvature;

import cz.fidentis.analyst.core.ControlPanelBuilder;
import java.awt.event.ActionEvent;
import java.util.List;
import javax.swing.ImageIcon;

/**
@@ -14,6 +15,11 @@ public class CurvaturePanel extends javax.swing.JPanel {
    public static final ImageIcon ICON = new ImageIcon(CurvaturePanel.class.getClassLoader().getResource("/curvature28x28.png"));
    public static final String NAME = "Curvature";
    
    public static final String GAUSSIAN_CURVATURE = "Gaussian";
    public static final String MEAN_CURVATURE = "Mean";
    public static final String MIN_CURVATURE = "Min";
    public static final String MAX_CURVATURE = "Max";
    
    //private final JCheckBox showCurvature;
   
    public CurvaturePanel(CurvatureAction curvAction) {
@@ -30,7 +36,17 @@ public class CurvaturePanel extends javax.swing.JPanel {
                            CurvatureAction.ACTION_COMMAND_SHOW_HIDE_HEATMAP)
                    ); 
                });
        builder.addComboBox(List.of(GAUSSIAN_CURVATURE, MEAN_CURVATURE, MIN_CURVATURE, MAX_CURVATURE), 
                (ActionEvent e) -> {                    
                    curvAction.actionPerformed(new ActionEvent(
                            e.getSource(), 
                            ActionEvent.ACTION_PERFORMED, 
                            CurvatureAction.ACTION_COMMAND_SET_CURVATURE_TYPE)
                    ); 
                });
        builder.addGap();
        builder.addLine();
        builder.addVerticalStrut();
    }
    
}
+0 −4
Original line number Diff line number Diff line
@@ -57,10 +57,6 @@ public class RenderingToolBar extends JToolBar {
    private void addRenderingModeButton() {
        JPopupMenu popup = new JPopupMenu();
        
        //JMenuItem menuItem1 = new JMenuItem(new RenderingModeAction(canvas));
        //JMenuItem menuItem2 = new JMenuItem(new WireframeRenderingAction(canvas));
        //JMenuItem menuItem3 = new JMenuItem(new PointCloudRenderingAction(canvas));
        
        JMenuItem menuItem1 = new JMenuItem(new RenderingModeAction(canvas));
        JMenuItem menuItem2 = new JMenuItem(new RenderingModeAction(canvas));
        JMenuItem menuItem3 = new JMenuItem(new RenderingModeAction(canvas));