From d71d76fb29630484f3c0a90f9f49ba8ef9e9d6d3 Mon Sep 17 00:00:00 2001 From: Natalia Bebjakova <xbebjak@fi.muni.cz> Date: Fri, 8 May 2020 10:12:38 +0200 Subject: [PATCH] gui changes --- .../java/cz/fidentis/analyst/gui/Canvas.form | 30 +- .../java/cz/fidentis/analyst/gui/Canvas.java | 63 +- .../analyst/gui/GeneralGLEventListener.java | 31 +- .../fidentis/analyst/gui/SymmetryPanel.form | 338 ++++++---- .../fidentis/analyst/gui/SymmetryPanel.java | 500 ++++++++------ .../fidentis/analyst/gui/UserInterface.form | 627 +++++++++--------- .../fidentis/analyst/gui/UserInterface.java | 608 ++++++++--------- .../fidentis/analyst/gui/resources/angle.png | Bin 0 -> 7607 bytes .../fidentis/analyst/gui/resources/close.png | Bin 2540 -> 2377 bytes .../analyst/gui/resources/compareTwoFaces.svg | 85 +++ .../analyst/gui/resources/curvature.png | Bin 0 -> 7626 bytes .../analyst/gui/resources/distance.png | Bin 0 -> 6812 bytes .../fidentis/analyst/gui/resources/home.png | Bin 2419 -> 2360 bytes .../fidentis/analyst/gui/resources/info.png | Bin 0 -> 2431 bytes .../fidentis/analyst/gui/resources/info2.png | Bin 0 -> 2446 bytes .../analyst/gui/resources/minimize2.png | Bin 0 -> 2421 bytes .../gui/resources/navigationBackground.png | Bin 2153 -> 2339 bytes .../fidentis/analyst/gui/resources/newP.png | Bin 0 -> 3927 bytes .../gui/resources/new_project_opened.png | Bin 3713 -> 4158 bytes .../fidentis/analyst/gui/resources/points.png | Bin 0 -> 6295 bytes .../fidentis/analyst/gui/resources/save.png | Bin 0 -> 2472 bytes .../fidentis/analyst/gui/resources/show.png | Bin 0 -> 2665 bytes .../fidentis/analyst/gui/resources/show2.png | Bin 0 -> 2638 bytes .../analyst/gui/resources/wireframe2.png | Bin 0 -> 3857 bytes .../analyst/symmetry/BoundingBox.java | 5 +- .../cz/fidentis/analyst/symmetry/Config.java | 24 +- .../cz/fidentis/analyst/symmetry/Plane.java | 15 +- ...tryCounter.java => SymmetryEstimator.java} | 193 +++--- MeshModel/pom.xml | 6 + .../fidentis/analyst/mesh/core/MeshPoint.java | 1 - .../analyst/mesh/io/MeshModelExporter.java | 219 ------ .../analyst/mesh/io/MeshObjExporter.java | 119 ++++ .../analyst/mesh/io/ModelFileFilter.java | 31 +- 33 files changed, 1532 insertions(+), 1363 deletions(-) create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/resources/angle.png create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/resources/compareTwoFaces.svg create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/resources/curvature.png create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/resources/distance.png create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/resources/info.png create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/resources/info2.png create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/resources/minimize2.png create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/resources/newP.png create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/resources/points.png create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/resources/save.png create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/resources/show.png create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/resources/show2.png create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/resources/wireframe2.png rename GUI/src/main/java/cz/fidentis/analyst/symmetry/{SymmetryCounter.java => SymmetryEstimator.java} (82%) delete mode 100644 MeshModel/src/main/java/cz/fidentis/analyst/mesh/io/MeshModelExporter.java create mode 100644 MeshModel/src/main/java/cz/fidentis/analyst/mesh/io/MeshObjExporter.java diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/Canvas.form b/GUI/src/main/java/cz/fidentis/analyst/gui/Canvas.form index f2b81b26..45e7ae46 100644 --- a/GUI/src/main/java/cz/fidentis/analyst/gui/Canvas.form +++ b/GUI/src/main/java/cz/fidentis/analyst/gui/Canvas.form @@ -48,6 +48,7 @@ <Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor"> <Image iconType="3" name="/cz/fidentis/analyst/gui/resources/resetButton.png"/> </Property> + <Property name="toolTipText" type="java.lang.String" value="Reset position of model"/> <Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor"> <Color id="Hand Cursor"/> </Property> @@ -59,7 +60,7 @@ </Events> <Constraints> <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="60" y="70" width="30" height="30"/> + <AbsoluteConstraints x="60" y="40" width="30" height="30"/> </Constraint> </Constraints> </Component> @@ -68,6 +69,7 @@ <Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor"> <Image iconType="3" name="/cz/fidentis/analyst/gui/resources/upButton.png"/> </Property> + <Property name="toolTipText" type="java.lang.String" value="Rotate up"/> <Property name="borderPainted" type="boolean" value="false"/> <Property name="contentAreaFilled" type="boolean" value="false"/> <Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor"> @@ -83,7 +85,7 @@ </AuxValues> <Constraints> <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="60" y="40" width="30" height="30"/> + <AbsoluteConstraints x="60" y="10" width="30" height="30"/> </Constraint> </Constraints> </Component> @@ -92,6 +94,7 @@ <Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor"> <Image iconType="3" name="/cz/fidentis/analyst/gui/resources/leftButton.png"/> </Property> + <Property name="toolTipText" type="java.lang.String" value="Rotate left"/> <Property name="borderPainted" type="boolean" value="false"/> <Property name="contentAreaFilled" type="boolean" value="false"/> <Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor"> @@ -107,7 +110,7 @@ </AuxValues> <Constraints> <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="30" y="70" width="30" height="30"/> + <AbsoluteConstraints x="30" y="40" width="30" height="30"/> </Constraint> </Constraints> </Component> @@ -116,6 +119,7 @@ <Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor"> <Image iconType="3" name="/cz/fidentis/analyst/gui/resources/minus.png"/> </Property> + <Property name="toolTipText" type="java.lang.String" value="Zoom out"/> <Property name="borderPainted" type="boolean" value="false"/> <Property name="contentAreaFilled" type="boolean" value="false"/> <Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor"> @@ -131,7 +135,7 @@ </AuxValues> <Constraints> <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="80" y="130" width="30" height="30"/> + <AbsoluteConstraints x="90" y="90" width="30" height="30"/> </Constraint> </Constraints> </Component> @@ -140,6 +144,7 @@ <Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor"> <Image iconType="3" name="/cz/fidentis/analyst/gui/resources/downButton.png"/> </Property> + <Property name="toolTipText" type="java.lang.String" value="Rotate down"/> <Property name="borderPainted" type="boolean" value="false"/> <Property name="contentAreaFilled" type="boolean" value="false"/> <Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor"> @@ -155,7 +160,7 @@ </AuxValues> <Constraints> <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="60" y="100" width="30" height="30"/> + <AbsoluteConstraints x="60" y="70" width="30" height="30"/> </Constraint> </Constraints> </Component> @@ -164,6 +169,7 @@ <Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor"> <Image iconType="3" name="/cz/fidentis/analyst/gui/resources/plus.png"/> </Property> + <Property name="toolTipText" type="java.lang.String" value="Zoom in"/> <Property name="borderPainted" type="boolean" value="false"/> <Property name="contentAreaFilled" type="boolean" value="false"/> <Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor"> @@ -179,7 +185,7 @@ </AuxValues> <Constraints> <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="40" y="130" width="30" height="30"/> + <AbsoluteConstraints x="30" y="90" width="30" height="30"/> </Constraint> </Constraints> </Component> @@ -191,7 +197,7 @@ </Properties> <Constraints> <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="30" y="40" width="90" height="90"/> + <AbsoluteConstraints x="30" y="10" width="90" height="90"/> </Constraint> </Constraints> </Component> @@ -200,6 +206,7 @@ <Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor"> <Image iconType="3" name="/cz/fidentis/analyst/gui/resources/loadCanva.png"/> </Property> + <Property name="toolTipText" type="java.lang.String" value=""/> <Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor"> <Color id="Hand Cursor"/> </Property> @@ -220,6 +227,7 @@ <Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor"> <Image iconType="3" name="/cz/fidentis/analyst/gui/resources/rightButton.png"/> </Property> + <Property name="toolTipText" type="java.lang.String" value="Rotate right"/> <Property name="borderPainted" type="boolean" value="false"/> <Property name="contentAreaFilled" type="boolean" value="false"/> <Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor"> @@ -235,7 +243,7 @@ </AuxValues> <Constraints> <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="90" y="70" width="30" height="30"/> + <AbsoluteConstraints x="90" y="40" width="30" height="30"/> </Constraint> </Constraints> </Component> @@ -244,6 +252,7 @@ <Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor"> <Image iconType="3" name="/cz/fidentis/analyst/gui/resources/whiteBackroundCanvas.png"/> </Property> + <Property name="toolTipText" type="java.lang.String" value="White backround"/> <Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor"> <Color id="Hand Cursor"/> </Property> @@ -253,7 +262,7 @@ </Events> <Constraints> <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="50" y="170" width="-1" height="-1"/> + <AbsoluteConstraints x="50" y="130" width="-1" height="-1"/> </Constraint> </Constraints> </Component> @@ -262,6 +271,7 @@ <Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor"> <Image iconType="3" name="/cz/fidentis/analyst/gui/resources/blackBackroundCanvas.png"/> </Property> + <Property name="toolTipText" type="java.lang.String" value="Dark background"/> <Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor"> <Color id="Hand Cursor"/> </Property> @@ -271,7 +281,7 @@ </Events> <Constraints> <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="50" y="240" width="-1" height="-1"/> + <AbsoluteConstraints x="50" y="190" width="-1" height="-1"/> </Constraint> </Constraints> </Component> diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/Canvas.java b/GUI/src/main/java/cz/fidentis/analyst/gui/Canvas.java index ed28c4df..0715b036 100644 --- a/GUI/src/main/java/cz/fidentis/analyst/gui/Canvas.java +++ b/GUI/src/main/java/cz/fidentis/analyst/gui/Canvas.java @@ -1,15 +1,16 @@ package cz.fidentis.analyst.gui; import cz.fidentis.analyst.mesh.io.ModelFileFilter; +import cz.fidentis.analyst.mesh.core.MeshModel; +import cz.fidentis.analyst.mesh.io.MeshObjLoader; import javax.media.opengl.GLCapabilities; import javax.media.opengl.GLProfile; import javax.media.opengl.awt.GLCanvas; import com.jogamp.opengl.util.FPSAnimator; -import cz.fidentis.analyst.mesh.core.MeshModel; -import cz.fidentis.analyst.mesh.io.MeshObjLoader; import java.awt.Color; import java.awt.Cursor; import java.awt.Dimension; +import java.awt.image.BufferedImage; import java.io.File; import java.util.Timer; import java.util.TimerTask; @@ -19,7 +20,7 @@ import javax.swing.JOptionPane; /** * - * @author Natalia Bebjakova + * @author Natália Bebjaková * * Canvas for displaying models containing GLCanvas and navigation. */ @@ -47,7 +48,17 @@ public class Canvas extends javax.swing.JPanel { * original model that is loaded from file */ protected MeshModel loadedModel; - + + protected boolean loaded; + + /** + * + * @return true if model is loaded on canvas, false otherwise + */ + public boolean isLoaded() { + return loaded; + } + /** * Creates new form Canva */ @@ -179,15 +190,22 @@ public class Canvas extends javax.swing.JPanel { listener.setModel(model); listener.rotationAndSizeRestart(); loadModelButton.setVisible(false); + loaded = true; } } catch (Exception e) { System.out.println(e.getMessage()); JOptionPane.showMessageDialog(this, "File doesn't contain any model", "Model is not loaded.", 0, new ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/notLoadedModel.png"))); System.out.println ("File doesn't contain any model"); - - }; - + loaded = false; + }; + } + + /** + * reset position of the displayed model + */ + public void resetPosition(){ + listener.rotationAndSizeRestart(); } /** @@ -208,6 +226,7 @@ public class Canvas extends javax.swing.JPanel { public MeshModel getModel() { return listener.getModel(); } + /** * This method is called from within the constructor to initialize the form. @@ -250,6 +269,7 @@ public class Canvas extends javax.swing.JPanel { }); resetButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/resetButton.png"))); // NOI18N + resetButton.setToolTipText("Reset position of model"); resetButton.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); resetButton.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { public void mouseMoved(java.awt.event.MouseEvent evt) { @@ -265,9 +285,10 @@ public class Canvas extends javax.swing.JPanel { } }); jLayeredPane1.add(resetButton); - resetButton.setBounds(60, 70, 30, 30); + resetButton.setBounds(60, 40, 30, 30); upNavigationButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/upButton.png"))); // NOI18N + upNavigationButton.setToolTipText("Rotate up"); upNavigationButton.setBorderPainted(false); upNavigationButton.setContentAreaFilled(false); upNavigationButton.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); @@ -281,9 +302,10 @@ public class Canvas extends javax.swing.JPanel { }); jLayeredPane1.setLayer(upNavigationButton, javax.swing.JLayeredPane.MODAL_LAYER); jLayeredPane1.add(upNavigationButton); - upNavigationButton.setBounds(60, 40, 30, 30); + upNavigationButton.setBounds(60, 10, 30, 30); leftNavigationButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/leftButton.png"))); // NOI18N + leftNavigationButton.setToolTipText("Rotate left"); leftNavigationButton.setBorderPainted(false); leftNavigationButton.setContentAreaFilled(false); leftNavigationButton.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); @@ -297,9 +319,10 @@ public class Canvas extends javax.swing.JPanel { }); jLayeredPane1.setLayer(leftNavigationButton, javax.swing.JLayeredPane.MODAL_LAYER); jLayeredPane1.add(leftNavigationButton); - leftNavigationButton.setBounds(30, 70, 30, 30); + leftNavigationButton.setBounds(30, 40, 30, 30); minusNavigationButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/minus.png"))); // NOI18N + minusNavigationButton.setToolTipText("Zoom out"); minusNavigationButton.setBorderPainted(false); minusNavigationButton.setContentAreaFilled(false); minusNavigationButton.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); @@ -313,9 +336,10 @@ public class Canvas extends javax.swing.JPanel { }); jLayeredPane1.setLayer(minusNavigationButton, javax.swing.JLayeredPane.MODAL_LAYER); jLayeredPane1.add(minusNavigationButton); - minusNavigationButton.setBounds(80, 130, 30, 30); + minusNavigationButton.setBounds(90, 90, 30, 30); downNavigationButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/downButton.png"))); // NOI18N + downNavigationButton.setToolTipText("Rotate down"); downNavigationButton.setBorderPainted(false); downNavigationButton.setContentAreaFilled(false); downNavigationButton.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); @@ -329,9 +353,10 @@ public class Canvas extends javax.swing.JPanel { }); jLayeredPane1.setLayer(downNavigationButton, javax.swing.JLayeredPane.MODAL_LAYER); jLayeredPane1.add(downNavigationButton); - downNavigationButton.setBounds(60, 100, 30, 30); + downNavigationButton.setBounds(60, 70, 30, 30); plusNavigationButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/plus.png"))); // NOI18N + plusNavigationButton.setToolTipText("Zoom in"); plusNavigationButton.setBorderPainted(false); plusNavigationButton.setContentAreaFilled(false); plusNavigationButton.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); @@ -345,13 +370,14 @@ public class Canvas extends javax.swing.JPanel { }); jLayeredPane1.setLayer(plusNavigationButton, javax.swing.JLayeredPane.MODAL_LAYER); jLayeredPane1.add(plusNavigationButton); - plusNavigationButton.setBounds(40, 130, 30, 30); + plusNavigationButton.setBounds(30, 90, 30, 30); jLabel1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/navigBackground.png"))); // NOI18N jLayeredPane1.add(jLabel1); - jLabel1.setBounds(30, 40, 90, 90); + jLabel1.setBounds(30, 10, 90, 90); loadModelButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/loadCanva.png"))); // NOI18N + loadModelButton.setToolTipText(""); loadModelButton.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); loadModelButton.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { public void mouseMoved(java.awt.event.MouseEvent evt) { @@ -370,6 +396,7 @@ public class Canvas extends javax.swing.JPanel { loadModelButton.setBounds(200, 100, 210, 220); rightNavigationButton1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/rightButton.png"))); // NOI18N + rightNavigationButton1.setToolTipText("Rotate right"); rightNavigationButton1.setBorderPainted(false); rightNavigationButton1.setContentAreaFilled(false); rightNavigationButton1.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); @@ -383,9 +410,10 @@ public class Canvas extends javax.swing.JPanel { }); jLayeredPane1.setLayer(rightNavigationButton1, javax.swing.JLayeredPane.MODAL_LAYER); jLayeredPane1.add(rightNavigationButton1); - rightNavigationButton1.setBounds(90, 70, 30, 30); + rightNavigationButton1.setBounds(90, 40, 30, 30); whiteBackroundButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/whiteBackroundCanvas.png"))); // NOI18N + whiteBackroundButton.setToolTipText("White backround"); whiteBackroundButton.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); whiteBackroundButton.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { @@ -393,9 +421,10 @@ public class Canvas extends javax.swing.JPanel { } }); jLayeredPane1.add(whiteBackroundButton); - whiteBackroundButton.setBounds(50, 170, 0, 0); + whiteBackroundButton.setBounds(50, 130, 56, 56); blackBackroundButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/blackBackroundCanvas.png"))); // NOI18N + blackBackroundButton.setToolTipText("Dark background"); blackBackroundButton.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); blackBackroundButton.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { @@ -403,7 +432,7 @@ public class Canvas extends javax.swing.JPanel { } }); jLayeredPane1.add(blackBackroundButton); - blackBackroundButton.setBounds(50, 240, 0, 0); + blackBackroundButton.setBounds(50, 190, 56, 56); jPanel1.setBackground(new java.awt.Color(0, 0, 0)); jPanel1.addMouseWheelListener(new java.awt.event.MouseWheelListener() { diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/GeneralGLEventListener.java b/GUI/src/main/java/cz/fidentis/analyst/gui/GeneralGLEventListener.java index e115177d..24566d99 100644 --- a/GUI/src/main/java/cz/fidentis/analyst/gui/GeneralGLEventListener.java +++ b/GUI/src/main/java/cz/fidentis/analyst/gui/GeneralGLEventListener.java @@ -1,7 +1,7 @@ package cz.fidentis.analyst.gui; -import cz.fidentis.analyst.mesh.core.MeshFacet; import cz.fidentis.analyst.mesh.core.MeshModel; +import cz.fidentis.analyst.mesh.core.MeshFacet; import javax.media.opengl.GL; import static javax.media.opengl.GL.GL_DEPTH_TEST; import static javax.media.opengl.GL.GL_FRONT_AND_BACK; @@ -19,7 +19,7 @@ import javax.vecmath.Vector3f; /** * - * @author Natalia Bebjakova + * @author Natália Bebjaková */ public class GeneralGLEventListener implements GLEventListener { /** @@ -78,10 +78,6 @@ public class GeneralGLEventListener implements GLEventListener { * Decides if model is diplayed as wire-frame */ protected boolean wireModel = false; - /** - * Decides if model is diplayed with textures - */ - protected boolean drawTextures = false; /** * Decides if the backround will be white */ @@ -127,14 +123,6 @@ public class GeneralGLEventListener implements GLEventListener { wireModel = drawWire; } - /** - * - * @param drawTextures Decides if model is displayed with textures - */ - public void setDrawTextures(boolean drawTextures) { - this.drawTextures = drawTextures; - } - /** * * @param whiteBackround Is backround white or not @@ -215,7 +203,7 @@ public class GeneralGLEventListener implements GLEventListener { } else { gl.glClearColor(0.25f,0.25f,0.25f,0); } - // background for GLCanvas + // background for GLCanvas gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); gl.glLoadIdentity(); @@ -236,13 +224,15 @@ public class GeneralGLEventListener implements GLEventListener { gl.glPolygonMode( GL_FRONT_AND_BACK, GL_FILL); // drawn as full traingles drawWithoutTextures(model); } - } - gl.glPopMatrix(); + } + + //gl.glPopMatrix(); gl.glFlush(); } /** * Loops through the facets and render each of them + * * @param model model of the face */ public void drawWithoutTextures(MeshModel model) { @@ -253,6 +243,7 @@ public class GeneralGLEventListener implements GLEventListener { /** * Loops through the facet and render all the vertices as they are stored in corner table + * * @param facet facet of model */ public void renderFacet(MeshFacet facet) { @@ -270,6 +261,7 @@ public class GeneralGLEventListener implements GLEventListener { gl.glVertex3d(vert.x, vert.y, vert.z); } gl.glEnd(); + } /** @@ -278,7 +270,7 @@ public class GeneralGLEventListener implements GLEventListener { * @param x x * @param y y * @param width New width - * @param height New Height + * @param height New height */ @Override public void reshape(GLAutoDrawable glad, int x, int y, int width, int height) { @@ -313,7 +305,6 @@ public class GeneralGLEventListener implements GLEventListener { zCameraPosition = defaultPosition.z; xCameraPosition = defaultPosition.x; yCameraPosition = defaultPosition.y; - } /** @@ -379,7 +370,7 @@ public class GeneralGLEventListener implements GLEventListener { * @return Y axis */ private Vector3f getYaxis() { - Vector3f yAxis = new Vector3f((float) xUpPosition, (float) yUpPosition, (float) zUpPosition); + Vector3f yAxis = new Vector3f((float) xUpPosition, (float) yUpPosition, (float) zUpPosition); float length = (float) Math.sqrt(yAxis.x * yAxis.x + yAxis.y * yAxis.y + yAxis.z * yAxis.z); yAxis.set((yAxis.x / length), (yAxis.y / length), (yAxis.z / length)); diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/SymmetryPanel.form b/GUI/src/main/java/cz/fidentis/analyst/gui/SymmetryPanel.form index 192c40b3..65d04539 100644 --- a/GUI/src/main/java/cz/fidentis/analyst/gui/SymmetryPanel.form +++ b/GUI/src/main/java/cz/fidentis/analyst/gui/SymmetryPanel.form @@ -16,21 +16,12 @@ <Layout> <DimensionLayout dim="0"> <Group type="103" groupAlignment="0" attributes="0"> - <EmptySpace min="0" pref="580" max="32767" attributes="0"/> - <Group type="103" rootIndex="1" groupAlignment="0" attributes="0"> - <Group type="102" alignment="0" attributes="0"> - <Component id="symetrySpecificationPanel" min="-2" max="-2" attributes="0"/> - <EmptySpace min="0" pref="0" max="32767" attributes="0"/> - </Group> - </Group> + <Component id="symetrySpecificationPanel" alignment="0" max="32767" attributes="0"/> </Group> </DimensionLayout> <DimensionLayout dim="1"> <Group type="103" groupAlignment="0" attributes="0"> - <EmptySpace min="0" pref="554" max="32767" attributes="0"/> - <Group type="103" rootIndex="1" groupAlignment="0" attributes="0"> - <Component id="symetrySpecificationPanel" alignment="0" max="32767" attributes="0"/> - </Group> + <Component id="symetrySpecificationPanel" alignment="0" max="32767" attributes="0"/> </Group> </DimensionLayout> </Layout> @@ -45,155 +36,162 @@ <Layout> <DimensionLayout dim="0"> <Group type="103" groupAlignment="0" attributes="0"> - <Group type="102" alignment="0" attributes="0"> - <EmptySpace min="-2" pref="17" max="-2" attributes="0"/> - <Group type="103" groupAlignment="0" attributes="0"> - <Group type="102" alignment="0" attributes="0"> + <Group type="102" attributes="0"> + <Group type="103" groupAlignment="1" attributes="0"> + <Group type="102" attributes="0"> <EmptySpace min="0" pref="0" max="32767" attributes="0"/> - <Group type="103" groupAlignment="1" attributes="0"> - <Group type="102" alignment="1" attributes="0"> - <Component id="normalAngleSlider" min="-2" pref="200" max="-2" attributes="0"/> - <EmptySpace type="unrelated" max="-2" attributes="0"/> - <Component id="normalTextField" min="-2" pref="46" max="-2" attributes="0"/> - </Group> - <Group type="102" alignment="1" attributes="0"> - <Component id="significantPointSlider" min="-2" max="-2" attributes="0"/> - <EmptySpace type="unrelated" max="-2" attributes="0"/> - <Group type="103" groupAlignment="0" max="-2" attributes="0"> - <Component id="textFieldMinCos" pref="46" max="32767" attributes="0"/> - <Component id="textFieldCurvature" max="32767" attributes="0"/> - <Component id="distanceTextField" max="32767" attributes="0"/> - <Component id="significantTextField" max="32767" attributes="0"/> - </Group> - </Group> - </Group> - <EmptySpace min="-2" pref="63" max="-2" attributes="0"/> + <Component id="defaultValues" min="-2" max="-2" attributes="0"/> </Group> <Group type="102" attributes="0"> + <EmptySpace min="-2" pref="17" max="-2" attributes="0"/> <Group type="103" groupAlignment="0" attributes="0"> - <Component id="minCurvatio" alignment="1" min="-2" max="-2" attributes="0"/> - <Component id="minCurvatio2" alignment="1" min="-2" max="-2" attributes="0"/> - <Component id="minCurvatio4" alignment="1" min="-2" max="-2" attributes="0"/> - <Group type="103" alignment="1" groupAlignment="0" attributes="0"> - <Component id="significantPointLabel" min="-2" max="-2" attributes="0"/> - <Component id="minCurvatio3" min="-2" max="-2" attributes="0"/> + <Group type="102" attributes="0"> + <EmptySpace min="-2" pref="154" max="-2" attributes="0"/> + <Component id="jLabel1" min="-2" max="-2" attributes="0"/> </Group> - <Group type="102" alignment="1" attributes="0"> - <Group type="103" groupAlignment="1" attributes="0"> - <Group type="103" groupAlignment="0" attributes="0"> - <Component id="jLabel1" min="-2" max="-2" attributes="0"/> - <Group type="102" attributes="0"> - <EmptySpace min="-2" pref="80" max="-2" attributes="0"/> - <Component id="minCurvatio8" min="-2" max="-2" attributes="0"/> - <EmptySpace type="unrelated" max="-2" attributes="0"/> - <Component id="averagingCheckBox" min="-2" max="-2" attributes="0"/> - </Group> - </Group> - <Component id="showPlaneLabel" alignment="1" min="-2" max="-2" attributes="0"/> - </Group> - <EmptySpace min="-2" pref="9" max="-2" attributes="0"/> + <Group type="102" attributes="0"> + <Component id="showPlaneLabel" min="-2" pref="147" max="-2" attributes="0"/> + <EmptySpace max="32767" attributes="0"/> + <Component id="originalModelButton" min="-2" pref="181" max="-2" attributes="0"/> </Group> </Group> + </Group> + <Group type="102" attributes="0"> + <EmptySpace max="-2" attributes="0"/> <Group type="103" groupAlignment="0" attributes="0"> - <Group type="102" alignment="1" attributes="0"> + <Group type="102" attributes="0"> + <EmptySpace min="-2" pref="10" max="-2" attributes="0"/> + <Component id="minCurvatio8" min="-2" max="-2" attributes="0"/> + <EmptySpace type="unrelated" max="-2" attributes="0"/> + <Component id="averagingCheckBox" min="-2" max="-2" attributes="0"/> <EmptySpace max="32767" attributes="0"/> + <Component id="symetryButton" min="-2" max="-2" attributes="0"/> + </Group> + <Group type="102" attributes="0"> <Group type="103" groupAlignment="0" attributes="0"> - <Component id="symetryButton" alignment="1" min="-2" max="-2" attributes="0"/> - <Component id="originalModelButton" alignment="1" min="-2" pref="181" max="-2" attributes="0"/> - <Component id="defaultValues" alignment="1" min="-2" max="-2" attributes="0"/> + <Component id="infoMinAngleCos" min="-2" max="-2" attributes="0"/> + <Component id="infoRelDist" alignment="0" min="-2" max="-2" attributes="0"/> + <Component id="infoNormalAngle" alignment="0" min="-2" max="-2" attributes="0"/> + <Component id="infoPoints" alignment="0" min="-2" max="-2" attributes="0"/> + <Component id="infoMinCurv" alignment="0" min="-2" max="-2" attributes="0"/> </Group> - <EmptySpace min="-2" pref="63" max="-2" attributes="0"/> - </Group> - <Group type="102" alignment="0" attributes="0"> - <EmptySpace min="-2" pref="56" max="-2" attributes="0"/> + <EmptySpace max="-2" attributes="0"/> + <Group type="103" groupAlignment="0" attributes="0"> + <Component id="minCurvatio4" pref="157" max="32767" attributes="0"/> + <Group type="102" alignment="0" attributes="0"> + <Group type="103" groupAlignment="0" attributes="0"> + <Component id="minCurvatio" min="-2" max="-2" attributes="0"/> + <Component id="minCurvatio3" min="-2" max="-2" attributes="0"/> + <Component id="minCurvatio2" alignment="0" min="-2" max="-2" attributes="0"/> + <Component id="significantPointLabel" alignment="0" min="-2" max="-2" attributes="0"/> + </Group> + <EmptySpace min="0" pref="0" max="32767" attributes="0"/> + </Group> + </Group> + <EmptySpace max="-2" attributes="0"/> <Group type="103" groupAlignment="1" attributes="0"> - <Component id="angleCosineSlider" alignment="1" min="-2" pref="200" max="-2" attributes="0"/> - <Group type="103" groupAlignment="0" attributes="0"> - <Component id="relativeDistanceSlider" alignment="0" min="-2" pref="200" max="-2" attributes="0"/> - <Component id="curavatureSlider" alignment="0" min="-2" max="-2" attributes="0"/> + <Group type="103" groupAlignment="0" max="-2" attributes="0"> + <Component id="curavatureSlider" alignment="1" pref="0" max="32767" attributes="0"/> + <Component id="relativeDistanceSlider" alignment="1" pref="0" max="32767" attributes="0"/> + <Component id="significantPointSlider" alignment="1" min="-2" pref="164" max="-2" attributes="0"/> + <Component id="angleCosineSlider" alignment="1" min="-2" pref="164" max="-2" attributes="0"/> </Group> + <Component id="normalAngleSlider" min="-2" pref="164" max="-2" attributes="0"/> + </Group> + <EmptySpace type="separate" max="-2" attributes="0"/> + <Group type="103" groupAlignment="0" max="-2" attributes="0"> + <Component id="distanceTextField" max="32767" attributes="0"/> + <Component id="normalTextField" alignment="0" max="32767" attributes="0"/> + <Component id="significantTextField" min="-2" pref="46" max="-2" attributes="0"/> + <Component id="textFieldCurvature" min="-2" pref="46" max="-2" attributes="0"/> + <Component id="textFieldMinCos" min="-2" pref="46" max="-2" attributes="0"/> </Group> - <EmptySpace min="0" pref="122" max="32767" attributes="0"/> </Group> </Group> </Group> </Group> + <EmptySpace max="32767" attributes="0"/> </Group> </Group> </DimensionLayout> <DimensionLayout dim="1"> <Group type="103" groupAlignment="0" attributes="0"> <Group type="102" attributes="0"> - <EmptySpace min="-2" pref="72" max="-2" attributes="0"/> + <EmptySpace max="32767" attributes="0"/> <Group type="103" groupAlignment="1" attributes="0"> - <Group type="102" attributes="0"> - <Group type="103" groupAlignment="0" attributes="0"> - <Group type="103" alignment="0" groupAlignment="0" attributes="0"> - <Component id="minCurvatio" alignment="0" min="-2" pref="26" max="-2" attributes="0"/> - <Component id="textFieldCurvature" alignment="1" min="-2" max="-2" attributes="0"/> - </Group> - <Group type="102" alignment="0" attributes="0"> - <EmptySpace min="-2" pref="4" max="-2" attributes="0"/> - <Component id="curavatureSlider" min="-2" max="-2" attributes="0"/> - </Group> - </Group> - <EmptySpace min="-2" pref="36" max="-2" attributes="0"/> - <Group type="103" groupAlignment="0" attributes="0"> - <Component id="angleCosineSlider" min="-2" max="-2" attributes="0"/> - <Component id="minCurvatio2" min="-2" pref="26" max="-2" attributes="0"/> - </Group> + <Group type="103" alignment="1" groupAlignment="0" attributes="0"> + <Component id="infoPoints" min="-2" max="-2" attributes="0"/> + <Component id="significantPointLabel" min="-2" pref="27" max="-2" attributes="0"/> + </Group> + <Group type="103" alignment="1" groupAlignment="0" attributes="0"> + <Component id="significantTextField" min="-2" max="-2" attributes="0"/> + <Component id="significantPointSlider" min="-2" pref="28" max="-2" attributes="0"/> + </Group> + </Group> + <EmptySpace type="unrelated" max="-2" attributes="0"/> + <Group type="103" groupAlignment="1" attributes="0"> + <Component id="minCurvatio" min="-2" pref="26" max="-2" attributes="0"/> + <Group type="102" alignment="1" attributes="0"> + <Component id="textFieldCurvature" min="-2" max="-2" attributes="0"/> + <EmptySpace min="-2" pref="4" max="-2" attributes="0"/> </Group> - <Component id="textFieldMinCos" min="-2" max="-2" attributes="0"/> + <Component id="infoMinCurv" min="-2" max="-2" attributes="0"/> + <Component id="curavatureSlider" min="-2" pref="26" max="-2" attributes="0"/> </Group> + <EmptySpace type="unrelated" max="-2" attributes="0"/> <Group type="103" groupAlignment="0" attributes="0"> - <Group type="102" attributes="0"> - <EmptySpace type="separate" max="-2" attributes="0"/> - <Component id="minCurvatio4" max="32767" attributes="0"/> - <EmptySpace min="-2" pref="22" max="-2" attributes="0"/> + <Component id="infoMinAngleCos" alignment="1" min="-2" max="-2" attributes="0"/> + <Component id="minCurvatio2" alignment="1" min="-2" pref="26" max="-2" attributes="0"/> + <Component id="textFieldMinCos" alignment="0" min="-2" max="-2" attributes="0"/> + <Component id="angleCosineSlider" min="-2" max="-2" attributes="0"/> + </Group> + <EmptySpace type="unrelated" max="-2" attributes="0"/> + <Group type="103" groupAlignment="0" attributes="0"> + <Group type="102" alignment="0" attributes="0"> + <Group type="103" groupAlignment="0" max="-2" attributes="0"> + <Component id="normalAngleSlider" max="32767" attributes="0"/> + <Component id="normalTextField" max="32767" attributes="0"/> + </Group> + <EmptySpace type="unrelated" min="-2" max="-2" attributes="0"/> + <Component id="distanceTextField" min="-2" max="-2" attributes="0"/> </Group> <Group type="102" alignment="0" attributes="0"> - <EmptySpace min="-2" pref="34" max="-2" attributes="0"/> <Group type="103" groupAlignment="0" attributes="0"> - <Component id="normalTextField" min="-2" max="-2" attributes="0"/> - <Component id="normalAngleSlider" min="-2" pref="30" max="-2" attributes="0"/> + <Component id="minCurvatio4" min="-2" pref="27" max="-2" attributes="0"/> + <Component id="infoNormalAngle" min="-2" max="-2" attributes="0"/> </Group> - <EmptySpace pref="34" max="32767" attributes="0"/> - </Group> - </Group> - <Group type="103" groupAlignment="1" attributes="0"> - <Component id="minCurvatio3" min="-2" pref="26" max="-2" attributes="0"/> - <Group type="103" alignment="1" groupAlignment="0" max="-2" attributes="0"> - <Component id="relativeDistanceSlider" alignment="1" pref="0" max="32767" attributes="0"/> - <Component id="distanceTextField" alignment="1" max="32767" attributes="0"/> + <EmptySpace max="32767" attributes="0"/> + <Group type="103" groupAlignment="0" attributes="0"> + <Component id="infoRelDist" alignment="1" min="-2" max="-2" attributes="0"/> + <Group type="103" alignment="1" groupAlignment="0" attributes="0"> + <Component id="relativeDistanceSlider" min="-2" pref="22" max="-2" attributes="0"/> + <Component id="minCurvatio3" min="-2" pref="26" max="-2" attributes="0"/> + </Group> + </Group> + <EmptySpace min="-2" pref="13" max="-2" attributes="0"/> </Group> </Group> - <EmptySpace pref="31" max="32767" attributes="0"/> - <Group type="103" groupAlignment="0" attributes="0"> - <Component id="significantTextField" alignment="1" min="-2" max="-2" attributes="0"/> - <Component id="significantPointLabel" alignment="1" min="-2" pref="14" max="-2" attributes="0"/> - <Component id="significantPointSlider" alignment="1" min="-2" max="-2" attributes="0"/> - </Group> - <EmptySpace min="-2" pref="14" max="-2" attributes="0"/> <Component id="defaultValues" min="-2" max="-2" attributes="0"/> - <Group type="103" groupAlignment="0" max="-2" attributes="0"> + <EmptySpace min="-2" pref="17" max="-2" attributes="0"/> + <Group type="103" groupAlignment="0" attributes="0"> + <Group type="102" attributes="0"> + <Component id="symetryButton" min="-2" pref="75" max="-2" attributes="0"/> + <EmptySpace max="32767" attributes="0"/> + <Component id="originalModelButton" min="-2" max="-2" attributes="0"/> + <EmptySpace max="32767" attributes="0"/> + </Group> <Group type="102" alignment="0" attributes="0"> <Group type="103" groupAlignment="1" attributes="0"> <Component id="averagingCheckBox" min="-2" max="-2" attributes="0"/> <Component id="minCurvatio8" min="-2" pref="28" max="-2" attributes="0"/> </Group> - <EmptySpace min="-2" pref="65" max="-2" attributes="0"/> + <EmptySpace pref="53" max="32767" attributes="0"/> <Component id="jLabel1" min="-2" max="-2" attributes="0"/> - <EmptySpace max="32767" attributes="0"/> + <EmptySpace min="-2" pref="45" max="-2" attributes="0"/> <Component id="showPlaneLabel" min="-2" max="-2" attributes="0"/> - </Group> - <Group type="102" alignment="0" attributes="0"> - <EmptySpace min="-2" pref="3" max="-2" attributes="0"/> - <Component id="symetryButton" min="-2" pref="75" max="-2" attributes="0"/> - <EmptySpace max="-2" attributes="0"/> - <Component id="originalModelButton" min="-2" max="-2" attributes="0"/> + <EmptySpace pref="27" max="32767" attributes="0"/> </Group> </Group> - <EmptySpace pref="32" max="32767" attributes="0"/> </Group> </Group> </DimensionLayout> @@ -226,7 +224,7 @@ <Component class="javax.swing.JLabel" name="minCurvatio"> <Properties> <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor"> - <Font name="Neue Haas Unica Pro" size="14" style="0"/> + <Font name="Arial" size="14" style="1"/> </Property> <Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> <Color blue="69" green="72" red="14" type="rgb"/> @@ -237,7 +235,7 @@ <Component class="javax.swing.JLabel" name="minCurvatio2"> <Properties> <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor"> - <Font name="Neue Haas Unica Pro" size="14" style="0"/> + <Font name="Arial" size="14" style="1"/> </Property> <Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> <Color blue="69" green="72" red="14" type="rgb"/> @@ -258,12 +256,12 @@ <Component class="javax.swing.JLabel" name="minCurvatio3"> <Properties> <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor"> - <Font name="Neue Haas Unica Pro" size="14" style="0"/> + <Font name="Arial" size="14" style="1"/> </Property> <Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> <Color blue="69" green="72" red="14" type="rgb"/> </Property> - <Property name="text" type="java.lang.String" value="Max. Relative Distance"/> + <Property name="text" type="java.lang.String" value="Relative Distance"/> </Properties> </Component> <Component class="javax.swing.JSlider" name="significantPointSlider"> @@ -280,12 +278,12 @@ <Component class="javax.swing.JLabel" name="minCurvatio4"> <Properties> <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor"> - <Font name="Neue Haas Unica Pro" size="14" style="0"/> + <Font name="Arial" size="14" style="1"/> </Property> <Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> <Color blue="69" green="72" red="14" type="rgb"/> </Property> - <Property name="text" type="java.lang.String" value="Min. Normal Angle Cosine"/> + <Property name="text" type="java.lang.String" value="Normal Angle Cosine"/> </Properties> </Component> <Component class="javax.swing.JSlider" name="relativeDistanceSlider"> @@ -301,12 +299,12 @@ <Component class="javax.swing.JLabel" name="significantPointLabel"> <Properties> <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor"> - <Font name="Neue Haas Unica Pro" size="14" style="0"/> + <Font name="Arial" size="14" style="1"/> </Property> <Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> <Color blue="69" green="72" red="14" type="rgb"/> </Property> - <Property name="text" type="java.lang.String" value="Significant Point Count"/> + <Property name="text" type="java.lang.String" value="Significant Points"/> </Properties> </Component> <Component class="javax.swing.JLabel" name="symetryButton"> @@ -314,6 +312,9 @@ <Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor"> <Image iconType="3" name="/cz/fidentis/analyst/gui/resources/symetryCount.png"/> </Property> + <Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor"> + <Color id="Hand Cursor"/> + </Property> </Properties> <Events> <EventHandler event="mouseMoved" listener="java.awt.event.MouseMotionListener" parameters="java.awt.event.MouseEvent" handler="symetryButtonMouseMoved"/> @@ -332,7 +333,7 @@ </Component> <Component class="javax.swing.JTextField" name="textFieldCurvature"> <Properties> - <Property name="text" type="java.lang.String" value="0.8"/> + <Property name="text" type="java.lang.String" value="0.5"/> <Property name="toolTipText" type="java.lang.String" value=""/> </Properties> </Component> @@ -363,12 +364,13 @@ <Component class="javax.swing.JLabel" name="minCurvatio8"> <Properties> <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor"> - <Font name="Neue Haas Unica Pro" size="14" style="0"/> + <Font name="Arial" size="14" style="1"/> </Property> <Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> <Color blue="69" green="72" red="14" type="rgb"/> </Property> <Property name="text" type="java.lang.String" value="Averaging"/> + <Property name="toolTipText" type="java.lang.String" value="Average planes with highest number of votes"/> </Properties> </Component> <Component class="javax.swing.JLabel" name="jLabel1"> @@ -390,24 +392,30 @@ </Component> <Component class="javax.swing.JLabel" name="showPlaneLabel"> <Properties> + <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor"> + <Font name="Arial" size="16" style="1"/> + </Property> + <Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> + <Color blue="69" green="72" red="14" type="rgb"/> + </Property> <Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor"> - <Image iconType="3" name="/cz/fidentis/analyst/gui/resources/showPlane.png"/> + <Image iconType="3" name="/cz/fidentis/analyst/gui/resources/show2.png"/> </Property> + <Property name="text" type="java.lang.String" value="Show plane"/> + <Property name="toolTipText" type="java.lang.String" value="Show approximate plane of symmetry"/> <Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor"> <Color id="Hand Cursor"/> </Property> <Property name="doubleBuffered" type="boolean" value="true"/> </Properties> <Events> - <EventHandler event="mouseMoved" listener="java.awt.event.MouseMotionListener" parameters="java.awt.event.MouseEvent" handler="showPlaneLabelMouseMoved"/> <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="showPlaneLabelMouseClicked"/> - <EventHandler event="mouseExited" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="showPlaneLabelMouseExited"/> </Events> </Component> <Component class="javax.swing.JLabel" name="defaultValues"> <Properties> <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor"> - <Font name="Neue Haas Unica Pro" size="14" style="0"/> + <Font name="Arial" size="14" style="0"/> </Property> <Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> <Color blue="69" green="72" red="14" type="rgb"/> @@ -421,6 +429,76 @@ <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="defaultValuesMouseClicked"/> </Events> </Component> + <Component class="javax.swing.JLabel" name="infoPoints"> + <Properties> + <Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor"> + <Image iconType="3" name="/cz/fidentis/analyst/gui/resources/info.png"/> + </Property> + <Property name="toolTipText" type="java.lang.String" value="Info "/> + <Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor"> + <Color id="Hand Cursor"/> + </Property> + </Properties> + <Events> + <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="infoPointsMouseClicked"/> + </Events> + </Component> + <Component class="javax.swing.JLabel" name="infoMinAngleCos"> + <Properties> + <Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor"> + <Image iconType="3" name="/cz/fidentis/analyst/gui/resources/info.png"/> + </Property> + <Property name="toolTipText" type="java.lang.String" value="Info "/> + <Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor"> + <Color id="Hand Cursor"/> + </Property> + </Properties> + <Events> + <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="infoMinAngleCosMouseClicked"/> + </Events> + </Component> + <Component class="javax.swing.JLabel" name="infoRelDist"> + <Properties> + <Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor"> + <Image iconType="3" name="/cz/fidentis/analyst/gui/resources/info.png"/> + </Property> + <Property name="toolTipText" type="java.lang.String" value="Info "/> + <Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor"> + <Color id="Hand Cursor"/> + </Property> + </Properties> + <Events> + <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="infoRelDistMouseClicked"/> + </Events> + </Component> + <Component class="javax.swing.JLabel" name="infoNormalAngle"> + <Properties> + <Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor"> + <Image iconType="3" name="/cz/fidentis/analyst/gui/resources/info.png"/> + </Property> + <Property name="toolTipText" type="java.lang.String" value="Info "/> + <Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor"> + <Color id="Hand Cursor"/> + </Property> + </Properties> + <Events> + <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="infoNormalAngleMouseClicked"/> + </Events> + </Component> + <Component class="javax.swing.JLabel" name="infoMinCurv"> + <Properties> + <Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor"> + <Image iconType="3" name="/cz/fidentis/analyst/gui/resources/info.png"/> + </Property> + <Property name="toolTipText" type="java.lang.String" value="Info "/> + <Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor"> + <Color id="Hand Cursor"/> + </Property> + </Properties> + <Events> + <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="infoMinCurvMouseClicked"/> + </Events> + </Component> </SubComponents> </Container> </SubComponents> diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/SymmetryPanel.java b/GUI/src/main/java/cz/fidentis/analyst/gui/SymmetryPanel.java index a276ad3c..2a9889fe 100644 --- a/GUI/src/main/java/cz/fidentis/analyst/gui/SymmetryPanel.java +++ b/GUI/src/main/java/cz/fidentis/analyst/gui/SymmetryPanel.java @@ -4,12 +4,10 @@ import static cz.fidentis.analyst.gui.UserInterface.frameMain; import cz.fidentis.analyst.mesh.core.MeshModel; import cz.fidentis.analyst.symmetry.Config; import cz.fidentis.analyst.symmetry.Plane; -import cz.fidentis.analyst.symmetry.SymmetryCounter; -import java.awt.Cursor; +import cz.fidentis.analyst.symmetry.SymmetryEstimator; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.ImageIcon; -import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JSlider; import javax.swing.JTextField; @@ -23,7 +21,7 @@ import javax.swing.event.ChangeEvent; */ public final class SymmetryPanel extends javax.swing.JPanel { /** - * Configuration with default values + * Configuration with optional parameters of the algorithm */ private Config config; /** @@ -33,7 +31,7 @@ public final class SymmetryPanel extends javax.swing.JPanel { /** * Class that is responsible for computing the symmetry */ - private SymmetryCounter symCounter; + private SymmetryEstimator symCounter; /** * Computed approximate plane of the symmetry */ @@ -41,13 +39,14 @@ public final class SymmetryPanel extends javax.swing.JPanel { /** * - * @return GL Canvas + * @return GL canvas for displaying the model */ public Canvas getCanvas() { return canvas; } /** + * Sets canvas for displaying the model * * @param canvas GL Canvas */ @@ -71,21 +70,6 @@ public final class SymmetryPanel extends javax.swing.JPanel { this.config = config; } - /** - * - * @return Button for returning original model from loaded file - */ - public JLabel getOriginalModelButton() { - return originalModelButton; - } - - /** - * - * @return Label for showing final plane of symmetry - */ - public JLabel getShowPlaneLabel() { - return showPlaneLabel; - } /** * Sets configuration values according to text fields on panel @@ -126,12 +110,9 @@ public final class SymmetryPanel extends javax.swing.JPanel { } /** - * Creates new form symmetryPanel + * Sets values of the sliders according to textFields */ - public SymmetryPanel() { - initComponents(); - config = Config.getDefault(); - + public void setSliders() { setSlider(relativeDistanceSlider, distanceTextField); setSlider(curavatureSlider, textFieldCurvature); setSlider(angleCosineSlider, textFieldMinCos); @@ -141,25 +122,44 @@ public final class SymmetryPanel extends javax.swing.JPanel { significantPointSlider.addChangeListener((ChangeEvent ce) -> { significantTextField.setText("" + significantPointSlider.getValue()); }); - originalModelButton.setVisible(false); - showPlaneLabel.setVisible(false); } - + + /** + * If plane of symmtery is computed, three new buttons are shown on panel + * + * @param isComputed true if plane is computed and shown on model otherwise false + */ + public void showPlaneButtonsOnPanel(boolean isComputed) { + originalModelButton.setVisible(isComputed); + showPlaneLabel.setVisible(isComputed); + } + + /** + * Creates new form symmetryPanel + */ + public SymmetryPanel() { + initComponents(); + config = Config.getDefault(); + setSliders(); + + showPlaneButtonsOnPanel(false); + } /** * Calculate approxy symmetry of the model - * Accuracy of the symmetry plane is influenced by configuration + * Accuracy of the symmetry plane is influenced by configuration represented by config * * @throws InterruptedException exception can be thrown beacause of progress monitor */ private void countSymmetry() throws InterruptedException { MeshModel model = new MeshModel(); - symCounter = new SymmetryCounter(canvas.getModel().getFacets().get(0)); - symCounter.init(); + canvas.changeModel(canvas.getLoadedModel()); + symCounter = new SymmetryEstimator(canvas.getModel().getFacets().get(0), config); symCounter.setPanel(this); - finalPlane = symCounter.getAproxSymmetryPlane(config); - SymmetryCounter counted = symCounter.mergeWithPlane(finalPlane); + finalPlane = symCounter.getAproxSymmetryPlane(); + SymmetryEstimator counted = symCounter.mergeWithPlane(finalPlane); model.addFacet(counted.getFacet()); + this.canvas.changeModel(model); } @@ -198,6 +198,11 @@ public final class SymmetryPanel extends javax.swing.JPanel { originalModelButton = new javax.swing.JLabel(); showPlaneLabel = new javax.swing.JLabel(); defaultValues = new javax.swing.JLabel(); + infoPoints = new javax.swing.JLabel(); + infoMinAngleCos = new javax.swing.JLabel(); + infoRelDist = new javax.swing.JLabel(); + infoNormalAngle = new javax.swing.JLabel(); + infoMinCurv = new javax.swing.JLabel(); symetrySpecificationPanel.setBackground(new java.awt.Color(176, 230, 226)); @@ -213,11 +218,11 @@ public final class SymmetryPanel extends javax.swing.JPanel { angleCosineSlider.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); angleCosineSlider.setOpaque(false); - minCurvatio.setFont(new java.awt.Font("Neue Haas Unica Pro", 0, 14)); // NOI18N + minCurvatio.setFont(new java.awt.Font("Arial", 1, 14)); // NOI18N minCurvatio.setForeground(new java.awt.Color(20, 114, 105)); minCurvatio.setText("Min. Curvature Ratio"); - minCurvatio2.setFont(new java.awt.Font("Neue Haas Unica Pro", 0, 14)); // NOI18N + minCurvatio2.setFont(new java.awt.Font("Arial", 1, 14)); // NOI18N minCurvatio2.setForeground(new java.awt.Color(20, 114, 105)); minCurvatio2.setText("Min. Angle Cosine"); @@ -226,9 +231,9 @@ public final class SymmetryPanel extends javax.swing.JPanel { normalAngleSlider.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); normalAngleSlider.setOpaque(false); - minCurvatio3.setFont(new java.awt.Font("Neue Haas Unica Pro", 0, 14)); // NOI18N + minCurvatio3.setFont(new java.awt.Font("Arial", 1, 14)); // NOI18N minCurvatio3.setForeground(new java.awt.Color(20, 114, 105)); - minCurvatio3.setText("Max. Relative Distance"); + minCurvatio3.setText("Relative Distance"); significantPointSlider.setMajorTickSpacing(100); significantPointSlider.setMaximum(300); @@ -236,20 +241,21 @@ public final class SymmetryPanel extends javax.swing.JPanel { significantPointSlider.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); significantPointSlider.setOpaque(false); - minCurvatio4.setFont(new java.awt.Font("Neue Haas Unica Pro", 0, 14)); // NOI18N + minCurvatio4.setFont(new java.awt.Font("Arial", 1, 14)); // NOI18N minCurvatio4.setForeground(new java.awt.Color(20, 114, 105)); - minCurvatio4.setText("Min. Normal Angle Cosine"); + minCurvatio4.setText("Normal Angle Cosine"); relativeDistanceSlider.setMaximum(5); relativeDistanceSlider.setSnapToTicks(true); relativeDistanceSlider.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); relativeDistanceSlider.setOpaque(false); - significantPointLabel.setFont(new java.awt.Font("Neue Haas Unica Pro", 0, 14)); // NOI18N + significantPointLabel.setFont(new java.awt.Font("Arial", 1, 14)); // NOI18N significantPointLabel.setForeground(new java.awt.Color(20, 114, 105)); - significantPointLabel.setText("Significant Point Count"); + significantPointLabel.setText("Significant Points"); symetryButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/symetryCount.png"))); // NOI18N + symetryButton.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); symetryButton.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { public void mouseMoved(java.awt.event.MouseEvent evt) { symetryButtonMouseMoved(evt); @@ -272,7 +278,7 @@ public final class SymmetryPanel extends javax.swing.JPanel { } }); - textFieldCurvature.setText("0.8"); + textFieldCurvature.setText("0.5"); textFieldCurvature.setToolTipText(""); textFieldMinCos.setText("0.985"); @@ -287,9 +293,10 @@ public final class SymmetryPanel extends javax.swing.JPanel { significantTextField.setText("200"); significantTextField.setToolTipText(""); - minCurvatio8.setFont(new java.awt.Font("Neue Haas Unica Pro", 0, 14)); // NOI18N + minCurvatio8.setFont(new java.awt.Font("Arial", 1, 14)); // NOI18N minCurvatio8.setForeground(new java.awt.Color(20, 114, 105)); minCurvatio8.setText("Averaging"); + minCurvatio8.setToolTipText("Average planes with highest number of votes"); originalModelButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/originalModel.png"))); // NOI18N originalModelButton.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); @@ -307,24 +314,20 @@ public final class SymmetryPanel extends javax.swing.JPanel { } }); - showPlaneLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/showPlane.png"))); // NOI18N + showPlaneLabel.setFont(new java.awt.Font("Arial", 1, 16)); // NOI18N + showPlaneLabel.setForeground(new java.awt.Color(20, 114, 105)); + showPlaneLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/show2.png"))); // NOI18N + showPlaneLabel.setText("Show plane"); + showPlaneLabel.setToolTipText("Show approximate plane of symmetry"); showPlaneLabel.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); showPlaneLabel.setDoubleBuffered(true); - showPlaneLabel.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { - public void mouseMoved(java.awt.event.MouseEvent evt) { - showPlaneLabelMouseMoved(evt); - } - }); showPlaneLabel.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { showPlaneLabelMouseClicked(evt); } - public void mouseExited(java.awt.event.MouseEvent evt) { - showPlaneLabelMouseExited(evt); - } }); - defaultValues.setFont(new java.awt.Font("Neue Haas Unica Pro", 0, 14)); // NOI18N + defaultValues.setFont(new java.awt.Font("Arial", 0, 14)); // NOI18N defaultValues.setForeground(new java.awt.Color(20, 114, 105)); defaultValues.setText("Default values"); defaultValues.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); @@ -334,141 +337,223 @@ public final class SymmetryPanel extends javax.swing.JPanel { } }); + infoPoints.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/info.png"))); // NOI18N + infoPoints.setToolTipText("Info "); + infoPoints.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); + infoPoints.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + infoPointsMouseClicked(evt); + } + }); + + infoMinAngleCos.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/info.png"))); // NOI18N + infoMinAngleCos.setToolTipText("Info "); + infoMinAngleCos.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); + infoMinAngleCos.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + infoMinAngleCosMouseClicked(evt); + } + }); + + infoRelDist.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/info.png"))); // NOI18N + infoRelDist.setToolTipText("Info "); + infoRelDist.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); + infoRelDist.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + infoRelDistMouseClicked(evt); + } + }); + + infoNormalAngle.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/info.png"))); // NOI18N + infoNormalAngle.setToolTipText("Info "); + infoNormalAngle.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); + infoNormalAngle.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + infoNormalAngleMouseClicked(evt); + } + }); + + infoMinCurv.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/info.png"))); // NOI18N + infoMinCurv.setToolTipText("Info "); + infoMinCurv.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); + infoMinCurv.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + infoMinCurvMouseClicked(evt); + } + }); + javax.swing.GroupLayout symetrySpecificationPanelLayout = new javax.swing.GroupLayout(symetrySpecificationPanel); symetrySpecificationPanel.setLayout(symetrySpecificationPanelLayout); symetrySpecificationPanelLayout.setHorizontalGroup( symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(symetrySpecificationPanelLayout.createSequentialGroup() - .addGap(17, 17, 17) - .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addGroup(symetrySpecificationPanelLayout.createSequentialGroup() .addGap(0, 0, Short.MAX_VALUE) - .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(defaultValues)) + .addGroup(symetrySpecificationPanelLayout.createSequentialGroup() + .addGap(17, 17, 17) + .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(symetrySpecificationPanelLayout.createSequentialGroup() - .addComponent(normalAngleSlider, javax.swing.GroupLayout.PREFERRED_SIZE, 200, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(normalTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(154, 154, 154) + .addComponent(jLabel1)) .addGroup(symetrySpecificationPanelLayout.createSequentialGroup() - .addComponent(significantPointSlider, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(textFieldMinCos, javax.swing.GroupLayout.DEFAULT_SIZE, 46, Short.MAX_VALUE) - .addComponent(textFieldCurvature) - .addComponent(distanceTextField) - .addComponent(significantTextField)))) - .addGap(63, 63, 63)) + .addComponent(showPlaneLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 147, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(originalModelButton, javax.swing.GroupLayout.PREFERRED_SIZE, 181, javax.swing.GroupLayout.PREFERRED_SIZE)))) .addGroup(symetrySpecificationPanelLayout.createSequentialGroup() + .addContainerGap() .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(minCurvatio, javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(minCurvatio2, javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(minCurvatio4, javax.swing.GroupLayout.Alignment.TRAILING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(significantPointLabel) - .addComponent(minCurvatio3)) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, symetrySpecificationPanelLayout.createSequentialGroup() - .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jLabel1) - .addGroup(symetrySpecificationPanelLayout.createSequentialGroup() - .addGap(80, 80, 80) - .addComponent(minCurvatio8) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(averagingCheckBox))) - .addComponent(showPlaneLabel)) - .addGap(9, 9, 9))) - .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, symetrySpecificationPanelLayout.createSequentialGroup() + .addGroup(symetrySpecificationPanelLayout.createSequentialGroup() + .addGap(10, 10, 10) + .addComponent(minCurvatio8) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(averagingCheckBox) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(symetryButton, javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(originalModelButton, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 181, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(defaultValues, javax.swing.GroupLayout.Alignment.TRAILING)) - .addGap(63, 63, 63)) + .addComponent(symetryButton)) .addGroup(symetrySpecificationPanelLayout.createSequentialGroup() - .addGap(56, 56, 56) + .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(infoMinAngleCos) + .addComponent(infoRelDist) + .addComponent(infoNormalAngle) + .addComponent(infoPoints) + .addComponent(infoMinCurv)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(minCurvatio4, javax.swing.GroupLayout.DEFAULT_SIZE, 157, Short.MAX_VALUE) + .addGroup(symetrySpecificationPanelLayout.createSequentialGroup() + .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(minCurvatio) + .addComponent(minCurvatio3) + .addComponent(minCurvatio2) + .addComponent(significantPointLabel)) + .addGap(0, 0, Short.MAX_VALUE))) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(angleCosineSlider, javax.swing.GroupLayout.PREFERRED_SIZE, 200, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(relativeDistanceSlider, javax.swing.GroupLayout.PREFERRED_SIZE, 200, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(curavatureSlider, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) - .addGap(0, 122, Short.MAX_VALUE)))))) + .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(curavatureSlider, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE) + .addComponent(relativeDistanceSlider, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE) + .addComponent(significantPointSlider, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 164, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(angleCosineSlider, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 164, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(normalAngleSlider, javax.swing.GroupLayout.PREFERRED_SIZE, 164, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(18, 18, 18) + .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(distanceTextField) + .addComponent(normalTextField) + .addComponent(significantTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(textFieldCurvature, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(textFieldMinCos, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE)))))) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); symetrySpecificationPanelLayout.setVerticalGroup( symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(symetrySpecificationPanelLayout.createSequentialGroup() - .addGap(72, 72, 72) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(infoPoints) + .addComponent(significantPointLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 27, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(significantTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(significantPointSlider, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(minCurvatio, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE) .addGroup(symetrySpecificationPanelLayout.createSequentialGroup() - .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(minCurvatio, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(textFieldCurvature, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGroup(symetrySpecificationPanelLayout.createSequentialGroup() - .addGap(4, 4, 4) - .addComponent(curavatureSlider, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) - .addGap(36, 36, 36) - .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(angleCosineSlider, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(minCurvatio2, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE))) - .addComponent(textFieldMinCos, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(textFieldCurvature, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(4, 4, 4)) + .addComponent(infoMinCurv) + .addComponent(curavatureSlider, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(infoMinAngleCos, javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(minCurvatio2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(textFieldMinCos, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(angleCosineSlider, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(symetrySpecificationPanelLayout.createSequentialGroup() - .addGap(18, 18, 18) - .addComponent(minCurvatio4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addGap(22, 22, 22)) + .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(normalAngleSlider, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(normalTextField)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(distanceTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(symetrySpecificationPanelLayout.createSequentialGroup() - .addGap(34, 34, 34) .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(normalTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(normalAngleSlider, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 34, Short.MAX_VALUE))) - .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(minCurvatio3, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(relativeDistanceSlider, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE) - .addComponent(distanceTextField, javax.swing.GroupLayout.Alignment.TRAILING))) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 31, Short.MAX_VALUE) - .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(significantTextField, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(significantPointLabel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(significantPointSlider, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGap(14, 14, 14) + .addComponent(minCurvatio4, javax.swing.GroupLayout.PREFERRED_SIZE, 27, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(infoNormalAngle)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(infoRelDist, javax.swing.GroupLayout.Alignment.TRAILING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(relativeDistanceSlider, javax.swing.GroupLayout.PREFERRED_SIZE, 22, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(minCurvatio3, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addGap(13, 13, 13))) .addComponent(defaultValues) - .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addGap(17, 17, 17) + .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(symetrySpecificationPanelLayout.createSequentialGroup() + .addComponent(symetryButton, javax.swing.GroupLayout.PREFERRED_SIZE, 75, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(originalModelButton) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addGroup(symetrySpecificationPanelLayout.createSequentialGroup() .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(averagingCheckBox) .addComponent(minCurvatio8, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGap(65, 65, 65) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 53, Short.MAX_VALUE) .addComponent(jLabel1) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(showPlaneLabel)) - .addGroup(symetrySpecificationPanelLayout.createSequentialGroup() - .addGap(3, 3, 3) - .addComponent(symetryButton, javax.swing.GroupLayout.PREFERRED_SIZE, 75, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(originalModelButton))) - .addContainerGap(32, Short.MAX_VALUE)) + .addGap(45, 45, 45) + .addComponent(showPlaneLabel) + .addContainerGap(27, Short.MAX_VALUE)))) ); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 580, Short.MAX_VALUE) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addComponent(symetrySpecificationPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(0, 0, Short.MAX_VALUE))) + .addComponent(symetrySpecificationPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 554, Short.MAX_VALUE) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(symetrySpecificationPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addComponent(symetrySpecificationPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); }// </editor-fold>//GEN-END:initComponents + /** + * + * @param evt Final computed plane is shown to user + */ + private void showPlaneLabelMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_showPlaneLabelMouseClicked + JOptionPane.showMessageDialog(frameMain, "Approximate plane of symmetry: \n" + finalPlane.a + "\n" + finalPlane.b + "\n" + finalPlane.c + "\n" + + finalPlane.d + "\n", "Final plane.", 0, new ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/showPlanePane.png"))); + }//GEN-LAST:event_showPlaneLabelMouseClicked + + /** + * + * @param evt Changes button + */ + private void originalModelButtonMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_originalModelButtonMouseExited + originalModelButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/originalModel.png"))); + }//GEN-LAST:event_originalModelButtonMouseExited + + /** + * + * @param evt Original model (without plane) is displayed + */ + private void originalModelButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_originalModelButtonMouseClicked + canvas.changeModel(canvas.getLoadedModel()); + showPlaneButtonsOnPanel(false); + }//GEN-LAST:event_originalModelButtonMouseClicked + + /** + * + * @param evt Changes button + */ + private void originalModelButtonMouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_originalModelButtonMouseMoved + originalModelButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/originalModelPressed.png"))); + }//GEN-LAST:event_originalModelButtonMouseMoved + /** * * @param evt Decides if averaging is ON or OFF @@ -481,6 +566,10 @@ public final class SymmetryPanel extends javax.swing.JPanel { } }//GEN-LAST:event_averagingCheckBoxMouseClicked + /** + * + * @param evt Changes button + */ private void symetryButtonMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_symetryButtonMouseExited symetryButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/symetryCount.png"))); }//GEN-LAST:event_symetryButtonMouseExited @@ -493,15 +582,14 @@ public final class SymmetryPanel extends javax.swing.JPanel { setConfigParams(); if (canvas.getModel().getFacets().isEmpty()){ JOptionPane.showMessageDialog(frameMain, "You have to load the model.", "Model not loaded", - 0, new ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/notLoadedModel.png"))); + 0, new ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/notLoadedModel.png"))); } else { try { countSymmetry(); } catch (InterruptedException ex) { Logger.getLogger(SymmetryPanel.class.getName()).log(Level.SEVERE, null, ex); } - originalModelButton.setVisible(true); - showPlaneLabel.setVisible(true); + showPlaneButtonsOnPanel(true); } }//GEN-LAST:event_symetryButtonMouseClicked @@ -511,69 +599,98 @@ public final class SymmetryPanel extends javax.swing.JPanel { */ private void symetryButtonMouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_symetryButtonMouseMoved symetryButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/symetryCountClicked.png"))); - symetryButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); }//GEN-LAST:event_symetryButtonMouseMoved /** * - * @param Changes button + * @param evt configuration is set to deafult values */ - private void originalModelButtonMouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_originalModelButtonMouseMoved - originalModelButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/originalModelPressed.png"))); - }//GEN-LAST:event_originalModelButtonMouseMoved - - /** - * - * @param evt Changes button - */ - private void originalModelButtonMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_originalModelButtonMouseExited - originalModelButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/originalModel.png"))); - }//GEN-LAST:event_originalModelButtonMouseExited + private void defaultValuesMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_defaultValuesMouseClicked + config = Config.getDefault(); + setTextFieldsDueToConfig(); + setSliders(); + }//GEN-LAST:event_defaultValuesMouseClicked /** + * Shows details about minimum curv ratio parameter * - * @param evt Original model (without plane) is displayed + * @param evt */ - private void originalModelButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_originalModelButtonMouseClicked - canvas.changeModel(canvas.getLoadedModel()); - originalModelButton.setVisible(false); - showPlaneLabel.setVisible(false); - }//GEN-LAST:event_originalModelButtonMouseClicked + private void infoMinCurvMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_infoMinCurvMouseClicked + JOptionPane.showMessageDialog(frameMain, + "Entered number represents how similar the curvature in two vertices must be\n" + + "to take into account these vertices while counting the plane of approximate symmetry.\n" + + "The higher the number is the more similar they must be.\n\n" + + + "Higher number → fewer pairs of vertices satisfy the criterion → shorter calculation, possibly less accurate result.\n" + + "Lower number → more pairs of vertices satisfy the criterion → longer calculation, possibly more accurate result.", + "Minimum curvature ratio", + 0, new ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/curvature.png"))); + }//GEN-LAST:event_infoMinCurvMouseClicked /** + * Shows details about maximum relative distance parameter * - * @param evt Changes button - */ - private void showPlaneLabelMouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_showPlaneLabelMouseMoved - showPlaneLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/showPlanePressed.png"))); - }//GEN-LAST:event_showPlaneLabelMouseMoved + * @param evt + */ + private void infoRelDistMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_infoRelDistMouseClicked + JOptionPane.showMessageDialog(frameMain, + "Entered number represents how far middle point of two vertices can be from candidate plane of symmetry\n" + + "to give this plane vote. Plane with highest number of votes is plane of approximate symmetry.\n\n" + + + "Higher number → more pairs of vertices satisfy the criterion → longer calculation, possibly more accurate result.\n" + + "Lower number → fewer pairs of vertices satisfy the criterion → shorter calculation, possibly less accurate result.", + "Maximum relative distance from plane", + 0, new ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/distance.png"))); + }//GEN-LAST:event_infoRelDistMouseClicked /** + * Shows details about significant points parameter * - * @param evt Final computed plane is shown to user + * @param evt */ - private void showPlaneLabelMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_showPlaneLabelMouseClicked - JOptionPane.showMessageDialog(frameMain, "Approximate plane of symmetry: \n" + finalPlane.a + "\n" + finalPlane.b + "\n" + finalPlane.c + "\n" + - finalPlane.d + "\n", "Final plane.", 0, new ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/showPlanePane.png"))); - }//GEN-LAST:event_showPlaneLabelMouseClicked + private void infoPointsMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_infoPointsMouseClicked + JOptionPane.showMessageDialog(frameMain, + "Entered number represents amount of points of the mesh that are taken into account\n" + + "while counting the plane of approximate symmetry.\n\n" + + + "Higher number → longer calculation, possibly more accurate result.\n" + + "Lower number → shorter calculation, possibly less accurate result.", + "Significant points", + 0, new ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/points.png"))); + }//GEN-LAST:event_infoPointsMouseClicked /** + * Shows details about minimum angle cosine parameter * - * @param evt Changes button + * @param evt */ - private void showPlaneLabelMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_showPlaneLabelMouseExited - showPlaneLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/showPlane.png"))); - }//GEN-LAST:event_showPlaneLabelMouseExited + private void infoMinAngleCosMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_infoMinAngleCosMouseClicked + JOptionPane.showMessageDialog(frameMain, + "Entered number represents how large the angle between normal vector of candidate plane and the vector\n" + + "of two vertices can be to take into account these vertices while counting the approximate symmetry.\n\n" + + + "Higher number → fewer pairs of vertices satisfy the criterion → shorter calculation, possibly less accurate result.\n" + + "Lower number → more pairs of vertices satisfy the criterion → longer calculation, possibly more accurate result.", + "Minimum angle", + 0, new ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/angle.png"))); + }//GEN-LAST:event_infoMinAngleCosMouseClicked /** + * Shows details about minimum normal angle cosine parameter * - * @param evt values of configuration back to deafult + * @param evt */ - private void defaultValuesMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_defaultValuesMouseClicked - config = Config.getDefault(); - setTextFieldsDueToConfig(); - }//GEN-LAST:event_defaultValuesMouseClicked - + private void infoNormalAngleMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_infoNormalAngleMouseClicked + JOptionPane.showMessageDialog(frameMain, + "Entered number represents how large the angle between normal vector of candidate plane and vector\n" + + "from subtraction of normal vectors of two vertices can be to take into account these vertices while counting the approximate symmetry.\n\n" + + + "Higher number → fewer pairs of vertices satisfy the criterion → shorter calculation, possibly less accurate result.\n" + + "Lower number → more pairs of vertices satisfy the criterion → longer calculation, possibly more accurate result.", + "Minimum normal angle", + 0, new ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/angle.png"))); + }//GEN-LAST:event_infoNormalAngleMouseClicked // Variables declaration - do not modify//GEN-BEGIN:variables @@ -582,6 +699,11 @@ public final class SymmetryPanel extends javax.swing.JPanel { private javax.swing.JSlider curavatureSlider; private javax.swing.JLabel defaultValues; private javax.swing.JTextField distanceTextField; + private javax.swing.JLabel infoMinAngleCos; + private javax.swing.JLabel infoMinCurv; + private javax.swing.JLabel infoNormalAngle; + private javax.swing.JLabel infoPoints; + private javax.swing.JLabel infoRelDist; private javax.swing.JLabel jLabel1; private javax.swing.JLabel minCurvatio; private javax.swing.JLabel minCurvatio2; diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/UserInterface.form b/GUI/src/main/java/cz/fidentis/analyst/gui/UserInterface.form index eb13ba97..7961bb6d 100644 --- a/GUI/src/main/java/cz/fidentis/analyst/gui/UserInterface.form +++ b/GUI/src/main/java/cz/fidentis/analyst/gui/UserInterface.form @@ -3,10 +3,11 @@ <Form version="1.3" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JFrameFormInfo"> <Properties> <Property name="defaultCloseOperation" type="int" value="3"/> - <Property name="alwaysOnTop" type="boolean" value="true"/> - <Property name="autoRequestFocus" type="boolean" value="false"/> <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> - <Color blue="69" green="72" red="14" type="rgb"/> + <Color blue="a3" green="ae" red="0" type="rgb"/> + </Property> + <Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor"> + <Color id="Default Cursor"/> </Property> <Property name="locationByPlatform" type="boolean" value="true"/> </Properties> @@ -30,7 +31,7 @@ <DimensionLayout dim="0"> <Group type="103" groupAlignment="0" attributes="0"> <Component id="topPanel" max="32767" attributes="0"/> - <Component id="jPanel1" alignment="0" max="32767" attributes="0"/> + <Component id="jPanel1" alignment="1" max="32767" attributes="0"/> <Group type="103" rootIndex="1" groupAlignment="0" attributes="0"> <Component id="jPanel2" alignment="0" max="32767" attributes="0"/> </Group> @@ -39,52 +40,159 @@ <DimensionLayout dim="1"> <Group type="103" groupAlignment="0" attributes="0"> <Group type="102" alignment="0" attributes="0"> - <Component id="jPanel1" min="-2" max="-2" attributes="0"/> - <EmptySpace max="-2" attributes="0"/> - <Component id="topPanel" min="-2" max="-2" attributes="0"/> - <EmptySpace pref="847" max="32767" attributes="0"/> + <Component id="jPanel1" min="-2" pref="52" max="-2" attributes="0"/> + <EmptySpace type="unrelated" max="-2" attributes="0"/> + <Component id="topPanel" min="-2" pref="239" max="-2" attributes="0"/> + <EmptySpace min="0" pref="565" max="32767" attributes="0"/> </Group> <Group type="103" rootIndex="1" groupAlignment="0" attributes="0"> - <Group type="102" alignment="1" attributes="0"> - <EmptySpace min="0" pref="0" max="32767" attributes="0"/> - <Component id="jPanel2" min="-2" max="-2" attributes="0"/> - </Group> + <Component id="jPanel2" alignment="1" max="32767" attributes="0"/> </Group> </Group> </DimensionLayout> </Layout> <SubComponents> + <Container class="javax.swing.JPanel" name="jPanel1"> + <Properties> + <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> + <Color blue="69" green="72" red="14" type="rgb"/> + </Property> + <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> + <Dimension value="[1200, 77]"/> + </Property> + </Properties> + <Events> + <EventHandler event="mouseDragged" listener="java.awt.event.MouseMotionListener" parameters="java.awt.event.MouseEvent" handler="jPanel1MouseDragged"/> + <EventHandler event="mousePressed" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="jPanel1MousePressed"/> + </Events> + + <Layout> + <DimensionLayout dim="0"> + <Group type="103" groupAlignment="0" attributes="0"> + <Group type="102" alignment="0" attributes="0"> + <EmptySpace max="-2" attributes="0"/> + <Component id="homeButton" min="-2" max="-2" attributes="0"/> + <EmptySpace max="-2" attributes="0"/> + <Component id="newProject" min="-2" pref="149" max="-2" attributes="0"/> + <EmptySpace max="-2" attributes="0"/> + <Component id="wiredModelButton" min="-2" pref="134" max="-2" attributes="0"/> + <EmptySpace max="32767" attributes="0"/> + </Group> + </Group> + </DimensionLayout> + <DimensionLayout dim="1"> + <Group type="103" groupAlignment="0" attributes="0"> + <Component id="wiredModelButton" alignment="0" max="32767" attributes="0"/> + <Component id="newProject" max="32767" attributes="0"/> + <Component id="homeButton" alignment="0" pref="52" max="32767" attributes="0"/> + </Group> + </DimensionLayout> + </Layout> + <SubComponents> + <Component class="javax.swing.JLabel" name="newProject"> + <Properties> + <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> + <Color blue="69" green="72" red="14" type="rgb"/> + </Property> + <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor"> + <Font name="Neue Haas Unica Pro" size="18" style="0"/> + </Property> + <Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> + <Color blue="ff" green="ff" red="ff" type="rgb"/> + </Property> + <Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor"> + <Image iconType="3" name="/cz/fidentis/analyst/gui/resources/newP.png"/> + </Property> + <Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor"> + <Color id="Hand Cursor"/> + </Property> + <Property name="opaque" type="boolean" value="true"/> + </Properties> + <Events> + <EventHandler event="mouseMoved" listener="java.awt.event.MouseMotionListener" parameters="java.awt.event.MouseEvent" handler="newProjectMouseMoved"/> + <EventHandler event="mouseExited" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="newProjectMouseExited"/> + <EventHandler event="mousePressed" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="newProjectMousePressed"/> + </Events> + </Component> + <Component class="javax.swing.JLabel" name="wiredModelButton"> + <Properties> + <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> + <Color blue="69" green="72" red="14" type="rgb"/> + </Property> + <Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor"> + <Image iconType="3" name="/cz/fidentis/analyst/gui/resources/wireframe2.png"/> + </Property> + <Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor"> + <Color id="Hand Cursor"/> + </Property> + <Property name="opaque" type="boolean" value="true"/> + </Properties> + <Events> + <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="wiredModelButtonMouseClicked"/> + </Events> + </Component> + <Component class="javax.swing.JLabel" name="homeButton"> + <Properties> + <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> + <Color blue="69" green="72" red="14" type="rgb"/> + </Property> + <Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor"> + <Image iconType="3" name="/cz/fidentis/analyst/gui/resources/home.png"/> + </Property> + <Property name="toolTipText" type="java.lang.String" value="Home"/> + <Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor"> + <Color id="Hand Cursor"/> + </Property> + <Property name="opaque" type="boolean" value="true"/> + </Properties> + <Events> + <EventHandler event="mouseMoved" listener="java.awt.event.MouseMotionListener" parameters="java.awt.event.MouseEvent" handler="homeButtonMouseMoved"/> + <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="homeButtonMouseClicked"/> + <EventHandler event="mouseExited" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="homeButtonMouseExited"/> + </Events> + </Component> + </SubComponents> + </Container> <Container class="javax.swing.JPanel" name="topPanel"> <Properties> <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> <Color blue="69" green="72" red="14" type="rgb"/> </Property> + <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> + <Dimension value="[1200, 266]"/> + </Property> </Properties> + <AccessibilityProperties> + <Property name="AccessibleContext.accessibleName" type="java.lang.String" value=""/> + </AccessibilityProperties> <Layout> <DimensionLayout dim="0"> <Group type="103" groupAlignment="0" attributes="0"> <Group type="102" alignment="0" attributes="0"> - <EmptySpace pref="272" max="32767" attributes="0"/> + <EmptySpace pref="99" max="32767" attributes="0"/> <Component id="compareTwo" min="-2" max="-2" attributes="0"/> <EmptySpace min="-2" pref="105" max="-2" attributes="0"/> <Component id="compareDB" min="-2" max="-2" attributes="0"/> - <EmptySpace min="-2" pref="86" max="-2" attributes="0"/> + <EmptySpace min="-2" pref="94" max="-2" attributes="0"/> <Component id="batchProcessing" min="-2" max="-2" attributes="0"/> - <EmptySpace min="-2" pref="97" max="-2" attributes="0"/> + <EmptySpace min="-2" pref="94" max="-2" attributes="0"/> <Component id="symetryEstimator" min="-2" max="-2" attributes="0"/> - <EmptySpace pref="272" max="32767" attributes="0"/> + <EmptySpace pref="98" max="32767" attributes="0"/> </Group> </Group> </DimensionLayout> <DimensionLayout dim="1"> <Group type="103" groupAlignment="0" attributes="0"> - <Group type="102" alignment="1" attributes="0"> - <EmptySpace pref="94" max="32767" attributes="0"/> - <Group type="103" groupAlignment="0" max="-2" attributes="0"> + <Group type="102" attributes="0"> + <EmptySpace min="-2" pref="52" max="-2" attributes="0"/> + <Group type="103" groupAlignment="0" attributes="0"> <Component id="symetryEstimator" alignment="1" max="32767" attributes="0"/> <Component id="compareDB" alignment="1" max="32767" attributes="0"/> - <Component id="compareTwo" alignment="1" min="-2" max="-2" attributes="0"/> + <Group type="102" alignment="1" attributes="0"> + <EmptySpace min="0" pref="0" max="32767" attributes="0"/> + <Component id="compareTwo" min="-2" max="-2" attributes="0"/> + </Group> <Component id="batchProcessing" alignment="1" max="32767" attributes="0"/> </Group> </Group> @@ -107,16 +215,17 @@ <Group type="103" groupAlignment="0" attributes="0"> <Group type="102" alignment="0" attributes="0"> <EmptySpace max="-2" attributes="0"/> - <Component id="jLabel1" pref="154" max="32767" attributes="0"/> + <Component id="jLabel1" max="32767" attributes="0"/> <EmptySpace max="-2" attributes="0"/> </Group> </Group> </DimensionLayout> <DimensionLayout dim="1"> <Group type="103" groupAlignment="0" attributes="0"> - <Group type="102" alignment="0" attributes="0"> - <Component id="jLabel1" pref="152" max="32767" attributes="0"/> - <EmptySpace max="-2" attributes="0"/> + <Group type="102" attributes="0"> + <EmptySpace min="-2" pref="30" max="-2" attributes="0"/> + <Component id="jLabel1" max="32767" attributes="0"/> + <EmptySpace min="-2" pref="28" max="-2" attributes="0"/> </Group> </Group> </DimensionLayout> @@ -148,25 +257,21 @@ <Layout> <DimensionLayout dim="0"> <Group type="103" groupAlignment="0" attributes="0"> - <Component id="jLabel2" alignment="1" pref="192" max="32767" attributes="0"/> + <Component id="jLabel3" alignment="1" max="32767" attributes="0"/> </Group> </DimensionLayout> <DimensionLayout dim="1"> <Group type="103" groupAlignment="0" attributes="0"> - <Group type="102" alignment="0" attributes="0"> - <EmptySpace max="-2" attributes="0"/> - <Component id="jLabel2" min="-2" max="-2" attributes="0"/> - <EmptySpace max="32767" attributes="0"/> - </Group> + <Component id="jLabel3" alignment="1" max="32767" attributes="0"/> </Group> </DimensionLayout> </Layout> <SubComponents> - <Component class="javax.swing.JLabel" name="jLabel2"> + <Component class="javax.swing.JLabel" name="jLabel3"> <Properties> <Property name="horizontalAlignment" type="int" value="0"/> <Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor"> - <Image iconType="3" name="/cz/fidentis/analyst/gui/resources/copareWithDatabaseStart.png"/> + <Image iconType="3" name="/cz/fidentis/analyst/gui/resources/batchProcessingStart.png"/> </Property> <Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor"> <Color id="Default Cursor"/> @@ -188,28 +293,27 @@ <Layout> <DimensionLayout dim="0"> <Group type="103" groupAlignment="0" attributes="0"> - <Group type="102" alignment="0" attributes="0"> - <EmptySpace max="-2" attributes="0"/> - <Component id="jLabel3" max="32767" attributes="0"/> - <EmptySpace max="-2" attributes="0"/> + <Group type="102" attributes="0"> + <EmptySpace min="-2" pref="26" max="-2" attributes="0"/> + <Component id="jLabel2" max="32767" attributes="0"/> </Group> </Group> </DimensionLayout> <DimensionLayout dim="1"> <Group type="103" groupAlignment="0" attributes="0"> - <Group type="102" alignment="0" attributes="0"> - <Component id="jLabel3" max="32767" attributes="0"/> + <Group type="102" alignment="1" attributes="0"> <EmptySpace max="-2" attributes="0"/> + <Component id="jLabel2" max="32767" attributes="0"/> </Group> </Group> </DimensionLayout> </Layout> <SubComponents> - <Component class="javax.swing.JLabel" name="jLabel3"> + <Component class="javax.swing.JLabel" name="jLabel2"> <Properties> <Property name="horizontalAlignment" type="int" value="0"/> <Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor"> - <Image iconType="3" name="/cz/fidentis/analyst/gui/resources/batchProcessingStart.png"/> + <Image iconType="3" name="/cz/fidentis/analyst/gui/resources/copareWithDatabaseStart.png"/> </Property> <Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor"> <Color id="Default Cursor"/> @@ -234,18 +338,19 @@ <Layout> <DimensionLayout dim="0"> <Group type="103" groupAlignment="0" attributes="0"> - <Group type="102" alignment="0" attributes="0"> + <Group type="102" alignment="1" attributes="0"> <EmptySpace max="-2" attributes="0"/> <Component id="jLabel4" max="32767" attributes="0"/> - <EmptySpace max="32767" attributes="0"/> + <EmptySpace max="-2" attributes="0"/> </Group> </Group> </DimensionLayout> <DimensionLayout dim="1"> <Group type="103" groupAlignment="0" attributes="0"> <Group type="102" alignment="1" attributes="0"> - <Component id="jLabel4" max="32767" attributes="0"/> - <EmptySpace max="-2" attributes="0"/> + <EmptySpace max="32767" attributes="0"/> + <Component id="jLabel4" min="-2" pref="137" max="-2" attributes="0"/> + <EmptySpace min="-2" pref="36" max="-2" attributes="0"/> </Group> </Group> </DimensionLayout> @@ -271,153 +376,18 @@ </Container> </SubComponents> </Container> - <Container class="javax.swing.JPanel" name="jPanel1"> + <Container class="javax.swing.JPanel" name="jPanel2"> <Properties> <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> - <Color blue="69" green="72" red="14" type="rgb"/> + <Color blue="a3" green="ae" red="0" type="rgb"/> + </Property> + <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor"> + <Font name="Arial" size="13" style="1"/> + </Property> + <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.modules.form.RADConnectionPropertyEditor"> + <Connection component="Form" name="preferredSize" type="property"/> </Property> </Properties> - <Events> - <EventHandler event="mouseDragged" listener="java.awt.event.MouseMotionListener" parameters="java.awt.event.MouseEvent" handler="jPanel1MouseDragged"/> - <EventHandler event="mousePressed" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="jPanel1MousePressed"/> - </Events> - - <Layout> - <DimensionLayout dim="0"> - <Group type="103" groupAlignment="0" attributes="0"> - <Group type="102" alignment="0" attributes="0"> - <EmptySpace max="-2" attributes="0"/> - <Component id="homeButton" min="-2" max="-2" attributes="0"/> - <EmptySpace max="-2" attributes="0"/> - <Component id="newProject" min="-2" pref="198" max="-2" attributes="0"/> - <EmptySpace max="-2" attributes="0"/> - <Component id="wiredModelButton" min="-2" pref="187" max="-2" attributes="0"/> - <EmptySpace max="32767" attributes="0"/> - <Component id="minimize" min="-2" max="-2" attributes="0"/> - <EmptySpace max="-2" attributes="0"/> - <Component id="close" min="-2" pref="46" max="-2" attributes="0"/> - <EmptySpace max="-2" attributes="0"/> - </Group> - </Group> - </DimensionLayout> - <DimensionLayout dim="1"> - <Group type="103" groupAlignment="0" attributes="0"> - <Component id="homeButton" alignment="1" max="32767" attributes="0"/> - <Group type="102" alignment="1" attributes="0"> - <EmptySpace min="0" pref="0" max="32767" attributes="0"/> - <Group type="103" groupAlignment="0" max="-2" attributes="0"> - <Component id="newProject" max="32767" attributes="0"/> - <Component id="close" max="32767" attributes="0"/> - <Component id="wiredModelButton" pref="77" max="32767" attributes="0"/> - <Component id="minimize" max="32767" attributes="0"/> - </Group> - </Group> - </Group> - </DimensionLayout> - </Layout> - <SubComponents> - <Component class="javax.swing.JLabel" name="newProject"> - <Properties> - <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> - <Color blue="69" green="72" red="14" type="rgb"/> - </Property> - <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor"> - <Font name="Neue Haas Unica Pro" size="18" style="0"/> - </Property> - <Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> - <Color blue="ff" green="ff" red="ff" type="rgb"/> - </Property> - <Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor"> - <Image iconType="3" name="/cz/fidentis/analyst/gui/resources/new_project.png"/> - </Property> - <Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor"> - <Color id="Hand Cursor"/> - </Property> - <Property name="opaque" type="boolean" value="true"/> - </Properties> - <Events> - <EventHandler event="mouseMoved" listener="java.awt.event.MouseMotionListener" parameters="java.awt.event.MouseEvent" handler="newProjectMouseMoved"/> - <EventHandler event="mouseExited" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="newProjectMouseExited"/> - <EventHandler event="mousePressed" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="newProjectMousePressed"/> - </Events> - </Component> - <Component class="javax.swing.JLabel" name="close"> - <Properties> - <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> - <Color blue="69" green="72" red="14" type="rgb"/> - </Property> - <Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor"> - <Image iconType="3" name="/cz/fidentis/analyst/gui/resources/close.png"/> - </Property> - <Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor"> - <Color id="Hand Cursor"/> - </Property> - <Property name="opaque" type="boolean" value="true"/> - </Properties> - <Events> - <EventHandler event="mouseMoved" listener="java.awt.event.MouseMotionListener" parameters="java.awt.event.MouseEvent" handler="closeMouseMoved"/> - <EventHandler event="mouseExited" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="closeMouseExited"/> - <EventHandler event="mousePressed" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="closeMousePressed"/> - </Events> - </Component> - <Component class="javax.swing.JLabel" name="wiredModelButton"> - <Properties> - <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> - <Color blue="69" green="72" red="14" type="rgb"/> - </Property> - <Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor"> - <Image iconType="3" name="/cz/fidentis/analyst/gui/resources/wireframe.png"/> - </Property> - <Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor"> - <Color id="Hand Cursor"/> - </Property> - <Property name="opaque" type="boolean" value="true"/> - </Properties> - <Events> - <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="wiredModelButtonMouseClicked"/> - </Events> - </Component> - <Component class="javax.swing.JLabel" name="homeButton"> - <Properties> - <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> - <Color blue="69" green="72" red="14" type="rgb"/> - </Property> - <Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor"> - <Image iconType="3" name="/cz/fidentis/analyst/gui/resources/home.png"/> - </Property> - <Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor"> - <Color id="Hand Cursor"/> - </Property> - <Property name="opaque" type="boolean" value="true"/> - </Properties> - <Events> - <EventHandler event="mouseMoved" listener="java.awt.event.MouseMotionListener" parameters="java.awt.event.MouseEvent" handler="homeButtonMouseMoved"/> - <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="homeButtonMouseClicked"/> - <EventHandler event="mouseExited" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="homeButtonMouseExited"/> - </Events> - </Component> - <Component class="javax.swing.JLabel" name="minimize"> - <Properties> - <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> - <Color blue="69" green="72" red="14" type="rgb"/> - </Property> - <Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor"> - <Image iconType="3" name="/cz/fidentis/analyst/gui/resources/minimize.png"/> - </Property> - <Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor"> - <Color id="Hand Cursor"/> - </Property> - <Property name="opaque" type="boolean" value="true"/> - </Properties> - <Events> - <EventHandler event="mouseMoved" listener="java.awt.event.MouseMotionListener" parameters="java.awt.event.MouseEvent" handler="minimizeMouseMoved"/> - <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="minimizeMouseClicked"/> - <EventHandler event="mouseExited" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="minimizeMouseExited"/> - </Events> - </Component> - </SubComponents> - </Container> - <Container class="javax.swing.JPanel" name="jPanel2"> <Layout class="org.netbeans.modules.form.compat2.layouts.DesignCardLayout"/> <SubComponents> @@ -427,6 +397,13 @@ <Color blue="a3" green="ae" red="0" type="rgb"/> </Property> <Property name="toolTipText" type="java.lang.String" value=""/> + <Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> + <Dimension value="[0, 0]"/> + </Property> + <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> + <Dimension value="[1200, 800]"/> + </Property> + <Property name="requestFocusEnabled" type="boolean" value="false"/> </Properties> <Constraints> <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignCardLayout" value="org.netbeans.modules.form.compat2.layouts.DesignCardLayout$CardConstraintsDescription"> @@ -438,25 +415,26 @@ <DimensionLayout dim="0"> <Group type="103" groupAlignment="0" attributes="0"> <Group type="102" attributes="0"> - <EmptySpace max="-2" attributes="0"/> - <Component id="jPanel3" max="32767" attributes="0"/> - <EmptySpace max="-2" attributes="0"/> - </Group> - <Group type="102" alignment="0" attributes="0"> - <EmptySpace min="-2" pref="643" max="-2" attributes="0"/> - <Component id="logo" min="-2" pref="218" max="-2" attributes="0"/> - <EmptySpace max="32767" attributes="0"/> + <EmptySpace pref="81" max="32767" attributes="0"/> + <Group type="103" groupAlignment="0" attributes="0"> + <Component id="jPanel3" min="-2" max="-2" attributes="0"/> + <Group type="102" alignment="1" attributes="0"> + <Component id="logo" min="-2" pref="218" max="-2" attributes="0"/> + <EmptySpace min="-2" pref="400" max="-2" attributes="0"/> + </Group> + </Group> + <EmptySpace pref="81" max="32767" attributes="0"/> </Group> </Group> </DimensionLayout> <DimensionLayout dim="1"> <Group type="103" groupAlignment="0" attributes="0"> <Group type="102" attributes="0"> - <EmptySpace min="-2" pref="205" max="-2" attributes="0"/> + <EmptySpace pref="133" max="32767" attributes="0"/> <Component id="logo" min="-2" pref="124" max="-2" attributes="0"/> - <EmptySpace min="-2" pref="128" max="-2" attributes="0"/> + <EmptySpace type="unrelated" max="-2" attributes="0"/> <Component id="jPanel3" min="-2" max="-2" attributes="0"/> - <EmptySpace min="-2" pref="200" max="-2" attributes="0"/> + <EmptySpace pref="136" max="32767" attributes="0"/> </Group> </Group> </DimensionLayout> @@ -485,21 +463,24 @@ <DimensionLayout dim="0"> <Group type="103" groupAlignment="0" attributes="0"> <Group type="102" alignment="0" attributes="0"> - <EmptySpace min="-2" pref="169" max="-2" attributes="0"/> - <Component id="viewerButton" min="-2" max="-2" attributes="0"/> - <EmptySpace pref="237" max="32767" attributes="0"/> - <Component id="jLabel6" min="-2" max="-2" attributes="0"/> + <EmptySpace pref="17" max="32767" attributes="0"/> + <Component id="viewerButton" min="-2" pref="323" max="-2" attributes="0"/> + <EmptySpace type="separate" max="-2" attributes="0"/> + <Group type="103" groupAlignment="0" attributes="0"> + <Component id="compareTwoMain" alignment="1" min="-2" max="-2" attributes="0"/> + <Component id="compareTwoMain1" alignment="1" min="-2" max="-2" attributes="0"/> + </Group> + <EmptySpace min="-2" max="-2" attributes="0"/> <Group type="103" groupAlignment="0" attributes="0"> <Group type="102" attributes="0"> - <EmptySpace min="-2" pref="135" max="-2" attributes="0"/> - <Component id="compareTwoMain" min="-2" max="-2" attributes="0"/> + <Component id="JLabel8" max="32767" attributes="0"/> + <EmptySpace min="-2" pref="62" max="-2" attributes="0"/> </Group> - <Group type="102" alignment="0" attributes="0"> - <EmptySpace min="-2" pref="130" max="-2" attributes="0"/> - <Component id="compareTwoMain1" min="-2" max="-2" attributes="0"/> + <Group type="102" attributes="0"> + <Component id="JLabel9" min="-2" pref="196" max="-2" attributes="0"/> + <EmptySpace max="32767" attributes="0"/> </Group> </Group> - <EmptySpace min="-2" pref="81" max="-2" attributes="0"/> <Group type="103" groupAlignment="0" attributes="0"> <Component id="batchMain" min="-2" max="-2" attributes="0"/> <Group type="102" attributes="0"> @@ -507,34 +488,43 @@ <Component id="symetryMain" min="-2" max="-2" attributes="0"/> </Group> </Group> - <EmptySpace min="-2" pref="170" max="-2" attributes="0"/> + <EmptySpace pref="42" max="32767" attributes="0"/> </Group> </Group> </DimensionLayout> <DimensionLayout dim="1"> <Group type="103" groupAlignment="0" attributes="0"> - <Group type="102" alignment="1" attributes="0"> - <EmptySpace min="-2" pref="27" max="-2" attributes="0"/> + <Group type="102" attributes="0"> <Group type="103" groupAlignment="0" attributes="0"> - <Component id="jLabel6" alignment="0" max="32767" attributes="0"/> - <Group type="102" alignment="0" attributes="0"> + <Group type="102" alignment="1" attributes="0"> + <EmptySpace max="-2" attributes="0"/> <Group type="103" groupAlignment="1" attributes="0"> - <Component id="compareTwoMain" min="-2" max="-2" attributes="0"/> - <Component id="batchMain" min="-2" max="-2" attributes="0"/> + <Group type="103" alignment="1" groupAlignment="0" attributes="0"> + <Component id="JLabel8" min="-2" pref="142" max="-2" attributes="0"/> + <Component id="compareTwoMain" min="-2" max="-2" attributes="0"/> + </Group> + <Group type="102" alignment="1" attributes="0"> + <Component id="batchMain" min="-2" pref="173" max="-2" attributes="0"/> + <EmptySpace min="-2" pref="28" max="-2" attributes="0"/> + </Group> </Group> - <EmptySpace max="32767" attributes="0"/> <Group type="103" groupAlignment="0" attributes="0"> <Component id="compareTwoMain1" alignment="1" min="-2" max="-2" attributes="0"/> <Component id="symetryMain" alignment="1" min="-2" max="-2" attributes="0"/> </Group> </Group> + <Group type="102" alignment="0" attributes="0"> + <EmptySpace min="-2" pref="296" max="-2" attributes="0"/> + <Component id="JLabel9" max="32767" attributes="0"/> + <EmptySpace min="-2" pref="8" max="-2" attributes="0"/> + </Group> </Group> <EmptySpace max="-2" attributes="0"/> </Group> <Group type="102" alignment="1" attributes="0"> - <EmptySpace max="32767" attributes="0"/> + <EmptySpace min="0" pref="0" max="32767" attributes="0"/> <Component id="viewerButton" min="-2" max="-2" attributes="0"/> - <EmptySpace min="-2" pref="70" max="-2" attributes="0"/> + <EmptySpace min="-2" pref="41" max="-2" attributes="0"/> </Group> </Group> </DimensionLayout> @@ -550,31 +540,15 @@ <Layout> <DimensionLayout dim="0"> <Group type="103" groupAlignment="0" attributes="0"> - <Group type="102" alignment="0" attributes="0"> - <EmptySpace min="-2" pref="15" max="-2" attributes="0"/> - <Component id="JLabel8" max="32767" attributes="0"/> - <EmptySpace max="-2" attributes="0"/> - </Group> + <EmptySpace min="0" pref="177" max="32767" attributes="0"/> </Group> </DimensionLayout> <DimensionLayout dim="1"> <Group type="103" groupAlignment="0" attributes="0"> - <Group type="102" alignment="1" attributes="0"> - <EmptySpace min="0" pref="28" max="32767" attributes="0"/> - <Component id="JLabel8" min="-2" pref="142" max="-2" attributes="0"/> - </Group> + <EmptySpace min="0" pref="170" max="32767" attributes="0"/> </Group> </DimensionLayout> </Layout> - <SubComponents> - <Component class="javax.swing.JLabel" name="JLabel8"> - <Properties> - <Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor"> - <Image iconType="3" name="/cz/fidentis/analyst/gui/resources/compareTwoStart.png"/> - </Property> - </Properties> - </Component> - </SubComponents> </Container> <Container class="javax.swing.JPanel" name="compareTwoMain1"> <Properties> @@ -586,34 +560,15 @@ <Layout> <DimensionLayout dim="0"> <Group type="103" groupAlignment="0" attributes="0"> - <Group type="102" alignment="1" attributes="0"> - <EmptySpace max="32767" attributes="0"/> - <Component id="JLabel9" min="-2" pref="196" max="-2" attributes="0"/> - <EmptySpace max="-2" attributes="0"/> - </Group> + <EmptySpace min="0" pref="220" max="32767" attributes="0"/> </Group> </DimensionLayout> <DimensionLayout dim="1"> <Group type="103" groupAlignment="0" attributes="0"> - <Group type="102" alignment="1" attributes="0"> - <EmptySpace max="-2" attributes="0"/> - <Component id="JLabel9" pref="156" max="32767" attributes="0"/> - </Group> + <EmptySpace min="0" pref="169" max="32767" attributes="0"/> </Group> </DimensionLayout> </Layout> - <SubComponents> - <Component class="javax.swing.JLabel" name="JLabel9"> - <Properties> - <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> - <Color blue="a3" green="ae" red="0" type="rgb"/> - </Property> - <Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor"> - <Image iconType="3" name="/cz/fidentis/analyst/gui/resources/copareWithDatabaseStart.png"/> - </Property> - </Properties> - </Component> - </SubComponents> </Container> <Container class="javax.swing.JPanel" name="batchMain"> <Properties> @@ -625,18 +580,19 @@ <Layout> <DimensionLayout dim="0"> <Group type="103" groupAlignment="0" attributes="0"> - <Group type="102" alignment="1" attributes="0"> - <EmptySpace max="32767" attributes="0"/> - <Component id="JLabel10" min="-2" max="-2" attributes="0"/> + <Group type="102" alignment="0" attributes="0"> <EmptySpace max="-2" attributes="0"/> + <Component id="JLabel10" min="-2" max="-2" attributes="0"/> + <EmptySpace max="32767" attributes="0"/> </Group> </Group> </DimensionLayout> <DimensionLayout dim="1"> <Group type="103" groupAlignment="0" attributes="0"> - <Group type="102" alignment="1" attributes="0"> - <EmptySpace min="0" pref="0" max="32767" attributes="0"/> - <Component id="JLabel10" min="-2" pref="157" max="-2" attributes="0"/> + <Group type="102" alignment="0" attributes="0"> + <EmptySpace min="-2" pref="25" max="-2" attributes="0"/> + <Component id="JLabel10" min="-2" max="-2" attributes="0"/> + <EmptySpace max="32767" attributes="0"/> </Group> </Group> </DimensionLayout> @@ -667,7 +623,7 @@ <DimensionLayout dim="1"> <Group type="103" groupAlignment="0" attributes="0"> <Group type="102" alignment="1" attributes="0"> - <EmptySpace max="-2" attributes="0"/> + <EmptySpace min="-2" max="-2" attributes="0"/> <Component id="JLabel11" pref="167" max="32767" attributes="0"/> </Group> </Group> @@ -694,13 +650,6 @@ </Component> </SubComponents> </Container> - <Component class="javax.swing.JLabel" name="jLabel6"> - <Properties> - <Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor"> - <Image iconType="3" name="/cz/fidentis/analyst/gui/resources/divide.png"/> - </Property> - </Properties> - </Component> <Component class="javax.swing.JLabel" name="viewerButton"> <Properties> <Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor"> @@ -716,6 +665,23 @@ <EventHandler event="mouseExited" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="viewerButtonMouseExited"/> </Events> </Component> + <Component class="javax.swing.JLabel" name="JLabel8"> + <Properties> + <Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor"> + <Image iconType="3" name="/cz/fidentis/analyst/gui/resources/compareTwoStart.png"/> + </Property> + </Properties> + </Component> + <Component class="javax.swing.JLabel" name="JLabel9"> + <Properties> + <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> + <Color blue="a3" green="ae" red="0" type="rgb"/> + </Property> + <Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor"> + <Image iconType="3" name="/cz/fidentis/analyst/gui/resources/copareWithDatabaseStart.png"/> + </Property> + </Properties> + </Component> </SubComponents> </Container> </SubComponents> @@ -725,6 +691,9 @@ <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> <Color blue="a3" green="ae" red="0" type="rgb"/> </Property> + <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> + <Dimension value="[1200, 800]"/> + </Property> </Properties> <Constraints> <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignCardLayout" value="org.netbeans.modules.form.compat2.layouts.DesignCardLayout$CardConstraintsDescription"> @@ -736,35 +705,38 @@ <DimensionLayout dim="0"> <Group type="103" groupAlignment="0" attributes="0"> <Group type="102" alignment="0" attributes="0"> - <EmptySpace pref="125" max="32767" attributes="0"/> + <EmptySpace pref="78" max="32767" attributes="0"/> <Component id="viewerPanel" min="-2" max="-2" attributes="0"/> - <EmptySpace pref="94" max="32767" attributes="0"/> + <EmptySpace min="-2" pref="72" max="-2" attributes="0"/> <Group type="103" groupAlignment="0" attributes="0"> - <Component id="symmetryPanel1" min="-2" pref="580" max="-2" attributes="0"/> - <Group type="103" alignment="0" groupAlignment="1" max="-2" attributes="0"> - <Component id="reloadModelButton" alignment="0" max="32767" attributes="0"/> - <Component id="exportModelButton" max="32767" attributes="0"/> - </Group> + <Component id="exportModelButton" alignment="0" min="-2" max="-2" attributes="0"/> + <Component id="reloadModelButton" min="-2" max="-2" attributes="0"/> + <Component id="symmetryPanel1" alignment="0" min="-2" pref="461" max="-2" attributes="0"/> </Group> - <EmptySpace pref="81" max="32767" attributes="0"/> + <EmptySpace max="32767" attributes="0"/> </Group> + <Component id="filler1" alignment="1" max="32767" attributes="0"/> + <Component id="filler2" alignment="0" max="32767" attributes="0"/> </Group> </DimensionLayout> <DimensionLayout dim="1"> <Group type="103" groupAlignment="0" attributes="0"> - <Group type="102" alignment="1" attributes="0"> - <EmptySpace min="-2" pref="118" max="-2" attributes="0"/> - <Group type="103" groupAlignment="1" attributes="0"> + <Group type="102" alignment="0" attributes="0"> + <Component id="filler2" min="-2" pref="58" max="-2" attributes="0"/> + <EmptySpace pref="46" max="32767" attributes="0"/> + <Group type="103" groupAlignment="0" max="-2" attributes="0"> <Group type="102" attributes="0"> <Component id="symmetryPanel1" min="-2" max="-2" attributes="0"/> - <EmptySpace pref="189" max="32767" attributes="0"/> + <EmptySpace max="32767" attributes="0"/> <Component id="exportModelButton" min="-2" max="-2" attributes="0"/> <EmptySpace type="separate" max="-2" attributes="0"/> <Component id="reloadModelButton" min="-2" max="-2" attributes="0"/> </Group> - <Component id="viewerPanel" max="32767" attributes="0"/> + <Component id="viewerPanel" min="-2" max="-2" attributes="0"/> </Group> - <EmptySpace min="-2" pref="182" max="-2" attributes="0"/> + <EmptySpace max="-2" attributes="0"/> + <Component id="filler1" min="-2" pref="51" max="-2" attributes="0"/> + <EmptySpace min="-2" pref="93" max="-2" attributes="0"/> </Group> </Group> </DimensionLayout> @@ -777,7 +749,7 @@ <Group type="103" groupAlignment="0" attributes="0"> <Group type="102" alignment="0" attributes="0"> <EmptySpace max="-2" attributes="0"/> - <Component id="canva1" pref="652" max="32767" attributes="0"/> + <Component id="canvasSymmetryPanel" pref="553" max="32767" attributes="0"/> <EmptySpace max="-2" attributes="0"/> </Group> </Group> @@ -786,14 +758,14 @@ <Group type="103" groupAlignment="0" attributes="0"> <Group type="102" alignment="0" attributes="0"> <EmptySpace max="-2" attributes="0"/> - <Component id="canva1" max="32767" attributes="0"/> + <Component id="canvasSymmetryPanel" pref="588" max="32767" attributes="0"/> <EmptySpace max="-2" attributes="0"/> </Group> </Group> </DimensionLayout> </Layout> <SubComponents> - <Component class="cz.fidentis.analyst.gui.Canvas" name="canva1"> + <Component class="cz.fidentis.analyst.gui.Canvas" name="canvasSymmetryPanel"> </Component> </SubComponents> </Container> @@ -838,6 +810,26 @@ </Property> </Properties> </Component> + <Component class="javax.swing.Box$Filler" name="filler1"> + <Properties> + <Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> + <Dimension value="[0, 32767]"/> + </Property> + </Properties> + <AuxValues> + <AuxValue name="classDetails" type="java.lang.String" value="Box.Filler.VerticalGlue"/> + </AuxValues> + </Component> + <Component class="javax.swing.Box$Filler" name="filler2"> + <Properties> + <Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> + <Dimension value="[0, 32767]"/> + </Property> + </Properties> + <AuxValues> + <AuxValue name="classDetails" type="java.lang.String" value="Box.Filler.VerticalGlue"/> + </AuxValues> + </Component> </SubComponents> </Container> <Container class="javax.swing.JPanel" name="modelViewPanel"> @@ -846,7 +838,13 @@ <Color blue="a3" green="ae" red="0" type="rgb"/> </Property> <Property name="toolTipText" type="java.lang.String" value=""/> + <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> + <Dimension value="[1200, 800]"/> + </Property> </Properties> + <AccessibilityProperties> + <Property name="AccessibleContext.accessibleName" type="java.lang.String" value=""/> + </AccessibilityProperties> <Constraints> <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignCardLayout" value="org.netbeans.modules.form.compat2.layouts.DesignCardLayout$CardConstraintsDescription"> <CardConstraints cardName="card4"/> @@ -856,24 +854,29 @@ <Layout> <DimensionLayout dim="0"> <Group type="103" groupAlignment="0" attributes="0"> - <Group type="102" attributes="0"> - <EmptySpace pref="156" max="32767" attributes="0"/> + <Component id="filler3" alignment="1" max="32767" attributes="0"/> + <Group type="102" alignment="1" attributes="0"> + <EmptySpace pref="87" max="32767" attributes="0"/> <Component id="jPanel4" min="-2" max="-2" attributes="0"/> - <EmptySpace min="-2" pref="60" max="-2" attributes="0"/> + <EmptySpace type="separate" max="-2" attributes="0"/> <Component id="reloadModelButton1" min="-2" max="-2" attributes="0"/> - <EmptySpace min="-2" pref="95" max="-2" attributes="0"/> + <EmptySpace pref="95" max="32767" attributes="0"/> </Group> + <Component id="filler4" alignment="0" max="32767" attributes="0"/> </Group> </DimensionLayout> <DimensionLayout dim="1"> <Group type="103" groupAlignment="0" attributes="0"> - <Group type="102" alignment="1" attributes="0"> - <EmptySpace pref="169" max="32767" attributes="0"/> + <Group type="102" attributes="0"> + <Component id="filler3" min="-2" pref="73" max="-2" attributes="0"/> + <EmptySpace pref="87" max="32767" attributes="0"/> <Group type="103" groupAlignment="1" attributes="0"> + <Component id="jPanel4" min="-2" pref="579" max="-2" attributes="0"/> <Component id="reloadModelButton1" min="-2" max="-2" attributes="0"/> - <Component id="jPanel4" min="-2" max="-2" attributes="0"/> </Group> - <EmptySpace pref="224" max="32767" attributes="0"/> + <EmptySpace max="-2" attributes="0"/> + <Component id="filler4" min="-2" pref="31" max="-2" attributes="0"/> + <EmptySpace pref="92" max="32767" attributes="0"/> </Group> </Group> </DimensionLayout> @@ -905,26 +908,46 @@ <Group type="103" groupAlignment="0" attributes="0"> <Group type="102" alignment="0" attributes="0"> <EmptySpace max="-2" attributes="0"/> - <Component id="canva2" pref="1040" max="32767" attributes="0"/> - <EmptySpace max="-2" attributes="0"/> + <Component id="canvasModelView" min="-2" pref="795" max="-2" attributes="0"/> + <EmptySpace max="32767" attributes="0"/> </Group> </Group> </DimensionLayout> <DimensionLayout dim="1"> <Group type="103" groupAlignment="0" attributes="0"> - <Group type="102" alignment="0" attributes="0"> - <EmptySpace max="-2" attributes="0"/> - <Component id="canva2" min="-2" pref="778" max="-2" attributes="0"/> + <Group type="102" alignment="1" attributes="0"> <EmptySpace max="32767" attributes="0"/> + <Component id="canvasModelView" min="-2" pref="553" max="-2" attributes="0"/> + <EmptySpace min="-2" pref="98" max="-2" attributes="0"/> </Group> </Group> </DimensionLayout> </Layout> <SubComponents> - <Component class="cz.fidentis.analyst.gui.Canvas" name="canva2"> + <Component class="cz.fidentis.analyst.gui.Canvas" name="canvasModelView"> </Component> </SubComponents> </Container> + <Component class="javax.swing.Box$Filler" name="filler3"> + <Properties> + <Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> + <Dimension value="[0, 32767]"/> + </Property> + </Properties> + <AuxValues> + <AuxValue name="classDetails" type="java.lang.String" value="Box.Filler.VerticalGlue"/> + </AuxValues> + </Component> + <Component class="javax.swing.Box$Filler" name="filler4"> + <Properties> + <Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> + <Dimension value="[0, 32767]"/> + </Property> + </Properties> + <AuxValues> + <AuxValue name="classDetails" type="java.lang.String" value="Box.Filler.VerticalGlue"/> + </AuxValues> + </Component> </SubComponents> </Container> </SubComponents> diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/UserInterface.java b/GUI/src/main/java/cz/fidentis/analyst/gui/UserInterface.java index 0c926049..b28c86ae 100644 --- a/GUI/src/main/java/cz/fidentis/analyst/gui/UserInterface.java +++ b/GUI/src/main/java/cz/fidentis/analyst/gui/UserInterface.java @@ -1,6 +1,6 @@ package cz.fidentis.analyst.gui; -import cz.fidentis.analyst.mesh.io.MeshModelExporter; +import cz.fidentis.analyst.mesh.io.MeshObjExporter; import java.awt.Color; import java.io.IOException; import java.util.logging.Level; @@ -16,7 +16,7 @@ import javax.swing.UnsupportedLookAndFeelException; /** * - * @author Natalia Bebjakova + * @author Natália Bebjaková * * Main window of the applicaion */ @@ -54,7 +54,8 @@ public class UserInterface extends javax.swing.JFrame { initComponents(); topPanel.setVisible(false); actualPanel = startingPanel; - symmetryPanel1.setCanvas(canva1); + symmetryPanel1.setCanvas(canvasSymmetryPanel); + this.setExtendedState(JFrame.MAXIMIZED_BOTH); } /** @@ -108,53 +109,136 @@ public class UserInterface extends javax.swing.JFrame { // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { + jPanel1 = new javax.swing.JPanel(); + newProject = new javax.swing.JLabel(); + wiredModelButton = new javax.swing.JLabel(); + homeButton = new javax.swing.JLabel(); topPanel = new javax.swing.JPanel(); compareTwo = new javax.swing.JPanel(); jLabel1 = new javax.swing.JLabel(); compareDB = new javax.swing.JPanel(); - jLabel2 = new javax.swing.JLabel(); - batchProcessing = new javax.swing.JPanel(); jLabel3 = new javax.swing.JLabel(); + batchProcessing = new javax.swing.JPanel(); + jLabel2 = new javax.swing.JLabel(); symetryEstimator = new javax.swing.JPanel(); jLabel4 = new javax.swing.JLabel(); - jPanel1 = new javax.swing.JPanel(); - newProject = new javax.swing.JLabel(); - close = new javax.swing.JLabel(); - wiredModelButton = new javax.swing.JLabel(); - homeButton = new javax.swing.JLabel(); - minimize = new javax.swing.JLabel(); jPanel2 = new javax.swing.JPanel(); startingPanel = new javax.swing.JPanel(); javax.swing.JLabel logo = new javax.swing.JLabel(); jPanel3 = new javax.swing.JPanel(); compareTwoMain = new javax.swing.JPanel(); - JLabel8 = new javax.swing.JLabel(); compareTwoMain1 = new javax.swing.JPanel(); - JLabel9 = new javax.swing.JLabel(); batchMain = new javax.swing.JPanel(); JLabel10 = new javax.swing.JLabel(); symetryMain = new javax.swing.JPanel(); JLabel11 = new javax.swing.JLabel(); - jLabel6 = new javax.swing.JLabel(); viewerButton = new javax.swing.JLabel(); + JLabel8 = new javax.swing.JLabel(); + JLabel9 = new javax.swing.JLabel(); symetryPanel = new javax.swing.JPanel(); viewerPanel = new javax.swing.JPanel(); - canva1 = new cz.fidentis.analyst.gui.Canvas(); + canvasSymmetryPanel = new cz.fidentis.analyst.gui.Canvas(); reloadModelButton = new javax.swing.JLabel(); exportModelButton = new javax.swing.JLabel(); symmetryPanel1 = new cz.fidentis.analyst.gui.SymmetryPanel(); + filler1 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 32767)); + filler2 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 32767)); modelViewPanel = new javax.swing.JPanel(); reloadModelButton1 = new javax.swing.JLabel(); jPanel4 = new javax.swing.JPanel(); - canva2 = new cz.fidentis.analyst.gui.Canvas(); + canvasModelView = new cz.fidentis.analyst.gui.Canvas(); + filler3 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 32767)); + filler4 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 32767)); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); - setAlwaysOnTop(true); - setAutoRequestFocus(false); - setBackground(new java.awt.Color(20, 114, 105)); + setBackground(new java.awt.Color(0, 174, 163)); + setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); setLocationByPlatform(true); + jPanel1.setBackground(new java.awt.Color(20, 114, 105)); + jPanel1.setPreferredSize(new java.awt.Dimension(1200, 77)); + jPanel1.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { + public void mouseDragged(java.awt.event.MouseEvent evt) { + jPanel1MouseDragged(evt); + } + }); + jPanel1.addMouseListener(new java.awt.event.MouseAdapter() { + public void mousePressed(java.awt.event.MouseEvent evt) { + jPanel1MousePressed(evt); + } + }); + + newProject.setBackground(new java.awt.Color(20, 114, 105)); + newProject.setFont(new java.awt.Font("Neue Haas Unica Pro", 0, 18)); // NOI18N + newProject.setForeground(new java.awt.Color(255, 255, 255)); + newProject.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/newP.png"))); // NOI18N + newProject.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); + newProject.setOpaque(true); + newProject.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { + public void mouseMoved(java.awt.event.MouseEvent evt) { + newProjectMouseMoved(evt); + } + }); + newProject.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseExited(java.awt.event.MouseEvent evt) { + newProjectMouseExited(evt); + } + public void mousePressed(java.awt.event.MouseEvent evt) { + newProjectMousePressed(evt); + } + }); + + wiredModelButton.setBackground(new java.awt.Color(20, 114, 105)); + wiredModelButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/wireframe2.png"))); // NOI18N + wiredModelButton.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); + wiredModelButton.setOpaque(true); + wiredModelButton.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + wiredModelButtonMouseClicked(evt); + } + }); + + homeButton.setBackground(new java.awt.Color(20, 114, 105)); + homeButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/home.png"))); // NOI18N + homeButton.setToolTipText("Home"); + homeButton.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); + homeButton.setOpaque(true); + homeButton.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { + public void mouseMoved(java.awt.event.MouseEvent evt) { + homeButtonMouseMoved(evt); + } + }); + homeButton.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + homeButtonMouseClicked(evt); + } + public void mouseExited(java.awt.event.MouseEvent evt) { + homeButtonMouseExited(evt); + } + }); + + javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); + jPanel1.setLayout(jPanel1Layout); + jPanel1Layout.setHorizontalGroup( + jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel1Layout.createSequentialGroup() + .addContainerGap() + .addComponent(homeButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(newProject, javax.swing.GroupLayout.PREFERRED_SIZE, 149, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(wiredModelButton, javax.swing.GroupLayout.PREFERRED_SIZE, 134, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + jPanel1Layout.setVerticalGroup( + jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(wiredModelButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(newProject, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(homeButton, javax.swing.GroupLayout.DEFAULT_SIZE, 52, Short.MAX_VALUE) + ); + topPanel.setBackground(new java.awt.Color(20, 114, 105)); + topPanel.setPreferredSize(new java.awt.Dimension(1200, 266)); compareTwo.setBackground(new java.awt.Color(20, 114, 105)); compareTwo.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); @@ -169,58 +253,55 @@ public class UserInterface extends javax.swing.JFrame { compareTwoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(compareTwoLayout.createSequentialGroup() .addContainerGap() - .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 154, Short.MAX_VALUE) + .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addContainerGap()) ); compareTwoLayout.setVerticalGroup( compareTwoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(compareTwoLayout.createSequentialGroup() - .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 152, Short.MAX_VALUE) - .addContainerGap()) + .addGap(30, 30, 30) + .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGap(28, 28, 28)) ); compareDB.setBackground(new java.awt.Color(20, 114, 105)); compareDB.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); - jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jLabel2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/copareWithDatabaseStart.png"))); // NOI18N - jLabel2.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); + jLabel3.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); + jLabel3.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/batchProcessingStart.png"))); // NOI18N + jLabel3.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); javax.swing.GroupLayout compareDBLayout = new javax.swing.GroupLayout(compareDB); compareDB.setLayout(compareDBLayout); compareDBLayout.setHorizontalGroup( compareDBLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jLabel2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 192, Short.MAX_VALUE) + .addComponent(jLabel3, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); compareDBLayout.setVerticalGroup( compareDBLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(compareDBLayout.createSequentialGroup() - .addContainerGap() - .addComponent(jLabel2) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addComponent(jLabel3, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); batchProcessing.setBackground(new java.awt.Color(20, 114, 105)); batchProcessing.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); - jLabel3.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jLabel3.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/batchProcessingStart.png"))); // NOI18N - jLabel3.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); + jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); + jLabel2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/copareWithDatabaseStart.png"))); // NOI18N + jLabel2.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); javax.swing.GroupLayout batchProcessingLayout = new javax.swing.GroupLayout(batchProcessing); batchProcessing.setLayout(batchProcessingLayout); batchProcessingLayout.setHorizontalGroup( batchProcessingLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(batchProcessingLayout.createSequentialGroup() - .addContainerGap() - .addComponent(jLabel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addContainerGap()) + .addGap(26, 26, 26) + .addComponent(jLabel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); batchProcessingLayout.setVerticalGroup( batchProcessingLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(batchProcessingLayout.createSequentialGroup() - .addComponent(jLabel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addContainerGap()) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, batchProcessingLayout.createSequentialGroup() + .addContainerGap() + .addComponent(jLabel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); symetryEstimator.setBackground(new java.awt.Color(20, 114, 105)); @@ -252,16 +333,17 @@ public class UserInterface extends javax.swing.JFrame { symetryEstimator.setLayout(symetryEstimatorLayout); symetryEstimatorLayout.setHorizontalGroup( symetryEstimatorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(symetryEstimatorLayout.createSequentialGroup() + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, symetryEstimatorLayout.createSequentialGroup() .addContainerGap() .addComponent(jLabel4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addContainerGap()) ); symetryEstimatorLayout.setVerticalGroup( symetryEstimatorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, symetryEstimatorLayout.createSequentialGroup() - .addComponent(jLabel4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addContainerGap()) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE, 137, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(36, 36, 36)) ); javax.swing.GroupLayout topPanelLayout = new javax.swing.GroupLayout(topPanel); @@ -269,156 +351,39 @@ public class UserInterface extends javax.swing.JFrame { topPanelLayout.setHorizontalGroup( topPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(topPanelLayout.createSequentialGroup() - .addContainerGap(272, Short.MAX_VALUE) + .addContainerGap(99, Short.MAX_VALUE) .addComponent(compareTwo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(105, 105, 105) .addComponent(compareDB, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(86, 86, 86) + .addGap(94, 94, 94) .addComponent(batchProcessing, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(97, 97, 97) + .addGap(94, 94, 94) .addComponent(symetryEstimator, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addContainerGap(272, Short.MAX_VALUE)) + .addContainerGap(98, Short.MAX_VALUE)) ); topPanelLayout.setVerticalGroup( topPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, topPanelLayout.createSequentialGroup() - .addContainerGap(94, Short.MAX_VALUE) - .addGroup(topPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addGroup(topPanelLayout.createSequentialGroup() + .addGap(52, 52, 52) + .addGroup(topPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(symetryEstimator, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(compareDB, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(compareTwo, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, topPanelLayout.createSequentialGroup() + .addGap(0, 0, Short.MAX_VALUE) + .addComponent(compareTwo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addComponent(batchProcessing, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) ); - jPanel1.setBackground(new java.awt.Color(20, 114, 105)); - jPanel1.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { - public void mouseDragged(java.awt.event.MouseEvent evt) { - jPanel1MouseDragged(evt); - } - }); - jPanel1.addMouseListener(new java.awt.event.MouseAdapter() { - public void mousePressed(java.awt.event.MouseEvent evt) { - jPanel1MousePressed(evt); - } - }); - - newProject.setBackground(new java.awt.Color(20, 114, 105)); - newProject.setFont(new java.awt.Font("Neue Haas Unica Pro", 0, 18)); // NOI18N - newProject.setForeground(new java.awt.Color(255, 255, 255)); - newProject.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/new_project.png"))); // NOI18N - newProject.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); - newProject.setOpaque(true); - newProject.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { - public void mouseMoved(java.awt.event.MouseEvent evt) { - newProjectMouseMoved(evt); - } - }); - newProject.addMouseListener(new java.awt.event.MouseAdapter() { - public void mouseExited(java.awt.event.MouseEvent evt) { - newProjectMouseExited(evt); - } - public void mousePressed(java.awt.event.MouseEvent evt) { - newProjectMousePressed(evt); - } - }); - - close.setBackground(new java.awt.Color(20, 114, 105)); - close.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/close.png"))); // NOI18N - close.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); - close.setOpaque(true); - close.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { - public void mouseMoved(java.awt.event.MouseEvent evt) { - closeMouseMoved(evt); - } - }); - close.addMouseListener(new java.awt.event.MouseAdapter() { - public void mouseExited(java.awt.event.MouseEvent evt) { - closeMouseExited(evt); - } - public void mousePressed(java.awt.event.MouseEvent evt) { - closeMousePressed(evt); - } - }); - - wiredModelButton.setBackground(new java.awt.Color(20, 114, 105)); - wiredModelButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/wireframe.png"))); // NOI18N - wiredModelButton.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); - wiredModelButton.setOpaque(true); - wiredModelButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mouseClicked(java.awt.event.MouseEvent evt) { - wiredModelButtonMouseClicked(evt); - } - }); - - homeButton.setBackground(new java.awt.Color(20, 114, 105)); - homeButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/home.png"))); // NOI18N - homeButton.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); - homeButton.setOpaque(true); - homeButton.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { - public void mouseMoved(java.awt.event.MouseEvent evt) { - homeButtonMouseMoved(evt); - } - }); - homeButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mouseClicked(java.awt.event.MouseEvent evt) { - homeButtonMouseClicked(evt); - } - public void mouseExited(java.awt.event.MouseEvent evt) { - homeButtonMouseExited(evt); - } - }); - - minimize.setBackground(new java.awt.Color(20, 114, 105)); - minimize.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/minimize.png"))); // NOI18N - minimize.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); - minimize.setOpaque(true); - minimize.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { - public void mouseMoved(java.awt.event.MouseEvent evt) { - minimizeMouseMoved(evt); - } - }); - minimize.addMouseListener(new java.awt.event.MouseAdapter() { - public void mouseClicked(java.awt.event.MouseEvent evt) { - minimizeMouseClicked(evt); - } - public void mouseExited(java.awt.event.MouseEvent evt) { - minimizeMouseExited(evt); - } - }); - - javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); - jPanel1.setLayout(jPanel1Layout); - jPanel1Layout.setHorizontalGroup( - jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel1Layout.createSequentialGroup() - .addContainerGap() - .addComponent(homeButton) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(newProject, javax.swing.GroupLayout.PREFERRED_SIZE, 198, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(wiredModelButton, javax.swing.GroupLayout.PREFERRED_SIZE, 187, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(minimize) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(close, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE) - .addContainerGap()) - ); - jPanel1Layout.setVerticalGroup( - jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(homeButton, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup() - .addGap(0, 0, Short.MAX_VALUE) - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(newProject, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(close, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(wiredModelButton, javax.swing.GroupLayout.DEFAULT_SIZE, 77, Short.MAX_VALUE) - .addComponent(minimize, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) - ); - + jPanel2.setBackground(new java.awt.Color(0, 174, 163)); + jPanel2.setFont(new java.awt.Font("Arial", 1, 13)); // NOI18N + jPanel2.setPreferredSize(getPreferredSize()); jPanel2.setLayout(new java.awt.CardLayout()); startingPanel.setBackground(new java.awt.Color(0, 174, 163)); startingPanel.setToolTipText(""); + startingPanel.setMaximumSize(new java.awt.Dimension(0, 0)); + startingPanel.setPreferredSize(new java.awt.Dimension(1200, 800)); + startingPanel.setRequestFocusEnabled(false); logo.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/logo3.png"))); // NOI18N @@ -427,43 +392,28 @@ public class UserInterface extends javax.swing.JFrame { compareTwoMain.setBackground(new java.awt.Color(0, 174, 163)); - JLabel8.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/compareTwoStart.png"))); // NOI18N - javax.swing.GroupLayout compareTwoMainLayout = new javax.swing.GroupLayout(compareTwoMain); compareTwoMain.setLayout(compareTwoMainLayout); compareTwoMainLayout.setHorizontalGroup( compareTwoMainLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(compareTwoMainLayout.createSequentialGroup() - .addGap(15, 15, 15) - .addComponent(JLabel8, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addContainerGap()) + .addGap(0, 177, Short.MAX_VALUE) ); compareTwoMainLayout.setVerticalGroup( compareTwoMainLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, compareTwoMainLayout.createSequentialGroup() - .addGap(0, 28, Short.MAX_VALUE) - .addComponent(JLabel8, javax.swing.GroupLayout.PREFERRED_SIZE, 142, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(0, 170, Short.MAX_VALUE) ); compareTwoMain1.setBackground(new java.awt.Color(0, 174, 163)); - JLabel9.setBackground(new java.awt.Color(0, 174, 163)); - JLabel9.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/copareWithDatabaseStart.png"))); // NOI18N - javax.swing.GroupLayout compareTwoMain1Layout = new javax.swing.GroupLayout(compareTwoMain1); compareTwoMain1.setLayout(compareTwoMain1Layout); compareTwoMain1Layout.setHorizontalGroup( compareTwoMain1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, compareTwoMain1Layout.createSequentialGroup() - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(JLabel9, javax.swing.GroupLayout.PREFERRED_SIZE, 196, javax.swing.GroupLayout.PREFERRED_SIZE) - .addContainerGap()) + .addGap(0, 220, Short.MAX_VALUE) ); compareTwoMain1Layout.setVerticalGroup( compareTwoMain1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, compareTwoMain1Layout.createSequentialGroup() - .addContainerGap() - .addComponent(JLabel9, javax.swing.GroupLayout.DEFAULT_SIZE, 156, Short.MAX_VALUE)) + .addGap(0, 169, Short.MAX_VALUE) ); batchMain.setBackground(new java.awt.Color(0, 174, 163)); @@ -474,16 +424,17 @@ public class UserInterface extends javax.swing.JFrame { batchMain.setLayout(batchMainLayout); batchMainLayout.setHorizontalGroup( batchMainLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, batchMainLayout.createSequentialGroup() - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(batchMainLayout.createSequentialGroup() + .addContainerGap() .addComponent(JLabel10) - .addContainerGap()) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); batchMainLayout.setVerticalGroup( batchMainLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, batchMainLayout.createSequentialGroup() - .addGap(0, 0, Short.MAX_VALUE) - .addComponent(JLabel10, javax.swing.GroupLayout.PREFERRED_SIZE, 157, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(batchMainLayout.createSequentialGroup() + .addGap(25, 25, 25) + .addComponent(JLabel10) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); symetryMain.setBackground(new java.awt.Color(0, 174, 163)); @@ -518,8 +469,6 @@ public class UserInterface extends javax.swing.JFrame { .addComponent(JLabel11, javax.swing.GroupLayout.DEFAULT_SIZE, 167, Short.MAX_VALUE)) ); - jLabel6.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/divide.png"))); // NOI18N - viewerButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/modelView.png"))); // NOI18N viewerButton.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); viewerButton.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { @@ -536,49 +485,62 @@ public class UserInterface extends javax.swing.JFrame { } }); + JLabel8.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/compareTwoStart.png"))); // NOI18N + + JLabel9.setBackground(new java.awt.Color(0, 174, 163)); + JLabel9.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/copareWithDatabaseStart.png"))); // NOI18N + javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3); jPanel3.setLayout(jPanel3Layout); jPanel3Layout.setHorizontalGroup( jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel3Layout.createSequentialGroup() - .addGap(169, 169, 169) - .addComponent(viewerButton) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 237, Short.MAX_VALUE) - .addComponent(jLabel6) + .addContainerGap(17, Short.MAX_VALUE) + .addComponent(viewerButton, javax.swing.GroupLayout.PREFERRED_SIZE, 323, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, 18) + .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(compareTwoMain, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(compareTwoMain1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel3Layout.createSequentialGroup() - .addGap(135, 135, 135) - .addComponent(compareTwoMain, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(JLabel8, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGap(62, 62, 62)) .addGroup(jPanel3Layout.createSequentialGroup() - .addGap(130, 130, 130) - .addComponent(compareTwoMain1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) - .addGap(81, 81, 81) + .addComponent(JLabel9, javax.swing.GroupLayout.PREFERRED_SIZE, 196, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(batchMain, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGroup(jPanel3Layout.createSequentialGroup() .addGap(12, 12, 12) .addComponent(symetryMain, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) - .addGap(170, 170, 170)) + .addContainerGap(42, Short.MAX_VALUE)) ); jPanel3Layout.setVerticalGroup( jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel3Layout.createSequentialGroup() - .addGap(27, 27, 27) + .addGroup(jPanel3Layout.createSequentialGroup() .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jLabel6, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addGroup(jPanel3Layout.createSequentialGroup() + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel3Layout.createSequentialGroup() + .addContainerGap() .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(compareTwoMain, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(batchMain, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(JLabel8, javax.swing.GroupLayout.PREFERRED_SIZE, 142, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(compareTwoMain, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(jPanel3Layout.createSequentialGroup() + .addComponent(batchMain, javax.swing.GroupLayout.PREFERRED_SIZE, 173, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(28, 28, 28))) .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(compareTwoMain1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(symetryMain, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))) + .addComponent(symetryMain, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addGroup(jPanel3Layout.createSequentialGroup() + .addGap(296, 296, 296) + .addComponent(JLabel9, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGap(8, 8, 8))) .addContainerGap()) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel3Layout.createSequentialGroup() - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGap(0, 0, Short.MAX_VALUE) .addComponent(viewerButton) - .addGap(70, 70, 70)) + .addGap(41, 41, 41)) ); javax.swing.GroupLayout startingPanelLayout = new javax.swing.GroupLayout(startingPanel); @@ -586,27 +548,28 @@ public class UserInterface extends javax.swing.JFrame { startingPanelLayout.setHorizontalGroup( startingPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(startingPanelLayout.createSequentialGroup() - .addContainerGap() - .addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addContainerGap()) - .addGroup(startingPanelLayout.createSequentialGroup() - .addGap(643, 643, 643) - .addComponent(logo, javax.swing.GroupLayout.PREFERRED_SIZE, 218, javax.swing.GroupLayout.PREFERRED_SIZE) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addContainerGap(81, Short.MAX_VALUE) + .addGroup(startingPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, startingPanelLayout.createSequentialGroup() + .addComponent(logo, javax.swing.GroupLayout.PREFERRED_SIZE, 218, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(400, 400, 400))) + .addContainerGap(81, Short.MAX_VALUE)) ); startingPanelLayout.setVerticalGroup( startingPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(startingPanelLayout.createSequentialGroup() - .addGap(205, 205, 205) + .addContainerGap(133, Short.MAX_VALUE) .addComponent(logo, javax.swing.GroupLayout.PREFERRED_SIZE, 124, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(128, 128, 128) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(200, 200, 200)) + .addContainerGap(136, Short.MAX_VALUE)) ); jPanel2.add(startingPanel, "card3"); symetryPanel.setBackground(new java.awt.Color(0, 174, 163)); + symetryPanel.setPreferredSize(new java.awt.Dimension(1200, 800)); javax.swing.GroupLayout viewerPanelLayout = new javax.swing.GroupLayout(viewerPanel); viewerPanel.setLayout(viewerPanelLayout); @@ -614,14 +577,14 @@ public class UserInterface extends javax.swing.JFrame { viewerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(viewerPanelLayout.createSequentialGroup() .addContainerGap() - .addComponent(canva1, javax.swing.GroupLayout.DEFAULT_SIZE, 652, Short.MAX_VALUE) + .addComponent(canvasSymmetryPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 553, Short.MAX_VALUE) .addContainerGap()) ); viewerPanelLayout.setVerticalGroup( viewerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(viewerPanelLayout.createSequentialGroup() .addContainerGap() - .addComponent(canva1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(canvasSymmetryPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 588, Short.MAX_VALUE) .addContainerGap()) ); @@ -666,35 +629,40 @@ public class UserInterface extends javax.swing.JFrame { symetryPanelLayout.setHorizontalGroup( symetryPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(symetryPanelLayout.createSequentialGroup() - .addContainerGap(125, Short.MAX_VALUE) + .addContainerGap(78, Short.MAX_VALUE) .addComponent(viewerPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 94, Short.MAX_VALUE) + .addGap(72, 72, 72) .addGroup(symetryPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(symmetryPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 580, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGroup(symetryPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) - .addComponent(reloadModelButton, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(exportModelButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) - .addContainerGap(81, Short.MAX_VALUE)) + .addComponent(exportModelButton) + .addComponent(reloadModelButton) + .addComponent(symmetryPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 461, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addComponent(filler1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(filler2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); symetryPanelLayout.setVerticalGroup( symetryPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, symetryPanelLayout.createSequentialGroup() - .addGap(118, 118, 118) - .addGroup(symetryPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addGroup(symetryPanelLayout.createSequentialGroup() + .addComponent(filler2, javax.swing.GroupLayout.PREFERRED_SIZE, 58, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 46, Short.MAX_VALUE) + .addGroup(symetryPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addGroup(symetryPanelLayout.createSequentialGroup() .addComponent(symmetryPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 189, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(exportModelButton) .addGap(18, 18, 18) .addComponent(reloadModelButton)) - .addComponent(viewerPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addGap(182, 182, 182)) + .addComponent(viewerPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(filler1, javax.swing.GroupLayout.PREFERRED_SIZE, 51, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(93, 93, 93)) ); jPanel2.add(symetryPanel, "card3"); modelViewPanel.setBackground(new java.awt.Color(0, 174, 163)); modelViewPanel.setToolTipText(""); + modelViewPanel.setPreferredSize(new java.awt.Dimension(1200, 800)); reloadModelButton1.setBackground(new java.awt.Color(0, 174, 163)); reloadModelButton1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/loadModel.png"))); // NOI18N @@ -720,62 +688,68 @@ public class UserInterface extends javax.swing.JFrame { jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel4Layout.createSequentialGroup() .addContainerGap() - .addComponent(canva2, javax.swing.GroupLayout.DEFAULT_SIZE, 1040, Short.MAX_VALUE) - .addContainerGap()) + .addComponent(canvasModelView, javax.swing.GroupLayout.PREFERRED_SIZE, 795, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); jPanel4Layout.setVerticalGroup( jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel4Layout.createSequentialGroup() - .addContainerGap() - .addComponent(canva2, javax.swing.GroupLayout.PREFERRED_SIZE, 778, javax.swing.GroupLayout.PREFERRED_SIZE) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel4Layout.createSequentialGroup() + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(canvasModelView, javax.swing.GroupLayout.PREFERRED_SIZE, 553, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(98, 98, 98)) ); javax.swing.GroupLayout modelViewPanelLayout = new javax.swing.GroupLayout(modelViewPanel); modelViewPanel.setLayout(modelViewPanelLayout); modelViewPanelLayout.setHorizontalGroup( modelViewPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(modelViewPanelLayout.createSequentialGroup() - .addContainerGap(156, Short.MAX_VALUE) + .addComponent(filler3, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, modelViewPanelLayout.createSequentialGroup() + .addContainerGap(87, Short.MAX_VALUE) .addComponent(jPanel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(60, 60, 60) + .addGap(18, 18, 18) .addComponent(reloadModelButton1) - .addGap(95, 95, 95)) + .addContainerGap(95, Short.MAX_VALUE)) + .addComponent(filler4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); modelViewPanelLayout.setVerticalGroup( modelViewPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, modelViewPanelLayout.createSequentialGroup() - .addContainerGap(169, Short.MAX_VALUE) + .addGroup(modelViewPanelLayout.createSequentialGroup() + .addComponent(filler3, javax.swing.GroupLayout.PREFERRED_SIZE, 73, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 87, Short.MAX_VALUE) .addGroup(modelViewPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(reloadModelButton1) - .addComponent(jPanel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addContainerGap(224, Short.MAX_VALUE)) + .addComponent(jPanel4, javax.swing.GroupLayout.PREFERRED_SIZE, 579, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(reloadModelButton1)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(filler4, javax.swing.GroupLayout.PREFERRED_SIZE, 31, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap(92, Short.MAX_VALUE)) ); jPanel2.add(modelViewPanel, "card4"); + modelViewPanel.getAccessibleContext().setAccessibleName(""); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(topPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jPanel1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() - .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(topPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addContainerGap(847, Short.MAX_VALUE)) + .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 52, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(topPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 239, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(0, 565, Short.MAX_VALUE)) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() - .addGap(0, 0, Short.MAX_VALUE) - .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addComponent(jPanel2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); + topPanel.getAccessibleContext().setAccessibleName(""); + pack(); setLocationRelativeTo(null); }// </editor-fold>//GEN-END:initComponents @@ -798,30 +772,6 @@ public class UserInterface extends javax.swing.JFrame { } }//GEN-LAST:event_newProjectMouseExited - /** - * - * @param evt Changes back the backround of the close button - */ - private void closeMouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_closeMouseMoved - setLabelBackround(close); - }//GEN-LAST:event_closeMouseMoved - - /** - * - * @param evt Changes back the backround of the close button - */ - private void closeMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_closeMouseExited - resetLabelBackround(close); - }//GEN-LAST:event_closeMouseExited - - /** - * - * @param evt Close the application - */ - private void closeMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_closeMousePressed - System.exit(0); - }//GEN-LAST:event_closeMousePressed - /** * * @param evt While moved with mouse, symmetry label changes @@ -839,7 +789,7 @@ public class UserInterface extends javax.swing.JFrame { topPanel.setVisible(false); pressedNewProject = false; switchPanelOnMainPanel(actualPanel); - newProject.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/new_project.png"))); + newProject.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/newP.png"))); }else{ topPanel.setVisible(true); topPanel.add(jPanel1); @@ -864,7 +814,9 @@ public class UserInterface extends javax.swing.JFrame { private void symetryEstimatorMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_symetryEstimatorMouseClicked switchPanelOnMainPanel(symetryPanel); topPanel.setVisible(false); - newProject.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/new_project.png"))); + ImageIcon icon = new ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/newP.png")); + + newProject.setIcon(icon); resetLabelBackround(newProject); }//GEN-LAST:event_symetryEstimatorMouseClicked @@ -908,9 +860,10 @@ public class UserInterface extends javax.swing.JFrame { * @param evt Loads the model that will be displayed */ private void reloadModelButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_reloadModelButtonMouseClicked - canva1.loadModel(); - symmetryPanel1.getOriginalModelButton().setVisible(false); - symmetryPanel1.getShowPlaneLabel().setVisible(false); + canvasSymmetryPanel.loadModel(); + if (canvasSymmetryPanel.isLoaded()) { + symmetryPanel1.showPlaneButtonsOnPanel(false); + } }//GEN-LAST:event_reloadModelButtonMouseClicked /** @@ -920,13 +873,13 @@ public class UserInterface extends javax.swing.JFrame { if (wiredModelClicked) { resetLabelBackround(wiredModelButton); wiredModelClicked = false; - canva1.setDrawWired(wiredModelClicked); - canva2.setDrawWired(wiredModelClicked); + canvasSymmetryPanel.setDrawWired(wiredModelClicked); + canvasModelView.setDrawWired(wiredModelClicked); } else { setLabelBackround(wiredModelButton); wiredModelClicked = true; - canva1.setDrawWired(wiredModelClicked); - canva2.setDrawWired(wiredModelClicked); + canvasSymmetryPanel.setDrawWired(wiredModelClicked); + canvasModelView.setDrawWired(wiredModelClicked); } }//GEN-LAST:event_wiredModelButtonMouseClicked @@ -967,7 +920,7 @@ public class UserInterface extends javax.swing.JFrame { * @param evt Loads the model that will be displayed */ private void reloadModelButton1MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_reloadModelButton1MouseClicked - canva2.loadModel(); + canvasModelView.loadModel(); }//GEN-LAST:event_reloadModelButton1MouseClicked /** @@ -1025,7 +978,7 @@ public class UserInterface extends javax.swing.JFrame { private void jLabel4MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jLabel4MouseClicked switchPanelOnMainPanel(symetryPanel); topPanel.setVisible(false); - newProject.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/new_project.png"))); + newProject.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/newP.png"))); resetLabelBackround(newProject); }//GEN-LAST:event_jLabel4MouseClicked @@ -1050,14 +1003,14 @@ public class UserInterface extends javax.swing.JFrame { * If there is not loaded model, user is warned */ private void exportModelButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_exportModelButtonMouseClicked - if (canva1.getModel().getFacets().isEmpty()){ + if (canvasSymmetryPanel.getModel().getFacets().isEmpty()){ JOptionPane.showMessageDialog(frameMain, "You have to load the model.", "Model not loaded", 0, new ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/notLoadedModel.png"))); } else { JFileChooser chooser = new JFileChooser(); chooser.showSaveDialog(symetryPanel); - MeshModelExporter exporter = new MeshModelExporter(canva1.getModel()); + MeshObjExporter exporter = new MeshObjExporter(canvasSymmetryPanel.getModel()); try { if (chooser.getSelectedFile() != null) { exporter.exportModelToObj(chooser.getSelectedFile()); @@ -1079,30 +1032,7 @@ public class UserInterface extends javax.swing.JFrame { jLabel4.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/symetryStartP.png"))); }//GEN-LAST:event_jLabel4MouseExited - /** - * - * @param evt Changes the backround of the minimize button - */ - private void minimizeMouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_minimizeMouseMoved - setLabelBackround(minimize); - }//GEN-LAST:event_minimizeMouseMoved - - /** - * - * @param evt Changes the backround of the minimize button - */ - private void minimizeMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_minimizeMouseExited - resetLabelBackround(minimize); - }//GEN-LAST:event_minimizeMouseExited - - /** - * - * @param evt Minimize the window of the app - */ - private void minimizeMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_minimizeMouseClicked - frameMain.setExtendedState(JFrame.ICONIFIED); - }//GEN-LAST:event_minimizeMouseClicked - + /** * @param args the command line arguments */ @@ -1121,8 +1051,7 @@ public class UserInterface extends javax.swing.JFrame { frameMain = new UserInterface(); frameMain.setBackground(new Color(49,165,154)); frameMain.pack(); - frameMain.setVisible(true); - + frameMain.setVisible(true); //enables to use design of operating system try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); @@ -1141,25 +1070,26 @@ public class UserInterface extends javax.swing.JFrame { private javax.swing.JLabel JLabel9; private javax.swing.JPanel batchMain; private javax.swing.JPanel batchProcessing; - private cz.fidentis.analyst.gui.Canvas canva1; - private cz.fidentis.analyst.gui.Canvas canva2; - private javax.swing.JLabel close; + private cz.fidentis.analyst.gui.Canvas canvasModelView; + private cz.fidentis.analyst.gui.Canvas canvasSymmetryPanel; private javax.swing.JPanel compareDB; private javax.swing.JPanel compareTwo; private javax.swing.JPanel compareTwoMain; private javax.swing.JPanel compareTwoMain1; private javax.swing.JLabel exportModelButton; + private javax.swing.Box.Filler filler1; + private javax.swing.Box.Filler filler2; + private javax.swing.Box.Filler filler3; + private javax.swing.Box.Filler filler4; private javax.swing.JLabel homeButton; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; - private javax.swing.JLabel jLabel6; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2; private javax.swing.JPanel jPanel3; private javax.swing.JPanel jPanel4; - private javax.swing.JLabel minimize; private javax.swing.JPanel modelViewPanel; private javax.swing.JLabel newProject; private javax.swing.JLabel reloadModelButton; diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/angle.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/angle.png new file mode 100644 index 0000000000000000000000000000000000000000..a71d54c818db463afe8bd6eb558dff5c60de4629 GIT binary patch literal 7607 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 b${&r=30bm<y*b#$f34bB>@v?cbr1VLNqJm6 literal 0 HcmV?d00001 diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/close.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/close.png index a01fdd3aad41bcc3cdf66278c65a43a61286d22d..bece4b869e31b64d58c4bcaf62ee749dc7fed49e 100644 GIT binary patch delta 771 zcmaDOd{RiUGr-TCmrII^fq{Y7)59eQNE-pM9tRtc%+mG>+^AT|#BOe7YGP$*IC&wH zf`Eyxp?Qd*p_Q?bm8q$=fzjlPOwyQwf0*Qz(~Of13``A;bW@B>jdYFDOpJAtk}XVi zlMR#1Qj$|rQ!Py=+c9gaq@|^pr<x|G=_XsGB<rRoo0#ibrX?rprkN)u0fmiIjLj@3 z_cE)fn3$SdB%36r>6#`R80w}ZnV9M(rKDNvnwpxMCmR{3m>C#ZPQJ>#R+$KeljB&W z;r?o1wVKSxYNcXiZkb|XkZh!zl$dO+Ym{VSsGDS(WCFCx(!esw*uo;wFnMx3s}z#P zHV-1anXIHxT;f_*VpX1znrEwIWME{VYk(e*oBh}(FxIcvzLLVg!07Mk;uw<A`1Z!_ z+(Qlmtq*5v@a|~cGC|CPGxMPC1*fP2-GHWO5AKC6_WIop-`161)JaM?JMmA0{^_3| zWLZ=AE2~Qz<2XCEvmA+LdZf$vaau#g={$w^*BC=WU0fO*L-p6*W^}&wZ<5{Ys*;<^ zE3a@$$Vb}e8h@#Oq0mq&)i5*K%y8z{=O*W`EM`whnyaJM%<zNR&eoym=_ZK>Q=Gq8 z7`<V>Q}^<$ZE!^0i_(tr#*kBerc10(u%!t<6uQ))8Oz}_dD^Kh&#Iiyi2N3v*njlR z=2dl56{gud6=a=}(kmcnxg^#9=cRkkPej<eUXv*9pErT&QTrcD<J_GsA_AB1e)8?% z_TViH{}vJT{;9x&-K>E(i{1GrJl!1jb=8&wKPrCt9$h!%nRoV~GfTb;X7}fryU5iz tpE;0YyN0>qWZu6T4iukzJM4KXuT-&DVV1|%6~J`O;OXk;vd$@?2>|S45+?uv delta 938 zcmX>p^hQ{*Gr-TCmrII^fq{Y7)59eQNb7+x2OE$K->GfBQL&PV-NMS$*vi;=@<JvB z0b^YwlMq8=D^o)&BV%m?!^sz!q%j5mFv%-hm>OE7C7PP)CYo5L=_aO{80jXNCz<P- zr6wC2rKA`b8CguWW7bwlG&f4MG&D@rHAyl~(@ixpG10Y5vPjf5NH#FGFif#XPBAo| z+{>(@l4@y`Y?f?ps%w;-ma1!LXkwsiVPa{ao0ep3Xl`m`nVM#vGWja=TH+MOvr54| z*1&2tnUU2>B`Gz{D9zB)K-b93&{#Jm31ow*xuLFkTAHy*T9Q#(a*E|-RE=$}MEEmV zNujvJwXDRdJR>#FR>{b~$UxTsB_t;|um)_N&F0KlzoJ}k3j+h=Cr=m0kc`H+Gd5<6 zI7+zRkL6HwaTIXv=<Fy{y1~x5^On7$LdT+x`sRf6;)BPoxe4Tm1VwfVvFI|1HE|hw zY`Eao6Cp9BT5R@%)O<4)<I{5v))t(-^XJFCvo&Y#<awvsUy|GApwnBCC-w1;$)lZ_ zM~W|ZJXZ_dQ_t(;@?=><^UBuX9UL|+e(w~G+4nHKV{%`lz1ncTVQJjo%!9^X-{=(? zzgksaxyJ9f#gVT0f#!G4xo_R<{A|mvm{Wg(o)>lbuPT>GS?W}GD=GX`O!pdj-9D>D zdLbvye>-cvPLK7OuF4fZq2r6L?`B*X`gPCIb1h4D&%U{^b8+A5dUM$~KTW@;wtlI| zx@&bL(EaM^S5*#M%3fL>4ZQtI^=q`lj`WL{7nfdL{rS{;M*jx?#`kp$`HlCthORC= zy8Oy>>n$gLJ?q=@Z)uq2!v~gkgZEE4wr}-yUz@;JLiREft}R-wzvFM${YPc1YF2$| zsj^qN_I9>$cA;i#-Hj6lM~+{qu4i1x&bZL8wdRYfh<2?*t%yKmNPlRG)vI=gXKp>t zZwhxX?$PemWeRUNFFJGifvZ99OgD(63haCoy|!p|{?h(;M&(|$OZRR3Q7sd?f2rsC znf#2#2dWcN`F9o{2v5-6R<P>Fg&+CzKef9l&ztRLV-Amjo7*4NGyK{rv|HPMSG5o@ P`!RUB`njxgN@xNAL_lwo diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/compareTwoFaces.svg b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/compareTwoFaces.svg new file mode 100644 index 00000000..358839af --- /dev/null +++ b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/compareTwoFaces.svg @@ -0,0 +1,85 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0 141.7 141.7" style="enable-background:new 0 0 141.7 141.7;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:#147269;} + .st1{enable-background:new ;} + .st2{fill:#FFFFFF;} + .st3{clip-path:url(#SVGID_2_);fill:#FFFFFF;} + .st4{clip-path:url(#SVGID_4_);fill:#FFFFFF;} + .st5{fill:none;} +</style> +<g> + <rect x="5.4" y="5.4" class="st0" width="131" height="131"/> + <g class="st1"> + <path class="st2" d="M35.7,111.7h-0.9c-0.1-0.9-0.7-1.5-1.7-1.5c-1.2,0-1.9,1-1.9,2.6s0.7,2.6,1.9,2.6c1,0,1.6-0.6,1.7-1.6h0.9 + c-0.1,1.4-1.1,2.3-2.6,2.3c-1.7,0-2.8-1.3-2.8-3.3c0-2.1,1.1-3.3,2.8-3.3C34.7,109.4,35.6,110.4,35.7,111.7z"/> + <path class="st2" d="M42.4,112.8c0,2-1.1,3.3-2.9,3.3s-2.9-1.3-2.9-3.3s1.1-3.3,2.9-3.3S42.4,110.7,42.4,112.8z M37.4,112.8 + c0,1.6,0.8,2.6,2,2.6c1.3,0,2-1,2-2.6s-0.8-2.6-2-2.6C38.2,110.2,37.4,111.2,37.4,112.8z"/> + <path class="st2" d="M49.5,116v-3.3c0-0.8,0-1.6,0-2.4h0c-0.3,0.8-0.6,1.6-0.9,2.4l-1.2,3.3h-1l-1.2-3.3c-0.3-0.8-0.6-1.6-0.9-2.4 + h0c0,0.8,0,1.6,0,2.4v3.3h-0.8v-6.4H45l1.2,3.2c0.3,0.8,0.6,1.6,0.8,2.5h0c0.3-0.8,0.6-1.6,0.8-2.5l1.2-3.2h1.3v6.4H49.5z"/> + <path class="st2" d="M54.2,109.6c1.5,0,2.2,0.8,2.2,1.9c0,1.2-0.8,1.9-2.2,1.9h-1.4v2.5H52v-6.4H54.2z M52.9,112.7h1.3 + c1,0,1.4-0.5,1.4-1.2c0-0.8-0.5-1.2-1.4-1.2h-1.3V112.7z"/> + <path class="st2" d="M57.8,114.1l-0.7,1.9h-0.9l2.4-6.4h1.1l2.4,6.4h-0.9l-0.7-1.9H57.8z M60.1,112.8c-0.3-0.9-0.6-1.7-0.9-2.6h0 + c-0.3,0.9-0.6,1.7-0.9,2.6l-0.2,0.6h2.3L60.1,112.8z"/> + <path class="st2" d="M64.9,109.6c1.5,0,2.3,0.6,2.3,1.7c0,0.8-0.5,1.4-1.2,1.6v0c0.5,0.1,0.7,0.4,1,1.2l0.7,1.8h-0.9l-0.6-1.7 + c-0.3-0.8-0.6-1-1.2-1h-1.1v2.7h-0.8v-6.4H64.9z M63.7,112.6h1.2c1,0,1.4-0.5,1.4-1.2c0-0.7-0.5-1.1-1.5-1.1h-1.1V112.6z"/> + <path class="st2" d="M69.5,110.3v2h3.1v0.7h-3.1v2.2h3.4v0.7h-4.2v-6.4h4.1v0.7H69.5z"/> + <path class="st2" d="M79.9,111.5c0,1.1-0.7,1.6-1.7,2.1c-1.2,0.7-1.5,1.1-1.5,1.7H80v0.7h-4.2c0-0.1,0-0.1,0-0.2 + c0-1.2,0.3-1.8,1.8-2.7c0.9-0.5,1.4-0.9,1.4-1.6c0-0.6-0.4-1-1.1-1c-0.8,0-1.1,0.4-1.2,1.2h-0.8c0-1.2,0.8-1.9,2-1.9 + C79.1,109.8,79.9,110.5,79.9,111.5z"/> + <path class="st2" d="M84.2,110.3v2.2h3v0.7h-3v2.7h-0.8v-6.4h4v0.7H84.2z"/> + <path class="st2" d="M88.8,114.1l-0.7,1.9h-0.9l2.4-6.4h1.1l2.4,6.4h-0.9l-0.7-1.9H88.8z M91.1,112.8c-0.3-0.9-0.6-1.7-0.9-2.6h0 + c-0.3,0.9-0.6,1.7-0.9,2.6l-0.2,0.6h2.3L91.1,112.8z"/> + <path class="st2" d="M98.8,111.7h-0.9c-0.1-0.9-0.7-1.5-1.7-1.5c-1.2,0-1.9,1-1.9,2.6s0.7,2.6,1.9,2.6c1,0,1.6-0.6,1.7-1.6h0.9 + c-0.1,1.4-1.1,2.3-2.6,2.3c-1.7,0-2.8-1.3-2.8-3.3c0-2.1,1.1-3.3,2.8-3.3C97.8,109.4,98.7,110.4,98.8,111.7z"/> + <path class="st2" d="M100.9,110.3v2h3.1v0.7h-3.1v2.2h3.4v0.7h-4.2v-6.4h4.1v0.7H100.9z"/> + <path class="st2" d="M109.6,111.5h-0.8c0-0.9-0.5-1.4-1.5-1.4c-0.8,0-1.3,0.4-1.3,1c0,0.7,0.5,0.9,1.5,1.1 + c1.2,0.3,2.2,0.6,2.2,1.9c0,1.2-0.9,1.9-2.3,1.9c-1.5,0-2.4-0.8-2.4-2.3h0.9c0,1.1,0.6,1.5,1.5,1.5c0.9,0,1.4-0.4,1.4-1.1 + c0-0.7-0.5-0.9-1.6-1.2c-1.2-0.3-2.2-0.6-2.2-1.9c0-1,0.8-1.8,2.1-1.8C108.8,109.4,109.6,110.2,109.6,111.5z"/> + </g> + <g> + <g> + <g> + <defs> + <ellipse id="SVGID_1_" cx="49.1" cy="62.4" rx="23.8" ry="29.7"/> + </defs> + <clipPath id="SVGID_2_"> + <use xlink:href="#SVGID_1_" style="overflow:visible;"/> + </clipPath> + <path class="st3" d="M65.4,68.5c-0.2,0.5-0.5,0.9-0.8,1.3s-0.7,0.6-1.2,0.6c-0.5-0.1-0.9,0.2-1,0.7c-0.1,0.3-0.1,0.7-0.2,1.1 + c-0.2,3.4-1.4,6.4-3.9,8.8c-0.3,0.3-0.5,0.6-0.5,1.1c0.1,1.9,0,3.8,0.1,5.8c0.1,1.9,0.7,3.5,1.8,4.6c-0.6,0.5-1.3,1-2.1,1.4 + c-0.2,0.1-0.3,0.1-0.5,0.2c-0.9,0.2-1.8,0.4-2.6,0.5c-1.9,0.1-3.8,0.1-5.7,0c-1.1,0-2.3-0.1-3.4-0.1c-0.7-0.1-1.3-0.1-2-0.3 + c-1.7-0.3-3.4-0.9-4.8-1.9c0.5-0.6,0.9-1.2,1.2-2s0.4-1.7,0.4-2.6c0.1-1.9,0.1-3.8,0.2-5.8c0-0.2-0.1-0.5-0.3-0.6 + c-1.6-1.7-2.9-3.6-3.5-5.8c-0.3-1-0.4-2.1-0.6-3.1c-0.1-0.4-0.1-0.8-0.2-1.2c-0.1-0.5-0.5-0.8-1-0.7c-0.7,0.1-1.2-0.3-1.5-0.8 + c-0.5-0.8-0.9-1.7-1.2-2.5c-0.5-1.4-0.6-2.9-0.5-4.4c0.1-0.8,0.4-1.1,1.2-1.1c0.2,0,0.5-0.1,0.7-0.1c0.9-0.3,0.9-0.5,0.8-1.3 + c-0.2-2.3-0.5-4.6-0.6-6.9c-0.3-5.4,2.2-9.4,6.7-12.2c6.8-4.3,16.1-2.7,21,3.5c2,2.5,2.9,5.3,2.7,8.5c-0.1,2.3-0.4,4.6-0.6,6.9 + c-0.1,1.1,0.2,1.4,1.3,1.6c1.2,0.1,1.4,0.4,1.5,1.5C66.5,64.9,66.2,66.7,65.4,68.5z M49.2,50.4c-5.7,0-10.3,6.3-10.3,14.1 + s4.6,14.1,10.3,14.1s10.3-6.3,10.3-14.1S54.9,50.4,49.2,50.4z"/> + </g> + </g> + <g> + <g> + <defs> + <ellipse id="SVGID_3_" cx="92.8" cy="62.4" rx="23.8" ry="29.7"/> + </defs> + <clipPath id="SVGID_4_"> + <use xlink:href="#SVGID_3_" style="overflow:visible;"/> + </clipPath> + <path class="st4" d="M109.1,68.5c-0.2,0.5-0.5,0.9-0.8,1.3s-0.7,0.6-1.2,0.6c-0.5-0.1-0.9,0.2-1,0.7c-0.1,0.3-0.1,0.7-0.2,1.1 + c-0.2,3.4-1.4,6.4-3.9,8.8c-0.3,0.3-0.5,0.6-0.5,1.1c0.1,1.9,0,3.8,0.1,5.8c0.1,1.9,0.7,3.5,1.8,4.6c-0.6,0.5-1.3,1-2.1,1.4 + c-0.2,0.1-0.3,0.1-0.5,0.2c-0.9,0.2-1.8,0.4-2.6,0.5c-1.9,0.1-3.8,0.1-5.7,0c-1.1,0-2.3-0.1-3.4-0.1c-0.7-0.1-1.3-0.1-2-0.3 + c-1.7-0.3-3.4-0.9-4.8-1.9c0.5-0.6,0.9-1.2,1.2-2c0.3-0.8,0.4-1.7,0.4-2.6c0.1-1.9,0.1-3.8,0.2-5.8c0-0.2-0.1-0.5-0.3-0.6 + c-1.6-1.7-2.9-3.6-3.5-5.8c-0.3-1-0.4-2.1-0.6-3.1c-0.1-0.4-0.1-0.8-0.2-1.2c-0.1-0.5-0.5-0.8-1-0.7c-0.7,0.1-1.2-0.3-1.5-0.8 + c-0.5-0.8-0.9-1.7-1.2-2.5c-0.5-1.4-0.6-2.9-0.5-4.4c0.1-0.8,0.4-1.1,1.2-1.1c0.2,0,0.5-0.1,0.7-0.1c0.9-0.3,0.9-0.5,0.8-1.3 + c-0.2-2.3-0.5-4.6-0.6-6.9c-0.3-5.4,2.2-9.4,6.7-12.2c6.8-4.3,16.1-2.7,21,3.5c2,2.5,2.9,5.3,2.7,8.5c-0.1,2.3-0.4,4.6-0.6,6.9 + c-0.1,1.1,0.2,1.4,1.3,1.6c1.2,0.1,1.4,0.4,1.5,1.5C110.2,64.9,109.9,66.8,109.1,68.5z M92.9,50.4c-5.7,0-10.3,6.3-10.3,14.1 + s4.6,14.1,10.3,14.1s10.3-6.3,10.3-14.1S98.6,50.4,92.9,50.4z"/> + </g> + </g> + <path class="st5" d="M38.4,60.9h72.2H38.4z"/> + <rect x="38.4" y="63.7" class="st2" width="68.7" height="3.3"/> + </g> +</g> +</svg> diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/curvature.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/curvature.png new file mode 100644 index 0000000000000000000000000000000000000000..c19d8f2dfe9ddd708ee75b102dd3f913c1d3bada GIT binary patch literal 7626 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 HePaIs!6a1< literal 0 HcmV?d00001 diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/distance.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/distance.png new file mode 100644 index 0000000000000000000000000000000000000000..6c31475bd90db4bc0c4deeeef48eaf05256314d4 GIT binary patch literal 6812 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 ONA|WZHhEV5TmBEaIG82? literal 0 HcmV?d00001 diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/home.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/home.png index 97b1fa093f2813822e88d035d808d94b44d5148c..59c019144b4eaf2f737b4234052143586c77d27f 100644 GIT binary patch delta 518 zcmew?v_ojaK_&qcT|@H_LqjWLQ!67=Z3Cmp7n!6n1^+O~s~8!j8KtC|nCd1Pnp*0n znVT5uTAHVt>zbJ*SsJA!8k?r1nQpdcKF;Jpj7lYi;u6=g607oz)I3`yBLgD?T?2Ht zZ1!WDz*w&xGewqxfzi&>#W5tK@$EFjyh9EGuKyRAc*H2UW=!UGDTz@uRXyd{6#Z@j zbHFc|OpVD_t~(fo&U!Oy3r?AOlef=3ZQhnmv+b?V$DI~t_}b`roi~O{d}CX8#9`Mp zg?E({TQ*N$vT{ke=jAgoat_~4t*~V;dvlZV^R{1Et}GJu4BmC=oF?;H&bc-S2B@nj znHm^rGxao<HoK(o_MGix5Kbsw=90qfbEbpAIAOM?;7z8@ey$A+A+1cyLmYmT3np-^ z(NhtOWIQZ1Q9%0ildvG&mm5{?9GJaC-80^DVbH{M&+_))(<d=;t~&fR_)@mt29GBd zEek$)s=WI5!>wpX%)5mbmG%nm%-r~`{oCW;n*5XA>F<kvS^q?1e$vDn`4hSREM0$3 zMi=a##pX&&oflhHeRhjEBBhta3-jbdrE5Rf&KIx#GBf+HC<739y85}Sb4q9e09*3J ADgXcg delta 579 zcmdlX^jT=bK_&qsT|=V~LqjVgODhv&Z3Dx}7n!6n1^+O~t5~F(8d;hpo9Y^+SXk&9 zCYq$^TBeyL>6%!irlq7>8l|L}8E&>`KF;Jyj7lYi;u6=g607oz)I3`yBLgD?T>})i zOm1Ke*gTufnX&%Kq8m*N42+eYE{-7?jc;!(%sb@3(Ejm%??g=&;T^24QvL?*Pes$z z#7gETu=Tp@+>~SD=4y3)=<!T&$HWQwZKs8<O-tLm&Am9jNn!7uyZzIatYr*o&s%k` zVKvi{?Ld?_nNK3Q$e-_yXO(?zt?98E>lwyB9qt@I*d&{9GQZw?!Q+H`KmLj_GRigT z*57984`*a-J7C9_c$?XIy`lq)Ot8Q<Wr0d|##skUm>=xXyzqsIX-nfzdx3417uJa| zeQEIJYsqE)qSeU2oba3>@it>~km3Oj3k#PUd<Rw(a9m(eV`Vruo1xc9!GU|m)P@ab z8>R(wTwuMXs+5zxU^Z)g(Z_e<6_d71y0YJ7Tf?tOVasioOygplr>d*+bl=U>f$o<c zZJGXLlAox7-fyc@7bMv0zpZHMb&st7amz-Lts|ecBmXMfq#srq?(vh##E;$at}57> zAvnQ2`AqsPh6k>f+E2S?7iR)h!O>N=q(^eu>o?w-Gm+urT8Uc@bqu+@Q(MZ@dF&a0 Nz|+;wWt~$(69CzU-ueIl diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/info.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/info.png new file mode 100644 index 0000000000000000000000000000000000000000..0a1bd5107153871284fb876b4bda54f1bafc0f8a GIT binary patch literal 2431 zcmcImeQXnD94-Wz<0GJgC^B+8Fv7<5?!Aw;cU##;JLo1Ib1NAT|KPp5x9hpKSMP3X zH$EmBrV}9>28H+!ApU`$BP1+wBp8to-3(5MBqA7v7$i#|B7>+=-|N~j%ou25lk2^G z@44sq{NCU5d*8NKS1p@5Y4#+C!!flY;IF~=$MN;VgA?(0d;a_gzU3wYt4)W)InTbv zrQRuNayW8!YoS%vs^D@-(PK`i>N0YsVhN0PIEqVB38*w6i;z*h7Wa}@dybHVrh3Ub zA;<(1J`~XcEe5J>sR}7A4T`9eC5wsTl!OUl$bv*F7LA)y%1fqsB|NsLX_81otOhSx zW(Ooz1*-|4ZXiN%x+n$kEa4WNz{Q9xzldNN;HDWj4LFJc662CMk;r^V9L-R}QjLFU zCKmqXB_o!VkZ3xYOgfXCQ#a~qAc`W*ur$k37(toMaSNuXxH&J&;76unXbDTx<Alu! zWxdhzl33|b3bDj6ZQRT(6J9Vn1rs!IGImN?U@$l~G!`31n^t)fj*`(kDzO=AP9VAl znR=t4pz<aZx8`MoB_g_|n-Tpk+J+zBp-@$Z111`cXnJ{6g+@^n!`vpug0#Mb<TDVo zbR(qe(QKirvk?iOk62Kr#Z^6NF0}Pz;K&ax<Rx*<L<+DJ!-s%d5_k!KLc4g(5HyHg zph62~!7M{D0<LZd0Ey=$hA(8;+hASQ!p-*s4F;u(xM{(-f-3x85{q(bnkoq_R0YoE zp?KBfrXb{1N)#C!5-K8O1OTC1OzXn$`*o$!UI+XAA=9e5f;ooQQW8Xg;W(A0Jc=M< zO5Q_>vdZC+;_(O~5Lp>z*;W`D?i&~#$!e=oF(WUyJqi!Ql%OzxQe|GCWHl^Og5Y*5 zET_5{7OT1)*QZByBdDu*b-9uA6+U0Jp@+37eqh!tTS8Qn`&>YDxhU2NNJ3Slux`X4 zwwV@#^@vWy>uu9x893d5X5tDrXWFP1J)apxH6raz2`Y9=cuB?f0#eD$v^L5z-(NyQ zw8;p<q+_^b2xjVGD+vu$R*y?^4-e9JlWxMMv4yj4QS~qiOUY2-C|2eHB?~f-Ya%kD z%y~QzDA~mS2jQ6|RU$B6kMQ0~lm9)H`?LC;HMnc@{reh>o(gSms6*bO|7pA1{?7JD z8SY-&lxC)$OJMzQWfza$lCsR;qPYahjev*ZJbajfGTwcV$ngv>LID7Gaau)GyB8N? z!?FT#XG4L*jsSSGfMF3)G6J$E%(zqlzzD81>ySix>|D~w5yuP`lAgk6mpvRlH1Ut& zV;9A-9}Ik`K3Z_B)!`Voxx!x-3bdbp<3QE;vKi&4W`8;@IzagqB##F>1HaCSc0E(M z=VH#S3Ed$2Uf#?HO4ddW?S7kWYl|$L4Em>UnlL$hqBE~eSTy6pbFUWN95~$EeDE7f zLg&9-Qv_=}{9Rp(o^I&sJvOH!$0)5F*yYIEoqJ~eiP)9FiFNSvV{<-p&YHHVpkwQ` z19Pi?$?N{$rARM&bIaM%LelX=L;HsO%~j-UHy=9MSa56G?~ch|JXv{W{Px1qrKQJ{ z-wp0HRt8__=`C#OURl+2b9u+UlbzeA_m>|py4<?)nsoWPF!!yfV|8cF0;=!*;MRBf zE1}spkW2U|_ek%K)9YHTL#>~D`LkFw*fisn!TI}9k8|7CmrkEJJZ1gIf1YD|`f68f z|LU>2&c53G*LUW#D>hql+sWdYd-IIKz)$--*7Qx^^;Ew6>^d;6xbcru$x!amftK|f zf85~NcaA%BHE<~qQzyNA;Sspt75cX=OAAVO4E8^Kd`kb-lZxwt&%qQQ*(7hccy|9^ d*T26pwX$yK!L_Y>y6wM673Ed_50|Wc@o(?LG$#N6 literal 0 HcmV?d00001 diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/info2.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/info2.png new file mode 100644 index 0000000000000000000000000000000000000000..d7f22dbeb4eb56fb7b9b7b9fd9650f094c21e421 GIT binary patch literal 2446 zcmcIme{2(F81Cj^V>lHe6Ncb%8$@8&`+e6tS4P*4tw84-ji4fMKfbQ#+Ft41){Z}f z`2(1c0YV50l94DG8o({6fki+AiXl!7B%%a?Kwv-=HAaob;dfnIh8Y7*Y;wK3@1A?! z=l$O2{l06ht*I)=FUq&sYz5wGPaQmugU9&1;qbq8Qb`b=MntQhGHf<`v2|o6-YRdh z*>c-8{{nM?Z?355VY{U2GO#DYQHZwL%E}W_NofEkB7=G@;zX}^A3_mLb)xfGAK{C- zK~Sq+76bE^)%cZV4T_+m<uj17ga`@3z?6_gI219&gcD8jitySR#!(~*F&mty%L<4r z@YN!2Jq8fg&S474PzW#BNsbUGrWBzFlE(=iCuxizMS>G)0ZIK(7%ip-#5&KcR4jPs zM1!Uo6>&TskK5z4U60k{q#y`5LE#jIK?G(rM@%V!MU3J!g9jK&OpBVD9ziTdN!A-p zCkmDJrx1>2Xd^~yn&5=t2`P$`cEU<24fOejhK9o#v|&~@!6+%cgAyD5<|x4HfT1_W z6j0d&B4%+qSTv}cx)IcGqb>9J7KN&k2^ejRg_6^wDmVy%FyuBMmQ3o4itZSYOg-k; z^-#J{wdsh6+l@RrUyG=E+?Z<VNx^|fGJz9?H4`wB!U)Ds@*>NKBstwG9?=i=K^Lf! zDW$;_fe|dMuAd}Dh7lQdIzin8>#7!Lz8k2|Cwe1>DMb|E^*B)|%C2duNKzb4^MJ<y zr_z|pF#vPO42cmcK?EE!DLW{T)CJ%7=t`qC57ztrrd4$Xa%ARGBsrRsWuCzphLJEX zzz~>&;z&#ia5AST0S8ShX|~5>8tfY>G?3L&r9wuA<sAwm1u#}2NKBO(7L(P0fUzvk zD-^AA1SO!z&A4toq{n=^3TKxdIPP`3Yh!vq3&96QT~!6*t#oswz;PI5Cs9OI#DE?P zOVDOoSgHqjG*WMw9?F2}R%-^VaC54S=7FWDtB{5yy(vnH)e=rrvAh6OG&QUZGR=3F zP(N)v2q5VYF6oCEdccfJG2p6)CAotK@!Lr^q^6;TQ@o%$2!+CANue>yvWCpc46KPj z2r}((NF=Q2|0X=etOTV<J%DQ~j{f&l?#}ABrgGcn`}Z{%JQdtpQ2V`w|I>Ci{hjU+ z7wlfklt!wa6;gesvNHy6Nm(Xf(Kr_40qMYK2NS>~8LmD+pc#S@B$g!kvZRWTb|)@C z1!P5H1x#XT=m?TgVP^{flL1^O0tBa$BsqX9$=WXwA3B#La=<nNg(QdI-ep~8Hcfbw z*>*t$`XL54)xXa4GB#V*Ca=fkuWtQtbLX52*Vx0$w^w+#Fw9C%^@XjWQAM%QM?R`z zJnQ;$_{+2S8!JDkEL&B`?`WSq-dxL%!Ca%JTq@anz9%vD>aJ~ve(GNL=a~udv+)f` z9^q3jbzGjZV)Xi4YG(fGZ1=fg!K{Mzw(ox_+?a?w++hRAuFg~T+I!wU)wAT_5d%9n zyt-lTjJEr?$&bBpW%L)$tVql5$vMS;%p7%EtC@ZAzKKsh_)_IJU$vpLAIKF;<DL^g zW{o^OE^kanZ{D~2vt3tSIDWFFtz`G5%8rJo7ezXasTcOQj{SK;@4|UK6R)?f8N2tz zgL_IwY?6<y+IiHt{tVB~U4$&|D*U?Y(|yLUp5K0bXoH&5<qt01a_W=WKfK%Bxqo%Z z<n`|zD|w=&v}ww?e3fNCTQhTW!^V9%U5{*ebJ7YCp4vyAeEDjSb-!Bl{)zEpj!o-& zuIJ*FYa6@Q#lIU~E@m(OynFleXy3<Ft$)Nj`LCQWEbS{ezWKGv3%xtf70184H}|OL x^@T0N7VcPn?ZC9NMK?T$5A;2I?RQsSc3^Ge$i&t;ebyI~x3b2wr(($qe*^tgHz@!B literal 0 HcmV?d00001 diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/minimize2.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/minimize2.png new file mode 100644 index 0000000000000000000000000000000000000000..22d4076e421401ca5da769a129b79c0afb850a5c GIT binary patch literal 2421 zcmcImTWB0r7~X(d4HUGrc)`ms0j;)Y=bSV5vD=XBrp<yI({wQreDKUUXEsB2XQnfg z?xsE&MJa;#Ahr)x(I+3IMIS;%w1f)2ctL%P#iCdc4Dqp`7SHUhX-U&4bzyd9&V2Lz z-~a#LIcJVfP8{4m_`qN;m)l+*FHMQ_bJ=m{9pe9&weM%d>8@z}*+h&T$c}-XZx%;# zxoyAu)tPjr@{~ivMxL<H<@r`466joR-*77;bdINz%WHm6kk>vvCrdsn$kTcSR-z)G z^~aCJ{P3}fDm^wwZ6*)zm-e+BLD1kSky?#<kT|V^+~#$}bvCTXQX7)a737gDpfppN zl!{@@B|UEdiZm>lb{-kf#@b#9Lu4w@RFDcFa-iX;w$%N}B3jHmXR36d8%x|3<k>Wh z97Sn1oB5`i596AGY}-~KRxkzv0g{CvB`pvnLp_EPPiX8%sUHSX#z@?7J}t;XX(xq7 z)Ta%SZka^Elop8;l!sYLJz%A>IkeH}qmy*(sEE?lyCHE>U5L0c#glM8rhM!u57MDt zuxK_+!(=wRfwunRYZNlt4;anI^>%p}Rd}5@1a~5^sI4z@iZLf?7+1rv-fPrkFQQZ| zO1r21fQ8NE@k~z_&Pyca1zGgW1_%SFRgvZBs-voVvgW}Kv?5%<NJ@HO3<VM(vx<;| zHAfR*d=(rr-&@!Uv{G@(L6VYy@^Yyl3sHIBXO7`P$~_GN&2S;mO-%(B(J>%UL#n|k zM#O6C67QEnI-k`cd%t5^7E-~{uchM}7((6D0b;5S7}9j$GOhz%<vLV3L)g-LY){9& zm^Y-po;6d&1S7XGHK^dh)Z+jlq0iE63wW-IOdZ?YGnp)1jav-sVO$BBsIIzxyj(0! z#-Zoe#e-z(;HXp{D;mf)41n`UmKb%sFm4cGGrvJ<T#15OW_lq*q&w~>qQeW_X>^z$ z>0Z@+sqIaN&}>Q+WSV(_3qhS>e}gh_Euqf)%~>u;H*rY^mV{o~BrzYUiI&{NgUXGh zC*<hn!d>oR57`i4L##2(%{rl*2$-IyYMzTd%Isd^|AX*uN$D&JYFw<Xiu~VG*_zd_ z?ZFKv-@os{#;GXTg4*$xa=q=Y`nxwrM#SvROqq21IZA5%&hFoMN)i)u8zBxfSM>nL zng(pwA^=jTT8LScA$4C{Mcuy{m+L}TLxv7ajx3;Bng@t0Rx)m@8q{o}BV=xsi(}8F zM7IIaRSaCDF+e<<1D7M$@}R*GLhHEN3Ong4o7bg{T(@P3q}oGbAIvWM8?d<PZ{a); z-ipNr{m2`;9?InglyYgL+B&uR<8t}7LwApTXTC3;ogaFXTsd^|<@;WQl66V?;oui9 z?D*j4(do4-zr~;I{pRaX`QxXZ5ALy^i9WnIv;5H_z5UC<*LU55feVZGpILcl=|bbl zmllSPoLfy+{#-gSwC(uCZ&w~(J~e0k_1e9U{W|c~*|*L&S6`v><!vXAfLGU^2rjQI uo%#FicQ3s+@!1J?{`@UebX``T59~gD&&Mmfc5Kf+jLKsZrPHI&Fa85K3?JzL literal 0 HcmV?d00001 diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/navigationBackground.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/navigationBackground.png index 9ee9bf944a70150bf7b0cf97ba9697eaf0c1ffdc..5c432124583a2fd332c0b3e59a65860362dd830e 100644 GIT binary patch delta 1076 zcmaDUuvkd3Gr-TCmrII^fq{Y7)59eQNIQWr2OE%l9K!HoqM|qx+lGx+O-uqNx`yT< zhNf0V7FI@v+6G3G&oIei3jSm&Q%N&RNlP^{Gt@OUGBD9iwlFc*wKOzK(lxO(H8wL( zHZ)8#PnkTKSzFn_EXB+MsKngdJXzP&(!^5N(mXjyH__PKBGJgmG{xA!bn-)H6_vy^ zQ?n!s(==U+WOGy96cdva-9(d=6rh8Ql1)-f6U~!=&e3EEBTnIBmKcemlr*cHOoieS z*Rm3;#N?99{5)Hw;>5Dai7axi=4l2-smX?Bx~Ylg7P^+ECT6;chGyovX%?2LCP}I0 zmMMnDN>IJ!8L2>>Mg~R(x(0?o6k=pxWnyGyVmbLBi<KT!QF2CNUV3VZt&+ZyzMX;% zKFd9b2|R3;V?@sp7IQ%i`zQZmiL0OOVY7yTfl1QS#WAE}&f7VAvqTa_+U85vceG}x z?_@L-pK!_Rq}aVS0Rf$4#Ryij4T_--92L@HoE}_?z2XZhm<>aDG=(lajX1M=QwxjG z=Q`ua=QbOTZu&6KnBUm?@XvjBwUjg*Sa}+z9|(T%&-8O&<M{*Z3DO_TWd+||-`i0y z;cDr&D)H^^ZL?d$4|p}+;nZH0xRmStQbYb4Ryhmj^A9;97{0|ezB5j8sN`I6?11D8 zv5z<AT#wS--eLW0&$X<bt|B|dw+F615}T~%DX8SyA)*-6;(=fs(tWhua{bn*?dSK* zXP?%feqgP3T5n@|-!i?E#j_?psNetPC-05Kta*l#XU;ILZ`^*s*?qe40mTh$IZVq# zUGA`kHJZ=ec2!pSL9D1C^8@8@`=kHFj~(ciideQ^Xo2Oor&>yN4E?*_ElcKG)nT#l z=cYHt%T3?*UC+~+=syk9HE@wd%Oo4V&0V#u{^r7K<$YNR>tE~TF;tswa5X;gMmsrS zHCtI@Z{O^flXw%hpXau*Z&VECwz({CHSLes`umTU{$Q#(wB^b3do%5~yg#~s#=_0z z-<hx8bbUH0BKzs&rAWSq+jmHJ(b<jjw@!;bqF)@Bz4eaLzS*CnR!_CJ>=XkA?ff+H z{LC;zuLh&?-tPyhfU)p;RpQaw%s*#SkNxv_%zu<sO|`+=rwdpRFnGH9xvX<aXaWGN CK!|Gq delta 1053 zcmZ21^in{vGr-TCmrII^fq{Y7)59eQNXLON2OE%Fb!l<lL`88XR;i6vO-urYx(0?J zMg~@<mR2Sf+6IP`&oIei3jSm&Q!z@hFf%bqPS#CKGd9#UNj9<6O|mda)3q>7G&8U? zF-)>BPM$oOSz9?NHO<I0#aP!oF*#A!!o<Wx*V4k&T-U(T$i&FlEXBYg(QNWVW)<QL z)MN=GPGKag%;fzn4wI*{Mb=xhP7-8bVEXFm;uumf=j~m4@908_qaQ!FT(VrcG=ISk zOScv$cE>x>%h&B|@vG&WduLX;z+JC&Q5i4RXm|6=Cw+C!N(uV4-`{$~X;#ZUo9B;g z=ZBvC{6qD}`+s>XM?AiHeDmb<?AvMcILmE*ivQor(-YoIlF>2zqQg8X_Ud!_`mTj4 z^BFDJHmsUq|4`<Dn@dbO|GO0aHE*2dWi_ndXtOPESO3X&Ann_o`WtJ?yp~oR+b?`( zj%w}lE9*b1%xCy9)3%(C<%5Y*T`KRHx?}4XR9<Y{blL0Kfj1w{PkyeeRJ#4mhyF<* zhWXY0$!ni~P~y{ngiO?<@u6I!udBRE6RTLCPKt;PPrsI3H77MfJ@R_;U8WsO1%_{# ze(mKxuflvFd&*-z{r`2lb$b~67~Z%YS$@*|4`;OO>f7#{`J`=C+!^lOlNIM#Afv$g zf%U9K*!Kx@nJYvE7w^trC;#w;WLRL7a(%?PuKMfmE?Z^GGFZRTjml8>;A7kqkblX@ zzUhg?f#k1hy2Zk4K5l25J^z1-0*ceIyBtl)CB}lqaf@2>tQhpJMsK;0%6_1+s$0zJ z!@|(st$r?Z80&8Y=U-B)7A$-wEnIYWzoDX%8-rOup7_S67EYB<-w7IgEUqcdKPT3Z z%Mc%!H)qp-=PA=}Gi+0f*Q<RMTkE~&?x$Mc{?P6G41U>FYi4eb_T!DJJ+OV27$bwp zAD17QE;Z+*p4m%wSnTOI+>MQ>M-xnG-|stbd&iZ#n-0gTo{x5Um3Q-@{)ID_xm|AR z`eyxj#q`Vb*%`~ZDgVAFIeb1_8g5WLP3>KX{iODsK4(|vlc%R_-c$75@JqVs`M|!b zvFB^fw>PCsf8y}NM}C9MwOsW{wv%cnIZt}5+9nrn{7dIMi@3*Mwky9l*(PlYzXZ(j N44$rjF6*2UngBZ%xSs$3 diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/newP.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/newP.png new file mode 100644 index 0000000000000000000000000000000000000000..611e3282a43bb46c6b4583c9689f086f7427dcc9 GIT binary patch literal 3927 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 literal 0 HcmV?d00001 diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/new_project_opened.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/new_project_opened.png index 5153298ce42cfa57c92a04b9f5ac697acf7193ce..654a545fe4d667f11afd19971b83935d211ed8dc 100644 GIT binary patch delta 2559 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 delta 2092 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 diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/points.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/points.png new file mode 100644 index 0000000000000000000000000000000000000000..ae2d15472049301b20749ba8085bec7babcacbda GIT binary patch literal 6295 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 OV71#0$1y#4<bMFJGPyGV literal 0 HcmV?d00001 diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/save.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/save.png new file mode 100644 index 0000000000000000000000000000000000000000..5b48efd200d2a740f65066ba59af377f83c2f930 GIT binary patch literal 2472 zcmcImeQXnD7%!5{F#<6-5L|%URfLJx`{>=ZccF~69kdDE#x@wp7`u<R>$$eq-QCu1 zMvW6l251PVGl3~8gg+Qx(a0DG%s9Y^5H#aM`SK$g0U>D6VHo&c*NtJuKogr>@A}^F ze$VfDp5JqCn~DnNjLLX2!(y?F^838S@H_z?S?Ou;yD9sr5Il{D`4;IGi_K~t!xEcw z>nxT>H!7tIjfH`^yrf2Kf~<<bmWae4+G3fJn}`WgH82nnR4GvxdTs9k6j5XsTE+y3 zK+FR|imyQfB@G3oQbV=G$!P9OWJZFA1QB2eNFoxB>U_e5CV6>yZ7$;|l7tx5E;P>! zh%5{gAs$r&2xDV0iKHpS!P!Wb;3)c8gd#`>PB?JVju9kJu)Li^QXdpX)8rsu?46y8 z1%J8FkYU7l9FNE2wz%D<YE?MNaU4!iI7ML)f$8;8Lr7pz-P*_C1-hguF+)+Kh{-63 zYOUcyq0-(IBC&qjsGcelEEt{;VmN6d%#`|ofxytvNTeUF8~JrGN=omb#CmCc4B*8; zS8Fv1<kx|yVeJbR3#o>xht&IM>%V=ELRsn$7^~I7$@0h&4#FS;xpjyollo%3M+1VP zYNe_g?rT(0Uqr;?L8g@{QCW@aIi{Wz9C!r-xKP+L4kIaypi4;y&(J(cPB)uJ^g;vB z1+riWePD{f2nHkAQj*{)f+v~j1a%jz%1W^QVW5Ek?~m$+5S4)6>q4O@o1(}(2r^C) z5Hv=}b^!w<EnrU8VaMzY%`t$L2-+?sb;0Mos#I&%!F;~gw6ZEej{aKmBqa)>z&J2L zggLT+rZG-}Y><p&gOuP1I>bJ<LQR2lBZLRCnyO^TNHY$nL<>QTkq8o#MVi4xImlrQ z<8VlnU1kZ2Ly^02J!)9h0;&wFYah7o_jrmlHK>H)4ZV1d8}a9RSdwE|jIxm^B1?Qw z)gl74nGzAI03M50nWl#_V7fj<haIj@jZq1xNnM2%B<W3Fkj#;Ap_1tZAfu^eWsovI zTtdCH@eqKdL%5_DrmI0CE@&XH3by0{9>nh_T^H(x7EU=h*-1zgCJK@rqePm-L`I}x zPdI`T?M|maLVx^k!c)vrNQhPe_-@6~|DMXjS^eHr?mK+{z6XP+f}1bYUT@+5wB22Q z_svKioL<wEda9ppp{l>LGY20@Q6yl~SO#+d(uvufbkH153Im*-CTLDzNYXJQsUoaA zhzn3bQ4$yq6Bs*m1WC)75aa+R0#bAa305XaasXG7wO1lObS_EcfNcf}NiM;?%e?I0 zG~ti_Z5KqLA2hhBUbw6#ES6#0{ocG%U(>HAb5{rQG7n!rzQpZ)pI9*MmuXiny_Mc_ z+MV6L`8_IQz2B&N{F!-2#*S!qyT32oR++VVnfsO3PQJU~Y<kz)BPCb%CH7o>VQ-;V zdinD&H|Redy?Lx<{n0)7TfROqe_m!<&Zh1$Qeu8{SNF!V=i9Brx89zzZPo&0`kFhF z#uVSOCVVxzujZo(OV9Z-+M4Ri$B!wxIQo!h<y7)iOZC<65wDBvrndO_^kWwv`}kt{ zHSgopy2JC^vWm~{+;Azob4lA9=XN;HKT+J=Wi9{WDqFrZt#aa|%E;)>_SW-%E|*(6 z*M}#M%qhS+_N;C>v%jplt0(xWx~9E#9I;&G4C|)0PqsDqt`lP2h3|~T6(@G|tjOF_ zGiC4bos;n&|5)YUcj)O`2luzPz7s!%@9wGS{2_d;BP`vnOFMY8VphqE*|m#mV~<SM zLur>kbgg{#%u6d*4QIc-)7GAmQ}EY~*%x-DP0Z|W+|}MXlRh=-#%`!`L+1zUhK-zH z+47Ag!0dQ)xbv&Ej>f`q2Rf?4pDmudEOY8}zx`aZb!_9gw<|<x@$YTc+(^UekvFH7 a^%Sn?(AwvY%X;4YFXhiK@NRckHvSFuvQu#Y literal 0 HcmV?d00001 diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/show.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/show.png new file mode 100644 index 0000000000000000000000000000000000000000..b4f8369e688f9e43e8e9c59b17dad800bb445674 GIT binary patch literal 2665 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 literal 0 HcmV?d00001 diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/show2.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/show2.png new file mode 100644 index 0000000000000000000000000000000000000000..df03fc3580d3becc5d74644bf5ceeac4e7b74100 GIT binary patch literal 2638 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 literal 0 HcmV?d00001 diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/wireframe2.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/wireframe2.png new file mode 100644 index 0000000000000000000000000000000000000000..40be817688e82594ba6ae92510324c6d9538c500 GIT binary patch literal 3857 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 MS6{&q=f$c228G-2*#H0l literal 0 HcmV?d00001 diff --git a/GUI/src/main/java/cz/fidentis/analyst/symmetry/BoundingBox.java b/GUI/src/main/java/cz/fidentis/analyst/symmetry/BoundingBox.java index 0a1f577d..74228951 100644 --- a/GUI/src/main/java/cz/fidentis/analyst/symmetry/BoundingBox.java +++ b/GUI/src/main/java/cz/fidentis/analyst/symmetry/BoundingBox.java @@ -8,7 +8,7 @@ import javax.vecmath.Vector3d; * @author Natália Bebjaková * * Represent min-max box. - * It is automatically maintained by given point array. + * It is automatically maintained by given point array of the model. * */ @@ -90,7 +90,7 @@ public class BoundingBox { */ private void ValidateMinMax() { minPoint = new MeshPoint(new Vector3d(Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE), null, null); - maxPoint = new MeshPoint(new Vector3d(Double.MIN_VALUE,Double.MIN_VALUE,Double.MIN_VALUE), null, null); + maxPoint = new MeshPoint(new Vector3d(-100000.0,-100000.0,-100000.0), null, null); for (int i = 0; i < points.size(); i++) { MeshPoint point = points.get(i); @@ -129,6 +129,7 @@ public class BoundingBox { /** * Returns description of BoundignBox. + * * @return String representation of the bounding box */ @Override diff --git a/GUI/src/main/java/cz/fidentis/analyst/symmetry/Config.java b/GUI/src/main/java/cz/fidentis/analyst/symmetry/Config.java index 63ce184e..ed08d5aa 100644 --- a/GUI/src/main/java/cz/fidentis/analyst/symmetry/Config.java +++ b/GUI/src/main/java/cz/fidentis/analyst/symmetry/Config.java @@ -2,7 +2,7 @@ package cz.fidentis.analyst.symmetry; /** * - * @author Natalia Bebjakova + * @author Natália Bebjaková * * Representation of configuration for symmetry estimate. * Default numbers are given due to the best results on tested data. @@ -10,7 +10,7 @@ package cz.fidentis.analyst.symmetry; * better impact on results in estimate of symmetry. */ public class Config { - private static final double DEFAULT_MIN_CURV_RATIO = 0.8; + private static final double DEFAULT_MIN_CURV_RATIO = 0.5; private static final double DEFAULT_MIN_ANGLE_COS = 0.985; private static final double DEFAULT_MIN_NORM_ANGLE_COS = 0.985; private static final double DEFAULT_MAX_REL_DISTANCE = 1.0 / 100.0; @@ -102,7 +102,6 @@ public class Config { /** * Returns number of vertices with the highest Gaussian curvature. - * It is optional parameter. * * @return number of significant points for computing the symmetry */ @@ -138,7 +137,7 @@ public class Config { } /** - * Gives default values of configuration. + * Creates new configuration with default values * * @return configuration with default values */ @@ -154,4 +153,21 @@ public class Config { return conf; } + + /** + * + * @return String representation of configuration + */ + @Override + public String toString() { + String str = "PARAMETERS: "; + str += "\n"; + str += "Min curvature ratio: " + minCurvRatio + "\n"; + str += "Min angle cosine: " + minAngleCos + "\n"; + str += "Min norm angle cosine: " + minNormAngleCos + "\n"; + str += "Max relative distance: " + maxRelDistance + "\n"; + str += "Significant points: " + significantPointCount + "\n"; + str += "Averaging: " + averaging + "\n"; + return str; + } } \ No newline at end of file diff --git a/GUI/src/main/java/cz/fidentis/analyst/symmetry/Plane.java b/GUI/src/main/java/cz/fidentis/analyst/symmetry/Plane.java index b4a30323..2b1e66f7 100644 --- a/GUI/src/main/java/cz/fidentis/analyst/symmetry/Plane.java +++ b/GUI/src/main/java/cz/fidentis/analyst/symmetry/Plane.java @@ -52,9 +52,9 @@ public class Plane { * @param scale distance of points given by bounding box * @return plane represented as mesh */ - public static SymmetryCounter createPlaneMesh(MeshPoint centroid, MeshPoint a, MeshPoint b, double scale) { + public static SymmetryEstimator createPlaneMesh(MeshPoint centroid, MeshPoint a, MeshPoint b, double scale) { facet = new MeshFacet(); - SymmetryCounter planeMesh = new SymmetryCounter(facet); + SymmetryEstimator planeMesh = new SymmetryEstimator(facet, Config.getDefault()); MeshPoint[] points = new MeshPoint[4]; @@ -84,5 +84,14 @@ public class Plane { } return planeMesh; } - + + /** + * Returns string description of the plane + * + * @return description of the plane + */ + @Override + public String toString(){ + return "APPROXIMATE PLANE:\n" + a + "\n" + b + "\n" + c + "\n" + d + "\n"; + } } diff --git a/GUI/src/main/java/cz/fidentis/analyst/symmetry/SymmetryCounter.java b/GUI/src/main/java/cz/fidentis/analyst/symmetry/SymmetryEstimator.java similarity index 82% rename from GUI/src/main/java/cz/fidentis/analyst/symmetry/SymmetryCounter.java rename to GUI/src/main/java/cz/fidentis/analyst/symmetry/SymmetryEstimator.java index 19fbd548..dcd04061 100644 --- a/GUI/src/main/java/cz/fidentis/analyst/symmetry/SymmetryCounter.java +++ b/GUI/src/main/java/cz/fidentis/analyst/symmetry/SymmetryEstimator.java @@ -1,6 +1,5 @@ package cz.fidentis.analyst.symmetry; -import static cz.fidentis.analyst.gui.UserInterface.frameMain; import cz.fidentis.analyst.mesh.core.CornerTableRow; import cz.fidentis.analyst.mesh.core.MeshFacet; import cz.fidentis.analyst.mesh.core.MeshPoint; @@ -18,12 +17,13 @@ import javax.vecmath.Vector3d; * * @author Natália Bebjaková * - * Main class for computing approximate plane of symmetry of the 3D model. + * Main class for computing approximate plane of symmetry of the 3D model. + * For computing the symmetry, for every * Default values of the configuration are given due to the best results on tested objects. * On many different 3D models, it exists other values of config that will have better impact on result. * */ -public class SymmetryCounter { +public class SymmetryEstimator { /** * Facet of the model on which symmetry is computed */ @@ -44,6 +44,16 @@ public class SymmetryCounter { * panel for configuration of symmetry counting */ private JPanel panel; + + private final Config config; + + /** + * + * @return configuration of optional parameters of the algorithm + */ + public Config getConfig() { + return config; + } /** * @@ -74,9 +84,16 @@ public class SymmetryCounter { * Creates new class for computing symmetry * * @param f facet on which symmetry will be computed + * @param config configuration of optional parameters of the algorithm */ - public SymmetryCounter(MeshFacet f) { + public SymmetryEstimator(MeshFacet f, Config config) { this.facet = f; + this.config = config; + + initTriangles(); + initArrayOfTriangleVertexAreas(); + + boundingBox = new BoundingBox(facet.getVertices()); } /** @@ -125,15 +142,6 @@ public class SymmetryCounter { public double v3Area; } - /** - * Initialize values necessary for computing - */ - public void init() { - initTriangles(); - initArrayOfTriangleVertexAreas(); - boundingBox = new BoundingBox(facet.getVertices()); - } - /** * Computes triangles of facet from corner table */ @@ -144,11 +152,11 @@ public class SymmetryCounter { facet.getCornerTable().getRow(i + 1).getVertexIndex(), facet.getCornerTable().getRow(i + 2).getVertexIndex()); triangles[(i / 3)] = t; - } + } } /** - * Calculates new normals of the points + * Calculates new normals of the points for models that do not have normals * * @return new normals represented as mesh points so that math operations can be done */ @@ -177,7 +185,8 @@ public class SymmetryCounter { * @return triangle neighbours of given index of vertex */ public List<Integer> getNeighbours(int pointIndex) { - return facet.getCornerTable().getTriangleIndexesByVertexIndex(pointIndex); + List<Integer> neighbours = facet.getCornerTable().getTriangleIndexesByVertexIndex(pointIndex); + return neighbours; } /** @@ -221,9 +230,9 @@ public class SymmetryCounter { return area; } if (d2 < 0) { - area.v3Area = ((v3Half.subtractPosition(tVertex1)).crossProduct(v2Half.subtractPosition(tVertex1))).abs() / 2; - area.v2Area = ((v1Half.subtractPosition(tVertex3)).crossProduct(v2Half.subtractPosition(tVertex3))).abs() / 2; - area.v1Area = (((v2Half.subtractPosition(tVertex2)).crossProduct(v1Half.subtractPosition(tVertex2))).abs() / 2) + + area.v1Area = ((v3Half.subtractPosition(tVertex1)).crossProduct(v2Half.subtractPosition(tVertex1))).abs() / 2; + area.v3Area = ((v1Half.subtractPosition(tVertex3)).crossProduct(v2Half.subtractPosition(tVertex3))).abs() / 2; + area.v2Area = (((v2Half.subtractPosition(tVertex2)).crossProduct(v1Half.subtractPosition(tVertex2))).abs() / 2) + (((v2Half.subtractPosition(tVertex2)).crossProduct(v3Half.subtractPosition(tVertex2))).abs() / 2); return area; } @@ -363,7 +372,7 @@ public class SymmetryCounter { return new MeshPoint(new Vector3d(), new Vector3d(), new Vector3d()); } double areaSum = 0; - MeshPoint pointSum = new MeshPoint((new Vector3d(0.0, 0.0, 0.0)), null, null); + MeshPoint pointSum = new MeshPoint(new Vector3d(), new Vector3d(), new Vector3d()); for (int i = 0; i < trianglesNeighbours.size(); i++) { Triangle t = triangles[trianglesNeighbours.get(i)]; Triangle tNext = triangles[trianglesNeighbours.get((i + 1) % trianglesNeighbours.size())]; @@ -397,7 +406,7 @@ public class SymmetryCounter { /** * Gaussian curvature in a vertex of a triangle mesh. - * It can only be estimated beacuse triangle mesh is not a continuous + * It can only be estimated because triangle mesh is not a continuous * but discrete representation of surface. * * @param centerIndex index of vertex in which gaussian curvature is computed @@ -410,13 +419,12 @@ public class SymmetryCounter { if (triangleNeighbours.isEmpty()) { return Double.NaN; } - double sum = 2 * Math.PI; double areaSum = 0; for (int i = 0; i < triangleNeighbours.size(); i++) { - MeshPoint v1 = new MeshPoint(new Vector3d(), null, null); - MeshPoint v2 = new MeshPoint(new Vector3d(), null, null); + MeshPoint v1 = new MeshPoint(new Vector3d(), new Vector3d(), new Vector3d()); + MeshPoint v2 = new MeshPoint(new Vector3d(), new Vector3d(), new Vector3d()); Triangle t = triangles[triangleNeighbours.get(i)]; MeshPoint tVertex1 = facet.getVertices().get(t.vertex1); @@ -446,11 +454,11 @@ public class SymmetryCounter { areaSum += area; v1 = v1.dividePosition(v1.abs()); v2 = v2.dividePosition(v2.abs()); - + sum -= Math.acos(v1.dotProduct(v2)); } - return sum * (1.0 / areaSum); - + double value = sum * (1.0 / areaSum); + return value; } /** @@ -485,14 +493,14 @@ public class SymmetryCounter { * * @param plane Plane for which votes are computed * @param curvatures significant curvatures chosen for computing - * @param points significant point chosen for computing + * @param points significant points chosen for computing * @param minCurvRatio optional parameter from configuration * @param minAngleCos optional parameter from configuration * @param minNormAngleCos optional parameter from configuration * @param maxDist optional parameter from configuration * @return total votes given to plane while computing the symmetry */ - private int GetVotes(Plane plane, + private int getVotes(Plane plane, ArrayList<Double> curvatures, ArrayList<Integer> points, double minCurvRatio, @@ -502,7 +510,7 @@ public class SymmetryCounter { plane.normalize(); - MeshPoint normal = new MeshPoint((new Vector3d(plane.a, plane.b, plane.c)),null, null); + MeshPoint normal = new MeshPoint((new Vector3d(plane.a, plane.b, plane.c)),new Vector3d(), new Vector3d()); double d = plane.d; double maxCurvRatio = 1.0 / minCurvRatio; int votes = 0; @@ -518,37 +526,15 @@ public class SymmetryCounter { double cos = vec.dotProduct(normal); MeshPoint ni; - - /*if (facet.getVertices().get(points.get(i)).getNormal() != null) { - ni = new MeshPoint(new Vector3d(facet.getVertices().get(points.get(i)).getNormal().x, - facet.getVertices().get(points.get(i)).getNormal().y, - facet.getVertices().get(points.get(i)).getNormal().z), null, null); - } else { - ni = new MeshPoint (new Vector3d(normals[points.get(i)].getPosition().x,normals[points.get(i)].getPosition().y, - normals[points.get(i)].getPosition().z), null, null); - } - - ni = ni.divide(ni.abs()); - - MeshPoint nj; - if (facet.getVertices().get(points.get(j)).getNormal() != null) { - nj = new MeshPoint(new Vector3d(facet.getVertices().get(points.get(j)).getNormal().x, - facet.getVertices().get(points.get(j)).getNormal().y, - facet.getVertices().get(points.get(j)).getNormal().z), null, null); - } else { - nj = new MeshPoint (new Vector3d(normals[points.get(j)].getPosition().x,normals[points.get(j)].getPosition().y, - normals[points.get(j)].getPosition().z), null, null); - }*/ - - + ni = new MeshPoint (new Vector3d(normals[points.get(i)].getPosition().x,normals[points.get(i)].getPosition().y, - normals[points.get(i)].getPosition().z), null, null); + normals[points.get(i)].getPosition().z), new Vector3d(), new Vector3d()); ni = ni.dividePosition(ni.abs()); MeshPoint nj; nj = new MeshPoint (new Vector3d(normals[points.get(j)].getPosition().x,normals[points.get(j)].getPosition().y, - normals[points.get(j)].getPosition().z), null, null); + normals[points.get(j)].getPosition().z), new Vector3d(), new Vector3d()); nj = nj.dividePosition(nj.abs()); MeshPoint normVec = ni.subtractPosition(nj); @@ -575,17 +561,18 @@ public class SymmetryCounter { /** * - * @param conf Configuration for computing + * * @return approximate plane of symmtetry */ - public Plane getAproxSymmetryPlane(Config conf) { + public Plane getAproxSymmetryPlane() { + UIManager.put("ProgressMonitor.progressText", "Counting symmetry..."); ArrayList<AproxSymmetryPlane> planes = new ArrayList<>(); MeshPoint[] normals = CalculateNormals(); double[] curvatures = new double[facet.getNumberOfVertices()]; for (int i = 0; i < facet.getNumberOfVertices(); i++) { - if (facet.getNumberOfVertices() > 2000) { + if (facet.getNumberOfVertices() == 2500) { curvatures[i] = this.getMaxCurvature(i); } else { curvatures[i] = this.getGaussianCurvature(i); @@ -600,11 +587,11 @@ public class SymmetryCounter { } Collections.sort(sortedCurvatures); - if(conf.getSignificantPointCount() > facet.getNumberOfVertices()) { - conf.setSignificantPointCount((facet.getNumberOfVertices()) - 1); + if(config.getSignificantPointCount() > facet.getNumberOfVertices()) { + config.setSignificantPointCount((facet.getNumberOfVertices()) - 1); } - double bottomCurvature = sortedCurvatures.get(sortedCurvatures.size() - 1 - conf.getSignificantPointCount()); - + double bottomCurvature = sortedCurvatures.get(sortedCurvatures.size() - 1 - config.getSignificantPointCount()); + ArrayList<Integer> significantPoints = new ArrayList<>(); ArrayList<Double> significantCurvatures = new ArrayList<>(); @@ -627,7 +614,7 @@ public class SymmetryCounter { for (int i = 0; i < significantPoints.size(); i++) { for (int j = 0; j < significantPoints.size(); j++) { if (i != j) { - double minRatio = conf.getMinCurvRatio(); + double minRatio = config.getMinCurvRatio(); double maxRatio = 1.0 / minRatio; if (significantCurvatures.get(i) / significantCurvatures.get(j) >= minRatio && significantCurvatures.get(i) / significantCurvatures.get(j) <= maxRatio) { @@ -640,56 +627,37 @@ public class SymmetryCounter { normal = normal.dividePosition(normal.abs()); double d = -(normal.getPosition().x * avrg.getPosition().x) - (normal.getPosition().y * avrg.getPosition().y) - (normal.getPosition().z * avrg.getPosition().z); - + MeshPoint ni; - /*if (facet.getVertex(significantPoints.get(i)).getNormal() != null) { - ni = new MeshPoint(new Vector3d(facet.getVertex(significantPoints.get(i)).getNormal().x, - facet.getVertex(significantPoints.get(i)).getNormal().y, - facet.getVertex(significantPoints.get(i)).getNormal().z),null, null); - } else { - ni = new MeshPoint (new Vector3d(normals[significantPoints.get(i)].getPosition().x,normals[significantPoints.get(i)].getPosition().y, - normals[significantPoints.get(i)].getPosition().z), null, null); - } - ni = ni.divide(ni.abs()); - - MeshPoint nj; - if(facet.getVertex(significantPoints.get(j)).getNormal() != null) { - nj = new MeshPoint(new Vector3d(facet.getVertex(significantPoints.get(j)).getNormal().x, - facet.getVertex(significantPoints.get(j)).getNormal().y, - facet.getVertex(significantPoints.get(j)).getNormal().z),null, null); - } else { - nj = new MeshPoint (new Vector3d(normals[significantPoints.get(j)].getPosition().x,normals[significantPoints.get(j)].getPosition().y, - normals[significantPoints.get(j)].getPosition().z), null, null); - } - - nj = nj.divide(nj.abs());*/ - - ni = new MeshPoint (new Vector3d(normals[significantPoints.get(i)].getPosition().x,normals[significantPoints.get(i)].getPosition().y, - normals[significantPoints.get(i)].getPosition().z), null, null); + ni = new MeshPoint (new Vector3d(normals[significantPoints.get(i)].getPosition().x, + normals[significantPoints.get(i)].getPosition().y, + normals[significantPoints.get(i)].getPosition().z), + new Vector3d(), new Vector3d()); ni = ni.dividePosition(ni.abs()); MeshPoint nj; - nj = new MeshPoint (new Vector3d(normals[significantPoints.get(j)].getPosition().x,normals[significantPoints.get(j)].getPosition().y, - normals[significantPoints.get(j)].getPosition().z), null, null); - + nj = new MeshPoint (new Vector3d(normals[significantPoints.get(j)].getPosition().x, + normals[significantPoints.get(j)].getPosition().y, + normals[significantPoints.get(j)].getPosition().z), + new Vector3d(), new Vector3d()); + nj = nj.dividePosition(nj.abs()); MeshPoint normVec = ni.subtractPosition(nj); normVec = normVec.dividePosition(normVec.abs()); double normCos = normVec.dotProduct(normal); - if (Math.abs(normCos) >= conf.getMinNormAngleCos()) { + if (Math.abs(normCos) >= config.getMinNormAngleCos()) { Plane newPlane = new Plane(normal.getPosition().x, normal.getPosition().y, normal.getPosition().z, d); - int currentVotes = GetVotes( - newPlane, + int currentVotes = getVotes(newPlane, significantCurvatures, significantPoints, - 0.5, - conf.getMinAngleCos(), - conf.getMinNormAngleCos(), - boundingBox.getMaxDiag() * conf.getMaxRelDistance()); + config.getMinCurvRatio(), + config.getMinAngleCos(), + config.getMinNormAngleCos(), + boundingBox.getMaxDiag() * config.getMaxRelDistance()); planes.add(new AproxSymmetryPlane(newPlane, currentVotes)); @@ -705,7 +673,7 @@ public class SymmetryCounter { } progressMonitor.setNote("Task step: " + (int) ((i + 1) * percentsPerStep)); progressMonitor.setProgress(i); - }; + } Collections.sort(planes); ArrayList<AproxSymmetryPlane> finalPlanes = new ArrayList<>(); @@ -715,10 +683,9 @@ public class SymmetryCounter { } } Plane finalPlane = new Plane(0, 0, 0, 0); - //v plane nic neni - MeshPoint refDir = new MeshPoint(new Vector3d(finalPlanes.get(0).a, finalPlanes.get(0).b, finalPlanes.get(0).c), null, null); + MeshPoint refDir = new MeshPoint(new Vector3d(finalPlanes.get(0).a, finalPlanes.get(0).b, finalPlanes.get(0).c), new Vector3d(), new Vector3d()); for (int i = 0; i < finalPlanes.size(); i++) { - MeshPoint normDir = new MeshPoint(new Vector3d(finalPlanes.get(i).a, finalPlanes.get(i).b, finalPlanes.get(i).c), null, null); + MeshPoint normDir = new MeshPoint(new Vector3d(finalPlanes.get(i).a, finalPlanes.get(i).b, finalPlanes.get(i).c), new Vector3d(), new Vector3d()); if (normDir.dotProduct(refDir) < 0) { finalPlane.a -= finalPlanes.get(i).a; finalPlane.b -= finalPlanes.get(i).b; @@ -733,11 +700,10 @@ public class SymmetryCounter { } } finalPlane.normalize(); - if (conf.isAveraging()){ + if (config.isAveraging()){ plane = finalPlane; } - JOptionPane.showMessageDialog(frameMain, "Final plane: " + plane.a + " " + plane.b + " " + plane.c + " " + - plane.d + "\n" + "Votes: " + lastVotes, "Symmetry estimate done.", 0, + JOptionPane.showMessageDialog(panel, "Symmetry estimate done.", "Done", 0, new ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/exportedModel.png"))); progressMonitor.close(); @@ -749,8 +715,8 @@ public class SymmetryCounter { * @param plane Plane computed as symmetry plane * @return mesh that represents facet with computed plane of approximate symmetry */ - public SymmetryCounter mergeWithPlane(Plane plane) { - MeshPoint normal = new MeshPoint(new Vector3d(plane.a, plane.b, plane.c), null, null); + public SymmetryEstimator mergeWithPlane(Plane plane) { + MeshPoint normal = new MeshPoint(new Vector3d(plane.a, plane.b, plane.c), new Vector3d(), new Vector3d()); MeshPoint midPoint = boundingBox.getMidPoint(); double alpha = -((plane.a * midPoint.getPosition().x) + @@ -764,12 +730,12 @@ public class SymmetryCounter { midPointOnPlane.getPosition().z + plane.d; MeshPoint a; - if (Math.abs(normal.dotProduct(new MeshPoint(new Vector3d(0.0, 1.0, 0.0), null, null))) - > Math.abs(normal.dotProduct(new MeshPoint(new Vector3d (1.0, 0.0, 0.0), null, null)))) { - a = normal.crossProduct(new MeshPoint(new Vector3d(1.0, 0.0, 0.0), null, null)); + if (Math.abs(normal.dotProduct(new MeshPoint(new Vector3d(0.0, 1.0, 0.0), new Vector3d(), new Vector3d()))) + > Math.abs(normal.dotProduct(new MeshPoint(new Vector3d (1.0, 0.0, 0.0), new Vector3d(), new Vector3d())))) { + a = normal.crossProduct(new MeshPoint(new Vector3d(1.0, 0.0, 0.0), new Vector3d(), new Vector3d())); } else { - a = normal.crossProduct(new MeshPoint(new Vector3d(0.0, 1.0, 0.0), null, null)); + a = normal.crossProduct(new MeshPoint(new Vector3d(0.0, 1.0, 0.0), new Vector3d(), new Vector3d())); } a = a.dividePosition(a.abs()); @@ -777,10 +743,9 @@ public class SymmetryCounter { b = b.dividePosition(b.abs()); - SymmetryCounter planeMesh = Plane.createPlaneMesh(midPointOnPlane, a, b, + SymmetryEstimator planeMesh = Plane.createPlaneMesh(midPointOnPlane, a, b, (boundingBox.getMaxPoint().subtractPosition(boundingBox.getMinPoint())).getPosition().x); - return mergeMeshWith(planeMesh); } @@ -789,7 +754,7 @@ public class SymmetryCounter { * @param s mesh that will be merged * @return mesh with merged vertices from both meshes */ - public SymmetryCounter mergeMeshWith(SymmetryCounter s) { + public SymmetryEstimator mergeMeshWith(SymmetryEstimator s) { CornerTableRow row1 = new CornerTableRow(facet.getNumberOfVertices(), -1); CornerTableRow row2 = new CornerTableRow(facet.getNumberOfVertices() + 1, facet.getNumberOfVertices() + 3); CornerTableRow row3 = new CornerTableRow(facet.getNumberOfVertices() + 2, -1); diff --git a/MeshModel/pom.xml b/MeshModel/pom.xml index f9ee0adf..b35bd962 100644 --- a/MeshModel/pom.xml +++ b/MeshModel/pom.xml @@ -100,6 +100,12 @@ <version>RELEASE</version> <scope>test</scope> </dependency> + <dependency> + <groupId>cz.findetis</groupId> + <artifactId>GUI</artifactId> + <version>2.0</version> + <type>jar</type> + </dependency> </dependencies> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> diff --git a/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshPoint.java b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshPoint.java index f38c39c0..dee4a81d 100644 --- a/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshPoint.java +++ b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshPoint.java @@ -5,7 +5,6 @@ import javax.vecmath.Vector3d; * * @author Matej Lukeš */ -//prerobenee public class MeshPoint { protected Vector3d position, normal, texCoord; diff --git a/MeshModel/src/main/java/cz/fidentis/analyst/mesh/io/MeshModelExporter.java b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/io/MeshModelExporter.java deleted file mode 100644 index a7e93a34..00000000 --- a/MeshModel/src/main/java/cz/fidentis/analyst/mesh/io/MeshModelExporter.java +++ /dev/null @@ -1,219 +0,0 @@ -package cz.fidentis.analyst.mesh.io; -/** - * @author Natália Bebjaková - * <p> - * Creates new directory and exports model to .obj file in this created directory - * Exports model's vertices and normals, if there are some - */ - -import cz.fidentis.analyst.mesh.core.MeshFacet; -import cz.fidentis.analyst.mesh.core.MeshModel; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.text.DecimalFormat; -import java.text.DecimalFormatSymbols; -import java.util.Locale; - -/** - * @author Natalia Bebjakova - */ -public class MeshModelExporter { - /** - * Helping representation of triangle in symmetry estimate - * - * @author Natalia Bebjakova - */ - private class Triangle { - private int vertex1; - private int vertex2; - private int vertex3; - - /** - * Creates new triangle - * - * @param v1 first vertex - * @param v2 second vertex - * @param v3 third vertex - */ - Triangle(int v1, int v2, int v3) { - this.vertex1 = v1; - this.vertex2 = v2; - this.vertex3 = v3; - } - - /** - * @return first vertex of triangle - */ - public int getVertex1() { - return vertex1; - } - - /** - * @param vertex1 new vertex - */ - public void setVertex1(int vertex1) { - this.vertex1 = vertex1; - } - - /** - * @return second vertex of triangle - */ - public int getVertex2() { - return vertex2; - } - - /** - * @param vertex2 new vertex - */ - public void setVertex2(int vertex2) { - this.vertex2 = vertex2; - } - - /** - * @return third vertex of triangle - */ - public int getVertex3() { - return vertex3; - } - - /** - * @param vertex3 new vertex - */ - public void setVertex3(int vertex3) { - this.vertex3 = vertex3; - } - - /** - * Triangles are same if they have same vertices - * - * @param obj other triangle - * @return true if two triangles are same - */ - @Override - public boolean equals(Object obj) { - if (!(obj instanceof Triangle)) { - return false; - } - Triangle t = (Triangle) obj; - return ((this.vertex1 == t.vertex1) || (this.vertex1 == t.vertex2) || (this.vertex1 == t.vertex3)) && - ((this.vertex2 == t.vertex1) || (this.vertex2 == t.vertex2) || (this.vertex2 == t.vertex3)) && - ((this.vertex3 == t.vertex1) || (this.vertex3 == t.vertex2) || (this.vertex3 == t.vertex3)); - } - - /** - * @return hascode of the triangle - */ - @Override - public int hashCode() { - return (this.vertex1 * 100 ^ this.vertex2 * 100 ^ this.vertex3); - } - } - - /** - * Model to be exported - */ - private MeshModel model; - - /** - * @param model model to be exported. - */ - public MeshModelExporter(MeshModel model) { - this.model = model; - } - - /** - * @param exportFile exported file name - * @throws IOException Error - */ - public void exportModelToObj(File exportFile) throws IOException { - for (MeshFacet facet : model.getFacets()) { - exportFacetToObj(facet, exportFile); - } - } - - /** - * Export model to OBJ file. - * - * @param facet Facet of the model to be exported, so far every model has one - * @param exportFile file for exporting. - * @throws IOException Error - */ - public void exportFacetToObj(MeshFacet facet, File exportFile) throws IOException { - int formatIndex = exportFile.getName().lastIndexOf("."); - String fileName; //name that is writen to file - - if (formatIndex < 0) { - fileName = exportFile.getName(); - } else { - fileName = exportFile.getName().substring(0, formatIndex); - } - - File exportDirectory = new File(exportFile.getParent() + File.separator + fileName); - exportDirectory.mkdir(); //creates new directory - - exportFile = new File(exportDirectory + File.separator + fileName + ".obj"); - - try (BufferedWriter out = new BufferedWriter(new FileWriter(exportFile))) { - - out.write("mtllib " + fileName + ".mtl" + "\n"); - - DecimalFormatSymbols otherSymbols = new DecimalFormatSymbols(Locale.getDefault()); - otherSymbols.setDecimalSeparator('.'); //dot as separator for decimal numbers - DecimalFormat df = new DecimalFormat("#.####", otherSymbols); - - //writes vertices of the facet to file - for (int j = 0; j < facet.getNumberOfVertices(); j++) { - out.write("v " + df.format(facet.getVertices().get(j).getPosition().x) + " " - + df.format(facet.getVertices().get(j).getPosition().y) + " " - + df.format(facet.getVertices().get(j).getPosition().z) + "\n"); - } - out.write("#" + facet.getNumberOfVertices() + " vertices" + "\n"); - - //detects if first vertex has normal - boolean hasAllNormals = facet.getVertices().get(0).getNormal() != null; - - //writes normals if there are any - for (int i = 0; i < facet.getNumberOfVertices(); i++) { - if (facet.getVertex(i).getNormal() != null) { - out.write("vn " + df.format(facet.getVertices().get(i).getNormal().x) + " " - + df.format(facet.getVertices().get(i).getNormal().y) + " " - + df.format(facet.getVertices().get(i).getNormal().z) + "\n"); - } - } - - //computes triangles of facet - Triangle[] triangles = new Triangle[facet.getCornerTable().getSize() / 3]; - for (int i = 0; i < facet.getCornerTable().getSize(); i += 3) { - Triangle t = new Triangle(facet.getCornerTable().getRow(i).getVertexIndex(), - facet.getCornerTable().getRow(i + 1).getVertexIndex(), - facet.getCornerTable().getRow(i + 2).getVertexIndex()); - triangles[(i / 3)] = t; - } - - //writes triangles of facet - writeTrianglesOfFacet(triangles, out, facet, hasAllNormals); - out.write("\n"); - } - } - - private void writeTrianglesOfFacet(Triangle[] triangles, - BufferedWriter out, - MeshFacet facet, - boolean hasAllNormals) throws IOException { - for (Triangle triangle : triangles) { - out.write("f "); - if (facet.getVertex(triangle.getVertex1()).getNormal() != null && hasAllNormals) { - out.write((triangle.getVertex1() + 1) + "//" + (triangle.getVertex1() + 1) + " " - + (triangle.getVertex2() + 1) + "//" + (triangle.getVertex2() + 1) + " " - + (triangle.getVertex3() + 1) + "//" + (triangle.getVertex3() + 1) + "\n"); - } else { - out.write((triangle.getVertex1() + 1) + " " + (triangle.getVertex2() + 1) + - " " + (triangle.getVertex3() + 1) + "\n"); - } - } - } -} - diff --git a/MeshModel/src/main/java/cz/fidentis/analyst/mesh/io/MeshObjExporter.java b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/io/MeshObjExporter.java new file mode 100644 index 00000000..87e04920 --- /dev/null +++ b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/io/MeshObjExporter.java @@ -0,0 +1,119 @@ +package cz.fidentis.analyst.mesh.io; + +import cz.fidentis.analyst.mesh.core.MeshFacet; +import cz.fidentis.analyst.mesh.core.MeshModel; +import cz.fidentis.analyst.symmetry.Triangle; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.text.DecimalFormat; +import java.text.DecimalFormatSymbols; +import java.util.Locale; + +/** + * Utility class for exporting model to .obj file (vertices, normals and triangles) + * + * @author Natalia Bebjakova + */ +public class MeshObjExporter { + /** + * Model to be exported + */ + MeshModel model; + + /** + * + * @param model model to be exported. + */ + public MeshObjExporter(MeshModel model) { + this.model = model; + } + + /** + * Exports all facets of the model to .obj file + * + * @param exportFile File to which model is exported + * @throws IOException + */ + public void exportModelToObj(File exportFile) throws IOException { + for(MeshFacet facet : model.getFacets()) { + exportFacetToObj(facet, exportFile); + } + } + + /** + * Exports facet to OBJ file. + * It writes vertices, normals and triangles to file + * + * @param facet Facet of the model to be exported, so far every model has one + * @param exportFile file for exporting. + * @throws java.io.IOException + */ + public void exportFacetToObj(MeshFacet facet, File exportFile) throws IOException { + int formatIndex = exportFile.getName().lastIndexOf("."); + String fileName; //name that is writen to file + + if (formatIndex < 0) { + fileName = exportFile.getName(); + } else { + fileName = exportFile.getName().substring(0, formatIndex); + } + + exportFile = new File(exportFile.getParent() + File.separator + fileName + ".obj"); + + try (FileWriter fstream = new FileWriter(exportFile); + BufferedWriter out = new BufferedWriter(fstream);) { + + DecimalFormatSymbols otherSymbols = new DecimalFormatSymbols(Locale.getDefault()); + otherSymbols.setDecimalSeparator('.'); //dot as separator for decimal numbers + DecimalFormat df = new DecimalFormat("#.####", otherSymbols); + + //writes vertices of the facet to file + for (int j = 0; j < facet.getNumberOfVertices(); j++) { + out.write("v " + df.format(facet.getVertices().get(j).getPosition().x) + " " + + df.format(facet.getVertices().get(j).getPosition().y) + " " + + df.format(facet.getVertices().get(j).getPosition().z) + "\n"); + } + + //detects if first vertex has normal + boolean hasAllNormals = facet.getVertices().get(0).getNormal() != null; + + //writes normals if there are any + for (int i = 0; i < facet.getNumberOfVertices(); i++) { + if(facet.getVertex(i).getNormal() != null) { + out.write("vn " + df.format(facet.getVertices().get(i).getNormal().x) + " " + + df.format(facet.getVertices().get(i).getNormal().y) + " " + + df.format(facet.getVertices().get(i).getNormal().z) + "\n"); + } + } + + //computes triangles of facet + Triangle[] triangles = new Triangle[facet.getCornerTable().getSize() / 3]; + for (int i = 0; i < facet.getCornerTable().getSize(); i += 3) { + Triangle t = new Triangle(facet.getCornerTable().getRow(i).getVertexIndex(), + facet.getCornerTable().getRow(i + 1).getVertexIndex(), + facet.getCornerTable().getRow(i + 2).getVertexIndex()); + triangles[(i / 3)] = t; + } + + //writes triangles of facet + for (Triangle triangle : triangles) { + out.write("f "); + if (facet.getVertex(triangle.getVertex1()).getNormal() != null && hasAllNormals) { + out.write((triangle.getVertex1() + 1) + "//" + (triangle.getVertex1() + 1) + " " + + (triangle.getVertex2() + 1) + "//" + (triangle.getVertex2() + 1) + " " + + (triangle.getVertex3() + 1) + "//" + (triangle.getVertex3() + 1) + "\n"); + } else { + out.write((triangle.getVertex1() + 1) + " " + (triangle.getVertex2() + 1) + + " " + (triangle.getVertex3() + 1) + "\n"); + } + } + out.write("#" + triangles.length + " triangles" + "\n"); + out.write("\n"); + out.close(); + fstream.close(); + } + } +} + diff --git a/MeshModel/src/main/java/cz/fidentis/analyst/mesh/io/ModelFileFilter.java b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/io/ModelFileFilter.java index 7eec1eff..2507d877 100644 --- a/MeshModel/src/main/java/cz/fidentis/analyst/mesh/io/ModelFileFilter.java +++ b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/io/ModelFileFilter.java @@ -1,43 +1,48 @@ package cz.fidentis.analyst.mesh.io; -import java.io.File; import javax.swing.filechooser.FileFilter; +import java.io.File; /** - * @author Natalia Bebjakova - * <p> - * Enables to choose just extensions we want in the filechooser + * @author Natália Bebjaková + * + * Class that enables to choose just extensions we want in the filechooser */ public class ModelFileFilter extends FileFilter { private final String[] extension; private final String description; - + /** - * @param extension Extentions of files + * + * @param extension Extentions of files * @param description Description */ - public ModelFileFilter(String[] extension, String description) { + public ModelFileFilter(String[] extension, String description) + { this.extension = extension; this.description = description; } /** - * @param f File - * @return Whether file has chosen extension or not + * + * @param f File + * @return Whether file has chosen extension or not */ @Override - public boolean accept(File f) { + public boolean accept(File f) + { boolean accepted = false; - for (int i = 0; i < extension.length; i++) { - if (f.isDirectory() || f.getName().endsWith(extension[i])) { + for (String extension1 : extension) { + if (f.isDirectory() || f.getName().endsWith(extension1)) { accepted = true; } } return accepted; } - + /** + * * @return description */ @Override -- GitLab