From 321b15a7e448fbb423d08301a7ae33a3ee3afb70 Mon Sep 17 00:00:00 2001 From: Natalia Bebjakova <xbebjak@fi.muni.cz> Date: Thu, 26 Mar 2020 09:59:51 +0100 Subject: [PATCH] symmetry estimate --- .idea/workspace.xml | 114 +- .../java/cz/fidentis/analyst/gui/Canvas.form | 298 ++++ .../java/cz/fidentis/analyst/gui/Canvas.java | 348 +++-- .../analyst/gui/GeneralGLEventListener.java | 318 ++-- .../cz/fidentis/analyst/gui/Interface.java | 1367 ----------------- .../fidentis/analyst/gui/SymmetryPanel.form | 427 +++++ .../fidentis/analyst/gui/SymmetryPanel.java | 604 ++++++++ .../fidentis/analyst/gui/UserInterface.form | 933 +++++++++++ .../fidentis/analyst/gui/UserInterface.java | 1177 ++++++++++++++ .../analyst/{ => gui}/resources/backround.jpg | Bin .../{ => gui}/resources/batchProcessing.png | Bin .../resources/batchProcessingGreen.png | Bin .../gui/resources/batchProcessingStart.png | Bin 0 -> 5829 bytes .../gui/resources/blackBackroundCanvas.png | Bin 0 -> 2613 bytes .../resources/blackBackroundCanvasPressed.png | Bin 0 -> 2626 bytes .../analyst/{ => gui}/resources/bottom.png | Bin .../fidentis/analyst/gui/resources/close.png | Bin 0 -> 2540 bytes .../{ => gui}/resources/compareTwo.png | Bin .../{ => gui}/resources/compareTwoGreen.png | Bin .../analyst/gui/resources/compareTwoStart.png | Bin 0 -> 6724 bytes .../resources/copareWithDatabase.png | Bin .../resources/copareWithDatabaseGreen.png | Bin .../gui/resources/copareWithDatabaseStart.png | Bin 0 -> 6318 bytes .../analyst/{ => gui}/resources/divide.png | Bin .../{ => gui}/resources/downButton.png | Bin .../{ => gui}/resources/downButtonPressed.png | Bin .../{ => gui}/resources/exportModel.png | Bin .../resources/exportModelPressed.png | Bin .../analyst/gui/resources/exportedModel.png | Bin 0 -> 3290 bytes .../analyst/{ => gui}/resources/home.png | Bin .../{ => gui}/resources/leftButton.png | Bin .../{ => gui}/resources/leftButtonPressed.png | Bin .../analyst/gui/resources/loadCanva.png | Bin 0 -> 9309 bytes .../gui/resources/loadCanvaClicked.png | Bin 0 -> 8512 bytes .../analyst/gui/resources/loadModel.png | Bin 0 -> 3891 bytes .../gui/resources/loadModelPressed.png | Bin 0 -> 4422 bytes .../analyst/{ => gui}/resources/logo.png | Bin .../analyst/{ => gui}/resources/logo2.png | Bin .../analyst/{ => gui}/resources/logo3.png | Bin .../analyst/{ => gui}/resources/maximize.png | Bin .../analyst/gui/resources/minimize.png | Bin 0 -> 2163 bytes .../analyst/{ => gui}/resources/minus.png | Bin .../{ => gui}/resources/minusPressed.png | Bin .../analyst/gui/resources/modelView.png | Bin 0 -> 9348 bytes .../analyst/gui/resources/modelViewMoved.png | Bin 0 -> 9788 bytes .../analyst/{ => gui}/resources/n.png | Bin .../{ => gui}/resources/navigBackground.png | Bin .../resources/navigationBackground.png | Bin .../{ => gui}/resources/new_project.jpg | Bin .../{ => gui}/resources/new_project.png | Bin .../resources/new_project_opened.png | Bin .../analyst/gui/resources/notLoadedModel.png | Bin 0 -> 3378 bytes .../analyst/gui/resources/originalModel.png | Bin 0 -> 4999 bytes .../gui/resources/originalModelPressed.png | Bin 0 -> 4670 bytes .../analyst/{ => gui}/resources/plus.png | Bin .../{ => gui}/resources/plusPressed.png | Bin .../{ => gui}/resources/resetButton.png | Bin .../resources/resetButtonPressed.png | Bin .../{ => gui}/resources/rightBottom.png | Bin .../{ => gui}/resources/rightButton.png | Bin .../resources/rightButtonPressed.png | Bin .../analyst/gui/resources/selectPoints.png | Bin 0 -> 4035 bytes .../analyst/gui/resources/showPlane.png | Bin 0 -> 3359 bytes .../analyst/gui/resources/showPlanePane.png | Bin 0 -> 3255 bytes .../gui/resources/showPlanePressed.png | Bin 0 -> 3133 bytes .../analyst/{ => gui}/resources/symetry.png | Bin .../analyst/gui/resources/symetryCount.png | Bin 0 -> 4915 bytes .../gui/resources/symetryCountClicked.png | Bin 0 -> 4839 bytes .../{ => gui}/resources/symetryGreen.png | Bin .../analyst/gui/resources/symetryStart.png | Bin 0 -> 5559 bytes .../gui/resources/symetryStartMoved.png | Bin 0 -> 5564 bytes .../analyst/gui/resources/symetryStartP.png | Bin 0 -> 5510 bytes .../gui/resources/symetryStartPanel.png | Bin 0 -> 5564 bytes .../analyst/{ => gui}/resources/texture.png | Bin .../analyst/{ => gui}/resources/texture2.png | Bin .../analyst/{ => gui}/resources/upButton.png | Bin .../{ => gui}/resources/upButtonPressed.png | Bin .../gui/resources/whiteBackroundCanvas.png | Bin 0 -> 2647 bytes .../resources/whiteBackroundCanvasPressed.png | Bin 0 -> 2667 bytes .../analyst/gui/resources/wireframe.png | Bin 0 -> 4143 bytes .../cz/fidentis/analyst/resources/close.png | Bin 2314 -> 0 bytes .../fidentis/analyst/resources/loadCanva.png | Bin 9393 -> 0 bytes .../analyst/resources/loadCanvaClicked.png | Bin 8635 -> 0 bytes .../fidentis/analyst/resources/loadModel.png | Bin 3921 -> 0 bytes .../analyst/resources/loadModelPressed.png | Bin 4545 -> 0 bytes .../fidentis/analyst/resources/modelView.png | Bin 11398 -> 0 bytes .../analyst/resources/modelViewMoved.png | Bin 11495 -> 0 bytes .../analyst/resources/symetryCount.png | Bin 4912 -> 0 bytes .../analyst/resources/symetryCountClicked.png | Bin 4845 -> 0 bytes .../fidentis/analyst/resources/wireframe.png | Bin 5000 -> 0 bytes .../analyst/symmetry/AproxSymmetryPlane.java | 42 + .../analyst/symmetry/BoundingBox.java | 147 ++ .../cz/fidentis/analyst/symmetry/Config.java | 157 ++ .../cz/fidentis/analyst/symmetry/Plane.java | 88 ++ .../analyst/symmetry/SymmetryCounter.java | 812 ++++++++++ .../fidentis/analyst/symmetry/Triangle.java | 101 ++ .../analyst/mesh/core/CornerTable.java | 70 +- .../analyst/mesh/core/CornerTableRow.java | 22 +- .../fidentis/analyst/mesh/core/MeshFacet.java | 55 +- .../fidentis/analyst/mesh/core/MeshModel.java | 21 +- .../fidentis/analyst/mesh/core/MeshPoint.java | 206 ++- .../analyst/mesh/io/MeshModelExporter.java | 221 +++ .../analyst/mesh/io}/ModelFileFilter.java | 33 +- 103 files changed, 5699 insertions(+), 1862 deletions(-) create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/Canvas.form delete mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/Interface.java create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/SymmetryPanel.form create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/SymmetryPanel.java create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/UserInterface.form create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/UserInterface.java rename GUI/src/main/java/cz/fidentis/analyst/{ => gui}/resources/backround.jpg (100%) rename GUI/src/main/java/cz/fidentis/analyst/{ => gui}/resources/batchProcessing.png (100%) rename GUI/src/main/java/cz/fidentis/analyst/{ => gui}/resources/batchProcessingGreen.png (100%) create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/resources/batchProcessingStart.png create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/resources/blackBackroundCanvas.png create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/resources/blackBackroundCanvasPressed.png rename GUI/src/main/java/cz/fidentis/analyst/{ => gui}/resources/bottom.png (100%) create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/resources/close.png rename GUI/src/main/java/cz/fidentis/analyst/{ => gui}/resources/compareTwo.png (100%) rename GUI/src/main/java/cz/fidentis/analyst/{ => gui}/resources/compareTwoGreen.png (100%) create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/resources/compareTwoStart.png rename GUI/src/main/java/cz/fidentis/analyst/{ => gui}/resources/copareWithDatabase.png (100%) rename GUI/src/main/java/cz/fidentis/analyst/{ => gui}/resources/copareWithDatabaseGreen.png (100%) create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/resources/copareWithDatabaseStart.png rename GUI/src/main/java/cz/fidentis/analyst/{ => gui}/resources/divide.png (100%) rename GUI/src/main/java/cz/fidentis/analyst/{ => gui}/resources/downButton.png (100%) rename GUI/src/main/java/cz/fidentis/analyst/{ => gui}/resources/downButtonPressed.png (100%) rename GUI/src/main/java/cz/fidentis/analyst/{ => gui}/resources/exportModel.png (100%) rename GUI/src/main/java/cz/fidentis/analyst/{ => gui}/resources/exportModelPressed.png (100%) create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/resources/exportedModel.png rename GUI/src/main/java/cz/fidentis/analyst/{ => gui}/resources/home.png (100%) rename GUI/src/main/java/cz/fidentis/analyst/{ => gui}/resources/leftButton.png (100%) rename GUI/src/main/java/cz/fidentis/analyst/{ => gui}/resources/leftButtonPressed.png (100%) create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/resources/loadCanva.png create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/resources/loadCanvaClicked.png create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/resources/loadModel.png create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/resources/loadModelPressed.png rename GUI/src/main/java/cz/fidentis/analyst/{ => gui}/resources/logo.png (100%) rename GUI/src/main/java/cz/fidentis/analyst/{ => gui}/resources/logo2.png (100%) rename GUI/src/main/java/cz/fidentis/analyst/{ => gui}/resources/logo3.png (100%) rename GUI/src/main/java/cz/fidentis/analyst/{ => gui}/resources/maximize.png (100%) create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/resources/minimize.png rename GUI/src/main/java/cz/fidentis/analyst/{ => gui}/resources/minus.png (100%) rename GUI/src/main/java/cz/fidentis/analyst/{ => gui}/resources/minusPressed.png (100%) create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/resources/modelView.png create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/resources/modelViewMoved.png rename GUI/src/main/java/cz/fidentis/analyst/{ => gui}/resources/n.png (100%) rename GUI/src/main/java/cz/fidentis/analyst/{ => gui}/resources/navigBackground.png (100%) rename GUI/src/main/java/cz/fidentis/analyst/{ => gui}/resources/navigationBackground.png (100%) rename GUI/src/main/java/cz/fidentis/analyst/{ => gui}/resources/new_project.jpg (100%) rename GUI/src/main/java/cz/fidentis/analyst/{ => gui}/resources/new_project.png (100%) rename GUI/src/main/java/cz/fidentis/analyst/{ => gui}/resources/new_project_opened.png (100%) create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/resources/notLoadedModel.png create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/resources/originalModel.png create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/resources/originalModelPressed.png rename GUI/src/main/java/cz/fidentis/analyst/{ => gui}/resources/plus.png (100%) rename GUI/src/main/java/cz/fidentis/analyst/{ => gui}/resources/plusPressed.png (100%) rename GUI/src/main/java/cz/fidentis/analyst/{ => gui}/resources/resetButton.png (100%) rename GUI/src/main/java/cz/fidentis/analyst/{ => gui}/resources/resetButtonPressed.png (100%) rename GUI/src/main/java/cz/fidentis/analyst/{ => gui}/resources/rightBottom.png (100%) rename GUI/src/main/java/cz/fidentis/analyst/{ => gui}/resources/rightButton.png (100%) rename GUI/src/main/java/cz/fidentis/analyst/{ => gui}/resources/rightButtonPressed.png (100%) create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/resources/selectPoints.png create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/resources/showPlane.png create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/resources/showPlanePane.png create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/resources/showPlanePressed.png rename GUI/src/main/java/cz/fidentis/analyst/{ => gui}/resources/symetry.png (100%) create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/resources/symetryCount.png create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/resources/symetryCountClicked.png rename GUI/src/main/java/cz/fidentis/analyst/{ => gui}/resources/symetryGreen.png (100%) create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/resources/symetryStart.png create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/resources/symetryStartMoved.png create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/resources/symetryStartP.png create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/resources/symetryStartPanel.png rename GUI/src/main/java/cz/fidentis/analyst/{ => gui}/resources/texture.png (100%) rename GUI/src/main/java/cz/fidentis/analyst/{ => gui}/resources/texture2.png (100%) rename GUI/src/main/java/cz/fidentis/analyst/{ => gui}/resources/upButton.png (100%) rename GUI/src/main/java/cz/fidentis/analyst/{ => gui}/resources/upButtonPressed.png (100%) create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/resources/whiteBackroundCanvas.png create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/resources/whiteBackroundCanvasPressed.png create mode 100644 GUI/src/main/java/cz/fidentis/analyst/gui/resources/wireframe.png delete mode 100644 GUI/src/main/java/cz/fidentis/analyst/resources/close.png delete mode 100644 GUI/src/main/java/cz/fidentis/analyst/resources/loadCanva.png delete mode 100644 GUI/src/main/java/cz/fidentis/analyst/resources/loadCanvaClicked.png delete mode 100644 GUI/src/main/java/cz/fidentis/analyst/resources/loadModel.png delete mode 100644 GUI/src/main/java/cz/fidentis/analyst/resources/loadModelPressed.png delete mode 100644 GUI/src/main/java/cz/fidentis/analyst/resources/modelView.png delete mode 100644 GUI/src/main/java/cz/fidentis/analyst/resources/modelViewMoved.png delete mode 100644 GUI/src/main/java/cz/fidentis/analyst/resources/symetryCount.png delete mode 100644 GUI/src/main/java/cz/fidentis/analyst/resources/symetryCountClicked.png delete mode 100644 GUI/src/main/java/cz/fidentis/analyst/resources/wireframe.png create mode 100644 GUI/src/main/java/cz/fidentis/analyst/symmetry/AproxSymmetryPlane.java create mode 100644 GUI/src/main/java/cz/fidentis/analyst/symmetry/BoundingBox.java create mode 100644 GUI/src/main/java/cz/fidentis/analyst/symmetry/Config.java create mode 100644 GUI/src/main/java/cz/fidentis/analyst/symmetry/Plane.java create mode 100644 GUI/src/main/java/cz/fidentis/analyst/symmetry/SymmetryCounter.java create mode 100644 GUI/src/main/java/cz/fidentis/analyst/symmetry/Triangle.java create mode 100644 MeshModel/src/main/java/cz/fidentis/analyst/mesh/io/MeshModelExporter.java rename {GUI/src/main/java/cz/fidentis/analyst/gui => MeshModel/src/main/java/cz/fidentis/analyst/mesh/io}/ModelFileFilter.java (50%) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index b55ccdb7..748969aa 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,11 +2,7 @@ <project version="4"> <component name="ChangeListManager"> <list default="true" id="dd1d4179-bace-49d8-b3fd-a51317f8ae06" name="Default Changelist" comment=""> - <change afterPath="$PROJECT_DIR$/.idea/libraries/Maven__org_jogamp_jogl_jogl_all_2_0_rc11.xml" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/GUI/GUI.iml" beforeDir="false" afterPath="$PROJECT_DIR$/GUI/GUI.iml" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/GUI/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/GUI/pom.xml" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/GUI/src/main/java/cz/fidentis/analyst/gui/GeneralGLEventListener.java" beforeDir="false" afterPath="$PROJECT_DIR$/GUI/src/main/java/cz/fidentis/analyst/gui/GeneralGLEventListener.java" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/MeshModel/MeshModel.iml" beforeDir="false" afterPath="$PROJECT_DIR$/MeshModel/MeshModel.iml" afterDir="false" /> + <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> </list> <ignored path="$PROJECT_DIR$/target/" /> <ignored path="$PROJECT_DIR$/MeshModel/target/" /> @@ -38,7 +34,7 @@ <file pinned="false" current-in-tab="false"> <entry file="file://$PROJECT_DIR$/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/CornerTableRow.java"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="12"> + <state relative-caret-position="119"> <caret line="7" column="13" selection-start-line="7" selection-start-column="13" selection-end-line="7" selection-end-column="13" /> </state> </provider> @@ -47,7 +43,7 @@ <file pinned="false" current-in-tab="false"> <entry file="file://$PROJECT_DIR$/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshPoint.java"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="-872"> + <state relative-caret-position="153"> <caret line="9" column="13" selection-start-line="9" selection-start-column="13" selection-end-line="9" selection-end-column="13" /> </state> </provider> @@ -56,12 +52,10 @@ <file pinned="false" current-in-tab="false"> <entry file="file://$PROJECT_DIR$/GUI/src/main/java/cz/fidentis/analyst/gui/Canvas.java"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="-1820"> + <state relative-caret-position="3315"> <caret line="381" column="28" selection-start-line="381" selection-start-column="28" selection-end-line="381" selection-end-column="28" /> <folding> <element signature="imports" expanded="true" /> - <element signature="e#15781#15916#0" expanded="true" /> - <element signature="e#15915#15916#0" expanded="true" /> </folding> </state> </provider> @@ -70,7 +64,7 @@ <file pinned="false" current-in-tab="false"> <entry file="file://$PROJECT_DIR$/GUI/src/main/java/cz/fidentis/analyst/gui/GeneralGLEventListener.java"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="287"> + <state relative-caret-position="6426"> <caret line="406" column="44" selection-start-line="406" selection-start-column="44" selection-end-line="406" selection-end-column="44" /> <folding> <element signature="imports" expanded="true" /> @@ -82,12 +76,11 @@ <file pinned="false" current-in-tab="true"> <entry file="file://$PROJECT_DIR$/GUI/src/main/java/cz/fidentis/analyst/gui/Interface.java"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="54"> - <caret line="221" column="25" lean-forward="true" selection-start-line="221" selection-start-column="25" selection-end-line="221" selection-end-column="25" /> + <state relative-caret-position="-221"> + <caret line="14" column="32" lean-forward="true" selection-start-line="14" selection-start-column="32" selection-end-line="14" selection-end-column="32" /> <folding> <element signature="imports" expanded="true" /> - <element signature="e#11067#11244#0" expanded="true" /> - <element signature="e#11243#11244#0" expanded="true" /> + <element signature="e#4076#4165#0" expanded="true" /> </folding> </state> </provider> @@ -114,7 +107,7 @@ <file pinned="false" current-in-tab="false"> <entry file="file://$PROJECT_DIR$/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/CornerTable.java"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="-612"> + <state relative-caret-position="153"> <caret line="10" column="13" selection-start-line="10" selection-start-column="13" selection-end-line="10" selection-end-column="13" /> </state> </provider> @@ -184,8 +177,8 @@ <option name="delegateBuildToMaven" value="true" /> </component> <component name="ProjectFrameBounds" extendedState="6"> - <option name="x" value="-9" /> - <option name="y" value="-9" /> + <option name="x" value="-10" /> + <option name="y" value="-10" /> <option name="width" value="980" /> <option name="height" value="1050" /> </component> @@ -194,6 +187,7 @@ <foldersAlwaysOnTop value="true" /> </navigator> <panes> + <pane id="Scope" /> <pane id="ProjectPane"> <subPane> <expand> @@ -227,15 +221,6 @@ <item name="main" type="462c0819:PsiDirectoryNode" /> <item name="java" type="462c0819:PsiDirectoryNode" /> </path> - <path> - <item name="FIDENTIS-Analyst-parent" type="b2602c69:ProjectViewProjectNode" /> - <item name="analyst2" type="462c0819:PsiDirectoryNode" /> - <item name="GUI" type="462c0819:PsiDirectoryNode" /> - <item name="src" type="462c0819:PsiDirectoryNode" /> - <item name="main" type="462c0819:PsiDirectoryNode" /> - <item name="java" type="462c0819:PsiDirectoryNode" /> - <item name="gui" type="462c0819:PsiDirectoryNode" /> - </path> <path> <item name="FIDENTIS-Analyst-parent" type="b2602c69:ProjectViewProjectNode" /> <item name="analyst2" type="462c0819:PsiDirectoryNode" /> @@ -296,14 +281,13 @@ </subPane> </pane> <pane id="PackagesPane" /> - <pane id="Scope" /> </panes> </component> <component name="PropertiesComponent"> <property name="WebServerToolWindowFactoryState" value="false" /> <property name="aspect.path.notification.shown" value="true" /> - <property name="com.android.tools.idea.instantapp.provision.ProvisionBeforeRunTaskProvider.myTimeStamp" value="1583523876314" /> - <property name="last_opened_file_path" value="$PROJECT_DIR$" /> + <property name="com.android.tools.idea.instantapp.provision.ProvisionBeforeRunTaskProvider.myTimeStamp" value="1583613721619" /> + <property name="last_opened_file_path" value="$PROJECT_DIR$/../../J5" /> <property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" /> <property name="nodejs_npm_path_reset_for_default_project" value="true" /> <property name="project.structure.last.edited" value="Global Libraries" /> @@ -359,18 +343,19 @@ <workItem from="1582807369146" duration="1114000" /> <workItem from="1582811692938" duration="1887000" /> <workItem from="1583409089486" duration="2462000" /> - <workItem from="1583521284239" duration="1204000" /> + <workItem from="1583521284239" duration="2331000" /> + <workItem from="1584477266625" duration="1814000" /> + <workItem from="1584557414142" duration="72000" /> </task> <servers /> </component> <component name="TimeTrackingManager"> - <option name="totallyTimeSpent" value="14619000" /> + <option name="totallyTimeSpent" value="17632000" /> </component> <component name="ToolWindowManager"> - <frame x="-7" y="-7" width="1550" height="838" extended-state="7" /> - <editor active="true" /> + <frame x="-7" y="-7" width="1550" height="838" extended-state="6" /> <layout> - <window_info content_ui="combo" id="Project" order="0" visible="true" weight="0.27114093" /> + <window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.27919462" /> <window_info id="Structure" order="1" side_tool="true" weight="0.25" /> <window_info id="Image Layers" order="2" /> <window_info id="Designer" order="3" /> @@ -379,7 +364,7 @@ <window_info id="Favorites" order="6" side_tool="true" /> <window_info anchor="bottom" id="Message" order="0" /> <window_info anchor="bottom" id="Find" order="1" /> - <window_info active="true" anchor="bottom" id="Run" order="2" visible="true" weight="0.3286119" /> + <window_info anchor="bottom" id="Run" order="2" weight="0.3286119" /> <window_info anchor="bottom" id="Debug" order="3" weight="0.4" /> <window_info anchor="bottom" id="Cvs" order="4" weight="0.25" /> <window_info anchor="bottom" id="Inspection" order="5" weight="0.4" /> @@ -395,7 +380,7 @@ <window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" /> <window_info anchor="right" id="Palette" order="3" /> <window_info anchor="right" id="Theme Preview" order="4" /> - <window_info anchor="right" id="Maven" order="5" visible="true" weight="0.2543624" /> + <window_info anchor="right" id="Maven" order="5" visible="true" weight="0.094630875" /> <window_info anchor="right" id="Capture Analysis" order="6" /> <window_info anchor="right" id="Palette	" order="7" /> <window_info anchor="right" id="Database" order="8" /> @@ -405,20 +390,6 @@ <option name="version" value="1" /> </component> <component name="editorHistoryManager"> - <entry file="file://$PROJECT_DIR$/application/src/test/java/cz/fidentis/analyst/mesh/core/CornerTableRowTest.java"> - <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="289"> - <caret line="17" selection-start-line="17" selection-end-line="17" /> - </state> - </provider> - </entry> - <entry file="file://$PROJECT_DIR$/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/CornerTable.java"> - <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="-612"> - <caret line="10" column="13" selection-start-line="10" selection-start-column="13" selection-end-line="10" selection-end-column="13" /> - </state> - </provider> - </entry> <entry file="file://$PROJECT_DIR$/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshFacet.java"> <provider selected="true" editor-type-id="text-editor"> <state relative-caret-position="170"> @@ -432,21 +403,31 @@ </entry> <entry file="file://$PROJECT_DIR$/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/CornerTableRow.java"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="12"> + <state relative-caret-position="119"> <caret line="7" column="13" selection-start-line="7" selection-start-column="13" selection-end-line="7" selection-end-column="13" /> </state> </provider> </entry> <entry file="file://$PROJECT_DIR$/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshPoint.java"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="-872"> + <state relative-caret-position="153"> <caret line="9" column="13" selection-start-line="9" selection-start-column="13" selection-end-line="9" selection-end-column="13" /> </state> </provider> </entry> + <entry file="file://$PROJECT_DIR$/GUI/src/main/java/cz/fidentis/analyst/gui/Canvas.java"> + <provider selected="true" editor-type-id="text-editor"> + <state relative-caret-position="3315"> + <caret line="381" column="28" selection-start-line="381" selection-start-column="28" selection-end-line="381" selection-end-column="28" /> + <folding> + <element signature="imports" expanded="true" /> + </folding> + </state> + </provider> + </entry> <entry file="file://$PROJECT_DIR$/GUI/src/main/java/cz/fidentis/analyst/gui/GeneralGLEventListener.java"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="287"> + <state relative-caret-position="6426"> <caret line="406" column="44" selection-start-line="406" selection-start-column="44" selection-end-line="406" selection-end-column="44" /> <folding> <element signature="imports" expanded="true" /> @@ -454,6 +435,13 @@ </state> </provider> </entry> + <entry file="file://$PROJECT_DIR$/application/src/test/java/cz/fidentis/analyst/mesh/core/CornerTableRowTest.java"> + <provider selected="true" editor-type-id="text-editor"> + <state relative-caret-position="289"> + <caret line="17" selection-start-line="17" selection-end-line="17" /> + </state> + </provider> + </entry> <entry file="file://$PROJECT_DIR$/GUI/src/main/java/cz/fidentis/analyst/gui/ModelFileFilter.java"> <provider selected="true" editor-type-id="text-editor"> <state relative-caret-position="306"> @@ -461,26 +449,20 @@ </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/GUI/src/main/java/cz/fidentis/analyst/gui/Canvas.java"> + <entry file="file://$PROJECT_DIR$/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/CornerTable.java"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="-1820"> - <caret line="381" column="28" selection-start-line="381" selection-start-column="28" selection-end-line="381" selection-end-column="28" /> - <folding> - <element signature="imports" expanded="true" /> - <element signature="e#15781#15916#0" expanded="true" /> - <element signature="e#15915#15916#0" expanded="true" /> - </folding> + <state relative-caret-position="153"> + <caret line="10" column="13" selection-start-line="10" selection-start-column="13" selection-end-line="10" selection-end-column="13" /> </state> </provider> </entry> <entry file="file://$PROJECT_DIR$/GUI/src/main/java/cz/fidentis/analyst/gui/Interface.java"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="54"> - <caret line="221" column="25" lean-forward="true" selection-start-line="221" selection-start-column="25" selection-end-line="221" selection-end-column="25" /> + <state relative-caret-position="-221"> + <caret line="14" column="32" lean-forward="true" selection-start-line="14" selection-start-column="32" selection-end-line="14" selection-end-column="32" /> <folding> <element signature="imports" expanded="true" /> - <element signature="e#11067#11244#0" expanded="true" /> - <element signature="e#11243#11244#0" expanded="true" /> + <element signature="e#4076#4165#0" expanded="true" /> </folding> </state> </provider> diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/Canvas.form b/GUI/src/main/java/cz/fidentis/analyst/gui/Canvas.form new file mode 100644 index 00000000..f2b81b26 --- /dev/null +++ b/GUI/src/main/java/cz/fidentis/analyst/gui/Canvas.form @@ -0,0 +1,298 @@ +<?xml version="1.0" encoding="UTF-8" ?> + +<Form version="1.9" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo"> + <Properties> + <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> + <Color blue="0" green="0" red="0" type="rgb"/> + </Property> + </Properties> + <AuxValues> + <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/> + <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/> + <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/> + <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/> + <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/> + <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/> + <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/> + <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/> + <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/> + <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,93,0,0,1,-79"/> + </AuxValues> + + <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/> + <SubComponents> + <Container class="javax.swing.JLayeredPane" name="jLayeredPane1"> + <Properties> + <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> + <Color blue="28" green="28" red="28" type="rgb"/> + </Property> + <Property name="toolTipText" type="java.lang.String" value=""/> + <Property name="opaque" type="boolean" value="true"/> + </Properties> + <Events> + <EventHandler event="componentResized" listener="java.awt.event.ComponentListener" parameters="java.awt.event.ComponentEvent" handler="jLayeredPane1ComponentResized"/> + <EventHandler event="componentShown" listener="java.awt.event.ComponentListener" parameters="java.awt.event.ComponentEvent" handler="jLayeredPane1ComponentShown"/> + </Events> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription"> + <BorderConstraints direction="Center"/> + </Constraint> + </Constraints> + + <Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout"> + <Property name="useNullLayout" type="boolean" value="true"/> + </Layout> + <SubComponents> + <Component class="javax.swing.JLabel" name="resetButton"> + <Properties> + <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="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="resetButtonMouseMoved"/> + <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="resetButtonMouseClicked"/> + <EventHandler event="mouseExited" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="resetButtonMouseExited"/> + </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"/> + </Constraint> + </Constraints> + </Component> + <Component class="javax.swing.JButton" name="upNavigationButton"> + <Properties> + <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="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"> + <Color id="Hand Cursor"/> + </Property> + </Properties> + <Events> + <EventHandler event="mousePressed" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="upNavigationButtonMousePressed"/> + <EventHandler event="mouseReleased" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="upNavigationButtonMouseReleased"/> + </Events> + <AuxValues> + <AuxValue name="JLayeredPane.layer" type="java.lang.Integer" value="200"/> + </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"/> + </Constraint> + </Constraints> + </Component> + <Component class="javax.swing.JButton" name="leftNavigationButton"> + <Properties> + <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="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"> + <Color id="Hand Cursor"/> + </Property> + </Properties> + <Events> + <EventHandler event="mousePressed" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="leftNavigationButtonMousePressed"/> + <EventHandler event="mouseReleased" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="leftNavigationButtonMouseReleased"/> + </Events> + <AuxValues> + <AuxValue name="JLayeredPane.layer" type="java.lang.Integer" value="200"/> + </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"/> + </Constraint> + </Constraints> + </Component> + <Component class="javax.swing.JButton" name="minusNavigationButton"> + <Properties> + <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="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"> + <Color id="Hand Cursor"/> + </Property> + </Properties> + <Events> + <EventHandler event="mousePressed" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="minusNavigationButtonMousePressed"/> + <EventHandler event="mouseReleased" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="minusNavigationButtonMouseReleased"/> + </Events> + <AuxValues> + <AuxValue name="JLayeredPane.layer" type="java.lang.Integer" value="200"/> + </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"/> + </Constraint> + </Constraints> + </Component> + <Component class="javax.swing.JButton" name="downNavigationButton"> + <Properties> + <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="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"> + <Color id="Hand Cursor"/> + </Property> + </Properties> + <Events> + <EventHandler event="mousePressed" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="downNavigationButtonMousePressed"/> + <EventHandler event="mouseReleased" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="downNavigationButtonMouseReleased"/> + </Events> + <AuxValues> + <AuxValue name="JLayeredPane.layer" type="java.lang.Integer" value="200"/> + </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"/> + </Constraint> + </Constraints> + </Component> + <Component class="javax.swing.JButton" name="plusNavigationButton"> + <Properties> + <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="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"> + <Color id="Hand Cursor"/> + </Property> + </Properties> + <Events> + <EventHandler event="mousePressed" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="plusNavigationButtonMousePressed"/> + <EventHandler event="mouseReleased" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="plusNavigationButtonMouseReleased"/> + </Events> + <AuxValues> + <AuxValue name="JLayeredPane.layer" type="java.lang.Integer" value="200"/> + </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"/> + </Constraint> + </Constraints> + </Component> + <Component class="javax.swing.JLabel" name="jLabel1"> + <Properties> + <Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor"> + <Image iconType="3" name="/cz/fidentis/analyst/gui/resources/navigBackground.png"/> + </Property> + </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"/> + </Constraint> + </Constraints> + </Component> + <Component class="javax.swing.JLabel" name="loadModelButton"> + <Properties> + <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="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="loadModelButtonMouseMoved"/> + <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="loadModelButtonMouseClicked"/> + <EventHandler event="mouseExited" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="loadModelButtonMouseExited"/> + </Events> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> + <AbsoluteConstraints x="200" y="100" width="210" height="220"/> + </Constraint> + </Constraints> + </Component> + <Component class="javax.swing.JButton" name="rightNavigationButton1"> + <Properties> + <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="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"> + <Color id="Hand Cursor"/> + </Property> + </Properties> + <Events> + <EventHandler event="mousePressed" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="rightNavigationButton1MousePressed"/> + <EventHandler event="mouseReleased" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="rightNavigationButton1MouseReleased"/> + </Events> + <AuxValues> + <AuxValue name="JLayeredPane.layer" type="java.lang.Integer" value="200"/> + </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"/> + </Constraint> + </Constraints> + </Component> + <Component class="javax.swing.JLabel" name="whiteBackroundButton"> + <Properties> + <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="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="whiteBackroundButtonMouseClicked"/> + </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"/> + </Constraint> + </Constraints> + </Component> + <Component class="javax.swing.JLabel" name="blackBackroundButton"> + <Properties> + <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="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="blackBackroundButtonMouseClicked"/> + </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"/> + </Constraint> + </Constraints> + </Component> + <Container class="javax.swing.JPanel" name="jPanel1"> + <Properties> + <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> + <Color blue="0" green="0" red="0" type="rgb"/> + </Property> + </Properties> + <Events> + <EventHandler event="mouseWheelMoved" listener="java.awt.event.MouseWheelListener" parameters="java.awt.event.MouseWheelEvent" handler="jPanel1MouseWheelMoved"/> + </Events> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> + <AbsoluteConstraints x="0" y="0" width="-1" height="-1"/> + </Constraint> + </Constraints> + + <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/> + </Container> + </SubComponents> + </Container> + </SubComponents> +</Form> 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 be3b9a8f..ed28c4df 100644 --- a/GUI/src/main/java/cz/fidentis/analyst/gui/Canvas.java +++ b/GUI/src/main/java/cz/fidentis/analyst/gui/Canvas.java @@ -1,90 +1,84 @@ package cz.fidentis.analyst.gui; +import cz.fidentis.analyst.mesh.io.ModelFileFilter; 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.io.File; import java.util.Timer; import java.util.TimerTask; +import javax.swing.ImageIcon; import javax.swing.JFileChooser; import javax.swing.JOptionPane; /** * - * @author Natalia Bebjakova - * + * @author Natalia Bebjakova + * * Canvas for displaying models containing GLCanvas and navigation. */ public class Canvas extends javax.swing.JPanel { protected GLCanvas glCanvas; protected long startClickTime = 0; - + protected TimerTask task; protected Timer timer; - + protected GeneralGLEventListener listener; - private static final int FPS = 60; // animator's target frames per second + /** + * animator's target frames per second + */ + private static final int FPS = 60; private final FPSAnimator animator; - - protected boolean drawWireModel; // decides if model is displayed as wire-frame + + /** + * decides if model is displayed as wire-frame + */ + protected boolean drawWireModel; + + /** + * original model that is loaded from file + */ + protected MeshModel loadedModel; /** - * Creates new form Canvas + * Creates new form Canva */ public Canvas() { initComponents(); - + // gl version 2 is used GLCapabilities capabilities = new GLCapabilities(GLProfile.get(GLProfile.GL2)); capabilities.setDoubleBuffered(true); - + // creates new glCanvas panel for displaying model glCanvas = new GLCanvas(capabilities); jPanel1.add(glCanvas); - glCanvas.setVisible(false); + glCanvas.setVisible(false); glCanvas.setBackground(Color.black); - + // enables glCanvas to react to events - glCanvas.requestFocusInWindow(); + glCanvas.requestFocusInWindow(); glCanvas.setSize(getWidth() - getInsets().left - getInsets().right, getHeight() - getInsets().top - getInsets().bottom); - - // enables animated transition + + // enables animated transition animator = new FPSAnimator(glCanvas, FPS, true); animator.start(); - - // listener enables to display and manipulate with the model listener = new GeneralGLEventListener(this); - // hand cursor when moving mouse on components - setCursorOnComponents(); - - this.validate(); + this.validate(); } - - /** - * Sets hand cursor when moving mouse on components - */ - private void setCursorOnComponents() { - loadModelButton.setLocation(this.getWidth() / 2, this.getHeight() / 2); - downNavigationButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - leftNavigationButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - upNavigationButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - plusNavigationButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - minusNavigationButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - loadModelButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - rightNavigationButton1.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - } - + /** * Changing the size of glCanvas + * * @param d New size of glCanvas */ public void resizeCanvas(Dimension d) { @@ -94,7 +88,40 @@ public class Canvas extends javax.swing.JPanel { this.repaint(); loadModelButton.setLocation(this.getWidth() / 2 - 35, this.getHeight() / 2 - 40); } - + + /** + * + * @return Original model that is loaded from dile + */ + public MeshModel getLoadedModel() { + return loadedModel; + } + + /** + * Sets GLListener of the canvas + * + * @param listener GLListener for manipulation with model + */ + public void setListener(GeneralGLEventListener listener) { + this.listener = listener; + } + + + /** + * + * @param drawWire Decides if model is displayed as wife-frame + */ + public void setDrawWired(boolean drawWire) { + drawWireModel = drawWire; + } + /** + * + * @return Returns if model is displayed as wife-frame + */ + public boolean getDrawWired(){ + return drawWireModel; + } + /** * * @param v Decides if button for loading model is visible @@ -102,7 +129,7 @@ public class Canvas extends javax.swing.JPanel { public void setImportLabelVisible(Boolean v) { loadModelButton.setVisible(v); } - + /** * Loads model selected in file chooser by user */ @@ -110,27 +137,27 @@ public class Canvas extends javax.swing.JPanel { String[] extensions = new String[2]; extensions[0] = "obj"; extensions[1] = "OBJ"; - + //enables to shows just .obj files in file chooser ModelFileFilter filter = new ModelFileFilter(extensions, "*.obj"); JFileChooser jFileChooser1 = new JFileChooser(); jFileChooser1.setPreferredSize(new Dimension (800,500)); - - jFileChooser1.addChoosableFileFilter(filter); - + + jFileChooser1.addChoosableFileFilter(filter); + //file chooser will appear on top of glCanvas jFileChooser1.showOpenDialog(this); - jFileChooser1.setDialogTitle("Import obj file"); - + jFileChooser1.setDialogTitle("Import obj file"); + File[] fileArray = new File[1]; //saves selected file by user as first element in array fileArray[0] = jFileChooser1.getSelectedFile(); - + if (fileArray.length <= 0) { System.out.print("No file chosen."); } else { this.addModel(fileArray[0]); - } + } glCanvas.setVisible(true); } @@ -144,27 +171,50 @@ public class Canvas extends javax.swing.JPanel { try { //static class MeshObjLaoder reads .obj file into model MeshModel model = MeshObjLoader.read(new File (file.getPath())); + loadedModel = MeshObjLoader.read(new File (file.getPath())); if (model != null) { // listener enables to manipulate and interact with model - listener.setCameraPosition(0, 0, 300); - glCanvas.addGLEventListener(listener); - listener.setModels(model); + listener.setCameraPosition(0, 0, 300); + glCanvas.addGLEventListener(listener); + listener.setModel(model); + listener.rotationAndSizeRestart(); loadModelButton.setVisible(false); - } - } catch (Exception e) { - System.out.println(e.getMessage()); - JOptionPane pane = new JOptionPane(); - pane.showMessageDialog(this, "File doesn't contain any model"); - System.out.println ("File doesn't contain any model"); - - }; - + } + } 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"); + + }; + } - + + /** + * Changes the model to be displayed + * + * @param model New model that will be displayed on canvas + */ + public void changeModel(MeshModel model) { + MeshModel newModel = new MeshModel(model); + listener.setModel(newModel); + } + + /** + * Returns the model which is displayed on canvas + * + * @return Model that is displayed on canvas + */ + public MeshModel getModel() { + return listener.getModel(); + } + /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. + * + * Generated code from NetBeans */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents @@ -180,12 +230,15 @@ public class Canvas extends javax.swing.JPanel { jLabel1 = new javax.swing.JLabel(); loadModelButton = new javax.swing.JLabel(); rightNavigationButton1 = new javax.swing.JButton(); + whiteBackroundButton = new javax.swing.JLabel(); + blackBackroundButton = new javax.swing.JLabel(); jPanel1 = new javax.swing.JPanel(); setBackground(new java.awt.Color(0, 0, 0)); setLayout(new java.awt.BorderLayout()); - jLayeredPane1.setBackground(new java.awt.Color(0, 0, 0)); + jLayeredPane1.setBackground(new java.awt.Color(40, 40, 40)); + jLayeredPane1.setToolTipText(""); jLayeredPane1.setOpaque(true); jLayeredPane1.addComponentListener(new java.awt.event.ComponentAdapter() { public void componentResized(java.awt.event.ComponentEvent evt) { @@ -196,7 +249,8 @@ public class Canvas extends javax.swing.JPanel { } }); - resetButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/resetButton.png"))); // NOI18N + resetButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/resetButton.png"))); // NOI18N + 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) { resetButtonMouseMoved(evt); @@ -211,11 +265,12 @@ public class Canvas extends javax.swing.JPanel { } }); jLayeredPane1.add(resetButton); - resetButton.setBounds(60, 70, 40, 30); + resetButton.setBounds(60, 70, 30, 30); - upNavigationButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/upButton.png"))); // NOI18N + upNavigationButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/upButton.png"))); // NOI18N upNavigationButton.setBorderPainted(false); upNavigationButton.setContentAreaFilled(false); + upNavigationButton.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); upNavigationButton.addMouseListener(new java.awt.event.MouseAdapter() { public void mousePressed(java.awt.event.MouseEvent evt) { upNavigationButtonMousePressed(evt); @@ -228,9 +283,10 @@ public class Canvas extends javax.swing.JPanel { jLayeredPane1.add(upNavigationButton); upNavigationButton.setBounds(60, 40, 30, 30); - leftNavigationButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/leftButton.png"))); // NOI18N + leftNavigationButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/leftButton.png"))); // NOI18N leftNavigationButton.setBorderPainted(false); leftNavigationButton.setContentAreaFilled(false); + leftNavigationButton.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); leftNavigationButton.addMouseListener(new java.awt.event.MouseAdapter() { public void mousePressed(java.awt.event.MouseEvent evt) { leftNavigationButtonMousePressed(evt); @@ -243,9 +299,10 @@ public class Canvas extends javax.swing.JPanel { jLayeredPane1.add(leftNavigationButton); leftNavigationButton.setBounds(30, 70, 30, 30); - minusNavigationButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/minus.png"))); // NOI18N + minusNavigationButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/minus.png"))); // NOI18N minusNavigationButton.setBorderPainted(false); minusNavigationButton.setContentAreaFilled(false); + minusNavigationButton.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); minusNavigationButton.addMouseListener(new java.awt.event.MouseAdapter() { public void mousePressed(java.awt.event.MouseEvent evt) { minusNavigationButtonMousePressed(evt); @@ -258,9 +315,10 @@ public class Canvas extends javax.swing.JPanel { jLayeredPane1.add(minusNavigationButton); minusNavigationButton.setBounds(80, 130, 30, 30); - downNavigationButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/downButton.png"))); // NOI18N + downNavigationButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/downButton.png"))); // NOI18N downNavigationButton.setBorderPainted(false); downNavigationButton.setContentAreaFilled(false); + downNavigationButton.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); downNavigationButton.addMouseListener(new java.awt.event.MouseAdapter() { public void mousePressed(java.awt.event.MouseEvent evt) { downNavigationButtonMousePressed(evt); @@ -273,9 +331,10 @@ public class Canvas extends javax.swing.JPanel { jLayeredPane1.add(downNavigationButton); downNavigationButton.setBounds(60, 100, 30, 30); - plusNavigationButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/plus.png"))); // NOI18N + plusNavigationButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/plus.png"))); // NOI18N plusNavigationButton.setBorderPainted(false); plusNavigationButton.setContentAreaFilled(false); + plusNavigationButton.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); plusNavigationButton.addMouseListener(new java.awt.event.MouseAdapter() { public void mousePressed(java.awt.event.MouseEvent evt) { plusNavigationButtonMousePressed(evt); @@ -288,11 +347,12 @@ public class Canvas extends javax.swing.JPanel { jLayeredPane1.add(plusNavigationButton); plusNavigationButton.setBounds(40, 130, 30, 30); - jLabel1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/navigBackground.png"))); // NOI18N + 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); - loadModelButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/loadCanva.png"))); // NOI18N + loadModelButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/loadCanva.png"))); // NOI18N + 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) { loadModelButtonMouseMoved(evt); @@ -307,11 +367,12 @@ public class Canvas extends javax.swing.JPanel { } }); jLayeredPane1.add(loadModelButton); - loadModelButton.setBounds(190, 80, 210, 220); + loadModelButton.setBounds(200, 100, 210, 220); - rightNavigationButton1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/rightButton.png"))); // NOI18N + rightNavigationButton1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/rightButton.png"))); // NOI18N rightNavigationButton1.setBorderPainted(false); rightNavigationButton1.setContentAreaFilled(false); + rightNavigationButton1.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); rightNavigationButton1.addMouseListener(new java.awt.event.MouseAdapter() { public void mousePressed(java.awt.event.MouseEvent evt) { rightNavigationButton1MousePressed(evt); @@ -324,6 +385,26 @@ public class Canvas extends javax.swing.JPanel { jLayeredPane1.add(rightNavigationButton1); rightNavigationButton1.setBounds(90, 70, 30, 30); + whiteBackroundButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/whiteBackroundCanvas.png"))); // NOI18N + 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) { + whiteBackroundButtonMouseClicked(evt); + } + }); + jLayeredPane1.add(whiteBackroundButton); + whiteBackroundButton.setBounds(50, 170, 0, 0); + + blackBackroundButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/blackBackroundCanvas.png"))); // NOI18N + 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) { + blackBackroundButtonMouseClicked(evt); + } + }); + jLayeredPane1.add(blackBackroundButton); + blackBackroundButton.setBounds(50, 240, 0, 0); + jPanel1.setBackground(new java.awt.Color(0, 0, 0)); jPanel1.addMouseWheelListener(new java.awt.event.MouseWheelListener() { public void mouseWheelMoved(java.awt.event.MouseWheelEvent evt) { @@ -338,7 +419,7 @@ public class Canvas extends javax.swing.JPanel { }// </editor-fold>//GEN-END:initComponents /** - * + * * @param evt Resizing glCanvas cantaining components */ private void jLayeredPane1ComponentResized(java.awt.event.ComponentEvent evt) {//GEN-FIRST:event_jLayeredPane1ComponentResized @@ -348,7 +429,7 @@ public class Canvas extends javax.swing.JPanel { }//GEN-LAST:event_jLayeredPane1ComponentResized /** - * + * * @param evt Showing glCanvas cantaining components */ private void jLayeredPane1ComponentShown(java.awt.event.ComponentEvent evt) {//GEN-FIRST:event_jLayeredPane1ComponentShown @@ -358,7 +439,7 @@ public class Canvas extends javax.swing.JPanel { }//GEN-LAST:event_jLayeredPane1ComponentShown /** - * + * * @param evt Enables to rotate left the model when left navigation button is pressed */ private void leftNavigationButtonMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_leftNavigationButtonMousePressed @@ -371,11 +452,11 @@ public class Canvas extends javax.swing.JPanel { } }; timer.schedule(task, 500, 100); - leftNavigationButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/leftButtonPressed.png"))); + leftNavigationButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/leftButtonPressed.png"))); }//GEN-LAST:event_leftNavigationButtonMousePressed /** - * + * * @param evt Enables to rotate up the model when up navigation button is pressed */ private void upNavigationButtonMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_upNavigationButtonMousePressed @@ -388,11 +469,11 @@ public class Canvas extends javax.swing.JPanel { } }; timer.schedule(task, 500, 100); - upNavigationButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/upButtonPressed.png"))); + upNavigationButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/upButtonPressed.png"))); }//GEN-LAST:event_upNavigationButtonMousePressed /** - * + * * @param evt Enables to rotate down the model when down navigation button is pressed */ private void downNavigationButtonMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_downNavigationButtonMousePressed @@ -405,11 +486,11 @@ public class Canvas extends javax.swing.JPanel { } }; timer.schedule(task, 500, 100); - downNavigationButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/downButtonPressed.png"))); + downNavigationButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/downButtonPressed.png"))); }//GEN-LAST:event_downNavigationButtonMousePressed /** - * + * * @param evt Enables to zoom in the model when plus navigation button is pressed */ private void plusNavigationButtonMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_plusNavigationButtonMousePressed @@ -422,13 +503,13 @@ public class Canvas extends javax.swing.JPanel { } }; timer.schedule(task, 500, 100); - plusNavigationButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/plusPressed.png"))); + plusNavigationButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/plusPressed.png"))); }//GEN-LAST:event_plusNavigationButtonMousePressed - - /** - * - * @param evt Enables to zoom out the model when minus navigation button is pressed - */ + + /** + * + * @param evt Enables to zoom out the model when minus navigation button is pressed + */ private void minusNavigationButtonMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_minusNavigationButtonMousePressed timer = new Timer(); startClickTime = System.currentTimeMillis(); @@ -439,11 +520,11 @@ public class Canvas extends javax.swing.JPanel { } }; timer.schedule(task, 500, 100); - minusNavigationButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/minusPressed.png"))); + minusNavigationButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/minusPressed.png"))); }//GEN-LAST:event_minusNavigationButtonMousePressed /** - * + * * @param evt Stops rotating left */ private void leftNavigationButtonMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_leftNavigationButtonMouseReleased @@ -452,11 +533,11 @@ public class Canvas extends javax.swing.JPanel { listener.rotateLeft(22.5); } startClickTime = 0; - leftNavigationButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/leftButton.png"))); + leftNavigationButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/leftButton.png"))); }//GEN-LAST:event_leftNavigationButtonMouseReleased /** - * + * * @param evt Stops rotating up */ private void upNavigationButtonMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_upNavigationButtonMouseReleased @@ -465,11 +546,11 @@ public class Canvas extends javax.swing.JPanel { listener.rotateUp(22.5); } startClickTime = 0; - upNavigationButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/upButton.png"))); + upNavigationButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/upButton.png"))); }//GEN-LAST:event_upNavigationButtonMouseReleased /** - * + * * @param evt Stops rotating down */ private void downNavigationButtonMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_downNavigationButtonMouseReleased @@ -478,12 +559,12 @@ public class Canvas extends javax.swing.JPanel { listener.rotateDown(22.5); } startClickTime = 0; - downNavigationButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/downButton.png"))); + downNavigationButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/downButton.png"))); }//GEN-LAST:event_downNavigationButtonMouseReleased /** - * - * @param evt Stops zooming in + * + * @param evt Stops zooming in */ private void plusNavigationButtonMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_plusNavigationButtonMouseReleased timer.cancel(); @@ -491,11 +572,11 @@ public class Canvas extends javax.swing.JPanel { listener.zoomIn(30); } startClickTime = 0; - plusNavigationButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/plus.png"))); + plusNavigationButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/plus.png"))); }//GEN-LAST:event_plusNavigationButtonMouseReleased /** - * + * * @param evt Stops zooming out */ private void minusNavigationButtonMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_minusNavigationButtonMouseReleased @@ -504,19 +585,19 @@ public class Canvas extends javax.swing.JPanel { listener.zoomOut(30); } startClickTime = 0; - minusNavigationButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/minus.png"))); + minusNavigationButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/minus.png"))); }//GEN-LAST:event_minusNavigationButtonMouseReleased /** - * + * * @param evt Laoding the .obj file when button pressed */ private void loadModelButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_loadModelButtonMouseClicked - loadModel(); + loadModel(); }//GEN-LAST:event_loadModelButtonMouseClicked /** - * + * * @param evt Enables to zoom in and out the model by mouse wheeling */ private void jPanel1MouseWheelMoved(java.awt.event.MouseWheelEvent evt) {//GEN-FIRST:event_jPanel1MouseWheelMoved @@ -528,23 +609,23 @@ public class Canvas extends javax.swing.JPanel { }//GEN-LAST:event_jPanel1MouseWheelMoved /** - * - * @param evt Design is reacting to mouse movement + * + * @param evt Design is reacting to mouse movement */ private void loadModelButtonMouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_loadModelButtonMouseMoved - loadModelButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/loadCanvaClicked.png"))); + loadModelButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/loadCanvaClicked.png"))); }//GEN-LAST:event_loadModelButtonMouseMoved /** - * - * @param evt Design is reacting to mouse movement + * + * @param evt Design is reacting to mouse movement */ private void loadModelButtonMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_loadModelButtonMouseExited - loadModelButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/loadCanva.png"))); + loadModelButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/loadCanva.png"))); }//GEN-LAST:event_loadModelButtonMouseExited /** - * + * * @param evt Enables to rotate down the model when down navigation button is pressed */ private void rightNavigationButton1MousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_rightNavigationButton1MousePressed @@ -557,11 +638,11 @@ public class Canvas extends javax.swing.JPanel { } }; timer.schedule(task, 500, 100); - rightNavigationButton1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/rightButtonPressed.png"))); + rightNavigationButton1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/rightButtonPressed.png"))); }//GEN-LAST:event_rightNavigationButton1MousePressed /** - * + * * @param evt Stops rotating right */ private void rightNavigationButton1MouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_rightNavigationButton1MouseReleased @@ -570,11 +651,11 @@ public class Canvas extends javax.swing.JPanel { listener.rotateRight(22.5); } startClickTime = 0; - rightNavigationButton1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/rightButton.png"))); + rightNavigationButton1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/rightButton.png"))); }//GEN-LAST:event_rightNavigationButton1MouseReleased /** - * + * * @param evt Position of model on glCanvas is set to starting position */ private void resetButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_resetButtonMouseClicked @@ -582,38 +663,44 @@ public class Canvas extends javax.swing.JPanel { }//GEN-LAST:event_resetButtonMouseClicked /** - * - * @param evt Design is reacting to mouse movement + * + * @param evt Design is reacting to mouse movement */ private void resetButtonMouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_resetButtonMouseMoved - resetButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/resetButtonPressed.png"))); + resetButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/resetButtonPressed.png"))); resetButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); }//GEN-LAST:event_resetButtonMouseMoved /** - * - * @param evt Design is reacting to mouse movement + * + * @param evt Design is reacting to mouse movement */ private void resetButtonMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_resetButtonMouseExited - resetButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/resetButton.png"))); + resetButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/resetButton.png"))); }//GEN-LAST:event_resetButtonMouseExited /** - * - * @param drawWire Decides if model is displayed as wife-frame + * + * @param evt Changes backround of the canvas into white color */ - public void setDrawWired(boolean drawWire) { - drawWireModel = drawWire; - } + private void whiteBackroundButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_whiteBackroundButtonMouseClicked + listener.setWhiteBackround(true); + whiteBackroundButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/whiteBackroundCanvasPressed.png"))); + blackBackroundButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/blackBackroundCanvas.png"))); + }//GEN-LAST:event_whiteBackroundButtonMouseClicked + /** - * - * @return Returns if model is displayed as wife-frame + * + * @param evt Changes backround of the canvas into dark color */ - public boolean getDrawWired(){ - return drawWireModel; - } + private void blackBackroundButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_blackBackroundButtonMouseClicked + listener.setWhiteBackround(false); + whiteBackroundButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/whiteBackroundCanvas.png"))); + blackBackroundButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/blackBackroundCanvasPressed.png"))); + }//GEN-LAST:event_blackBackroundButtonMouseClicked // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JLabel blackBackroundButton; private javax.swing.JButton downNavigationButton; private javax.swing.JLabel jLabel1; private javax.swing.JLayeredPane jLayeredPane1; @@ -625,5 +712,6 @@ public class Canvas extends javax.swing.JPanel { private javax.swing.JLabel resetButton; private javax.swing.JButton rightNavigationButton1; private javax.swing.JButton upNavigationButton; + private javax.swing.JLabel whiteBackroundButton; // End of variables declaration//GEN-END:variables -} +} \ No newline at end of file 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 356e67a9..e115177d 100644 --- a/GUI/src/main/java/cz/fidentis/analyst/gui/GeneralGLEventListener.java +++ b/GUI/src/main/java/cz/fidentis/analyst/gui/GeneralGLEventListener.java @@ -2,7 +2,6 @@ package cz.fidentis.analyst.gui; import cz.fidentis.analyst.mesh.core.MeshFacet; import cz.fidentis.analyst.mesh.core.MeshModel; -import java.util.ArrayList; import javax.media.opengl.GL; import static javax.media.opengl.GL.GL_DEPTH_TEST; import static javax.media.opengl.GL.GL_FRONT_AND_BACK; @@ -22,37 +21,35 @@ import javax.vecmath.Vector3f; * * @author Natalia Bebjakova */ -public class GeneralGLEventListener implements GLEventListener { +public class GeneralGLEventListener implements GLEventListener { /** - * Color behind the model is black + * MeshModel that is displayed */ - protected static float[] backgroundColor = {0.8f, 0.8f, 0.8f, 0.0f}; + private MeshModel model = new MeshModel(); /** - * array of models that are displayed (just one so far) + * GLCanvas which listener belongs to */ - private ArrayList<MeshModel> models = new ArrayList<>(); + protected Canvas glCanvas; /** - * GLCanvas which listener belongs to - */ - protected Canvas glCanvas; + * GLU object. + */ + protected GLU glu; /** - * GLU object. + * Usage of openGL version 2 */ - protected GLU glu; protected GL2 gl; - /** * The last viewport. */ protected int[] viewport = new int[4]; - /** + /** * The last model matrix. */ protected float[] modelViewMatrix = new float[16]; /** * The last projection matrix. */ - protected float[] projectionMatrix = new float[16]; + protected float[] projectionMatrix = new float[16]; /** * The X coordinate of the last known mouse position during the scene rotation. */ @@ -61,7 +58,7 @@ public class GeneralGLEventListener implements GLEventListener { * The Y coordinate of the last know mouse position during the scene rotation. */ int mouseY = 0; - + protected Vector3f defaultPosition = new Vector3f(0, 0, 300); protected Vector3f currentPosition = new Vector3f(0, 0, 300); @@ -76,15 +73,75 @@ public class GeneralGLEventListener implements GLEventListener { protected double zUpPosition = 0; protected double xUpPosition = 0; protected double yUpPosition = 1; - + /** * 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 + */ + protected boolean whiteBackround = false; + + /** + * + * @return is backround white or not + */ + public boolean isWhiteBackround() { + return whiteBackround; + } + + /** + * + * @return Matrix for model view + */ + public float[] getModelViewMatrix() { + return modelViewMatrix; + } + + /** + * + * @return Matrix for projection + */ + public float[] getProjectionMatrix() { + return projectionMatrix; + } + + /** + * + * @return GlCanvas for displaying + */ + public Canvas getGlCanvas() { + return glCanvas; + } + + /** + * + * @param drawWire Decides if model is displayed as wire-frame + */ + public void setWireMode(boolean drawWire) { + 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 + */ + public void setWhiteBackround(boolean whiteBackround) { + this.whiteBackround = whiteBackround; + } /** * Creates new EventListener @@ -93,28 +150,46 @@ public class GeneralGLEventListener implements GLEventListener { public GeneralGLEventListener(Canvas canvas) { this.glCanvas = canvas; } + + /** + * + * @param model Set model to be displayed + */ + public void setModel(MeshModel model) { + this.model = model; + } + + /** + * + * @return Returns displayed model + */ + public MeshModel getModel() { + return model; + } + + /** * Invoked when main frame is created * @param glad Glad object */ @Override public void init(GLAutoDrawable glad) { - + this.gl = (GL2) glad.getGL(); glu = new GLU(); - + gl.setSwapInterval(1); gl.glEnable(GL2.GL_LIGHTING); gl.glEnable(GL2.GL_LIGHT0); gl.glEnable(GL2.GL_DEPTH_TEST); gl.glClearColor(0,0,0,0); // background for GLCanvas gl.glClear(GL2.GL_COLOR_BUFFER_BIT); - + gl.glShadeModel(GL2.GL_SMOOTH); // use smooth shading gl.glDepthFunc(GL2.GL_LESS); gl.glDepthRange(0.0, 1.0); - gl.glEnable(GL_DEPTH_TEST); + gl.glEnable(GL_DEPTH_TEST); gl.glEnable(GL2.GL_NORMALIZE); gl.glDisable(GL2.GL_CULL_FACE); @@ -127,8 +202,7 @@ public class GeneralGLEventListener implements GLEventListener { @Override public void dispose(GLAutoDrawable glad) { } - - + /** * Invoked every frame. * @param glad Glad object @@ -136,7 +210,12 @@ public class GeneralGLEventListener implements GLEventListener { @Override public void display(GLAutoDrawable glad) { wireModel = glCanvas.getDrawWired(); // is wire-frame or not - gl.glClearColor(0,0,0,0); // background for GLCanvas + if (whiteBackround) { + gl.glClearColor(0.9f,0.9f,0.9f,0); + } else { + gl.glClearColor(0.25f,0.25f,0.25f,0); + } + // background for GLCanvas gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); gl.glLoadIdentity(); @@ -147,65 +226,52 @@ public class GeneralGLEventListener implements GLEventListener { gl.glGetIntegerv(GL_VIEWPORT, viewport, 0); gl.glGetFloatv(GL_MODELVIEW_MATRIX, modelViewMatrix, 0); gl.glGetFloatv(GL_PROJECTION_MATRIX, projectionMatrix, 0); - - //if there is any model, draw - if (models.get(0) != null) { + + //if there is any model, draw + if (model != null) { if (wireModel) { - gl.glPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); - drawWithoutTextures(models.get(0)); + gl.glPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); //drawn as wire-frame + drawWithoutTextures(model); } else { - gl.glPolygonMode( GL_FRONT_AND_BACK, GL_FILL); - drawWithoutTextures(models.get(0)); + gl.glPolygonMode( GL_FRONT_AND_BACK, GL_FILL); // drawn as full traingles + drawWithoutTextures(model); } - } - + } gl.glPopMatrix(); gl.glFlush(); - - - /*if (drawTextures) { - gl.glCallList(modelDL); - } else { - gl.glCallList(modelDLwithoutTxt); - }*/ - } + + /** + * Loops through the facets and render each of them + * @param model model of the face + */ public void drawWithoutTextures(MeshModel model) { for (int i = 0; i < model.getFacets().size(); i++) { renderFacet(model.getFacets().get(i)); } } - private void renderFacet(MeshFacet facet) { + /** + * 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) { gl.glBegin(GL2.GL_TRIANGLES); //vertices are rendered as triangles - // get the normal and tex coords indicies for face i - for (int v = 0; v < facet.getCornerTable().getSize(); v++) { - Vector3d norm = facet.getVertices().get(facet.getCornerTable().getRow(v).getVertexIndex()).getNormal(); // render the normals - gl.glNormal3d(norm.x, norm.y, norm.z); - - Vector3d vert = facet.getVertices().get(facet.getCornerTable().getRow(v).getVertexIndex()).getPosition(); // render the vertices + // get the normal and tex coords indicies for face i + for (int v = 0; v < facet.getCornerTable().getSize(); v++) { + // render the normals + Vector3d norm = facet.getVertices().get(facet.getCornerTable().getRow(v).getVertexIndex()).getNormal(); + if(norm != null) { + gl.glNormal3d(norm.x, norm.y, norm.z); + } + // render the vertices + Vector3d vert = facet.getVertices().get(facet.getCornerTable().getRow(v).getVertexIndex()).getPosition(); gl.glVertex3d(vert.x, vert.y, vert.z); } gl.glEnd(); } - /** - * Prepared for future textures - */ - /*public void reloadTextures() { - for (int i = 0; i < models.size(); i++) { - if (models.get(i) != null) { - if (models.get(i).getMatrials() != null) { - for (int j = 0; j < models.get(i).getMatrials().getMatrials().size(); j++) { - models.get(i).getMatrials().reloadTextures(gl); - } - } - } - } - - }*/ - /** * * @param glad Glad object @@ -234,37 +300,6 @@ public class GeneralGLEventListener implements GLEventListener { gl.glTranslatef(0.0f, 0.0f, -40.0f); } - /** - * - * @param model Set model to be displayed - */ - public void setModels(MeshModel model) { - models.add(0, model); - } - - /** - * - * @param models Set models to be displayed - */ - public void setModels(ArrayList<MeshModel> models) { - this.models = models; - } - - /** - * - * @return Returns displayed model - */ - public MeshModel getModel() { - return models.get(0); - } - - /** - * Removes all models - */ - public void removeModel() { - models.clear(); - } - /** * * @param x New x position @@ -279,8 +314,7 @@ public class GeneralGLEventListener implements GLEventListener { xCameraPosition = defaultPosition.x; yCameraPosition = defaultPosition.y; - } - + } /** * @@ -290,7 +324,6 @@ public class GeneralGLEventListener implements GLEventListener { xCameraPosition = position.x; yCameraPosition = position.y; zCameraPosition = position.z; - } /** @@ -298,9 +331,7 @@ public class GeneralGLEventListener implements GLEventListener { * @param degree degree of rotation */ public void rotateUp(double degree) { - rotate(-degree, 0); - } /** @@ -316,9 +347,7 @@ public class GeneralGLEventListener implements GLEventListener { * @param degree degree of rotation */ public void rotateLeft(double degree) { - rotate(0, degree); - } /** @@ -327,24 +356,33 @@ public class GeneralGLEventListener implements GLEventListener { */ public void rotateRight(double degree) { rotate(0, -degree); - } + /** + * + * @return X axis + */ private Vector3f getXaxis() { - Vector3f xAxis = new Vector3f((float) ((yCameraPosition - yCenter) * zUpPosition - (zCameraPosition - zCenter) * yUpPosition), + Vector3f xAxis = new Vector3f( + (float) ((yCameraPosition - yCenter) *zUpPosition - (zCameraPosition - zCenter) * yUpPosition), (float) ((zCameraPosition - zCenter) * xUpPosition - (xCameraPosition - xCenter) * zUpPosition), (float) ((xCameraPosition - xCenter) * yUpPosition - xUpPosition * (yCameraPosition - yCenter))); - - float length = (float) Math.sqrt(xAxis.x * xAxis.x + xAxis.y * xAxis.y + xAxis.z * xAxis.z); - xAxis.set(xAxis.x / length, xAxis.y / length, xAxis.z / length ); + + float length = (float) Math.sqrt(xAxis.x * xAxis.x + + xAxis.y * xAxis.y + xAxis.z * xAxis.z); + xAxis.set(xAxis.x / length, xAxis.y / length, xAxis.z / length); return xAxis; } + /** + * + * @return Y axis + */ private Vector3f getYaxis() { 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 ); + 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)); return yAxis; } @@ -360,7 +398,8 @@ public class GeneralGLEventListener implements GLEventListener { Vector3f xAxis = getXaxis(); Vector3f yAxis = getYaxis(); - Vector3f point = new Vector3f((float) xCameraPosition, (float) yCameraPosition, (float) zCameraPosition); + Vector3f point = new Vector3f((float) xCameraPosition, + (float) yCameraPosition, (float) zCameraPosition); Vector3f camera = rotateAroundAxe(point, xAxis, Math.toRadians(xAngle)); camera = rotateAroundAxe(camera, yAxis, Math.toRadians(yAngle)); @@ -377,18 +416,24 @@ public class GeneralGLEventListener implements GLEventListener { setNewCameraPosition(camera); } + /** + * + * @param xShift xShift + * @param yShift yShift + */ public void move(double xShift, double yShift) { Vector3f xAxis = getXaxis(); Vector3f yAxis = getYaxis(); - Vector3f shift = new Vector3f((float) (xAxis.x * xShift + yAxis.x * yShift), (float) (xAxis.y * xShift + yAxis.y * yShift), (float) (xAxis.z * xShift + yAxis.z * yShift)); - Vector3f camera = new Vector3f((float) xCameraPosition + shift.x, (float) yCameraPosition + shift.y, (float) zCameraPosition + shift.z); + Vector3f shift = new Vector3f((float) (xAxis.x * xShift + yAxis.x * yShift), + (float) (xAxis.y * xShift + yAxis.y * yShift), (float) (xAxis.z * xShift + yAxis.z * yShift)); + Vector3f camera = new Vector3f((float) xCameraPosition + shift.x, (float) yCameraPosition + shift.y, + (float) zCameraPosition + shift.z); xCenter += shift.x; yCenter += shift.y; zCenter += shift.z; setNewCameraPosition(camera); - } /** @@ -406,21 +451,19 @@ public class GeneralGLEventListener implements GLEventListener { + (u.x * u.z * (1 - Math.cos(angle)) + u.y * Math.sin(angle)) * point.z); float y = (float) ((u.x * u.y * (1 - Math.cos(angle)) + u.z * Math.sin(angle)) * point.x + (Math.cos(angle) + u.y * u.y * (1 - Math.cos(angle))) * point.y - + (u.y * u.z* (1 - Math.cos(angle)) - u.x * Math.sin(angle)) * point.z); + + (u.y * u.z * (1 - Math.cos(angle)) - u.x * Math.sin(angle)) * point.z); float z = (float) ((u.x * u.z * (1 - Math.cos(angle)) - u.y * Math.sin(angle)) * point.x - + (u.z * u.z * (1 - Math.cos(angle)) + u.x * Math.sin(angle)) * point.y + + (u.y * u.z * (1 - Math.cos(angle)) + u.x * Math.sin(angle)) * point.y + (Math.cos(angle) + u.z * u.z * (1 - Math.cos(angle))) * point.z); p = new Vector3f(x, y, z); return p; - } /** * Sets model to the starting position */ public void rotationAndSizeRestart() { - xUpPosition = 0; yUpPosition = 1; zUpPosition = 0; @@ -446,7 +489,6 @@ public class GeneralGLEventListener implements GLEventListener { yCameraPosition = yCenter + ((sqrt - distance) * y / sqrt); zCameraPosition = zCenter + ((sqrt - distance) * z / sqrt); } - } /** @@ -462,44 +504,8 @@ public class GeneralGLEventListener implements GLEventListener { if (sqrt == 0) { sqrt = 1; } - xCameraPosition = xCenter + ((sqrt + distance) * x / sqrt); yCameraPosition = yCenter + ((sqrt + distance) * y / sqrt); zCameraPosition = zCenter + ((sqrt + distance) * z / sqrt); } - - /** - * - * @return Returns backround color of the listener - */ - public static float[] getBackgroundColor() { - return backgroundColor; - } - - /** - * - * @param backgroundColor backround color of the listener - */ - public static void setBackgroundColor(float[] backgroundColor) { - GeneralGLEventListener.backgroundColor = backgroundColor; - } - - /** - * - * @param drawWire Decides if model is displayed as wire-frame - */ - public void setWireMode(boolean drawWire) { - wireModel = drawWire; - } - - - /** - * - * @param drawTextures Decides if model is displayed with textures - */ - public void setDrawTextures(boolean drawTextures) { - this.drawTextures = drawTextures; - } - -} - +} \ No newline at end of file diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/Interface.java b/GUI/src/main/java/cz/fidentis/analyst/gui/Interface.java deleted file mode 100644 index 2f5f4c4f..00000000 --- a/GUI/src/main/java/cz/fidentis/analyst/gui/Interface.java +++ /dev/null @@ -1,1367 +0,0 @@ -package cz.fidentis.analyst.gui; - -import java.awt.Color; -import java.awt.Cursor; -import javax.swing.BorderFactory; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.UIManager; - -/** - * - * @author Natalia Bebjakova - * - * Main window of the applicaion - */ - -public class Interface extends javax.swing.JFrame { - boolean pressedNewProject = false; - boolean maximizePressed = false; - boolean wiredModelClicked = false; - private JPanel actualPanel; - - public static JFrame frameMain; //main frame of the application - int xMouse; - int yMouse; - - /** - * Creates new form Interface - */ - public Interface() { - //this.setUndecorated(true); - initComponents(); - topPanel.setVisible(false); - setCursorOnComponents(); - actualPanel = startingPanel; - } - /** - * Sets hand cursor when moving mouse on components - */ - private void setCursorOnComponents() { - newProject.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - texture.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - close.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - maximize.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - JLabel11.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - jLabel4.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - symetryMain.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - reloadModelButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - wiredModelButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - homeButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - viewerButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - reloadModelButton1.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - } - - /** - * Enables to switch between panels - * @param panel New panel that will be visible - */ - private void switchPanelOnMainPanel(JPanel panel) { - actualPanel = panel; - jPanel2.removeAll(); - jPanel2.repaint(); - jPanel2.revalidate(); - jPanel2.add(panel); - jPanel2.repaint(); - jPanel2.revalidate(); - panel.add(jPanel1); - jPanel1.setVisible(true); - /*if(maximizePressed) { - frameMain.setExtendedState(this.getExtendedState() | JFrame.MAXIMIZED_BOTH); - }*/ - } - - /** - * Changes backround of labels to darker green color - * @param jl label of which backround changes - */ - public void setLabelBackround(JLabel jl) { - jl.setBackground(new Color(11,56,49)); - } - public void resetLabelBackround(JLabel jl) { - jl.setBackground(new Color(20,114,105)); - } - - /** - * Changes backround of panel to brighter color and adds border - * @param jp panel of which backround changes - */ - public void setPanelBackround(JPanel jp) { - jp.setBackground(new Color(11,56,49)); - jp.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 4, Color.WHITE)); - } - public void resetPanelBackround(JPanel jp) { - jp.setBackground(new Color(20,114,105)); - jp.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 0, Color.WHITE)); - } - - /** - * Changes backround of panel to darker color and adds border - * @param jp panel of which backround changes - */ - public void setPanelBackroundMain(JPanel jp) { - jp.setBackground(new Color(106,198,187)); - jp.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 4, Color.WHITE)); - } - public void resetPanelBackroundMain(JPanel jp) { - jp.setBackground(new Color(0,174,163)); - jp.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 0, Color.WHITE)); - } - - /** - * This method is called from within the constructor to initialize the form. - * WARNING: Do NOT modify this code. The content of this method is always - * regenerated by the Form Editor. - */ - - - @SuppressWarnings("unchecked") - // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents - private void initComponents() { - - 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(); - symetryEstimator = new javax.swing.JPanel(); - jLabel4 = new javax.swing.JLabel(); - jPanel1 = new javax.swing.JPanel(); - newProject = new javax.swing.JLabel(); - texture = new javax.swing.JLabel(); - close = new javax.swing.JLabel(); - maximize = new javax.swing.JLabel(); - wiredModelButton = new javax.swing.JLabel(); - homeButton = 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(); - symetryPanel = new javax.swing.JPanel(); - viewerPanel = new javax.swing.JPanel(); - canva1 = new cz.fidentis.analyst.gui.Canvas(); - reloadModelButton = new javax.swing.JLabel(); - symetrySpecificationPanel = new javax.swing.JPanel(); - curavatureSlider = new javax.swing.JSlider(); - angleCosineSlider = new javax.swing.JSlider(); - minCurvatio = new javax.swing.JLabel(); - minCurvatio2 = new javax.swing.JLabel(); - normalAngleSlider = new javax.swing.JSlider(); - minCurvatio3 = new javax.swing.JLabel(); - significantPointSlider = new javax.swing.JSlider(); - minCurvatio4 = new javax.swing.JLabel(); - relativeDistanceSlider = new javax.swing.JSlider(); - significantPointLabel = new javax.swing.JLabel(); - symetryButton = new javax.swing.JLabel(); - minCurvatio7 = new javax.swing.JLabel(); - averagingCheckBox = new javax.swing.JCheckBox(); - modelViewPanel = new javax.swing.JPanel(); - reloadModelButton1 = new javax.swing.JLabel(); - jPanel4 = new javax.swing.JPanel(); - canva2 = new cz.fidentis.analyst.gui.Canvas(); - - setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); - setAlwaysOnTop(true); - setAutoRequestFocus(false); - setBackground(new java.awt.Color(20, 114, 105)); - setLocationByPlatform(true); - - topPanel.setBackground(new java.awt.Color(20, 114, 105)); - - compareTwo.setBackground(new java.awt.Color(20, 114, 105)); - compareTwo.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { - public void mouseMoved(java.awt.event.MouseEvent evt) { - compareTwoMouseMoved(evt); - } - }); - compareTwo.addMouseListener(new java.awt.event.MouseAdapter() { - public void mouseExited(java.awt.event.MouseEvent evt) { - compareTwoMouseExited(evt); - } - }); - - jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jLabel1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/compareTwo.png"))); // NOI18N - - javax.swing.GroupLayout compareTwoLayout = new javax.swing.GroupLayout(compareTwo); - compareTwo.setLayout(compareTwoLayout); - compareTwoLayout.setHorizontalGroup( - compareTwoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, compareTwoLayout.createSequentialGroup() - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 154, Short.MAX_VALUE) - .addContainerGap()) - ); - compareTwoLayout.setVerticalGroup( - compareTwoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, compareTwoLayout.createSequentialGroup() - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 139, javax.swing.GroupLayout.PREFERRED_SIZE) - .addContainerGap()) - ); - - compareDB.setBackground(new java.awt.Color(20, 114, 105)); - compareDB.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { - public void mouseMoved(java.awt.event.MouseEvent evt) { - compareDBMouseMoved(evt); - } - }); - compareDB.addMouseListener(new java.awt.event.MouseAdapter() { - public void mouseExited(java.awt.event.MouseEvent evt) { - compareDBMouseExited(evt); - } - }); - - jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jLabel2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/copareWithDatabase.png"))); // NOI18N - - javax.swing.GroupLayout compareDBLayout = new javax.swing.GroupLayout(compareDB); - compareDB.setLayout(compareDBLayout); - compareDBLayout.setHorizontalGroup( - compareDBLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(compareDBLayout.createSequentialGroup() - .addContainerGap() - .addComponent(jLabel2, javax.swing.GroupLayout.DEFAULT_SIZE, 162, Short.MAX_VALUE)) - ); - compareDBLayout.setVerticalGroup( - compareDBLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, compareDBLayout.createSequentialGroup() - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(jLabel2) - .addContainerGap()) - ); - - batchProcessing.setBackground(new java.awt.Color(20, 114, 105)); - batchProcessing.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { - public void mouseMoved(java.awt.event.MouseEvent evt) { - batchProcessingMouseMoved(evt); - } - }); - batchProcessing.addMouseListener(new java.awt.event.MouseAdapter() { - public void mouseExited(java.awt.event.MouseEvent evt) { - batchProcessingMouseExited(evt); - } - }); - - jLabel3.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jLabel3.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/batchProcessing.png"))); // NOI18N - - 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()) - ); - batchProcessingLayout.setVerticalGroup( - batchProcessingLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, batchProcessingLayout.createSequentialGroup() - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(jLabel3) - .addContainerGap()) - ); - - symetryEstimator.setBackground(new java.awt.Color(20, 114, 105)); - symetryEstimator.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { - public void mouseMoved(java.awt.event.MouseEvent evt) { - symetryEstimatorMouseMoved(evt); - } - }); - symetryEstimator.addMouseListener(new java.awt.event.MouseAdapter() { - public void mouseClicked(java.awt.event.MouseEvent evt) { - symetryEstimatorMouseClicked(evt); - } - public void mouseExited(java.awt.event.MouseEvent evt) { - symetryEstimatorMouseExited(evt); - } - }); - - jLabel4.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jLabel4.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/symetry.png"))); // NOI18N - jLabel4.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { - public void mouseMoved(java.awt.event.MouseEvent evt) { - maximizeMouseMoved1(evt); - } - }); - jLabel4.addMouseListener(new java.awt.event.MouseAdapter() { - public void mouseClicked(java.awt.event.MouseEvent evt) { - jLabel4MouseClicked(evt); - } - }); - - javax.swing.GroupLayout symetryEstimatorLayout = new javax.swing.GroupLayout(symetryEstimator); - symetryEstimator.setLayout(symetryEstimatorLayout); - symetryEstimatorLayout.setHorizontalGroup( - symetryEstimatorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(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)) - ); - 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()) - ); - - javax.swing.GroupLayout topPanelLayout = new javax.swing.GroupLayout(topPanel); - topPanel.setLayout(topPanelLayout); - topPanelLayout.setHorizontalGroup( - topPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(topPanelLayout.createSequentialGroup() - .addContainerGap(339, 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) - .addComponent(batchProcessing, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(97, 97, 97) - .addComponent(symetryEstimator, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addContainerGap(338, 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) - .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) - .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("/resources/new_project.png"))); // NOI18N - 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); - } - }); - - texture.setBackground(new java.awt.Color(20, 114, 105)); - texture.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/texture2.png"))); // NOI18N - texture.setOpaque(true); - texture.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { - public void mouseMoved(java.awt.event.MouseEvent evt) { - textureMouseMoved(evt); - } - }); - texture.addMouseListener(new java.awt.event.MouseAdapter() { - public void mouseExited(java.awt.event.MouseEvent evt) { - textureMouseExited(evt); - } - }); - - close.setBackground(new java.awt.Color(20, 114, 105)); - close.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/close.png"))); // NOI18N - 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); - } - }); - - maximize.setBackground(new java.awt.Color(20, 114, 105)); - maximize.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/maximize.png"))); // NOI18N - maximize.setOpaque(true); - maximize.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { - public void mouseMoved(java.awt.event.MouseEvent evt) { - maximizeMouseMoved(evt); - } - }); - maximize.addMouseListener(new java.awt.event.MouseAdapter() { - public void mouseClicked(java.awt.event.MouseEvent evt) { - maximizeMouseClicked(evt); - } - public void mouseExited(java.awt.event.MouseEvent evt) { - maximizeMouseExited(evt); - } - }); - - wiredModelButton.setBackground(new java.awt.Color(20, 114, 105)); - wiredModelButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/wireframe.png"))); // NOI18N - wiredModelButton.setOpaque(true); - wiredModelButton.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { - public void mouseMoved(java.awt.event.MouseEvent evt) { - wiredModelButtonMouseMoved(evt); - } - }); - wiredModelButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mouseClicked(java.awt.event.MouseEvent evt) { - wiredModelButtonMouseClicked(evt); - } - public void mouseExited(java.awt.event.MouseEvent evt) { - wiredModelButtonMouseExited(evt); - } - }); - - homeButton.setBackground(new java.awt.Color(20, 114, 105)); - homeButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/home.png"))); // NOI18N - 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, 198, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(texture) - .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(maximize) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(close) - .addContainerGap()) - ); - jPanel1Layout.setVerticalGroup( - jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup() - .addGap(0, 0, Short.MAX_VALUE) - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(texture, javax.swing.GroupLayout.DEFAULT_SIZE, 77, Short.MAX_VALUE) - .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, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(maximize, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) - .addComponent(homeButton, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - ); - - jPanel2.setLayout(new java.awt.CardLayout()); - - startingPanel.setBackground(new java.awt.Color(0, 174, 163)); - startingPanel.setToolTipText(""); - - logo.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/logo3.png"))); // NOI18N - - jPanel3.setBackground(new java.awt.Color(0, 174, 163)); - jPanel3.setToolTipText(""); - - compareTwoMain.setBackground(new java.awt.Color(0, 174, 163)); - compareTwoMain.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { - public void mouseMoved(java.awt.event.MouseEvent evt) { - compareTwoMainMouseMoved(evt); - } - }); - compareTwoMain.addMouseListener(new java.awt.event.MouseAdapter() { - public void mouseExited(java.awt.event.MouseEvent evt) { - compareTwoMainMouseExited(evt); - } - }); - - JLabel8.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/compareTwoGreen.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, 142, Short.MAX_VALUE) - .addContainerGap()) - ); - 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)) - ); - - compareTwoMain1.setBackground(new java.awt.Color(0, 174, 163)); - compareTwoMain1.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { - public void mouseMoved(java.awt.event.MouseEvent evt) { - compareTwoMain1MouseMoved(evt); - } - }); - compareTwoMain1.addMouseListener(new java.awt.event.MouseAdapter() { - public void mouseExited(java.awt.event.MouseEvent evt) { - compareTwoMain1MouseExited(evt); - } - }); - - JLabel9.setBackground(new java.awt.Color(0, 174, 163)); - JLabel9.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/copareWithDatabaseGreen.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, 160, javax.swing.GroupLayout.PREFERRED_SIZE) - .addContainerGap()) - ); - 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)) - ); - - batchMain.setBackground(new java.awt.Color(0, 174, 163)); - batchMain.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { - public void mouseMoved(java.awt.event.MouseEvent evt) { - batchMainMouseMoved(evt); - } - }); - batchMain.addMouseListener(new java.awt.event.MouseAdapter() { - public void mouseExited(java.awt.event.MouseEvent evt) { - batchMainMouseExited(evt); - } - }); - - JLabel10.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/batchProcessingGreen.png"))); // NOI18N - - javax.swing.GroupLayout batchMainLayout = new javax.swing.GroupLayout(batchMain); - 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) - .addComponent(JLabel10) - .addContainerGap()) - ); - 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)) - ); - - symetryMain.setBackground(new java.awt.Color(0, 174, 163)); - symetryMain.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { - public void mouseMoved(java.awt.event.MouseEvent evt) { - symetryMainMouseMoved(evt); - } - }); - symetryMain.addMouseListener(new java.awt.event.MouseAdapter() { - public void mouseExited(java.awt.event.MouseEvent evt) { - symetryMainMouseExited(evt); - } - }); - - JLabel11.setBackground(new java.awt.Color(0, 174, 163)); - JLabel11.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/symetryGreen.png"))); // NOI18N - JLabel11.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { - public void mouseMoved(java.awt.event.MouseEvent evt) { - JLabel11MouseMoved(evt); - } - }); - JLabel11.addMouseListener(new java.awt.event.MouseAdapter() { - public void mouseClicked(java.awt.event.MouseEvent evt) { - JLabel11MouseClicked(evt); - } - public void mouseExited(java.awt.event.MouseEvent evt) { - JLabel11MouseExited(evt); - } - }); - - javax.swing.GroupLayout symetryMainLayout = new javax.swing.GroupLayout(symetryMain); - symetryMain.setLayout(symetryMainLayout); - symetryMainLayout.setHorizontalGroup( - symetryMainLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, symetryMainLayout.createSequentialGroup() - .addGap(0, 12, Short.MAX_VALUE) - .addComponent(JLabel11)) - ); - symetryMainLayout.setVerticalGroup( - symetryMainLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, symetryMainLayout.createSequentialGroup() - .addGap(0, 0, Short.MAX_VALUE) - .addComponent(JLabel11, javax.swing.GroupLayout.PREFERRED_SIZE, 161, javax.swing.GroupLayout.PREFERRED_SIZE)) - ); - - jLabel6.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/divide.png"))); // NOI18N - - viewerButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/modelView.png"))); // NOI18N - viewerButton.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { - public void mouseMoved(java.awt.event.MouseEvent evt) { - viewerButtonMouseMoved(evt); - } - }); - viewerButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mouseClicked(java.awt.event.MouseEvent evt) { - viewerButtonMouseClicked(evt); - } - public void mouseExited(java.awt.event.MouseEvent evt) { - viewerButtonMouseExited(evt); - } - }); - - javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3); - jPanel3.setLayout(jPanel3Layout); - jPanel3Layout.setHorizontalGroup( - jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel3Layout.createSequentialGroup() - .addContainerGap(278, Short.MAX_VALUE) - .addComponent(viewerButton) - .addGap(227, 227, 227) - .addComponent(jLabel6) - .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)) - .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) - .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(243, 243, 243)) - ); - jPanel3Layout.setVerticalGroup( - jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel3Layout.createSequentialGroup() - .addGap(27, 27, 27) - .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(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(symetryMain, 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)))) - .addContainerGap()) - .addGroup(jPanel3Layout.createSequentialGroup() - .addGap(71, 71, 71) - .addComponent(viewerButton) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - ); - - javax.swing.GroupLayout startingPanelLayout = new javax.swing.GroupLayout(startingPanel); - startingPanel.setLayout(startingPanelLayout); - 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(714, 714, 714) - .addComponent(logo, javax.swing.GroupLayout.PREFERRED_SIZE, 218, javax.swing.GroupLayout.PREFERRED_SIZE) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - ); - startingPanelLayout.setVerticalGroup( - startingPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(startingPanelLayout.createSequentialGroup() - .addGap(198, 198, 198) - .addComponent(logo, javax.swing.GroupLayout.PREFERRED_SIZE, 124, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(135, 135, 135) - .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(200, 200, 200)) - ); - - jPanel2.add(startingPanel, "card3"); - - symetryPanel.setBackground(new java.awt.Color(0, 174, 163)); - - canva1.addMouseWheelListener(new java.awt.event.MouseWheelListener() { - public void mouseWheelMoved(java.awt.event.MouseWheelEvent evt) { - canva1MouseWheelMoved(evt); - } - }); - - javax.swing.GroupLayout viewerPanelLayout = new javax.swing.GroupLayout(viewerPanel); - viewerPanel.setLayout(viewerPanelLayout); - viewerPanelLayout.setHorizontalGroup( - viewerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(viewerPanelLayout.createSequentialGroup() - .addContainerGap() - .addComponent(canva1, javax.swing.GroupLayout.DEFAULT_SIZE, 652, Short.MAX_VALUE) - .addContainerGap()) - ); - viewerPanelLayout.setVerticalGroup( - viewerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, viewerPanelLayout.createSequentialGroup() - .addContainerGap() - .addComponent(canva1, javax.swing.GroupLayout.DEFAULT_SIZE, 858, Short.MAX_VALUE) - .addContainerGap()) - ); - - reloadModelButton.setBackground(new java.awt.Color(0, 174, 163)); - reloadModelButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/loadModel.png"))); // NOI18N - reloadModelButton.setOpaque(true); - reloadModelButton.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { - public void mouseMoved(java.awt.event.MouseEvent evt) { - reloadModelButtonMouseMoved(evt); - } - }); - reloadModelButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mouseClicked(java.awt.event.MouseEvent evt) { - reloadModelButtonMouseClicked(evt); - } - public void mouseExited(java.awt.event.MouseEvent evt) { - reloadModelButtonMouseExited(evt); - } - }); - - symetrySpecificationPanel.setBackground(new java.awt.Color(176, 230, 226)); - symetrySpecificationPanel.addMouseListener(new java.awt.event.MouseAdapter() { - public void mouseClicked(java.awt.event.MouseEvent evt) { - symetrySpecificationPanelMouseClicked(evt); - } - }); - - curavatureSlider.setBackground(new java.awt.Color(250, 250, 250)); - curavatureSlider.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); - curavatureSlider.setOpaque(false); - - angleCosineSlider.setOpaque(false); - - minCurvatio.setFont(new java.awt.Font("Neue Haas Unica Pro", 0, 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.setForeground(new java.awt.Color(20, 114, 105)); - minCurvatio2.setText("Min. Angle Cosine"); - - normalAngleSlider.setOpaque(false); - - minCurvatio3.setFont(new java.awt.Font("Neue Haas Unica Pro", 0, 14)); // NOI18N - minCurvatio3.setForeground(new java.awt.Color(20, 114, 105)); - minCurvatio3.setText("Max. Relative Distance"); - - significantPointSlider.setOpaque(false); - - minCurvatio4.setFont(new java.awt.Font("Neue Haas Unica Pro", 0, 14)); // NOI18N - minCurvatio4.setForeground(new java.awt.Color(20, 114, 105)); - minCurvatio4.setText("Min. Normal Angle Cosine"); - - relativeDistanceSlider.setOpaque(false); - - significantPointLabel.setFont(new java.awt.Font("Neue Haas Unica Pro", 0, 14)); // NOI18N - significantPointLabel.setForeground(new java.awt.Color(20, 114, 105)); - significantPointLabel.setText("Significant Point Count"); - - symetryButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/symetryCount.png"))); // NOI18N - symetryButton.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { - public void mouseMoved(java.awt.event.MouseEvent evt) { - symetryButtonMouseMoved(evt); - } - }); - symetryButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mouseExited(java.awt.event.MouseEvent evt) { - symetryButtonMouseExited(evt); - } - }); - - minCurvatio7.setFont(new java.awt.Font("Neue Haas Unica Pro", 0, 14)); // NOI18N - minCurvatio7.setForeground(new java.awt.Color(20, 114, 105)); - minCurvatio7.setText("Averaging"); - - averagingCheckBox.setSelected(true); - averagingCheckBox.setOpaque(false); - - javax.swing.GroupLayout symetrySpecificationPanelLayout = new javax.swing.GroupLayout(symetrySpecificationPanel); - symetrySpecificationPanel.setLayout(symetrySpecificationPanelLayout); - symetrySpecificationPanelLayout.setHorizontalGroup( - symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, symetrySpecificationPanelLayout.createSequentialGroup() - .addContainerGap(80, Short.MAX_VALUE) - .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(minCurvatio) - .addComponent(minCurvatio2) - .addComponent(minCurvatio3) - .addComponent(minCurvatio4) - .addGroup(symetrySpecificationPanelLayout.createSequentialGroup() - .addComponent(significantPointLabel) - .addGap(13, 13, 13)) - .addGroup(symetrySpecificationPanelLayout.createSequentialGroup() - .addComponent(minCurvatio7) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(averagingCheckBox))) - .addGap(18, 18, 18) - .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(significantPointSlider, javax.swing.GroupLayout.PREFERRED_SIZE, 244, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(normalAngleSlider, javax.swing.GroupLayout.PREFERRED_SIZE, 244, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(angleCosineSlider, javax.swing.GroupLayout.PREFERRED_SIZE, 244, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(curavatureSlider, javax.swing.GroupLayout.PREFERRED_SIZE, 244, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(relativeDistanceSlider, javax.swing.GroupLayout.PREFERRED_SIZE, 244, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addComponent(symetryButton, javax.swing.GroupLayout.Alignment.TRAILING)) - .addGap(133, 133, 133)) - ); - symetrySpecificationPanelLayout.setVerticalGroup( - symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(symetrySpecificationPanelLayout.createSequentialGroup() - .addGap(72, 72, 72) - .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(curavatureSlider, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(minCurvatio, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGap(40, 40, 40) - .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(angleCosineSlider, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(minCurvatio2, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGap(40, 40, 40) - .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(normalAngleSlider, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(minCurvatio4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addGap(38, 38, 38) - .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(minCurvatio3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(relativeDistanceSlider, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addGap(41, 41, 41) - .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(symetrySpecificationPanelLayout.createSequentialGroup() - .addComponent(significantPointLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 26, Short.MAX_VALUE) - .addGap(36, 36, 36)) - .addGroup(symetrySpecificationPanelLayout.createSequentialGroup() - .addComponent(significantPointSlider, javax.swing.GroupLayout.PREFERRED_SIZE, 35, javax.swing.GroupLayout.PREFERRED_SIZE) - .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.PREFERRED_SIZE, 75, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(averagingCheckBox) - .addComponent(minCurvatio7, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE))) - .addGap(102, 102, 102)) - ); - - javax.swing.GroupLayout symetryPanelLayout = new javax.swing.GroupLayout(symetryPanel); - symetryPanel.setLayout(symetryPanelLayout); - symetryPanelLayout.setHorizontalGroup( - symetryPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(symetryPanelLayout.createSequentialGroup() - .addContainerGap(136, 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, 105, Short.MAX_VALUE) - .addGroup(symetryPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(reloadModelButton) - .addComponent(symetrySpecificationPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addContainerGap(112, 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(symetrySpecificationPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 242, Short.MAX_VALUE) - .addComponent(reloadModelButton)) - .addComponent(viewerPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addGap(182, 182, 182)) - ); - - jPanel2.add(symetryPanel, "card3"); - - modelViewPanel.setBackground(new java.awt.Color(0, 174, 163)); - modelViewPanel.setToolTipText(""); - - reloadModelButton1.setBackground(new java.awt.Color(0, 174, 163)); - reloadModelButton1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/loadModel.png"))); // NOI18N - reloadModelButton1.setOpaque(true); - reloadModelButton1.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { - public void mouseMoved(java.awt.event.MouseEvent evt) { - reloadModelButton1MouseMoved(evt); - } - }); - reloadModelButton1.addMouseListener(new java.awt.event.MouseAdapter() { - public void mouseClicked(java.awt.event.MouseEvent evt) { - reloadModelButton1MouseClicked(evt); - } - public void mouseExited(java.awt.event.MouseEvent evt) { - reloadModelButton1MouseExited(evt); - } - }); - - canva2.addMouseWheelListener(new java.awt.event.MouseWheelListener() { - public void mouseWheelMoved(java.awt.event.MouseWheelEvent evt) { - canva2MouseWheelMoved(evt); - } - }); - - javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4); - jPanel4.setLayout(jPanel4Layout); - jPanel4Layout.setHorizontalGroup( - jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel4Layout.createSequentialGroup() - .addContainerGap() - .addComponent(canva2, javax.swing.GroupLayout.DEFAULT_SIZE, 1040, Short.MAX_VALUE) - .addContainerGap()) - ); - jPanel4Layout.setVerticalGroup( - jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel4Layout.createSequentialGroup() - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(canva2, javax.swing.GroupLayout.PREFERRED_SIZE, 778, javax.swing.GroupLayout.PREFERRED_SIZE) - .addContainerGap()) - ); - - 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(141, Short.MAX_VALUE) - .addComponent(jPanel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(35, 35, 35) - .addComponent(reloadModelButton1) - .addGap(244, 244, 244)) - ); - modelViewPanelLayout.setVerticalGroup( - modelViewPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, modelViewPanelLayout.createSequentialGroup() - .addContainerGap(162, 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(218, Short.MAX_VALUE)) - ); - - jPanel2.add(modelViewPanel, "card4"); - - 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) - .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(835, 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))) - ); - - pack(); - setLocationRelativeTo(null); - }// </editor-fold>//GEN-END:initComponents - - private void newProjectMouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_newProjectMouseMoved - setLabelBackround(newProject); - }//GEN-LAST:event_newProjectMouseMoved - - private void newProjectMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_newProjectMouseExited - if (!pressedNewProject) { - resetLabelBackround(newProject); - } - }//GEN-LAST:event_newProjectMouseExited - - private void textureMouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_textureMouseMoved - setLabelBackround(texture); - }//GEN-LAST:event_textureMouseMoved - - private void textureMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_textureMouseExited - resetLabelBackround(texture); - }//GEN-LAST:event_textureMouseExited - - private void closeMouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_closeMouseMoved - setLabelBackround(close); - }//GEN-LAST:event_closeMouseMoved - - private void closeMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_closeMouseExited - resetLabelBackround(close); - }//GEN-LAST:event_closeMouseExited - - private void closeMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_closeMousePressed - System.exit(0); - }//GEN-LAST:event_closeMousePressed - - private void compareTwoMouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_compareTwoMouseMoved - setPanelBackround(compareTwo); - }//GEN-LAST:event_compareTwoMouseMoved - - private void compareTwoMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_compareTwoMouseExited - resetPanelBackround(compareTwo); - }//GEN-LAST:event_compareTwoMouseExited - - private void compareDBMouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_compareDBMouseMoved - setPanelBackround(compareDB); - }//GEN-LAST:event_compareDBMouseMoved - - private void compareDBMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_compareDBMouseExited - resetPanelBackround(compareDB); - }//GEN-LAST:event_compareDBMouseExited - - private void batchProcessingMouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_batchProcessingMouseMoved - setPanelBackround(batchProcessing); - }//GEN-LAST:event_batchProcessingMouseMoved - - private void batchProcessingMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_batchProcessingMouseExited - resetPanelBackround(batchProcessing); - }//GEN-LAST:event_batchProcessingMouseExited - - private void maximizeMouseMoved1(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_maximizeMouseMoved1 - - }//GEN-LAST:event_maximizeMouseMoved1 - - private void symetryEstimatorMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_symetryEstimatorMouseExited - resetPanelBackround(symetryEstimator); - }//GEN-LAST:event_symetryEstimatorMouseExited - - private void newProjectMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_newProjectMousePressed - if(pressedNewProject) { - topPanel.setVisible(false); - pressedNewProject = false; - switchPanelOnMainPanel(actualPanel); - newProject.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/new_project.png"))); - }else{ - topPanel.setVisible(true); - topPanel.add(jPanel1); - pressedNewProject = true; - newProject.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/new_project_opened.png"))); - } - }//GEN-LAST:event_newProjectMousePressed - - private void maximizeMouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_maximizeMouseMoved - setLabelBackround(maximize); - }//GEN-LAST:event_maximizeMouseMoved - - private void maximizeMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_maximizeMouseExited - resetLabelBackround(maximize); - }//GEN-LAST:event_maximizeMouseExited - - - private void maximizeMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_maximizeMouseClicked - /*if(maximizePressed) { - frameMain.setExtendedState(JFrame.NORMAL); - maximizePressed = false; - } else { - frameMain.setExtendedState(this.getExtendedState() | JFrame.MAXIMIZED_BOTH); - maximizePressed = true; - }*/ - }//GEN-LAST:event_maximizeMouseClicked - - private void symetryEstimatorMouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_symetryEstimatorMouseMoved - setPanelBackround(symetryEstimator); - }//GEN-LAST:event_symetryEstimatorMouseMoved - - private void compareTwoMainMouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_compareTwoMainMouseMoved - setPanelBackroundMain(compareTwoMain); - }//GEN-LAST:event_compareTwoMainMouseMoved - - private void compareTwoMainMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_compareTwoMainMouseExited - resetPanelBackroundMain(compareTwoMain); - }//GEN-LAST:event_compareTwoMainMouseExited - - private void compareTwoMain1MouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_compareTwoMain1MouseMoved - setPanelBackroundMain(compareTwoMain1); - }//GEN-LAST:event_compareTwoMain1MouseMoved - - private void compareTwoMain1MouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_compareTwoMain1MouseExited - resetPanelBackroundMain(compareTwoMain1); - }//GEN-LAST:event_compareTwoMain1MouseExited - - private void batchMainMouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_batchMainMouseMoved - setPanelBackroundMain(batchMain); - }//GEN-LAST:event_batchMainMouseMoved - - private void batchMainMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_batchMainMouseExited - resetPanelBackroundMain(batchMain); - }//GEN-LAST:event_batchMainMouseExited - - private void symetryMainMouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_symetryMainMouseMoved - setPanelBackroundMain(symetryMain); - }//GEN-LAST:event_symetryMainMouseMoved - - private void symetryMainMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_symetryMainMouseExited - resetPanelBackroundMain(symetryMain); - }//GEN-LAST:event_symetryMainMouseExited - - private void JLabel11MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_JLabel11MouseClicked - switchPanelOnMainPanel(symetryPanel); - }//GEN-LAST:event_JLabel11MouseClicked - - 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("/resources/new_project.png"))); - resetLabelBackround(newProject); - }//GEN-LAST:event_symetryEstimatorMouseClicked - - private void canva1MouseWheelMoved(java.awt.event.MouseWheelEvent evt) {//GEN-FIRST:event_canva1MouseWheelMoved -//to do to grab model - }//GEN-LAST:event_canva1MouseWheelMoved - - private void jPanel1MouseDragged(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jPanel1MouseDragged - int x = evt.getXOnScreen(); - int y = evt.getYOnScreen(); - frameMain.setLocation(x - xMouse, y - yMouse); - }//GEN-LAST:event_jPanel1MouseDragged - - private void jPanel1MousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jPanel1MousePressed - xMouse = evt.getX(); - yMouse = evt.getY(); - }//GEN-LAST:event_jPanel1MousePressed - - private void reloadModelButtonMouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_reloadModelButtonMouseMoved - reloadModelButton.setBackground(new Color(176,230,226)); - }//GEN-LAST:event_reloadModelButtonMouseMoved - - private void reloadModelButtonMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_reloadModelButtonMouseExited - reloadModelButton.setBackground(new Color(0,174,163)); - }//GEN-LAST:event_reloadModelButtonMouseExited - - private void symetryButtonMouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_symetryButtonMouseMoved - symetryButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/symetryCountClicked.png"))); - symetryButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - }//GEN-LAST:event_symetryButtonMouseMoved - - private void symetryButtonMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_symetryButtonMouseExited - symetryButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/symetryCount.png"))); - }//GEN-LAST:event_symetryButtonMouseExited - - private void symetrySpecificationPanelMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_symetrySpecificationPanelMouseClicked - - }//GEN-LAST:event_symetrySpecificationPanelMouseClicked - - private void reloadModelButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_reloadModelButtonMouseClicked - canva1.loadModel(); - }//GEN-LAST:event_reloadModelButtonMouseClicked - - private void wiredModelButtonMouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_wiredModelButtonMouseMoved - - }//GEN-LAST:event_wiredModelButtonMouseMoved - - private void wiredModelButtonMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_wiredModelButtonMouseExited - - }//GEN-LAST:event_wiredModelButtonMouseExited - - /** - * - * @param evt letting know GLCanva if model will be displayed as wire-frame - */ - private void wiredModelButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_wiredModelButtonMouseClicked - if (wiredModelClicked) { - resetLabelBackround(wiredModelButton); - wiredModelClicked = false; - canva1.setDrawWired(wiredModelClicked); - canva2.setDrawWired(wiredModelClicked); - } else { - setLabelBackround(wiredModelButton); - wiredModelClicked = true; - canva1.setDrawWired(wiredModelClicked); - canva2.setDrawWired(wiredModelClicked); - } - }//GEN-LAST:event_wiredModelButtonMouseClicked - - private void homeButtonMouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_homeButtonMouseMoved - setLabelBackround(homeButton); - }//GEN-LAST:event_homeButtonMouseMoved - - private void homeButtonMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_homeButtonMouseExited - resetLabelBackround(homeButton); - }//GEN-LAST:event_homeButtonMouseExited - - private void homeButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_homeButtonMouseClicked - switchPanelOnMainPanel(startingPanel); - }//GEN-LAST:event_homeButtonMouseClicked - - private void reloadModelButton1MouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_reloadModelButton1MouseMoved - reloadModelButton1.setBackground(new Color(176,230,226)); - }//GEN-LAST:event_reloadModelButton1MouseMoved - - private void reloadModelButton1MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_reloadModelButton1MouseClicked - canva2.loadModel(); - }//GEN-LAST:event_reloadModelButton1MouseClicked - - private void reloadModelButton1MouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_reloadModelButton1MouseExited - reloadModelButton1.setBackground(new Color(0,174,163)); - }//GEN-LAST:event_reloadModelButton1MouseExited - - private void canva2MouseWheelMoved(java.awt.event.MouseWheelEvent evt) {//GEN-FIRST:event_canva2MouseWheelMoved - // TODO add your handling code here: - }//GEN-LAST:event_canva2MouseWheelMoved - - private void viewerButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_viewerButtonMouseClicked - switchPanelOnMainPanel(modelViewPanel); - }//GEN-LAST:event_viewerButtonMouseClicked - - - private void JLabel11MouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_JLabel11MouseMoved - - }//GEN-LAST:event_JLabel11MouseMoved - - private void viewerButtonMouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_viewerButtonMouseMoved - viewerButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/modelViewMoved.png"))); - }//GEN-LAST:event_viewerButtonMouseMoved - - private void viewerButtonMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_viewerButtonMouseExited - viewerButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/modelView.png"))); - }//GEN-LAST:event_viewerButtonMouseExited - - private void JLabel11MouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_JLabel11MouseExited - - }//GEN-LAST:event_JLabel11MouseExited - - 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("/resources/new_project.png"))); - resetLabelBackround(newProject); - }//GEN-LAST:event_jLabel4MouseClicked - - /** - * @param args the command line arguments - */ - public static void main(String args[]) { - try { - for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { - if ("Nimbus".equals(info.getName())) { - javax.swing.UIManager.setLookAndFeel(info.getClassName()); - break; - } - } - } catch (ClassNotFoundException ex) { - java.util.logging.Logger.getLogger(Interface.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); - } catch (InstantiationException ex) { - java.util.logging.Logger.getLogger(Interface.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); - } catch (IllegalAccessException ex) { - java.util.logging.Logger.getLogger(Interface.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); - } catch (javax.swing.UnsupportedLookAndFeelException ex) { - java.util.logging.Logger.getLogger(Interface.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); - } - java.awt.EventQueue.invokeLater(new Runnable() { - @Override - public void run() { - frameMain = new Interface(); - frameMain.setBackground(new Color(49,165,154)); - frameMain.pack(); - frameMain.setVisible(true); - - //enables to use design of operating system - try { - UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); - }catch(Exception ex) { - ex.printStackTrace(); - } - } - }); - } - - - - - // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JLabel JLabel10; - private javax.swing.JLabel JLabel11; - private javax.swing.JLabel JLabel8; - private javax.swing.JLabel JLabel9; - private javax.swing.JSlider angleCosineSlider; - private javax.swing.JCheckBox averagingCheckBox; - 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 javax.swing.JPanel compareDB; - private javax.swing.JPanel compareTwo; - private javax.swing.JPanel compareTwoMain; - private javax.swing.JPanel compareTwoMain1; - private javax.swing.JSlider curavatureSlider; - 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 maximize; - private javax.swing.JLabel minCurvatio; - private javax.swing.JLabel minCurvatio2; - private javax.swing.JLabel minCurvatio3; - private javax.swing.JLabel minCurvatio4; - private javax.swing.JLabel minCurvatio7; - private javax.swing.JPanel modelViewPanel; - private javax.swing.JLabel newProject; - private javax.swing.JSlider normalAngleSlider; - private javax.swing.JSlider relativeDistanceSlider; - private javax.swing.JLabel reloadModelButton; - private javax.swing.JLabel reloadModelButton1; - private javax.swing.JLabel significantPointLabel; - private javax.swing.JSlider significantPointSlider; - private javax.swing.JPanel startingPanel; - private javax.swing.JLabel symetryButton; - private javax.swing.JPanel symetryEstimator; - private javax.swing.JPanel symetryMain; - private javax.swing.JPanel symetryPanel; - private javax.swing.JPanel symetrySpecificationPanel; - private javax.swing.JLabel texture; - private javax.swing.JPanel topPanel; - private javax.swing.JLabel viewerButton; - private javax.swing.JPanel viewerPanel; - private javax.swing.JLabel wiredModelButton; - // End of variables declaration//GEN-END:variables -} diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/SymmetryPanel.form b/GUI/src/main/java/cz/fidentis/analyst/gui/SymmetryPanel.form new file mode 100644 index 00000000..192c40b3 --- /dev/null +++ b/GUI/src/main/java/cz/fidentis/analyst/gui/SymmetryPanel.form @@ -0,0 +1,427 @@ +<?xml version="1.0" encoding="UTF-8" ?> + +<Form version="1.3" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo"> + <AuxValues> + <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/> + <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/> + <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/> + <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/> + <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/> + <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/> + <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/> + <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/> + <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/> + </AuxValues> + + <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> + </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> + </Group> + </DimensionLayout> + </Layout> + <SubComponents> + <Container class="javax.swing.JPanel" name="symetrySpecificationPanel"> + <Properties> + <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> + <Color blue="e2" green="e6" red="b0" type="rgb"/> + </Property> + </Properties> + + <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"> + <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"/> + </Group> + <Group type="102" 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> + <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> + </Group> + <Group type="103" groupAlignment="0" attributes="0"> + <Group type="102" alignment="1" attributes="0"> + <EmptySpace max="32767" 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"/> + </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"/> + <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> + </Group> + <EmptySpace min="0" pref="122" max="32767" attributes="0"/> + </Group> + </Group> + </Group> + </Group> + </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"/> + <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> + <Component id="textFieldMinCos" min="-2" max="-2" attributes="0"/> + </Group> + <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"/> + </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"/> + </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"/> + </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"> + <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"/> + <Component id="jLabel1" min="-2" max="-2" attributes="0"/> + <EmptySpace max="32767" 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"/> + </Group> + </Group> + <EmptySpace pref="32" max="32767" attributes="0"/> + </Group> + </Group> + </DimensionLayout> + </Layout> + <SubComponents> + <Component class="javax.swing.JSlider" name="curavatureSlider"> + <Properties> + <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> + <Color blue="fa" green="fa" red="fa" type="rgb"/> + </Property> + <Property name="majorTickSpacing" type="int" value="1"/> + <Property name="minimum" type="int" value="50"/> + <Property name="snapToTicks" type="boolean" value="true"/> + <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="false"/> + </Properties> + </Component> + <Component class="javax.swing.JSlider" name="angleCosineSlider"> + <Properties> + <Property name="minimum" type="int" value="80"/> + <Property name="snapToTicks" type="boolean" value="true"/> + <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="false"/> + </Properties> + </Component> + <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"/> + </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. Curvature Ratio"/> + </Properties> + </Component> + <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"/> + </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. Angle Cosine"/> + </Properties> + </Component> + <Component class="javax.swing.JSlider" name="normalAngleSlider"> + <Properties> + <Property name="minimum" type="int" value="80"/> + <Property name="snapToTicks" type="boolean" value="true"/> + <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="false"/> + </Properties> + </Component> + <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"/> + </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"/> + </Properties> + </Component> + <Component class="javax.swing.JSlider" name="significantPointSlider"> + <Properties> + <Property name="majorTickSpacing" type="int" value="100"/> + <Property name="maximum" type="int" value="300"/> + <Property name="snapToTicks" type="boolean" value="true"/> + <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="false"/> + </Properties> + </Component> + <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"/> + </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"/> + </Properties> + </Component> + <Component class="javax.swing.JSlider" name="relativeDistanceSlider"> + <Properties> + <Property name="maximum" type="int" value="5"/> + <Property name="snapToTicks" type="boolean" value="true"/> + <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="false"/> + </Properties> + </Component> + <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"/> + </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"/> + </Properties> + </Component> + <Component class="javax.swing.JLabel" name="symetryButton"> + <Properties> + <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> + </Properties> + <Events> + <EventHandler event="mouseMoved" listener="java.awt.event.MouseMotionListener" parameters="java.awt.event.MouseEvent" handler="symetryButtonMouseMoved"/> + <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="symetryButtonMouseClicked"/> + <EventHandler event="mouseExited" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="symetryButtonMouseExited"/> + </Events> + </Component> + <Component class="javax.swing.JCheckBox" name="averagingCheckBox"> + <Properties> + <Property name="selected" type="boolean" value="true"/> + <Property name="opaque" type="boolean" value="false"/> + </Properties> + <Events> + <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="averagingCheckBoxMouseClicked"/> + </Events> + </Component> + <Component class="javax.swing.JTextField" name="textFieldCurvature"> + <Properties> + <Property name="text" type="java.lang.String" value="0.8"/> + <Property name="toolTipText" type="java.lang.String" value=""/> + </Properties> + </Component> + <Component class="javax.swing.JTextField" name="textFieldMinCos"> + <Properties> + <Property name="text" type="java.lang.String" value="0.985"/> + <Property name="toolTipText" type="java.lang.String" value=""/> + </Properties> + </Component> + <Component class="javax.swing.JTextField" name="normalTextField"> + <Properties> + <Property name="text" type="java.lang.String" value="0.985"/> + <Property name="toolTipText" type="java.lang.String" value=""/> + </Properties> + </Component> + <Component class="javax.swing.JTextField" name="distanceTextField"> + <Properties> + <Property name="text" type="java.lang.String" value="0.01"/> + <Property name="toolTipText" type="java.lang.String" value=""/> + </Properties> + </Component> + <Component class="javax.swing.JTextField" name="significantTextField"> + <Properties> + <Property name="text" type="java.lang.String" value="200"/> + <Property name="toolTipText" type="java.lang.String" value=""/> + </Properties> + </Component> + <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"/> + </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"/> + </Properties> + </Component> + <Component class="javax.swing.JLabel" name="jLabel1"> + </Component> + <Component class="javax.swing.JLabel" name="originalModelButton"> + <Properties> + <Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor"> + <Image iconType="3" name="/cz/fidentis/analyst/gui/resources/originalModel.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="originalModelButtonMouseMoved"/> + <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="originalModelButtonMouseClicked"/> + <EventHandler event="mouseExited" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="originalModelButtonMouseExited"/> + </Events> + </Component> + <Component class="javax.swing.JLabel" name="showPlaneLabel"> + <Properties> + <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"/> + </Property> + <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"/> + </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="Default values"/> + <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="defaultValuesMouseClicked"/> + </Events> + </Component> + </SubComponents> + </Container> + </SubComponents> +</Form> diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/SymmetryPanel.java b/GUI/src/main/java/cz/fidentis/analyst/gui/SymmetryPanel.java new file mode 100644 index 00000000..a276ad3c --- /dev/null +++ b/GUI/src/main/java/cz/fidentis/analyst/gui/SymmetryPanel.java @@ -0,0 +1,604 @@ +package cz.fidentis.analyst.gui; + +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 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; +import javax.swing.event.ChangeEvent; + +/** + * + * @author Natália Bebjaková + * + * Panel for estimating approximate symmetry of the model + */ +public final class SymmetryPanel extends javax.swing.JPanel { + /** + * Configuration with default values + */ + private Config config; + /** + * GL Canvas on which model is displayed + */ + private Canvas canvas; + /** + * Class that is responsible for computing the symmetry + */ + private SymmetryCounter symCounter; + /** + * Computed approximate plane of the symmetry + */ + private Plane finalPlane; + + /** + * + * @return GL Canvas + */ + public Canvas getCanvas() { + return canvas; + } + + /** + * + * @param canvas GL Canvas + */ + public void setCanvas(Canvas canvas) { + this.canvas = canvas; + } + + /** + * + * @return Configuration for computing symmetry + */ + public Config getConfig() { + return config; + } + + /** + * + * @param config Configuration for computing symmetry + */ + public void setConfig(Config config) { + 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 + * User can change this text fields + */ + public void setConfigParams() { + config.setMaxRelDistance(Double.parseDouble(distanceTextField.getText())); + config.setMinAngleCos(Double.parseDouble(textFieldMinCos.getText())); + config.setMinCurvRatio(Double.parseDouble(textFieldCurvature.getText())); + config.setMinNormAngleCos(Double.parseDouble(normalTextField.getText())); + config.setSignificantPointCount(Integer.parseInt(significantTextField.getText())); + } + + /** + * Sets values in text field according to configuration + */ + public void setTextFieldsDueToConfig() { + distanceTextField.setText(Double.toString(config.getMaxRelDistance())); + textFieldMinCos.setText(Double.toString(config.getMinAngleCos())); + textFieldCurvature.setText(Double.toString(config.getMinCurvRatio())); + normalTextField.setText(Double.toString(config.getMinNormAngleCos())); + significantTextField.setText(Integer.toString(config.getSignificantPointCount())); + } + + /** + * + * @param slider Slider + * @param field text field which belongs to slider + */ + public void setSlider(JSlider slider, JTextField field) { + slider.setValue((int) (Double.parseDouble(field.getText()) * 100)); + + slider.addChangeListener((ChangeEvent ce) -> { + field.setText(""+slider.getValue()/100.0); + defaultValues.setVisible(true); + }); + + } + + /** + * Creates new form symmetryPanel + */ + public SymmetryPanel() { + initComponents(); + config = Config.getDefault(); + + setSlider(relativeDistanceSlider, distanceTextField); + setSlider(curavatureSlider, textFieldCurvature); + setSlider(angleCosineSlider, textFieldMinCos); + setSlider(normalAngleSlider, normalTextField); + + significantPointSlider.setValue((int) (Double.parseDouble(significantTextField.getText()))); + significantPointSlider.addChangeListener((ChangeEvent ce) -> { + significantTextField.setText("" + significantPointSlider.getValue()); + }); + originalModelButton.setVisible(false); + showPlaneLabel.setVisible(false); + } + + + /** + * Calculate approxy symmetry of the model + * Accuracy of the symmetry plane is influenced by configuration + * + * @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(); + symCounter.setPanel(this); + finalPlane = symCounter.getAproxSymmetryPlane(config); + SymmetryCounter counted = symCounter.mergeWithPlane(finalPlane); + model.addFacet(counted.getFacet()); + this.canvas.changeModel(model); + } + + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + * + * Code generated by NetBeans + */ + @SuppressWarnings("unchecked") + // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents + private void initComponents() { + + symetrySpecificationPanel = new javax.swing.JPanel(); + curavatureSlider = new javax.swing.JSlider(); + angleCosineSlider = new javax.swing.JSlider(); + minCurvatio = new javax.swing.JLabel(); + minCurvatio2 = new javax.swing.JLabel(); + normalAngleSlider = new javax.swing.JSlider(); + minCurvatio3 = new javax.swing.JLabel(); + significantPointSlider = new javax.swing.JSlider(); + minCurvatio4 = new javax.swing.JLabel(); + relativeDistanceSlider = new javax.swing.JSlider(); + significantPointLabel = new javax.swing.JLabel(); + symetryButton = new javax.swing.JLabel(); + averagingCheckBox = new javax.swing.JCheckBox(); + textFieldCurvature = new javax.swing.JTextField(); + textFieldMinCos = new javax.swing.JTextField(); + normalTextField = new javax.swing.JTextField(); + distanceTextField = new javax.swing.JTextField(); + significantTextField = new javax.swing.JTextField(); + minCurvatio8 = new javax.swing.JLabel(); + jLabel1 = new javax.swing.JLabel(); + originalModelButton = new javax.swing.JLabel(); + showPlaneLabel = new javax.swing.JLabel(); + defaultValues = new javax.swing.JLabel(); + + symetrySpecificationPanel.setBackground(new java.awt.Color(176, 230, 226)); + + curavatureSlider.setBackground(new java.awt.Color(250, 250, 250)); + curavatureSlider.setMajorTickSpacing(1); + curavatureSlider.setMinimum(50); + curavatureSlider.setSnapToTicks(true); + curavatureSlider.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); + curavatureSlider.setOpaque(false); + + angleCosineSlider.setMinimum(80); + angleCosineSlider.setSnapToTicks(true); + 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.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.setForeground(new java.awt.Color(20, 114, 105)); + minCurvatio2.setText("Min. Angle Cosine"); + + normalAngleSlider.setMinimum(80); + normalAngleSlider.setSnapToTicks(true); + 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.setForeground(new java.awt.Color(20, 114, 105)); + minCurvatio3.setText("Max. Relative Distance"); + + significantPointSlider.setMajorTickSpacing(100); + significantPointSlider.setMaximum(300); + significantPointSlider.setSnapToTicks(true); + 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.setForeground(new java.awt.Color(20, 114, 105)); + minCurvatio4.setText("Min. 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.setForeground(new java.awt.Color(20, 114, 105)); + significantPointLabel.setText("Significant Point Count"); + + symetryButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/symetryCount.png"))); // NOI18N + symetryButton.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { + public void mouseMoved(java.awt.event.MouseEvent evt) { + symetryButtonMouseMoved(evt); + } + }); + symetryButton.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + symetryButtonMouseClicked(evt); + } + public void mouseExited(java.awt.event.MouseEvent evt) { + symetryButtonMouseExited(evt); + } + }); + + averagingCheckBox.setSelected(true); + averagingCheckBox.setOpaque(false); + averagingCheckBox.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + averagingCheckBoxMouseClicked(evt); + } + }); + + textFieldCurvature.setText("0.8"); + textFieldCurvature.setToolTipText(""); + + textFieldMinCos.setText("0.985"); + textFieldMinCos.setToolTipText(""); + + normalTextField.setText("0.985"); + normalTextField.setToolTipText(""); + + distanceTextField.setText("0.01"); + distanceTextField.setToolTipText(""); + + significantTextField.setText("200"); + significantTextField.setToolTipText(""); + + minCurvatio8.setFont(new java.awt.Font("Neue Haas Unica Pro", 0, 14)); // NOI18N + minCurvatio8.setForeground(new java.awt.Color(20, 114, 105)); + minCurvatio8.setText("Averaging"); + + 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)); + originalModelButton.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { + public void mouseMoved(java.awt.event.MouseEvent evt) { + originalModelButtonMouseMoved(evt); + } + }); + originalModelButton.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + originalModelButtonMouseClicked(evt); + } + public void mouseExited(java.awt.event.MouseEvent evt) { + originalModelButtonMouseExited(evt); + } + }); + + showPlaneLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/showPlane.png"))); // NOI18N + 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.setForeground(new java.awt.Color(20, 114, 105)); + defaultValues.setText("Default values"); + defaultValues.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); + defaultValues.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + defaultValuesMouseClicked(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.createSequentialGroup() + .addGap(0, 0, Short.MAX_VALUE) + .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .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)) + .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)) + .addGroup(symetrySpecificationPanelLayout.createSequentialGroup() + .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() + .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)) + .addGroup(symetrySpecificationPanelLayout.createSequentialGroup() + .addGap(56, 56, 56) + .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)))))) + ); + symetrySpecificationPanelLayout.setVerticalGroup( + symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(symetrySpecificationPanelLayout.createSequentialGroup() + .addGap(72, 72, 72) + .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .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)) + .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.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(defaultValues) + .addGroup(symetrySpecificationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .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) + .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)) + ); + + 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))) + ); + 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)) + ); + }// </editor-fold>//GEN-END:initComponents + + /** + * + * @param evt Decides if averaging is ON or OFF + */ + private void averagingCheckBoxMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_averagingCheckBoxMouseClicked + if(config.isAveraging()) { + config.setAveraging(false); + } else { + config.setAveraging(true); + } + }//GEN-LAST:event_averagingCheckBoxMouseClicked + + 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 + + /** + * + * @param evt Symmetry is estimated. If model is not loaded, user is warned + */ + private void symetryButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_symetryButtonMouseClicked + 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"))); + } else { + try { + countSymmetry(); + } catch (InterruptedException ex) { + Logger.getLogger(SymmetryPanel.class.getName()).log(Level.SEVERE, null, ex); + } + originalModelButton.setVisible(true); + showPlaneLabel.setVisible(true); + } + }//GEN-LAST:event_symetryButtonMouseClicked + + /** + * + * @param evt Changes button + */ + 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 + */ + 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 + + /** + * + * @param evt Original model (without plane) is displayed + */ + 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 + + /** + * + * @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 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 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 + + /** + * + * @param evt values of configuration back to deafult + */ + private void defaultValuesMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_defaultValuesMouseClicked + config = Config.getDefault(); + setTextFieldsDueToConfig(); + }//GEN-LAST:event_defaultValuesMouseClicked + + + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JSlider angleCosineSlider; + private javax.swing.JCheckBox averagingCheckBox; + private javax.swing.JSlider curavatureSlider; + private javax.swing.JLabel defaultValues; + private javax.swing.JTextField distanceTextField; + private javax.swing.JLabel jLabel1; + private javax.swing.JLabel minCurvatio; + private javax.swing.JLabel minCurvatio2; + private javax.swing.JLabel minCurvatio3; + private javax.swing.JLabel minCurvatio4; + private javax.swing.JLabel minCurvatio8; + private javax.swing.JSlider normalAngleSlider; + private javax.swing.JTextField normalTextField; + private javax.swing.JLabel originalModelButton; + private javax.swing.JSlider relativeDistanceSlider; + private javax.swing.JLabel showPlaneLabel; + private javax.swing.JLabel significantPointLabel; + private javax.swing.JSlider significantPointSlider; + private javax.swing.JTextField significantTextField; + private javax.swing.JLabel symetryButton; + private javax.swing.JPanel symetrySpecificationPanel; + private javax.swing.JTextField textFieldCurvature; + private javax.swing.JTextField textFieldMinCos; + // End of variables declaration//GEN-END:variables +} \ No newline at end of file diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/UserInterface.form b/GUI/src/main/java/cz/fidentis/analyst/gui/UserInterface.form new file mode 100644 index 00000000..eb13ba97 --- /dev/null +++ b/GUI/src/main/java/cz/fidentis/analyst/gui/UserInterface.form @@ -0,0 +1,933 @@ +<?xml version="1.0" encoding="UTF-8" ?> + +<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"/> + </Property> + <Property name="locationByPlatform" type="boolean" value="true"/> + </Properties> + <SyntheticProperties> + <SyntheticProperty name="formSizePolicy" type="int" value="1"/> + <SyntheticProperty name="generateCenter" type="boolean" value="true"/> + </SyntheticProperties> + <AuxValues> + <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/> + <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/> + <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/> + <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/> + <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/> + <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/> + <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/> + <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/> + <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/> + </AuxValues> + + <Layout> + <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"/> + <Group type="103" rootIndex="1" groupAlignment="0" attributes="0"> + <Component id="jPanel2" alignment="0" 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="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"/> + </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> + </Group> + </Group> + </DimensionLayout> + </Layout> + <SubComponents> + <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> + </Properties> + + <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"/> + <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"/> + <Component id="batchProcessing" min="-2" max="-2" attributes="0"/> + <EmptySpace min="-2" pref="97" max="-2" attributes="0"/> + <Component id="symetryEstimator" min="-2" max="-2" attributes="0"/> + <EmptySpace pref="272" 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"> + <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"/> + <Component id="batchProcessing" alignment="1" max="32767" attributes="0"/> + </Group> + </Group> + </Group> + </DimensionLayout> + </Layout> + <SubComponents> + <Container class="javax.swing.JPanel" name="compareTwo"> + <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="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor"> + <Color id="Hand Cursor"/> + </Property> + </Properties> + + <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="jLabel1" pref="154" 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> + </Group> + </DimensionLayout> + </Layout> + <SubComponents> + <Component class="javax.swing.JLabel" name="jLabel1"> + <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/compareTwoStart.png"/> + </Property> + <Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor"> + <Color id="Default Cursor"/> + </Property> + </Properties> + </Component> + </SubComponents> + </Container> + <Container class="javax.swing.JPanel" name="compareDB"> + <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="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor"> + <Color id="Hand Cursor"/> + </Property> + </Properties> + + <Layout> + <DimensionLayout dim="0"> + <Group type="103" groupAlignment="0" attributes="0"> + <Component id="jLabel2" alignment="1" pref="192" 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> + </Group> + </DimensionLayout> + </Layout> + <SubComponents> + <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/copareWithDatabaseStart.png"/> + </Property> + <Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor"> + <Color id="Default Cursor"/> + </Property> + </Properties> + </Component> + </SubComponents> + </Container> + <Container class="javax.swing.JPanel" name="batchProcessing"> + <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="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor"> + <Color id="Hand Cursor"/> + </Property> + </Properties> + + <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> + </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"/> + <EmptySpace max="-2" attributes="0"/> + </Group> + </Group> + </DimensionLayout> + </Layout> + <SubComponents> + <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/batchProcessingStart.png"/> + </Property> + <Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor"> + <Color id="Default Cursor"/> + </Property> + </Properties> + </Component> + </SubComponents> + </Container> + <Container class="javax.swing.JPanel" name="symetryEstimator"> + <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="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="symetryEstimatorMouseClicked"/> + </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="jLabel4" max="32767" 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"> + <Component id="jLabel4" max="32767" attributes="0"/> + <EmptySpace max="-2" attributes="0"/> + </Group> + </Group> + </DimensionLayout> + </Layout> + <SubComponents> + <Component class="javax.swing.JLabel" name="jLabel4"> + <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/symetryStartP.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="jLabel4MouseMoved1"/> + <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="jLabel4MouseClicked"/> + <EventHandler event="mouseExited" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="jLabel4MouseExited"/> + </Events> + </Component> + </SubComponents> + </Container> + </SubComponents> + </Container> + <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> + </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> + <Container class="javax.swing.JPanel" name="startingPanel"> + <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="toolTipText" type="java.lang.String" value=""/> + </Properties> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignCardLayout" value="org.netbeans.modules.form.compat2.layouts.DesignCardLayout$CardConstraintsDescription"> + <CardConstraints cardName="card3"/> + </Constraint> + </Constraints> + + <Layout> + <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"/> + </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"/> + <Component id="logo" min="-2" pref="124" max="-2" attributes="0"/> + <EmptySpace min="-2" pref="128" max="-2" attributes="0"/> + <Component id="jPanel3" min="-2" max="-2" attributes="0"/> + <EmptySpace min="-2" pref="200" max="-2" attributes="0"/> + </Group> + </Group> + </DimensionLayout> + </Layout> + <SubComponents> + <Component class="javax.swing.JLabel" name="logo"> + <Properties> + <Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor"> + <Image iconType="3" name="/cz/fidentis/analyst/gui/resources/logo3.png"/> + </Property> + </Properties> + <AuxValues> + <AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/> + <AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/> + </AuxValues> + </Component> + <Container class="javax.swing.JPanel" name="jPanel3"> + <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="toolTipText" type="java.lang.String" value=""/> + </Properties> + + <Layout> + <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"/> + <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"/> + </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> + </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"> + <EmptySpace min="12" pref="12" max="-2" attributes="0"/> + <Component id="symetryMain" min="-2" max="-2" attributes="0"/> + </Group> + </Group> + <EmptySpace min="-2" pref="170" max="-2" 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="103" groupAlignment="0" attributes="0"> + <Component id="jLabel6" alignment="0" max="32767" attributes="0"/> + <Group type="102" alignment="0" 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> + <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> + <EmptySpace max="-2" attributes="0"/> + </Group> + <Group type="102" alignment="1" attributes="0"> + <EmptySpace max="32767" attributes="0"/> + <Component id="viewerButton" min="-2" max="-2" attributes="0"/> + <EmptySpace min="-2" pref="70" max="-2" attributes="0"/> + </Group> + </Group> + </DimensionLayout> + </Layout> + <SubComponents> + <Container class="javax.swing.JPanel" name="compareTwoMain"> + <Properties> + <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> + <Color blue="a3" green="ae" red="0" type="rgb"/> + </Property> + </Properties> + + <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> + </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> + </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> + <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> + <Color blue="a3" green="ae" red="0" type="rgb"/> + </Property> + </Properties> + + <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> + </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> + </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> + <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> + <Color blue="a3" green="ae" red="0" type="rgb"/> + </Property> + </Properties> + + <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"/> + <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"> + <EmptySpace min="0" pref="0" max="32767" attributes="0"/> + <Component id="JLabel10" min="-2" pref="157" max="-2" attributes="0"/> + </Group> + </Group> + </DimensionLayout> + </Layout> + <SubComponents> + <Component class="javax.swing.JLabel" name="JLabel10"> + <Properties> + <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"/> + </Property> + </Properties> + </Component> + </SubComponents> + </Container> + <Container class="javax.swing.JPanel" name="symetryMain"> + <Properties> + <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> + <Color blue="a3" green="ae" red="0" type="rgb"/> + </Property> + </Properties> + + <Layout> + <DimensionLayout dim="0"> + <Group type="103" groupAlignment="0" attributes="0"> + <Component id="JLabel11" alignment="1" pref="189" 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="JLabel11" pref="167" max="32767" attributes="0"/> + </Group> + </Group> + </DimensionLayout> + </Layout> + <SubComponents> + <Component class="javax.swing.JLabel" name="JLabel11"> + <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/symetryStart.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="JLabel11MouseMoved"/> + <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="JLabel11MouseClicked"/> + <EventHandler event="mouseExited" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="JLabel11MouseExited"/> + </Events> + </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"> + <Image iconType="3" name="/cz/fidentis/analyst/gui/resources/modelView.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="viewerButtonMouseMoved"/> + <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="viewerButtonMouseClicked"/> + <EventHandler event="mouseExited" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="viewerButtonMouseExited"/> + </Events> + </Component> + </SubComponents> + </Container> + </SubComponents> + </Container> + <Container class="javax.swing.JPanel" name="symetryPanel"> + <Properties> + <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> + <Color blue="a3" green="ae" red="0" type="rgb"/> + </Property> + </Properties> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignCardLayout" value="org.netbeans.modules.form.compat2.layouts.DesignCardLayout$CardConstraintsDescription"> + <CardConstraints cardName="card3"/> + </Constraint> + </Constraints> + + <Layout> + <DimensionLayout dim="0"> + <Group type="103" groupAlignment="0" attributes="0"> + <Group type="102" alignment="0" attributes="0"> + <EmptySpace pref="125" max="32767" attributes="0"/> + <Component id="viewerPanel" min="-2" max="-2" attributes="0"/> + <EmptySpace pref="94" max="32767" 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> + </Group> + <EmptySpace pref="81" 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="118" max="-2" attributes="0"/> + <Group type="103" groupAlignment="1" attributes="0"> + <Group type="102" attributes="0"> + <Component id="symmetryPanel1" min="-2" max="-2" attributes="0"/> + <EmptySpace pref="189" 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"/> + </Group> + <EmptySpace min="-2" pref="182" max="-2" attributes="0"/> + </Group> + </Group> + </DimensionLayout> + </Layout> + <SubComponents> + <Container class="javax.swing.JPanel" name="viewerPanel"> + + <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="canva1" pref="652" 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"> + <EmptySpace max="-2" attributes="0"/> + <Component id="canva1" max="32767" attributes="0"/> + <EmptySpace max="-2" attributes="0"/> + </Group> + </Group> + </DimensionLayout> + </Layout> + <SubComponents> + <Component class="cz.fidentis.analyst.gui.Canvas" name="canva1"> + </Component> + </SubComponents> + </Container> + <Component class="javax.swing.JLabel" name="reloadModelButton"> + <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/loadModel.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="reloadModelButtonMouseMoved"/> + <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="reloadModelButtonMouseClicked"/> + <EventHandler event="mouseExited" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="reloadModelButtonMouseExited"/> + </Events> + </Component> + <Component class="javax.swing.JLabel" name="exportModelButton"> + <Properties> + <Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor"> + <Image iconType="3" name="/cz/fidentis/analyst/gui/resources/exportModel.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="exportModelButtonMouseMoved"/> + <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="exportModelButtonMouseClicked"/> + <EventHandler event="mouseExited" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="exportModelButtonMouseExited"/> + </Events> + </Component> + <Component class="cz.fidentis.analyst.gui.SymmetryPanel" name="symmetryPanel1"> + <Properties> + <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> + <Color blue="e2" green="e6" red="b0" type="rgb"/> + </Property> + </Properties> + </Component> + </SubComponents> + </Container> + <Container class="javax.swing.JPanel" name="modelViewPanel"> + <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="toolTipText" type="java.lang.String" value=""/> + </Properties> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignCardLayout" value="org.netbeans.modules.form.compat2.layouts.DesignCardLayout$CardConstraintsDescription"> + <CardConstraints cardName="card4"/> + </Constraint> + </Constraints> + + <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="jPanel4" min="-2" max="-2" attributes="0"/> + <EmptySpace min="-2" pref="60" max="-2" attributes="0"/> + <Component id="reloadModelButton1" min="-2" max="-2" attributes="0"/> + <EmptySpace min="-2" pref="95" max="-2" attributes="0"/> + </Group> + </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="103" groupAlignment="1" 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"/> + </Group> + </Group> + </DimensionLayout> + </Layout> + <SubComponents> + <Component class="javax.swing.JLabel" name="reloadModelButton1"> + <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/loadModel.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="reloadModelButton1MouseMoved"/> + <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="reloadModelButton1MouseClicked"/> + <EventHandler event="mouseExited" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="reloadModelButton1MouseExited"/> + </Events> + </Component> + <Container class="javax.swing.JPanel" name="jPanel4"> + + <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="canva2" pref="1040" 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"> + <EmptySpace max="-2" attributes="0"/> + <Component id="canva2" min="-2" pref="778" max="-2" attributes="0"/> + <EmptySpace max="32767" attributes="0"/> + </Group> + </Group> + </DimensionLayout> + </Layout> + <SubComponents> + <Component class="cz.fidentis.analyst.gui.Canvas" name="canva2"> + </Component> + </SubComponents> + </Container> + </SubComponents> + </Container> + </SubComponents> + </Container> + </SubComponents> +</Form> diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/UserInterface.java b/GUI/src/main/java/cz/fidentis/analyst/gui/UserInterface.java new file mode 100644 index 00000000..0c926049 --- /dev/null +++ b/GUI/src/main/java/cz/fidentis/analyst/gui/UserInterface.java @@ -0,0 +1,1177 @@ +package cz.fidentis.analyst.gui; + +import cz.fidentis.analyst.mesh.io.MeshModelExporter; +import java.awt.Color; +import java.io.IOException; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.swing.ImageIcon; +import javax.swing.JFileChooser; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +/** + * + * @author Natalia Bebjakova + * + * Main window of the applicaion + */ + +public class UserInterface extends javax.swing.JFrame { + /** + * Flag for backround color of the new project button + */ + boolean pressedNewProject = false; + /** + * Flag for whether model should be displayed as wire-frame + */ + boolean wiredModelClicked = false; + /** + * Panel that is actualy displayed on the window + */ + private JPanel actualPanel; + /** + * Main frame of the application + */ + public static JFrame frameMain; + /** + * x coordinate of the mouse + */ + int xMouse; + /** + * y coordinate of the mouse + */ + int yMouse; + + /** + * Creates new form Interface + */ + public UserInterface() { + initComponents(); + topPanel.setVisible(false); + actualPanel = startingPanel; + symmetryPanel1.setCanvas(canva1); + } + + /** + * + * @return JPanel for estimating symmetry of the model + */ + public SymmetryPanel getSymmetryPanel1() { + return symmetryPanel1; + } + + /** + * Enables to switch between panels + * @param panel New panel that will be visible + */ + private void switchPanelOnMainPanel(JPanel panel) { + actualPanel = panel; + jPanel2.removeAll(); + jPanel2.repaint(); + jPanel2.revalidate(); + jPanel2.add(panel); + jPanel2.repaint(); + jPanel2.revalidate(); + panel.add(jPanel1); + jPanel1.setVisible(true); + } + + /** + * Changes backround of labels to darker green color + * @param jl label of which backround changes + */ + public void setLabelBackround(JLabel jl) { + jl.setBackground(new Color(11,56,49)); + } + + /** + * Changes backround of the label back to original + * @param jl label of which backround is return to original + */ + public void resetLabelBackround(JLabel jl) { + jl.setBackground(new Color(20,114,105)); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + * + * Code generated by NetBeans + */ + @SuppressWarnings("unchecked") + // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents + private void initComponents() { + + 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(); + 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(); + symetryPanel = new javax.swing.JPanel(); + viewerPanel = new javax.swing.JPanel(); + canva1 = new cz.fidentis.analyst.gui.Canvas(); + reloadModelButton = new javax.swing.JLabel(); + exportModelButton = new javax.swing.JLabel(); + symmetryPanel1 = new cz.fidentis.analyst.gui.SymmetryPanel(); + modelViewPanel = new javax.swing.JPanel(); + reloadModelButton1 = new javax.swing.JLabel(); + jPanel4 = new javax.swing.JPanel(); + canva2 = new cz.fidentis.analyst.gui.Canvas(); + + setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); + setAlwaysOnTop(true); + setAutoRequestFocus(false); + setBackground(new java.awt.Color(20, 114, 105)); + setLocationByPlatform(true); + + topPanel.setBackground(new java.awt.Color(20, 114, 105)); + + compareTwo.setBackground(new java.awt.Color(20, 114, 105)); + compareTwo.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); + + jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); + jLabel1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/compareTwoStart.png"))); // NOI18N + jLabel1.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); + + javax.swing.GroupLayout compareTwoLayout = new javax.swing.GroupLayout(compareTwo); + compareTwo.setLayout(compareTwoLayout); + compareTwoLayout.setHorizontalGroup( + compareTwoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(compareTwoLayout.createSequentialGroup() + .addContainerGap() + .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 154, 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()) + ); + + 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)); + + 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) + ); + compareDBLayout.setVerticalGroup( + compareDBLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(compareDBLayout.createSequentialGroup() + .addContainerGap() + .addComponent(jLabel2) + .addContainerGap(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)); + + 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()) + ); + 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()) + ); + + symetryEstimator.setBackground(new java.awt.Color(20, 114, 105)); + symetryEstimator.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); + symetryEstimator.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + symetryEstimatorMouseClicked(evt); + } + }); + + jLabel4.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); + jLabel4.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/symetryStartP.png"))); // NOI18N + jLabel4.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); + jLabel4.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { + public void mouseMoved(java.awt.event.MouseEvent evt) { + jLabel4MouseMoved1(evt); + } + }); + jLabel4.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + jLabel4MouseClicked(evt); + } + public void mouseExited(java.awt.event.MouseEvent evt) { + jLabel4MouseExited(evt); + } + }); + + javax.swing.GroupLayout symetryEstimatorLayout = new javax.swing.GroupLayout(symetryEstimator); + symetryEstimator.setLayout(symetryEstimatorLayout); + symetryEstimatorLayout.setHorizontalGroup( + symetryEstimatorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(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)) + ); + 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()) + ); + + javax.swing.GroupLayout topPanelLayout = new javax.swing.GroupLayout(topPanel); + topPanel.setLayout(topPanelLayout); + topPanelLayout.setHorizontalGroup( + topPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(topPanelLayout.createSequentialGroup() + .addContainerGap(272, 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) + .addComponent(batchProcessing, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(97, 97, 97) + .addComponent(symetryEstimator, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap(272, 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) + .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) + .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.setLayout(new java.awt.CardLayout()); + + startingPanel.setBackground(new java.awt.Color(0, 174, 163)); + startingPanel.setToolTipText(""); + + logo.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/logo3.png"))); // NOI18N + + jPanel3.setBackground(new java.awt.Color(0, 174, 163)); + jPanel3.setToolTipText(""); + + 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()) + ); + 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)) + ); + + 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()) + ); + 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)) + ); + + batchMain.setBackground(new java.awt.Color(0, 174, 163)); + + JLabel10.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/batchProcessingStart.png"))); // NOI18N + + javax.swing.GroupLayout batchMainLayout = new javax.swing.GroupLayout(batchMain); + 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) + .addComponent(JLabel10) + .addContainerGap()) + ); + 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)) + ); + + symetryMain.setBackground(new java.awt.Color(0, 174, 163)); + + JLabel11.setBackground(new java.awt.Color(0, 174, 163)); + JLabel11.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/symetryStart.png"))); // NOI18N + JLabel11.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); + JLabel11.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { + public void mouseMoved(java.awt.event.MouseEvent evt) { + JLabel11MouseMoved(evt); + } + }); + JLabel11.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + JLabel11MouseClicked(evt); + } + public void mouseExited(java.awt.event.MouseEvent evt) { + JLabel11MouseExited(evt); + } + }); + + javax.swing.GroupLayout symetryMainLayout = new javax.swing.GroupLayout(symetryMain); + symetryMain.setLayout(symetryMainLayout); + symetryMainLayout.setHorizontalGroup( + symetryMainLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(JLabel11, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 189, Short.MAX_VALUE) + ); + symetryMainLayout.setVerticalGroup( + symetryMainLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, symetryMainLayout.createSequentialGroup() + .addContainerGap() + .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() { + public void mouseMoved(java.awt.event.MouseEvent evt) { + viewerButtonMouseMoved(evt); + } + }); + viewerButton.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + viewerButtonMouseClicked(evt); + } + public void mouseExited(java.awt.event.MouseEvent evt) { + viewerButtonMouseExited(evt); + } + }); + + 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) + .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)) + .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) + .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)) + ); + jPanel3Layout.setVerticalGroup( + jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel3Layout.createSequentialGroup() + .addGap(27, 27, 27) + .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(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(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)))) + .addContainerGap()) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel3Layout.createSequentialGroup() + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(viewerButton) + .addGap(70, 70, 70)) + ); + + javax.swing.GroupLayout startingPanelLayout = new javax.swing.GroupLayout(startingPanel); + startingPanel.setLayout(startingPanelLayout); + 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)) + ); + startingPanelLayout.setVerticalGroup( + startingPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(startingPanelLayout.createSequentialGroup() + .addGap(205, 205, 205) + .addComponent(logo, javax.swing.GroupLayout.PREFERRED_SIZE, 124, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(128, 128, 128) + .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(200, 200, 200)) + ); + + jPanel2.add(startingPanel, "card3"); + + symetryPanel.setBackground(new java.awt.Color(0, 174, 163)); + + javax.swing.GroupLayout viewerPanelLayout = new javax.swing.GroupLayout(viewerPanel); + viewerPanel.setLayout(viewerPanelLayout); + viewerPanelLayout.setHorizontalGroup( + viewerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(viewerPanelLayout.createSequentialGroup() + .addContainerGap() + .addComponent(canva1, javax.swing.GroupLayout.DEFAULT_SIZE, 652, 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) + .addContainerGap()) + ); + + reloadModelButton.setBackground(new java.awt.Color(0, 174, 163)); + reloadModelButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/loadModel.png"))); // NOI18N + reloadModelButton.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); + reloadModelButton.setOpaque(true); + reloadModelButton.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { + public void mouseMoved(java.awt.event.MouseEvent evt) { + reloadModelButtonMouseMoved(evt); + } + }); + reloadModelButton.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + reloadModelButtonMouseClicked(evt); + } + public void mouseExited(java.awt.event.MouseEvent evt) { + reloadModelButtonMouseExited(evt); + } + }); + + exportModelButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/exportModel.png"))); // NOI18N + exportModelButton.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); + exportModelButton.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { + public void mouseMoved(java.awt.event.MouseEvent evt) { + exportModelButtonMouseMoved(evt); + } + }); + exportModelButton.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + exportModelButtonMouseClicked(evt); + } + public void mouseExited(java.awt.event.MouseEvent evt) { + exportModelButtonMouseExited(evt); + } + }); + + symmetryPanel1.setBackground(new java.awt.Color(176, 230, 226)); + + javax.swing.GroupLayout symetryPanelLayout = new javax.swing.GroupLayout(symetryPanel); + symetryPanel.setLayout(symetryPanelLayout); + symetryPanelLayout.setHorizontalGroup( + symetryPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(symetryPanelLayout.createSequentialGroup() + .addContainerGap(125, 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) + .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)) + ); + 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(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) + .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)) + ); + + jPanel2.add(symetryPanel, "card3"); + + modelViewPanel.setBackground(new java.awt.Color(0, 174, 163)); + modelViewPanel.setToolTipText(""); + + 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 + reloadModelButton1.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); + reloadModelButton1.setOpaque(true); + reloadModelButton1.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { + public void mouseMoved(java.awt.event.MouseEvent evt) { + reloadModelButton1MouseMoved(evt); + } + }); + reloadModelButton1.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + reloadModelButton1MouseClicked(evt); + } + public void mouseExited(java.awt.event.MouseEvent evt) { + reloadModelButton1MouseExited(evt); + } + }); + + javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4); + jPanel4.setLayout(jPanel4Layout); + jPanel4Layout.setHorizontalGroup( + jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel4Layout.createSequentialGroup() + .addContainerGap() + .addComponent(canva2, javax.swing.GroupLayout.DEFAULT_SIZE, 1040, Short.MAX_VALUE) + .addContainerGap()) + ); + 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)) + ); + + 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(jPanel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(60, 60, 60) + .addComponent(reloadModelButton1) + .addGap(95, 95, 95)) + ); + modelViewPanelLayout.setVerticalGroup( + modelViewPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, modelViewPanelLayout.createSequentialGroup() + .addContainerGap(169, 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)) + ); + + jPanel2.add(modelViewPanel, "card4"); + + 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) + .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)) + .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))) + ); + + pack(); + setLocationRelativeTo(null); + }// </editor-fold>//GEN-END:initComponents + + /** + * + * @param evt Changes the backround of the new project button + */ + private void newProjectMouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_newProjectMouseMoved + setLabelBackround(newProject); + }//GEN-LAST:event_newProjectMouseMoved + + /** + * + * @param evt Changes back the backround of the new project button + */ + private void newProjectMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_newProjectMouseExited + if (!pressedNewProject) { + resetLabelBackround(newProject); + } + }//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 + */ + private void jLabel4MouseMoved1(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jLabel4MouseMoved1 + jLabel4.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/symetryStartPanel.png"))); + }//GEN-LAST:event_jLabel4MouseMoved1 + + /** + * + * @param evt Shows menu with icons for programs of the app + */ + private void newProjectMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_newProjectMousePressed + if(pressedNewProject) { + topPanel.setVisible(false); + pressedNewProject = false; + switchPanelOnMainPanel(actualPanel); + newProject.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/new_project.png"))); + }else{ + topPanel.setVisible(true); + topPanel.add(jPanel1); + pressedNewProject = true; + newProject.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/new_project_opened.png"))); + } + }//GEN-LAST:event_newProjectMousePressed + + + /** + * + * @param evt Switch to symmetry panel + */ + private void JLabel11MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_JLabel11MouseClicked + switchPanelOnMainPanel(symetryPanel); + }//GEN-LAST:event_JLabel11MouseClicked + + /** + * + * @param evt Switch to symmetry panel + */ + 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"))); + resetLabelBackround(newProject); + }//GEN-LAST:event_symetryEstimatorMouseClicked + + /** + * + * @param evt Enables to move with the window of the app + */ + private void jPanel1MouseDragged(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jPanel1MouseDragged + int x = evt.getXOnScreen(); + int y = evt.getYOnScreen(); + frameMain.setLocation(x - xMouse, y - yMouse); + }//GEN-LAST:event_jPanel1MouseDragged + + /** + * + * @param evt Enables to move with the window of the app + */ + private void jPanel1MousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jPanel1MousePressed + xMouse = evt.getX(); + yMouse = evt.getY(); + }//GEN-LAST:event_jPanel1MousePressed + + /** + * + * @param evt Changes the backround of the reload button + */ + private void reloadModelButtonMouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_reloadModelButtonMouseMoved + reloadModelButton.setBackground(new Color(176,230,226)); + }//GEN-LAST:event_reloadModelButtonMouseMoved + + /** + * + * @param evt Changes the backround of the reload button + */ + private void reloadModelButtonMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_reloadModelButtonMouseExited + reloadModelButton.setBackground(new Color(0,174,163)); + }//GEN-LAST:event_reloadModelButtonMouseExited + + /** + * + * @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); + }//GEN-LAST:event_reloadModelButtonMouseClicked + + /** + * letting know GLCanva if model will be displayed as wire-frame + */ + private void wiredModelButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_wiredModelButtonMouseClicked + if (wiredModelClicked) { + resetLabelBackround(wiredModelButton); + wiredModelClicked = false; + canva1.setDrawWired(wiredModelClicked); + canva2.setDrawWired(wiredModelClicked); + } else { + setLabelBackround(wiredModelButton); + wiredModelClicked = true; + canva1.setDrawWired(wiredModelClicked); + canva2.setDrawWired(wiredModelClicked); + } + }//GEN-LAST:event_wiredModelButtonMouseClicked + + /** + * + * @param evt Changes the backround of the home button + */ + private void homeButtonMouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_homeButtonMouseMoved + setLabelBackround(homeButton); + }//GEN-LAST:event_homeButtonMouseMoved + + /** + * + * @param evt Changes the backround of the home button + */ + private void homeButtonMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_homeButtonMouseExited + resetLabelBackround(homeButton); + }//GEN-LAST:event_homeButtonMouseExited + + /** + * + * @param evt Returns to home panel of the app + */ + private void homeButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_homeButtonMouseClicked + switchPanelOnMainPanel(startingPanel); + }//GEN-LAST:event_homeButtonMouseClicked + + /** + * + * @param evt Changes the backround of the reload button + */ + private void reloadModelButton1MouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_reloadModelButton1MouseMoved + reloadModelButton1.setBackground(new Color(176,230,226)); + }//GEN-LAST:event_reloadModelButton1MouseMoved + + /** + * + * @param evt Loads the model that will be displayed + */ + private void reloadModelButton1MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_reloadModelButton1MouseClicked + canva2.loadModel(); + }//GEN-LAST:event_reloadModelButton1MouseClicked + + /** + * + * @param evt Changes the backround of the reload button + */ + private void reloadModelButton1MouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_reloadModelButton1MouseExited + reloadModelButton1.setBackground(new Color(0,174,163)); + }//GEN-LAST:event_reloadModelButton1MouseExited + + /** + * + * @param evt Switch to panel for viewing the model + */ + private void viewerButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_viewerButtonMouseClicked + switchPanelOnMainPanel(modelViewPanel); + }//GEN-LAST:event_viewerButtonMouseClicked + + /** + * + * @param evt Changes the backround of the symmetry button + */ + private void JLabel11MouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_JLabel11MouseMoved + JLabel11.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/symetryStartMoved.png"))); + }//GEN-LAST:event_JLabel11MouseMoved + + /** + * + * @param evt Changes the backround of the viewer panel button + */ + private void viewerButtonMouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_viewerButtonMouseMoved + viewerButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/modelViewMoved.png"))); + }//GEN-LAST:event_viewerButtonMouseMoved + + /** + * + * @param evt Changes the backround of the viewer panel button + */ + private void viewerButtonMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_viewerButtonMouseExited + viewerButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/modelView.png"))); + }//GEN-LAST:event_viewerButtonMouseExited + + /** + * + * @param evt Changes the backround of the symmetry button + */ + private void JLabel11MouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_JLabel11MouseExited + JLabel11.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/symetryStart.png"))); + }//GEN-LAST:event_JLabel11MouseExited + + /** + * + * @param evt Switch to panel for symmetry + */ + 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"))); + resetLabelBackround(newProject); + }//GEN-LAST:event_jLabel4MouseClicked + + /** + * + * @param evt Changes the backround of the export button + */ + private void exportModelButtonMouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_exportModelButtonMouseMoved + exportModelButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/exportModelPressed.png"))); + }//GEN-LAST:event_exportModelButtonMouseMoved + + /** + * + * @param evt Changes the backround of the export button + */ + private void exportModelButtonMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_exportModelButtonMouseExited + exportModelButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/exportModel.png"))); + }//GEN-LAST:event_exportModelButtonMouseExited + + /** + * When export button pressed, new directory is created and model is exported to it + * 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()){ + 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()); + try { + if (chooser.getSelectedFile() != null) { + exporter.exportModelToObj(chooser.getSelectedFile()); + JOptionPane.showMessageDialog(frameMain, "Model exported into: " + + chooser.getCurrentDirectory().toString() + "\\" + chooser.getSelectedFile().getName(), "Model exported", + 0, new ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/exportedModel.png"))); + } + } catch (IOException ex) { + Logger.getLogger(UserInterface.class.getName()).log(Level.SEVERE, null, ex); + } + } + }//GEN-LAST:event_exportModelButtonMouseClicked + + /** + * + * @param evt Changes the backround of the symmetry button + */ + private void jLabel4MouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jLabel4MouseExited + 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 + */ + public static void main(String args[]) { + try { + for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { + if ("Nimbus".equals(info.getName())) { + javax.swing.UIManager.setLookAndFeel(info.getClassName()); + break; + } + } + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) { + java.util.logging.Logger.getLogger(UserInterface.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } + java.awt.EventQueue.invokeLater(() -> { + frameMain = new UserInterface(); + frameMain.setBackground(new Color(49,165,154)); + frameMain.pack(); + frameMain.setVisible(true); + + //enables to use design of operating system + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + }catch(ClassNotFoundException | IllegalAccessException | InstantiationException | UnsupportedLookAndFeelException ex) { + } + }); + } + + + + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JLabel JLabel10; + private javax.swing.JLabel JLabel11; + private javax.swing.JLabel JLabel8; + 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 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.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; + private javax.swing.JLabel reloadModelButton1; + private javax.swing.JPanel startingPanel; + private javax.swing.JPanel symetryEstimator; + private javax.swing.JPanel symetryMain; + private javax.swing.JPanel symetryPanel; + private cz.fidentis.analyst.gui.SymmetryPanel symmetryPanel1; + private javax.swing.JPanel topPanel; + private javax.swing.JLabel viewerButton; + private javax.swing.JPanel viewerPanel; + private javax.swing.JLabel wiredModelButton; + // End of variables declaration//GEN-END:variables +} diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/backround.jpg b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/backround.jpg similarity index 100% rename from GUI/src/main/java/cz/fidentis/analyst/resources/backround.jpg rename to GUI/src/main/java/cz/fidentis/analyst/gui/resources/backround.jpg diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/batchProcessing.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/batchProcessing.png similarity index 100% rename from GUI/src/main/java/cz/fidentis/analyst/resources/batchProcessing.png rename to GUI/src/main/java/cz/fidentis/analyst/gui/resources/batchProcessing.png diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/batchProcessingGreen.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/batchProcessingGreen.png similarity index 100% rename from GUI/src/main/java/cz/fidentis/analyst/resources/batchProcessingGreen.png rename to GUI/src/main/java/cz/fidentis/analyst/gui/resources/batchProcessingGreen.png diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/batchProcessingStart.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/batchProcessingStart.png new file mode 100644 index 0000000000000000000000000000000000000000..9c2512d3525259ce784a8ff845ceb5c25d746b1b GIT binary patch literal 5829 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 Dg0Yn; literal 0 HcmV?d00001 diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/blackBackroundCanvas.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/blackBackroundCanvas.png new file mode 100644 index 0000000000000000000000000000000000000000..1ecd6e228c45a7335b0ce7115cbb31316c29ba7c GIT binary patch literal 2613 zcmb_e4Nwzj8jjd$Igk$5Qiju(u1o#Fvf15a^Rs)28j~RL8o+=Q9n{<GZpccKjmeS# z<-8N-uA+ic>v%|IfL2dMMDCn|$7ydydzI-({HbNM>WNsD@st93jz8t@+W<N4#{OKV znQV6V`=0N8pZ9&A_xn<now+zJW_pZFCX2IVm~7y#m9FS0@H^-F0SmbO#GA3)FO$hr zq-#pa?gasv?AZ_b+<Y<L`Ub@aZaK{gc1~X6_5!p_rdv?rrI{j5gzQ`)@6p49T_3>^ z&+6efRaVUEHF8cqqs+(Ulx5~JWkn3h!VBg@x)KT)aC0IJmAG9VKUJcK!*(g~EDfVD z6o!aJde|U2gz~M~kWuh)kV>vb7@SZ*8d8p{F;YRKK?)4lpqK{5l?aAYn3__O(D(-i z-h8ZsvYFDyeStSU>=Z>Wg`&Y=P##pu1z#bGlO%~^3RIy$00QxsdPKSe@%U3FESNYy z<Kw*|FL)ryB5fCnMLi6dj)ma%M$CHr<7om3LrZ8cipw!6q%e?WA~<ic&lPsgGAQTb z+?+@B11uiFdYytO_?^Nxn2t>UmjjSmt2N@|sa)Ldhzq}H4uCMm6Y^BFKeyD&p*GGh z6#E#?8~`*^q-ea9(Z|uE;L8;R*F>SRCn!TkBQ*C--opw(f9fPSXQD+;4}+SK2#z6` zA{SRvxQ4=%uVV@d!^WUif#n^g6Ho=ff!b<vaV14)C_??ZRObmO5DZI;^ml?;hH?l# zHx0t&-E<*`dOd|O6iFgw6kLK2I0o#LlgBMaW42Fl@Gdanw=G@-S<FT?PO8<2LXL;& zTCJ4D;}>ZU!&yvv7^Ftd^DM=x7>C`V!VxWLS0bc?U=h1rMIszQ;;d3hvJAsbtTzcv zu_OR#{a7!s0t0OPhn||ys8wo>24O+&5Ty!O(`qmVVF@*j;aV-Ov5#d0u*vfApdD$~ zWUCS@7Fc9J*ASp}5S0=nRjVNEh@IvLL~D0oDweaW6(l2xKCB}ugZG09myWkl4!3sv z$;Crq=}<HywS*pKBrR|(JU+}nB_H3*^Z5FplLJP-MI~e2{enXb(mu{m2y*uw8brT| zx}OewJ8_zHs0fEziD)!R2BD=w(hTlE?1YxZIjuse!W|QVPY{<hi-T`i-l|EO{r`!N zr-X6Ro<a`nttkA%L-~H19OF1Sl&7}ej};0kZKz|~LjPBG;kikhFDPPo2<+(6W8^3S zFOkED^MEY*z)`c0x$2V1rp~gM47twrck1*RinT9)5;~VQg3X+90D9}EZzrye*__9p zo%!0u%k@z^;-^=9cq4l8j`Ak2k65uLdfL#e)f>v!pXfA>9KP3J*xHZ3b@##JSIxS0 z=?{N3_@J-n@khJt3{&|i?(_l#+TOnR(q{9Qj<k6iX6cco-M*K0?&<CAb*t;U*|P)U zWzP=og1x;Y7~Ij#K4X9c!@T{reFgH~D_0uMIG-H8IxvtLA6>9=WpUTachY0tIkL{} zK6P`X_29wLKPl=@B_}5*ZZeDLm)EYra=zn>tgNh?H*S285bEji2*R9g-M%B6i{37; zJCJvKXlUsA^$+fC$ZOG)Bwl~2vnFZj@93JEn%T2wHyWzb`$rze8)D}CxvQ%PONuva zY|hKedoObi9G$pqZbE0~)IcB*pL*!l@UY@h;GfG^tXNbqC2ftOuCbO*ON=F=63;t{ z(<iYdyI+_-Wz)Ly@`WkKAxG+=xu5<KjJCD4ojw`b@cHdx=QC-KhKHl7r;WVQe822y z?`=bledj61AI`1c^VjAI$oukh)~deJ<l2hX23>M!baeE|6J7JU-wX`!U6*^XH{jZ> z4Hd16nf9dPn71SAs<x-ko6+{KcKwU@wmko$`7f>S@6DapSoZr{ckUp2M`P~}4jS%b zXEI)k+W+crq3AQtgoO1~^XJcBRZsw>8*p9d@z<jT^5>S&fu@|CoIY=UTd%P)!Mv<x zS;rS&kB&YcXTMU`aI@(Fvrt`c&bQs_+m}7}YDFj%>V#~>_9cB4jTbVe*@)yVDGg9) zM5EDk)?_TL>6fEu6F`3E=~(;9P|mFj7nZl?ZCkZ^-u9kQ=**q3n$tclJG!bWxS_wZ zva+(HLnHpY+1!2nxDiWw*Y>k2)9^!`1wDIy+lgw_^N)m)qME;1%(EJF*D}94v32AA z^J`MM#%-Tv&3tKBU0tnh&$)r<8MPbt*!JbM+%LAaoQKJygT{O9O<VF>E?>NO@zSNk z`DwASv6X-S#cmt5>)5elHJ|iXr&k`@G_Be0+<8~XnNj_0ANld>lOqP#!nWQNT|?5x izgE_)n*rqdaO$eK>5a55@pI{qoyDAKI=JYU75@e;aK)7X literal 0 HcmV?d00001 diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/blackBackroundCanvasPressed.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/blackBackroundCanvasPressed.png new file mode 100644 index 0000000000000000000000000000000000000000..79e8e34a2815e9bc38a1dc591033a55435b61671 GIT binary patch literal 2626 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 literal 0 HcmV?d00001 diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/bottom.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/bottom.png similarity index 100% rename from GUI/src/main/java/cz/fidentis/analyst/resources/bottom.png rename to GUI/src/main/java/cz/fidentis/analyst/gui/resources/bottom.png 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 new file mode 100644 index 0000000000000000000000000000000000000000..a01fdd3aad41bcc3cdf66278c65a43a61286d22d GIT binary patch literal 2540 zcmcImYitx%6y6e*M?xT^5<*aiL5-%|ow+l!J3B*{w(Rz$Yzw8e5YRA>JKM3lJIl<p zyKQ+2gn|P8@Q0*Eq*##_QDQ*~L?8h{5TAfA5F`d-!y_UXBw)O=-Ce-&(!@=6clORV z-}%lt-??{}PO2y!JZR(~m&-M{yewFSzunGzz(e@6wkMCrUjyT1(=5C;#(C!?I|>?I zuKsW7)l==Mp^2hmMBS2V$jF_H#xdIE$}dR9C8ZwOgp9&^%uim}zLO+$)lb%XLUbq| zKy`Xqvx%lOS5zy_^@^a91>=eQq=*Tk$d-s?G!nDKq@PUjiul@Drbr?MvFrV0krR-Z z8k$4|3=<I^w-+doV+dYwLoY2b+*pF4Ay3gf1zA8tk@kwLK%`$Jj%KQwSQRWu$HKq- zWSwotMT$x!67B@+Hq0;u1wo)_hGH0i5x{DS*-{e3tT7peAhHxwkK4KtBOFFaHX3X{ ziIw)H5RGSPV^+FMxL{OLic`={J1J#=q0rr-(P$QJ*~N`GN?Px2iLL6UIHIbMWi*%y zDsDtEdrT%+yw0!<tIoKCw(RX&6sk%#V7$SMq{^cz6pElI=C&{vru4<dfQcmAFsltC zl4;bWOhh6OAfBq#W2%v`o_6%4;V3BC$WP*)2>>#H=BlAj^spk!<~hxy`=BB00#&l5 z449z-%>o94S<wSU=2ozw>RQwNKtmz1JZ9NaOhM&AKZ!-TbzK#G9_Z5~j~7UspaBVS z43K%52VSJGjH=QM<5N<)@bf`KX>jV`Jl|(p)le`;ww9vAGf03C0ZwK$fEbPgg6xw3 zt<bCwsy;=9Y=*7U)bZR%k(*f^RVrpg0;6~p-UAp#LjXdK20l*k0ZnEh?_mU_@hVB& zh#N2>h8Z$cTwTn6W4$~Om}DB79>F)Ps?rHWd2zrC1+Nz{Zb%ZUB5H;im9Wk9s1!z2 zJQj9Lk7eL=%XABOxG6nGQ_!sRRYWIJ-V`Op83{kBI9@<lP~WnCn=;>DLVeFC>JTQq zi%a@omZ8}R$wWnA+>(2Ekh+s}OKQBka2aWg1_c^0UcASsveO9<4*{=fET_qgrl>+D z@&7@1x}-{-6bmD~w^HPPPv!oserpfzIDG%U2e(g!ayHaHZ&ClW-3=dSW~2yDuVYFp z-OmY9INRCrw;xGarezL#J%C5h2Us76r(DLn4-#08<^;(DA)lX85z+6(g&0j%B#!_j z4~zE+$f-cm1O#LRWuHcSRS4ltTq)K*iPYV5Ng;1KX0VXd5<a_}%j}_ve`Jqc6vKWn z@uB)|!rkq1<y<Te7FE|RIQROd`rM)sr6-;rFgjQ?w77L?Ya{tx|A9R}6pSWX+gs-? zoEf%ue{!^BXe764+R|YUfPTYY8U)Ke__E}csUu!%8Qyjh8Q#a)gKzAf6F+q9+LfOU z&Hn6I>{(Rs^`lz~$1YFCM*en;JJqA_vA$_N^JLAA!4reOyfc5{`o&YW4#<C?;{0f~ z{|?vrex>bsU2rvQc;ULfo4tJ2ZL+<c^O`nP?DOqewt6yu?DNvi9|lf$Z<}%8TGbhI zS!HKpl-e<2?hkV9ff+Avcnqu%+uhaszxd<OxQ*@yPlLw~R}9<N{_Xah^);7w?EQSv z+uPf|U$b=WiZ1?<vwwOnqs5n!FCG{7OfEfgu(!FeyYW|X@8lnQpSV1|aBKLhZ`L*( z>H7V^g`CRyl?yJ+br}mzY_92=wRhd&Gvm5Hy?S~@_g@{)2|u3{j!)V7+9w}(eH+T3 z+&ipb)T>9^*HK%qFFSFnv2%9krA5sJ#L;tYZ2hdK7tj4}KfPz);g*~={d3k-ES`O- zI5%%j;hfx|)2dh2sABJu!qX+M1kTRdnzJKsIp|kA|BHuLt=n~^>b&QJTr{-j)b#hv zE~8`Rc_#79oQ{t-U1=Frv$Lc8{Z&J9*j+6%(U2Z%SM5x&CEj`E%PYp}i%UwzyxCTg i&u7d3{YR(fxvp;Bo>#f8Wtj7Sth~4)xN*YFm;MGWo_j(7 literal 0 HcmV?d00001 diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/compareTwo.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/compareTwo.png similarity index 100% rename from GUI/src/main/java/cz/fidentis/analyst/resources/compareTwo.png rename to GUI/src/main/java/cz/fidentis/analyst/gui/resources/compareTwo.png diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/compareTwoGreen.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/compareTwoGreen.png similarity index 100% rename from GUI/src/main/java/cz/fidentis/analyst/resources/compareTwoGreen.png rename to GUI/src/main/java/cz/fidentis/analyst/gui/resources/compareTwoGreen.png diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/compareTwoStart.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/compareTwoStart.png new file mode 100644 index 0000000000000000000000000000000000000000..2b7641dc84f2e5f877cef99e298e26dd4da31599 GIT binary patch literal 6724 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 literal 0 HcmV?d00001 diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/copareWithDatabase.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/copareWithDatabase.png similarity index 100% rename from GUI/src/main/java/cz/fidentis/analyst/resources/copareWithDatabase.png rename to GUI/src/main/java/cz/fidentis/analyst/gui/resources/copareWithDatabase.png diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/copareWithDatabaseGreen.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/copareWithDatabaseGreen.png similarity index 100% rename from GUI/src/main/java/cz/fidentis/analyst/resources/copareWithDatabaseGreen.png rename to GUI/src/main/java/cz/fidentis/analyst/gui/resources/copareWithDatabaseGreen.png diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/copareWithDatabaseStart.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/copareWithDatabaseStart.png new file mode 100644 index 0000000000000000000000000000000000000000..9a287fd89a0de0f45d2f749a487571b0509f0e63 GIT binary patch literal 6318 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 literal 0 HcmV?d00001 diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/divide.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/divide.png similarity index 100% rename from GUI/src/main/java/cz/fidentis/analyst/resources/divide.png rename to GUI/src/main/java/cz/fidentis/analyst/gui/resources/divide.png diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/downButton.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/downButton.png similarity index 100% rename from GUI/src/main/java/cz/fidentis/analyst/resources/downButton.png rename to GUI/src/main/java/cz/fidentis/analyst/gui/resources/downButton.png diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/downButtonPressed.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/downButtonPressed.png similarity index 100% rename from GUI/src/main/java/cz/fidentis/analyst/resources/downButtonPressed.png rename to GUI/src/main/java/cz/fidentis/analyst/gui/resources/downButtonPressed.png diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/exportModel.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/exportModel.png similarity index 100% rename from GUI/src/main/java/cz/fidentis/analyst/resources/exportModel.png rename to GUI/src/main/java/cz/fidentis/analyst/gui/resources/exportModel.png diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/exportModelPressed.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/exportModelPressed.png similarity index 100% rename from GUI/src/main/java/cz/fidentis/analyst/resources/exportModelPressed.png rename to GUI/src/main/java/cz/fidentis/analyst/gui/resources/exportModelPressed.png diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/exportedModel.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/exportedModel.png new file mode 100644 index 0000000000000000000000000000000000000000..205cc3f16bac17d7dd719768f0585c2ab03a77ae GIT binary patch literal 3290 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 GpZ#xb70agp literal 0 HcmV?d00001 diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/home.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/home.png similarity index 100% rename from GUI/src/main/java/cz/fidentis/analyst/resources/home.png rename to GUI/src/main/java/cz/fidentis/analyst/gui/resources/home.png diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/leftButton.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/leftButton.png similarity index 100% rename from GUI/src/main/java/cz/fidentis/analyst/resources/leftButton.png rename to GUI/src/main/java/cz/fidentis/analyst/gui/resources/leftButton.png diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/leftButtonPressed.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/leftButtonPressed.png similarity index 100% rename from GUI/src/main/java/cz/fidentis/analyst/resources/leftButtonPressed.png rename to GUI/src/main/java/cz/fidentis/analyst/gui/resources/leftButtonPressed.png diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/loadCanva.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/loadCanva.png new file mode 100644 index 0000000000000000000000000000000000000000..d360ac7701f606fc431474c05b541e6b69c9bbd0 GIT binary patch literal 9309 zcmch72{_bi-|*P7WvN69nW#{W*;mG{D1&g2eKt(P%wX($%Tc64MY49JO_r2>OGO)U z9E7qZOSVMFlJ7q%&pF@woTu|%-}}9;YyLC$egFQyeZ4Pd%uNqUh;0)Cfj|<*Mg|tZ z_bc8<WF7GI%bMf@U!okNqdp*zx-##>7jRwM4*;%ZSlM!INhSm;+f$uPV^iqr0iGNH z8U)hR4&acfOga}#p}R3yM5W2{Y9%m(MpUvvlVBu{KHZ&R6y!~}3^KK%1~I94nv%8_ zSTleCAn>Gf$>0D_50(!hfT*;JmjL|cZ9|p7s~}t^QAw9a5Nt~_2kW!F>0q=v2113S z5MV4`9gczF5vcuO1PqRa!mv;{5(0x0U>E`t5B~nA1W@y)xe_c44t%EttcXhPTrP(I zh5GyZtNSC>+1_qYI3ACO!Vpjd0s=rld;(cqasY(oqx=Jd0o{k{&ERkuY!;Y@kxXIx za*0X+r{6^I<gB4(`FvLspfG3vnFEEZ!+0Y703?zAGpMKM8nh4B&<~*Uo!@_p*vBf6 zLx)<>eb~O<RJx%boyArDLClA1LI0Py|KN21eC=h9JDbb)acBRHU~9*J5syY)<Cf#= z?Xjv`8Wl?SpnC$0`2eu+HQ~4n*S}$ock&ms^Z>@+fbve(Ksf|`Z#tRF_O@cPJ%0F( z`42h3`ubp18wQKU_V-caspva6-GI!c6O{lr!b9K)2n=Nf#}d#e0vx`N=TES2pd`RC zX=E<>2QUH#fgvFX7!MfvS4cLE;Trf;I1-6q%<|!qSyZ~Q0Z|EHN1ef-5nu=^9*%Iu zK@e0r4nn1%5D+{LNrupXeIy=+!N6&hRgQr74cJs)o?dzHe~Ta*n+o7qvkd{`N`~Q4 zcnky&L!uyb1b~f<#-bo(IF&-iqA{)rSNIQXX5I`Sh{+y*#>(T024F;?u{bJ<><U3s zVQ>hIf<i+mG*>(XjmBcB2qX;yL*SLb|DvnU_F#LH*fc<|$UpBJ>+73)vt1b;z=4m& zK|Qdsp*{wV$6z1`b$}5XmEg+u_9O#7&+sI>(V-lcn-ZAk4g`QZKvFU<0EtQf=<22| z&+k2azilF6tA9{9@9R6j(VqeQ>--lM10ah~0`pvouquEhklg@A0cxvz=8OQkhphnv zP`S@HHqhulA07SE5eCi69Dw=&GZ`^_0G|x}o{KE$Uf+LtFu<z;P9RgiNkHX!FP*0J zeVg%b+~c1a;u~6jcRHY}|KQi(z<k)QTz|4RUDpjz@K2%!`gg4Rkp2EM;|MIChJ#TN z5DJ+J#0>=nhfvTI6yQsE7@mT};Q*KXA^86X#=onS>P}|4(SZU5Rr*^|XmoGJpM>F% zy~#jTqI>%gm8fi%AKe=;5!lt6?FnA<Q81ScCUZC*4C<<bLj72@?=@g8B>tY>PgRG+ zpwJW=j0$n3Q|J&1ofmv)6di)Y(2-;$6%WIaft2u9oAc5W90J2yA>afwoPa?7$YuY1 zoBuad_ft`*WF#6+rNSXd92pP*g@Qrw2pA1QM$vI(EEY{hBY`~f??i#atq?FE(*o7~ ze?^ovQ~zM+&wj9K{ht_|=M!rV^7q#N=ic@|L+__1qG4!o6ctW~AkkzB1djy*74Hf> zP;feeLWd!du2k|5o%{&YZ{GI5ZK9uw^3Q7NfAzNiTG#)lq6W(A9luoo=>J_DzO4<u zWuF7Q{Ic4=5&m5n_@{9MG;{=@C-_O1;0mW=@i+<w;z}U{v4};HAvib{1Hr<99s~s= z<AL^=XL24k_Wx^_z{|U9S#hm}(FNKdUX}FuUSRadZfm7R>)-b_cnll`6b}jn4MQU# zz=95RIY7^Zp`-9<1O)+u(de413in|A3>Sq011b^*4Z+gkI3PKpTp?r%&<xV?NE8f( zC!^tT>_5dtN4Qd`WHcV=w2(l#gQEbIy5f0>8&1Kw!hrCC!~cY9mBVl1LjSW~Rw4g1 zhyX&ZZUNH`@8{ZB1uWJEGdc?>cHY3)Wm9g51A%09jSY0I0#e4`hH^K*Ppz4neB>(U z$ppJg%LK;U9JzJS5&xE0K7K1rZ@kLoI-k|e0-aqaKW>Y6z>OCL?{_p7*{P%F1gpxj z5EAXLBbGzP)XMLc6Yr+zF${(DEFz=9fz55#AKVMq^!FaBs&1%kO1;`MlmhaZWT$;0 zCH16UaZA(q&6~;0bvcsJTfOeK=A5*PmE*WT&Ee<UhkiRZn|HSi3De38YayzJ4KVGF zuHb?gzI5}Y2lk^AeEXa_5}OyhpFc<tc$e2z^~Ln!f+2@6<D{A=60KNHeL?HJ4{2Or z_J(vMH%Csj7o$w9tt)!?w*=ha`kF7zr`jJB2n}lp9@4P6cSxwN=XF(s96Q)16IbYN zXs%gv(yhq3fWqIVJUM<aaZb3-Y|Ooa;(VmbA+YlNMd2rA-4A|K-12_zS{ma}(-NH+ zIc1r~o)A8uwqhGmUZ%KLW8)U*{POF<Nir!~{;4U&DAlmeZfk`}xg5|0@yPuFbC)H^ zV&^%K|GageyY5^Sez729zRRim);ocX7O=(n<=u+{@5IYHrTColS9;Egtly~j*i_8u z^sWIxlSyH}Q)h_lazv*VPQj*B6rvT^ZwkjW&L1ZCLp5Yp$Vu~@{#X^gr6|cKdBO*N z4Oq5FnR0vdSX**{ARUe{S=s~ciJYgB`?ohoy_K?s-h9)Utgp}Bw@vttX7Hnz`yc1q zyl&Mx_|RJ~?Yh{`lhS%3yvNB*z)m|plDs_fpZh#_An4JGYIA4#g^KMfIry5xMRV;S zi4n8IBJD{+9tC@7yN*j6U*O-UBx<3fw@Y`GanM1}mcDgCVmt4P&$plbj#gx+0e5e4 z(cq3A85MxO+so_92Cn<Yj-_Yxx-Qz5D0Xxw7I5?oFv45KRZb$aB2F3|m$~pAHA2?( z^!!s>+&3N{=kG3l+NiTBty62p<0ewv#^H=S#3a6e^Xpl5SMvFO@$TTWBmv($7A87z zdFEBZ3u@g5Z~4?{9BLN-kZ&P>z$<Hx`Mw%iw(-%0v!{^m4u>B(X9jGUM{t;D3mxCZ zKIo6B3=c<*lx8dLyY9s2^x<g!824%Esg|X>S|Kf$!#EF*>B~pNE?=_}<rJPE4T0u@ z!ZBuFzMfNz4BGZ&qD3lk`QgL&r$w?NENC8<%Udqq7QDP+zPJ02{OFN#OK107VY_n0 zz2bAb2z}CO;HdZ5w(~j#g0DdiOz^3zucEeW7Am*D9YMUY!(p$&1~nyWpFG!*y6jlf z6yf?(=KNbyjd)GuaUx{X`l0v--Vsh++!EoLXp!8mqNABN4@~+ZJoCO9_P%a_7F|wD zu`jFVB96L9+c!M*&DiBw?&*_ze8~Lewhy7!-Of1{VJk)5EeW%8Gm3|fPVco(`5g5* z5z4x$&=q_$^JC`R3{$LE^!j|=8T@r`qakVh$-}ikJnjK$>uP_hm1q+P&K~z%7H>I2 z6IaU+jP0<q0m<{TuqlTs20_6$e2a`X;B~}Q`Ka4Iumr<IWRe<p>lQ{h7ITZ9?F@;} zis(nV9)7D5X%lfP+sF8K`Cexel|Daw=>xRCBuTAN(mHU!{#G1O;0*&Od?Tlv?%W0K zS@;k?L{jOOJ>@w5MT~Wy;B^30oxi*vmS{KlqU+u*ndN7xBs+HCt%mX77Oq{yUDp9= z^#g&QukPXZ&7L-jWJb8LLm4+xq;>;*`CW}PyJD(js3ojPA&6q*`J;86mb07UL!(%c z$5?Nxr;oK5m&D4LduV2FGCJW^qX#S-L}p5Mj2;C1U`u7GpAxK#yMtj7*cFDCi>}=! z-Y!1#9J(*M`6{zI^I|7x{=B6)x(+g3Un@~LlwQofA~q5FF0x*7_hRsNb%3!lr54ew zj*u47k~1>qg1?O(%M+eJq#jIu>qg+i#_>mwu}LZ}HIKWT!hU}ijHRK~GM-MLQX_Wy zCz;kjX!{*#=@?*DERdR=@YDbytFHCvvlBly$rOCznQaNqflc7k|3p&hm9@}`3;mtT z|LedN;JvH}rR}+L$=a~g2zw(wL)TA(;~Em`i^?Zn_+65BslkMHSSfA&u(BTFub3}0 z&wTmjzQL?cpJSah5`UsKt$EP<S->7lmNx%r<9>&!sgpN~ZTPie7xb$m>1DN3M`Nxw z`=<#3vTfVc{y4d5znvF<@5|cF+6H2(zZvrx&YC7CVnLcaKH8x#OlX|>ifMS^0|CTp zyb&0<y;0rnOWN|O;_9mY#F`dHqyB;49vg|N-s8%eOXU+^2CoQaO&`_1Cmemml;znl zkg4|M`oq2FL-w_*q(*T@o7A1Q-jkaFGI)CVNJm{m4YuXti*knDxltLv2Sa<eP!+}f zJ7)`@Ivm?NLP@?njdbz9n6&Np;)5o0rRi7q*IFaJMdUh4Q4qKB()ddoG{m~YxL<^8 zid!zcc#o~JKu8l!B2okl6VB;h2^~6Qy}YaLwO?<*-UQuQEib@U8P)d|_-`qsP91b{ z%z0R?=Ja(#nZ3rPEP<Vp7COzTByv~7&<=ZFrL?VKmJVOV7D^3n#XtYtKu~@qH<_cj zRa|b&B)U_=w;5%9DQlwtwtTIjYwW4*pml(mxwk$Tz5du$Z(S)z+;2On{60#B*bXGt z<VX0(u}CE#?M)pvZ1<AtgC^H~xSHj9e}2;Pm1`T|&ny$MPKTAQ-FM;%4in3EfzbTc z%#g7?*%=Kvm#BnD6Vx%waa)=2TQi%src^Z_+Al|<KG>kjm+O0z7_qsya%sR&CU|p- zW>~m!nee@`=bYu|-bO%pzCSc2Vg7D>?(S@PJ@?aG-Pa|J>vyP?6PsEG95t*#UGf#! zBI2Z!x%`ov;bEa|{VUwPLmu%7_V&mi_d`>CE|=VFXCJ?BYdb4g6xaEvGt^Y}yp4E1 zf6^eQJVQ}+7T=3^2@&h`PX&rjoLFwr`BS5X%NMU4ZYW_Ic}_j%>4+$Pd3l5FB)6Qe zE_C72toGq4#G7mD?Hi0#jyI*>C|Mr#znpt+^co{4NOu3IpcBck3*%j)cwELjXqOL9 z#cC|)lVG8XJGM7M9TldojYycWVggQcTMA=s41-o?mgw3-PA1@DTVu9^h=q>Utui?~ zsUzyi-5&?q3TkYw-7gHI9Hib~$@3ldf!qk4S<qJhYAM#~OH>1=TRBELhgW%!?x!`> zN4`;o`-9FO5W^9xbGEymRW7!@zSu3D8;7(Vk4w-WpBrA3#C^FrcT<kUeqH*xWjH2N zJ2taYVv|O)-%56grbPi;N82-)n`2zpd+~&4X(te1+auO7?PhhHfMDELb0q4j<07jg z*?mazfliL&V=RcNER+&fGPbeobjnQfqj9=~8aP~7-h<gw{-VvG!krK{)CT2Wk#;Lj zGwxw-liQuWA#~#X#dQ2@YwI}vPjmP5#|<jo300n>A{pwDMcT#}i6(RU^hB?T{txvv zx>23a2^KmSfcB%BJO%gLU*3L-c9$c?7%y$j5eK|dW;}bkJThJ7b=BL<b~lLWaPZ+r zk!Medw+W6JQN99V)<3|6@Xxb0zSzR&!Cxh>p0SvDZy!+Z+W1#eAA5uB5>mA9Jhd$u zPTN_Uhh~?UJ8c->6byN$9W_&B+=LEQv#7ZxocMLi>-5J6(@ez&N+Cde>=O7TO)64l zV@hR|>MDh^0-B;liZ@xGauo_397r=t!wc^U4-Js*HyH7qYSW{%YqdGsI&FAiXn7;8 zGDu?~*~}KGwF`TKLi<|-m%heZNlH8yv(VYO-s+bXK2^P*Dzx>az=ra>^$$=X>xS6r z6=VQ&di2I=wpY=YO)g%?zpUS9p+jD8Wvyr!ZanViLTEP2&f_~bgl)5Vk8O=wJZ7L! z;EalG#bxaMV>=*ioy-`Ev9pMOK{kk}QayDkzNy-)`b{@h*4yl)$ilumD}qa6V4xK~ z(i^4}j-0j}juR5E$F$}J6<1J(YsWrAB%Jvt4j;LF$+D{Yx6gpP4uP_(UTN}I3I`s4 zJ(2k8^Wa#0Rl>D5_ma<^iaFwJ*m^L~9#a`z)og@1RU=hD@%o;e;i=!}><$kAA)>_> zB5bSq{>$LVaPE9l9lSb08FtUE*A~|y@MP#S?%fb5Txv=9R(R)Zty&MeN-Q90zM7aE z&wef`Y@st1s2mvxU}zmN&@-=D5*#A6j>i<Hag`pcw4RrR?{;j`<$26hV8YnqvFXX~ z<jR5gkzH>NiK$A4GH+`M29bvP@~PRIIE5*1I=A(x+@>_RT)Oelfso6QN%A0w3M;@< zBd!7&JkL7+iB^);W0lK!PUX*5fC|_EG!S#t7E#<VwYP_)(&q}0S#<6_KC(;xQ%iAG z*}ye`kcpV8X=0mI*!nSaYLtE&A~mARm~VIXGcLd67LXGx^<-Bp=#z(bL);^wn(M8X zs_T}ABuVVekT0ntyBuzAwQm?$ZymhQF!;`{=Ri+FP3#FTXy)WCa6dPst^dXAG*@U8 zN3`tz?N38Bg+PDt>eo$%hZjgHaS~Y(@r9BcduSVTSY=97*obd;U*#{ChP>Ks(zQW@ z=}DG*&Fna*Wz6Hd?Mr8!jT<&?u;?3A8NB%1KU{tnwJ)V$-7@44XtL=p{-$T8*MS1h z(by`U$S-G;yDYLi-r{_varfEe1fRo9fLLr+guJ)clg_Z-$)^>jrxY(N+z61ex6qL+ zE2-#Te+8>K*kL(+*|jSXg#1<J!Zc$1!`G<nO-})RH74|oz~WErXracL-5J39_AukF zBsZIV1kJ>5UW~mSpIZC2tzD+n_sR(%%s#}TQgtHSv1xKZx9{EEn!QPSL|JG+^G13V z7?A`Z&V>W#CK@U)_VRkTWqr%&&nJG_@x}U>U!0S!@MgaUiE05rlawfM_FiQ=L#2j= z>g4h(T|Yp%vlV~xMHp-8c`4I~4-aiAi#=#4wc$)WK;@V0O(GYVgh-D)LIV|WV8J;t zB6#npB<u+W(sahS);IREa<f@O<1Xw~Q}7E-p|RpU-s|oViFFpw5ORq&4vp-b70rBp z)!H%K{kg~+UQNr}9Qx*So}8%3Ktlv16#U46Pwv#*p<eyK7L?_ij%dnaOxZ-(L=Htx zrUr3F78!OE`MZTKDotLtNioz8`l`{6WtU1MiN6sxsqYx|JTdIHRKZ`tUFbsub~Cma z^Id=V<sO>d3(5AnD`ArvGt7SF|EY9qlB_;5oIfbSvc|YKak#RfAWi6nmZ@&1o=BYC zp}Jbp4S;b~47_RkQ>0Df{xV7NMxOpcaU6{xx;CDboPB=x?#L8rYTo6NO3M!E-3E24 zW5=AcdhKTmI0+t;FC<h?p58A9bo{5RcE*E+b{TA38>XJ}P23};qc5G7R`0{gs%x+` zyF1{UaUh)|UXdNNYr|u>_si`j(b46xgYhCNVePDim1w1_l6~39reI0dbF_@gC;!Ds z(9>Li%kh6<-C9KLBWO&ly9`2l<n0jbRNbp3uN0Px{mRN{TBJS^_Fp$&?;lKM_CIa< z;E^O5@Tz!SqkyCUT4uB2OxoFCkI`2WIpPW7A)|MO3ZTVO0UO+7E=;dyYxxH|<HtN# zo;=+*x+9X>cOawwv#s_c>i(2&n3F!+JY(gzDbwl$ZuRjI^VTj>L62}_%g^-L`||>^ z1Ljl6SKEEli^m1Jzfdj>rMjIdPGzyL3RegPfhr^IUnKQ446&-M`yHK$O?)oORZ<aJ zlQU@-u6&@&*R1$+vHA6ji%(_SY)g!5vikf*ZeVj`hb1U`44(+eY;KzNyU{pZ)lIm+ z;e**POab+bn*rI7FohuH9(QI>^rS$xrIlvtwf-v+t&ZE-d}R9x?j%B&{WO$s@@O#5 ztd=L{tktY<QQOXvIg`BU1Kei8Iz_?D0pePt>#O-cc{(h>o|-Bi6J(!Uc;G9uc~0m) zU7_){R7{T9^tNh!Wg?rw|7D$eG33{|vEU4YwsyNH->|3~3q7MEuIDEUpLDf%Y{FS$ zwwyC_%g5w$>fb~AHMkGUn-#JOm75lyX|~Q%$9Ilx_nM!LiI!^VXeNcU>nt^yMMp1s zc%IbqpOWiY@beq!_@uE#N$U@08$xrZl<?i8#&Z?Yih8*id2v;(pcBUo)0wt8KF0%M z_?BWIvTdRv6_dO7HZ8U&cvI&#b5#4n<g7#XenRgRE@{Vv{tgTk9?E3_IZpQ<>2JS0 zp^4iZ)^?#EFN}EDS##spH`MuA^UP@XprUcI-fMCBg4HOFI(wZ`N1j;+OMLbAxsRvU z>`35F%sKP)lD@8Xl@B93YBvJ&An|PL3CxLJ{pziPEeb+qkQElok+UP?{I&kq<x|K% zfR3pN<d!qi_xen)2BWR=pjOrBmRa0r0tV){ceWd=$Q1Y_IOB0N>iCH4<ic^b0%pOt zxxT0|Qc?PDH=VYShTYlWCy8qH<3n6zMMt~+-ccY~xl{h*jwbu`lD6=$TX%);u6s+b zs9${MkveDFu2ELNmS5m^+g`=oAJrUXI6JB~(v`%mH`E*zH+<sR%^KQTqejrkId@{~ zaAj<G+%Wy(wU{SWjmTG{K^Ly|n^*ehCX#}|qk2^Cf;olo@NJdn@Vj}8{a8$mNyzrb z^)q!xK2*+Li_x1T=L8;VZnw<|{8ZuD^tk<t^eExUqSMFGshm7^+Ld8-=BPBRNrMP| ziOBg}7~QfEq4v3GGxMw7={`N6_m-a`6)^Ij7ryv$y(1)cdu;Ah`J>sesxw(9IdLH# z=mgS`j$T&k+9k~D{SGf(DOLj)HLF)eyazlESUuJS4&vl_S2vbxd13Wd2w&sTH3PRi zBht6gQRn=~t{=BdB7F$nZO{dFblt<fO-?=|B5@sJ<()&Swk$>QIiaq_(BCkvFzIWj z545(*f(m6^8gg!lFEj5PUzai1%1(};G@4&TC-m0>Wm|Wuoptvr$hzVll=`vq67$54 zkdU{t4PR6rfN=`zpcicfpPYYNuv^jAC8qFeSqRXb`?xFtT~w)<YzMVcz1p&jpc=N+ zcvm?RQ9W2Wox1O6tMry|>LSLu;%?}v{+HJ_>rR0-rFB$wMvK~>A1qdM48y~K5#Zgi z#puq#V-ulSnyO(yPe`vZs+Rj~V)pr^GiJ*cZJ?(@xMY1gFBEVaXmc~>kH3Y)M7-&p z>G1XL{#`tBs%5t5LqN5QQ2v}jb38I~s(6fP4;onH-4X`(q%7N-FL^>I|Cr(vRU0M% zGuSI)8*ocFlu?|SnJijSx+E|h436p)e=F$$+zuWA{~<DQRUvv(NRNnLIuO+_9FcJx zRQGsmxNlNG#5&>rGtw*TrLCkzA8YfS6`NWJ1K$L1JiQ{j&{q*D$)_tMv-7J+(ZRE? zt@^Zagy#7jdfIag{8tV6t!Kan2%bS}R|GD68I*XRy1b3|4?xC-rUtosF30~5;?IqD literal 0 HcmV?d00001 diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/loadCanvaClicked.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/loadCanvaClicked.png new file mode 100644 index 0000000000000000000000000000000000000000..aa11ab847494e7d262017e620c817beec68adb05 GIT binary patch literal 8512 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 literal 0 HcmV?d00001 diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/loadModel.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/loadModel.png new file mode 100644 index 0000000000000000000000000000000000000000..1addcde3aefcf68f39a421c712e600566701577c GIT binary patch literal 3891 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 literal 0 HcmV?d00001 diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/loadModelPressed.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/loadModelPressed.png new file mode 100644 index 0000000000000000000000000000000000000000..fee6376e20ed3e23b62da7822fb499253891df80 GIT binary patch literal 4422 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 V&YZmGshWQ}=x!Tb^PP9>`8OL~Hh%yB literal 0 HcmV?d00001 diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/logo.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/logo.png similarity index 100% rename from GUI/src/main/java/cz/fidentis/analyst/resources/logo.png rename to GUI/src/main/java/cz/fidentis/analyst/gui/resources/logo.png diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/logo2.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/logo2.png similarity index 100% rename from GUI/src/main/java/cz/fidentis/analyst/resources/logo2.png rename to GUI/src/main/java/cz/fidentis/analyst/gui/resources/logo2.png diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/logo3.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/logo3.png similarity index 100% rename from GUI/src/main/java/cz/fidentis/analyst/resources/logo3.png rename to GUI/src/main/java/cz/fidentis/analyst/gui/resources/logo3.png diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/maximize.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/maximize.png similarity index 100% rename from GUI/src/main/java/cz/fidentis/analyst/resources/maximize.png rename to GUI/src/main/java/cz/fidentis/analyst/gui/resources/maximize.png diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/minimize.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/minimize.png new file mode 100644 index 0000000000000000000000000000000000000000..f755ee7b36e01865fd48853e9de991ad6ef1ab2b GIT binary patch literal 2163 zcmcImTWcgm6dpy?4FnPQ$)~0x-gaxcs;^URW<xR)lL04&>@11MqSe*aGfif?+U`zf z5@hkRKKL9Eg%wsobYT@=L{<gCS49zD^kKydJ}ju~KUh!CEr}%ARdArEd#b<s&R6Gr zr)pkZURs!(xPPKhC`{HCt1ECX=GWbK!uRTx6As*t#fwj+FgBH6xAoqc*(?<9x)?Ur zvbFjXE|;Am^Q9+>y-p11LScHQ7c;&tGQ|_kFe<CpKmA-)Lcgr8T6J8HE20%HZYSdO z_ELjyuXF0FGpCg4o(lvWkujy$X-BEsE31887oPKBO;!4kY`v_`<^h$p`m$1yiBPPf zjW{uN#i2!FW2&1c6&({t!;VG_go%r7*PzPqqe8UA58RdN<HK0+tE{%NEOs@m+wB&+ zMo}hBjZjK8tZTZC0D;o2C}TYorBfq@sz`Yf##tyMC1+%w+{nr*C><=J6OU=5beJYc znAT&lMv6FJ(g;|u9}Vqv#^^Mg--IYby$2GfjjdQ{D<YK}2^aI5BFd&l!Qz(8WZII4 zXdA!Yr_kr)fbmAs?x)A+nrMp-aHoJJeSNW8Nd(Je(vY$}D%A2QqEe|S53h!iFT3d@ zxt<|hR9Pm<D%6Z3q9bfJNXfMf*Dy}x#lr(=9bDkEjE%rLM%X|)fDPBeE-CE;OFs;@ zZUtJeyR|6ISj0uGT2?_+F${ed6O2n93y>`sN4{qo$m0PRO<;;GlTyR7`nq6#Rq~BI z5BdCoX?@9oW1LIZVvHHgagd<AgbdGgkmq;=1(wN#?s<ZeV8r%h5<=gw_FmRpl@E-9 z>fGjzg>)VWM2Lw|$)qI|cm{DSor=KmRb@ABMYd&9mp)|I*gIaURF)GNgl%|{t}M(c zwfTxosBI&?NL0n=ZXlBm1Dk~%))ZPCHFML03|Q`Bm_miOhHZ3OJU4u5hf3d@F5`Ji zlvSR4L4csaaCktPZ*4(?`Q4TP(j#0lfTc3Xx-1d1O(@AtJg6NeJ!P9m3-?5z2ZUmz z+px!gKcEtpLy!{$h8cKzz<oMe`2Qe$m{Q(iQB%O)s;U2dDYs_z{WUnW`Tl(k4ql3u zZ>R%rY5%m{uD?e;G7H_Cn=&2NbB;B~l|6NEOL`vmOk!Ke5d>PYWCn<Nu=@yVnAoJu zBE*^Qt7wNe;}Uw{ab{7(EJH^gF@3}WDv&3LR|>H06GHZI^;riJwWHV4NA5XhKuCWG z&aV7%d}zXt@v$o+@IwNJ>L)v2UV;O8t5%(Dv|jw<dou9?K7PlyXO6coe|F>E_uIe! zGI{>_tor&jXZqY5Z+-OIjD2qMy$3HWmEMfqpR+Hno&WCGyZ0?Ubm7mB|GM<y4?8FC zdF<;4p8n?I?a%Cd^~%+=SFfM>Y2n8!z15d*JR0wU_sl-~+vN%2zCH76{<okuzf}ET I?%9|A2K2nU>;M1& literal 0 HcmV?d00001 diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/minus.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/minus.png similarity index 100% rename from GUI/src/main/java/cz/fidentis/analyst/resources/minus.png rename to GUI/src/main/java/cz/fidentis/analyst/gui/resources/minus.png diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/minusPressed.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/minusPressed.png similarity index 100% rename from GUI/src/main/java/cz/fidentis/analyst/resources/minusPressed.png rename to GUI/src/main/java/cz/fidentis/analyst/gui/resources/minusPressed.png diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/modelView.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/modelView.png new file mode 100644 index 0000000000000000000000000000000000000000..1b86c272720c301cfc948a613429c1895150a211 GIT binary patch literal 9348 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 literal 0 HcmV?d00001 diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/modelViewMoved.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/modelViewMoved.png new file mode 100644 index 0000000000000000000000000000000000000000..778ecff09f0e3310bb2389126bff3fd3af804d1b GIT binary patch literal 9788 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 literal 0 HcmV?d00001 diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/n.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/n.png similarity index 100% rename from GUI/src/main/java/cz/fidentis/analyst/resources/n.png rename to GUI/src/main/java/cz/fidentis/analyst/gui/resources/n.png diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/navigBackground.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/navigBackground.png similarity index 100% rename from GUI/src/main/java/cz/fidentis/analyst/resources/navigBackground.png rename to GUI/src/main/java/cz/fidentis/analyst/gui/resources/navigBackground.png diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/navigationBackground.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/navigationBackground.png similarity index 100% rename from GUI/src/main/java/cz/fidentis/analyst/resources/navigationBackground.png rename to GUI/src/main/java/cz/fidentis/analyst/gui/resources/navigationBackground.png diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/new_project.jpg b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/new_project.jpg similarity index 100% rename from GUI/src/main/java/cz/fidentis/analyst/resources/new_project.jpg rename to GUI/src/main/java/cz/fidentis/analyst/gui/resources/new_project.jpg diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/new_project.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/new_project.png similarity index 100% rename from GUI/src/main/java/cz/fidentis/analyst/resources/new_project.png rename to GUI/src/main/java/cz/fidentis/analyst/gui/resources/new_project.png diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/new_project_opened.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/new_project_opened.png similarity index 100% rename from GUI/src/main/java/cz/fidentis/analyst/resources/new_project_opened.png rename to GUI/src/main/java/cz/fidentis/analyst/gui/resources/new_project_opened.png diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/notLoadedModel.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/notLoadedModel.png new file mode 100644 index 0000000000000000000000000000000000000000..ea10626859ce6772f5a5b5ec82c702662586701a GIT binary patch literal 3378 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 literal 0 HcmV?d00001 diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/originalModel.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/originalModel.png new file mode 100644 index 0000000000000000000000000000000000000000..125fd6fea4dafa1ccf428eec9f45a57e38ba0460 GIT binary patch literal 4999 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 literal 0 HcmV?d00001 diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/originalModelPressed.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/originalModelPressed.png new file mode 100644 index 0000000000000000000000000000000000000000..b9e7ca9a2c00e9ecb776df2d99948284923052b3 GIT binary patch literal 4670 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 GJ^uoOU7O(m literal 0 HcmV?d00001 diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/plus.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/plus.png similarity index 100% rename from GUI/src/main/java/cz/fidentis/analyst/resources/plus.png rename to GUI/src/main/java/cz/fidentis/analyst/gui/resources/plus.png diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/plusPressed.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/plusPressed.png similarity index 100% rename from GUI/src/main/java/cz/fidentis/analyst/resources/plusPressed.png rename to GUI/src/main/java/cz/fidentis/analyst/gui/resources/plusPressed.png diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/resetButton.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/resetButton.png similarity index 100% rename from GUI/src/main/java/cz/fidentis/analyst/resources/resetButton.png rename to GUI/src/main/java/cz/fidentis/analyst/gui/resources/resetButton.png diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/resetButtonPressed.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/resetButtonPressed.png similarity index 100% rename from GUI/src/main/java/cz/fidentis/analyst/resources/resetButtonPressed.png rename to GUI/src/main/java/cz/fidentis/analyst/gui/resources/resetButtonPressed.png diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/rightBottom.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/rightBottom.png similarity index 100% rename from GUI/src/main/java/cz/fidentis/analyst/resources/rightBottom.png rename to GUI/src/main/java/cz/fidentis/analyst/gui/resources/rightBottom.png diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/rightButton.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/rightButton.png similarity index 100% rename from GUI/src/main/java/cz/fidentis/analyst/resources/rightButton.png rename to GUI/src/main/java/cz/fidentis/analyst/gui/resources/rightButton.png diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/rightButtonPressed.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/rightButtonPressed.png similarity index 100% rename from GUI/src/main/java/cz/fidentis/analyst/resources/rightButtonPressed.png rename to GUI/src/main/java/cz/fidentis/analyst/gui/resources/rightButtonPressed.png diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/selectPoints.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/selectPoints.png new file mode 100644 index 0000000000000000000000000000000000000000..f4e6c251c13fee841185bb1d6005015ae3e20a39 GIT binary patch literal 4035 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 literal 0 HcmV?d00001 diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/showPlane.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/showPlane.png new file mode 100644 index 0000000000000000000000000000000000000000..bb223da1ae986d266950254055cad86d5fb96222 GIT binary patch literal 3359 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 Kfrk|fSN;o`o%s|1 literal 0 HcmV?d00001 diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/showPlanePane.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/showPlanePane.png new file mode 100644 index 0000000000000000000000000000000000000000..5b233935c9cd88b33810b0fab32abb82b338a323 GIT binary patch literal 3255 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 NP{k%Hw#B3`_%}$V#8ChM literal 0 HcmV?d00001 diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/showPlanePressed.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/showPlanePressed.png new file mode 100644 index 0000000000000000000000000000000000000000..c92818e64874dd61c0170c19d1be4adab470c486 GIT binary patch literal 3133 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 literal 0 HcmV?d00001 diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/symetry.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/symetry.png similarity index 100% rename from GUI/src/main/java/cz/fidentis/analyst/resources/symetry.png rename to GUI/src/main/java/cz/fidentis/analyst/gui/resources/symetry.png diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/symetryCount.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/symetryCount.png new file mode 100644 index 0000000000000000000000000000000000000000..58864d8fa5b9ab740c3bf9d5c1e77a9bbf76f820 GIT binary patch literal 4915 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 X<@;M*qF9UnYnkr0Fv>DGdh&k&jEgjJ literal 0 HcmV?d00001 diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/symetryCountClicked.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/symetryCountClicked.png new file mode 100644 index 0000000000000000000000000000000000000000..8d4a9d0303d94c7731a6f5a45d5c31afa0b783b7 GIT binary patch literal 4839 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 B13Lf! literal 0 HcmV?d00001 diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/symetryGreen.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/symetryGreen.png similarity index 100% rename from GUI/src/main/java/cz/fidentis/analyst/resources/symetryGreen.png rename to GUI/src/main/java/cz/fidentis/analyst/gui/resources/symetryGreen.png diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/symetryStart.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/symetryStart.png new file mode 100644 index 0000000000000000000000000000000000000000..9423bccd70b3d9bd3002e620851aa3b7973f8dff GIT binary patch literal 5559 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 %)hkBn@P<crb%6)%e0QwKcCbrEo-o$_x+6C$n! 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 aO)g_zt|oB7Cu{bvRTn1@$E)jtlK%xcJ~@^E literal 0 HcmV?d00001 diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/symetryStartMoved.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/symetryStartMoved.png new file mode 100644 index 0000000000000000000000000000000000000000..182a20e18874970e67893f21607c840cf3587af7 GIT binary patch literal 5564 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 literal 0 HcmV?d00001 diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/symetryStartP.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/symetryStartP.png new file mode 100644 index 0000000000000000000000000000000000000000..5c6b58dd1f579b11290a69a26628ab08a228353e GIT binary patch literal 5510 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 literal 0 HcmV?d00001 diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/symetryStartPanel.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/symetryStartPanel.png new file mode 100644 index 0000000000000000000000000000000000000000..39658d54cc1a8267ef87ab6374eacc82ae4e292a GIT binary patch literal 5564 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 literal 0 HcmV?d00001 diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/texture.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/texture.png similarity index 100% rename from GUI/src/main/java/cz/fidentis/analyst/resources/texture.png rename to GUI/src/main/java/cz/fidentis/analyst/gui/resources/texture.png diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/texture2.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/texture2.png similarity index 100% rename from GUI/src/main/java/cz/fidentis/analyst/resources/texture2.png rename to GUI/src/main/java/cz/fidentis/analyst/gui/resources/texture2.png diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/upButton.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/upButton.png similarity index 100% rename from GUI/src/main/java/cz/fidentis/analyst/resources/upButton.png rename to GUI/src/main/java/cz/fidentis/analyst/gui/resources/upButton.png diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/upButtonPressed.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/upButtonPressed.png similarity index 100% rename from GUI/src/main/java/cz/fidentis/analyst/resources/upButtonPressed.png rename to GUI/src/main/java/cz/fidentis/analyst/gui/resources/upButtonPressed.png diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/whiteBackroundCanvas.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/whiteBackroundCanvas.png new file mode 100644 index 0000000000000000000000000000000000000000..2392d79948755cb2681db19304b6fc23faf15392 GIT binary patch literal 2647 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 YsOpud(YlR{N%-{Br)TS0mlak06Le$ESO5S3 literal 0 HcmV?d00001 diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/whiteBackroundCanvasPressed.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/whiteBackroundCanvasPressed.png new file mode 100644 index 0000000000000000000000000000000000000000..cbf866bba082635034362ab1345cd33d07ffcc2d GIT binary patch literal 2667 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 literal 0 HcmV?d00001 diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/resources/wireframe.png b/GUI/src/main/java/cz/fidentis/analyst/gui/resources/wireframe.png new file mode 100644 index 0000000000000000000000000000000000000000..28efd055ab3380bf32718c9a8392a08367b32945 GIT binary patch literal 4143 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 literal 0 HcmV?d00001 diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/close.png b/GUI/src/main/java/cz/fidentis/analyst/resources/close.png deleted file mode 100644 index 39524575cd12b20d0f3745dd77762df8b4512c8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2314 zcmcImU2GIp7+qR{0)jly2M~0eCJ4gp%$=G2nSrI0-9neJrM9ark{IsH-04o(of&7Q z-EEa1)QVsT1jWP{QAh+-C<LR{pdpk-`_{^j@c{`nMiQ}54GIsYdT0MyuwY-@WOnY} zIdi`Aec!qF?#{Z}H8ZEro9^*=W=3lw_4w{}ud*rlyYY)90eqWg)@-oxT!nj0%6w4S z>hVl%(&9}{Q*50m8!0bT3<-HNDHEeTp5>Jp6Uv*BLrADu(?jIV(`QIRQ$l2;FUG{o zFiL1O?G|ciuZ_#?n`J>ED_0Q9Ga@EPAqNtfR8qIaOo+_#ig@f!(<G6FIGaOcl^c*~ ziq#Qe!$O45>!)PEvqV7f0zV_L{8EBtK!9cfG~g%(h>Tz41S0<-aWqR&#rnwVd@TGc zL?#@^6lpr0PJ7dw*RYytAP54@ur$k37(v->x&t$mZdVi-BFL64&2%(FCtOA-87)qT z#7c81q|73%Zs*H{3r1(4NdqtArc?mNVh@I<Qbn}wRJY<NdA;Kj+wnFN(e=nSS}Yk= zw<6uCC<HSThGW<X<38GokMB~b$i;wWi<QilN0DiiL@CT|V=Tz(GsUolpkr8Z!$=ky zRab~egu}$5Mom|Yw7uBXlZT@SbWn)IJrgLvQVbslLD9#F9Jj=69+QK{unQFEz=?qk zMN``*0*%GQsBSw@mr*nlBC#m1rYWL?R8|E7L$QABAw}XDD(DLUDxj(yuS%>cD?(Nm zem`Q!Ep8p$_j9II3>kA2YbnA2iv$1=#Y>z@A(rPUK?*{Okr^%sl%T8tuE4h5((t;0 z$+4`iDg`qlftCGoz(=vNiYNeFRlE?SREYxtA1fd=ppe99+^~@}teBzT>SF%U`Di#? zXBn!N#1HKHHLHkdb=VICzn@~gfFu-IR1GTyvCXs;Y(})HH@l|CGH|*znvFZ$mS08< z=!N_!sS#Okicof!M2M7KFCZ)^H?56R=7}Ygdq15(nDhZI$-!(xb<)s6Rn531|KUOU ze$s8&`e5M`^T+=tJYP~d0rh5t_g0#8Q=#2mDAy4B-d>G1KaMiaI@pFRJD>e3*gRT? zQCt>N3scx5*&%_QanDni3U7GD*f}P86m?gu(dmM>tMICG%`~2p72_`@Nn#`(_<d9W zfgr^Nd6j|^-ZhZG@eD6O9{_<|A(C1#tNU;vR+VJv6Da88SV{uCLP1qPl!Sm3R2jbl z02srSE$_cl950tFa?J5i=nXz|++p#s!#|40CDL&pEqoY0Q}I#S<C)YHja0=G+lIa$ zOm#4`Uxi)2lpGr<Z+c>hGx^!RrOqo|d&~REHXK|qIP}O-r{$!u?59QhDtA6Udsbyh z$57e8d_ccgy0&5P%7^C7cz61#%gc6jo_TA|&c21aOOL<y(#Koup>TSBV%v;?@{51Q zE?j>3_W7?r33NX8_V4>UrnZk9?*DYo+0t7JHcj60+);VOh;wJ-LkD_G7hJe7jqASr zTW8m)UF+ZfW}m+C;r_En23B65_4(D~iF9|**44ucZ+Xp2!?VwxIF#;ubogn<``281 z|DIl>G1Oc6=I+yLf33ba_p_79DS<<8WYU?EP|3Bjk)8wZg%7VEq_*qV?4IbQAA~OR z$BzE<S5NIqZ+mj!+r>BLU72y9(|@)9`QhPCo?fVa+4aXe-%Yu5th}yn*-`oD7~ebZ ztEQ33ulM<Giz|;@x0Y59|GoFz$cg$f1t`Dq?zx_=o`XBOFQ!PY!Tq-qt*(u9t=hEx EA1Kxu^8f$< diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/loadCanva.png b/GUI/src/main/java/cz/fidentis/analyst/resources/loadCanva.png deleted file mode 100644 index 665b6d4ebf2858ff5aa70217759209eaa66b6c91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9393 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 diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/loadCanvaClicked.png b/GUI/src/main/java/cz/fidentis/analyst/resources/loadCanvaClicked.png deleted file mode 100644 index 8648dfe9fd3a26ef901cbbe408143720d2fefdd2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8635 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 PUSV(Jguh|sbNIgiY2G+e diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/loadModel.png b/GUI/src/main/java/cz/fidentis/analyst/resources/loadModel.png deleted file mode 100644 index 53d92580986073567672051e38e6134bf31ecc06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3921 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 DIhP|C diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/loadModelPressed.png b/GUI/src/main/java/cz/fidentis/analyst/resources/loadModelPressed.png deleted file mode 100644 index 39184cb44fee42d05a9646ff27ae9f76ba913949..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4545 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 R+qpkk=(Oz?#pYf={1YvfShfHF diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/modelView.png b/GUI/src/main/java/cz/fidentis/analyst/resources/modelView.png deleted file mode 100644 index b221b1d41c09de2d8983df6ec7869e9f2cc8b444..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11398 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 diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/modelViewMoved.png b/GUI/src/main/java/cz/fidentis/analyst/resources/modelViewMoved.png deleted file mode 100644 index a757a2e8e8cdf13eb49632995b882207653151a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11495 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 diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/symetryCount.png b/GUI/src/main/java/cz/fidentis/analyst/resources/symetryCount.png deleted file mode 100644 index 23258b99ccf99d67df91f23d777c7ce8c76a24e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4912 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 diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/symetryCountClicked.png b/GUI/src/main/java/cz/fidentis/analyst/resources/symetryCountClicked.png deleted file mode 100644 index 2b4a69b0ce341c75a889905b96e078b121a4d45a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4845 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 F{{jIh{7(P? diff --git a/GUI/src/main/java/cz/fidentis/analyst/resources/wireframe.png b/GUI/src/main/java/cz/fidentis/analyst/resources/wireframe.png deleted file mode 100644 index 69247e62b2f9d898888cd7e2c3a6467b99836c7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5000 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 diff --git a/GUI/src/main/java/cz/fidentis/analyst/symmetry/AproxSymmetryPlane.java b/GUI/src/main/java/cz/fidentis/analyst/symmetry/AproxSymmetryPlane.java new file mode 100644 index 00000000..6ddae7b0 --- /dev/null +++ b/GUI/src/main/java/cz/fidentis/analyst/symmetry/AproxSymmetryPlane.java @@ -0,0 +1,42 @@ +package cz.fidentis.analyst.symmetry; + +/** + * + * @author Natália Bebjaková + * + * Respresents plane with added atribute - votes, that play role + * in decision about symmetry estimate of the 3D model + */ +public class AproxSymmetryPlane extends Plane implements Comparable<AproxSymmetryPlane> { + public Integer votes; + + /** + * returns number of votes that were given to plane while computing the symmetry + * + * @return Number of votes + */ + public Integer getVotes() { + return votes; + } + + /** + * + * @param plane Original plane without votes + * @param votes number of votes given to the plane + */ + public AproxSymmetryPlane(Plane plane, int votes) { + super(plane.a, plane.b, plane.c, plane.d); + this.votes = votes; + } + + /** + * Enables to compare two approximate planes due to number of votes + * + * @param other plane to be compared + * @return number that decides which plane has more votes + */ + @Override + public int compareTo(AproxSymmetryPlane other) { + return this.votes.compareTo(other.votes); + } +} diff --git a/GUI/src/main/java/cz/fidentis/analyst/symmetry/BoundingBox.java b/GUI/src/main/java/cz/fidentis/analyst/symmetry/BoundingBox.java new file mode 100644 index 00000000..0a1f577d --- /dev/null +++ b/GUI/src/main/java/cz/fidentis/analyst/symmetry/BoundingBox.java @@ -0,0 +1,147 @@ +package cz.fidentis.analyst.symmetry; + +import cz.fidentis.analyst.mesh.core.MeshPoint; +import java.util.List; +import javax.vecmath.Vector3d; + +/** + * @author Natália Bebjaková + * + * Represent min-max box. + * It is automatically maintained by given point array. + * + */ + +public class BoundingBox { + private boolean isMinMaxValid; + private MeshPoint maxPoint; + private MeshPoint minPoint; + private MeshPoint midPoint; + private double maxDiag; + private final List<MeshPoint> points; + + /** + * + * @return max point of the bounding box + */ + public MeshPoint getMaxPoint() { + return maxPoint; + } + + /** + * + * @param point new max point of the bounding box + */ + public void setMaxPoint(MeshPoint point) { + this.maxPoint = point; + } + + /** + * + * @return middle point of the bounding box + */ + public MeshPoint getMidPoint() { + return midPoint; + } + + /** + * + * @param point new middle point of the bounding box + */ + public void setMidPoint(MeshPoint point) { + this.midPoint = point; + } + + /** + * + * @return min point of the bounding box + */ + public MeshPoint getMinPoint() { + return minPoint; + } + + /** + * + * @param point new min point of the bounding box + */ + public void setMinPoint(MeshPoint point) { + this.minPoint = point; + } + + /** + * Creates bounding box that is automatically maintained with respect to given array. + * @param points array of points + */ + public BoundingBox(List<MeshPoint> points) { + this.points = points; + this.ValidateMinMax(); + this.ValidateMidDiag(); + } + + /** + * @return point array that is managed by curent bounding box. + */ + public List<MeshPoint> getPoints() { + return points; + } + + /** + * Recomputes the BoundingBox from all points + */ + 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); + + for (int i = 0; i < points.size(); i++) { + MeshPoint point = points.get(i); + + minPoint.getPosition().x = Math.min(minPoint.getPosition().x, point.getPosition().x); + minPoint.getPosition().y = Math.min(minPoint.getPosition().y, point.getPosition().y); + minPoint.getPosition().z = Math.min(minPoint.getPosition().z, point.getPosition().z); + + maxPoint.getPosition().x = Math.max(maxPoint.getPosition().x, point.getPosition().x); + maxPoint.getPosition().y = Math.max(maxPoint.getPosition().y, point.getPosition().y); + maxPoint.getPosition().z = Math.max(maxPoint.getPosition().z, point.getPosition().z); + } + isMinMaxValid = true; + this.ValidateMidDiag(); + } + + /** + * Recompute mid-point and max diagonal length. + */ + private void ValidateMidDiag() { + midPoint = (minPoint.addPosition(maxPoint)).multiplyPosition(0.5); + MeshPoint diag = maxPoint.subtractPosition(minPoint); + this.maxDiag = diag.abs(); + } + + /** + * Return volume diagonal of the bounding box. + * @return maximal diagonal of bounding box + */ + public double getMaxDiag() { + if (!isMinMaxValid) { + this.ValidateMinMax(); + } + return maxDiag; + } + + /** + * Returns description of BoundignBox. + * @return String representation of the bounding box + */ + @Override + public String toString() { + String str = "BoundingBox: "; + if (this.minPoint == null || this.maxPoint == null || this.midPoint == null) { + return str += "undefined (there are no points)"; + } + str += "\n"; + str += "\t" + "- min point : " + this.minPoint + "\n"; + str += "\t" + "- max point : " + this.maxPoint + "\n"; + str += "\t" + "- mid point : " + this.midPoint + "\n"; + str += "\t" + "- max diag : " + this.maxDiag + "\n"; + return str; + } +} \ No newline at end of file diff --git a/GUI/src/main/java/cz/fidentis/analyst/symmetry/Config.java b/GUI/src/main/java/cz/fidentis/analyst/symmetry/Config.java new file mode 100644 index 00000000..63ce184e --- /dev/null +++ b/GUI/src/main/java/cz/fidentis/analyst/symmetry/Config.java @@ -0,0 +1,157 @@ +package cz.fidentis.analyst.symmetry; + +/** + * + * @author Natalia Bebjakova + * + * Representation of configuration for symmetry estimate. + * Default numbers are given due to the best results on tested data. + * On many different 3D models, it exists other values of config that will have + * 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_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; + private static final int DEFAULT_SIGNIFICANT_POINT_COUNT = 200; + private static final boolean DEFAULT_AVERAGING = true; + + private double minCurvRatio; + private double minAngleCos; + private double minNormAngleCos; + private double maxRelDistance; + private int significantPointCount; + private boolean averaging; + + /** + * Parameter which denotes how similar the Gaussian curvatures in the two vertices + * must be for this criteria to be satisfied. + * The higher the value is the more similar they must be. + * + * @return minimal similarity of curvatures to satisfy the criteria + */ + public double getMinCurvRatio() { + return minCurvRatio; + } + + /** + * + * @param minCurvRatio new minimal similarity of curvatures to satisfy the criteria + */ + public void setMinCurvRatio(double minCurvRatio) { + this.minCurvRatio = minCurvRatio; + } + + /** + * MinAngleCos ∈ (0,1) + * It is the angle between the vector (xk − xl) and the normal vector nij of the plane Ïij + * (which is the vector (xi −xj)) + * Returns parameter which denotes how large the angle αij can be for this criteria to be satisfied. + * + * @return minimal angle satisfy criteria + */ + public double getMinAngleCos() { + return minAngleCos; + } + + /** + * + * @param minAngleCos new minimal angle to satisfy the criteria + */ + public void setMinAngleCos(double minAngleCos) { + this.minAngleCos = minAngleCos; + } + + /** + * MinNormAngleCos ∈ (0,1) + * It is angle between vectors (xi − xj) and (ni − nj), where xi, xj are vertices and ni, nj its normals + * Returns parameter which denotes how large the angle αij can be for this criteria to be satisfied. + * + * @return minimal angle to satisfy criteria + */ + public double getMinNormAngleCos() { + return minNormAngleCos; + } + + /** + * + * @param minNormAngleCos new minimal angle to satisfy the criteria + */ + public void setMinNormAngleCos(double minNormAngleCos) { + this.minNormAngleCos = minNormAngleCos; + } + + /** + * Parameter which denotes how far (relatively to the length of the bounding box diagonal) + * the middle point of the two vertices can be from the plane in order to satisfy this criteria. + * + * @return relative distance + */ + public double getMaxRelDistance() { + return maxRelDistance; + } + + /** + * + * @param maxRelDistance new relative distance + */ + public void setMaxRelDistance(double maxRelDistance) { + this.maxRelDistance = maxRelDistance; + } + + /** + * Returns number of vertices with the highest Gaussian curvature. + * It is optional parameter. + * + * @return number of significant points for computing the symmetry + */ + public int getSignificantPointCount() { + return significantPointCount; + } + + /** + * + * @param significantPointCount new number of significant points for computing the symmetry + */ + public void setSignificantPointCount(int significantPointCount) { + this.significantPointCount = significantPointCount; + } + + /** + * If there are more planes with the same highest number of votes while computing symmetry, + * we can average them all together. + * Returns parameter that decides whether to average them or not. + * + * @return true if planes will be averaged + */ + public boolean isAveraging() { + return averaging; + } + + /** + * + * @param averaging new averaging flag + */ + public void setAveraging(boolean averaging) { + this.averaging = averaging; + } + + /** + * Gives default values of configuration. + * + * @return configuration with default values + */ + public static Config getDefault() { + Config conf = new Config(); + + conf.minCurvRatio = DEFAULT_MIN_CURV_RATIO; + conf.minAngleCos = DEFAULT_MIN_ANGLE_COS; + conf.minNormAngleCos = DEFAULT_MIN_NORM_ANGLE_COS; + conf.maxRelDistance = DEFAULT_MAX_REL_DISTANCE; + conf.significantPointCount = DEFAULT_SIGNIFICANT_POINT_COUNT; + conf.averaging = DEFAULT_AVERAGING; + + return conf; + } +} \ 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 new file mode 100644 index 00000000..b4a30323 --- /dev/null +++ b/GUI/src/main/java/cz/fidentis/analyst/symmetry/Plane.java @@ -0,0 +1,88 @@ +package cz.fidentis.analyst.symmetry; + +import cz.fidentis.analyst.mesh.core.MeshFacet; +import cz.fidentis.analyst.mesh.core.MeshPoint; + +/** + * + * @author Natália Bebjaková + * + * Representation of the plane + */ +public class Plane { + public double a; + public double b; + public double c; + public double d; + private static MeshFacet facet; + + /** + * Creates new plane + * + * @param a a coordinate + * @param b b coordinate + * @param c c coordinate + * @param d d coordinate + */ + public Plane(double a, double b, double c, double d) { + this.a = a; + this.b = b; + this.c = c; + this.d = d; + } + + /** + * Normalize the plane + */ + public void normalize() { + double normalLength = Math.sqrt(a * a + b * b + c * c); + + a /= normalLength; + b /= normalLength; + c /= normalLength; + d /= normalLength; + } + + /** + * Returns plane that is represented by mesh which can be merged with model + * + * @param centroid middle point of the plane + * @param a a coordinate + * @param b b coordinate + * @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) { + facet = new MeshFacet(); + SymmetryCounter planeMesh = new SymmetryCounter(facet); + + MeshPoint[] points = new MeshPoint[4]; + + points[0] = centroid.subtractPosition(a.multiplyPosition(scale)).subtractPosition(b.multiplyPosition(scale)); + points[1] = centroid.subtractPosition(a.multiplyPosition(scale)).addPosition(b.multiplyPosition(scale)); + points[2] = centroid.addPosition(a.multiplyPosition(scale)).addPosition(b.multiplyPosition(scale)); + points[3] = centroid.addPosition(a.multiplyPosition(scale)).subtractPosition(b.multiplyPosition(scale)); + + for (MeshPoint point : points) { + facet.addVertex(point); + } + + Triangle[] triangles = new Triangle[4]; + + triangles[0] = new Triangle(0, 1, 2); + triangles[1] = new Triangle(0, 2, 3); + triangles[2] = new Triangle(0, 2, 1); + triangles[3] = new Triangle(0, 3, 2); + planeMesh.setTriangles(triangles); + + MeshPoint[] normals = planeMesh.CalculateNormals(); + + facet.getVertices().clear(); + + for (int i = 0; i < points.length; i++) { + facet.addVertex(new MeshPoint(points[i].getPosition(),normals[i].getPosition(),null)); + } + return planeMesh; + } + +} diff --git a/GUI/src/main/java/cz/fidentis/analyst/symmetry/SymmetryCounter.java b/GUI/src/main/java/cz/fidentis/analyst/symmetry/SymmetryCounter.java new file mode 100644 index 00000000..19fbd548 --- /dev/null +++ b/GUI/src/main/java/cz/fidentis/analyst/symmetry/SymmetryCounter.java @@ -0,0 +1,812 @@ +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; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import javax.swing.ImageIcon; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.ProgressMonitor; +import javax.swing.UIManager; +import javax.vecmath.Vector3d; + +/** + * + * @author Natália Bebjaková + * + * Main class for computing approximate plane of symmetry of the 3D model. + * 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 { + /** + * Facet of the model on which symmetry is computed + */ + private final MeshFacet facet; + /** + * Representation for areas of Voronoi region of triangles + */ + private TriangleVertexAreas[] areas; + /** + * Represent min-max box. It is automatically maintained by given point array. + */ + private BoundingBox boundingBox; + /** + * Helping array of triangles computed from corner table + */ + protected Triangle[] triangles; + /** + * panel for configuration of symmetry counting + */ + private JPanel panel; + + /** + * + * @return panel for configuration of symmetry counting + */ + public JPanel getPanel() { + return panel; + } + + /** + * + * @param panel new panel for configuration of symmetry counting + */ + public void setPanel(JPanel panel) { + this.panel = panel; + } + + + /** + * + * @return Facet of the model on which symmetry is computed + */ + public MeshFacet getFacet() { + return facet; + } + + /** + * Creates new class for computing symmetry + * + * @param f facet on which symmetry will be computed + */ + public SymmetryCounter(MeshFacet f) { + this.facet = f; + } + + /** + * If bounding box is not created yet, it creates new one. + * + * @return Represent min-max box of the boundries of the model. + */ + public BoundingBox getBoundingBox() { + if (boundingBox == null) { + boundingBox = new BoundingBox(facet.getVertices()); + } + return boundingBox; + } + + /** + * + * @param boundingBox new min-max box of the boundries of the model. + */ + public void setBoundingBox(BoundingBox boundingBox) { + this.boundingBox = boundingBox; + } + + /** + * + * @return array of triangles + */ + public Triangle[] getTriangles() { + return triangles; + } + + /** + * + * @param triangles new array of triangles + */ + public void setTriangles(Triangle[] triangles) { + this.triangles = triangles; + } + + /** + * Representation of areas of Voronoi region of triangles + * used for computing Gaussian curvature + */ + private class TriangleVertexAreas { + public double v1Area; + public double v2Area; + 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 + */ + public void initTriangles() { + 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; + } + } + + /** + * Calculates new normals of the points + * + * @return new normals represented as mesh points so that math operations can be done + */ + public MeshPoint[] CalculateNormals() { + MeshPoint[] newNormals = new MeshPoint[facet.getNumberOfVertices()]; + for (int i = 0; i < facet.getNumberOfVertices(); i++) + newNormals[i] = new MeshPoint(new Vector3d(0, 0, 0), null, null); + for (Triangle t : triangles) { + MeshPoint triangleNormal = (facet.getVertices().get(t.vertex3).subtractPosition + (facet.getVertices().get(t.vertex1))).crossProduct(facet.getVertices().get(t.vertex2).subtractPosition(facet.getVertices().get(t.vertex1))); + newNormals[t.vertex1] = newNormals[t.vertex1].addPosition(new MeshPoint(triangleNormal.getPosition(), null, null)); + newNormals[t.vertex2] = newNormals[t.vertex2].addPosition(new MeshPoint(triangleNormal.getPosition(), null, null)); + newNormals[t.vertex3] = newNormals[t.vertex3].addPosition(new MeshPoint(triangleNormal.getPosition(), null, null)); + } + for (int i = 0; i < newNormals.length; i++){ + if (newNormals[i].getPosition().x != 0 && newNormals[i].getPosition().y != 0 && newNormals[i].getPosition().z != 0) { + newNormals[i] = newNormals[i].dividePosition(newNormals[i].abs()); + } + } + return newNormals; + } + + /** + * + * @param pointIndex index of point for which we are searching traingles in its neighborhood + * @return triangle neighbours of given index of vertex + */ + public List<Integer> getNeighbours(int pointIndex) { + return facet.getCornerTable().getTriangleIndexesByVertexIndex(pointIndex); + } + + /** + * Return area of Voronoi region of triangle + * + * @param t triangle of which area is computed + * @return area of Voronoi region + */ + private TriangleVertexAreas computeTriangleVertexAreas(Triangle t) { + MeshPoint circumcenter; + + MeshPoint tVertex1 = facet.getVertices().get(t.vertex1); + MeshPoint tVertex2 = facet.getVertices().get(t.vertex2); + MeshPoint tVertex3 = facet.getVertices().get(t.vertex3); + + double a = (tVertex2.subtractPosition(tVertex3)).abs(); + double b = (tVertex3.subtractPosition(tVertex1)).abs(); + double c = (tVertex2.subtractPosition(tVertex1)).abs(); + + double d1 = a * a * (b * b + c * c - a * a); + double d2 = b * b * (c * c + a * a - b * b); + double d3 = c * c * (a * a + b * b - c * c); + double dSum = d1 + d2 + d3; + + d1 /= dSum; + d2 /= dSum; + d3 /= dSum; + + MeshPoint v1Half = (tVertex2.addPosition(tVertex3)).dividePosition(2); + MeshPoint v2Half = (tVertex1.addPosition(tVertex3)).dividePosition(2); + MeshPoint v3Half = (tVertex2.addPosition(tVertex1)).dividePosition(2); + + + TriangleVertexAreas area = new TriangleVertexAreas(); + + if (d1 < 0) { + area.v3Area = ((v2Half.subtractPosition(tVertex3)).crossProduct(v1Half.subtractPosition(tVertex3))).abs() / 2; + area.v2Area = ((v3Half.subtractPosition(tVertex2)).crossProduct(v1Half.subtractPosition(tVertex2))).abs() / 2; + area.v1Area = (((v1Half.subtractPosition(tVertex1)).crossProduct(v3Half.subtractPosition(tVertex1))).abs() / 2) + + (((v1Half.subtractPosition(tVertex1)).crossProduct(v2Half.subtractPosition(tVertex1))).abs() / 2); + 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) + + (((v2Half.subtractPosition(tVertex2)).crossProduct(v3Half.subtractPosition(tVertex2))).abs() / 2); + return area; + } + if (d3 < 0) { + area.v2Area = ((v1Half.subtractPosition(tVertex2)).crossProduct(v3Half.subtractPosition(tVertex2))).abs() / 2; + area.v1Area = ((v2Half.subtractPosition(tVertex1)).crossProduct(v3Half.subtractPosition(tVertex1))).abs() / 2; + area.v3Area = (((v3Half.subtractPosition(tVertex3)).crossProduct(v2Half.subtractPosition(tVertex3))).abs() / 2) + + (((v3Half.subtractPosition(tVertex3)).crossProduct(v1Half.subtractPosition(tVertex3))).abs() / 2); + return area; + } + + circumcenter = tVertex1.multiplyPosition(d1).addPosition(tVertex2.multiplyPosition(d2).addPosition(tVertex3.multiplyPosition(d3))); + + area.v1Area = (((v2Half.subtractPosition(tVertex1)).crossProduct(circumcenter.subtractPosition(tVertex1))).abs() / 2) + + (((v3Half.subtractPosition(tVertex1)).crossProduct(circumcenter.subtractPosition(tVertex1))).abs() / 2); + + area.v2Area = (((v3Half.subtractPosition(tVertex2)).crossProduct(circumcenter.subtractPosition(tVertex2))).abs() / 2) + + (((v1Half.subtractPosition(tVertex2)).crossProduct(circumcenter.subtractPosition(tVertex2))).abs() / 2); + + area.v3Area = (((v1Half.subtractPosition(tVertex3)).crossProduct(circumcenter.subtractPosition(tVertex3))).abs() / 2) + + (((v2Half.subtractPosition(tVertex3)).crossProduct(circumcenter.subtractPosition(tVertex3))).abs() / 2); + return area; + } + + /** + * Computes area of Voronoi region for all triangles + */ + private void initArrayOfTriangleVertexAreas() { + areas = new TriangleVertexAreas[triangles.length]; + for (int i = 0; i < areas.length; i++) { + areas[i] = computeTriangleVertexAreas(triangles[i]); + } + } + + /** + * Calculates angle of the triangle according to centerIndex + * + * @param centerIndex centerIndex + * @param t triangle + * @return angle + */ + private double calculateTriangleAlfa(int centerIndex, Triangle t) { + MeshPoint tVertex1 = facet.getVertices().get(t.vertex1); + MeshPoint tVertex2 = facet.getVertices().get(t.vertex2); + MeshPoint tVertex3 = facet.getVertices().get(t.vertex3); + + double alfaCos = 0; + + if (t.vertex1 == centerIndex) { + MeshPoint e1 = tVertex1.subtractPosition(tVertex3); + e1 = e1.dividePosition(e1.abs()); + + MeshPoint e2 = tVertex2.subtractPosition(tVertex3); + e2 = e2.dividePosition(e2.abs()); + + alfaCos = e1.dotProduct(e2); + } + else if (t.vertex2 == centerIndex) { + + MeshPoint e1 = tVertex2.subtractPosition(tVertex1); + e1 = e1.dividePosition(e1.abs()); + + MeshPoint e2 = tVertex3.subtractPosition(tVertex1); + e2 = e2.dividePosition(e2.abs()); + + alfaCos = e1.dotProduct(e2); + } + else if (t.vertex3 == centerIndex){ + MeshPoint e1 = tVertex3.subtractPosition(tVertex2); + e1 = e1.dividePosition(e1.abs()); + + MeshPoint e2 = tVertex1.subtractPosition(tVertex2); + e2 = e2.dividePosition(e2.abs()); + + alfaCos = e1.dotProduct(e2); + } + double alfa = Math.acos(alfaCos); + return 1 / Math.tan(alfa); + } + + /** + * Calculates angle of the triangle according to centerIndex + * + * @param centerIndex centerIndex + * @param t triangle + * @return angle + */ + private double calculateTriangleBeta(int centerIndex, Triangle t) { + MeshPoint tVertex1 = facet.getVertices().get(t.vertex1); + MeshPoint tVertex2 = facet.getVertices().get(t.vertex2); + MeshPoint tVertex3 = facet.getVertices().get(t.vertex3); + + double betaCos = 0; + + if (t.vertex1 == centerIndex) { + MeshPoint e1 = tVertex1.subtractPosition(tVertex2); + e1 = e1.dividePosition(e1.abs()); + + MeshPoint e2 = tVertex3.subtractPosition(tVertex2); + e2 = e2.dividePosition(e2.abs()); + + betaCos = e1.dotProduct(e2); + } + else if (t.vertex2 == centerIndex) { + + MeshPoint e1 = tVertex2.subtractPosition(tVertex3); + e1 = e1.dividePosition(e1.abs()); + + MeshPoint e2 = tVertex1.subtractPosition(tVertex3); + e2 = e2.dividePosition(e2.abs()); + + betaCos = e1.dotProduct(e2); + } + else if (t.vertex3 == centerIndex){ + MeshPoint e1 = tVertex3.subtractPosition(tVertex1); + e1 = e1.dividePosition(e1.abs()); + + MeshPoint e2 = tVertex2.subtractPosition(tVertex1); + e2 = e2.dividePosition(e2.abs()); + + betaCos = e1.dotProduct(e2); + } + double beta = Math.acos(betaCos); + return 1 / Math.tan(beta); + } + + /** + * Calculates Laplacian + * + * @param centerIndex centerIndex + * @return laplacian + */ + private MeshPoint calculateLaplacian(int centerIndex) { + List<Integer> trianglesNeighbours = getNeighbours(centerIndex); + + if (trianglesNeighbours.isEmpty()) { + 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); + for (int i = 0; i < trianglesNeighbours.size(); i++) { + Triangle t = triangles[trianglesNeighbours.get(i)]; + Triangle tNext = triangles[trianglesNeighbours.get((i + 1) % trianglesNeighbours.size())]; + double area = 0; + + MeshPoint tVertex1 = facet.getVertices().get(t.vertex1); + MeshPoint tVertex2 = facet.getVertices().get(t.vertex2); + MeshPoint tVertex3 = facet.getVertices().get(t.vertex3); + MeshPoint centerPoint = facet.getVertices().get(centerIndex); + + if (t.vertex1 == centerIndex) { + area = areas[trianglesNeighbours.get(i)].v1Area; + pointSum = pointSum.addPosition((tVertex2.subtractPosition(centerPoint)).multiplyPosition((calculateTriangleAlfa(centerIndex, t) + + calculateTriangleBeta(centerIndex, tNext)) / 2)); + + } + else if (t.vertex2 == centerIndex) { + area = areas[trianglesNeighbours.get(i)].v2Area; + pointSum = pointSum.addPosition((tVertex3.subtractPosition(centerPoint)).multiplyPosition((calculateTriangleAlfa(centerIndex, t) + + calculateTriangleBeta(centerIndex, tNext)) / 2)); + } + else if (t.vertex3 == centerIndex) { + area = areas[trianglesNeighbours.get(i)].v3Area; + pointSum = pointSum.addPosition((tVertex1.subtractPosition(centerPoint)).multiplyPosition((calculateTriangleAlfa(centerIndex, t) + + calculateTriangleBeta(centerIndex, tNext)) / 2)); + } + areaSum += area; + } + return pointSum.multiplyPosition(1 / areaSum); + } + + /** + * Gaussian curvature in a vertex of a triangle mesh. + * It can only be estimated beacuse triangle mesh is not a continuous + * but discrete representation of surface. + * + * @param centerIndex index of vertex in which gaussian curvature is computed + * @return Gaussian curvature in given vertex + */ + private double getGaussianCurvature(int centerIndex) { + + List<Integer> triangleNeighbours = this.getNeighbours(centerIndex); + + 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); + Triangle t = triangles[triangleNeighbours.get(i)]; + + MeshPoint tVertex1 = facet.getVertices().get(t.vertex1); + MeshPoint tVertex2 = facet.getVertices().get(t.vertex2); + MeshPoint tVertex3 = facet.getVertices().get(t.vertex3); + + double area = 0; + if (t.vertex1 == centerIndex) { + v1 = tVertex2.subtractPosition(tVertex1); + v2 = tVertex3.subtractPosition(tVertex1); + + area = areas[triangleNeighbours.get(i)].v1Area; + } + else if (t.vertex2 == centerIndex) { + v1 = tVertex1.subtractPosition(tVertex2); + v2 = tVertex3.subtractPosition(tVertex2); + + area = areas[triangleNeighbours.get(i)].v2Area; + } + else if (t.vertex3 == centerIndex) { + v1 = tVertex2.subtractPosition(tVertex3); + v2 = tVertex1.subtractPosition(tVertex3); + + area = areas[triangleNeighbours.get(i)].v3Area; + } + + areaSum += area; + v1 = v1.dividePosition(v1.abs()); + v2 = v2.dividePosition(v2.abs()); + + sum -= Math.acos(v1.dotProduct(v2)); + } + return sum * (1.0 / areaSum); + + } + + /** + * + * @param centerIndex center index + * @return mean curvature + */ + private double getMeanCurvature(int centerIndex) { + return calculateLaplacian(centerIndex).abs(); + } + + /** + * + * @param centerIndex center index + * @return max curvature + */ + private double getMaxCurvature(int centerIndex) { + double gaussianCurvature = getGaussianCurvature(centerIndex); + if (Double.isNaN(gaussianCurvature)) { + return Double.NaN; + } + double meanCurvature = getMeanCurvature(centerIndex); + double meanCurvatureSqr = meanCurvature * meanCurvature; + if (meanCurvatureSqr <= gaussianCurvature) { + return meanCurvature; + } + return meanCurvature + Math.sqrt(meanCurvatureSqr - gaussianCurvature); + } + + /** + * Computes votes for given plane + * + * @param plane Plane for which votes are computed + * @param curvatures significant curvatures chosen for computing + * @param points significant point 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, + ArrayList<Double> curvatures, + ArrayList<Integer> points, + double minCurvRatio, + double minAngleCos, + double minNormAngleCos, + double maxDist) { + + plane.normalize(); + + MeshPoint normal = new MeshPoint((new Vector3d(plane.a, plane.b, plane.c)),null, null); + double d = plane.d; + double maxCurvRatio = 1.0 / minCurvRatio; + int votes = 0; + MeshPoint[] normals = CalculateNormals(); + + for (int i = 0; i < curvatures.size(); i++) { + for (int j = 0; j < curvatures.size(); j++) { + if (i != j && (curvatures.get(i) / curvatures.get(j) >= minCurvRatio + && curvatures.get(i) / curvatures.get(j) <= maxCurvRatio)) { + + MeshPoint vec = facet.getVertices().get(points.get(i)).subtractPosition(facet.getVertices().get(points.get(j))); + vec = vec.dividePosition(vec.abs()); + 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); + + 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); + nj = nj.dividePosition(nj.abs()); + + MeshPoint normVec = ni.subtractPosition(nj); + normVec = normVec.dividePosition(normVec.abs()); + double normCos = normVec.dotProduct(normal); + + if (Math.abs(cos) >= minAngleCos && Math.abs(normCos) >= minNormAngleCos) { + MeshPoint avrg = (facet.getVertices().get(points.get(i)).addPosition(facet.getVertices().get(points.get(j)))).dividePosition(2.0); + + double dist = normal.getPosition().x * avrg.getPosition().x + + normal.getPosition().y * avrg.getPosition().y + normal.getPosition().z * avrg.getPosition().z + d; + + dist = Math.abs(dist); + + if (dist <= maxDist) { + votes++; + } + } + } + } + } + return votes; + } + + /** + * + * @param conf Configuration for computing + * @return approximate plane of symmtetry + */ + public Plane getAproxSymmetryPlane(Config conf) { + 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) { + curvatures[i] = this.getMaxCurvature(i); + } else { + curvatures[i] = this.getGaussianCurvature(i); + } + if (Double.isNaN(curvatures[i])){ + curvatures[i] = Double.MIN_VALUE; + } + } + ArrayList<Double> sortedCurvatures = new ArrayList<>(); + for (int i = 0; i < curvatures.length; i++) { + sortedCurvatures.add(curvatures[i]); + } + Collections.sort(sortedCurvatures); + + if(conf.getSignificantPointCount() > facet.getNumberOfVertices()) { + conf.setSignificantPointCount((facet.getNumberOfVertices()) - 1); + } + double bottomCurvature = sortedCurvatures.get(sortedCurvatures.size() - 1 - conf.getSignificantPointCount()); + + ArrayList<Integer> significantPoints = new ArrayList<>(); + ArrayList<Double> significantCurvatures = new ArrayList<>(); + + for (int i = 0; i < facet.getNumberOfVertices(); i++) { + if (curvatures[i] >= bottomCurvature) { + significantCurvatures.add(curvatures[i]); + significantPoints.add(i); + } + } + + Plane plane = new Plane(0, 0, 0, 0); + int lastVotes = 0; + + ProgressMonitor progressMonitor; + progressMonitor = new ProgressMonitor(panel, "Cunting...", + "Steps", 0, significantPoints.size()); + + double onePercent = significantCurvatures.size() / 100.0; + double percentsPerStep = 1 / onePercent; + for (int i = 0; i < significantPoints.size(); i++) { + for (int j = 0; j < significantPoints.size(); j++) { + if (i != j) { + double minRatio = conf.getMinCurvRatio(); + double maxRatio = 1.0 / minRatio; + if (significantCurvatures.get(i) / significantCurvatures.get(j) >= minRatio && significantCurvatures.get(i) / + significantCurvatures.get(j) <= maxRatio) { + + MeshPoint p1 = facet.getVertex(significantPoints.get(i)); + MeshPoint p2 = facet.getVertex(significantPoints.get(j)); + MeshPoint avrg = (p1.addPosition(p2)).dividePosition(2.0); + MeshPoint normal = (p1.subtractPosition(p2)); + + 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 = 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 = 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()) { + + Plane newPlane = new Plane(normal.getPosition().x, normal.getPosition().y, normal.getPosition().z, d); + int currentVotes = GetVotes( + newPlane, + significantCurvatures, + significantPoints, + 0.5, + conf.getMinAngleCos(), + conf.getMinNormAngleCos(), + boundingBox.getMaxDiag() * conf.getMaxRelDistance()); + + + planes.add(new AproxSymmetryPlane(newPlane, currentVotes)); + + if (currentVotes > lastVotes) { + lastVotes = currentVotes; + plane = newPlane; + } + } + + } + } + } + progressMonitor.setNote("Task step: " + (int) ((i + 1) * percentsPerStep)); + progressMonitor.setProgress(i); + }; + + Collections.sort(planes); + ArrayList<AproxSymmetryPlane> finalPlanes = new ArrayList<>(); + for (int i = 0; i < planes.size(); i++) { + if (planes.get(i).votes == lastVotes){ + finalPlanes.add(planes.get(i)); + } + } + 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); + 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); + if (normDir.dotProduct(refDir) < 0) { + finalPlane.a -= finalPlanes.get(i).a; + finalPlane.b -= finalPlanes.get(i).b; + finalPlane.c -= finalPlanes.get(i).c; + finalPlane.d -= finalPlanes.get(i).d; + } + else { + finalPlane.a += finalPlanes.get(i).a; + finalPlane.b += finalPlanes.get(i).b; + finalPlane.c += finalPlanes.get(i).c; + finalPlane.d += finalPlanes.get(i).d; + } + } + finalPlane.normalize(); + if (conf.isAveraging()){ + plane = finalPlane; + } + JOptionPane.showMessageDialog(frameMain, "Final plane: " + plane.a + " " + plane.b + " " + plane.c + " " + + plane.d + "\n" + "Votes: " + lastVotes, "Symmetry estimate done.", 0, + new ImageIcon(getClass().getResource("/cz/fidentis/analyst/gui/resources/exportedModel.png"))); + + progressMonitor.close(); + return plane; + } + + /** + * + * @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); + MeshPoint midPoint = boundingBox.getMidPoint(); + + double alpha = -((plane.a * midPoint.getPosition().x) + + (plane.b * midPoint.getPosition().y) + (plane.c * midPoint.getPosition().z) + + plane.d) / (normal.dotProduct(normal)); + + MeshPoint midPointOnPlane = midPoint.addPosition(normal.multiplyPosition(alpha)); + + double val = plane.a * midPointOnPlane.getPosition().x + plane.b * + midPointOnPlane.getPosition().y + plane.c * + 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)); + } + else { + a = normal.crossProduct(new MeshPoint(new Vector3d(0.0, 1.0, 0.0), null, null)); + } + a = a.dividePosition(a.abs()); + + MeshPoint b = normal.crossProduct(a); + b = b.dividePosition(b.abs()); + + + SymmetryCounter planeMesh = Plane.createPlaneMesh(midPointOnPlane, a, b, + (boundingBox.getMaxPoint().subtractPosition(boundingBox.getMinPoint())).getPosition().x); + + + return mergeMeshWith(planeMesh); + } + + /** + * + * @param s mesh that will be merged + * @return mesh with merged vertices from both meshes + */ + public SymmetryCounter mergeMeshWith(SymmetryCounter 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); + CornerTableRow row4 = new CornerTableRow(facet.getNumberOfVertices() + 2, -1); + CornerTableRow row5 = new CornerTableRow(facet.getNumberOfVertices() + 3, facet.getNumberOfVertices() + 1); + CornerTableRow row6 = new CornerTableRow(facet.getNumberOfVertices(), -1); + + facet.getCornerTable().addRow(row1); + facet.getCornerTable().addRow(row2); + facet.getCornerTable().addRow(row3); + facet.getCornerTable().addRow(row4); + facet.getCornerTable().addRow(row5); + facet.getCornerTable().addRow(row6); + + for(int n = 0; n < 4; n++) { + facet.addVertex(s.getFacet().getVertices().get(n)); + } + return this; + } +} diff --git a/GUI/src/main/java/cz/fidentis/analyst/symmetry/Triangle.java b/GUI/src/main/java/cz/fidentis/analyst/symmetry/Triangle.java new file mode 100644 index 00000000..6a7df8ba --- /dev/null +++ b/GUI/src/main/java/cz/fidentis/analyst/symmetry/Triangle.java @@ -0,0 +1,101 @@ +package cz.fidentis.analyst.symmetry; + +/** + * + * @author Natália Bebjaková + * + * Helping representation of triangle in symmetry estimate + */ + +public class Triangle { + protected int vertex1; + protected int vertex2; + protected int vertex3; + + /** + * Creates new triangle + * + * @param v1 first vertex + * @param v2 second vertex + * @param v3 third vertex + */ + public 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) { + Triangle t = (Triangle)obj; + if (((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 (true); + } + return (false); + } + + /** + * + * @return hascode of the triangle + */ + @Override + public int hashCode() { + return (this.vertex1 * 100 ^ this.vertex2 * 100 ^ this.vertex3); + } +} diff --git a/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/CornerTable.java b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/CornerTable.java index 1f2d0f65..a16d64f0 100644 --- a/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/CornerTable.java +++ b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/CornerTable.java @@ -1,8 +1,11 @@ package cz.fidentis.analyst.mesh.core; - import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; +/** + * Representation of mesh in memory + */ /** * Representation of mesh in memory using corner table * @@ -11,6 +14,25 @@ import java.util.List; public class CornerTable { private List<CornerTableRow> rows = new ArrayList<>(); + + /** + * Constructor of CornerTable + */ + public CornerTable() { + + } + + /** + * Copy constructor of CornerTable + * + * @param cornerTable copied CornerTable + */ + public CornerTable(CornerTable cornerTable) { + cornerTable.rows.forEach((row) -> { + rows.add(new CornerTableRow(row)); + }); + } + /** * returns index of face that contains corner. @@ -111,8 +133,8 @@ public class CornerTable { if (index < 0 || index > rows.size()) { return -2; } - int tipLeftCornerIndex=getIndexOfTipCornerOnLeft(index); - if (tipLeftCornerIndex==-1){ + int tipLeftCornerIndex = getIndexOfTipCornerOnLeft(index); + if (tipLeftCornerIndex == -1) { return -1; } @@ -156,4 +178,46 @@ public class CornerTable { public CornerTableRow getRow(int index) { return rows.get(index); } + + /** + * returns corners of specific vertex + * + * @param vertexIndex index of vertex + * @return list of rows of corner table + */ + public List<CornerTableRow> getCornersByVertexIndex(int vertexIndex) { + return rows.stream() + .filter(corner -> corner.getVertexIndex() == vertexIndex) + .collect(Collectors.toList()); + } + + /** + * returns list of indexes of faces that have a corner at specific vertex + * + * @param vertexIndex index of vertex + * @return list of indexes of faces + */ + public List<Integer> getTriangleIndexesByVertexIndex(int vertexIndex) { + return rows.stream() + .filter(corner -> corner.getVertexIndex() == vertexIndex) + .map(corner -> getIndexOfFace(rows.indexOf(corner))) + .collect(Collectors.toList()); + } + + /** + * returns indexes of vertices of triangle + * @param triangleIndex index of triangle + * @return list of indexes + */ + public List<Integer> getIndexesOfVerticesByTriangleIndex(int triangleIndex) { + List<Integer> indexes = new ArrayList<>(); + for (int i = 0; i < 3; i++) { + CornerTableRow row = getRow(triangleIndex + i); + indexes.add(row.getVertexIndex()); + } + return indexes; + } + } + + diff --git a/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/CornerTableRow.java b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/CornerTableRow.java index 07deb873..5eb7514f 100644 --- a/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/CornerTableRow.java +++ b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/CornerTableRow.java @@ -1,23 +1,27 @@ package cz.fidentis.analyst.mesh.core; /** - * single row in corner table * - * @author Matej Lukes + * @author Matej LukeÅ¡ */ public class CornerTableRow { private int oppositeCornerIndex; private int vertexIndex; - /** - * Constructor of a row in corner - * @param vertexIndex index of associated vertex in MashFacet - * @param oppositeCornerIndex index of the opposite corner, -1 if there is no opposite corner - */ public CornerTableRow(int vertexIndex, int oppositeCornerIndex) { this.vertexIndex = vertexIndex; this.oppositeCornerIndex = oppositeCornerIndex; } + /** + * Copy constructor of a row in corner + * + * @param cornerTableRow copied row + */ + public CornerTableRow(CornerTableRow cornerTableRow) { + this.vertexIndex = cornerTableRow.getVertexIndex(); + this.oppositeCornerIndex = cornerTableRow.getOppositeCornerIndex(); + } + /** * returns vertex of corner @@ -35,10 +39,6 @@ public class CornerTableRow { return oppositeCornerIndex; } - /** - * sets index of the opposite corner - * @param index index of the opposite corner in corner table - */ public void setOppositeCornerIndex(int index) { this.oppositeCornerIndex = index; } diff --git a/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshFacet.java b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshFacet.java index 74328019..285d0dd0 100644 --- a/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshFacet.java +++ b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshFacet.java @@ -2,55 +2,54 @@ package cz.fidentis.analyst.mesh.core; import java.util.ArrayList; import java.util.List; - /** - * MashFacet - * - * @author Matej Lukes + * + * @author Matej LukeÅ¡ */ + public class MeshFacet { private List<MeshPoint> vertices = new ArrayList<>(); private CornerTable cornerTable = new CornerTable(); /** - * returns vertex of specified index - * @param index index of vertex - * @return vertex + * Constructor of MeshFacet */ - public MeshPoint getVertex(int index) { - return vertices.get(index); + public MeshFacet() { + cornerTable = new CornerTable(); } /** - * adds vertex to MeshFacet - * @param point new vertex + * Copy constructor of MeshFacet + * + * @param facet copied MeshFacet */ + public MeshFacet(MeshFacet facet) { + for (MeshPoint vertex : + facet.vertices) { + vertices.add(new MeshPoint(vertex)); + } + cornerTable = new CornerTable(facet.cornerTable); + } + + + public MeshPoint getVertex(int c) { + return vertices.get(c); + } // vertex of c + public void addVertex(MeshPoint point){ vertices.add(point); } - /** - * returns number of vertices in MeshFacet - * @return number of vertices - */ public int getNumberOfVertices() { return vertices.size(); } - /** - * returns list of vertices in MeshFacet - * @return list if vertices - */ - public List<MeshPoint> getVertices() { - return vertices; - } - - /** - * returns Corner Table representing MeshFacet - * @return corner table - */ public CornerTable getCornerTable() { return cornerTable; } + + public List<MeshPoint> getVertices(){ + return vertices; + } + } - diff --git a/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshModel.java b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshModel.java index 7966434f..9d389325 100644 --- a/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshModel.java +++ b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshModel.java @@ -4,26 +4,31 @@ import java.util.ArrayList; import java.util.List; /** - * MeshModel is a root node of the hierarchy * - * @author Matej Lukes + * @author Metej LukeÅ¡ */ public class MeshModel { + public MeshModel() {} + private List<MeshFacet> facets = new ArrayList<>(); - /** - * returns list of MeshFacets - * @return list of MeshFacets - */ public List<MeshFacet> getFacets() { return facets; } /** - * adds new MeshFacet to the model - * @param facet new MeshFacet + * Copy constructor of MeshModel + * + * @param meshModel copied MeshModel */ + public MeshModel(MeshModel meshModel) { + meshModel.facets.forEach((facet) -> { + facets.add(new MeshFacet(facet)); + }); + } + public void addFacet(MeshFacet facet) { facets.add(facet); } + } 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 159f1ea5..73d74d4b 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 @@ -1,26 +1,17 @@ package cz.fidentis.analyst.mesh.core; - import javax.vecmath.Vector3d; /** - * MeshPoint represents a point with position, normal, and texture coordinates * - * @author Matej Lukes + * @author Matej LukeÅ¡ */ +//prerobenee public class MeshPoint { - private final Vector3d position, normal, texCoord; + protected Vector3d position, normal, texCoord; - /** - * constructor of meshPoint - * - * @param position position of MeshPoint - * @param normal normal of MeshPoint - * @param texCoord coordinates in texture - */ - public MeshPoint(Vector3d position, Vector3d normal, Vector3d texCoord) { - if (position == null) { + public MeshPoint(Vector3d position, Vector3d normal , Vector3d texCoord) { + if (position == null) throw new NullPointerException("position cannot be null"); - } this.position = position; this.normal = normal; @@ -47,7 +38,40 @@ public class MeshPoint { public Vector3d getTexCoord() { return texCoord; } + + /** + * copy constructor of meshPoint + * @param meshPoint copied meshPoint + */ + public MeshPoint(MeshPoint meshPoint) { + this.position = new Vector3d(meshPoint.position); + if (meshPoint.normal != null) { + this.normal = new Vector3d(meshPoint.normal); + } + if (meshPoint.texCoord != null) { + this.texCoord = new Vector3d(meshPoint.texCoord); + } + } + + + /** + * @param obj compared object + * @return true if positions, normals and texture coordinates are equal, false otherwise + */ + @Override + public boolean equals(Object obj) { + if (!(obj instanceof MeshPoint)) + return false; + + MeshPoint meshPointObj = (MeshPoint) obj; + return this.position.equals(meshPointObj.position); + } + @Override + public int hashCode() { + return position.hashCode(); + } + /** * returns new instance of MeshPoint with subtracted position * @@ -55,7 +79,7 @@ public class MeshPoint { * @return subtracted MeshPoint */ public MeshPoint subtractPosition(MeshPoint subtrahend) { - return subtractPosition(subtrahend.position); + return MeshPoint.this.subtractPosition(subtrahend.position); } /** @@ -67,7 +91,13 @@ public class MeshPoint { public MeshPoint subtractPosition(Vector3d subtrahend) { Vector3d newPosition = new Vector3d(position); newPosition.sub(subtrahend); - return new MeshPoint(new Vector3d(newPosition), normal, new Vector3d(texCoord)); + if (normal != null) { + if (texCoord != null) + return new MeshPoint(new Vector3d(newPosition), new Vector3d(normal), new Vector3d(texCoord)); + else + return new MeshPoint(new Vector3d(newPosition), new Vector3d(normal), null); + } + return new MeshPoint(new Vector3d(newPosition), null, null); } /** @@ -77,7 +107,7 @@ public class MeshPoint { * @return added MeshPoint */ public MeshPoint addPosition(MeshPoint addend) { - return addPosition(addend.position); + return MeshPoint.this.addPosition(addend.position); } /** @@ -89,78 +119,90 @@ public class MeshPoint { public MeshPoint addPosition(Vector3d addend) { Vector3d newPosition = new Vector3d(position); newPosition.add(addend); - return new MeshPoint(new Vector3d(newPosition), normal, new Vector3d(texCoord)); - } - - /** - * returns new instance of MeshPoint with subtracted normal - * - * @param subtrahend normal to be subtracted - * @return subtracted MeshPoint - */ - public MeshPoint subtractNormal(MeshPoint subtrahend) { - return subtractNormal(subtrahend.normal); - } - - /** - * returns new instance of MeshPoint with subtracted normal - * - * @param subtrahend normal to be subtracted - * @return subtracted MeshPoint - */ - public MeshPoint subtractNormal(Vector3d subtrahend) { - Vector3d newNormal = new Vector3d(normal); - newNormal.sub(subtrahend); - newNormal.normalize(); - return new MeshPoint(new Vector3d(position), newNormal, new Vector3d(texCoord)); + if (normal != null) { + if (texCoord != null) + return new MeshPoint(new Vector3d(newPosition), new Vector3d(normal), new Vector3d(texCoord)); + else + return new MeshPoint(new Vector3d(newPosition), new Vector3d(normal), null); + } + return new MeshPoint(new Vector3d(newPosition), null, null); } - /** - * returns new instance of MeshPoint with added normal - * - * @param addend normal to be added - * @return added MeshPoint - */ - public MeshPoint addNormal(MeshPoint addend) { - return addNormal(addend.normal); + /*public MeshPoint addPosition(MeshPoint b) { + return (new MeshPoint(new Vector3d(this.getPosition().x + b.getPosition().x, + this.getPosition().y + b.getPosition().y, this.getPosition().z + b.getPosition().z), + null, null)); + }*/ + + /* public MeshPoint subtractPosition(MeshPoint b) { + return (new MeshPoint(new Vector3d(this.getPosition().x - b.getPosition().x, + this.getPosition().y - b.getPosition().y, this.getPosition().z - b.getPosition().z), + null, null)); + }*/ + + public MeshPoint multiplyPosition(double number) { + if (normal != null) { + if (texCoord != null) + return new MeshPoint(new Vector3d(this.getPosition().x * number, + this.getPosition().y * number, this.getPosition().z * number), + new Vector3d(normal), new Vector3d(texCoord)); + else + return new MeshPoint(new Vector3d(this.getPosition().x * number, + this.getPosition().y * number, this.getPosition().z * number), + new Vector3d(normal), null); + } + return new MeshPoint(new Vector3d(this.getPosition().x * number, + this.getPosition().y * number, this.getPosition().z * number), + null, null); } - - /** - * returns new instance of MeshPoint with added normal - * - * @param addend normal to be added - * @return added MeshPoint - */ - public MeshPoint addNormal(Vector3d addend) { - Vector3d newNormal = new Vector3d(normal); - newNormal.add(addend); - newNormal.normalize(); - return new MeshPoint(new Vector3d(position), newNormal, new Vector3d(texCoord)); + + public MeshPoint dividePosition(double number) { + if (normal != null) { + if (texCoord != null) + return new MeshPoint(new Vector3d(this.getPosition().x / number, this.getPosition().y / number, + this.getPosition().z / number), new Vector3d(normal), new Vector3d(texCoord)); + else + return new MeshPoint(new Vector3d(this.getPosition().x / number, this.getPosition().y / number, + this.getPosition().z / number), new Vector3d(normal), null); + } + return new MeshPoint(new Vector3d(this.getPosition().x / number, this.getPosition().y / number, + this.getPosition().z / number), null, null); } - - /** - * @param obj compared object - * @return true if positions, normals and texture coordinates are equal, false otherwise + + /** + * Returns the cross product of two points. + @param meshPoint Second argument of the cross product operation. + * @return + @returns Point3D representing the resulting vector. */ - @Override - public boolean equals(Object obj) { - if (!(obj instanceof MeshPoint)) { - return false; + public MeshPoint crossProduct(MeshPoint meshPoint) { + if (normal != null) { + if (texCoord != null) + return new MeshPoint(new Vector3d + (this.position.y * meshPoint.position.z - this.position.z * meshPoint.position.y, + this.position.z * meshPoint.position.x - this.position.x * meshPoint.position.z, + this.position.x * meshPoint.position.y - this.position.y * meshPoint.position.x), + new Vector3d(normal), new Vector3d(texCoord)); + else + return new MeshPoint(new Vector3d + (this.position.y * meshPoint.position.z - this.position.z * meshPoint.position.y, + this.position.z * meshPoint.position.x - this.position.x * meshPoint.position.z, + this.position.x * meshPoint.position.y - this.position.y * meshPoint.position.x), + new Vector3d(normal), null); } - - MeshPoint meshPointObj = (MeshPoint) obj; - return this.position.equals(meshPointObj.position) - && this.normal.equals(meshPointObj.normal) - && this.texCoord.equals(meshPointObj.texCoord); + return new MeshPoint(new Vector3d + (this.position.y * meshPoint.position.z - this.position.z * meshPoint.position.y, + this.position.z * meshPoint.position.x - this.position.x * meshPoint.position.z, + this.position.x * meshPoint.position.y - this.position.y * meshPoint.position.x), + null, null); } - /** - * returns hash of MeshPoint - * - * @return hash - */ - @Override - public int hashCode() { - return position.hashCode() + normal.hashCode() + texCoord.hashCode(); + public double dotProduct(MeshPoint meshPoint) { + return (this.position.x * meshPoint.position.x + this.position.y * meshPoint.position.y + this.position.z * meshPoint.position.z); + } + + public double abs() { + return Math.sqrt(this.getPosition().x * this.getPosition().x + + this.getPosition().y * this.getPosition().y + this.getPosition().z * this.getPosition().z); } } 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 new file mode 100644 index 00000000..c91805e2 --- /dev/null +++ b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/io/MeshModelExporter.java @@ -0,0 +1,221 @@ +package cz.fidentis.analyst.mesh.io; +/** + * + * @author Natália Bebjaková + * + * 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 + */ + private class Triangle { + protected int vertex1; + protected int vertex2; + protected int vertex3; + + /** + * Creates new triangle + * + * @param v1 first vertex + * @param v2 second vertex + * @param v3 third vertex + */ + public 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) { + Triangle t = (Triangle)obj; + if (((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 (true); + } + return (false); + } + + /** + * + * @return hascode of the triangle + */ + @Override + public int hashCode() { + return (this.vertex1 * 100 ^ this.vertex2 * 100 ^ this.vertex3); + } + } + + /** + * Model to be exported + */ + MeshModel model; + + /** + * + * @param model model to be exported. + */ + public MeshModelExporter(MeshModel model) { + this.model = model; + } + + /** + * + * @param exportFile + * @throws IOException + */ + 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 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); + } + + File exportDirectory = new File(exportFile.getParent() + File.separator + fileName); //directory for export + exportDirectory.mkdir(); //creates new directory + + exportFile = new File(exportDirectory + File.separator + fileName + ".obj"); + + try (FileWriter fstream = new FileWriter(exportFile); + BufferedWriter out = new BufferedWriter(fstream);) { + + 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 + 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("\n"); + out.close(); + fstream.close(); + } + } +} + diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/ModelFileFilter.java b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/io/ModelFileFilter.java similarity index 50% rename from GUI/src/main/java/cz/fidentis/analyst/gui/ModelFileFilter.java rename to MeshModel/src/main/java/cz/fidentis/analyst/mesh/io/ModelFileFilter.java index 7fc0b83c..f8711327 100644 --- a/GUI/src/main/java/cz/fidentis/analyst/gui/ModelFileFilter.java +++ b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/io/ModelFileFilter.java @@ -1,39 +1,50 @@ -package cz.fidentis.analyst.gui; +package cz.fidentis.analyst.mesh.io; import java.io.File; import javax.swing.filechooser.FileFilter; /** - * * @author Natalia Bebjakova + * + * Enables to choose just extensions we want in the filechooser */ public class ModelFileFilter extends FileFilter { - private String[] extension; - private String description; - + private final String[] extension; + private final String description; + + /** + * + * @param extension Extentions of files + * @param description Description + */ public ModelFileFilter(String[] extension, String description) { this.extension = extension; this.description = description; } + /** + * + * @param f File + * @return Whether file has chosen extension or not + */ @Override 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 (int i = 0; i< extension.length; i++) { + if(f.isDirectory() || f.getName().endsWith(extension[i])) { accepted = true; } } return accepted; } - - /* - * @see javax.swing.filechooser.FileFilter + + /** + * + * @return description */ - @Override public String getDescription() { return description; -- GitLab