From bee0b13a9976d22b574fecf16a6b9fe5fa8fc6d5 Mon Sep 17 00:00:00 2001 From: ray_amcax <13692933+ray-amcax@user.noreply.gitee.com> Date: Thu, 28 Mar 2024 14:52:22 +0800 Subject: [PATCH 1/3] A new release 43557e4f3d53dbd3612788448250b3fc885a3cf0 --- commit_log | 1 + 1 file changed, 1 insertion(+) diff --git a/commit_log b/commit_log index a67fcc4..b33c83f 100644 --- a/commit_log +++ b/commit_log @@ -1,3 +1,4 @@ 8967ea0e47b4783030f616e6294988237006bdd5 6a09d79592f7e3b8f8178d892cdad2a6b989da05 b4ded3f37f1eee358b42567df08f23aa78d870dd +43557e4f3d53dbd3612788448250b3fc885a3cf0 -- Gitee From d20e7f7da13ac33a4e28a331606bfc0fede706bc Mon Sep 17 00:00:00 2001 From: ray-amcax <13692933+ray-amcax@user.noreply.gitee.com> Date: Thu, 28 Mar 2024 17:05:51 +0800 Subject: [PATCH 2/3] mesh modeling & T-mesh spline modeling --- .gitignore | 515 +--- CMakeLists.txt | 56 +- CMakeSettings.json | 11 + README.md | 15 +- README.zh_cn.md | 15 +- Resources/Resource.qrc | 26 + Resources/images/BridgeEdge.png | Bin 0 -> 2731 bytes Resources/images/CollapseEdge.png | Bin 0 -> 3367 bytes Resources/images/Crease.png | Bin 0 -> 3224 bytes Resources/images/DeleteFace.png | Bin 0 -> 3052 bytes Resources/images/DeleteObject.png | Bin 0 -> 3180 bytes Resources/images/EmbedFace.png | Bin 0 -> 1746 bytes Resources/images/ExtrudeEdgeHorizontal.png | Bin 0 -> 2347 bytes Resources/images/ExtrudeEdgeVertical.png | Bin 0 -> 2208 bytes Resources/images/FillHole.png | Bin 0 -> 4607 bytes Resources/images/MeshTriangulation.png | Bin 0 -> 1945 bytes Resources/images/Mirror.png | Bin 0 -> 4156 bytes Resources/images/QuadSphere.png | Bin 0 -> 3695 bytes Resources/images/RCrease.png | Bin 0 -> 3119 bytes Resources/images/Repair.png | Bin 0 -> 2767 bytes Resources/images/ReverseNormal.png | Bin 0 -> 1926 bytes Resources/images/Separate.png | Bin 0 -> 1630 bytes Resources/images/SplitEdgeOnly.png | Bin 0 -> 1119 bytes Resources/images/SplitFace.png | Bin 0 -> 3701 bytes Resources/images/SplitFace1.png | Bin 0 -> 1664 bytes Resources/images/SplitLoop.png | Bin 0 -> 2067 bytes Resources/images/SubdiveCC.png | Bin 0 -> 2315 bytes Resources/images/SubdiveLoop.png | Bin 0 -> 2026 bytes Resources/images/SwapEdge.png | Bin 0 -> 1989 bytes Resources/images/Thicken.png | Bin 0 -> 3726 bytes Resources/images/Uniform.png | Bin 0 -> 2683 bytes Resources/images/Weld.png | Bin 0 -> 1201 bytes Resources/images/test.png | Bin 0 -> 55714 bytes Src/Core/ACAMCore.cpp | 626 ++-- Src/Core/ACAMCore.h | 65 +- Src/Core/ACAMCoreCreate.cpp | 419 ++- Src/Core/ACAMCoreFile.cpp | 296 +- Src/Core/CoreDefine.h | 247 +- Src/Core/DataManager.cpp | 81 +- Src/Core/DataManager.h | 86 +- Src/Core/SelectInfo.h | 320 +- Src/Core/UndoManage.cpp | 199 ++ Src/Core/UndoManage.h | 89 + Src/Core/UndoRedoHandler.cpp | 96 +- Src/Object/AdapterObject.cpp | 504 ++++ Src/Object/AdapterObject.h | 82 + Src/Object/AdapterObjectParent.cpp | 8 + Src/Object/AdapterObjectParent.h | 33 + Src/Object/AxisObject.cpp | 130 +- Src/Object/AxisObject.h | 174 +- Src/Object/BRepObject.cpp | 145 +- Src/Object/BRepObject.h | 53 +- Src/Object/BaseObject.cpp | 250 +- Src/Object/BaseObject.h | 164 +- Src/Object/MeshObject.cpp | 536 ++++ Src/Object/MeshObject.h | 172 ++ Src/Object/ObjectDefine.h | 15 +- Src/Object/ObjectType.h | 35 +- Src/Object/PlaneObject.cpp | 20 +- Src/Object/TSplineObject.cpp | 418 +++ Src/Object/TSplineObject.h | 110 + Src/ObjectDraw/AxisObjectDraw.cpp | 118 +- Src/ObjectDraw/AxisObjectDraw.h | 52 +- Src/ObjectDraw/BrepObjectDraw.cpp | 1011 ++++--- Src/ObjectDraw/BrepObjectDraw.h | 101 +- Src/ObjectDraw/MeshObjectDraw.cpp | 420 +++ Src/ObjectDraw/MeshObjectDraw.h | 51 + Src/ObjectDraw/ObjectDraw.cpp | 118 +- Src/ObjectDraw/ObjectDraw.h | 111 +- Src/ObjectDraw/TSplineObjectDraw.cpp | 748 +++++ Src/ObjectDraw/TSplineObjectDraw.h | 77 + Src/Operation/CreateOperate_Builder.cpp | 982 +++--- Src/Operation/CreateOperate_Builder.h | 320 +- Src/Operation/CreateOperate_Circular.cpp | 29 +- Src/Operation/CreateOperate_Circular.h | 36 +- .../CreateOperate_CircularTSpline.cpp | 30 + Src/Operation/CreateOperate_CircularTSpline.h | 42 + Src/Operation/CreateOperate_Cone.cpp | 78 +- Src/Operation/CreateOperate_Cone.h | 66 +- Src/Operation/CreateOperate_ConeTSpline.cpp | 28 + Src/Operation/CreateOperate_ConeTSpline.h | 43 + Src/Operation/CreateOperate_Cube.cpp | 52 +- Src/Operation/CreateOperate_Cube.h | 36 +- Src/Operation/CreateOperate_CubeMesh.cpp | 29 + Src/Operation/CreateOperate_CubeMesh.h | 36 + Src/Operation/CreateOperate_CubeTSpline.cpp | 34 + Src/Operation/CreateOperate_CubeTSpline.h | 36 + Src/Operation/CreateOperate_Cylinder.cpp | 68 +- Src/Operation/CreateOperate_Cylinder.h | 46 +- .../CreateOperate_CylinderTSpline.cpp | 28 + Src/Operation/CreateOperate_CylinderTSpline.h | 49 + Src/Operation/CreateOperate_Plane.cpp | 50 +- Src/Operation/CreateOperate_Plane.h | 36 +- Src/Operation/CreateOperate_PlaneMesh.cpp | 49 + Src/Operation/CreateOperate_PlaneMesh.h | 37 + Src/Operation/CreateOperate_PlaneTSpline.cpp | 50 + Src/Operation/CreateOperate_PlaneTSpline.h | 37 + Src/Operation/CreateOperate_Polygon.cpp | 22 +- Src/Operation/CreateOperate_Polygon.h | 32 +- Src/Operation/CreateOperate_Prism.cpp | 22 +- Src/Operation/CreateOperate_Prism.h | 34 +- .../CreateOperate_QuadballTSpline.cpp | 24 + Src/Operation/CreateOperate_QuadballTSpline.h | 26 + .../CreateOperate_RoundedPolygon.cpp | 87 +- Src/Operation/CreateOperate_RoundedPolygon.h | 36 +- Src/Operation/CreateOperate_RoundedPrism.cpp | 95 +- Src/Operation/CreateOperate_RoundedPrism.h | 36 +- Src/Operation/CreateOperate_SingleFace.cpp | 30 +- Src/Operation/CreateOperate_SingleFace.h | 35 +- .../CreateOperate_SingleFaceMesh.cpp | 28 + Src/Operation/CreateOperate_SingleFaceMesh.h | 34 + .../CreateOperate_SingleFaceTSpline.cpp | 34 + .../CreateOperate_SingleFaceTSpline.h | 34 + Src/Operation/CreateOperate_Sphere.cpp | 18 +- Src/Operation/CreateOperate_Sphere.h | 44 +- Src/Operation/CreateOperate_SphereTSpline.cpp | 49 + Src/Operation/CreateOperate_SphereTSpline.h | 38 + Src/Operation/CreateOperate_Torus.cpp | 18 +- Src/Operation/CreateOperate_Torus.h | 44 +- Src/Operation/CreateOperate_TorusTSpline.cpp | 28 + Src/Operation/CreateOperate_TorusTSpline.h | 42 + Src/Operation/CreateOperate_Wedge.cpp | 153 +- Src/Operation/CreateOperate_Wedge.h | 86 +- Src/Operation/MOperate.cpp | 50 +- Src/Operation/MOperate.h | 45 +- Src/Operation/MOperate_Select.cpp | 87 +- Src/Operation/MOperate_Select.h | 28 +- Src/Operation/MOperate_SelectCloset.cpp | 114 + Src/Operation/MOperate_SelectCloset.h | 36 + Src/Operation/MOperate_SelectInfo.h | 54 +- Src/Operation/MOperate_getBoundingBox.cpp | 89 +- Src/Operation/MOperate_getBoundingBox.h | 44 +- Src/Operation/MOperate_getCenter.cpp | 69 +- Src/Operation/MOperate_getCenter.h | 50 +- Src/Operation/MOperate_getDirection.cpp | 121 +- Src/Operation/MOperate_getDirection.h | 42 +- Src/Operation/MultOperate.cpp | 22 +- Src/Operation/MultOperate.h | 18 +- Src/Operation/MultOperate_BoolCommon.cpp | 34 +- Src/Operation/MultOperate_BoolCommon.h | 14 +- Src/Operation/MultOperate_BoolCut.cpp | 30 +- Src/Operation/MultOperate_BoolCut.h | 14 +- Src/Operation/MultOperate_BoolFuse.cpp | 35 +- Src/Operation/MultOperate_BoolFuse.h | 14 +- Src/Operation/MultOperate_Combine.cpp | 78 +- Src/Operation/MultOperate_Combine.h | 14 +- Src/Operation/OperationDefine.h | 46 +- Src/Operation/SGLOperate_Bridge.cpp | 60 + Src/Operation/SGLOperate_Bridge.h | 21 + Src/Operation/SGLOperate_ChamferEdge.cpp | 61 +- Src/Operation/SGLOperate_ChamferEdge.h | 32 +- Src/Operation/SGLOperate_Crease.cpp | 27 + Src/Operation/SGLOperate_Crease.h | 20 + Src/Operation/SGLOperate_CreaseRemove.cpp | 26 + Src/Operation/SGLOperate_CreaseRemove.h | 20 + Src/Operation/SGLOperate_DeleteElement.cpp | 96 + Src/Operation/SGLOperate_DeleteElement.h | 21 + Src/Operation/SGLOperate_EmbedFace.cpp | 112 + Src/Operation/SGLOperate_EmbedFace.h | 35 + Src/Operation/SGLOperate_ExtrudeEdge.cpp | 216 ++ Src/Operation/SGLOperate_ExtrudeEdge.h | 47 + Src/Operation/SGLOperate_ExtrudeFace.cpp | 146 + Src/Operation/SGLOperate_ExtrudeFace.h | 28 + Src/Operation/SGLOperate_ExtrudeShape.cpp | 44 +- Src/Operation/SGLOperate_ExtrudeShape.h | 14 +- Src/Operation/SGLOperate_FillHole.cpp | 54 + Src/Operation/SGLOperate_FillHole.h | 21 + Src/Operation/SGLOperate_FilletEdge.cpp | 46 +- Src/Operation/SGLOperate_FilletEdge.h | 14 +- Src/Operation/SGLOperate_Repair.cpp | 22 + Src/Operation/SGLOperate_Repair.h | 21 + Src/Operation/SGLOperate_ReverseNormal.cpp | 40 + Src/Operation/SGLOperate_ReverseNormal.h | 22 + Src/Operation/SGLOperate_Separate.cpp | 47 + Src/Operation/SGLOperate_Separate.h | 21 + Src/Operation/SGLOperate_SplitFace.cpp | 29 + Src/Operation/SGLOperate_SplitFace.h | 20 + Src/Operation/SGLOperate_SplitFaceByEdge.cpp | 86 + Src/Operation/SGLOperate_SplitFaceByEdge.h | 26 + Src/Operation/SGLOperate_SplitFaceVertex.cpp | 61 + Src/Operation/SGLOperate_SplitFaceVertex.h | 21 + Src/Operation/SGLOperate_SplitLoop.cpp | 95 + Src/Operation/SGLOperate_SplitLoop.h | 26 + Src/Operation/SGLOperate_Thicken.cpp | 45 + Src/Operation/SGLOperate_Thicken.h | 35 + Src/Operation/SGLOperate_TriangulateMesh.cpp | 33 + Src/Operation/SGLOperate_TriangulateMesh.h | 35 + Src/Operation/SGLOperate_Uniform.cpp | 32 + Src/Operation/SGLOperate_Uniform.h | 21 + Src/Operation/SGLOperate_WeldEdge.cpp | 55 + Src/Operation/SGLOperate_WeldEdge.h | 21 + Src/Windows/ACAMWindow.cpp | 563 +++- Src/Windows/ACAMWindow.h | 102 +- Src/Windows/OperateToolbar.cpp | 164 +- Src/Windows/OperateViewer.cpp | 1 + Src/Windows/OperateViewer.h | 35 + Src/Windows/ParamDialog.h | 847 +++--- Src/Windows/QGLViewer/camera.cpp | 1541 +++++----- Src/Windows/QGLViewer/qglviewer.cpp | 1836 +++++------ Src/Windows/RenderViewer.cpp | 2674 ++++++++++------- Src/Windows/RenderViewer.h | 529 ++-- Src/Windows/RenderViewerDraw.cpp | 378 ++- Src/Windows/RenderViewerOps.cpp | 62 +- Src/Windows/RenderViewerOpsBRep.cpp | 454 +-- Src/Windows/SelectTool.cpp | 683 ++--- Src/Windows/SelectTool.h | 172 +- .../FreeGLUT/x64-Debug/bin/freeglutd.dll | Bin 0 -> 435712 bytes .../FreeGLUT/x64-Debug/bin/freeglutd.pdb | Bin 0 -> 1642496 bytes .../FreeGLUT/x64-Debug/include/GL/freeglut.h | 22 + .../x64-Debug/include/GL/freeglut_ext.h | 295 ++ .../x64-Debug/include/GL/freeglut_std.h | 653 ++++ .../x64-Debug/include/GL/freeglut_ucall.h | 113 + .../lib/cmake/FreeGLUT/FreeGLUTConfig.cmake | 1 + .../FreeGLUT/FreeGLUTConfigVersion.cmake | 48 + .../FreeGLUT/FreeGLUTTargets-debug.cmake | 29 + .../lib/cmake/FreeGLUT/FreeGLUTTargets.cmake | 108 + .../x64-Debug/lib/freeglut_staticd.lib | Bin 0 -> 1257268 bytes .../FreeGLUT/x64-Debug/lib/freeglutd.lib | Bin 0 -> 46048 bytes .../x64-Debug/lib/pkgconfig/freeglut.pc | 10 + .../FreeGLUT/x64-Release/bin/freeglut.dll | Bin 0 -> 322048 bytes .../x64-Release/include/GL/freeglut.h | 22 + .../x64-Release/include/GL/freeglut_ext.h | 295 ++ .../x64-Release/include/GL/freeglut_std.h | 653 ++++ .../x64-Release/include/GL/freeglut_ucall.h | 113 + .../lib/cmake/FreeGLUT/FreeGLUTConfig.cmake | 1 + .../FreeGLUT/FreeGLUTConfigVersion.cmake | 48 + .../FreeGLUTTargets-relwithdebinfo.cmake | 29 + .../lib/cmake/FreeGLUT/FreeGLUTTargets.cmake | 108 + .../FreeGLUT/x64-Release/lib/freeglut.lib | Bin 0 -> 45834 bytes .../x64-Release/lib/freeglut_static.lib | Bin 0 -> 1511128 bytes .../x64-Release/lib/pkgconfig/freeglut.pc | 10 + 231 files changed, 19235 insertions(+), 8761 deletions(-) create mode 100644 Resources/images/BridgeEdge.png create mode 100644 Resources/images/CollapseEdge.png create mode 100644 Resources/images/Crease.png create mode 100644 Resources/images/DeleteFace.png create mode 100644 Resources/images/DeleteObject.png create mode 100644 Resources/images/EmbedFace.png create mode 100644 Resources/images/ExtrudeEdgeHorizontal.png create mode 100644 Resources/images/ExtrudeEdgeVertical.png create mode 100644 Resources/images/FillHole.png create mode 100644 Resources/images/MeshTriangulation.png create mode 100644 Resources/images/Mirror.png create mode 100644 Resources/images/QuadSphere.png create mode 100644 Resources/images/RCrease.png create mode 100644 Resources/images/Repair.png create mode 100644 Resources/images/ReverseNormal.png create mode 100644 Resources/images/Separate.png create mode 100644 Resources/images/SplitEdgeOnly.png create mode 100644 Resources/images/SplitFace.png create mode 100644 Resources/images/SplitFace1.png create mode 100644 Resources/images/SplitLoop.png create mode 100644 Resources/images/SubdiveCC.png create mode 100644 Resources/images/SubdiveLoop.png create mode 100644 Resources/images/SwapEdge.png create mode 100644 Resources/images/Thicken.png create mode 100644 Resources/images/Uniform.png create mode 100644 Resources/images/Weld.png create mode 100644 Resources/images/test.png create mode 100644 Src/Core/UndoManage.cpp create mode 100644 Src/Core/UndoManage.h create mode 100644 Src/Object/AdapterObject.cpp create mode 100644 Src/Object/AdapterObject.h create mode 100644 Src/Object/AdapterObjectParent.cpp create mode 100644 Src/Object/AdapterObjectParent.h create mode 100644 Src/Object/MeshObject.cpp create mode 100644 Src/Object/MeshObject.h create mode 100644 Src/Object/TSplineObject.cpp create mode 100644 Src/Object/TSplineObject.h create mode 100644 Src/ObjectDraw/MeshObjectDraw.cpp create mode 100644 Src/ObjectDraw/MeshObjectDraw.h create mode 100644 Src/ObjectDraw/TSplineObjectDraw.cpp create mode 100644 Src/ObjectDraw/TSplineObjectDraw.h create mode 100644 Src/Operation/CreateOperate_CircularTSpline.cpp create mode 100644 Src/Operation/CreateOperate_CircularTSpline.h create mode 100644 Src/Operation/CreateOperate_ConeTSpline.cpp create mode 100644 Src/Operation/CreateOperate_ConeTSpline.h create mode 100644 Src/Operation/CreateOperate_CubeMesh.cpp create mode 100644 Src/Operation/CreateOperate_CubeMesh.h create mode 100644 Src/Operation/CreateOperate_CubeTSpline.cpp create mode 100644 Src/Operation/CreateOperate_CubeTSpline.h create mode 100644 Src/Operation/CreateOperate_CylinderTSpline.cpp create mode 100644 Src/Operation/CreateOperate_CylinderTSpline.h create mode 100644 Src/Operation/CreateOperate_PlaneMesh.cpp create mode 100644 Src/Operation/CreateOperate_PlaneMesh.h create mode 100644 Src/Operation/CreateOperate_PlaneTSpline.cpp create mode 100644 Src/Operation/CreateOperate_PlaneTSpline.h create mode 100644 Src/Operation/CreateOperate_QuadballTSpline.cpp create mode 100644 Src/Operation/CreateOperate_QuadballTSpline.h create mode 100644 Src/Operation/CreateOperate_SingleFaceMesh.cpp create mode 100644 Src/Operation/CreateOperate_SingleFaceMesh.h create mode 100644 Src/Operation/CreateOperate_SingleFaceTSpline.cpp create mode 100644 Src/Operation/CreateOperate_SingleFaceTSpline.h create mode 100644 Src/Operation/CreateOperate_SphereTSpline.cpp create mode 100644 Src/Operation/CreateOperate_SphereTSpline.h create mode 100644 Src/Operation/CreateOperate_TorusTSpline.cpp create mode 100644 Src/Operation/CreateOperate_TorusTSpline.h create mode 100644 Src/Operation/MOperate_SelectCloset.cpp create mode 100644 Src/Operation/MOperate_SelectCloset.h create mode 100644 Src/Operation/SGLOperate_Bridge.cpp create mode 100644 Src/Operation/SGLOperate_Bridge.h create mode 100644 Src/Operation/SGLOperate_Crease.cpp create mode 100644 Src/Operation/SGLOperate_Crease.h create mode 100644 Src/Operation/SGLOperate_CreaseRemove.cpp create mode 100644 Src/Operation/SGLOperate_CreaseRemove.h create mode 100644 Src/Operation/SGLOperate_DeleteElement.cpp create mode 100644 Src/Operation/SGLOperate_DeleteElement.h create mode 100644 Src/Operation/SGLOperate_EmbedFace.cpp create mode 100644 Src/Operation/SGLOperate_EmbedFace.h create mode 100644 Src/Operation/SGLOperate_ExtrudeEdge.cpp create mode 100644 Src/Operation/SGLOperate_ExtrudeEdge.h create mode 100644 Src/Operation/SGLOperate_ExtrudeFace.cpp create mode 100644 Src/Operation/SGLOperate_ExtrudeFace.h create mode 100644 Src/Operation/SGLOperate_FillHole.cpp create mode 100644 Src/Operation/SGLOperate_FillHole.h create mode 100644 Src/Operation/SGLOperate_Repair.cpp create mode 100644 Src/Operation/SGLOperate_Repair.h create mode 100644 Src/Operation/SGLOperate_ReverseNormal.cpp create mode 100644 Src/Operation/SGLOperate_ReverseNormal.h create mode 100644 Src/Operation/SGLOperate_Separate.cpp create mode 100644 Src/Operation/SGLOperate_Separate.h create mode 100644 Src/Operation/SGLOperate_SplitFace.cpp create mode 100644 Src/Operation/SGLOperate_SplitFace.h create mode 100644 Src/Operation/SGLOperate_SplitFaceByEdge.cpp create mode 100644 Src/Operation/SGLOperate_SplitFaceByEdge.h create mode 100644 Src/Operation/SGLOperate_SplitFaceVertex.cpp create mode 100644 Src/Operation/SGLOperate_SplitFaceVertex.h create mode 100644 Src/Operation/SGLOperate_SplitLoop.cpp create mode 100644 Src/Operation/SGLOperate_SplitLoop.h create mode 100644 Src/Operation/SGLOperate_Thicken.cpp create mode 100644 Src/Operation/SGLOperate_Thicken.h create mode 100644 Src/Operation/SGLOperate_TriangulateMesh.cpp create mode 100644 Src/Operation/SGLOperate_TriangulateMesh.h create mode 100644 Src/Operation/SGLOperate_Uniform.cpp create mode 100644 Src/Operation/SGLOperate_Uniform.h create mode 100644 Src/Operation/SGLOperate_WeldEdge.cpp create mode 100644 Src/Operation/SGLOperate_WeldEdge.h create mode 100644 Src/Windows/OperateViewer.cpp create mode 100644 Src/Windows/OperateViewer.h create mode 100644 third_party/FreeGLUT/x64-Debug/bin/freeglutd.dll create mode 100644 third_party/FreeGLUT/x64-Debug/bin/freeglutd.pdb create mode 100644 third_party/FreeGLUT/x64-Debug/include/GL/freeglut.h create mode 100644 third_party/FreeGLUT/x64-Debug/include/GL/freeglut_ext.h create mode 100644 third_party/FreeGLUT/x64-Debug/include/GL/freeglut_std.h create mode 100644 third_party/FreeGLUT/x64-Debug/include/GL/freeglut_ucall.h create mode 100644 third_party/FreeGLUT/x64-Debug/lib/cmake/FreeGLUT/FreeGLUTConfig.cmake create mode 100644 third_party/FreeGLUT/x64-Debug/lib/cmake/FreeGLUT/FreeGLUTConfigVersion.cmake create mode 100644 third_party/FreeGLUT/x64-Debug/lib/cmake/FreeGLUT/FreeGLUTTargets-debug.cmake create mode 100644 third_party/FreeGLUT/x64-Debug/lib/cmake/FreeGLUT/FreeGLUTTargets.cmake create mode 100644 third_party/FreeGLUT/x64-Debug/lib/freeglut_staticd.lib create mode 100644 third_party/FreeGLUT/x64-Debug/lib/freeglutd.lib create mode 100644 third_party/FreeGLUT/x64-Debug/lib/pkgconfig/freeglut.pc create mode 100644 third_party/FreeGLUT/x64-Release/bin/freeglut.dll create mode 100644 third_party/FreeGLUT/x64-Release/include/GL/freeglut.h create mode 100644 third_party/FreeGLUT/x64-Release/include/GL/freeglut_ext.h create mode 100644 third_party/FreeGLUT/x64-Release/include/GL/freeglut_std.h create mode 100644 third_party/FreeGLUT/x64-Release/include/GL/freeglut_ucall.h create mode 100644 third_party/FreeGLUT/x64-Release/lib/cmake/FreeGLUT/FreeGLUTConfig.cmake create mode 100644 third_party/FreeGLUT/x64-Release/lib/cmake/FreeGLUT/FreeGLUTConfigVersion.cmake create mode 100644 third_party/FreeGLUT/x64-Release/lib/cmake/FreeGLUT/FreeGLUTTargets-relwithdebinfo.cmake create mode 100644 third_party/FreeGLUT/x64-Release/lib/cmake/FreeGLUT/FreeGLUTTargets.cmake create mode 100644 third_party/FreeGLUT/x64-Release/lib/freeglut.lib create mode 100644 third_party/FreeGLUT/x64-Release/lib/freeglut_static.lib create mode 100644 third_party/FreeGLUT/x64-Release/lib/pkgconfig/freeglut.pc diff --git a/.gitignore b/.gitignore index 9daf44a..ab6c547 100644 --- a/.gitignore +++ b/.gitignore @@ -1,511 +1,12 @@ -################ Qt ################ -# C++ objects and libs -*.slo -*.lo -*.o -*.a -*.la -*.lai -*.so -*.so.* -*.dylib - -# Qt-es -object_script.*.Release -object_script.*.Debug -*_plugin_import.cpp -/.qmake.cache -/.qmake.stash -*.pro.user -*.pro.user.* -*.qbs.user -*.qbs.user.* -*.moc -moc_*.cpp -moc_*.h -qrc_*.cpp -ui_*.h -*.qmlc -*.jsc -Makefile* -*build-* -*.qm -*.prl - -# Qt unit tests -target_wrapper.* - -# QtCreator -*.autosave - -# QtCreator Qml -*.qmlproject.user -*.qmlproject.user.* - -# QtCreator CMake -CMakeLists.txt.user* - -# QtCreator 4.8< compilation database -compile_commands.json - -# QtCreator local machine specific files for imported projects -*creator.user* - -*_qmlcache.qrc - - -################ VSCode ################ -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json -!.vscode/*.code-snippets - -# Local History for Visual Studio Code -.history/ - -# Built Visual Studio Code Extensions -*.vsix - -################ Windows ################ -desktop.ini - -################ macOS ################ -# General -.DS_Store -.AppleDouble -.LSOverride - -# Icon must end with two \r -Icon - -# Thumbnails -._* - -# Files that might appear in the root of a volume -.DocumentRevisions-V100 -.fseventsd -.Spotlight-V100 -.TemporaryItems -.Trashes -.VolumeIcon.icns -.com.apple.timemachine.donotpresent - -# Directories potentially created on remote AFP share -.AppleDB -.AppleDesktop -Network Trash Folder -Temporary Items -.apdisk - -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. -## -## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore - -# User-specific files -*.rsuser -*.suo -*.user -*.userosscache -*.sln.docstates - -# User-specific files (MonoDevelop/Xamarin Studio) -*.userprefs - -# Mono auto generated files -mono_crash.* - -# Build results -[Dd]ebug/ -[Dd]ebugPublic/ -[Rr]elease/ -[Rr]eleases/ -x64/ -x86/ -[Ww][Ii][Nn]32/ -[Aa][Rr][Mm]/ -[Aa][Rr][Mm]64/ -bld/ -[Bb]in/ -[Oo]bj/ -[Ll]og/ -[Ll]ogs/ -[Bb]uild/ -[Oo]ut/ - -# Visual Studio 2015/2017 cache/options directory -.vs/ -# Uncomment if you have tasks that create the project's static files in wwwroot -#wwwroot/ - -# Visual Studio 2017 auto generated files -Generated\ Files/ - -# MSTest test Results -[Tt]est[Rr]esult*/ -[Bb]uild[Ll]og.* - -# NUnit -*.VisualState.xml -TestResult.xml -nunit-*.xml - -# Build Results of an ATL Project -[Dd]ebugPS/ -[Rr]eleasePS/ -dlldata.c - -# Benchmark Results -BenchmarkDotNet.Artifacts/ - -# .NET Core -project.lock.json -project.fragment.lock.json -artifacts/ - -# ASP.NET Scaffolding -ScaffoldingReadMe.txt - -# StyleCop -StyleCopReport.xml - -# Files built by Visual Studio -*_i.c -*_p.c -*_h.h -*.ilk -*.meta -*.obj -*.iobj -*.pch -*.pdb -*.ipdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.tmp_proj -*_wpftmp.csproj -*.log -*.tlog -*.vspscc -*.vssscc -.builds -*.pidb -*.svclog -*.scc - -# Chutzpah Test files -_Chutzpah* - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opendb -*.opensdf -*.sdf -*.cachefile -*.VC.db -*.VC.VC.opendb - -# Visual Studio profiler -*.psess -*.vsp -*.vspx -*.sap - -# Visual Studio Trace Files -*.e2e - -# TFS 2012 Local Workspace -$tf/ - -# Guidance Automation Toolkit -*.gpState - -# ReSharper is a .NET coding add-in -_ReSharper*/ -*.[Rr]e[Ss]harper -*.DotSettings.user - -# TeamCity is a build add-in -_TeamCity* - -# DotCover is a Code Coverage Tool -*.dotCover - -# AxoCover is a Code Coverage Tool -.axoCover/* -!.axoCover/settings.json - -# Coverlet is a free, cross platform Code Coverage Tool -coverage*.json -coverage*.xml -coverage*.info - -# Visual Studio code coverage results -*.coverage -*.coveragexml - -# NCrunch -_NCrunch_* -.*crunch*.local.xml -nCrunchTemp_* - -# MightyMoose -*.mm.* -AutoTest.Net/ - -# Web workbench (sass) -.sass-cache/ - -# Installshield output folder -[Ee]xpress/ - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish/ - -# Publish Web Output -*.[Pp]ublish.xml -*.azurePubxml -# Note: Comment the next line if you want to checkin your web deploy settings, -# but database connection strings (with potential passwords) will be unencrypted -*.pubxml -*.publishproj - -# Microsoft Azure Web App publish settings. Comment the next line if you want to -# checkin your Azure Web App publish settings, but sensitive information contained -# in these scripts will be unencrypted -PublishScripts/ - -# NuGet Packages -*.nupkg -# NuGet Symbol Packages -*.snupkg -# The packages folder can be ignored because of Package Restore -**/[Pp]ackages/* -# except build/, which is used as an MSBuild target. -!**/[Pp]ackages/build/ -# Uncomment if necessary however generally it will be regenerated when needed -#!**/[Pp]ackages/repositories.config -# NuGet v3's project.json files produces more ignorable files -*.nuget.props -*.nuget.targets - -# Microsoft Azure Build Output -csx/ -*.build.csdef - -# Microsoft Azure Emulator -ecf/ -rcf/ - -# Windows Store app package directories and files -AppPackages/ -BundleArtifacts/ -Package.StoreAssociation.xml -_pkginfo.txt -*.appx -*.appxbundle -*.appxupload - -# Visual Studio cache files -# files ending in .cache can be ignored -*.[Cc]ache -# but keep track of directories ending in .cache -!?*.[Cc]ache/ - -# Others -ClientBin/ -~$* -*~ -*.dbmdl -*.dbproj.schemaview -*.jfm -*.pfx -*.publishsettings -orleans.codegen.cs - -# Including strong name files can present a security risk -# (https://github.com/github/gitignore/pull/2483#issue-259490424) -#*.snk - -# Since there are multiple workflows, uncomment next line to ignore bower_components -# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) -#bower_components/ - -# RIA/Silverlight projects -Generated_Code/ - -# Backup & report files from converting an old project file -# to a newer Visual Studio version. Backup files are not needed, -# because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML -UpgradeLog*.htm -ServiceFabricBackup/ -*.rptproj.bak - -# SQL Server files -*.mdf -*.ldf -*.ndf - -# Business Intelligence projects -*.rdl.data -*.bim.layout -*.bim_*.settings -*.rptproj.rsuser -*- [Bb]ackup.rdl -*- [Bb]ackup ([0-9]).rdl -*- [Bb]ackup ([0-9][0-9]).rdl - -# Microsoft Fakes -FakesAssemblies/ - -# GhostDoc plugin setting file -*.GhostDoc.xml - -# Node.js Tools for Visual Studio -.ntvs_analysis.dat -node_modules/ - -# Visual Studio 6 build log -*.plg - -# Visual Studio 6 workspace options file -*.opt - -# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) -*.vbw - -# Visual Studio 6 auto-generated project file (contains which files were open etc.) -*.vbp - -# Visual Studio 6 workspace and project file (working project files containing files to include in project) -*.dsw -*.dsp - -# Visual Studio 6 technical files -*.ncb -*.aps - -# Visual Studio LightSwitch build output -**/*.HTMLClient/GeneratedArtifacts -**/*.DesktopClient/GeneratedArtifacts -**/*.DesktopClient/ModelManifest.xml -**/*.Server/GeneratedArtifacts -**/*.Server/ModelManifest.xml -_Pvt_Extensions - -# Paket dependency manager -.paket/paket.exe -paket-files/ - -# FAKE - F# Make -.fake/ - -# CodeRush personal settings -.cr/personal - -# Python Tools for Visual Studio (PTVS) -__pycache__/ -*.pyc - -# Cake - Uncomment if you are using it -# tools/** -# !tools/packages.config - -# Tabs Studio -*.tss - -# Telerik's JustMock configuration file -*.jmconfig - -# BizTalk build output -*.btp.cs -*.btm.cs -*.odx.cs -*.xsd.cs - -# OpenCover UI analysis results -OpenCover/ - -# Azure Stream Analytics local run output -ASALocalRun/ - -# MSBuild Binary and Structured Log -*.binlog - -# NVidia Nsight GPU debugger configuration file -*.nvuser - -# MFractors (Xamarin productivity tool) working folder -.mfractor/ - -# Local History for Visual Studio -.localhistory/ - -# Visual Studio History (VSHistory) files -.vshistory/ - -# BeatPulse healthcheck temp database -healthchecksdb - -# Backup folder for Package Reference Convert tool in Visual Studio 2017 -MigrationBackup/ - -# Ionide (cross platform F# VS Code tools) working folder -.ionide/ - -# Fody - auto-generated XML schema -FodyWeavers.xsd - -# VS Code files for those working on multiple tools -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json -*.code-workspace - -# Local History for Visual Studio Code -.history/ - -# Windows Installer files from build outputs -*.cab -*.msi -*.msix -*.msm -*.msp - -# JetBrains Rider -*.sln.iml - -# bat file -*.bat +/.vs +/.vscode +/out +/build +Version.aps # AMCAX Kernel -AMCAX/ -AMCAXStep/ +/AMCAX/ # Visual Studio CMake -CMakeUserPresets.json \ No newline at end of file +CMakeUserPresets.json + diff --git a/CMakeLists.txt b/CMakeLists.txt index 847149b..9784102 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,8 +28,6 @@ set(CMAKE_INCLUDE_CURRENT_DIR ON) #find depended qt libraries find_package(Qt5 COMPONENTS Widgets Core Gui OpenGL REQUIRED) -SET(AMCAX_PATH "AMCAX/include") - if(DEFINED CMAKE_BUILD_TYPE) message("CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}") elseif(DEFINED ENV{CMAKE_BUILD_TYPE}) @@ -41,15 +39,29 @@ else() endif() if(${CMAKE_BUILD_TYPE} STREQUAL "Debug") - SET(AMCAX_DLL_PATH "AMCAX/bin/Debug") - SET(AMCAX_LIB_PATH "AMCAX/lib/Debug") + list(APPEND CMAKE_PREFIX_PATH "${CMAKE_SOURCE_DIR}/AMCAX/lib/cmake") + list(APPEND CMAKE_PREFIX_PATH "${CMAKE_SOURCE_DIR}/third_party/FreeGLUT/x64-Debug/lib/cmake") + set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH}) + set(AMCAX_DLL_PATH "AMCAX/bin/Debug") + set(FREEGLUT_DLL_PATH "third_party/FreeGLUT/x64-Debug/bin") else() - SET(AMCAX_DLL_PATH "AMCAX/bin/Release") - SET(AMCAX_LIB_PATH "AMCAX/lib/Release") + list(APPEND CMAKE_PREFIX_PATH "${CMAKE_SOURCE_DIR}/AMCAX/lib/cmake") + list(APPEND CMAKE_PREFIX_PATH "${CMAKE_SOURCE_DIR}/third_party/FreeGLUT/x64-Release/lib/cmake") + set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH}) + set(AMCAX_DLL_PATH "AMCAX/bin/Release") + set(FREEGLUT_DLL_PATH "third_party/FreeGLUT/x64-Release/bin") endif() +message("CMAKE_PREFIX_PATH is now : ${CMAKE_PREFIX_PATH}") +#find depended libraries +find_package(AMCAXCommon REQUIRED) +find_package(AMCAXPart REQUIRED) +find_package(AMCAXStep REQUIRED) +find_package(AMCAXSubD REQUIRED) +find_package(AMCAXTMSpline REQUIRED) +find_package(AMCAXOCCTIO REQUIRED) +find_package(FreeGLUT REQUIRED) -include_directories(${AMCAX_PATH}) qt5_add_resources(QRC_FILES Resources/Resource.qrc) @@ -112,26 +124,18 @@ target_link_libraries(${PROJECT_NAME} Qt5::OpenGL opengl32 glu32 + AMCAXCommon + AMCAXPart + AMCAXStep + AMCAXSubD + AMCAXTMSpline + FreeGLUT::freeglut ) -FIND_LIBRARY(AMCAXCommon "AMCAXCommon" ${AMCAX_LIB_PATH}) -FIND_LIBRARY(AMCAXPart "AMCAXPart" ${AMCAX_LIB_PATH}) -FIND_LIBRARY(AMCAXStep "AMCAXStep" ${AMCAX_LIB_PATH}) - -message("CMAKE_BINARY_DIR = ${CMAKE_BINARY_DIR}") - -#copy AMCAX library to output path -file(GLOB_RECURSE dll_files ${AMCAX_DLL_PATH}/*.dll) -foreach(dll_file ${dll_files}) - get_filename_component(dll_filename ${dll_file} NAME) - add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_if_different - ${dll_file} - ${CMAKE_BINARY_DIR}/${dll_filename} - BYPRODUCTS ${CMAKE_BINARY_DIR}/${dll_filename}) -endforeach() +message("CMAKE_CURRENT_BINARY_DIR = ${CMAKE_CURRENT_BINARY_DIR}") +execute_process( COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}) -target_link_libraries(${PROJECT_NAME} - ${AMCAXCommon} ${AMCAXPart} ${AMCAXStep} -) +file(COPY ${AMCAX_DLL_PATH}/ ${FREEGLUT_DLL_PATH}/ + DESTINATION ${CMAKE_CURRENT_BINARY_DIR} +) \ No newline at end of file diff --git a/CMakeSettings.json b/CMakeSettings.json index 227ca44..9a13e2f 100644 --- a/CMakeSettings.json +++ b/CMakeSettings.json @@ -1,5 +1,16 @@ { "configurations": [ + { + "name": "Debug", + "generator": "Ninja", + "configurationType": "Debug", + "inheritEnvironments": [ "msvc_x64_x64" ], + "buildRoot": "${projectDir}\\out\\build\\${name}", + "installRoot": "${projectDir}\\out\\install\\${name}", + "cmakeCommandArgs": "", + "buildCommandArgs": "", + "ctestCommandArgs": "" + }, { "name": "Release", "generator": "Ninja", diff --git a/README.md b/README.md index 2c2a3ef..9c4cb06 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![en-us](https://img.shields.io/badge/en-us-yellow.svg)](https://github.com/amcax-kernel/amcax-daemon/blob/main/README.md) [![中文-简体](https://img.shields.io/badge/%E4%B8%AD%E6%96%87-%E7%AE%80%E4%BD%93-red.svg)](https://github.com/amcax-kernel/amcax-daemon/blob/main/README.zh_cn.md) -**Version 1.0.1** +**Version 1.0.2** AMCAX-Daemon showcases some basic functions that AMCAX geometry kernel supports. There are more functions that can be supported by the kernel but currently not used by Daemon. @@ -89,7 +89,7 @@ All the related functions are availabe under the `File` menu. ### Prerequisite -- CMake 3.2.7 + +- CMake 3.27 + - Visual Studio 2019 - Extension: Qt VS Tool (Qt Versions Configured) @@ -97,7 +97,7 @@ All the related functions are availabe under the `File` menu. - QT 5.15.2 - Add qmake path (eg. D:\Qt\5.15.2\msvc2019_64\bin) in to PATH environment variable. -- [AMCAX Kernal](https://amcax.net/) 3.5.0 +- [AMCAX Kernal](https://amcax.net/) 3.6.0 ### Steps @@ -117,11 +117,12 @@ All the related functions are availabe under the `File` menu. ```text Amcax-Daemon |----------AMCAX - |-------------|-------include - |-------------|-------lib - |-------------|-------bin + |----------|----------include + |----------|----------lib + |----------|----------bin |----------Resources |----------Src + |----------third_party |----------... |----------CMakeLists.txt ``` @@ -132,7 +133,7 @@ All the related functions are availabe under the `File` menu. - Copy the folders (`Debug` & `Release`) in AMCAX/bin into your project's output folder. -- Run AmcaxDaemonCore.exe and have fun! +- Run AmcaxDaemon.exe and have fun! ## Tutorial diff --git a/README.zh_cn.md b/README.zh_cn.md index da41fa0..7d63634 100644 --- a/README.zh_cn.md +++ b/README.zh_cn.md @@ -3,7 +3,7 @@ [![中文-简体](https://img.shields.io/badge/%E4%B8%AD%E6%96%87-%E7%AE%80%E4%BD%93-red.svg)](https://github.com/amcax-kernel/amcax-daemon/blob/main/README.zh_cn.md) -**版本 1.0.1** +**版本 1.0.2** 九韶精灵展示了九韶几何内核支持的一些基本功能。 内核支持更多更丰富的功能,但目前九韶精灵中还暂未使用。 请注意,此项目并不包含AMCAX几何内核的使用许可证,您需要到[九韶官网](https://amcax.net/)自行申请许可证。 @@ -92,7 +92,7 @@ ### 前提条件 -- CMake 3.2.7 + +- CMake 3.27 + - Visual Studio 2019 - 扩展: Qt VS Tool (请配置Qt Versions) @@ -100,7 +100,7 @@ - QT 5.15.2 - 添加 qmake 路径(例如:D:\Qt\5.15.2\msvc2019_64\bin)到 PATH 环境变量。 -- [九韶几何内核](https://amcax.net/) 3.5.0 +- [九韶几何内核](https://amcax.net/) 3.6.0 ### 步骤 @@ -120,11 +120,12 @@ ```text Amcax-Daemon |----------AMCAX - |-------------|-------include - |-------------|-------lib - |-------------|-------bin + |----------|----------include + |----------|----------lib + |----------|----------bin |----------Resources |----------Src + |----------third_party |----------... |----------CMakeLists.txt ``` @@ -135,7 +136,7 @@ - 将 AMCAX/bin 中的文件夹(`Debug` & `Release`)复制到项目的输出文件夹中。 -- 运行 AmcaxDaemonCore.exe +- 运行 AmcaxDaemon.exe ## 教程 diff --git a/Resources/Resource.qrc b/Resources/Resource.qrc index 4561bc5..84906dd 100644 --- a/Resources/Resource.qrc +++ b/Resources/Resource.qrc @@ -25,5 +25,31 @@ images/Prism.png images/Polygon.png images/logo.ico + images/SubdiveCC.png + images/SubdiveLoop.png + images/MeshTriangulation.png + images/DeleteObject.png + images/Mirror.png + images/EmbedFace.png + images/DeleteFace.png + images/Separate.png + images/Weld.png + images/SplitEdgeOnly.png + images/SplitLoop.png + images/SplitFace.png + images/CollapseEdge.png + images/SwapEdge.png + images/BridgeEdge.png + images/ExtrudeEdgeHorizontal.png + images/ExtrudeEdgeVertical.png + images/Thicken.png + images/FillHole.png + images/ReverseNormal.png + images/QuadSphere.png + images/Crease.png + images/RCrease.png + images/Repair.png + images/Uniform.png + images/SplitFace1.png diff --git a/Resources/images/BridgeEdge.png b/Resources/images/BridgeEdge.png new file mode 100644 index 0000000000000000000000000000000000000000..1e9100cfe286537390476fcbc5a3c4eb183c82e7 GIT binary patch literal 2731 zcmV;c3RLxpP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf3P4FjK~#8N?OSO~ z69VKsApWPj25&)Iv7oUkJ~9Br_naDI zC@B0Odm0~pD=cOji%WiI!bb*R<{LBd3JL@hyu&uiGs%GH*hIr|BVu1zSSVW!8+mzo zvQ-JFgJKidw4b{EfWGnlij87bxVX5`k|j&zS;NDzW5>wB!GSU}Gi6UDf=7DMf3H8} zwq0+(Z=yzcd(c;1+Hyx#oIZV;#*7(51}2=?{j7)SqW-h0&`r>v}u-oAZHrhxqt-^78Vc9zA-{)~#E~&d!eBzke@B)nPA~px2R3o@#^e4E&JIn>Vvc zK)3eq-!Dh&4$q%ICm$alN=iy%6@{Kd+=XG6SC|H9wGqINNH;zX7{%=m-}6Ieyd%gg1cd9W(O!9(A@d&kBGMrYoprWFJkJF>)6KNC=PB zn4ro4SX)@#cJ116z~k)fOp_;1rf1KdF_&w@-B|)iX0v9^Xv2mLJYhHxD^3CWx}b0$kFh{yZFC2Mh)ni!w}+|13* zrTO#cQ*?ARAFvUShPt#5kUTu|>C>kyk&sMCXxp}JIUqA9PB4oB3X~`;CMJf0f`Vw; zv}tty{P{Yu50E%W9waa!A%P_lk_id5Bp$jB1ss^$4{Ox0goR)=HtVM59~oQGBTLp*RNl5J1Z-T??wBGxCabS?!o=Ph`xUv zJV-m^;#lHrnGfhDMjkfAtqzr^pTgVQn_Y`JoURZ7lgqc?(%%GeB5jks)+1S{RqoZR zq!+GDD-Z#mJb9A61JdZ~2>Jeq?IfT&3|8jp)nQq=!!&A*0XiESLVYa-UA4jhCqex2 zBS+}K;lpes4+{N-r^wFErn6_yavMp?&6_v54R;2Ei1uM|4{QML!NF~DPl2!>wGnx$ zG60nqOI#X=_8B;kMvNH2al!E6!)e&CVH~``uHd{=r%t@)fOelgeW+EdRv)iZ?!kff zUwnPZNq7Ns4Idb$mI(r?47hdc76%##aKH?$C>IRy@bn~44-Y;^!4wCWiLw?dxGh_@ zWTMe--@ZLZb7rAwz~xuU@?)b2(L7Z@zs2mRzlBiZmQl$p&54CsbWpZ*duL{B6YblWEOo*PjFs1)W z9RN#rn6Qo=JJOy#dw5M#EkrgcR|qq~h*`5{u|bN8iegDvwrm+Q!&q6`K@guTe749@ zsh`mKl#~?KU+DBz(GOy<(2A%K!4cLM@Qc6*|LyMX&Os1}8Zcl0rHG`bM8ybVLXi4m zSq%0B#uV?YB|p$6&jLsFxj-UB)nG-2W(;7yqUXpLCQX{eOu+M@ z=jPS{6j;On1rS$A#G*xuXw|A!yhM$a8&}~nbvCXPISb;!c%;A=FJ9yVh_8qbtXUTX zY*M{|!GTzA+O&zTixl>vP>pM=S5vNFP*h|jujv76)~sP8ikU)@^}>Y)qX4xnT()ZmO4=b#oWe{g9Yy zfF6bT^^rrC0kr|7u_#7j!vcz^wgf(S8aZ+#f26&0=T2Tfum;C3-=)&Bat?NQU!AQW z#1TeCp4kpTK|zL?m>79xJ%&h{dFN>K{zUTb+KzWo{1Ncu&-W-bGmF0eXTa}MRk>}h zSe`Xr{8nUS+Z=$+gxFMw&4rB>Ail8|W)JoxcvY@OXGh%c2rmG~qQ zbhNjlwA~AYeq__ox!Z)LOlNn|P=PEE)*iIn&d6fg9384H;(!aX{TY6c+vjr{;`Vv? l`DQK@=+m7-Yur9h^nboRb1y(S?TG*Y002ovPDHLkV1l1p7I**v literal 0 HcmV?d00001 diff --git a/Resources/images/CollapseEdge.png b/Resources/images/CollapseEdge.png new file mode 100644 index 0000000000000000000000000000000000000000..f370678788ed330a0fcbed36bf0b504da1a62084 GIT binary patch literal 3367 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 literal 0 HcmV?d00001 diff --git a/Resources/images/Crease.png b/Resources/images/Crease.png new file mode 100644 index 0000000000000000000000000000000000000000..18f2ef297f3fddb7121426b44dc7d9027ded3f10 GIT binary patch literal 3224 zcmV;J3}^F+P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGmbN~PnbOGLGA9w%&3@u4SK~#8N-J1z; z6x9}nPbLr`$RdPIa6#FTXbA!esD&t-SOvwti;D8B0u`0Q1qyMa)TbcwN-)UsWZz2J z_tgy$2*Tq5!8H&dAZs9GnRmaFp1crxx;x3RO#Z4A%$=U;zW+VvKmWNs9pN{SAeg;2 zURG^CD9NW&q)4RC8VwJmXJkrDnP_R%u!eMR8EcK&00MGj)YLWp#)BsK=dR!FPfO3R zM#B&3=GvJ9b74+)xQu{HY3csh0pt7&HvVFb6do+tw8!7T%q`W-F(Hj2T6Tr$B=E()J#dfGavU%jGqYEj=(hQf`7 zoA=7@LrF5CZ%a{WU;M+qt1|h+XV1!*hzP0szyq>(?_O*4`lDm>da~q)|7N|IwRV?( z&iZ%_hfqU`7WMn1qy7J0yx3o}RxN*2RFpq1F3x)Q`hw~(bImTlZ`HO0!${~?|ItSu zm7ya?%GnMbq~ZSkGIQZVS-*b0EMLA{B1}{~^UO1nk&$5?eeKb)MLqR6zU0&ALvC^w zEm|ap4jq#I-MY!4haQrc#f#-+N{U>%bV*)$iu!?i&XLxL|tBCMC80TWqh!u`~#Q`k(wXQ$tMvqb;>xA@I_0i>p; zN^)|t#KgqN(;HZefxI(eE06%<=nY*){$2a%sr&b->X+IdG^_7<G6Omn|$Ad2@~XvH{Q^wc<;UU ztRq82e}AR!Z;Kp%K7D-GEr0IB`Nsl`18lefF8`FrWSN z&p(xjC!TmhNeUH0LO_`^Wn|j4X}W^BCrH*41s7`7k}?Si;xAGp>kSVeJ%}dsq<{bZ zYNpz?Yp0c?Ql(1r?YG}rN9G>|CV-G{)vA>=XwX1c&JI3wplw^Jylk0dI;4RUE?l@E zM~@zrd+xbM)~s10GiJ()_uM}Y{~w{M?(^2sNfpQ`#nKm;I!RadN# zC=)FO0pfb{Ndd?34a?UIWZFDem_Jo1SA_S=zy2zdrc9A?<;rP(`%E3qFETSTwNyez*REZ)di3kpPaZPHt7OTN5+5IL z9qEjGUqSWi)m5O#c`n8YrAwEVDMrz!ng3Ta7fKipA3j`D1~OR9f`AA>7;Dz7Dc^ka zjh0T%;RX33;KL6;l-q8*P1)w;PAFnT@9^QnGTEd`yYb^?SjCDG|NHN%8?0PgqYXQE z?o?638WYO-MY^dtq#}eq_~3)GZQC~Mo#4nb0WkgAYp=<~i4!&a+;FpTflog9q^w=N zTK;1UPHE#34;xoV+1$8sqkQqj7beZ7eCOwE2{vsnIt#8OX5KM@jK7G115*&FZ zfR&=&d#S}0&1$pCZ@>Mvlr*b*-u(GYsf;u!lWM{rD@+L`mFNpdrTgx?PlgN`qUEoA z`SM~~XzSa&1EGBU@yF%sufMiNf+J4^U{Obp9<8D3*2*G8vuDrNmF(21lX?Vf@v)XI zrIH~qP!0oDn7;u7257B^w5OkbT2=kK@4i#gqoboerw6)Jym)arefqRD5*(fh!03?g zbb9!9CopMNkd>b`YnB{8eq6`#14*r0OC?hdbNc}%rP@(&eZ(_(gRxz z2}F#S^q|>lZO*lH=~8RN9-atb;*=Oxl*zcQM1=|!wB4m8&Z!eV6PiaKepo6Rm8Lxo z2C4&}V-?4Y8KWYJmNahMST|C*2D->%F5iJ`WZ|6Pi2y<#CcTIrc}qw5;)^e8=%UO4 zKwG9EFXN`0q=X6iob9n4&;%msZzGzt$fU=hL4(wNHf`EeRvTeOXGpi)i-Hayv z_ZBT$s7|o*!P;KhJI)P|&3P!L_zZdi_7130_uhN2Izs$Jw{G1W z{XkFx2&uVq=W2O!yGR5IbHt7ib~IR52%u5hV`HVuB_?7Ov)(8G5NRUr_SX4%54rQsJF~a8f&nGQ#BfsDQctzl5RhiR|KhvvN^}Ss zBS3@(tT5O7>Z`A6gG71&HdyR%#aaLQ>n~k-Cd2AGfs;Z21_qXM?*`d{XsTi++}u=^ z35MXNci$~9zx=X_9F0+aoL_Em4!jDfiw5xhadC0hyO-k%0+=)_?`C#D<;s<%rEzv& ze)*+_y_bAOm8Tm~s$k0HtgpV(&p>v-`LR13ipD4a=7TK`CWKcIfa_up&TS0k%j#B0)| zi5xg^An1u{H@WjOb?Q{D!A!~vaBoaDSZX1rh!#;%r%oNU#P|vFI=_t(QN-fV$JlL> z*b;#4rIy>BkS}Cax^(HH?X25w5MV+~zIX55+WxY#Zr~OgpZoOFPu2NhgE?Pb8zVq^ z(jMETK~MtNakcZ>n2Zh`I_S#dx}02A09-Iu8g=G2SYFVqSu@$cf4@cnR+#i)GZdpk zW5hMMX%7V8Y3$l#TLQRX8jjp4fPkT<+_fQ;QEoR--Y8GQh7I$)PiF@fgB4`5=nljX zQS3IcC{B$LpP^r{i&k3#0IU4tk3VL6YyO3lk3arc@8#jZynv9UDdEOOsPO#r&nu~{ z==<-#FR`()vTWJ1pp6kA3LbmxFvygtM28 zP~IoU5X*3wd;qQlAS#qYHy=*DC%@Pe3@5k}K;F<7I5{mGB4r4}Lwg)fa3!F2?b=$) zApjxC4N4^&A>+r7cin=%5#dSz;C>yZ!md50zG9o5_5p8Xcp|_q4TuIDB94oV$b#PE zzh3Y}0PQiixpE32O~;%$bF|Oru1&bYm-SmtXV6$ACMIUDGO2*w#PINYzHkL|_wjU< z7qFqgT_Qw}&`0gPw!}9on7c2gOiBHZ8_)qPag{1n)aLT*Fk0krMMh?(lrJ3}cwl0; z(KL6M{@!mI3BPGHtda1=ybZtT0~4sZK3C@j5Mao&UWGTBSaa4Y(7tJHS-8plnI3L@ zVv52Yi#G3-woPhfy-*qqvL2gDwO$oooV#%OV{_RA@Gv0{74mRlVFi;9`rstsu~OJs zxM`0yQh2avGmp-WHIq-XMzV036O1YnDe-ZGWmiIyH2ufFWd6oqv|NNMxM?$g;~t&M z&VxsEZc#-q|2=}^Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf3xP>QK~#8N<(pfK zR@D{9*9#VcSH*=b50ak+NUv0N_?`*YQd-vP$Va-MB@qymHers!Ou`AA>VL!WUcF~#v0Z6g* z_y4GU?^jRMR=@Ust*5uIXg&VW8`h2w_<~P43<^MZPj7AZEh}m-zp=S!89I1*!w0ol z!MCp9qsKr1aDL`5m)AP?A1qpi9`^0;iavIAe-ng(0I>5z*?FNe1Yy=Kj}=m_7K`9- z|FGW9o<7BXa`D+kWfYk&8PqWN$fJb2Ld z?%i8RjUkj3YieqW{K%0bqukxy9pxiIOG}IG-@kugJg$ub+ldn=+DRv!RJ0t9A20rs zHC=b_Gqo3&{=8^99E%n$vM;~<(#DJ#69>%^Nag9!mJNW$b&u#A9xwdTCvMA?p{gP*`>H2%0t*u^qW6^Xt z7A{<93l=P}5hF&#MfypA+5|7-I189QeY(w`KR;%ZcNCP#C!c(>U3uk|ws!5>7&!D* za{01wV1Hhm}l*lUDo(HL{o#4KeBhsg~ zWiq51z&NTY$`I8A$w2)8x9l+q0L4oKS4{|VGCRZl44?L`8Vel(`1FmEXIPvv!0Xe+=lVkIq5|L@*VvK;^%IUs091f-1hgQ*F9>i8DFb{z zAlsZX@X7%6nkN^CbX@VwT@Q5wFlyAOfyq+x3szg|OfCatE99JkR0BLx+p2NDbp{Z9 z(omD?nj=9rfJG_;Kx!*F4H|&=MX=1)>jcSFhajOc06YSH02(1dyfUD#uP@3Vwbl6E zIb>f1Q=J@FAOJEXe(cz>wr}6QD3{^?5&*v_GQjUd*@A(04xY?W26&xpfdb*jfk#gO zI1p8#ZUEQ?P2MQ^MbX#G;^hGFI-vO)sR586S-M8f0+j*y;)^eiI0HliycPuHc+LUu z96TAITR^tzr*VLE0y^khXTVoqePySfda8{dKi*nfTjTkhYdw-Z#4*~pYYcDWbzH}d z8yBxrr%tur-rhkr(s|kQl5u|WeQ%^k=Un_ltbI|UH2fPh#-@e^W zJMA><>FJ4WWk|>Hp-DPui`w-deN{1}{UE0l4d~yKLIDX?FVQ zrw^*)z%L?QkYslBs;jQDS6+D~))TdJ^?j7iYC|S-cJAD1k3asnJ^0{*v6`!&>~g$h zj=~)s9WgVOE?pYiQq+ALqy|iyG%4;R2O>6#V z^kf1-L}m;i9VC?LD1_WbRj3RAll$KSj)c@7C)Cy*f^orp_t~XSJYnB?>n%GNQoJkZ zuYTYG`@zEx+r+I~tv}rR3K+K#I|-k2T(Z}}1IA$UxQ(k&8Gx!cK?vm9A&_Rkh)~u4 ze*XE^{^_SS_nBvG`i2cQ|Ni@}_R&Yy5f-~WJaU_ZtsDZnYL|iL$OT1n0rcrXDn;E4 z0Gi}T2q*)z`2KJ#o_zJy_Qsue+9rbV(o5DGQvc(&He0`JnYD&npuf1UJs2uUYGIMx;i+)l-FMrVk3Y7Zp$4>n@`+vk!V5NY{d(&z3ZwdSr3O*q zB}1v>pe!i$P#S=vc@F@dR{+#T5xg*@e_u%Z9l`mxmoK-sZ@bOfLk;+TIB`yS=N;=0 z0Rrm7^PE})QfGnImpaZBoqQ-mX#h9_G!g(%*6uTawh^HQ{OzWjY;!nTzZQyLTeux2 zU38JX9**3vpK*r$ch)Rx4z~fea>Bn6RyiwPc7Qf~sCpD0(+q%s_%r~u;M~+1Gwj2M z91cG|=cgsqDf+1TP2XrMkkMF;@Sv+(R2tbT2C`P<+lk33>amMpPTPB~>znpHvR z2iToYLWO4s$s|?sMxb#RW5C-j&ZF{mnEQqZ@~3frlz>QMDCNtDzAU7kT@{f9)FaX#;`X3D$9o%yc?rT%Jp~9r z`V;^;9`be&;2z{1J=NuGb3ArDMf4Pq4qke-!wVW8;KNZr1?a5Bu$5Y^_&jEwpJ0|bDR9CDRyO0wmu0C;`Q*&I)QHu0ze zz+;5_PXp#i@UqvZ834*`JqhpxKrb}XGhWVdwFAvb|Ek{vN&~>8ngHZ@h>5%`JzxxK zfOKWH;(=srA=Ln{6EDbF?K(Q~Y$64*45b0kqfd*`b zXPe6g@xb>_Q5paq9~uaVhthzgvg`>WCqb`ENwz5uF)kS(2mCyOI|;f&0TN(4}C%0U4kgkPcopnRoz?ofaT! zw67;2ZTBRkZJMtv0Kw9l`Iqq&{uU7Yz(8_J>Z1baoff>km(u`=WTUHiAUP$*Vgp!5 zSped{%eS?TiHrxv{7IT1&{%N}psV2JoQ_3Py!c&!KW_>3`gtI8lGAyD-Arv7#T|Ft zVUIrgXd#)s^u`C))7uv(iQm_tbNt5?Y(WE*_?$dL#5mt9~Z|fI15ni@#SAzKaIYP95KAm9zx~k^UoEZ u&+k4SKcDA0Kd!~DxL}6eSo-Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf3;{_*K~#8N-CJi+ zR9O~2Km!sK11ca|21ZLQJ+@&-S55c+;hKs?z!(dXc=S# z$FJU}%fCFM{E{+KIXOzLp9gBx8uIpXr{F&X(9{vVrB(xg1N0Gd=!!P*yS>_J_O}Dyg+$P+DF^K~ekY{=XNCW8r|mAHGICJGG&RAw5N-DO6Tg3gQ

H79O9B6Q0ns>ik>xsgtVW#`N$&j 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 literal 0 HcmV?d00001 diff --git a/Resources/images/ExtrudeEdgeHorizontal.png b/Resources/images/ExtrudeEdgeHorizontal.png new file mode 100644 index 0000000000000000000000000000000000000000..913b1d903f1af255eacfacb95c8d4cba6408e05e GIT binary patch literal 2347 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 RlZF5Q002ovPDHLkV1k1ggjxUq literal 0 HcmV?d00001 diff --git a/Resources/images/ExtrudeEdgeVertical.png b/Resources/images/ExtrudeEdgeVertical.png new file mode 100644 index 0000000000000000000000000000000000000000..6bfeacc51f16b36b5dc778f8aade8f98b603ce04 GIT binary patch literal 2208 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 literal 0 HcmV?d00001 diff --git a/Resources/images/MeshTriangulation.png b/Resources/images/MeshTriangulation.png new file mode 100644 index 0000000000000000000000000000000000000000..718ec7696139946031420893049b3d105f689c8d GIT binary patch literal 1945 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 VtE~llFn9m}002ovPDHLkV1iVEA$9-& literal 0 HcmV?d00001 diff --git a/Resources/images/ReverseNormal.png b/Resources/images/ReverseNormal.png new file mode 100644 index 0000000000000000000000000000000000000000..9305bb25d682b90183438a4be2b1a97623f04875 GIT binary patch literal 1926 zcmV;12YL93P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf2OCL5K~#8N<(q3v zR7VuY|GT_F3JT&A42mEMey~s<0UuyZDv1Vyv1scD6G3W3KN$6kG^D2TK~XW%DmGDk zl!6EvYP1S%#TcVt1d+4~XzK%_E&=7WEbQ%^Vb+4|UU}^5a``1Ucjnw(_MZRDoOAB7 zqmmdf!7s%XxKdV)S52+3wNVS}@Sw9x4^KB|EdA6EUq;LpRwIxA?~-z&Nct=>L(2W* zo}}yS64v2IC%bp@fqWsKjL}Pg4qc}-dwsfe?pmd=D2H<;_oZOwo0j?5leYqp^8sI{ zNpD))g++NZw`#eM+K&H4cq;&nypo+a@P>&Hy#Ao*NfHl&-(~%dS-xI~37;h*gR;rL zUWI$L^+;Y90Up{5Z~ir6oF}5gX5!bIfAh8~ySQ9Zt5sOFD3}{Y3TOYU&_UgM}=HMI=8BF7xqsMXNCZiU*C&R@KEQM9ZRTP6Zq{VLHlKT%OpxO3-@ z=vg1+yTyjzF#5T=730#G=tpr_+g+^`iLj9}o~ATEGiBP@MUd<((u3wOa8C>p)h3!Ln)7CY(Qi9#5V; z!HgL*Fn#)TOqnu;3wq+j2^=_Z0GXMYICbh2^78U<>Cz=sS67R7_vZNVSXWi?Bq*>&RtzyJk65b+uIwFk&#%qa3MlMLJ%ArjM~~-{=QwicHz*WLpXBe2(q%W z_>!XXwxXhfUmprXo&gyd87M0&!}jglxe(@j0;EdL-`^jPA3sKYeLWY-aL~xUc=3YQ z`XuJ4QKR7K=m=+LXWkAB48-KglPxy`o;`bpn3xzoayxeHKub%D*&lyfTU)tvbbfc% z(Am?|6XD_Eh=_kBV0FCK(vFOJz-Uby&1y z2}(*z@cj96sOh_Oc2GXIwYBAWo7x`|`aG%=PM$o8{QP{L7Q@2A#MOZzE5P?`YGrQQ zhObyUOh`z;*s)_##{_xw=n*O_D|u;KR8+*<6oib4Lw$2XL5@=5Hg;b$GgDJj#g)M! zTL);^x_4Q(4vzEZ3yX1RSx`~Z)YOD_7Ii5;P}xh#bY2idV_=@5G7lVKdhlR0o(v06D0W-FjO;8aHS%L zoFsaRLotR93bs@c(yXI@v{3bT?AS3r3;N4P7r+!WJLtQHmoHy(Q4GS6P!rirPn|jy zqeqX1AFJq+*nP}r_po~PYVq#=^F9GU0+`~}#*I?jjT@r(;b0>!6&Dvvzp*3G_z&6o z%|8<+h*n?7ck@OlGckVrcr0O==W}-4W-(+)uq7pjRSM9PhWAu*a&)kgSYoMM$KsGF ztX_bjpku*TtIw)YjKiEc!qOK-3qW|Whax%T1)u<8=1R`mkoAsb z3g}sGRx&09kXV`8_~Vbzux9`zV^RPWJ#ody!|Ti$VNoWsOTdH80Ef^}(NiX}0?>oW zN5{hVAS-}XVBsue)dFaelF(jTi?*U7VKF~y3G%<7_?UR4r^C_D4^EMh!eU;?cQyTF z+?w%z_)xUW5C6Hmr<)6Jj5NCRdU$-|Y}hcN#;Qd@;?l?<@7jInI=i~RZlQg3BaOMj zXPyP3<^>?Xq>3vu5-7M{g)ip%cXzl9jP7l7TG3N3&27E6&AkNpEWld0E&u=k M07*qoM6N<$f<95Cwg3PC literal 0 HcmV?d00001 diff --git a/Resources/images/Separate.png b/Resources/images/Separate.png new file mode 100644 index 0000000000000000000000000000000000000000..8b108086d7cc0f031ceca0f5b70085e6965ac3a6 GIT binary patch literal 1630 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 T6|vMW00000NkvXXu0mjfR#Y3` literal 0 HcmV?d00001 diff --git a/Resources/images/SplitFace1.png b/Resources/images/SplitFace1.png new file mode 100644 index 0000000000000000000000000000000000000000..c837360b877b656b96d6061451f859d6ffe49f43 GIT binary patch literal 1664 zcmV-`27md9P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf1{Fy}K~#8N?VDdr zQ)d*w&%L)T{{~ZvOdf<_Tns6zae^)?Y=e+Y_Fy1Wr*ZDVxWpxk$)0?fi~8i2?O`#_ z#l>VU*&I&fVc}sUIM9cUpwR+zAuU6y`$;+i3-H7BE@z@o?i5^q@UphbRFgS_W6p{8sD?0enG8w?-^ zL~{C4tG@Nxi;~jbH9Q%kS(XaY315*!W=N;^Xr=qf1zJ(@8+81p%HCz zqHSbjD6rHCBf6*UI#}}KGat_ zcxFg$uHEQ??tV9Xbf_wj1Sv^Gg8h<8BH6}mmM*v6)n!?RJ+GExzd5W{EA;pG!|?Dh z*BE2B+o7gvva+&y4p21>-utWxchy%E|rw?Hs{ED3&_lzZ60m$^=Rp zij5R;5YL!Y2N)GX#Ga482OtL+k&}~SSW-rcq9|d?4Gh5Fd-sAeJe6|EIs0K06Kxt1sYF?bHFk|m;)rg zpB+UeKthNEB%B3iutNL!_H7v4w-1y!sz9?569G62P!cS@coDL&+{U7wH!MBoH~kOHks*MI$m z3ouKCGBAgjF?~LJ1YjAf;z6scgNL=X@Nm~Ia934<_32X>-Mksx)ztw#%HxU( z76B8ulB3tesME>%c=4)IRQyv}IoqGUXS}3@-ab`Iw*vKCm*UKAtPm+`luZ4z$8dl zJnivgwmzUM8rfe#VzNPYUP^>GfU>=skpaEOj=?ZaQ8dkoLQDi;=BN5#;NU@+ zC@NyJfhdGHfD)i>bQEgJ%b~ELfklHTgyn$XETE>Rv!f`)CBbEaxJP4n3pjS{0Qad= z@L>ObVUNayJsicr*S|t}nchp1VV{L0;UA6?R0Vi264G%>w8gm|Ff#(oSq>-Q{{#v1 zmct3miUasDWm$26&Sr|#glw1TFXO2S*)G%8vW1*L`v@dSiYnA6*1l#*JYxp?Mxtsu z*wJ>G_SH4r{GF@k@caERh2^Q&>y0YZhlr)GSrX5f)Q4<|r0Hf4)NI*6Kg#O*w)ek; z-_9N7O#y0aYvJC#dtiy-=?m@3SZrsB*~B^~8DCOT0?p0MTod3GwE0)GnK|I}rRz{y zoDX#ssj+E_BHq>a2u{4qH%$?=m5jEOB|Dy}@NILm4)F4glgaD^GM;So&KPW*Bxpw^ zd8e_xhij6DYd3nBZK1{!VRMAlqQKp+KY*_OM=VLu)-u{%m8j6UUv2M3Th4>)&qvHQ zn>GB;7%U0$*YmjC>VlSA_u1~Mgxfxk#@ll;*;My-)k53n0saM{U83Y|Kp1cU0000< KMNUMnLSTYgmmmiK literal 0 HcmV?d00001 diff --git a/Resources/images/SplitLoop.png b/Resources/images/SplitLoop.png new file mode 100644 index 0000000000000000000000000000000000000000..8a2bc688c7fc31c05b9d0fb92e1e3564fb24e28a GIT binary patch literal 2067 zcmV+u2<-QXP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf2dGIzK~#8N?OSbZ zQ&kv#+HM_;jgD=OuYfTa6g6m~nG%C$BU86bjb_G=M2FK!CeZ{im|&Q|q9!C5Q8En> z5|jXL3^lq$GXjblFu@m9-<5DcNvlZ~=_ZpPCk3w1#hP=JYO z`1GJrT-Rtcecx`31cEv@{lK<23kP!9u=AkK9glGW437kiJ74&TYKu%5$YHDgwUtf=cf&v7CL0y_0va+%;G&F=&t5#w8^5xjFWs5Eu#l9ap)Kckq zY2$w5la-H;uJa}_W5x_DUAhz-Hf%tDf4|O64)j)jem>}o=H_OUmzQI3a8Q>f2a;z` zEG#U-@#ba9SZhbLPx3@;yC0IyX7c^V6nH zQ(b@e?%m4sW_uAm&*3*`&KzvpwoQ@eFo*?mcREbQwkpEYY%Qsjw* z1xWRnCwZ%5p5()0-VAvnApuf7=2JmFJmHz?_K}Dyz`rr(Q$gNJw~vIQs(!c8y#87J zbv)+JpO3n_I;>c+BJPqB3k+_E?Cfl`wY8zNwAA#q7%DSBBI!iPXJ%&N$dM!PdcD}X zb*s+(2T#4dCw325y?QlHojRpF&kYI*m`#lGc#X=+N=w(8JbAJry<^7?%bpJ-rU2*8 zokL4YiwbZ1`ua>KZe|uNSb#HU&Y-)yJL+!|P3-y5{8qI{`uxFu8yJ8J_j)aiydL zE?G8Ru^)fhO8}D3?C5|Yk!P<2aT3hH5$CS5Z3Hl6!gC)xhP*f4K;YI}xp9ysAb!AP z3js*pkd054Y_@v8{+ip*xSkIq?FAtDjLuHn@bJU%z4xB-dZOfsv=%^lJ|_pBH{XQ! z+i&6Q>EW|JU78ruRsgQ^na7XA^ZM)X%97{s`;#V5q@@5P?>c=Np10nD@7;Idlr6g% z@($`>0GH2)pzPy`knF`n=g-3!89_)QD`gK3!jQc_?NEO|j8JIQmc#~++0sBG zT%W&>RiFP8t`kvTybwgl$iSb zbI-y1*kc%yrN;NpJIWsT-~;%@3$*)cYY{km7T!l6g}0&thKxym@_XQ~zu4FZ4s0dHmH`1MlSHF|rCsm(zxW2T(O~EXT`H6@rz<&k* z3!p!33qF;)*2`A57J!f9PM$oemh@P#tpI%0uBoX>J&udE0)$~p0Z4w|zJ1uWYggQd zu(lH*l009wj0al@kSuw^HUgL-PuM~Lv*d}i7r+X6BCQ3mN}h1aPFfihNFc;}3(=3vw6?aY zSem;js~~Y6ez1B3Mw*JLQ>S9{=FK|CJjRa9P=JO{58;lRitxnZ|Hh%IFMs+CC(d-E zzPePYs=%XUJW^(NT=I`UHa8}~6@75h&LWUJIbIo#a&VI1iAt)o|8S?yu@AoZu~Tu2 zBu|Ws1T!;SIKKTgwEy0%CJ7!b4Tq{=Qc~!HKioikmxg{G_fXL2X}!y$4UA x?bp-lbXD3NpBM54Q?pTa_sw{wG}iHX;BSk1*CyI${#yV5002ovPDHLkV1i+3^)Ubd literal 0 HcmV?d00001 diff --git a/Resources/images/SubdiveCC.png b/Resources/images/SubdiveCC.png new file mode 100644 index 0000000000000000000000000000000000000000..29a1d7ae68e133ca70815e5fbf5ba664a629480f GIT binary patch literal 2315 zcmV+m3H0`fP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf2%t$sK~#8N<(msk zRM{EFznK9v8?DAFF(3MfWG|Ys}izyrAq)TRvY`RF@xomR+6RfVB$W7aNp3! z&b$c#o(N3b&zgQQlcn#`%zZ;2I|t!S0PxB8W#`+$AYe{tM-+nT+22A?fIlpq9YiHV z-zLB84pi3E!I!^}0A92MoWF7JgK-{NGAjrQzrQbzbzhg1Gre99abdy2pe0wXT)|fm z!o$PKq8+3oBPd-9n6O(RERGBY#5ZnujZaQN_H zvTBEc=lc4FUqIgz&Lhdm$&izi1E)@%f;DT_kX2jIcfGC$+P4c9EP%6T&q8BkqxhUV zcMj&wn@4B01AW*0@xOTS0*Z=?VDaL`(A?ZCJ_{Evgo_t1LVbNbU8NnG2VmsLk?`oz zBT^kadGbV@(;7_!aN)uQ2nh*+fPet9bb!uJnluT{pFd9)ZO}9TQBhHFd-v{zUAuOXa!q=AI_%%SpOp8} zBmk2qPlijEE|HSw^5x4gapFW$-o@(ysIIPtnwlDzGiMH2bmDevLc0GvE|5@KRvVBo-kWKqt50Rv#^(xq_X#0j!^2d@UeXf#58 zem*JneZ`Bc?YirATco!GBPqqb)Q3r4#A2QD@b`BuLQtiv4~#Y+O=!R(tWU} zc>45dFq_R}@hn~m!06GVp}f4Dl>1avRKTcFqeyucj|Tvox>$f=n_mteA0P3NBRDu1 z1`Qen*RNkEi|6oo0H#l$4)^an1{~$UHiFW+{@%TNFk{9HQl7)30oc8JHzXw`k&@@w zv14%j_;FJ5q@<)MYEG*nHtn=yl+Xk4pQ9sr0s{ltty{O)?c28*Z}5;+9yMvmfxdez z2h5#27tWkHLrR*;%1UTxXb^n_Z1dx&5EgVw$j!}F)vT7q6FH!+u8!$+VvOLOJ0XUlT^yyPl(qO}8`SRt^uU|j10QmX&!OE2@;o!l8 zWRV8b8Zlx7DK~L92k@pYn>A||DS3F3bo4G#=iVkPER2~w>S=x9>%s7c!yZU4p%bi;TJFCa-tvvcQ8#+%!u)Z=yl z)I5Q~g9oz*4<3+m4R0JV-s&SIk2|>leeZT5IAOvBF}te-9OAkkGrNih5&NOv97pTnv znVFd^E-sFgJUj_Ha$xQc%$yL;EYHf>>s^0j=CV9yOii+6OsZ&YG zqvqZa)vo}LGVmyqk_KN9Z1dw(cstC}N=F9z51@P93c60M!p`87IWKR-u(}eC9z6=n zmMtTt5T!YwrKLqxgz?(?`g&3h+W5!H?X923GfT^3_WD>V&-Q2y+Vd)_9kftnSgje}B;f#OjyV_hgku z$vwwy|EGKoP}<(!uwjFEN?3Ax3#?Hvjg1>OlEpRa*RN;Ww{Iuq9Q0i_0GOZ@{CyYK zDD4z^g0!?Wk!DU#4q2Qdcki+Rm_2*8=O-*F&Ik20JeF5IlVm4dXy#R=xpC9Ap2dS>0 z?=GuBXTw|x2?@Z1BBrXIKYuPJKzbUSd9JIggY4{VG0F1wJRps#UARy_c1h3El2fXV7Fkfs~|QuR?IMCZf++g^%Urgd-7Q3#u%}17*}t%Pgdgk-I+6IiuVicy%B@K0KBjU zo|7RuI$GFxAufEhw=wwBzI?}q30yiJ8x|~h{JQJ5 zxim<)-rn=FDZK|c<)%+PfN*!AAhP9zWMofj7K7p+vmS7`4Nh5Rg2wKy>9zFcmCJE l`UoPYd;-6VaJ66y;Q!Btj(P|JEyVx;002ovPDHLkV1nv1X2Spg literal 0 HcmV?d00001 diff --git a/Resources/images/SubdiveLoop.png b/Resources/images/SubdiveLoop.png new file mode 100644 index 0000000000000000000000000000000000000000..840fe7ce4612574d4f7000da3944042c0388b719 GIT binary patch literal 2026 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf2Y*RKK~#8N<(p|t z6;~9;&s)HV3ThEGYS2U!1wo}LM1v@%uGLTq(!{`rnpBIT5o2Q18U>AsOFtM=FhP?R zOHkQNzzt~>Y%Bm4YV3HfQr8O)L|a==z77~$pOCodNzcu@S-mafB_gz?4P;9H^2NYT*|K$ zx_fkF{rtddzs!6>1gr^t@FWml0`XE3#xci z30qF2f3&7ftJMk`jfRx6^yqZLPbbm@b$=&EVNRVo1-o|bg6QaIIC=6US(QV>YJGD{ zJHQWz{-T&D3%dp?4J|7P`mR=eg#PWib?e~5g$twrl9Q8R&6+i&l!N;oawwVNp$yH< z%?9r{+M1f0NGSvQuK2@0W5x`4`t&KO0iHj9&c9O{MFVj4>Q(Ua@&Z>^SF#L%&M#WD z2(q%W$f69224MaA^-xk$LQ0=IckaN34I4-)gJJ>LyLT__-@l)faSk3l2z&PIA*BFH zB|&y7Dw)Tc--6SByM>;Z6dbK}lf3m!9P&Ky$mA!`86pFa;lK|wHX+&HpW&e*YIAvib~&Ye3) z7MYMU39`SZlI=+GAI6Y135JJx3(jjR8jvqe`+qP{ZB|VXmk#OwTF;WsCWfEk6MaX z_Uu^*4Gjec2M4m~gPj(N)~-aj~)$SVPX8YR%7iWzz(63d93-Z zG2}d-)sFy1IX*s~lzFaPxdL5XU8JlByTL_8MWoDwwR6*^O{6Tu(i+g#)@IWk#bdg= zyGdD&nDepm2PxB7RReHJie-ONmV+}ylP6CmWjRx(Oo57u3R0HCS|6*X&nyZ6wzaIO zfqC=hk;QWS{QRJ_v=mxeTF7D^Y+-N)sBe&E4esvlJYg0T6p+O<76l+6AONbWsz_N6 z>odUk@#9IE2k#)xE7}UyoaM`xlQNCj0K~+^KvYx|DchJZVFDlLCnhG6#W)u)UWBb% zw}PXiBUx-?_&CKV=8_=$36;c?nwm-_!{~H6AucYClz7ZtyV)d&RiBObNr?w%i&n2* zO-dhse}9u5ENjWk%;d95CNWk6*u@I02S!Rd+}zx#qz?-?m88So-d=d|;svRpn5+T# z(h@t6lyp3P{211*T}x^JZ*Omdqf4=%52oHeGZ=u&moM`PO>Fw)ps}$LQc_Y#0Z)!% zlb$gqO`61C&bV~x5?O|#7I25rFt9sm%_}X|a{vB)9)v#d{Q)`dejhnGIlLP`9Q0ky zUl||7jvYH>e|cG})xxxC(;zlB7WVDi2kq_cd`etSPMeL7!Y?da&>KI(b}`1y3khYb_>>UcbYe(roD z(U(GIaSg2Vo%=!XFfec{8Ez>X>9qbgblY5i06J;oiQtY(j81x? z^;68BI_weWz72LB8PXH9(`ukRF$yZ{8^A9zo^LJF(Q54H2wpp8d%ws8sQ9OW`(|%9 zw7+3;`+Q1n1?2o)$9GqKcH8Hf^IthSz_&iL;m1H@OX&dr1A!U_Nm_1*p8x;=07*qo IM6N<$f)YrsssI20 literal 0 HcmV?d00001 diff --git a/Resources/images/SwapEdge.png b/Resources/images/SwapEdge.png new file mode 100644 index 0000000000000000000000000000000000000000..08f925c86237386cdf06955cb3f8e2ffcb800138 GIT binary patch literal 1989 zcmV;$2RitPP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf2UA|Uq|7bvtnivFoLNoz`w6skMg?8z&M|XU`nK!dXciP?U%yipNvK+Gu>E|==y_s(J znFIz@s5o7RUoTz7t&VP3EoOdnWZ>!ZB6YkSi*sh+rA2f3(GXC8V0IilCFH+VDjYde zFStE@{OHKT!@hQMAQy59ML+CEMzk`Cv)^i2|)6*))Whl z?p}Um^l`7-DLOh`z6eSHI`gAhUdF*9WUt@H|0W3HBDm|&Z_7d3Q)7XRy)M`=hQ9(hdbUBlRGKz?d|WuNX<5JPJPrGc7cU|w zCkJ=$-o=Fr7Z4vG&!3H5NZvXv3AW9v(N$T8z9m!e*e{LZboQsu>%|*;Pr`hwqf7NB zr@Fctt*xy{PEN+WdGo}P;qiFb-0F+ThsPtpG|3L@rWbLC$tS#!jn=KD+$Io<*^Jwr z-7pVyhev0;p`ihdjg3f6O+|iwK6-k3`qhjD1i=jJ)Fh1ETnNYUD@a`S0G!2T@Z7k^ zU(p{ci@;|8z$?7XW{dd;OcpMDWS8Ie*k&KKwH;6Hx#{ErL;N0?Auw*l$@AB!4erc_QKf zgnxvlrY13h5o>}hZ+oB4d;^o8=_jwg+7Coj0SGxleSN(WLC@(BAb*6(FC}?e@S>L| zq7Fb96+xQwLGqssU7i?H07CBw%AD6ho)~ffLazw2eEbJ&!4u{0*HoU+Bmkjx1ZCJW z`OeCEBtA>>6`INungt-Vil8ibbmnFGecH`A_&j>*q}vqWEcLbm{fe*}7OQ7wZ1nRm$YpI7QGPv{zekR#O9 z)hQADZ<_;#y>jN6{B`~13Ecw_!4cBa(|H6ZEK`{LRxbZEmp9%ZWI!q5N`79`A^h^x!zplSOa zWW4qOzJC}bliw*n1P-lgZPZH%A~Z6Doop_X(N=P~>;W@|kcm`EZB58o?1VGBU(Zs%RNu$N>W6 zzpqB(5|Tfvy4pvI-VufrAe6l8z|n~3{9x!AA?g4=`SqfF0+)|=&JTuO5uyqp%1>tU zJ4ya8QQpnvwLJ5|=n)~}0Lq!)#pJ(Z@=r+eS`T|Qw2lx_07*VsI`g9ZeQqEiFZ1VIh)|lK8X0v2&N<_OOx67K(mb zX1atv;d%DdfjHmRlacx;DJcOL#L6QIT6bj%x3>aqN%+N zadu!#kBtp4`oBgd?d|R2)gUu7lOF+2R$W2uwH6eudz>ZWNZaO|{BNU|dp&{M=9B=m znUFRW(&oa^3dyT(oFr&lDb+b~{xUx@dN^4{TW9w%`M~XS0e6CNRtxIBd56u9Ry?wC zKU*mq#LLA<#ml~STJ6cD=4y-R7Dv}{KL*@BU(UDB-yVtE=jl41XvgB*8F*QB`#kVJ XP+S2dp4b6y00000NkvXXu0mjfE$FiM literal 0 HcmV?d00001 diff --git a/Resources/images/Thicken.png b/Resources/images/Thicken.png new file mode 100644 index 0000000000000000000000000000000000000000..add5299be52a122f2058cf799d93a7c5f6573430 GIT binary patch literal 3726 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 literal 0 HcmV?d00001 diff --git a/Resources/images/Weld.png b/Resources/images/Weld.png new file mode 100644 index 0000000000000000000000000000000000000000..c81013e161a37519118a81484a5a1c8deaaab325 GIT binary patch literal 1201 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%0DlI43-+7tj_~XCOs2kkhg- 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 z%#Q;_I6PSf;_>);>c6^=iJ5@GgetObjectByPersistentID(select_info.object_id_); + AdapterObject* object = dataManager_->getObjectByPersistentID(select_info.object_id_); if (object == nullptr) return AMCAX::Coord3(0.0, 0.0, 0.0); MOperation_getCenter mo_select(type_); mo_select.setSelectInfoCamera(select_info); - object->doOperate(&mo_select); + //object->doOperate(&mo_select); + + mo_select.operate(object); AMCAX::Coord3 c = mo_select.getCenter(); return c; } @@ -110,28 +176,30 @@ AMCAX::Coord3 AMCore::getSelectedObject_Normal(const SelectInfoWithCamera& selec s_info_list.push_back(SelectInfo(select_info.object_id_, select_info.object_subselect_id_)); int object_id = select_info.object_id_; - BaseObject* object = dataManager_->getObjectByPersistentID(object_id); + AdapterObject* object = dataManager_->getObjectByPersistentID(object_id); MOperation_getDirection* mo_select = new MOperation_getDirection(type_); mo_select->setselectInfo(s_info_list); - object->doOperate(mo_select); + //object->doOperate(mo_select); + mo_select->operate(object); n = mo_select->getDirection(); delete mo_select; return n; } -void AMCore::getSelectedObject_BBox(const SelectInfoWithCamera& select_info, SelectModel type_, AMCAX::Coord3 & bbmin, AMCAX::Coord3 & bbmax) +void AMCore::getSelectedObject_BBox(const SelectInfoWithCamera& select_info, SelectModel type_, AMCAX::Coord3& bbmin, AMCAX::Coord3& bbmax) { std::vector s_info_list; s_info_list.push_back(SelectInfo(select_info.object_id_, select_info.object_subselect_id_)); int object_id = select_info.object_id_; - BaseObject* object = dataManager_->getObjectByPersistentID(object_id); + AdapterObject* object = dataManager_->getObjectByPersistentID(object_id); MOperation_getBoundingBox* mo_select = new MOperation_getBoundingBox(type_); mo_select->setselectInfo(s_info_list); - object->doOperate(mo_select); + //object->doOperate(mo_select); + mo_select->operate(object); mo_select->getBoundingBox(bbmin, bbmax); @@ -139,7 +207,7 @@ void AMCore::getSelectedObject_BBox(const SelectInfoWithCamera& select_info, Sel } void AMCore::getSelectedObject_Plane(const std::vector& select_info_list, - SelectModel type_, AMCAX::Coord3 & center, AMCAX::Coord3 & normal) + SelectModel type_, AMCAX::Coord3& center, AMCAX::Coord3& normal) { std::vector s_info_list; extractSelectInfoList(select_info_list, s_info_list); @@ -150,13 +218,14 @@ void AMCore::getSelectedObject_Plane(const std::vector& se } int object_id = s_info_list[0].object_id_; - BaseObject* object = dataManager_->getObjectByPersistentID(object_id); + AdapterObject* object = dataManager_->getObjectByPersistentID(object_id); if (object == nullptr) return; MOperation_getPlane mo_getplane(type_); mo_getplane.setselectInfo(s_info_list); - object->doOperate(&mo_getplane); + //object->doOperate(&mo_getplane); + mo_getplane.operate(object); center = mo_getplane.getCenter(); normal = mo_getplane.getDirection(); } @@ -199,15 +268,20 @@ void AMCore::beginOperationByAxis(std::vector& select_info const SelectInfoWithCamera& s_info = select_info_list[i]; BaseObject* object = dataManager_->getObjectByPersistentID(s_info.object_id_); - if (object->dataType() == DataType::BREP_TYPE) - { - BRepObject* brep_object = dynamic_cast (object); - brep_object->mesh_OPvert_Backup(); - } + + AdapterObject* brep_object = dynamic_cast (object); + brep_object->mesh_OPvert_Backup(); + } } else if (type_ == SelectModel::VERTEX_MODEL || type_ == SelectModel::EDGE_MODEL || type_ == SelectModel::FACE_MODEL) { + + void (AdapterObject:: * ptr[3])(const std::vector&) { + &AdapterObject::mesh_OPvert_BackupVertes, & AdapterObject::mesh_OPvert_BackupEdges, + & AdapterObject::mesh_OPvert_BackupFaces + }; + std::vector s_object_list = getSelectObjectList(select_info_list); std::vector> s_s_object_list; s_s_object_list.clear(); for (size_t si = 0; si < s_object_list.size(); si++) @@ -218,119 +292,144 @@ void AMCore::beginOperationByAxis(std::vector& select_info for (int si = 0; si < s_object_list.size(); si++) { - BaseObject* obj = dataManager_->getObjectByPersistentID(s_object_list[si]); - if (obj->dataType() == DataType::BREP_TYPE) - { - BRepObject* brep_object = dynamic_cast (obj); - brep_object->mesh_OPvert_Backup(); - } + AdapterObject* adapter = dataManager_->getObjectByPersistentID(s_object_list[si]); + + //AdapterObject* adapter = dynamic_cast (obj); + + (adapter->*ptr[(size_t)type_])(s_s_object_list[si]); + } } + } void AMCore::scaleSelectedObject(std::vector& select_info_list, - SelectModel type_, const AMCAX::Coord3 & center, const AMCAX::Coord3 & axis, double scale, int scale_type) + SelectModel type_, const AMCAX::Coord3& center, const AMCAX::Coord3& axis, double scale, int scale_type) { std::vector select_object_id = getSelectObjectList(select_info_list); for (int i = 0; i < select_object_id.size(); i++) { - BaseObject* object = dataManager_->getObjectByPersistentID(select_object_id[i]); - if (object->dataType() == DataType::BREP_TYPE) + AdapterObject* object = dataManager_->getObjectByPersistentID(select_object_id[i]); + dataManager_->RecordModifyBegin({ object }); + switch (scale_type) + { + case 0: { - std::cout << "Can not scale BRep shape Now"; - continue; + object->meshScaleSingle(center, axis, scale); + } + break; + case 1: + { + object->meshScalePlane(center, axis, scale); + } + break; + default: + break; } } + } void AMCore::rotateSelectedObject(std::vector& select_info_list, - SelectModel type_, const AMCAX::Coord3 & center, const AMCAX::Coord3 & axis, double scale) + SelectModel type_, const AMCAX::Coord3& center, const AMCAX::Coord3& axis, double scale) { std::vector select_object_id = getSelectObjectList(select_info_list); for (int i = 0; i < select_object_id.size(); i++) { - BaseObject* object = dataManager_->getObjectByPersistentID(select_object_id[i]); - if (object->dataType() == DataType::BREP_TYPE) - { - if (type_ != SelectModel::OBJECT_MODEL) - { - std::cout << "Can not rotate BRep sub shape"; - continue; - } + AdapterObject* object = dataManager_->getObjectByPersistentID(select_object_id[i]); - BRepObject* brep_object = dynamic_cast (object); - brep_object->meshRotation(center, axis, scale); - } + dataManager_->RecordModifyBegin({ object }); + + object->meshRotation(center, axis, scale); } } void AMCore::rotateSelectedObject(std::vector& object_list, - SelectModel type_, const AMCAX::Coord3 & center, const AMCAX::Coord3 & axis, double scale, const std::string& label) + SelectModel type_, const AMCAX::Coord3& center, const AMCAX::Coord3& axis, double scale, const std::string& label) { - for (auto *object: object_list) + for (auto* object : object_list) { - if (object->dataType() == DataType::BREP_TYPE) - { - if (type_ != SelectModel::OBJECT_MODEL) - { - std::cout << "Can not rotate BRep sub shape"; - continue; - } - BRepObject* brep_object = dynamic_cast (object); - brep_object->meshRotation(center, axis, scale); - } + + AdapterObject* brep_object = dynamic_cast (object); + brep_object->meshRotation(center, axis, scale); + if (label != "") // default empty label { object->setLabel(label); } } + + } -void AMCore::moveSelectedObject(std::vector& object_list, SelectModel type_, const AMCAX::Coord3 & trans, double distance, const std::string &label) +void AMCore::moveSelectedObject(std::vector& object_list, SelectModel type_, const AMCAX::Coord3& trans, double distance, const std::string& label) { - for (auto *object: object_list) - { - if (object->dataType() == DataType::BREP_TYPE) - { - if (type_ != SelectModel::OBJECT_MODEL) - { - std::cout << "Can not rotate BRep sub shape"; - continue; - } - BRepObject* brep_object = dynamic_cast (object); - brep_object->meshMove(trans, distance); - } + //bool empty = dataManager_->isEmptyAuto(); + + + dataManager_->RecordModifyBegin(object_list); + + + for (auto* object : object_list) + { + //if (object->dataType() == DataType::BREP_TYPE || object->dataType() == DataType::MESH_TYPE) + //{ + //AdapterObject* brep_object = dynamic_cast (object); + object->meshMove(trans, distance); + //} if (label != "") // default empty label { object->setLabel(label); } } + + } -void AMCore::moveSelectedObject(std::vector& select_info_list, SelectModel type_, const AMCAX::Coord3 & trans, double distance) +void AMCore::moveSelectedObject(std::vector& select_info_list, SelectModel type_, const AMCAX::Coord3& trans, double distance) { std::vector select_object_id = getSelectObjectList(select_info_list); - std::vector object_list(select_object_id.size()); + std::vector object_list(select_object_id.size()); std::transform(select_object_id.begin(), select_object_id.end(), - object_list.begin(), [&](const int &id) { return dataManager_->getObjectByPersistentID(id); }); + object_list.begin(), [&](const int& id) { return dataManager_->getObjectByPersistentID(id); }); moveSelectedObject(object_list, type_, trans, distance); } +void AMCore::getSelectedObject_Element_closet(const SelectInfoWithCamera& select_info, SelectModel type_, AMCAX::Coord3& op_v) +{ + if (type_ == SelectModel::OBJECT_MODEL) + return; + + AdapterObject* object = dataManager_->getObjectByPersistentID(select_info.object_id_); + + MOperation_SelectCloset mo_select(type_); + mo_select.setSelectInfoCamera(select_info); + //object->doOperate(&mo_select); + mo_select.operate(object); + + MPoint3 op_mp = mo_select.getCloset(); + //MathUtils::CopyMVec2Coord(op_mp, op_v); + op_v = op_mp.Coord(); +} + void AMCore::endOperationByAxis(std::vector& select_info_list, SelectModel type_) { std::vector select_object_id = getSelectObjectList(select_info_list); for (int i = 0; i < select_object_id.size(); i++) { - BaseObject* object = dataManager_->getObjectByPersistentID(select_object_id[i]); + AdapterObject* object = dataManager_->getObjectByPersistentID(select_object_id[i]); + object->mesh_Clear_OPvertBackup(); + dataManager_->RecordModifyEnd({ object }); + object->updateDraw(); } } @@ -345,54 +444,113 @@ void AMCore::OperateSelectedObject(const SelectModel& s_model, const SelectInfoW if (s_model != SelectModel::OBJECT_MODEL) return; - BaseObject* obj = dataManager_->getObjectByPersistentID(s_info.object_id_); + AdapterObject* obj = dataManager_->getObjectByPersistentID(s_info.object_id_); for (int si = 0; si < single_operation_list_.size(); si++) { if (single_operation_list_[si]->OperationType() == mesh_op_type_) { single_operation_list_[si]->setSelectModel(s_model); - obj->doOperate(single_operation_list_[si]); - createBackupNormalOp(obj); + dataManager_->RecordModifyBegin({ obj }); + //obj->doOperate(single_operation_list_[si]); + single_operation_list_[si]->operate(obj); + dataManager_->RecordModifyEnd({ obj }); + //createBackupNormalOp(obj); return; } } - if (mesh_op_type_ == MeshOperationType::MeshCopy) { - BaseObject* copy_object = dataManager_->copyObject(obj); + switch (mesh_op_type_) + { + case acamcad::MeshOperationType::MeshCopy: + { + AdapterObject* copy_object = dataManager_->copyObject(obj); if (copy_object != nullptr) - undoRedoHandler_->recordOperation(copy_object, ActionType::AddObject); + dataManager_->RecordAddObject({ copy_object }); + //undoRedoHandler_->recordOperation(copy_object, ActionType::AddObject); } - else if (mesh_op_type_ == MeshOperationType::MeshDelete) { + break; + case acamcad::MeshOperationType::MeshDelete: + { if (obj != nullptr) { - record_->recordDelete(obj); - undoRedoHandler_->recordOperation(obj, ActionType::DeleteObject); + //record_->recordDelete(obj); + dataManager_->RecordDeleteObject({ obj }); + + //undoRedoHandler_->recordOperation(obj, ActionType::DeleteObject); } dataManager_->deleteObject(obj); + + } + break; + case acamcad::MeshOperationType::MeshSubdiceCC: + { + if (obj->dataType() == DataType::MESH_TYPE) { + //AdapterObject* adapter = dynamic_cast(obj); + + dataManager_->RecordModifyBegin({ obj }); + + obj->mesh->subdivemeshCC(); + + dataManager_->RecordModifyEnd({ obj }); + //adapter->updateDraw(); + + + ///dataManager_->addObject() + } + else { + std::cout << "acamcad::MeshOperationType::MeshSubdiceCC do not support undo redo" << std::endl; + } + + } + break; + case acamcad::MeshOperationType::MeshSubdiveLoop: + { + if (obj->dataType() == DataType::MESH_TYPE) { + dataManager_->RecordModifyBegin({ obj }); + //AdapterObject* adapter = dynamic_cast(obj); + obj->mesh->subdivemeshLoop(); + //adapter->updateDraw(); + //AdapterObject* news = new AdapterObject(*obj); + dataManager_->RecordModifyEnd({ obj }); + ///dataManager_->addObject() + } + else + { + std::cout << "acamcad::MeshOperationType::MeshSubdiceCC do not support undo redo" << std::endl; + } + } + break; + default: + break; } } void AMCore::deleteObject(BaseObject* obj) { - if (obj != nullptr) - undoRedoHandler_->recordOperation(obj, ActionType::DeleteObject); - dataManager_->deleteObject(obj); + //if (obj != nullptr) + // undoRedoHandler_->recordOperation(obj, ActionType::DeleteObject); + + AdapterObject* adapter = dynamic_cast(obj); + + + dataManager_->RecordDeleteObject({ adapter }); + dataManager_->deleteObject(adapter); } -BaseObject *AMCore::getObjectByPersistentID(const int pid) const +BaseObject* AMCore::getObjectByPersistentID(const int pid) const { for (auto it = dataManager_->objects_begin(); it != dataManager_->objects_end(); ++it) { - if ((*it)->persistentId() == pid) + if ((*it)->persistentId() == pid) { return *it; } } - return nullptr; + return nullptr; } -std::vector AMCore::getObjectByLabel(const std::string &label) const +std::vector AMCore::getObjectByLabel(const std::string& label) const { - std::vector objs{}; + std::vector objs{}; for (auto it = dataManager_->objects_begin(); it != dataManager_->objects_end(); ++it) { if ((*it)->label() == label) @@ -403,7 +561,7 @@ std::vector AMCore::getObjectByLabel(const std::string &label) con return objs; } -MultOperate *AMCore::getMultOperateByOperationType(const MeshOperationType &ot) +MultOperate* AMCore::getMultOperateByOperationType(const MeshOperationType& ot) { for (int i = 0; i < mult_operation_list_.size(); i++) { @@ -415,54 +573,44 @@ MultOperate *AMCore::getMultOperateByOperationType(const MeshOperationType &ot) return nullptr; } -void AMCore::OperateSelectedObject(std::vector objectList, MultOperate *operate, const std::string &label) +void AMCore::OperateSelectedObject(std::vector objectList, MultOperate* operate, const std::string& label) { operate->setObjectList(objectList); - operate->checkOjbectTypeUnanimous(); + //operate->checkOjbectTypeUnanimous(); if (operate->checkOjbectTypeUnanimous()) { - BaseObject* newObject = nullptr; + AdapterObject* newObject = nullptr; std::vector persistent_id_list; for (int i = 0; i < objectList.size(); i++) { persistent_id_list.emplace_back(objectList[i]->persistentId()); } - DataType type = operate->ObjectType(); - if (type == DataType::BREP_TYPE) - newObject = operate->operateWithBRep(); + //DataType type = operate->ObjectType(); + //if (type == DataType::BREP_TYPE) + newObject = dynamic_cast(operate->operate()); + if (!newObject) + return; + if (label != "") // default empty label { newObject->setLabel(label); } // else the object will take the label of the first object in the list + dataManager_->RecordModifyBegin(objectList); for (int i = 0; i < objectList.size(); i++) { - std::cerr <<"persistentId:" << objectList[i]->persistentId() << "\n"; + std::cerr << "persistentId:" << objectList[i]->persistentId() << "\n"; std::cerr << "label:" << objectList[i]->label() << "\n"; - undoRedoHandler_->recordOperation(objectList[i], ActionType::DeleteObject); - dataManager_->deleteObject(objectList[i]); + //undoRedoHandler_->recordOperation(objectList[i], ActionType::DeleteObject); + //dataManager_->RecordModifyOldObject() + dataManager_->deleteObject(dynamic_cast(objectList[i])); } dataManager_->addObject(newObject); - undoRedoHandler_->recordOperation(newObject, ActionType::AddObject); - if (record_ != 0) - { - switch (operate->OperationType()) - { - case MeshOperationType::MeshCommon: { - record_->recordCommon(dataManager_->getLastPersistentId(), persistent_id_list); - }break; - case MeshOperationType::MeshFuse: { - record_->recordFuse(dataManager_->getLastPersistentId(), persistent_id_list); - }break; - case MeshOperationType::MeshCut: { - record_->recordCut(dataManager_->getLastPersistentId(), persistent_id_list); - }break; - default:; - } - } + ///undoRedoHandler_->recordOperation(newObject, ActionType::AddObject); + dataManager_->RecordModifyEnd({ newObject }); } - + operate->reInline(); } @@ -472,15 +620,15 @@ void AMCore::OperateSelectedObject(const SelectModel& s_model, const std::vector if (s_model != SelectModel::OBJECT_MODEL) return; - auto operate = getMultOperateByOperationType(mesh_op_type_); - if (operate) + auto operate = getMultOperateByOperationType(mesh_op_type_); + if (operate) { - std::vector objectList(s_info_vector.size()); + std::vector objectList(s_info_vector.size()); for (int i = 0; i < s_info_vector.size(); i++) { objectList[i] = dataManager_->getObjectByPersistentID(s_info_vector[i].object_id_); } - + OperateSelectedObject(objectList, operate); return; } @@ -491,12 +639,25 @@ void AMCore::OperateSelectedObject(const SelectModel& s_model, const std::vector } } -void AMCore::OperateSelectedObject(const SelectModel& s_model, const SelectInfoWithCamera& s_info, const AMCAX::Coord3 & center, const AMCAX::Coord3 & axis) +void AMCore::OperateSelectedObject(const SelectModel& s_model, const SelectInfoWithCamera& s_info, const AMCAX::Coord3& center, const AMCAX::Coord3& axis) { if (s_model != SelectModel::OBJECT_MODEL) return; - BaseObject* obj = dataManager_->getObjectByPersistentID(s_info.object_id_); + AdapterObject* obj = dataManager_->getObjectByPersistentID(s_info.object_id_); + + switch (mesh_op_type_) + { + case acamcad::MeshOperationType::MeshMirror: + { + dataManager_->RecordModifyBegin({ obj }); + obj->mirror(center, axis); + dataManager_->RecordModifyEnd({ obj }); + } + break; + default: + break; + } } @@ -525,13 +686,7 @@ void AMCore::OperateSelectedObject(const SelectModel& s_model, const std::vector { std::cout << "can not Operate select different object" << std::endl; return; - } - int object_id = s_info_list[0].object_id_; - BaseObject* obj = dataManager_->getObjectByPersistentID(object_id); - if (obj != nullptr) - { - createBackupNormalOp(obj); } } } @@ -554,12 +709,22 @@ void AMCore::OperateSelectedObject_Subset(const SelectModel& s_model, std::vecto { if (single_operation_list_[si]->OperationType() == mesh_op_type_) { - BaseObject* obj = dataManager_->getObjectByPersistentID(object_id); + AdapterObject* obj = dataManager_->getObjectByPersistentID(object_id); single_operation_list_[si]->setSelectModel(s_model); single_operation_list_[si]->setselectInfo(s_info_list); - obj->doOperate(single_operation_list_[si]); - createBackupNormalOp(obj); + dataManager_->RecordModifyBegin({ obj }); + //obj->doOperate(single_operation_list_[si]); + std::vector vec; + + bool bOperate = single_operation_list_[si]->operate(obj); + if (bOperate) + vec.push_back(obj); + + dataManager_->RecordModifyEnd(vec); + //else + // dataManager_->RecordModifyNewObject({ }); + //createBackupNormalOp(obj); } } @@ -580,7 +745,7 @@ void AMCore::OperateSelectedObject_Subset(const SelectModel& s_model, std::vecto } void AMCore::OperateSelectedObject_Subset_Split(const SelectModel& s_model, - const std::vector& s_info_vector, std::vector& point_list) + const std::vector& s_info_vector, std::vector& point_list) { //在调用时备份了,不一定对 @@ -600,13 +765,21 @@ void AMCore::OperateSelectedObject_Subset_Split(const SelectModel& s_model, { if (single_operation_list_[si]->OperationType() == mesh_op_type_) { - BaseObject* obj = dataManager_->getObjectByPersistentID(object_id); + AdapterObject* obj = dataManager_->getObjectByPersistentID(object_id); single_operation_list_[si]->setSelectModel(s_model); single_operation_list_[si]->setselectInfo(s_info_list); single_operation_list_[si]->setParameter(point_list); - obj->doOperate(single_operation_list_[si]); + //obj->doOperate(single_operation_list_[si]); + + dataManager_->RecordModifyBegin({ obj }); + std::vector vec; + bool flag = single_operation_list_[si]->operate(obj); + if (flag) { + vec.push_back(obj); + } + dataManager_->RecordModifyEnd(vec); } } @@ -617,7 +790,7 @@ void AMCore::OperateSelectedObject_Subset_Split(const SelectModel& s_model, } void AMCore::OperateSelectedObject_Subset_Extrude(const SelectModel& s_model, - std::vector& s_info_vector, AMCAX::Coord3 & vector) + std::vector& s_info_vector, AMCAX::Coord3& vector) { std::vector s_info_list(s_info_vector.size()); for (int i = 0; i < s_info_vector.size(); i++) @@ -635,15 +808,22 @@ void AMCore::OperateSelectedObject_Subset_Extrude(const SelectModel& s_model, { if (single_operation_list_[si]->OperationType() == mesh_op_type_) { - BaseObject* obj = dataManager_->getObjectByPersistentID(object_id); + AdapterObject* obj = dataManager_->getObjectByPersistentID(object_id); single_operation_list_[si]->setSelectModel(s_model); single_operation_list_[si]->setselectInfo(s_info_list); - obj->doOperate(single_operation_list_[si]); + dataManager_->RecordModifyBegin({ obj }); + bool result = single_operation_list_[si]->operate(obj); + if (!result) + { + dataManager_->clearModify(); + continue; + } + //obj->doOperate(single_operation_list_[si]); s_info_list = single_operation_list_[si]->getSelectInfoNew(); std::vector s_list = single_operation_list_[si]->getOperateIdNew(); - vector = single_operation_list_[si]->getCoord3Direction(); + vector = single_operation_list_[si]->getDirection(); s_info_vector.resize(s_info_list.size()); for (int i = 0; i < s_info_list.size(); i++) @@ -652,6 +832,22 @@ void AMCore::OperateSelectedObject_Subset_Extrude(const SelectModel& s_model, s_info_vector[i].object_subselect_id_ = s_info_list[i].object_subselect_id_; } + switch (s_model) + { + case SelectModel::EDGE_MODEL: + { + obj->mesh_OPvert_BackupEdges(s_list); + } + break; + case SelectModel::FACE_MODEL: + { + obj->mesh_OPvert_BackupFaces(s_list); + } + break; + default: + break; + } + } } @@ -659,10 +855,10 @@ void AMCore::OperateSelectedObject_Subset_Extrude(const SelectModel& s_model, //MeshOperationType::MeshExtrudeFace } -void AMCore::OperateSelectedObjectFaceExtrude(const SelectModel& s_model, std::vector& s_info_vector, AMCAX::Coord3d & vector) +void AMCore::OperateSelectedObjectFaceExtrude(const SelectModel& s_model, std::vector& s_info_vector, AMCAX::Coord3d& vector) { if (s_info_vector.size() != 1) - return; + return; std::vector s_info_list(s_info_vector.size()); for (int i = 0; i < s_info_vector.size(); i++) @@ -671,16 +867,20 @@ void AMCore::OperateSelectedObjectFaceExtrude(const SelectModel& s_model, std::v s_info_list[i].object_subselect_id_ = s_info_vector[i].object_subselect_id_; } int object_id = s_info_list[0].object_id_; - BaseObject* obj = dataManager_->getObjectByPersistentID(object_id); - + AdapterObject* obj = dataManager_->getObjectByPersistentID(object_id); + if (mesh_op_type_ == MeshOperationType::MeshExtrudeFace) { + dataManager_->RecordModifyBegin({ obj }); + SGLOperate_ExtrudeShape* exface = new SGLOperate_ExtrudeShape(SelectModel::FACE_MODEL); exface->setDirection(vector); - obj->doOperate(exface); - - createBackupNormalOp(obj); + //obj->doOperate(exface); + if (exface->operate(obj)) + dataManager_->RecordModifyEnd({ obj }); + else + dataManager_->clearModify(); delete exface; } @@ -691,46 +891,110 @@ void AMCore::OperateSelectedObjectFaceExtrude(const SelectModel& s_model, std::v // Back Up //======================================================================================= -void AMCore::createBackupNormalOp(BaseObject* object) + +void AMCore::createBackupSInfo(std::vector& select_info) { - undoRedoHandler_->recordOperation(object, ActionType::OperateObject); + } -void AMCore::createBackupSInfo(std::vector& select_info) +void AMCore::Redo() { - return; + //undoRedoHandler_->redo(); + dataManager_->Redo(); +} - if (select_info.empty()) - return; +void AMCore::Undo() +{ + //undoRedoHandler_->undo(); + dataManager_->Undo(); +} - std::set object_id_set; - for (int i = 0; i < select_info.size(); i++) - { - object_id_set.insert(select_info[i].object_id_); - } - std::vector object_id; - for (std::set::iterator it = object_id_set.begin(); it != object_id_set.end(); ++it) - { - object_id.push_back(*it); - } +void AMCore::createSubdSphereObject(const MPoint3& center, double radius, size_t subtime) +{ + //MSphere sphere(center, radius); + CreateOperate_QuadballTSpline cQuadball(center, radius, subtime); - for (int i = 0; i < object_id.size(); i++) - { - BaseObject* object = dataManager_->getObjectByPersistentID(object_id[i]); - createBackupNormalOp(object); - } + //TSplineUObject* newObject = new TSplineUObject(); + //newObject->doOperate(&cQuadball); + + //dataManager_->addObject(newObject); + //createBackupAdd(newObject); + AdapterObject* object = new AdapterObject; + object->setDataType(DataType::TSPLINEU_TYPE); + + cQuadball.operate(object); + dataManager_->addObject(object); + dataManager_->RecordAddObject({ object }); } -void AMCore::Redo() +void AMCore::createCylinderObject(const MPoint3& b_center, const AMCAX::Vector3& axis, double radius, double height, + size_t rf_num, size_t vf_num, bool top, bool bottom) { - undoRedoHandler_->redo(); + //AMCAX::Frame3 frame(b_center, AMCAX::Direction3(axis.Coord())); + //MCylinder cylinder(b_center, axis, radius, height); + CreateOperate_CylinderTSpline cCylinder(b_center, axis, radius, height, rf_num, vf_num, top, bottom); + + AdapterObject* object = new AdapterObject; + object->setDataType(DataType::TSPLINEU_TYPE); + + cCylinder.operate(object); + + dataManager_->addObject(object); + dataManager_->RecordAddObject({ object }); + + //TSplineUObject* newObject = new TSplineUObject(); + //newObject->doOperate(&cCylinder); + + //dataManager_->addObject(newObject); + //createBackupAdd(newObject); } -void AMCore::Undo() +void AMCore::createConeObject(const MPoint3& b_center, const AMCAX::Vector3& axis, double radius, double height, + size_t rf_num, size_t vf_num, bool bottom) +{ + //MCone cone(b_center, axis, radius, height); + CreateOperate_ConeTSpline cCone(b_center, axis, radius, height, rf_num, vf_num, bottom); + + AdapterObject* object = new AdapterObject; + object->setDataType(DataType::TSPLINEU_TYPE); + + cCone.operate(object); + + dataManager_->addObject(object); + dataManager_->RecordAddObject({ object }); + + +} + +void AMCore::creatTourObject(const MPoint3& center, double radius0, double radius1, size_t rf_num, size_t vf_num) { - undoRedoHandler_->undo(); + //MTorus tours(center, radius0, radius1); + AMCAX::Coord3 coord(center.Coord()); + CreateOperate_TorusTSpline cTorus(coord, AMCAX::Coord3(0.0, 0.0, 1.0), radius0, radius1, rf_num, vf_num); + + AdapterObject* object = new AdapterObject; + object->setDataType(DataType::TSPLINEU_TYPE); + + cTorus.operate(object); + + dataManager_->addObject(object); + dataManager_->RecordAddObject({ object }); + +} + +void AMCore::createCircular(const MPoint3& center, double radius, double angle, size_t c_num) +{ + CreateOperate_CircularTSpline cCircular(center.Coord(), AMCAX::Coord3(0.0, 0.0, 1.0), radius, angle, c_num); + AdapterObject* object = new AdapterObject; + object->setDataType(DataType::TSPLINEU_TYPE); + + cCircular.operate(object); + + dataManager_->addObject(object); + dataManager_->RecordAddObject({ object }); + } @@ -751,17 +1015,7 @@ void AMCore::setDataManager(DataManager* dataManager) dataManager_ = dataManager; } -DataManager *AMCore::getDataManager() const +DataManager* AMCore::getDataManager() const { return dataManager_; -} - -void AMCore::setBackupManager(BackupManager* backManager) -{ - backupManager_ = backManager; -} - -void AMCore::setUndoRedoHandler(UndoRedoHandler* undoRedoHandler) -{ - undoRedoHandler_ = undoRedoHandler; } \ No newline at end of file diff --git a/Src/Core/ACAMCore.h b/Src/Core/ACAMCore.h index 3d1abda..d1c6dec 100644 --- a/Src/Core/ACAMCore.h +++ b/Src/Core/ACAMCore.h @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #pragma once @@ -22,17 +22,19 @@ #include "../Object/ObjectDefine.h" #include "../Record/Record.h" +#include + namespace acamcad { - const QString FILE_EXT_AMCAX_BREP("abr"); + const QString FILE_EXT_AMCAX_BREP("abr"); const QString FILE_EXT_STEP("step"); const QString FILE_EXT_STP("stp"); class DataManager; - class BackupManager; + //class BackupManager; class MOperate_SingleObject; class MultOperate; - class UndoRedoHandler; + class UndoRedoHandler; class AMCore : public QObject { @@ -55,10 +57,11 @@ namespace acamcad void loadObjectsFromFile(const QString& filename); private: - void saveObjectsToFile(const QString& filename, std::vector::const_iterator& it_begin, std::vector::const_iterator& it_end); + void saveObjectsToFile(const QString& filename, std::vector::const_iterator& it_begin, std::vector::const_iterator& it_end); public: + //=============== BRep ======= void createBRepObject(acamcad::MOperation* operate, const std::string& label); int getLastPersistentId(); @@ -84,6 +87,23 @@ namespace acamcad void createWedgeBRepObject(const AMCAX::Coord3& center, const double dx, const double dy, const double dz, const double xmin, const double zmin, const double xmax, const double zmax, const std::string& label = ""); void createWedgeBRepObject(const AMCAX::Coord3& center, const AMCAX::Coord3& axis, const double dx, const double dy, const double dz, const double xmin, const double zmin, const double xmax, const double zmax, const std::string& label = ""); + //Mesh + void createPlaneMeshObject(MPoint3& p0, MPoint3& p1, size_t u_num, size_t v_num); + void createCubeMeshObject(const MPoint3& first, const MPoint3& second, size_t x_num = 2, size_t y_num = 2, size_t z_num = 2); + + //TSpline + void createPlaneObject(MPoint3& p0, MPoint3& p1, size_t u_num, size_t v_num); + void createCubeObject(const MPoint3& first, const MPoint3& second, size_t x_num, size_t y_num, size_t z_num); + void createUVSphereObject(const MPoint3& center, double radius, size_t rf_num, size_t vf_num); + void createSubdSphereObject(const MPoint3& center, double radius, size_t subtime); + void createCylinderObject(const MPoint3& b_center, const AMCAX::Vector3& axis, double radius, double height, + size_t rf_num, size_t vf_num, bool top, bool bottom); + void createConeObject(const MPoint3& b_center, const AMCAX::Vector3& axis, double radius, double height, + size_t rf_num, size_t vf_num, bool bottom); + + void creatTourObject(const MPoint3& center, double radius0, double radius1, size_t rf_num, size_t vf_num); + + void createCircular(const MPoint3& center, double radius, double angle, size_t c_num); public: // 根据已有的选择的信息,返回与选择的单元关联的单元,例如,根据一条边界边选中一整条边界。 void getSelectedObject_Element_Related(std::vector& select_info_list, SelectModel type_); @@ -104,9 +124,12 @@ namespace acamcad void scaleSelectedObject(std::vector& s_info_list, SelectModel type_, const AMCAX::Coord3& center, const AMCAX::Coord3& axis, double scale, int scale_type = 0); void rotateSelectedObject(std::vector& s_info_list, SelectModel type_, const AMCAX::Coord3& center, const AMCAX::Coord3& axis, double alpha); void rotateSelectedObject(std::vector& object_list, SelectModel type_, const AMCAX::Coord3& center, const AMCAX::Coord3& axis, double scale, const std::string& label); - void moveSelectedObject(std::vector& object_list, SelectModel type_, const AMCAX::Coord3& trans, double distance, const std::string& label = ""); + void moveSelectedObject(std::vector& object_list, SelectModel type_, const AMCAX::Coord3& trans, double distance, const std::string& label = ""); void moveSelectedObject(std::vector& s_info_list, SelectModel type_, const AMCAX::Coord3& trans, double distance); + // 根据选择信息SelectInfo,返回选中单元的最近点 + void getSelectedObject_Element_closet(const SelectInfoWithCamera& select_info, SelectModel type_, AMCAX::Coord3& op_v); + void endOperationByAxis(std::vector& s_info, SelectModel type_); public: @@ -117,7 +140,7 @@ namespace acamcad public: // 注意每个函数之能做一些对应的操作,要根据情况来看。 MultOperate* getMultOperateByOperationType(const MeshOperationType& ot); - void OperateSelectedObject(std::vector objectList, MultOperate* operate, const std::string& label = ""); + void OperateSelectedObject(std::vector objectList, MultOperate* operate, const std::string& label = ""); // 对选中的物体做对应的operation 根据mesh_op_type_的类型 void OperateSelectedObject(const SelectModel& s_model, const SelectInfoWithCamera& s_info); void OperateSelectedObject(const SelectModel& s_model, const std::vector& s_info_vector); @@ -144,8 +167,8 @@ namespace acamcad void Redo(); void Undo(); - private: - void createBackupNormalOp(BaseObject* object); + //private: + //void createBackupNormalOp(BaseObject* object); public: void addNewDataTypeFile(const QString&, const DataType&); @@ -161,7 +184,7 @@ namespace acamcad OperationDataType op_datatype_; //only use it for some creat function MeshOperationType mesh_op_type_; - acamcad::Record* record_; + //acamcad::Record* record_; private: void inlineSingleOperation(); @@ -171,16 +194,18 @@ namespace acamcad std::vector< MultOperate* > mult_operation_list_; public: - void setUndoRedoHandler(UndoRedoHandler* undoRedoHandler); + ///void setUndoRedoHandler(UndoRedoHandler* undoRedoHandler); void setDataManager(DataManager* dataManager); DataManager* getDataManager() const; - void setBackupManager(BackupManager* backManager); - void setRecord(Record& record) { record_ = &record; } + + + //void setBackupManager(BackupManager* backManager); + //void setRecord(Record& record) { record_ = &record; } private: DataManager* dataManager_; - BackupManager* backupManager_; - UndoRedoHandler* undoRedoHandler_; + //BackupManager* backupManager_; + //UndoRedoHandler* undoRedoHandler_; }; } //namespace acamcad; diff --git a/Src/Core/ACAMCoreCreate.cpp b/Src/Core/ACAMCoreCreate.cpp index e403ed4..38d2fec 100644 --- a/Src/Core/ACAMCoreCreate.cpp +++ b/Src/Core/ACAMCoreCreate.cpp @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "ACAMCore.h" @@ -26,21 +26,21 @@ namespace acamcad { - bool CheckCubeParamOK(const AMCAX::Coord3 & first, const AMCAX::Coord3 & second, const bool suppress=false) + bool CheckCubeParamOK(const AMCAX::Coord3& first, const AMCAX::Coord3& second, const bool suppress = false) { // check if the two MPoints are on a same panel if (std::fabs(first.X() - second.X()) < M_EPSILON || std::fabs(first.Y() - second.Y()) < M_EPSILON || std::fabs(first.Z() - second.Z()) < M_EPSILON) { - if (!suppress) { std::cout << __func__ << " param error " << std::endl; } + if (!suppress) { std::cout << __func__ << " param error " << std::endl; } return false; } return true; } - bool CheckSphereParamOK(const double radius, const double angle, const bool suppress=false) + bool CheckSphereParamOK(const double radius, const double angle, const bool suppress = false) { // is a positive valid number if (!std::isnan(radius) && !std::isinf(radius) && radius > M_EPSILON && @@ -48,18 +48,18 @@ namespace acamcad { return true; } - if (!suppress) { std::cout << __func__ << " param error " << std::endl; } + if (!suppress) { std::cout << __func__ << " param error " << std::endl; } return false; } - bool CheckCylinderParamOK(const AMCAX::Coord3 & axis, - const double radius, const double height, const double angle, const bool suppress=false) + bool CheckCylinderParamOK(const AMCAX::Coord3& axis, + const double radius, const double height, const double angle, const bool suppress = false) { // is a valid number bool arenum = (!std::isnan(radius)) && (!std::isnan(height)) && (!std::isnan(angle)); arenum &= (!std::isinf(radius)) && (!std::isinf(height)) && (!std::isinf(angle)); // is positive - bool arepositive = (radius > M_EPSILON) && (height > M_EPSILON); + bool arepositive = (radius > M_EPSILON) && (height > M_EPSILON); // if the axis is valid bool axisvalid = axis.Norm() > M_EPSILON; bool anglevalid = (angle > M_EPSILON) && (angle < 2.0 * M_PI + M_EPSILON); @@ -68,12 +68,12 @@ namespace acamcad { return true; } - if (!suppress) { std::cout << __func__ << " param error " << std::endl; } + if (!suppress) { std::cout << __func__ << " param error " << std::endl; } return false; } - bool CheckCylinderParamOK(const AMCAX::Coord3 & axis, const AMCAX::Coord3 & xaxis, - const double radius, const double height, const double angle, const double suppress=false) + bool CheckCylinderParamOK(const AMCAX::Coord3& axis, const AMCAX::Coord3& xaxis, + const double radius, const double height, const double angle, const double suppress = false) { bool othervalid = CheckCylinderParamOK(axis, radius, height, angle); bool xaxisvalid = xaxis.Norm() > M_EPSILON; @@ -83,21 +83,21 @@ namespace acamcad { return true; } - if (!suppress) { std::cout << __func__ << " param error " << std::endl; } + if (!suppress) { std::cout << __func__ << " param error " << std::endl; } return false; } - bool CheckConeParamOK(const AMCAX::Coord3 & axis, - const double r1, const double r2, const double h, const double angle, const bool suppress=false) - { + bool CheckConeParamOK(const AMCAX::Coord3& axis, + const double r1, const double r2, const double h, const double angle, const bool suppress = false) + { int cR1 = ::fpclassify(r1); int cR2 = ::fpclassify(r2); int cH = ::fpclassify(h); int cA = ::fpclassify(angle); - + bool arenum = (cR1 != FP_NAN) && (cR2 != FP_NAN) && (cH != FP_NAN) && (cA != FP_NAN); - arenum &= (cR1 != FP_INFINITE) && (cR2 != FP_INFINITE) && (cH != FP_INFINITE) && (cA != FP_INFINITE); - + arenum &= (cR1 != FP_INFINITE) && (cR2 != FP_INFINITE) && (cH != FP_INFINITE) && (cA != FP_INFINITE); + bool arepositive = ((r2 > M_EPSILON && r2 > M_EPSILON) || // both positive, truncated cone (cR1 == FP_ZERO && r2 > M_EPSILON) || (cR2 == FP_ZERO && r1 > M_EPSILON)) && // regular cone (h > M_EPSILON); @@ -109,58 +109,58 @@ namespace acamcad // if the axis is valid bool axisvalid = axis.Norm() > M_EPSILON; - - if (arenum && arepositive && !cylinder && anglevalid && axisvalid) + + if (arenum && arepositive && !cylinder && anglevalid && axisvalid) { return true; } - if (!suppress) { std::cout << __func__ << " param error " << std::endl; } + if (!suppress) { std::cout << __func__ << " param error " << std::endl; } return false; } - bool CheckConeParamOK(const AMCAX::Coord3 & axis, const AMCAX::Coord3 & xaxis, - const double r1, const double r2, const double h, const double angle, const bool suppress=false) - { + bool CheckConeParamOK(const AMCAX::Coord3& axis, const AMCAX::Coord3& xaxis, + const double r1, const double r2, const double h, const double angle, const bool suppress = false) + { bool othervalid = CheckConeParamOK(axis, r1, r2, h, angle, true); bool xaxisvalid = xaxis.Norm() > M_EPSILON; bool orth = axis.Dot(xaxis) == 0; - if (othervalid && xaxisvalid && orth) + if (othervalid && xaxisvalid && orth) { return true; } - if (!suppress) { std::cout << __func__ << " param error " << std::endl; } + if (!suppress) { std::cout << __func__ << " param error " << std::endl; } return false; } - bool CheckTorusParamOK(const AMCAX::Coord3 & axis, - const double r1, const double r2, const double angle, const bool suppress=false) - { + bool CheckTorusParamOK(const AMCAX::Coord3& axis, + const double r1, const double r2, const double angle, const bool suppress = false) + { int cR1 = ::fpclassify(r1); int cR2 = ::fpclassify(r2); int cA = ::fpclassify(angle); - - bool arenum = (cR1 != FP_NAN) && (cR2 != FP_NAN) && (cA != FP_NAN) + + bool arenum = (cR1 != FP_NAN) && (cR2 != FP_NAN) && (cA != FP_NAN) && (cR1 != FP_INFINITE) && (cR2 != FP_INFINITE) && (cA != FP_INFINITE); - - bool arepositive = (r1 > M_EPSILON && r2 > M_EPSILON); + + bool arepositive = (r1 > M_EPSILON && r2 > M_EPSILON); bool anglevalid = (angle > M_EPSILON) && (angle < 2.0 * M_PI + M_EPSILON); - + bool axisvalid = axis.Norm() > M_EPSILON; if (arenum && arepositive && anglevalid && axisvalid) { return true; } - if (!suppress) { std::cout << __func__ << "0 param error " << std::endl; } + if (!suppress) { std::cout << __func__ << "0 param error " << std::endl; } return false; } - bool CheckTorusParamOK(const AMCAX::Coord3 & axis, const AMCAX::Coord3 & xaxis, - - const double r1, const double r2, const double angle, const bool suppress=false) - { + bool CheckTorusParamOK(const AMCAX::Coord3& axis, const AMCAX::Coord3& xaxis, + + const double r1, const double r2, const double angle, const bool suppress = false) + { bool othervalid = CheckTorusParamOK(axis, r1, r2, angle, true); bool xaxisvalid = xaxis.Norm() > M_EPSILON; bool orth = axis.Dot(xaxis) == 0; @@ -169,27 +169,27 @@ namespace acamcad { return true; } - if (!suppress) { std::cout << __func__ << "1 param error " << std::endl; } + if (!suppress) { std::cout << __func__ << "1 param error " << std::endl; } return false; } - bool CheckPolygonParamOK(const std::vector& points, const bool suppress=false) + bool CheckPolygonParamOK(const std::vector& points, const bool suppress = false) { - if (points.size() >= 3 && MathUtils::isOnSamePlane(points) ) + if (points.size() >= 3 && MathUtils::isOnSamePlane(points)) { return true; } - if (!suppress) { std::cout << __func__ << " param error " << std::endl; } + if (!suppress) { std::cout << __func__ << " param error " << std::endl; } return false; } - bool CheckPrismParamOK(const std::vector& points, const AMCAX::Coord3d & prism, const bool suppress=false) + bool CheckPrismParamOK(const std::vector& points, const AMCAX::Coord3d& prism, const bool suppress = false) { if (CheckPolygonParamOK(points, true) && prism.Norm() > M_EPSILON) { return true; } - if (!suppress) { std::cout << __func__ << " param error " << std::endl; } + if (!suppress) { std::cout << __func__ << " param error " << std::endl; } return false; } } @@ -198,14 +198,20 @@ namespace acamcad { //=================================== BRep =================================== - void AMCore::createBRepObject(MOperation *operate, const std::string &label) + void AMCore::createBRepObject(MOperation* operate, const std::string& label) { - BRepObject* newObject = new BRepObject(); - newObject->setLabel(label); - newObject->doOperate(operate); + AdapterObject* adapter_object = new AdapterObject; + adapter_object->setDataType(acamcad::DataType::BREP_TYPE); + //adapter_object->bRep = std::make_unique(adapter_object); + + //BRepObject* newObject = new BRepObject(); + adapter_object->setLabel(label); + operate->operate(adapter_object); + //adapter_object->doOperate(operate); - dataManager_->addObject(newObject); - undoRedoHandler_->recordOperation(newObject, ActionType::AddObject); + dataManager_->addObject(adapter_object); + dataManager_->RecordAddObject({ adapter_object }); + //undoRedoHandler_->recordOperation(adapter_object, ActionType::AddObject); } @@ -213,73 +219,74 @@ namespace acamcad return dataManager_->getLastPersistentId(); } - void AMCore::createPlaneBRepObject(const AMCAX::Coord3 & first, const AMCAX::Coord3 & second, const std::string &label) + void AMCore::createPlaneBRepObject(const AMCAX::Coord3& first, const AMCAX::Coord3& second, const std::string& label) { AMCAX::Coord2 p0p(first.X(), first.Y()); AMCAX::Coord2 p1p(second.X(), second.Y()); - CreateOperate_Plane cPlane(p0p, p1p, 1, 1); + CreateOperate_Plane cPlane(p0p, p1p, 1, 1); createBRepObject(&cPlane, label); } - void AMCore::createCubeBRepObject(const AMCAX::Coord3 & first, const AMCAX::Coord3 & second, const std::string &label) + void AMCore::createCubeBRepObject(const AMCAX::Coord3& first, const AMCAX::Coord3& second, const std::string& label) { if (!CheckCubeParamOK(first, second)) return; CreateOperate_Cube cCube(first, second, 1, 1, 1); + createBRepObject(&cCube, label); } - - void AMCore::createSphereBRepObject(const AMCAX::Coord3 & center, double radius, - double angle1, double angle2, double angle3, - const std::string &label) + + void AMCore::createSphereBRepObject(const AMCAX::Coord3& center, double radius, + double angle1, double angle2, double angle3, + const std::string& label) { - if (!CheckSphereParamOK(radius, angle1)) + if (!CheckSphereParamOK(radius, angle1)) { return; // angle2 and angle3 is currently not used. range unknown. } - CreateOperate_Sphere cSphere(center, radius, angle1, angle2, angle3); + CreateOperate_Sphere cSphere(center, radius, angle1, angle2, angle3); createBRepObject(&cSphere, label); } - void AMCore::createCylinderBRepObject(const AMCAX::Coord3& b_center, const AMCAX::Coord3 & axis, - double radius, double height, double angle, - const std::string &label) + void AMCore::createCylinderBRepObject(const AMCAX::Coord3& b_center, const AMCAX::Coord3& axis, + double radius, double height, double angle, + const std::string& label) { if (!CheckCylinderParamOK(axis, radius, height, angle)) { return; } - CreateOperate_Cylinder cCylinder(b_center, radius, height, axis, angle); + CreateOperate_Cylinder cCylinder(b_center, radius, height, axis, angle); createBRepObject(&cCylinder, label); } - void AMCore::createCylinderBRepObject(const AMCAX::Coord3 & b_center, const AMCAX::Coord3 & axis, const AMCAX::Coord3 & xaxis, - double radius, double height, double angle, - const std::string &label) + void AMCore::createCylinderBRepObject(const AMCAX::Coord3& b_center, const AMCAX::Coord3& axis, const AMCAX::Coord3& xaxis, + double radius, double height, double angle, + const std::string& label) { if (!CheckCylinderParamOK(axis, xaxis, radius, height, angle)) { return; } - - CreateOperate_Cylinder cCylinder(b_center, radius, height, axis, xaxis, angle); + + CreateOperate_Cylinder cCylinder(b_center, radius, height, axis, xaxis, angle); createBRepObject(&cCylinder, label); } - void AMCore::createConeBRepObject(const AMCAX::Coord3 & b_center, const AMCAX::Coord3 & axis, - double radiusR, double radiusr, double height, - double angle, const std::string &label) + void AMCore::createConeBRepObject(const AMCAX::Coord3& b_center, const AMCAX::Coord3& axis, + double radiusR, double radiusr, double height, + double angle, const std::string& label) { - if (!CheckConeParamOK(axis, radiusR, radiusr, height, angle)) + if (!CheckConeParamOK(axis, radiusR, radiusr, height, angle)) { return; } @@ -289,10 +296,10 @@ namespace acamcad createBRepObject(&cTCone, label); } - void AMCore::createConeBRepObject(const AMCAX::Coord3 & b_center, const AMCAX::Coord3 & axis, const AMCAX::Coord3 & xaxis, - double radiusR, double radiusr, double height, double angle, const std::string &label) + void AMCore::createConeBRepObject(const AMCAX::Coord3& b_center, const AMCAX::Coord3& axis, const AMCAX::Coord3& xaxis, + double radiusR, double radiusr, double height, double angle, const std::string& label) { - if (!CheckConeParamOK(axis, xaxis, radiusR, radiusr, height, angle)) + if (!CheckConeParamOK(axis, xaxis, radiusR, radiusr, height, angle)) { return; } @@ -301,32 +308,32 @@ namespace acamcad createBRepObject(&cTCone, label); } - - void AMCore::createTorusBRepObject(const AMCAX::Coord3 & center, const AMCAX::Coord3 & axis, - double radius0, double radius1, - double angle, - const std::string &label) + + void AMCore::createTorusBRepObject(const AMCAX::Coord3& center, const AMCAX::Coord3& axis, + double radius0, double radius1, + double angle, + const std::string& label) { if (!CheckTorusParamOK(axis, radius0, radius1, angle)) { return; } - CreateOperate_Torus cTorus(center, radius0, radius1, axis, angle); - + CreateOperate_Torus cTorus(center, radius0, radius1, axis, angle); + createBRepObject(&cTorus, label); } - void AMCore::createTorusBRepObject(const AMCAX::Coord3 & center, const AMCAX::Coord3 & axis, const AMCAX::Coord3 & xaxis, - double radius0, double radius1, double angle, - const std::string &label) + void AMCore::createTorusBRepObject(const AMCAX::Coord3& center, const AMCAX::Coord3& axis, const AMCAX::Coord3& xaxis, + double radius0, double radius1, double angle, + const std::string& label) { if (!CheckTorusParamOK(axis, xaxis, radius0, radius1, angle)) { return; } - - CreateOperate_Torus cTorus(center, radius0, radius1, axis, xaxis, angle); - + + CreateOperate_Torus cTorus(center, radius0, radius1, axis, xaxis, angle); + createBRepObject(&cTorus, label); } @@ -341,7 +348,7 @@ namespace acamcad createBRepObject(&cPolygon, label); } - void AMCore::createPrismBRepObject(const std::vector& points, const AMCAX::Coord3d & prism_axis, const std::string& label) + void AMCore::createPrismBRepObject(const std::vector& points, const AMCAX::Coord3d& prism_axis, const std::string& label) { if (!CheckPrismParamOK(points, prism_axis)) { @@ -352,7 +359,7 @@ namespace acamcad createBRepObject(&cPrism, label); } - void AMCore::createRoundedPolygonBRepObject(const std::vector& points, const std::string &label) + void AMCore::createRoundedPolygonBRepObject(const std::vector& points, const std::string& label) { // TODO: CheckParamOk CreateOperate_RoundedPolygon cRPolygon(points); @@ -360,91 +367,237 @@ namespace acamcad createBRepObject(&cRPolygon, label); } - void AMCore::createRoundedPrismBRepObject(const std::vector& points, const AMCAX::Coord3 & prism_axis, const std::string &label) + void AMCore::createRoundedPrismBRepObject(const std::vector& points, const AMCAX::Coord3& prism_axis, const std::string& label) { // TODO: CheckParamOk CreateOperate_RoundedPrism cRPrism(points, prism_axis); - + createBRepObject(&cRPrism, label); } - void AMCore::createWedgeBRepObject(const double dx, const double dy, const double dz, const double ltx, - const std::string &label) + void AMCore::createWedgeBRepObject(const double dx, const double dy, const double dz, const double ltx, + const std::string& label) { CreateOperate_Wedge cWedge(dx, dy, dz, ltx); createBRepObject(&cWedge, label); } - void AMCore::createWedgeBRepObject(const AMCAX::Coord3 & center, - const double dx, const double dy, const double dz, const double ltx, - const std::string& label) + void AMCore::createWedgeBRepObject(const AMCAX::Coord3& center, + const double dx, const double dy, const double dz, const double ltx, + const std::string& label) { CreateOperate_Wedge cWedge(center, dx, dy, dz, ltx); createBRepObject(&cWedge, label); } - void AMCore::createWedgeBRepObject(const AMCAX::Coord3 & center, const AMCAX::Coord3 & axis, - const double dx, const double dy, const double dz, const double ltx, - const std::string& label) + void AMCore::createWedgeBRepObject(const AMCAX::Coord3& center, const AMCAX::Coord3& axis, + const double dx, const double dy, const double dz, const double ltx, + const std::string& label) { CreateOperate_Wedge cWedge(center, axis, dx, dy, dz, ltx); createBRepObject(&cWedge, label); } - void AMCore::createWedgeBRepObject(const double dx, const double dy, const double dz, - const double xmin, const double zmin, const double xmax, const double zmax, - const std::string &label) + void AMCore::createWedgeBRepObject(const double dx, const double dy, const double dz, + const double xmin, const double zmin, const double xmax, const double zmax, + const std::string& label) { CreateOperate_Wedge cWedge(dx, dy, dz, xmin, zmin, xmax, zmax); - + createBRepObject(&cWedge, label); } - void AMCore::createWedgeBRepObject(const AMCAX::Coord3 & center, - const double dx, const double dy, const double dz, - const double xmin, const double zmin, const double xmax, const double zmax, - const std::string &label) + void AMCore::createWedgeBRepObject(const AMCAX::Coord3& center, + const double dx, const double dy, const double dz, + const double xmin, const double zmin, const double xmax, const double zmax, + const std::string& label) { CreateOperate_Wedge cWedge(center, dx, dy, dz, xmin, zmin, xmax, zmax); - + createBRepObject(&cWedge, label); } - void AMCore::createWedgeBRepObject(const AMCAX::Coord3 & center, const AMCAX::Coord3 & axis, - const double dx, const double dy, const double dz, const double xmin, const double zmin, - const double xmax, const double zmax, const std::string &label) + void AMCore::createWedgeBRepObject(const AMCAX::Coord3& center, const AMCAX::Coord3& axis, + const double dx, const double dy, const double dz, const double xmin, const double zmin, + const double xmax, const double zmax, const std::string& label) { CreateOperate_Wedge cWedge(center, axis, dx, dy, dz, xmin, zmin, xmax, zmax); - + createBRepObject(&cWedge, label); } + //Mesh + void AMCore::createPlaneMeshObject(MPoint3& p0, MPoint3& p1, size_t u_num, size_t v_num) + { + //MPlane plane; + AMCAX::Coord2 p0p(p0.X(), p0.Y()); + AMCAX::Coord2 p1p(p1.X(), p1.Y()); + CreateOperate_PlaneMesh cPlane(p0p, p1p, u_num, v_num); + + AdapterObject* adapter = new AdapterObject; + adapter->setDataType(acamcad::DataType::MESH_TYPE); + + //adapter->doOperate(&cPlane); + + cPlane.operate(adapter); + + + //MeshObject* newObject = new MeshObject(); + //newObject->doOperate(&cPlane); + + dataManager_->addObject(adapter); + //createBackupAdd(newObject); + //undoRedoHandler_->recordOperation(adapter, ActionType::AddObject); + dataManager_->RecordAddObject({ adapter }); + } + + void AMCore::createCubeMeshObject(const MPoint3& first, const MPoint3& second, + size_t x_num, size_t y_num, size_t z_num) + { + AMCAX::Coord3 c0(first.X(), first.Y(), first.Z()), c1(second.X(), second.Y(), second.Z()); + + CreateOperate_CubeMesh cCube(c0, c1, x_num, y_num, z_num); + + AdapterObject* adapter = new AdapterObject; + adapter->setDataType(acamcad::DataType::MESH_TYPE); + + cCube.operate(adapter); + + + dataManager_->addObject(adapter); + //dataManager_->addObject(adapter); + //createBackupAdd(newObject); + //undoRedoHandler_->recordOperation(adapter, ActionType::AddObject); + dataManager_->RecordAddObject({ adapter }); + } + + void AMCore::createPlaneObject(MPoint3& p0, MPoint3& p1, size_t u_num, size_t v_num) + { + //MPlane plane; + AMCAX::Coord2 p0p(p0.X(), p0.Y()); + AMCAX::Coord2 p1p(p1.X(), p1.Y()); + CreateOperate_PlaneTSpline cPlane(p0p, p1p, u_num, v_num); + + AdapterObject* adapter = new AdapterObject; + adapter->setDataType(acamcad::DataType::TSPLINEU_TYPE); + + cPlane.operate(adapter); + + dataManager_->addObject(adapter); + + dataManager_->RecordAddObject({ adapter }); + + //createBackupAdd(newObject); + } + + void AMCore::createCubeObject(const MPoint3& first, const MPoint3& second, size_t x_num, size_t y_num, size_t z_num) + { + AMCAX::Coord3 min_bb = first.Coord(), + max_bb = second.Coord(); + CreateOperate_CubeTSpline cCube(min_bb, max_bb, x_num, y_num, z_num); + + + AdapterObject* adapter = new AdapterObject; + adapter->setDataType(acamcad::DataType::TSPLINEU_TYPE); + + cCube.operate(adapter); + + dataManager_->addObject(adapter); + + dataManager_->RecordAddObject({ adapter }); + } + + + void AMCore::createUVSphereObject(const MPoint3& center, double radius, size_t rf_num, size_t vf_num) + { + //MSphere sphere(center, radius); + CreateOperate_SphereTSpline cSphere(center.Coord(), radius, rf_num, vf_num); + + AdapterObject* adapter = new AdapterObject; + adapter->setDataType(acamcad::DataType::TSPLINEU_TYPE); + + cSphere.operate(adapter); + + dataManager_->addObject(adapter); + + dataManager_->RecordAddObject({ adapter }); + } //=========================================================== - void AMCore::OperatePointlistWithSelectedObject(const SelectModel& s_model, std::vector& c_info_vector, - std::vector& s_info_vector) + void AMCore::OperatePointlistWithSelectedObject(const SelectModel& s_model, std::vector& c_info_vector, + std::vector& s_info_vector) { if (s_model == SelectModel::CLICK_MODEL && mesh_op_type_ == MeshOperationType::MeshFaceAppend) { - std::vector point_list = getClickPointlist(c_info_vector); - BaseObject* newObject = nullptr; + ///MOperation* single; + acamcad::AdapterObject* newObject; + + switch (op_datatype_) + { + case DataType::BREP_TYPE: + { + std::vector point_list = getClickPointlist(c_info_vector); + newObject = new acamcad::AdapterObject; + newObject->setDataType(op_datatype_); + CreateOperate_SingleFace single(point_list); + if (!single.operate(newObject)) { + delete newObject; + return; + } + + break; + } + case DataType::MESH_TYPE: + { + ///std::vector point_list = getClickPointlist(c_info_vector); + //single = new CreateOperate_SingleFace(point_list); + std::vector point_list = getClickPointlist(c_info_vector); + newObject = new acamcad::AdapterObject; + newObject->setDataType(op_datatype_); + CreateOperate_SingleFaceMesh single(point_list); + if (!single.operate(newObject)) { + delete newObject; + return; + } + break; + } + case DataType::TSPLINEU_TYPE: + { + std::vector point_list = getClickPointlist(c_info_vector); + newObject = new acamcad::AdapterObject; + newObject->setDataType(op_datatype_); + CreateOperate_SingleFaceTSpline single(point_list); + if (!single.operate(newObject)) { + delete newObject; + return; + } + break; + } + default: + return; + } + + //std::vector point_list = getClickPointlist(c_info_vector); + + //BaseObject* newObject = nullptr; + + //CreateOperate_SingleFace* single = new CreateOperate_SingleFace(point_list); + //single->setObjectType(op_datatype_); + + //newObject = single->operateWithBRep(); + + dataManager_->addObject(newObject); + //undoRedoHandler_->recordOperation(newObject, ActionType::AddObject); + dataManager_->RecordAddObject({ newObject }); + + //delete single; - CreateOperate_SingleFace* single = new CreateOperate_SingleFace(point_list); - single->setObjectType(op_datatype_); - DataType type = op_datatype_; - if (type == DataType::BREP_TYPE) - newObject = single->operateWithBRep(); - else - return; - dataManager_->addObject(newObject); - undoRedoHandler_->recordOperation(newObject, ActionType::AddObject); - delete single; } } diff --git a/Src/Core/ACAMCoreFile.cpp b/Src/Core/ACAMCoreFile.cpp index 68899ab..337fbff 100644 --- a/Src/Core/ACAMCoreFile.cpp +++ b/Src/Core/ACAMCoreFile.cpp @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "ACAMCore.h" #include @@ -27,164 +27,202 @@ #include #include #include -#include +#include #include "DataManager.h" namespace acamcad { -void AMCore::addNewDataTypeFile(const QString& str, const DataType& dt) -{ - file_allowed_type_[str] = dt; -} - -void AMCore::loadObjects() -{ - static QString defaultDir = "."; - QString filter = "AMCAX BRep files (" "*." + FILE_EXT_AMCAX_BREP + ")"; - QString stepFilter = "STEP files (" "*." + FILE_EXT_STP + " " "*." + FILE_EXT_STEP + ")"; - QString finalFilter = filter + ";;" + stepFilter; - QString fileName = QFileDialog::getOpenFileName(NULL, "", defaultDir, finalFilter); - - if (!fileName.isEmpty()) + void AMCore::addNewDataTypeFile(const QString& str, const DataType& dt) { - auto lpos = std::max(fileName.lastIndexOf("/"), fileName.lastIndexOf("\\")); - defaultDir = fileName.left(lpos + 1); - loadObjectsFromFile(fileName); + file_allowed_type_[str] = dt; } -} -void AMCore::saveObjects() -{ - static QString defaultDir = "."; - QString filter = "AMCAX BRep files (" "*." + FILE_EXT_AMCAX_BREP + ")"; - QString stepFilter = "STEP files (" "*." + FILE_EXT_STP + " " "*." + FILE_EXT_STEP + ")"; - QString finalFilter = filter + ";;" + stepFilter; - QString fileName = QFileDialog::getSaveFileName(NULL, "", defaultDir, finalFilter); + void AMCore::loadObjects() + { + static QString defaultDir = "."; + QString filter = "AMCAX BRep files (" "*." + FILE_EXT_AMCAX_BREP + ")"; + QString stepFilter = "STEP files (" "*." + FILE_EXT_STP + " " "*." + FILE_EXT_STEP + ")"; + QString finalFilter = filter + ";;" + stepFilter; + QString fileName = QFileDialog::getOpenFileName(NULL, "", defaultDir, finalFilter); - saveObjects(fileName); -} + if (!fileName.isEmpty()) + { + auto lpos = std::max(fileName.lastIndexOf("/"), fileName.lastIndexOf("\\")); + defaultDir = fileName.left(lpos + 1); + loadObjectsFromFile(fileName); + } + } -void AMCore::saveObjects(const QString& filename) -{ - if (!filename.isEmpty()) + void AMCore::saveObjects() { - CObjectIter it_begin = dataManager_->objects_begin(); - CObjectIter it_end = dataManager_->objects_end(); + static QString defaultDir = "."; + QString filter = "AMCAX BRep files (" "*." + FILE_EXT_AMCAX_BREP + ")"; + QString stepFilter = "STEP files (" "*." + FILE_EXT_STP + " " "*." + FILE_EXT_STEP + ")"; + QString finalFilter = filter + ";;" + stepFilter; + QString fileName = QFileDialog::getSaveFileName(NULL, "", defaultDir, finalFilter); - saveObjectsToFile(filename, it_begin, it_end); + saveObjects(fileName); } -} -void AMCore::saveSelectedObjects() -{ - static QString defaultDir = "."; - QString filter = "AMCAX BRep files (" "*." + FILE_EXT_AMCAX_BREP + ")"; - QString stepFilter = "STEP files (" "*." + FILE_EXT_STP + " " "*." + FILE_EXT_STEP + ")"; - QString finalFilter = filter + ";;" + stepFilter; - QString filename = QFileDialog::getSaveFileName(NULL, "", defaultDir, finalFilter); - - if (!filename.isEmpty()) + void AMCore::saveObjects(const QString& filename) { - std::vector selected; - dataManager_->getSelectedList(selected); + if (!filename.isEmpty()) + { + CObjectIter it_begin = dataManager_->objects_begin(); + CObjectIter it_end = dataManager_->objects_end(); - CObjectIter it_begin = selected.begin(); - CObjectIter it_end = selected.end(); - saveObjectsToFile(filename, it_begin, it_end); + saveObjectsToFile(filename, it_begin, it_end); + } } -} -void AMCore::loadObjectsFromFile(const QString& filename) -{ - QFileInfo fi(filename); - QString filepath = fi.absoluteFilePath(); - QFile file(filepath); - QString ext1 = fi.suffix(); - - if (fi.isDir() || !file.exists()) - return; - - if (auto lext1 = ext1.toLower(); lext1 == FILE_EXT_STP || lext1 == FILE_EXT_STEP) - { //stp file - auto fin = std::ifstream(filename.toStdString(), std::ifstream::in); - AMCAX::STEP::StepReader stepReader; - std::vector shapes; - stepReader.Read(fin, shapes); - for (auto& shapItem : shapes) + void AMCore::saveSelectedObjects() + { + static QString defaultDir = "."; + QString filter = "AMCAX BRep files (" "*." + FILE_EXT_AMCAX_BREP + ")"; + QString stepFilter = "STEP files (" "*." + FILE_EXT_STP + " " "*." + FILE_EXT_STEP + ")"; + QString finalFilter = filter + ";;" + stepFilter; + QString filename = QFileDialog::getSaveFileName(NULL, "", defaultDir, finalFilter); + + if (!filename.isEmpty()) { - BRepObject* brep_obj = new BRepObject(); - brep_obj->SetShape(shapItem.Shape()); - brep_obj->setVisible(true); - dataManager_->addObject(brep_obj); - brep_obj->updateDraw(); + std::vector selected; + dataManager_->getSelectedList(selected); + + CObjectIter it_begin = selected.begin(); + CObjectIter it_end = selected.end(); + saveObjectsToFile(filename, it_begin, it_end); } } - else if (ext1 == FILE_EXT_AMCAX_BREP) //abr file + + void AMCore::loadObjectsFromFile(const QString& filename) { - AMCAX::TopoShape shapeCmp; - AMCAX::ShapeTool::Read(shapeCmp, filename.toStdString()); - - AMCAX::TopoExplorer exp; - for (exp.Init(shapeCmp, AMCAX::ShapeType::Shell); exp.More(); exp.Next()) { - const auto& shape = static_cast(exp.Current()); - BRepObject* brep_obj = new BRepObject(); - brep_obj->SetShape(shape); - brep_obj->setVisible(true); - dataManager_->addObject(brep_obj); - brep_obj->updateDraw(); + QFileInfo fi(filename); + QString filepath = fi.absoluteFilePath(); + QFile file(filepath); + QString ext1 = fi.suffix(); + + if (fi.isDir() || !file.exists()) + return; + if (!file.open(QIODevice::ReadOnly)) + return; + + std::vector vec; + + + QTextStream in(&file); + QString content = in.readAll(); + std::istringstream fin(content.toStdString(), std::istream::in); + if (auto lext1 = ext1.toLower(); lext1 == FILE_EXT_STP || lext1 == FILE_EXT_STEP) + { //stp file + AMCAX::STEP::StepReader stepReader(fin); + stepReader.Read(); + AMCAX::STEP::StepDataList shapes = stepReader.GetShapes(); + shapes = AMCAX::STEP::StepDataTool::Flatten(shapes); + for (auto& shapItem : shapes) + { + AdapterObject* adapter_object = new AdapterObject; + adapter_object->setDataType(acamcad::DataType::BREP_TYPE); + //adapter_object->bRep = std::make_unique(adapter_object); + //BRepObject* brep_obj = new BRepObject(); + adapter_object->bRep->SetShape(shapItem->Shape()); + adapter_object->setVisible(true); + dataManager_->addObject(adapter_object); + adapter_object->updateDraw(); + vec.push_back(adapter_object); + + } + } + else if (ext1 == FILE_EXT_AMCAX_BREP) //abr file + { + AMCAX::TopoShape shapeCmp; + AMCAX::ShapeTool::Read(shapeCmp, fin); + + AMCAX::TopoExplorer exp; + for (exp.Init(shapeCmp, AMCAX::ShapeType::Shell); exp.More(); exp.Next()) { + const auto& shape = static_cast(exp.Current()); + AdapterObject* adapter_object = new AdapterObject; + adapter_object->setDataType(acamcad::DataType::BREP_TYPE); + //adapter_object->bRep = std::make_unique(adapter_object); + //BRepObject* brep_obj = new BRepObject(); + adapter_object->bRep->SetShape(shape); + adapter_object->setVisible(true); + dataManager_->addObject(adapter_object); + adapter_object->updateDraw(); + vec.push_back(adapter_object); + } } + + dataManager_->RecordAddObject(vec); } -} -void AMCore::saveObjectsToFile(const QString& filename, std::vector::const_iterator& it_begin, std::vector::const_iterator& it_end) -{ - if (it_begin == it_end) { - return; - } + void AMCore::saveObjectsToFile(const QString& filename, std::vector::const_iterator& it_begin, std::vector::const_iterator& it_end) + { + if (it_begin == it_end) { + return; + } - DataType file_type; + DataType file_type; - QString ext = QFileInfo(filename).suffix(); - QFileInfo f_info = QFileInfo(filename); + QString ext = QFileInfo(filename).suffix(); + QFileInfo f_info = QFileInfo(filename); - if (file_allowed_type_.find(ext) != file_allowed_type_.end()) - { - file_type = file_allowed_type_[ext]; - } - else - { - file_type = DataType::UNKNOW_TYPE; - return; - } + if (file_allowed_type_.find(ext) != file_allowed_type_.end()) + { + file_type = file_allowed_type_[ext]; + } + else + { + file_type = DataType::CUSTOM_TYPE; + return; + } - if (auto lext = ext.toLower(); lext == FILE_EXT_STP || lext == FILE_EXT_STEP) //stp file - { - AMCAX::STEP::StepWriter stepWriter(filename.toStdString()); - std::vector shapes; - for (CObjectIter o_it = it_begin; o_it != it_end; o_it++) + if (auto lext = ext.toLower(); lext == FILE_EXT_STP || lext == FILE_EXT_STEP) // stp file { - BRepObject* brep_object = dynamic_cast (*o_it); - shapes.push_back(AMCAX::STEP::StepData(brep_object->getShape())); + std::ostringstream fout; + AMCAX::STEP::StepWriter stepWriter(fout); + stepWriter.Init(); + for (CObjectIter o_it = it_begin; o_it != it_end; o_it++) + { + AdapterObject* object = *o_it; + if (object->dataType() == DataType::BREP_TYPE) + stepWriter.WriteShape(std::make_shared(object->bRep->getShape())); + } + stepWriter.Done(); + + QFile file(filename); + if (file.open(QIODevice::WriteOnly | QIODevice::Text)) + { + QTextStream out(&file); + out << fout.str().c_str(); + file.close(); + } } - stepWriter.Init(); - stepWriter.WriteShapes(shapes); - stepWriter.Done(); - } - else if (ext == FILE_EXT_AMCAX_BREP) //abr file - { - AMCAX::TopoCompound comp; - AMCAX::TopoBuilder build; - build.MakeCompound(comp); - for (CObjectIter o_it = it_begin; o_it != it_end; o_it++) + else if (ext == FILE_EXT_AMCAX_BREP) // abr file { - BRepObject* brep_object = dynamic_cast (*o_it); - build.Add(comp, brep_object->getShape()); + AMCAX::TopoCompound comp; + AMCAX::TopoBuilder build; + build.MakeCompound(comp); + for (CObjectIter o_it = it_begin; o_it != it_end; o_it++) + { + AdapterObject* brep_object = *o_it; + + if (brep_object->dataType() == acamcad::DataType::BREP_TYPE) + build.Add(comp, brep_object->bRep->getShape()); + } + std::ostringstream fout; + AMCAX::ShapeTool::Write(comp, fout); + + QFile file(filename); + if (file.open(QIODevice::WriteOnly | QIODevice::Text)) + { + QTextStream out(&file); + out << fout.str().c_str(); + file.close(); + } } - AMCAX::ShapeTool::Write(comp, filename.toStdString()); } -} } diff --git a/Src/Core/CoreDefine.h b/Src/Core/CoreDefine.h index 4a7b665..b25e7d1 100644 --- a/Src/Core/CoreDefine.h +++ b/Src/Core/CoreDefine.h @@ -1,153 +1,156 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #pragma once #include "SelectInfo.h" #include -namespace acamcad +namespace acamcad { -enum class DrawModel -{ - WIRE_MODE, SHADING_MODEL, RENDERING_MODEL, - ZEBRA_MODE, GAUSS_MODE, MEAN_MODE, C_GRAPH_MODE -}; + enum class DrawModel + { + WIRE_MODE, SHADING_MODEL, RENDERING_MODEL, + ZEBRA_MODE, GAUSS_MODE, MEAN_MODE, C_GRAPH_MODE + }; -//=================================================================== + //=================================================================== -//大的交互操作的类型,用于鼠标和键盘 -enum class OperationType -{ - NO_OPERATION, //执行两个功能,1是基础选择,2是选择后立刻移动 - MOVE_OPERATION, //显示移动操纵轴,开始移动 - ROTATE_OPERATION, //显示移动操纵轴,开始旋转 - SCALE_OPERATION, //显示移动操纵轴,开始缩放 + //大的交互操作的类型,用于鼠标和键盘 + enum class OperationType + { + NO_OPERATION, //执行两个功能,1是基础选择,2是选择后立刻移动 + MOVE_OPERATION, //显示移动操纵轴,开始移动 + ROTATE_OPERATION, //显示移动操纵轴,开始旋转 + SCALE_OPERATION, //显示移动操纵轴,开始缩放 - ENTER_OPERATION, //选择后一定数目后,键盘按下enter键之后,包含物体层和单元层执行操作,例如 meshtriangle,split face,collapse edge - PICK_OPERATION_SINGLE, //选择一个单元后,立刻进行操作,例如edge swap - PICK_OPERATION_MOVE, //选择一个单元后,按住鼠标移动,松开后执行操作。 - PICK_OPERATION_MOVE_MULTI, //选择单元,移动,松开确认,在继续选择,回车执行操作。 - CTRL_OPERATION, //挤出用的选择操作 - ALT_OPERATION, //挤出壳用的选择操作 + ENTER_OPERATION, //选择后一定数目后,键盘按下enter键之后,包含物体层和单元层执行操作,例如 meshtriangle,split face,collapse edge + PICK_OPERATION_SINGLE, //选择一个单元后,立刻进行操作,例如edge swap + PICK_OPERATION_MOVE, //选择一个单元后,按住鼠标移动,松开后执行操作。 + PICK_OPERATION_MOVE_MULTI, //选择单元,移动,松开确认,在继续选择,回车执行操作。 + CTRL_OPERATION, //挤出用的选择操作 + ALT_OPERATION, //挤出壳用的选择操作 - CLICK_OPERATION_SELECT, //连续单击,获取选择线与工作平面的交点, used in add single face - CLICK_OPERATION //not used now -}; + CLICK_OPERATION_SELECT, //连续单击,获取选择线与工作平面的交点, used in add single face + CLICK_OPERATION //not used now + }; -//网格的交互操作类型 -enum class MeshOperationType -{ - NO_operotion, - MeshTriangulate, MeshQuadrilate, MeshReverseNormal, - MeshSubdiceCC, MeshSubdiveLoop, - MeshCopy, MeshDelete, MeshCombine, MeshMirror, - MeshDeleteElement, MeshEmbedFace, - MeshSplitLoop, MeshSplitEdge, MeshSplitFaceByEdge, - MeshCollapseEdge, MeshSplitFace, MeshSplitFaceVertex, - MeshSwapEdge, MeshCombineFace, MeshBridgeEdge, - MeshExtrudeFace, MeshExtrudeEdgeVertical, MeshExtrudeEdgeHorizontal, + //网格的交互操作类型 + enum class MeshOperationType + { + NO_operotion, + MeshTriangulate, MeshQuadrilate, MeshReverseNormal, + MeshSubdiceCC, MeshSubdiveLoop, + MeshCopy, MeshDelete, MeshCombine, MeshMirror, + MeshDeleteElement, MeshEmbedFace, + MeshSplitLoop, MeshSplitEdge, MeshSplitFaceByEdge, + MeshCollapseEdge, MeshSplitFace, MeshSplitFaceVertex, + MeshSwapEdge, MeshCombineFace, MeshBridgeEdge, + MeshExtrudeFace, MeshExtrudeEdgeVertical, MeshExtrudeEdgeHorizontal, + MeshExtrudeFaceNew, - MeshWeldEdge, MeshSeparate, MeshProject, + MeshWeldEdge, MeshSeparate, MeshProject, - MeshFuse, MeshCommon, MeshCut, MeshCut21, + MeshFuse, MeshCommon, MeshCut, MeshCut21, - MeshFaceAppend, //添加自由面或者向网格中追加面 - MeshChamferEdge, MeshFilletEdge, MeshThicken, - MeshAddCreaseEdge, MeshRemoveCreaseEdge, MeshSetFrepFix, MeshSetFrepForce, - MeshFillHole, - TSplineUniform, TSplineRepair, + MeshFaceAppend, //添加自由面或者向网格中追加面 + MeshChamferEdge, MeshFilletEdge, MeshThicken, + MeshAddCreaseEdge, MeshRemoveCreaseEdge, MeshSetFrepFix, MeshSetFrepForce, + MeshFillHole, + TSplineUniform, TSplineRepair, - TSplineRing, TSplineFillLine, //temp test shape + TSplineRing, TSplineFillLine, //temp test shape - TSplineCurvatureGraph -}; + TSplineCurvatureGraph + }; -inline std::ostream& operator<<(std::ostream& o, const MeshOperationType& m) -{ - switch (m) + inline std::ostream& operator<<(std::ostream& o, const MeshOperationType& m) { - case MeshOperationType::NO_operotion: - return o << "NO operation"; - case MeshOperationType::MeshTriangulate: - return o << "Triangulate"; - case MeshOperationType::MeshReverseNormal: - return o << "Reverse Normal"; - case MeshOperationType::MeshSubdiceCC: - return o << "Subdivide Catmull-Clark"; - case MeshOperationType::MeshSubdiveLoop: - return o << "Subdivide Loop"; - case MeshOperationType::MeshCopy: - return o << "Copy"; - case MeshOperationType::MeshDelete: - return o << "Delete"; - case MeshOperationType::MeshCombine: - return o << "Combine object"; - case MeshOperationType::MeshMirror: - return o << "Mirror mesh"; - case MeshOperationType::MeshDeleteElement: - return o << "Delete face"; - case MeshOperationType::MeshEmbedFace: - return o << "Embed Face"; - case MeshOperationType::MeshSplitLoop: - return o << "Split Loop"; - case MeshOperationType::MeshSplitEdge: - return o << "Split Edge"; - case MeshOperationType::MeshSplitFaceVertex: - return o << "Split Face by Vertex"; - case MeshOperationType::MeshSplitFaceByEdge: - return o << "Split Face With Edge"; - case MeshOperationType::MeshCollapseEdge: - return o << "Combine two Vertives"; - case MeshOperationType::MeshSplitFace: - return o << "Split Face with vert"; - case MeshOperationType::MeshSwapEdge: - return o << "Swap Edge"; - case MeshOperationType::MeshCombineFace: - return o << "Combine two Face"; - case MeshOperationType::MeshBridgeEdge: - return o << "Bridge Edge"; - case MeshOperationType::MeshExtrudeFace: - return o << "Extrude Face"; - case MeshOperationType::MeshThicken: - return o << "Shell Face"; - case MeshOperationType::MeshExtrudeEdgeVertical: - return o << "Ectrude Edge Vertical"; - case MeshOperationType::MeshExtrudeEdgeHorizontal: - return o << "Extrude Edge Horizontal"; - case MeshOperationType::MeshFaceAppend: - return o << "Append New Face"; - case MeshOperationType::MeshWeldEdge: - return o << "Weld Edge"; - case MeshOperationType::MeshSeparate: - return o << "Separate Edge"; - case MeshOperationType::MeshChamferEdge: - return o << "Bevel Edge"; - case MeshOperationType::MeshAddCreaseEdge: - return o << "Make Edge Crease"; - case MeshOperationType::MeshRemoveCreaseEdge: - return o << "Remove Edge Crease"; - case MeshOperationType::MeshFillHole: - return o << "Fill hole"; - case MeshOperationType::TSplineUniform: - return o << "Param Uniform"; - default: - break; + switch (m) + { + case MeshOperationType::NO_operotion: + return o << "NO operation"; + case MeshOperationType::MeshTriangulate: + return o << "Triangulate"; + case MeshOperationType::MeshReverseNormal: + return o << "Reverse Normal"; + case MeshOperationType::MeshSubdiceCC: + return o << "Subdivide Catmull-Clark"; + case MeshOperationType::MeshSubdiveLoop: + return o << "Subdivide Loop"; + case MeshOperationType::MeshCopy: + return o << "Copy"; + case MeshOperationType::MeshDelete: + return o << "Delete"; + case MeshOperationType::MeshCombine: + return o << "Combine object"; + case MeshOperationType::MeshMirror: + return o << "Mirror mesh"; + case MeshOperationType::MeshDeleteElement: + return o << "Delete face"; + case MeshOperationType::MeshEmbedFace: + return o << "Embed Face"; + case MeshOperationType::MeshSplitLoop: + return o << "Split Loop"; + case MeshOperationType::MeshSplitEdge: + return o << "Split Edge"; + case MeshOperationType::MeshSplitFaceVertex: + return o << "Split Face by Vertex"; + case MeshOperationType::MeshSplitFaceByEdge: + return o << "Split Face With Edge"; + case MeshOperationType::MeshCollapseEdge: + return o << "Combine two Vertives"; + case MeshOperationType::MeshSplitFace: + return o << "Split Face with vert"; + case MeshOperationType::MeshExtrudeFaceNew: + return o << "Extrude face new"; + case MeshOperationType::MeshSwapEdge: + return o << "Swap Edge"; + case MeshOperationType::MeshCombineFace: + return o << "Combine two Face"; + case MeshOperationType::MeshBridgeEdge: + return o << "Bridge Edge"; + case MeshOperationType::MeshExtrudeFace: + return o << "Extrude Face"; + case MeshOperationType::MeshThicken: + return o << "Shell Face"; + case MeshOperationType::MeshExtrudeEdgeVertical: + return o << "Ectrude Edge Vertical"; + case MeshOperationType::MeshExtrudeEdgeHorizontal: + return o << "Extrude Edge Horizontal"; + case MeshOperationType::MeshFaceAppend: + return o << "Append New Face"; + case MeshOperationType::MeshWeldEdge: + return o << "Weld Edge"; + case MeshOperationType::MeshSeparate: + return o << "Separate Edge"; + case MeshOperationType::MeshChamferEdge: + return o << "Bevel Edge"; + case MeshOperationType::MeshAddCreaseEdge: + return o << "Make Edge Crease"; + case MeshOperationType::MeshRemoveCreaseEdge: + return o << "Remove Edge Crease"; + case MeshOperationType::MeshFillHole: + return o << "Fill hole"; + case MeshOperationType::TSplineUniform: + return o << "Param Uniform"; + default: + break; + } + return o << " Error operation "; } - return o << " Error operation "; -} } //namespace acamcad \ No newline at end of file diff --git a/Src/Core/DataManager.cpp b/Src/Core/DataManager.cpp index ece195a..6c66dc5 100644 --- a/Src/Core/DataManager.cpp +++ b/Src/Core/DataManager.cpp @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "DataManager.h" #include "../Object/BaseObject.h" @@ -81,11 +81,11 @@ CObjectRIter DataManager::objects_rend() const return objects_.crend(); } -BaseObject* DataManager::getObjectByPersistentID(int id) +AdapterObject* DataManager::getObjectByPersistentID(int id) { if (id < 0) return nullptr; - BaseObject* obj = nullptr; + AdapterObject* obj = nullptr; for (CObjectIter co_it = objects_begin(); co_it != objects_end(); co_it++) { if ((*co_it)->persistentId() == id) @@ -93,17 +93,20 @@ BaseObject* DataManager::getObjectByPersistentID(int id) } return obj; } -int DataManager::getLastPersistentId() { +int DataManager::getLastPersistentId() { if (objects_.empty()) { - return -1; + return -1; } - return objects_.back() -> persistentId(); + return objects_.back()->persistentId(); } -void DataManager::addObject(BaseObject* object) +void DataManager::addObject(AdapterObject* object) { object->setPersistentId(data_persistent_); data_persistent_++; object->setId(objects_.size()); objects_.push_back(object); + + + } void DataManager::deleteObject(ObjectIter& it) @@ -120,15 +123,15 @@ void DataManager::deleteObject(ObjectIter& it) } } -BaseObject* DataManager::copyObject(BaseObject* object) +AdapterObject* DataManager::copyObject(AdapterObject* object) { if (object == nullptr) return nullptr; - if (object->dataType() == DataType::BREP_TYPE) + if (object->dataType() != DataType::CUSTOM_TYPE) { - BRepObject* brep_object = dynamic_cast (object); - BRepObject* new_object = new BRepObject(*brep_object); + //AdapterObject* brep_object = dynamic_cast (object); + AdapterObject* new_object = new AdapterObject(*object, true); addObject(new_object); return new_object; @@ -137,7 +140,7 @@ BaseObject* DataManager::copyObject(BaseObject* object) return nullptr; } -void DataManager::deleteObject(BaseObject* object) +void DataManager::deleteObject(AdapterObject* object) { for (ObjectIter o_it = objects_begin(); o_it != objects_end(); o_it++) { @@ -149,13 +152,51 @@ void DataManager::deleteObject(BaseObject* object) } } -void DataManager::restoreObject(BaseObject* object) +void DataManager::restoreObject(AdapterObject* object) { object->setPersistentId(data_persistent_); data_persistent_++; object->setId(objects_.size()); objects_.push_back(object); } + +void DataManager::addObject_UndoManage(AdapterObject* object) +{ + AdapterObject* new_object = new AdapterObject(*object, true); + new_object->updateDraw(); + + objects_.push_back(new_object); +} + + +void DataManager::deleteObject_UndoManage(AdapterObject* object) +{ + for (ObjectIter o_it = objects_begin(); o_it != objects_end(); o_it++) + { + if ((*o_it)->persistentId() == object->persistentId()) + { + AdapterObject* obj = *o_it; + delete obj; + + objects_.erase(o_it); + break; + } + } + +} + + +void DataManager::sortObject_UndoManage() +{ + int id = 0; + for (ObjectIter o_it = objects_begin(); o_it != objects_end(); ++o_it) + { + (*o_it)->setId(id); + id++; + } +} + + //============================================================ // Object Info //============================================================ @@ -169,12 +210,12 @@ void DataManager::clearSelected() } } -void DataManager::getSelectedList(std::vector& selected) +void DataManager::getSelectedList(std::vector& selected) { for (ObjectIter o_it = objects_begin(); o_it != objects_end(); ++o_it) { if ((*o_it)->isSelect()) { - selected.push_back(*o_it); + selected.push_back(*o_it); } } } \ No newline at end of file diff --git a/Src/Core/DataManager.h b/Src/Core/DataManager.h index 24f6cf9..285404d 100644 --- a/Src/Core/DataManager.h +++ b/Src/Core/DataManager.h @@ -1,67 +1,75 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #pragma once #include #include "../Object/ObjectDefine.h" +#include "UndoManage.h" namespace acamcad { -typedef std::vector::iterator ObjectIter; -typedef std::vector::const_iterator CObjectIter; -typedef std::vector::reverse_iterator ObjectRIter; -typedef std::vector::const_reverse_iterator CObjectRIter; + class AdapterObject; + typedef std::vector::iterator ObjectIter; + typedef std::vector::const_iterator CObjectIter; + typedef std::vector::reverse_iterator ObjectRIter; + typedef std::vector::const_reverse_iterator CObjectRIter; -class DataManager -{ -public: - DataManager(); - ~DataManager(); + class DataManager :public UndoManager + { + public: + DataManager(); + ~DataManager(); + + public: + ObjectIter objects_begin(); + ObjectRIter objects_rbegin(); + ObjectIter objects_end(); + ObjectRIter objects_rend(); + + CObjectIter objects_begin() const; + CObjectRIter objects_rbegin() const; + CObjectIter objects_end() const; + CObjectRIter objects_rend() const; -public: - ObjectIter objects_begin(); - ObjectRIter objects_rbegin(); - ObjectIter objects_end(); - ObjectRIter objects_rend(); + AdapterObject* getObjectByPersistentID(int o_id); //use object persistent to get the object + int getLastPersistentId(); - CObjectIter objects_begin() const; - CObjectRIter objects_rbegin() const; - CObjectIter objects_end() const; - CObjectRIter objects_rend() const; + void addObject(AdapterObject* object); //正常的添加单元 + void deleteObject(ObjectIter& it); - BaseObject* getObjectByPersistentID(int o_id); //use object persistent to get the object - int getLastPersistentId(); + AdapterObject* copyObject(AdapterObject* object); + void deleteObject(AdapterObject* object); - void addObject(BaseObject* object); //正常的添加单元 - void deleteObject(ObjectIter& it); + void restoreObject(AdapterObject* object); //恢复一个被删除的单元,在备份的时候使用 - BaseObject* copyObject(BaseObject* object); - void deleteObject(BaseObject* object); + //UndoManager + virtual void addObject_UndoManage(AdapterObject* object) override; + virtual void deleteObject_UndoManage(AdapterObject* object) override; + virtual void sortObject_UndoManage() override; - void restoreObject(BaseObject* object); //恢复一个被删除的单元,在备份的时候使用 -public: - void clearSelected(); - void getSelectedList(std::vector& selected); + public: + void clearSelected(); + void getSelectedList(std::vector& selected); -private: - std::vector objects_; -private: - int data_persistent_; -}; + private: + std::vector objects_; + private: + int data_persistent_; + }; } //namespace acamcad \ No newline at end of file diff --git a/Src/Core/SelectInfo.h b/Src/Core/SelectInfo.h index 5b23723..2a16daa 100644 --- a/Src/Core/SelectInfo.h +++ b/Src/Core/SelectInfo.h @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #pragma once @@ -22,229 +22,229 @@ namespace acamcad { -enum class SelectModel -{ - VERTEX_MODEL, - EDGE_MODEL, - FACE_MODEL, - OBJECT_MODEL, - CLICK_MODEL //click model, used in add face to object, the click will in work plane; -}; - -struct PyramidInf -{ - AMCAX::Coord3 ori_; - std::vector dir_; -}; + enum class SelectModel + { + VERTEX_MODEL = 0, + EDGE_MODEL, + FACE_MODEL, + OBJECT_MODEL, + CLICK_MODEL //click model, used in add face to object, the click will in work plane; + }; -struct SelectInfoWithCamera -{ - int object_id_ = -1; + struct PyramidInf + { + AMCAX::Coord3 ori_; + std::vector dir_; + }; - int object_subpart_id_ = -1; //选中的可绘制的子物体,对于网格,就是鼠标点击的面的id - int object_subselect_id_ = -1; //选中的真实的id,对于网格就是,顶点,边的id + struct SelectInfoWithCamera + { + int object_id_ = -1; - AMCAX::Coord3 c_begin_; - AMCAX::Coord3 c_end_; + int object_subpart_id_ = -1; //选中的可绘制的子物体,对于网格,就是鼠标点击的面的id + int object_subselect_id_ = -1; //选中的真实的id,对于网格就是,顶点,边的id - bool operator < (const SelectInfoWithCamera& rhs) - { - if (object_id_ < rhs.object_id_) - return true; - else if (object_id_ == rhs.object_id_) + AMCAX::Coord3 c_begin_; + AMCAX::Coord3 c_end_; + + bool operator < (const SelectInfoWithCamera& rhs) { - if (object_subselect_id_ < rhs.object_subselect_id_) + if (object_id_ < rhs.object_id_) return true; + else if (object_id_ == rhs.object_id_) + { + if (object_subselect_id_ < rhs.object_subselect_id_) + return true; + else + return false; + } else return false; } - else - return false; - } - bool operator == (const SelectInfoWithCamera& rhs) - { - if (object_id_ == rhs.object_id_) + bool operator == (const SelectInfoWithCamera& rhs) { - if (object_subselect_id_ == rhs.object_subselect_id_) - return true; + if (object_id_ == rhs.object_id_) + { + if (object_subselect_id_ == rhs.object_subselect_id_) + return true; + else + return false; + } else return false; } - else - return false; - } -}; - -struct SelectInfo -{ - int object_id_; - int object_subselect_id_; //选中的真实的id,对于网格就是,顶点,边的id + }; - SelectInfo() + struct SelectInfo { - object_id_ = -1; - object_subselect_id_ = -1; - } + int object_id_; + int object_subselect_id_; //选中的真实的id,对于网格就是,顶点,边的id - SelectInfo(int o_id, int os_id) - { - object_id_ = o_id; - object_subselect_id_ = os_id; - } + SelectInfo() + { + object_id_ = -1; + object_subselect_id_ = -1; + } - bool operator < (const SelectInfo& rhs) - { - if (object_id_ < rhs.object_id_) - return true; - else if (object_id_ == rhs.object_id_) + SelectInfo(int o_id, int os_id) + { + object_id_ = o_id; + object_subselect_id_ = os_id; + } + + bool operator < (const SelectInfo& rhs) { - if (object_subselect_id_ < rhs.object_subselect_id_) + if (object_id_ < rhs.object_id_) return true; + else if (object_id_ == rhs.object_id_) + { + if (object_subselect_id_ < rhs.object_subselect_id_) + return true; + else + return false; + } else return false; } - else - return false; - } - bool operator == (const SelectInfo& rhs) const - { - if (object_id_ == rhs.object_id_) + bool operator == (const SelectInfo& rhs) const { - if (object_subselect_id_ == rhs.object_subselect_id_) - return true; + if (object_id_ == rhs.object_id_) + { + if (object_subselect_id_ == rhs.object_subselect_id_) + return true; + else + return false; + } else return false; } - else - return false; - } -}; + }; -inline void extractSelectInfoList(const std::vector& sc_info_list, std::vector& s_info_list) -{ - s_info_list.resize(sc_info_list.size()); - for (int i = 0; i < sc_info_list.size(); i++) + inline void extractSelectInfoList(const std::vector& sc_info_list, std::vector& s_info_list) { - s_info_list[i].object_id_ = sc_info_list[i].object_id_; - s_info_list[i].object_subselect_id_ = sc_info_list[i].object_subselect_id_; + s_info_list.resize(sc_info_list.size()); + for (int i = 0; i < sc_info_list.size(); i++) + { + s_info_list[i].object_id_ = sc_info_list[i].object_id_; + s_info_list[i].object_subselect_id_ = sc_info_list[i].object_subselect_id_; + } } -} -inline std::vector getSelectObjectList(const std::vector& s_info_list) -{ - std::set s_id_list; - for (int i = 0; i < s_info_list.size(); i++) + inline std::vector getSelectObjectList(const std::vector& s_info_list) { - s_id_list.insert(s_info_list[i].object_id_); + std::set s_id_list; + for (int i = 0; i < s_info_list.size(); i++) + { + s_id_list.insert(s_info_list[i].object_id_); + } + std::vector so_id_list(s_id_list.begin(), s_id_list.end()); + return so_id_list; } - std::vector so_id_list(s_id_list.begin(), s_id_list.end()); - return so_id_list; -} -inline std::vector getSelectSubList(const std::vector& s_info_list) -{ - std::vector s_id_list(s_info_list.size()); - for (int i = 0; i < s_info_list.size(); i++) + inline std::vector getSelectSubList(const std::vector& s_info_list) { - s_id_list[i] = s_info_list[i].object_subselect_id_; + std::vector s_id_list(s_info_list.size()); + for (int i = 0; i < s_info_list.size(); i++) + { + s_id_list[i] = s_info_list[i].object_subselect_id_; + } + return s_id_list; } - return s_id_list; -} -inline std::vector getSelectSubListWithObject(const std::vector& s_info_list, const int& object_id) -{ - std::vector s_id_list; s_id_list.reserve(s_info_list.size()); - for (int i = 0; i < s_info_list.size(); i++) + inline std::vector getSelectSubListWithObject(const std::vector& s_info_list, const int& object_id) { - if (s_info_list[i].object_id_ == object_id) + std::vector s_id_list; s_id_list.reserve(s_info_list.size()); + for (int i = 0; i < s_info_list.size(); i++) { - s_id_list.push_back(s_info_list[i].object_subselect_id_); + if (s_info_list[i].object_id_ == object_id) + { + s_id_list.push_back(s_info_list[i].object_subselect_id_); + } } + return s_id_list; } - return s_id_list; -} -inline bool isSelectOneObject(const std::vector& s_info_list) -{ - int object_id = s_info_list[0].object_id_; - for (int i = 0; i < s_info_list.size(); i++) + inline bool isSelectOneObject(const std::vector& s_info_list) { - if (s_info_list[i].object_id_ != object_id) + int object_id = s_info_list[0].object_id_; + for (int i = 0; i < s_info_list.size(); i++) { - return false; + if (s_info_list[i].object_id_ != object_id) + { + return false; + } } + return true; } - return true; -} -inline std::vector getSelectObjectList(const std::vector& s_info_list) -{ - std::set s_id_list; - for (int i = 0; i < s_info_list.size(); i++) + inline std::vector getSelectObjectList(const std::vector& s_info_list) { - s_id_list.insert(s_info_list[i].object_id_); + std::set s_id_list; + for (int i = 0; i < s_info_list.size(); i++) + { + s_id_list.insert(s_info_list[i].object_id_); + } + std::vector so_id_list(s_id_list.begin(), s_id_list.end()); + return so_id_list; } - std::vector so_id_list(s_id_list.begin(), s_id_list.end()); - return so_id_list; -} -inline std::vector getSelectSubList(const std::vector& s_info_list) -{ - std::vector s_id_list(s_info_list.size()); - for (int i = 0; i < s_info_list.size(); i++) + inline std::vector getSelectSubList(const std::vector& s_info_list) { - s_id_list[i] = s_info_list[i].object_subselect_id_; + std::vector s_id_list(s_info_list.size()); + for (int i = 0; i < s_info_list.size(); i++) + { + s_id_list[i] = s_info_list[i].object_subselect_id_; + } + return s_id_list; } - return s_id_list; -} -inline std::vector getSelectSubListWithObject(const std::vector& s_info_list, const int& object_id) -{ - std::vector s_id_list; s_id_list.reserve(s_info_list.size()); - for (int i = 0; i < s_info_list.size(); i++) + inline std::vector getSelectSubListWithObject(const std::vector& s_info_list, const int& object_id) { - if (s_info_list[i].object_id_ == object_id) + std::vector s_id_list; s_id_list.reserve(s_info_list.size()); + for (int i = 0; i < s_info_list.size(); i++) { - s_id_list.push_back(s_info_list[i].object_subselect_id_); + if (s_info_list[i].object_id_ == object_id) + { + s_id_list.push_back(s_info_list[i].object_subselect_id_); + } } + return s_id_list; } - return s_id_list; -} -inline int findSelect(const SelectModel& s_model, const std::vector& s_info_list, const SelectInfo& s_info) -{ - for (int i = 0; i < s_info_list.size(); i++) + inline int findSelect(const SelectModel& s_model, const std::vector& s_info_list, const SelectInfo& s_info) { - if (s_info_list[i] == s_info) + for (int i = 0; i < s_info_list.size(); i++) { - return i; + if (s_info_list[i] == s_info) + { + return i; + } } - } - return -1; -} + return -1; + } -//=================================================================== + //=================================================================== -struct ClickInfo -{ - AMCAX::Coord3 point_; -}; + struct ClickInfo + { + AMCAX::Coord3 point_; + }; -inline std::vector getClickPointlist(const std::vector& c_info_list) -{ - std::vector point_list(c_info_list.size()); - for (int i = 0; i < c_info_list.size(); i++) + inline std::vector getClickPointlist(const std::vector& c_info_list) { - const ClickInfo& c_info = c_info_list[i]; - point_list[i] = c_info.point_; - } - return point_list; -}; + std::vector point_list(c_info_list.size()); + for (int i = 0; i < c_info_list.size(); i++) + { + const ClickInfo& c_info = c_info_list[i]; + point_list[i] = c_info.point_; + } + return point_list; + }; }// namespace acamcad \ No newline at end of file diff --git a/Src/Core/UndoManage.cpp b/Src/Core/UndoManage.cpp new file mode 100644 index 0000000..c4de3d6 --- /dev/null +++ b/Src/Core/UndoManage.cpp @@ -0,0 +1,199 @@ +#include "UndoManage.h" +#include + +namespace acamcad +{ + UndoManager::UndoManager() :data_index_(0) + { + } + + UndoManager::~UndoManager() + { + } + + void UndoManager::RecordAddObject(std::vector data) + { + nextStep(data, { }); + + } + + void UndoManager::RecordDeleteObject(std::vector data) + { + + nextStep({}, data); + } + + void UndoManager::RecordModifyObject(std::vector curData, std::vector oldData) + { + nextStep(curData, oldData); + } + + + void UndoManager::clearModify() + { + + //auto_news.clear(); + oldObjects_.clear(); + } + + + void UndoManager::RecordModifyBegin(std::vector oldData) + { + if (oldObjects_.size() > 0) + { + return; + } + + for (auto& iter : oldData) { + std::shared_ptr object = getObjectInData(iter); + oldObjects_.push_back(std::move(object)); + } + + } + void UndoManager::RecordModifyEnd(std::vector curData) + { + if (!curData.empty() && !oldObjects_.empty()) + { + Data data{ {} , oldObjects_ }; + + for (auto& iter : curData) { + std::shared_ptr object = std::make_shared(*iter, false); + data.curObjects.push_back(std::move(object)); + } + nextStep(data); + } + + oldObjects_.clear(); + } + + + void UndoManager::nextStep(std::vector curData, std::vector oldData) + { + if (curData.empty() && oldData.empty()) + return; + + Data data; + //std::vector> curVector, oldVector; + + for (auto& iter : curData) { + std::shared_ptr object = std::make_shared(*iter, false); + data.curObjects.push_back(std::move(object)); + } + + for (auto& iter : oldData) { + std::shared_ptr object = getObjectInData(iter); + data.oldObjects.push_back(std::move(object)); + } + + nextStep(data); + //data_.push_back({ curVector,oldVector }); + } + + void UndoManager::nextStep(const Data& data) + { + if (data_index_ < data_.size()) { + + auto iter = data_.begin(); + + for (int i = 0; i < data_index_; i++) { + iter++; + } + + data_.erase(iter, data_.end()); + + } + + data_index_++; + + data_.push_back(data); + } + + bool UndoManager::canUndo() + { + return data_index_ > 0; + } + bool UndoManager::canRedo() + { + return data_index_ < data_.size(); + } + + + void UndoManager::Undo() + { + if (!canUndo()) { + std::cout << "can not Undo!!!" << std::endl; + return; + } + clearModify(); + + + --data_index_; + + //int index = 0; + auto iter = data_.begin(); + + for (int i = 0; i < data_index_; i++) { + iter++; + } + + for (auto cur = iter->curObjects.begin(); cur != iter->curObjects.end(); cur++) { + deleteObject_UndoManage(cur->get()); + } + + for (auto old = iter->oldObjects.begin(); old != iter->oldObjects.end(); old++) + { + addObject_UndoManage(old->get()); + } + + sortObject_UndoManage(); + + } + void UndoManager::Redo() + { + if (!canRedo()) { + std::cout << "can not Redo!!!" << std::endl; + return; + } + clearModify(); + //int index = 0; + auto iter = data_.begin(); + + for (int i = 0; i < data_index_; i++) { + iter++; + } + + for (auto cur = iter->curObjects.begin(); cur != iter->curObjects.end(); cur++) { + addObject_UndoManage(cur->get()); + } + + for (auto old = iter->oldObjects.begin(); old != iter->oldObjects.end(); old++) + { + deleteObject_UndoManage(old->get()); + } + + sortObject_UndoManage(); + ++data_index_; + + + } + + //void UndoManager::getObject() + std::shared_ptr UndoManager::getObjectInData(AdapterObject* object) + { + ///std::shared_ptr result; + + for (auto iter = data_.rbegin(); iter != data_.rend(); iter++) + { + for (auto& iter1 : iter->curObjects) + { + if (iter1->persistentId() == object->persistentId()) + { + return iter1; + } + } + } + std::shared_ptr result = std::make_shared(*object, false); + return result; + } + +} \ No newline at end of file diff --git a/Src/Core/UndoManage.h b/Src/Core/UndoManage.h new file mode 100644 index 0000000..18adb30 --- /dev/null +++ b/Src/Core/UndoManage.h @@ -0,0 +1,89 @@ +/* =================================================================== +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* All rights reserved. +* +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* software under the terms of either license. +* +* For more information about the AGPLv3.0 license, please visit: +* https://www.gnu.org/licenses/agpl-3.0.html +* For licensing inquiries or to obtain a commercial license, please +* contact Hefei Jiushao Intelligent Technology Co., Ltd. +* =================================================================== +* Author: +*/ +#pragma once + +#include +#include +#include + + +#include "../Object/ObjectDefine.h" + +namespace acamcad +{ + + //class AdapterObject + + class UndoManager + { + public: + UndoManager(); + ~UndoManager(); + + + + void RecordAddObject(std::vector data); + void RecordDeleteObject(std::vector data); + void RecordModifyObject(std::vector curData, std::vector oldData); + + //bool isEmptyAuto(); + //void RecordAutoBegin(std::vector datas); + //void RecordAutoEnd(std::vector datas); + + void clearModify(); + + void RecordModifyBegin(std::vector oldData); + void RecordModifyEnd(std::vector curData); + + + bool canUndo(); + bool canRedo(); + + void Undo(); + void Redo(); + + protected: + + virtual void addObject_UndoManage(AdapterObject* object) = 0; + virtual void deleteObject_UndoManage(AdapterObject* object) = 0; + virtual void sortObject_UndoManage() = 0; + + private: + struct Data + { + ///DataType type; + std::list> curObjects; + std::list> oldObjects; + }; + void nextStep(std::vector curData, std::vector oldData); + + void nextStep(const Data& data); + + + std::shared_ptr getObjectInData(AdapterObject* object); + + protected: + + std::list data_; + int data_index_; + + std::list> oldObjects_; + + //std::vector> auto_olds; + //std::vector> auto_news; + }; + +} \ No newline at end of file diff --git a/Src/Core/UndoRedoHandler.cpp b/Src/Core/UndoRedoHandler.cpp index 3d64679..0143b75 100644 --- a/Src/Core/UndoRedoHandler.cpp +++ b/Src/Core/UndoRedoHandler.cpp @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "UndoRedoHandler.h" #include "../Object/BRepObject.h" @@ -22,24 +22,26 @@ namespace acamcad { - ContextHolder::ContextHolder(int opId): operationId_(opId), objectPid_(-1) { - backshape_.Nullify(); + ContextHolder::ContextHolder(int opId) : operationId_(opId), objectPid_(-1) { + backshape_.Nullify(); } - ContextHolder::ContextHolder(int opId, BaseObject* object, ActionType actionType): operationId_(opId), objectPid_(-1) { + ContextHolder::ContextHolder(int opId, BaseObject* object, ActionType actionType) : operationId_(opId), objectPid_(-1) { if (nullptr == object || object->dataType() != DataType::BREP_TYPE) { - return; + return; } objectPid_ = object->persistentId(); - BRepObject* object_old = dynamic_cast (object); - backshape_ = AMCAX::CopyShape(object_old->getShape()); + AdapterObject* object_old = dynamic_cast(object); + + //BRepObject* object_old = dynamic_cast (object); + backshape_ = AMCAX::CopyShape(object_old->bRep->getShape()); } ContextHolder::~ContextHolder() { - backshape_.Nullify(); + backshape_.Nullify(); } @@ -69,27 +71,27 @@ namespace acamcad { void UndoRedoHandler::recordOperation(BaseObject* object, ActionType actionType, bool incSeq) { if (incSeq) { - operation_seq_++; + operation_seq_++; } - ContextHolder* holder = new ContextHolder(operation_seq_, object, actionType); - OperateContext context = std::make_pair(actionType, holder); - undo_queue_.push_back(context); + ContextHolder* holder = new ContextHolder(operation_seq_, object, actionType); + OperateContext context = std::make_pair(actionType, holder); + undo_queue_.push_back(context); if (undo_queue_.size() >= max_queue_size_) { OperateContext item = undo_queue_.back(); undo_queue_.pop_front(); - releaseQueueItem(item); + releaseQueueItem(item); } } void UndoRedoHandler::revokeOp(const OperateContext& context) { ActionType op_type = context.first; - ContextHolder* p_holder = context.second; + ContextHolder* p_holder = context.second; if (p_holder == nullptr) { - return; + return; } if (op_type == ActionType::AddObject) { //revoke add, need to find the object in data manager and delete it. @@ -98,9 +100,9 @@ namespace acamcad { BaseObject* obj = dataManager_->getObjectByPersistentID(p_holder->getObjectPid()); if (obj == nullptr) { //Object gone, cannot revoke add operation; - return; + return; } - dataManager_->deleteObject(obj); + //dataManager_->deleteObject(obj); } else if (op_type == ActionType::DeleteObject) { // revoke delete, need to restore the object from shape and add into data manager; and add another copy std::cout << "undo delete object" << std::endl; @@ -110,11 +112,15 @@ namespace acamcad { return; //Object already exists, no need to revoke delete now. } //ONLY support bRep object now; - BRepObject* brep_obj = new BRepObject(); - brep_obj->applyBRep(p_holder->getBackShape()); - dataManager_->addObject(brep_obj); - brep_obj->setPersistentId(p_holder->getObjectPid()); - brep_obj->updateDraw(); + AdapterObject* adapter_object = new AdapterObject; + adapter_object->setDataType(acamcad::DataType::BREP_TYPE); + //adapter_object->bRep = std::make_unique(adapter_object); + + //BRepObject* brep_obj = new BRepObject(); + adapter_object->bRep->applyBRep(p_holder->getBackShape()); + dataManager_->addObject(adapter_object); + adapter_object->setPersistentId(p_holder->getObjectPid()); + adapter_object->bRep->updateDraw(); } else { //revoke operate, need to find the backup data and the object in data manager, apply the old data to the object; @@ -131,17 +137,21 @@ namespace acamcad { } if (actionType == ActionType::AddObject) { //redo add, need to restore the object from shape and add into data manager; - std::cout << "redo add object" << std::endl; + std::cout << "redo add object" << std::endl; BaseObject* obj = dataManager_->getObjectByPersistentID(p_holder->getObjectPid()); if (obj != nullptr) { return; //Object already exists, no need to revoke delete now. } //ONLY support bRep object now; - BRepObject* brep_obj = new BRepObject(); - brep_obj->applyBRep(p_holder->getBackShape()); - dataManager_->addObject(brep_obj); - brep_obj->setPersistentId(p_holder->getObjectPid()); - brep_obj->updateDraw(); + AdapterObject* adapter_object = new AdapterObject; + adapter_object->setDataType(acamcad::DataType::BREP_TYPE); + //adapter_object->bRep = std::make_unique(adapter_object); + + ///BRepObject* brep_obj = new BRepObject(); + adapter_object->bRep->applyBRep(p_holder->getBackShape()); + dataManager_->addObject(adapter_object); + adapter_object->setPersistentId(p_holder->getObjectPid()); + adapter_object->bRep->updateDraw(); } else if (actionType == ActionType::DeleteObject) { //redo delete, need to find the object in data manager and delete it. std::cout << "redo delete object" << std::endl; @@ -151,7 +161,7 @@ namespace acamcad { //Object gone, cannot revoke add operation; return; } - dataManager_->deleteObject(obj); + //dataManager_->deleteObject(obj); } } @@ -159,16 +169,16 @@ namespace acamcad { void UndoRedoHandler::undo() { if (undo_queue_.empty()) { - return; + return; } - bool hasNext = false; + bool hasNext = false; do { OperateContext context = undo_queue_.back(); int currentSeq = (context.second)->getOperationId(); revokeOp(context); - undo_queue_.pop_back(); + undo_queue_.pop_back(); redo_queue_.push_back(context); if (redo_queue_.size() >= max_queue_size_) { @@ -178,18 +188,18 @@ namespace acamcad { } if (undo_queue_.empty()) { - return; + return; } OperateContext next_context = undo_queue_.back(); int nextSeq = (next_context.second)->getOperationId(); hasNext = (nextSeq == currentSeq); } while (hasNext); - + } void UndoRedoHandler::redo() { - + if (redo_queue_.empty()) { return; } @@ -220,7 +230,7 @@ namespace acamcad { bool UndoRedoHandler::canUndo() { - return (!undo_queue_.empty()); + return (!undo_queue_.empty()); } bool UndoRedoHandler::canRedo() @@ -231,8 +241,8 @@ namespace acamcad { void UndoRedoHandler::releaseQueueItem(OperateContext& context) { if (context.second != nullptr) { - delete context.second; - context.second = nullptr; + delete context.second; + context.second = nullptr; } } } \ No newline at end of file diff --git a/Src/Object/AdapterObject.cpp b/Src/Object/AdapterObject.cpp new file mode 100644 index 0000000..61693e3 --- /dev/null +++ b/Src/Object/AdapterObject.cpp @@ -0,0 +1,504 @@ +#include "AdapterObject.h" +#include "BRepObject.h" +#include "MeshObject.h" +#include "TSplineObject.h" +#include "../Operation/MOperate.h" + +#include +#include +#include +#include + +namespace acamcad +{ + AdapterObject::AdapterObject() + :BaseObject() + { + //setDataType(DataType::BREP_TYPE); + } + + AdapterObject::AdapterObject(const AdapterObject& object, bool isDraw) + { + //copy data + setPersistentId(object.persistentId()); + setId(object.id()); + setLabel(object.label()); + + //copy shape + if (object.bRep != NULL) { + BaseObject::setDataType(object.dataType()); + bRep = std::make_unique(this, *object.bRep, isDraw); + + if (isDraw) + bRep->updateDraw(); + } + + if (object.mesh != NULL) { + BaseObject::setDataType(object.dataType()); + mesh = std::make_unique(this, *object.mesh, isDraw); + + if (isDraw) + mesh->updateDraw(); + } + + if (object.tSpline != NULL) { + BaseObject::setDataType(object.dataType()); + tSpline = std::make_unique(this, *object.tSpline, isDraw); + + if (isDraw) + tSpline->updateDraw(); + + } + } + + AdapterObject::~AdapterObject() + { + //shape_.Nullify(); + } + + // select vert edge face + void AdapterObject::selectVertWithFaceId(const AMCAX::Vector3& begin, const AMCAX::Vector3& end, int f_id, int& sv_id) + { + switch (dataType()) + { + case acamcad::DataType::BREP_TYPE: + bRep->selectVertWithFaceId(begin, end, f_id, sv_id); + break; + case acamcad::DataType::MESH_TYPE: + mesh->selectVertWithFaceId(begin, end, f_id, sv_id); + break; + case acamcad::DataType::TSPLINEU_TYPE: + tSpline->selectVertWithFaceId(begin, end, f_id, sv_id); + break; + default: + break; + } + } + void AdapterObject::selectEdgeWithFaceId(const AMCAX::Vector3& begin, const AMCAX::Vector3& end, int f_id, int& se_id) + { + switch (dataType()) + { + case acamcad::DataType::BREP_TYPE: + bRep->selectEdgeWithFaceId(begin, end, f_id, se_id); + break; + case acamcad::DataType::MESH_TYPE: + mesh->selectEdgeWithFaceId(begin, end, f_id, se_id); + break; + case acamcad::DataType::TSPLINEU_TYPE: + tSpline->selectEdgeWithFaceId(begin, end, f_id, se_id); + break; + default: + break; + } + } + + void AdapterObject::mesh_OPvert_BackupVertes(const std::vector& vert_id) + { + if (bRep) + bRep->mesh_OPvert_Backup(); + + if (mesh) + mesh->mesh_OPvert_BackupVertes(vert_id); + + if (tSpline) + tSpline->mesh_OPvert_BackupVertes(vert_id); + } + + void AdapterObject::mesh_OPvert_BackupEdges(const std::vector& edge_id) + { + if (bRep) + bRep->mesh_OPvert_Backup(); + + if (mesh) + mesh->mesh_OPvert_BackupEdges(edge_id); + + if (tSpline) + tSpline->mesh_OPvert_BackupEdges(edge_id); + } + + void AdapterObject::mesh_OPvert_BackupFaces(const std::vector& face_id) + { + if (bRep) + bRep->mesh_OPvert_Backup(); + + + if (mesh) + mesh->mesh_OPvert_BackupFaces(face_id); + + if (tSpline) + tSpline->mesh_OPvert_BackupFaces(face_id); + } + + void AdapterObject::mesh_Clear_OPvertBackup() + { + + if (bRep) + bRep->mesh_Clear_OPvertBackup(); + + + if (mesh) + mesh->mesh_Clear_OPvertBackup(); + + if (tSpline) + tSpline->mesh_Clear_OPvertBackup(); + } + + + void AdapterObject::mesh_OPvert_Backup() + { + if (bRep) + bRep->mesh_OPvert_Backup(); + + + if (mesh) + mesh->mesh_OPvert_Backup(); + + if (tSpline) + tSpline->mesh_OPvert_Backup(); + } + + void AdapterObject::meshMove(const AMCAX::Coord3& v, double dis) + { + + switch (dataType()) + { + case acamcad::DataType::BREP_TYPE: + bRep->meshMove(v, dis); + break; + case acamcad::DataType::MESH_TYPE: + { + AMCAX::Vector3 ve(v.X(), v.Y(), v.Z()); + mesh->meshMove(ve, dis); + } + break; + case acamcad::DataType::TSPLINEU_TYPE: + { + AMCAX::Vector3 ve(v.X(), v.Y(), v.Z()); + tSpline->meshMove(ve, dis); + } + break; + default: + break; + } + } + + void AdapterObject::meshRotation(const AMCAX::Coord3& center, const AMCAX::Coord3& axis, double angle) + { + if (bRep) + bRep->meshRotation(center, axis, angle); + + if (mesh) { + AMCAX::Vector3 vCenter(center.X(), center.Y(), center.Z()), vAxis(axis.X(), axis.Y(), axis.Z()); + mesh->meshRotation(vCenter, vAxis, angle); + } + + if (tSpline) + { + AMCAX::Vector3 vCenter(center.X(), center.Y(), center.Z()), vAxis(axis.X(), axis.Y(), axis.Z()); + tSpline->meshRotation(vCenter, vAxis, angle); + } + } + + void AdapterObject::meshScaleSingle(const AMCAX::Coord3& center, const AMCAX::Coord3& axis, double scale) + { + if (mesh) + { + AMCAX::Vector3 vCenter(center.X(), center.Y(), center.Z()), vAxis(axis.X(), axis.Y(), axis.Z()); + mesh->meshScaleSingle(vCenter, vAxis, scale); + } + + if (tSpline) + { + AMCAX::Vector3 vCenter(center.X(), center.Y(), center.Z()), vAxis(axis.X(), axis.Y(), axis.Z()); + tSpline->meshScaleSingle(vCenter, vAxis, scale); + } + + } + void AdapterObject::meshScalePlane(const AMCAX::Coord3& center, const AMCAX::Coord3& normal, double scale) + { + if (mesh) { + AMCAX::Vector3 vCenter(center.X(), center.Y(), center.Z()), vAxis(normal.X(), normal.Y(), normal.Z()); + mesh->meshScalePlane(vCenter, vAxis, scale); + } + + if (tSpline) { + AMCAX::Vector3 vCenter(center.X(), center.Y(), center.Z()), vAxis(normal.X(), normal.Y(), normal.Z()); + tSpline->meshScalePlane(vCenter, vAxis, scale); + } + } + + + void AdapterObject::setDataType(DataType _type) + { + BaseObject::setDataType(_type); + + switch (_type) + { + case acamcad::DataType::BREP_TYPE: + bRep = std::make_unique(this); + bRep->updateDraw(); + break; + case acamcad::DataType::MESH_TYPE: + mesh = std::make_unique(this); + //mesh->assignMesh(); + mesh->updateDraw(); + break; + case acamcad::DataType::TSPLINEU_TYPE: + tSpline = std::make_unique(this); + tSpline->updateDraw(); + break; + default: + break; + } + } + + void AdapterObject::GetBoundingBox(AMCAX::Coord3& min, AMCAX::Coord3& max) + { + switch (dataType()) + { + case acamcad::DataType::BREP_TYPE: + { + AMCAX::BoundingBox3 box; + AMCAX::BRepBoundingBox::AddToBox(bRep->getShape(), box); + + min = box.CornerMin().Coord(); + max = box.CornerMax().Coord(); + } + break; + case acamcad::DataType::MESH_TYPE: + { + auto box = AMCAX::SubD::MeshTool::MeshBoundingBox(mesh->mesh()); + + min = box.CornerMin().Coord(); + max = box.CornerMax().Coord(); + } + break; + case acamcad::DataType::TSPLINEU_TYPE: + { + AMCAX::BoundingBox3 box; + AMCAX::TMS::TMSplineTool::UpdateTMSplineBndBox(tSpline->getTSpline(), box); + + min = box.CornerMin().Coord(); + max = box.CornerMax().Coord(); + break; + } + default: + break; + } + } + void AdapterObject::GetBoundingBoxByFace(int face_id, AMCAX::Coord3& min, AMCAX::Coord3& max) + { + switch (dataType()) + { + case acamcad::DataType::BREP_TYPE: + { + AMCAX::BoundingBox3 box; + AMCAX::BRepBoundingBox::AddToBox(bRep->getShapeFaces()[face_id], box); + + min = box.CornerMin().Coord(); + max = box.CornerMax().Coord(); + } + break; + case acamcad::DataType::MESH_TYPE: + { + auto vs = AMCAX::SubD::MeshTool::FaceVertexIndexs(mesh->mesh(), face_id); + double x_min(0), y_min(0), z_min(0), x_max(0), y_max(0), z_max(0); + + for (int i = 0; i < vs.size(); i++) + { + auto& p = AMCAX::SubD::MeshTool::Position(mesh->mesh(), vs[i]); + + if (i == 0) + { + x_min = x_max = p.X(); + y_min = y_max = p.Y(); + z_min = z_max = p.Z(); + } + else { + x_min = std::min(p.X(), x_min); + y_min = std::min(p.Y(), y_min); + z_min = std::min(p.Z(), z_min); + + x_max = std::max(p.X(), x_max); + y_max = std::max(p.Y(), y_max); + z_max = std::max(p.Z(), z_max); + } + + } + + min.SetCoord(x_min, y_min, z_min); + max.SetCoord(x_max, y_max, z_max); + + //center_.SetX((x_min + x_max) / 2); + //center_.SetY((y_min + y_max) / 2); + //center_.SetZ((z_min + z_max) / 2); + } + break; + case acamcad::DataType::TSPLINEU_TYPE: + { + auto ids = AMCAX::TMS::TMSplineTool::FaceVertexIndexs(tSpline->getTSpline(), face_id); + double x_min(0), y_min(0), z_min(0), x_max(0), y_max(0), z_max(0); + + for (int i = 0; i < ids.size(); i++) + { + auto& p = AMCAX::TMS::TMSplineTool::ControlPosition(tSpline->getTSpline(), ids[i]); + if (i == 0) + { + x_min = x_max = p.X(); + y_min = y_max = p.Y(); + z_min = z_max = p.Z(); + } + else { + x_min = std::min(p.X(), x_min); + y_min = std::min(p.Y(), y_min); + z_min = std::min(p.Z(), z_min); + + x_max = std::max(p.X(), x_max); + y_max = std::max(p.Y(), y_max); + z_max = std::max(p.Z(), z_max); + } + + + } + min.SetCoord(x_min, y_min, z_min); + max.SetCoord(x_max, y_max, z_max); + + } + break; + default: + break; + } + } + void AdapterObject::GetBoundingBoxByEdge(int edge_id, AMCAX::Coord3& min, AMCAX::Coord3& max) + { + switch (dataType()) + { + case acamcad::DataType::BREP_TYPE: + { + AMCAX::BoundingBox3 box; + AMCAX::BRepBoundingBox::AddToBox(bRep->getShapeEdges()[edge_id], box); + + min = box.CornerMin().Coord(); + max = box.CornerMax().Coord(); + } + break; + case acamcad::DataType::MESH_TYPE: + { + int v0, v1; + AMCAX::SubD::MeshTool::EdgeVertexIndexs(mesh->mesh(), edge_id, v0, v1); + auto& p0 = AMCAX::SubD::MeshTool::Position(mesh->mesh(), v0), + & p1 = AMCAX::SubD::MeshTool::Position(mesh->mesh(), v1); + + min.SetCoord(std::min(p0.X(), p1.X()), std::min(p0.Y(), p1.Y()), std::min(p0.Z(), p1.Z())); + max.SetCoord(std::max(p0.X(), p1.X()), std::max(p0.Y(), p1.Y()), std::max(p0.Z(), p1.Z())); + + //center_.SetX((p0.X() + p1.X()) / 2); + //center_.SetY((p0.Y() + p1.Y()) / 2); + //center_.SetZ((p0.X() + p1.Y()) / 2); + } + break; + case acamcad::DataType::TSPLINEU_TYPE: + { + int v0, v1; + AMCAX::TMS::TMSplineTool::EdgeVertexIndexs(tSpline->getTSpline(), edge_id, v0, v1); + auto p0 = AMCAX::TMS::TMSplineTool::ControlPosition(tSpline->getTSpline(), v0), + p1 = AMCAX::TMS::TMSplineTool::ControlPosition(tSpline->getTSpline(), v1); + + + min.SetCoord(std::min(p0.X(), p1.X()), std::min(p0.Y(), p1.Y()), std::min(p0.Z(), p1.Z())); + max.SetCoord(std::max(p0.X(), p1.X()), std::max(p0.Y(), p1.Y()), std::max(p0.Z(), p1.Z())); + + } + break; + default: + break; + } + } + void AdapterObject::GetBoundingBoxByVetex(int vetex_id, AMCAX::Coord3& position) + { + switch (dataType()) + { + case acamcad::DataType::BREP_TYPE: + { + bRep->getShapeVertices(); + AMCAX::BoundingBox3 box; + AMCAX::BRepBoundingBox::AddToBox(bRep->getShapeVertices()[vetex_id], box); + + //min = box.CornerMin().Coord(); + position = (box.CornerMax().Coord() + box.CornerMin().Coord()) / 2; + } + break; + case acamcad::DataType::MESH_TYPE: + { + auto& p = AMCAX::SubD::MeshTool::Position(mesh->mesh(), vetex_id); + + position = p.Coord(); + } + break; + case acamcad::DataType::TSPLINEU_TYPE: + { + auto& p = AMCAX::TMS::TMSplineTool::ControlPosition(tSpline->getTSpline(), vetex_id); + position = p.Coord(); + } + break; + default: + break; + } + } + + void AdapterObject::mirror(const AMCAX::Coord3& center, const AMCAX::Coord3& axis) + { + switch (dataType()) + { + case acamcad::DataType::MESH_TYPE: + { + AMCAX::Vector3 c_v(center), c_a(axis); + mesh->mirrorMeshObject(c_v, c_a); + } + break; + case acamcad::DataType::BREP_TYPE: + { + bRep->mirrorMeshObject(center, axis); + } + break; + case acamcad::DataType::TSPLINEU_TYPE: + { + tSpline->mirror(center, axis); + //std::cout << "" << std::endl; + } + break; + default: + break; + } + + } + + + const ObjectDraw* AdapterObject::getDrawTool() const + { + if (bRep) + return bRep->getDrawTool(); + + if (mesh) + return mesh->getDrawTool(); + + if (tSpline) + return tSpline->getDrawTool(); + } + + + void AdapterObject::updateDraw() + { + if (bRep) { + bRep->updateDraw(); + } + + if (mesh) + mesh->updateDraw(); + + if (tSpline) + tSpline->updateDraw(); + } + + +} \ No newline at end of file diff --git a/Src/Object/AdapterObject.h b/Src/Object/AdapterObject.h new file mode 100644 index 0000000..622f124 --- /dev/null +++ b/Src/Object/AdapterObject.h @@ -0,0 +1,82 @@ +/* =================================================================== +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* All rights reserved. +* +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* software under the terms of either license. +* +* For more information about the AGPLv3.0 license, please visit: +* https://www.gnu.org/licenses/agpl-3.0.html +* For licensing inquiries or to obtain a commercial license, please +* contact Hefei Jiushao Intelligent Technology Co., Ltd. +* =================================================================== +* Author: +*/ +#pragma once + +#include "BaseObject.h" + +#include + +#include +#include + + +namespace acamcad +{ + class BRepObject; + class MeshObject; + class TSplineObject; + //class TSplineObject; + + class AdapterObject : public BaseObject + { + public: + + AdapterObject(); + AdapterObject(const AdapterObject& object, bool isDraw); + + virtual ~AdapterObject(); + + // select vert edge face + void selectVertWithFaceId(const AMCAX::Vector3& begin, const AMCAX::Vector3& end, int f_id, int& sv_id); + void selectEdgeWithFaceId(const AMCAX::Vector3& begin, const AMCAX::Vector3& end, int f_id, int& se_id); + //void selectFaceWithFaceId(const AMCAX::Vector3& begin, const AMCAX::Vector3& end, int f_id, int& sf_id); + + // mesh move rotate scale + void mesh_OPvert_BackupVertes(const std::vector& vert_id); + void mesh_OPvert_BackupEdges(const std::vector& edge_id); + void mesh_OPvert_BackupFaces(const std::vector& face_id); + void mesh_Clear_OPvertBackup(); + virtual void mesh_OPvert_Backup(); + virtual void meshMove(const AMCAX::Coord3& v, double dis); + + //在有了原来的顶点之后,所有的缩放都是一样的,没有体,边,面,点的区别了。 + void meshScaleSingle(const AMCAX::Coord3& center, const AMCAX::Coord3& axis, double scale); + void meshScalePlane(const AMCAX::Coord3& center, const AMCAX::Coord3& normal, double scale); + void meshRotation(const AMCAX::Coord3& center, const AMCAX::Coord3& axis, double angle); + + // BoundingBox + void GetBoundingBox(AMCAX::Coord3& min, AMCAX::Coord3& max); + void GetBoundingBoxByFace(int face_id, AMCAX::Coord3& min, AMCAX::Coord3& max); + void GetBoundingBoxByEdge(int edge_id, AMCAX::Coord3& min, AMCAX::Coord3& max); + void GetBoundingBoxByVetex(int vetex_id, AMCAX::Coord3& position); + + // mirror + void mirror(const AMCAX::Coord3& center, const AMCAX::Coord3& axis); + + + // BaseObject + virtual void setDataType(DataType _type) override; + //virtual void doOperate(MOperation* operate) override; + virtual void updateDraw() override; + const virtual ObjectDraw* getDrawTool() const override; + + public: + std::unique_ptr bRep; + std::unique_ptr mesh; + std::unique_ptr tSpline; + //std::uni + }; +} \ No newline at end of file diff --git a/Src/Object/AdapterObjectParent.cpp b/Src/Object/AdapterObjectParent.cpp new file mode 100644 index 0000000..b64478e --- /dev/null +++ b/Src/Object/AdapterObjectParent.cpp @@ -0,0 +1,8 @@ +#include "AdapterObjectParent.h" +#include "AdapterObject.h" + +namespace acamcad +{ + AdapterObjectParent::AdapterObjectParent(AdapterObject* parent) :parent_(parent) {}; + +} \ No newline at end of file diff --git a/Src/Object/AdapterObjectParent.h b/Src/Object/AdapterObjectParent.h new file mode 100644 index 0000000..9b9d636 --- /dev/null +++ b/Src/Object/AdapterObjectParent.h @@ -0,0 +1,33 @@ +/* =================================================================== +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* All rights reserved. +* +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* software under the terms of either license. +* +* For more information about the AGPLv3.0 license, please visit: +* https://www.gnu.org/licenses/agpl-3.0.html +* For licensing inquiries or to obtain a commercial license, please +* contact Hefei Jiushao Intelligent Technology Co., Ltd. +* =================================================================== +* Author: +*/ +#pragma once + + +namespace acamcad +{ + class AdapterObject; + + class AdapterObjectParent + { + public: + AdapterObjectParent(AdapterObject* parent); + + protected: + AdapterObject* parent_; + + }; + +} \ No newline at end of file diff --git a/Src/Object/AxisObject.cpp b/Src/Object/AxisObject.cpp index fdfe7de..4677c05 100644 --- a/Src/Object/AxisObject.cpp +++ b/Src/Object/AxisObject.cpp @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "AxisObject.h" @@ -21,133 +21,133 @@ using namespace acamcad; Arrow::Arrow() : - BaseObject(nullptr), from_(0.0, 0.0, 0.0), dir_(0.0, 0.0, 1.0), length_(1.0), radius_(1.0) + BaseObject(nullptr), from_(0.0, 0.0, 0.0), dir_(0.0, 0.0, 1.0), length_(1.0), radius_(1.0) { - setDataType(DataType::ARROW_TYPE); + setDataType(DataType::CUSTOM_TYPE); } Arrow::Arrow(const Arrow& a) : - BaseObject(a) + BaseObject(a) { - from_ = a.from_; - dir_ = a.dir_; - length_ = a.length_; - radius_ = a.radius_; - setDataType(DataType::ARROW_TYPE); + from_ = a.from_; + dir_ = a.dir_; + length_ = a.length_; + radius_ = a.radius_; + setDataType(DataType::CUSTOM_TYPE); } Arrow::Arrow(const AMCAX::Coord3& direction, double lenth, double radius) : BaseObject(), from_(0.0, 0.0, 0.0), dir_(direction), length_(lenth), radius_(radius) { - setDataType(DataType::ARROW_TYPE); - dir_.Normalize(); + setDataType(DataType::CUSTOM_TYPE); + dir_.Normalize(); } Arrow::Arrow(const AMCAX::Coord3& from, const AMCAX::Coord3& direction, double length, double radius) : BaseObject(), from_(from), dir_(direction), length_(length), radius_(radius) { - setDataType(DataType::ARROW_TYPE); - dir_.Normalize(); + setDataType(DataType::CUSTOM_TYPE); + dir_.Normalize(); } Arrow::Arrow(const AMCAX::Coord3& from, const AMCAX::Coord3& to, double radius) : BaseObject(), from_(from), radius_(radius) { - setDataType(DataType::ARROW_TYPE); + setDataType(DataType::CUSTOM_TYPE); dir_ = to - from; length_ = dir_.Norm(); - dir_.Normalize(); + dir_.Normalize(); } void Arrow::orthogonalFrame(Arrow& u, Arrow& v) { - AMCAX::Coord3 au, av; - MathUtils::GramSchmidtAlign(dir_, au, av); + AMCAX::Coord3 au, av; + MathUtils::GramSchmidtAlign(dir_, au, av); - u.setDirection(au); - u.setFrom(from_); - u.setLength(length_); + u.setDirection(au); + u.setFrom(from_); + u.setLength(length_); - v.setDirection(av); - v.setFrom(from_); - v.setLength(length_); + v.setDirection(av); + v.setFrom(from_); + v.setLength(length_); } //======================================================================== //======================================================================== Axis::Axis() : - BaseObject(), center_(0.0, 0.0, 0.0), axis_x_(), axis_y_(), axis_z_() + BaseObject(), center_(0.0, 0.0, 0.0), axis_x_(), axis_y_(), axis_z_() { - setDataType(DataType::AXIS_TYPE); - draw_tool_ = new AxisObjectDraw(this); + setDataType(DataType::CUSTOM_TYPE); + draw_tool_ = new AxisObjectDraw(this); - axis_x_.setDirection(AMCAX::Coord3(1.0, 0.0, 0.0)); - axis_y_.setDirection(AMCAX::Coord3(0.0, 1.0, 0.0)); - axis_z_.setDirection(AMCAX::Coord3(0.0, 0.0, 1.0)); + axis_x_.setDirection(AMCAX::Coord3(1.0, 0.0, 0.0)); + axis_y_.setDirection(AMCAX::Coord3(0.0, 1.0, 0.0)); + axis_z_.setDirection(AMCAX::Coord3(0.0, 0.0, 1.0)); } Axis::Axis(double length) : - BaseObject(), center_(0.0, 0.0, 0.0), axis_x_(), axis_y_(), axis_z_() + BaseObject(), center_(0.0, 0.0, 0.0), axis_x_(), axis_y_(), axis_z_() { - setDataType(DataType::AXIS_TYPE); - draw_tool_ = new AxisObjectDraw(this); + setDataType(DataType::CUSTOM_TYPE); + draw_tool_ = new AxisObjectDraw(this); - axis_x_.setDirection(AMCAX::Coord3(1.0, 0.0, 0.0)); axis_x_.setLength(length); - axis_y_.setDirection(AMCAX::Coord3(0.0, 1.0, 0.0)); axis_y_.setLength(length); - axis_z_.setDirection(AMCAX::Coord3(0.0, 0.0, 1.0)); axis_z_.setLength(length); + axis_x_.setDirection(AMCAX::Coord3(1.0, 0.0, 0.0)); axis_x_.setLength(length); + axis_y_.setDirection(AMCAX::Coord3(0.0, 1.0, 0.0)); axis_y_.setLength(length); + axis_z_.setDirection(AMCAX::Coord3(0.0, 0.0, 1.0)); axis_z_.setLength(length); } Axis::Axis(const AMCAX::Coord3& getCenter, const AMCAX::Coord3& z_axis) : - BaseObject(), center_(getCenter), axis_z_(getCenter, z_axis), axis_x_(getCenter, z_axis), axis_y_(getCenter, z_axis) + BaseObject(), center_(getCenter), axis_z_(getCenter, z_axis), axis_x_(getCenter, z_axis), axis_y_(getCenter, z_axis) { - setDataType(DataType::AXIS_TYPE); - draw_tool_ = new AxisObjectDraw(this); + setDataType(DataType::CUSTOM_TYPE); + draw_tool_ = new AxisObjectDraw(this); - axis_z_.orthogonalFrame(axis_x_, axis_y_); + axis_z_.orthogonalFrame(axis_x_, axis_y_); } void Axis::setCenter(const AMCAX::Coord3& getCenter) { - center_ = getCenter; - axis_x_.setFrom(center_); - axis_y_.setFrom(center_); - axis_z_.setFrom(center_); + center_ = getCenter; + axis_x_.setFrom(center_); + axis_y_.setFrom(center_); + axis_z_.setFrom(center_); } void acamcad::Axis::setRadius(double radius) { - axis_x_.setRadius(radius); - axis_y_.setRadius(radius); - axis_z_.setRadius(radius); + axis_x_.setRadius(radius); + axis_y_.setRadius(radius); + axis_z_.setRadius(radius); } Arrow acamcad::Axis::axis_vector(int i) { - if (i == 0) return axis_x_; - else if (i == 1) return axis_y_; - else if (i == 2) return axis_z_; - else return axis_z_; + if (i == 0) return axis_x_; + else if (i == 1) return axis_y_; + else if (i == 2) return axis_z_; + else return axis_z_; } Arrow acamcad::Axis::axis_vector(int i) const { - if (i == 0) return axis_x_; - else if (i == 1) return axis_y_; - else if (i == 2) return axis_z_; - else return axis_z_; + if (i == 0) return axis_x_; + else if (i == 1) return axis_y_; + else if (i == 2) return axis_z_; + else return axis_z_; } void Axis::setAxis(const AMCAX::Coord3& axis_z, double length) { - axis_z_.setDirection(axis_z); - axis_z_.setLength(length); - axis_z_.orthogonalFrame(axis_x_, axis_y_); + axis_z_.setDirection(axis_z); + axis_z_.setLength(length); + axis_z_.orthogonalFrame(axis_x_, axis_y_); } void Axis::setlentgh(double length) { - axis_x_.setLength(length); - axis_y_.setLength(length); - axis_z_.setLength(length); + axis_x_.setLength(length); + axis_y_.setLength(length); + axis_z_.setLength(length); } \ No newline at end of file diff --git a/Src/Object/AxisObject.h b/Src/Object/AxisObject.h index 9d945b1..d91acb2 100644 --- a/Src/Object/AxisObject.h +++ b/Src/Object/AxisObject.h @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #pragma once @@ -20,99 +20,99 @@ namespace acamcad { -class Arrow : BaseObject -{ -public: - Arrow(); - Arrow(const Arrow& object); - Arrow(const AMCAX::Coord3& direction, double lenth, double radius = 1.0); - Arrow(const AMCAX::Coord3& from, const AMCAX::Coord3& direction, double length, double radius = 1.0); - Arrow(const AMCAX::Coord3& from, const AMCAX::Coord3& to, double radius = 1.0); - virtual ~Arrow() {} - -public: - AMCAX::Coord3 direction() const { return dir_; } - AMCAX::Coord3& direction() { return dir_; } - - AMCAX::Coord3 from() const { return from_; } - AMCAX::Coord3& from() { return from_; } - - void setDirection(const AMCAX::Coord3& dirction) { - dir_ = dirction; - dir_.Normalize(); - } - - void setFrom(const AMCAX::Coord3& point) { from_ = point; } - - double length() const { return length_; } - double& length() { return length_; } - - void setLength(double length) { length_ = length; } - - double radius() const { return radius_; } - double& radius() { return radius_; } - void setRadius(double radius) { radius_ = radius; } -public: - void orthogonalFrame(Arrow& u, Arrow& v); - -private: - double length_; - double radius_; - - AMCAX::Coord3 dir_; - AMCAX::Coord3 from_; -}; - -class Axis : BaseObject -{ - friend class ObjectDraw; - friend class AxisObjectDraw; + class Arrow : BaseObject + { + public: + Arrow(); + Arrow(const Arrow& object); + Arrow(const AMCAX::Coord3& direction, double lenth, double radius = 1.0); + Arrow(const AMCAX::Coord3& from, const AMCAX::Coord3& direction, double length, double radius = 1.0); + Arrow(const AMCAX::Coord3& from, const AMCAX::Coord3& to, double radius = 1.0); + virtual ~Arrow() {} + + public: + AMCAX::Coord3 direction() const { return dir_; } + AMCAX::Coord3& direction() { return dir_; } + + AMCAX::Coord3 from() const { return from_; } + AMCAX::Coord3& from() { return from_; } + + void setDirection(const AMCAX::Coord3& dirction) { + dir_ = dirction; + dir_.Normalize(); + } + + void setFrom(const AMCAX::Coord3& point) { from_ = point; } + + double length() const { return length_; } + double& length() { return length_; } + + void setLength(double length) { length_ = length; } + + double radius() const { return radius_; } + double& radius() { return radius_; } + void setRadius(double radius) { radius_ = radius; } + public: + void orthogonalFrame(Arrow& u, Arrow& v); + + private: + double length_; + double radius_; + + AMCAX::Coord3 dir_; + AMCAX::Coord3 from_; + }; + + class Axis : BaseObject + { + friend class ObjectDraw; + friend class AxisObjectDraw; + + public: + Axis(); + Axis(double length); + Axis(const AMCAX::Coord3& getCenter, const AMCAX::Coord3& z_axis); -public: - Axis(); - Axis(double length); - Axis(const AMCAX::Coord3& getCenter, const AMCAX::Coord3& z_axis); + virtual ~Axis() {}; - virtual ~Axis() {}; + public: + const Arrow& axis_x() const { return axis_x_; } + Arrow axis_x() { return axis_x_; } -public: - const Arrow& axis_x() const { return axis_x_; } - Arrow axis_x() { return axis_x_; } + const Arrow& axis_y() const { return axis_y_; } + Arrow axis_y() { return axis_y_; } - const Arrow& axis_y() const { return axis_y_; } - Arrow axis_y() { return axis_y_; } + const Arrow& axis_z() const { return axis_z_; } + Arrow axis_z() { return axis_z_; } - const Arrow& axis_z() const { return axis_z_; } - Arrow axis_z() { return axis_z_; } + // x is 0, y is 1, z is 2; + Arrow axis_vector(int i) const; + Arrow axis_vector(int i); - // x is 0, y is 1, z is 2; - Arrow axis_vector(int i) const; - Arrow axis_vector(int i); + void setAxis(const AMCAX::Coord3& axis_z, double length = 1.0); - void setAxis(const AMCAX::Coord3& axis_z, double length = 1.0); + public: + double length() { return axis_z_.length(); } + void setlentgh(double length = 1.0); -public: - double length() { return axis_z_.length(); } - void setlentgh(double length = 1.0); + AMCAX::Coord3 getCenter() { return axis_z_.from(); } + void setCenter(const AMCAX::Coord3& getCenter); - AMCAX::Coord3 getCenter() { return axis_z_.from(); } - void setCenter(const AMCAX::Coord3& getCenter); + double radius() { return axis_z_.radius(); } + void setRadius(double radius); - double radius() { return axis_z_.radius(); } - void setRadius(double radius); + private: + AMCAX::Coord3 center_; -private: - AMCAX::Coord3 center_; + Arrow axis_x_; + Arrow axis_y_; + Arrow axis_z_; - Arrow axis_x_; - Arrow axis_y_; - Arrow axis_z_; + public: + const ObjectDraw* getDrawTool() const { return draw_tool_; } -public: - const ObjectDraw* getDrawTool() const { return draw_tool_; } + private: + ObjectDraw* draw_tool_; + }; -private: - ObjectDraw* draw_tool_; -}; - } // namespace acamcad \ No newline at end of file diff --git a/Src/Object/BRepObject.cpp b/Src/Object/BRepObject.cpp index 226ed2d..bb5c118 100644 --- a/Src/Object/BRepObject.cpp +++ b/Src/Object/BRepObject.cpp @@ -1,21 +1,23 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "BRepObject.h" #include "../ObjectDraw/BrepObjectDraw.h" #include "../Operation/MOperate.h" +#include "AdapterObject.h" +#include "AdapterObjectParent.h" #include #include @@ -27,39 +29,51 @@ #include #include +#include +#include +#include +#include +#include +#include +#include +#include "../Utils/MathUtils.h" +#include + namespace acamcad { - BRepObject::BRepObject() - :BaseObject(), draw_tool_(nullptr) + BRepObject::BRepObject(AdapterObject* parent) + :AdapterObjectParent(parent)//, draw_tool_(nullptr) { shape_.Nullify(); - setDataType(DataType::BREP_TYPE); - draw_tool_ = new BRepObjectDraw(this); - updateShapeInfo(); + //setDataType(DataType::BREP_TYPE); + draw_tool_ = std::make_unique(parent); + //draw_tool_ = new BRepObjectDraw(parent); + //updateShapeInfo(); //draw_tool_->updatedrawState(); } - BRepObject::BRepObject(const BRepObject& object) + BRepObject::BRepObject(AdapterObject* parent, const BRepObject& object, bool isDraw) :AdapterObjectParent(parent) { if (!object.shape_.IsNull()) shape_ = AMCAX::CopyShape(object.shape_); - setDataType(DataType::BREP_TYPE); - draw_tool_ = new BRepObjectDraw(this); + //setDataType(DataType::BREP_TYPE); + if (isDraw) + draw_tool_ = std::make_unique(parent); - updateShapeInfo(); - draw_tool_->updatedrawState(); } BRepObject::~BRepObject() { shape_.Nullify(); + + //delete draw_tool_; } void BRepObject::doOperate(MOperation* operate) { - operate->operateWithBRep(this); + operate->operate(parent_); updateShapeInfo(); draw_tool_->updatedrawState(); } @@ -122,18 +136,18 @@ namespace acamcad bool BRepObject::loadBRep(const QString& _filename) { - setFromFileName(_filename); + parent_->setFromFileName(_filename); - setName(name()); + parent_->setName(parent_->name()); std::string filename = _filename.toStdString(); - - bool ok = /*AMCAX::BRepTool::Read(shape_, filename, -1); + + bool ok = /*AMCAX::BRepTool::Read(shape_, filename, -1); if (ok) { - updateDraw(); + updateDraw(); show(); - }*/ true; + }*/ true; return ok; } @@ -142,9 +156,9 @@ namespace acamcad { std::string filename = _filename.toStdString(); - bool ok = /*AMCAX::BRepTool::Write(shape_, filename, -1);*/ true; - - return ok; + bool ok = /*AMCAX::BRepTool::Write(shape_, filename, -1);*/ true; + + return ok; } bool BRepObject::saveBRepSTL(const QString& filename) @@ -159,6 +173,8 @@ namespace acamcad return AMCAX::OBJTool::WriteShape(shape_, filename.toStdString()); } + + void BRepObject::mesh_OPvert_Backup() { brep_trans_back_ = AMCAX::CopyShape(shape_); @@ -191,24 +207,85 @@ namespace acamcad tr.SetTranslation(v); AMCAX::TransformShape trans(shape_, tr); shape_ = trans.Shape(); - + updateShapeInfo(); draw_tool_->updatedrawState(); } - BRepObject* BRepObject::mirrorMeshObject(const AMCAX::Coord3& center, const AMCAX::Coord3& normal) + void BRepObject::mirrorMeshObject(const AMCAX::Coord3& center, const AMCAX::Coord3& normal) { AMCAX::Point3 P(center.X(), center.Y(), center.Z()); AMCAX::Direction3 v(normal.X(), normal.Y(), normal.Z()); AMCAX::Transformation3 tr; tr.SetMirror(AMCAX::Frame3(P, v)); - AMCAX::TransformShape trans(brep_trans_back_, tr); + AMCAX::TransformShape trans(brep_trans_back_, tr); + + shape_ = trans.Shape(); + + //BRepObject* brep_object_new = new BRepObject(); + //brep_object_new->shape_ = trans.Shape(); + //brep_object_new->updateDraw(); + //return brep_object_new; + //turn NULL; + } + + // select vert edge face + void BRepObject::selectVertWithFaceId(const AMCAX::Vector3& begin, const AMCAX::Vector3& end, int f_id, int& sv_id) + { + sv_id = -1; + AMCAX::TopoVertex vMin; + double min_dis = std::numeric_limits::max(); + AMCAX::Coord3 ve_min; + + AMCAX::TopoShape f = getShapeFaces()[f_id]; + for (AMCAX::TopoExplorer expV(f, AMCAX::ShapeType::Vertex); expV.More(); expV.Next()) + { + AMCAX::TopoVertex v = static_cast(expV.Current()); + AMCAX::Point3 p = AMCAX::TopoTool::Point(v); + double len = MathUtils::distPointLineSquared(p.Coord(), begin.Coord(), end.Coord(), ve_min); + if (min_dis > len) + { + min_dis = len; + vMin = v; + } + } + + if (min_dis < 0.01) + sv_id = getShapeVertices().index(vMin); + } + void BRepObject::selectEdgeWithFaceId(const AMCAX::Vector3& begin, const AMCAX::Vector3& end, int f_id, int& se_id) + { + se_id = -1; + AMCAX::TopoEdge eMin; + double min_dis = std::numeric_limits::max(); + AMCAX::Coord3 ve_min(0.0, 0.0, 0.0), vL_min(0.0, 0.0, 0.0); + + AMCAX::TopoShape f = getShapeFaces()[f_id]; + for (AMCAX::TopoExplorer expE(f, AMCAX::ShapeType::Edge); expE.More(); expE.Next()) + { + const AMCAX::TopoEdge& e = static_cast(expE.Current()); + AMCAX::TopoLocation loc; + std::shared_ptr triMesh; + std::shared_ptr polyMesh; + AMCAX::TopoTool::PolygonOnTriangulation(e, polyMesh, triMesh, loc); + const AMCAX::Transformation3& tr = loc.Transformation(); + for (int pid = 1; pid < polyMesh->NVertices(); ++pid) + { + const AMCAX::Point3& p0 = triMesh->Vertex(polyMesh->Vertex(pid - 1)).Transformed(tr); + const AMCAX::Point3& p1 = triMesh->Vertex(polyMesh->Vertex(pid)).Transformed(tr); + + double len = MathUtils::distLine_SLineSquared(p0.Coord(), p1.Coord(), begin.Coord(), end.Coord(), ve_min, vL_min); + if (len < min_dis) + { + min_dis = len; + eMin = e; + } + } + } - BRepObject* brep_object_new = new BRepObject(); - // brep_object_new->shape_ = trans.Shape(); - brep_object_new->updateDraw(); - return brep_object_new; + if (min_dis < 0.01) + se_id = getShapeEdges().index(eMin); } void BRepObject::updateShapeInfo() @@ -228,7 +305,7 @@ namespace acamcad updateShapeInfo(); output += "========================================================================\n"; - output += BaseObject::getObjectinfo(); + output += parent_->getObjectinfo(); output += "Object Contains BRep : "; output += QString::number(shapeVertices_.size()) + " vertices, "; diff --git a/Src/Object/BRepObject.h b/Src/Object/BRepObject.h index 1afac30..985c583 100644 --- a/Src/Object/BRepObject.h +++ b/Src/Object/BRepObject.h @@ -1,40 +1,49 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #pragma once #include "BaseObject.h" #include #include #include +#include "AdapterObjectParent.h" +#include namespace acamcad { - class BRepObject : public BaseObject + class AdapterObject; + class AdapterObjectParent; + + class BRepObject : public AdapterObjectParent { friend class ObjectDraw; friend class BRepObjectDraw; + public: - BRepObject(); - BRepObject(const BRepObject& object); + BRepObject(AdapterObject* parent); + BRepObject(AdapterObject* parent, const BRepObject& object, bool isDraw); virtual ~BRepObject(); public: - virtual void doOperate(MOperation* operate) override; - virtual void updateDraw() override; + void doOperate(MOperation* operate); + void updateDraw(); + /// Get all Info for the Object as a string + QString getObjectinfo(); + const virtual ObjectDraw* getDrawTool() const { return draw_tool_.get(); } public: void assignBRep(); @@ -58,17 +67,23 @@ namespace acamcad bool saveBRepSTL(const QString& filename); bool saveBRepOBJ(const QString& filename); + //AdapterObject* getParent(); + public: void mesh_OPvert_Backup(); void mesh_Clear_OPvertBackup(); void meshRotation(const AMCAX::Coord3& center, const AMCAX::Coord3& axis, double angle); //rotation void meshMove(const AMCAX::Coord3& v, double dis); - - BRepObject* mirrorMeshObject(const AMCAX::Coord3& center, const AMCAX::Coord3& normal); - public: - const virtual ObjectDraw* getDrawTool() const override { return draw_tool_; } + void mirrorMeshObject(const AMCAX::Coord3& center, const AMCAX::Coord3& normal); + + + // select vert edge face + void selectVertWithFaceId(const AMCAX::Vector3& begin, const AMCAX::Vector3& end, int f_id, int& sv_id); + void selectEdgeWithFaceId(const AMCAX::Vector3& begin, const AMCAX::Vector3& end, int f_id, int& se_id); + //void selectFaceWithFaceId(const AMCAX::Vector3& begin, const AMCAX::Vector3& end, int f_id, int& sf_id); + private: void updateShapeInfo(); @@ -80,11 +95,11 @@ namespace acamcad AMCAX::TopoShape brep_trans_back_; - ObjectDraw* draw_tool_; + std::unique_ptr draw_tool_; + + //AdapterObject* parent_; + - public: - /// Get all Info for the Object as a string - QString getObjectinfo() override; }; } //namespace acamcad diff --git a/Src/Object/BaseObject.cpp b/Src/Object/BaseObject.cpp index 93df1d6..8a9127e 100644 --- a/Src/Object/BaseObject.cpp +++ b/Src/Object/BaseObject.cpp @@ -1,143 +1,139 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "BaseObject.h" #include namespace acamcad { -BaseObject::BaseObject(QObject* parent) - : QObject(), id_(-1), persistentId_(-1), label_(""),objectType_(DataType::ALL_TYPE), - visible_(true), select_(false), select_sub_(false),path_("."), filename_(""), name_("") -{ -} - -BaseObject::BaseObject(const BaseObject& _object) : - QObject(),id_(_object.id_),persistentId_(_object.persistentId_),label_(""),objectType_(_object.objectType_), - visible_(_object.visible_), select_(_object.select_), select_sub_(_object.select_sub_), path_("."), filename_("") -{ - // Generate a usable name based on the copied object - name_ = "Copy of " + _object.name_; -} - -BaseObject::~BaseObject() -{ -} - -void BaseObject::doOperate(MOperation* operate) -{ -} - -bool acamcad::BaseObject::isDataType(DataType _type) const -{ - return (objectType_ == _type); -} - -DataType acamcad::BaseObject::dataType() const -{ - return BaseObject::objectType_; -} - -void acamcad::BaseObject::setDataType(DataType _type) -{ - objectType_ = _type; -} - -QString BaseObject::getObjectinfo() -{ - return QString(); -} - -void BaseObject::printObjectInfo() -{ -} - -bool BaseObject::isVisible() const -{ - return visible_; -} - -void BaseObject::setVisible(bool _visible) -{ - visible_ = _visible; -} - -void BaseObject::show() -{ - visible_ = true; -} - -void BaseObject::hide() -{ - visible_ = false; -} - -bool BaseObject::isSelect() const -{ - return select_; -} - -void BaseObject::setSelect(bool _select) -{ - select_ = _select; -} - -bool BaseObject::isSelectSub() const -{ - return select_sub_; -} - -void BaseObject::setSelectSub(bool _select) -{ - select_sub_ = _select; -} - -//========================================================== - -void BaseObject::setFromFileName(const QString& _filename) { - QFileInfo file_info(_filename); - setPath(file_info.path()); - QString filename = file_info.fileName(); - setFileName(filename); -} - -QString BaseObject::path() const -{ - return path_; -} -void BaseObject::setPath(const QString& _path) -{ - path_ = _path; -} - -QString BaseObject::name() const -{ - return name_; -} -void BaseObject::setName(QString _name) -{ - name_ = _name; -} - -QString BaseObject::filename() const -{ - return filename_; -} -void BaseObject::setFileName(const QString& _filename) -{ - filename_ = _filename; -} + BaseObject::BaseObject(QObject* parent) + : QObject(), id_(-1), persistentId_(-1), label_(""), objectType_(DataType::CUSTOM_TYPE), + visible_(true), select_(false), select_sub_(false), path_("."), filename_(""), name_("") + { + } + + BaseObject::BaseObject(const BaseObject& _object) : + QObject(), id_(_object.id_), persistentId_(_object.persistentId_), label_(""), objectType_(_object.objectType_), + visible_(_object.visible_), select_(_object.select_), select_sub_(_object.select_sub_), path_("."), filename_("") + { + // Generate a usable name based on the copied object + name_ = "Copy of " + _object.name_; + } + + BaseObject::~BaseObject() + { + } + + bool acamcad::BaseObject::isDataType(DataType _type) const + { + return (objectType_ == _type); + } + + DataType acamcad::BaseObject::dataType() const + { + return BaseObject::objectType_; + } + + void acamcad::BaseObject::setDataType(DataType _type) + { + objectType_ = _type; + } + + QString BaseObject::getObjectinfo() + { + return QString(); + } + + void BaseObject::printObjectInfo() + { + } + + bool BaseObject::isVisible() const + { + return visible_; + } + + void BaseObject::setVisible(bool _visible) + { + visible_ = _visible; + } + + void BaseObject::show() + { + visible_ = true; + } + + void BaseObject::hide() + { + visible_ = false; + } + + bool BaseObject::isSelect() const + { + return select_; + } + + void BaseObject::setSelect(bool _select) + { + select_ = _select; + } + + bool BaseObject::isSelectSub() const + { + return select_sub_; + } + + void BaseObject::setSelectSub(bool _select) + { + select_sub_ = _select; + } + + //========================================================== + + void BaseObject::setFromFileName(const QString& _filename) { + QFileInfo file_info(_filename); + setPath(file_info.path()); + QString filename = file_info.fileName(); + setFileName(filename); + } + + QString BaseObject::path() const + { + return path_; + } + void BaseObject::setPath(const QString& _path) + { + path_ = _path; + } + + QString BaseObject::name() const + { + return name_; + } + void BaseObject::setName(QString _name) + { + name_ = _name; + } + + QString BaseObject::filename() const + { + return filename_; + } + void BaseObject::setFileName(const QString& _filename) + { + filename_ = _filename; + } } \ No newline at end of file diff --git a/Src/Object/BaseObject.h b/Src/Object/BaseObject.h index fa4f23d..935c0a7 100644 --- a/Src/Object/BaseObject.h +++ b/Src/Object/BaseObject.h @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #pragma once @@ -20,109 +20,111 @@ namespace acamcad { -class MOperation; + class MOperation; -class BaseObject : public QObject -{ - Q_OBJECT -public: - BaseObject(const BaseObject& _object); - explicit BaseObject(QObject* parent = nullptr); - virtual ~BaseObject(); + class BaseObject : public QObject + { + Q_OBJECT + public: + BaseObject(const BaseObject& _object); + explicit BaseObject(QObject* parent = nullptr); + virtual ~BaseObject(); + + public: + int id() const { return id_; } + int persistentId() const { return persistentId_; } + std::string label() const { return label_; } + + int id() { return id_; } + int persistentId() { return persistentId_; } + std::string label() { return label_; } -public: - int id() const { return id_; } - int persistentId() const { return persistentId_; } - std::string label() const { return label_; } + void setId(int id) { id_ = id; } + void setPersistentId(int pid) { persistentId_ = pid; } + void setLabel(const std::string& label) { label_ = label; } - int id() { return id_; } - int persistentId() { return persistentId_; } - std::string label() { return label_; } + private: + int id_; - void setId(int id) { id_ = id; } - void setPersistentId(int pid) { persistentId_ = pid; } - void setLabel(const std::string &label) { label_ = label; } + int persistentId_; -private: - int id_; + // QString name is not used but i can't decide what is it for. + // Plus it's better to use std::string in non-gui related code + // instead of QString, so that they could be reused in future projects. + // Therefore label_ is added here. + // It enables the abililty to classify BaseObject(s) by it's label, which + // could will probably be read from json file, or other up-coming features. + std::string label_; - int persistentId_; + public: + /// check if the object is of the given type + bool isDataType(DataType _type) const; - // QString name is not used but i can't decide what is it for. - // Plus it's better to use std::string in non-gui related code - // instead of QString, so that they could be reused in future projects. - // Therefore label_ is added here. - // It enables the abililty to classify BaseObject(s) by it's label, which - // could will probably be read from json file, or other up-coming features. - std::string label_; + /// return the backObjectType of the object + DataType dataType() const; -public: - /// check if the object is of the given type - bool isDataType(DataType _type) const; + /// set the object type + virtual void setDataType(DataType _type); - /// return the backObjectType of the object - DataType dataType() const; + private: + DataType objectType_; - /// set the object type - void setDataType(DataType _type); + public: + virtual bool isVisible() const; -private: - DataType objectType_; + virtual void setVisible(bool _visible); -public: - virtual bool isVisible() const; + virtual void show(); + virtual void hide(); - virtual void setVisible(bool _visible); + protected: + bool visible_; - virtual void show(); - virtual void hide(); + public: + friend class ObjectDraw; + //virtual const ObjectDraw* getDrawTool() const = 0; -protected: - bool visible_; + virtual const ObjectDraw* getDrawTool() const { return nullptr; } -public: - friend class ObjectDraw; - //virtual const ObjectDraw* getDrawTool() const = 0; + public: + //virtual void doOperate(MOperation* operate); + virtual void updateDraw() {} - virtual const ObjectDraw* getDrawTool() const { return nullptr; } + public: + virtual bool isSelect() const; -public: - virtual void doOperate(MOperation* operate); - virtual void updateDraw() {} + virtual void setSelect(bool _select); -public: - virtual bool isSelect() const; + virtual bool isSelectSub() const; - virtual void setSelect(bool _select); + virtual void setSelectSub(bool _select); - virtual bool isSelectSub() const; + protected: + bool select_; + bool select_sub_; - virtual void setSelectSub(bool _select); + public: + virtual void setFromFileName(const QString& _filename); -protected: - bool select_; - bool select_sub_; + QString path() const; + QString name() const; + QString filename() const; -public: - virtual void setFromFileName(const QString& _filename); + void setPath(const QString& _path); + void setName(QString _name); + void setFileName(const QString& _filename); - QString path() const; - QString name() const; - QString filename() const; + private: + QString path_; + QString filename_; + QString name_; - void setPath(const QString& _path); - void setName(QString _name); - void setFileName(const QString& _filename); + public: + virtual QString getObjectinfo(); + virtual void printObjectInfo(); -private: - QString path_; - QString filename_; - QString name_; + }; -public: - virtual QString getObjectinfo(); - virtual void printObjectInfo(); -}; } //acamcad diff --git a/Src/Object/MeshObject.cpp b/Src/Object/MeshObject.cpp new file mode 100644 index 0000000..27f36eb --- /dev/null +++ b/Src/Object/MeshObject.cpp @@ -0,0 +1,536 @@ +#include "MeshObject.h" +#include +//#include + +#include "../ObjectDraw/MeshObjectDraw.h" +#include "../Operation/MOperate.h" + + + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +#include "../Utils/MathUtils.h" + +//#include +//#include + +namespace acamcad { + + MeshObject::MeshObject(AdapterObject* parent) : + AdapterObjectParent(parent), mesh_(nullptr)//, mesh_subdive_(nullptr) + { + ///setDataType(DataType::MESH_TYPE); + draw_tool_ = std::make_unique(parent_); + } + + MeshObject::MeshObject(AdapterObject* parent, const MeshObject& object, bool isDraw) : + AdapterObjectParent(parent), mesh_(nullptr)//, mesh_subdive_(nullptr) + { + if (object.mesh_ != nullptr) + { + if (object.mesh_ != nullptr) + { + //mesh_ = new polymesh::PolyMesh(); + mesh_ = AMCAX::SubD::MeshCopy::CopyMesh(object.mesh_); + } + } + + //setDataType(DataType::MESH_TYPE); + if (isDraw) { + draw_tool_ = std::make_unique(parent_); + draw_tool_->updatedrawState(); + } + } + + MeshObject::~MeshObject() + { + if (mesh_ != nullptr) + { + mesh_->clear(); + delete mesh_; + } + } + + void MeshObject::SetMesh(polymesh::PolyMesh* mesh) + { + mesh_ = mesh; + } + + polymesh::PolyMesh* MeshObject::mesh() + { + return mesh_; + } + + const polymesh::PolyMesh* MeshObject::mesh() const + { + return mesh_; + } + + bool MeshObject::loadMesh(QString _filename) + { + parent_->setFromFileName(_filename); + + // call the local function to update names + parent_->setName(parent_->name()); + + std::string filename = _filename.toStdString(); + + // load file + bool ok = polymesh::PolyMeshIO::LoadMesh(filename, mesh_); + if (ok) + { + ///mesh_->updateMeshNormal(); + + parent_->show(); + } + else + { + std::cout << "Load File fall" << std::endl; + } + + return ok; + } + + bool MeshObject::saveMesh(QString _filename) + { + std::string filename = _filename.toStdString(); + + bool ok = polymesh::PolyMeshIO::WriteMesh(filename, mesh_); + + if (!ok) + { + std::cout << "Save File fall" << std::endl; + } + return ok; + } + + bool MeshObject::saveTSpline(QString _filename) + { + std::string filename = _filename.toStdString(); + + bool ok = polymesh::PolyMeshIO::WriteToTMSpline(filename, mesh_); + + if (!ok) + std::cout << "Save File TSpline failure!" << std::endl; + + return ok; + } + + //=========================================================== + + void MeshObject::doOperate(MOperation* operate) + { + operate->operate(parent_); + } + + //=========================================================== + + void MeshObject::assignMesh() + { + if (mesh_ == nullptr) + mesh_ = new polymesh::PolyMesh(); + } + + //=========================================================== + + bool MeshObject::combineObject(const MeshObject* mesh_object) + { + if (mesh_ == nullptr) + return false; + if (mesh_object->mesh_ == nullptr) + return false; + + polymesh::MeshCopy::CombineMesh(mesh_, mesh_object->mesh_); + + return true; + } + + void MeshObject::duplicateFaces(MeshObject* mesh_object, std::vector& f_list) + { + std::sort(f_list.begin(), f_list.end(), std::greater()); + f_list.erase(std::unique(f_list.begin(), f_list.end()), f_list.end()); + + if (mesh_object->mesh_ == nullptr) + mesh_object->mesh_ = new polymesh::PolyMesh(); + + //polymesh::copyMeshFaces(mesh_, mesh_object->mesh_, f_list); + mesh_object->mesh_ = polymesh::MeshCopy::ExtractMeshFaces(mesh_, f_list); + } + + + void MeshObject::mirrorMeshObject(const MVector3& center, const MVector3& normal) + { + //if (mesh_ == nullptr) + // return nullptr; + + //AMCAX::SubD::PolyMesh* copy_mesh = AMCAX::SubD::MeshCopy::CopyMesh(mesh_); + + //AdapterObject* adapter_object = new AdapterObject; + //MeshObject* mesh_object_new = new MeshObject(adapter_object); + //mesh_object_new->mesh_ = AMCAX::SubD::MeshCopy::CopyMesh(mesh_); + ///mesh_object_new->mesh_ = polymesh::meshMioor(mesh_, center.point(), normal); + + AMCAX::Point3 ct(center.X(), center.Y(), center.Z()); + AMCAX::Frame3 ft(ct, AMCAX::Direction3(normal)); + AMCAX::SubD::MeshTransform trsfF; + AMCAX::Transformation3 trsfMove; + trsfMove.SetMirror(ft); + trsfF.SetTransformation(trsfMove); + trsfF.TranformMesh(mesh_); + + + //return mesh_object_new; + } + + //=========================================================== + void MeshObject::mesh_OPvert_Backup() + { + //AMCAX::SubD::Mes + scale_ = 1; + mesh_v_id_back_.resize(mesh_->numVertices()); + //mesh_v_position_back_.resize(mesh_->numVertices()); + for (int i = 0; i < mesh_->numVertices(); i++) + { + mesh_v_id_back_[i] = i; + //mesh_v_position_back_[i] = AMCAX::SubD::MeshTool::Position(mesh_, i);// mesh_->vert(i)->position(); + } + } + + void MeshObject::mesh_OPvert_BackupVertes(const std::vector& vert_id) + { + mesh_v_id_back_ = vert_id; + scale_ = 1; + //mesh_v_position_back_.resize(vert_id.size()); + //for (int i = 0; i < vert_id.size(); i++) + //{ + // mesh_v_position_back_[i] = AMCAX::SubD::MeshTool::Position(mesh_, i);//mesh_->vert(vert_id[i])->position(); + //} + } + + void MeshObject::mesh_OPvert_BackupEdges(const std::vector& edge_id) + { + scale_ = 1; + std::vector vert_id; vert_id.clear(); vert_id.reserve(edge_id.size() * 2); + for (size_t i = 0; i < edge_id.size(); i++) + { + //polymesh::MEdge* e = mesh_->edge(edge_id[i]); + //vert_id.push_back(e->getVert(0)->index()); + //vert_id.push_back(e->getVert(1)->index()); + int id0, id1; + AMCAX::SubD::MeshTool::EdgeVertexIndexs(mesh_, edge_id[i], id0, id1); + vert_id.push_back(id0); + vert_id.push_back(id1); + + } + + std::sort(vert_id.begin(), vert_id.end()); + vert_id.erase(std::unique(vert_id.begin(), vert_id.end()), vert_id.end()); + + mesh_v_id_back_ = vert_id; + //mesh_v_position_back_.resize(vert_id.size()); + //for (int i = 0; i < vert_id.size(); i++) + //{ + // mesh_v_position_back_[i] = AMCAX::SubD::MeshTool::Position(mesh_, i);//mesh_->vert(vert_id[i])->position(); + //} + } + + void MeshObject::mesh_OPvert_BackupFaces(const std::vector& face_id) + { + scale_ = 1; + std::vector vert_id; vert_id.clear(); vert_id.reserve(face_id.size() * 4); + for (size_t i = 0; i < face_id.size(); i++) + { + auto ids = AMCAX::SubD::MeshTool::FaceVertexIndexs(mesh_, face_id[i]); + + for (auto iter : ids) { + vert_id.push_back(iter); + } + + } + std::sort(vert_id.begin(), vert_id.end()); + vert_id.erase(std::unique(vert_id.begin(), vert_id.end()), vert_id.end()); + + mesh_v_id_back_ = vert_id; + //mesh_v_position_back_.resize(vert_id.size()); + //for (int i = 0; i < vert_id.size(); i++) + //{ + // mesh_v_position_back_[i] = AMCAX::SubD::MeshTool::Position(mesh_, i); + //} + } + + void MeshObject::mesh_Clear_OPvertBackup() + { + mesh_v_id_back_.clear(); + //mesh_v_position_back_.clear(); + scale_ = 1; + + AMCAX::SubD::MeshTool::UpdateNormal(mesh_); + } + + void MeshObject::meshScaleSingle(const MVector3& center, const MVector3& axis, double scale) + { + scale_ = scale / scale_; + + if (std::isnan(scale_)) { + scale_ = 1; + return; + } + + ///std::cout << "meshScaleSingle center:(" << center.X() << "," << center.Y() << "," << center.Z() << ") scale:" << scale << std::endl; + + AMCAX::Point3 point(center.X(), center.Y(), center.Z()); + AMCAX::Direction3 dir(axis.X(), axis.Y(), axis.Z()); + //AMCAX::Axis3 + AMCAX::Frame3 ct(point, dir); + //AMCAX::Frame3 ft(ct, AMCAX::Direction3(normal)); + AMCAX::SubD::MeshTransform trsfF; + //AMCAX::Transformation3 trfScale; + AMCAX::GeneralTransformation3 trfScale; + //trfRotation.SetRotation(AMCAX::Axis3(ct, AMCAX::Direction3(axis.X(), axis.Y(), axis.Z())), angle); + //trfScale.SetScale(ct, scale); + //trfScale.Set + // trsfF.SetGTransformation(trfScale); + + trfScale.SetAffinity(ct, scale_); + trsfF.SetGTransformation(trfScale); + trsfF.TransformMeshVertices(mesh_, mesh_v_id_back_); + + scale_ = scale; + } + + void MeshObject::meshScalePlane(const MVector3& center, const MVector3& normal, double scale) + { + ///std::cout << "meshScalePlane is error,scale:" << scale << std::endl; + scale_ = scale / scale_; + + if (std::isnan(scale_)) { + scale_ = 1; + return; + } + + AMCAX::Point3 point(center.X(), center.Y(), center.Z()); + AMCAX::Direction3 dir(normal.X(), normal.Y(), normal.Z()); + //AMCAX::Axis3 + AMCAX::Axis3 ct(point, dir); + //AMCAX::Frame3 ft(ct, AMCAX::Direction3(normal)); + AMCAX::SubD::MeshTransform trsfF; + //AMCAX::Transformation3 trfScale; + AMCAX::GeneralTransformation3 trfScale; + //trfRotation.SetRotation(AMCAX::Axis3(ct, AMCAX::Direction3(axis.X(), axis.Y(), axis.Z())), angle); + //trfScale.SetScale(ct, scale); + //trfScale.Set + // trsfF.SetGTransformation(trfScale); + + trfScale.SetAffinity(ct, scale_); + trsfF.SetGTransformation(trfScale); + trsfF.TransformMeshVertices(mesh_, mesh_v_id_back_); + + scale_ = scale; + } + + void MeshObject::meshRotation(const MVector3& center, const MVector3& axis, double angle) + { + //std::cout << "MeshObject::meshRotation angle:" << angle << std::endl; + AMCAX::Point3 ct(center.X(), center.Y(), center.Z()); + //AMCAX::Frame3 ft(ct, AMCAX::Direction3(normal)); + AMCAX::SubD::MeshTransform trsfF; + AMCAX::Transformation3 trfRotation; + trfRotation.SetRotation(AMCAX::Axis3(ct, AMCAX::Direction3(axis.X(), axis.Y(), axis.Z())), angle); + trsfF.SetTransformation(trfRotation); + + trsfF.TransformMeshVertices(mesh_, mesh_v_id_back_); + + /* + + AMCAX::SubD::MeshTransform trsfF; + AMCAX::Transformation3 trfMove; + trfMove.SetTranslation(dist * v); + trsfF.SetTransformation(trfRotation); + + trsfF.TransformMeshVertices(mesh, mesh_v_id_back_); + + + */ + + } + + void MeshObject::meshMoveUsingNormal(double dis) + { + std::cout << "MeshObject::meshMoveUsingNormal" << std::endl; + } + + void MeshObject::meshMove(const MVector3& v, double dis) + { + AMCAX::Vector3 vh(v.Normalized() * dis); + AMCAX::Transformation3 trshMove; + //AMCAX::Axis3 ax; + trshMove.SetTranslation(vh); + + AMCAX::SubD::MeshTransform trsf; + trsf.SetTransformation(trshMove); + + trsf.TransformMeshVertices(mesh_, mesh_v_id_back_); + + + + } + + // select vert edge face + void MeshObject::selectVertWithFaceId(const MVector3& begin, const MVector3& end, int f_id, int& sv_id) + { + sv_id = -1; + + auto ids = AMCAX::SubD::MeshTool::FaceVertexIndexs(mesh_, f_id); + AMCAX::Coord3 coord; + double len_min; + + for (int i = 0; i < ids.size(); i++) + { + AMCAX::Point3 position = AMCAX::SubD::MeshTool::Position(mesh_, ids[i]); + double len = MathUtils::distPointLineSquared(position.Coord(), begin.Coord(), end.Coord(), coord); + + if (len > 0.1) { + continue; + } + + + if (sv_id == -1 || len_min > len) + { + sv_id = ids[i]; + len_min = len; + } + } + + } + + void MeshObject::selectEdgeWithFaceId(const MVector3& begin, const MVector3& end, int f_id, int& se_id) + { + se_id = -1; + auto ids = AMCAX::SubD::MeshTool::FaceEdgeIndexs(mesh_, f_id); + AMCAX::Coord3 coord0, coord1; + double len_min; + + for (int i = 0; i < ids.size(); i++) { + int id0, id1; + AMCAX::SubD::MeshTool::EdgeVertexIndexs(mesh_, ids[i], id0, id1); + AMCAX::Point3 p0 = AMCAX::SubD::MeshTool::Position(mesh_, id0), + p1 = AMCAX::SubD::MeshTool::Position(mesh_, id1); + double len = MathUtils::distLine_SLineSquared(p0.Coord(), p1.Coord(), begin.Coord(), end.Coord(), coord0, coord1); + + if (len > 0.1) { + continue; + } + + if (se_id == -1 || len_min > len) + { + se_id = ids[i]; + len_min = len; + } + + } + + } + + //=========================================================== + + void MeshObject::backMesh(polymesh::PolyMesh*& bmesh) + { + if (mesh_ != nullptr) + { + if (bmesh == nullptr) + bmesh = new polymesh::PolyMesh(); + + bmesh = AMCAX::SubD::MeshCopy::CopyMesh(mesh_); + + //polymesh::CopyMesh(mesh_, bmesh); + } + else + { + bmesh = nullptr; + } + } + + void MeshObject::applyMesh(const polymesh::PolyMesh* amesh) + { + mesh_->clear(); + mesh_ = AMCAX::SubD::MeshCopy::CopyMesh(amesh); + } + + //=========================================================== + + void MeshObject::meshTriangulating() + { + //polymesh::meshTriangles(mesh_); + AMCAX::SubD::MeshTool::MeshTriangles(mesh_); + } + + void MeshObject::meshQuadrilateralizatuon() + { + //polymesh::meshQuadrilate(mesh_); + std::cout << "MeshObject::meshQuadrilateralizatuon error" << std::endl; + } + + void MeshObject::subdivemeshCC(int sub_time) + { + //polymesh::catmullclark_Subdive(mesh_, sub_time); + AMCAX::SubD::MeshSubdiveHE::CatmullClarkSubdive(mesh_, sub_time); + draw_tool_->updatedrawState(); + } + + void MeshObject::subdivemeshLoop(int sub_time) + { + + //if (mesh_->isTriangleMesh()) error + + AMCAX::SubD::MeshSubdiveHE::LoopSubdive(mesh_, sub_time); + draw_tool_->updatedrawState(); + //polymesh::loop_Subdive(mesh_, sub_time); + + } + + void MeshObject::updateDraw() + { + draw_tool_->updatedrawState(); + } + + //=========================================================== + + void MeshObject::weldEdge(std::vector& e_list) + { + //polymesh::meshWeldEdges(mesh_, e_list); + AMCAX::SubD::MeshWeld::MeshWeldEdges(mesh_, e_list); + } + + + + //=========================================================== + + QString MeshObject::getObjectinfo() { + QString output; + + output += "========================================================================\n"; + output += parent_->getObjectinfo(); + + output += "Object Contains Poly Mesh : "; + output += QString::number(mesh()->numVertices()) + " vertices, "; + output += QString::number(mesh()->numEdges()) += " edges "; + output += QString::number(mesh()->numPolygons()) += " faces.\n"; + + output += "========================================================================\n"; + return output; + } + + //=========================================================== +} diff --git a/Src/Object/MeshObject.h b/Src/Object/MeshObject.h new file mode 100644 index 0000000..6aedf0d --- /dev/null +++ b/Src/Object/MeshObject.h @@ -0,0 +1,172 @@ +#pragma once +#include "BaseObject.h" + +//#include +#include +#include +#include + +#include "AdapterObjectParent.h" +#include + +/// +#define polymesh AMCAX::SubD +typedef AMCAX::Point3 MPoint3; +typedef AMCAX::Vector3 MVector3; + + +namespace acamcad { + class AdapterObject; + class AdapterObjectParent; + + class MeshObject : public AdapterObjectParent + { + friend class ObjectDraw; + friend class MeshObjectDraw; + + public: + + MeshObject(AdapterObject* parent); + MeshObject(AdapterObject* parent, const MeshObject& object, bool isDraw); + + virtual ~MeshObject(); + + public: + void SetMesh(AMCAX::SubD::PolyMesh* mesh); + polymesh::PolyMesh* mesh(); + const polymesh::PolyMesh* mesh() const; + + private: + polymesh::PolyMesh* mesh_; + //polymesh::PolyMesh* mesh_subdive_; + + std::vector mesh_v_id_back_; + //std::vector mesh_v_position_back_; + //std::vector mesh_normal_back_; + float scale_ = 1; + + public: + /// Load a mesh from the given file + bool loadMesh(QString filename); + /// Save a mesh to the given file + bool saveMesh(QString filename); + bool saveTSpline(QString filename); + + public: + const virtual ObjectDraw* getDrawTool() const { return draw_tool_.get(); } + + private: + std::unique_ptr draw_tool_; + + public: + virtual void doOperate(MOperation* operate); + + public: + void assignMesh(); + + public: + void backMesh(polymesh::PolyMesh*& bmesh); + void applyMesh(const polymesh::PolyMesh* amesh); + + public: + bool combineObject(const MeshObject* mesh_object); + + void duplicateFaces(MeshObject* mesh_object, std::vector& f_list); + + void mirrorMeshObject(const MVector3& center, const MVector3& normal); + + public: + //存储要移动,缩放,旋转的单元的原来的顶点 -- 暂时只有缩放和旋转用了 + //TODO: 结构升级 + void mesh_OPvert_Backup(); + void mesh_OPvert_BackupVertes(const std::vector& vert_id); + void mesh_OPvert_BackupEdges(const std::vector& edge_id); + void mesh_OPvert_BackupFaces(const std::vector& face_id); + void mesh_Clear_OPvertBackup(); + + //在有了原来的顶点之后,所有的缩放都是一样的,没有体,边,面,点的区别了。 + void meshScaleSingle(const MVector3& center, const MVector3& axis, double scale); + void meshScalePlane(const MVector3& center, const MVector3& normal, double scale); + + void meshRotation(const MVector3& center, const MVector3& axis, double angle); + + void meshMoveUsingNormal(double dis); + void meshMove(const MVector3& v, double dis); + + + // select vert edge face + void selectVertWithFaceId(const MVector3& begin, const MVector3& end, int f_id, int& sv_id); + void selectEdgeWithFaceId(const MVector3& begin, const MVector3& end, int f_id, int& se_id); + //void selectFaceWithFaceId(const MVector3& begin, const MVector3& end, int f_id, int& sf_id); + + + + public: + void meshTriangulating(); + void meshQuadrilateralizatuon(); + + ///void reverseMeshNormal(); + + void subdivemeshCC(int sub_time = 3); + void subdivemeshLoop(int sub_time = 3); + + void updateDraw(); + + public: + void weldEdge(std::vector& e_list); + ///void shellFace(const std::vector& face_id_list, std::vector& face_id_new); + + + //next function have been replace; + /* + private: + void createPlane(const MPoint3& p0, const MPoint3& p1, size_t u_num, size_t v_num); + void createCube(const MPoint3& getCenter, double length); + void createCube(const MPoint3& First, const MPoint3& second); + void createUVSphere(MPoint3& getCenter, double radius, size_t rf_num, size_t vf_num); + void createSubdSphere(MPoint3& getCenter, double radius, size_t subtime); + void createCylinder(MPoint3& b_center, MVector3& axis, double radius, double height, + size_t rf_num, size_t vf_num, bool top, bool bottom); + void createCone(MPoint3& b_center, MVector3& axis, double radius, double height, + size_t rf_num, size_t vf_num, bool bottom); + void createPolyFace(const std::vector& point_list); + + //type 0:mesh center, 1:vert center, 2:edge center, 3:face center + void getLocalCenter(MVector3& c, int s_id = -1, int type = 0); + void getLocalNormal(MVector3& c, int s_id = -1, int type = 0); + void getLocalBBox(MVector3& bb_min, MVector3& bb_max, int s_id = -1, int type = 0); + void MeshPlaneVert(const std::vector& vert_id, MVector3& center, MVector3& normal); + void MeshPlaneEdge(const std::vector& edge_id, MVector3& center, MVector3& normal); + void MeshPlaneFace(const std::vector& face_id, MVector3& center, MVector3& normal); + + //返回给定选中元素与射线的最近点 + void closestPointWithEdge(const int& edge_id, const MVector3& begin, const MVector3& end, MVector3& clost); + + void deleteVerts(std::vector& v_list); + void deleteEdges(std::vector& e_list); + void deleteFaces(std::vector& f_list); + + void bridgeEdge(int e0_id, int e1_id); + void embedFaceVert(std::vector& v_list); + void embedFaceEdge(int e0_id, int e1_id); + void separateEdge(std::vector& e_list); + ///type == 0, Vertical, type == 1, Horizontal + void extrudeEdge(const std::vector& edge_id_list, MVector3& dire, std::vector& edge_id_new, int type = 1); + void extrudeFace(const std::vector& face_id_list, MVector3& dire, std::vector& face_id_new); + */ + + public: + /// Get all Info for the Object as a string + QString getObjectinfo(); + + //AdapterObject* getParent() { return parent_; }; + + + //private: + // AdapterObject* parent_; + + + }; + +} //acamcad + diff --git a/Src/Object/ObjectDefine.h b/Src/Object/ObjectDefine.h index b1f2b9c..076992f 100644 --- a/Src/Object/ObjectDefine.h +++ b/Src/Object/ObjectDefine.h @@ -1,21 +1,24 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #pragma once #include "AxisObject.h" #include "PlaneObject.h" #include "BRepObject.h" +#include "AdapterObject.h" +#include "MeshObject.h" +#include "TSplineObject.h" diff --git a/Src/Object/ObjectType.h b/Src/Object/ObjectType.h index 8c98302..3f23732 100644 --- a/Src/Object/ObjectType.h +++ b/Src/Object/ObjectType.h @@ -1,34 +1,37 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #pragma once #include namespace acamcad { + enum DataType + { + CUSTOM_TYPE = 0x00, + MESH_TYPE = 0x01, + BREP_TYPE = 0x02, + TSPLINEU_TYPE = 0x04, + ///AXIS_TYPE, + //ARROW_TYPE, + ///PLANE_TYPE, -enum class DataType -{ - UNKNOW_TYPE, - AXIS_TYPE, - ARROW_TYPE, - PLANE_TYPE, - ALL_TYPE, - BREP_TYPE -}; + ///ALL_TYPE, + + }; -typedef DataType OperationDataType; + typedef DataType OperationDataType; } //acamcad diff --git a/Src/Object/PlaneObject.cpp b/Src/Object/PlaneObject.cpp index e68368e..fa793fc 100644 --- a/Src/Object/PlaneObject.cpp +++ b/Src/Object/PlaneObject.cpp @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "PlaneObject.h" #include "../Utils/MathUtils.h" @@ -21,19 +21,19 @@ using namespace acamcad; PlaneObject::PlaneObject() :BaseObject(nullptr), center_(0.0, 0.0, 0.0), normal_(0.0, 0.0, 1.0) { - setDataType(DataType::PLANE_TYPE); + setDataType(DataType::CUSTOM_TYPE); } PlaneObject::PlaneObject(const AMCAX::Coord3& normal) : BaseObject(nullptr), center_(0.0, 0.0, 0.0), normal_(normal) { - setDataType(DataType::PLANE_TYPE); + setDataType(DataType::CUSTOM_TYPE); } PlaneObject::PlaneObject(const AMCAX::Coord3& center, const AMCAX::Coord3& normal) : BaseObject(nullptr), center_(center), normal_(normal) { - setDataType(DataType::PLANE_TYPE); + setDataType(DataType::CUSTOM_TYPE); } PlaneObject::PlaneObject(const PlaneObject& object) @@ -41,7 +41,7 @@ PlaneObject::PlaneObject(const PlaneObject& object) { center_ = object.center_; normal_ = object.normal_; - setDataType(DataType::PLANE_TYPE); + setDataType(DataType::CUSTOM_TYPE); } void PlaneObject::setCenter(const AMCAX::Coord3& c) diff --git a/Src/Object/TSplineObject.cpp b/Src/Object/TSplineObject.cpp new file mode 100644 index 0000000..129426e --- /dev/null +++ b/Src/Object/TSplineObject.cpp @@ -0,0 +1,418 @@ +#include "TSplineObject.h" + +#include +#include +#include +#include + +#include +#include + +#include "../ObjectDraw/TSplineObjectDraw.h" +#include "../Operation/MOperate.h" +#include "../Utils/MathUtils.h" + +namespace acamcad +{ + + TSplineObject::TSplineObject(AdapterObject* parent) :AdapterObjectParent(parent), + spline_(nullptr), scale_(1) + { + //setDataType(DataType::TSPLINEU_TYPE); + draw_tool_ = std::make_unique(parent); + } + + TSplineObject::TSplineObject(AdapterObject* parent, const TSplineObject& object, bool isDraw) : + AdapterObjectParent(parent), spline_(nullptr), scale_(1) + //BaseObject(object), spline_(nullptr) + { + if (object.spline_ != nullptr) + { + //AMCAX::TMS::TMSplineCopy copy; + spline_ = AMCAX::TMS::TMSplineCopy().CloneTMSpline(object.spline_); + //tcopy.copyTspline(object.spline_, spline_); + } + if (isDraw) { + //setDataType(DataType::TSPLINEU_TYPE); + draw_tool_ = std::make_unique(parent); + draw_tool_->updatedrawState(); + } + } + + TSplineObject::~TSplineObject() + { + if (spline_ != nullptr) + { + spline_->clear(); + delete spline_; + } + } + + AMCAX::TMS::TMSpline* TSplineObject::getTSpline() + { + return spline_; + } + + const AMCAX::TMS::TMSpline* TSplineObject::getTSpline() const + { + return spline_; + } + + void TSplineObject::setTSpline(AMCAX::TMS::TMSpline* tsp) + { + if (spline_ != nullptr) + { + delete spline_; + spline_ = nullptr; + + draw_tool_->clear(); + } + + spline_ = tsp; + } + + void TSplineObject::assignTSpline() + { + if (spline_ == nullptr) + spline_ = new AMCAX::TMS::TMSpline(); + } + + // select vert edge face + void TSplineObject::selectVertWithFaceId(const AMCAX::Vector3& begin, const AMCAX::Vector3& end, int f_id, int& sv_id) + { + sv_id = -1; + + //auto ids = AMCAX::SubD::MeshTool::FaceVertexIndexs(mesh_, f_id); + auto ids = AMCAX::TMS::TMSplineTool::FaceVertexIndexs(spline_, f_id); + AMCAX::Coord3 coord; + double len_min; + + for (int i = 0; i < ids.size(); i++) + { + + AMCAX::Point3 position = AMCAX::TMS::TMSplineTool::ControlPosition(spline_, ids[i]); + double len = MathUtils::distPointLineSquared(position.Coord(), begin.Coord(), end.Coord(), coord); + + if (len > 0.1) { + continue; + } + + + if (sv_id == -1 || len_min > len) + { + sv_id = ids[i]; + len_min = len; + } + } + + } + + void TSplineObject::selectEdgeWithFaceId(const AMCAX::Vector3& begin, const AMCAX::Vector3& end, int f_id, int& se_id) + { + se_id = -1; + auto ids = AMCAX::TMS::TMSplineTool::FaceEdgeIndexs(spline_, f_id); + AMCAX::Coord3 coord0, coord1; + double len_min = 0; + + for (int i = 0; i < ids.size(); i++) { + int id0, id1; + AMCAX::TMS::TMSplineTool::EdgeVertexIndexs(spline_, ids[i], id0, id1); + AMCAX::Point3 p0 = AMCAX::TMS::TMSplineTool::ControlPosition(spline_, id0), + p1 = AMCAX::TMS::TMSplineTool::ControlPosition(spline_, id1); + double len = MathUtils::distLine_SLineSquared(p0.Coord(), p1.Coord(), begin.Coord(), end.Coord(), coord0, coord1); + + if (len > 0.1) { + continue; + } + + if (se_id == -1 || len_min > len) + { + se_id = ids[i]; + len_min = len; + } + + } + + } + + //void TSplineObject::backSpline(AMCAX::TMS::TMSpline*& back_spline) + //{ + // if (spline_ != nullptr) + // { + // //if (back_spline == nullptr) + // // back_spline = new AMCAX::TMS::TMSpline(); + + // back_spline = AMCAX::TMS::TMSplineCopy().CloneTMSpline(spline_); + + // //tspline::TO_Duplicate tcopy; + // //tcopy.cloneTspline(spline_, back_spline); + // } + // else + // { + // back_spline = nullptr; + // } + //} + + //=========================================================================== + + bool TSplineObject::loadSpline(const QString& _filename) + { + parent_->setFromFileName(_filename); + + // call the local function to update names + //parent_->setName(parent_->name()); + + std::string filename = _filename.toStdString(); + + AMCAX::TMS::TMSplineIO io; + + bool ok = io.LoadTMSpline(filename, spline_); + if (ok) + { + updateDraw(); + parent_->show(); + } + else + { + std::cout << "Load File fall" << std::endl; + } + + return ok; + } + + bool TSplineObject::saveSpline(const QString& _filename) + { + std::string filename = _filename.toStdString(); + + AMCAX::TMS::TMSplineIO io; + + bool ok = io.WriteTMSpline(filename, spline_); + + if (!ok) + { + std::cout << "Save File fall" << std::endl; + } + return ok; + } + + bool TSplineObject::saveSplineSTL(const QString& filename) + { + //TSplineObjectDraw* dt = dynamic_cast(draw_tool_); + return draw_tool_->saveSTL(filename.toStdString()); + } + + bool TSplineObject::saveSplineOBJ(const QString& filename) + { + //TSplineObjectDraw* dt = dynamic_cast(draw_tool_); + return draw_tool_->saveOBJ(filename.toStdString()); + } + + //bool TSplineObject::saveSplineFrep(const QString& filename) + //{ + // TSplineObjectDraw* dt = dynamic_cast(draw_tool_); + // std::vector fixIndex; fixIndex.reserve(frepFixFaceIndex.size()); + // for (auto iter = frepFixFaceIndex.begin(); iter != frepFixFaceIndex.end(); ++iter) + // fixIndex.push_back(*iter); + // std::vector forceIndex; forceIndex.reserve(frepForceFaceIndex.size()); + // for (auto iter = frepForceFaceIndex.begin(); iter != frepForceFaceIndex.end(); ++iter) + // forceIndex.push_back(*iter); + + // return dt->saveFrepMesh(filename.toStdString(), fixIndex, forceIndex); + //} + + //=========================================================================== + + void TSplineObject::updateDraw() + { + draw_tool_->updatedrawState(); + + if (spline_) + AMCAX::TMS::TMSplineTool::UpdateNormal(spline_); + } + + //=========================================================================== + + void TSplineObject::mesh_OPvert_Backup() + { + scale_ = 1; + size_t vert_num = spline_->numVertices(); + mesh_v_id_back_.resize(vert_num); + //mesh_v_position_back_.resize(vert_num); + for (size_t i = 0; i < vert_num; i++) + { + mesh_v_id_back_[i] = i; + //mesh_v_position_back_[i] = spline_->getVertControl(i); + } + } + + void TSplineObject::mesh_OPvert_BackupVertes(const std::vector& vert_id) + { + scale_ = 1; + mesh_v_id_back_.resize(vert_id.size()); + for (size_t i = 0; i < vert_id.size(); i++) + { + mesh_v_id_back_[i] = vert_id[i]; + } + + std::sort(mesh_v_id_back_.begin(), mesh_v_id_back_.end()); + mesh_v_id_back_.erase(std::unique(mesh_v_id_back_.begin(), mesh_v_id_back_.end()), mesh_v_id_back_.end()); + } + + void TSplineObject::mesh_OPvert_BackupEdges(const std::vector& edge_id) + { + scale_ = 1; + mesh_v_id_back_.clear(); + //for() + for (int i = 0; i < edge_id.size(); i++) { + int v0, v1; + AMCAX::TMS::TMSplineTool::EdgeVertexIndexs(spline_, edge_id[i], v0, v1); + + mesh_v_id_back_.push_back(v0); + mesh_v_id_back_.push_back(v1); + } + + std::sort(mesh_v_id_back_.begin(), mesh_v_id_back_.end()); + mesh_v_id_back_.erase(std::unique(mesh_v_id_back_.begin(), mesh_v_id_back_.end()), mesh_v_id_back_.end()); + + } + + void TSplineObject::mesh_OPvert_BackupFaces(const std::vector& face_id) + { + scale_ = 1; + mesh_v_id_back_.clear(); + //mesh_v_position_back_.resize(vert_id.size()); + + + //std::sort(vert_id.begin(), vert_id.end()); + //vert_id.erase(std::unique(vert_id.begin(), vert_id.end()), vert_id.end()); + + for (int i = 0; i < face_id.size(); i++) { + std::vector vert_id = AMCAX::TMS::TMSplineTool::FaceVertexIndexs(spline_, face_id[i]); + + //mesh_v_id_back_.push_back( vert_id); + + for (auto iter : vert_id) { + + mesh_v_id_back_.push_back(iter); + } + } + + std::sort(mesh_v_id_back_.begin(), mesh_v_id_back_.end()); + mesh_v_id_back_.erase(std::unique(mesh_v_id_back_.begin(), mesh_v_id_back_.end()), mesh_v_id_back_.end()); + + } + + void TSplineObject::mesh_Clear_OPvertBackup() + { + + mesh_v_id_back_.clear(); + + scale_ = 1; + + + } + + void TSplineObject::meshScaleSingle(const AMCAX::Vector3& center, const AMCAX::Vector3& axis, double scale) + { + scale_ = scale / scale_; + + if (std::isnan(scale_)) { + scale_ = 1; + return; + } + + AMCAX::Point3 point(center.Coord()); + AMCAX::Direction3 dir(axis.Coord()); + AMCAX::Frame3 ct(point, dir); + + AMCAX::TMS::TMSplineTransform trf; + AMCAX::GeneralTransformation3 trfScale; + trfScale.SetAffinity(ct, scale_); + trf.SetGTransformation(trfScale); + + trf.TransformTMSplineVertices(spline_, mesh_v_id_back_); + scale_ = scale; + trf.TransformReprocessing(spline_); + } + + void TSplineObject::meshScalePlane(const AMCAX::Vector3& center, const AMCAX::Vector3& normal, double scale) + { + //M_Transform trsf_; + //trsf_.setScalePlane(center.point(), normal, scale); + //applyTransForm(trsf_); + + scale_ = scale / scale_; + + if (std::isnan(scale_)) { + scale_ = 1; + return; + } + + AMCAX::Point3 point(center.Coord()); + AMCAX::Direction3 dir(normal.Coord()); + AMCAX::Axis3 ct(point, dir); + + AMCAX::TMS::TMSplineTransform trf; + AMCAX::GeneralTransformation3 trfScale; + trfScale.SetAffinity(ct, scale_); + trf.SetGTransformation(trfScale); + + trf.TransformTMSplineVertices(spline_, mesh_v_id_back_); + scale_ = scale; + trf.TransformReprocessing(spline_); + } + + void TSplineObject::meshRotation(const AMCAX::Vector3& center, const AMCAX::Vector3& axis, double angle) + { + AMCAX::Point3 ct(center.X(), center.Y(), center.Z()); + + AMCAX::TMS::TMSplineTransform trsf; + AMCAX::Transformation3 trfRotation; + trfRotation.SetRotation(AMCAX::Axis3(ct, AMCAX::Direction3(axis.X(), axis.Y(), axis.Z())), angle); + + trsf.SetTransformation(trfRotation); + + trsf.TransformTMSplineVertices(spline_, mesh_v_id_back_); + trsf.TransformReprocessing(spline_); + } + + void TSplineObject::meshMove(const AMCAX::Vector3& v, double dis) + { + AMCAX::Vector3 vh(v.Normalized() * dis); + AMCAX::Transformation3 trMove; + trMove.SetTranslation(vh); + + AMCAX::TMS::TMSplineTransform trf; + trf.SetTransformation(trMove); + + trf.TransformTMSplineVertices(spline_, mesh_v_id_back_); + + trf.TransformReprocessing(spline_); + } + + const ObjectDraw* TSplineObject::getDrawTool() const + { + return draw_tool_.get(); + } + + void TSplineObject::mirror(const AMCAX::Coord3& center, const AMCAX::Coord3& normal) + { + AMCAX::Point3 ct(center); + AMCAX::Frame3 frame(ct, AMCAX::Direction3(normal)); + + AMCAX::TMS::TMSplineTransform trf; + AMCAX::Transformation3 trfMirror; + trfMirror.SetMirror(frame); + + trf.SetTransformation(trfMirror); + trf.TransformTMSpline(spline_); + + trf.TransformReprocessing(spline_); + } + + //=========================================================== + + + + +} diff --git a/Src/Object/TSplineObject.h b/Src/Object/TSplineObject.h new file mode 100644 index 0000000..69363ca --- /dev/null +++ b/Src/Object/TSplineObject.h @@ -0,0 +1,110 @@ +#pragma once +#include "BaseObject.h" + +#include + +#include +#include "AdapterObjectParent.h" +//#include +//#include +#include + +namespace acamcad +{ + + class TSplineObject : public AdapterObjectParent + { + friend class ObjectDraw; + friend class TSplineObjectDraw; + + + public: + //TSplineObject(); + //TSplineObject(const TSplineObject& object); + TSplineObject(AdapterObject* parent); + TSplineObject(AdapterObject* parent, const TSplineObject& object, bool isDraw); + + virtual ~TSplineObject(); + + public: + //virtual void doOperate(MOperation* operate) override; + virtual void updateDraw(); + + public: + AMCAX::TMS::TMSpline* getTSpline(); + const AMCAX::TMS::TMSpline* getTSpline() const; + + /// This function is Very danger, only using in creat operation, I am trying other ways to replace it + void setTSpline(AMCAX::TMS::TMSpline* tsp); + + void assignTSpline(); + + // select vert edge face + void selectVertWithFaceId(const AMCAX::Vector3& begin, const AMCAX::Vector3& end, int f_id, int& sv_id); + void selectEdgeWithFaceId(const AMCAX::Vector3& begin, const AMCAX::Vector3& end, int f_id, int& se_id); + + //public: + //void backSpline(AMCAX::TMS::TMSpline*& back_spline); + //void applySpline(const AMCAX::TMS::TMSpline* apply_spline); + + public: + /// Load a mesh from the given file + bool loadSpline(const QString& filename); + /// Save a mesh to the given file + bool saveSpline(const QString& filename); + + bool saveSplineSTL(const QString& filename); + bool saveSplineOBJ(const QString& filename); + + //bool saveSplineFrep(const QString& filename); + //std::set frepFixFaceIndex; + //std::set frepForceFaceIndex; + + private: + AMCAX::TMS::TMSpline* spline_; + + public: + //存储原来点的位置 + void mesh_OPvert_Backup(); + void mesh_OPvert_BackupVertes(const std::vector& vert_id); + void mesh_OPvert_BackupEdges(const std::vector& edge_id); + void mesh_OPvert_BackupFaces(const std::vector& face_id); + void mesh_Clear_OPvertBackup(); + + //在有了原来的顶点之后,所有的缩放都是一样的,没有体,边,面,点的区别了。 + void meshScaleSingle(const AMCAX::Vector3& center, const AMCAX::Vector3& axis, double scale); + void meshScalePlane(const AMCAX::Vector3& center, const AMCAX::Vector3& normal, double scale); + void meshRotation(const AMCAX::Vector3& center, const AMCAX::Vector3& axis, double angle); //rotation 没存储原来的位置 + ///void meshMoveUsingNormal(double dis); + void meshMove(const AMCAX::Vector3& v, double dis); + + void mirror(const AMCAX::Coord3& center, const AMCAX::Coord3& normal); + + private: + ///void applyTransForm(acamcad::M_Transform& trsf_); + + std::vector mesh_v_id_back_; + double scale_; + //std::vector mesh_v_position_back_; + + public: + //bool combineObject(const TSplineObject* object); + + //void duplicateFaces(TSplineObject* object, std::vector& f_list); + + //TSplineObject* mioorMeshObject(const MVector3& center, const MVector3& normal); + + public: + const virtual ObjectDraw* getDrawTool() const; + private: + std::unique_ptr draw_tool_; + + public: + /// Get all Info for the Object as a string + //QString getObjectinfo(); + + + + }; + +} //namespace acamcad \ No newline at end of file diff --git a/Src/ObjectDraw/AxisObjectDraw.cpp b/Src/ObjectDraw/AxisObjectDraw.cpp index 36c7ed4..bf7994a 100644 --- a/Src/ObjectDraw/AxisObjectDraw.cpp +++ b/Src/ObjectDraw/AxisObjectDraw.cpp @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "AxisObjectDraw.h" @@ -24,83 +24,83 @@ using namespace acamcad; AxisObjectDraw::AxisObjectDraw(BaseObject* object) { - axis_ = dynamic_cast(object); + axis_ = dynamic_cast(object); } AxisObjectDraw::~AxisObjectDraw() { - axis_ = nullptr; + axis_ = nullptr; } void AxisObjectDraw::draw(const DrawModel& dmodel, const SelectModel& smodel) const { - draw(dmodel, false); + draw(dmodel, false); } void AxisObjectDraw::draw(const DrawModel& dmodel, bool is_show_point) const { - if (!axis_->isVisible()) - return; - - GLboolean lighting, colorMaterial; - glGetBooleanv(GL_LIGHTING, &lighting); - glGetBooleanv(GL_COLOR_MATERIAL, &colorMaterial); - - glDisable(GL_COLOR_MATERIAL); - - float color[4]; - color[0] = 0.1f; color[1] = 0.1f; color[2] = 1.0f; color[3] = 1.0f; - glColor3f(0.1f, 0.1f, 1.0f); - glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color); - drawArrow(axis_->axis_z()); - - color[0] = 1.0f; color[1] = 0.1f; color[2] = 0.1f; color[3] = 1.0f; - glColor3f(1.0f, 0.1f, 0.1f); - glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color); - drawArrow(axis_->axis_x()); - - color[0] = 0.1f; color[1] = 1.0f; color[2] = 0.1f; color[3] = 1.0f; - glColor3f(0.1f, 1.0f, 0.1f); - glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color); - drawArrow(axis_->axis_y()); - - if (colorMaterial) - glEnable(GL_COLOR_MATERIAL); - if (!lighting) - glDisable(GL_LIGHTING); + if (!axis_->isVisible()) + return; + + GLboolean lighting, colorMaterial; + glGetBooleanv(GL_LIGHTING, &lighting); + glGetBooleanv(GL_COLOR_MATERIAL, &colorMaterial); + + glDisable(GL_COLOR_MATERIAL); + + float color[4]; + color[0] = 0.1f; color[1] = 0.1f; color[2] = 1.0f; color[3] = 1.0f; + glColor3f(0.1f, 0.1f, 1.0f); + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color); + drawArrow(axis_->axis_z()); + + color[0] = 1.0f; color[1] = 0.1f; color[2] = 0.1f; color[3] = 1.0f; + glColor3f(1.0f, 0.1f, 0.1f); + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color); + drawArrow(axis_->axis_x()); + + color[0] = 0.1f; color[1] = 1.0f; color[2] = 0.1f; color[3] = 1.0f; + glColor3f(0.1f, 1.0f, 0.1f); + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color); + drawArrow(axis_->axis_y()); + + if (colorMaterial) + glEnable(GL_COLOR_MATERIAL); + if (!lighting) + glDisable(GL_LIGHTING); } -void AxisObjectDraw::drawForSelect() const -{ - -} +//void AxisObjectDraw::drawForSelect() const +//{ +// +//} void AxisObjectDraw::drawArrow(const Arrow& arrow) const { - AMCAX::Coord3 from(arrow.from()); - AMCAX::Coord3 dir(arrow.direction()); - AMCAX::Coord3 dir_len = dir * arrow.length(); - - glPushMatrix(); - glTranslated(from[0], from[1], from[2]); - glMultMatrixd(Quaternion(AMCAX::Coord3(0.0, 0.0, 1.0), dir).matrix()); - drawArrow(arrow.length(), arrow.radius()); - glPopMatrix(); + AMCAX::Coord3 from(arrow.from()); + AMCAX::Coord3 dir(arrow.direction()); + AMCAX::Coord3 dir_len = dir * arrow.length(); + + glPushMatrix(); + glTranslated(from[0], from[1], from[2]); + glMultMatrixd(Quaternion(AMCAX::Coord3(0.0, 0.0, 1.0), dir).matrix()); + drawArrow(arrow.length(), arrow.radius()); + glPopMatrix(); } void AxisObjectDraw::drawArrow(qreal length, qreal radius) const { - static GLUquadric* quadric = gluNewQuadric(); + static GLUquadric* quadric = gluNewQuadric(); - radius = radius * 0.01; + radius = radius * 0.01; - int nbSubdivisions = 10; - const qreal head = 0.1; + int nbSubdivisions = 10; + const qreal head = 0.1; - gluCylinder(quadric, radius, radius, length * (1.0 - head * 0.75), 10, 1); - glTranslated(0.0, 0.0, length * (1.0 - head)); - gluCylinder(quadric, 3 * radius, 0.0, head * length, 10, 1); - glTranslated(0.0, 0.0, -length * (1.0 - head)); + gluCylinder(quadric, radius, radius, length * (1.0 - head * 0.75), 10, 1); + glTranslated(0.0, 0.0, length * (1.0 - head)); + gluCylinder(quadric, 3 * radius, 0.0, head * length, 10, 1); + glTranslated(0.0, 0.0, -length * (1.0 - head)); } diff --git a/Src/ObjectDraw/AxisObjectDraw.h b/Src/ObjectDraw/AxisObjectDraw.h index d657ae2..eab9773 100644 --- a/Src/ObjectDraw/AxisObjectDraw.h +++ b/Src/ObjectDraw/AxisObjectDraw.h @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #pragma once #include "ObjectDraw.h" @@ -19,32 +19,32 @@ namespace acamcad { -class Axis; + class Axis; -class AxisObjectDraw : public ObjectDraw -{ -public: - AxisObjectDraw(BaseObject* object); - virtual ~AxisObjectDraw(); + class AxisObjectDraw : public ObjectDraw + { + public: + AxisObjectDraw(BaseObject* object); + virtual ~AxisObjectDraw(); -public: - virtual void draw(const DrawModel& dmodel, const SelectModel& smodel) const override; + public: + virtual void draw(const DrawModel& dmodel, const SelectModel& smodel) const override; -public: - virtual void drawForSelect() const override; + public: + ///virtual void drawForSelect() const override; -public: - virtual void updatedrawState() {}; + public: + virtual void updatedrawState() {}; -private: - void draw(const DrawModel& dmodel, bool is_show_point) const; + private: + void draw(const DrawModel& dmodel, bool is_show_point) const; -private: - void drawArrow(const Arrow& arrow) const; - void drawArrow(qreal length, qreal radius) const; + private: + void drawArrow(const Arrow& arrow) const; + void drawArrow(qreal length, qreal radius) const; -private: - Axis* axis_; -}; + private: + Axis* axis_; + }; } \ No newline at end of file diff --git a/Src/ObjectDraw/BrepObjectDraw.cpp b/Src/ObjectDraw/BrepObjectDraw.cpp index fb2a056..0bfb7df 100644 --- a/Src/ObjectDraw/BrepObjectDraw.cpp +++ b/Src/ObjectDraw/BrepObjectDraw.cpp @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "BrepObjectDraw.h" @@ -20,21 +20,22 @@ #include #include #include -#include +#include #include #include #include #include +#include "../Object/AdapterObject.h" -acamcad::BRepObjectDraw::BRepObjectDraw(BaseObject* object) +acamcad::BRepObjectDraw::BRepObjectDraw(AdapterObject* object) :ObjectDraw(object) { - brep_object_ = dynamic_cast (object); + //brep_object_ = object; } acamcad::BRepObjectDraw::~BRepObjectDraw() { - brep_object_ = nullptr; + //brep_object_ = nullptr; } void acamcad::BRepObjectDraw::draw(const DrawModel& dmodel, const SelectModel& smodel) const @@ -43,7 +44,7 @@ void acamcad::BRepObjectDraw::draw(const DrawModel& dmodel, const SelectModel& s if (smodel == SelectModel::VERTEX_MODEL) is_show_point = true; - if (!brep_object_->isVisible()) + if (!parent_->isVisible()) return; draw(dmodel, is_show_point); @@ -51,478 +52,586 @@ void acamcad::BRepObjectDraw::draw(const DrawModel& dmodel, const SelectModel& s void acamcad::BRepObjectDraw::drawSelected(const SelectModel& s_model, int s_id) const { - if (s_model == SelectModel::VERTEX_MODEL) - { - glColor3f(0.85, 0.85, 0); - glPointSize(8); - - const AMCAX::IndexSet& vertexs = brep_object_->getShapeVertices(); - const AMCAX::TopoVertex& v = static_cast(vertexs[s_id]); - - if (!v.IsNull()) - { - AMCAX::Point3 vp = AMCAX::TopoTool::Point(v); - - glBegin(GL_POINTS); - glVertex3d(vp.X(), vp.Y(), vp.Z()); - glEnd(); - } - } - if (s_model == SelectModel::EDGE_MODEL) - { - glColor3f(0.85, 0.85, 0); - glLineWidth(6); - - if (s_id < 0 || s_id > edgeInfos_.size()) - { - std::cout << "error brep edge index " << std::endl; - return; - } - - std::shared_ptr mesh = edgeInfos_[s_id].triMesh; - std::shared_ptr poly = edgeInfos_[s_id].polyMesh; - AMCAX::Transformation3 tr = edgeInfos_[s_id].loc.Transformation(); - - for (int pid = 1; pid < poly->NVertices(); ++pid) - { - const AMCAX::Point3& p0 = mesh->Vertex(poly->Vertex(pid-1)).Transformed(tr); - const AMCAX::Point3& p1 = mesh->Vertex(poly->Vertex(pid)).Transformed(tr); - - glBegin(GL_LINES); - glVertex3d(p0.X(), p0.Y(), p0.Z()); - glVertex3d(p1.X(), p1.Y(), p1.Z()); - glEnd(); - } - } - if (s_model == SelectModel::FACE_MODEL) - { - if (s_id < 0 || s_id > edgeInfos_.size()) - { - std::cout << "error brep edge index " << std::endl; - return; - } - - glColor3f(0.85, 0.85, 0); - - std::shared_ptr mesh = faceInfos_[s_id].triMesh; - AMCAX::Transformation3 tr = faceInfos_[s_id].loc.Transformation(); - AMCAX::OrientationType fOri = faceInfos_[s_id].ori; - - for (int fid = 0; fid < mesh->NTriangles(); ++fid) - { - AMCAX::Triangle tri = mesh->Face(fid); - if (fOri == AMCAX::OrientationType::Reversed) - std::swap(tri[1], tri[2]); - - const AMCAX::Point3& p0 = mesh->Vertex(tri[0]).Transformed(tr); - const AMCAX::Point3& p1 = mesh->Vertex(tri[1]).Transformed(tr); - const AMCAX::Point3& p2 = mesh->Vertex(tri[2]).Transformed(tr); - - glBegin(GL_POLYGON); - glVertex3d(p0.X(), p0.Y(), p0.Z()); - glVertex3d(p1.X(), p1.Y(), p1.Z()); - glVertex3d(p2.X(), p2.Y(), p2.Z()); - glEnd(); - } - } + if (!parent_->bRep) + return; + + if (s_model == SelectModel::VERTEX_MODEL) + { + glColor3f(0.85, 0.85, 0); + glPointSize(8); + + const AMCAX::IndexSet& vertexs = parent_->bRep->getShapeVertices(); + const AMCAX::TopoVertex& v = static_cast(vertexs[s_id]); + + if (!v.IsNull()) + { + AMCAX::Point3 vp = AMCAX::TopoTool::Point(v); + + glBegin(GL_POINTS); + glVertex3d(vp.X(), vp.Y(), vp.Z()); + glEnd(); + } + } + if (s_model == SelectModel::EDGE_MODEL) + { + glColor3f(0.85, 0.85, 0); + glLineWidth(6); + + if (s_id < 0 || s_id > edgeInfos_.size()) + { + std::cout << "error brep edge index " << std::endl; + return; + } + + std::shared_ptr mesh = edgeInfos_[s_id].triMesh; + std::shared_ptr poly = edgeInfos_[s_id].polyMesh; + AMCAX::Transformation3 tr = edgeInfos_[s_id].loc.Transformation(); + + for (int pid = 1; pid < poly->NVertices(); ++pid) + { + const AMCAX::Point3& p0 = mesh->Vertex(poly->Vertex(pid - 1)).Transformed(tr); + const AMCAX::Point3& p1 = mesh->Vertex(poly->Vertex(pid)).Transformed(tr); + + glBegin(GL_LINES); + glVertex3d(p0.X(), p0.Y(), p0.Z()); + glVertex3d(p1.X(), p1.Y(), p1.Z()); + glEnd(); + } + } + if (s_model == SelectModel::FACE_MODEL) + { + if (s_id < 0 || s_id > edgeInfos_.size()) + { + std::cout << "error brep edge index " << std::endl; + return; + } + + glColor3f(0.85, 0.85, 0); + + std::shared_ptr mesh = faceInfos_[s_id].triMesh; + AMCAX::Transformation3 tr = faceInfos_[s_id].loc.Transformation(); + AMCAX::OrientationType fOri = faceInfos_[s_id].ori; + + for (int fid = 0; fid < mesh->NTriangles(); ++fid) + { + AMCAX::Triangle tri = mesh->Face(fid); + if (fOri == AMCAX::OrientationType::Reversed) + std::swap(tri[1], tri[2]); + + const AMCAX::Point3& p0 = mesh->Vertex(tri[0]).Transformed(tr); + const AMCAX::Point3& p1 = mesh->Vertex(tri[1]).Transformed(tr); + const AMCAX::Point3& p2 = mesh->Vertex(tri[2]).Transformed(tr); + + glBegin(GL_POLYGON); + glVertex3d(p0.X(), p0.Y(), p0.Z()); + glVertex3d(p1.X(), p1.Y(), p1.Z()); + glVertex3d(p2.X(), p2.Y(), p2.Z()); + glEnd(); + } + } + +} + +//void acamcad::BRepObjectDraw::drawForSelect() const +//{ +// const AMCAX::TopoShape& shape = parent_->bRep->shape_; +// if (parent_->bRep->getShape().IsNull()) +// return; +// if (parent_->bRep->getShapeVertices().size() == 0) +// return; +// +// glEnable(GL_POLYGON_OFFSET_FILL); +// glPolygonOffset(1.0f, 1.0f); +// glEnable(GL_LIGHTING); +// glShadeModel(GL_FLAT); +// draw_mesh_solidflat(false); +// draw_curve(); +// glDisable(GL_POLYGON_OFFSET_FILL); +// glDisable(GL_LIGHTING); +//} +// +//void acamcad::BRepObjectDraw::drawForSelectPart() const +//{ +// for (int i = 0; i < faceInfos_.size(); ++i) +// { +// std::shared_ptr mesh = faceInfos_[i].triMesh; +// AMCAX::Transformation3 tr = faceInfos_[i].loc.Transformation(); +// AMCAX::OrientationType fOri = faceInfos_[i].ori; +// +// glPushName(i); +// +// for (int fid = 0; fid < mesh->NTriangles(); ++fid) +// { +// AMCAX::Triangle tri = mesh->Face(fid); +// if (fOri == AMCAX::OrientationType::Reversed) +// std::swap(tri[1], tri[2]); +// +// const AMCAX::Point3& p0 = mesh->Vertex(tri[0]).Transformed(tr); +// const AMCAX::Point3& p1 = mesh->Vertex(tri[1]).Transformed(tr); +// const AMCAX::Point3& p2 = mesh->Vertex(tri[2]).Transformed(tr); +// +// glBegin(GL_POLYGON); +// glVertex3d(p0.X(), p0.Y(), p0.Z()); +// glVertex3d(p1.X(), p1.Y(), p1.Z()); +// glVertex3d(p2.X(), p2.Y(), p2.Z()); +// glEnd(); +// } +// +// glPopName(); +// } +//} + +void acamcad::BRepObjectDraw::drawWithObjectID() const +{ + const AMCAX::TopoShape& shape = parent_->bRep->shape_; + if (parent_->bRep->getShape().IsNull()) + return; + if (parent_->bRep->getShapeVertices().size() == 0) + return; + + glPushName(parent_->persistentId()); + + glEnable(GL_POLYGON_OFFSET_FILL); + glPolygonOffset(1.0f, 1.0f); + glEnable(GL_LIGHTING); + glShadeModel(GL_FLAT); + draw_mesh_solidflat(false); + draw_curve(); + glDisable(GL_POLYGON_OFFSET_FILL); + glDisable(GL_LIGHTING); + + glPopName(); +} +void acamcad::BRepObjectDraw::drawWithFaceID() const +{ + for (int i = 0; i < faceInfos_.size(); ++i) + { + std::shared_ptr mesh = faceInfos_[i].triMesh; + AMCAX::Transformation3 tr = faceInfos_[i].loc.Transformation(); + AMCAX::OrientationType fOri = faceInfos_[i].ori; + + glPushName(i); + + for (int fid = 0; fid < mesh->NTriangles(); ++fid) + { + AMCAX::Triangle tri = mesh->Face(fid); + if (fOri == AMCAX::OrientationType::Reversed) + std::swap(tri[1], tri[2]); + + const AMCAX::Point3& p0 = mesh->Vertex(tri[0]).Transformed(tr); + const AMCAX::Point3& p1 = mesh->Vertex(tri[1]).Transformed(tr); + const AMCAX::Point3& p2 = mesh->Vertex(tri[2]).Transformed(tr); + + glBegin(GL_POLYGON); + glVertex3d(p0.X(), p0.Y(), p0.Z()); + glVertex3d(p1.X(), p1.Y(), p1.Z()); + glVertex3d(p2.X(), p2.Y(), p2.Z()); + glEnd(); + } + + glPopName(); + } } -void acamcad::BRepObjectDraw::drawForSelect() const +void acamcad::BRepObjectDraw::drawWithEdgeID() const { - const AMCAX::TopoShape& shape = brep_object_->shape_; - if (brep_object_->getShape().IsNull()) - return; - if (brep_object_->getShapeVertices().size() == 0) - return; - - glEnable(GL_POLYGON_OFFSET_FILL); - glPolygonOffset(1.0f, 1.0f); - glEnable(GL_LIGHTING); - glShadeModel(GL_FLAT); - draw_mesh_solidflat(false); - draw_curve(); - glDisable(GL_POLYGON_OFFSET_FILL); - glDisable(GL_LIGHTING); + const AMCAX::IndexSet& edges = parent_->bRep->getShapeEdges(); + + for (int i = 0; i < edges.size(); ++i) + { + std::shared_ptr mesh = edgeInfos_[i].triMesh; + std::shared_ptr poly = edgeInfos_[i].polyMesh; + AMCAX::Transformation3 tr = edgeInfos_[i].loc.Transformation(); + if (mesh == nullptr || poly == nullptr) + { + glPushName(i); + draw_curve(); + glPopName(); + + continue; + } + glPushName(i); + for (int pid = 1; pid < poly->NVertices(); ++pid) + { + const AMCAX::Point3& p0 = mesh->Vertex(poly->Vertex(pid - 1)).Transformed(tr); + const AMCAX::Point3& p1 = mesh->Vertex(poly->Vertex(pid)).Transformed(tr); + + glBegin(GL_LINES); + glVertex3d(p0.X(), p0.Y(), p0.Z()); + glVertex3d(p1.X(), p1.Y(), p1.Z()); + glEnd(); + } + glPopName(); + } + } -void acamcad::BRepObjectDraw::drawForSelectPart() const +void acamcad::BRepObjectDraw::drawWithVertexID() const { - for (int i = 0; i < faceInfos_.size(); ++i) - { - std::shared_ptr mesh = faceInfos_[i].triMesh; - AMCAX::Transformation3 tr = faceInfos_[i].loc.Transformation(); - AMCAX::OrientationType fOri = faceInfos_[i].ori; - - glPushName(i); - - for (int fid = 0; fid < mesh->NTriangles(); ++fid) - { - AMCAX::Triangle tri = mesh->Face(fid); - if (fOri == AMCAX::OrientationType::Reversed) - std::swap(tri[1], tri[2]); - - const AMCAX::Point3& p0 = mesh->Vertex(tri[0]).Transformed(tr); - const AMCAX::Point3& p1 = mesh->Vertex(tri[1]).Transformed(tr); - const AMCAX::Point3& p2 = mesh->Vertex(tri[2]).Transformed(tr); - - glBegin(GL_POLYGON); - glVertex3d(p0.X(), p0.Y(), p0.Z()); - glVertex3d(p1.X(), p1.Y(), p1.Z()); - glVertex3d(p2.X(), p2.Y(), p2.Z()); - glEnd(); - } - - glPopName(); - } + const AMCAX::IndexSet& vertexs = parent_->bRep->getShapeVertices(); + for (int i = 0; i < vertexs.size(); ++i) + { + const AMCAX::TopoVertex& v = static_cast(vertexs[i]); + + AMCAX::Point3 vp = AMCAX::TopoTool::Point(v); + + glPushName(i); + + glBegin(GL_POINTS); + glVertex3d(vp.X(), vp.Y(), vp.Z()); + glEnd(); + + glPopName(); + } } void acamcad::BRepObjectDraw::updatedrawState() { - vert_position_.clear(); - vert_normal_.clear(); - face_vertices_.clear(); - edge_vertices_.clear(); - - AMCAX::BRepMeshIncrementalMesh IMesh(brep_object_->shape_, 0.005, true); - AMCAX::MakeShapeTool::EnsureNormalConsistency(brep_object_->getShape()); - - const AMCAX::IndexSet& faces = brep_object_->getShapeFaces(); - faceInfos_.resize(faces.size()); - for (int i = 0; i < faces.size(); ++i) - { - const AMCAX::TopoFace& f = static_cast(faces[i]); - AMCAX::TopoLocation loc; - faceInfos_[i].triMesh = AMCAX::TopoTool::Triangulation(f, loc); - faceInfos_[i].loc = loc; - faceInfos_[i].ori = f.Orientation(); - } - - const AMCAX::IndexSet& edges = brep_object_->getShapeEdges(); - edgeInfos_.resize(edges.size()); - for (int i = 0; i < edges.size(); ++i) - { - const AMCAX::TopoEdge& e = static_cast(edges[i]); - AMCAX::TopoLocation loc; - AMCAX::TopoTool::PolygonOnTriangulation(e, edgeInfos_[i].polyMesh, edgeInfos_[i].triMesh, loc); - edgeInfos_[i].loc = loc; - - //step curve - if (edgeInfos_[i].polyMesh == nullptr) - { - double ef, el; - std::shared_ptr curve = AMCAX::TopoTool::Curve(e, ef, el); - if (curve == nullptr) - continue; - int nPoints = 10; - if (curve->Type() == AMCAX::CurveType::Line) - { - nPoints = 2; - } - else if (curve->Type() == AMCAX::CurveType::BSplineCurve) - { - std::shared_ptr spline = std::dynamic_pointer_cast(curve); - nPoints = spline->NKnots() * spline->Degree() * 10; - } - - curvePointsInfo_.resize(nPoints); - for (int j = 0; j < nPoints; j++) - { - double t = (double)j / ((double)nPoints - 1); - AMCAX::Point3 point = curve->Value((1 - t) * ef + t * el); - curvePointsInfo_[j] = point; - } - } - } - - int vNum = 0; - int fNum = 0; - for (int i = 0; i < faceInfos_.size(); ++i) - { - if (faceInfos_[i].triMesh != nullptr) - { - vNum += faceInfos_[i].triMesh->NVertices(); - fNum += faceInfos_[i].triMesh->NTriangles(); - } - } - - vert_position_.resize(vNum * 3); - face_vertices_.resize(fNum); - vert_normal_.resize(vNum * 3); - int vOffset = 0; - int fOffset = 0; - for (int i = 0; i < faceInfos_.size(); ++i) - { - std::shared_ptr mesh = faceInfos_[i].triMesh; - AMCAX::Transformation3 tr = faceInfos_[i].loc.Transformation(); - AMCAX::OrientationType fOri = faceInfos_[i].ori; - - AMCAX::Matrix3 mat = tr.HVectorialPart(); - mat.Invert().Transpose(); - AMCAX::Transformation3 trn; - trn.SetValues(mat(0, 0), mat(0, 1), mat(0, 2), 0.0, - mat(1, 0), mat(1, 1), mat(1, 2), 0.0, - mat(2, 0), mat(2, 1), mat(2, 2), 0.0); - - if (mesh == nullptr) - { - continue; - } - - for (int vid = 0; vid < mesh->NVertices(); ++vid) - { - const AMCAX::Point3& p = mesh->Vertex(vid).Transformed(tr); - AMCAX::Direction3 &n = mesh->Normal(vid).Transformed(trn); - - if (fOri == AMCAX::OrientationType::Reversed) { n = n.Reversed(); } - - int id = vid + vOffset; - vert_position_[3 * id + 0] = p.X(); vert_position_[3 * id + 1] = p.Y(); vert_position_[3 * id + 2] = p.Z(); - vert_normal_[3 * id + 0] = n.X(); vert_normal_[3 * id + 1] = n.Y(); vert_normal_[3 * id + 2] = n.Z(); - } - for (int fid = 0; fid < mesh->NTriangles(); ++fid) - { - const AMCAX::Triangle& tri = mesh->Face(fid); - if (fOri == AMCAX::OrientationType::Reversed) - face_vertices_[fid + fOffset] = { tri[0] + vOffset, tri[2] + vOffset, tri[1] + vOffset }; - else - face_vertices_[fid + fOffset] = { tri[0] + vOffset, tri[1] + vOffset, tri[2] + vOffset }; - } - - vOffset += mesh->NVertices(); - fOffset += mesh->NTriangles(); - } - - for (int i = 0; i < edgeInfos_.size(); ++i) - { - std::shared_ptr mesh = edgeInfos_[i].triMesh; - std::shared_ptr poly = edgeInfos_[i].polyMesh; - AMCAX::Transformation3 tr = edgeInfos_[i].loc.Transformation(); - if (mesh == nullptr || poly == nullptr) - { - continue; - } - - for (int pid = 0; pid < poly->NVertices(); ++pid) - { - const AMCAX::Point3& p = mesh->Vertex(poly->Vertex(pid)).Transformed(tr); - const AMCAX::Direction3& n = mesh->Normal(poly->Vertex(pid)); - - vert_position_.push_back(p.X()); vert_position_.push_back(p.Y()); vert_position_.push_back(p.Z()); - vert_normal_.push_back(n.X()); vert_normal_.push_back(n.Y()); vert_normal_.push_back(n.Z()); - } - - for (int pid = 1; pid < poly->NVertices(); ++pid) - { - std::vector ev = { pid - 1 + vOffset, pid + vOffset }; - edge_vertices_.push_back(ev); - } - - vOffset += poly->NVertices(); - } + vert_position_.clear(); + vert_normal_.clear(); + face_vertices_.clear(); + edge_vertices_.clear(); + + AMCAX::BRepMeshIncrementalMesh IMesh(parent_->bRep->shape_, 0.005, true); + AMCAX::MakeShapeTool::EnsureNormalConsistency(parent_->bRep->getShape()); + + const AMCAX::IndexSet& faces = parent_->bRep->getShapeFaces(); + faceInfos_.resize(faces.size()); + for (int i = 0; i < faces.size(); ++i) + { + const AMCAX::TopoFace& f = static_cast(faces[i]); + AMCAX::TopoLocation loc; + faceInfos_[i].triMesh = AMCAX::TopoTool::Triangulation(f, loc); + faceInfos_[i].loc = loc; + faceInfos_[i].ori = f.Orientation(); + } + + const AMCAX::IndexSet& edges = parent_->bRep->getShapeEdges(); + edgeInfos_.resize(edges.size()); + for (int i = 0; i < edges.size(); ++i) + { + const AMCAX::TopoEdge& e = static_cast(edges[i]); + AMCAX::TopoLocation loc; + AMCAX::TopoTool::PolygonOnTriangulation(e, edgeInfos_[i].polyMesh, edgeInfos_[i].triMesh, loc); + edgeInfos_[i].loc = loc; + + //step curve + if (edgeInfos_[i].polyMesh == nullptr) + { + double ef, el; + std::shared_ptr curve = AMCAX::TopoTool::Curve(e, ef, el); + if (curve == nullptr) + continue; + int nPoints = 10; + if (curve->Type() == AMCAX::CurveType::Line) + { + nPoints = 2; + } + else if (curve->Type() == AMCAX::CurveType::BSplineCurve) + { + std::shared_ptr spline = std::dynamic_pointer_cast(curve); + nPoints = spline->NKnots() * spline->Degree() * 10; + } + + curvePointsInfo_.resize(nPoints); + for (int j = 0; j < nPoints; j++) + { + double t = (double)j / ((double)nPoints - 1); + AMCAX::Point3 point = curve->Value((1 - t) * ef + t * el); + curvePointsInfo_[j] = point; + } + } + } + + int vNum = 0; + int fNum = 0; + for (int i = 0; i < faceInfos_.size(); ++i) + { + if (faceInfos_[i].triMesh != nullptr) + { + vNum += faceInfos_[i].triMesh->NVertices(); + fNum += faceInfos_[i].triMesh->NTriangles(); + } + } + + vert_position_.resize(vNum * 3); + face_vertices_.resize(fNum); + vert_normal_.resize(vNum * 3); + int vOffset = 0; + int fOffset = 0; + for (int i = 0; i < faceInfos_.size(); ++i) + { + std::shared_ptr mesh = faceInfos_[i].triMesh; + AMCAX::Transformation3 tr = faceInfos_[i].loc.Transformation(); + AMCAX::OrientationType fOri = faceInfos_[i].ori; + + AMCAX::Matrix3 mat = tr.HVectorialPart(); + mat.Invert().Transpose(); + AMCAX::Transformation3 trn; + trn.SetValues(mat(0, 0), mat(0, 1), mat(0, 2), 0.0, + mat(1, 0), mat(1, 1), mat(1, 2), 0.0, + mat(2, 0), mat(2, 1), mat(2, 2), 0.0); + + if (mesh == nullptr) + { + continue; + } + + for (int vid = 0; vid < mesh->NVertices(); ++vid) + { + const AMCAX::Point3& p = mesh->Vertex(vid).Transformed(tr); + AMCAX::Direction3& n = mesh->Normal(vid).Transformed(trn); + + if (fOri == AMCAX::OrientationType::Reversed) { n = n.Reversed(); } + + int id = vid + vOffset; + vert_position_[3 * id + 0] = p.X(); vert_position_[3 * id + 1] = p.Y(); vert_position_[3 * id + 2] = p.Z(); + vert_normal_[3 * id + 0] = n.X(); vert_normal_[3 * id + 1] = n.Y(); vert_normal_[3 * id + 2] = n.Z(); + } + for (int fid = 0; fid < mesh->NTriangles(); ++fid) + { + const AMCAX::Triangle& tri = mesh->Face(fid); + if (fOri == AMCAX::OrientationType::Reversed) + face_vertices_[fid + fOffset] = { tri[0] + vOffset, tri[2] + vOffset, tri[1] + vOffset }; + else + face_vertices_[fid + fOffset] = { tri[0] + vOffset, tri[1] + vOffset, tri[2] + vOffset }; + } + + vOffset += mesh->NVertices(); + fOffset += mesh->NTriangles(); + } + + for (int i = 0; i < edgeInfos_.size(); ++i) + { + std::shared_ptr mesh = edgeInfos_[i].triMesh; + std::shared_ptr poly = edgeInfos_[i].polyMesh; + AMCAX::Transformation3 tr = edgeInfos_[i].loc.Transformation(); + if (mesh == nullptr || poly == nullptr) + { + continue; + } + + for (int pid = 0; pid < poly->NVertices(); ++pid) + { + const AMCAX::Point3& p = mesh->Vertex(poly->Vertex(pid)).Transformed(tr); + const AMCAX::Direction3& n = mesh->Normal(poly->Vertex(pid)); + + vert_position_.push_back(p.X()); vert_position_.push_back(p.Y()); vert_position_.push_back(p.Z()); + vert_normal_.push_back(n.X()); vert_normal_.push_back(n.Y()); vert_normal_.push_back(n.Z()); + } + + for (int pid = 1; pid < poly->NVertices(); ++pid) + { + std::vector ev = { pid - 1 + vOffset, pid + vOffset }; + edge_vertices_.push_back(ev); + } + + vOffset += poly->NVertices(); + } } void acamcad::BRepObjectDraw::draw(const DrawModel& dmodel, bool is_show_point) const { - const AMCAX::TopoShape& shape = brep_object_->shape_; - if (brep_object_->getShape().IsNull()) - return; - if (brep_object_->getShapeVertices().size() == 0) - return; - - bool is_selected = brep_object_->isSelect(); - - switch (dmodel) - { - case DrawModel::WIRE_MODE: - glDisable(GL_LIGHTING); - glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); - draw_mesh_wireframe(is_selected, is_show_point); - glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); - break; - case DrawModel::RENDERING_MODEL: - glEnable(GL_POLYGON_OFFSET_FILL); - glPolygonOffset(1.0f, 1.0f); - glEnable(GL_LIGHTING); - glShadeModel(GL_FLAT); - draw_mesh_solidflat(is_selected); - glDisable(GL_POLYGON_OFFSET_FILL); - glDisable(GL_LIGHTING); - - glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); - draw_mesh_wireframe(is_selected, is_show_point); - glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); - break; - case DrawModel::SHADING_MODEL: - glEnable(GL_LIGHTING); - draw_mesh_smooth(is_selected); - glDisable(GL_LIGHTING); - break; - case DrawModel::ZEBRA_MODE: - break; - case DrawModel::C_GRAPH_MODE: - break; - default: - break; - } + const AMCAX::TopoShape& shape = parent_->bRep->shape_; + if (parent_->bRep->getShape().IsNull()) + return; + if (parent_->bRep->getShapeVertices().size() == 0) + return; + + bool is_selected = parent_->isSelect(); + + switch (dmodel) + { + case DrawModel::WIRE_MODE: + glDisable(GL_LIGHTING); + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + draw_mesh_wireframe(is_selected, is_show_point); + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + break; + case DrawModel::RENDERING_MODEL: + glEnable(GL_POLYGON_OFFSET_FILL); + glPolygonOffset(1.0f, 1.0f); + glEnable(GL_LIGHTING); + glShadeModel(GL_FLAT); + draw_mesh_solidflat(is_selected); + glDisable(GL_POLYGON_OFFSET_FILL); + glDisable(GL_LIGHTING); + + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + draw_mesh_wireframe(is_selected, is_show_point); + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + break; + case DrawModel::SHADING_MODEL: + glEnable(GL_LIGHTING); + draw_mesh_smooth(is_selected); + glDisable(GL_LIGHTING); + break; + case DrawModel::ZEBRA_MODE: + break; + case DrawModel::C_GRAPH_MODE: + break; + default: + break; + } } void acamcad::BRepObjectDraw::draw_mesh_wireframe(bool is_selected, bool showPoint) const { - if (showPoint) - { - colorDefault(is_selected); - glPointSize(4); - - const AMCAX::IndexSet& vertexs = brep_object_->getShapeVertices(); - for (int i = 0; i < vertexs.size(); ++i) - { - const AMCAX::TopoVertex& v = static_cast(vertexs[i]); - - AMCAX::Point3 vp = AMCAX::TopoTool::Point(v); - - glBegin(GL_POINTS); - glVertex3d(vp.X(), vp.Y(), vp.Z()); - glEnd(); - } - } - - colorDefault(is_selected); - glLineWidth(1); - - const AMCAX::IndexSet& edges = brep_object_->getShapeEdges(); - - for (int i = 0; i < edges.size(); ++i) - { - std::shared_ptr mesh = edgeInfos_[i].triMesh; - std::shared_ptr poly = edgeInfos_[i].polyMesh; - AMCAX::Transformation3 tr = edgeInfos_[i].loc.Transformation(); - if (mesh == nullptr || poly == nullptr) - { - draw_curve(); - continue; - } - - for (int pid = 1; pid < poly->NVertices(); ++pid) - { - const AMCAX::Point3& p0 = mesh->Vertex(poly->Vertex(pid - 1)).Transformed(tr); - const AMCAX::Point3& p1 = mesh->Vertex(poly->Vertex(pid)).Transformed(tr); - - glBegin(GL_LINES); - glVertex3d(p0.X(), p0.Y(), p0.Z()); - glVertex3d(p1.X(), p1.Y(), p1.Z()); - glEnd(); - } - } + if (showPoint) + { + colorDefault(is_selected); + glPointSize(4); + + const AMCAX::IndexSet& vertexs = parent_->bRep->getShapeVertices(); + for (int i = 0; i < vertexs.size(); ++i) + { + const AMCAX::TopoVertex& v = static_cast(vertexs[i]); + + AMCAX::Point3 vp = AMCAX::TopoTool::Point(v); + + glBegin(GL_POINTS); + glVertex3d(vp.X(), vp.Y(), vp.Z()); + glEnd(); + } + } + + colorDefault(is_selected); + glLineWidth(1); + + const AMCAX::IndexSet& edges = parent_->bRep->getShapeEdges(); + + for (int i = 0; i < edges.size(); ++i) + { + std::shared_ptr mesh = edgeInfos_[i].triMesh; + std::shared_ptr poly = edgeInfos_[i].polyMesh; + AMCAX::Transformation3 tr = edgeInfos_[i].loc.Transformation(); + if (mesh == nullptr || poly == nullptr) + { + draw_curve(); + continue; + } + + for (int pid = 1; pid < poly->NVertices(); ++pid) + { + const AMCAX::Point3& p0 = mesh->Vertex(poly->Vertex(pid - 1)).Transformed(tr); + const AMCAX::Point3& p1 = mesh->Vertex(poly->Vertex(pid)).Transformed(tr); + + glBegin(GL_LINES); + glVertex3d(p0.X(), p0.Y(), p0.Z()); + glVertex3d(p1.X(), p1.Y(), p1.Z()); + glEnd(); + } + } } void acamcad::BRepObjectDraw::draw_mesh_solidflat(bool is_selected) const { - materialSolidFlatDefault(is_selected); - - for (int i = 0; i < faceInfos_.size(); ++i) - { - std::shared_ptr mesh = faceInfos_[i].triMesh; - AMCAX::Transformation3 tr = faceInfos_[i].loc.Transformation(); - AMCAX::OrientationType fOri = faceInfos_[i].ori; - if (mesh == nullptr ) - { - continue; - } - - for (int fid = 0; fid < mesh->NTriangles(); ++fid) - { - AMCAX::Triangle tri = mesh->Face(fid); - if (fOri == AMCAX::OrientationType::Reversed) - std::swap(tri[1], tri[2]); - - const AMCAX::Point3& p0 = mesh->Vertex(tri[0]).Transformed(tr); - const AMCAX::Point3& p1 = mesh->Vertex(tri[1]).Transformed(tr); - const AMCAX::Point3& p2 = mesh->Vertex(tri[2]).Transformed(tr); - - - AMCAX::Vector3 n(AMCAX::Vector3(p0, p1).Cross(AMCAX::Vector3(p0, p2))); - //if (n.Norm() < std::numeric_limits::epsilon()) - //{ - // std::cout << p0 << std::endl; - // std::cout << p1 << std::endl; - // std::cout << p2 << std::endl; - //} - - n.Normalize(); - - glBegin(GL_POLYGON); - - glNormal3d(n.X(), n.Y(), n.Z()); - - glVertex3d(p0.X(), p0.Y(), p0.Z()); - glVertex3d(p1.X(), p1.Y(), p1.Z()); - glVertex3d(p2.X(), p2.Y(), p2.Z()); - glEnd(); - } - } + materialSolidFlatDefault(is_selected); + + for (int i = 0; i < faceInfos_.size(); ++i) + { + std::shared_ptr mesh = faceInfos_[i].triMesh; + AMCAX::Transformation3 tr = faceInfos_[i].loc.Transformation(); + AMCAX::OrientationType fOri = faceInfos_[i].ori; + if (mesh == nullptr) + { + continue; + } + + for (int fid = 0; fid < mesh->NTriangles(); ++fid) + { + AMCAX::Triangle tri = mesh->Face(fid); + if (fOri == AMCAX::OrientationType::Reversed) + std::swap(tri[1], tri[2]); + + const AMCAX::Point3& p0 = mesh->Vertex(tri[0]).Transformed(tr); + const AMCAX::Point3& p1 = mesh->Vertex(tri[1]).Transformed(tr); + const AMCAX::Point3& p2 = mesh->Vertex(tri[2]).Transformed(tr); + + + AMCAX::Vector3 n(AMCAX::Vector3(p0, p1).Cross(AMCAX::Vector3(p0, p2))); + //if (n.Norm() < std::numeric_limits::epsilon()) + //{ + // std::cout << p0 << std::endl; + // std::cout << p1 << std::endl; + // std::cout << p2 << std::endl; + //} + + n.Normalize(); + + glBegin(GL_POLYGON); + + glNormal3d(n.X(), n.Y(), n.Z()); + + glVertex3d(p0.X(), p0.Y(), p0.Z()); + glVertex3d(p1.X(), p1.Y(), p1.Z()); + glVertex3d(p2.X(), p2.Y(), p2.Z()); + glEnd(); + } + } } void acamcad::BRepObjectDraw::draw_mesh_smooth(bool is_selected) const { - materialSmoothDefault(is_selected); - - if (vert_position_.empty()) - return; - - glShadeModel(GL_SMOOTH); - glLoadName(static_cast(vert_position_.size())); - glEnableClientState(GL_VERTEX_ARRAY); - glVertexPointer(3, GL_DOUBLE, 0, &vert_position_[0]); - glEnableClientState(GL_NORMAL_ARRAY); - glNormalPointer(GL_DOUBLE, 0, &vert_normal_[0]); - for (const auto& fh : face_vertices_) - { - glBegin(GL_POLYGON); - for (const auto& fvh : fh) - { - glArrayElement(fvh); - } - glEnd(); - } - - glDisableClientState(GL_NORMAL_ARRAY); - - GLfloat mat_a[] = { 0.2f, 0.2f, 0.2f, 1.0f }; - GLfloat mat_d[] = { 0.2f, 0.2f, 0.2f, 1.0f }; - GLfloat mat_s[] = { 0.0f, 0.0f, 0.0f, 1.0f }; - GLfloat shine[] = { 120.0f }; - - glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_a); - glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_d); - glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_s); - glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, shine); - - glLineWidth(2.0); - glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); - for (const auto& eh : edge_vertices_) - { - glBegin(GL_LINES); - glArrayElement(eh[0]); - glArrayElement(eh[1]); - glEnd(); - } - glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); - - glDisableClientState(GL_VERTEX_ARRAY); + materialSmoothDefault(is_selected); + + if (vert_position_.empty()) + return; + + glShadeModel(GL_SMOOTH); + glLoadName(static_cast(vert_position_.size())); + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(3, GL_DOUBLE, 0, &vert_position_[0]); + glEnableClientState(GL_NORMAL_ARRAY); + glNormalPointer(GL_DOUBLE, 0, &vert_normal_[0]); + for (const auto& fh : face_vertices_) + { + glBegin(GL_POLYGON); + for (const auto& fvh : fh) + { + glArrayElement(fvh); + } + glEnd(); + } + + glDisableClientState(GL_NORMAL_ARRAY); + + GLfloat mat_a[] = { 0.2f, 0.2f, 0.2f, 1.0f }; + GLfloat mat_d[] = { 0.2f, 0.2f, 0.2f, 1.0f }; + GLfloat mat_s[] = { 0.0f, 0.0f, 0.0f, 1.0f }; + GLfloat shine[] = { 120.0f }; + + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_a); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_d); + glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_s); + glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, shine); + + glLineWidth(2.0); + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + for (const auto& eh : edge_vertices_) + { + glBegin(GL_LINES); + glArrayElement(eh[0]); + glArrayElement(eh[1]); + glEnd(); + } + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + + glDisableClientState(GL_VERTEX_ARRAY); } void acamcad::BRepObjectDraw::draw_curve() const { - glLineWidth(1.2); - - glBegin(GL_LINE_STRIP); - for (int i = 0; i < curvePointsInfo_.size(); i++) - { - glVertex3f(curvePointsInfo_[i].X(), curvePointsInfo_[i].Y(), curvePointsInfo_[i].Z()); - } - glEnd(); + glLineWidth(1.2); + + glBegin(GL_LINE_STRIP); + for (int i = 0; i < curvePointsInfo_.size(); i++) + { + glVertex3f(curvePointsInfo_[i].X(), curvePointsInfo_[i].Y(), curvePointsInfo_[i].Z()); + } + glEnd(); } diff --git a/Src/ObjectDraw/BrepObjectDraw.h b/Src/ObjectDraw/BrepObjectDraw.h index b5f6a38..e1edf5b 100644 --- a/Src/ObjectDraw/BrepObjectDraw.h +++ b/Src/ObjectDraw/BrepObjectDraw.h @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #pragma once #include "ObjectDraw.h" @@ -23,59 +23,64 @@ namespace acamcad { - class BRepObjectDraw : public ObjectDraw - { - public: - BRepObjectDraw(BaseObject* object); - virtual ~BRepObjectDraw(); + class AdapterObject; + class BRepObjectDraw : public ObjectDraw + { + public: + BRepObjectDraw(AdapterObject* object); + virtual ~BRepObjectDraw(); - public: - virtual void draw(const DrawModel& dmodel, const SelectModel& smodel) const override; + public: + virtual void draw(const DrawModel& dmodel, const SelectModel& smodel) const override; - virtual void drawSelected(const SelectModel& smodel, int d_id) const override; + virtual void drawSelected(const SelectModel& smodel, int d_id) const override; - public: - virtual void drawForSelect() const override; - virtual void drawForSelectPart() const override; + public: + ///virtual void drawForSelect() const override; + //virtual void drawForSelectPart() const override; + virtual void drawWithObjectID() const override; + virtual void drawWithFaceID() const override; + virtual void drawWithEdgeID() const override; + virtual void drawWithVertexID() const override; - public: - virtual void updatedrawState(); + public: + virtual void updatedrawState(); - private: - void draw(const DrawModel& dmodel, bool is_show_point) const; + private: + void draw(const DrawModel& dmodel, bool is_show_point) const; - private: - void draw_mesh_wireframe(bool is_selected, bool showPoint) const; + private: + void draw_mesh_wireframe(bool is_selected, bool showPoint) const; - void draw_mesh_solidflat(bool is_selected) const; + void draw_mesh_solidflat(bool is_selected) const; - void draw_mesh_smooth(bool is_selected) const; + void draw_mesh_smooth(bool is_selected) const; - void draw_curve() const; + void draw_curve() const; - private: - BRepObject* brep_object_; + private: + //AdapterObject* brep_object_; - std::vector vert_position_; - std::vector vert_normal_; - std::vector> face_vertices_; - std::vector> edge_vertices_; + std::vector vert_position_; + std::vector vert_normal_; + std::vector> face_vertices_; + std::vector> edge_vertices_; - struct FaceInfo - { - AMCAX::OrientationType ori; - std::shared_ptr triMesh; - AMCAX::TopoLocation loc; - }; - struct EdgeInfo - { - std::shared_ptr triMesh; - std::shared_ptr polyMesh; - AMCAX::TopoLocation loc; - }; - std::vector faceInfos_; - std::vector edgeInfos_; - std::vector curvePointsInfo_; + struct FaceInfo + { + AMCAX::OrientationType ori; + std::shared_ptr triMesh; + AMCAX::TopoLocation loc; + }; + struct EdgeInfo + { + std::shared_ptr triMesh; + std::shared_ptr polyMesh; + AMCAX::TopoLocation loc; + }; + std::vector faceInfos_; + std::vector edgeInfos_; + std::vector curvePointsInfo_; - }; + }; } //namespace acamcad \ No newline at end of file diff --git a/Src/ObjectDraw/MeshObjectDraw.cpp b/Src/ObjectDraw/MeshObjectDraw.cpp new file mode 100644 index 0000000..a8a0889 --- /dev/null +++ b/Src/ObjectDraw/MeshObjectDraw.cpp @@ -0,0 +1,420 @@ +#include "MeshObjectDraw.h" +#include "../Object/AdapterObject.h" +#include +#include +#include + +using namespace acamcad; + +MeshObjectDraw::MeshObjectDraw(AdapterObject* object) :ObjectDraw(object) +{ +} + +MeshObjectDraw::~MeshObjectDraw() +{ + //mesh_object_ = nullptr; +} + +void MeshObjectDraw::draw(const DrawModel& dmodel, const SelectModel& smodel) const +{ + bool is_show_point = false; + if (smodel == SelectModel::VERTEX_MODEL) + is_show_point = true; + + draw(dmodel, is_show_point); +} + +void MeshObjectDraw::draw(const DrawModel& dmodel, bool is_show_point) const +{ + if (!parent_->isVisible()) + return; + + const polymesh::PolyMesh* mesh = parent_->mesh->mesh_; + + if (mesh == nullptr) { return; } + if (mesh->numVertices() == 0) { return; } + + bool is_selected = parent_->isSelect(); + + switch (dmodel) + { + case DrawModel::WIRE_MODE: + glDisable(GL_LIGHTING); + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + draw_mesh_wireframe(mesh, is_selected, is_show_point); + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + break; + case DrawModel::RENDERING_MODEL: + glEnable(GL_POLYGON_OFFSET_FILL); + glPolygonOffset(1.0f, 1.0f); + glEnable(GL_LIGHTING); + glShadeModel(GL_FLAT); + draw_mesh_solidflat(mesh, is_selected); + glDisable(GL_POLYGON_OFFSET_FILL); + glDisable(GL_LIGHTING); + + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + draw_mesh_wireframe(mesh, is_selected, is_show_point); + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + break; + case DrawModel::SHADING_MODEL: + glEnable(GL_LIGHTING); + draw_mesh_smooth(mesh, is_selected); + glDisable(GL_LIGHTING); + break; + default: + break; + } +} + +//void MeshObjectDraw::drawForSelect() const +//{ +// if (!parent_->isVisible()) +// return; +// +// const polymesh::PolyMesh* mesh = parent_->mesh->mesh_; +// +// if (mesh == nullptr) { return; } +// if (mesh->numVertices() == 0) { return; } +// +// glEnable(GL_POLYGON_OFFSET_FILL); +// glPolygonOffset(1.0f, 1.0f); +// glEnable(GL_LIGHTING); +// glShadeModel(GL_FLAT); +// draw_mesh_solidflat(mesh, false); +// glDisable(GL_POLYGON_OFFSET_FILL); +// glDisable(GL_LIGHTING); +//} +// +//void MeshObjectDraw::drawForSelectPart() const +//{ +// polymesh::PolyMesh* mesh = parent_->mesh->mesh(); +// +// //auto indexs = AMCAX::SubD::MeshTool::FaceVertexIndexs(mesh, i); +// for (int i = 0; i < mesh->numPolygons(); i++) { +// +// auto indexs = AMCAX::SubD::MeshTool::FaceVertexIndexs(mesh, i); +// +// glPushName(i); +// glBegin(GL_POLYGON); +// +// for (int j = 0; j < indexs.size(); j++) { +// auto point = AMCAX::SubD::MeshTool::Position(mesh, indexs[j]); +// //double d[3] = { point.X(),point.Y(),point.Z() }; +// glVertex3dv(point.Coord().Data()); +// } +// +// glEnd(); +// glPopName(); +// } +// +// +// +// //for (auto iter = mesh->const_polyfaces_begin(); iter != mesh->const_polyfaces_end(); iter++) { +// //glPushName(iter->index()); +// //} +//} + + +void MeshObjectDraw::drawSelected(const SelectModel& s_model, int s_id) const +{ + polymesh::PolyMesh* mesh = parent_->mesh->mesh_; + + if (s_model == SelectModel::VERTEX_MODEL) + { + glColor3f(0.85, 0.85, 0); + glPointSize(8); + + auto point = AMCAX::SubD::MeshTool::Position(mesh, s_id); + //double d[3]{ point.X(),point.Y(),point.Z() }; + + glBegin(GL_POINTS); + glVertex3dv(point.Coord().Data()); + glEnd(); + + } + + if (s_model == SelectModel::EDGE_MODEL) + { + int v0, v1; + AMCAX::SubD::MeshTool::EdgeVertexIndexs(mesh, s_id, v0, v1); + + auto point0 = AMCAX::SubD::MeshTool::Position(mesh, v0); + auto point1 = AMCAX::SubD::MeshTool::Position(mesh, v1); + + //double d0[3]{ point0.X(),point0.Y(),point0.Z() }, d1[3]{ point1.X(),point1.Y(),point1.Z() }; + + glColor3f(0.85, 0.85, 0); + glLineWidth(6); + + glBegin(GL_LINES); + glVertex3dv(point0.Coord().Data()); + glVertex3dv(point1.Coord().Data()); + glEnd(); + + } + if (s_model == SelectModel::FACE_MODEL) + { + auto indexs = AMCAX::SubD::MeshTool::FaceVertexIndexs(mesh, s_id); + + glColor3f(0.85, 0.85, 0); + glBegin(GL_POLYGON); + + for (int i = 0; i < indexs.size(); i++) { + auto point = AMCAX::SubD::MeshTool::Position(mesh, indexs[i]); + //double d[3] = { point.X(),point.Y(),point.Z() }; + glVertex3dv(point.Coord().Data()); + } + glEnd(); + } +} + +void MeshObjectDraw::drawWithObjectID() const +{ + if (!parent_->isVisible()) + return; + + const polymesh::PolyMesh* mesh = parent_->mesh->mesh_; + + if (mesh == nullptr) { return; } + if (mesh->numVertices() == 0) { return; } + + glPushName(parent_->persistentId()); + + glEnable(GL_POLYGON_OFFSET_FILL); + glPolygonOffset(1.0f, 1.0f); + glEnable(GL_LIGHTING); + glShadeModel(GL_FLAT); + draw_mesh_solidflat(mesh, false); + glDisable(GL_POLYGON_OFFSET_FILL); + glDisable(GL_LIGHTING); + + glPopName(); +} + +void MeshObjectDraw::drawWithFaceID() const +{ + polymesh::PolyMesh* mesh = parent_->mesh->mesh(); + + //auto indexs = AMCAX::SubD::MeshTool::FaceVertexIndexs(mesh, i); + for (int i = 0; i < mesh->numPolygons(); i++) { + + auto indexs = AMCAX::SubD::MeshTool::FaceVertexIndexs(mesh, i); + + glPushName(i); + glBegin(GL_POLYGON); + + for (int j = 0; j < indexs.size(); j++) { + auto point = AMCAX::SubD::MeshTool::Position(mesh, indexs[j]); + //double d[3] = { point.X(),point.Y(),point.Z() }; + glVertex3dv(point.Coord().Data()); + + } + + glEnd(); + glPopName(); + + } +} + +void MeshObjectDraw::drawWithEdgeID() const +{ + auto mesh = parent_->mesh->mesh(); + + for (int i = 0; i < mesh->numEdges(); i++) + { + int v0, v1; + AMCAX::SubD::MeshTool::EdgeVertexIndexs(mesh, i, v0, v1); + + auto point0 = AMCAX::SubD::MeshTool::Position(mesh, v0), + point1 = AMCAX::SubD::MeshTool::Position(mesh, v1); + + glPushName(i); + glBegin(GL_LINES); + glVertex3dv(point0.Coord().Data()); + glVertex3dv(point1.Coord().Data()); + glEnd(); + glPopName(); + } +} + +void MeshObjectDraw::drawWithVertexID() const +{ + auto mesh = parent_->mesh->mesh(); + + + for (int i = 0; i < mesh->numVertices(); i++) + { + auto& point = AMCAX::SubD::MeshTool::Position(mesh, i); + glPushName(i); + glBegin(GL_POINTS); + glVertex3dv(point.Coord().Data()); + glEnd(); + glPopName(); + } + +} + +void MeshObjectDraw::draw_mesh_wireframe(const polymesh::PolyMesh* cMesh, bool is_selected, bool showPoint) const +{ + + AMCAX::SubD::PolyMesh* mesh = const_cast(cMesh); + if (showPoint) + { + colorDefault(is_selected); + glPointSize(4); + + glBegin(GL_POINTS); + + for (int i = 0; i < mesh->numVertices(); i++) + { + auto& point = AMCAX::SubD::MeshTool::Position(mesh, i); + //double d[3] = { point.X(),point.Y(),point.Z() }; + glVertex3dv(point.Coord().Data()); + } + + glEnd(); + } + + colorDefault(is_selected); + glLineWidth(1); + + for (int i = 0; i < mesh->numPolygons(); i++) { + + auto indexs = AMCAX::SubD::MeshTool::FaceVertexIndexs(mesh, i); + + glBegin(GL_POLYGON); + for (int j = 0; j < indexs.size(); j++) { + auto& point = AMCAX::SubD::MeshTool::Position(mesh, indexs[j]); + //double d[3]{ point.X(), point.Y(), point.Z() }; + glVertex3dv(point.Coord().Data()); + } + glEnd(); + + } + +} + +void MeshObjectDraw::draw_mesh_solidflat(const polymesh::PolyMesh* mesh, bool is_selected) const +{ + materialSolidFlatDefault(is_selected); + + for (int i = 0; i < mesh->numPolygons(); i++) { + + auto indexs = AMCAX::SubD::MeshTool::FaceVertexIndexs((polymesh::PolyMesh*)mesh, i); + auto normal = AMCAX::SubD::MeshTool::FaceNormal((AMCAX::SubD::PolyMesh*)mesh, i).Normalized(); + + //double v[3]{ normal.X(),normal.Y(),normal.Z() }; + + glBegin(GL_POLYGON); + glNormal3dv(normal.Coord().Data()); + for (int j = 0; j < indexs.size(); j++) { + auto& point = AMCAX::SubD::MeshTool::Position((polymesh::PolyMesh*)mesh, indexs[j]); + //double d[3]{ point.X(), point.Y(), point.Z() }; + glVertex3dv(point.Coord().Data()); + } + glEnd(); + + } + +} + +void MeshObjectDraw::draw_mesh_smooth(const polymesh::PolyMesh* mesh, bool is_selected) const +{ + if (vert_position_.empty()) + return; + + materialSmoothDefault(is_selected); + + glShadeModel(GL_SMOOTH); + glLoadName(static_cast(mesh->numVertices())); + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(3, GL_DOUBLE, 0, &vert_position_[0]); + glEnableClientState(GL_NORMAL_ARRAY); + //glNormalPointer(GL_DOUBLE, 0, &vert_normal_[0]); + for (const auto& fh : face_vertices_) + { + glBegin(GL_POLYGON); + for (const auto& fvh : fh) + { + glArrayElement(fvh); + } + glEnd(); + } + + glDisableClientState(GL_NORMAL_ARRAY); + + GLfloat mat_a[] = { 0.2f, 0.2f, 0.2f, 1.0f }; + GLfloat mat_d[] = { 0.2f, 0.2f, 0.2f, 1.0f }; + GLfloat mat_s[] = { 0.0f, 0.0f, 0.0f, 1.0f }; + GLfloat shine[] = { 120.0f }; + + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_a); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_d); + glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_s); + glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, shine); + + glLineWidth(1.5); + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + for (const auto& eh : edge_vertices_) + { + glBegin(GL_LINES); + glArrayElement(eh[0]); + glArrayElement(eh[1]); + glEnd(); + } + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + + glDisableClientState(GL_VERTEX_ARRAY); +} + + +void MeshObjectDraw::updatedrawState() +{ + //return; + //polymesh::PolyMesh* mesh = parent_->mesh->mesh_; + //if (!mesh) + // return; + //const size_t v_number = mesh->numVertices(); + //vert_position_.resize(v_number * 3); + ////vert_normal_.resize(v_number * 3); + + //for (size_t i = 0; i < v_number; i++) + //{ + // auto& point = AMCAX::SubD::MeshTool::Position(mesh, i); + // //double d[3]; + // vert_position_[3 * i] = point.X(); + // vert_position_[3 * i + 1] = point.Y(); + // vert_position_[3 * i + 2] = point.Z(); + //} + + //face_vertices_.clear(); + //face_vertices_.reserve(mesh->numPolygons()); + //std::vector f_vertices; + + //for (int i = 0; i < mesh->numPolygons(); i++) { + // f_vertices.clear(); + // auto indexs = AMCAX::SubD::MeshTool::FaceVertexIndexs(mesh, i); + + // for (int j = 0; j < indexs.size(); j++) { + // f_vertices.push_back(indexs[j]); + // } + + // face_vertices_.push_back(f_vertices); + + + //} + + //edge_vertices_.clear(); + //edge_vertices_.reserve(mesh->numEdges() / 2); + + //for (int i = 0; i < mesh->numEdges(); i++) + //{ + // //if (eh->isVisibility()) + // int ev0, ev1; + // AMCAX::SubD::MeshTool::EdgeVertexIndexs(mesh, i, ev0, ev1); + + // edge_vertices_.push_back({ (size_t)ev0,(size_t)ev1 }); + //} + +} diff --git a/Src/ObjectDraw/MeshObjectDraw.h b/Src/ObjectDraw/MeshObjectDraw.h new file mode 100644 index 0000000..0047cbe --- /dev/null +++ b/Src/ObjectDraw/MeshObjectDraw.h @@ -0,0 +1,51 @@ +#pragma once +#include "ObjectDraw.h" +#include "../Object/MeshObject.h" + +namespace acamcad +{ + class AdapterObject; + + class MeshObjectDraw : public ObjectDraw + { + public: + MeshObjectDraw(AdapterObject* object); + virtual ~MeshObjectDraw(); + + public: + virtual void draw(const DrawModel& dmodel, const SelectModel& smodel) const override; + + virtual void drawSelected(const SelectModel& smodel, int d_id) const override; + + public: + //virtual void drawForSelect() const override; + //virtual void drawForSelectPart() const override; + + virtual void drawWithObjectID() const override; + virtual void drawWithFaceID() const override; + virtual void drawWithEdgeID() const override; + virtual void drawWithVertexID() const override; + + public: + virtual void updatedrawState(); + + private: + void draw(const DrawModel& dmodel, bool is_show_point) const; + + private: + void draw_mesh_wireframe(const polymesh::PolyMesh* mesh, bool is_selected, bool showPoint) const; + + void draw_mesh_solidflat(const polymesh::PolyMesh* mesh, bool is_selected) const; + + void draw_mesh_smooth(const polymesh::PolyMesh* mesh, bool is_selected) const; + + private: + //AdapterObject* parent_; + + std::vector vert_position_; + std::vector vert_normal_; + std::vector> face_vertices_; + std::vector> edge_vertices_; + }; + +} //namespace acamcad \ No newline at end of file diff --git a/Src/ObjectDraw/ObjectDraw.cpp b/Src/ObjectDraw/ObjectDraw.cpp index fb2ba63..e18d4b8 100644 --- a/Src/ObjectDraw/ObjectDraw.cpp +++ b/Src/ObjectDraw/ObjectDraw.cpp @@ -1,24 +1,29 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "ObjectDraw.h" +#include "../Object/AdapterObject.h" #include #include -acamcad::ObjectDraw::ObjectDraw(BaseObject* object) +acamcad::ObjectDraw::ObjectDraw() :AdapterObjectParent(NULL) +{ +} + +acamcad::ObjectDraw::ObjectDraw(AdapterObject* object) : AdapterObjectParent(object) { } @@ -28,66 +33,67 @@ acamcad::ObjectDraw::~ObjectDraw() void acamcad::ObjectDraw::colorDefault(bool is_selected) const { - if (is_selected) - glColor3f(0.85, 0.85, 0); - else - glColor3f(0.1, 0.1, 0.1); + if (is_selected) + glColor3f(0.85, 0.85, 0); + else + glColor3f(0.1, 0.1, 0.1); } void acamcad::ObjectDraw::materialSolidFlatDefault(bool is_selected) const { - glDisable(GL_COLOR_MATERIAL); //有光照的情况下不使用颜色进行绘制 + glDisable(GL_COLOR_MATERIAL); //有光照的情况下不使用颜色进行绘制 - if (is_selected) - { - GLfloat mat_a[] = { 0.2f, 0.2f, 0.2f, 1.0f }; - GLfloat mat_d[] = { 0.8f, 0.8f, 0.0f, 1.0f }; - GLfloat mat_s[] = { 0.0f, 0.0f, 0.0f, 1.0f }; - GLfloat shine[] = { 120.0f }; + if (is_selected) + { + GLfloat mat_a[] = { 0.2f, 0.2f, 0.2f, 1.0f }; + GLfloat mat_d[] = { 0.8f, 0.8f, 0.0f, 1.0f }; + GLfloat mat_s[] = { 0.0f, 0.0f, 0.0f, 1.0f }; + GLfloat shine[] = { 120.0f }; - glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_a); - glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_d); - glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_s); - glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, shine); - } - else - { - GLfloat mat_a[] = { 0.2f, 0.2f, 0.2f, 1.0f }; - GLfloat mat_d[] = { 0.66f, 0.66f, 0.66f, 1.0f }; - GLfloat mat_s[] = { 0.0f, 0.0f, 0.0f, 1.0f }; - GLfloat shine[] = { 120.0f }; + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_a); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_d); + glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_s); + glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, shine); + } + else + { + GLfloat mat_a[] = { 0.2f, 0.2f, 0.2f, 1.0f }; + GLfloat mat_d[] = { 0.66f, 0.66f, 0.66f, 1.0f }; + GLfloat mat_s[] = { 0.0f, 0.0f, 0.0f, 1.0f }; + GLfloat shine[] = { 120.0f }; - glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_a); - glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_d); - glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_s); - glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, shine); - } + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_a); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_d); + glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_s); + glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, shine); + } } void acamcad::ObjectDraw::materialSmoothDefault(bool is_selected) const { - if (is_selected) - { - GLfloat mat_a[] = { 0.2f, 0.2f, 0.2f, 1.0f }; - GLfloat mat_d[] = { 0.8f, 0.8f, 0.0f, 1.0f }; - GLfloat mat_s[] = { 0.0f, 0.0f, 0.0f, 1.0f }; - GLfloat shine[] = { 120.0f }; + if (is_selected) + { + GLfloat mat_a[] = { 0.2f, 0.2f, 0.2f, 1.0f }; + GLfloat mat_d[] = { 0.8f, 0.8f, 0.0f, 1.0f }; + GLfloat mat_s[] = { 0.0f, 0.0f, 0.0f, 1.0f }; + GLfloat shine[] = { 120.0f }; - glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_a); - glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_d); - glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_s); - glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, shine); - } - else - { - GLfloat mat_a[] = { 0.2f, 0.2f, 0.2f, 1.0f }; - GLfloat mat_d[] = { 0.66f, 0.66f, 0.66f, 1.0f }; - GLfloat mat_s[] = { 0.0f, 0.0f, 0.0f, 1.0f }; - GLfloat shine[] = { 120.0f }; + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_a); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_d); + glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_s); + glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, shine); + } + else + { + GLfloat mat_a[] = { 0.2f, 0.2f, 0.2f, 1.0f }; + GLfloat mat_d[] = { 0.66f, 0.66f, 0.66f, 1.0f }; + GLfloat mat_s[] = { 0.0f, 0.0f, 0.0f, 1.0f }; + GLfloat shine[] = { 120.0f }; - glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_a); - glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_d); - glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_s); - glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, shine); - } + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_a); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_d); + glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_s); + glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, shine); + } } + diff --git a/Src/ObjectDraw/ObjectDraw.h b/Src/ObjectDraw/ObjectDraw.h index e9e00a0..405def3 100644 --- a/Src/ObjectDraw/ObjectDraw.h +++ b/Src/ObjectDraw/ObjectDraw.h @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #pragma once #include @@ -20,57 +20,70 @@ #include "../Core/CoreDefine.h" #include #include +#include "../Object/AdapterObjectParent.h" namespace acamcad { -class BaseObject; + class BaseObject; + //class BaseObjectParent; -class ObjectDraw -{ -public: - ObjectDraw() {} - ObjectDraw(BaseObject* object); - virtual ~ObjectDraw(); + class AdapterObject; + class AdapterObjectParent; -public: - virtual void draw(const DrawModel& dmodel, const SelectModel& smodel) const = 0; + class ObjectDraw : public AdapterObjectParent + { + public: + ObjectDraw(); + ObjectDraw(AdapterObject* parent); + virtual ~ObjectDraw(); - virtual void drawSelected(const SelectModel& smodel, int d_id) const {}; + public: + virtual void draw(const DrawModel& dmodel, const SelectModel& smodel) const = 0; - virtual void clear() {}; + virtual void drawSelected(const SelectModel& smodel, int d_id) const {}; -public: - virtual void setCameraInfo(const AMCAX::Coord3& c_begin, const AMCAX::Coord3& c_dir) - { - camera_begin = c_begin; - camera_dir = c_dir; - } -protected: - AMCAX::Coord3 camera_begin; - AMCAX::Coord3 camera_dir; - -public: - virtual void drawForSelect() const = 0; - virtual void drawForSelectPart() const {}; - -public: - virtual void updatedrawState() = 0; - virtual void updatedrawStateFast(bool is_topology_change = true) {} - -public: - virtual void clearCurvature() {} - virtual void updatedrawZebra() {} - virtual void updatedrawCurvatureAnalysis(int type) {} - virtual void updatedrawCurvatureGraph(std::vector face_index) {} - -protected: - void colorDefault(bool is_select) const; - void materialSolidFlatDefault(bool is_select) const; - void materialSmoothDefault(bool is_select) const; - -private: - -}; + virtual void clear() {}; + + public: + virtual void setCameraInfo(const AMCAX::Coord3& c_begin, const AMCAX::Coord3& c_dir) + { + camera_begin = c_begin; + camera_dir = c_dir; + } + protected: + AMCAX::Coord3 camera_begin; + AMCAX::Coord3 camera_dir; + + public: + //virtual void drawForSelect() const = 0; + //virtual void drawForSelectPart() const {}; + + virtual void drawWithObjectID() const {}; + virtual void drawWithFaceID() const {}; + virtual void drawWithEdgeID() const {}; + virtual void drawWithVertexID() const {}; + + public: + virtual void updatedrawState() = 0; + virtual void updatedrawStateFast(bool is_topology_change = true) {} + + public: + virtual void clearCurvature() {} + virtual void updatedrawZebra() {} + virtual void updatedrawCurvatureAnalysis(int type) {} + virtual void updatedrawCurvatureGraph(std::vector face_index) {} + + //AdapterObject* getParent(); + + protected: + void colorDefault(bool is_select) const; + void materialSolidFlatDefault(bool is_select) const; + void materialSmoothDefault(bool is_select) const; + + //protected: + // AdapterObject* parent_; + + }; } //namespace acamcad \ No newline at end of file diff --git a/Src/ObjectDraw/TSplineObjectDraw.cpp b/Src/ObjectDraw/TSplineObjectDraw.cpp new file mode 100644 index 0000000..9c70b70 --- /dev/null +++ b/Src/ObjectDraw/TSplineObjectDraw.cpp @@ -0,0 +1,748 @@ +#include "TSplineObjectDraw.h" +#include "../Object/TSplineObject.h" +#include "../Object/AdapterObject.h" + +#include +#include +#include +#include +#include + +namespace acamcad +{ + TSplineObjectDraw::TSplineObjectDraw(AdapterObject* object) :ObjectDraw(object) + { + //tspline_object_ = dynamic_cast (object); + //tsp_mesh_ = nullptr; + } + + TSplineObjectDraw::~TSplineObjectDraw() + { + } + + void TSplineObjectDraw::clear() + { + tsp_mesh_.release(); + } + + + void TSplineObjectDraw::draw(const DrawModel& dmodel, const SelectModel& smodel) const + { + bool is_show_point = false; + if (smodel == SelectModel::VERTEX_MODEL) + is_show_point = true; + + if (!parent_->isVisible()) + { + return; + } + draw(dmodel, is_show_point); + } + + void TSplineObjectDraw::draw(const DrawModel& dmodel, bool is_show_point) const + { + bool is_selected = parent_->isSelect(); + auto mesh = parent_->tSpline->getTSpline(); + + if (mesh == nullptr) { return; } + if (mesh->numVertices() == 0) { return; } + + switch (dmodel) + { + case DrawModel::WIRE_MODE: + glDisable(GL_LIGHTING); + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + draw_mesh_wireframe(mesh, is_selected, is_show_point); + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + break; + case DrawModel::RENDERING_MODEL: + glEnable(GL_POLYGON_OFFSET_FILL); + glPolygonOffset(1.0f, 1.0f); + glEnable(GL_LIGHTING); + glShadeModel(GL_FLAT); + draw_mesh_solidflat(mesh, is_selected); + glDisable(GL_POLYGON_OFFSET_FILL); + glDisable(GL_LIGHTING); + + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + draw_mesh_wireframe(mesh, is_selected, is_show_point); + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + break; + case DrawModel::SHADING_MODEL: + glEnable(GL_LIGHTING); + draw_mesh_smooth(is_selected); + glDisable(GL_LIGHTING); + break; + case DrawModel::ZEBRA_MODE: + + glEnable(GL_LIGHTING); + draw_mesh_zebra(); + glDisable(GL_LIGHTING); + break; + + case DrawModel::C_GRAPH_MODE: + glEnable(GL_LIGHTING); + draw_mesh_smooth(is_selected); + glDisable(GL_LIGHTING); + + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + draw_mesh_curvature_comb(); + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + + break; + default: + break; + } + } + + void TSplineObjectDraw::drawSelected(const SelectModel& s_model, int s_id) const + { + auto mesh = parent_->tSpline->getTSpline(); + + if (s_model == SelectModel::VERTEX_MODEL) + { + glColor3f(0.85, 0.85, 0); + glPointSize(8); + + auto pos = AMCAX::TMS::TMSplineTool::ControlPosition(mesh, s_id); + //const tspline::TVert* v = mesh->vert(s_id); + + + glBegin(GL_POINTS); + glVertex3dv(pos.Coord().Data()); + glEnd(); + + } + if (s_model == SelectModel::EDGE_MODEL) + { + glColor3f(0.85, 0.85, 0); + glLineWidth(6); + + //const tspline::TEdge* e = mesh->edge(s_id); + int v0, v1; + AMCAX::TMS::TMSplineTool::EdgeVertexIndexs(mesh, s_id, v0, v1); + auto p0 = AMCAX::TMS::TMSplineTool::ControlPosition(mesh, v0), + p1 = AMCAX::TMS::TMSplineTool::ControlPosition(mesh, v1); + + glBegin(GL_LINES); + glVertex3dv(p0.Coord().Data()); + glVertex3dv(p1.Coord().Data()); + glEnd(); + + } + if (s_model == SelectModel::FACE_MODEL) + { + glColor3f(0.85, 0.85, 0); + + std::vector v_ids = AMCAX::TMS::TMSplineTool::FaceVertexIndexs(mesh, s_id); + + //const tspline::TFace* cf = mesh->polyface(s_id); + //if (cf != nullptr) + { + //tspline::TFace* f = const_cast(cf); + glBegin(GL_POLYGON); + for (auto& iter : v_ids) + { + auto p0 = AMCAX::TMS::TMSplineTool::ControlPosition(mesh, iter); + glVertex3dv(p0.Coord().Data()); + } + glEnd(); + } + } + } + + //void TSplineObjectDraw::drawForSelect() const + //{ + // if (!parent_->isVisible()) + // return; + + // auto mesh = parent_->tSpline->getTSpline(); + + // if (mesh == nullptr) { return; } + // if (mesh->numVertices() == 0) { return; } + + // glEnable(GL_POLYGON_OFFSET_FILL); + // glPolygonOffset(1.0f, 1.0f); + // glEnable(GL_LIGHTING); + // glShadeModel(GL_FLAT); + // draw_mesh_solidflat(mesh, false); + // glDisable(GL_POLYGON_OFFSET_FILL); + // glDisable(GL_LIGHTING); + //} + + //void TSplineObjectDraw::drawForSelectPart() const + //{ + // //const tspline::TSpline* mesh = tspline_object_->getTSpline(); + + // //for (tspline::TSpline::CFaceIter f_it = mesh->const_faces_begin(); f_it != mesh->const_faces_end(); ++f_it) + // //{ + // // tspline::TFace* f = *f_it; + // // glPushName(f->index()); + + // // glBegin(GL_POLYGON); + // // + // // for (tspline::TVert* v : mesh->polygonVertices(f)) + // // { + // // glVertex3dv(v->controlPosition()); + // // } + // // glEnd(); + + // // glPopName(); + // //} + // auto mesh = parent_->tSpline->getTSpline(); + + // int size = mesh->numFaces(); + // for (int i = 0; i < size; i++) { + // auto ids = AMCAX::TMS::TMSplineTool::FaceVertexIndexs(mesh, i); + // glPushName(i); + // glBegin(GL_POLYGON); + // for (auto& iter : ids) + // { + // auto pos = AMCAX::TMS::TMSplineTool::ControlPosition(mesh, iter); + // glVertex3dv(pos.Coord().Data()); + // } + + // glEnd(); + // glPopName(); + // } + //} + + void TSplineObjectDraw::drawWithObjectID() const + { + if (!parent_->isVisible()) + return; + + auto mesh = parent_->tSpline->getTSpline(); + + if (mesh == nullptr) { return; } + if (mesh->numVertices() == 0) { return; } + + glPushName(parent_->persistentId()); + + glEnable(GL_POLYGON_OFFSET_FILL); + glPolygonOffset(1.0f, 1.0f); + glEnable(GL_LIGHTING); + glShadeModel(GL_FLAT); + draw_mesh_solidflat(mesh, false); + glDisable(GL_POLYGON_OFFSET_FILL); + glDisable(GL_LIGHTING); + + glPopName(); + } + void TSplineObjectDraw::drawWithFaceID() const + { + auto mesh = parent_->tSpline->getTSpline(); + + int size = mesh->numFaces(); + for (int i = 0; i < size; i++) { + auto ids = AMCAX::TMS::TMSplineTool::FaceVertexIndexs(mesh, i); + glPushName(i); + glBegin(GL_POLYGON); + for (auto& iter : ids) + { + auto pos = AMCAX::TMS::TMSplineTool::ControlPosition(mesh, iter); + glVertex3dv(pos.Coord().Data()); + } + + glEnd(); + glPopName(); + } + + } + + void TSplineObjectDraw::drawWithEdgeID() const + { + auto mesh = parent_->tSpline->getTSpline(); + + for (int i = 0; i < mesh->numEdges(); i++) + { + int v0, v1; + AMCAX::TMS::TMSplineTool::EdgeVertexIndexs(mesh, i, v0, v1); + + auto p0 = AMCAX::TMS::TMSplineTool::ControlPosition(mesh, v0), + p1 = AMCAX::TMS::TMSplineTool::ControlPosition(mesh, v1); + + glPushName(i); + glBegin(GL_LINES); + glVertex3dv(p0.Coord().Data()); + glVertex3dv(p1.Coord().Data()); + glEnd(); + glPopName(); + } + + } + + void TSplineObjectDraw::drawWithVertexID() const + { + auto mesh = parent_->tSpline->getTSpline(); + + for (int i = 0; i < mesh->numVertices(); i++) + { + auto pos = AMCAX::TMS::TMSplineTool::ControlPosition(mesh, i); + + glPushName(i); + glBegin(GL_POINTS); + glVertex3dv(pos.Coord().Data()); + glEnd(); + glPopName(); + } + } + + void TSplineObjectDraw::draw_mesh_wireframe(AMCAX::TMS::TMSpline* mesh, bool is_selected, bool showPoint) const + { + if (showPoint) + { + colorDefault(is_selected); + glPointSize(4); + + glBegin(GL_POINTS); + //tspline::TSpline::CVertexIter cv_end = mesh->const_vertices_end(); + //for (tspline::TSpline::CVertexIter cv_it = mesh->const_vertices_begin(); cv_it != cv_end; ++cv_it) + //{ + // glVertex3dv((*cv_it)->controlPosition()); + //} + int size = mesh->numVertices(); + for (int i = 0; i < size; i++) + { + auto pos = AMCAX::TMS::TMSplineTool::ControlPosition(mesh, i); + glVertex3dv(pos.Coord().Data()); + } + + glEnd(); + } + + colorDefault(is_selected); + glLineWidth(1); + + //tspline::TSpline::CFaceIter cf_end = mesh->const_faces_end(); + //for (tspline::TSpline::CFaceIter cf_it = mesh->const_faces_begin(); cf_it != cf_end; ++cf_it) + //{ + // glBegin(GL_POLYGON); + // for (tspline::TVert* v : mesh->polygonVertices(*cf_it)) + // { + // glVertex3dv(v->controlPosition()); + // } + // glEnd(); + //} + int size = mesh->numFaces(); + for (int i = 0; i < size; i++) { + auto ids = AMCAX::TMS::TMSplineTool::FaceVertexIndexs(mesh, i); + + glBegin(GL_POLYGON); + for (auto& iter : ids) + { + auto pos = AMCAX::TMS::TMSplineTool::ControlPosition(mesh, iter); + glVertex3dv(pos.Coord().Data()); + } + + glEnd(); + } + } + + void TSplineObjectDraw::draw_mesh_solidflat(AMCAX::TMS::TMSpline* tsp, bool is_selected) const + { + glLineWidth(1); + materialSolidFlatDefault(is_selected); + //tspline::TSpline::CFaceIter cf_end = tsp->const_faces_end(); + //for (tspline::TSpline::CFaceIter cf_it = tsp->const_faces_begin(); cf_it != cf_end; ++cf_it) + //{ + // glBegin(GL_POLYGON); + // glNormal3dv((*cf_it)->normal()); + + // for (tspline::TVert* v : tsp->polygonVertices(*cf_it)) + // { + // glVertex3dv(v->controlPosition()); + // } + // glEnd(); + //} + {//draw polygon + int size = tsp->numFaces(); + for (int i = 0; i < size; i++) { + auto ids = AMCAX::TMS::TMSplineTool::FaceVertexIndexs(tsp, i); + auto nor = AMCAX::TMS::TMSplineTool::ControlFaceNormal(tsp, i); + + glBegin(GL_POLYGON); + glNormal3dv(nor.Coord().Data()); + for (auto& iter : ids) + { + auto pos = AMCAX::TMS::TMSplineTool::ControlPosition(tsp, iter); + glVertex3dv(pos.Coord().Data()); + } + + glEnd(); + } + } + glEnable(GL_COLOR_MATERIAL); + glColor3f(0.1, 0.1, 0.1); + glLineWidth(3); + + {//draw line + int size = tsp->numEdges(); + + for (int i = 0; i < size; i++) { + //std::cout << "====" << i << "====" << r0 << "," << r1 << std::endl; + if (AMCAX::TMS::TMSplineCheck::IsEdgeBoundary(tsp, i) || + AMCAX::TMS::TMSplineCheck::IsEdgeCrease(tsp, i)) { + int v0, v1; + AMCAX::TMS::TMSplineTool::EdgeVertexIndexs(tsp, i, v0, v1); + + auto p0 = AMCAX::TMS::TMSplineTool::ControlPosition(tsp, v0), + p1 = AMCAX::TMS::TMSplineTool::ControlPosition(tsp, v1); + glBegin(GL_LINES); + glVertex3dv(p0.Coord().Data()); + glVertex3dv(p1.Coord().Data()); + glEnd(); + } + + } + + } + + glDisable(GL_COLOR_MATERIAL); + } + + void TSplineObjectDraw::draw_mesh_smooth(bool is_selected) const + { + materialSmoothDefault(is_selected); + + if (vert_position_.empty()) + return; + + glShadeModel(GL_SMOOTH); + glLoadName(static_cast(vert_position_.size())); + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(3, GL_DOUBLE, 0, &vert_position_[0]); + glEnableClientState(GL_NORMAL_ARRAY); + glNormalPointer(GL_DOUBLE, 0, &vert_normal_[0]); + for (const auto& fh : face_vertices_) + { + glBegin(GL_POLYGON); + for (const auto& fvh : fh) + { + glArrayElement(fvh); + } + glEnd(); + } + + glDisableClientState(GL_NORMAL_ARRAY); + //return; + + GLfloat mat_a[] = { 0.2f, 0.2f, 0.2f, 1.0f }; + GLfloat mat_d[] = { 0.2f, 0.2f, 0.2f, 1.0f }; + GLfloat mat_s[] = { 0.0f, 0.0f, 0.0f, 1.0f }; + GLfloat shine[] = { 120.0f }; + + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_a); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_d); + glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_s); + glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, shine); + + glLineWidth(2.0); + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + for (const auto& eh : edge_vertices_) + { + glBegin(GL_LINES); + glArrayElement(eh[0]); + glArrayElement(eh[1]); + glEnd(); + } + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + + glDisableClientState(GL_VERTEX_ARRAY); + } + + void TSplineObjectDraw::draw_mesh_zebra() const + { + static GLubyte T0[64][64]; + static GLuint Tname0 = 1; + for (int i = 0; i < 64; i++) + { + for (int j = 0; j < 64; j++) + { + int c = 0; + if (i < 16 || i >= 48) + c = 255; + + T0[i][j] = (GLubyte)c; + } + } + auto mesh = tsp_mesh_->GetCurvatureMesh(); + if (mesh == nullptr) + return; + //MVector3 L(1, 1, 0); L.normalize(); + + materialSmoothDefault(false); + + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + + glGenTextures(1, &Tname0); + glBindTexture(GL_TEXTURE_2D, Tname0); + glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 64, 64, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, T0); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, Tname0); + + int i = 0; + for (const auto& fh : mesh->face_list_) + { + glBegin(GL_POLYGON); + glNormal3dv(mesh->face_list_[i].normal_.Coord().Data()); + for (const auto& fvh : fh.vert_) + { + const AMCAX::Vector3& n = mesh->vert_lsit_[fvh].normal_; + const AMCAX::Point3& p = mesh->vert_lsit_[fvh].position_; + + double alpha = (n.Coord().Dot(camera_dir) + 1) / 2; + alpha = alpha * 16; //16 different + + glTexCoord2d(alpha, alpha); + glVertex3dv(p.Coord().Data()); + } + glEnd(); + i++; + } + + glDisable(GL_TEXTURE_2D); + } + + void TSplineObjectDraw::draw_mesh_curvature_comb() const + { + glColor3f(0.2, 0.2, 0.2); + + auto mesh = tsp_mesh_->GetCurvatureMesh(); + if (mesh == nullptr) + return; + size_t edge_num = mesh->edge_list_.size(); + + double scale = 0.01; + for (size_t i = 0; i < edge_num; i++) + { + auto e = mesh->edge_list_[i]; + auto v1 = mesh->vert_lsit_[e.v1_]; + auto v2 = mesh->vert_lsit_[e.v2_]; + AMCAX::Coord3 vn1 = v1.position_.Coord() + v1.Additional_[e.Additional_[0]] * v1.normal_.Coord() * scale; + AMCAX::Coord3 vn2 = v2.position_.Coord() + v2.Additional_[e.Additional_[1]] * v2.normal_.Coord() * scale; + //MVector3 vn1 = v1.position_ + v1.normal_ * scale; + //MVector3 vn2 = v2.position_ + v2.normal_ * scale; + + //有一个重复绘制 + glBegin(GL_LINES); + glVertex3dv(v1.position_.Coord().Data()); + glVertex3dv(vn1.Data()); + glEnd(); + + glBegin(GL_LINES); + glVertex3dv(v2.position_.Coord().Data()); + glVertex3dv(vn2.Data()); + glEnd(); + + glBegin(GL_LINES); + glVertex3dv(vn1.Data()); + glVertex3dv(vn2.Data()); + glEnd(); + } + + glColor3f(0.1, 0.1, 0.1); + } + + //====================================================== + + void TSplineObjectDraw::updatedrawState() + { + if (!parent_->tSpline) + return; + + auto spl = parent_->tSpline->getTSpline(); + + if (spl == nullptr) + { + vert_position_.clear(); + vert_normal_.clear(); + face_vertices_.clear(); + edge_vertices_.clear(); + return; + } + + + + if (!tsp_mesh_) + { + //tsp_mesh_ = new tspline::TSplineMeshing(tspline_object_->spline_, 6); + //tsp_mesh_->updateTSplineWatertightDraw(); + //tsp_mesh_->writeTsplineBezier("test_spline_bezier.obj"); + //tsp_mesh_->writeDrawMesh("Test_show_Mesh.obj"); + //tsp_mesh_ = std::make_unique(spl, 6); + initMesh(6); + //p_mesh_->UpdateDrawMesh(); + } + //else + //{ + tsp_mesh_->UpdateDrawMesh(); + //tsp_mesh_->writeTsplineBezier("test_spline_bezier.obj"); + //tsp_mesh_->writeDrawMesh("Test_show_Mesh.obj"); + //} + + + auto mesh = tsp_mesh_->GetDrawMesh(); + if (mesh == nullptr) + return; + //mesh->edge_list_[0]. + const size_t v_number = mesh->vert_lsit_.size(); + vert_position_.resize(v_number * 3); + vert_normal_.resize(v_number * 3); + + for (size_t i = 0; i < v_number; i++) + { + const AMCAX::Point3& p = mesh->vert_lsit_[i].position_; + const AMCAX::Vector3& n = mesh->vert_lsit_[i].normal_; + + vert_position_[3 * i + 0] = p.X(); + vert_position_[3 * i + 1] = p.Y(); + vert_position_[3 * i + 2] = p.Z(); + vert_normal_[3 * i + 0] = n.X(); + vert_normal_[3 * i + 1] = n.Y(); + vert_normal_[3 * i + 2] = n.Z(); + + //if (i < 20) { + // std::cout << i << " p:" << p.X() << "," << p.Y() << "," << p.Z() + // << " n:" << n.X() << "," << n.Y() << "," << n.Z() << std::endl; + //} + } + + + + face_vertices_.clear(); + face_vertices_.reserve(mesh->face_list_.size()); + std::vector f_vertices; f_vertices.reserve(4); + for (const auto& fh : mesh->face_list_) + { + f_vertices.clear(); + for (size_t i = 0; i < 3; i++) + { + f_vertices.push_back(fh.vert_[i]); + } + face_vertices_.push_back(f_vertices); + } + + edge_vertices_.clear(); + edge_vertices_.reserve(mesh->edge_list_.size()); + for (const auto& eh : mesh->edge_list_) + { + size_t ev0 = eh.v1_; + size_t ev1 = eh.v2_; + edge_vertices_.push_back({ ev0 , ev1 }); + } + + } + + void TSplineObjectDraw::updatedrawStateFast(bool is_topology_change) + { + //auto mesh = parent_->spline->getTSpline(); + //mesh->updateNormals(); + + initMesh(6); + + } + + //====================================================== + + void TSplineObjectDraw::clearCurvature() + { + tsp_mesh_->ClearCurvatrueMesh(); + } + + void TSplineObjectDraw::updatedrawZebra() + { + if (tsp_mesh_ == nullptr) + { + initMesh(3); + //p_mesh_ = std::make_unique(parent_->spline->getTSpline(), 3);// new tspline::TSplineMeshing(tspline_object_->spline_, 3); + tsp_mesh_->SetSubtime(4); + tsp_mesh_->UpdateMeshForZebra(4); + } + else + { + //tsp_mesh_->SetSubtime(4); + tsp_mesh_->UpdateMeshForZebra(4); + } + + } + + void TSplineObjectDraw::updatedrawCurvatureGraph(std::vector face_index) + { + if (tsp_mesh_ == nullptr) + { + initMesh(3); + //tsp_mesh_ = std::make_unique(parent_->spline->getTSpline(), 3); + //new tspline::TSplineMeshing(tspline_object_->spline_, 3); + //tsp_mesh_->updateTsplineCurvatureGraph(face_index, 8); + tsp_mesh_->UpdateMeshForCurvatureGraph(face_index, 8); + //tsp_mesh_->writeCurvature("Test_curvature.obj", "Test_curvature.txt"); + } + else + { + tsp_mesh_->UpdateMeshForCurvatureGraph(face_index, 8); + //tsp_mesh_->writeCurvature("Test_curvature.obj", "Test_curvature.txt"); + } +#ifdef QT_DEBUG + //formtTranslation::ExportJson_CurvatureGraph testjson; + //testjson.exportJsonToFilePretty(tsp_mesh_, "test.json"); +#endif + } + + //====================================================== + + bool TSplineObjectDraw::saveSTL(const std::string& filename) + { + + initMesh(4); + tsp_mesh_->SetSubtime(4); + tsp_mesh_->UpdateDrawMesh(); + //formtTranslation::ExportSTL_TSplingMeshing stl_out; +#ifdef QT_DEBUG + //stl_out.write_begin(); + //stl_out.input_TSplineMesh(tsp_mesh_); + //stl_out.write_ToFile(filename); +#endif + return AMCAX::TMS::TMSplineMeshingIO().ExportToSTL(filename, tsp_mesh_->GetDrawMesh()); + } + + bool TSplineObjectDraw::saveOBJ(const std::string& filename) + { + initMesh(4); + tsp_mesh_->SetSubtime(4); + tsp_mesh_->UpdateDrawMesh(); + + ///tsp_mesh_->writeDrawMesh(filename); + return AMCAX::TMS::TMSplineMeshingIO().ExportToOBJ(filename, tsp_mesh_->GetDrawMesh()); + } + + //bool TSplineBjectDraw::saveFrepMesh(const std::string& filename, const std::vector& fixIndex, const std::vector& forceIndex) + //{ + // if (tsp_mesh_ == nullptr) + // { + // tsp_mesh_ = std::make_unique(parent_->spline->getTSpline(), 4); + // } + // tsp_mesh_->SetSubtime(8); + // tsp_mesh_->UpdateDrawMesh(); + + + // return true; + //} + void TSplineObjectDraw::initMesh(int subtime) + { + + if (tsp_mesh_ == nullptr && parent_->tSpline->getTSpline()) + { + + tsp_mesh_ = std::make_unique(parent_->tSpline->getTSpline(), subtime); + } + } + +} + + diff --git a/Src/ObjectDraw/TSplineObjectDraw.h b/Src/ObjectDraw/TSplineObjectDraw.h new file mode 100644 index 0000000..be92c55 --- /dev/null +++ b/Src/ObjectDraw/TSplineObjectDraw.h @@ -0,0 +1,77 @@ +#pragma once +#include "ObjectDraw.h" + +#include + +#include +#include + +namespace acamcad +{ + + //class TSplineObject; + + class AdapterObject; + + class TSplineObjectDraw : public ObjectDraw + { + public: + TSplineObjectDraw(AdapterObject* object); + virtual ~TSplineObjectDraw(); + + public: + virtual void draw(const DrawModel& dmodel, const SelectModel& smodel) const override; + + virtual void drawSelected(const SelectModel& smodel, int d_id) const override; + + virtual void clear() override; + public: + virtual void drawWithObjectID() const override; + virtual void drawWithFaceID() const override; + virtual void drawWithEdgeID() const override; + virtual void drawWithVertexID() const override; + + public: + virtual void updatedrawState() override; + virtual void updatedrawStateFast(bool is_topology_change = true) override; + + public: + virtual void clearCurvature() override; + virtual void updatedrawZebra() override; + virtual void updatedrawCurvatureGraph(std::vector face_index) override; + + public: + bool saveSTL(const std::string& filename); + bool saveOBJ(const std::string& filename); + //bool saveFrepMesh(const std::string& filename, const std::vector& fixIndex, const std::vector& forceIndex); + + private: + void draw(const DrawModel& dmodel, bool is_show_point) const; + + private: + void draw_mesh_wireframe(AMCAX::TMS::TMSpline* spline, bool is_selected, bool showPoint) const; + + void draw_mesh_solidflat(AMCAX::TMS::TMSpline* spline, bool is_selected) const; + + void draw_mesh_smooth(bool is_selected) const; + + void draw_mesh_zebra() const; + + void draw_mesh_curvature_comb() const; + + void initMesh(int subTime); + + private: + //TSplineObject* tspline_object_; + + std::unique_ptr tsp_mesh_; + + std::vector vert_position_; + std::vector vert_normal_; + std::vector> face_vertices_; + std::vector> edge_vertices_; + }; + + + +} \ No newline at end of file diff --git a/Src/Operation/CreateOperate_Builder.cpp b/Src/Operation/CreateOperate_Builder.cpp index f629f6a..e8e1fce 100644 --- a/Src/Operation/CreateOperate_Builder.cpp +++ b/Src/Operation/CreateOperate_Builder.cpp @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "CreateOperate_Builder.h" @@ -46,706 +46,706 @@ CreateOperate_Builder::~CreateOperate_Builder() void CreateOperate_Builder::point(const double x, const double y, const double z) { - points.emplace_back(x, y, z); + points.emplace_back(x, y, z); } void CreateOperate_Builder::direction(const double x, const double y, const double z) { - dirs.emplace_back(x, y, z); + dirs.emplace_back(x, y, z); } void CreateOperate_Builder::vector(const double x, const double y, const double z) { - vecs.emplace_back(x, y, z); + vecs.emplace_back(x, y, z); } std::tuple CreateOperate_Builder::double3TakeOne(const TYPE tp) { - double x{NAN}, y{NAN}, z{NAN}; - switch (tp) - { - case TYPE_DIR: - { - auto dir = dirs.back(); - dirs.pop_back(); - x = dir[0]; - y = dir[1]; - z = dir[2]; - } - break; - case TYPE_VEC: - { - auto vec = vecs.back(); - vecs.pop_back(); - x = vec[0]; - y = vec[1]; - z = vec[2]; - } - break; - case TYPE_PNT: - { - auto pnt = points.back(); - points.pop_back(); - x = pnt[0]; - y = pnt[1]; - z = pnt[2]; - } - break; - default:; - } - return std::make_tuple(x, y, z); + double x{ NAN }, y{ NAN }, z{ NAN }; + switch (tp) + { + case TYPE_DIR: + { + auto dir = dirs.back(); + dirs.pop_back(); + x = dir[0]; + y = dir[1]; + z = dir[2]; + } + break; + case TYPE_VEC: + { + auto vec = vecs.back(); + vecs.pop_back(); + x = vec[0]; + y = vec[1]; + z = vec[2]; + } + break; + case TYPE_PNT: + { + auto pnt = points.back(); + points.pop_back(); + x = pnt[0]; + y = pnt[1]; + z = pnt[2]; + } + break; + default:; + } + return std::make_tuple(x, y, z); } void CreateOperate_Builder::frame(TYPE tp0, TYPE tp1, TYPE tp2) { - // tp0 is the type of the first double3, which is the point, - // and is the lost one being executed (added to the list) - // and we're using the lists as stack, which means it is - // the first one to be read (taken from the list). - auto [x0, y0, z0] = double3TakeOne(tp0); - auto [x1, y1, z1] = double3TakeOne(tp1); - auto [x2, y2, z2] = double3TakeOne(tp2); + // tp0 is the type of the first double3, which is the point, + // and is the lost one being executed (added to the list) + // and we're using the lists as stack, which means it is + // the first one to be read (taken from the list). + auto [x0, y0, z0] = double3TakeOne(tp0); + auto [x1, y1, z1] = double3TakeOne(tp1); + auto [x2, y2, z2] = double3TakeOne(tp2); - frames.push_back(Frame3{Point3{x0, y0, z0}, - Direction3{x1, y1, z1}, - Direction3{x2, y2, z2}}); + frames.push_back(Frame3{ Point3{x0, y0, z0}, + Direction3{x1, y1, z1}, + Direction3{x2, y2, z2} }); } bool CreateOperate_Builder::hasPosition() { - return hasFrame() || hasPoint() || hasVec() || hasDir(); + return hasFrame() || hasPoint() || hasVec() || hasDir(); } bool CreateOperate_Builder::hasFrame() { - return frames.size() > 0; + return frames.size() > 0; } bool CreateOperate_Builder::hasPoint() { - return points.size() > 0; + return points.size() > 0; } bool CreateOperate_Builder::hasVec() { - return vecs.size() > 0; + return vecs.size() > 0; } bool CreateOperate_Builder::hasDir() { - return dirs.size() > 0; + return dirs.size() > 0; } bool CreateOperate_Builder::hasCircle() { - return circles.size() > 0; + return circles.size() > 0; } bool CreateOperate_Builder::hasEdge() { - return edges.size() > 0; + return edges.size() > 0; } bool CreateOperate_Builder::hasWire() { - return wires.size() > 0; + return wires.size() > 0; } bool CreateOperate_Builder::hasFace() { - return faces.size() > 0; + return faces.size() > 0; } int CreateOperate_Builder::frameSize() { - return frames.size(); + return frames.size(); } int CreateOperate_Builder::pointSize() { - return points.size(); + return points.size(); } int CreateOperate_Builder::vecSize() { - return vecs.size(); + return vecs.size(); } int CreateOperate_Builder::dirSize() { - return dirs.size(); + return dirs.size(); } int CreateOperate_Builder::edgeSize() { - return edges.size(); + return edges.size(); } int CreateOperate_Builder::wireSize() { - return wires.size(); + return wires.size(); } int CreateOperate_Builder::faceSize() { - return faces.size(); + return faces.size(); } AMCAX::Vector3 CreateOperate_Builder::getLastVec() { - AMCAX::Vector3 lastVec = vecs.back(); - vecs.pop_back(); - return lastVec; + AMCAX::Vector3 lastVec = vecs.back(); + vecs.pop_back(); + return lastVec; } AMCAX::Point3 CreateOperate_Builder::getLastPoint() { - AMCAX::Point3 lastPoint = points.back(); - points.pop_back(); - return lastPoint; + AMCAX::Point3 lastPoint = points.back(); + points.pop_back(); + return lastPoint; } AMCAX::Direction3 CreateOperate_Builder::getLastDir() { - AMCAX::Direction3 lastDir = dirs.back(); - dirs.pop_back(); - return lastDir; + AMCAX::Direction3 lastDir = dirs.back(); + dirs.pop_back(); + return lastDir; } std::vector CreateOperate_Builder::getPoints() { - return points; + return points; } void CreateOperate_Builder::frame(TYPE tp0, TYPE tp1) { - auto [x0, y0, z0] = double3TakeOne(tp0); - auto [x1, y1, z1] = double3TakeOne(tp1); + auto [x0, y0, z0] = double3TakeOne(tp0); + auto [x1, y1, z1] = double3TakeOne(tp1); - frames.push_back(AMCAX::Frame3{AMCAX::Point3{x0, y0, z0}, - AMCAX::Direction3{x1, y1, z1}}); + frames.push_back(AMCAX::Frame3{ AMCAX::Point3{x0, y0, z0}, + AMCAX::Direction3{x1, y1, z1} }); } void CreateOperate_Builder::edgePnt() { - auto point0 = points.back(); - points.pop_back(); - auto point1 = points.back(); - points.pop_back(); - edges.push_back(AMCAX::MakeEdge(point0, point1)); + auto point0 = points.back(); + points.pop_back(); + auto point1 = points.back(); + points.pop_back(); + edges.push_back(AMCAX::MakeEdge(point0, point1)); } void CreateOperate_Builder::edgeCircle() { - auto circ = circles.back(); - circles.pop_back(); + auto circ = circles.back(); + circles.pop_back(); - edges.push_back(AMCAX::MakeEdge(circ)); + edges.push_back(AMCAX::MakeEdge(circ)); } void CreateOperate_Builder::edgeCircle(const double angle1, const double angle2) { - auto circ = circles.back(); - circles.pop_back(); + auto circ = circles.back(); + circles.pop_back(); - edges.push_back(AMCAX::MakeEdge(circ, angle1 * M_PI, angle2 * M_PI)); + edges.push_back(AMCAX::MakeEdge(circ, angle1 * M_PI, angle2 * M_PI)); } void CreateOperate_Builder::edgeCirclePnt() { - auto circ = circles.back(); - circles.pop_back(); - auto pnt0 = points.back(); - points.pop_back(); - auto pnt1 = points.back(); - points.pop_back(); + auto circ = circles.back(); + circles.pop_back(); + auto pnt0 = points.back(); + points.pop_back(); + auto pnt1 = points.back(); + points.pop_back(); - edges.push_back(AMCAX::MakeEdge(circ, pnt0, pnt1)); + edges.push_back(AMCAX::MakeEdge(circ, pnt0, pnt1)); } void CreateOperate_Builder::circle(const double radius) { - buildFrame(); - if (hasFrame()) - { - auto frame = frames.back(); - frames.pop_back(); + buildFrame(); + if (hasFrame()) + { + auto frame = frames.back(); + frames.pop_back(); - circles.push_back(AMCAX::Circle3(frame, radius)); - } + circles.push_back(AMCAX::Circle3(frame, radius)); + } } void CreateOperate_Builder::wire(const size_t edgenum) { - AMCAX::MakeWire mw; - for (auto i = 0; i < edgenum; ++i) - { - mw.Add(edges.back()); - edges.pop_back(); - } - wires.push_back(mw); + AMCAX::MakeWire mw; + for (auto i = 0; i < edgenum; ++i) + { + mw.Add(edges.back()); + edges.pop_back(); + } + wires.push_back(mw); } void CreateOperate_Builder::face() { - if (hasEdge()) - { - wires.push_back(AMCAX::MakeWire(edges.back())); - edges.pop_back(); - } - if (hasWire()) - { - faces.push_back(AMCAX::MakeFace(wires.back())); - wires.pop_back(); - } + if (hasEdge()) + { + wires.push_back(AMCAX::MakeWire(edges.back())); + edges.pop_back(); + } + if (hasWire()) + { + faces.push_back(AMCAX::MakeFace(wires.back())); + wires.pop_back(); + } } void CreateOperate_Builder::faceToFace() { - if (hasFace()) - { - auto f = faces.back(); - faces.pop_back(); - faces.push_back(AMCAX::MakeFace(f)); - } + if (hasFace()) + { + auto f = faces.back(); + faces.pop_back(); + faces.push_back(AMCAX::MakeFace(f)); + } } void CreateOperate_Builder::circleToFace() { - if (circles.size()) - { - auto cir = circles.back(); - circles.pop_back(); - faces.push_back(AMCAX::MakeFace()); - } + if (circles.size()) + { + auto cir = circles.back(); + circles.pop_back(); + faces.push_back(AMCAX::MakeFace()); + } } void CreateOperate_Builder::polygon(const size_t pointnum) { - std::list edges; - for (int i = points.size() - pointnum + 1; i < points.size(); ++i) - { - edges.push_back(AMCAX::MakeEdge(points[i - 1], points[i])); - } - edges.push_back(AMCAX::MakeEdge(points.back(), points[points.size() - pointnum])); - for (int i = 0; i < pointnum; ++i) { - points.pop_back(); - } - AMCAX::MakeWire mw; - mw.Add(edges); + std::list edges; + for (int i = points.size() - pointnum + 1; i < points.size(); ++i) + { + edges.push_back(AMCAX::MakeEdge(points[i - 1], points[i])); + } + edges.push_back(AMCAX::MakeEdge(points.back(), points[points.size() - pointnum])); + for (int i = 0; i < pointnum; ++i) { + points.pop_back(); + } + AMCAX::MakeWire mw; + mw.Add(edges); - faces.push_back(AMCAX::MakeFace(mw.Wire())); + faces.push_back(AMCAX::MakeFace(mw.Wire())); } void CreateOperate_Builder::polygon(const std::vector pointlist) { - std::list edgelist; - for (int i = 0; i < pointlist.size() - 1; ++i) - { - edgelist.push_back(AMCAX::MakeEdge(pointlist[i + 1], pointlist[i])); - } - edgelist.push_back(AMCAX::MakeEdge(pointlist.back(), pointlist[0])); - AMCAX::MakeWire mw; - mw.Add(edgelist); + std::list edgelist; + for (int i = 0; i < pointlist.size() - 1; ++i) + { + edgelist.push_back(AMCAX::MakeEdge(pointlist[i + 1], pointlist[i])); + } + edgelist.push_back(AMCAX::MakeEdge(pointlist.back(), pointlist[0])); + AMCAX::MakeWire mw; + mw.Add(edgelist); - faces.push_back(AMCAX::MakeFace(mw.Wire())); + faces.push_back(AMCAX::MakeFace(mw.Wire())); } void CreateOperate_Builder::prismVec() { - auto face = faces.back(); - faces.pop_back(); - auto vec = vecs.back(); - vecs.pop_back(); + auto face = faces.back(); + faces.pop_back(); + auto vec = vecs.back(); + vecs.pop_back(); - shapes.push_back(AMCAX::MakePrism(face, vec)); + shapes.push_back(AMCAX::MakePrism(face, vec)); } void CreateOperate_Builder::prismDir() { - auto face = faces.back(); - faces.pop_back(); - auto dir = dirs.back(); - dirs.pop_back(); + auto face = faces.back(); + faces.pop_back(); + auto dir = dirs.back(); + dirs.pop_back(); - shapes.push_back(MakePrism(face, dir)); + shapes.push_back(MakePrism(face, dir)); } void CreateOperate_Builder::transform() { - // TODO + // TODO } // take no points void CreateOperate_Builder::box(const double x0, const double y0, const double z0, - const double x1, const double y1, const double z1) + const double x1, const double y1, const double z1) { - AMCAX::Point3 bmin(x0, y0, z0); - AMCAX::Point3 bmax(x1, y1, z1); - shapes.push_back(AMCAX::MakeBox(bmin, bmax)); + AMCAX::Point3 bmin(x0, y0, z0); + AMCAX::Point3 bmax(x1, y1, z1); + shapes.push_back(AMCAX::MakeBox(bmin, bmax)); } // take one point void CreateOperate_Builder::boxP(const double x1, const double y1, const double z1) { - //gp_Pnt() - buildFrame(); - if (hasFrame()) { - auto fr = frames.back(); - frames.pop_back(); - shapes.push_back(AMCAX::MakeBox(fr, x1, y1, z1)); - } - else { - auto origin{ points.back() }; - points.pop_back(); - shapes.push_back(AMCAX::MakeBox(origin, x1, y1, z1)); - } + //gp_Pnt() + buildFrame(); + if (hasFrame()) { + auto fr = frames.back(); + frames.pop_back(); + shapes.push_back(AMCAX::MakeBox(fr, x1, y1, z1)); + } + else { + auto origin{ points.back() }; + points.pop_back(); + shapes.push_back(AMCAX::MakeBox(origin, x1, y1, z1)); + } } // default origin pnt(0, 0, 0) void CreateOperate_Builder::box(const double dx, const double dy, const double dz) { - buildFrame(); - if (hasFrame()) { - auto fr = frames.back(); - frames.pop_back(); - shapes.emplace_back(AMCAX::MakeBox(fr, dx, dy, dz)); - } - else - { - AMCAX::Point3 origin(0.0, 0.0, 0.0); - shapes.emplace_back(AMCAX::MakeBox(origin, dx, dy, dz)); - } + buildFrame(); + if (hasFrame()) { + auto fr = frames.back(); + frames.pop_back(); + shapes.emplace_back(AMCAX::MakeBox(fr, dx, dy, dz)); + } + else + { + AMCAX::Point3 origin(0.0, 0.0, 0.0); + shapes.emplace_back(AMCAX::MakeBox(origin, dx, dy, dz)); + } } // take 2 points void CreateOperate_Builder::box() { - auto bmin = points.back(); - points.pop_back(); - auto bmax = points.back(); - points.pop_back(); - shapes.push_back(AMCAX::MakeBox(bmin, bmax)); + auto bmin = points.back(); + points.pop_back(); + auto bmax = points.back(); + points.pop_back(); + shapes.push_back(AMCAX::MakeBox(bmin, bmax)); } void CreateOperate_Builder::cylinderFrame(const double radius, const double height, const double angle) { - auto fr = frames.back(); - frames.pop_back(); - shapes.push_back(AMCAX::MakeCylinder(fr, radius, height, angle * M_PI)); + auto fr = frames.back(); + frames.pop_back(); + shapes.push_back(AMCAX::MakeCylinder(fr, radius, height, angle * M_PI)); } void CreateOperate_Builder::cylinder(const double radius, const double height, const double angle) { - buildFrame(); - if (hasFrame()) - { - auto fr = frames.back(); - frames.pop_back(); - shapes.push_back(AMCAX::MakeCylinder(fr, radius, height, angle * M_PI)); - } - else { - shapes.push_back(AMCAX::MakeCylinder(radius, height, angle * M_PI)); - } + buildFrame(); + if (hasFrame()) + { + auto fr = frames.back(); + frames.pop_back(); + shapes.push_back(AMCAX::MakeCylinder(fr, radius, height, angle * M_PI)); + } + else { + shapes.push_back(AMCAX::MakeCylinder(radius, height, angle * M_PI)); + } } void CreateOperate_Builder::cylinderFrame(const double radius, const double height) { - auto fr = frames.back(); - frames.pop_back(); - shapes.push_back(AMCAX::MakeCylinder(fr, radius, height)); + auto fr = frames.back(); + frames.pop_back(); + shapes.push_back(AMCAX::MakeCylinder(fr, radius, height)); } void CreateOperate_Builder::cylinder(const double radius, const double height) { - buildFrame(); - if (hasFrame()) - { - auto fr = frames.back(); - frames.pop_back(); - shapes.push_back(AMCAX::MakeCylinder(fr, radius, height)); - } - else { - shapes.push_back(AMCAX::MakeCylinder(radius, height)); - } + buildFrame(); + if (hasFrame()) + { + auto fr = frames.back(); + frames.pop_back(); + shapes.push_back(AMCAX::MakeCylinder(fr, radius, height)); + } + else { + shapes.push_back(AMCAX::MakeCylinder(radius, height)); + } } void CreateOperate_Builder::coneFrame(const double r1, const double r2, const double height, const double angle) { - auto fr = frames.back(); - frames.pop_back(); - shapes.push_back(AMCAX::MakeCone(fr,r1, r2, height, angle * M_PI)); + auto fr = frames.back(); + frames.pop_back(); + shapes.push_back(AMCAX::MakeCone(fr, r1, r2, height, angle * M_PI)); } void CreateOperate_Builder::coneFrame(const double r1, const double r2, const double height) { - auto fr = frames.back(); - frames.pop_back(); - shapes.push_back(AMCAX::MakeCone(fr, r1, r2, height)); + auto fr = frames.back(); + frames.pop_back(); + shapes.push_back(AMCAX::MakeCone(fr, r1, r2, height)); } void CreateOperate_Builder::cone(const double r1, const double r2, const double height, const double angle) { - buildFrame(); - if (hasFrame()) - { - auto fr = frames.back(); - frames.pop_back(); - shapes.push_back(AMCAX::MakeCone(fr, r1, r2, height, angle * M_PI)); - } - else { - shapes.push_back(AMCAX::MakeCone(r1, r2, height, angle * M_PI)); - } + buildFrame(); + if (hasFrame()) + { + auto fr = frames.back(); + frames.pop_back(); + shapes.push_back(AMCAX::MakeCone(fr, r1, r2, height, angle * M_PI)); + } + else { + shapes.push_back(AMCAX::MakeCone(r1, r2, height, angle * M_PI)); + } } void CreateOperate_Builder::cone(const double r1, const double r2, const double height) { - buildFrame(); - if (hasFrame()) - { - auto fr = frames.back(); - frames.pop_back(); - shapes.push_back(AMCAX::MakeCone(fr, r1, r2, height)); - } - else { - shapes.push_back(AMCAX::MakeCone(r1, r2, height)); - } + buildFrame(); + if (hasFrame()) + { + auto fr = frames.back(); + frames.pop_back(); + shapes.push_back(AMCAX::MakeCone(fr, r1, r2, height)); + } + else { + shapes.push_back(AMCAX::MakeCone(r1, r2, height)); + } } void CreateOperate_Builder::torusFrame(const double r1, const double r2) { - auto fr = frames.back(); - frames.pop_back(); - shapes.push_back( AMCAX::MakeTorus(fr, r1, r2)); + auto fr = frames.back(); + frames.pop_back(); + shapes.push_back(AMCAX::MakeTorus(fr, r1, r2)); } void CreateOperate_Builder::torusFrame(const double r1, const double r2, const double angle) { - auto fr = frames.back(); - frames.pop_back(); - shapes.push_back( AMCAX::MakeTorus(fr, r1, r2, angle * M_PI)); + auto fr = frames.back(); + frames.pop_back(); + shapes.push_back(AMCAX::MakeTorus(fr, r1, r2, angle * M_PI)); } void CreateOperate_Builder::torus(const double r1, const double r2) { - buildFrame(); - if (hasFrame()) - { - auto fr = frames.back(); - frames.pop_back(); - shapes.push_back(AMCAX::MakeTorus(fr, r1, r2)); - } - else { - shapes.push_back(AMCAX::MakeTorus(r1, r2)); - } + buildFrame(); + if (hasFrame()) + { + auto fr = frames.back(); + frames.pop_back(); + shapes.push_back(AMCAX::MakeTorus(fr, r1, r2)); + } + else { + shapes.push_back(AMCAX::MakeTorus(r1, r2)); + } } void CreateOperate_Builder::torus(const double r1, const double r2, const double angle) { - buildFrame(); - if (hasFrame()) - { - auto fr = frames.back(); - frames.pop_back(); - shapes.push_back(AMCAX::MakeTorus(fr, r1, r2, angle * M_PI)); - } - else { - shapes.push_back(AMCAX::MakeTorus(r1, r2, angle * M_PI)); - } + buildFrame(); + if (hasFrame()) + { + auto fr = frames.back(); + frames.pop_back(); + shapes.push_back(AMCAX::MakeTorus(fr, r1, r2, angle * M_PI)); + } + else { + shapes.push_back(AMCAX::MakeTorus(r1, r2, angle * M_PI)); + } } void CreateOperate_Builder::sphereP(const double r, const double angle) { - if (hasPoint()) { - auto origin{ points.back() }; - points.pop_back(); - shapes.push_back(AMCAX::MakeSphere(origin, r,angle)); - } + if (hasPoint()) { + auto origin{ points.back() }; + points.pop_back(); + shapes.push_back(AMCAX::MakeSphere(origin, r, angle)); + } } void CreateOperate_Builder::sphereP(const double r) { - if (hasPoint()) { - auto origin{ points.back() }; - points.pop_back(); - shapes.push_back(AMCAX::MakeSphere(origin, r)); - } + if (hasPoint()) { + auto origin{ points.back() }; + points.pop_back(); + shapes.push_back(AMCAX::MakeSphere(origin, r)); + } } void CreateOperate_Builder::sphereFrame(const double r, const double angle) { - if (hasFrame()) - { - auto fr = frames.back(); - frames.pop_back(); - shapes.push_back(MakeSphere(fr, r,angle)); - } + if (hasFrame()) + { + auto fr = frames.back(); + frames.pop_back(); + shapes.push_back(MakeSphere(fr, r, angle)); + } } void CreateOperate_Builder::sphereFrame(const double r) { - if (hasFrame()) - { - auto fr = frames.back(); - frames.pop_back(); - shapes.push_back(AMCAX::MakeSphere(fr, r)); - } + if (hasFrame()) + { + auto fr = frames.back(); + frames.pop_back(); + shapes.push_back(AMCAX::MakeSphere(fr, r)); + } } void CreateOperate_Builder::sphere(const double r) { - buildFrame(); - if (hasFrame()) - { - auto fr = frames.back(); - frames.pop_back(); - shapes.push_back(AMCAX::MakeSphere(fr, r)); - }else if (hasPoint()) { - auto origin{ points.back() }; - points.pop_back(); - shapes.push_back(AMCAX::MakeSphere(origin, r)); - } - else{ - shapes.push_back(AMCAX::MakeSphere(r)); - } + buildFrame(); + if (hasFrame()) + { + auto fr = frames.back(); + frames.pop_back(); + shapes.push_back(AMCAX::MakeSphere(fr, r)); + } + else if (hasPoint()) { + auto origin{ points.back() }; + points.pop_back(); + shapes.push_back(AMCAX::MakeSphere(origin, r)); + } + else { + shapes.push_back(AMCAX::MakeSphere(r)); + } } void CreateOperate_Builder::sphere(const double r, const double angle) { - buildFrame(); - if (hasFrame()) - { - auto fr = frames.back(); - frames.pop_back(); - shapes.push_back(AMCAX::MakeSphere(fr, r, angle * M_PI)); - } - else if (hasPoint()) { - auto origin{ points.back() }; - points.pop_back(); - shapes.push_back(AMCAX::MakeSphere(origin, r, angle * M_PI)); - } - else { - shapes.push_back(AMCAX::MakeSphere(r, angle * M_PI)); - } + buildFrame(); + if (hasFrame()) + { + auto fr = frames.back(); + frames.pop_back(); + shapes.push_back(AMCAX::MakeSphere(fr, r, angle * M_PI)); + } + else if (hasPoint()) { + auto origin{ points.back() }; + points.pop_back(); + shapes.push_back(AMCAX::MakeSphere(origin, r, angle * M_PI)); + } + else { + shapes.push_back(AMCAX::MakeSphere(r, angle * M_PI)); + } } void CreateOperate_Builder::sphere(double r, const double angle1, const double angle2) { - buildFrame(); - if (hasFrame()) - { - auto fr = frames.back(); - frames.pop_back(); - shapes.push_back(AMCAX::MakeSphere(fr, r, angle1 * M_PI, angle2 * M_PI)); - } - else if (hasPoint()) { - auto origin{ points.back() }; - points.pop_back(); - shapes.push_back(AMCAX::MakeSphere(origin, r, angle1 * M_PI, angle2 * M_PI)); - } - else { - shapes.push_back(AMCAX::MakeSphere(r, angle1 * M_PI, angle2 * M_PI)); - } + buildFrame(); + if (hasFrame()) + { + auto fr = frames.back(); + frames.pop_back(); + shapes.push_back(AMCAX::MakeSphere(fr, r, angle1 * M_PI, angle2 * M_PI)); + } + else if (hasPoint()) { + auto origin{ points.back() }; + points.pop_back(); + shapes.push_back(AMCAX::MakeSphere(origin, r, angle1 * M_PI, angle2 * M_PI)); + } + else { + shapes.push_back(AMCAX::MakeSphere(r, angle1 * M_PI, angle2 * M_PI)); + } } void CreateOperate_Builder::sphere(const double r, const double angle1, const double angle2, const double angle3) { - buildFrame(); - if (hasFrame()) - { - auto fr = frames.back(); - frames.pop_back(); - shapes.push_back(AMCAX::MakeSphere(fr, r, angle1 * M_PI, angle2 * M_PI, angle3 * M_PI)); - } - else if (hasPoint()) { - auto origin{ points.back() }; - points.pop_back(); - shapes.push_back(AMCAX::MakeSphere(origin, r, angle1 * M_PI, angle2 * M_PI, angle3 * M_PI)); - } - else { - shapes.push_back(AMCAX::MakeSphere(r, angle1 * M_PI, angle2 * M_PI, angle3 * M_PI)); - } + buildFrame(); + if (hasFrame()) + { + auto fr = frames.back(); + frames.pop_back(); + shapes.push_back(AMCAX::MakeSphere(fr, r, angle1 * M_PI, angle2 * M_PI, angle3 * M_PI)); + } + else if (hasPoint()) { + auto origin{ points.back() }; + points.pop_back(); + shapes.push_back(AMCAX::MakeSphere(origin, r, angle1 * M_PI, angle2 * M_PI, angle3 * M_PI)); + } + else { + shapes.push_back(AMCAX::MakeSphere(r, angle1 * M_PI, angle2 * M_PI, angle3 * M_PI)); + } } void CreateOperate_Builder::buildFrame() { - if (hasPoint() || hasDir()) - { - AMCAX::Frame3 frame; - if (hasPoint()) { - AMCAX::Point3 center{points.back() }; - points.pop_back(); - frame.SetLocation(center); - } - else { - //default center(0,0,0) - AMCAX::Point3 center(.0, .0, .0); - frame.SetLocation(center); - } - if (hasDir()) - { - if (dirSize() >= 2) - { - AMCAX::Direction3 xdir{dirs.back()}; - dirs.pop_back(); - frame.SetXDirection(xdir); - } - AMCAX::Direction3 dir{dirs.back()}; - dirs.pop_back(); - frame.SetDirection(dir); - } - else { - //default direction(0,0,1) - AMCAX::Direction3 dir(.0, .0, 1.0); - frame.SetDirection(dir); - } - frames.push_back(frame); - } + if (hasPoint() || hasDir()) + { + AMCAX::Frame3 frame; + if (hasPoint()) { + AMCAX::Point3 center{ points.back() }; + points.pop_back(); + frame.SetLocation(center); + } + else { + //default center(0,0,0) + AMCAX::Point3 center(.0, .0, .0); + frame.SetLocation(center); + } + if (hasDir()) + { + if (dirSize() >= 2) + { + AMCAX::Direction3 xdir{ dirs.back() }; + dirs.pop_back(); + frame.SetXDirection(xdir); + } + AMCAX::Direction3 dir{ dirs.back() }; + dirs.pop_back(); + frame.SetDirection(dir); + } + else { + //default direction(0,0,1) + AMCAX::Direction3 dir(.0, .0, 1.0); + frame.SetDirection(dir); + } + frames.push_back(frame); + } } void CreateOperate_Builder::wedge(const double dx, const double dy, const double dz, const double ltx) { - buildFrame(); - if (hasFrame()) - { - auto fr = frames.back(); - frames.pop_back(); - shapes.push_back(AMCAX::MakeWedge(fr, dx, dy, dz, ltx)); - } - else { - shapes.push_back(AMCAX::MakeWedge(dx, dy, dz, ltx)); - } + buildFrame(); + if (hasFrame()) + { + auto fr = frames.back(); + frames.pop_back(); + shapes.push_back(AMCAX::MakeWedge(fr, dx, dy, dz, ltx)); + } + else { + shapes.push_back(AMCAX::MakeWedge(dx, dy, dz, ltx)); + } } void CreateOperate_Builder::wedgeFrame(const double dx, const double dy, const double dz, const double ltx) { - auto fr = frames.back(); - frames.pop_back(); - shapes.push_back(AMCAX::MakeWedge(fr, dx, dy, dz, ltx)); + auto fr = frames.back(); + frames.pop_back(); + shapes.push_back(AMCAX::MakeWedge(fr, dx, dy, dz, ltx)); } void CreateOperate_Builder::wedge(const double dx, const double dy, const double dz, const double xmin, const double zmin, const double xmax, const double zmax) { - buildFrame(); - if (hasFrame()) - { - auto fr = frames.back(); - frames.pop_back(); - shapes.push_back(AMCAX::MakeWedge(fr, dx, dy, dz, xmin, zmin, xmax, zmax)); - } - else { - shapes.push_back(AMCAX::MakeWedge(dx, dy, dz, xmin, zmin, xmax, zmax)); - } + buildFrame(); + if (hasFrame()) + { + auto fr = frames.back(); + frames.pop_back(); + shapes.push_back(AMCAX::MakeWedge(fr, dx, dy, dz, xmin, zmin, xmax, zmax)); + } + else { + shapes.push_back(AMCAX::MakeWedge(dx, dy, dz, xmin, zmin, xmax, zmax)); + } } void CreateOperate_Builder::wedgeFrame(const double dx, const double dy, const double dz, const double xmin, const double zmin, const double xmax, const double zmax) { - auto fr = frames.back(); - frames.pop_back(); - shapes.push_back(AMCAX::MakeWedge(fr, dx, dy, dz, xmin, zmin, xmax, zmax)); + auto fr = frames.back(); + frames.pop_back(); + shapes.push_back(AMCAX::MakeWedge(fr, dx, dy, dz, xmin, zmin, xmax, zmax)); } void CreateOperate_Builder::plane(const double a, const double b, const double c, const double d, const double ulength, const double vlength) { - faces.push_back(AMCAX::MakeFace(AMCAX::Plane(a, b, c, d))); + faces.push_back(AMCAX::MakeFace(AMCAX::Plane(a, b, c, d))); } -void CreateOperate_Builder::plane(const double ulength , const double vlength) { - buildFrame(); - if (hasFrame()) - { - auto fr = frames.back(); - frames.pop_back(); - AMCAX::Point3 center = fr.Location(); - faces.push_back(AMCAX::MakeFace(AMCAX::Plane(fr),center.X()-ulength/2, center.X() + ulength / 2, center.Y() - vlength /2 ,center.Y() + vlength / 2)); - } +void CreateOperate_Builder::plane(const double ulength, const double vlength) { + buildFrame(); + if (hasFrame()) + { + auto fr = frames.back(); + frames.pop_back(); + AMCAX::Point3 center = fr.Location(); + faces.push_back(AMCAX::MakeFace(AMCAX::Plane(fr), center.X() - ulength / 2, center.X() + ulength / 2, center.Y() - vlength / 2, center.Y() + vlength / 2)); + } } void CreateOperate_Builder::plane() { - if (pointSize() >= 2) - { - auto p0_{ points.back() }; - points.pop_back(); - auto p1_{ points.back() }; - points.pop_back(); - double xmin = p0_.X(), xmax = p1_.X(); - double ymin = p0_.Y(), ymax = p1_.Y(); - faces.push_back(AMCAX::MakeFace(AMCAX::Plane(), xmin, xmax, ymin, ymax)); - } + if (pointSize() >= 2) + { + auto p0_{ points.back() }; + points.pop_back(); + auto p1_{ points.back() }; + points.pop_back(); + double xmin = p0_.X(), xmax = p1_.X(); + double ymin = p0_.Y(), ymax = p1_.Y(); + faces.push_back(AMCAX::MakeFace(AMCAX::Plane(), xmin, xmax, ymin, ymax)); + } } void coutPoint(AMCAX::Point3 p) { - std::cerr <<"(" << p.X() << "," << p.Y() << "," << p.Z() << ")\n"; + std::cerr << "(" << p.X() << "," << p.Y() << "," << p.Z() << ")\n"; } void CreateOperate_Builder::pyramid() { - if (pointSize() >= 4) - { - AMCAX::Point3 vertex = getLastPoint(); - for (int i = 0; i < pointSize() - 1; ++i) - { - std::vector pointtemp; - pointtemp.push_back(vertex); - pointtemp.push_back(points[i]); - pointtemp.push_back(points[i + 1]); - polygon(pointtemp); - } - std::vector pointlist; - pointlist.push_back(vertex); - pointlist.push_back(points[0]); - pointlist.push_back(points.back()); - polygon(pointlist); - polygon(points); - } - AMCAX::TopoCompound comp; - AMCAX::TopoBuilder build; - build.MakeCompound(comp); - for (auto &mf : faces) - { - build.Add(comp,mf); - } - shapes.push_back(comp); -} - -void CreateOperate_Builder::operateWithBRep(BRepObject *brep_object) + if (pointSize() >= 4) + { + AMCAX::Point3 vertex = getLastPoint(); + for (int i = 0; i < pointSize() - 1; ++i) + { + std::vector pointtemp; + pointtemp.push_back(vertex); + pointtemp.push_back(points[i]); + pointtemp.push_back(points[i + 1]); + polygon(pointtemp); + } + std::vector pointlist; + pointlist.push_back(vertex); + pointlist.push_back(points[0]); + pointlist.push_back(points.back()); + polygon(pointlist); + polygon(points); + } + AMCAX::TopoCompound comp; + AMCAX::TopoBuilder build; + build.MakeCompound(comp); + for (auto& mf : faces) + { + build.Add(comp, mf); + } + shapes.push_back(comp); +} + +bool CreateOperate_Builder::DoOperate(AdapterObject* brep_object) { - if (shapes.size()) - { - for (AMCAX::TopoShape & shape : shapes) - { - brep_object->getShape() = shape; - } - } - else if (faces.size()) - { - brep_object->getShape() = faces.back(); - } - else if (wires.size()) - { - brep_object->getShape() = wires.back(); - } - else if (edges.size()) - { - brep_object->getShape() = edges.back(); - } - else - { - } - - brep_object->updateDraw(); + if (shapes.size()) + { + for (AMCAX::TopoShape& shape : shapes) + { + brep_object->bRep->getShape() = shape; + } + } + else if (faces.size()) + { + brep_object->bRep->getShape() = faces.back(); + } + else if (wires.size()) + { + brep_object->bRep->getShape() = wires.back(); + } + else if (edges.size()) + { + brep_object->bRep->getShape() = edges.back(); + } + + brep_object->updateDraw(); + + return true; } diff --git a/Src/Operation/CreateOperate_Builder.h b/Src/Operation/CreateOperate_Builder.h index 3158aa6..5abeab3 100644 --- a/Src/Operation/CreateOperate_Builder.h +++ b/Src/Operation/CreateOperate_Builder.h @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #ifndef CREATEOPERATE_BUILDER_H #define CREATEOPERATE_BUILDER_H @@ -40,164 +40,164 @@ namespace AMCAD { - template - class PointT; - template - class DirectionT; - template - class VectorT; - template - class FrameT; - template - class CircleT; - -// class MakeEdge; -// class MakeWire; -// class MakeFace; -// class MakePolygon; -// class MakePrism; -// class MakeBox; -// class MakeCylinder; -// class MakeCone; -// class MakeWedge; -// class MakeShape; -// class MakeSphere; -// class MakeTorus; -// class MakeSweep; -// class MakeEdge2d; + template + class PointT; + template + class DirectionT; + template + class VectorT; + template + class FrameT; + template + class CircleT; + + // class MakeEdge; + // class MakeWire; + // class MakeFace; + // class MakePolygon; + // class MakePrism; + // class MakeBox; + // class MakeCylinder; + // class MakeCone; + // class MakeWedge; + // class MakeShape; + // class MakeSphere; + // class MakeTorus; + // class MakeSweep; + // class MakeEdge2d; } namespace acamcad { - class CreateOperate_Builder : public MOperation - { - private: - enum OP - { - OP_NONE, OP_PNT, OP_DIR, OP_VEC, OP_FRAME, OP_PLANE, OP_TRSF, - }; - public: - enum TYPE - { - TYPE_NONE, TYPE_PNT, TYPE_DIR, TYPE_VEC, - }; - - public: - CreateOperate_Builder(); - ~CreateOperate_Builder(); - - virtual void operateWithBRep(BRepObject *brep_object) override; - - public: - void point(const double x, const double y, const double z); - - void direction(const double x, const double y, const double z); - - void vector(const double x, const double y, const double z); - - std::tuple double3TakeOne(const TYPE tp); - - void frame(TYPE tp0, TYPE tp1, TYPE tp2); - void frame(TYPE tp0, TYPE tp1); - bool hasPosition(); - bool hasFrame(); - bool hasPoint(); - bool hasVec(); - bool hasDir(); - bool hasCircle(); - bool hasEdge(); - bool hasWire(); - bool hasFace(); - int frameSize(); - int pointSize(); - int dirSize(); - int vecSize(); - int edgeSize(); - int wireSize(); - int faceSize(); - AMCAX::Vector3 getLastVec(); - AMCAX::Point3 getLastPoint(); - AMCAX::Direction3 getLastDir(); - std::vector getPoints(); - - void edgePnt(); // using the last two pnt - void edgeCircle(); // using the last circ - void edgeCircle(const double angle1, const double angle2); // using the last circ - void edgeCirclePnt(); // using the last circ and the last two gp_Pnt - - void circle(const double radius); - - void wire(const size_t edgenum); // take the last edgenum edges - - void face(); // take the last wire - void faceToFace(); - void circleToFace(); - - void polygon(const size_t pointnum); // take the last pointnum points; - void polygon(const std::vector pointlist); - void prismVec(); // take the last face and the last vec/dir - void prismDir(); // take the last face and the last vec/dir - void prism(); - - void transform(); - - void box(const double x0, const double y0, const double z0, - const double x1, const double y1, const double z1); // take no points - void boxP(const double x1, const double y1, const double z1); // take one point - void box(const double dx, const double dy, const double dz); // default origin pnt(0, 0, 0) - void box(); // take 2 points - - void cylinderFrame(const double radius, const double height, const double angle); - void cylinder(const double radius, const double height, const double angle); - void cylinderFrame(const double radius, const double height); - void cylinder(const double radius, const double height); - - void coneFrame(const double r1, const double r2, const double height, const double angle); - void coneFrame(const double r1, const double r2, const double height); - void cone(const double r1, const double r2, const double height, const double angle); - void cone(const double r1, const double r2, const double height); - - void torusFrame(const double r1, const double r2); - void torusFrame(const double r1, const double r2, const double angle); - void torus(const double r1, const double r2); - void torus(const double r1, const double r2, const double angle); - - void sphere(const double r); - void sphere(const double r, const double angle); - void sphere(const double r, const double angle1, const double angle2); - void sphere(const double r, const double angle1, const double angle2, const double angle3); - void sphereP(const double r); - void sphereP(const double r, const double angle); - void sphereFrame(const double r); - void sphereFrame(const double r, const double angle); - - void wedge(const double dx, const double dy, const double dz, const double ltx); - void wedgeFrame(const double dx, const double dy, const double dz, const double ltx); - void wedge(const double dx, const double dy, const double dz, const double xmin, const double zmin, const double xmax, const double zmax); - void wedgeFrame(const double dx, const double dy, const double dz, const double xmin, const double zmin, const double xmax, const double zmax); - - void plane(const double a, const double b, const double c, const double d, const double ulength, const double vlength); - void plane(const double ulength, const double vlength); - void plane(); - void pyramid(); - - void buildFrame(); - - private: - // std::list order; - std::vector> points; - std::vector> dirs; - std::vector> vecs; - std::vector> frames; - - std::vector> circles; - - std::vector edges; - std::vector wires; - std::vector faces; - - std::vector shapes; - }; + class CreateOperate_Builder : public MOperation + { + private: + enum OP + { + OP_NONE, OP_PNT, OP_DIR, OP_VEC, OP_FRAME, OP_PLANE, OP_TRSF, + }; + public: + enum TYPE + { + TYPE_NONE, TYPE_PNT, TYPE_DIR, TYPE_VEC, + }; + + public: + CreateOperate_Builder(); + ~CreateOperate_Builder(); + + virtual bool DoOperate(AdapterObject* brep_object) override; + + public: + void point(const double x, const double y, const double z); + + void direction(const double x, const double y, const double z); + + void vector(const double x, const double y, const double z); + + std::tuple double3TakeOne(const TYPE tp); + + void frame(TYPE tp0, TYPE tp1, TYPE tp2); + void frame(TYPE tp0, TYPE tp1); + bool hasPosition(); + bool hasFrame(); + bool hasPoint(); + bool hasVec(); + bool hasDir(); + bool hasCircle(); + bool hasEdge(); + bool hasWire(); + bool hasFace(); + int frameSize(); + int pointSize(); + int dirSize(); + int vecSize(); + int edgeSize(); + int wireSize(); + int faceSize(); + AMCAX::Vector3 getLastVec(); + AMCAX::Point3 getLastPoint(); + AMCAX::Direction3 getLastDir(); + std::vector getPoints(); + + void edgePnt(); // using the last two pnt + void edgeCircle(); // using the last circ + void edgeCircle(const double angle1, const double angle2); // using the last circ + void edgeCirclePnt(); // using the last circ and the last two gp_Pnt + + void circle(const double radius); + + void wire(const size_t edgenum); // take the last edgenum edges + + void face(); // take the last wire + void faceToFace(); + void circleToFace(); + + void polygon(const size_t pointnum); // take the last pointnum points; + void polygon(const std::vector pointlist); + void prismVec(); // take the last face and the last vec/dir + void prismDir(); // take the last face and the last vec/dir + void prism(); + + void transform(); + + void box(const double x0, const double y0, const double z0, + const double x1, const double y1, const double z1); // take no points + void boxP(const double x1, const double y1, const double z1); // take one point + void box(const double dx, const double dy, const double dz); // default origin pnt(0, 0, 0) + void box(); // take 2 points + + void cylinderFrame(const double radius, const double height, const double angle); + void cylinder(const double radius, const double height, const double angle); + void cylinderFrame(const double radius, const double height); + void cylinder(const double radius, const double height); + + void coneFrame(const double r1, const double r2, const double height, const double angle); + void coneFrame(const double r1, const double r2, const double height); + void cone(const double r1, const double r2, const double height, const double angle); + void cone(const double r1, const double r2, const double height); + + void torusFrame(const double r1, const double r2); + void torusFrame(const double r1, const double r2, const double angle); + void torus(const double r1, const double r2); + void torus(const double r1, const double r2, const double angle); + + void sphere(const double r); + void sphere(const double r, const double angle); + void sphere(const double r, const double angle1, const double angle2); + void sphere(const double r, const double angle1, const double angle2, const double angle3); + void sphereP(const double r); + void sphereP(const double r, const double angle); + void sphereFrame(const double r); + void sphereFrame(const double r, const double angle); + + void wedge(const double dx, const double dy, const double dz, const double ltx); + void wedgeFrame(const double dx, const double dy, const double dz, const double ltx); + void wedge(const double dx, const double dy, const double dz, const double xmin, const double zmin, const double xmax, const double zmax); + void wedgeFrame(const double dx, const double dy, const double dz, const double xmin, const double zmin, const double xmax, const double zmax); + + void plane(const double a, const double b, const double c, const double d, const double ulength, const double vlength); + void plane(const double ulength, const double vlength); + void plane(); + void pyramid(); + + void buildFrame(); + + private: + // std::list order; + std::vector> points; + std::vector> dirs; + std::vector> vecs; + std::vector> frames; + + std::vector> circles; + + std::vector edges; + std::vector wires; + std::vector faces; + + std::vector shapes; + }; } #endif // CREATEOPERATE_BUILDER_H diff --git a/Src/Operation/CreateOperate_Circular.cpp b/Src/Operation/CreateOperate_Circular.cpp index adf15b2..6a0d9fb 100644 --- a/Src/Operation/CreateOperate_Circular.cpp +++ b/Src/Operation/CreateOperate_Circular.cpp @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "CreateOperate_Circular.h" #include @@ -19,16 +19,17 @@ namespace acamcad { -CreateOperate_Circular::CreateOperate_Circular() - :radius_(1.0), angle_(M_PI*2), seg_(8) -{ -} + CreateOperate_Circular::CreateOperate_Circular() + :radius_(1.0), angle_(M_PI * 2), seg_(8) + { + } -void CreateOperate_Circular::operateWithBRep(BRepObject *brep_object) -{ - // Doing nothing -} + bool CreateOperate_Circular::DoOperate(AdapterObject* brep_object) + { + // Doing nothing + return false; + } } \ No newline at end of file diff --git a/Src/Operation/CreateOperate_Circular.h b/Src/Operation/CreateOperate_Circular.h index 11da45a..2f06b79 100644 --- a/Src/Operation/CreateOperate_Circular.h +++ b/Src/Operation/CreateOperate_Circular.h @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #pragma once #include "MOperate.h" @@ -19,21 +19,21 @@ namespace acamcad { -class CreateOperate_Circular : public MOperation -{ -public: - CreateOperate_Circular(); - CreateOperate_Circular(double radius, double angle, size_t seg = 4); + class CreateOperate_Circular : public MOperation + { + public: + CreateOperate_Circular(); + CreateOperate_Circular(double radius, double angle, size_t seg = 4); -public: + public: - virtual void operateWithBRep(BRepObject *brep_object); + virtual bool DoOperate(AdapterObject* brep_object) override; -private: - double radius_; - double angle_; - size_t seg_; + private: + double radius_; + double angle_; + size_t seg_; -}; + }; } \ No newline at end of file diff --git a/Src/Operation/CreateOperate_CircularTSpline.cpp b/Src/Operation/CreateOperate_CircularTSpline.cpp new file mode 100644 index 0000000..c5f6eae --- /dev/null +++ b/Src/Operation/CreateOperate_CircularTSpline.cpp @@ -0,0 +1,30 @@ +#include "CreateOperate_CircularTSpline.h" + +#include +#include + +namespace acamcad +{ + CreateOperate_CircularTSpline::CreateOperate_CircularTSpline(AMCAX::Coord3 center, AMCAX::Coord3 axis, + double radius, double angle, size_t seg) : center_(center), axis_(axis), radius_(radius), + angle_(angle), seg_(seg) + { + + } + + bool CreateOperate_CircularTSpline::DoOperate(AdapterObject* object) + { + AMCAX::Direction3 dir(axis_); + AMCAX::Point3 p(center_); + AMCAX::Frame3 frame(p, dir); + + AMCAX::TMS::TMSplineMakeCircular shape(frame, radius_, angle_, seg_); + + + object->tSpline->setTSpline(shape.BuildSpline()); + object->tSpline->updateDraw(); + return true; + } + + +} \ No newline at end of file diff --git a/Src/Operation/CreateOperate_CircularTSpline.h b/Src/Operation/CreateOperate_CircularTSpline.h new file mode 100644 index 0000000..242d894 --- /dev/null +++ b/Src/Operation/CreateOperate_CircularTSpline.h @@ -0,0 +1,42 @@ +/* =================================================================== +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* All rights reserved. +* +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* software under the terms of either license. +* +* For more information about the AGPLv3.0 license, please visit: +* https://www.gnu.org/licenses/agpl-3.0.html +* For licensing inquiries or to obtain a commercial license, please +* contact Hefei Jiushao Intelligent Technology Co., Ltd. +* =================================================================== +* Author: +*/ +#pragma once +#include "MOperate.h" + +namespace acamcad +{ + + class CreateOperate_CircularTSpline : public MOperation + { + public: + //CreateOperate_Circular(); + CreateOperate_CircularTSpline(AMCAX::Coord3 center, AMCAX::Coord3 axis, + double radius, double angle, size_t seg); + + public: + + virtual bool DoOperate(AdapterObject* object) override; + + private: + AMCAX::Coord3 center_; + AMCAX::Coord3 axis_; + double radius_; + double angle_; + size_t seg_; + + }; + +} \ No newline at end of file diff --git a/Src/Operation/CreateOperate_Cone.cpp b/Src/Operation/CreateOperate_Cone.cpp index 7ade065..5be8170 100644 --- a/Src/Operation/CreateOperate_Cone.cpp +++ b/Src/Operation/CreateOperate_Cone.cpp @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "CreateOperate_Cone.h" #include @@ -19,46 +19,48 @@ namespace acamcad { -CreateOperate_Cone::CreateOperate_Cone(): - is_bottom_(true), segR_(8), segV_(4) -{ -} + CreateOperate_Cone::CreateOperate_Cone() : + is_bottom_(true), segR_(8), segV_(4) + { + } -CreateOperate_Cone::CreateOperate_Cone(const AMCAX::Coord3 & b_center, const AMCAX::Coord3 & axis, - double radiusR, double radiusr, double height, double angle): - segR_(8), segV_(4), - is_bottom_(true), center_(b_center), axis_(axis), - xaxis_(NAN, NAN, NAN), radiusR_(radiusR), radiusr_(radiusr), height_(height), angle_(angle) -{ -} + CreateOperate_Cone::CreateOperate_Cone(const AMCAX::Coord3& b_center, const AMCAX::Coord3& axis, + double radiusR, double radiusr, double height, double angle) : + segR_(8), segV_(4), + is_bottom_(true), center_(b_center), axis_(axis), + xaxis_(NAN, NAN, NAN), radiusR_(radiusR), radiusr_(radiusr), height_(height), angle_(angle) + { + } -CreateOperate_Cone::CreateOperate_Cone(const AMCAX::Coord3 & b_center, const AMCAX::Coord3 & axis, const AMCAX::Coord3 & xaxis, - double radiusR, double radiusr, double height, double angle): - segR_(8), segV_(4), - is_bottom_(true), center_(b_center), axis_(axis), - xaxis_(xaxis), radiusR_(radiusR), radiusr_(radiusr), height_(height), angle_(angle) -{ -} + CreateOperate_Cone::CreateOperate_Cone(const AMCAX::Coord3& b_center, const AMCAX::Coord3& axis, const AMCAX::Coord3& xaxis, + double radiusR, double radiusr, double height, double angle) : + segR_(8), segV_(4), + is_bottom_(true), center_(b_center), axis_(axis), + xaxis_(xaxis), radiusR_(radiusR), radiusr_(radiusr), height_(height), angle_(angle) + { + } -CreateOperate_Cone::~CreateOperate_Cone() -{ -} + CreateOperate_Cone::~CreateOperate_Cone() + { + } -void CreateOperate_Cone::operateWithBRep(BRepObject* brep_object) { - AMCAX::Frame3 frameZ(AMCAX::Point3{center_[0], center_[1], center_[2]}, - AMCAX::Direction3{axis_[0], axis_[1], axis_[2]}); + bool CreateOperate_Cone::DoOperate(AdapterObject* brep_object) { + AMCAX::Frame3 frameZ(AMCAX::Point3{ center_[0], center_[1], center_[2] }, + AMCAX::Direction3{ axis_[0], axis_[1], axis_[2] }); - AMCAX::Frame3 frameXZ(AMCAX::Point3{center_[0], center_[1], center_[2]}, - AMCAX::Direction3{axis_[0], axis_[1], axis_[2]}, - AMCAX::Direction3{xaxis_[0], xaxis_[1], xaxis_[2]}); + AMCAX::Frame3 frameXZ(AMCAX::Point3{ center_[0], center_[1], center_[2] }, + AMCAX::Direction3{ axis_[0], axis_[1], axis_[2] }, + AMCAX::Direction3{ xaxis_[0], xaxis_[1], xaxis_[2] }); - AMCAX::MakeCone mc(std::isnan(xaxis_[0]) ? frameZ : frameXZ, - radiusR_, radiusr_, height_, angle_); + AMCAX::MakeCone mc(std::isnan(xaxis_[0]) ? frameZ : frameXZ, + radiusR_, radiusr_, height_, angle_); - brep_object->getShape() = mc.Shape(); - brep_object->updateDraw(); -} + brep_object->bRep->getShape() = mc.Shape(); + brep_object->updateDraw(); + + return true; + } } diff --git a/Src/Operation/CreateOperate_Cone.h b/Src/Operation/CreateOperate_Cone.h index 45b10a8..c17abc5 100644 --- a/Src/Operation/CreateOperate_Cone.h +++ b/Src/Operation/CreateOperate_Cone.h @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #pragma once #include "MOperate.h" @@ -19,32 +19,32 @@ namespace acamcad { -class CreateOperate_Cone : public MOperation -{ -public: - CreateOperate_Cone(); - CreateOperate_Cone(const AMCAX::Coord3 & b_center, const AMCAX::Coord3 & axis, - double radiusR, double radiusr, double height, double angle); - CreateOperate_Cone(const AMCAX::Coord3 & b_center, const AMCAX::Coord3 & axis, const AMCAX::Coord3 & xaxis, - double radiusR, double radiusr, double height, double angle); - virtual ~CreateOperate_Cone(); - -public: - - virtual void operateWithBRep(BRepObject* brep_object); - -private: - - size_t segR_, segV_; - bool is_bottom_; - - // TODO: Replace with MTrapezoidCone when available - AMCAX::Coord3 center_; - AMCAX::Coord3 axis_; - AMCAX::Coord3 xaxis_; - double radiusR_, radiusr_; - double height_; - double angle_; -}; + class CreateOperate_Cone : public MOperation + { + public: + CreateOperate_Cone(); + CreateOperate_Cone(const AMCAX::Coord3& b_center, const AMCAX::Coord3& axis, + double radiusR, double radiusr, double height, double angle); + CreateOperate_Cone(const AMCAX::Coord3& b_center, const AMCAX::Coord3& axis, const AMCAX::Coord3& xaxis, + double radiusR, double radiusr, double height, double angle); + virtual ~CreateOperate_Cone(); + + public: + + virtual bool DoOperate(AdapterObject* brep_object) override; + + private: + + size_t segR_, segV_; + bool is_bottom_; + + // TODO: Replace with MTrapezoidCone when available + AMCAX::Coord3 center_; + AMCAX::Coord3 axis_; + AMCAX::Coord3 xaxis_; + double radiusR_, radiusr_; + double height_; + double angle_; + }; } \ No newline at end of file diff --git a/Src/Operation/CreateOperate_ConeTSpline.cpp b/Src/Operation/CreateOperate_ConeTSpline.cpp new file mode 100644 index 0000000..78a1a33 --- /dev/null +++ b/Src/Operation/CreateOperate_ConeTSpline.cpp @@ -0,0 +1,28 @@ +#include "CreateOperate_ConeTSpline.h" + +//#include +#include + +namespace acamcad +{ + CreateOperate_ConeTSpline::CreateOperate_ConeTSpline(const MPoint3& b_center, const AMCAX::Vector3& axis, + double radius, double height, size_t rf_num, size_t vf_num, bool bottom) : + b_center_(b_center), axis_(axis), radius_(radius), height_(height), rf_num_(rf_num), vf_num_(vf_num), bottom_(bottom) + { + } + + bool CreateOperate_ConeTSpline::DoOperate(AdapterObject* object) + { + AMCAX::Direction3 dir(axis_); + //AMCAX::Frame + AMCAX::Frame3 frame(b_center_, dir); + + AMCAX::TMS::TMSplineMakeCone cone(frame, radius_, height_, bottom_, rf_num_, vf_num_); + + object->tSpline->setTSpline(cone.BuildSpline()); + + object->tSpline->updateDraw(); + + return true; + } +} \ No newline at end of file diff --git a/Src/Operation/CreateOperate_ConeTSpline.h b/Src/Operation/CreateOperate_ConeTSpline.h new file mode 100644 index 0000000..ae81d7e --- /dev/null +++ b/Src/Operation/CreateOperate_ConeTSpline.h @@ -0,0 +1,43 @@ +/* =================================================================== +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* All rights reserved. +* +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* software under the terms of either license. +* +* For more information about the AGPLv3.0 license, please visit: +* https://www.gnu.org/licenses/agpl-3.0.html +* For licensing inquiries or to obtain a commercial license, please +* contact Hefei Jiushao Intelligent Technology Co., Ltd. +* =================================================================== +* Author: +*/ +#pragma once +#include "MOperate.h" + +namespace acamcad +{ + + class CreateOperate_ConeTSpline : public MOperation + { + public: + CreateOperate_ConeTSpline(const MPoint3& b_center, const AMCAX::Vector3& axis, double radius, double height, + size_t rf_num, size_t vf_num, bool bottom); + + public: + + virtual bool DoOperate(AdapterObject* brep_object) override; + + private: + + MPoint3 b_center_; + AMCAX::Vector3 axis_; + double radius_; + double height_; + size_t rf_num_; + size_t vf_num_; + bool bottom_; + }; + +} \ No newline at end of file diff --git a/Src/Operation/CreateOperate_Cube.cpp b/Src/Operation/CreateOperate_Cube.cpp index 139d2ec..3b8fed3 100644 --- a/Src/Operation/CreateOperate_Cube.cpp +++ b/Src/Operation/CreateOperate_Cube.cpp @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "CreateOperate_Cube.h" #include @@ -19,31 +19,33 @@ namespace acamcad { -CreateOperate_Cube::CreateOperate_Cube() : - bb_min_(0.0, 0.0, 0.0), bb_max_(1.0, 1.0, 1.0), segX_(2), segY_(2), segZ_(2) -{ -} + CreateOperate_Cube::CreateOperate_Cube() : + bb_min_(0.0, 0.0, 0.0), bb_max_(1.0, 1.0, 1.0), segX_(2), segY_(2), segZ_(2) + { + } -CreateOperate_Cube::CreateOperate_Cube(const AMCAX::Coord3& bb_min, const AMCAX::Coord3& bb_max, size_t segX, size_t segY, size_t segZ): - bb_min_(bb_min), bb_max_(bb_max), segX_(segX), segY_(segY), segZ_(segZ) -{ + CreateOperate_Cube::CreateOperate_Cube(const AMCAX::Coord3& bb_min, const AMCAX::Coord3& bb_max, size_t segX, size_t segY, size_t segZ) : + bb_min_(bb_min), bb_max_(bb_max), segX_(segX), segY_(segY), segZ_(segZ) + { -} + } -CreateOperate_Cube::~CreateOperate_Cube() -{ -} + CreateOperate_Cube::~CreateOperate_Cube() + { + } -void CreateOperate_Cube::operateWithBRep(BRepObject* brep_object) -{ - AMCAX::Point3 bmin(bb_min_.X(), bb_min_.Y(), bb_min_.Z()); - AMCAX::Point3 bmax(bb_max_.X(), bb_max_.Y(), bb_max_.Z()); - AMCAX::MakeBox mkbox(bmin, bmax); + bool CreateOperate_Cube::DoOperate(AdapterObject* brep_object) + { + AMCAX::Point3 bmin(bb_min_.X(), bb_min_.Y(), bb_min_.Z()); + AMCAX::Point3 bmax(bb_max_.X(), bb_max_.Y(), bb_max_.Z()); + AMCAX::MakeBox mkbox(bmin, bmax); - brep_object->SetShape(mkbox.Shape()); - brep_object->updateDraw(); -} + brep_object->bRep->SetShape(mkbox.Shape()); + brep_object->bRep->updateDraw(); + + return true; + } } diff --git a/Src/Operation/CreateOperate_Cube.h b/Src/Operation/CreateOperate_Cube.h index a5ca601..7e9d554 100644 --- a/Src/Operation/CreateOperate_Cube.h +++ b/Src/Operation/CreateOperate_Cube.h @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #pragma once #include "MOperate.h" @@ -19,20 +19,20 @@ namespace acamcad { -class CreateOperate_Cube : public MOperation -{ -public: - CreateOperate_Cube(); - CreateOperate_Cube(const AMCAX::Coord3& bb_min, const AMCAX::Coord3& bb_max, size_t segX = 2, size_t segY = 2, size_t segZ = 2); - virtual ~CreateOperate_Cube(); + class CreateOperate_Cube : public MOperation + { + public: + CreateOperate_Cube(); + CreateOperate_Cube(const AMCAX::Coord3& bb_min, const AMCAX::Coord3& bb_max, size_t segX = 2, size_t segY = 2, size_t segZ = 2); + virtual ~CreateOperate_Cube(); -public: + public: - virtual void operateWithBRep(BRepObject* brep_object) override; + virtual bool DoOperate(AdapterObject* brep_object) override; -private: - AMCAX::Coord3 bb_min_, bb_max_; - size_t segX_, segY_, segZ_; -}; + protected: + AMCAX::Coord3 bb_min_, bb_max_; + size_t segX_, segY_, segZ_; + }; } \ No newline at end of file diff --git a/Src/Operation/CreateOperate_CubeMesh.cpp b/Src/Operation/CreateOperate_CubeMesh.cpp new file mode 100644 index 0000000..b16f151 --- /dev/null +++ b/Src/Operation/CreateOperate_CubeMesh.cpp @@ -0,0 +1,29 @@ +#include "CreateOperate_CubeMesh.h" +#include "polymeshAPI/MeshMakeCube.hpp" +#include + + +namespace acamcad +{ + + CreateOperate_CubeMesh::CreateOperate_CubeMesh(const AMCAX::Coord3& bb_min, const AMCAX::Coord3& bb_max, size_t segX, size_t segY, size_t segZ) + :CreateOperate_Cube(bb_min, bb_max, segX, segY, segZ) + { + } + + bool CreateOperate_CubeMesh::DoOperate(AdapterObject* adapter) + { + + AMCAX::Point3 bb_min = AMCAX::Point3(bb_min_.X(), bb_min_.Y(), bb_min_.Z()); + AMCAX::Point3 bb_max = AMCAX::Point3(bb_max_.X(), bb_max_.Y(), bb_max_.Z()); + AMCAX::SubD::MeshMakeCube cube(bb_min, bb_max, segX_, segY_, segZ_); + + adapter->mesh->SetMesh(cube.BuildMesh()); + adapter->updateDraw(); + + return true; + //AMCAX::Point3 bb_min, bb_max_; + //brep_object->SetShape(*AMCAX::SubD::MeshMakeCube(bb_min, bb_max, segX_, segY_, segZ_).BuildMesh()); + } + +} \ No newline at end of file diff --git a/Src/Operation/CreateOperate_CubeMesh.h b/Src/Operation/CreateOperate_CubeMesh.h new file mode 100644 index 0000000..bad5d47 --- /dev/null +++ b/Src/Operation/CreateOperate_CubeMesh.h @@ -0,0 +1,36 @@ +/* =================================================================== +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* All rights reserved. +* +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* software under the terms of either license. +* +* For more information about the AGPLv3.0 license, please visit: +* https://www.gnu.org/licenses/agpl-3.0.html +* For licensing inquiries or to obtain a commercial license, please +* contact Hefei Jiushao Intelligent Technology Co., Ltd. +* =================================================================== +* Author: +*/ +#pragma once +#include "CreateOperate_Cube.h" + +namespace acamcad +{ + + class CreateOperate_CubeMesh : public CreateOperate_Cube + { + public: + //CreateOperate_Cube(); + CreateOperate_CubeMesh(const AMCAX::Coord3& bb_min, const AMCAX::Coord3& bb_max, size_t segX = 2, size_t segY = 2, size_t segZ = 2); + //virtual ~CreateOperate_CubeMesh(); + + public: + + virtual bool DoOperate(AdapterObject* brep_object) override; + + + }; + +} \ No newline at end of file diff --git a/Src/Operation/CreateOperate_CubeTSpline.cpp b/Src/Operation/CreateOperate_CubeTSpline.cpp new file mode 100644 index 0000000..8f18de8 --- /dev/null +++ b/Src/Operation/CreateOperate_CubeTSpline.cpp @@ -0,0 +1,34 @@ +#include "CreateOperate_CubeTSpline.h" + + +#include +#include + + +namespace acamcad +{ + + CreateOperate_CubeTSpline::CreateOperate_CubeTSpline(const AMCAX::Coord3& bb_min, const AMCAX::Coord3& bb_max, size_t segX, size_t segY, size_t segZ) + :CreateOperate_Cube(bb_min, bb_max, segX, segY, segZ) + { + } + + bool CreateOperate_CubeTSpline::DoOperate(AdapterObject* adapter) + { + + + AMCAX::Point3 bb_min = AMCAX::Point3(bb_min_.X(), bb_min_.Y(), bb_min_.Z()); + AMCAX::Point3 bb_max = AMCAX::Point3(bb_max_.X(), bb_max_.Y(), bb_max_.Z()); + + AMCAX::TMS::TMSplineMakeCube cube(bb_min, bb_max, segX_, segY_, segZ_); + + adapter->tSpline->setTSpline(cube.BuildSpline()); + //adapter->mesh->SetMesh(cube.BuildMesh()); + adapter->updateDraw(); + + return true; + //AMCAX::Point3 bb_min, bb_max_; + //brep_object->SetShape(*AMCAX::SubD::MeshMakeCube(bb_min, bb_max, segX_, segY_, segZ_).BuildMesh()); + } + +} \ No newline at end of file diff --git a/Src/Operation/CreateOperate_CubeTSpline.h b/Src/Operation/CreateOperate_CubeTSpline.h new file mode 100644 index 0000000..1aa4d78 --- /dev/null +++ b/Src/Operation/CreateOperate_CubeTSpline.h @@ -0,0 +1,36 @@ +/* =================================================================== +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* All rights reserved. +* +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* software under the terms of either license. +* +* For more information about the AGPLv3.0 license, please visit: +* https://www.gnu.org/licenses/agpl-3.0.html +* For licensing inquiries or to obtain a commercial license, please +* contact Hefei Jiushao Intelligent Technology Co., Ltd. +* =================================================================== +* Author: +*/ +#pragma once +#include "CreateOperate_Cube.h" + +namespace acamcad +{ + + class CreateOperate_CubeTSpline : public CreateOperate_Cube + { + public: + //CreateOperate_Cube(); + CreateOperate_CubeTSpline(const AMCAX::Coord3& bb_min, const AMCAX::Coord3& bb_max, size_t segX = 2, size_t segY = 2, size_t segZ = 2); + //virtual ~CreateOperate_CubeMesh(); + + public: + + virtual bool DoOperate(AdapterObject* brep_object) override; + + + }; + +} \ No newline at end of file diff --git a/Src/Operation/CreateOperate_Cylinder.cpp b/Src/Operation/CreateOperate_Cylinder.cpp index fc97931..2262c16 100644 --- a/Src/Operation/CreateOperate_Cylinder.cpp +++ b/Src/Operation/CreateOperate_Cylinder.cpp @@ -1,60 +1,62 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "CreateOperate_Cylinder.h" #include -namespace acamcad +namespace acamcad { -CreateOperate_Cylinder::CreateOperate_Cylinder(): - bottomCenter_(AMCAX::Coord3(0.0, 0.0, 0.0)), radius_(1.0), height_(1.0), axis_(0.0, 0.0, 1.0), xaxis_(NAN, NAN, NAN), angle_(0) -{ -} + CreateOperate_Cylinder::CreateOperate_Cylinder() : + bottomCenter_(AMCAX::Coord3(0.0, 0.0, 0.0)), radius_(1.0), height_(1.0), axis_(0.0, 0.0, 1.0), xaxis_(NAN, NAN, NAN), angle_(0) + { + } -CreateOperate_Cylinder::CreateOperate_Cylinder(const AMCAX::Coord3& bottomCenter, double radius, double height, const AMCAX::Coord3& axis, double angle): - bottomCenter_(bottomCenter), radius_(radius), height_(height), axis_(axis), xaxis_(NAN, NAN, NAN), angle_(angle) -{ -} + CreateOperate_Cylinder::CreateOperate_Cylinder(const AMCAX::Coord3& bottomCenter, double radius, double height, const AMCAX::Coord3& axis, double angle) : + bottomCenter_(bottomCenter), radius_(radius), height_(height), axis_(axis), xaxis_(NAN, NAN, NAN), angle_(angle) + { + } -CreateOperate_Cylinder::CreateOperate_Cylinder(const AMCAX::Coord3& bottomCenter, double radius, double height, const AMCAX::Coord3& axis, const AMCAX::Coord3& xaxis, double angle): - bottomCenter_(bottomCenter), radius_(radius), height_(height), axis_(axis), xaxis_(xaxis), angle_(angle) -{ + CreateOperate_Cylinder::CreateOperate_Cylinder(const AMCAX::Coord3& bottomCenter, double radius, double height, const AMCAX::Coord3& axis, const AMCAX::Coord3& xaxis, double angle) : + bottomCenter_(bottomCenter), radius_(radius), height_(height), axis_(axis), xaxis_(xaxis), angle_(angle) + { -} + } -CreateOperate_Cylinder::~CreateOperate_Cylinder() -{ -} + CreateOperate_Cylinder::~CreateOperate_Cylinder() + { + } -void CreateOperate_Cylinder::operateWithBRep(BRepObject *brep_object) -{ - AMCAX::Frame3 frameZ(AMCAX::Point3{bottomCenter_[0], bottomCenter_[1], bottomCenter_[2]}, - AMCAX::Direction3{axis_[0], axis_[1], axis_[2]}); + bool CreateOperate_Cylinder::DoOperate(AdapterObject* brep_object) + { + AMCAX::Frame3 frameZ(AMCAX::Point3{ bottomCenter_[0], bottomCenter_[1], bottomCenter_[2] }, + AMCAX::Direction3{ axis_[0], axis_[1], axis_[2] }); - AMCAX::Frame3 frameXZ(AMCAX::Point3{ bottomCenter_[0], bottomCenter_[1], bottomCenter_[2]}, - AMCAX::Direction3{axis_[0], axis_[1], axis_[2]}, - AMCAX::Direction3{xaxis_[0], xaxis_[1], xaxis_[2]}); + AMCAX::Frame3 frameXZ(AMCAX::Point3{ bottomCenter_[0], bottomCenter_[1], bottomCenter_[2] }, + AMCAX::Direction3{ axis_[0], axis_[1], axis_[2] }, + AMCAX::Direction3{ xaxis_[0], xaxis_[1], xaxis_[2] }); - AMCAX::MakeCylinder mc(std::isnan(xaxis_[0]) ? frameZ : frameXZ, radius_, height_, angle_); + AMCAX::MakeCylinder mc(std::isnan(xaxis_[0]) ? frameZ : frameXZ, radius_, height_, angle_); - brep_object->getShape() = mc.Shape(); - brep_object->updateDraw(); -} + brep_object->bRep->getShape() = mc.Shape(); + brep_object->updateDraw(); + + return true; + } } diff --git a/Src/Operation/CreateOperate_Cylinder.h b/Src/Operation/CreateOperate_Cylinder.h index b95ef84..0ce7d2e 100644 --- a/Src/Operation/CreateOperate_Cylinder.h +++ b/Src/Operation/CreateOperate_Cylinder.h @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #pragma once #include "MOperate.h" @@ -19,29 +19,29 @@ namespace acamcad { -class CreateOperate_Cylinder : public MOperation -{ -public: - CreateOperate_Cylinder(); - CreateOperate_Cylinder(const AMCAX::Coord3& bottomCenter, double radius, double height, const AMCAX::Coord3& xaxis, double angle); - CreateOperate_Cylinder(const AMCAX::Coord3& bottomCenter, double radius, double height, const AMCAX::Coord3& axis, const AMCAX::Coord3& xaxis, double angle); + class CreateOperate_Cylinder : public MOperation + { + public: + CreateOperate_Cylinder(); + CreateOperate_Cylinder(const AMCAX::Coord3& bottomCenter, double radius, double height, const AMCAX::Coord3& xaxis, double angle); + CreateOperate_Cylinder(const AMCAX::Coord3& bottomCenter, double radius, double height, const AMCAX::Coord3& axis, const AMCAX::Coord3& xaxis, double angle); - virtual ~CreateOperate_Cylinder(); + virtual ~CreateOperate_Cylinder(); -public: + public: - virtual void operateWithBRep(BRepObject *brep_object); + virtual bool DoOperate(AdapterObject* brep_object) override; -private: + private: - AMCAX::Coord3 bottomCenter_; - double radius_; - double height_; + AMCAX::Coord3 bottomCenter_; + double radius_; + double height_; - AMCAX::Coord3 axis_; - AMCAX::Coord3 xaxis_; + AMCAX::Coord3 axis_; + AMCAX::Coord3 xaxis_; - double angle_; -}; + double angle_; + }; } \ No newline at end of file diff --git a/Src/Operation/CreateOperate_CylinderTSpline.cpp b/Src/Operation/CreateOperate_CylinderTSpline.cpp new file mode 100644 index 0000000..7845c6a --- /dev/null +++ b/Src/Operation/CreateOperate_CylinderTSpline.cpp @@ -0,0 +1,28 @@ +#include "CreateOperate_CylinderTSpline.h" + +#include + +namespace acamcad +{ + + CreateOperate_CylinderTSpline::CreateOperate_CylinderTSpline(const MPoint3& b_center, const AMCAX::Vector3& axis, + double radius, double height, size_t rf_num, size_t vf_num, bool top, bool bottom) : + center_(b_center), axis_(axis), radius_(radius), height_(height), rf_num_(rf_num), vf_num_(vf_num), top_(top), bottom_(bottom) + {} + + bool CreateOperate_CylinderTSpline::DoOperate(AdapterObject* object) + { + AMCAX::Direction3 dir(axis_); + AMCAX::Frame3 frame(center_, dir); + + AMCAX::TMS::TMSplineMakeCylinder shape(frame, radius_, height_, top_, bottom_, rf_num_, vf_num_); + + object->tSpline->setTSpline(shape.BuildSpline()); + + object->updateDraw(); + + return true; + + + } +} \ No newline at end of file diff --git a/Src/Operation/CreateOperate_CylinderTSpline.h b/Src/Operation/CreateOperate_CylinderTSpline.h new file mode 100644 index 0000000..65f5c54 --- /dev/null +++ b/Src/Operation/CreateOperate_CylinderTSpline.h @@ -0,0 +1,49 @@ +/* =================================================================== +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* All rights reserved. +* +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* software under the terms of either license. +* +* For more information about the AGPLv3.0 license, please visit: +* https://www.gnu.org/licenses/agpl-3.0.html +* For licensing inquiries or to obtain a commercial license, please +* contact Hefei Jiushao Intelligent Technology Co., Ltd. +* =================================================================== +* Author: +*/ +#pragma once +#include "MOperate.h" + +namespace acamcad +{ + + class CreateOperate_CylinderTSpline : public MOperation + { + public: + //CreateOperate_Cylinder(); + CreateOperate_CylinderTSpline(const MPoint3& b_center, const AMCAX::Vector3& axis, + double radius, double height, size_t rf_num, size_t vf_num, bool top, + bool bottom); + //CreateOperate_Cylinder(const AMCAX::Coord3& bottomCenter, double radius, double height, const AMCAX::Coord3& axis, const AMCAX::Coord3& xaxis, double angle); + + //virtual ~CreateOperate_Cylinder(); + + public: + + virtual bool DoOperate(AdapterObject* brep_object) override; + + private: + + MPoint3 center_; + AMCAX::Vector3 axis_; + double radius_; + double height_; + size_t rf_num_; + size_t vf_num_; + bool top_; + bool bottom_; + }; + +} \ No newline at end of file diff --git a/Src/Operation/CreateOperate_Plane.cpp b/Src/Operation/CreateOperate_Plane.cpp index 8e864eb..ab9deaa 100644 --- a/Src/Operation/CreateOperate_Plane.cpp +++ b/Src/Operation/CreateOperate_Plane.cpp @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "CreateOperate_Plane.h" #include @@ -20,30 +20,32 @@ namespace acamcad { -CreateOperate_Plane::CreateOperate_Plane() : - p0_(0.0), p1_(1.0, 1.0), segU_(2), segV_(2) -{ + CreateOperate_Plane::CreateOperate_Plane() : + p0_(0.0), p1_(1.0, 1.0), segU_(2), segV_(2) + { -} + } -CreateOperate_Plane::CreateOperate_Plane(const AMCAX::Coord2& p0, const AMCAX::Coord2& p1, size_t u_seg, size_t v_seg) : - p0_(p0), p1_(p1), segU_(u_seg), segV_(v_seg) -{ + CreateOperate_Plane::CreateOperate_Plane(const AMCAX::Coord2& p0, const AMCAX::Coord2& p1, size_t u_seg, size_t v_seg) : + p0_(p0), p1_(p1), segU_(u_seg), segV_(v_seg) + { + } -} + CreateOperate_Plane::~CreateOperate_Plane() + { + } -CreateOperate_Plane::~CreateOperate_Plane() -{ -} + bool CreateOperate_Plane::DoOperate(AdapterObject* brep_object) + { -void CreateOperate_Plane::operateWithBRep(BRepObject* brep_object) -{ - double xmin = p0_.X(), xmax = p1_.Y(); - double ymin = p0_.Y(), ymax = p1_.Y(); + double xmin = p0_.X(), xmax = p1_.Y(); + double ymin = p0_.Y(), ymax = p1_.Y(); - brep_object->getShape() = AMCAX::MakeFace(AMCAX::Plane(), xmin, xmax, ymin, ymax); - brep_object->updateDraw(); -} + brep_object->bRep->getShape() = AMCAX::MakeFace(AMCAX::Plane(), xmin, xmax, ymin, ymax); + brep_object->bRep->updateDraw(); + + return true; + } } diff --git a/Src/Operation/CreateOperate_Plane.h b/Src/Operation/CreateOperate_Plane.h index 71ec00b..9e7b80b 100644 --- a/Src/Operation/CreateOperate_Plane.h +++ b/Src/Operation/CreateOperate_Plane.h @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #pragma once #include "MOperate.h" @@ -19,21 +19,21 @@ namespace acamcad { -class CreateOperate_Plane : public MOperation -{ -public: - CreateOperate_Plane(); - CreateOperate_Plane(const AMCAX::Coord2& p0, const AMCAX::Coord2& p1, size_t u_seg = 2, size_t v_seg = 2); - virtual ~CreateOperate_Plane(); + class CreateOperate_Plane : public MOperation + { + public: + CreateOperate_Plane(); + CreateOperate_Plane(const AMCAX::Coord2& p0, const AMCAX::Coord2& p1, size_t u_seg = 2, size_t v_seg = 2); + virtual ~CreateOperate_Plane(); -public: + public: - virtual void operateWithBRep(BRepObject* brep_object) override; + virtual bool DoOperate(AdapterObject* brep_object) override; -private: - AMCAX::Coord2 p0_, p1_; - size_t segU_, segV_; + protected: + AMCAX::Coord2 p0_, p1_; + size_t segU_, segV_; -}; + }; } \ No newline at end of file diff --git a/Src/Operation/CreateOperate_PlaneMesh.cpp b/Src/Operation/CreateOperate_PlaneMesh.cpp new file mode 100644 index 0000000..c451fee --- /dev/null +++ b/Src/Operation/CreateOperate_PlaneMesh.cpp @@ -0,0 +1,49 @@ +/* =================================================================== +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* All rights reserved. +* +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* software under the terms of either license. +* +* For more information about the AGPLv3.0 license, please visit: +* https://www.gnu.org/licenses/agpl-3.0.html +* For licensing inquiries or to obtain a commercial license, please +* contact Hefei Jiushao Intelligent Technology Co., Ltd. +* =================================================================== +* Author: +*/ +#include "CreateOperate_PlaneMesh.h" +#include +#include + +#include +#include + +namespace acamcad +{ + + CreateOperate_PlaneMesh::CreateOperate_PlaneMesh(const AMCAX::Coord2& p0, const AMCAX::Coord2& p1, size_t u_seg, size_t v_seg) : + CreateOperate_Plane(p0, p1, u_seg, v_seg) + { + } + + bool CreateOperate_PlaneMesh::DoOperate(AdapterObject* adapter) + { + //double xmin = p0_.X(), xmax = p1_.Y(); + //double ymin = p0_.Y(), ymax = p1_.Y(); + AMCAX::Point2 p0(p0_.X(), p0_.Y()), p1(p1_.X(), p1_.Y()); + + AMCAX::SubD::MeshMakeRectangle mesh(p0, p1, segU_, segV_); + + + adapter->mesh->SetMesh(mesh.BuildMesh()); + //brep_object->bRep->getShape() = AMCAX::MakeFace(AMCAX::Plane(), xmin, xmax, ymin, ymax); + //brep_object->bRep->updateDraw(); + + adapter->updateDraw(); + + return true; + } + +} \ No newline at end of file diff --git a/Src/Operation/CreateOperate_PlaneMesh.h b/Src/Operation/CreateOperate_PlaneMesh.h new file mode 100644 index 0000000..4d985bc --- /dev/null +++ b/Src/Operation/CreateOperate_PlaneMesh.h @@ -0,0 +1,37 @@ +/* =================================================================== +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* All rights reserved. +* +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* software under the terms of either license. +* +* For more information about the AGPLv3.0 license, please visit: +* https://www.gnu.org/licenses/agpl-3.0.html +* For licensing inquiries or to obtain a commercial license, please +* contact Hefei Jiushao Intelligent Technology Co., Ltd. +* =================================================================== +* Author: +*/ +#pragma once +#include "CreateOperate_Plane.h" +#include + +namespace acamcad +{ + + class CreateOperate_PlaneMesh : public CreateOperate_Plane + { + public: + //CreateOperate_Plane(); + CreateOperate_PlaneMesh(const AMCAX::Coord2& p0, const AMCAX::Coord2& p1, size_t u_seg = 2, size_t v_seg = 2); + //virtual ~CreateOperate_Plane(); + + public: + + virtual bool DoOperate(AdapterObject* brep_object) override; + + + }; + +} \ No newline at end of file diff --git a/Src/Operation/CreateOperate_PlaneTSpline.cpp b/Src/Operation/CreateOperate_PlaneTSpline.cpp new file mode 100644 index 0000000..bc3f3ac --- /dev/null +++ b/Src/Operation/CreateOperate_PlaneTSpline.cpp @@ -0,0 +1,50 @@ +/* =================================================================== +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* All rights reserved. +* +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* software under the terms of either license. +* +* For more information about the AGPLv3.0 license, please visit: +* https://www.gnu.org/licenses/agpl-3.0.html +* For licensing inquiries or to obtain a commercial license, please +* contact Hefei Jiushao Intelligent Technology Co., Ltd. +* =================================================================== +* Author: +*/ +#include "CreateOperate_PlaneTSpline.h" + +#include +#include "../Object/TSplineObject.h" + + +namespace acamcad +{ + + CreateOperate_PlaneTSpline::CreateOperate_PlaneTSpline(const AMCAX::Coord2& p0, const AMCAX::Coord2& p1, size_t u_seg, size_t v_seg) : + CreateOperate_Plane(p0, p1, u_seg, v_seg) + { + } + + bool CreateOperate_PlaneTSpline::DoOperate(AdapterObject* adapter) + { + //double xmin = p0_.X(), xmax = p1_.Y(); + //double ymin = p0_.Y(), ymax = p1_.Y(); + AMCAX::Point2 p0(p0_.X(), p0_.Y()), p1(p1_.X(), p1_.Y()); + + AMCAX::TMS::TMSplineMakeRectangle mesh(p0, p1, segU_, segV_); + + //AMCAX::SubD::MeshMakeRectangle mesh(p0, p1, segU_, segV_); + + + adapter->tSpline->setTSpline(mesh.BuildSpline()); + //brep_object->bRep->getShape() = AMCAX::MakeFace(AMCAX::Plane(), xmin, xmax, ymin, ymax); + //brep_object->bRep->updateDraw(); + + adapter->updateDraw(); + + return true; + } + +} \ No newline at end of file diff --git a/Src/Operation/CreateOperate_PlaneTSpline.h b/Src/Operation/CreateOperate_PlaneTSpline.h new file mode 100644 index 0000000..0c465d4 --- /dev/null +++ b/Src/Operation/CreateOperate_PlaneTSpline.h @@ -0,0 +1,37 @@ +/* =================================================================== +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* All rights reserved. +* +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* software under the terms of either license. +* +* For more information about the AGPLv3.0 license, please visit: +* https://www.gnu.org/licenses/agpl-3.0.html +* For licensing inquiries or to obtain a commercial license, please +* contact Hefei Jiushao Intelligent Technology Co., Ltd. +* =================================================================== +* Author: +*/ +#pragma once +#include "CreateOperate_Plane.h" +#include + +namespace acamcad +{ + + class CreateOperate_PlaneTSpline : public CreateOperate_Plane + { + public: + //CreateOperate_Plane(); + CreateOperate_PlaneTSpline(const AMCAX::Coord2& p0, const AMCAX::Coord2& p1, size_t u_seg = 2, size_t v_seg = 2); + //virtual ~CreateOperate_Plane(); + + public: + + virtual bool DoOperate(AdapterObject* brep_object) override; + + + }; + +} \ No newline at end of file diff --git a/Src/Operation/CreateOperate_Polygon.cpp b/Src/Operation/CreateOperate_Polygon.cpp index 3373a3f..ffb691c 100644 --- a/Src/Operation/CreateOperate_Polygon.cpp +++ b/Src/Operation/CreateOperate_Polygon.cpp @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "CreateOperate_Polygon.h" @@ -21,7 +21,7 @@ #include -acamcad::CreateOperate_Polygon::CreateOperate_Polygon(const std::vector& point_list): +acamcad::CreateOperate_Polygon::CreateOperate_Polygon(const std::vector& point_list) : point_list_(point_list) { } @@ -32,7 +32,7 @@ acamcad::CreateOperate_Polygon::~CreateOperate_Polygon() { } -void acamcad::CreateOperate_Polygon::operateWithBRep(BRepObject *brep_object) +bool acamcad::CreateOperate_Polygon::DoOperate(AdapterObject* brep_object) { const auto PTrans = [](const AMCAX::Coord3& P) { return AMCAX::Point3(P.X(), P.Y(), P.Z()); }; const auto VTrans = [](const AMCAX::Coord3& V) { return AMCAX::Vector3(V.X(), V.Y(), V.Z()); }; @@ -47,6 +47,8 @@ void acamcad::CreateOperate_Polygon::operateWithBRep(BRepObject *brep_object) AMCAX::MakeWire mkw; mkw.Add(edges); - brep_object->getShape() = AMCAX::MakeFace(mkw.Wire()); - brep_object->updateDraw(); + brep_object->bRep->getShape() = AMCAX::MakeFace(mkw.Wire()); + brep_object->bRep->updateDraw(); + + return false; } \ No newline at end of file diff --git a/Src/Operation/CreateOperate_Polygon.h b/Src/Operation/CreateOperate_Polygon.h index ee0bf3a..54c5674 100644 --- a/Src/Operation/CreateOperate_Polygon.h +++ b/Src/Operation/CreateOperate_Polygon.h @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #ifndef CREATEOPERATE_POLYGON_H #define CREATEOPERATE_POLYGON_H @@ -23,19 +23,19 @@ namespace acamcad { -class CreateOperate_Polygon : public MOperation -{ -public: - CreateOperate_Polygon(const std::vector& point_list); - virtual ~CreateOperate_Polygon(); + class CreateOperate_Polygon : public MOperation + { + public: + CreateOperate_Polygon(const std::vector& point_list); + virtual ~CreateOperate_Polygon(); -public: + public: - virtual void operateWithBRep(BRepObject *brep_object) override; + virtual bool DoOperate(AdapterObject* brep_object) override; -private: - std::vector point_list_; -}; + private: + std::vector point_list_; + }; } diff --git a/Src/Operation/CreateOperate_Prism.cpp b/Src/Operation/CreateOperate_Prism.cpp index fbf07c2..ff9f298 100644 --- a/Src/Operation/CreateOperate_Prism.cpp +++ b/Src/Operation/CreateOperate_Prism.cpp @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "CreateOperate_Prism.h" @@ -24,7 +24,7 @@ acamcad::CreateOperate_Prism::CreateOperate_Prism(const std::vector& point_list, - const AMCAX::Coord3&prism_vec): + const AMCAX::Coord3& prism_vec) : point_list_(point_list), prism_vec_(prism_vec) { } @@ -33,7 +33,7 @@ acamcad::CreateOperate_Prism::~CreateOperate_Prism() { } -void acamcad::CreateOperate_Prism::operateWithBRep(BRepObject *brep_object) +bool acamcad::CreateOperate_Prism::DoOperate(AdapterObject* brep_object) { const auto PTrans = [](const AMCAX::Coord3& P) { return AMCAX::Point3(P.X(), P.Y(), P.Z()); }; const auto VTrans = [](const AMCAX::Coord3& V) { return AMCAX::Vector3(V.X(), V.Y(), V.Z()); }; @@ -49,6 +49,8 @@ void acamcad::CreateOperate_Prism::operateWithBRep(BRepObject *brep_object) mkw.Add(edges); AMCAX::TopoFace base = AMCAX::MakeFace(mkw.Wire()); - brep_object->getShape() = AMCAX::MakePrism(base, VTrans(prism_vec_)); - brep_object->updateDraw(); + brep_object->bRep->getShape() = AMCAX::MakePrism(base, VTrans(prism_vec_)); + brep_object->bRep->updateDraw(); + + return true; } \ No newline at end of file diff --git a/Src/Operation/CreateOperate_Prism.h b/Src/Operation/CreateOperate_Prism.h index 890a559..14b49ee 100644 --- a/Src/Operation/CreateOperate_Prism.h +++ b/Src/Operation/CreateOperate_Prism.h @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #pragma once #include "CreateOperate.h" @@ -21,19 +21,19 @@ namespace acamcad { -class CreateOperate_Prism : public MOperation -{ -public: - CreateOperate_Prism(const std::vector& point_list, const AMCAX::Coord3 & prism_vec); - virtual ~CreateOperate_Prism(); + class CreateOperate_Prism : public MOperation + { + public: + CreateOperate_Prism(const std::vector& point_list, const AMCAX::Coord3& prism_vec); + virtual ~CreateOperate_Prism(); -public: + public: - virtual void operateWithBRep(BRepObject *brep_object) override; + virtual bool DoOperate(AdapterObject* brep_object) override; -private: - std::vector point_list_; - AMCAX::Coord3 prism_vec_; -}; + private: + std::vector point_list_; + AMCAX::Coord3 prism_vec_; + }; } \ No newline at end of file diff --git a/Src/Operation/CreateOperate_QuadballTSpline.cpp b/Src/Operation/CreateOperate_QuadballTSpline.cpp new file mode 100644 index 0000000..64bfad1 --- /dev/null +++ b/Src/Operation/CreateOperate_QuadballTSpline.cpp @@ -0,0 +1,24 @@ +#include "CreateOperate_QuadballTSpline.h" + +#include + +namespace acamcad +{ + CreateOperate_QuadballTSpline::CreateOperate_QuadballTSpline(AMCAX::Point3 center, double radius, size_t segment) : + center_(center), radius_(radius), seg_(segment) + { + } + + bool CreateOperate_QuadballTSpline::DoOperate(AdapterObject* object) + { + + + AMCAX::TMS::TMSplineMakeQuadball qb(center_, radius_, seg_); + + object->tSpline->setTSpline(qb.BuildSpline()); + + object->tSpline->updateDraw(); + + return true; + } +} \ No newline at end of file diff --git a/Src/Operation/CreateOperate_QuadballTSpline.h b/Src/Operation/CreateOperate_QuadballTSpline.h new file mode 100644 index 0000000..2ba6ab8 --- /dev/null +++ b/Src/Operation/CreateOperate_QuadballTSpline.h @@ -0,0 +1,26 @@ +#pragma once +#include "MOperate.h" + +namespace acamcad +{ + + class CreateOperate_QuadballTSpline : public MOperation + { + public: + //CreateOperate_Quadball(); + CreateOperate_QuadballTSpline(AMCAX::Point3 center, double radius, size_t segment); + //virtual ~CreateOperate_Quadball(); + + public: + virtual bool DoOperate(AdapterObject* object) override; + + //virtual void operateWithTSpline(TSplineUObject* tspline_object); + + private: + AMCAX::Point3 center_; + double radius_; + + size_t seg_; + }; + +} \ No newline at end of file diff --git a/Src/Operation/CreateOperate_RoundedPolygon.cpp b/Src/Operation/CreateOperate_RoundedPolygon.cpp index efa5a31..bb52c8f 100644 --- a/Src/Operation/CreateOperate_RoundedPolygon.cpp +++ b/Src/Operation/CreateOperate_RoundedPolygon.cpp @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "CreateOperate_RoundedPolygon.h" @@ -34,49 +34,52 @@ using namespace acamcad; -CreateOperate_RoundedPolygon::CreateOperate_RoundedPolygon(const std::vector& point_list): - MOperation(), point_list_(point_list) +CreateOperate_RoundedPolygon::CreateOperate_RoundedPolygon(const std::vector& point_list) : + MOperation(), point_list_(point_list) { - if (point_list_.size() % 2) - { // make it even - point_list_.pop_back(); - } + if (point_list_.size() % 2) + { // make it even + point_list_.pop_back(); + } } CreateOperate_RoundedPolygon::~CreateOperate_RoundedPolygon() { } -void CreateOperate_RoundedPolygon::operateWithBRep(BRepObject *brep_object) +bool CreateOperate_RoundedPolygon::DoOperate(AdapterObject* brep_object) { - const auto MTpo = [](const AMCAX::Coord3 &mp) -> AMCAX::Point3 { - return AMCAX::Point3(mp[0], mp[1], mp[2]); - }; - std::vector points(point_list_.size()); - std::transform(point_list_.begin(), point_list_.end(), points.begin(), MTpo); - if (points.size() >= 4) - { - std::vector> segments; - std::vector> arcs; - for (int i = 1; i < points.size(); i+=2) - { - segments.push_back(AMCAX::MakeSegment(points[i-1], - points[i])); - arcs.push_back(AMCAX::MakeArcOfCircle(points[i], - AMCAX::Vector3(points[i-1], points[i]), - points[(i+1)%points.size()])); - } - std::list edges; - for (int i = 0; i < segments.size() && i < arcs.size(); ++i) - { - edges.push_back(AMCAX::MakeEdge(segments[i])); - edges.push_back(AMCAX::MakeEdge(arcs[i])); - } - AMCAX::MakeWire makeWire; - makeWire.Add(edges); - AMCAX::TopoWire wire = makeWire.Wire(); + const auto MTpo = [](const AMCAX::Coord3& mp) -> AMCAX::Point3 { + return AMCAX::Point3(mp[0], mp[1], mp[2]); + }; + std::vector points(point_list_.size()); + std::transform(point_list_.begin(), point_list_.end(), points.begin(), MTpo); + if (points.size() >= 4) + { + std::vector> segments; + std::vector> arcs; + for (int i = 1; i < points.size(); i += 2) + { + segments.push_back(AMCAX::MakeSegment(points[i - 1], + points[i])); + arcs.push_back(AMCAX::MakeArcOfCircle(points[i], + AMCAX::Vector3(points[i - 1], points[i]), + points[(i + 1) % points.size()])); + } + std::list edges; + for (int i = 0; i < segments.size() && i < arcs.size(); ++i) + { + edges.push_back(AMCAX::MakeEdge(segments[i])); + edges.push_back(AMCAX::MakeEdge(arcs[i])); + } + AMCAX::MakeWire makeWire; + makeWire.Add(edges); + AMCAX::TopoWire wire = makeWire.Wire(); - brep_object->getShape() = AMCAX::MakeFace(wire); - brep_object->updateDraw(); - } + brep_object->bRep->getShape() = AMCAX::MakeFace(wire); + brep_object->bRep->updateDraw(); + } + + + return true; } diff --git a/Src/Operation/CreateOperate_RoundedPolygon.h b/Src/Operation/CreateOperate_RoundedPolygon.h index 20cfe21..3544158 100644 --- a/Src/Operation/CreateOperate_RoundedPolygon.h +++ b/Src/Operation/CreateOperate_RoundedPolygon.h @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #ifndef CREATEOPERATE_ROUNDEDPOLYGON_H #define CREATEOPERATE_ROUNDEDPOLYGON_H @@ -21,22 +21,22 @@ namespace acamcad { -class CreateOperate_RoundedPolygon: public MOperation -{ -public: - CreateOperate_RoundedPolygon(const std::vector& point_list); - ~CreateOperate_RoundedPolygon(); + class CreateOperate_RoundedPolygon : public MOperation + { + public: + CreateOperate_RoundedPolygon(const std::vector& point_list); + ~CreateOperate_RoundedPolygon(); + + public: + virtual bool DoOperate(AdapterObject* brep_object) override; + + private: + std::vector point_list_; -public: - virtual void operateWithBRep(BRepObject *brep_object) override; + }; -private: - std::vector point_list_; -}; - - } // namespace acamcad diff --git a/Src/Operation/CreateOperate_RoundedPrism.cpp b/Src/Operation/CreateOperate_RoundedPrism.cpp index a95aee3..4a86619 100644 --- a/Src/Operation/CreateOperate_RoundedPrism.cpp +++ b/Src/Operation/CreateOperate_RoundedPrism.cpp @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "CreateOperate_RoundedPrism.h" @@ -35,52 +35,55 @@ using namespace acamcad; -CreateOperate_RoundedPrism::CreateOperate_RoundedPrism(const std::vector& point_list, const AMCAX::Coord3 & prism_vec): - MOperation(), point_list_(point_list), prism_vec_(prism_vec) +CreateOperate_RoundedPrism::CreateOperate_RoundedPrism(const std::vector& point_list, const AMCAX::Coord3& prism_vec) : + MOperation(), point_list_(point_list), prism_vec_(prism_vec) { - if (point_list_.size() % 2) - { // make it even - point_list_.pop_back(); - } + if (point_list_.size() % 2) + { // make it even + point_list_.pop_back(); + } } CreateOperate_RoundedPrism::~CreateOperate_RoundedPrism() { } -void CreateOperate_RoundedPrism::operateWithBRep(BRepObject *brep_object) +bool CreateOperate_RoundedPrism::DoOperate(AdapterObject* brep_object) { - const auto MTpo = [](const AMCAX::Coord3 &mp) -> AMCAX::Point3 { - return AMCAX::Point3(mp[0], mp[1], mp[2]); - }; - const auto MTve = [](const AMCAX::Coord3 &mv) -> AMCAX::Vector3 { - return AMCAX::Vector3(mv[0], mv[1], mv[2]); - }; - std::vector points(point_list_.size()); - std::transform(point_list_.begin(), point_list_.end(), points.begin(), MTpo); - if (points.size() >= 4) - { - std::vector> segments; - std::vector> arcs; - for (int i = 1; i < points.size(); i+=2) - { - segments.push_back(AMCAX::MakeSegment(points[i-1], - points[i])); - arcs.push_back(AMCAX::MakeArcOfCircle(points[i], - AMCAX::Vector3(points[i-1], points[i]), - points[(i+1)%points.size()])); - } - std::list edges; - for (int i = 0; i < segments.size() && i < arcs.size(); ++i) - { - edges.push_back(AMCAX::MakeEdge(segments[i])); - edges.push_back(AMCAX::MakeEdge(arcs[i])); - } - AMCAX::MakeWire makeWire; - makeWire.Add(edges); - AMCAX::TopoWire wire = makeWire.Wire(); - AMCAX::TopoFace base = AMCAX::MakeFace(wire); - brep_object->getShape() = AMCAX::MakePrism(base, MTve(prism_vec_)); - brep_object->updateDraw(); - } + const auto MTpo = [](const AMCAX::Coord3& mp) -> AMCAX::Point3 { + return AMCAX::Point3(mp[0], mp[1], mp[2]); + }; + const auto MTve = [](const AMCAX::Coord3& mv) -> AMCAX::Vector3 { + return AMCAX::Vector3(mv[0], mv[1], mv[2]); + }; + std::vector points(point_list_.size()); + std::transform(point_list_.begin(), point_list_.end(), points.begin(), MTpo); + if (points.size() >= 4) + { + std::vector> segments; + std::vector> arcs; + for (int i = 1; i < points.size(); i += 2) + { + segments.push_back(AMCAX::MakeSegment(points[i - 1], + points[i])); + arcs.push_back(AMCAX::MakeArcOfCircle(points[i], + AMCAX::Vector3(points[i - 1], points[i]), + points[(i + 1) % points.size()])); + } + std::list edges; + for (int i = 0; i < segments.size() && i < arcs.size(); ++i) + { + edges.push_back(AMCAX::MakeEdge(segments[i])); + edges.push_back(AMCAX::MakeEdge(arcs[i])); + } + AMCAX::MakeWire makeWire; + makeWire.Add(edges); + AMCAX::TopoWire wire = makeWire.Wire(); + AMCAX::TopoFace base = AMCAX::MakeFace(wire); + brep_object->bRep->getShape() = AMCAX::MakePrism(base, MTve(prism_vec_)); + brep_object->bRep->updateDraw(); + } + + + return true; } diff --git a/Src/Operation/CreateOperate_RoundedPrism.h b/Src/Operation/CreateOperate_RoundedPrism.h index 05f86e0..2dabca4 100644 --- a/Src/Operation/CreateOperate_RoundedPrism.h +++ b/Src/Operation/CreateOperate_RoundedPrism.h @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #ifndef CREATEOPERATE_ROUNDEDPRISM_H #define CREATEOPERATE_ROUNDEDPRISM_H @@ -22,21 +22,21 @@ namespace acamcad { -class CreateOperate_RoundedPrism: public MOperation -{ -public: - CreateOperate_RoundedPrism(const std::vector& point_list, const AMCAX::Coord3 & prism_vec); - ~CreateOperate_RoundedPrism(); + class CreateOperate_RoundedPrism : public MOperation + { + public: + CreateOperate_RoundedPrism(const std::vector& point_list, const AMCAX::Coord3& prism_vec); + ~CreateOperate_RoundedPrism(); + + public: + virtual bool DoOperate(AdapterObject* brep_object) override; -public: - virtual void operateWithBRep(BRepObject *brep_object) override; + private: + std::vector point_list_; + const AMCAX::Coord3 prism_vec_; -private: - std::vector point_list_; - const AMCAX::Coord3 prism_vec_; + }; -}; - } // namespace acamcad diff --git a/Src/Operation/CreateOperate_SingleFace.cpp b/Src/Operation/CreateOperate_SingleFace.cpp index 7d076a0..c142e71 100644 --- a/Src/Operation/CreateOperate_SingleFace.cpp +++ b/Src/Operation/CreateOperate_SingleFace.cpp @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "CreateOperate_SingleFace.h" @@ -31,12 +31,16 @@ acamcad::CreateOperate_SingleFace::~CreateOperate_SingleFace() } -acamcad::BaseObject* acamcad::CreateOperate_SingleFace::operateWithBRep() +bool acamcad::CreateOperate_SingleFace::DoOperate(acamcad::AdapterObject* new_adapter) { auto PTrans = [](const AMCAX::Coord3& P) { return AMCAX::Point3(P.X(), P.Y(), P.Z()); }; - BRepObject* new_object = new BRepObject(); - new_object->assignBRep(); + //AdapterObject* new_adapter = new AdapterObject; + //new_adapter->setDataType(acamcad::DataType::BREP_TYPE); + //new_adapter->bRep = std::make_unique(new_adapter); + + ///BRepObject* new_object = new BRepObject(); + new_adapter->bRep->assignBRep(); std::list edges; for (int i = 1; i < point_list_.size(); ++i) @@ -48,7 +52,9 @@ acamcad::BaseObject* acamcad::CreateOperate_SingleFace::operateWithBRep() AMCAX::MakeWire mkw; mkw.Add(edges); - new_object->getShape() = AMCAX::MakeFace(mkw.Wire()); - new_object->updateDraw(); - return new_object; + new_adapter->bRep->getShape() = AMCAX::MakeFace(mkw.Wire()); + new_adapter->bRep->updateDraw(); + + return true; + ///return new_adapter; } \ No newline at end of file diff --git a/Src/Operation/CreateOperate_SingleFace.h b/Src/Operation/CreateOperate_SingleFace.h index df6de94..0cdb65b 100644 --- a/Src/Operation/CreateOperate_SingleFace.h +++ b/Src/Operation/CreateOperate_SingleFace.h @@ -1,35 +1,36 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #pragma once -#include "CreateOperate.h" +//#include "CreateOperate.h" +#include "MOperate.h" namespace acamcad { -class CreateOperate_SingleFace: public CreateOperate -{ -public: - CreateOperate_SingleFace(const std::vector& point_list); - virtual ~CreateOperate_SingleFace(); + class CreateOperate_SingleFace : public MOperation + { + public: + CreateOperate_SingleFace(const std::vector& point_list); + virtual ~CreateOperate_SingleFace(); -public: - virtual BaseObject* operateWithBRep() override; + public: + virtual bool DoOperate(AdapterObject* object) override; -private: - std::vector point_list_; -}; + protected: + std::vector point_list_; + }; } \ No newline at end of file diff --git a/Src/Operation/CreateOperate_SingleFaceMesh.cpp b/Src/Operation/CreateOperate_SingleFaceMesh.cpp new file mode 100644 index 0000000..55df5e6 --- /dev/null +++ b/Src/Operation/CreateOperate_SingleFaceMesh.cpp @@ -0,0 +1,28 @@ +#include "CreateOperate_SingleFaceMesh.h" +#include + +namespace acamcad +{ + CreateOperate_SingleFaceMesh::CreateOperate_SingleFaceMesh(const std::vector& point_list) : + CreateOperate_SingleFace(point_list) + { + } + + bool CreateOperate_SingleFaceMesh::DoOperate(AdapterObject* object) + { + object->mesh->assignMesh(); + + std::vector pList; + for (auto& iter : point_list_) + { + pList.push_back(MPoint3(iter)); + } + + AMCAX::SubD::MeshInsertFace::AddSingleFace(object->mesh->mesh(), pList); + + object->updateDraw(); + + return true; + } + +} \ No newline at end of file diff --git a/Src/Operation/CreateOperate_SingleFaceMesh.h b/Src/Operation/CreateOperate_SingleFaceMesh.h new file mode 100644 index 0000000..cd82ba6 --- /dev/null +++ b/Src/Operation/CreateOperate_SingleFaceMesh.h @@ -0,0 +1,34 @@ +/* =================================================================== +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* All rights reserved. +* +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* software under the terms of either license. +* +* For more information about the AGPLv3.0 license, please visit: +* https://www.gnu.org/licenses/agpl-3.0.html +* For licensing inquiries or to obtain a commercial license, please +* contact Hefei Jiushao Intelligent Technology Co., Ltd. +* =================================================================== +* Author: +*/ +#pragma once +//#include "CreateOperate.h" +#include "CreateOperate_SingleFace.h" + +namespace acamcad +{ + + class CreateOperate_SingleFaceMesh : public CreateOperate_SingleFace + { + public: + CreateOperate_SingleFaceMesh(const std::vector& point_list); + //virtual ~CreateOperate_SingleFaceMesh(); + + public: + virtual bool DoOperate(AdapterObject* object) override; + + }; + +} \ No newline at end of file diff --git a/Src/Operation/CreateOperate_SingleFaceTSpline.cpp b/Src/Operation/CreateOperate_SingleFaceTSpline.cpp new file mode 100644 index 0000000..5dabd82 --- /dev/null +++ b/Src/Operation/CreateOperate_SingleFaceTSpline.cpp @@ -0,0 +1,34 @@ +#include "CreateOperate_SingleFaceTSpline.h" + +#include +#include "../Object/TSplineObject.h" + +namespace acamcad +{ + CreateOperate_SingleFaceTSpline::CreateOperate_SingleFaceTSpline(const std::vector& point_list) : + CreateOperate_SingleFace(point_list) + { + } + + bool CreateOperate_SingleFaceTSpline::DoOperate(AdapterObject* object) + { + object->tSpline->assignTSpline(); + + std::vector pList; + for (auto& iter : point_list_) + { + pList.push_back(MPoint3(iter)); + } + + bool result = AMCAX::TMS::TMSplineAddFace().AddSingleFace(object->tSpline->getTSpline(), pList); + + //AMCAX::SubD::MeshInsertFace::AddSingleFace(object->mesh->mesh(), pList); + + object->updateDraw(); + + + + return result; + } + +} \ No newline at end of file diff --git a/Src/Operation/CreateOperate_SingleFaceTSpline.h b/Src/Operation/CreateOperate_SingleFaceTSpline.h new file mode 100644 index 0000000..6bd3c13 --- /dev/null +++ b/Src/Operation/CreateOperate_SingleFaceTSpline.h @@ -0,0 +1,34 @@ +/* =================================================================== +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* All rights reserved. +* +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* software under the terms of either license. +* +* For more information about the AGPLv3.0 license, please visit: +* https://www.gnu.org/licenses/agpl-3.0.html +* For licensing inquiries or to obtain a commercial license, please +* contact Hefei Jiushao Intelligent Technology Co., Ltd. +* =================================================================== +* Author: +*/ +#pragma once +//#include "CreateOperate.h" +#include "CreateOperate_SingleFace.h" + +namespace acamcad +{ + + class CreateOperate_SingleFaceTSpline : public CreateOperate_SingleFace + { + public: + CreateOperate_SingleFaceTSpline(const std::vector& point_list); + //virtual ~CreateOperate_SingleFaceMesh(); + + public: + virtual bool DoOperate(AdapterObject* object) override; + + }; + +} \ No newline at end of file diff --git a/Src/Operation/CreateOperate_Sphere.cpp b/Src/Operation/CreateOperate_Sphere.cpp index cc80422..ea661e0 100644 --- a/Src/Operation/CreateOperate_Sphere.cpp +++ b/Src/Operation/CreateOperate_Sphere.cpp @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "CreateOperate_Sphere.h" #include @@ -38,10 +38,12 @@ namespace acamcad { } - void CreateOperate_Sphere::operateWithBRep(BRepObject* brep_object) + bool CreateOperate_Sphere::DoOperate(AdapterObject* brep_object) { - brep_object->getShape() = AMCAX::MakeSphere(AMCAX::Point3(center_[0], center_[1], center_[2]), radius_, angle1_); + brep_object->bRep->getShape() = AMCAX::MakeSphere(AMCAX::Point3(center_[0], center_[1], center_[2]), radius_, angle1_); brep_object->updateDraw(); + + return true; } diff --git a/Src/Operation/CreateOperate_Sphere.h b/Src/Operation/CreateOperate_Sphere.h index 483a1bf..79272e1 100644 --- a/Src/Operation/CreateOperate_Sphere.h +++ b/Src/Operation/CreateOperate_Sphere.h @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #pragma once #include "MOperate.h" @@ -19,28 +19,28 @@ namespace acamcad { -//TODO, remove MSphere; + //TODO, remove MSphere; -class CreateOperate_Sphere : public MOperation -{ -public: - CreateOperate_Sphere(); - CreateOperate_Sphere(const AMCAX::Coord3& center, double radius, size_t rotation_seg, size_t vertical_seg); - CreateOperate_Sphere(const AMCAX::Coord3& center, double radius, double angle1, double angle2, double angle3); + class CreateOperate_Sphere : public MOperation + { + public: + CreateOperate_Sphere(); + CreateOperate_Sphere(const AMCAX::Coord3& center, double radius, size_t rotation_seg, size_t vertical_seg); + CreateOperate_Sphere(const AMCAX::Coord3& center, double radius, double angle1, double angle2, double angle3); - virtual ~CreateOperate_Sphere(); + virtual ~CreateOperate_Sphere(); -public: + public: - virtual void operateWithBRep(BRepObject* brep_object); + virtual bool DoOperate(AdapterObject* brep_object) override; -private: + protected: - AMCAX::Coord3 center_; - double radius_; + AMCAX::Coord3 center_; + double radius_; - size_t segR_, segV_; - double angle1_, angle2_, angle3_; -}; + size_t segR_, segV_; + double angle1_, angle2_, angle3_; + }; } diff --git a/Src/Operation/CreateOperate_SphereTSpline.cpp b/Src/Operation/CreateOperate_SphereTSpline.cpp new file mode 100644 index 0000000..e338595 --- /dev/null +++ b/Src/Operation/CreateOperate_SphereTSpline.cpp @@ -0,0 +1,49 @@ +/* =================================================================== +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* All rights reserved. +* +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* software under the terms of either license. +* +* For more information about the AGPLv3.0 license, please visit: +* https://www.gnu.org/licenses/agpl-3.0.html +* For licensing inquiries or to obtain a commercial license, please +* contact Hefei Jiushao Intelligent Technology Co., Ltd. +* =================================================================== +* Author: +*/ +#include "CreateOperate_SphereTSpline.h" + +#include + +namespace acamcad +{ + + CreateOperate_SphereTSpline::CreateOperate_SphereTSpline(const AMCAX::Coord3& center, double radius, size_t rotation_seg, size_t vertical_seg) : + CreateOperate_Sphere(center, radius, rotation_seg, vertical_seg) + { + } + + bool CreateOperate_SphereTSpline::DoOperate(AdapterObject* adapter) + { + //brep_object->bRep->getShape() = AMCAX::MakeSphere(AMCAX::Point3(center_[0], center_[1], center_[2]), radius_, angle1_); + //brep_object->updateDraw(); + AMCAX::TMS::TMSplineMakeSphere sphre(radius_, segR_, segV_); + + adapter->tSpline->setTSpline(sphre.BuildSpline()); + + adapter->mesh_OPvert_Backup(); + adapter->meshMove(center_, AMCAX::Point3(center_).Distance(AMCAX::Point3(0.0, 0.0, 0.0))); + adapter->mesh_Clear_OPvertBackup(); + + adapter->updateDraw(); + + return true; + } + + +} + + + diff --git a/Src/Operation/CreateOperate_SphereTSpline.h b/Src/Operation/CreateOperate_SphereTSpline.h new file mode 100644 index 0000000..597eac3 --- /dev/null +++ b/Src/Operation/CreateOperate_SphereTSpline.h @@ -0,0 +1,38 @@ +/* =================================================================== +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* All rights reserved. +* +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* software under the terms of either license. +* +* For more information about the AGPLv3.0 license, please visit: +* https://www.gnu.org/licenses/agpl-3.0.html +* For licensing inquiries or to obtain a commercial license, please +* contact Hefei Jiushao Intelligent Technology Co., Ltd. +* =================================================================== +* Author: +*/ +#pragma once +#include "CreateOperate_Sphere.h" + +namespace acamcad +{ + + //TODO, remove MSphere; + + class CreateOperate_SphereTSpline : public CreateOperate_Sphere + { + public: + //CreateOperate_Sphere(); + CreateOperate_SphereTSpline(const AMCAX::Coord3& center, double radius, size_t rotation_seg, size_t vertical_seg); + //CreateOperate_Sphere(const AMCAX::Coord3& center, double radius, double angle1, double angle2, double angle3); + + //virtual ~CreateOperate_Sphere(); + + public: + + virtual bool DoOperate(AdapterObject* brep_object) override; + }; + +} diff --git a/Src/Operation/CreateOperate_Torus.cpp b/Src/Operation/CreateOperate_Torus.cpp index c6637fa..ca8000d 100644 --- a/Src/Operation/CreateOperate_Torus.cpp +++ b/Src/Operation/CreateOperate_Torus.cpp @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "CreateOperate_Torus.h" #include @@ -39,7 +39,7 @@ namespace acamcad { } - void CreateOperate_Torus::operateWithBRep(BRepObject* brep_object) + bool CreateOperate_Torus::DoOperate(AdapterObject* brep_object) { AMCAX::Frame3 frameZ(AMCAX::Point3{ center_[0], center_[1], center_[2] }, AMCAX::Direction3{ axis_[0], axis_[1], axis_[2] }); @@ -50,8 +50,10 @@ namespace acamcad AMCAX::MakeTorus mkTorus(std::isnan(xaxis_[0]) ? frameZ : frameXZ, radiusMajor_, radiusMinor_, angle_); - brep_object->getShape() = mkTorus.Shape(); + brep_object->bRep->getShape() = mkTorus.Shape(); brep_object->updateDraw(); + + return true; } diff --git a/Src/Operation/CreateOperate_Torus.h b/Src/Operation/CreateOperate_Torus.h index a232c85..c4e3463 100644 --- a/Src/Operation/CreateOperate_Torus.h +++ b/Src/Operation/CreateOperate_Torus.h @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #pragma once #include "MOperate.h" @@ -20,27 +20,27 @@ namespace acamcad { -class CreateOperate_Torus : public MOperation -{ -public: - CreateOperate_Torus(); + class CreateOperate_Torus : public MOperation + { + public: + CreateOperate_Torus(); - CreateOperate_Torus(const AMCAX::Coord3& center, double radiusMajor, double radiusMinor, const AMCAX::Coord3& axis, double angle); - CreateOperate_Torus(const AMCAX::Coord3& center, double radiusMajor, double radiusMinor, const AMCAX::Coord3& axis, const AMCAX::Coord3& xaxis, double angle); + CreateOperate_Torus(const AMCAX::Coord3& center, double radiusMajor, double radiusMinor, const AMCAX::Coord3& axis, double angle); + CreateOperate_Torus(const AMCAX::Coord3& center, double radiusMajor, double radiusMinor, const AMCAX::Coord3& axis, const AMCAX::Coord3& xaxis, double angle); - virtual ~CreateOperate_Torus(); + virtual ~CreateOperate_Torus(); -public: - virtual void operateWithBRep(BRepObject* brep_object); + public: + virtual bool DoOperate(AdapterObject* brep_object) override; -private: - AMCAX::Coord3 center_; double radiusMajor_; double radiusMinor_; + private: + AMCAX::Coord3 center_; double radiusMajor_; double radiusMinor_; - AMCAX::Coord3 axis_; - AMCAX::Coord3 xaxis_; - size_t segR_, segV_; + AMCAX::Coord3 axis_; + AMCAX::Coord3 xaxis_; + size_t segR_, segV_; - double angle_; -}; + double angle_; + }; } diff --git a/Src/Operation/CreateOperate_TorusTSpline.cpp b/Src/Operation/CreateOperate_TorusTSpline.cpp new file mode 100644 index 0000000..eb5e6cf --- /dev/null +++ b/Src/Operation/CreateOperate_TorusTSpline.cpp @@ -0,0 +1,28 @@ +#include "CreateOperate_TorusTSpline.h" + +#include +#include + +namespace acamcad +{ + CreateOperate_TorusTSpline::CreateOperate_TorusTSpline(const AMCAX::Coord3& center, + const AMCAX::Coord3& axis, double radiusMajor, double radiusMinor, size_t segMajor, size_t segMinor) : + center_(center), axis_(axis), radiusMajor_(radiusMajor), radiusMinor_(radiusMinor), + segMajor_(segMajor), segMinor_(segMinor) + { + } + + bool CreateOperate_TorusTSpline::DoOperate(AdapterObject* object) + { + AMCAX::Direction3 dir(axis_); + AMCAX::Point3 p(center_); + AMCAX::Frame3 frame(p, dir); + AMCAX::TMS::TMSplineMakeTorus torus(frame, radiusMajor_, radiusMinor_, segMajor_, segMinor_); + + object->tSpline->setTSpline(torus.BuildSpline()); + + object->tSpline->updateDraw(); + + return true; + } +} \ No newline at end of file diff --git a/Src/Operation/CreateOperate_TorusTSpline.h b/Src/Operation/CreateOperate_TorusTSpline.h new file mode 100644 index 0000000..e30d93b --- /dev/null +++ b/Src/Operation/CreateOperate_TorusTSpline.h @@ -0,0 +1,42 @@ +/* =================================================================== +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* All rights reserved. +* +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* software under the terms of either license. +* +* For more information about the AGPLv3.0 license, please visit: +* https://www.gnu.org/licenses/agpl-3.0.html +* For licensing inquiries or to obtain a commercial license, please +* contact Hefei Jiushao Intelligent Technology Co., Ltd. +* =================================================================== +* Author: +*/ +#pragma once +#include "MOperate.h" +#include + +namespace acamcad +{ + + class CreateOperate_TorusTSpline : public MOperation + { + public: + //CreateOperate_Torus(); + + CreateOperate_TorusTSpline(const AMCAX::Coord3& center, const AMCAX::Coord3& axis, double radiusMajor, double radiusMinor, size_t segMajor, size_t segMinor); + //CreateOperate_Torus(const AMCAX::Coord3& center, double radiusMajor, double radiusMinor, const AMCAX::Coord3& axis, const AMCAX::Coord3& xaxis, double angle); + + //virtual ~CreateOperate_Torus(); + + public: + virtual bool DoOperate(AdapterObject* brep_object) override; + + private: + AMCAX::Coord3 center_, axis_; + double radiusMajor_, radiusMinor_; + size_t segMajor_, segMinor_; + }; + +} diff --git a/Src/Operation/CreateOperate_Wedge.cpp b/Src/Operation/CreateOperate_Wedge.cpp index 1bf1dd2..85089d2 100644 --- a/Src/Operation/CreateOperate_Wedge.cpp +++ b/Src/Operation/CreateOperate_Wedge.cpp @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "CreateOperate_Wedge.h" @@ -19,56 +19,56 @@ using namespace acamcad; #include -CreateOperate_Wedge::CreateOperate_Wedge(): type_(TYPE_NONE) +CreateOperate_Wedge::CreateOperate_Wedge() : type_(TYPE_NONE) { } -CreateOperate_Wedge::CreateOperate_Wedge(const double dx, const double dy, const double dz, const double ltx): - type_(TYPE_ARG_DX_DY_DZ_LTX), axis_(.0, .0, 1.0), dx_(dx), dy_(dy), dz_(dz), ltx_(ltx) +CreateOperate_Wedge::CreateOperate_Wedge(const double dx, const double dy, const double dz, const double ltx) : + type_(TYPE_ARG_DX_DY_DZ_LTX), axis_(.0, .0, 1.0), dx_(dx), dy_(dy), dz_(dz), ltx_(ltx) { - + } -CreateOperate_Wedge::CreateOperate_Wedge(const AMCAX::Coord3 & center, - const double dx, const double dy, const double dz, const double ltx): - type_(TYPE_ARG_C_DX_DY_DZ_LTX), center_(center), axis_(.0, .0, 1.0), dx_(dx), dy_(dy), dz_(dz), ltx_(ltx) +CreateOperate_Wedge::CreateOperate_Wedge(const AMCAX::Coord3& center, + const double dx, const double dy, const double dz, const double ltx) : + type_(TYPE_ARG_C_DX_DY_DZ_LTX), center_(center), axis_(.0, .0, 1.0), dx_(dx), dy_(dy), dz_(dz), ltx_(ltx) { } -CreateOperate_Wedge::CreateOperate_Wedge(const AMCAX::Coord3 & center, const AMCAX::Coord3 & axis, - const double dx, const double dy, const double dz, const double ltx): - type_(TYPE_ARG_C_A_DX_DY_DZ_LTX), center_(center), axis_(axis), dx_(dx), dy_(dy), dz_(dz), ltx_(ltx) +CreateOperate_Wedge::CreateOperate_Wedge(const AMCAX::Coord3& center, const AMCAX::Coord3& axis, + const double dx, const double dy, const double dz, const double ltx) : + type_(TYPE_ARG_C_A_DX_DY_DZ_LTX), center_(center), axis_(axis), dx_(dx), dy_(dy), dz_(dz), ltx_(ltx) { } CreateOperate_Wedge::CreateOperate_Wedge(const double dx, const double dy, const double dz, - const double xmin, const double zmin, const double xmax, const double zmax): - type_(TYPE_ARG_DX_DY_DZ_XI_ZI_XA_ZA), axis_(.0, .0, 1.0), - dx_(dx), dy_(dy), dz_(dz), xmin_(xmin), zmin_(zmin), xmax_(xmax), zmax_(zmax) + const double xmin, const double zmin, const double xmax, const double zmax) : + type_(TYPE_ARG_DX_DY_DZ_XI_ZI_XA_ZA), axis_(.0, .0, 1.0), + dx_(dx), dy_(dy), dz_(dz), xmin_(xmin), zmin_(zmin), xmax_(xmax), zmax_(zmax) { } -CreateOperate_Wedge::CreateOperate_Wedge(const AMCAX::Coord3 & center, - const double dx, const double dy, const double dz, - const double xmin, const double zmin, const double xmax, const double zmax): - type_(TYPE_ARG_C_DX_DY_DZ_XI_ZI_XA_ZA), center_(center), axis_(.0, .0, 1.0), - dx_(dx), dy_(dy), dz_(dz), xmin_(xmin), zmin_(zmin), xmax_(xmax), zmax_(zmax) +CreateOperate_Wedge::CreateOperate_Wedge(const AMCAX::Coord3& center, + const double dx, const double dy, const double dz, + const double xmin, const double zmin, const double xmax, const double zmax) : + type_(TYPE_ARG_C_DX_DY_DZ_XI_ZI_XA_ZA), center_(center), axis_(.0, .0, 1.0), + dx_(dx), dy_(dy), dz_(dz), xmin_(xmin), zmin_(zmin), xmax_(xmax), zmax_(zmax) { } -CreateOperate_Wedge::CreateOperate_Wedge(const AMCAX::Coord3 & center, const AMCAX::Coord3 & axis, - const double dx, const double dy, - const double dz, - const double xmin, const double zmin, const double xmax, const double zmax): - type_(TYPE_ARG_C_A_DX_DY_DZ_XI_ZI_XA_ZA), center_(center), axis_(axis), - dx_(dx), dy_(dy), dz_(dz), xmin_(xmin), zmin_(zmin), xmax_(xmax), zmax_(zmax) +CreateOperate_Wedge::CreateOperate_Wedge(const AMCAX::Coord3& center, const AMCAX::Coord3& axis, + const double dx, const double dy, + const double dz, + const double xmin, const double zmin, const double xmax, const double zmax) : + type_(TYPE_ARG_C_A_DX_DY_DZ_XI_ZI_XA_ZA), center_(center), axis_(axis), + dx_(dx), dy_(dy), dz_(dz), xmin_(xmin), zmin_(zmin), xmax_(xmax), zmax_(zmax) { - + } CreateOperate_Wedge::~CreateOperate_Wedge() @@ -76,49 +76,52 @@ CreateOperate_Wedge::~CreateOperate_Wedge() } -void CreateOperate_Wedge::operateWithBRep(BRepObject *brep_object) +bool CreateOperate_Wedge::DoOperate(AdapterObject* brep_object) { - AMCAX::Frame3 frame; - AMCAX::Point3 center(center_.X(), center_.Y(), center_.Z()); - AMCAX::Direction3 dir(axis_.X(), axis_.Y(), axis_.Z()); - - if (type_ == TYPE_ARG_C_DX_DY_DZ_LTX || TYPE_ARG_C_DX_DY_DZ_XI_ZI_XA_ZA) - { - frame.SetLocation(center); - } else if (type_ == TYPE_ARG_C_A_DX_DY_DZ_LTX && type_ == TYPE_ARG_C_A_DX_DY_DZ_XI_ZI_XA_ZA) - { - frame.SetLocation(center); - frame.SetDirection(dir); - } - - AMCAX::TopoShape shape; - - switch (type_) - { - case TYPE_ARG_DX_DY_DZ_LTX: - { - shape = AMCAX::MakeWedge(dx_, dy_, dz_, ltx_); - } - break; - case TYPE_ARG_C_DX_DY_DZ_LTX: [[fallthrough]]; - case TYPE_ARG_C_A_DX_DY_DZ_LTX: - { - shape = AMCAX::MakeWedge(frame, dx_, dy_, dz_, ltx_); - } - break; - case TYPE_ARG_DX_DY_DZ_XI_ZI_XA_ZA: - { - shape = AMCAX::MakeWedge(dx_, dy_, dz_, xmin_, zmin_, xmax_, zmax_); - } - break; - case TYPE_ARG_C_DX_DY_DZ_XI_ZI_XA_ZA: [[fallthrough]]; - case TYPE_ARG_C_A_DX_DY_DZ_XI_ZI_XA_ZA: - { - shape = AMCAX::MakeWedge(frame, dx_, dy_, dz_, xmin_, zmin_, xmax_, zmax_); - } - break; - default: - return; - } - brep_object->getShape() = shape; + AMCAX::Frame3 frame; + AMCAX::Point3 center(center_.X(), center_.Y(), center_.Z()); + AMCAX::Direction3 dir(axis_.X(), axis_.Y(), axis_.Z()); + + if (type_ == TYPE_ARG_C_DX_DY_DZ_LTX || TYPE_ARG_C_DX_DY_DZ_XI_ZI_XA_ZA) + { + frame.SetLocation(center); + } + else if (type_ == TYPE_ARG_C_A_DX_DY_DZ_LTX && type_ == TYPE_ARG_C_A_DX_DY_DZ_XI_ZI_XA_ZA) + { + frame.SetLocation(center); + frame.SetDirection(dir); + } + + AMCAX::TopoShape shape; + + switch (type_) + { + case TYPE_ARG_DX_DY_DZ_LTX: + { + shape = AMCAX::MakeWedge(dx_, dy_, dz_, ltx_); + } + break; + case TYPE_ARG_C_DX_DY_DZ_LTX: [[fallthrough]]; + case TYPE_ARG_C_A_DX_DY_DZ_LTX: + { + shape = AMCAX::MakeWedge(frame, dx_, dy_, dz_, ltx_); + } + break; + case TYPE_ARG_DX_DY_DZ_XI_ZI_XA_ZA: + { + shape = AMCAX::MakeWedge(dx_, dy_, dz_, xmin_, zmin_, xmax_, zmax_); + } + break; + case TYPE_ARG_C_DX_DY_DZ_XI_ZI_XA_ZA: [[fallthrough]]; + case TYPE_ARG_C_A_DX_DY_DZ_XI_ZI_XA_ZA: + { + shape = AMCAX::MakeWedge(frame, dx_, dy_, dz_, xmin_, zmin_, xmax_, zmax_); + } + break; + default: + return false; + } + brep_object->bRep->getShape() = shape; + + return false; } diff --git a/Src/Operation/CreateOperate_Wedge.h b/Src/Operation/CreateOperate_Wedge.h index f585fda..ed70fd3 100644 --- a/Src/Operation/CreateOperate_Wedge.h +++ b/Src/Operation/CreateOperate_Wedge.h @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #ifndef CREATEOPERATE_WEDGE_H #define CREATEOPERATE_WEDGE_H @@ -21,46 +21,46 @@ namespace acamcad { -class CreateOperate_Wedge: public MOperation -{ -public: - CreateOperate_Wedge(); - CreateOperate_Wedge(const double dx, const double dy, const double dz, const double ltx); - CreateOperate_Wedge(const AMCAX::Coord3 & center, - const double dx, const double dy, const double dz, const double ltx); - CreateOperate_Wedge(const AMCAX::Coord3 & center, const AMCAX::Coord3 & axis, - const double dx, const double dy, const double dz, const double ltx); - CreateOperate_Wedge(const double dx, const double dy, const double dz, - const double xmin, const double zmin, const double xmax, const double zmax); - CreateOperate_Wedge(const AMCAX::Coord3 & center, - const double dx, const double dy, const double dz, - const double xmin, const double zmin, const double xmax, const double zmax); - CreateOperate_Wedge(const AMCAX::Coord3 & center, const AMCAX::Coord3 & axis, - const double dx, const double dy, const double dz, - const double xmin, const double zmin, const double xmax, const double zmax); - ~CreateOperate_Wedge(); + class CreateOperate_Wedge : public MOperation + { + public: + CreateOperate_Wedge(); + CreateOperate_Wedge(const double dx, const double dy, const double dz, const double ltx); + CreateOperate_Wedge(const AMCAX::Coord3& center, + const double dx, const double dy, const double dz, const double ltx); + CreateOperate_Wedge(const AMCAX::Coord3& center, const AMCAX::Coord3& axis, + const double dx, const double dy, const double dz, const double ltx); + CreateOperate_Wedge(const double dx, const double dy, const double dz, + const double xmin, const double zmin, const double xmax, const double zmax); + CreateOperate_Wedge(const AMCAX::Coord3& center, + const double dx, const double dy, const double dz, + const double xmin, const double zmin, const double xmax, const double zmax); + CreateOperate_Wedge(const AMCAX::Coord3& center, const AMCAX::Coord3& axis, + const double dx, const double dy, const double dz, + const double xmin, const double zmin, const double xmax, const double zmax); + ~CreateOperate_Wedge(); -public: - virtual void operateWithBRep(BRepObject *brep_object) override; + public: + virtual bool DoOperate(AdapterObject* brep_object) override; -private: - enum TYPE - { - TYPE_NONE, - TYPE_ARG_DX_DY_DZ_LTX, - TYPE_ARG_C_DX_DY_DZ_LTX, - TYPE_ARG_C_A_DX_DY_DZ_LTX, - TYPE_ARG_DX_DY_DZ_XI_ZI_XA_ZA, - TYPE_ARG_C_DX_DY_DZ_XI_ZI_XA_ZA, - TYPE_ARG_C_A_DX_DY_DZ_XI_ZI_XA_ZA, - } type_; + private: + enum TYPE + { + TYPE_NONE, + TYPE_ARG_DX_DY_DZ_LTX, + TYPE_ARG_C_DX_DY_DZ_LTX, + TYPE_ARG_C_A_DX_DY_DZ_LTX, + TYPE_ARG_DX_DY_DZ_XI_ZI_XA_ZA, + TYPE_ARG_C_DX_DY_DZ_XI_ZI_XA_ZA, + TYPE_ARG_C_A_DX_DY_DZ_XI_ZI_XA_ZA, + } type_; - double dx_, dy_, dz_; - double ltx_; - double xmin_, xmax_, zmin_, zmax_; - AMCAX::Coord3 center_; - AMCAX::Coord3 axis_; -}; + double dx_, dy_, dz_; + double ltx_; + double xmin_, xmax_, zmin_, zmax_; + AMCAX::Coord3 center_; + AMCAX::Coord3 axis_; + }; } #endif // CREATEOPERATE_WEDGE_H diff --git a/Src/Operation/MOperate.cpp b/Src/Operation/MOperate.cpp index 0ac8ecf..ebafb83 100644 --- a/Src/Operation/MOperate.cpp +++ b/Src/Operation/MOperate.cpp @@ -1,38 +1,48 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "MOperate.h" +#include + namespace acamcad { -MOperation::MOperation() : selmodel_(SelectModel::OBJECT_MODEL) -{ -} -MOperation::MOperation(const SelectModel& smodel) : selmodel_(smodel) -{ -} + MOperation::MOperation() : selmodel_(SelectModel::OBJECT_MODEL) + { + } + MOperation::MOperation(const SelectModel& smodel) : selmodel_(smodel) + { + } -void MOperation::operateWithBRep(BRepObject* brep_object) -{ -// Massage::Error("MOperation::operateWithBRep -- this type can not do this operation"); -} + bool MOperation::operate(AdapterObject* object) + { + bool result = false; + try { + result = DoOperate(object); + } + catch (std::exception e) { + std::cout << "error:" << e.what() << "!!!" << std::endl; + } -void MOperation::setSelectModel(const SelectModel& smodle) -{ - selmodel_ = smodle; -} + return result; + } + + void MOperation::setSelectModel(const SelectModel& smodle) + { + selmodel_ = smodle; + } } diff --git a/Src/Operation/MOperate.h b/Src/Operation/MOperate.h index c960f49..1c0fc63 100644 --- a/Src/Operation/MOperate.h +++ b/Src/Operation/MOperate.h @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #pragma once #include "../Object/ObjectDefine.h" @@ -21,26 +21,29 @@ namespace acamcad { -class MOperation -{ -public: - MOperation(); - MOperation(const SelectModel& smodel); - virtual ~MOperation() {}; + class MOperation + { + public: + MOperation(); + MOperation(const SelectModel& smodel); + virtual ~MOperation() {}; + + public: -public: + bool operate(AdapterObject* object); - virtual void operateWithBRep(BRepObject* brep_object); + protected: + virtual bool DoOperate(AdapterObject* object) = 0; -public: - virtual MeshOperationType OperationType() { return MeshOperationType::NO_operotion; } + public: + virtual MeshOperationType OperationType() { return MeshOperationType::NO_operotion; } -public: - virtual void setSelectModel(const SelectModel& smodle); + public: + virtual void setSelectModel(const SelectModel& smodle); -protected: - SelectModel selmodel_; -}; + protected: + SelectModel selmodel_; + }; }// acamcad \ No newline at end of file diff --git a/Src/Operation/MOperate_Select.cpp b/Src/Operation/MOperate_Select.cpp index aff7c62..137bcd9 100644 --- a/Src/Operation/MOperate_Select.cpp +++ b/Src/Operation/MOperate_Select.cpp @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "MOperate_Select.h" @@ -31,70 +31,33 @@ MOperation_Select::MOperation_Select(const SelectModel& smodle) { } -void acamcad::MOperation_Select::operateWithBRep(BRepObject* brep_object) +bool acamcad::MOperation_Select::DoOperate(AdapterObject* adapter) { - s_info_.object_subselect_id_ = -1; - if (selmodel_ == SelectModel::VERTEX_MODEL) + switch (selmodel_) { - AMCAX::TopoVertex vMin; - double min_dis = std::numeric_limits::max(); - AMCAX::Coord3 ve_min; - - AMCAX::TopoShape f = brep_object->getShapeFaces()[s_info_.object_subpart_id_]; - for (AMCAX::TopoExplorer expV(f, AMCAX::ShapeType::Vertex); expV.More(); expV.Next()) - { - AMCAX::TopoVertex v = static_cast(expV.Current()); - AMCAX::Point3 p = AMCAX::TopoTool::Point(v); - double len = MathUtils::distPointLineSquared(p.Coord(), s_info_.c_begin_, s_info_.c_end_, ve_min); - if (min_dis > len) - { - min_dis = len; - vMin = v; - } - } - - if (min_dis < 0.01) - s_info_.object_subselect_id_ = brep_object->getShapeVertices().index(vMin); - - return; - } - else if (selmodel_ == SelectModel::EDGE_MODEL) + case acamcad::SelectModel::VERTEX_MODEL: + case acamcad::SelectModel::EDGE_MODEL: + //case acamcad::SelectModel::FACE_MODEL: { - AMCAX::TopoEdge eMin; - double min_dis = std::numeric_limits::max(); - AMCAX::Coord3 ve_min(0.0, 0.0, 0.0), vL_min(0.0, 0.0, 0.0); + void (AdapterObject:: * ptr[3])(const MVector3 & begin, const MVector3 & end, int f_id, int& se_id) { + &AdapterObject::selectVertWithFaceId, & AdapterObject::selectEdgeWithFaceId + }; - AMCAX::TopoShape f = brep_object->getShapeFaces()[s_info_.object_subpart_id_]; - for (AMCAX::TopoExplorer expE(f, AMCAX::ShapeType::Edge); expE.More(); expE.Next()) - { - const AMCAX::TopoEdge& e = static_cast(expE.Current()); - AMCAX::TopoLocation loc; - std::shared_ptr triMesh; - std::shared_ptr polyMesh; - AMCAX::TopoTool::PolygonOnTriangulation(e, polyMesh, triMesh, loc); - const AMCAX::Transformation3& tr = loc.Transformation(); - for (int pid = 1; pid < polyMesh->NVertices(); ++pid) - { - const AMCAX::Point3& p0 = triMesh->Vertex(polyMesh->Vertex(pid - 1)).Transformed(tr); - const AMCAX::Point3& p1 = triMesh->Vertex(polyMesh->Vertex(pid)).Transformed(tr); + AMCAX::Vector3 begin(s_info_.c_begin_), + end(s_info_.c_end_); - double len = MathUtils::distLine_SLineSquared(p0.Coord(), p1.Coord(), s_info_.c_begin_, s_info_.c_end_, ve_min, vL_min); - if (len < min_dis) - { - min_dis = len; - eMin = e; - } - } - } + (adapter->*ptr[(size_t)selmodel_])(begin, end, s_info_.object_subpart_id_, s_info_.object_subselect_id_); - if (min_dis < 0.01) - s_info_.object_subselect_id_ = brep_object->getShapeEdges().index(eMin); - - return; } - else if (selmodel_ == SelectModel::FACE_MODEL) - { + break; + case acamcad::SelectModel::FACE_MODEL: s_info_.object_subselect_id_ = s_info_.object_subpart_id_; + break; + default: + break; } + + return true; + } diff --git a/Src/Operation/MOperate_Select.h b/Src/Operation/MOperate_Select.h index 1ced4ff..36ee469 100644 --- a/Src/Operation/MOperate_Select.h +++ b/Src/Operation/MOperate_Select.h @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #pragma once #include "MOperate_SelectInfoCamera.h" @@ -19,15 +19,15 @@ namespace acamcad { -class MOperation_Select : public MOperate_SelectInfoCamera -{ -public: - MOperation_Select(const SelectModel& smodle); - virtual ~MOperation_Select() {}; + class MOperation_Select : public MOperate_SelectInfoCamera + { + public: + MOperation_Select(const SelectModel& smodle); + virtual ~MOperation_Select() {}; -public: - virtual void operateWithBRep(BRepObject* brep_object) override; + public: + virtual bool DoOperate(AdapterObject* brep_object) override; -}; + }; } //namespace acamcad \ No newline at end of file diff --git a/Src/Operation/MOperate_SelectCloset.cpp b/Src/Operation/MOperate_SelectCloset.cpp new file mode 100644 index 0000000..91729dd --- /dev/null +++ b/Src/Operation/MOperate_SelectCloset.cpp @@ -0,0 +1,114 @@ +#include "MOperate_SelectCloset.h" + +#include +#include + +#include "../Utils/MathUtils.h" + +acamcad::MOperation_SelectCloset::MOperation_SelectCloset(const SelectModel& smodle) + :MOperation(smodle) +{ +} + +bool acamcad::MOperation_SelectCloset::DoOperate(AdapterObject* adapter) +{ + /* + if (selmodel_ == SelectModel::VERTEX_MODEL) + { + Mesh_GetInfo::getVertCenter(mesh_object->mesh(), closet_, object_element_id_); + } + if (selmodel_ == SelectModel::EDGE_MODEL) + { + polymesh::MEdge* e = mesh_object->mesh()->edge(object_element_id_); + + MVector3 ev0 = e->getVert(0)->position(); + MVector3 ev1 = e->getVert(1)->position(); + MVector3 min_vL; + + MVector3 closet_temp; + double dis = distLine_SLineSquared(ev0, ev1, begin_, end_, closet_temp, min_vL); + closet_ = closet_temp.point(); + } + if (selmodel_ == SelectModel::FACE_MODEL) + { + Mesh_GetInfo::getFaceCenter(mesh_object->mesh(), closet_, object_element_id_); + } + */ + if (adapter->dataType() == DataType::BREP_TYPE) + return false; + + + switch (selmodel_) + { + case acamcad::SelectModel::VERTEX_MODEL: + { + //closet_ = AMCAX::SubD::MeshTool::Position(adapter->mesh->mesh(), object_element_id_); + AMCAX::Coord3 coord0; + adapter->GetBoundingBoxByVetex(object_element_id_, coord0); + + closet_.SetCoord(coord0); + } + break; + case acamcad::SelectModel::EDGE_MODEL: + { + AMCAX::Coord3 point0, point1, coord0, coord1; + + adapter->GetBoundingBoxByEdge(object_element_id_, point0, point1); + + double len = MathUtils::distLine_SLineSquared(point0, point1, + begin_, end_, coord0, coord1); + closet_ = AMCAX::Point3(coord0); + + + } + break; + case acamcad::SelectModel::FACE_MODEL: + { + AMCAX::Coord3 min, max; + adapter->GetBoundingBoxByFace(object_element_id_, min, max); + closet_ = AMCAX::Point3((min + max) / 2); + } + break; + default: + break; + } + + + + + return false; +} + +/* +void acamcad::MOperation_SelectCloset::operateWithTSpline(TSplineObject* tspline_object) +{ + if (selmodel_ == SelectModel::VERTEX_MODEL) + { + closet_ = tspline_object->getTSpline()->getVertCenter(object_element_id_); + } + if (selmodel_ == SelectModel::EDGE_MODEL) + { + tspline::TEdge* e = tspline_object->getTSpline()->edge(object_element_id_); + + MVector3 ev0 = e->getVert(0)->controlPosition(); + MVector3 ev1 = e->getVert(1)->controlPosition(); + MVector3 min_vL; + + MVector3 closet_temp; + double dis = distLine_SLineSquared(ev0, ev1, begin_, end_, closet_temp, min_vL); + closet_ = closet_temp.point(); + } + if (selmodel_ == SelectModel::FACE_MODEL) + { + closet_ = tspline_object->getTSpline()->getFaceCenter(object_element_id_); + } +} +*/ + +void acamcad::MOperation_SelectCloset::setSelectInfoCamera(const SelectInfoWithCamera& s_info) +{ + object_id_ = s_info.object_id_; + object_element_id_ = s_info.object_subselect_id_; + begin_ = s_info.c_begin_; + end_ = s_info.c_end_; +} diff --git a/Src/Operation/MOperate_SelectCloset.h b/Src/Operation/MOperate_SelectCloset.h new file mode 100644 index 0000000..bfc5a54 --- /dev/null +++ b/Src/Operation/MOperate_SelectCloset.h @@ -0,0 +1,36 @@ +#pragma once +#include "MOperate.h" + +namespace acamcad +{ + + /// + /// 根据选择信息获取其center + /// + class MOperation_SelectCloset : public MOperation + { + public: + MOperation_SelectCloset(const SelectModel& smodle); + virtual ~MOperation_SelectCloset() {}; + + public: + virtual bool DoOperate(AdapterObject* adapter) override; + + //virtual void operateWithTSpline(TSplineObject* tspline_object) override; + + public: + void setSelectInfoCamera(const SelectInfoWithCamera& s_info); + + MPoint3 getCloset() { return closet_; } + + private: + int object_id_; + int object_element_id_; + + AMCAX::Coord3 begin_; + AMCAX::Coord3 end_; + MPoint3 closet_; + + }; + +} //namespace acamcad \ No newline at end of file diff --git a/Src/Operation/MOperate_SelectInfo.h b/Src/Operation/MOperate_SelectInfo.h index 977f77f..6c09905 100644 --- a/Src/Operation/MOperate_SelectInfo.h +++ b/Src/Operation/MOperate_SelectInfo.h @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #pragma once #include "MOperate.h" @@ -20,31 +20,33 @@ namespace acamcad { -class MOperate_SingleObject : public MOperation -{ -public: - MOperate_SingleObject(const SelectModel& smodle); - virtual ~MOperate_SingleObject() { s_info_list_.clear(); } + class MOperate_SingleObject : public MOperation + { + public: + MOperate_SingleObject(const SelectModel& smodle); + virtual ~MOperate_SingleObject() { s_info_list_.clear(); } + + virtual bool DoOperate(AdapterObject* object) override { return false; }; -public: - virtual void setOperateId(int object_id, const std::vector& s_info_list ); - virtual void setselectInfo(const std::vector& s_info_list ); + public: + virtual void setOperateId(int object_id, const std::vector& s_info_list); + virtual void setselectInfo(const std::vector& s_info_list); - virtual std::vector getSelectInfoNew() const; - virtual std::vector getOperateIdNew() const; + virtual std::vector getSelectInfoNew() const; + virtual std::vector getOperateIdNew() const; -public: - virtual void setParameter() {}; - virtual void setParameter(const AMCAX::Coord3 & direction) {}; - virtual void setParameter(const AMCAX::Coord3 & center, const AMCAX::Coord3 & axis) {}; - virtual void setParameter(const std::vector& related_point) {}; + public: + virtual void setParameter() {}; + virtual void setParameter(const AMCAX::Coord3& direction) {}; + virtual void setParameter(const AMCAX::Coord3& center, const AMCAX::Coord3& axis) {}; + virtual void setParameter(const std::vector& related_point) {}; - virtual AMCAX::Coord3 getDirection() { return AMCAX::Coord3(); } - virtual AMCAX::Coord3 getCoord3Direction() { return AMCAX::Coord3(); } + virtual AMCAX::Coord3 getDirection() { return AMCAX::Coord3(); } + virtual AMCAX::Coord3 getCoord3Direction() { return AMCAX::Coord3(); } -protected: - std::vector s_info_list_; + protected: + std::vector s_info_list_; -}; + }; } //namespace acamcad \ No newline at end of file diff --git a/Src/Operation/MOperate_getBoundingBox.cpp b/Src/Operation/MOperate_getBoundingBox.cpp index b45168b..3fcb4ab 100644 --- a/Src/Operation/MOperate_getBoundingBox.cpp +++ b/Src/Operation/MOperate_getBoundingBox.cpp @@ -1,21 +1,22 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "MOperate_getBoundingBox.h" #include #include +#include namespace acamcad { @@ -24,45 +25,97 @@ namespace acamcad { { } - void MOperation_getBoundingBox::operateWithBRep(BRepObject* brep_object) + bool MOperation_getBoundingBox::DoOperate(AdapterObject* brep_object) { - AMCAX::BoundingBox3 box; - if (selmodel_ == SelectModel::OBJECT_MODEL) + //AMCAX::BoundingBox3 box; + AMCAX::Coord3 min, max; + + switch (selmodel_) + { + case SelectModel::OBJECT_MODEL: { - AMCAX::BRepBoundingBox::AddToBox(brep_object->getShape(), box); + + brep_object->GetBoundingBox(min, max); } - else if (selmodel_ == SelectModel::FACE_MODEL) + break; + case SelectModel::FACE_MODEL: { std::vector s_id_list = getSelectSubList(s_info_list_); for (int i = 0; i < s_id_list.size(); i++) { - AMCAX::BRepBoundingBox::AddToBox(brep_object->getShapeFaces()[s_id_list[i]], box); + AMCAX::Coord3 t_min, t_max; + brep_object->GetBoundingBoxByFace(i, t_min, t_max); + if (i == 0) { + min = t_min; + max = t_max; + } + else + { + min.SetCoord(std::min(t_min.X(), min.X()), std::min(t_min.Y(), min.X()), std::min(t_min.Z(), min.Z())); + max.SetCoord(std::max(t_max.X(), max.X()), std::max(t_max.Y(), max.Y()), std::max(t_max.Z(), max.Z())); + } + + //AMCAX::BRepBoundingBox::AddToBox(brep_object->bRep->getShapeFaces()[s_id_list[i]], box); } } - else if (selmodel_ == SelectModel::EDGE_MODEL) + break; + case SelectModel::EDGE_MODEL: { std::vector s_id_list = getSelectSubList(s_info_list_); for (int i = 0; i < s_id_list.size(); i++) { - AMCAX::BRepBoundingBox::AddToBox(brep_object->getShapeEdges()[s_id_list[i]], box); + AMCAX::Coord3 t_min, t_max; + brep_object->GetBoundingBoxByEdge(i, t_min, t_max); + + //AMCAX::BRepBoundingBox::AddToBox(brep_object->bRep->getShapeEdges()[s_id_list[i]], box); + if (i == 0) { + min = t_min; + max = t_max; + } + else + { + min.SetCoord(std::min(t_min.X(), min.X()), + std::min(t_min.Y(), min.X()), std::min(t_min.Z(), min.Z())); + max.SetCoord(std::max(t_max.X(), + max.X()), std::max(t_max.Y(), max.Y()), std::max(t_max.Z(), max.Z())); + } + } } - else if (selmodel_ == SelectModel::VERTEX_MODEL) + break; + case SelectModel::VERTEX_MODEL: { std::vector s_id_list = getSelectSubList(s_info_list_); for (int i = 0; i < s_id_list.size(); i++) { - AMCAX::BRepBoundingBox::AddToBox(brep_object->getShapeVertices()[s_id_list[i]], box); + AMCAX::Coord3 t_position; + brep_object->GetBoundingBoxByVetex(i, t_position); + if (i == 0) { + min = max = t_position; + } + else + { + min.SetCoord(std::min(t_position.X(), min.X()), + std::min(t_position.Y(), min.X()), std::min(t_position.Z(), min.Z())); + max.SetCoord(std::max(t_position.X(), max.X()), + std::max(t_position.Y(), max.Y()), std::max(t_position.Z(), max.Z())); + } + //AMCAX::BRepBoundingBox::AddToBox(brep_object->bRep->getShapeVertices()[s_id_list[i]], box); } } + break; + default: + break; + } - bbox_ = AMCAX::BoundingBox3(box.CornerMin(), box.CornerMax()); + bbox_ = AMCAX::BoundingBox3(AMCAX::Point3(min.X(), min.Y(), min.Z()), AMCAX::Point3(max.X(), max.Y(), max.Z())); + return false; } void MOperation_getBoundingBox::getBoundingBox(AMCAX::Coord3& bb_min, AMCAX::Coord3& bb_max) const { - bb_min = bbox_.CornerMin().Coord(); + bb_min = bbox_.CornerMin().Coord(); bb_max = bbox_.CornerMax().Coord(); } diff --git a/Src/Operation/MOperate_getBoundingBox.h b/Src/Operation/MOperate_getBoundingBox.h index 65b6f8b..adfb99b 100644 --- a/Src/Operation/MOperate_getBoundingBox.h +++ b/Src/Operation/MOperate_getBoundingBox.h @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #pragma once #include "MOperate_SelectInfo.h" @@ -19,25 +19,25 @@ namespace acamcad { -/// -/// 根据选择信息获取其当前的BoundingBox -/// -class MOperation_getBoundingBox : public MOperate_SingleObject -{ -public: - MOperation_getBoundingBox(const SelectModel& smodle); - virtual ~MOperation_getBoundingBox() {}; + /// + /// 根据选择信息获取其当前的BoundingBox + /// + class MOperation_getBoundingBox : public MOperate_SingleObject + { + public: + MOperation_getBoundingBox(const SelectModel& smodle); + virtual ~MOperation_getBoundingBox() {}; -public: + public: - virtual void operateWithBRep(BRepObject* brep_object) override; + virtual bool DoOperate(AdapterObject* brep_object) override; -public: - AMCAX::BoundingBox3 getBoundingBox() const { return bbox_; } - void getBoundingBox(AMCAX::Coord3& bb_min, AMCAX::Coord3& bb_max) const; + public: + AMCAX::BoundingBox3 getBoundingBox() const { return bbox_; } + void getBoundingBox(AMCAX::Coord3& bb_min, AMCAX::Coord3& bb_max) const; -private: - AMCAX::BoundingBox3 bbox_; -}; + private: + AMCAX::BoundingBox3 bbox_; + }; } //namespace acamcad \ No newline at end of file diff --git a/Src/Operation/MOperate_getCenter.cpp b/Src/Operation/MOperate_getCenter.cpp index 0f5e670..179f9b2 100644 --- a/Src/Operation/MOperate_getCenter.cpp +++ b/Src/Operation/MOperate_getCenter.cpp @@ -1,21 +1,24 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "MOperate_getCenter.h" #include +#include +#include + acamcad::MOperation_getCenter::MOperation_getCenter(const SelectModel& smodle) :MOperation(smodle) { @@ -23,20 +26,48 @@ acamcad::MOperation_getCenter::MOperation_getCenter(const SelectModel& smodle) -void acamcad::MOperation_getCenter::operateWithBRep(BRepObject* brep_object) +bool acamcad::MOperation_getCenter::DoOperate(AdapterObject* adapter) { - AMCAX::BoundingBox3 box; - if (selmodel_ == SelectModel::OBJECT_MODEL) - AMCAX::BRepBoundingBox::AddToBox(brep_object->getShape(), box); - else if (selmodel_ == SelectModel::FACE_MODEL) - AMCAX::BRepBoundingBox::AddToBox(brep_object->getShapeFaces()[object_element_id_], box); - else if (selmodel_ == SelectModel::EDGE_MODEL) - AMCAX::BRepBoundingBox::AddToBox(brep_object->getShapeEdges()[object_element_id_], box); - else if (selmodel_ == SelectModel::VERTEX_MODEL) - AMCAX::BRepBoundingBox::AddToBox(brep_object->getShapeVertices()[object_element_id_], box); - - AMCAX::Coord3 c(box.CornerMin().Coord() * 0.5 + box.CornerMax().Coord() * 0.5); - center_ = c; + + switch (selmodel_) + { + case acamcad::SelectModel::VERTEX_MODEL: + { + AMCAX::Coord3 position; + adapter->GetBoundingBoxByVetex(object_element_id_, position); + + center_ = position; + } + break; + case acamcad::SelectModel::EDGE_MODEL: + { + AMCAX::Coord3 min, max; + adapter->GetBoundingBoxByEdge(object_element_id_, min, max); + center_ = (min + max) / 2; + } + break; + case acamcad::SelectModel::FACE_MODEL: + { + AMCAX::Coord3 min, max; + + adapter->GetBoundingBoxByFace(object_element_id_, min, max); + center_ = (min + max) / 2; + } + break; + case acamcad::SelectModel::OBJECT_MODEL: + { + AMCAX::Coord3 min, max; + adapter->GetBoundingBox(min, max); + center_ = (min + max) / 2; + } + break; + default: + break; + } + + return false; + + } void acamcad::MOperation_getCenter::setOperateId(const SelectInfo& s_info) diff --git a/Src/Operation/MOperate_getCenter.h b/Src/Operation/MOperate_getCenter.h index dbc41a8..31623f1 100644 --- a/Src/Operation/MOperate_getCenter.h +++ b/Src/Operation/MOperate_getCenter.h @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #pragma once #include "MOperate.h" @@ -19,31 +19,31 @@ namespace acamcad { -/// -/// 根据选择信息获取其center -/// -class MOperation_getCenter : public MOperation -{ -public: - MOperation_getCenter(const SelectModel& smodle); - virtual ~MOperation_getCenter() {}; + /// + /// 根据选择信息获取其center + /// + class MOperation_getCenter : public MOperation + { + public: + MOperation_getCenter(const SelectModel& smodle); + virtual ~MOperation_getCenter() {}; -public: + public: - virtual void operateWithBRep(BRepObject* brep_object) override; + virtual bool DoOperate(AdapterObject* brep_object) override; -public: - void setOperateId(const SelectInfo& s_info); - void setSelectInfoCamera(const SelectInfoWithCamera& s_info); + public: + void setOperateId(const SelectInfo& s_info); + void setSelectInfoCamera(const SelectInfoWithCamera& s_info); - AMCAX::Coord3 getCenter() { return center_; } + AMCAX::Coord3 getCenter() { return center_; } -private: - int object_id_; - int object_element_id_; + private: + int object_id_; + int object_element_id_; - AMCAX::Coord3 center_; + AMCAX::Coord3 center_; -}; + }; } //namespace acamcad \ No newline at end of file diff --git a/Src/Operation/MOperate_getDirection.cpp b/Src/Operation/MOperate_getDirection.cpp index 9531a24..fb04555 100644 --- a/Src/Operation/MOperate_getDirection.cpp +++ b/Src/Operation/MOperate_getDirection.cpp @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "MOperate_getDirection.h" @@ -25,56 +25,91 @@ #include #include -namespace acamcad -{ +#include -MOperation_getDirection::MOperation_getDirection(const SelectModel& smodle) - :MOperate_SingleObject(smodle) +namespace acamcad { -} + MOperation_getDirection::MOperation_getDirection(const SelectModel& smodle) + :MOperate_SingleObject(smodle) + { + } -void MOperation_getDirection::operateWithBRep(BRepObject* brep_object) -{ - direction_ = AMCAX::Coord3(0.0, 0.0, 1.0); - if (s_info_list_.empty()) - return; - int s_id = s_info_list_[0].object_subselect_id_; - if (selmodel_ == SelectModel::EDGE_MODEL) + bool MOperation_getDirection::DoOperate(AdapterObject* adapter) { - //TODO: get More good info; + direction_ = AMCAX::Coord3(0.0, 0.0, 1.0); + if (s_info_list_.empty()) + return false; + int s_id = s_info_list_[0].object_subselect_id_; - const AMCAX::TopoEdge& e = static_cast(brep_object->getShapeEdges()[s_id]); + if (selmodel_ == SelectModel::EDGE_MODEL) + { + //TODO: get More good info; + switch (adapter->dataType()) + { + case acamcad::DataType::BREP_TYPE: + { + const AMCAX::TopoEdge& e = static_cast(adapter->bRep->getShapeEdges()[s_id]); - double cf, cl; - std::shared_ptr C = AMCAX::TopoTool::Curve(e, cf, cl); - if (C->Type() == AMCAX::CurveType::TrimmedCurve) - C = std::dynamic_pointer_cast(C)->BasisCurve(); + double cf, cl; + std::shared_ptr C = AMCAX::TopoTool::Curve(e, cf, cl); + if (C->Type() == AMCAX::CurveType::TrimmedCurve) + C = std::dynamic_pointer_cast(C)->BasisCurve(); - AMCAX::Direction3 dir; - if (C->Type() == AMCAX::CurveType::Line) - dir = std::dynamic_pointer_cast(C)->Direction(); + AMCAX::Direction3 dir; + if (C->Type() == AMCAX::CurveType::Line) + dir = std::dynamic_pointer_cast(C)->Direction(); - direction_ = AMCAX::Coord3(dir.X(), dir.Y(), dir.Z()); - } - else if (selmodel_ == SelectModel::FACE_MODEL) - { - //TODO: get More good info; + direction_ = AMCAX::Coord3(dir.X(), dir.Y(), dir.Z()); + } + break; + case acamcad::DataType::MESH_TYPE: + { + int id0, id1; + AMCAX::SubD::MeshTool::EdgeVertexIndexs(adapter->mesh->mesh(), s_id, id0, id1); + AMCAX::Point3 p0 = AMCAX::SubD::MeshTool::Position(adapter->mesh->mesh(), id0), + p1 = AMCAX::SubD::MeshTool::Position(adapter->mesh->mesh(), id1); + + direction_ = (p1.Coord() - p0.Coord()).Normalized(); + } + break; + default: + break; + } + } + else if (selmodel_ == SelectModel::FACE_MODEL) + { + //TODO: get More good info; + switch (adapter->dataType()) + { + case acamcad::DataType::BREP_TYPE: + { + const AMCAX::TopoFace& f = static_cast(adapter->bRep->getShapeFaces()[s_id]); + + std::shared_ptr S = AMCAX::TopoTool::Surface(f); + if (S->Type() == AMCAX::SurfaceType::TrimmedSurface) + S = std::dynamic_pointer_cast(S)->BasisSurface(); - const AMCAX::TopoFace& f = static_cast(brep_object->getShapeFaces()[s_id]); - - std::shared_ptr S = AMCAX::TopoTool::Surface(f); - if (S->Type() == AMCAX::SurfaceType::TrimmedSurface) - S = std::dynamic_pointer_cast(S)->BasisSurface(); + AMCAX::Frame3 frame; + if (S->Type() == AMCAX::SurfaceType::Plane) + frame = std::dynamic_pointer_cast(S)->Position(); - AMCAX::Frame3 frame; - if (S->Type() == AMCAX::SurfaceType::Plane) - frame = std::dynamic_pointer_cast(S)->Position(); + AMCAX::Direction3 dir = frame.Direction(); + direction_ = frame.Direction().Coord(); + } + break; + case acamcad::DataType::MESH_TYPE: + { + direction_ = AMCAX::SubD::MeshTool::FaceNormal(adapter->mesh->mesh(), s_id).Coord().Normalized(); + } + break; + default: + break; + } + } - AMCAX::Direction3 dir = frame.Direction(); - direction_ = frame.Direction().Coord(); + return false; } -} } \ No newline at end of file diff --git a/Src/Operation/MOperate_getDirection.h b/Src/Operation/MOperate_getDirection.h index ff7ecc8..2955d7d 100644 --- a/Src/Operation/MOperate_getDirection.h +++ b/Src/Operation/MOperate_getDirection.h @@ -1,41 +1,41 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #pragma once #include "MOperate_SelectInfo.h" namespace acamcad { -/// -/// 根据选择信息获取一个方向 -/// -class MOperation_getDirection : public MOperate_SingleObject -{ -public: - MOperation_getDirection(const SelectModel& smodle); - virtual ~MOperation_getDirection() {}; + /// + /// 根据选择信息获取一个方向 + /// + class MOperation_getDirection : public MOperate_SingleObject + { + public: + MOperation_getDirection(const SelectModel& smodle); + virtual ~MOperation_getDirection() {}; -public: + public: - virtual void operateWithBRep(BRepObject* brep_object) override; + virtual bool DoOperate(AdapterObject* brep_object) override; -public: - AMCAX::Coord3 getDirection() { return direction_; } + public: + AMCAX::Coord3 getDirection() { return direction_; } -private: - AMCAX::Coord3 direction_; -}; + private: + AMCAX::Coord3 direction_; + }; } //namespace acamcad \ No newline at end of file diff --git a/Src/Operation/MultOperate.cpp b/Src/Operation/MultOperate.cpp index 7a8e053..c3ba2d3 100644 --- a/Src/Operation/MultOperate.cpp +++ b/Src/Operation/MultOperate.cpp @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "MultOperate.h" @@ -23,13 +23,13 @@ namespace acamcad } MultOperate::MultOperate(const SelectModel& smodel) - :selmodel_(smodel) + : selmodel_(smodel) { } - BaseObject* MultOperate::operateWithBRep() + BaseObject* MultOperate::operate() { - // Massage::Error("MultOperate::operateWithSpline -- this type can not do this operation"); + // Massage::Error("MultOperate::operateWithSpline -- this type can not do this operation"); return nullptr; } @@ -59,10 +59,10 @@ namespace acamcad objectList_.clear(); selmodel_ = SelectModel::OBJECT_MODEL; isSaveOri_ = false; - objectType_ = DataType::UNKNOW_TYPE; + objectType_ = DataType::CUSTOM_TYPE; } - void MultOperate::setObjectList(std::vector object_list) + void MultOperate::setObjectList(std::vector object_list) { objectList_ = object_list; } diff --git a/Src/Operation/MultOperate.h b/Src/Operation/MultOperate.h index fc7c949..e61af50 100644 --- a/Src/Operation/MultOperate.h +++ b/Src/Operation/MultOperate.h @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #pragma once #include "../Object/ObjectDefine.h" @@ -28,7 +28,7 @@ namespace acamcad public: - virtual BaseObject* operateWithBRep(); + virtual BaseObject* operate(); public: bool checkOjbectTypeUnanimous(); //uset after setObjectList; @@ -42,7 +42,7 @@ namespace acamcad public: virtual void reInline(); - virtual void setObjectList(std::vector object_list); + virtual void setObjectList(std::vector object_list); virtual void setSelectModel(const SelectModel& smodle); @@ -51,7 +51,7 @@ namespace acamcad protected: bool isSaveOri_ = false; SelectModel selmodel_; - std::vector objectList_; + std::vector objectList_; DataType objectType_; }; diff --git a/Src/Operation/MultOperate_BoolCommon.cpp b/Src/Operation/MultOperate_BoolCommon.cpp index 3745979..e9bec50 100644 --- a/Src/Operation/MultOperate_BoolCommon.cpp +++ b/Src/Operation/MultOperate_BoolCommon.cpp @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "MultOperate_BoolCommon.h" #include @@ -21,24 +21,32 @@ acamcad::MultOperate_BoolCommon::MultOperate_BoolCommon(const SelectModel& smode { } -acamcad::BaseObject* acamcad::MultOperate_BoolCommon::operateWithBRep() +acamcad::BaseObject* acamcad::MultOperate_BoolCommon::operate() { + if (objectType_ != DataType::BREP_TYPE) + return nullptr; + + std::vector shapeVector(objectList_.size()); for (int i = 0; i < objectList_.size(); ++i) { - shapeVector[i] = dynamic_cast(objectList_[i])->getShape(); + shapeVector[i] = dynamic_cast(objectList_[i])->bRep->getShape(); } AMCAX::TopoShape resultShape = AMCAX::BoolBRepCommon(shapeVector[0], shapeVector[1]); for (int i = 2; i < shapeVector.size(); ++i) resultShape = AMCAX::BoolBRepCommon(resultShape, shapeVector[i]); - BRepObject* newObject = new BRepObject(); - newObject->getShape() = resultShape; + AdapterObject* adapter_object = new AdapterObject; + adapter_object->setDataType(acamcad::DataType::BREP_TYPE); + //adapter_object->bRep = std::make_unique(adapter_object); + + //BRepObject* newObject = new BRepObject(); + adapter_object->bRep->getShape() = resultShape; - newObject->setLabel(objectList_[0]->label()); + adapter_object->setLabel(objectList_[0]->label()); - newObject->updateDraw(); + adapter_object->bRep->updateDraw(); - return newObject; + return adapter_object; } diff --git a/Src/Operation/MultOperate_BoolCommon.h b/Src/Operation/MultOperate_BoolCommon.h index bb013af..0d8901f 100644 --- a/Src/Operation/MultOperate_BoolCommon.h +++ b/Src/Operation/MultOperate_BoolCommon.h @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #pragma once #include "MultOperate.h" @@ -26,7 +26,7 @@ namespace acamcad public: - virtual BaseObject* operateWithBRep() override; + virtual BaseObject* operate() override; public: virtual MeshOperationType OperationType() { return MeshOperationType::MeshCommon; } diff --git a/Src/Operation/MultOperate_BoolCut.cpp b/Src/Operation/MultOperate_BoolCut.cpp index fe3788b..487a0e7 100644 --- a/Src/Operation/MultOperate_BoolCut.cpp +++ b/Src/Operation/MultOperate_BoolCut.cpp @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "MultOperate_BoolCut.h" #include @@ -21,24 +21,32 @@ acamcad::MultOperate_BoolCut::MultOperate_BoolCut(const SelectModel& smodel) { } -acamcad::BaseObject* acamcad::MultOperate_BoolCut::operateWithBRep() +acamcad::BaseObject* acamcad::MultOperate_BoolCut::operate() { + if (objectType_ != DataType::BREP_TYPE) + { + return nullptr; + } + + std::vector shapeVector(objectList_.size()); for (int i = 0; i < objectList_.size(); ++i) { - shapeVector[i] = dynamic_cast(objectList_[i])->getShape(); + shapeVector[i] = dynamic_cast(objectList_[i])->bRep->getShape(); } AMCAX::TopoShape resultShape = AMCAX::BoolBRepCut(shapeVector[0], shapeVector[1]); for (int i = 2; i < shapeVector.size(); ++i) resultShape = AMCAX::BoolBRepCut(resultShape, shapeVector[i]); - BRepObject* newObject = new BRepObject(); - newObject->getShape() = resultShape; + AdapterObject* newObject = new AdapterObject(); + newObject->setDataType(acamcad::DataType::BREP_TYPE); + //newObject->bRep = std::make_unique(newObject); + newObject->bRep->getShape() = resultShape; newObject->setLabel(objectList_[0]->label()); - newObject->updateDraw(); + newObject->bRep->updateDraw(); return newObject; } diff --git a/Src/Operation/MultOperate_BoolCut.h b/Src/Operation/MultOperate_BoolCut.h index 57ef077..36a8047 100644 --- a/Src/Operation/MultOperate_BoolCut.h +++ b/Src/Operation/MultOperate_BoolCut.h @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #pragma once #include "MultOperate.h" @@ -26,7 +26,7 @@ namespace acamcad public: - virtual BaseObject* operateWithBRep() override; + virtual BaseObject* operate() override; public: virtual MeshOperationType OperationType() { return MeshOperationType::MeshCut; } diff --git a/Src/Operation/MultOperate_BoolFuse.cpp b/Src/Operation/MultOperate_BoolFuse.cpp index 800ce06..b4a70f0 100644 --- a/Src/Operation/MultOperate_BoolFuse.cpp +++ b/Src/Operation/MultOperate_BoolFuse.cpp @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "MultOperate_BoolFuse.h" #include @@ -21,24 +21,33 @@ acamcad::MultOperate_BoolFuse::MultOperate_BoolFuse(const SelectModel& smodel) { } -acamcad::BaseObject* acamcad::MultOperate_BoolFuse::operateWithBRep() +acamcad::BaseObject* acamcad::MultOperate_BoolFuse::operate() { + + if (objectType_ != DataType::BREP_TYPE) + return nullptr; + + std::vector shapeVector(objectList_.size()); for (int i = 0; i < objectList_.size(); ++i) { - shapeVector[i] = dynamic_cast(objectList_[i])->getShape(); + shapeVector[i] = dynamic_cast(objectList_[i])->bRep->getShape(); } AMCAX::TopoShape resultShape = AMCAX::BoolBRepFuse(shapeVector[0], shapeVector[1]); for (int i = 2; i < shapeVector.size(); ++i) resultShape = AMCAX::BoolBRepFuse(resultShape, shapeVector[i]); - BRepObject* newObject = new BRepObject(); - newObject->getShape() = resultShape; + AdapterObject* adapter_object = new AdapterObject; + adapter_object->setDataType(acamcad::DataType::BREP_TYPE); + //adapter_object->bRep = std::make_unique(adapter_object); + + //BRepObject* newObject = new BRepObject(); + adapter_object->bRep->getShape() = resultShape; - newObject->setLabel(objectList_[0]->label()); + adapter_object->setLabel(objectList_[0]->label()); - newObject->updateDraw(); + adapter_object->updateDraw(); - return newObject; + return adapter_object; } diff --git a/Src/Operation/MultOperate_BoolFuse.h b/Src/Operation/MultOperate_BoolFuse.h index ba06e94..0664555 100644 --- a/Src/Operation/MultOperate_BoolFuse.h +++ b/Src/Operation/MultOperate_BoolFuse.h @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #pragma once #include "MultOperate.h" @@ -26,7 +26,7 @@ namespace acamcad public: - virtual BaseObject* operateWithBRep() override; + virtual BaseObject* operate() override; public: virtual MeshOperationType OperationType() { return MeshOperationType::MeshFuse; } diff --git a/Src/Operation/MultOperate_Combine.cpp b/Src/Operation/MultOperate_Combine.cpp index 6f0e71c..1986211 100644 --- a/Src/Operation/MultOperate_Combine.cpp +++ b/Src/Operation/MultOperate_Combine.cpp @@ -1,42 +1,88 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "MultOperate_Combine.h" #include #include +#include +#include +#include + acamcad::MultOperate_Combine::MultOperate_Combine(const SelectModel& smodel) :MultOperate(smodel) { } -acamcad::BaseObject* acamcad::MultOperate_Combine::operateWithBRep() +acamcad::BaseObject* acamcad::MultOperate_Combine::operate() { - BRepObject* newObject = new BRepObject(); - newObject->getShape() = AMCAX::TopoCompound(); - AMCAX::TopoBuilder TB; - TB.MakeCompound(static_cast(newObject->getShape())); - for (int i = 0; i < objectList_.size(); ++i) + switch (ObjectType()) + { + case acamcad::DataType::BREP_TYPE: { - BRepObject* bobj = dynamic_cast(objectList_[i]); - TB.Add(newObject->getShape(), bobj->getShape()); + AdapterObject* adapter_object = new AdapterObject; + adapter_object->setDataType(acamcad::DataType::BREP_TYPE); + //adapter_object->bRep = std::make_unique(adapter_object); + + //BRepObject* newObject = new BRepObject(); + adapter_object->bRep->getShape() = AMCAX::TopoCompound(); + + AMCAX::TopoBuilder TB; + TB.MakeCompound(static_cast(adapter_object->bRep->getShape())); + for (int i = 0; i < objectList_.size(); ++i) + { + AdapterObject* bobj = objectList_[i]; + TB.Add(adapter_object->bRep->getShape(), bobj->bRep->getShape()); + } + + adapter_object->bRep->updateDraw(); + return adapter_object; } + break; + case acamcad::DataType::MESH_TYPE: + { + AdapterObject* adapter_object = new AdapterObject; + adapter_object->setDataType(acamcad::DataType::MESH_TYPE); + adapter_object->mesh->assignMesh(); - newObject->updateDraw(); - return newObject; + for (int i = 0; i < objectList_.size(); i++) { + AdapterObject* bobj = objectList_[i]; + AMCAX::SubD::MeshCopy::CombineMesh(adapter_object->mesh->mesh(), bobj->mesh->mesh()); + } + adapter_object->updateDraw(); + return adapter_object; + } + break; + case acamcad::DataType::TSPLINEU_TYPE: + { + AdapterObject* adapter_object = new AdapterObject; + adapter_object->setDataType(acamcad::DataType::TSPLINEU_TYPE); + adapter_object->tSpline->assignTSpline(); + + for (int i = 0; i < objectList_.size(); i++) { + AMCAX::TMS::TMSplineCopy().AppendToTMSpline(adapter_object->tSpline->getTSpline(), + objectList_[i]->tSpline->getTSpline()); + } + adapter_object->updateDraw(); + return adapter_object; + } + break; + default: + break; + } } diff --git a/Src/Operation/MultOperate_Combine.h b/Src/Operation/MultOperate_Combine.h index 495a03c..6a366fb 100644 --- a/Src/Operation/MultOperate_Combine.h +++ b/Src/Operation/MultOperate_Combine.h @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #pragma once #include "MultOperate.h" @@ -26,7 +26,7 @@ namespace acamcad public: - virtual BaseObject* operateWithBRep() override; + virtual BaseObject* operate() override; public: virtual MeshOperationType OperationType() { return MeshOperationType::MeshCombine; } diff --git a/Src/Operation/OperationDefine.h b/Src/Operation/OperationDefine.h index ca4e6d0..e3d9605 100644 --- a/Src/Operation/OperationDefine.h +++ b/Src/Operation/OperationDefine.h @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #pragma once @@ -26,15 +26,27 @@ #include "SGLOperate_FilletEdge.h" #include "CreateOperate_Cone.h" +#include "CreateOperate_ConeTSpline.h" #include "CreateOperate_Cube.h" +#include "CreateOperate_CubeMesh.h" +#include "CreateOperate_CubeTSpline.h" #include "CreateOperate_Cylinder.h" +#include "CreateOperate_CylinderTSpline.h" #include "CreateOperate_Plane.h" +#include "CreateOperate_PlaneMesh.h" +#include "CreateOperate_PlaneTSpline.h" #include "CreateOperate_Sphere.h" +#include "CreateOperate_SphereTSpline.h" #include "CreateOperate_Torus.h" +#include "CreateOperate_TorusTSpline.h" #include "CreateOperate_Prism.h" #include "CreateOperate_Polygon.h" +#include "CreateOperate_QuadballTSpline.h" #include "CreateOperate_SingleFace.h" +#include "CreateOperate_SingleFaceMesh.h" +#include "CreateOperate_SingleFaceTSpline.h" #include "CreateOperate_Circular.h" +#include "CreateOperate_CircularTSpline.h" #include "CreateOperate_Ring.h" #include "CreateOperate_RoundedPolygon.h" #include "CreateOperate_RoundedPrism.h" @@ -47,4 +59,24 @@ #include "MultOperate_BoolFuse.h" #include "MultOperate_Combine.h" -#include "SGLOperate_ExtrudeShape.h" \ No newline at end of file +#include "SGLOperate_ExtrudeShape.h" +#include "SGLOperate_TriangulateMesh.h" +#include "SGLOperate_EmbedFace.h" +#include "SGLOperate_DeleteElement.h" +#include "SGLOperate_Separate.h" +#include "SGLOperate_WeldEdge.h" +#include "SGLOperate_SplitLoop.h" +#include "MOperate_SelectCloset.h" +#include "SGLOperate_SplitFaceByEdge.h" +#include "SGLOperate_SplitFaceVertex.h" +#include "SGLOperate_Bridge.h" +#include "SGLOperate_Thicken.h" +#include "SGLOperate_ExtrudeEdge.h" +#include "SGLOperate_ReverseNormal.h" +#include "SGLOperate_CreaseRemove.h" +#include "SGLOperate_Crease.h" +#include "SGLOperate_Repair.h" +#include "SGLOperate_Uniform.h" +#include "SGLOperate_SplitFace.h" +#include "SGLOperate_ExtrudeFace.h" +#include "SGLOperate_FillHole.h" \ No newline at end of file diff --git a/Src/Operation/SGLOperate_Bridge.cpp b/Src/Operation/SGLOperate_Bridge.cpp new file mode 100644 index 0000000..0c351aa --- /dev/null +++ b/Src/Operation/SGLOperate_Bridge.cpp @@ -0,0 +1,60 @@ +#include "SGLOperate_Bridge.h" + +#include +#include +#include + +using namespace acamcad; + +SGLOperate_Bridge::SGLOperate_Bridge(const SelectModel& smodle) + :MOperate_SingleObject(smodle) +{ +} + +bool SGLOperate_Bridge::DoOperate(AdapterObject* adapter) +{ + if (selmodel_ != SelectModel::EDGE_MODEL) + return false; + + if (s_info_list_.size() < 2) return false; + + if (s_info_list_[0].object_id_ != s_info_list_[1].object_id_) + return false; + + bool result = true; + + switch (adapter->dataType()) + { + case DataType::MESH_TYPE: + { + std::vector s_id_list = getSelectSubList(s_info_list_); + + result = AMCAX::SubD::MeshInsertFace::AddFaceByEdge(adapter->mesh->mesh(), s_id_list[0], s_id_list[1]); + } + break; + case DataType::TSPLINEU_TYPE: + { + std::vector s_id_list = getSelectSubList(s_info_list_); + + AMCAX::TMS::TMSplineBridgeEdge tool; + + result = tool.CanBridgeEdge(adapter->tSpline->getTSpline(), s_id_list[0], s_id_list[1]); + + if (result) { + tool.BridgeEdge(adapter->tSpline->getTSpline(), s_id_list[0], s_id_list[1]); + adapter->updateDraw(); + } + } + break; + default: + break; + } + + return result; + //polymesh::MEdge* e0 = mesh_object->mesh()->edge(s_id_list[0]); + //polymesh::MEdge* e1 = mesh_object->mesh()->edge(s_id_list[1]); + //polymesh::bridgeEdge(mesh_object->mesh(), e0, e1); + + + +} \ No newline at end of file diff --git a/Src/Operation/SGLOperate_Bridge.h b/Src/Operation/SGLOperate_Bridge.h new file mode 100644 index 0000000..a5191f1 --- /dev/null +++ b/Src/Operation/SGLOperate_Bridge.h @@ -0,0 +1,21 @@ +#pragma once +#include "MOperate_SelectInfo.h" + +namespace acamcad +{ + + class SGLOperate_Bridge : public MOperate_SingleObject + { + public: + SGLOperate_Bridge(const SelectModel& smodle); + virtual ~SGLOperate_Bridge() {}; + + public: + virtual bool DoOperate(AdapterObject* adapter) override; + //virtual void operateWithTSpline(TSplineObject* spline_object) override; + + public: + virtual MeshOperationType OperationType() { return MeshOperationType::MeshBridgeEdge; } + }; + +} //namespace acamcad \ No newline at end of file diff --git a/Src/Operation/SGLOperate_ChamferEdge.cpp b/Src/Operation/SGLOperate_ChamferEdge.cpp index d7033fb..bf6c18b 100644 --- a/Src/Operation/SGLOperate_ChamferEdge.cpp +++ b/Src/Operation/SGLOperate_ChamferEdge.cpp @@ -1,22 +1,23 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "SGLOperate_ChamferEdge.h" #include #include +#include using namespace acamcad; @@ -25,23 +26,53 @@ SGLOperate_ChamferEdge::SGLOperate_ChamferEdge(const SelectModel& smodle) { } -void acamcad::SGLOperate_ChamferEdge::operateWithBRep(BRepObject* brep_object) +bool acamcad::SGLOperate_ChamferEdge::DoOperate(AdapterObject* brep_object) { if (selmodel_ != SelectModel::EDGE_MODEL) - return; + return false; - if (s_info_list_.size() < 1) return; + if (s_info_list_.size() < 1) return false; + bool result = false; std::vector s_id_list = getSelectSubList(s_info_list_); - AMCAX::MakeChamfer mkChamfer(brep_object->getShape()); - for (int i = 0; i < s_id_list.size(); ++i) + switch (brep_object->dataType()) { - const AMCAX::TopoEdge& edge = static_cast(brep_object->getShapeEdges()[s_id_list[i]]); - mkChamfer.Add(0.1, edge); + case acamcad::DataType::BREP_TYPE: + { + AMCAX::MakeChamfer mkChamfer(brep_object->bRep->getShape()); + for (int i = 0; i < s_id_list.size(); ++i) + { + const AMCAX::TopoEdge& edge = static_cast(brep_object->bRep->getShapeEdges()[s_id_list[i]]); + mkChamfer.Add(0.1, edge); + } + mkChamfer.SetMode(AMCAX::ChamferMode::ClassicChamfer); + + brep_object->bRep->getShape() = mkChamfer.Shape(); + + brep_object->updateDraw(); + + result = true; } - mkChamfer.SetMode(AMCAX::ChamferMode::ClassicChamfer); + break; + case acamcad::DataType::TSPLINEU_TYPE: + { + AMCAX::TMS::TMSplineSampleChamfer tool(0.1); + + result = tool.CanEdgesSampleChamfer(brep_object->tSpline->getTSpline(), s_id_list); + + if (result) { + tool.SampleChamfer(brep_object->tSpline->getTSpline(), s_id_list); + brep_object->updateDraw(); + } + } + break; + default: + break; + } + + return result; + - brep_object->getShape() = mkChamfer.Shape(); } diff --git a/Src/Operation/SGLOperate_ChamferEdge.h b/Src/Operation/SGLOperate_ChamferEdge.h index 752acfe..a43f26a 100644 --- a/Src/Operation/SGLOperate_ChamferEdge.h +++ b/Src/Operation/SGLOperate_ChamferEdge.h @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #pragma once #include "MOperate_SelectInfo.h" @@ -19,18 +19,18 @@ namespace acamcad { -class SGLOperate_ChamferEdge : public MOperate_SingleObject -{ -public: - SGLOperate_ChamferEdge(const SelectModel& smodle); - virtual ~SGLOperate_ChamferEdge() {}; + class SGLOperate_ChamferEdge : public MOperate_SingleObject + { + public: + SGLOperate_ChamferEdge(const SelectModel& smodle); + virtual ~SGLOperate_ChamferEdge() {}; -public: + public: - virtual void operateWithBRep(BRepObject* brep_object) override; + virtual bool DoOperate(AdapterObject* brep_object) override; -public: - virtual MeshOperationType OperationType() { return MeshOperationType::MeshChamferEdge; } -}; + public: + virtual MeshOperationType OperationType() { return MeshOperationType::MeshChamferEdge; } + }; } //namespace acamcad \ No newline at end of file diff --git a/Src/Operation/SGLOperate_Crease.cpp b/Src/Operation/SGLOperate_Crease.cpp new file mode 100644 index 0000000..8dc7584 --- /dev/null +++ b/Src/Operation/SGLOperate_Crease.cpp @@ -0,0 +1,27 @@ +#include "SGLOperate_Crease.h" + +#include + +namespace acamcad +{ + SGLOperate_CreaseEdge::SGLOperate_CreaseEdge(const SelectModel& smodle) + :MOperate_SingleObject(smodle) + { + } + + bool SGLOperate_CreaseEdge::DoOperate(AdapterObject* object) + { + if (selmodel_ != SelectModel::EDGE_MODEL || + object->dataType() != DataType::TSPLINEU_TYPE) + return false; + + std::vector s_id_list = getSelectSubList(s_info_list_); + + AMCAX::TMS::TMSplineCreaseTool::AddCreaseEdge(object->tSpline->getTSpline(), s_id_list); + + object->updateDraw(); + + return true; + } + +} diff --git a/Src/Operation/SGLOperate_Crease.h b/Src/Operation/SGLOperate_Crease.h new file mode 100644 index 0000000..3957775 --- /dev/null +++ b/Src/Operation/SGLOperate_Crease.h @@ -0,0 +1,20 @@ +#pragma once +#include "MOperate_SelectInfo.h" + +namespace acamcad +{ + + class SGLOperate_CreaseEdge : public MOperate_SingleObject + { + public: + SGLOperate_CreaseEdge(const SelectModel& smodle); + //virtual ~SGLOperate_CreaseEdge() {}; + + public: + virtual bool DoOperate(AdapterObject* tspline_object) override; + + public: + virtual MeshOperationType OperationType() { return MeshOperationType::MeshAddCreaseEdge; } + }; + +} //namespace acamcad \ No newline at end of file diff --git a/Src/Operation/SGLOperate_CreaseRemove.cpp b/Src/Operation/SGLOperate_CreaseRemove.cpp new file mode 100644 index 0000000..347968b --- /dev/null +++ b/Src/Operation/SGLOperate_CreaseRemove.cpp @@ -0,0 +1,26 @@ +#include "SGLOperate_CreaseRemove.h" +#include + +namespace acamcad +{ + SGLOperate_CreaseEdgeRemove::SGLOperate_CreaseEdgeRemove(const SelectModel& smodle) + :MOperate_SingleObject(smodle) + { + } + + bool SGLOperate_CreaseEdgeRemove::DoOperate(AdapterObject* object) + { + if (selmodel_ != SelectModel::EDGE_MODEL || + object->dataType() != DataType::TSPLINEU_TYPE) + return false; + + std::vector s_id_list = getSelectSubList(s_info_list_); + + AMCAX::TMS::TMSplineCreaseTool::RemoveCreaseEdge(object->tSpline->getTSpline(), s_id_list); + + object->updateDraw(); + + return true; + } + +} diff --git a/Src/Operation/SGLOperate_CreaseRemove.h b/Src/Operation/SGLOperate_CreaseRemove.h new file mode 100644 index 0000000..c5be245 --- /dev/null +++ b/Src/Operation/SGLOperate_CreaseRemove.h @@ -0,0 +1,20 @@ +#pragma once +#include "MOperate_SelectInfo.h" + +namespace acamcad +{ + + class SGLOperate_CreaseEdgeRemove : public MOperate_SingleObject + { + public: + SGLOperate_CreaseEdgeRemove(const SelectModel& smodle); + virtual ~SGLOperate_CreaseEdgeRemove() {}; + + public: + virtual bool DoOperate(AdapterObject* tspline_object) override; + + public: + virtual MeshOperationType OperationType() { return MeshOperationType::MeshRemoveCreaseEdge; } + }; + +} //namespace acamcad \ No newline at end of file diff --git a/Src/Operation/SGLOperate_DeleteElement.cpp b/Src/Operation/SGLOperate_DeleteElement.cpp new file mode 100644 index 0000000..6c76ff2 --- /dev/null +++ b/Src/Operation/SGLOperate_DeleteElement.cpp @@ -0,0 +1,96 @@ +#include "SGLOperate_DeleteElement.h" + +#include +#include + +#include + +using namespace acamcad; + +SGLOperate_Delete::SGLOperate_Delete(const SelectModel& smodle) + :MOperate_SingleObject(smodle) +{ +} + +bool SGLOperate_Delete::DoOperate(AdapterObject* adapter) +{ + + + + bool result = false; + + switch (adapter->dataType()) + { + case DataType::MESH_TYPE: + { + if (selmodel_ != SelectModel::FACE_MODEL) + { + break; + } + std::vector s_id_list = getSelectSubList(s_info_list_); + result = true; + AMCAX::SubD::MeshReduce::DeleteFaces(adapter->mesh->mesh(), s_id_list); + } + break; + case DataType::TSPLINEU_TYPE: + { + switch (selmodel_) + { + case acamcad::SelectModel::VERTEX_MODEL: + { + + std::vector s_id_list = getSelectSubList(s_info_list_); + std::sort(s_id_list.begin(), s_id_list.end(), std::greater()); + s_id_list.erase(std::unique(s_id_list.begin(), s_id_list.end()), s_id_list.end()); + + AMCAX::TMS::TMSplineReduce reduce; + + result = reduce.CanRemoveVertices(adapter->tSpline->getTSpline(), s_id_list); + + if (result) { + reduce.RemoveEdges(adapter->tSpline->getTSpline(), s_id_list); + } + } + break; + case acamcad::SelectModel::EDGE_MODEL: + { + std::vector s_id_list = getSelectSubList(s_info_list_); + std::sort(s_id_list.begin(), s_id_list.end(), std::greater()); + s_id_list.erase(std::unique(s_id_list.begin(), s_id_list.end()), s_id_list.end()); + + AMCAX::TMS::TMSplineReduce reduce; + + result = reduce.CanRemoveEdges(adapter->tSpline->getTSpline(), s_id_list); + + if (result) { + reduce.RemoveEdges(adapter->tSpline->getTSpline(), s_id_list); + } + } + break; + case acamcad::SelectModel::FACE_MODEL: + { + std::vector s_id_list = getSelectSubList(s_info_list_); + std::sort(s_id_list.begin(), s_id_list.end(), std::greater()); + s_id_list.erase(std::unique(s_id_list.begin(), s_id_list.end()), s_id_list.end()); + + AMCAX::TMS::TMSplineReduce reduce; + + result = reduce.CanDeleteFaces(adapter->tSpline->getTSpline(), s_id_list); + + if (result) { + reduce.DeleteFaces(adapter->tSpline->getTSpline(), s_id_list); + } + } + break; + default: + break; + } + } + break; + default: + break; + } + + + return result; +} \ No newline at end of file diff --git a/Src/Operation/SGLOperate_DeleteElement.h b/Src/Operation/SGLOperate_DeleteElement.h new file mode 100644 index 0000000..349c01f --- /dev/null +++ b/Src/Operation/SGLOperate_DeleteElement.h @@ -0,0 +1,21 @@ +#pragma once +#include "MOperate_SelectInfo.h" + +namespace acamcad +{ + + class SGLOperate_Delete : public MOperate_SingleObject + { + public: + SGLOperate_Delete(const SelectModel& smodle); + virtual ~SGLOperate_Delete() {}; + + public: + virtual bool DoOperate(AdapterObject* mesh_object) override; + //virtual void operateWithTSpline(TSplineObject* tspline_object) override; + + public: + virtual MeshOperationType OperationType() { return MeshOperationType::MeshDeleteElement; } + }; + +} //namespace acamcad \ No newline at end of file diff --git a/Src/Operation/SGLOperate_EmbedFace.cpp b/Src/Operation/SGLOperate_EmbedFace.cpp new file mode 100644 index 0000000..1d91c56 --- /dev/null +++ b/Src/Operation/SGLOperate_EmbedFace.cpp @@ -0,0 +1,112 @@ +#include "SGLOperate_EmbedFace.h" + +#include +#include +#include +#include + +namespace acamcad +{ + SGLOperate_EmbedFace::SGLOperate_EmbedFace(const SelectModel& smodle) + :MOperate_SingleObject(smodle) + { + } + + bool SGLOperate_EmbedFace::DoOperate(AdapterObject* adapter) + { + + bool result = false; + + switch (adapter->dataType()) + { + case DataType::MESH_TYPE: + { + if (selmodel_ == SelectModel::VERTEX_MODEL) + { + if (s_info_list_.size() < 3) break; + + //result = true; + std::vector s_id_list = getSelectSubList(s_info_list_); + + result = AMCAX::SubD::MeshInsertFace::EmbedSingleFace(adapter->mesh->mesh(), s_id_list) != nullptr; + adapter->updateDraw(); + } + else if (selmodel_ == SelectModel::EDGE_MODEL) + { + if (s_info_list_.size() < 2) break; + + std::vector s_id_list = getSelectSubList(s_info_list_); + //polymesh::MEdge* e0 = mesh_object->mesh()->edge(s_id_list[0]); + //polymesh::MEdge* e1 = mesh_object->mesh()->edge(s_id_list[1]); + + //polymesh::addFaceByEdge(mesh_object->mesh(), e0, e1); + result = AMCAX::SubD::MeshInsertFace::AddFaceByEdge(adapter->mesh->mesh(), s_id_list[0], s_id_list[1]) != nullptr; + adapter->updateDraw(); + + + } + } + break; + case DataType::TSPLINEU_TYPE: + { + if (selmodel_ == SelectModel::VERTEX_MODEL) + { + if (s_info_list_.size() < 3) break; + if (s_info_list_[0].object_id_ != s_info_list_[1].object_id_ || + s_info_list_[1].object_id_ != s_info_list_[2].object_id_) + break; + + std::vector s_id_list = getSelectSubList(s_info_list_); + std::vector points; + for (int i = 0; i < s_id_list.size(); i++) + { + AMCAX::Point3 point = + AMCAX::TMS::TMSplineTool::ControlPosition(adapter->tSpline->getTSpline(), s_id_list[i]); + + points.push_back(point); + } + + + AMCAX::TMS::TMSplineAddFace tool; + + result = tool.CanAddSingleFace(adapter->tSpline->getTSpline(), points); + + if (result) { + tool.AddSingleFace(adapter->tSpline->getTSpline(), points); + + adapter->updateDraw(); + } + + + //tspline::TO_AddFace addface; + //addface.addSingleFace(spline_object->getTSpline(), vp_list); + + + } + else if (selmodel_ == SelectModel::EDGE_MODEL) + { + if (s_info_list_.size() < 2) break; + if (s_info_list_[0].object_id_ != s_info_list_[1].object_id_) + break; + + std::vector s_id_list = getSelectSubList(s_info_list_); + + AMCAX::TMS::TMSplineAddFace tool; + + result = tool.CanAddFaceByEdge(adapter->tSpline->getTSpline(), s_id_list[0], s_id_list[1]); + + if (result) { + tool.AddFaceByEdge(adapter->tSpline->getTSpline(), s_id_list[0], s_id_list[1]); + adapter->updateDraw(); + } + } + //spline_object->updateDraw(); + } + break; + default: + break; + } + + return result; + } +} \ No newline at end of file diff --git a/Src/Operation/SGLOperate_EmbedFace.h b/Src/Operation/SGLOperate_EmbedFace.h new file mode 100644 index 0000000..d8195d3 --- /dev/null +++ b/Src/Operation/SGLOperate_EmbedFace.h @@ -0,0 +1,35 @@ +/* =================================================================== +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* All rights reserved. +* +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* software under the terms of either license. +* +* For more information about the AGPLv3.0 license, please visit: +* https://www.gnu.org/licenses/agpl-3.0.html +* For licensing inquiries or to obtain a commercial license, please +* contact Hefei Jiushao Intelligent Technology Co., Ltd. +* =================================================================== +* Author: +*/ +#pragma once +#include "MOperate_SelectInfo.h" + +namespace acamcad +{ + + class SGLOperate_EmbedFace : public MOperate_SingleObject + { + public: + SGLOperate_EmbedFace(const SelectModel& smodle); + //virtual ~SGLOperate_ChamferEdge() {}; + + public: + + virtual bool DoOperate(AdapterObject* brep_object) override; + + public: + virtual MeshOperationType OperationType() { return MeshOperationType::MeshEmbedFace; } + }; +} \ No newline at end of file diff --git a/Src/Operation/SGLOperate_ExtrudeEdge.cpp b/Src/Operation/SGLOperate_ExtrudeEdge.cpp new file mode 100644 index 0000000..d84dde4 --- /dev/null +++ b/Src/Operation/SGLOperate_ExtrudeEdge.cpp @@ -0,0 +1,216 @@ +#include "SGLOperate_ExtrudeEdge.h" + +#include +#include +#include +#include +#include + +acamcad::SGLOperate_ExtrudeEdgeH::SGLOperate_ExtrudeEdgeH(const SelectModel& smodle) + :MOperate_SingleObject(smodle) +{ +} + +bool acamcad::SGLOperate_ExtrudeEdgeH::DoOperate(AdapterObject* adapter) +{ + if (selmodel_ != SelectModel::EDGE_MODEL) + return false; + + int object_id = adapter->persistentId(); + std::vector s_id_list = getSelectSubList(s_info_list_); + std::vector s_id_list_new; + + dire_.SetCoord(0.0, 0.0, 0.0); + + + bool result = false; + + switch (adapter->dataType()) + { + case DataType::MESH_TYPE: + { + + for (int i = 0; i < s_id_list.size(); i++) + { + std::vector faces = AMCAX::SubD::MeshTool::EdgeFaceIndexs(adapter->mesh->mesh(), + s_id_list[i]); + + AMCAX::Vector3 nor = AMCAX::SubD::MeshTool::FaceNormal(adapter->mesh->mesh(), faces[0]); + + int p0, p1; + AMCAX::SubD::MeshTool::EdgeVertexIndexs(adapter->mesh->mesh(), s_id_list[i], p0, p1); + AMCAX::Point3 position0 = AMCAX::SubD::MeshTool::Position(adapter->mesh->mesh(), p0), + position1 = AMCAX::SubD::MeshTool::Position(adapter->mesh->mesh(), p1); + + AMCAX::Vector3 ve = AMCAX::Vector3(position1.Coord() - position0.Coord()); + + dire_ += ve.Cross(nor).Coord(); + } + + dire_.Normalize(); + + + result = AMCAX::SubD::MeshExtrude::ExtrudeEdge(adapter->mesh->mesh(), + s_id_list, s_id_list_new); + + if (result) + { + s_info_list_.resize(s_id_list_new.size()); + for (int i = 0; i < s_id_list_new.size(); i++) + { + s_info_list_[i].object_id_ = object_id; + s_info_list_[i].object_subselect_id_ = s_id_list_new[i]; + } + } + } + break; + case DataType::TSPLINEU_TYPE: + { + for (int i = 0; i < s_id_list.size(); i++) + { + std::vector faces = AMCAX::TMS::TMSplineTool::EdgeFaceIndexs(adapter->tSpline->getTSpline(), + s_id_list[i]); + + //AMCAX::TMS::TMSplineTool::ControlFaceNormal(adapter->tSpline->getTSpline(), faces[0]); + + AMCAX::Vector3 nor = AMCAX::TMS::TMSplineTool::ControlFaceNormal(adapter->tSpline->getTSpline(), faces[0]); + + //EdgeFaceIndexs + + int p0, p1; + AMCAX::TMS::TMSplineTool::EdgeVertexIndexs(adapter->tSpline->getTSpline(), s_id_list[i], p0, p1); + AMCAX::Point3 position0 = AMCAX::TMS::TMSplineTool::ControlPosition(adapter->tSpline->getTSpline(), p0), + position1 = AMCAX::TMS::TMSplineTool::ControlPosition(adapter->tSpline->getTSpline(), p1); + + AMCAX::Vector3 ve = AMCAX::Vector3(position1.Coord() - position0.Coord()); + + dire_ += ve.Cross(nor).Coord(); + } + + dire_.Normalize(); + + AMCAX::TMS::TMSplineExtrude tool; + + result = tool.CanExtrudeEdges(adapter->tSpline->getTSpline(), s_id_list); + + if (result) + { + tool.ExtrudeEdges(adapter->tSpline->getTSpline(), s_id_list, s_id_list_new); + + s_info_list_.resize(s_id_list_new.size()); + for (int i = 0; i < s_id_list_new.size(); i++) + { + s_info_list_[i].object_id_ = object_id; + s_info_list_[i].object_subselect_id_ = s_id_list_new[i]; + } + } + } + break; + default: + break; + } + + if (result) + { + adapter->updateDraw(); + } + + return result; +} + +//====================================================================================================== + + +acamcad::SGLOperate_ExtrudeEdgeV::SGLOperate_ExtrudeEdgeV(const SelectModel& smodle) + :MOperate_SingleObject(smodle) +{ +} + +bool acamcad::SGLOperate_ExtrudeEdgeV::DoOperate(AdapterObject* adapter) +{ + if (selmodel_ != SelectModel::EDGE_MODEL) + return false; + + + int object_id = adapter->persistentId(); + std::vector s_id_list = getSelectSubList(s_info_list_); + std::vector s_id_list_new; + + dire_.SetCoord(0.0, 0.0, 0.0); + bool result = false; + + switch (adapter->dataType()) + { + case DataType::MESH_TYPE: + { + for (int i = 0; i < s_id_list.size(); i++) + { + std::vector faces = AMCAX::SubD::MeshTool::EdgeFaceIndexs(adapter->mesh->mesh(), + s_id_list[i]); + + AMCAX::Vector3 nor = AMCAX::SubD::MeshTool::FaceNormal(adapter->mesh->mesh(), faces[0]); + + dire_ += nor.Coord(); + } + + dire_.Normalize(); + + result = AMCAX::SubD::MeshExtrude::ExtrudeEdge(adapter->mesh->mesh(), + s_id_list, s_id_list_new); + + + if (result) + { + s_info_list_.resize(s_id_list_new.size()); + for (int i = 0; i < s_id_list_new.size(); i++) + { + s_info_list_[i].object_id_ = object_id; + s_info_list_[i].object_subselect_id_ = s_id_list_new[i]; + } + } + } + break; + case DataType::TSPLINEU_TYPE: + { + + for (int i = 0; i < s_id_list.size(); i++) + { + std::vector faces = AMCAX::TMS::TMSplineTool::EdgeFaceIndexs(adapter->tSpline->getTSpline(), + s_id_list[i]); + + //AMCAX::TMS::TMSplineTool::ControlFaceNormal(adapter->tSpline->getTSpline(), faces[0]); + + AMCAX::Vector3 nor = AMCAX::TMS::TMSplineTool::ControlFaceNormal(adapter->tSpline->getTSpline(), faces[0]); + + dire_ += nor.Coord(); + } + + dire_.Normalize(); + AMCAX::TMS::TMSplineExtrude tool; + + result = tool.CanExtrudeEdges(adapter->tSpline->getTSpline(), s_id_list); + + if (result) + { + tool.ExtrudeEdges(adapter->tSpline->getTSpline(), s_id_list, s_id_list_new); + + s_info_list_.resize(s_id_list_new.size()); + for (int i = 0; i < s_id_list_new.size(); i++) + { + s_info_list_[i].object_id_ = object_id; + s_info_list_[i].object_subselect_id_ = s_id_list_new[i]; + } + } + } + break; + default: + break; + } + + if (result) + { + adapter->updateDraw(); + } + + return result; +} \ No newline at end of file diff --git a/Src/Operation/SGLOperate_ExtrudeEdge.h b/Src/Operation/SGLOperate_ExtrudeEdge.h new file mode 100644 index 0000000..75da1f6 --- /dev/null +++ b/Src/Operation/SGLOperate_ExtrudeEdge.h @@ -0,0 +1,47 @@ +#pragma once +#include "MOperate_SelectInfo.h" + +namespace acamcad +{ + + class SGLOperate_ExtrudeEdgeH : public MOperate_SingleObject + { + public: + SGLOperate_ExtrudeEdgeH(const SelectModel& smodle); + virtual ~SGLOperate_ExtrudeEdgeH() {}; + + public: + virtual bool DoOperate(AdapterObject* mesh_object) override; + //virtual void operateWithTSpline(TSplineObject* tspline_object); + + public: + virtual MeshOperationType OperationType() { return MeshOperationType::MeshExtrudeEdgeHorizontal; } + + virtual AMCAX::Coord3 getDirection() override { return dire_; } + + private: + AMCAX::Coord3 dire_; + }; + + class SGLOperate_ExtrudeEdgeV : public MOperate_SingleObject + { + public: + SGLOperate_ExtrudeEdgeV(const SelectModel& smodle); + virtual ~SGLOperate_ExtrudeEdgeV() {}; + + public: + virtual bool DoOperate(AdapterObject* adapter) override; + //virtual void operateWithTSpline(TSplineObject* tspline_object); + + public: + virtual MeshOperationType OperationType() { return MeshOperationType::MeshExtrudeEdgeVertical; } + + virtual AMCAX::Coord3 getDirection() override { return dire_; } + + private: + AMCAX::Coord3 dire_; + }; + + + +} //namespace acamcad \ No newline at end of file diff --git a/Src/Operation/SGLOperate_ExtrudeFace.cpp b/Src/Operation/SGLOperate_ExtrudeFace.cpp new file mode 100644 index 0000000..c42465d --- /dev/null +++ b/Src/Operation/SGLOperate_ExtrudeFace.cpp @@ -0,0 +1,146 @@ +#include "SGLOperate_ExtrudeFace.h" + +#include +#include +#include +#include + + +using namespace acamcad; + +SGLOperate_ExtrudeFace::SGLOperate_ExtrudeFace(const SelectModel& smodle) + :MOperate_SingleObject(smodle) +{ +} + +bool SGLOperate_ExtrudeFace::DoOperate(AdapterObject* object) +{ + if (selmodel_ != SelectModel::FACE_MODEL) + return false; + + int object_id = object->persistentId(); + std::vector s_id_list = getSelectSubList(s_info_list_); + std::vector s_id_list_new; + + dire_.SetCoord(0.0, 0.0, 0.0); + + + bool result = false; + + switch (object->dataType()) + { + case DataType::MESH_TYPE: + { + for (int i = 0; i < s_id_list.size(); i++) + { + //std::vector faces = AMCAX::SubD::MeshTool::EdgeFaceIndexs(object->mesh->mesh(), + // s_id_list[i]); + + AMCAX::Vector3 nor = AMCAX::SubD::MeshTool::FaceNormal(object->mesh->mesh(), s_id_list[i]); + + dire_ += nor.Coord(); + } + + dire_.Normalize(); + + result = AMCAX::SubD::MeshExtrude::ExtrudeFace(object->mesh->mesh(), + s_id_list, s_id_list_new); + + + if (result) + { + s_info_list_.resize(s_id_list_new.size()); + for (int i = 0; i < s_id_list_new.size(); i++) + { + s_info_list_[i].object_id_ = object_id; + s_info_list_[i].object_subselect_id_ = s_id_list_new[i]; + } + } + } + break; + case DataType::TSPLINEU_TYPE: + { + + for (int i = 0; i < s_id_list.size(); i++) + { + //std::vector faces = AMCAX::TMS::TMSplineTool::EdgeFaceIndexs(object->tSpline->getTSpline(), + // s_id_list[i]); + + //AMCAX::TMS::TMSplineTool::ControlFaceNormal(adapter->tSpline->getTSpline(), faces[0]); + + AMCAX::Vector3 nor = AMCAX::TMS::TMSplineTool::ControlFaceNormal(object->tSpline->getTSpline(), s_id_list[i]); + + dire_ += nor.Coord(); + } + + dire_.Normalize(); + AMCAX::TMS::TMSplineExtrude tool; + + result = tool.CanExtrudeFaces(object->tSpline->getTSpline(), s_id_list); + + if (result) + { + tool.ExtrudeFaces(object->tSpline->getTSpline(), s_id_list, s_id_list_new); + + s_info_list_.resize(s_id_list_new.size()); + for (int i = 0; i < s_id_list_new.size(); i++) + { + s_info_list_[i].object_id_ = object_id; + s_info_list_[i].object_subselect_id_ = s_id_list_new[i]; + } + } + } + break; + default: + break; + } + + if (result) + { + object->updateDraw(); + } + + return result; +} + +//void SGLOperate_ExtrudeFace::operateWithMesh(MeshObject* mesh_object) +//{ +// if (selmodel_ != SelectModel::FACE_MODEL) +// return; +// +// int object_id = mesh_object->persistentId(); +// std::vector s_id_list = getSelectSubList(s_info_list_); +// std::vector s_id_list_new; +// +// //Mesh_SelectOperate::extrudeFace(mesh_object->mesh(), s_id_list, s_id_list_new, dire_); +// +// s_info_list_.resize(s_id_list_new.size()); +// for (int i = 0; i < s_id_list_new.size(); i++) +// { +// s_info_list_[i].object_id_ = object_id; +// s_info_list_[i].object_subselect_id_ = s_id_list_new[i]; +// } +//} +// +//void SGLOperate_ExtrudeFace::operateWithTSpline(TSplineUObject* tspline_object) +//{ +// if (selmodel_ != SelectModel::FACE_MODEL) +// return; +// +// int object_id = tspline_object->persistentId(); +// std::vector s_id_list = getSelectSubList(s_info_list_); +// std::vector s_id_list_new; +// +// //TSpline_SelectOperate::extrudeFace(tspline_object->getTSpline(), s_id_list, s_id_list_new, dire_); +// +// s_info_list_.resize(s_id_list_new.size()); +// for (int i = 0; i < s_id_list_new.size(); i++) +// { +// s_info_list_[i].object_id_ = object_id; +// s_info_list_[i].object_subselect_id_ = s_id_list_new[i]; +// } +// +// tspline_object->updateDraw(); +//} + + diff --git a/Src/Operation/SGLOperate_ExtrudeFace.h b/Src/Operation/SGLOperate_ExtrudeFace.h new file mode 100644 index 0000000..5fe3d4d --- /dev/null +++ b/Src/Operation/SGLOperate_ExtrudeFace.h @@ -0,0 +1,28 @@ +#pragma once +#include "MOperate_SelectInfo.h" + +namespace acamcad +{ + + class SGLOperate_ExtrudeFace : public MOperate_SingleObject + { + public: + SGLOperate_ExtrudeFace(const SelectModel& smodle); + virtual ~SGLOperate_ExtrudeFace() {}; + + public: + virtual bool DoOperate(AdapterObject* adapter) override; + ///virtual void operateWithTSpline(TSplineUObject* tspline_object) override; + //virtual void operateWithBRep(BRepObject* brep_object) override; + + public: + virtual MeshOperationType OperationType() { return MeshOperationType::MeshExtrudeFaceNew; } + + //virtual void setDirection(const MVector3& vec3) { dire_ = vec3; } + virtual AMCAX::Coord3 getDirection() override { return dire_; } + + private: + AMCAX::Coord3 dire_; + }; + +} //namespace acamcad \ No newline at end of file diff --git a/Src/Operation/SGLOperate_ExtrudeShape.cpp b/Src/Operation/SGLOperate_ExtrudeShape.cpp index 718f248..ff51825 100644 --- a/Src/Operation/SGLOperate_ExtrudeShape.cpp +++ b/Src/Operation/SGLOperate_ExtrudeShape.cpp @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "SGLOperate_ExtrudeShape.h" @@ -26,18 +26,34 @@ namespace acamcad } //diff with MeshExtrude - void acamcad::SGLOperate_ExtrudeShape::operateWithBRep(BRepObject* brep_object) + bool acamcad::SGLOperate_ExtrudeShape::DoOperate(AdapterObject* brep_object) { - if (brep_object->getShapeFaces().size() != 1) + if (selmodel_ != SelectModel::FACE_MODEL) + return false; + + + bool result = false; + + switch (brep_object->dataType()) { - std::cout << "extrude shape with multi face"; - return; - } + case DataType::BREP_TYPE: + { + if (brep_object->bRep->getShapeFaces().size() == 1) + { + result = true; + AMCAX::TopoShape f = AMCAX::CopyShape(brep_object->bRep->getShapeFaces()[0]); - AMCAX::TopoShape f = AMCAX::CopyShape(brep_object->getShapeFaces()[0]); + AMCAX::MakePrism prim(f, AMCAX::Vector3(dire_.X(), dire_.Y(), dire_.Z())); + brep_object->bRep->getShape() = prim.Shape(); + brep_object->updateDraw(); + } + } + break; + default: + break; + } - AMCAX::MakePrism prim(f, AMCAX::Vector3(dire_.X(), dire_.Y(), dire_.Z())); - brep_object->getShape() = prim.Shape(); + return result; } } \ No newline at end of file diff --git a/Src/Operation/SGLOperate_ExtrudeShape.h b/Src/Operation/SGLOperate_ExtrudeShape.h index 86cfc7e..8f42013 100644 --- a/Src/Operation/SGLOperate_ExtrudeShape.h +++ b/Src/Operation/SGLOperate_ExtrudeShape.h @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #pragma once #include "MOperate.h" @@ -26,7 +26,7 @@ namespace acamcad virtual ~SGLOperate_ExtrudeShape() {}; public: - virtual void operateWithBRep(BRepObject* brep_object) override; + virtual bool DoOperate(AdapterObject* brep_object) override; public: virtual MeshOperationType OperationType() { return MeshOperationType::MeshExtrudeFace; } diff --git a/Src/Operation/SGLOperate_FillHole.cpp b/Src/Operation/SGLOperate_FillHole.cpp new file mode 100644 index 0000000..e03114c --- /dev/null +++ b/Src/Operation/SGLOperate_FillHole.cpp @@ -0,0 +1,54 @@ +#include "SGLOperate_FillHole.h" + +#include + +namespace acamcad +{ + SGLOperate_FillHole::SGLOperate_FillHole(const SelectModel& smodle) + :MOperate_SingleObject(smodle) + { + } + + bool SGLOperate_FillHole::DoOperate(AdapterObject* adapter) + { + if (adapter->dataType() != DataType::TSPLINEU_TYPE) + return false; + + bool result = false; + + switch (selmodel_) + { + case acamcad::SelectModel::EDGE_MODEL: + { + std::vector ids = getSelectSubList(s_info_list_); + if (ids.empty()) + break; + + AMCAX::TMS::TMSplineFillHole tool; + result = tool.CanFillSingleHole(adapter->tSpline->getTSpline(), ids[0]); + + if (result) + { + tool.FillSingleHole(adapter->tSpline->getTSpline(), ids[0]); + adapter->updateDraw(); + } + + } + break; + case acamcad::SelectModel::OBJECT_MODEL: + { + result = AMCAX::TMS::TMSplineFillHole().FillAllHoles(adapter->tSpline->getTSpline()); + + adapter->updateDraw(); + } + break; + default: + break; + } + + return result; + + } + + +} \ No newline at end of file diff --git a/Src/Operation/SGLOperate_FillHole.h b/Src/Operation/SGLOperate_FillHole.h new file mode 100644 index 0000000..9712e58 --- /dev/null +++ b/Src/Operation/SGLOperate_FillHole.h @@ -0,0 +1,21 @@ +#pragma once +#include "MOperate_SelectInfo.h" + +namespace acamcad +{ + + class SGLOperate_FillHole : public MOperate_SingleObject + { + public: + SGLOperate_FillHole(const SelectModel& smodle); + virtual ~SGLOperate_FillHole() {}; + + public: + virtual bool DoOperate(AdapterObject* adapter) override; + + public: + virtual MeshOperationType OperationType() { return MeshOperationType::MeshFillHole; } + + }; + +} \ No newline at end of file diff --git a/Src/Operation/SGLOperate_FilletEdge.cpp b/Src/Operation/SGLOperate_FilletEdge.cpp index f7a61ba..07289d5 100644 --- a/Src/Operation/SGLOperate_FilletEdge.cpp +++ b/Src/Operation/SGLOperate_FilletEdge.cpp @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "SGLOperate_FilletEdge.h" @@ -23,21 +23,37 @@ acamcad::SGLOperate_FilletEdge::SGLOperate_FilletEdge(const SelectModel& smodle) { } -void acamcad::SGLOperate_FilletEdge::operateWithBRep(BRepObject* brep_object) +bool acamcad::SGLOperate_FilletEdge::DoOperate(AdapterObject* brep_object) { if (selmodel_ != SelectModel::EDGE_MODEL) - return; + return false; + + if (s_info_list_.size() < 1) return false; - if (s_info_list_.size() < 1) return; - std::vector s_id_list = getSelectSubList(s_info_list_); - AMCAX::MakeFillet mkFillet(brep_object->getShape()); - for (int i = 0; i < s_id_list.size(); ++i) + std::vector s_id_list = getSelectSubList(s_info_list_); + bool result = false; + switch (brep_object->dataType()) + { + case DataType::BREP_TYPE: { - const AMCAX::TopoEdge& edge = static_cast(brep_object->getShapeEdges()[s_id_list[i]]); - mkFillet.Add(0.1, 0.1, edge); + result = true; + AMCAX::MakeFillet mkFillet(brep_object->bRep->getShape()); + for (int i = 0; i < s_id_list.size(); ++i) + { + const AMCAX::TopoEdge& edge = static_cast(brep_object->bRep->getShapeEdges()[s_id_list[i]]); + mkFillet.Add(0.1, 0.1, edge); + } + brep_object->bRep->getShape() = mkFillet.Shape(); + brep_object->updateDraw(); } + break; + default: + break; + } + + return result; + - brep_object->getShape() = mkFillet.Shape(); } diff --git a/Src/Operation/SGLOperate_FilletEdge.h b/Src/Operation/SGLOperate_FilletEdge.h index e033807..2948a58 100644 --- a/Src/Operation/SGLOperate_FilletEdge.h +++ b/Src/Operation/SGLOperate_FilletEdge.h @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #pragma once #include "MOperate_SelectInfo.h" @@ -26,7 +26,7 @@ namespace acamcad virtual ~SGLOperate_FilletEdge() {}; public: - virtual void operateWithBRep(BRepObject* brep_object) override; + virtual bool DoOperate(AdapterObject* brep_object) override; public: virtual MeshOperationType OperationType() { return MeshOperationType::MeshFilletEdge; } diff --git a/Src/Operation/SGLOperate_Repair.cpp b/Src/Operation/SGLOperate_Repair.cpp new file mode 100644 index 0000000..f502a04 --- /dev/null +++ b/Src/Operation/SGLOperate_Repair.cpp @@ -0,0 +1,22 @@ +#include "SGLOperate_Repair.h" + +#include + +namespace acamcad +{ + SGLOperate_Repair::SGLOperate_Repair(const SelectModel& smodle) + :MOperate_SingleObject(smodle) + { + } + + bool SGLOperate_Repair::DoOperate(AdapterObject* adapter) + { + if (selmodel_ != SelectModel::OBJECT_MODEL || + adapter->dataType() != DataType::TSPLINEU_TYPE) + return false; + + return AMCAX::TMS::TMSplineRepair().RepairTSpline(adapter->tSpline->getTSpline()); + } + +} + diff --git a/Src/Operation/SGLOperate_Repair.h b/Src/Operation/SGLOperate_Repair.h new file mode 100644 index 0000000..a864481 --- /dev/null +++ b/Src/Operation/SGLOperate_Repair.h @@ -0,0 +1,21 @@ +#pragma once +#include "MOperate_SelectInfo.h" + +namespace acamcad +{ + + class SGLOperate_Repair : public MOperate_SingleObject + { + public: + SGLOperate_Repair(const SelectModel& smodle); + virtual ~SGLOperate_Repair() {}; + + public: + virtual bool DoOperate(AdapterObject* adatper) override; + + public: + virtual MeshOperationType OperationType() { return MeshOperationType::TSplineRepair; } + + }; + +} //namespace acamcad \ No newline at end of file diff --git a/Src/Operation/SGLOperate_ReverseNormal.cpp b/Src/Operation/SGLOperate_ReverseNormal.cpp new file mode 100644 index 0000000..9bd2f4d --- /dev/null +++ b/Src/Operation/SGLOperate_ReverseNormal.cpp @@ -0,0 +1,40 @@ +#include "SGLOperate_ReverseNormal.h" + +#include +#include + +acamcad::SGLOperate_ReverseNormal::SGLOperate_ReverseNormal(const SelectModel& smodle) + :MOperate_SingleObject(smodle) +{ +} + +bool acamcad::SGLOperate_ReverseNormal::DoOperate(AdapterObject* adapter) +{ + if (selmodel_ != SelectModel::OBJECT_MODEL) + return false; + + bool result = false; + + switch (adapter->dataType()) + { + case DataType::MESH_TYPE: + { + result = true; + AMCAX::SubD::MeshTool::ReverseMeshNormal(adapter->mesh->mesh()); + } + break; + case DataType::TSPLINEU_TYPE: + { + result = true; + AMCAX::TMS::TMSplineTool::ReverseTMSNormal(adapter->tSpline->getTSpline()); + } + break; + default: + break; + } + + //mesh_object->mesh()->reverse_mesh(); + + + return true; +} \ No newline at end of file diff --git a/Src/Operation/SGLOperate_ReverseNormal.h b/Src/Operation/SGLOperate_ReverseNormal.h new file mode 100644 index 0000000..b9532e3 --- /dev/null +++ b/Src/Operation/SGLOperate_ReverseNormal.h @@ -0,0 +1,22 @@ +#pragma once +#include "MOperate_SelectInfo.h" + +namespace acamcad +{ + + class SGLOperate_ReverseNormal : public MOperate_SingleObject + { + public: + SGLOperate_ReverseNormal(const SelectModel& smodle); + virtual ~SGLOperate_ReverseNormal() {}; + + public: + virtual bool DoOperate(AdapterObject* mesh_object) override; + ///virtual void operateWithTSpline(TSplineObject* tspline_object) override; + + public: + virtual MeshOperationType OperationType() { return MeshOperationType::MeshReverseNormal; } + + }; + +} //namespace acamcad \ No newline at end of file diff --git a/Src/Operation/SGLOperate_Separate.cpp b/Src/Operation/SGLOperate_Separate.cpp new file mode 100644 index 0000000..9c66507 --- /dev/null +++ b/Src/Operation/SGLOperate_Separate.cpp @@ -0,0 +1,47 @@ +#include "SGLOperate_Separate.h" + +#include +#include +#include + + +using namespace acamcad; + +SGLOperate_Separate::SGLOperate_Separate(const SelectModel& smodle) + :MOperate_SingleObject(smodle) +{ +} + +bool SGLOperate_Separate::DoOperate(AdapterObject* adapter) +{ + if (selmodel_ != SelectModel::EDGE_MODEL) + return false; + + bool result = false; + + switch (adapter->dataType()) + { + case DataType::MESH_TYPE: + { + std::vector s_id_list = getSelectSubList(s_info_list_); + //polymesh::meshSeparateEdges(mesh_object->mesh(), s_id_list); + + result = AMCAX::SubD::MeshSeparate::SeparateEdges(adapter->mesh->mesh(), s_id_list); + } + break; + case DataType::TSPLINEU_TYPE: + { + std::vector s_id_list = getSelectSubList(s_info_list_); + + //result = true; + result = AMCAX::TMS::TMSplineSeparate().SeparateEdges(adapter->tSpline->getTSpline(), s_id_list); + + } + break; + default: + break; + } + + return result; +} + diff --git a/Src/Operation/SGLOperate_Separate.h b/Src/Operation/SGLOperate_Separate.h new file mode 100644 index 0000000..5a9584c --- /dev/null +++ b/Src/Operation/SGLOperate_Separate.h @@ -0,0 +1,21 @@ +#pragma once +#include "MOperate_SelectInfo.h" + +namespace acamcad +{ + + class SGLOperate_Separate : public MOperate_SingleObject + { + public: + SGLOperate_Separate(const SelectModel& smodle); + virtual ~SGLOperate_Separate() {}; + + public: + virtual bool DoOperate(AdapterObject* mesh_object) override; + ///virtual void operateWithTSpline(TSplineObject* tspline_object) override; + + public: + virtual MeshOperationType OperationType() { return MeshOperationType::MeshSeparate; } + }; + +} //namespace acamcad \ No newline at end of file diff --git a/Src/Operation/SGLOperate_SplitFace.cpp b/Src/Operation/SGLOperate_SplitFace.cpp new file mode 100644 index 0000000..7db8c83 --- /dev/null +++ b/Src/Operation/SGLOperate_SplitFace.cpp @@ -0,0 +1,29 @@ +#include "SGLOperate_SplitFace.h" + +#include + +namespace acamcad +{ + SGLOperate_SplitFace::SGLOperate_SplitFace(const SelectModel& smodle) :MOperate_SingleObject(smodle) + {} + + bool SGLOperate_SplitFace::DoOperate(AdapterObject* adapter) + { + if (selmodel_ != SelectModel::FACE_MODEL || + adapter->dataType() != DataType::TSPLINEU_TYPE) + return false; + + std::vector ids = getSelectSubList(s_info_list_); + + AMCAX::TMS::TMSplineSplit tool; + + bool result = tool.CanSplitFacesCross(adapter->tSpline->getTSpline(), ids); + + if (result) { + tool.SplitFacesCross(adapter->tSpline->getTSpline(), ids); + adapter->updateDraw(); + } + + return true; + } +} \ No newline at end of file diff --git a/Src/Operation/SGLOperate_SplitFace.h b/Src/Operation/SGLOperate_SplitFace.h new file mode 100644 index 0000000..ea6f13b --- /dev/null +++ b/Src/Operation/SGLOperate_SplitFace.h @@ -0,0 +1,20 @@ +#pragma once +#include "MOperate_SelectInfo.h" + +namespace acamcad +{ + + class SGLOperate_SplitFace : public MOperate_SingleObject + { + public: + SGLOperate_SplitFace(const SelectModel& smodle); + //virtual ~SGLOperate_SplitFace() {}; + + public: + virtual bool DoOperate(AdapterObject* tspline_object) override; + + public: + virtual MeshOperationType OperationType() { return MeshOperationType::MeshSplitFace; } + }; + +} //namespace acamcad \ No newline at end of file diff --git a/Src/Operation/SGLOperate_SplitFaceByEdge.cpp b/Src/Operation/SGLOperate_SplitFaceByEdge.cpp new file mode 100644 index 0000000..4080dcb --- /dev/null +++ b/Src/Operation/SGLOperate_SplitFaceByEdge.cpp @@ -0,0 +1,86 @@ +#include "SGLOperate_SplitFaceByEdge.h" + +#include +#include +#include +#include + +acamcad::SGLOperate_SplitFaceByEdge::SGLOperate_SplitFaceByEdge(const SelectModel& smodle) + :MOperate_SingleObject(smodle) +{ +} + +bool acamcad::SGLOperate_SplitFaceByEdge::DoOperate(AdapterObject* adapter) +{ + if (s_info_list_.size() != re_points_.size()) + { + std::cout << "The edge num is not equal point num" << std::endl; + return false; + } + /* + std::vector edge_id = getSelectSubList(s_info_list_); + std::vector edge_list; edge_list.resize(edge_id.size()); + std::vector edge_t; edge_t.resize(re_points_.size()); + for (int i = 0; i < edge_id.size(); i++) + { + polymesh::MEdge* edge = mesh_object->mesh()->edge(edge_id[i]); + polymesh::MHalfedge* he0 = edge->halfEdge(); + MVector3 vp = re_points_[i] - he0->fromVertex()->position(); + MVector3 vv = he0->toVertex()->position() - he0->fromVertex()->position(); + double t = vp.dot(vv) / vv.normSq(); t = 1 - t; + if (t < 0) t = 0; + else if (t > 1) t = 1; + + edge_t[i] = t; + edge_list[i] = edge; + } + */ + //polymesh::splitFaceWithEdge(mesh_object->mesh(), edge_list, edge_t); + bool result = false; + + switch (adapter->dataType()) + { + case DataType::MESH_TYPE: + { + std::vector edge_id = getSelectSubList(s_info_list_); + + std::vector edge_t; + + for (int i = 0; i < re_points_.size(); i++) { + edge_t.push_back(AMCAX::Point3(re_points_[i])); + } + + result = AMCAX::SubD::MeshSplit::SplitFaceWithEdge(adapter->mesh->mesh(), edge_id, edge_t); + } + break; + case DataType::TSPLINEU_TYPE: + { + std::vector edge_id = getSelectSubList(s_info_list_); + + std::vector edge_t; + for (int i = 0; i < re_points_.size(); i++) { + edge_t.push_back(AMCAX::Point3(re_points_[i])); + } + AMCAX::TMS::TMSplineSplit tool; + + result = tool.CanSplitFaceWithEdge(adapter->tSpline->getTSpline(), edge_id, edge_t); + + if (result) { + tool.SplitFaceWithEdge(adapter->tSpline->getTSpline(), edge_id, edge_t); + adapter->updateDraw(); + } + + } + break; + default: + break; + } + + return result; + +} + +void acamcad::SGLOperate_SplitFaceByEdge::setParameter(const std::vector& related_point) +{ + re_points_ = related_point; +} diff --git a/Src/Operation/SGLOperate_SplitFaceByEdge.h b/Src/Operation/SGLOperate_SplitFaceByEdge.h new file mode 100644 index 0000000..5936b2d --- /dev/null +++ b/Src/Operation/SGLOperate_SplitFaceByEdge.h @@ -0,0 +1,26 @@ +#pragma once +#include "MOperate_SelectInfo.h" + +namespace acamcad +{ + + class SGLOperate_SplitFaceByEdge : public MOperate_SingleObject + { + public: + SGLOperate_SplitFaceByEdge(const SelectModel& smodle); + virtual ~SGLOperate_SplitFaceByEdge() {}; + + public: + virtual bool DoOperate(AdapterObject* adapter) override; + //virtual bool operateWithTSpline(TSplineObject* tspline_object) override; + + public: + virtual MeshOperationType OperationType() { return MeshOperationType::MeshSplitFaceByEdge; } + + virtual void setParameter(const std::vector& related_point) override; + + private: + std::vector re_points_; + }; + +} //namespace acamcad \ No newline at end of file diff --git a/Src/Operation/SGLOperate_SplitFaceVertex.cpp b/Src/Operation/SGLOperate_SplitFaceVertex.cpp new file mode 100644 index 0000000..2b5c9f7 --- /dev/null +++ b/Src/Operation/SGLOperate_SplitFaceVertex.cpp @@ -0,0 +1,61 @@ +#include "SGLOperate_SplitFaceVertex.h" + +#include +#include +#include + +namespace acamcad +{ + + SGLOperate_SplitFaceVertex::SGLOperate_SplitFaceVertex(const SelectModel& smodle) + :MOperate_SingleObject(smodle) + { + } + + bool SGLOperate_SplitFaceVertex::DoOperate(AdapterObject* adapter) + { + if (selmodel_ != SelectModel::VERTEX_MODEL) + return false; + + if (s_info_list_.size() < 2) + return false; + + if (s_info_list_[0].object_id_ != s_info_list_[1].object_id_) + return false; + + if (s_info_list_[0].object_subselect_id_ == s_info_list_[1].object_subselect_id_) + return false; + + bool result = false; + + switch (adapter->dataType()) + { + case DataType::MESH_TYPE: + { + std::vector edges = getSelectSubList(s_info_list_); + + result = AMCAX::SubD::MeshSplit::SplitFaceWithVertex(adapter->mesh->mesh(), edges); + } + break; + case DataType::TSPLINEU_TYPE: + { + std::vector edges = getSelectSubList(s_info_list_); + + AMCAX::TMS::TMSplineSplit tool; + + result = tool.CanSplitFaceWithVertex(adapter->tSpline->getTSpline(), edges); + + if (result) { + tool.SplitFaceWithVertex(adapter->tSpline->getTSpline(), edges); + adapter->updateDraw(); + } + } + break; + default: + break; + } + + return result; + } + +} \ No newline at end of file diff --git a/Src/Operation/SGLOperate_SplitFaceVertex.h b/Src/Operation/SGLOperate_SplitFaceVertex.h new file mode 100644 index 0000000..9eedf3a --- /dev/null +++ b/Src/Operation/SGLOperate_SplitFaceVertex.h @@ -0,0 +1,21 @@ +#pragma once +#include "MOperate_SelectInfo.h" + +namespace acamcad +{ + + class SGLOperate_SplitFaceVertex : public MOperate_SingleObject + { + public: + SGLOperate_SplitFaceVertex(const SelectModel& smodle); + virtual ~SGLOperate_SplitFaceVertex() {}; + + public: + virtual bool DoOperate(AdapterObject* mesh_object) override; + //virtual void operateWithTSpline(TSplineObject* tspline_object); + + public: + virtual MeshOperationType OperationType() { return MeshOperationType::MeshSplitFaceVertex; } + }; + +} //namespace acamcad \ No newline at end of file diff --git a/Src/Operation/SGLOperate_SplitLoop.cpp b/Src/Operation/SGLOperate_SplitLoop.cpp new file mode 100644 index 0000000..4d084f0 --- /dev/null +++ b/Src/Operation/SGLOperate_SplitLoop.cpp @@ -0,0 +1,95 @@ +#include "SGLOperate_SplitLoop.h" + +#include +#include +#include +#include +#include + +acamcad::SGLOperate_SplitLoop::SGLOperate_SplitLoop(const SelectModel& smodle) + :MOperate_SingleObject(smodle) +{ +} + +bool acamcad::SGLOperate_SplitLoop::DoOperate(AdapterObject* adapter) +{ + if (selmodel_ != SelectModel::EDGE_MODEL) + return false; + + if (s_info_list_.size() != 1 || re_points_.size() != s_info_list_.size()) + return false; + + bool result = false; + + switch (adapter->dataType()) + { + case DataType::MESH_TYPE: + { + int p0, p1; + AMCAX::SubD::MeshTool::EdgeVertexIndexs(adapter->mesh->mesh(), s_info_list_[0].object_subselect_id_, p0, p1); + + AMCAX::Point3 point0 = AMCAX::SubD::MeshTool::Position(adapter->mesh->mesh(), p0), + point1 = AMCAX::SubD::MeshTool::Position(adapter->mesh->mesh(), p1), + pointT(re_points_[0]); + + double t = point0.Distance(pointT) / point0.Distance(point1); + + result = AMCAX::SubD::MeshSplit::SplitLoop(adapter->mesh->mesh(), s_info_list_[0].object_subselect_id_, 1 - t); + } + break; + case DataType::TSPLINEU_TYPE: + { + int p0, p1; + AMCAX::TMS::TMSplineTool::EdgeVertexIndexs(adapter->tSpline->getTSpline(), s_info_list_[0].object_subselect_id_, + p0, p1); + AMCAX::Point3 point0 = AMCAX::TMS::TMSplineTool::ControlPosition(adapter->tSpline->getTSpline(), p0), + point1 = AMCAX::TMS::TMSplineTool::ControlPosition(adapter->tSpline->getTSpline(), p1), + pointT(re_points_[0]); + + double t = point0.Distance(pointT) / point0.Distance(point1); + AMCAX::TMS::TMSplineSplit tool; + result = tool.CanSplitFaceLoop(adapter->tSpline->getTSpline(), s_info_list_[0].object_subselect_id_, t); + if (result) { + tool.SplitFaceLoop(adapter->tSpline->getTSpline(), s_info_list_[0].object_subselect_id_, t); + adapter->updateDraw(); + } + //result = AMCAX::TMS::TMSplineSplit().SplitFaceLoop(adapter->tSpline->getTSpline(), 1 - t); + } + break; + default: + break; + } + + return result; + + //polymesh::splitLoop(mesh_object->mesh(), edge, t); +} + +/* +void acamcad::SGLOperate_SplitLoop::operateWithTSpline(TSplineObject* tspline_object) +{ + if (selmodel_ != SelectModel::EDGE_MODEL) + return; + + if (s_info_list_.size() != 1 || re_points_.size() != s_info_list_.size()) + return; + + tspline::TEdge* edge = tspline_object->getTSpline()->edge(s_info_list_[0].object_subselect_id_); + tspline::TLink* he0 = edge->halfEdge(); + MVector3 vp = re_points_[0].point() - he0->fromVertex()->controlPosition(); + MVector3 vv = he0->toVertex()->controlPosition() - he0->fromVertex()->controlPosition(); + double t = vp.dot(vv) / vv.normSq(); + if (t < 0) t = 0; + else if (t > 1) t = 1; + + tspline::TO_SplitControl split; + split.splitFaceLoop(tspline_object->getTSpline(), edge->index(), t); + split.getTSpline(tspline_object->getTSpline()); + tspline_object->updateDraw(); +} +*/ + +void acamcad::SGLOperate_SplitLoop::setParameter(const std::vector& related_point) +{ + re_points_ = related_point; +} diff --git a/Src/Operation/SGLOperate_SplitLoop.h b/Src/Operation/SGLOperate_SplitLoop.h new file mode 100644 index 0000000..a8a7963 --- /dev/null +++ b/Src/Operation/SGLOperate_SplitLoop.h @@ -0,0 +1,26 @@ +#pragma once +#include "MOperate_SelectInfo.h" + +namespace acamcad +{ + + class SGLOperate_SplitLoop : public MOperate_SingleObject + { + public: + SGLOperate_SplitLoop(const SelectModel& smodle); + virtual ~SGLOperate_SplitLoop() {}; + + public: + virtual bool DoOperate(AdapterObject* mesh_object) override; + //virtual void operateWithTSpline(TSplineObject* tspline_object) override; + + public: + virtual MeshOperationType OperationType() { return MeshOperationType::MeshSplitLoop; } + + virtual void setParameter(const std::vector& related_point) override; + + private: + std::vector re_points_; + }; + +} //namespace acamcad \ No newline at end of file diff --git a/Src/Operation/SGLOperate_Thicken.cpp b/Src/Operation/SGLOperate_Thicken.cpp new file mode 100644 index 0000000..13239d1 --- /dev/null +++ b/Src/Operation/SGLOperate_Thicken.cpp @@ -0,0 +1,45 @@ +#include "SGLOperate_Thicken.h" + +#include +#include + +#include + +namespace acamcad +{ + SGLOperate_Thicken::SGLOperate_Thicken(const SelectModel& smodle) : + MOperate_SingleObject(smodle) + { + } + + bool SGLOperate_Thicken::DoOperate(AdapterObject* adapter) + { + bool result = false; + + switch (adapter->dataType()) + { + case DataType::MESH_TYPE: + //AMCAX::SubD::MeshTool::MeshTriangles(adapter->mesh->mesh()); + //result = true; + result = AMCAX::SubD::MeshOffset::ThickenMesh(adapter->mesh->mesh(), 0.2); + break; + case DataType::TSPLINEU_TYPE: + { + result = AMCAX::TMS::TMSplineThicken().ThickenTMSplins(adapter->tSpline->getTSpline(), 0.2); + + } + break; + default: + break; + } + + + if (result) { + adapter->updateDraw(); + } + + return result; + + + } +} \ No newline at end of file diff --git a/Src/Operation/SGLOperate_Thicken.h b/Src/Operation/SGLOperate_Thicken.h new file mode 100644 index 0000000..1dd0e6d --- /dev/null +++ b/Src/Operation/SGLOperate_Thicken.h @@ -0,0 +1,35 @@ +/* =================================================================== +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* All rights reserved. +* +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* software under the terms of either license. +* +* For more information about the AGPLv3.0 license, please visit: +* https://www.gnu.org/licenses/agpl-3.0.html +* For licensing inquiries or to obtain a commercial license, please +* contact Hefei Jiushao Intelligent Technology Co., Ltd. +* =================================================================== +* Author: +*/ +#pragma once +#include "MOperate_SelectInfo.h" + +namespace acamcad +{ + + class SGLOperate_Thicken : public MOperate_SingleObject + { + public: + SGLOperate_Thicken(const SelectModel& smodle); + virtual ~SGLOperate_Thicken() {}; + + public: + virtual bool DoOperate(AdapterObject* brep_object) override; + + public: + virtual MeshOperationType OperationType() { return MeshOperationType::MeshThicken; } + }; + +} //namespace acamcad \ No newline at end of file diff --git a/Src/Operation/SGLOperate_TriangulateMesh.cpp b/Src/Operation/SGLOperate_TriangulateMesh.cpp new file mode 100644 index 0000000..3a6d70f --- /dev/null +++ b/Src/Operation/SGLOperate_TriangulateMesh.cpp @@ -0,0 +1,33 @@ +#include "SGLOperate_TriangulateMesh.h" + +#include + +namespace acamcad +{ + SGLOperate_TriangulateMesh::SGLOperate_TriangulateMesh(const SelectModel& smodle) : + MOperate_SingleObject(smodle) + { + } + + bool SGLOperate_TriangulateMesh::DoOperate(AdapterObject* adapter) + { + if (selmodel_ != SelectModel::OBJECT_MODEL) + return false; + + bool result = false; + + switch (adapter->dataType()) + { + case DataType::MESH_TYPE: + AMCAX::SubD::MeshTool::MeshTriangles(adapter->mesh->mesh()); + result = true; + break; + default: + break; + } + + return result; + + + } +} \ No newline at end of file diff --git a/Src/Operation/SGLOperate_TriangulateMesh.h b/Src/Operation/SGLOperate_TriangulateMesh.h new file mode 100644 index 0000000..6530de7 --- /dev/null +++ b/Src/Operation/SGLOperate_TriangulateMesh.h @@ -0,0 +1,35 @@ +/* =================================================================== +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* All rights reserved. +* +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* software under the terms of either license. +* +* For more information about the AGPLv3.0 license, please visit: +* https://www.gnu.org/licenses/agpl-3.0.html +* For licensing inquiries or to obtain a commercial license, please +* contact Hefei Jiushao Intelligent Technology Co., Ltd. +* =================================================================== +* Author: +*/ +#pragma once +#include "MOperate_SelectInfo.h" + +namespace acamcad +{ + + class SGLOperate_TriangulateMesh : public MOperate_SingleObject + { + public: + SGLOperate_TriangulateMesh(const SelectModel& smodle); + virtual ~SGLOperate_TriangulateMesh() {}; + + public: + virtual bool DoOperate(AdapterObject* brep_object) override; + + public: + virtual MeshOperationType OperationType() { return MeshOperationType::MeshTriangulate; } + }; + +} //namespace acamcad \ No newline at end of file diff --git a/Src/Operation/SGLOperate_Uniform.cpp b/Src/Operation/SGLOperate_Uniform.cpp new file mode 100644 index 0000000..13baf1e --- /dev/null +++ b/Src/Operation/SGLOperate_Uniform.cpp @@ -0,0 +1,32 @@ +#include "SGLOperate_Uniform.h" + +#include + +namespace acamcad +{ + SGLOperate_Uniform::SGLOperate_Uniform(const SelectModel& smodle) + :MOperate_SingleObject(smodle) + { + } + + bool SGLOperate_Uniform::DoOperate(AdapterObject* object) + { + if (selmodel_ != SelectModel::OBJECT_MODEL || + object->dataType() != DataType::TSPLINEU_TYPE) + return false; + + AMCAX::TMS::TMSplineRepair repair; + + bool result = repair.UniformTSpline(object->tSpline->getTSpline()); + + if (result) + { + object->updateDraw(); + } + + return result; + } + +} + + diff --git a/Src/Operation/SGLOperate_Uniform.h b/Src/Operation/SGLOperate_Uniform.h new file mode 100644 index 0000000..f7a67a8 --- /dev/null +++ b/Src/Operation/SGLOperate_Uniform.h @@ -0,0 +1,21 @@ +#pragma once +#include "MOperate_SelectInfo.h" + +namespace acamcad +{ + + class SGLOperate_Uniform : public MOperate_SingleObject + { + public: + SGLOperate_Uniform(const SelectModel& smodle); + virtual ~SGLOperate_Uniform() {}; + + public: + virtual bool DoOperate(AdapterObject* object) override; + + public: + virtual MeshOperationType OperationType() { return MeshOperationType::TSplineUniform; } + + }; + +} //namespace acamcad \ No newline at end of file diff --git a/Src/Operation/SGLOperate_WeldEdge.cpp b/Src/Operation/SGLOperate_WeldEdge.cpp new file mode 100644 index 0000000..c51b546 --- /dev/null +++ b/Src/Operation/SGLOperate_WeldEdge.cpp @@ -0,0 +1,55 @@ +#include "SGLOperate_WeldEdge.h" + +#include +#include +#include + +using namespace acamcad; + +SGLOperate_WeldEdge::SGLOperate_WeldEdge(const SelectModel& smodle) + :MOperate_SingleObject(smodle) +{ +} + +bool SGLOperate_WeldEdge::DoOperate(AdapterObject* adapter) +{ + bool result = false; + if (selmodel_ == SelectModel::EDGE_MODEL) + { + switch (adapter->dataType()) + { + case DataType::MESH_TYPE: + { + std::vector s_id_list = getSelectSubList(s_info_list_); + + result = AMCAX::SubD::MeshWeld::FilterVoidWeldEdges(adapter->mesh->mesh(), s_id_list); + + if (result) { + AMCAX::SubD::MeshWeld::MeshWeldEdges(adapter->mesh->mesh(), s_id_list); + } + } + break; + case DataType::TSPLINEU_TYPE: + { + std::vector s_id_list = getSelectSubList(s_info_list_); + + AMCAX::TMS::TMSplineWeld tool; + result = tool.FilterVoidWeldEdges(adapter->tSpline->getTSpline(), s_id_list); + + if (result) { + tool.WeldEdges(adapter->tSpline->getTSpline(), s_id_list); + adapter->updateDraw(); + } + + } + break; + default: + break; + } + } + + return result; + + +} + diff --git a/Src/Operation/SGLOperate_WeldEdge.h b/Src/Operation/SGLOperate_WeldEdge.h new file mode 100644 index 0000000..a4a0f47 --- /dev/null +++ b/Src/Operation/SGLOperate_WeldEdge.h @@ -0,0 +1,21 @@ +#pragma once +#include "MOperate_SelectInfo.h" + +namespace acamcad +{ + + class SGLOperate_WeldEdge : public MOperate_SingleObject + { + public: + SGLOperate_WeldEdge(const SelectModel& smodle); + virtual ~SGLOperate_WeldEdge() {}; + + public: + virtual bool DoOperate(AdapterObject* mesh_object) override; + //virtual void operateWithTSpline(TSplineObject* tspline_object) override; + + public: + virtual MeshOperationType OperationType() { return MeshOperationType::MeshWeldEdge; } + }; + +} //namespace acamcad \ No newline at end of file diff --git a/Src/Windows/ACAMWindow.cpp b/Src/Windows/ACAMWindow.cpp index adc71ce..d0dbfc0 100644 --- a/Src/Windows/ACAMWindow.cpp +++ b/Src/Windows/ACAMWindow.cpp @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "ACAMWindow.h" #include @@ -20,6 +20,7 @@ #include #include #include +#include #include "RenderViewer.h" #include "../Core/DataManager.h" @@ -29,128 +30,255 @@ using namespace acamcad; -ACAMWindow::ACAMWindow(QWidget *parent) - : QMainWindow(parent) + +ACAMWindow::ACAMWindow(QWidget* parent) + : QMainWindow(parent) { - ui.setupUi(this); + ui.setupUi(this); + + size_t icon_size = 36; - size_t icon_size = 36; + this->setIconSize(QSize(icon_size, icon_size)); + this->setWindowIcon(QIcon(":images/images/logo.ico")); - this->setIconSize(QSize(icon_size, icon_size)); - this->setWindowIcon(QIcon(":images/images/logo.ico")); + initCoreAndViewer(); - initCoreAndViewer(); + createAction(); + createMenus(); + createToolBars(); - createAction(); - createMenus(); - createToolBars(); + OperateToolBar* tab_widget = new OperateToolBar(render_viewer_, this); + connect(tab_widget, &OperateToolBar::currentChanged, this, &ACAMWindow::slotCurrentChanged); - OperateToolBar* tab_widget = new OperateToolBar(render_viewer_, this); render_viewer_->selectCheckChanged(); - - QVBoxLayout* layout_main = new QVBoxLayout; - size_t bar_height = tab_widget->tabBar()->height(); + QVBoxLayout* layout_main = new QVBoxLayout; + + size_t bar_height = tab_widget->tabBar()->height(); + + tab_widget->setMaximumHeight(icon_size + bar_height + 2); + + layout_main->addWidget(tab_widget, 0, Qt::AlignTop); + layout_main->addWidget(render_viewer_, 10); + + this->centralWidget()->setLayout(layout_main); - tab_widget->setMaximumHeight(icon_size + bar_height + 2); + this->resize(1280, 750); - layout_main->addWidget(tab_widget, 0, Qt::AlignTop); - layout_main->addWidget(render_viewer_, 10); + slotCurrentChanged(1); - this->centralWidget()->setLayout(layout_main); + //instance = this; - this->resize(1280, 720); + //ShowMessge("Selet dd", acamcad::DataType::BREP_TYPE | acamcad::DataType::TSPLINEU_TYPE); + + ///statusBar()->showMessage("XXXXXXXXXXXXXXXXXXX!!!"); } ACAMWindow::~ACAMWindow() { - delete render_viewer_; - delete dataManager_; - delete undoRedoHandler_; - delete core_; + delete render_viewer_; + delete dataManager_; + //delete undoRedoHandler_; + delete core_; } void ACAMWindow::initCoreAndViewer() { - dataManager_ = new DataManager(); + dataManager_ = new DataManager(); - undoRedoHandler_ = new UndoRedoHandler(dataManager_, 50); + //undoRedoHandler_ = new UndoRedoHandler(dataManager_, 50); - core_ = new acamcad::AMCore(); - core_->setDataManager(dataManager_); - core_->setUndoRedoHandler(undoRedoHandler_); + core_ = new acamcad::AMCore(); + core_->setDataManager(dataManager_); + //core_->setUndoRedoHandler(undoRedoHandler_); - render_viewer_ = new acamcad::RenderViewer(this); - render_viewer_->setDataManger(dataManager_); - render_viewer_->setCore(core_); + render_viewer_ = new acamcad::RenderViewer(this); + render_viewer_->setDataManger(dataManager_); + render_viewer_->setCore(core_); } void ACAMWindow::createAction() { - // menu actions - createAction_File(); - createAction_Edit(); - createAction_Help(); - - // left side toolbar actions - createAction_Tetransform(); - createAction_Topology(); + // menu actions + createAction_File(); + createAction_Edit(); + createAction_Help(); + + // left side toolbar actions + createAction_LeftTools(); } void ACAMWindow::createAction_File() { - openAction_ = new QAction(tr("Open")); - openAction_->setStatusTip(tr("Open a file")); - connect(openAction_, &QAction::triggered, core_, &AMCore::loadObjects); - - saveAction_ = new QAction(tr("Save")); - saveAction_->setStatusTip(tr("Save to file")); - connect(saveAction_, &QAction::triggered, core_, QOverload<>::of(&AMCore::saveObjects)); - - exportAction_ = new QAction(tr("Export Selected")); - exportAction_->setStatusTip(tr("Export selected models")); - connect(exportAction_, &QAction::triggered, core_, &AMCore::saveSelectedObjects); - - // TODO: - exitAction_ = new QAction(tr("Exit")); - exitAction_->setStatusTip(tr("Exit the program")); - connect(exitAction_, &QAction::triggered, this, &ACAMWindow::close); - // check if unsaved... + openAction_ = new QAction(tr("Open")); + openAction_->setStatusTip(tr("Open a file")); + connect(openAction_, &QAction::triggered, core_, &AMCore::loadObjects); + + saveAction_ = new QAction(tr("Save")); + saveAction_->setStatusTip(tr("Save to file")); + connect(saveAction_, &QAction::triggered, core_, QOverload<>::of(&AMCore::saveObjects)); + + exportAction_ = new QAction(tr("Export Selected")); + exportAction_->setStatusTip(tr("Export selected models")); + connect(exportAction_, &QAction::triggered, core_, &AMCore::saveSelectedObjects); + + // TODO: + exitAction_ = new QAction(tr("Exit")); + exitAction_->setStatusTip(tr("Exit the program")); + connect(exitAction_, &QAction::triggered, this, &ACAMWindow::close); + // check if unsaved... } -void ACAMWindow::createAction_Edit() +void ACAMWindow::createAction_Edit() { - undoAction_ = new QAction(tr("Undo")); - undoAction_->setStatusTip(tr("Undo")); - connect(undoAction_, &QAction::triggered, render_viewer_, &RenderViewer::slotUndo); + undoAction_ = new QAction(tr("Undo")); + undoAction_->setStatusTip(tr("Undo")); + connect(undoAction_, &QAction::triggered, render_viewer_, &RenderViewer::slotUndo); + + redoAction_ = new QAction(tr("Redo")); + redoAction_->setStatusTip(tr("Redo")); + connect(redoAction_, &QAction::triggered, render_viewer_, &RenderViewer::slotRedo); - redoAction_ = new QAction(tr("Redo")); - redoAction_->setStatusTip(tr("Redo")); - connect(redoAction_, &QAction::triggered, render_viewer_, &RenderViewer::slotRedo); + + //undoAction_->setEnabled(false); } void ACAMWindow::createAction_Help() { - aboutAction_ = new QAction(tr("About")); - aboutAction_->setStatusTip("About us"); - // TODO connect + aboutAction_ = new QAction(tr("About")); + aboutAction_->setStatusTip("About us"); + // TODO connect } -void ACAMWindow::createAction_Tetransform() + +void ACAMWindow::createAction_LeftTools() { + chamferAction_ = new QAction("Chamfer Edges"); + chamferAction_->setStatusTip(tr("(Support Brep)select an edge to chamfer")); + chamferAction_->setIcon(QIcon(":images/images/Chamfer.png")); + connect(chamferAction_, &QAction::triggered, this, &ACAMWindow::slotChamfer); + + deleteFaceAction_ = new QAction("Delete Face"); + deleteFaceAction_->setStatusTip(tr("(Support Mesh)Delete a face from mesh, the define is face, Enter sure")); + deleteFaceAction_->setIcon(QIcon(":images/images/DeleteFace.png")); + connect(deleteFaceAction_, &QAction::triggered, this, &ACAMWindow::slotDeleteElement); + + embedAction_ = new QAction("Embed face"); + embedAction_->setStatusTip( + tr("(Support Mesh)Embed a face to mesh, select connected boundary vert or connected boundary edge, enter sure")); + embedAction_->setIcon(QIcon(":images/images/EmbedFace.png")); + connect(embedAction_, &QAction::triggered, this, &ACAMWindow::slotEmbedFace); + + + separateAction_ = new QAction("Separate"); + deleteFaceAction_->setStatusTip(tr("(Support Mesh)Sperate a face from mesh , select vertex or edge, Enter sure")); + separateAction_->setIcon(QIcon(":images/images/Separate.png")); + connect(separateAction_, &QAction::triggered, this, &ACAMWindow::slotSeparateEdge); + + weldAction_ = new QAction("Weld"); + deleteFaceAction_->setStatusTip(tr("(Support Mesh)Weld a edge to mesh , select edge, Enter sure")); + weldAction_->setIcon(QIcon(":images/images/Weld.png")); + connect(weldAction_, &QAction::triggered, this, &ACAMWindow::slotWeldEdge); + + + + splitLoopAction_ = new QAction("Split loop"); + splitLoopAction_->setStatusTip(tr("Split a mesh loop")); + splitLoopAction_->setIcon(QIcon(":images/images/SplitLoop.png")); + connect(splitLoopAction_, &QAction::triggered, this, &ACAMWindow::slotSplitLoop); + + //splitEdgeAction_ = new QAction("Split edge"); + //splitEdgeAction_->setStatusTip(tr("Split a edge")); + //splitEdgeAction_->setIcon(QIcon(":images/images/SplitEdge.png")); + //connect(splitEdgeAction_, &QAction::triggered, this, &ACAMWindow::slotSplitEdge); + splitFaceAction_ = new QAction("split face"); + splitFaceAction_->setStatusTip(tr("split face cross")); + splitFaceAction_->setIcon(QIcon(":images/images/SplitFace1.png")); + connect(splitFaceAction_, &QAction::triggered, this, &ACAMWindow::slotSplitFace); + + + splitFaceEdgeAction_ = new QAction("Split Face by Edge"); + splitFaceEdgeAction_->setStatusTip(tr("Split Face by select some edge")); + splitFaceEdgeAction_->setIcon(QIcon(":images/images/SplitEdgeOnly.png")); + connect(splitFaceEdgeAction_, &QAction::triggered, this, &ACAMWindow::slotSplitFaceByEdge); + + + splitFaceVertAction_ = new QAction("Cut face"); + splitFaceVertAction_->setStatusTip(tr("Cat the face by select vert")); + splitFaceVertAction_->setIcon(QIcon(":images/images/SplitFace.png")); + connect(splitFaceVertAction_, &QAction::triggered, this, &ACAMWindow::slotSplitFaceByVert); + + //collapseEdgeAction_ = new QAction("combine Vert"); + //collapseEdgeAction_->setStatusTip(tr("Combine ywo Vertex")); + //collapseEdgeAction_->setIcon(QIcon(":images/images/CollapseEdge.png")); + //connect(collapseEdgeAction_, &QAction::triggered, this, &ACAMWindow::slotCollapseEdge); + + //swapEdgeAction_ = new QAction("Swap Edge"); + //swapEdgeAction_->setStatusTip(tr("Swap a mesh edge")); + //swapEdgeAction_->setIcon(QIcon(":images/images/SwapEdge.png")); + //connect(swapEdgeAction_, &QAction::triggered, this, &ACAMWindow::slotSwapMeshEdge); + + + bridgeEdgeAction_ = new QAction("Bridge edge"); + bridgeEdgeAction_->setStatusTip(tr("Bridge to edge, select two not connected boudnary edge, enter sure")); + bridgeEdgeAction_->setIcon(QIcon(":images/images/BridgeEdge.png")); + connect(bridgeEdgeAction_, &QAction::triggered, this, &ACAMWindow::slotBridgeEdge); + + extrudeEdgeVAction_ = new QAction("Extrude edge Vertical"); + extrudeEdgeVAction_->setStatusTip(tr("Select some edge, use Ctrl+left to extrude edge, direction vartical face")); + extrudeEdgeVAction_->setIcon(QIcon(":images/images/ExtrudeEdgeVertical.png")); + connect(extrudeEdgeVAction_, &QAction::triggered, this, &ACAMWindow::slotExtrudeEdgeV); + + extrudeEdgeHAction_ = new QAction("Extrude edge Horizontal"); + extrudeEdgeHAction_->setStatusTip(tr("Select some edge, use Ctrl+left to extrude edge, direction horizontal face")); + extrudeEdgeHAction_->setIcon(QIcon(":images/images/ExtrudeEdgeHorizontal.png")); + connect(extrudeEdgeHAction_, &QAction::triggered, this, &ACAMWindow::slotExtrudeEdgeH); + + //chamferAction_->setVisible(false); + + thickenAction_ = new QAction("Thicken Mesh"); + thickenAction_->setStatusTip(tr("Thicken a mesh")); + thickenAction_->setIcon(QIcon(":images/images/Thicken.png")); + connect(thickenAction_, &QAction::triggered, this, &ACAMWindow::slotThicken); + + normalAction_ = new QAction("Reverse Mesh Normal"); + normalAction_->setStatusTip(tr("Reverse Mesh Normal")); + normalAction_->setIcon(QIcon(":images/images/ReverseNormal.png")); + connect(normalAction_, &QAction::triggered, this, &ACAMWindow::slotMeshReverse); + + fillHoleAction_ = new QAction("FillHole"); + fillHoleAction_->setStatusTip(tr("Try to FillHole")); + fillHoleAction_->setIcon(QIcon(":images/images/FillHole.png")); + connect(fillHoleAction_, &QAction::triggered, this, &ACAMWindow::slotFillHole); + + filletAction_ = new QAction("Fillet Edges"); + filletAction_->setStatusTip(tr("(Support Brep)select an edge to fillet")); + filletAction_->setIcon(QIcon(":images/images/fillet.png")); + connect(filletAction_, &QAction::triggered, this, &ACAMWindow::slotFillet); + + extrudAction_ = new QAction("Extrude Face"); + extrudAction_->setStatusTip(tr("(Support Brep)select a face to extrude(Support Mesh)")); + extrudAction_->setIcon(QIcon(":images/images/ExtrudeFace.png")); + connect(extrudAction_, &QAction::triggered, render_viewer_, &RenderViewer::slotBRepExtrude); + + extrudActionMesh_ = new QAction("Extrude Face Mesh"); + extrudActionMesh_->setStatusTip(tr("(Support Brep)select a face to extrude(Support Mesh)")); + extrudActionMesh_->setIcon(QIcon(":images/images/ExtrudeFace.png")); + connect(extrudActionMesh_, &QAction::triggered, this, &ACAMWindow::slotExtrudeFace); + bool_fuseAction_ = new QAction("Fuse Object"); - bool_fuseAction_->setStatusTip(tr("Fuse more than one Object to a one Object")); + bool_fuseAction_->setStatusTip(tr("(Support Brep)Fuse more than one Object to a one Object")); bool_fuseAction_->setIcon(QIcon(":images/images/BoolFuse.png")); connect(bool_fuseAction_, SIGNAL(triggered()), this, SLOT(slotBoolFuseObject())); bool_cutAction_ = new QAction("Cut Object"); - bool_cutAction_->setStatusTip(tr("one object Cut other more than one Object")); + bool_cutAction_->setStatusTip(tr("(Support Brep)one object Cut other more than one Object")); bool_cutAction_->setIcon(QIcon(":images/images/BoolCut.png")); connect(bool_cutAction_, SIGNAL(triggered()), this, SLOT(slotBoolCutObject())); bool_CommonAction_ = new QAction("Common Object"); - bool_CommonAction_->setStatusTip(tr("find more than one Object' common Object")); + bool_CommonAction_->setStatusTip(tr("(Support Brep)find more than one Object' common Object")); bool_CommonAction_->setIcon(QIcon(":images/images/BoolCommon.png")); connect(bool_CommonAction_, SIGNAL(triggered()), this, SLOT(slotBoolCommonObject())); @@ -158,58 +286,91 @@ void ACAMWindow::createAction_Tetransform() duplicateAction_ = new QAction("duplicate"); } -void ACAMWindow::createAction_Topology() -{ - chamferAction_ = new QAction("Chamfer Edges"); - chamferAction_->setStatusTip(tr("select an edge to chamfer")); - chamferAction_->setIcon(QIcon(":images/images/Chamfer.png")); - connect(chamferAction_, &QAction::triggered, this, &ACAMWindow::slotChamfer); - filletAction_ = new QAction("Fillet Edges"); - filletAction_->setStatusTip(tr("select an edge to fillet")); - filletAction_->setIcon(QIcon(":images/images/fillet.png")); - connect(filletAction_, &QAction::triggered, this, &ACAMWindow::slotFillet); - - extrudAction_ = new QAction("Extrude Face"); - extrudAction_->setStatusTip(tr("select a face to extrude")); - extrudAction_->setIcon(QIcon(":images/images/ExtrudeFace.png")); - connect(extrudAction_, &QAction::triggered, render_viewer_, &RenderViewer::slotBRepExtrude); -} //================================================================ void ACAMWindow::createMenus() { - fileMenu_ = menuBar()->addMenu(tr("&File")); - fileMenu_->addAction(openAction_); - fileMenu_->addAction(saveAction_); - fileMenu_->addAction(exportAction_); - fileMenu_->addSeparator(); - fileMenu_->addAction(exitAction_); - - editMenu_ = menuBar()->addMenu(tr("Edit")); - editMenu_->addAction(undoAction_); - editMenu_->addAction(redoAction_); - - helpMenu_ = menuBar()->addMenu(tr("Help")); - helpMenu_->addAction(aboutAction_); + fileMenu_ = menuBar()->addMenu(tr("&File")); + fileMenu_->addAction(openAction_); + fileMenu_->addAction(saveAction_); + fileMenu_->addAction(exportAction_); + fileMenu_->addSeparator(); + fileMenu_->addAction(exitAction_); + + editMenu_ = menuBar()->addMenu(tr("Edit")); + editMenu_->addAction(undoAction_); + editMenu_->addAction(redoAction_); + + helpMenu_ = menuBar()->addMenu(tr("Help")); + helpMenu_->addAction(aboutAction_); } - void ACAMWindow::createToolBars() +void ACAMWindow::createToolBars() { -//============================================================= + //============================================================= QToolBar* editToolBar_ = new QToolBar(this); - editToolBar_->setObjectName(QString::fromUtf8("Edit")); - this->addToolBar(Qt::LeftToolBarArea, editToolBar_); - - editToolBar_->addAction(chamferAction_); - editToolBar_->addAction(filletAction_); - editToolBar_->addAction(extrudAction_); - - editToolBar_->addSeparator(); - editToolBar_->addAction(bool_fuseAction_); - editToolBar_->addAction(bool_cutAction_); - editToolBar_->addAction(bool_CommonAction_); + editToolBar_->setObjectName(QString::fromUtf8("Edit")); + this->addToolBar(Qt::LeftToolBarArea, editToolBar_); + + + + editToolBar_->addAction(deleteFaceAction_); + list_actions_.push_back(deleteFaceAction_); + editToolBar_->addAction(embedAction_); + list_actions_.push_back(embedAction_); + editToolBar_->addAction(separateAction_); + list_actions_.push_back(separateAction_); + editToolBar_->addAction(weldAction_); + list_actions_.push_back(weldAction_); + + editToolBar_->addSeparator(); + + //===================================== + editToolBar_->addAction(splitLoopAction_); + list_actions_.push_back(splitLoopAction_); + editToolBar_->addAction(splitFaceAction_); + list_actions_.push_back(splitFaceAction_); + //editToolBar_->addAction(splitEdgeAction_); + editToolBar_->addAction(splitFaceEdgeAction_); + list_actions_.push_back(splitFaceEdgeAction_); + editToolBar_->addAction(splitFaceVertAction_); + list_actions_.push_back(splitFaceVertAction_); + //editToolBar_->addAction(collapseEdgeAction_); + //editToolBar_->addAction(swapEdgeAction_); + + editToolBar_->addAction(chamferAction_); + list_actions_.push_back(chamferAction_); + editToolBar_->addAction(filletAction_); + list_actions_.push_back(filletAction_); + editToolBar_->addAction(bridgeEdgeAction_); + list_actions_.push_back(bridgeEdgeAction_); + editToolBar_->addAction(extrudeEdgeVAction_); + list_actions_.push_back(extrudeEdgeVAction_); + editToolBar_->addAction(extrudeEdgeHAction_); + list_actions_.push_back(extrudeEdgeHAction_); + editToolBar_->addAction(extrudAction_); + list_actions_.push_back(extrudAction_); + editToolBar_->addAction(extrudActionMesh_); + list_actions_.push_back(extrudActionMesh_); + + editToolBar_->addSeparator(); + + editToolBar_->addAction(thickenAction_); + list_actions_.push_back(thickenAction_); + editToolBar_->addAction(normalAction_); + list_actions_.push_back(normalAction_); + editToolBar_->addAction(fillHoleAction_); + list_actions_.push_back(fillHoleAction_); + + + editToolBar_->addAction(bool_fuseAction_); + list_actions_.push_back(bool_fuseAction_); + editToolBar_->addAction(bool_cutAction_); + list_actions_.push_back(bool_cutAction_); + editToolBar_->addAction(bool_CommonAction_); + list_actions_.push_back(bool_CommonAction_); } //================================================================ @@ -242,9 +403,103 @@ void ACAMWindow::slotChamfer() BaseObjectOperation(SelectModel::EDGE_MODEL, OperationType::ENTER_OPERATION, MeshOperationType::MeshChamferEdge); } +void ACAMWindow::slotEmbedFace() +{ + BaseObjectOperation(SelectModel::VERTEX_MODEL, OperationType::ENTER_OPERATION, MeshOperationType::MeshEmbedFace); +} + +void ACAMWindow::slotDeleteElement() +{ + BaseObjectOperation(SelectModel::FACE_MODEL, OperationType::ENTER_OPERATION, MeshOperationType::MeshDeleteElement); +} + +void ACAMWindow::slotSeparateEdge() +{ + BaseObjectOperation(SelectModel::EDGE_MODEL, OperationType::ENTER_OPERATION, MeshOperationType::MeshSeparate); +} + +void ACAMWindow::slotWeldEdge() +{ + BaseObjectOperation(SelectModel::EDGE_MODEL, OperationType::ENTER_OPERATION, MeshOperationType::MeshWeldEdge); +} + void ACAMWindow::slotFillet() { - BaseObjectOperation(SelectModel::EDGE_MODEL, OperationType::ENTER_OPERATION, MeshOperationType::MeshFilletEdge); + BaseObjectOperation(SelectModel::EDGE_MODEL, OperationType::ENTER_OPERATION, MeshOperationType::MeshFilletEdge); +} + + +void ACAMWindow::slotSplitEdge() +{ + BaseObjectOperation(SelectModel::EDGE_MODEL, OperationType::PICK_OPERATION_MOVE, MeshOperationType::MeshSplitEdge); +} + +void ACAMWindow::slotSplitLoop() +{ + BaseObjectOperation(SelectModel::EDGE_MODEL, OperationType::PICK_OPERATION_MOVE, MeshOperationType::MeshSplitLoop); +} + +void ACAMWindow::slotSplitFace() +{ + BaseObjectOperation(SelectModel::FACE_MODEL, OperationType::ENTER_OPERATION, MeshOperationType::MeshSplitFace); +} + +void ACAMWindow::slotSplitFaceByEdge() +{ + BaseObjectOperation(SelectModel::EDGE_MODEL, OperationType::PICK_OPERATION_MOVE_MULTI, MeshOperationType::MeshSplitFaceByEdge); +} + + +void ACAMWindow::slotSplitFaceByVert() +{ + BaseObjectOperation(SelectModel::VERTEX_MODEL, OperationType::ENTER_OPERATION, MeshOperationType::MeshSplitFaceVertex); +} + + +void ACAMWindow::slotSwapMeshEdge() +{ + BaseObjectOperation(SelectModel::EDGE_MODEL, OperationType::PICK_OPERATION_SINGLE, MeshOperationType::MeshSwapEdge); +} + +void ACAMWindow::slotCombineTwoFace() +{ + BaseObjectOperation(SelectModel::EDGE_MODEL, OperationType::PICK_OPERATION_SINGLE, MeshOperationType::MeshCombineFace); +} + +void ACAMWindow::slotCollapseEdge() +{ + BaseObjectOperation(SelectModel::VERTEX_MODEL, OperationType::ENTER_OPERATION, MeshOperationType::MeshCollapseEdge); +} + +void ACAMWindow::slotBridgeEdge() +{ + BaseObjectOperation(SelectModel::EDGE_MODEL, OperationType::ENTER_OPERATION, MeshOperationType::MeshBridgeEdge); +} + +void ACAMWindow::slotExtrudeEdgeV() +{ + BaseObjectOperationSelect(SelectModel::EDGE_MODEL, OperationType::CTRL_OPERATION, MeshOperationType::MeshExtrudeEdgeVertical); +} + +void ACAMWindow::slotExtrudeEdgeH() +{ + BaseObjectOperationSelect(SelectModel::EDGE_MODEL, OperationType::CTRL_OPERATION, MeshOperationType::MeshExtrudeEdgeHorizontal); +} + + +void ACAMWindow::slotThicken() +{ + BaseObjectOperation(SelectModel::OBJECT_MODEL, OperationType::ENTER_OPERATION, MeshOperationType::MeshThicken); +} + +void ACAMWindow::slotMeshReverse() +{ + BaseObjectOperation(SelectModel::OBJECT_MODEL, OperationType::ENTER_OPERATION, MeshOperationType::MeshReverseNormal); +} + +void ACAMWindow::slotFillHole() +{ + BaseObjectOperation(SelectModel::EDGE_MODEL, OperationType::ENTER_OPERATION, MeshOperationType::MeshFillHole); } //========================================================================== @@ -252,22 +507,74 @@ void ACAMWindow::slotFillet() void ACAMWindow::BaseObjectOperation(const SelectModel& s_model, const OperationType& op_type, const MeshOperationType mesh_operate_type) { - render_viewer_->clearSelected(); - render_viewer_->setSelectModel(s_model); - render_viewer_->setOperateType(op_type); + render_viewer_->clearSelected(); + render_viewer_->setSelectModel(s_model); + render_viewer_->setOperateType(op_type); core_->setMeshOperationType(mesh_operate_type); - render_viewer_->selectCheckChanged(); - render_viewer_->update(); + render_viewer_->selectCheckChanged(); + render_viewer_->update(); } void ACAMWindow::BaseObjectOperationSelect(const SelectModel& s_model, const OperationType& op_type, const MeshOperationType mesh_operate_type) { - render_viewer_->setSelectModel(s_model); - render_viewer_->setOperateType(op_type); + if (render_viewer_->getSelectModel() != s_model) + render_viewer_->clearSelected(); + + render_viewer_->setSelectModel(s_model); + render_viewer_->setOperateType(op_type); core_->setMeshOperationType(mesh_operate_type); - render_viewer_->selectCheckChanged(); - render_viewer_->update(); + render_viewer_->selectCheckChanged(); + render_viewer_->update(); +} +void ACAMWindow::slotExtrudeFace() +{ + BaseObjectOperationSelect(SelectModel::FACE_MODEL, OperationType::CTRL_OPERATION, MeshOperationType::MeshExtrudeFaceNew); } + +void ACAMWindow::slotCurrentChanged(int index) +{ + std::vector> array = { + { + //true,true,true,true,true, + //true,true,true,true,true, + //true,true,true,true,true, + //true,true,true,true,true, + //true + }, + //BRep + { + false,false,false,false,false, + false,false,false,true,true, + false,false,false,true,false, + false,false,false,true,true, + true + }, + //Mesh + { + true,true,true,true,true , + false,true,true,false,false, + true,true,true,false,true, + true,true,true,false,false, + false + }, + //TSpline + { + true,true,true,true ,true, + true,true,true,true,false, + true,true,true,false,true, + true,true,true,false,false, + false + }, + }; + + for (int i = 0; i < array[index].size(); i++) + { + list_actions_[i]->setVisible(array[index][i]); + } + + + ///std::cout << "ACAMWindow::slotCurrentChanged!!" << list_actions_.size() << std::endl; +} \ No newline at end of file diff --git a/Src/Windows/ACAMWindow.h b/Src/Windows/ACAMWindow.h index c10a495..1d00c7f 100644 --- a/Src/Windows/ACAMWindow.h +++ b/Src/Windows/ACAMWindow.h @@ -1,33 +1,34 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #pragma once #include #include "ui_ACAMWindow.h" +#include #include "../Core/CoreDefine.h" namespace acamcad { -class RenderViewer; -class DataManager; -class BackupManager; -class AMCore; -class OperateToolBar; -class UndoRedoHandler; + class RenderViewer; + class DataManager; + class BackupManager; + class AMCore; + class OperateToolBar; + class UndoRedoHandler; } class ACAMWindow : public QMainWindow @@ -35,12 +36,14 @@ class ACAMWindow : public QMainWindow Q_OBJECT public: - ACAMWindow(QWidget *parent = Q_NULLPTR); + ACAMWindow(QWidget* parent = Q_NULLPTR); ~ACAMWindow(); + //static void ShowMessge(const QString& text, int type); + private: void initCoreAndViewer(); - + void createMenus(); void createToolBars(); @@ -50,8 +53,10 @@ private: void createAction_Edit(); void createAction_Help(); - void createAction_Tetransform(); - void createAction_Topology(); + void createAction_LeftTools(); + //void createAction_Topology(); + + //void refresh_LeftTools(); private: // menu entries // file menu @@ -81,14 +86,33 @@ private: QAction* duplicateAction_; private: - + private: QAction* chamferAction_; + QAction* embedAction_; + QAction* separateAction_; + QAction* weldAction_; + QAction* deleteFaceAction_; QAction* filletAction_; - QAction* extrudAction_; - + QAction* extrudAction_; + QAction* extrudActionMesh_; + + QAction* splitFaceEdgeAction_; + QAction* splitEdgeAction_; + QAction* splitLoopAction_; + QAction* splitFaceAction_; + QAction* splitFaceVertAction_; + QAction* collapseEdgeAction_; + QAction* swapEdgeAction_; + + QAction* bridgeEdgeAction_; + QAction* extrudeEdgeVAction_; + QAction* extrudeEdgeHAction_; + QAction* thickenAction_; + QAction* normalAction_; + QAction* fillHoleAction_; QAction* bool_fuseAction_; QAction* bool_CommonAction_; @@ -101,24 +125,52 @@ private: private slots: void slotChamfer(); void slotFillet(); + void slotEmbedFace(); + void slotDeleteElement(); + void slotSeparateEdge(); + void slotWeldEdge(); + + + void slotSplitEdge(); + void slotSplitLoop(); + void slotSplitFace(); + void slotSplitFaceByEdge(); + -private slots: void slotBoolFuseObject(); void slotBoolCutObject(); void slotBoolCommonObject(); + void slotSplitFaceByVert(); + void slotSwapMeshEdge(); + void slotCombineTwoFace(); + void slotCollapseEdge(); + + void slotBridgeEdge(); + void slotExtrudeEdgeV(); + void slotExtrudeEdgeH(); + void slotThicken(); + void slotMeshReverse(); + void slotFillHole(); + void slotExtrudeFace(); + + // + void slotCurrentChanged(int index); + private: - void BaseObjectOperation(const acamcad::SelectModel& s_model, + void BaseObjectOperation(const acamcad::SelectModel& s_model, const acamcad::OperationType& op_type, const acamcad::MeshOperationType mesh_operate_type); void BaseObjectOperationSelect(const acamcad::SelectModel& s_model, const acamcad::OperationType& op_type, const acamcad::MeshOperationType mesh_operate_type); + std::vector list_actions_; + private: Ui::ACAMWindow ui; - - acamcad::RenderViewer* render_viewer_; + + acamcad::RenderViewer* render_viewer_; acamcad::DataManager* dataManager_; - acamcad::AMCore* core_; - acamcad::UndoRedoHandler* undoRedoHandler_; + acamcad::AMCore* core_; + //acamcad::UndoRedoHandler* undoRedoHandler_; }; diff --git a/Src/Windows/OperateToolbar.cpp b/Src/Windows/OperateToolbar.cpp index 61ce6ac..a116eb4 100644 --- a/Src/Windows/OperateToolbar.cpp +++ b/Src/Windows/OperateToolbar.cpp @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "operatetoolbar.h" @@ -32,64 +32,104 @@ using namespace acamcad; // {"", QObject::tr(""), "", false, &OperateToolBar::}, // {"Title", "tooltip", icon, checkable, slot} const QVector OperateToolBar::tabs{ - { // Base tab - "Base", tr("View"), { - {"WireFrame", QObject::tr("Show in wirefram model"), "", &RenderViewer::slotRenderMode_Wire}, - {"Render", QObject::tr("Show in Shading model"), "", &RenderViewer::slotRenderMode_Rendering}, - {"Smooth", QObject::tr("Show in Smooth model"), "", &RenderViewer::slotRenderMode_Shading}, - {""}, // empty for separator - {"SetCenter", QObject::tr("Set secnce center in select object center"), ":images/images/SetCenter.png", &RenderViewer::slotSetScenesCenter}, - {""}, // empty for separator - {"Vert", QObject::tr("Select Vert model"), ":images/images/SelectVert.png", &RenderViewer::slotSelectMode_Vert, true, SelectModel::VERTEX_MODEL}, - {"Edge", QObject::tr("Select Edge model"), ":images/images/SelectEdge.png", &RenderViewer::slotSelectMode_Edge, true, SelectModel::EDGE_MODEL}, - {"Face", QObject::tr("Select Face model"), ":images/images/SelectFace.png", &RenderViewer::slotSelectMode_Face, true, SelectModel::FACE_MODEL}, - {"Object", QObject::tr("Select Object model"), ":images/images/SelectObject.png", &RenderViewer::slotSelectMode_Object, true, SelectModel::OBJECT_MODEL}, - - {""}, // empty for separator - {"Copy Object", QObject::tr("Copy an Object"), ":images/images/copy.png", &RenderViewer::slotCopyObject}, - {"Combine Object", QObject::tr("Combine more than one Object to a one Object, final get only one object"), ":images/images/Combine.png", &RenderViewer::slotCombineObject}, - }}, - - - { // BRep tab - "BRep", tr("BRep"), { - {"Create Single Face", QObject::tr("Create a mesh has a single face, click the left mouse button in turn, enter sure"), ":images/images/SingalMeshFace.png", &RenderViewer::slotCreateSingleFaceBRep}, - {"Create a BRep Plane", QObject::tr("Create a plane brep"), ":images/images/Plane.png", &RenderViewer::slotCreatPlaneBRep}, - {"Create a BRep Polygon", QObject::tr("Create a polygon brep"), ":images/images/Polygon.png", &RenderViewer::slotCreatePolygonBRep}, - {""}, - {"Create a BRep Cube", QObject::tr("Create a cube brep"), ":images/images/Cube.png", &RenderViewer::slotCreatCubeBRep}, - {"Create a BRep Sphere", QObject::tr("Create a sphere brep"), ":images/images/UCSphere.png", &RenderViewer::slotCreateSphereBRep}, - {"Create a BRep Cylinder", QObject::tr("Create a cylinder brep"), ":images/images/Cylinder.png", &RenderViewer::slotCreateCylinderBRep}, - {"Create a BRep Cone", QObject::tr("Create a cone brep"), ":images/images/Cone.png", &RenderViewer::slotCreateConeBrep}, - {"Create a BRep Torus", QObject::tr("Create a torus brep"), ":images/images/Torus.png", &RenderViewer::slotCreateTorusBRep}, - {"Create a BRep Prism", QObject::tr("Create a prism brep"), ":images/images/Prism.png", &RenderViewer::slotCreatePrismBRep}, - }}, + { // Base tab + "Base", tr("View"), { + {"WireFrame", QObject::tr("Show in wirefram model"), "", &RenderViewer::slotRenderMode_Wire}, + {"Render", QObject::tr("Show in Shading model"), "", &RenderViewer::slotRenderMode_Rendering}, + {"Smooth", QObject::tr("Show in Smooth model"), "", &RenderViewer::slotRenderMode_Shading}, + {""}, // empty for separator + {"SetCenter", QObject::tr("Set secnce center in select object center"), ":images/images/SetCenter.png", &RenderViewer::slotSetScenesCenter}, + {"SetWorkPlane", QObject::tr("SetWorkPlane by Select element, if no select, set xy plane"), ":images/images/WorkPlane.png", &RenderViewer::slotSetWorkPlane}, + {""}, // empty for separator + {"Vert", QObject::tr("Select Vert model"), ":images/images/SelectVert.png", &RenderViewer::slotSelectMode_Vert, true, SelectModel::VERTEX_MODEL}, + {"Edge", QObject::tr("Select Edge model"), ":images/images/SelectEdge.png", &RenderViewer::slotSelectMode_Edge, true, SelectModel::EDGE_MODEL}, + {"Face", QObject::tr("Select Face model"), ":images/images/SelectFace.png", &RenderViewer::slotSelectMode_Face, true, SelectModel::FACE_MODEL}, + {"Object", QObject::tr("Select Object model"), ":images/images/SelectObject.png", &RenderViewer::slotSelectMode_Object, true, SelectModel::OBJECT_MODEL}, + + {""}, // empty for separator + {"Copy Object", QObject::tr("Copy an Object"), ":images/images/copy.png", &RenderViewer::slotCopyObject}, + {"Delete Object", QObject::tr("Delete an Object"), ":images/images/DeleteObject.png", &RenderViewer::slotDeleteObject}, + {"Combine Object", QObject::tr("Combine more than one Object to a one Object, final get only one object"), ":images/images/Combine.png", &RenderViewer::slotCombineObject}, + {"Mirror", QObject::tr("Select a object to mirror"), ":images/images/Mirror.png", &RenderViewer::slotMirrorObject}, + }}, + + + { // BRep tab + "BRep", tr("BRep"), { + {"Create Single Face", QObject::tr("Create a mesh has a single face, click the left mouse button in turn, enter sure"), ":images/images/SingalMeshFace.png", &RenderViewer::slotCreateSingleFaceBRep}, + {"Create a BRep Plane", QObject::tr("Create a plane brep"), ":images/images/Plane.png", &RenderViewer::slotCreatPlaneBRep}, + {"Create a BRep Polygon", QObject::tr("Create a polygon brep"), ":images/images/Polygon.png", &RenderViewer::slotCreatePolygonBRep}, + {""}, + {"Create a BRep Cube", QObject::tr("Create a cube brep"), ":images/images/Cube.png", &RenderViewer::slotCreatCubeBRep}, + {"Create a BRep Sphere", QObject::tr("Create a sphere brep"), ":images/images/UCSphere.png", &RenderViewer::slotCreateSphereBRep}, + {"Create a BRep Cylinder", QObject::tr("Create a cylinder brep"), ":images/images/Cylinder.png", &RenderViewer::slotCreateCylinderBRep}, + {"Create a BRep Cone", QObject::tr("Create a cone brep"), ":images/images/Cone.png", &RenderViewer::slotCreateConeBrep}, + {"Create a BRep Torus", QObject::tr("Create a torus brep"), ":images/images/Torus.png", &RenderViewer::slotCreateTorusBRep}, + {"Create a BRep Prism", QObject::tr("Create a prism brep"), ":images/images/Prism.png", &RenderViewer::slotCreatePrismBRep}, + }}, + + { // Mesh tab + "Mesh", tr("Mesh"), { + {"Create Single Face", QObject::tr("Create a mesh has a single face, click the left mouse button in turn, enter sure"), ":images/images/SingalMeshFace.png", &RenderViewer::slotCreateSingleFaceMesh}, + {"Create a Mesh Plane", QObject::tr("Create a plane mesh"), ":images/images/Plane.png", &RenderViewer::slotCreatPlaneMesh}, + {"Create a Mesh Cube", QObject::tr("Create a cube mesh"), ":images/images/Cube.png", &RenderViewer::slotCreatCubeMesh}, + {""}, // empty for separator + + {"Subdivide CC", QObject::tr("Subdivide a mesh using Catmull Clark"), ":images/images/SubdiveCC.png", &RenderViewer::slotMeshSubdiveCatmullClark}, + {"Loop", QObject::tr("Subdivide a mesh using Loop"), ":images/images/SubdiveLoop.png", &RenderViewer::slotMeshSubdiveLoop}, + {"Triangulated Mesh", QObject::tr("Triangulation a mesh"), ":images/images/MeshTriangulation.png", &RenderViewer::slotMeshTriangulation}, + }}, + + { // TSpline tab + "TSpline", tr("TSpline"), { + {"Create Single Face", QObject::tr("Create a mesh have a singel face, Click the left mouse button in turn, enter sure"), ":images/images/SingalMeshFace.png", &RenderViewer::slotCreateSingleFaceTSpline}, + {"Create a Plane", QObject::tr("Create a plane mesh"), ":images/images/Plane.png", &RenderViewer::slotCreatePlaneTSpline}, + {"Create a Cube", QObject::tr("Create a cube mesh"), ":images/images/Cube.png", &RenderViewer::slotCreateCubeTSpline}, + {"Create a UVSphere", QObject::tr("Create a UVSphere mesh"), ":images/images/UCSphere.png", &RenderViewer::slotCreateUVSphereTSpline}, + {"Create a QuadSphere", QObject::tr("Create a QuadSphere mesh"), ":images/images/QuadSphere.png", &RenderViewer::slotCreateQuadSphereTSpline}, + {"Create a Cylinder", QObject::tr("Create a Cylinder mesh"), ":images/images/Cylinder.png", &RenderViewer::slotCreateCylinderTSpline}, + {"Create a Cone", QObject::tr("Create a Cone mesh"), ":images/images/Cone.png", &RenderViewer::slotCreateConeTSpline}, + {"Create a Trous", QObject::tr("Create a Trous"), ":images/images/Torus.png", &RenderViewer::slotCreateTorusTSpline}, + //{""}, // empty for separator + {"Create a Circular Arcs", QObject::tr("Create a Circular Arcs"), ":images/images/Circular.png", &RenderViewer::slotCreateCircularTSpline}, + //{"Create a Ring", QObject::tr("Create a Ring by a Curve"), ":images/images/Ring.png", &RenderViewer::slotCreateRingTSpline}, + {""}, // empty for separator + {"Add Crease Edge", QObject::tr("select edges to become crease edge"), ":images/images/Crease.png", &RenderViewer::slotAddCreaseEdge}, + {"Remove Crease Edge", QObject::tr("select edges reomve it's crease status"), ":images/images/RCrease.png", &RenderViewer::slotRemoveCreaseEdge}, + //setFrepFixAction_ "Frep FixF" + //setFrepForceAction_ "Frep ForceF" + //{""}, // empty for separator + {"Make Uniform", QObject::tr("Make TSpline param uniform"), ":images/images/Uniform.png", &RenderViewer::slotTsplineUniform}, + {"Make Repair", QObject::tr("Repair TSpline which can Smooth"), ":images/images/Repair.png", &RenderViewer::slotTsplineRepair}, + }}, + }; -OperateToolBar::OperateToolBar(RenderViewer *viewer, QWidget *parent): - QTabWidget(parent) +OperateToolBar::OperateToolBar(RenderViewer* viewer, QWidget* parent) : + QTabWidget(parent) { - setMovable(true); - setFocusPolicy(Qt::NoFocus); - - std::for_each(tabs.begin(), tabs.end(), [&](const ToolBarTabFillOut& tab) { - auto *toolBar = new QToolBar(tab.title); - toolBars.append(toolBar); - addTab(toolBar, tab.name); - std::for_each(tab.actions.begin(), tab.actions.end(), [&](const ToolBarTabAction &ta) { - auto *action = ta.toQAction(); - if (action) { - if (ta.actionSlot) { - connect(action, &QAction::triggered, viewer, ta.actionSlot); - } - if (ta.checkable) { - viewer->addSelector(ta.selectModel, action); - } - toolBar->addAction(action); - } else { - toolBar->addSeparator(); - } - }); - }); + setMovable(true); + setFocusPolicy(Qt::NoFocus); + + std::for_each(tabs.begin(), tabs.end(), [&](const ToolBarTabFillOut& tab) { + auto* toolBar = new QToolBar(tab.title); + toolBars.append(toolBar); + addTab(toolBar, tab.name); + std::for_each(tab.actions.begin(), tab.actions.end(), [&](const ToolBarTabAction& ta) { + auto* action = ta.toQAction(); + if (action) { + if (ta.actionSlot) { + connect(action, &QAction::triggered, viewer, ta.actionSlot); + } + if (ta.checkable) { + viewer->addSelector(ta.selectModel, action); + } + toolBar->addAction(action); + } + else { + toolBar->addSeparator(); + } + }); + }); } diff --git a/Src/Windows/OperateViewer.cpp b/Src/Windows/OperateViewer.cpp new file mode 100644 index 0000000..284686b --- /dev/null +++ b/Src/Windows/OperateViewer.cpp @@ -0,0 +1 @@ +#include "OperateViewer.h" \ No newline at end of file diff --git a/Src/Windows/OperateViewer.h b/Src/Windows/OperateViewer.h new file mode 100644 index 0000000..0c838b0 --- /dev/null +++ b/Src/Windows/OperateViewer.h @@ -0,0 +1,35 @@ +/* =================================================================== +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* All rights reserved. +* +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* software under the terms of either license. +* +* For more information about the AGPLv3.0 license, please visit: +* https://www.gnu.org/licenses/agpl-3.0.html +* For licensing inquiries or to obtain a commercial license, please +* contact Hefei Jiushao Intelligent Technology Co., Ltd. +* =================================================================== +* Author: +*/ +#pragma once + +#include "QGLViewer/qglviewer.h" + +#include "../Object/ObjectDefine.h" +#include "AxisOperate.h" +#include "../Core/CoreDefine.h" +#include "ParamDialog.h" +#include "../record/Record.h" + +namespace acamcad +{ + class DataManager; + class AMCore; + class SelectTool; + + class OperateViewer : public QGLViewer + { + }; +} \ No newline at end of file diff --git a/Src/Windows/ParamDialog.h b/Src/Windows/ParamDialog.h index 3f1da95..437372b 100644 --- a/Src/Windows/ParamDialog.h +++ b/Src/Windows/ParamDialog.h @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #ifndef PARAMETERWIDGET_H #define PARAMETERWIDGET_H @@ -39,423 +39,430 @@ #include "../Core/CoreDefine.h" #include +#include namespace acamcad { -void clearLayout(QLayout *layout); - -// Overriding the default size hint so that it won't be as wide at default -// not declaring as nested class because it's an Q_Object -class ShortLineEdit: public QLineEdit -{ - Q_OBJECT - friend class ParamGBox; -private: - static int counter; // Debuging purpose making sure there's no leakage - QSize sizeHint() const override { return QSize(72, QLineEdit::sizeHint().height()); } - ShortLineEdit(): QLineEdit(), suffix(nullptr) { ++counter; } - ~ShortLineEdit() { --counter; }; - void setSuffix(QLabel *l); -protected: - void resizeEvent(QResizeEvent *re) override { updateSuffixPos(); QLineEdit::resizeEvent(re); } - void showEvent(QShowEvent *se) override { updateSuffixPos(); QLineEdit::showEvent(se); } -private: - QLabel *suffix; -private slots: - void updateSuffixPos(); - -}; - -struct PDEditAttr { - enum LType { - TYPE_NONE, - TYPE_SIZE_T, - TYPE_DOUBLE, - TYPE_STRING, - } type; - bool hasBottom; - bool hasTop; - union { - size_t s; - double d; - operator size_t() const { return s; } - operator double() const { return d; } - operator size_t&() { return s; } - operator double&() { return d; } - } bottom; - union { - size_t s; - double d; - operator size_t() const { return s; } - operator double() const { return d; } - operator size_t&() { return s; } - operator double&() { return d; } - } top; - QString extra; - - PDEditAttr(): type(TYPE_STRING), hasBottom(false), hasTop(false) { } - PDEditAttr(const double b, const double t): - type(TYPE_DOUBLE), hasBottom(std::isinf(b)), hasTop(std::isinf(t)) - { - bottom.d = b; - top.d = t; - } - PDEditAttr(const double b, const double t, const QString e): - type(TYPE_DOUBLE), hasBottom(std::isinf(b)), hasTop(std::isinf(t)), extra(e) - { - bottom.d = b; - top.d = t; - } - PDEditAttr(const bool isbottom, const size_t l): - type(TYPE_SIZE_T), hasBottom(isbottom), hasTop(!isbottom) - { - bottom.s = l; - top.s = l; - } - PDEditAttr(const bool hasBottom, const size_t bottom, - const bool hasTop, const size_t top): - type(TYPE_SIZE_T), hasBottom(hasBottom), hasTop(hasTop) - { - this->bottom.s = bottom; - this->top.s = top; - } -}; - -// typedef std::pair PDRowUnit; -typedef std::pair PDRowUnit; - - -class ParamGBox; - -class ParamDialog: public QDialog -{ - Q_OBJECT -public: // type define - enum ParamType - { - /* TYPE_MPOINT2, */ TYPE_MPOINT, TYPE_MPOINT3, - TYPE_MPOINT3_2, // /* TYPE_POINT3_2 is MPoint3 but only shows 2 Params in the dialog */ - /* TYPE_MVEC2, */ TYPE_MVEC, TYPE_MVEC3, - TYPE_MVEC3_2, // /* TYPE_MVEC3_2 is MVec3 but only shows 2 Params in the dialog */ - /* TYPE_FLOAT, */ TYPE_DOUBLE, TYPE_DOUBLE_PI, TYPE_BOOL, - /* TYPE_INT8, TYPE_INT16, TYPE_INT32, TYPE_INT64, TYPE_INT128, */ - /* TYPE_UINT8, TYPE_UINT16, TYPE_UINT32, TYPE_UINT64, TYPE_UINT128, */ - TYPE_SIZE_T, TYPE_STRING, - // TYPE_ARR_MPOINT3, - TYPE_ARR_MPOINT3, - }; // ParamType - - /* - capsule data so that different types of values can be stored in - a single container. - */ - struct DataUnit - { - struct Size_t - { // defining Size_t so that DataUnit can handle top and bottom too - size_t value; - size_t bottom, top; - bool hasBottom, hasTop; - - Size_t(): value(0), hasBottom(false), hasTop(false) {} - Size_t(const size_t &s, - bool hasBottom, size_t bottom, - bool hasTop=false, bool top=0) : - value(s), bottom(bottom), top(top), - hasBottom(hasBottom), hasTop(hasTop) { } - - operator size_t() const { return value; } - size_t &operator=(const size_t &a) { return value = a; } - } s; // Size_t - struct Double - { // define Double so that DataUnit can handle top and bottom too - double value; - double bottom, top; - - Double(): value(.0), bottom(-INFINITY), top(INFINITY) {}; - Double(const double &d, - double bottom, double top): - value(d), bottom(bottom), top(top) { } - - operator double() const { return value; } - double &operator=(const double &a) { return value = a; } - } d; // Double - bool b; - AMCAX::Coord3 point; - AMCAX::Coord3 vec; - QString str; - std::vector pointarr; - // float f; - /* int8_t i8; int16_t i16; int32_t i32; int64_t i64; */ // int - /* uint8_t u8; uint16_t u16; uint32_t u32; uint64_t u64; */ // uint - - // no need to apply The Rule of Five - DataUnit(const size_t &s, - bool hasBottom=true, size_t bottom=1, - bool hasTop=false, size_t top=0): - s(s, hasBottom, bottom, hasTop, top) { } - DataUnit(const double &d, const double &bottom=INFINITY, const double &top=INFINITY): - d(d, bottom, top) { } - DataUnit(const bool &b): b(b) { } - DataUnit(const AMCAX::Coord3& value, ParamType type) { - if (type == ParamType::TYPE_MPOINT3) { - point = value; - } - else if (type == ParamType::TYPE_MVEC3) { - vec = value; - } - } - DataUnit(const QString &str): str(str) { } - DataUnit(const std::vector &pointarr) = delete; - - DataUnit() { }; - DataUnit(const DataUnit &rd): - s(rd.s, rd.s.hasBottom, rd.s.bottom, rd.s.hasTop, rd.s.top), - d(rd.d, rd.d.bottom, rd.d.top), - point(rd.point), - vec(rd.vec), - str(rd.str), - pointarr(rd.pointarr) { } - DataUnit(DataUnit &&) = delete; - ~DataUnit() { }; // required by std::pair - - DataUnit &operator=(DataUnit &&) = delete; - DataUnit &operator=(const DataUnit &) = delete; - - void updatePoint(const AMCAX::Coord3d &otherp) { point = otherp; } - - QString toString(const ParamType t, const int i) const { - switch (t) { - case TYPE_MPOINT: - case TYPE_MPOINT3: - case TYPE_MPOINT3_2: - case TYPE_ARR_MPOINT3: { - return QString::number(point[i], 'f', 2); - } - break; - case TYPE_MVEC: - case TYPE_MVEC3: - case TYPE_MVEC3_2: { - return QString::number(vec[i], 'f', 2); - } - break; - case TYPE_DOUBLE: - case TYPE_DOUBLE_PI: { - return QString::number(d, 'g', 12); - } - break; - case TYPE_SIZE_T: { - return QString::number(s); - } - break; - case TYPE_STRING: { - return str; - } - break; - default: - break; - } - return QString(""); - } - }; // DataUnit - - // ParameterType, title, default value - struct RequestUnit - { - ParamType type; - QString title; - DataUnit def; - - RequestUnit() { } - RequestUnit(const ParamType &type, const QString &title, const DataUnit &def): - type(type), title(title), def(def) { } - RequestUnit(const std::tuple &oth): - type(std::get<0>(oth)), title(std::get<1>(oth)), def(std::get<2>(oth)) {} - RequestUnit(const RequestUnit &oth): - type(oth.type), title(oth.title), def(oth.def) {} - - operator ParamType() const { return type; } - operator QString() const { return title; } - operator DataUnit() const { return def; } - }; - - // redundant ParameterType, payload, isValid - typedef QList> Response; - -private: // type define - union InputWidget - { - QLineEdit *edit; - QCheckBox *check; - - InputWidget() = delete; - InputWidget(QLineEdit *edit) { this->edit = edit; } - InputWidget(QCheckBox *check) { this->check = check; } - ~InputWidget() { edit = nullptr; check = nullptr; } - }; // InputWidget - -public: // constructors - ParamDialog(QWidget *parent = nullptr); - -public: // public methods - void addElements(const QVector ¶m); - -public slots: // public slots - void accept() override; - void reject() override; - -private slots: // private slots - -private: // private methods - void addElement(const RequestUnit ¶m); - void generateResponse(); - QSize sizeHint() const override { return QSize(72, QDialog::sizeHint().height()); } - -public: // public members - void open() override; - -private: // private members - QVBoxLayout *inputLayout; - Response response; - // QList inputs; - QList tunables; - QList gboxes; - -public: // public static methods - -private: // private static methods - // static - -private: // private constant members - const static QMap> TypeName; - -signals: // - void dataReady(const ParamDialog::Response &data); - -protected: - void closeEvent(QCloseEvent *ce) override; - -}; - -// not declaring as nested class because it's an Q_Object -class ParamGBoxTitleButton: public QLabel -{ - Q_OBJECT - friend class ParamGBoxTitle; -private: - ParamGBoxTitleButton(const QString &text, QWidget *parent=nullptr): - QLabel(text, parent) {} - ~ParamGBoxTitleButton() {} - Qt::MouseButtons btns; -protected: - void mousePressEvent(QMouseEvent *me) override; - void mouseReleaseEvent(QMouseEvent *me) override; -signals: - void negative(); - void positive(); -}; // ParamGBoxTitleButton - -// not declaring as nested class because it's an Q_Object -class ParamGBoxTitleToggle: public QLabel -{ - Q_OBJECT - friend class ParamGBoxTitle; -private: - ParamGBoxTitleToggle(const QString &text, QWidget *parent=nullptr): - QLabel(text, parent) {} - ~ParamGBoxTitleToggle() {} - Qt::MouseButtons btns; -protected: - void mousePressEvent(QMouseEvent *me) override; - void mouseReleaseEvent(QMouseEvent *me) override; -signals: - void clicked(); -}; // ParamGBoxTitleToggle - -// not declaring as nested class because it's an Q_Object -class ParamGBoxTitle: public QWidget -{ - Q_OBJECT - friend class ParamGBox; -private: - ParamGBoxTitle(const QString &title, QWidget *parent = nullptr); - ~ParamGBoxTitle() { }; - void setCheckable(bool cable); - void setCountable(); - void setCount(const int count); - const QString title; - bool countable; - ParamGBoxTitleToggle *label; - ParamGBoxTitleButton *button; - -signals: - void negative(); - void positive(); - void clicked(); - -private slots: - void onNegative() { emit negative(); } - void onPositive() { emit positive(); } - void onClicked() { emit clicked(); } -}; // ParamGBoxTitle - -// not declaring as nested class because it's an Q_Object -class ParamGBox: public QWidget -{ - Q_OBJECT - friend class ParamDialog; -private: - ParamGBox(const QString &title, - const ParamDialog::ParamType &type, - const QVector &row, - const ParamDialog::DataUnit &defaultValue, - const bool checkable = false, - const bool checked = true, - QWidget *parent = nullptr); - ~ParamGBox() {}; -private: - void updateTitlePos(); - void setCheckable(bool checkable); - void setChecked(bool checked); - void setCountable(); - bool isCheckable() const; - bool isChecked() const; - - void addRow(const QVector &row, const ParamDialog::DataUnit &defaultValue); - - ShortLineEdit *createLineEdit(QValidator *validator); - // INFINITY if has no bottom/top limit - ShortLineEdit *createDoubleLineEdit(const double bottom, const double top); - ShortLineEdit *createDoubleLineEdit(const double bottom, const double top, const QString &suffix); - ShortLineEdit *createIntLineEdit(const bool hasBottom, const int bottom, - const bool hasTop = false, const int top = 0); - ShortLineEdit *createLineEdit(const PDEditAttr &attr); - -protected: - void resizeEvent(QResizeEvent *re) override; - void showEvent(QShowEvent *se) override; -private: - std::vector inputs; - - ParamDialog::ParamType type; - QVector templateRow; - ParamDialog::DataUnit templateDU; - - QVBoxLayout *basel; - ParamGBoxTitle *twidget; - QFrame *hlinetop; - - bool checkable; - bool checked; - -private: - std::vector getInputs() { return inputs; } - -private slots: - void onNegative(); - void onPositive(); - void toggle(); -}; + void clearLayout(QLayout* layout); + + // Overriding the default size hint so that it won't be as wide at default + // not declaring as nested class because it's an Q_Object + class ShortLineEdit : public QLineEdit + { + Q_OBJECT + friend class ParamGBox; + private: + static int counter; // Debuging purpose making sure there's no leakage + QSize sizeHint() const override { return QSize(72, QLineEdit::sizeHint().height()); } + ShortLineEdit() : QLineEdit(), suffix(nullptr) { ++counter; } + ~ShortLineEdit() { --counter; }; + void setSuffix(QLabel* l); + protected: + void resizeEvent(QResizeEvent* re) override { updateSuffixPos(); QLineEdit::resizeEvent(re); } + void showEvent(QShowEvent* se) override { updateSuffixPos(); QLineEdit::showEvent(se); } + private: + QLabel* suffix; + private slots: + void updateSuffixPos(); + + }; + + struct PDEditAttr { + enum LType { + TYPE_NONE, + TYPE_SIZE_T, + TYPE_DOUBLE, + TYPE_STRING, + } type; + bool hasBottom; + bool hasTop; + union { + size_t s; + double d; + operator size_t() const { return s; } + operator double() const { return d; } + operator size_t& () { return s; } + operator double& () { return d; } + } bottom; + union { + size_t s; + double d; + operator size_t() const { return s; } + operator double() const { return d; } + operator size_t& () { return s; } + operator double& () { return d; } + } top; + QString extra; + + PDEditAttr() : type(TYPE_STRING), hasBottom(false), hasTop(false) { } + PDEditAttr(const double b, const double t) : + type(TYPE_DOUBLE), hasBottom(std::isinf(b)), hasTop(std::isinf(t)) + { + bottom.d = b; + top.d = t; + } + PDEditAttr(const double b, const double t, const QString e) : + type(TYPE_DOUBLE), hasBottom(std::isinf(b)), hasTop(std::isinf(t)), extra(e) + { + bottom.d = b; + top.d = t; + } + PDEditAttr(const bool isbottom, const size_t l) : + type(TYPE_SIZE_T), hasBottom(isbottom), hasTop(!isbottom) + { + bottom.s = l; + top.s = l; + } + PDEditAttr(const bool hasBottom, const size_t bottom, + const bool hasTop, const size_t top) : + type(TYPE_SIZE_T), hasBottom(hasBottom), hasTop(hasTop) + { + this->bottom.s = bottom; + this->top.s = top; + } + }; + + // typedef std::pair PDRowUnit; + typedef std::pair PDRowUnit; + + + class ParamGBox; + + class ParamDialog : public QDialog + { + Q_OBJECT + public: // type define + enum ParamType + { + /* TYPE_MPOINT2, */ TYPE_MPOINT, TYPE_MPOINT3, + TYPE_MPOINT3_2, // /* TYPE_POINT3_2 is MPoint3 but only shows 2 Params in the dialog */ + /* TYPE_MVEC2, */ TYPE_MVEC, TYPE_MVEC3, + TYPE_MVEC3_2, // /* TYPE_MVEC3_2 is MVec3 but only shows 2 Params in the dialog */ + /* TYPE_FLOAT, */ TYPE_DOUBLE, TYPE_DOUBLE_PI, TYPE_BOOL, + /* TYPE_INT8, TYPE_INT16, TYPE_INT32, TYPE_INT64, TYPE_INT128, */ + /* TYPE_UINT8, TYPE_UINT16, TYPE_UINT32, TYPE_UINT64, TYPE_UINT128, */ + TYPE_SIZE_T, TYPE_STRING, + // TYPE_ARR_MPOINT3, + TYPE_ARR_MPOINT3, + }; // ParamType + + /* + capsule data so that different types of values can be stored in + a single container. + */ + struct DataUnit + { + struct Size_t + { // defining Size_t so that DataUnit can handle top and bottom too + size_t value; + size_t bottom, top; + bool hasBottom, hasTop; + + Size_t() : value(0), hasBottom(false), hasTop(false) {} + Size_t(const size_t& s, + bool hasBottom, size_t bottom, + bool hasTop = false, bool top = 0) : + value(s), bottom(bottom), top(top), + hasBottom(hasBottom), hasTop(hasTop) { } + + operator size_t() const { return value; } + size_t& operator=(const size_t& a) { return value = a; } + } s; // Size_t + struct Double + { // define Double so that DataUnit can handle top and bottom too + double value; + double bottom, top; + + Double() : value(.0), bottom(-INFINITY), top(INFINITY) {}; + Double(const double& d, + double bottom, double top) : + value(d), bottom(bottom), top(top) { } + + operator double() const { return value; } + double& operator=(const double& a) { return value = a; } + } d; // Double + bool b; + AMCAX::Coord3 point; + AMCAX::Coord3 vec; + QString str; + std::vector pointarr; + // float f; + /* int8_t i8; int16_t i16; int32_t i32; int64_t i64; */ // int + /* uint8_t u8; uint16_t u16; uint32_t u32; uint64_t u64; */ // uint + + // no need to apply The Rule of Five + DataUnit(const size_t& s, + bool hasBottom = true, size_t bottom = 1, + bool hasTop = false, size_t top = 0) : + s(s, hasBottom, bottom, hasTop, top) { } + DataUnit(const double& d, const double& bottom = INFINITY, const double& top = INFINITY) : + d(d, bottom, top) { } + DataUnit(const bool& b) : b(b) { } + DataUnit(const AMCAX::Point3& p) + { + point.SetX(p.X()); + point.SetY(p.Y()); + point.SetZ(p.Z()); + } + DataUnit(const AMCAX::Coord3& value, ParamType type) { + if (type == ParamType::TYPE_MPOINT3) { + point = value; + } + else if (type == ParamType::TYPE_MVEC3) { + vec = value; + } + } + DataUnit(const QString& str) : str(str) { } + DataUnit(const std::vector& pointarr) = delete; + + DataUnit() { }; + DataUnit(const DataUnit& rd) : + s(rd.s, rd.s.hasBottom, rd.s.bottom, rd.s.hasTop, rd.s.top), + d(rd.d, rd.d.bottom, rd.d.top), + point(rd.point), + vec(rd.vec), + str(rd.str), + pointarr(rd.pointarr) { } + DataUnit(DataUnit&&) = delete; + ~DataUnit() { }; // required by std::pair + + DataUnit& operator=(DataUnit&&) = delete; + DataUnit& operator=(const DataUnit&) = delete; + + void updatePoint(const AMCAX::Coord3d& otherp) { point = otherp; } + + QString toString(const ParamType t, const int i) const { + switch (t) { + case TYPE_MPOINT: + case TYPE_MPOINT3: + case TYPE_MPOINT3_2: + case TYPE_ARR_MPOINT3: { + return QString::number(point[i], 'f', 2); + } + break; + case TYPE_MVEC: + case TYPE_MVEC3: + case TYPE_MVEC3_2: { + return QString::number(vec[i], 'f', 2); + } + break; + case TYPE_DOUBLE: + case TYPE_DOUBLE_PI: { + return QString::number(d, 'g', 12); + } + break; + case TYPE_SIZE_T: { + return QString::number(s); + } + break; + case TYPE_STRING: { + return str; + } + break; + default: + break; + } + return QString(""); + } + }; // DataUnit + + // ParameterType, title, default value + struct RequestUnit + { + ParamType type; + QString title; + DataUnit def; + + RequestUnit() { } + RequestUnit(const ParamType& type, const QString& title, const DataUnit& def) : + type(type), title(title), def(def) { } + RequestUnit(const std::tuple& oth) : + type(std::get<0>(oth)), title(std::get<1>(oth)), def(std::get<2>(oth)) {} + RequestUnit(const RequestUnit& oth) : + type(oth.type), title(oth.title), def(oth.def) {} + + operator ParamType() const { return type; } + operator QString() const { return title; } + operator DataUnit() const { return def; } + }; + + // redundant ParameterType, payload, isValid + typedef QList> Response; + + private: // type define + union InputWidget + { + QLineEdit* edit; + QCheckBox* check; + + InputWidget() = delete; + InputWidget(QLineEdit* edit) { this->edit = edit; } + InputWidget(QCheckBox* check) { this->check = check; } + ~InputWidget() { edit = nullptr; check = nullptr; } + }; // InputWidget + + public: // constructors + ParamDialog(QWidget* parent = nullptr); + + public: // public methods + void addElements(const QVector& param); + + public slots: // public slots + void accept() override; + void reject() override; + + private slots: // private slots + + private: // private methods + void addElement(const RequestUnit& param); + void generateResponse(); + QSize sizeHint() const override { return QSize(72, QDialog::sizeHint().height()); } + + public: // public members + void open() override; + + private: // private members + QVBoxLayout* inputLayout; + Response response; + // QList inputs; + QList tunables; + QList gboxes; + + public: // public static methods + + private: // private static methods + // static + + private: // private constant members + const static QMap> TypeName; + + signals: // + void dataReady(const ParamDialog::Response& data); + + protected: + void closeEvent(QCloseEvent* ce) override; + + }; + + // not declaring as nested class because it's an Q_Object + class ParamGBoxTitleButton : public QLabel + { + Q_OBJECT + friend class ParamGBoxTitle; + private: + ParamGBoxTitleButton(const QString& text, QWidget* parent = nullptr) : + QLabel(text, parent) {} + ~ParamGBoxTitleButton() {} + Qt::MouseButtons btns; + protected: + void mousePressEvent(QMouseEvent* me) override; + void mouseReleaseEvent(QMouseEvent* me) override; + signals: + void negative(); + void positive(); + }; // ParamGBoxTitleButton + + // not declaring as nested class because it's an Q_Object + class ParamGBoxTitleToggle : public QLabel + { + Q_OBJECT + friend class ParamGBoxTitle; + private: + ParamGBoxTitleToggle(const QString& text, QWidget* parent = nullptr) : + QLabel(text, parent) {} + ~ParamGBoxTitleToggle() {} + Qt::MouseButtons btns; + protected: + void mousePressEvent(QMouseEvent* me) override; + void mouseReleaseEvent(QMouseEvent* me) override; + signals: + void clicked(); + }; // ParamGBoxTitleToggle + + // not declaring as nested class because it's an Q_Object + class ParamGBoxTitle : public QWidget + { + Q_OBJECT + friend class ParamGBox; + private: + ParamGBoxTitle(const QString& title, QWidget* parent = nullptr); + ~ParamGBoxTitle() { }; + void setCheckable(bool cable); + void setCountable(); + void setCount(const int count); + const QString title; + bool countable; + ParamGBoxTitleToggle* label; + ParamGBoxTitleButton* button; + + signals: + void negative(); + void positive(); + void clicked(); + + private slots: + void onNegative() { emit negative(); } + void onPositive() { emit positive(); } + void onClicked() { emit clicked(); } + }; // ParamGBoxTitle + + // not declaring as nested class because it's an Q_Object + class ParamGBox : public QWidget + { + Q_OBJECT + friend class ParamDialog; + private: + ParamGBox(const QString& title, + const ParamDialog::ParamType& type, + const QVector& row, + const ParamDialog::DataUnit& defaultValue, + const bool checkable = false, + const bool checked = true, + QWidget* parent = nullptr); + ~ParamGBox() {}; + private: + void updateTitlePos(); + void setCheckable(bool checkable); + void setChecked(bool checked); + void setCountable(); + bool isCheckable() const; + bool isChecked() const; + + void addRow(const QVector& row, const ParamDialog::DataUnit& defaultValue); + + ShortLineEdit* createLineEdit(QValidator* validator); + // INFINITY if has no bottom/top limit + ShortLineEdit* createDoubleLineEdit(const double bottom, const double top); + ShortLineEdit* createDoubleLineEdit(const double bottom, const double top, const QString& suffix); + ShortLineEdit* createIntLineEdit(const bool hasBottom, const int bottom, + const bool hasTop = false, const int top = 0); + ShortLineEdit* createLineEdit(const PDEditAttr& attr); + + protected: + void resizeEvent(QResizeEvent* re) override; + void showEvent(QShowEvent* se) override; + private: + std::vector inputs; + + ParamDialog::ParamType type; + QVector templateRow; + ParamDialog::DataUnit templateDU; + + QVBoxLayout* basel; + ParamGBoxTitle* twidget; + QFrame* hlinetop; + + bool checkable; + bool checked; + + private: + std::vector getInputs() { return inputs; } + + private slots: + void onNegative(); + void onPositive(); + void toggle(); + }; } diff --git a/Src/Windows/QGLViewer/camera.cpp b/Src/Windows/QGLViewer/camera.cpp index 78d1c3a..60ece66 100644 --- a/Src/Windows/QGLViewer/camera.cpp +++ b/Src/Windows/QGLViewer/camera.cpp @@ -1,12 +1,12 @@ /* =================================================================== -* This file is a modification of libQGLViewer. -* +* This file is a modification of libQGLViewer. +* * Quote from https://github.com/GillesDebunne/libQGLViewer -* -* "libQGLViewer uses dual licensing: it is freely available under the -* terms of the GNU-GPL license for open source software development, +* +* "libQGLViewer uses dual licensing: it is freely available under the +* terms of the GNU-GPL license for open source software development, * while commercial applications can apply for a commercial license. -* +* * http://www.libqglviewer.com * " * ==================================================================== @@ -26,47 +26,47 @@ using namespace qglviewer; See IODistance(), physicalDistanceToScreen(), physicalScreenWidth() and focusDistance() documentations for default stereo parameter values. */ Camera::Camera() - : frame_(nullptr), fieldOfView_(M_PI / 4.0), modelViewMatrixIsUpToDate_(false), - projectionMatrixIsUpToDate_(false) { - // Requires the interpolationKfi_ - setFrame(new ManipulatedCameraFrame()); - - // #CONNECTION# All these default values identical in initFromDOMElement. - - // Requires fieldOfView() to define focusDistance() - setSceneRadius(1.0); - - // Initial value (only scaled after this) - orthoCoef_ = tan(fieldOfView() / 2.0); - - // Also defines the pivotPoint(), which changes orthoCoef_. Requires a - // frame(). - setSceneCenter(Vec(0.0, 0.0, 0.0)); - - // Requires fieldOfView() when called with ORTHOGRAPHIC. Attention to - // projectionMatrix_ below. - setType(PERSPECTIVE); - - // #CONNECTION# initFromDOMElement default values - setZNearCoefficient(0.005); - setZClippingCoefficient(5.0); - - // Dummy values - setScreenWidthAndHeight(600, 400); - - // Stereo parameters - setIODistance(0.062); - setPhysicalScreenWidth(0.5); - // focusDistance is set from setFieldOfView() - - // #CONNECTION# Camera copy constructor - for (unsigned short j = 0; j < 16; ++j) { - modelViewMatrix_[j] = ((j % 5 == 0) ? 1.0 : 0.0); - // #CONNECTION# computeProjectionMatrix() is lazy and assumes 0.0 almost - // everywhere. - projectionMatrix_[j] = 0.0; - } - computeProjectionMatrix(); + : frame_(nullptr), fieldOfView_(M_PI / 4.0), modelViewMatrixIsUpToDate_(false), + projectionMatrixIsUpToDate_(false) { + // Requires the interpolationKfi_ + setFrame(new ManipulatedCameraFrame()); + + // #CONNECTION# All these default values identical in initFromDOMElement. + + // Requires fieldOfView() to define focusDistance() + setSceneRadius(1.0); + + // Initial value (only scaled after this) + orthoCoef_ = tan(fieldOfView() / 2.0); + + // Also defines the pivotPoint(), which changes orthoCoef_. Requires a + // frame(). + setSceneCenter(Vec(0.0, 0.0, 0.0)); + + // Requires fieldOfView() when called with ORTHOGRAPHIC. Attention to + // projectionMatrix_ below. + setType(PERSPECTIVE); + + // #CONNECTION# initFromDOMElement default values + setZNearCoefficient(0.005); + setZClippingCoefficient(5.0); + + // Dummy values + setScreenWidthAndHeight(600, 400); + + // Stereo parameters + setIODistance(0.062); + setPhysicalScreenWidth(0.5); + // focusDistance is set from setFieldOfView() + + // #CONNECTION# Camera copy constructor + for (unsigned short j = 0; j < 16; ++j) { + modelViewMatrix_[j] = ((j % 5 == 0) ? 1.0 : 0.0); + // #CONNECTION# computeProjectionMatrix() is lazy and assumes 0.0 almost + // everywhere. + projectionMatrix_[j] = 0.0; + } + computeProjectionMatrix(); } /*! Virtual destructor. @@ -74,227 +74,228 @@ Camera::Camera() The frame() is deleted, but the different keyFrameInterpolator() are \e not deleted (in case they are shared). */ Camera::~Camera() { - delete frame_; + delete frame_; } /*! Copy constructor. Performs a deep copy using operator=(). */ Camera::Camera(const Camera& camera) : QObject(), frame_(nullptr) { - // Requires the interpolationKfi_ - setFrame(new ManipulatedCameraFrame(*camera.frame())); + // Requires the interpolationKfi_ + setFrame(new ManipulatedCameraFrame(*camera.frame())); - for (unsigned short j = 0; j < 16; ++j) { - modelViewMatrix_[j] = ((j % 5 == 0) ? 1.0 : 0.0); - // #CONNECTION# computeProjectionMatrix() is lazy and assumes 0.0 almost - // everywhere. - projectionMatrix_[j] = 0.0; - } + for (unsigned short j = 0; j < 16; ++j) { + modelViewMatrix_[j] = ((j % 5 == 0) ? 1.0 : 0.0); + // #CONNECTION# computeProjectionMatrix() is lazy and assumes 0.0 almost + // everywhere. + projectionMatrix_[j] = 0.0; + } - (*this) = camera; + (*this) = camera; } /*! Equal operator.*/ Camera& Camera::operator=(const Camera& camera) { - setScreenWidthAndHeight(camera.screenWidth(), camera.screenHeight()); - setFieldOfView(camera.fieldOfView()); - setSceneRadius(camera.sceneRadius()); - setSceneCenter(camera.sceneCenter()); - setZNearCoefficient(camera.zNearCoefficient()); - setZClippingCoefficient(camera.zClippingCoefficient()); - setType(camera.type()); - - // Stereo parameters - setIODistance(camera.IODistance()); - setFocusDistance(camera.focusDistance()); - setPhysicalScreenWidth(camera.physicalScreenWidth()); - - orthoCoef_ = camera.orthoCoef_; - projectionMatrixIsUpToDate_ = false; - - // frame_ and interpolationKfi_ pointers are not shared. - frame_->setReferenceFrame(nullptr); - frame_->setPosition(camera.position()); - frame_->setOrientation(camera.orientation()); - - computeProjectionMatrix(); - computeModelViewMatrix(); - - return *this; + setScreenWidthAndHeight(camera.screenWidth(), camera.screenHeight()); + setFieldOfView(camera.fieldOfView()); + setSceneRadius(camera.sceneRadius()); + setSceneCenter(camera.sceneCenter()); + setZNearCoefficient(camera.zNearCoefficient()); + setZClippingCoefficient(camera.zClippingCoefficient()); + setType(camera.type()); + + // Stereo parameters + setIODistance(camera.IODistance()); + setFocusDistance(camera.focusDistance()); + setPhysicalScreenWidth(camera.physicalScreenWidth()); + + orthoCoef_ = camera.orthoCoef_; + projectionMatrixIsUpToDate_ = false; + + // frame_ and interpolationKfi_ pointers are not shared. + frame_->setReferenceFrame(nullptr); + frame_->setPosition(camera.position()); + frame_->setOrientation(camera.orientation()); + + computeProjectionMatrix(); + computeModelViewMatrix(); + + return *this; } /*! Sets Camera screenWidth() and screenHeight() (expressed in pixels).*/ void Camera::setScreenWidthAndHeight(int width, int height) { - // Prevent negative and zero dimensions that would cause divisions by zero. - screenWidth_ = width > 0 ? width : 1; - screenHeight_ = height > 0 ? height : 1; - projectionMatrixIsUpToDate_ = false; + // Prevent negative and zero dimensions that would cause divisions by zero. + screenWidth_ = width > 0 ? width : 1; + screenHeight_ = height > 0 ? height : 1; + projectionMatrixIsUpToDate_ = false; } /*! Returns the near clipping plane distance used by the Camera projection matrix. */ qreal Camera::zNear() const { - const qreal zNearScene = zClippingCoefficient() * sceneRadius(); - qreal z = distanceToSceneCenter() - zNearScene; z = z / 2; - - // Prevents negative or null zNear values. - const qreal zMin = zNearCoefficient() * zNearScene; - if (z < zMin) - switch (type()) { - case Camera::PERSPECTIVE: - z = zMin; - break; - case Camera::ORTHOGRAPHIC: - z = 0.0; - break; - } - return z; + const qreal zNearScene = zClippingCoefficient() * sceneRadius(); + qreal z = distanceToSceneCenter() - zNearScene; z = z / 2; + + // Prevents negative or null zNear values. + const qreal zMin = zNearCoefficient() * zNearScene; + if (z < zMin) + switch (type()) { + case Camera::PERSPECTIVE: + z = zMin; + break; + case Camera::ORTHOGRAPHIC: + z = 0.0; + break; + } + return z; } /*! Returns the far clipping plane distance used by the Camera projection matrix.*/ qreal Camera::zFar() const { - return distanceToSceneCenter() + zClippingCoefficient() * sceneRadius(); + return distanceToSceneCenter() + zClippingCoefficient() * sceneRadius(); } /*! Sets the vertical fieldOfView() of the Camera (in radians).*/ void Camera::setFieldOfView(qreal fov) { - fieldOfView_ = fov; - setFocusDistance(sceneRadius() / tan(fov / 2.0)); - projectionMatrixIsUpToDate_ = false; + fieldOfView_ = fov; + setFocusDistance(sceneRadius() / tan(fov / 2.0)); + projectionMatrixIsUpToDate_ = false; } /*! Defines the Camera type().*/ void Camera::setType(Type type) { - if ((type == Camera::ORTHOGRAPHIC) && (type_ == Camera::PERSPECTIVE)) - orthoCoef_ = tan(fieldOfView() / 2.0); - type_ = type; - projectionMatrixIsUpToDate_ = false; + if ((type == Camera::ORTHOGRAPHIC) && (type_ == Camera::PERSPECTIVE)) + orthoCoef_ = tan(fieldOfView() / 2.0); + type_ = type; + projectionMatrixIsUpToDate_ = false; } /*! Sets the Camera frame().*/ void Camera::setFrame(ManipulatedCameraFrame* const mcf) { - if (!mcf) - return; + if (!mcf) + return; - if (frame_) { - disconnect(frame_, SIGNAL(modified()), this, SLOT(onFrameModified())); - } + if (frame_) { + disconnect(frame_, SIGNAL(modified()), this, SLOT(onFrameModified())); + } - frame_ = mcf; + frame_ = mcf; - connect(frame_, SIGNAL(modified()), this, SLOT(onFrameModified())); - onFrameModified(); + connect(frame_, SIGNAL(modified()), this, SLOT(onFrameModified())); + onFrameModified(); } /*! Returns the distance from the Camera center to sceneCenter(), projected along the Camera Z axis. Used by zNear() and zFar() to optimize the Z range. */ qreal Camera::distanceToSceneCenter() const { - return fabs((frame()->coordinatesOf(sceneCenter())).Z()); + return fabs((frame()->coordinatesOf(sceneCenter())).Z()); } /*! Returns the \p halfWidth and \p halfHeight of the Camera orthographic frustum.*/ void Camera::getOrthoWidthHeight(GLdouble& halfWidth, - GLdouble& halfHeight) const { - const qreal dist = orthoCoef_ * fabs(cameraCoordinatesOf(pivotPoint()).Z()); - //#CONNECTION# fitScreenRegion - halfWidth = dist * ((aspectRatio() < 1.0) ? 1.0 : aspectRatio()); - halfHeight = dist * ((aspectRatio() < 1.0) ? 1.0 / aspectRatio() : 1.0); + GLdouble& halfHeight) const { + const qreal dist = orthoCoef_ * fabs(cameraCoordinatesOf(pivotPoint()).Z()); + //#CONNECTION# fitScreenRegion + halfWidth = dist * ((aspectRatio() < 1.0) ? 1.0 : aspectRatio()); + halfHeight = dist * ((aspectRatio() < 1.0) ? 1.0 / aspectRatio() : 1.0); } /*! Computes the projection matrix associated with the Camera. */ void Camera::computeProjectionMatrix() const { - if (projectionMatrixIsUpToDate_) - return; - - const qreal ZNear = zNear(); - const qreal ZFar = zFar(); - - switch (type()) { - case Camera::PERSPECTIVE: { - // #CONNECTION# all non null coefficients were set to 0.0 in constructor. - const qreal f = 1.0 / tan(fieldOfView() / 2.0); - projectionMatrix_[0] = f / aspectRatio(); - projectionMatrix_[5] = f; - projectionMatrix_[10] = (ZNear + ZFar) / (ZNear - ZFar); - projectionMatrix_[11] = -1.0; - projectionMatrix_[14] = 2.0 * ZNear * ZFar / (ZNear - ZFar); - projectionMatrix_[15] = 0.0; - - break; - } - case Camera::ORTHOGRAPHIC: { - GLdouble w, h; - getOrthoWidthHeight(w, h); - projectionMatrix_[0] = 1.0 / w; - projectionMatrix_[5] = 1.0 / h; - projectionMatrix_[10] = -2.0 / (ZFar - ZNear); - projectionMatrix_[11] = 0.0; - projectionMatrix_[14] = -(ZFar + ZNear) / (ZFar - ZNear); - projectionMatrix_[15] = 1.0; - // same as glOrtho( -w, w, -h, h, zNear(), zFar() ); - break; - } - } - - projectionMatrixIsUpToDate_ = true; + if (projectionMatrixIsUpToDate_) + return; + + const qreal ZNear = zNear(); + const qreal ZFar = zFar(); + + switch (type()) { + case Camera::PERSPECTIVE: { + // #CONNECTION# all non null coefficients were set to 0.0 in constructor. + const qreal f = 1.0 / tan(fieldOfView() / 2.0); + projectionMatrix_[0] = f / aspectRatio(); + projectionMatrix_[5] = f; + projectionMatrix_[10] = (ZNear + ZFar) / (ZNear - ZFar); + projectionMatrix_[11] = -1.0; + projectionMatrix_[14] = 2.0 * ZNear * ZFar / (ZNear - ZFar); + projectionMatrix_[15] = 0.0; + + break; + } + case Camera::ORTHOGRAPHIC: { + GLdouble w, h; + getOrthoWidthHeight(w, h); + projectionMatrix_[0] = 1.0 / w; + projectionMatrix_[5] = 1.0 / h; + projectionMatrix_[10] = -2.0 / (ZFar - ZNear); + projectionMatrix_[11] = 0.0; + projectionMatrix_[14] = -(ZFar + ZNear) / (ZFar - ZNear); + projectionMatrix_[15] = 1.0; + // same as glOrtho( -w, w, -h, h, zNear(), zFar() ); + break; + } + } + + projectionMatrixIsUpToDate_ = true; } /*! Computes the modelView matrix associated with the Camera's position() and orientation().*/ void Camera::computeModelViewMatrix() const { - if (modelViewMatrixIsUpToDate_) - return; + if (modelViewMatrixIsUpToDate_) + return; - const Quaternion q = frame()->orientation(); + const Quaternion q = frame()->orientation(); - const qreal q00 = 2.0 * q[0] * q[0]; - const qreal q11 = 2.0 * q[1] * q[1]; - const qreal q22 = 2.0 * q[2] * q[2]; + const qreal q00 = 2.0 * q[0] * q[0]; + const qreal q11 = 2.0 * q[1] * q[1]; + const qreal q22 = 2.0 * q[2] * q[2]; - const qreal q01 = 2.0 * q[0] * q[1]; - const qreal q02 = 2.0 * q[0] * q[2]; - const qreal q03 = 2.0 * q[0] * q[3]; + const qreal q01 = 2.0 * q[0] * q[1]; + const qreal q02 = 2.0 * q[0] * q[2]; + const qreal q03 = 2.0 * q[0] * q[3]; - const qreal q12 = 2.0 * q[1] * q[2]; - const qreal q13 = 2.0 * q[1] * q[3]; + const qreal q12 = 2.0 * q[1] * q[2]; + const qreal q13 = 2.0 * q[1] * q[3]; - const qreal q23 = 2.0 * q[2] * q[3]; + const qreal q23 = 2.0 * q[2] * q[3]; - modelViewMatrix_[0] = 1.0 - q11 - q22; - modelViewMatrix_[1] = q01 - q23; - modelViewMatrix_[2] = q02 + q13; - modelViewMatrix_[3] = 0.0; + modelViewMatrix_[0] = 1.0 - q11 - q22; + modelViewMatrix_[1] = q01 - q23; + modelViewMatrix_[2] = q02 + q13; + modelViewMatrix_[3] = 0.0; - modelViewMatrix_[4] = q01 + q23; - modelViewMatrix_[5] = 1.0 - q22 - q00; - modelViewMatrix_[6] = q12 - q03; - modelViewMatrix_[7] = 0.0; + modelViewMatrix_[4] = q01 + q23; + modelViewMatrix_[5] = 1.0 - q22 - q00; + modelViewMatrix_[6] = q12 - q03; + modelViewMatrix_[7] = 0.0; - modelViewMatrix_[8] = q02 - q13; - modelViewMatrix_[9] = q12 + q03; - modelViewMatrix_[10] = 1.0 - q11 - q00; - modelViewMatrix_[11] = 0.0; + modelViewMatrix_[8] = q02 - q13; + modelViewMatrix_[9] = q12 + q03; + modelViewMatrix_[10] = 1.0 - q11 - q00; + modelViewMatrix_[11] = 0.0; - const Vec t = q.inverseRotate(frame()->position()); + const Vec t = q.inverseRotate(frame()->position()); - modelViewMatrix_[12] = -t.X(); - modelViewMatrix_[13] = -t.Y(); - modelViewMatrix_[14] = -t.Z(); - modelViewMatrix_[15] = 1.0; + modelViewMatrix_[12] = -t.X(); + modelViewMatrix_[13] = -t.Y(); + modelViewMatrix_[14] = -t.Z(); + modelViewMatrix_[15] = 1.0; - modelViewMatrixIsUpToDate_ = true; + modelViewMatrixIsUpToDate_ = true; } /*! Loads the OpenGL \c GL_PROJECTION matrix with the Camera projection matrix. The Camera projection matrix is computed using computeProjectionMatrix().*/ void Camera::loadProjectionMatrix(bool reset) const { - // WARNING: makeCurrent must be called by every calling method - glMatrixMode(GL_PROJECTION); + // WARNING: makeCurrent must be called by every calling method + //glViewport(0, 0, 800, 600); + glMatrixMode(GL_PROJECTION); - if (reset) - glLoadIdentity(); + if (reset) + glLoadIdentity(); - computeProjectionMatrix(); + computeProjectionMatrix(); - glMultMatrixd(projectionMatrix_); + glMultMatrixd(projectionMatrix_); } /*! Loads the OpenGL \c GL_MODELVIEW matrix with the modelView matrix @@ -302,226 +303,226 @@ void Camera::loadProjectionMatrix(bool reset) const { Calls computeModelViewMatrix() to compute the Camera's modelView matrix.*/ void Camera::loadModelViewMatrix(bool reset) const { - // WARNING: makeCurrent must be called by every calling method - glMatrixMode(GL_MODELVIEW); - computeModelViewMatrix(); - if (reset) - glLoadMatrixd(modelViewMatrix_); - else - glMultMatrixd(modelViewMatrix_); + // WARNING: makeCurrent must be called by every calling method + glMatrixMode(GL_MODELVIEW); + computeModelViewMatrix(); + if (reset) + glLoadMatrixd(modelViewMatrix_); + else + glMultMatrixd(modelViewMatrix_); } /*! Same as loadProjectionMatrix() but for a stereo setup. Only the Camera::PERSPECTIVE type() is supported for stereo mode. See QGLViewer::setStereoDisplay(). \attention glMatrixMode is set to \c GL_PROJECTION. */ void Camera::loadProjectionMatrixStereo(bool leftBuffer) const { - qreal left, right, bottom, top; - qreal screenHalfWidth, halfWidth, side, shift, delta; - - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - - switch (type()) { - case Camera::PERSPECTIVE: - // compute half width of screen, - // corresponding to zero parallax plane to deduce decay of cameras - screenHalfWidth = focusDistance() * tan(horizontalFieldOfView() / 2.0); - shift = screenHalfWidth * IODistance() / physicalScreenWidth(); - // should be * current y / y total - // to take into account that the window doesn't cover the entire screen - - // compute half width of "view" at znear and the delta corresponding to - // the shifted camera to deduce what to set for asymmetric frustums - halfWidth = zNear() * tan(horizontalFieldOfView() / 2.0); - delta = shift * zNear() / focusDistance(); - side = leftBuffer ? -1.0 : 1.0; - - left = -halfWidth + side * delta; - right = halfWidth + side * delta; - top = halfWidth / aspectRatio(); - bottom = -top; - glFrustum(left, right, bottom, top, zNear(), zFar()); - break; - - case Camera::ORTHOGRAPHIC: - qWarning("Camera::setProjectionMatrixStereo: Stereo not available with " - "Ortho mode"); - break; - } + qreal left, right, bottom, top; + qreal screenHalfWidth, halfWidth, side, shift, delta; + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + switch (type()) { + case Camera::PERSPECTIVE: + // compute half width of screen, + // corresponding to zero parallax plane to deduce decay of cameras + screenHalfWidth = focusDistance() * tan(horizontalFieldOfView() / 2.0); + shift = screenHalfWidth * IODistance() / physicalScreenWidth(); + // should be * current y / y total + // to take into account that the window doesn't cover the entire screen + + // compute half width of "view" at znear and the delta corresponding to + // the shifted camera to deduce what to set for asymmetric frustums + halfWidth = zNear() * tan(horizontalFieldOfView() / 2.0); + delta = shift * zNear() / focusDistance(); + side = leftBuffer ? -1.0 : 1.0; + + left = -halfWidth + side * delta; + right = halfWidth + side * delta; + top = halfWidth / aspectRatio(); + bottom = -top; + glFrustum(left, right, bottom, top, zNear(), zFar()); + break; + + case Camera::ORTHOGRAPHIC: + qWarning("Camera::setProjectionMatrixStereo: Stereo not available with " + "Ortho mode"); + break; + } } /*! Same as loadModelViewMatrix() but for a stereo setup. Only the Camera::PERSPECTIVE type() is supported for stereo mode. See QGLViewer::setStereoDisplay(). \attention glMatrixMode is set to \c GL_MODELVIEW. */ void Camera::loadModelViewMatrixStereo(bool leftBuffer) const { - // WARNING: makeCurrent must be called by every calling method - glMatrixMode(GL_MODELVIEW); - - qreal halfWidth = focusDistance() * tan(horizontalFieldOfView() / 2.0); - qreal shift = - halfWidth * IODistance() / - physicalScreenWidth(); // * current window width / full screen width - - computeModelViewMatrix(); - if (leftBuffer) - modelViewMatrix_[12] -= shift; - else - modelViewMatrix_[12] += shift; - glLoadMatrixd(modelViewMatrix_); + // WARNING: makeCurrent must be called by every calling method + glMatrixMode(GL_MODELVIEW); + + qreal halfWidth = focusDistance() * tan(horizontalFieldOfView() / 2.0); + qreal shift = + halfWidth * IODistance() / + physicalScreenWidth(); // * current window width / full screen width + + computeModelViewMatrix(); + if (leftBuffer) + modelViewMatrix_[12] -= shift; + else + modelViewMatrix_[12] += shift; + glLoadMatrixd(modelViewMatrix_); } /*! Fills \p m with the Camera projection matrix values.*/ void Camera::getProjectionMatrix(GLdouble m[16]) const { - computeProjectionMatrix(); - for (unsigned short i = 0; i < 16; ++i) - m[i] = projectionMatrix_[i]; + computeProjectionMatrix(); + for (unsigned short i = 0; i < 16; ++i) + m[i] = projectionMatrix_[i]; } void Camera::getProjectionMatrix(GLfloat m[16]) const { - static GLdouble mat[16]; - getProjectionMatrix(mat); - for (unsigned short i = 0; i < 16; ++i) - m[i] = float(mat[i]); + static GLdouble mat[16]; + getProjectionMatrix(mat); + for (unsigned short i = 0; i < 16; ++i) + m[i] = float(mat[i]); } /*! Fills \p m with the Camera modelView matrix values. */ void Camera::getModelViewMatrix(GLdouble m[16]) const { - // May not be needed, but easier like this. - // Prevents from retrieving matrix in stereo mode -> overwrites shifted value. - computeModelViewMatrix(); - for (unsigned short i = 0; i < 16; ++i) - m[i] = modelViewMatrix_[i]; + // May not be needed, but easier like this. + // Prevents from retrieving matrix in stereo mode -> overwrites shifted value. + computeModelViewMatrix(); + for (unsigned short i = 0; i < 16; ++i) + m[i] = modelViewMatrix_[i]; } void Camera::getModelViewMatrix(GLfloat m[16]) const { - static GLdouble mat[16]; - getModelViewMatrix(mat); - for (unsigned short i = 0; i < 16; ++i) - m[i] = float(mat[i]); + static GLdouble mat[16]; + getModelViewMatrix(mat); + for (unsigned short i = 0; i < 16; ++i) + m[i] = float(mat[i]); } /*! Fills \p m with the product of the ModelView and Projection matrices. */ void Camera::getModelViewProjectionMatrix(GLdouble m[16]) const { - GLdouble mv[16]; - GLdouble proj[16]; - getModelViewMatrix(mv); - getProjectionMatrix(proj); - - for (unsigned short i = 0; i < 4; ++i) { - for (unsigned short j = 0; j < 4; ++j) { - qreal sum = 0.0; - for (unsigned short k = 0; k < 4; ++k) - sum += proj[i + 4 * k] * mv[k + 4 * j]; - m[i + 4 * j] = sum; - } - } + GLdouble mv[16]; + GLdouble proj[16]; + getModelViewMatrix(mv); + getProjectionMatrix(proj); + + for (unsigned short i = 0; i < 4; ++i) { + for (unsigned short j = 0; j < 4; ++j) { + qreal sum = 0.0; + for (unsigned short k = 0; k < 4; ++k) + sum += proj[i + 4 * k] * mv[k + 4 * j]; + m[i + 4 * j] = sum; + } + } } void Camera::getModelViewProjectionMatrix(GLfloat m[16]) const { - static GLdouble mat[16]; - getModelViewProjectionMatrix(mat); - for (unsigned short i = 0; i < 16; ++i) - m[i] = float(mat[i]); + static GLdouble mat[16]; + getModelViewProjectionMatrix(mat); + for (unsigned short i = 0; i < 16; ++i) + m[i] = float(mat[i]); } /*! Sets the sceneRadius() value. Negative values are ignored. */ void Camera::setSceneRadius(qreal radius) { - if (radius <= 0.0) { - qWarning("Scene radius must be positive - Ignoring value"); - return; - } + if (radius <= 0.0) { + qWarning("Scene radius must be positive - Ignoring value"); + return; + } - sceneRadius_ = radius; - projectionMatrixIsUpToDate_ = false; + sceneRadius_ = radius; + projectionMatrixIsUpToDate_ = false; - setFocusDistance(sceneRadius() / tan(fieldOfView() / 2.0)); + setFocusDistance(sceneRadius() / tan(fieldOfView() / 2.0)); - frame()->setFlySpeed(0.01 * sceneRadius()); + frame()->setFlySpeed(0.01 * sceneRadius()); } void Camera::setSceneBoundingBox(const Vec& min, const Vec& max) { - setSceneCenter((min + max) / 2.0); - setSceneRadius(0.5 * (max - min).Norm()); + setSceneCenter((min + max) / 2.0); + setSceneRadius(0.5 * (max - min).Norm()); } /*! Sets the sceneCenter(). */ void Camera::setSceneCenter(const Vec& getCenter) { - sceneCenter_ = getCenter; - setPivotPoint(sceneCenter()); - projectionMatrixIsUpToDate_ = false; + sceneCenter_ = getCenter; + setPivotPoint(sceneCenter()); + projectionMatrixIsUpToDate_ = false; } /*! setSceneCenter() to the result of pointUnderPixel(\p pixel).*/ bool Camera::setSceneCenterFromPixel(const QPoint& pixel) { - bool found; - Vec point = pointUnderPixel(pixel, found); - if (found) - setSceneCenter(point); - return found; + bool found; + Vec point = pointUnderPixel(pixel, found); + if (found) + setSceneCenter(point); + return found; } /*! Changes the pivotPoint() to \p point (defined in the world coordinate system). */ void Camera::setPivotPoint(const Vec& point) { - const qreal prevDist = fabs(cameraCoordinatesOf(pivotPoint()).Z()); - - // If frame's RAP is set directly, projectionMatrixIsUpToDate_ should also be - // set to false to ensure proper recomputation of the ORTHO projection matrix. - frame()->setPivotPoint(point); - - // orthoCoef_ is used to compensate for changes of the pivotPoint, so that the - // image does not change when the pivotPoint is changed in ORTHOGRAPHIC mode. - const qreal newDist = fabs(cameraCoordinatesOf(pivotPoint()).Z()); - // Prevents division by zero when rap is set to camera position - if ((prevDist > 1E-9) && (newDist > 1E-9)) - orthoCoef_ *= prevDist / newDist; - projectionMatrixIsUpToDate_ = false; + const qreal prevDist = fabs(cameraCoordinatesOf(pivotPoint()).Z()); + + // If frame's RAP is set directly, projectionMatrixIsUpToDate_ should also be + // set to false to ensure proper recomputation of the ORTHO projection matrix. + frame()->setPivotPoint(point); + + // orthoCoef_ is used to compensate for changes of the pivotPoint, so that the + // image does not change when the pivotPoint is changed in ORTHOGRAPHIC mode. + const qreal newDist = fabs(cameraCoordinatesOf(pivotPoint()).Z()); + // Prevents division by zero when rap is set to camera position + if ((prevDist > 1E-9) && (newDist > 1E-9)) + orthoCoef_ *= prevDist / newDist; + projectionMatrixIsUpToDate_ = false; } /*! The pivotPoint() is set to the point located under \p pixel on screen. */ bool Camera::setPivotPointFromPixel(const QPoint& pixel) { - bool found; - Vec point = pointUnderPixel(pixel, found); - if (found) - setPivotPoint(point); - return found; + bool found; + Vec point = pointUnderPixel(pixel, found); + if (found) + setPivotPoint(point); + return found; } /*! Returns the ratio between pixel and OpenGL units at \p position. */ qreal Camera::pixelGLRatio(const Vec& position) const { - switch (type()) { - case Camera::PERSPECTIVE: - return 2.0 * fabs((frame()->coordinatesOf(position)).Z()) * - tan(fieldOfView() / 2.0) / screenHeight(); - case Camera::ORTHOGRAPHIC: { - GLdouble w, h; - getOrthoWidthHeight(w, h); - return 2.0 * h / screenHeight(); - } - } - // Bad compilers complain - return 1.0; + switch (type()) { + case Camera::PERSPECTIVE: + return 2.0 * fabs((frame()->coordinatesOf(position)).Z()) * + tan(fieldOfView() / 2.0) / screenHeight(); + case Camera::ORTHOGRAPHIC: { + GLdouble w, h; + getOrthoWidthHeight(w, h); + return 2.0 * h / screenHeight(); + } + } + // Bad compilers complain + return 1.0; } /*! Changes the Camera fieldOfView() so that the entire scene (defined by QGLViewer::sceneCenter() and QGLViewer::sceneRadius()) is visible from the Camera position().*/ void Camera::setFOVToFitScene() { - if (distanceToSceneCenter() > std::sqrt(2.0) * sceneRadius()) - setFieldOfView(2.0 * asin(sceneRadius() / distanceToSceneCenter())); - else - setFieldOfView(M_PI / 2.0); + if (distanceToSceneCenter() > std::sqrt(2.0) * sceneRadius()) + setFieldOfView(2.0 * asin(sceneRadius() / distanceToSceneCenter())); + else + setFieldOfView(M_PI / 2.0); } /*! Returns the coordinates of the 3D point located at pixel (x,y) on screen.*/ Vec Camera::pointUnderPixel(const QPoint& pixel, bool& found) const { - float depth; - // Qt uses upper corner for its origin while GL uses the lower corner. - glReadPixels(pixel.x(), screenHeight() - 1 - pixel.y(), 1, 1, - GL_DEPTH_COMPONENT, GL_FLOAT, &depth); - found = static_cast(depth) < 1.0; - Vec point(static_cast(pixel.x()), static_cast(pixel.y()), static_cast(depth)); - point = unprojectedCoordinatesOf(point); - return point; + float depth; + // Qt uses upper corner for its origin while GL uses the lower corner. + glReadPixels(pixel.x(), screenHeight() - 1 - pixel.y(), 1, 1, + GL_DEPTH_COMPONENT, GL_FLOAT, &depth); + found = static_cast(depth) < 1.0; + Vec point(static_cast(pixel.x()), static_cast(pixel.y()), static_cast(depth)); + point = unprojectedCoordinatesOf(point); + return point; } /*! Moves the Camera so that the entire scene is visible. */ @@ -530,145 +531,145 @@ void Camera::showEntireScene() { fitSphere(sceneCenter(), sceneRadius()); } /*! Moves the Camera so that its sceneCenter() is projected on the center of the window. The orientation() and fieldOfView() are unchanged. */ void Camera::centerScene() { - frame()->projectOnLine(sceneCenter(), viewDirection()); + frame()->projectOnLine(sceneCenter(), viewDirection()); } /*! Sets the Camera orientation(), so that it looks at point \p target (defined in the world coordinate system).*/ void Camera::lookAt(const Vec& target) { - setViewDirection(target - position()); + setViewDirection(target - position()); } /*! Moves the Camera so that the sphere defined by (\p center, \p radius) is visible and fits in the frustum.*/ void Camera::fitSphere(const Vec& getCenter, qreal radius) { - qreal distance = 0.0; - switch (type()) { - case Camera::PERSPECTIVE: { - const qreal yview = radius / sin(fieldOfView() / 2.0); - const qreal xview = radius / sin(horizontalFieldOfView() / 2.0); - distance = qMax(xview, yview); - break; - } - case Camera::ORTHOGRAPHIC: { - distance = - ((getCenter - pivotPoint()) | viewDirection()) + (radius / orthoCoef_); - break; - } - } - Vec newPos(getCenter - distance * viewDirection()); - frame()->setPosition(newPos); + qreal distance = 0.0; + switch (type()) { + case Camera::PERSPECTIVE: { + const qreal yview = radius / sin(fieldOfView() / 2.0); + const qreal xview = radius / sin(horizontalFieldOfView() / 2.0); + distance = qMax(xview, yview); + break; + } + case Camera::ORTHOGRAPHIC: { + distance = + ((getCenter - pivotPoint()) | viewDirection()) + (radius / orthoCoef_); + break; + } + } + Vec newPos(getCenter - distance * viewDirection()); + frame()->setPosition(newPos); } /*! Moves the Camera so that the (world axis aligned) bounding box (\p min, \p max) is entirely visible, using fitSphere(). */ void Camera::fitBoundingBox(const Vec& min, const Vec& max) { - qreal diameter = qMax(fabs(max[1] - min[1]), fabs(max[0] - min[0])); - diameter = qMax(fabs(max[2] - min[2]), diameter); - fitSphere(0.5 * (min + max), 0.5 * diameter); + qreal diameter = qMax(fabs(max[1] - min[1]), fabs(max[0] - min[0])); + diameter = qMax(fabs(max[2] - min[2]), diameter); + fitSphere(0.5 * (min + max), 0.5 * diameter); } /*! Moves the Camera so that the rectangular screen region defined by \p rectangle (pixel units, with origin in the upper left corner) fits the screen.*/ void Camera::fitScreenRegion(const QRect& rectangle) { - const Vec vd = viewDirection(); - const qreal distToPlane = distanceToSceneCenter(); - const QPoint getCenter = rectangle.center(); - - Vec orig, dir; - convertClickToLine(getCenter, orig, dir); - Vec newCenter = orig + distToPlane / (dir | vd) * dir; - - convertClickToLine(QPoint(rectangle.x(), getCenter.y()), orig, dir); - const Vec pointX = orig + distToPlane / (dir | vd) * dir; - - convertClickToLine(QPoint(getCenter.x(), rectangle.y()), orig, dir); - const Vec pointY = orig + distToPlane / (dir | vd) * dir; - - qreal distance = 0.0; - switch (type()) { - case Camera::PERSPECTIVE: { - const qreal distX = - (pointX - newCenter).Norm() / sin(horizontalFieldOfView() / 2.0); - const qreal distY = (pointY - newCenter).Norm() / sin(fieldOfView() / 2.0); - distance = qMax(distX, distY); - break; - } - case Camera::ORTHOGRAPHIC: { - const qreal dist = ((newCenter - pivotPoint()) | vd); - //#CONNECTION# getOrthoWidthHeight - const qreal distX = (pointX - newCenter).Norm() / orthoCoef_ / - ((aspectRatio() < 1.0) ? 1.0 : aspectRatio()); - const qreal distY = (pointY - newCenter).Norm() / orthoCoef_ / - ((aspectRatio() < 1.0) ? 1.0 / aspectRatio() : 1.0); - distance = dist + qMax(distX, distY); - break; - } - } - - Vec newPos(newCenter - distance * vd); - frame()->setPosition(newPos); + const Vec vd = viewDirection(); + const qreal distToPlane = distanceToSceneCenter(); + const QPoint getCenter = rectangle.center(); + + Vec orig, dir; + convertClickToLine(getCenter, orig, dir); + Vec newCenter = orig + distToPlane / (dir | vd) * dir; + + convertClickToLine(QPoint(rectangle.x(), getCenter.y()), orig, dir); + const Vec pointX = orig + distToPlane / (dir | vd) * dir; + + convertClickToLine(QPoint(getCenter.x(), rectangle.y()), orig, dir); + const Vec pointY = orig + distToPlane / (dir | vd) * dir; + + qreal distance = 0.0; + switch (type()) { + case Camera::PERSPECTIVE: { + const qreal distX = + (pointX - newCenter).Norm() / sin(horizontalFieldOfView() / 2.0); + const qreal distY = (pointY - newCenter).Norm() / sin(fieldOfView() / 2.0); + distance = qMax(distX, distY); + break; + } + case Camera::ORTHOGRAPHIC: { + const qreal dist = ((newCenter - pivotPoint()) | vd); + //#CONNECTION# getOrthoWidthHeight + const qreal distX = (pointX - newCenter).Norm() / orthoCoef_ / + ((aspectRatio() < 1.0) ? 1.0 : aspectRatio()); + const qreal distY = (pointY - newCenter).Norm() / orthoCoef_ / + ((aspectRatio() < 1.0) ? 1.0 / aspectRatio() : 1.0); + distance = dist + qMax(distX, distY); + break; + } + } + + Vec newPos(newCenter - distance * vd); + frame()->setPosition(newPos); } /*! Rotates the Camera so that its upVector() becomes \p up (defined in the world coordinate system).*/ void Camera::setUpVector(const Vec& up, bool noMove) { - Quaternion q(Vec(0.0, 1.0, 0.0), frame()->transformOf(up)); + Quaternion q(Vec(0.0, 1.0, 0.0), frame()->transformOf(up)); - if (!noMove) - frame()->setPosition(pivotPoint() - - (frame()->orientation() * q) - .rotate(frame()->coordinatesOf(pivotPoint()))); + if (!noMove) + frame()->setPosition(pivotPoint() - + (frame()->orientation() * q) + .rotate(frame()->coordinatesOf(pivotPoint()))); - frame()->rotate(q); + frame()->rotate(q); - // Useful in fly mode to keep the horizontal direction. - frame()->updateSceneUpVector(); + // Useful in fly mode to keep the horizontal direction. + frame()->updateSceneUpVector(); } /*! Sets the orientation() of the Camera using polar coordinates.*/ void Camera::setOrientation(qreal theta, qreal phi) { - Vec axis(0.0, 1.0, 0.0); - const Quaternion rot1(axis, theta); - axis = Vec(-cos(theta), 0.0, sin(theta)); - const Quaternion rot2(axis, phi); - setOrientation(rot1 * rot2); + Vec axis(0.0, 1.0, 0.0); + const Quaternion rot1(axis, theta); + axis = Vec(-cos(theta), 0.0, sin(theta)); + const Quaternion rot2(axis, phi); + setOrientation(rot1 * rot2); } /*! Sets the Camera orientation(), defined in the world coordinate system. */ void Camera::setOrientation(const Quaternion& q) { - frame()->setOrientation(q); - frame()->updateSceneUpVector(); + frame()->setOrientation(q); + frame()->updateSceneUpVector(); } /*! Rotates the Camera so that its viewDirection() is \p direction (defined in the world coordinate system).*/ void Camera::setViewDirection(const Vec& direction) { - if (direction.SquaredNorm() < 1E-10) - return; - - Vec xAxis = acamcad::MathUtils::cross(direction , upVector()); - if (xAxis.SquaredNorm() < 1E-10) { - // target is aligned with upVector, this means a rotation around X axis - // X axis is then unchanged, let's keep it ! - xAxis = frame()->inverseTransformOf(Vec(1.0, 0.0, 0.0)); - } - - Quaternion q; - q.setFromRotatedBasis(xAxis, acamcad::MathUtils::cross(xAxis, direction), -direction); - frame()->setOrientation(q); + if (direction.SquaredNorm() < 1E-10) + return; + + Vec xAxis = acamcad::MathUtils::cross(direction, upVector()); + if (xAxis.SquaredNorm() < 1E-10) { + // target is aligned with upVector, this means a rotation around X axis + // X axis is then unchanged, let's keep it ! + xAxis = frame()->inverseTransformOf(Vec(1.0, 0.0, 0.0)); + } + + Quaternion q; + q.setFromRotatedBasis(xAxis, acamcad::MathUtils::cross(xAxis, direction), -direction); + frame()->setOrientation(q); } // Compute a 3 by 3 determinant. static qreal det(qreal m00, qreal m01, qreal m02, qreal m10, qreal m11, - qreal m12, qreal m20, qreal m21, qreal m22) { - return m00 * m11 * m22 + m01 * m12 * m20 + m02 * m10 * m21 - m20 * m11 * m02 - - m10 * m01 * m22 - m00 * m21 * m12; + qreal m12, qreal m20, qreal m21, qreal m22) { + return m00 * m11 * m22 + m01 * m12 * m20 + m02 * m10 * m21 - m20 * m11 * m02 - + m10 * m01 * m22 - m00 * m21 * m12; } // Computes the index of element [i][j] in a \c qreal matrix[3][4]. static inline unsigned int ind(unsigned int i, unsigned int j) { - return (i * 4 + j); + return (i * 4 + j); } /*! Returns the Camera position (the eye), defined in the world coordinate system.*/ @@ -676,16 +677,16 @@ Vec Camera::position() const { return frame()->position(); } /*! Returns the normalized up vector of the Camera, defined in the world coordinate system.*/ Vec Camera::upVector() const { - return frame()->inverseTransformOf(Vec(0.0, 1.0, 0.0)); + return frame()->inverseTransformOf(Vec(0.0, 1.0, 0.0)); } /*! Returns the normalized view direction of the Camera, defined in the world coordinate system.*/ Vec Camera::viewDirection() const { - return frame()->inverseTransformOf(Vec(0.0, 0.0, -1.0)); + return frame()->inverseTransformOf(Vec(0.0, 0.0, -1.0)); } /*! Returns the normalized right vector of the Camera, defined in the world coordinate system.*/ Vec Camera::rightVector() const { - return frame()->inverseTransformOf(Vec(1.0, 0.0, 0.0)); + return frame()->inverseTransformOf(Vec(1.0, 0.0, 0.0)); } /*! Returns the Camera orientation, defined in the world coordinate system. */ @@ -696,13 +697,13 @@ void Camera::setPosition(const Vec& pos) { frame()->setPosition(pos); } /*! Returns the Camera frame coordinates of a point \p src defined in world coordinates.*/ Vec Camera::cameraCoordinatesOf(const Vec& src) const { - return frame()->coordinatesOf(src); + return frame()->coordinatesOf(src); } /*! Returns the world coordinates of the point whose position \p src is defined in the Camera coordinate system. */ Vec Camera::worldCoordinatesOf(const Vec& src) const { - return frame()->inverseCoordinatesOf(src); + return frame()->inverseCoordinatesOf(src); } qreal Camera::flySpeed() const { return frame()->flySpeed(); } @@ -719,104 +720,104 @@ Vec Camera::pivotPoint() const { return frame()->pivotPoint(); } /*! Sets the Camera's position() and orientation() from an OpenGL ModelView matrix.*/ void Camera::setFromModelViewMatrix(const GLdouble* const modelViewMatrix) { - // Get upper left (rotation) matrix - qreal upperLeft[3][3]; - for (int i = 0; i < 3; ++i) - for (int j = 0; j < 3; ++j) - upperLeft[i][j] = modelViewMatrix[i * 4 + j]; - - // Transform upperLeft into the associated Quaternion - Quaternion q; - q.setFromRotationMatrix(upperLeft); - - setOrientation(q); - setPosition(-q.rotate( - Vec(modelViewMatrix[12], modelViewMatrix[13], modelViewMatrix[14]))); + // Get upper left (rotation) matrix + qreal upperLeft[3][3]; + for (int i = 0; i < 3; ++i) + for (int j = 0; j < 3; ++j) + upperLeft[i][j] = modelViewMatrix[i * 4 + j]; + + // Transform upperLeft into the associated Quaternion + Quaternion q; + q.setFromRotationMatrix(upperLeft); + + setOrientation(q); + setPosition(-q.rotate( + Vec(modelViewMatrix[12], modelViewMatrix[13], modelViewMatrix[14]))); } /*! Defines the Camera position(), orientation() and fieldOfView() from a projection matrix.*/ void Camera::setFromProjectionMatrix(const qreal matrix[12]) { - // The 3 lines of the matrix are the normals to the planes x=0, y=0, z=0 - // in the camera CS. As we normalize them, we do not need the 4th coordinate. - Vec line_0(matrix[ind(0, 0)], matrix[ind(0, 1)], matrix[ind(0, 2)]); - Vec line_1(matrix[ind(1, 0)], matrix[ind(1, 1)], matrix[ind(1, 2)]); - Vec line_2(matrix[ind(2, 0)], matrix[ind(2, 1)], matrix[ind(2, 2)]); - - line_0.Normalize(); - line_1.Normalize(); - line_2.Normalize(); - - // The camera position is at (0,0,0) in the camera CS so it is the - // intersection of the 3 planes. It can be seen as the kernel - // of the 3x4 projection matrix. We calculate it through 4 dimensional - // vectorial product. We go directly into 3D that is to say we directly - // divide the first 3 coordinates by the 4th one. - - // We derive the 4 dimensional vectorial product formula from the - // computation of a 4x4 determinant that is developped according to - // its 4th column. This implies some 3x3 determinants. - const Vec cam_pos = - Vec(det(matrix[ind(0, 1)], matrix[ind(0, 2)], matrix[ind(0, 3)], - matrix[ind(1, 1)], matrix[ind(1, 2)], matrix[ind(1, 3)], - matrix[ind(2, 1)], matrix[ind(2, 2)], matrix[ind(2, 3)]), - - -det(matrix[ind(0, 0)], matrix[ind(0, 2)], matrix[ind(0, 3)], - matrix[ind(1, 0)], matrix[ind(1, 2)], matrix[ind(1, 3)], - matrix[ind(2, 0)], matrix[ind(2, 2)], matrix[ind(2, 3)]), - - det(matrix[ind(0, 0)], matrix[ind(0, 1)], matrix[ind(0, 3)], - matrix[ind(1, 0)], matrix[ind(1, 1)], matrix[ind(1, 3)], - matrix[ind(2, 0)], matrix[ind(2, 1)], matrix[ind(2, 3)])) / - - (-det(matrix[ind(0, 0)], matrix[ind(0, 1)], matrix[ind(0, 2)], - matrix[ind(1, 0)], matrix[ind(1, 1)], matrix[ind(1, 2)], - matrix[ind(2, 0)], matrix[ind(2, 1)], matrix[ind(2, 2)])); - - // We compute the rotation matrix column by column. - - // GL Z axis is front facing. - Vec column_2 = -line_2; - - // X-axis is almost like line_0 but should be orthogonal to the Z axis. - Vec column_0 = acamcad::MathUtils::cross(acamcad::MathUtils::cross(column_2 , line_0) , column_2); - column_0.Normalize(); - - // Y-axis is almost like line_1 but should be orthogonal to the Z axis. - // Moreover line_1 is downward oriented as the screen CS. - Vec column_1 = -acamcad::MathUtils::cross(acamcad::MathUtils::cross(column_2, line_1), column_2); - column_1.Normalize(); - - qreal rot[3][3]; - rot[0][0] = column_0[0]; - rot[1][0] = column_0[1]; - rot[2][0] = column_0[2]; - - rot[0][1] = column_1[0]; - rot[1][1] = column_1[1]; - rot[2][1] = column_1[2]; - - rot[0][2] = column_2[0]; - rot[1][2] = column_2[1]; - rot[2][2] = column_2[2]; - - // We compute the field of view - - // line_1^column_0 -> vector of intersection line between - // y_screen=0 and x_camera=0 plane. - // column_2*(...) -> cos of the angle between Z vector et y_screen=0 plane - // * 2 -> field of view = 2 * half angle - - // We need some intermediate values. - Vec dummy = acamcad::MathUtils::cross(line_1, column_0); - dummy.Normalize(); - qreal fov = acos(column_2 | dummy) * 2.0; - - // We set the camera. - Quaternion q; - q.setFromRotationMatrix(rot); - setOrientation(q); - setPosition(cam_pos); - setFieldOfView(fov); + // The 3 lines of the matrix are the normals to the planes x=0, y=0, z=0 + // in the camera CS. As we normalize them, we do not need the 4th coordinate. + Vec line_0(matrix[ind(0, 0)], matrix[ind(0, 1)], matrix[ind(0, 2)]); + Vec line_1(matrix[ind(1, 0)], matrix[ind(1, 1)], matrix[ind(1, 2)]); + Vec line_2(matrix[ind(2, 0)], matrix[ind(2, 1)], matrix[ind(2, 2)]); + + line_0.Normalize(); + line_1.Normalize(); + line_2.Normalize(); + + // The camera position is at (0,0,0) in the camera CS so it is the + // intersection of the 3 planes. It can be seen as the kernel + // of the 3x4 projection matrix. We calculate it through 4 dimensional + // vectorial product. We go directly into 3D that is to say we directly + // divide the first 3 coordinates by the 4th one. + + // We derive the 4 dimensional vectorial product formula from the + // computation of a 4x4 determinant that is developped according to + // its 4th column. This implies some 3x3 determinants. + const Vec cam_pos = + Vec(det(matrix[ind(0, 1)], matrix[ind(0, 2)], matrix[ind(0, 3)], + matrix[ind(1, 1)], matrix[ind(1, 2)], matrix[ind(1, 3)], + matrix[ind(2, 1)], matrix[ind(2, 2)], matrix[ind(2, 3)]), + + -det(matrix[ind(0, 0)], matrix[ind(0, 2)], matrix[ind(0, 3)], + matrix[ind(1, 0)], matrix[ind(1, 2)], matrix[ind(1, 3)], + matrix[ind(2, 0)], matrix[ind(2, 2)], matrix[ind(2, 3)]), + + det(matrix[ind(0, 0)], matrix[ind(0, 1)], matrix[ind(0, 3)], + matrix[ind(1, 0)], matrix[ind(1, 1)], matrix[ind(1, 3)], + matrix[ind(2, 0)], matrix[ind(2, 1)], matrix[ind(2, 3)])) / + + (-det(matrix[ind(0, 0)], matrix[ind(0, 1)], matrix[ind(0, 2)], + matrix[ind(1, 0)], matrix[ind(1, 1)], matrix[ind(1, 2)], + matrix[ind(2, 0)], matrix[ind(2, 1)], matrix[ind(2, 2)])); + + // We compute the rotation matrix column by column. + + // GL Z axis is front facing. + Vec column_2 = -line_2; + + // X-axis is almost like line_0 but should be orthogonal to the Z axis. + Vec column_0 = acamcad::MathUtils::cross(acamcad::MathUtils::cross(column_2, line_0), column_2); + column_0.Normalize(); + + // Y-axis is almost like line_1 but should be orthogonal to the Z axis. + // Moreover line_1 is downward oriented as the screen CS. + Vec column_1 = -acamcad::MathUtils::cross(acamcad::MathUtils::cross(column_2, line_1), column_2); + column_1.Normalize(); + + qreal rot[3][3]; + rot[0][0] = column_0[0]; + rot[1][0] = column_0[1]; + rot[2][0] = column_0[2]; + + rot[0][1] = column_1[0]; + rot[1][1] = column_1[1]; + rot[2][1] = column_1[2]; + + rot[0][2] = column_2[0]; + rot[1][2] = column_2[1]; + rot[2][2] = column_2[2]; + + // We compute the field of view + + // line_1^column_0 -> vector of intersection line between + // y_screen=0 and x_camera=0 plane. + // column_2*(...) -> cos of the angle between Z vector et y_screen=0 plane + // * 2 -> field of view = 2 * half angle + + // We need some intermediate values. + Vec dummy = acamcad::MathUtils::cross(line_1, column_0); + dummy.Normalize(); + qreal fov = acos(column_2 | dummy) * 2.0; + + // We set the camera. + Quaternion q; + q.setFromRotationMatrix(rot); + setOrientation(q); + setPosition(cam_pos); + setFieldOfView(fov); } ///////////////////////// Camera to world transform /////////////////////// @@ -824,25 +825,25 @@ void Camera::setFromProjectionMatrix(const qreal matrix[12]) { /*! Same as cameraCoordinatesOf(), but with \c qreal[3] parameters (\p src and * \p res may be identical pointers). */ void Camera::getCameraCoordinatesOf(const qreal src[3], qreal res[3]) const { - Vec r = cameraCoordinatesOf(Vec(src[0], src[1], src[2])); - for (int i = 0; i < 3; ++i) - res[i] = r[i]; + Vec r = cameraCoordinatesOf(Vec(src[0], src[1], src[2])); + for (int i = 0; i < 3; ++i) + res[i] = r[i]; } /*! Same as worldCoordinatesOf(), but with \c qreal[3] parameters (\p src and \p * res may be identical pointers). */ void Camera::getWorldCoordinatesOf(const qreal src[3], qreal res[3]) const { - Vec r = worldCoordinatesOf(Vec(src[0], src[1], src[2])); - for (int i = 0; i < 3; ++i) - res[i] = r[i]; + Vec r = worldCoordinatesOf(Vec(src[0], src[1], src[2])); + for (int i = 0; i < 3; ++i) + res[i] = r[i]; } /*! Fills \p viewport with the Camera OpenGL viewport. */ void Camera::getViewport(GLint viewport[4]) const { - viewport[0] = 0; - viewport[1] = screenHeight(); - viewport[2] = screenWidth(); - viewport[3] = -screenHeight(); + viewport[0] = 0; + viewport[1] = screenHeight(); + viewport[2] = screenWidth(); + viewport[3] = -screenHeight(); } /*! Returns the screen projected coordinates of a point \p src defined in the \p @@ -851,52 +852,52 @@ void Camera::getViewport(GLint viewport[4]) const { When \p frame in \c nullptr (default), \p src is expressed in the world coordinate system.*/ Vec Camera::projectedCoordinatesOf(const Vec& src, const Frame* frame) const { - GLdouble x, y, z; - static GLint viewport[4]; - getViewport(viewport); - - if (frame) { - const Vec tmp = frame->inverseCoordinatesOf(src); - gluProject(tmp.X(), tmp.Y(), tmp.Z(), modelViewMatrix_, projectionMatrix_, - viewport, &x, &y, &z); - } - else - gluProject(src.X(), src.Y(), src.Z(), modelViewMatrix_, projectionMatrix_, - viewport, &x, &y, &z); - - return Vec(x, y, z); + GLdouble x, y, z; + static GLint viewport[4]; + getViewport(viewport); + + if (frame) { + const Vec tmp = frame->inverseCoordinatesOf(src); + gluProject(tmp.X(), tmp.Y(), tmp.Z(), modelViewMatrix_, projectionMatrix_, + viewport, &x, &y, &z); + } + else + gluProject(src.X(), src.Y(), src.Z(), modelViewMatrix_, projectionMatrix_, + viewport, &x, &y, &z); + + return Vec(x, y, z); } /*! Returns the world unprojected coordinates of a point \p src defined in the screen coordinate system.*/ Vec Camera::unprojectedCoordinatesOf(const Vec& src, const Frame* frame) const { - GLdouble x, y, z; - static GLint viewport[4]; - getViewport(viewport); - gluUnProject(src.X(), src.Y(), src.Z(), modelViewMatrix_, projectionMatrix_, - viewport, &x, &y, &z); - if (frame) - return frame->coordinatesOf(Vec(x, y, z)); - else - return Vec(x, y, z); + GLdouble x, y, z; + static GLint viewport[4]; + getViewport(viewport); + gluUnProject(src.X(), src.Y(), src.Z(), modelViewMatrix_, projectionMatrix_, + viewport, &x, &y, &z); + if (frame) + return frame->coordinatesOf(Vec(x, y, z)); + else + return Vec(x, y, z); } /*! Same as projectedCoordinatesOf(), but with \c qreal parameters (\p src and * \p res can be identical pointers). */ void Camera::getProjectedCoordinatesOf(const qreal src[3], qreal res[3], - const Frame* frame) const { - Vec r = projectedCoordinatesOf(Vec(src[0], src[1], src[2]), frame); - for (int i = 0; i < 3; ++i) - res[i] = r[i]; + const Frame* frame) const { + Vec r = projectedCoordinatesOf(Vec(src[0], src[1], src[2]), frame); + for (int i = 0; i < 3; ++i) + res[i] = r[i]; } /*! Same as unprojectedCoordinatesOf(), but with \c qreal parameters (\p src and * \p res can be identical pointers). */ void Camera::getUnprojectedCoordinatesOf(const qreal src[3], qreal res[3], - const Frame* frame) const { - Vec r = unprojectedCoordinatesOf(Vec(src[0], src[1], src[2]), frame); - for (int i = 0; i < 3; ++i) - res[i] = r[i]; + const Frame* frame) const { + Vec r = unprojectedCoordinatesOf(Vec(src[0], src[1], src[2]), frame); + for (int i = 0; i < 3; ++i) + res[i] = r[i]; } @@ -905,215 +906,215 @@ void Camera::getUnprojectedCoordinatesOf(const qreal src[3], qreal res[3], /*! Gives the coefficients of a 3D half-line passing through the Camera eye and pixel (x,y).*/ void Camera::convertClickToLine(const QPoint& pixel, Vec& orig, - Vec& dir) const { - switch (type()) { - case Camera::PERSPECTIVE: - orig = position(); - dir = Vec(((2.0 * pixel.x() / screenWidth()) - 1.0) * - tan(fieldOfView() / 2.0) * aspectRatio(), - ((2.0 * (screenHeight() - pixel.y()) / screenHeight()) - 1.0) * - tan(fieldOfView() / 2.0), - -1.0); - dir = worldCoordinatesOf(dir) - orig; - dir.Normalize(); - break; - - case Camera::ORTHOGRAPHIC: { - GLdouble w, h; - getOrthoWidthHeight(w, h); - orig = Vec((2.0 * pixel.x() / screenWidth() - 1.0) * w, - -(2.0 * pixel.y() / screenHeight() - 1.0) * h, 0.0); - orig = worldCoordinatesOf(orig); - dir = viewDirection(); - break; - } - } + Vec& dir) const { + switch (type()) { + case Camera::PERSPECTIVE: + orig = position(); + dir = Vec(((2.0 * pixel.x() / screenWidth()) - 1.0) * + tan(fieldOfView() / 2.0) * aspectRatio(), + ((2.0 * (screenHeight() - pixel.y()) / screenHeight()) - 1.0) * + tan(fieldOfView() / 2.0), + -1.0); + dir = worldCoordinatesOf(dir) - orig; + dir.Normalize(); + break; + + case Camera::ORTHOGRAPHIC: { + GLdouble w, h; + getOrthoWidthHeight(w, h); + orig = Vec((2.0 * pixel.x() / screenWidth() - 1.0) * w, + -(2.0 * pixel.y() / screenHeight() - 1.0) * h, 0.0); + orig = worldCoordinatesOf(orig); + dir = viewDirection(); + break; + } + } } /*! Draws a representation of the Camera in the 3D world.*/ void Camera::draw(bool drawFarPlane, qreal scale) const { - glPushMatrix(); - glMultMatrixd(frame()->worldMatrix()); - - // 0 is the upper left coordinates of the near corner, 1 for the far one - Vec points[2]; - - points[0].SetZ(scale * zNear()); - points[1].SetZ(scale * zFar()); - - switch (type()) { - case Camera::PERSPECTIVE: { - points[0].SetY(points[0].Z() * tan(fieldOfView() / 2.0)); - points[0].SetX(points[0].Y() * aspectRatio()); - - const qreal ratio = points[1].Z() / points[0].Z(); - - points[1].SetY(ratio * points[0].Y()); - points[1].SetX(ratio * points[0].X()); - break; - } - case Camera::ORTHOGRAPHIC: { - GLdouble hw, hh; - getOrthoWidthHeight(hw, hh); - points[0].SetX(scale * qreal(hw)); - points[0].SetY(scale * qreal(hh)); - - points[1] = points[0]; - break; - } - } - - const int farIndex = drawFarPlane ? 1 : 0; - - // Near and (optionally) far plane(s) - glBegin(GL_QUADS); - for (int i = farIndex; i >= 0; --i) { - glNormal3d(0.0f, 0.0f, (i == 0) ? 1.0f : -1.0f); - glVertex3d(points[i].X(), points[i].Y(), -points[i].Z()); - glVertex3d(-points[i].X(), points[i].Y(), -points[i].Z()); - glVertex3d(-points[i].X(), -points[i].Y(), -points[i].Z()); - glVertex3d(points[i].X(), -points[i].Y(), -points[i].Z()); - } - glEnd(); - - // Up arrow - const qreal arrowHeight = 1.5 * points[0].Y(); - const qreal baseHeight = 1.2 * points[0].Y(); - const qreal arrowHalfWidth = 0.5 * points[0].X(); - const qreal baseHalfWidth = 0.3 * points[0].X(); - - glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); - // Base - glBegin(GL_QUADS); - glVertex3d(-baseHalfWidth, points[0].Y(), -points[0].Z()); - glVertex3d(baseHalfWidth, points[0].Y(), -points[0].Z()); - glVertex3d(baseHalfWidth, baseHeight, -points[0].Z()); - glVertex3d(-baseHalfWidth, baseHeight, -points[0].Z()); - glEnd(); - - // Arrow - glBegin(GL_TRIANGLES); - glVertex3d(0.0, arrowHeight, -points[0].Z()); - glVertex3d(-arrowHalfWidth, baseHeight, -points[0].Z()); - glVertex3d(arrowHalfWidth, baseHeight, -points[0].Z()); - glEnd(); - - // Frustum lines - switch (type()) { - case Camera::PERSPECTIVE: - glBegin(GL_LINES); - glVertex3d(0.0, 0.0, 0.0); - glVertex3d(points[farIndex].X(), points[farIndex].Y(), -points[farIndex].Z()); - glVertex3d(0.0, 0.0, 0.0); - glVertex3d(-points[farIndex].X(), points[farIndex].Y(), -points[farIndex].Z()); - glVertex3d(0.0, 0.0, 0.0); - glVertex3d(-points[farIndex].X(), -points[farIndex].Y(), -points[farIndex].Z()); - glVertex3d(0.0, 0.0, 0.0); - glVertex3d(points[farIndex].X(), -points[farIndex].Y(), -points[farIndex].Z()); - glEnd(); - break; - case Camera::ORTHOGRAPHIC: - if (drawFarPlane) { - glBegin(GL_LINES); - glVertex3d(points[0].X(), points[0].Y(), -points[0].Z()); - glVertex3d(points[1].X(), points[1].Y(), -points[1].Z()); - glVertex3d(-points[0].X(), points[0].Y(), -points[0].Z()); - glVertex3d(-points[1].X(), points[1].Y(), -points[1].Z()); - glVertex3d(-points[0].X(), -points[0].Y(), -points[0].Z()); - glVertex3d(-points[1].X(), -points[1].Y(), -points[1].Z()); - glVertex3d(points[0].X(), -points[0].Y(), -points[0].Z()); - glVertex3d(points[1].X(), -points[1].Y(), -points[1].Z()); - glEnd(); - } - } - - glPopMatrix(); + glPushMatrix(); + glMultMatrixd(frame()->worldMatrix()); + + // 0 is the upper left coordinates of the near corner, 1 for the far one + Vec points[2]; + + points[0].SetZ(scale * zNear()); + points[1].SetZ(scale * zFar()); + + switch (type()) { + case Camera::PERSPECTIVE: { + points[0].SetY(points[0].Z() * tan(fieldOfView() / 2.0)); + points[0].SetX(points[0].Y() * aspectRatio()); + + const qreal ratio = points[1].Z() / points[0].Z(); + + points[1].SetY(ratio * points[0].Y()); + points[1].SetX(ratio * points[0].X()); + break; + } + case Camera::ORTHOGRAPHIC: { + GLdouble hw, hh; + getOrthoWidthHeight(hw, hh); + points[0].SetX(scale * qreal(hw)); + points[0].SetY(scale * qreal(hh)); + + points[1] = points[0]; + break; + } + } + + const int farIndex = drawFarPlane ? 1 : 0; + + // Near and (optionally) far plane(s) + glBegin(GL_QUADS); + for (int i = farIndex; i >= 0; --i) { + glNormal3d(0.0f, 0.0f, (i == 0) ? 1.0f : -1.0f); + glVertex3d(points[i].X(), points[i].Y(), -points[i].Z()); + glVertex3d(-points[i].X(), points[i].Y(), -points[i].Z()); + glVertex3d(-points[i].X(), -points[i].Y(), -points[i].Z()); + glVertex3d(points[i].X(), -points[i].Y(), -points[i].Z()); + } + glEnd(); + + // Up arrow + const qreal arrowHeight = 1.5 * points[0].Y(); + const qreal baseHeight = 1.2 * points[0].Y(); + const qreal arrowHalfWidth = 0.5 * points[0].X(); + const qreal baseHalfWidth = 0.3 * points[0].X(); + + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + // Base + glBegin(GL_QUADS); + glVertex3d(-baseHalfWidth, points[0].Y(), -points[0].Z()); + glVertex3d(baseHalfWidth, points[0].Y(), -points[0].Z()); + glVertex3d(baseHalfWidth, baseHeight, -points[0].Z()); + glVertex3d(-baseHalfWidth, baseHeight, -points[0].Z()); + glEnd(); + + // Arrow + glBegin(GL_TRIANGLES); + glVertex3d(0.0, arrowHeight, -points[0].Z()); + glVertex3d(-arrowHalfWidth, baseHeight, -points[0].Z()); + glVertex3d(arrowHalfWidth, baseHeight, -points[0].Z()); + glEnd(); + + // Frustum lines + switch (type()) { + case Camera::PERSPECTIVE: + glBegin(GL_LINES); + glVertex3d(0.0, 0.0, 0.0); + glVertex3d(points[farIndex].X(), points[farIndex].Y(), -points[farIndex].Z()); + glVertex3d(0.0, 0.0, 0.0); + glVertex3d(-points[farIndex].X(), points[farIndex].Y(), -points[farIndex].Z()); + glVertex3d(0.0, 0.0, 0.0); + glVertex3d(-points[farIndex].X(), -points[farIndex].Y(), -points[farIndex].Z()); + glVertex3d(0.0, 0.0, 0.0); + glVertex3d(points[farIndex].X(), -points[farIndex].Y(), -points[farIndex].Z()); + glEnd(); + break; + case Camera::ORTHOGRAPHIC: + if (drawFarPlane) { + glBegin(GL_LINES); + glVertex3d(points[0].X(), points[0].Y(), -points[0].Z()); + glVertex3d(points[1].X(), points[1].Y(), -points[1].Z()); + glVertex3d(-points[0].X(), points[0].Y(), -points[0].Z()); + glVertex3d(-points[1].X(), points[1].Y(), -points[1].Z()); + glVertex3d(-points[0].X(), -points[0].Y(), -points[0].Z()); + glVertex3d(-points[1].X(), -points[1].Y(), -points[1].Z()); + glVertex3d(points[0].X(), -points[0].Y(), -points[0].Z()); + glVertex3d(points[1].X(), -points[1].Y(), -points[1].Z()); + glEnd(); + } + } + + glPopMatrix(); } /*! Returns the 6 plane equations of the Camera frustum. */ void Camera::getFrustumPlanesCoefficients(GLdouble coef[6][4]) const { - // Computed once and for all - const Vec pos = position(); - const Vec viewDir = viewDirection(); - const Vec up = upVector(); - const Vec right = rightVector(); - const qreal posViewDir = pos | viewDir; - - static Vec normal[6]; - static GLdouble dist[6]; - - switch (type()) { - case Camera::PERSPECTIVE: { - const qreal hhfov = horizontalFieldOfView() / 2.0; - const qreal chhfov = cos(hhfov); - const qreal shhfov = sin(hhfov); - normal[0] = -shhfov * viewDir; - normal[1] = normal[0] + chhfov * right; - normal[0] = normal[0] - chhfov * right; - - normal[2] = -viewDir; - normal[3] = viewDir; - - const qreal hfov = fieldOfView() / 2.0; - const qreal chfov = cos(hfov); - const qreal shfov = sin(hfov); - normal[4] = -shfov * viewDir; - normal[5] = normal[4] - chfov * up; - normal[4] = normal[4] + chfov * up; - - for (int i = 0; i < 2; ++i) - dist[i] = pos | normal[i]; - for (int j = 4; j < 6; ++j) - dist[j] = pos | normal[j]; - - // Natural equations are: - // dist[0,1,4,5] = pos * normal[0,1,4,5]; - // dist[2] = (pos + zNear() * viewDir) * normal[2]; - // dist[3] = (pos + zFar() * viewDir) * normal[3]; - - // 2 times less computations using expanded/merged equations. Dir vectors - // are normalized. - const qreal posRightCosHH = chhfov * pos | right; - dist[0] = -shhfov * posViewDir; - dist[1] = dist[0] + posRightCosHH; - dist[0] = dist[0] - posRightCosHH; - const qreal posUpCosH = chfov * pos | up; - dist[4] = -shfov * posViewDir; - dist[5] = dist[4] - posUpCosH; - dist[4] = dist[4] + posUpCosH; - - break; - } - case Camera::ORTHOGRAPHIC: - normal[0] = -right; - normal[1] = right; - normal[4] = up; - normal[5] = -up; - - GLdouble hw, hh; - getOrthoWidthHeight(hw, hh); - dist[0] = (pos - hw * right) | normal[0]; - dist[1] = (pos + hw * right) | normal[1]; - dist[4] = (pos + hh * up) | normal[4]; - dist[5] = (pos - hh * up) | normal[5]; - break; - } - - // Front and far planes are identical for both camera types. - normal[2] = -viewDir; - normal[3] = viewDir; - dist[2] = -posViewDir - zNear(); - dist[3] = posViewDir + zFar(); - - for (int i = 0; i < 6; ++i) { - coef[i][0] = GLdouble(normal[i].X()); - coef[i][1] = GLdouble(normal[i].Y()); - coef[i][2] = GLdouble(normal[i].Z()); - coef[i][3] = dist[i]; - } + // Computed once and for all + const Vec pos = position(); + const Vec viewDir = viewDirection(); + const Vec up = upVector(); + const Vec right = rightVector(); + const qreal posViewDir = pos | viewDir; + + static Vec normal[6]; + static GLdouble dist[6]; + + switch (type()) { + case Camera::PERSPECTIVE: { + const qreal hhfov = horizontalFieldOfView() / 2.0; + const qreal chhfov = cos(hhfov); + const qreal shhfov = sin(hhfov); + normal[0] = -shhfov * viewDir; + normal[1] = normal[0] + chhfov * right; + normal[0] = normal[0] - chhfov * right; + + normal[2] = -viewDir; + normal[3] = viewDir; + + const qreal hfov = fieldOfView() / 2.0; + const qreal chfov = cos(hfov); + const qreal shfov = sin(hfov); + normal[4] = -shfov * viewDir; + normal[5] = normal[4] - chfov * up; + normal[4] = normal[4] + chfov * up; + + for (int i = 0; i < 2; ++i) + dist[i] = pos | normal[i]; + for (int j = 4; j < 6; ++j) + dist[j] = pos | normal[j]; + + // Natural equations are: + // dist[0,1,4,5] = pos * normal[0,1,4,5]; + // dist[2] = (pos + zNear() * viewDir) * normal[2]; + // dist[3] = (pos + zFar() * viewDir) * normal[3]; + + // 2 times less computations using expanded/merged equations. Dir vectors + // are normalized. + const qreal posRightCosHH = chhfov * pos | right; + dist[0] = -shhfov * posViewDir; + dist[1] = dist[0] + posRightCosHH; + dist[0] = dist[0] - posRightCosHH; + const qreal posUpCosH = chfov * pos | up; + dist[4] = -shfov * posViewDir; + dist[5] = dist[4] - posUpCosH; + dist[4] = dist[4] + posUpCosH; + + break; + } + case Camera::ORTHOGRAPHIC: + normal[0] = -right; + normal[1] = right; + normal[4] = up; + normal[5] = -up; + + GLdouble hw, hh; + getOrthoWidthHeight(hw, hh); + dist[0] = (pos - hw * right) | normal[0]; + dist[1] = (pos + hw * right) | normal[1]; + dist[4] = (pos + hh * up) | normal[4]; + dist[5] = (pos - hh * up) | normal[5]; + break; + } + + // Front and far planes are identical for both camera types. + normal[2] = -viewDir; + normal[3] = viewDir; + dist[2] = -posViewDir - zNear(); + dist[3] = posViewDir + zFar(); + + for (int i = 0; i < 6; ++i) { + coef[i][0] = GLdouble(normal[i].X()); + coef[i][1] = GLdouble(normal[i].Y()); + coef[i][2] = GLdouble(normal[i].Z()); + coef[i][3] = dist[i]; + } } void Camera::onFrameModified() { - projectionMatrixIsUpToDate_ = false; - modelViewMatrixIsUpToDate_ = false; + projectionMatrixIsUpToDate_ = false; + modelViewMatrixIsUpToDate_ = false; } diff --git a/Src/Windows/QGLViewer/qglviewer.cpp b/Src/Windows/QGLViewer/qglviewer.cpp index fe531a3..7c7a7e3 100644 --- a/Src/Windows/QGLViewer/qglviewer.cpp +++ b/Src/Windows/QGLViewer/qglviewer.cpp @@ -32,66 +32,68 @@ #include #include +#include + using namespace std; using namespace qglviewer; void QGLViewer::defaultConstructor() { - setFocusPolicy(Qt::StrongFocus); + setFocusPolicy(Qt::StrongFocus); - camera_ = new Camera(); - setCamera(camera()); + camera_ = new Camera(); + setCamera(camera()); - setDefaultShortcuts(); - setDefaultMouseBindings(); + setDefaultShortcuts(); + setDefaultMouseBindings(); - setSceneRadius(3.0); - showEntireScene(); + setSceneRadius(3.0); + showEntireScene(); - // #CONNECTION# default values in initFromDOMElement() + // #CONNECTION# default values in initFromDOMElement() - bufferTextureId_ = 0; - bufferTextureMaxU_ = 0.0; - bufferTextureMaxV_ = 0.0; - bufferTextureWidth_ = 0; - bufferTextureHeight_ = 0; - previousBufferTextureFormat_ = 0; - previousBufferTextureInternalFormat_ = 0; - currentlyPressedKey_ = Qt::Key(0); + bufferTextureId_ = 0; + bufferTextureMaxU_ = 0.0; + bufferTextureMaxV_ = 0.0; + bufferTextureWidth_ = 0; + bufferTextureHeight_ = 0; + previousBufferTextureFormat_ = 0; + previousBufferTextureInternalFormat_ = 0; + currentlyPressedKey_ = Qt::Key(0); - helpWidget_ = nullptr; + helpWidget_ = nullptr; - setAttribute(Qt::WA_NoSystemBackground); + setAttribute(Qt::WA_NoSystemBackground); } /*! Constructor. All viewer parameters are set to their default values*/ QGLViewer::QGLViewer(QWidget* parent, Qt::WindowFlags flags) - : QOpenGLWidget(parent, flags) { - defaultConstructor(); + : QOpenGLWidget(parent, flags) { + defaultConstructor(); } #ifndef DOXYGEN -/*! Same as QGLViewer(), but a \c QGLContext can be provided so that viewers share GL contexts, +/*! Same as QGLViewer(), but a \c QGLContext can be provided so that viewers share GL contexts, even with \c QGLContext sub-classes (use \p shareWidget otherwise). */ QGLViewer::QGLViewer(QGLContext* context, QWidget* parent, - const QGLWidget* shareWidget, Qt::WindowFlags flags) - : QOpenGLWidget(parent, flags) { - Q_UNUSED(context) - Q_UNUSED(shareWidget) - qWarning("The constructor with a QGLContext is deprecated, use the regular " - "contructor instead."); - defaultConstructor(); + const QGLWidget* shareWidget, Qt::WindowFlags flags) + : QOpenGLWidget(parent, flags) { + Q_UNUSED(context) + Q_UNUSED(shareWidget) + qWarning("The constructor with a QGLContext is deprecated, use the regular " + "contructor instead."); + defaultConstructor(); } /*! Same as QGLViewer(), but a specific \c QGLFormat can be provided.*/ QGLViewer::QGLViewer(const QGLFormat& format, QWidget* parent, - const QGLWidget* shareWidget, Qt::WindowFlags flags) - : QOpenGLWidget(parent, flags) { - Q_UNUSED(format) - Q_UNUSED(shareWidget) - qWarning("The constructor with a QGLFormat is deprecated, use the regular " - "contructor instead."); - defaultConstructor(); + const QGLWidget* shareWidget, Qt::WindowFlags flags) + : QOpenGLWidget(parent, flags) { + Q_UNUSED(format) + Q_UNUSED(shareWidget) + qWarning("The constructor with a QGLFormat is deprecated, use the regular " + "contructor instead."); + defaultConstructor(); } #endif // DOXYGEN @@ -101,17 +103,17 @@ The viewer is replaced by \c nullptr in the QGLViewerPool() (in order to preserv other viewer's indexes) and allocated memory is released. The camera() is deleted and should be copied before if it is shared by an other viewer. */ QGLViewer::~QGLViewer() { - // See closeEvent comment. Destructor is called (and not closeEvent) only when - // the widget is embedded. Hence we saveToFile here. It is however a bad idea - // if virtual domElement() has been overloaded ! if (parent()) - // saveStateToFileForAllViewers(); - - delete camera(); - if (helpWidget()) { - // Needed for Qt 4 which has no main widget. - helpWidget()->close(); - delete helpWidget_; - } + // See closeEvent comment. Destructor is called (and not closeEvent) only when + // the widget is embedded. Hence we saveToFile here. It is however a bad idea + // if virtual domElement() has been overloaded ! if (parent()) + // saveStateToFileForAllViewers(); + + delete camera(); + if (helpWidget()) { + // Needed for Qt 4 which has no main widget. + helpWidget()->close(); + delete helpWidget_; + } } /*! Initializes the QGLViewer OpenGL context and then calls user-defined init(). @@ -121,8 +123,8 @@ Overload init() instead of this method to modify viewer specific OpenGL state or to create display lists. To make beginners' life easier and to simplify the examples, this method -slightly modifies the standard OpenGL state: -\code +slightly modifies the standard OpenGL state: +\code glEnable(GL_LIGHT0); glEnable(GL_LIGHTING); glEnable(GL_DEPTH_TEST); @@ -132,174 +134,182 @@ glEnable(GL_COLOR_MATERIAL); If you port an existing application to QGLViewer and your display changes, you probably want to disable these flags in init() to get back to a standard OpenGL state. */ void QGLViewer::initializeGL() { - glEnable(GL_LIGHT0); - glEnable(GL_LIGHTING); - glEnable(GL_DEPTH_TEST); - glEnable(GL_COLOR_MATERIAL); - - // Default colors - setForegroundColor(QColor(25, 25, 25)); - setBackgroundColor(QColor(235, 235, 235)); - - // Clear the buffer where we're going to draw - if (format().stereo()) { - glDrawBuffer(GL_BACK_RIGHT); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - glDrawBuffer(GL_BACK_LEFT); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - } - else - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - // Calls user defined method. Default emits a signal. - init(); + glEnable(GL_LIGHT0); + glEnable(GL_LIGHTING); + glEnable(GL_DEPTH_TEST); + glEnable(GL_COLOR_MATERIAL); + + // Default colors + setForegroundColor(QColor(25, 25, 25)); + setBackgroundColor(QColor(235, 235, 235)); + + // Clear the buffer where we're going to draw + if (format().stereo()) { + glDrawBuffer(GL_BACK_RIGHT); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glDrawBuffer(GL_BACK_LEFT); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + } + else + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + // Calls user defined method. Default emits a signal. + init(); + + + //init glut + int x = 1; + char* p = "exe"; + + glutInit(&x, &p); } /*! Main paint method, inherited from \c QOpenGLWidget. */ -void QGLViewer::paintGL() +void QGLViewer::paintGL() { - // Clears screen, set model view matrix... - preDraw(); - // Used defined method. Default calls draw() - if (camera()->frame()->isManipulated()) - fastDraw(); - else - draw(); - // Add visual hints: axis, camera, grid... - postDraw(); - - Q_EMIT drawFinished(true); + // Clears screen, set model view matrix... + preDraw(); + // Used defined method. Default calls draw() + if (camera()->frame()->isManipulated()) + fastDraw(); + else + draw(); + // Add visual hints: axis, camera, grid... + postDraw(); + + + //Q_EMIT drawFinished(true); } /*! Sets OpenGL state before draw(). Emits the drawNeeded() signal*/ void QGLViewer::preDraw() { - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - // GL_PROJECTION matrix - camera()->loadProjectionMatrix(); - // GL_MODELVIEW matrix - camera()->loadModelViewMatrix(); + // GL_PROJECTION matrix + camera()->loadProjectionMatrix(); + // GL_MODELVIEW matrix + camera()->loadModelViewMatrix(); - Q_EMIT drawNeeded(); + ///Q_EMIT drawNeeded(); } /*! Called after draw() to draw viewer visual hints. */ void QGLViewer::postDraw() { - // Reset model view matrix to world coordinates origin - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - camera()->loadModelViewMatrix(); - // TODO restore model loadProjectionMatrixStereo - - // Save OpenGL state - glPushAttrib(GL_ALL_ATTRIB_BITS); - - // Set neutral GL state - glDisable(GL_TEXTURE_1D); - glDisable(GL_TEXTURE_2D); + // Reset model view matrix to world coordinates origin + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + camera()->loadModelViewMatrix(); + // TODO restore model loadProjectionMatrixStereo + + // Save OpenGL state + glPushAttrib(GL_ALL_ATTRIB_BITS); + + // Set neutral GL state + glDisable(GL_TEXTURE_1D); + glDisable(GL_TEXTURE_2D); #ifdef GL_TEXTURE_3D // OpenGL 1.2 Only... - glDisable(GL_TEXTURE_3D); + glDisable(GL_TEXTURE_3D); #endif - glDisable(GL_TEXTURE_GEN_Q); - glDisable(GL_TEXTURE_GEN_R); - glDisable(GL_TEXTURE_GEN_S); - glDisable(GL_TEXTURE_GEN_T); + glDisable(GL_TEXTURE_GEN_Q); + glDisable(GL_TEXTURE_GEN_R); + glDisable(GL_TEXTURE_GEN_S); + glDisable(GL_TEXTURE_GEN_T); #ifdef GL_RESCALE_NORMAL // OpenGL 1.2 Only... - glEnable(GL_RESCALE_NORMAL); + glEnable(GL_RESCALE_NORMAL); #endif - glDisable(GL_COLOR_MATERIAL); - glColor4f(foregroundColor().redF(), foregroundColor().greenF(), - foregroundColor().blueF(), foregroundColor().alphaF()); - - //if (gridIsDrawn()) { - // glLineWidth(1.0); - // drawGrid(camera()->sceneRadius()); - //} - - // Restore foregroundColor - float color[4]; - color[0] = foregroundColor().red() / 255.0f; - color[1] = foregroundColor().green() / 255.0f; - color[2] = foregroundColor().blue() / 255.0f; - color[3] = 1.0f; - glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color); - glDisable(GL_LIGHTING); - glDisable(GL_DEPTH_TEST); - - // Restore GL state - glPopAttrib(); - glPopMatrix(); + glDisable(GL_COLOR_MATERIAL); + glColor4f(foregroundColor().redF(), foregroundColor().greenF(), + foregroundColor().blueF(), foregroundColor().alphaF()); + + //if (gridIsDrawn()) { + // glLineWidth(1.0); + // drawGrid(camera()->sceneRadius()); + //} + + // Restore foregroundColor + float color[4]; + color[0] = foregroundColor().red() / 255.0f; + color[1] = foregroundColor().green() / 255.0f; + color[2] = foregroundColor().blue() / 255.0f; + color[3] = 1.0f; + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color); + glDisable(GL_LIGHTING); + glDisable(GL_DEPTH_TEST); + + // Restore GL state + glPopAttrib(); + glPopMatrix(); } -/*! Draws a simplified version of the scene to guarantee interactive camera displacements. - see printGL */ +/*! Draws a simplified version of the scene to guarantee interactive camera displacements. + see printGL */ void QGLViewer::fastDraw() { draw(); } // Key bindings. 0 means not defined void QGLViewer::setDefaultShortcuts() { - // D e f a u l t a c c e l e r a t o r s - setShortcut(HELP, Qt::Key_H); - setShortcut(MOVE_CAMERA_LEFT, Qt::Key_Left); - setShortcut(MOVE_CAMERA_RIGHT, Qt::Key_Right); - setShortcut(MOVE_CAMERA_UP, Qt::Key_Up); - setShortcut(MOVE_CAMERA_DOWN, Qt::Key_Down); - - keyboardActionDescription_[HELP] = - tr("Opens this help window", "HELP action description"); - keyboardActionDescription_[MOVE_CAMERA_LEFT] = - tr("Moves camera left", "MOVE_CAMERA_LEFT action description"); - keyboardActionDescription_[MOVE_CAMERA_RIGHT] = - tr("Moves camera right", "MOVE_CAMERA_RIGHT action description"); - keyboardActionDescription_[MOVE_CAMERA_UP] = - tr("Moves camera up", "MOVE_CAMERA_UP action description"); - keyboardActionDescription_[MOVE_CAMERA_DOWN] = - tr("Moves camera down", "MOVE_CAMERA_DOWN action description"); + // D e f a u l t a c c e l e r a t o r s + setShortcut(HELP, Qt::Key_H); + setShortcut(MOVE_CAMERA_LEFT, Qt::Key_Left); + setShortcut(MOVE_CAMERA_RIGHT, Qt::Key_Right); + setShortcut(MOVE_CAMERA_UP, Qt::Key_Up); + setShortcut(MOVE_CAMERA_DOWN, Qt::Key_Down); + + keyboardActionDescription_[HELP] = + tr("Opens this help window", "HELP action description"); + keyboardActionDescription_[MOVE_CAMERA_LEFT] = + tr("Moves camera left", "MOVE_CAMERA_LEFT action description"); + keyboardActionDescription_[MOVE_CAMERA_RIGHT] = + tr("Moves camera right", "MOVE_CAMERA_RIGHT action description"); + keyboardActionDescription_[MOVE_CAMERA_UP] = + tr("Moves camera up", "MOVE_CAMERA_UP action description"); + keyboardActionDescription_[MOVE_CAMERA_DOWN] = + tr("Moves camera down", "MOVE_CAMERA_DOWN action description"); } // M o u s e b e h a v i o r void QGLViewer::setDefaultMouseBindings() { - //const Qt::KeyboardModifiers cameraKeyboardModifiers = Qt::NoModifier; - //const Qt::KeyboardModifiers frameKeyboardModifiers = Qt::ControlModifier; + //const Qt::KeyboardModifiers cameraKeyboardModifiers = Qt::NoModifier; + //const Qt::KeyboardModifiers frameKeyboardModifiers = Qt::ControlModifier; - //camera morse modele - setMouseBinding(Qt::NoModifier, Qt::RightButton, CAMERA, ROTATE); - //setMouseBinding(Qt::AltModifier, Qt::MidButton, CAMERA, ZOOM); - setMouseBinding(Qt::ShiftModifier, Qt::RightButton, CAMERA, TRANSLATE); + //camera morse modele + setMouseBinding(Qt::NoModifier, Qt::RightButton, CAMERA, ROTATE); + //setMouseBinding(Qt::AltModifier, Qt::MidButton, CAMERA, ZOOM); + setMouseBinding(Qt::ShiftModifier, Qt::RightButton, CAMERA, TRANSLATE); - setMouseBinding(Qt::Key_R, Qt::NoModifier, Qt::RightButton, CAMERA, SCREEN_ROTATE); + setMouseBinding(Qt::Key_R, Qt::NoModifier, Qt::RightButton, CAMERA, SCREEN_ROTATE); - setWheelBinding(Qt::NoModifier, CAMERA, ZOOM); + setWheelBinding(Qt::NoModifier, CAMERA, ZOOM); - // scale - setMouseBinding(Qt::AltModifier, Qt::LeftButton, SHOW_ENTIRE_SCENE, true); + // scale + setMouseBinding(Qt::AltModifier, Qt::LeftButton, SHOW_ENTIRE_SCENE, true); - // D o u b l e c l i c k - setMouseBinding(Qt::NoModifier, Qt::LeftButton, ALIGN_CAMERA, true); - setMouseBinding(Qt::NoModifier, Qt::RightButton, CENTER_SCENE, true); + // D o u b l e c l i c k + setMouseBinding(Qt::NoModifier, Qt::LeftButton, ALIGN_CAMERA, true); + setMouseBinding(Qt::NoModifier, Qt::RightButton, CENTER_SCENE, true); } /*! Associates a new qglviewer::Camera to the viewer. */ void QGLViewer::setCamera(Camera* const camera) { - if (!camera) - return; + if (!camera) + return; - camera->setSceneRadius(sceneRadius()); - camera->setSceneCenter(sceneCenter()); - camera->setScreenWidthAndHeight(width(), height()); + camera->setSceneRadius(sceneRadius()); + camera->setSceneCenter(sceneCenter()); + camera->setScreenWidthAndHeight(width(), height()); - // Disconnect current camera from this viewer. - disconnect(this->camera()->frame(), SIGNAL(manipulated()), this, SLOT(update())); - disconnect(this->camera()->frame(), SIGNAL(spun()), this, SLOT(update())); + // Disconnect current camera from this viewer. + disconnect(this->camera()->frame(), SIGNAL(manipulated()), this, SLOT(update())); + disconnect(this->camera()->frame(), SIGNAL(spun()), this, SLOT(update())); - // Connect camera frame to this viewer. - connect(camera->frame(), SIGNAL(manipulated()), SLOT(update())); - connect(camera->frame(), SIGNAL(spun()), SLOT(update())); + // Connect camera frame to this viewer. + connect(camera->frame(), SIGNAL(manipulated()), SLOT(update())); + connect(camera->frame(), SIGNAL(spun()), SLOT(update())); - camera_ = camera; + camera_ = camera; } /*! Draws a representation of \p light. @@ -320,53 +330,53 @@ illustration. \attention You need to enable \c GL_COLOR_MATERIAL before calling this method. \c glColor is set to the light diffuse color. */ void QGLViewer::drawLight(GLenum light, qreal scale) const { - static GLUquadric* quadric = gluNewQuadric(); - - const qreal length = sceneRadius() / 5.0 * scale; - - GLboolean lightIsOn; - glGetBooleanv(light, &lightIsOn); - - if (lightIsOn) { - // All light values are given in eye coordinates - glPushMatrix(); - glLoadIdentity(); - - float color[4]; - glGetLightfv(light, GL_DIFFUSE, color); - glColor4fv(color); - - float pos[4]; - glGetLightfv(light, GL_POSITION, pos); - - if (static_cast(pos[3]) != 0.0) { - glTranslatef(pos[0] / pos[3], pos[1] / pos[3], pos[2] / pos[3]); - - GLfloat cutOff; - glGetLightfv(light, GL_SPOT_CUTOFF, &cutOff); - if (static_cast(cutOff) != 180.0) { - GLfloat dir[4]; - glGetLightfv(light, GL_SPOT_DIRECTION, dir); - glMultMatrixd(Quaternion(Vec(0.0, 0.0, 1.0), Vec(dir[0], dir[1], dir[2])).matrix()); - gluCylinder(quadric, 0.0, 0.7 * length * sin(static_cast(cutOff) * M_PI / 180.0), - 0.7 * length * cos(static_cast(cutOff) * M_PI / 180.0), 12, 1); - } - else - gluSphere(quadric, 0.2 * length, 10, 10); - } - else { - // Directional light. - Vec dir(static_cast(pos[0]), static_cast(pos[1]), static_cast(pos[2])); - dir.Normalize(); - Frame fr = - Frame(camera()->cameraCoordinatesOf( - 4.0 * length * camera()->frame()->inverseTransformOf(dir)), - Quaternion(Vec(0.0, 0.0, -1.0), dir)); - glMultMatrixd(fr.matrix()); - } - - glPopMatrix(); - } + static GLUquadric* quadric = gluNewQuadric(); + + const qreal length = sceneRadius() / 5.0 * scale; + + GLboolean lightIsOn; + glGetBooleanv(light, &lightIsOn); + + if (lightIsOn) { + // All light values are given in eye coordinates + glPushMatrix(); + glLoadIdentity(); + + float color[4]; + glGetLightfv(light, GL_DIFFUSE, color); + glColor4fv(color); + + float pos[4]; + glGetLightfv(light, GL_POSITION, pos); + + if (static_cast(pos[3]) != 0.0) { + glTranslatef(pos[0] / pos[3], pos[1] / pos[3], pos[2] / pos[3]); + + GLfloat cutOff; + glGetLightfv(light, GL_SPOT_CUTOFF, &cutOff); + if (static_cast(cutOff) != 180.0) { + GLfloat dir[4]; + glGetLightfv(light, GL_SPOT_DIRECTION, dir); + glMultMatrixd(Quaternion(Vec(0.0, 0.0, 1.0), Vec(dir[0], dir[1], dir[2])).matrix()); + gluCylinder(quadric, 0.0, 0.7 * length * sin(static_cast(cutOff) * M_PI / 180.0), + 0.7 * length * cos(static_cast(cutOff) * M_PI / 180.0), 12, 1); + } + else + gluSphere(quadric, 0.2 * length, 10, 10); + } + else { + // Directional light. + Vec dir(static_cast(pos[0]), static_cast(pos[1]), static_cast(pos[2])); + dir.Normalize(); + Frame fr = + Frame(camera()->cameraCoordinatesOf( + 4.0 * length * camera()->frame()->inverseTransformOf(dir)), + Quaternion(Vec(0.0, 0.0, -1.0), dir)); + glMultMatrixd(fr.matrix()); + } + + glPopMatrix(); + } } @@ -376,259 +386,259 @@ screen coordinates. 开始直接在2D绘制,具体参见qglViewer */ void QGLViewer::startScreenCoordinatesSystem(bool upward) const { - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - glLoadIdentity(); - if (upward) - glOrtho(0, width(), 0, height(), 0.0, -1.0); - else - glOrtho(0, width(), height(), 0, 0.0, -1.0); - - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - glLoadIdentity(); + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + if (upward) + glOrtho(0, width(), 0, height(), 0.0, -1.0); + else + glOrtho(0, width(), height(), 0, 0.0, -1.0); + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); } /*! Stops the pixel coordinate drawing block started by startScreenCoordinatesSystem(). */ void QGLViewer::stopScreenCoordinatesSystem() const { - glMatrixMode(GL_PROJECTION); - glPopMatrix(); + glMatrixMode(GL_PROJECTION); + glPopMatrix(); - glMatrixMode(GL_MODELVIEW); - glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); } static QString mouseButtonsString(Qt::MouseButtons b) { - QString result(""); - bool addAmpersand = false; - if (b & Qt::LeftButton) { - result += QGLViewer::tr("Left", "left mouse button"); - addAmpersand = true; - } - if (b & Qt::MiddleButton) { - if (addAmpersand) - result += " & "; - result += QGLViewer::tr("Middle", "middle mouse button"); - addAmpersand = true; - } - if (b & Qt::RightButton) { - if (addAmpersand) - result += " & "; - result += QGLViewer::tr("Right", "right mouse button"); - } - return result; + QString result(""); + bool addAmpersand = false; + if (b & Qt::LeftButton) { + result += QGLViewer::tr("Left", "left mouse button"); + addAmpersand = true; + } + if (b & Qt::MiddleButton) { + if (addAmpersand) + result += " & "; + result += QGLViewer::tr("Middle", "middle mouse button"); + addAmpersand = true; + } + if (b & Qt::RightButton) { + if (addAmpersand) + result += " & "; + result += QGLViewer::tr("Right", "right mouse button"); + } + return result; } /*! 默认的鼠标点击事件 */ void QGLViewer::performClickAction(ClickAction ca, const QMouseEvent* const e) { - // Note: action that need it should call update(). - switch (ca) { - // # CONNECTION setMouseBinding prevents adding NO_CLICK_ACTION in - // clickBinding_ This case should hence not be possible. Prevents unused case - // warning. - case NO_CLICK_ACTION: - break; - case RAP_FROM_PIXEL: - if (!camera()->setPivotPointFromPixel(e->pos())) - camera()->setPivotPoint(sceneCenter()); - update(); - break; - case CENTER_SCENE: - camera()->centerScene(); - break; - case SHOW_ENTIRE_SCENE: - camera()->showEntireScene(); - break; - case ALIGN_CAMERA: - Frame* frame = new Frame(); - frame->setTranslation(camera()->pivotPoint()); - camera()->frame()->alignWithFrame(frame, true); - delete frame; - break; - } + // Note: action that need it should call update(). + switch (ca) { + // # CONNECTION setMouseBinding prevents adding NO_CLICK_ACTION in + // clickBinding_ This case should hence not be possible. Prevents unused case + // warning. + case NO_CLICK_ACTION: + break; + case RAP_FROM_PIXEL: + if (!camera()->setPivotPointFromPixel(e->pos())) + camera()->setPivotPoint(sceneCenter()); + update(); + break; + case CENTER_SCENE: + camera()->centerScene(); + break; + case SHOW_ENTIRE_SCENE: + camera()->showEntireScene(); + break; + case ALIGN_CAMERA: + Frame* frame = new Frame(); + frame->setTranslation(camera()->pivotPoint()); + camera()->frame()->alignWithFrame(frame, true); + delete frame; + break; + } } void QGLViewer::mousePressEvent(QMouseEvent* e) { - //#CONNECTION# mouseDoubleClickEvent has the same structure - //#CONNECTION# mouseString() concatenates bindings description in inverse - // order. - ClickBindingPrivate cbp(e->modifiers(), e->button(), false, - static_cast((e->buttons() & ~(e->button()))), currentlyPressedKey_); - - if (clickBinding_.contains(cbp)) { - performClickAction(clickBinding_[cbp], e); - } - else { - //#CONNECTION# wheelEvent has the same structure - const MouseBindingPrivate mbp(e->modifiers(), e->button(), currentlyPressedKey_); - - if (mouseBinding_.contains(mbp)) { - MouseActionPrivate map = mouseBinding_[mbp]; - switch (map.handler) { - case CAMERA: - camera()->frame()->startAction(map.action, map.withConstraint); - camera()->frame()->mousePressEvent(e, camera()); - break; - case FRAME: - break; - } - if (map.action == SCREEN_ROTATE) - // Display visual hint line - update(); - } - else - e->ignore(); - } + //#CONNECTION# mouseDoubleClickEvent has the same structure + //#CONNECTION# mouseString() concatenates bindings description in inverse + // order. + ClickBindingPrivate cbp(e->modifiers(), e->button(), false, + static_cast((e->buttons() & ~(e->button()))), currentlyPressedKey_); + + if (clickBinding_.contains(cbp)) { + performClickAction(clickBinding_[cbp], e); + } + else { + //#CONNECTION# wheelEvent has the same structure + const MouseBindingPrivate mbp(e->modifiers(), e->button(), currentlyPressedKey_); + + if (mouseBinding_.contains(mbp)) { + MouseActionPrivate map = mouseBinding_[mbp]; + switch (map.handler) { + case CAMERA: + camera()->frame()->startAction(map.action, map.withConstraint); + camera()->frame()->mousePressEvent(e, camera()); + break; + case FRAME: + break; + } + if (map.action == SCREEN_ROTATE) + // Display visual hint line + update(); + } + else + e->ignore(); + } } void QGLViewer::mouseMoveEvent(QMouseEvent* e) { - //#CONNECTION# mouseReleaseEvent has the same structure - if (camera()->frame()->isManipulated()) - { - camera()->frame()->mouseMoveEvent(e, camera()); - } - else - { - if (hasMouseTracking()) { - // do some thing - } - } + //#CONNECTION# mouseReleaseEvent has the same structure + if (camera()->frame()->isManipulated()) + { + camera()->frame()->mouseMoveEvent(e, camera()); + } + else + { + if (hasMouseTracking()) { + // do some thing + } + } } void QGLViewer::mouseReleaseEvent(QMouseEvent* e) { - //#CONNECTION# mouseMoveEvent has the same structure - if (camera()->frame()->isManipulated()) { - camera()->frame()->mouseReleaseEvent(e, camera()); - } - else - e->ignore(); - - // Not absolutely needed (see above commented code for the optimal version), - update(); + //#CONNECTION# mouseMoveEvent has the same structure + if (camera()->frame()->isManipulated()) { + camera()->frame()->mouseReleaseEvent(e, camera()); + } + else + e->ignore(); + + // Not absolutely needed (see above commented code for the optimal version), + update(); } void QGLViewer::wheelEvent(QWheelEvent* e) { - //#CONNECTION# mousePressEvent has the same structure - WheelBindingPrivate wbp(e->modifiers(), currentlyPressedKey_); - - if (wheelBinding_.contains(wbp)) { - MouseActionPrivate map = wheelBinding_[wbp]; - switch (map.handler) { - case CAMERA: - camera()->frame()->startAction(map.action, map.withConstraint); - camera()->frame()->wheelEvent(e, camera()); - break; - case FRAME: - break; - } - } - else - e->ignore(); + //#CONNECTION# mousePressEvent has the same structure + WheelBindingPrivate wbp(e->modifiers(), currentlyPressedKey_); + + if (wheelBinding_.contains(wbp)) { + MouseActionPrivate map = wheelBinding_[wbp]; + switch (map.handler) { + case CAMERA: + camera()->frame()->startAction(map.action, map.withConstraint); + camera()->frame()->wheelEvent(e, camera()); + break; + case FRAME: + break; + } + } + else + e->ignore(); } void QGLViewer::mouseDoubleClickEvent(QMouseEvent* e) { - //#CONNECTION# mousePressEvent has the same structure - ClickBindingPrivate cbp(e->modifiers(), e->button(), true, - static_cast(e->buttons() & ~(e->button())), - currentlyPressedKey_); - if (clickBinding_.contains(cbp)) - performClickAction(clickBinding_[cbp], e); - else - e->ignore(); + //#CONNECTION# mousePressEvent has the same structure + ClickBindingPrivate cbp(e->modifiers(), e->button(), true, + static_cast(e->buttons() & ~(e->button())), + currentlyPressedKey_); + if (clickBinding_.contains(cbp)) + performClickAction(clickBinding_[cbp], e); + else + e->ignore(); } QString QGLViewer::clickActionString(QGLViewer::ClickAction ca) { - switch (ca) { - case QGLViewer::NO_CLICK_ACTION: - return QString(); - case QGLViewer::RAP_FROM_PIXEL: - return QGLViewer::tr("Sets pivot point", "RAP_FROM_PIXEL click action"); - case QGLViewer::CENTER_SCENE: - return QGLViewer::tr("Centers scene", "CENTER_SCENE click action"); - case QGLViewer::SHOW_ENTIRE_SCENE: - return QGLViewer::tr("Shows entire scene", "SHOW_ENTIRE_SCENE click action"); - case QGLViewer::ALIGN_CAMERA: - return QGLViewer::tr("Aligns camera", "ALIGN_CAMERA click action"); - } - return QString(); + switch (ca) { + case QGLViewer::NO_CLICK_ACTION: + return QString(); + case QGLViewer::RAP_FROM_PIXEL: + return QGLViewer::tr("Sets pivot point", "RAP_FROM_PIXEL click action"); + case QGLViewer::CENTER_SCENE: + return QGLViewer::tr("Centers scene", "CENTER_SCENE click action"); + case QGLViewer::SHOW_ENTIRE_SCENE: + return QGLViewer::tr("Shows entire scene", "SHOW_ENTIRE_SCENE click action"); + case QGLViewer::ALIGN_CAMERA: + return QGLViewer::tr("Aligns camera", "ALIGN_CAMERA click action"); + } + return QString(); } QString QGLViewer::mouseActionString(QGLViewer::MouseAction ma) { - switch (ma) { - case QGLViewer::NO_MOUSE_ACTION: - return QString(); - case QGLViewer::ROTATE: - return QGLViewer::tr("Rotates", "ROTATE mouse action"); - case QGLViewer::ZOOM: - return QGLViewer::tr("Zooms", "ZOOM mouse action"); - case QGLViewer::TRANSLATE: - return QGLViewer::tr("Translates", "TRANSLATE mouse action"); - case QGLViewer::SCREEN_ROTATE: - return QGLViewer::tr("Rotates in screen plane", "SCREEN_ROTATE mouse action"); - case QGLViewer::SCREEN_TRANSLATE: - return QGLViewer::tr("Horizontally/Vertically translates", "SCREEN_TRANSLATE mouse action"); - } - return QString(); + switch (ma) { + case QGLViewer::NO_MOUSE_ACTION: + return QString(); + case QGLViewer::ROTATE: + return QGLViewer::tr("Rotates", "ROTATE mouse action"); + case QGLViewer::ZOOM: + return QGLViewer::tr("Zooms", "ZOOM mouse action"); + case QGLViewer::TRANSLATE: + return QGLViewer::tr("Translates", "TRANSLATE mouse action"); + case QGLViewer::SCREEN_ROTATE: + return QGLViewer::tr("Rotates in screen plane", "SCREEN_ROTATE mouse action"); + case QGLViewer::SCREEN_TRANSLATE: + return QGLViewer::tr("Horizontally/Vertically translates", "SCREEN_TRANSLATE mouse action"); + } + return QString(); } static QString keyString(unsigned int key) { #if QT_VERSION >= 0x040100 - return QKeySequence(int(key)).toString(QKeySequence::NativeText); + return QKeySequence(int(key)).toString(QKeySequence::NativeText); #else - return QString(QKeySequence(key)); + return QString(QKeySequence(key)); #endif } QString QGLViewer::formatClickActionPrivate(ClickBindingPrivate cbp) { - bool buttonsBefore = cbp.buttonsBefore != Qt::NoButton; - QString keyModifierString = keyString(cbp.modifiers + cbp.key); - if (!keyModifierString.isEmpty()) { + bool buttonsBefore = cbp.buttonsBefore != Qt::NoButton; + QString keyModifierString = keyString(cbp.modifiers + cbp.key); + if (!keyModifierString.isEmpty()) { #ifdef Q_OS_MAC - // modifiers never has a '+' sign. Add one space to clearly separate - // modifiers (and possible key) from button - keyModifierString += " "; + // modifiers never has a '+' sign. Add one space to clearly separate + // modifiers (and possible key) from button + keyModifierString += " "; #else - // modifiers might be of the form : 'S' or 'Ctrl+S' or 'Ctrl+'. For - // consistency, add an other '+' if needed, no spaces - if (!keyModifierString.endsWith('+')) - keyModifierString += "+"; + // modifiers might be of the form : 'S' or 'Ctrl+S' or 'Ctrl+'. For + // consistency, add an other '+' if needed, no spaces + if (!keyModifierString.endsWith('+')) + keyModifierString += "+"; #endif - } - - return tr("%1%2%3%4%5%6", "Modifier / button or wheel / double click / with " - "/ button / pressed") - .arg(keyModifierString) - .arg(mouseButtonsString(cbp.button) + - (cbp.button == Qt::NoButton ? tr("Wheel", "Mouse wheel") : "")) - .arg(cbp.doubleClick ? tr(" double click", "Suffix after mouse button") - : "") - .arg(buttonsBefore ? tr(" with ", "As in : Left button with Ctrl pressed") - : "") - .arg(buttonsBefore ? mouseButtonsString(cbp.buttonsBefore) : "") - .arg(buttonsBefore - ? tr(" pressed", "As in : Left button with Ctrl pressed") - : ""); + } + + return tr("%1%2%3%4%5%6", "Modifier / button or wheel / double click / with " + "/ button / pressed") + .arg(keyModifierString) + .arg(mouseButtonsString(cbp.button) + + (cbp.button == Qt::NoButton ? tr("Wheel", "Mouse wheel") : "")) + .arg(cbp.doubleClick ? tr(" double click", "Suffix after mouse button") + : "") + .arg(buttonsBefore ? tr(" with ", "As in : Left button with Ctrl pressed") + : "") + .arg(buttonsBefore ? mouseButtonsString(cbp.buttonsBefore) : "") + .arg(buttonsBefore + ? tr(" pressed", "As in : Left button with Ctrl pressed") + : ""); } static QString tableLine(const QString& left, const QString& right) { - static bool even = false; - const QString tdtd(""); - const QString tdtr("\n"); + static bool even = false; + const QString tdtd(""); + const QString tdtr("\n"); - QString res(""; - else - res += "#ffffff\">"; - res += "" + left + tdtd + right + tdtr; - even = !even; + if (even) + res += "#eeeeff\">"; + else + res += "#ffffff\">"; + res += "" + left + tdtd + right + tdtr; + even = !even; - return res; + return res; } /*! Returns a QString that describes the application mouse bindings, displayed @@ -641,118 +651,118 @@ href="../mouse.html">mouse page for details on mouse bindings. See also helpString() and keyboardString(). */ QString QGLViewer::mouseString() const { - QString text( - "

\n"); - const QString trtd("\n"); - const QString tdtd("\n") - .arg(tr("Button(s)", - "Buttons column header in help window mouse tab")) - .arg(tr("Description", - "Description column header in help window mouse tab")); - - QMap mouseBinding; - - // User-defined mouse bindings come first. - for (QMap::ConstIterator - itm = mouseDescription_.begin(), - endm = mouseDescription_.end(); - itm != endm; ++itm) - mouseBinding[itm.key()] = itm.value(); - - for (QMap::ConstIterator - it = mouseBinding.begin(), - end = mouseBinding.end(); - it != end; ++it) { - // Should not be needed (see setMouseBindingDescription()) - if (it.value().isNull()) - continue; - - text += tableLine(formatClickActionPrivate(it.key()), it.value()); - } - - // Optional separator line - if (!mouseBinding.isEmpty()) { - mouseBinding.clear(); - text += QString("\n") - .arg(tr("Standard mouse bindings", "In help window mouse tab")); - } - - // Then concatenates the descriptions of wheelBinding_, mouseBinding_ and - // clickBinding_. The order is significant and corresponds to the priorities - // set in mousePressEvent() (reverse priority order, last one overwrites - // previous) #CONNECTION# mousePressEvent() order - for (QMap::ConstIterator - itmb = mouseBinding_.begin(), - endmb = mouseBinding_.end(); - itmb != endmb; ++itmb) { - ClickBindingPrivate cbp(itmb.key().modifiers, itmb.key().button, false, - Qt::NoButton, itmb.key().key); - - QString text = mouseActionString(itmb.value().action); - - if (!text.isNull()) { - switch (itmb.value().handler) { - case CAMERA: - text += " " + tr("camera", "Suffix after action"); - break; - case FRAME: - text += " " + tr("manipulated frame", "Suffix after action"); - break; - } - if (!(itmb.value().withConstraint)) - text += "*"; - } - mouseBinding[cbp] = text; - } - - for (QMap::ConstIterator - itw = wheelBinding_.begin(), - endw = wheelBinding_.end(); - itw != endw; ++itw) { - ClickBindingPrivate cbp(itw.key().modifiers, Qt::NoButton, false, - Qt::NoButton, itw.key().key); - - QString text = mouseActionString(itw.value().action); - - if (!text.isNull()) { - switch (itw.value().handler) { - case CAMERA: - text += " " + tr("camera", "Suffix after action"); - break; - case FRAME: - text += " " + tr("manipulated frame", "Suffix after action"); - break; - } - if (!(itw.value().withConstraint)) - text += "*"; - } - - mouseBinding[cbp] = text; - } - - for (QMap::ConstIterator - itcb = clickBinding_.begin(), - endcb = clickBinding_.end(); - itcb != endcb; ++itcb) - mouseBinding[itcb.key()] = clickActionString(itcb.value()); - - for (QMap::ConstIterator - it2 = mouseBinding.begin(), - end2 = mouseBinding.end(); - it2 != end2; ++it2) { - if (it2.value().isNull()) - continue; - - text += tableLine(formatClickActionPrivate(it2.key()), it2.value()); - } - - text += "
"); - const QString tdtr("
"); - - text += QString("
%1%2
%1
"; - - return text; + QString text( + "
\n"); + const QString trtd("\n"); + const QString tdtd("\n") + .arg(tr("Button(s)", + "Buttons column header in help window mouse tab")) + .arg(tr("Description", + "Description column header in help window mouse tab")); + + QMap mouseBinding; + + // User-defined mouse bindings come first. + for (QMap::ConstIterator + itm = mouseDescription_.begin(), + endm = mouseDescription_.end(); + itm != endm; ++itm) + mouseBinding[itm.key()] = itm.value(); + + for (QMap::ConstIterator + it = mouseBinding.begin(), + end = mouseBinding.end(); + it != end; ++it) { + // Should not be needed (see setMouseBindingDescription()) + if (it.value().isNull()) + continue; + + text += tableLine(formatClickActionPrivate(it.key()), it.value()); + } + + // Optional separator line + if (!mouseBinding.isEmpty()) { + mouseBinding.clear(); + text += QString("\n") + .arg(tr("Standard mouse bindings", "In help window mouse tab")); + } + + // Then concatenates the descriptions of wheelBinding_, mouseBinding_ and + // clickBinding_. The order is significant and corresponds to the priorities + // set in mousePressEvent() (reverse priority order, last one overwrites + // previous) #CONNECTION# mousePressEvent() order + for (QMap::ConstIterator + itmb = mouseBinding_.begin(), + endmb = mouseBinding_.end(); + itmb != endmb; ++itmb) { + ClickBindingPrivate cbp(itmb.key().modifiers, itmb.key().button, false, + Qt::NoButton, itmb.key().key); + + QString text = mouseActionString(itmb.value().action); + + if (!text.isNull()) { + switch (itmb.value().handler) { + case CAMERA: + text += " " + tr("camera", "Suffix after action"); + break; + case FRAME: + text += " " + tr("manipulated frame", "Suffix after action"); + break; + } + if (!(itmb.value().withConstraint)) + text += "*"; + } + mouseBinding[cbp] = text; + } + + for (QMap::ConstIterator + itw = wheelBinding_.begin(), + endw = wheelBinding_.end(); + itw != endw; ++itw) { + ClickBindingPrivate cbp(itw.key().modifiers, Qt::NoButton, false, + Qt::NoButton, itw.key().key); + + QString text = mouseActionString(itw.value().action); + + if (!text.isNull()) { + switch (itw.value().handler) { + case CAMERA: + text += " " + tr("camera", "Suffix after action"); + break; + case FRAME: + text += " " + tr("manipulated frame", "Suffix after action"); + break; + } + if (!(itw.value().withConstraint)) + text += "*"; + } + + mouseBinding[cbp] = text; + } + + for (QMap::ConstIterator + itcb = clickBinding_.begin(), + endcb = clickBinding_.end(); + itcb != endcb; ++itcb) + mouseBinding[itcb.key()] = clickActionString(itcb.value()); + + for (QMap::ConstIterator + it2 = mouseBinding.begin(), + end2 = mouseBinding.end(); + it2 != end2; ++it2) { + if (it2.value().isNull()) + continue; + + text += tableLine(formatClickActionPrivate(it2.key()), it2.value()); + } + + text += "
"); + const QString tdtr("
"); + + text += QString("
%1%2
%1
"; + + return text; } /*! Returns a QString that describes the application keyboard shortcut bindings, @@ -765,53 +775,53 @@ href="../keyboard.html">keyboard page for details on key customization. See also helpString() and mouseString(). */ QString QGLViewer::keyboardString() const { - QString text( - "
\n"); - text += QString("\n") - .arg(QGLViewer::tr("Key(s)", - "Keys column header in help window mouse tab")) - .arg(QGLViewer::tr( - "Description", - "Description column header in help window mouse tab")); - - QMap keyDescription; - - // 1 - User defined key descriptions - for (QMap::ConstIterator kd = keyDescription_.begin(), - kdend = keyDescription_.end(); - kd != kdend; ++kd) - keyDescription[kd.key()] = kd.value(); - - // Add to text in sorted order - for (QMap::ConstIterator kb = keyDescription.begin(), - endb = keyDescription.end(); - kb != endb; ++kb) - text += tableLine(keyString(kb.key()), kb.value()); - - // 2 - Optional separator line - if (!keyDescription.isEmpty()) { - keyDescription.clear(); - text += QString("\n") - .arg(QGLViewer::tr("Standard viewer keys", - "In help window keys tab")); - } - - // 3 - KeyboardAction bindings description - for (QMap::ConstIterator - it = keyboardBinding_.begin(), - end = keyboardBinding_.end(); - it != end; ++it) - if ((it.value() != 0) && (!cameraIsInRotateMode())) - keyDescription[it.value()] = keyboardActionDescription_[it.key()]; - - // Add to text in sorted order - for (QMap::ConstIterator kb2 = keyDescription.begin(), - endb2 = keyDescription.end(); - kb2 != endb2; ++kb2) - text += tableLine(keyString(kb2.key()), kb2.value()); - - return text; + QString text( + "
%1%2
%1
\n"); + text += QString("\n") + .arg(QGLViewer::tr("Key(s)", + "Keys column header in help window mouse tab")) + .arg(QGLViewer::tr( + "Description", + "Description column header in help window mouse tab")); + + QMap keyDescription; + + // 1 - User defined key descriptions + for (QMap::ConstIterator kd = keyDescription_.begin(), + kdend = keyDescription_.end(); + kd != kdend; ++kd) + keyDescription[kd.key()] = kd.value(); + + // Add to text in sorted order + for (QMap::ConstIterator kb = keyDescription.begin(), + endb = keyDescription.end(); + kb != endb; ++kb) + text += tableLine(keyString(kb.key()), kb.value()); + + // 2 - Optional separator line + if (!keyDescription.isEmpty()) { + keyDescription.clear(); + text += QString("\n") + .arg(QGLViewer::tr("Standard viewer keys", + "In help window keys tab")); + } + + // 3 - KeyboardAction bindings description + for (QMap::ConstIterator + it = keyboardBinding_.begin(), + end = keyboardBinding_.end(); + it != end; ++it) + if ((it.value() != 0) && (!cameraIsInRotateMode())) + keyDescription[it.value()] = keyboardActionDescription_[it.key()]; + + // Add to text in sorted order + for (QMap::ConstIterator kb2 = keyDescription.begin(), + endb2 = keyDescription.end(); + kb2 != endb2; ++kb2) + text += tableLine(keyString(kb2.key()), kb2.value()); + + return text; } /*! Opens a modal help window that includes four tabs, respectively filled with @@ -825,127 +835,127 @@ change layout...). The helpRequired() signal is emitted. */ void QGLViewer::help() { - Q_EMIT helpRequired(); - - bool resize = false; - int width = 600; - int height = 400; - - static QString label[] = { tr("&Help", "Help window tab title"), - tr("&Keyboard", "Help window tab title"), - tr("&Mouse", "Help window tab title"), - tr("&About", "Help window about title") }; - - if (!helpWidget()) { - // Qt4 requires a nullptr parent... - helpWidget_ = new QTabWidget(nullptr); - helpWidget()->setWindowTitle(tr("Help", "Help window title")); - - resize = true; - for (int i = 0; i < 4; ++i) { - QTextEdit* tab = new QTextEdit(nullptr); - tab->setReadOnly(true); - - helpWidget()->insertTab(i, tab, label[i]); - } - } - - for (int i = 0; i < 4; ++i) { - QString text; - switch (i) { - case 0: - text = helpString(); - break; - case 1: - text = keyboardString(); - break; - case 2: - text = mouseString(); - break; - case 3: - text = QString("LiuHao Test"); - break; - default: - break; - } - - QTextEdit* textEdit = static_cast(helpWidget()->widget(i)); - textEdit->setHtml(text); - textEdit->setText(text); - - if (resize && (textEdit->height() > height)) - height = textEdit->height(); - } - - if (resize) - helpWidget()->resize(width, height + 40); // 40 pixels is ~ tabs' height - helpWidget()->show(); - helpWidget()->raise(); + Q_EMIT helpRequired(); + + bool resize = false; + int width = 600; + int height = 400; + + static QString label[] = { tr("&Help", "Help window tab title"), + tr("&Keyboard", "Help window tab title"), + tr("&Mouse", "Help window tab title"), + tr("&About", "Help window about title") }; + + if (!helpWidget()) { + // Qt4 requires a nullptr parent... + helpWidget_ = new QTabWidget(nullptr); + helpWidget()->setWindowTitle(tr("Help", "Help window title")); + + resize = true; + for (int i = 0; i < 4; ++i) { + QTextEdit* tab = new QTextEdit(nullptr); + tab->setReadOnly(true); + + helpWidget()->insertTab(i, tab, label[i]); + } + } + + for (int i = 0; i < 4; ++i) { + QString text; + switch (i) { + case 0: + text = helpString(); + break; + case 1: + text = keyboardString(); + break; + case 2: + text = mouseString(); + break; + case 3: + text = QString("LiuHao Test"); + break; + default: + break; + } + + QTextEdit* textEdit = static_cast(helpWidget()->widget(i)); + textEdit->setHtml(text); + textEdit->setText(text); + + if (resize && (textEdit->height() > height)) + height = textEdit->height(); + } + + if (resize) + helpWidget()->resize(width, height + 40); // 40 pixels is ~ tabs' height + helpWidget()->show(); + helpWidget()->raise(); } bool QGLViewer::isValidShortcutKey(int key) { - return (key >= Qt::Key_Any && key < Qt::Key_Escape) || - (key >= Qt::Key_F1 && key <= Qt::Key_F35); + return (key >= Qt::Key_Any && key < Qt::Key_Escape) || + (key >= Qt::Key_F1 && key <= Qt::Key_F35); } void QGLViewer::keyPressEvent(QKeyEvent* e) { - if (e->key() == 0) { - e->ignore(); - return; - } - - const Qt::Key key = Qt::Key(e->key()); - - const Qt::KeyboardModifiers modifiers = e->modifiers(); - - QMap::ConstIterator - it = keyboardBinding_ .begin(), - end = keyboardBinding_.end(); - const unsigned int target = key | modifiers; - while ((it != end) && (it.value() != target)) - ++it; - - if (it != end) - handleKeyboardAction(it.key()); - else { - if (isValidShortcutKey(key)) - currentlyPressedKey_ = key; - e->ignore(); - } + if (e->key() == 0) { + e->ignore(); + return; + } + + const Qt::Key key = Qt::Key(e->key()); + + const Qt::KeyboardModifiers modifiers = e->modifiers(); + + QMap::ConstIterator + it = keyboardBinding_.begin(), + end = keyboardBinding_.end(); + const unsigned int target = key | modifiers; + while ((it != end) && (it.value() != target)) + ++it; + + if (it != end) + handleKeyboardAction(it.key()); + else { + if (isValidShortcutKey(key)) + currentlyPressedKey_ = key; + e->ignore(); + } } void QGLViewer::keyReleaseEvent(QKeyEvent* e) { - if (isValidShortcutKey(e->key())) - currentlyPressedKey_ = Qt::Key(0); + if (isValidShortcutKey(e->key())) + currentlyPressedKey_ = Qt::Key(0); } void QGLViewer::handleKeyboardAction(KeyboardAction id) { - switch (id) { - case HELP: - help(); - break; - case MOVE_CAMERA_LEFT: - camera()->frame()->translate(camera()->frame()->inverseTransformOf( - Vec(-10.0 * camera()->flySpeed(), 0.0, 0.0))); - update(); - break; - case MOVE_CAMERA_RIGHT: - camera()->frame()->translate(camera()->frame()->inverseTransformOf( - Vec(10.0 * camera()->flySpeed(), 0.0, 0.0))); - update(); - break; - case MOVE_CAMERA_UP: - camera()->frame()->translate(camera()->frame()->inverseTransformOf( - Vec(0.0, 10.0 * camera()->flySpeed(), 0.0))); - update(); - break; - case MOVE_CAMERA_DOWN: - camera()->frame()->translate(camera()->frame()->inverseTransformOf( - Vec(0.0, -10.0 * camera()->flySpeed(), 0.0))); - update(); - break; - } + switch (id) { + case HELP: + help(); + break; + case MOVE_CAMERA_LEFT: + camera()->frame()->translate(camera()->frame()->inverseTransformOf( + Vec(-10.0 * camera()->flySpeed(), 0.0, 0.0))); + update(); + break; + case MOVE_CAMERA_RIGHT: + camera()->frame()->translate(camera()->frame()->inverseTransformOf( + Vec(10.0 * camera()->flySpeed(), 0.0, 0.0))); + update(); + break; + case MOVE_CAMERA_UP: + camera()->frame()->translate(camera()->frame()->inverseTransformOf( + Vec(0.0, 10.0 * camera()->flySpeed(), 0.0))); + update(); + break; + case MOVE_CAMERA_DOWN: + camera()->frame()->translate(camera()->frame()->inverseTransformOf( + Vec(0.0, -10.0 * camera()->flySpeed(), 0.0))); + update(); + break; + } } /*! Callback method used when the widget size is modified. @@ -953,9 +963,9 @@ void QGLViewer::handleKeyboardAction(KeyboardAction id) { If you overload this method, first call the inherited method. Also called when the widget is created, before its first display. */ void QGLViewer::resizeGL(int width, int height) { - QOpenGLWidget::resizeGL(width, height); - glViewport(0, 0, GLint(width), GLint(height)); - camera()->setScreenWidthAndHeight(this->width(), this->height()); + QOpenGLWidget::resizeGL(width, height); + glViewport(0, 0, GLint(width), GLint(height)); + camera()->setScreenWidthAndHeight(this->width(), this->height()); } ////////////////////////////////////////////////////////////////////////// @@ -980,7 +990,7 @@ Only one shortcut can be assigned to a given QGLViewer::KeyboardAction (new bindings replace previous ones). If several KeyboardAction are binded to the same shortcut, only one of them is active. */ void QGLViewer::setShortcut(KeyboardAction action, unsigned int key) { - keyboardBinding_[action] = key; + keyboardBinding_[action] = key; } /*! Returns the keyboard shortcut associated to a given @@ -990,10 +1000,10 @@ If you want to define keyboard shortcuts for custom actions (say, open a scene file), overload keyPressEvent() and then setKeyDescription(). */ unsigned int QGLViewer::shortcut(KeyboardAction action) const { - if (keyboardBinding_.contains(action)) - return keyboardBinding_[action]; - else - return 0; + if (keyboardBinding_.contains(action)) + return keyboardBinding_[action]; + else + return 0; } //////////////////////////////////////////////////////////////////////////////// @@ -1002,256 +1012,256 @@ unsigned int QGLViewer::shortcut(KeyboardAction action) const { // 将ClickAction关联到按钮和键盘键以及修饰符的组合。 void QGLViewer::setMouseBinding(Qt::Key key, Qt::KeyboardModifiers modifiers, - Qt::MouseButton button, ClickAction action, - bool doubleClick, Qt::MouseButtons buttonsBefore) { - if ((buttonsBefore != Qt::NoButton) && !doubleClick) { - qWarning("Buttons before is only meaningful when doubleClick is true in " - "setMouseBinding()."); - return; - } - - if (button == Qt::NoButton) { - qWarning("No mouse button specified in setMouseBinding"); - return; - } - - ClickBindingPrivate cbp(modifiers, button, doubleClick, buttonsBefore, key); - - // #CONNECTION performClickAction comment on NO_CLICK_ACTION - if (action == NO_CLICK_ACTION) - clickBinding_.remove(cbp); - else - clickBinding_.insert(cbp, action); - - if ((!doubleClick) && (buttonsBefore == Qt::NoButton)) { - MouseBindingPrivate mbp(modifiers, button, key); - mouseBinding_.remove(mbp); - } + Qt::MouseButton button, ClickAction action, + bool doubleClick, Qt::MouseButtons buttonsBefore) { + if ((buttonsBefore != Qt::NoButton) && !doubleClick) { + qWarning("Buttons before is only meaningful when doubleClick is true in " + "setMouseBinding()."); + return; + } + + if (button == Qt::NoButton) { + qWarning("No mouse button specified in setMouseBinding"); + return; + } + + ClickBindingPrivate cbp(modifiers, button, doubleClick, buttonsBefore, key); + + // #CONNECTION performClickAction comment on NO_CLICK_ACTION + if (action == NO_CLICK_ACTION) + clickBinding_.remove(cbp); + else + clickBinding_.insert(cbp, action); + + if ((!doubleClick) && (buttonsBefore == Qt::NoButton)) { + MouseBindingPrivate mbp(modifiers, button, key); + mouseBinding_.remove(mbp); + } } // 将MouseAction关联到按钮和键盘键以及修饰符的组合。同时标注鼠标事件接收者 // 鼠标事件的接收者是MouseHandler(CAMERA或FRAME)。 void QGLViewer::setMouseBinding(Qt::Key key, Qt::KeyboardModifiers modifiers, - Qt::MouseButton button, MouseHandler handler, - MouseAction action, bool withConstraint) + Qt::MouseButton button, MouseHandler handler, + MouseAction action, bool withConstraint) { - if (button == Qt::NoButton) { - qWarning("No mouse button specified in setMouseBinding"); - return; - } - - MouseActionPrivate map; - map.handler = handler; - map.action = action; - map.withConstraint = withConstraint; - - MouseBindingPrivate mbp(modifiers, button, key); - if (action == NO_MOUSE_ACTION) - mouseBinding_.remove(mbp); - else - mouseBinding_.insert(mbp, map); - - ClickBindingPrivate cbp(modifiers, button, false, Qt::NoButton, key); - clickBinding_.remove(cbp); + if (button == Qt::NoButton) { + qWarning("No mouse button specified in setMouseBinding"); + return; + } + + MouseActionPrivate map; + map.handler = handler; + map.action = action; + map.withConstraint = withConstraint; + + MouseBindingPrivate mbp(modifiers, button, key); + if (action == NO_MOUSE_ACTION) + mouseBinding_.remove(mbp); + else + mouseBinding_.insert(mbp, map); + + ClickBindingPrivate cbp(modifiers, button, false, Qt::NoButton, key); + clickBinding_.remove(cbp); } /*! Defines a MouseAction binding. */ void QGLViewer::setMouseBinding(Qt::KeyboardModifiers modifiers, - Qt::MouseButton button, MouseHandler handler, - MouseAction action, bool withConstraint) + Qt::MouseButton button, MouseHandler handler, + MouseAction action, bool withConstraint) { - setMouseBinding(Qt::Key(0), modifiers, button, handler, action, - withConstraint); + setMouseBinding(Qt::Key(0), modifiers, button, handler, action, + withConstraint); } /*! Defines a ClickAction binding. */ void QGLViewer::setMouseBinding(Qt::KeyboardModifiers modifiers, - Qt::MouseButton button, ClickAction action, - bool doubleClick, Qt::MouseButtons buttonsBefore) + Qt::MouseButton button, ClickAction action, + bool doubleClick, Qt::MouseButtons buttonsBefore) { - setMouseBinding(Qt::Key(0), modifiers, button, action, doubleClick, buttonsBefore); + setMouseBinding(Qt::Key(0), modifiers, button, action, doubleClick, buttonsBefore); } // 将MouseAction和MouseHandler关联到鼠标滚轮事件。 void QGLViewer::setWheelBinding(Qt::Key key, Qt::KeyboardModifiers modifiers, - MouseHandler handler, MouseAction action, - bool withConstraint) { - //#CONNECTION# ManipulatedFrame::wheelEvent and - // ManipulatedCameraFrame::wheelEvent switches - if ((action != ZOOM) && (action != NO_MOUSE_ACTION)) { - qWarning("Cannot bind %s to wheel", - mouseActionString(action).toLatin1().constData()); - return; - } - - if ((handler == FRAME) && (action != ZOOM) && (action != NO_MOUSE_ACTION)) { - qWarning("Cannot bind %s to FRAME wheel", - mouseActionString(action).toLatin1().constData()); - return; - } - - MouseActionPrivate map; - map.handler = handler; - map.action = action; - map.withConstraint = withConstraint; - - WheelBindingPrivate wbp(modifiers, key); - if (action == NO_MOUSE_ACTION) - wheelBinding_.remove(wbp); - else - wheelBinding_[wbp] = map; + MouseHandler handler, MouseAction action, + bool withConstraint) { + //#CONNECTION# ManipulatedFrame::wheelEvent and + // ManipulatedCameraFrame::wheelEvent switches + if ((action != ZOOM) && (action != NO_MOUSE_ACTION)) { + qWarning("Cannot bind %s to wheel", + mouseActionString(action).toLatin1().constData()); + return; + } + + if ((handler == FRAME) && (action != ZOOM) && (action != NO_MOUSE_ACTION)) { + qWarning("Cannot bind %s to FRAME wheel", + mouseActionString(action).toLatin1().constData()); + return; + } + + MouseActionPrivate map; + map.handler = handler; + map.action = action; + map.withConstraint = withConstraint; + + WheelBindingPrivate wbp(modifiers, key); + if (action == NO_MOUSE_ACTION) + wheelBinding_.remove(wbp); + else + wheelBinding_[wbp] = map; } /*! Defines a mouse wheel binding.*/ void QGLViewer::setWheelBinding(Qt::KeyboardModifiers modifiers, - MouseHandler handler, MouseAction action, bool withConstraint) { - setWheelBinding(Qt::Key(0), modifiers, handler, action, withConstraint); + MouseHandler handler, MouseAction action, bool withConstraint) { + setWheelBinding(Qt::Key(0), modifiers, handler, action, withConstraint); } /*! Clears all the default mouse bindings. */ void QGLViewer::clearMouseBindings() { - mouseBinding_.clear(); - clickBinding_.clear(); - wheelBinding_.clear(); + mouseBinding_.clear(); + clickBinding_.clear(); + wheelBinding_.clear(); } /*! Returns the MouseAction the will be triggered when the mouse \p button is pressed, while the keyboard \p modifiers and \p key are pressed. */ QGLViewer::MouseAction QGLViewer::mouseAction(Qt::Key key, - Qt::KeyboardModifiers modifiers, Qt::MouseButton button) const + Qt::KeyboardModifiers modifiers, Qt::MouseButton button) const { - MouseBindingPrivate mbp(modifiers, button, key); - if (mouseBinding_.contains(mbp)) - return mouseBinding_[mbp].action; - else - return NO_MOUSE_ACTION; + MouseBindingPrivate mbp(modifiers, button, key); + if (mouseBinding_.contains(mbp)) + return mouseBinding_[mbp].action; + else + return NO_MOUSE_ACTION; } /*! Returns the MouseHandler which will be activated when the mouse \p button is pressed, while the \p modifiers and \p key are pressed.*/ int QGLViewer::mouseHandler(Qt::Key key, Qt::KeyboardModifiers modifiers, - Qt::MouseButton button) const { - MouseBindingPrivate mbp(modifiers, button, key); - if (mouseBinding_.contains(mbp)) - return mouseBinding_[mbp].handler; - else - return -1; + Qt::MouseButton button) const { + MouseBindingPrivate mbp(modifiers, button, key); + if (mouseBinding_.contains(mbp)) + return mouseBinding_[mbp].handler; + else + return -1; } /*! Returns the keyboard state that triggers \p action on \p handler \p withConstraint using the mouse wheel.*/ void QGLViewer::getWheelActionBinding(MouseHandler handler, MouseAction action, - bool withConstraint, Qt::Key& key, Qt::KeyboardModifiers& modifiers) const + bool withConstraint, Qt::Key& key, Qt::KeyboardModifiers& modifiers) const { - for (QMap::ConstIterator - it = wheelBinding_.begin(), - end = wheelBinding_.end(); - it != end; ++it) - if ((it.value().handler == handler) && (it.value().action == action) && - (it.value().withConstraint == withConstraint)) { - key = it.key().key; - modifiers = it.key().modifiers; - return; - } - - key = Qt::Key(-1); - modifiers = Qt::NoModifier; + for (QMap::ConstIterator + it = wheelBinding_.begin(), + end = wheelBinding_.end(); + it != end; ++it) + if ((it.value().handler == handler) && (it.value().action == action) && + (it.value().withConstraint == withConstraint)) { + key = it.key().key; + modifiers = it.key().modifiers; + return; + } + + key = Qt::Key(-1); + modifiers = Qt::NoModifier; } /*! Returns the mouse and keyboard state that triggers \p action on \p handler \p withConstraint.*/ void QGLViewer::getMouseActionBinding(MouseHandler handler, MouseAction action, - bool withConstraint, Qt::Key& key, - Qt::KeyboardModifiers& modifiers, Qt::MouseButton& button) const + bool withConstraint, Qt::Key& key, + Qt::KeyboardModifiers& modifiers, Qt::MouseButton& button) const { - for (QMap::ConstIterator - it = mouseBinding_.begin(), - end = mouseBinding_.end(); - it != end; ++it) { - if ((it.value().handler == handler) && (it.value().action == action) && - (it.value().withConstraint == withConstraint)) { - key = it.key().key; - modifiers = it.key().modifiers; - button = it.key().button; - return; - } - } - - key = Qt::Key(0); - modifiers = Qt::NoModifier; - button = Qt::NoButton; + for (QMap::ConstIterator + it = mouseBinding_.begin(), + end = mouseBinding_.end(); + it != end; ++it) { + if ((it.value().handler == handler) && (it.value().action == action) && + (it.value().withConstraint == withConstraint)) { + key = it.key().key; + modifiers = it.key().modifiers; + button = it.key().button; + return; + } + } + + key = Qt::Key(0); + modifiers = Qt::NoModifier; + button = Qt::NoButton; } /*! Returns the MouseAction (if any) that is performed when using the wheel, when the \p modifiers and \p key keyboard keys are pressed.*/ -QGLViewer::MouseAction QGLViewer::wheelAction(Qt::Key key, - Qt::KeyboardModifiers modifiers) const +QGLViewer::MouseAction QGLViewer::wheelAction(Qt::Key key, + Qt::KeyboardModifiers modifiers) const { - WheelBindingPrivate wbp(modifiers, key); - if (wheelBinding_.contains(wbp)) - return wheelBinding_[wbp].action; - else - return NO_MOUSE_ACTION; + WheelBindingPrivate wbp(modifiers, key); + if (wheelBinding_.contains(wbp)) + return wheelBinding_[wbp].action; + else + return NO_MOUSE_ACTION; } /*! Returns the MouseHandler (if any) that receives wheel events when the \p modifiers and \p key keyboard keys are pressed.*/ int QGLViewer::wheelHandler(Qt::Key key, Qt::KeyboardModifiers modifiers) const { - WheelBindingPrivate wbp(modifiers, key); - if (wheelBinding_.contains(wbp)) - return wheelBinding_[wbp].handler; - else - return -1; + WheelBindingPrivate wbp(modifiers, key); + if (wheelBinding_.contains(wbp)) + return wheelBinding_[wbp].handler; + else + return -1; } /*! Same as mouseAction(), but for the ClickAction set using setMouseBinding(). */ -QGLViewer::ClickAction QGLViewer::clickAction(Qt::Key key, - Qt::KeyboardModifiers modifiers, Qt::MouseButton button, - bool doubleClick, Qt::MouseButtons buttonsBefore) const +QGLViewer::ClickAction QGLViewer::clickAction(Qt::Key key, + Qt::KeyboardModifiers modifiers, Qt::MouseButton button, + bool doubleClick, Qt::MouseButtons buttonsBefore) const { - ClickBindingPrivate cbp(modifiers, button, doubleClick, buttonsBefore, key); - if (clickBinding_.contains(cbp)) - return clickBinding_[cbp]; - else - return NO_CLICK_ACTION; + ClickBindingPrivate cbp(modifiers, button, doubleClick, buttonsBefore, key); + if (clickBinding_.contains(cbp)) + return clickBinding_[cbp]; + else + return NO_CLICK_ACTION; } /*! Returns the mouse and keyboard state that triggers \p action. */ void QGLViewer::getClickActionBinding(ClickAction action, Qt::Key& key, - Qt::KeyboardModifiers& modifiers, Qt::MouseButton& button, bool& doubleClick, - Qt::MouseButtons& buttonsBefore) const { - for (QMap::ConstIterator - it = clickBinding_.begin(), - end = clickBinding_.end(); - it != end; ++it) - if (it.value() == action) { - modifiers = it.key().modifiers; - button = it.key().button; - doubleClick = it.key().doubleClick; - buttonsBefore = it.key().buttonsBefore; - key = it.key().key; - return; - } - - modifiers = Qt::NoModifier; - button = Qt::NoButton; - doubleClick = false; - buttonsBefore = Qt::NoButton; - key = Qt::Key(0); + Qt::KeyboardModifiers& modifiers, Qt::MouseButton& button, bool& doubleClick, + Qt::MouseButtons& buttonsBefore) const { + for (QMap::ConstIterator + it = clickBinding_.begin(), + end = clickBinding_.end(); + it != end; ++it) + if (it.value() == action) { + modifiers = it.key().modifiers; + button = it.key().button; + doubleClick = it.key().doubleClick; + buttonsBefore = it.key().buttonsBefore; + key = it.key().key; + return; + } + + modifiers = Qt::NoModifier; + button = Qt::NoButton; + doubleClick = false; + buttonsBefore = Qt::NoButton; + key = Qt::Key(0); } /*! This function should be used in conjunction with toggleCameraMode(). It returns \c true when at least one mouse button is binded to the \c ROTATE mouseAction. This is crude way of determining which "mode" the camera is in. */ bool QGLViewer::cameraIsInRotateMode() const { - //#CONNECTION# used in toggleCameraMode() and keyboardString() - Qt::Key key; - Qt::KeyboardModifiers modifiers; - Qt::MouseButton button; - getMouseActionBinding(CAMERA, ROTATE, true /*constraint*/, key, modifiers, - button); - return button != Qt::NoButton; + //#CONNECTION# used in toggleCameraMode() and keyboardString() + Qt::Key key; + Qt::KeyboardModifiers modifiers; + Qt::MouseButton button; + getMouseActionBinding(CAMERA, ROTATE, true /*constraint*/, key, modifiers, + button); + return button != Qt::NoButton; } @@ -1314,50 +1324,50 @@ may sometimes be emulated in software, resulting in poor performances. \note The bufferTextureId() texture is binded at the end of this method. */ void QGLViewer::copyBufferToTexture(GLint internalFormat, GLenum format) { - int h = 16; - int w = 16; - // Todo compare performance with qt code. - while (w < width()) - w <<= 1; - while (h < height()) - h <<= 1; - - bool init = false; - - if ((w != bufferTextureWidth_) || (h != bufferTextureHeight_)) { - bufferTextureWidth_ = w; - bufferTextureHeight_ = h; - bufferTextureMaxU_ = width() / qreal(bufferTextureWidth_); - bufferTextureMaxV_ = height() / qreal(bufferTextureHeight_); - init = true; - } - - if (bufferTextureId() == 0) { - glGenTextures(1, &bufferTextureId_); - glBindTexture(GL_TEXTURE_2D, bufferTextureId_); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - init = true; - } - else - glBindTexture(GL_TEXTURE_2D, bufferTextureId_); - - if ((format != previousBufferTextureFormat_) || - (internalFormat != previousBufferTextureInternalFormat_)) { - previousBufferTextureFormat_ = format; - previousBufferTextureInternalFormat_ = internalFormat; - init = true; - } - - if (init) { - if (format == GL_NONE) - format = GLenum(internalFormat); - - glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, bufferTextureWidth_, - bufferTextureHeight_, 0, format, GL_UNSIGNED_BYTE, nullptr); - } - - glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, width(), height()); + int h = 16; + int w = 16; + // Todo compare performance with qt code. + while (w < width()) + w <<= 1; + while (h < height()) + h <<= 1; + + bool init = false; + + if ((w != bufferTextureWidth_) || (h != bufferTextureHeight_)) { + bufferTextureWidth_ = w; + bufferTextureHeight_ = h; + bufferTextureMaxU_ = width() / qreal(bufferTextureWidth_); + bufferTextureMaxV_ = height() / qreal(bufferTextureHeight_); + init = true; + } + + if (bufferTextureId() == 0) { + glGenTextures(1, &bufferTextureId_); + glBindTexture(GL_TEXTURE_2D, bufferTextureId_); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + init = true; + } + else + glBindTexture(GL_TEXTURE_2D, bufferTextureId_); + + if ((format != previousBufferTextureFormat_) || + (internalFormat != previousBufferTextureInternalFormat_)) { + previousBufferTextureFormat_ = format; + previousBufferTextureInternalFormat_ = internalFormat; + init = true; + } + + if (init) { + if (format == GL_NONE) + format = GLenum(internalFormat); + + glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, bufferTextureWidth_, + bufferTextureHeight_, 0, format, GL_UNSIGNED_BYTE, nullptr); + } + + glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, width(), height()); } /*! Returns the texture id of the texture created by copyBufferToTexture(). @@ -1368,8 +1378,8 @@ copyBufferToTexture(). Returns \c 0 is copyBufferToTexture() was never called or if the texure was deleted using glDeleteTextures() since then. */ GLuint QGLViewer::bufferTextureId() const { - if (glIsTexture(bufferTextureId_)) - return bufferTextureId_; - else - return 0; + if (glIsTexture(bufferTextureId_)) + return bufferTextureId_; + else + return 0; } diff --git a/Src/Windows/RenderViewer.cpp b/Src/Windows/RenderViewer.cpp index 9712b69..08799d2 100644 --- a/Src/Windows/RenderViewer.cpp +++ b/Src/Windows/RenderViewer.cpp @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "RenderViewer.h" #include "QGLViewer/manipulatedCameraFrame.h" @@ -29,160 +29,177 @@ using namespace acamcad; using namespace qglviewer; RenderViewer::RenderViewer(QWidget* parent, Qt::WindowFlags flags) : - QGLViewer(parent, flags), selectBuffer_(nullptr), draw_model_(DrawModel::RENDERING_MODEL), - dataManager_(nullptr),coreCommand_(nullptr) + QGLViewer(parent, flags), selectBuffer_(nullptr), draw_model_(DrawModel::RENDERING_MODEL), + dataManager_(nullptr), coreCommand_(nullptr) { - work_plane_ = new PlaneObject(); - is_draw_grid_ = false; - is_frame_selection_ = false; - is_pick_move_select_ = false; + work_plane_ = new PlaneObject(); + is_draw_grid_ = true; + is_frame_selection_ = false; + is_pick_move_select_ = false; - o_axis_ = nullptr; + o_axis_ = nullptr; - setSelectBufferSize(2000); - setSelectRegionWidthDefault(); - setSelectRegionHeightDefault(); + setSelectBufferSize(2000); + setSelectRegionWidthDefault(); + setSelectRegionHeightDefault(); - setSelectModel(SelectModel::OBJECT_MODEL); - setOperateType(OperationType::NO_OPERATION); + setSelectModel(SelectModel::OBJECT_MODEL); + setOperateType(OperationType::NO_OPERATION); - selectTool_ = new SelectTool(); + selectTool_ = new SelectTool(); - dialog = new ParamDialog(parent); - // TODO: connect - connect(dialog, &ParamDialog::finished, this, &RenderViewer::disconnectDialog); - // Possibly a bug in Qt5 MSVC, which prevents the "new" style connect() from working. - //connect(this, &RenderViewer::selectedModelChanged, this, &RenderViewer::selectCheckChanged); - connect(this, SIGNAL(selectedModelChanged()), this, SLOT(selectCheckChanged())); - - initBRep(); + dialog = new ParamDialog(parent); + // TODO: connect + connect(dialog, &ParamDialog::finished, this, &RenderViewer::disconnectDialog); + // Possibly a bug in Qt5 MSVC, which prevents the "new" style connect() from working. + //connect(this, &RenderViewer::selectedModelChanged, this, &RenderViewer::selectCheckChanged); + connect(this, SIGNAL(selectedModelChanged()), this, SLOT(selectCheckChanged())); + + + glu_cylinder_ = gluNewQuadric(); + + initBRep(); + initMesh(); + initTSpline(); +} + +RenderViewer::~RenderViewer() +{ + gluDeleteQuadric(glu_cylinder_); } // it will use in glInit; -void RenderViewer::init() +void RenderViewer::init() { - glEnable(GL_LIGHT1); - glEnable(GL_LIGHT2); - glEnable(GL_LIGHT3); - const GLfloat light_ambient[4] = { 0.4, 0.4, 0.4, 1.0 }; - const GLfloat light_specular[4] = { 1.0, 1.0, 1.0, 1.0 }; - const GLfloat light_diffuse[4] = { 1.0, 1.0, 1.0, 1.0 }; - - glLightfv(GL_LIGHT1, GL_AMBIENT, light_ambient); - //glLightfv(GL_LIGHT1, GL_SPECULAR, light_specular); - //glLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse); - - glLightfv(GL_LIGHT2, GL_AMBIENT, light_ambient); - //glLightfv(GL_LIGHT2, GL_SPECULAR, light_specular); - //glLightfv(GL_LIGHT2, GL_DIFFUSE, light_diffuse); - - glLightfv(GL_LIGHT3, GL_AMBIENT, light_ambient); - //glLightfv(GL_LIGHT2, GL_SPECULAR, light_specular); - //glLightfv(GL_LIGHT2, GL_DIFFUSE, light_diffuse); - - //P1 = (-0.5, -sqrt(3)/6, -sqrt(6)/12); - //P1 = (0.5, -sqrt(3)/6, -sqrt(6)/12); - //P1 = (0, sqrt(3)/3, -sqrt(6)/12); - //P1 = (0 0, sqrt(6)/4); + glEnable(GL_LIGHT1); + glEnable(GL_LIGHT2); + glEnable(GL_LIGHT3); + const GLfloat light_ambient[4] = { 0.4, 0.4, 0.4, 1.0 }; + const GLfloat light_specular[4] = { 1.0, 1.0, 1.0, 1.0 }; + const GLfloat light_diffuse[4] = { 1.0, 1.0, 1.0, 1.0 }; + + glLightfv(GL_LIGHT1, GL_AMBIENT, light_ambient); + //glLightfv(GL_LIGHT1, GL_SPECULAR, light_specular); + //glLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse); + + glLightfv(GL_LIGHT2, GL_AMBIENT, light_ambient); + //glLightfv(GL_LIGHT2, GL_SPECULAR, light_specular); + //glLightfv(GL_LIGHT2, GL_DIFFUSE, light_diffuse); + + glLightfv(GL_LIGHT3, GL_AMBIENT, light_ambient); + //glLightfv(GL_LIGHT2, GL_SPECULAR, light_specular); + //glLightfv(GL_LIGHT2, GL_DIFFUSE, light_diffuse); + + //P1 = (-0.5, -sqrt(3)/6, -sqrt(6)/12); + //P1 = (0.5, -sqrt(3)/6, -sqrt(6)/12); + //P1 = (0, sqrt(3)/3, -sqrt(6)/12); + //P1 = (0 0, sqrt(6)/4); // help(); } -void RenderViewer::draw() +void RenderViewer::draw() { - qglviewer::Vec c = camera()->sceneCenter(); - double r = camera()->sceneRadius(); - float pos0[4] = { float(c.X()), float(c.Y()), float(c.Z() + 0.6*r), 1.0 }; - glLightfv(GL_LIGHT1, GL_POSITION, pos0); - float pos1[4] = { float(c.X() - 0.5 * r), float(c.Y() - 0.3 * r), float(c.Z() - 0.2 * r), 1.0 }; - glLightfv(GL_LIGHT1, GL_POSITION, pos1); - float pos2[4] = { float(c.X() + 0.5 * r), float(c.Y() - 0.3 * r), float(c.Z() - 0.2 * r), 1.0 }; - glLightfv(GL_LIGHT2, GL_POSITION, pos2); - float pos3[4] = { float(c.X()), float(c.Y() + 0.6 * r), float(c.Z() -0.2 * r), 1.0 }; - glLightfv(GL_LIGHT2, GL_POSITION, pos3); - - QPoint pixel(width() / 2, height() / 2); - camera()->convertClickToLine(pixel, view_ori_, view_dir_); - for (ObjectIter o_it = dataManager_->objects_begin(); o_it != dataManager_->objects_end(); ++o_it) - { - BaseObject* object = *o_it; - ObjectDraw* objectdraw = const_cast(object->getDrawTool()); - objectdraw->setCameraInfo(view_ori_, view_dir_); - objectdraw->draw(draw_model_, select_model_); - } - - drawSelectedElement(); - - drawSelectMovePoint(); - - if (select_model_ == SelectModel::CLICK_MODEL && !click_info_list_.empty()) - { - drawClickedElement(); - } - - if (is_frame_selection_) - { - drawSelectionRectangle(frame_selection_rectangle_); - } + qglviewer::Vec c = camera()->sceneCenter(); + double r = camera()->sceneRadius(); + float pos0[4] = { float(c.X()), float(c.Y()), float(c.Z() + 0.6 * r), 1.0 }; + glLightfv(GL_LIGHT1, GL_POSITION, pos0); + float pos1[4] = { float(c.X() - 0.5 * r), float(c.Y() - 0.3 * r), float(c.Z() - 0.2 * r), 1.0 }; + glLightfv(GL_LIGHT1, GL_POSITION, pos1); + float pos2[4] = { float(c.X() + 0.5 * r), float(c.Y() - 0.3 * r), float(c.Z() - 0.2 * r), 1.0 }; + glLightfv(GL_LIGHT2, GL_POSITION, pos2); + float pos3[4] = { float(c.X()), float(c.Y() + 0.6 * r), float(c.Z() - 0.2 * r), 1.0 }; + glLightfv(GL_LIGHT2, GL_POSITION, pos3); + + QPoint pixel(width() / 2, height() / 2); + camera()->convertClickToLine(pixel, view_ori_, view_dir_); + for (ObjectIter o_it = dataManager_->objects_begin(); o_it != dataManager_->objects_end(); ++o_it) + { + BaseObject* object = *o_it; + ObjectDraw* objectdraw = const_cast(object->getDrawTool()); + objectdraw->setCameraInfo(view_ori_, view_dir_); + objectdraw->draw(draw_model_, select_model_); + } + + drawSelectedElement(); + + drawSelectMovePoint(); + + if (select_model_ == SelectModel::CLICK_MODEL && !click_info_list_.empty()) + { + drawClickedElement(); + } + + if (is_frame_selection_) + { + drawSelectionRectangle(frame_selection_rectangle_); + } + + //drawAxis(); } /*! Called after draw() to draw viewer visual hints. */ void RenderViewer::postDraw() { - // Reset model view matrix to world coordinates origin - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - camera()->loadModelViewMatrix(); - // TODO restore model loadProjectionMatrixStereo - - // Save OpenGL state - glPushAttrib(GL_ALL_ATTRIB_BITS); - - // Set neutral GL state - glDisable(GL_TEXTURE_1D); - glDisable(GL_TEXTURE_2D); + // Reset model view matrix to world coordinates origin + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + camera()->loadModelViewMatrix(); + // TODO restore model loadProjectionMatrixStereo + + // Save OpenGL state + glPushAttrib(GL_ALL_ATTRIB_BITS); + + // Set neutral GL state + glDisable(GL_TEXTURE_1D); + glDisable(GL_TEXTURE_2D); #ifdef GL_TEXTURE_3D // OpenGL 1.2 Only... - glDisable(GL_TEXTURE_3D); + glDisable(GL_TEXTURE_3D); #endif - glDisable(GL_TEXTURE_GEN_Q); - glDisable(GL_TEXTURE_GEN_R); - glDisable(GL_TEXTURE_GEN_S); - glDisable(GL_TEXTURE_GEN_T); + glDisable(GL_TEXTURE_GEN_Q); + glDisable(GL_TEXTURE_GEN_R); + glDisable(GL_TEXTURE_GEN_S); + glDisable(GL_TEXTURE_GEN_T); #ifdef GL_RESCALE_NORMAL // OpenGL 1.2 Only... - glEnable(GL_RESCALE_NORMAL); + glEnable(GL_RESCALE_NORMAL); #endif - glDisable(GL_COLOR_MATERIAL); - glColor4f(foregroundColor().redF(), foregroundColor().greenF(), - foregroundColor().blueF(), foregroundColor().alphaF()); + glDisable(GL_COLOR_MATERIAL); + glColor4f(foregroundColor().redF(), foregroundColor().greenF(), + foregroundColor().blueF(), foregroundColor().alphaF()); + + if (is_draw_grid_) + { + drawWorkPlaneGrid(); + } - if (is_draw_grid_) - { - drawWorkPlaneGrid(); - } + //drawWorldAxis(); - drawWorldAxis(); - // Restore foregroundColor - float color[4]; - color[0] = foregroundColor().red() / 255.0f; - color[1] = foregroundColor().green() / 255.0f; - color[2] = foregroundColor().blue() / 255.0f; - color[3] = 1.0f; - glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color); - glDisable(GL_LIGHTING); - glDisable(GL_DEPTH_TEST); + // Restore foregroundColor + float color[4]; + color[0] = foregroundColor().red() / 255.0f; + color[1] = foregroundColor().green() / 255.0f; + color[2] = foregroundColor().blue() / 255.0f; + color[3] = 1.0f; + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color); + glDisable(GL_LIGHTING); + glDisable(GL_DEPTH_TEST); - // Restore GL state - glPopAttrib(); - glPopMatrix(); + + + // Restore GL state + glPopAttrib(); + glPopMatrix(); + + drawAxis(); } QString RenderViewer::helpString() const { - QString text("

S e l e c t

"); - text += " Liuhao test "; - return text; + QString text("

S e l e c t

"); + text += " Liuhao test "; + return text; } //========================================================== @@ -191,685 +208,719 @@ QString RenderViewer::helpString() const { void RenderViewer::mousePressEvent(QMouseEvent* e) { - pressPos_ = e->pos(); prevPos_ = e->pos(); - click_buttom = e->button(); - - if (draw_model_ == DrawModel::SHADING_MODEL && e->button() == Qt::LeftButton && select_model_ != SelectModel::OBJECT_MODEL) - return; - - bool is_select = false; - - bool ctrl_left = (e->modifiers() == Qt::ControlModifier) && (e->button() == Qt::LeftButton); - bool alt_left = (e->modifiers() == Qt::AltModifier) && (e->button() == Qt::LeftButton); - if (ctrl_left && - (operate_type_ == OperationType::NO_OPERATION || operate_type_ == OperationType::CTRL_OPERATION)) - { - if (select_info_list_.empty()) - { - select(e, false); - } - - if (select_info_list_.size() > 0) - { - if (select_model_ == SelectModel::FACE_MODEL) - { - coreCommand_->setMeshOperationType(MeshOperationType::MeshExtrudeFace); - } - else if (select_model_ == SelectModel::EDGE_MODEL) - { - if (coreCommand_->getMeshOperationType() == MeshOperationType::NO_operotion) - coreCommand_->setMeshOperationType(MeshOperationType::MeshExtrudeEdgeHorizontal); - } - setOperateType(OperationType::CTRL_OPERATION); - - coreCommand_->OperateSelectedObject_Subset_Extrude(select_model_, select_info_list_, operation_vector_); - } - return; - } - - if (alt_left && - (operate_type_ == OperationType::NO_OPERATION || operate_type_ == OperationType::ALT_OPERATION)) - { - if (select_info_list_.empty()) - { - select(e, false); - - if (select_info_list_.size() > 0) - { - - } - } - - return; - } - - bool no_left = (e->modifiers() == Qt::NoModifier) && (e->button() == Qt::LeftButton); - bool shift_left = (e->modifiers() == Qt::ShiftModifier) && (e->button() == Qt::LeftButton); - switch (operate_type_) - { - case acamcad::OperationType::MOVE_OPERATION: //process the move with axis - case acamcad::OperationType::ROTATE_OPERATION: //process the rotation with axis - case acamcad::OperationType::SCALE_OPERATION: //process the scale with axis - if (no_left) - { - is_select = selectOpAxis(e); - if (is_select) - { - coreCommand_->beginOperationByAxis(select_info_list_, select_model_); - } - } - if (ctrl_left) - selectOpAxis(e); //move the axis - break; - case acamcad::OperationType::NO_OPERATION: //process the windows select operation - if (no_left) - is_select = select(e, false); - else if (shift_left) - is_select = select(e, true); - - //if not select any object, this is select_frame - if (no_left && !is_select) - { - setFrameSelection(true); - frame_selection_rectangle_ = QRect(e->pos(), e->pos()); - } - - coreCommand_->beginOperationByAxis(select_info_list_, select_model_); - - update(); - break; - case acamcad::OperationType::ENTER_OPERATION: - if (no_left || shift_left) - select(e, true); - - update(); - break; - case acamcad::OperationType::CTRL_OPERATION: - if (no_left || shift_left) - select(e, true); - - update(); - break; - case acamcad::OperationType::PICK_OPERATION_SINGLE: - if (no_left) - { - select(e, false); - beginPickOperationSingle(); - } - break; - case acamcad::OperationType::PICK_OPERATION_MOVE: - if (no_left) - { - if (select(e, false)) - { - is_pick_move_select_ = true; - - SelectInfoWithCamera s_info = select_info_list_[0]; - setSelectInfoCamera(e->pos(), s_info); - operation_point_.resize(1); - } - } - else if (e->button() == Qt::RightButton) //取消之前的选择 - { - is_pick_move_select_ = false; - operation_point_.clear(); - cancelOperation(); - update(); - } - break; - case acamcad::OperationType::PICK_OPERATION_MOVE_MULTI: - //TODO - break; - case acamcad::OperationType::CLICK_OPERATION: - if (no_left) { - click(e); - } - else if (e->button() == Qt::RightButton){ - clearClicked(); - } - break; - case acamcad::OperationType::CLICK_OPERATION_SELECT: - if (no_left) - { - setSelectModel(SelectModel::VERTEX_MODEL); - if (select(e, true)) - { - size_t s_end = select_info_list_.size() - 1; - const AMCAX::Coord3& v = coreCommand_->getSelectedObject_Center(select_info_list_[s_end], select_model_); - ClickInfo c_info; c_info.point_ = v; - click_info_list_.push_back(c_info); - } - else - { - setSelectModel(SelectModel::CLICK_MODEL); - click(e); - } - setSelectModel(SelectModel::CLICK_MODEL); - } - else if (e->button() == Qt::RightButton) { - clearSelected(); - clearClicked(); - } - std::cout << "select_info_list_.size()" << select_info_list_.size() << std::endl; - break; - default: - break; - } - - if(e->button() == Qt::RightButton) - QGLViewer::mousePressEvent(e); + pressPos_ = e->pos(); prevPos_ = e->pos(); + click_buttom = e->button(); + + if (draw_model_ == DrawModel::SHADING_MODEL && e->button() == Qt::LeftButton && select_model_ != SelectModel::OBJECT_MODEL) + return; + + dataManager_->clearModify(); + + bool is_select = false; + + bool ctrl_left = (e->modifiers() == Qt::ControlModifier) && (e->button() == Qt::LeftButton); + bool alt_left = (e->modifiers() == Qt::AltModifier) && (e->button() == Qt::LeftButton); + if (ctrl_left && + (operate_type_ == OperationType::NO_OPERATION || operate_type_ == OperationType::CTRL_OPERATION)) + { + if (select_info_list_.empty()) + { + select(e, false); + } + + if (select_info_list_.size() > 0) + { + if (select_model_ == SelectModel::FACE_MODEL) + { + coreCommand_->setMeshOperationType(MeshOperationType::MeshExtrudeFaceNew); + } + else if (select_model_ == SelectModel::EDGE_MODEL) + { + if (coreCommand_->getMeshOperationType() == MeshOperationType::NO_operotion) + coreCommand_->setMeshOperationType(MeshOperationType::MeshExtrudeEdgeHorizontal); + } + setOperateType(OperationType::CTRL_OPERATION); + + coreCommand_->OperateSelectedObject_Subset_Extrude(select_model_, select_info_list_, operation_vector_); + } + return; + } + + if (alt_left && + (operate_type_ == OperationType::NO_OPERATION || operate_type_ == OperationType::ALT_OPERATION)) + { + if (select_info_list_.empty()) + { + select(e, false); + + //if (select_info_list_.size() > 0) + //{ + + //} + } + + return; + } + + bool no_left = (e->modifiers() == Qt::NoModifier) && (e->button() == Qt::LeftButton); + bool shift_left = (e->modifiers() == Qt::ShiftModifier) && (e->button() == Qt::LeftButton); + switch (operate_type_) + { + case acamcad::OperationType::MOVE_OPERATION: //process the move with axis + case acamcad::OperationType::ROTATE_OPERATION: //process the rotation with axis + case acamcad::OperationType::SCALE_OPERATION: //process the scale with axis + if (no_left) + { + is_select = selectOpAxis(e); + if (is_select) + { + coreCommand_->beginOperationByAxis(select_info_list_, select_model_); + } + } + if (ctrl_left) + selectOpAxis(e); //move the axis + break; + case acamcad::OperationType::NO_OPERATION: //process the windows select operation + + if (no_left) + is_select = select(e, false); + else if (shift_left) + is_select = select(e, true); + + //if not select any object, this is select_frame + if (no_left && !is_select) + { + setFrameSelection(true); + frame_selection_rectangle_ = QRect(e->pos(), e->pos()); + } + + coreCommand_->beginOperationByAxis(select_info_list_, select_model_); + + update(); + break; + case acamcad::OperationType::ENTER_OPERATION: + if (no_left || shift_left) + select(e, true); + + update(); + break; + case acamcad::OperationType::CTRL_OPERATION: + if (no_left || shift_left) + select(e, true); + + update(); + break; + case acamcad::OperationType::PICK_OPERATION_SINGLE: + if (no_left) + { + select(e, false); + beginPickOperationSingle(); + } + break; + case acamcad::OperationType::PICK_OPERATION_MOVE: + if (no_left) + { + if (select(e, false)) + { + is_pick_move_select_ = true; + + SelectInfoWithCamera s_info = select_info_list_[0]; + setSelectInfoCamera(e->pos(), s_info); + operation_point_.resize(1); + coreCommand_->getSelectedObject_Element_closet(s_info, select_model_, operation_point_[0]); + } + } + else if (e->button() == Qt::RightButton) //取消之前的选择 + { + is_pick_move_select_ = false; + operation_point_.clear(); + cancelOperation(); + update(); + } + break; + case acamcad::OperationType::PICK_OPERATION_MOVE_MULTI: + //TODO + if (no_left) + { + if (select(e, true)) + { + is_pick_move_select_ = true; + + SelectInfoWithCamera s_info = select_info_list_.back(); + setSelectInfoCamera(e->pos(), s_info); + AMCAX::Coord3 point; + coreCommand_->getSelectedObject_Element_closet(s_info, select_model_, point); + operation_point_.push_back(point); + } + } + else if (e->button() == Qt::RightButton) + { + is_pick_move_select_ = false; + operation_point_.clear(); + cancelOperation(); + update(); + } + break; + case acamcad::OperationType::CLICK_OPERATION: + if (no_left) { + click(e); + } + else if (e->button() == Qt::RightButton) { + clearClicked(); + } + break; + case acamcad::OperationType::CLICK_OPERATION_SELECT: + if (no_left) + { + setSelectModel(SelectModel::VERTEX_MODEL); + if (select(e, true)) + { + size_t s_end = select_info_list_.size() - 1; + const AMCAX::Coord3& v = coreCommand_->getSelectedObject_Center(select_info_list_[s_end], select_model_); + ClickInfo c_info; c_info.point_ = v; + click_info_list_.push_back(c_info); + } + else + { + setSelectModel(SelectModel::CLICK_MODEL); + click(e); + } + setSelectModel(SelectModel::CLICK_MODEL); + } + else if (e->button() == Qt::RightButton) { + clearSelected(); + clearClicked(); + } + std::cout << "select_info_list_.size()" << select_info_list_.size() << std::endl; + break; + default: + break; + } + + if (e->button() == Qt::RightButton) + QGLViewer::mousePressEvent(e); } void RenderViewer::mouseMoveEvent(QMouseEvent* e) { - // std::cout << e->button() << std::endl; 这个始终是0 - // std::cout << e->modifiers() << std::endl; 这个会根据按键不同有不同的值 - - if(click_buttom == Qt::LeftButton) - { - const QPoint e_point = e->pos(); - /* 处理挤出的鼠标移动 */ - if (operate_type_ == OperationType::CTRL_OPERATION && e->modifiers() == Qt::ControlModifier) - { - if (!select_info_list_.empty()) - { - AMCAX::Coord3 oCenter = select_object_center_; - AMCAX::Coord3 sp_tr = mouseMoveTrans(e_point, oCenter); - double len = sp_tr.Norm(); - operation_vector_.Normalize(); sp_tr.Normalize(); - - if (operation_vector_.Dot(sp_tr) < 0) - len = -len; - AMCAX::Coord3 tr = len * operation_vector_; - - if (select_model_ == SelectModel::EDGE_MODEL || select_model_ == SelectModel::FACE_MODEL) - { - double len = tr.Norm(); - coreCommand_->moveSelectedObject(select_info_list_, select_model_, tr.Normalized(), len); - - //if (select_info_list_.size() == 1) - // coreCommand_->moveSelectedObject_Element(tr, select_info_list_[0], select_model_); - //else if (select_info_list_.size() > 1) - // coreCommand_->moveSelectedObject_Element(tr, select_info_list_, select_model_); - - update(); - } - } - } - if (operate_type_ == OperationType::ALT_OPERATION && e->modifiers() == Qt::AltModifier) - { - if (!select_info_list_.empty()) - { - AMCAX::Coord3d oCenter = select_object_center_; - AMCAX::Coord3d sp_tr = mouseMoveTrans(e_point, oCenter); - double len = sp_tr.Norm(); - operation_vector_ = AMCAX::Coord3d(0.0, 0.0, 1.0); sp_tr.Normalize(); - - if (operation_vector_.Dot(sp_tr) < 0) - len = -len; - - if (select_model_ == SelectModel::FACE_MODEL) - { - update(); - } - } - } - /* 处理框选的鼠标移动 */ - else if (is_frame_selection_ && e->modifiers() == Qt::NoModifier) - { - frame_selection_rectangle_.setBottomRight(e->pos()); - update(); - } - /* 处理点击后立刻移动物体 */ - else if (operate_type_ == OperationType::NO_OPERATION && e->modifiers() == Qt::NoModifier) - { - if (!select_info_list_.empty()) - { - AMCAX::Coord3 oCenter = select_object_center_; - AMCAX::Coord3 tr = mouseMoveTrans(e_point, oCenter); - double len = tr.Norm(); - - if (select_model_ == SelectModel::OBJECT_MODEL || select_model_ == SelectModel::VERTEX_MODEL - || select_model_ == SelectModel::EDGE_MODEL || select_model_ == SelectModel::FACE_MODEL) - { - coreCommand_->moveSelectedObject(select_info_list_, select_model_, tr.Normalized(), len); - } - - std::vector select_object_id = getSelectObjectList(select_info_list_); - for (int i : select_object_id) - { - record.recordMove(i, tr); - } - - update(); - } - } - /* 处理操作轴引起的移动 */ - else if (operate_type_ == OperationType::MOVE_OPERATION && e->modifiers() == Qt::NoModifier) - { - if (!select_info_list_.empty() && o_axis_ != nullptr && o_axis_->selectPart() > -1) - { - AMCAX::Coord3d oCenter = o_axis_->center(); - AMCAX::Coord3d sp_tr = mouseMoveTrans(e_point, oCenter); - double len = sp_tr.Norm(); sp_tr.Normalize(); - - AMCAX::Coord3d tr = o_axis_->operateMovePart(sp_tr, len); - - if (select_model_ == SelectModel::OBJECT_MODEL || select_model_ == SelectModel::VERTEX_MODEL - || select_model_ == SelectModel::EDGE_MODEL || select_model_ == SelectModel::FACE_MODEL) - { - coreCommand_->moveSelectedObject(select_info_list_, select_model_, tr.Normalized(), len); - } - - o_axis_->setCenter(oCenter + tr); - update(); - } - } - /* 处理操作轴的缩放 */ - else if (operate_type_ == OperationType::SCALE_OPERATION && e->modifiers() == Qt::NoModifier) - { - if (!select_info_list_.empty() && o_axis_ != nullptr && o_axis_->selectPart() > 0) - { - AMCAX::Coord3d oCenter = o_axis_->center(); - AMCAX::Coord3d sp_tr = mouseMoveTrans(e_point, oCenter); - double len = sp_tr.Norm(); sp_tr.Normalize(); - AMCAX::Coord3d s_arix = o_axis_->operateScalePart(sp_tr, len); - double scale = o_axis_->operateScalePart_scale(); - - if (select_model_ == SelectModel::OBJECT_MODEL || select_model_ == SelectModel::VERTEX_MODEL - || select_model_ == SelectModel::EDGE_MODEL || select_model_ == SelectModel::FACE_MODEL) - { - if (o_axis_->selectPart() == 1 || o_axis_->selectPart() == 2 || o_axis_->selectPart() == 3) - { - coreCommand_->scaleSelectedObject(select_info_list_, - select_model_, - oCenter, s_arix, scale); - } - else if (o_axis_->selectPart() == 4 || o_axis_->selectPart() == 5 || o_axis_->selectPart() == 6) - { - coreCommand_->scaleSelectedObject(select_info_list_, - select_model_, - oCenter, s_arix, scale, 1); - } - } - update(); - } - } - /* 处理操作轴的旋转 */ - else if (operate_type_ == OperationType::ROTATE_OPERATION && e->modifiers() == Qt::NoModifier) - { - if (!select_info_list_.empty() && o_axis_ != nullptr && o_axis_->selectPart() > 0) - { - AMCAX::Coord3 oCenter = o_axis_->center(); - Vec c(oCenter[0], oCenter[1], oCenter[2]); - Vec sc = camera()->projectedCoordinatesOf(c); - - qreal px = (prevPos_.x() - sc.X()) / camera()->screenWidth(); - qreal py = (sc.Y() - prevPos_.y()) / camera()->screenHeight(); - qreal dx = (e_point.x() - sc.X()) / camera()->screenWidth(); - qreal dy = (sc.Y() - e_point.y()) / camera()->screenHeight(); - - double u = (px - dy + py - dx); u = u / std::abs(u); - - const Vec p1(px, py, 1.0); - const Vec p2(dx, dy, 1.0); - const Vec axis = MathUtils::cross(p2, p1); - const Vec axisn = axis / axis.Norm(); - AMCAX::Coord3 s_arix = o_axis_->operateRotation(u); - - const qreal angle = 5.0 * u * asin(std::sqrt(axis.SquaredNorm() / p1.SquaredNorm() / p2.SquaredNorm())); - - if (select_model_ == SelectModel::OBJECT_MODEL || select_model_ == SelectModel::VERTEX_MODEL - || select_model_ == SelectModel::EDGE_MODEL || select_model_ == SelectModel::FACE_MODEL) - { - coreCommand_->rotateSelectedObject(select_info_list_, - select_model_, - oCenter, s_arix, angle); - } - update(); - } - } - - if ((operate_type_ == OperationType::MOVE_OPERATION || operate_type_ == OperationType::SCALE_OPERATION - || operate_type_ == OperationType::ROTATE_OPERATION) && e->modifiers() == Qt::ControlModifier) - { - if (!select_info_list_.empty() && o_axis_ != nullptr && o_axis_->selectPart() == 0) - { - AMCAX::Coord3 oCenter = o_axis_->center(); - AMCAX::Coord3 sp_tr = mouseMoveTrans(e_point, oCenter); - double len = sp_tr.Norm(); sp_tr.Normalize(); - AMCAX::Coord3 tr = o_axis_->operateMovePart(sp_tr, len); - o_axis_->setCenter(oCenter + tr); - update(); - } - } - - /* 处理移动后操作的鼠标移动,例如split等,让点在边上移动 */ - if (operate_type_ == OperationType::PICK_OPERATION_MOVE && is_pick_move_select_) - { - SelectInfoWithCamera s_info = select_info_list_[0]; - setSelectInfoCamera(e->pos(), s_info); - - update(); - } - else if (operate_type_ == OperationType::PICK_OPERATION_MOVE_MULTI && is_pick_move_select_) - { - SelectInfoWithCamera s_info = select_info_list_.back(); - setSelectInfoCamera(e->pos(), s_info); - - update(); - } - } - - prevPos_ = e->pos(); - - QGLViewer::mouseMoveEvent(e); + // std::cout << e->button() << std::endl; 这个始终是0 + // std::cout << e->modifiers() << std::endl; 这个会根据按键不同有不同的值 + + if (click_buttom == Qt::LeftButton) + { + const QPoint e_point = e->pos(); + /* 处理挤出的鼠标移动 */ + if (operate_type_ == OperationType::CTRL_OPERATION && e->modifiers() == Qt::ControlModifier) + { + if (!select_info_list_.empty()) + { + AMCAX::Coord3 oCenter = select_object_center_; + AMCAX::Coord3 sp_tr = mouseMoveTrans(e_point, oCenter); + double len = sp_tr.Norm(); + operation_vector_.Normalize(); sp_tr.Normalize(); + + if (operation_vector_.Dot(sp_tr) < 0) + len = -len; + AMCAX::Coord3 tr = len * operation_vector_; + + if (select_model_ == SelectModel::EDGE_MODEL || select_model_ == SelectModel::FACE_MODEL) + { + double len = tr.Norm(); + coreCommand_->moveSelectedObject(select_info_list_, select_model_, tr.Normalized(), len); + + //if (select_info_list_.size() == 1) + // coreCommand_->moveSelectedObject_Element(tr, select_info_list_[0], select_model_); + //else if (select_info_list_.size() > 1) + // coreCommand_->moveSelectedObject_Element(tr, select_info_list_, select_model_); + + update(); + } + } + } + if (operate_type_ == OperationType::ALT_OPERATION && e->modifiers() == Qt::AltModifier) + { + if (!select_info_list_.empty()) + { + AMCAX::Coord3d oCenter = select_object_center_; + AMCAX::Coord3d sp_tr = mouseMoveTrans(e_point, oCenter); + double len = sp_tr.Norm(); + operation_vector_ = AMCAX::Coord3d(0.0, 0.0, 1.0); sp_tr.Normalize(); + + if (operation_vector_.Dot(sp_tr) < 0) + len = -len; + + if (select_model_ == SelectModel::FACE_MODEL) + { + update(); + } + } + } + /* 处理框选的鼠标移动 */ + else if (is_frame_selection_ && e->modifiers() == Qt::NoModifier) + { + frame_selection_rectangle_.setBottomRight(e->pos()); + update(); + } + /* 处理点击后立刻移动物体 */ + else if (operate_type_ == OperationType::NO_OPERATION && e->modifiers() == Qt::NoModifier) + { + if (!select_info_list_.empty()) + { + AMCAX::Coord3 oCenter = select_object_center_; + AMCAX::Coord3 tr = mouseMoveTrans(e_point, oCenter); + double len = tr.Norm(); + + if (select_model_ == SelectModel::OBJECT_MODEL || select_model_ == SelectModel::VERTEX_MODEL + || select_model_ == SelectModel::EDGE_MODEL || select_model_ == SelectModel::FACE_MODEL) + { + coreCommand_->moveSelectedObject(select_info_list_, select_model_, tr.Normalized(), len); + } + + //std::vector select_object_id = getSelectObjectList(select_info_list_); + //for (int i : select_object_id) + //{ + // record.recordMove(i, tr); + //} + + update(); + } + } + /* 处理操作轴引起的移动 */ + else if (operate_type_ == OperationType::MOVE_OPERATION && e->modifiers() == Qt::NoModifier) + { + if (!select_info_list_.empty() && o_axis_ != nullptr && o_axis_->selectPart() > -1) + { + AMCAX::Coord3d oCenter = o_axis_->center(); + AMCAX::Coord3d sp_tr = mouseMoveTrans(e_point, oCenter); + double len = sp_tr.Norm(); sp_tr.Normalize(); + + AMCAX::Coord3d tr = o_axis_->operateMovePart(sp_tr, len); + + if (select_model_ == SelectModel::OBJECT_MODEL || select_model_ == SelectModel::VERTEX_MODEL + || select_model_ == SelectModel::EDGE_MODEL || select_model_ == SelectModel::FACE_MODEL) + { + coreCommand_->moveSelectedObject(select_info_list_, select_model_, tr.Normalized(), len); + } + + o_axis_->setCenter(oCenter + tr); + update(); + } + } + /* 处理操作轴的缩放 */ + else if (operate_type_ == OperationType::SCALE_OPERATION && e->modifiers() == Qt::NoModifier) + { + if (!select_info_list_.empty() && o_axis_ != nullptr && o_axis_->selectPart() > 0) + { + AMCAX::Coord3d oCenter = o_axis_->center(); + AMCAX::Coord3d sp_tr = mouseMoveTrans(e_point, oCenter); + double len = sp_tr.Norm(); sp_tr.Normalize(); + AMCAX::Coord3d s_arix = o_axis_->operateScalePart(sp_tr, len); + double scale = o_axis_->operateScalePart_scale(); + + if (select_model_ == SelectModel::OBJECT_MODEL || select_model_ == SelectModel::VERTEX_MODEL + || select_model_ == SelectModel::EDGE_MODEL || select_model_ == SelectModel::FACE_MODEL) + { + if (o_axis_->selectPart() == 1 || o_axis_->selectPart() == 2 || o_axis_->selectPart() == 3) + { + coreCommand_->scaleSelectedObject(select_info_list_, + select_model_, + oCenter, s_arix, scale); + } + else if (o_axis_->selectPart() == 4 || o_axis_->selectPart() == 5 || o_axis_->selectPart() == 6) + { + coreCommand_->scaleSelectedObject(select_info_list_, + select_model_, + oCenter, s_arix, scale, 1); + } + } + update(); + } + } + /* 处理操作轴的旋转 */ + else if (operate_type_ == OperationType::ROTATE_OPERATION && e->modifiers() == Qt::NoModifier) + { + if (!select_info_list_.empty() && o_axis_ != nullptr && o_axis_->selectPart() > 0) + { + AMCAX::Coord3 oCenter = o_axis_->center(); + Vec c(oCenter[0], oCenter[1], oCenter[2]); + Vec sc = camera()->projectedCoordinatesOf(c); + + qreal px = (prevPos_.x() - sc.X()) / camera()->screenWidth(); + qreal py = (sc.Y() - prevPos_.y()) / camera()->screenHeight(); + qreal dx = (e_point.x() - sc.X()) / camera()->screenWidth(); + qreal dy = (sc.Y() - e_point.y()) / camera()->screenHeight(); + + double u = (px - dy + py - dx) >= 0 ? 1 : -1; + + const Vec p1(px, py, 1.0); + const Vec p2(dx, dy, 1.0); + const Vec axis = MathUtils::cross(p2, p1); + const Vec axisn = axis / axis.Norm(); + AMCAX::Coord3 s_arix = o_axis_->operateRotation(u); + + const qreal angle = 5.0 * u * asin(std::sqrt(axis.SquaredNorm() / p1.SquaredNorm() / p2.SquaredNorm())); + + if (select_model_ == SelectModel::OBJECT_MODEL || select_model_ == SelectModel::VERTEX_MODEL + || select_model_ == SelectModel::EDGE_MODEL || select_model_ == SelectModel::FACE_MODEL) + { + coreCommand_->rotateSelectedObject(select_info_list_, + select_model_, + oCenter, s_arix, angle); + } + update(); + } + } + + if ((operate_type_ == OperationType::MOVE_OPERATION || operate_type_ == OperationType::SCALE_OPERATION + || operate_type_ == OperationType::ROTATE_OPERATION) && e->modifiers() == Qt::ControlModifier) + { + if (!select_info_list_.empty() && o_axis_ != nullptr && o_axis_->selectPart() == 0) + { + AMCAX::Coord3 oCenter = o_axis_->center(); + AMCAX::Coord3 sp_tr = mouseMoveTrans(e_point, oCenter); + double len = sp_tr.Norm(); sp_tr.Normalize(); + AMCAX::Coord3 tr = o_axis_->operateMovePart(sp_tr, len); + o_axis_->setCenter(oCenter + tr); + update(); + } + } + + /* 处理移动后操作的鼠标移动,例如split等,让点在边上移动 */ + if (operate_type_ == OperationType::PICK_OPERATION_MOVE && is_pick_move_select_) + { + SelectInfoWithCamera s_info = select_info_list_[0]; + setSelectInfoCamera(e->pos(), s_info); + coreCommand_->getSelectedObject_Element_closet(s_info, select_model_, operation_point_[0]); + + update(); + } + else if (operate_type_ == OperationType::PICK_OPERATION_MOVE_MULTI && is_pick_move_select_) + { + SelectInfoWithCamera s_info = select_info_list_.back(); + setSelectInfoCamera(e->pos(), s_info); + coreCommand_->getSelectedObject_Element_closet(s_info, select_model_, operation_point_.back()); + + update(); + } + + } + + prevPos_ = e->pos(); + + QGLViewer::mouseMoveEvent(e); } std::vector getSelectObjectList(const std::vector& s_info_list) { - std::set s_id_list; - for (int i = 0; i < s_info_list.size(); i++) - { - s_id_list.insert(s_info_list[i].object_id_); - } - std::vector so_id_list(s_id_list.begin(), s_id_list.end()); - return so_id_list; + std::set s_id_list; + for (int i = 0; i < s_info_list.size(); i++) + { + s_id_list.insert(s_info_list[i].object_id_); + } + std::vector so_id_list(s_id_list.begin(), s_id_list.end()); + return so_id_list; } void RenderViewer::mouseReleaseEvent(QMouseEvent* e) { - if (is_frame_selection_) - { - is_frame_selection_ = false; - frame_selection_rectangle_ = frame_selection_rectangle_.normalized(); - QPoint p = frame_selection_rectangle_.center(); - QPoint rv = frame_selection_rectangle_.bottomRight() - frame_selection_rectangle_.topLeft(); - QPoint c = frame_selection_rectangle_.center(); - - camera()->convertClickToLine(p, view_ori_, view_dir_); - - PyramidInf frustum; - frustum.ori_ = AMCAX::Coord3(view_ori_.X(), view_ori_.Y(), view_ori_.Z()); - frustum.dir_.resize(4); - if (rv.x() > 0 && rv.y() > 0) - { - camera()->convertClickToLine(frame_selection_rectangle_.topLeft(), view_ori_, view_dir_); - frustum.dir_[0] = view_dir_; - camera()->convertClickToLine(frame_selection_rectangle_.topRight(), view_ori_, view_dir_); - frustum.dir_[1] = view_dir_; - camera()->convertClickToLine(frame_selection_rectangle_.bottomRight(), view_ori_, view_dir_); - frustum.dir_[2] =view_dir_; - camera()->convertClickToLine(frame_selection_rectangle_.bottomLeft(), view_ori_, view_dir_); - frustum.dir_[3] = view_dir_; - } - else - { - return; - } - - selectTool_->setSelectRegionWidth(frame_selection_rectangle_.width()); - selectTool_->setSelectRegionHeight(frame_selection_rectangle_.height()); - - selectFrame(frame_selection_rectangle_.center(), frustum); - - selectTool_->setSelectRegionWidthDefault(); - selectTool_->setSelectRegionHeightDefault(); - - createOperateAxis(); - } - else if (operate_type_ == OperationType::NO_OPERATION && click_buttom == Qt::LeftButton) - { - if( createOperateAxis() ) - { - coreCommand_->createBackupSInfo(select_info_list_); - } - coreCommand_->endOperationByAxis(select_info_list_, select_model_); - } - else if (operate_type_ == OperationType::MOVE_OPERATION && click_buttom == Qt::LeftButton) - { - coreCommand_->endOperationByAxis(select_info_list_, select_model_); - coreCommand_->createBackupSInfo(select_info_list_); - } - else if (operate_type_ == OperationType::SCALE_OPERATION && click_buttom == Qt::LeftButton) - { - if (o_axis_ != nullptr) - { - o_axis_->reSetLen(); - - coreCommand_->endOperationByAxis(select_info_list_, select_model_); - coreCommand_->createBackupSInfo(select_info_list_); - } - } - else if (operate_type_ == OperationType::ROTATE_OPERATION && click_buttom == Qt::LeftButton) - { - coreCommand_->endOperationByAxis(select_info_list_, select_model_); - coreCommand_->createBackupSInfo(select_info_list_); - } - - - if (operate_type_ == OperationType::PICK_OPERATION_MOVE && is_pick_move_select_) - { - if (select_info_list_.size() > 0) - { - coreCommand_->OperateSelectedObject_Subset_Split(select_model_, select_info_list_, operation_point_); - coreCommand_->createBackupSInfo(select_info_list_); - clearSelected(); - } - operation_point_.clear(); - is_pick_move_select_ = false; - update(); - } - - if (operate_type_ == OperationType::CTRL_OPERATION) - { - coreCommand_->endOperationByAxis(select_info_list_, select_model_); - coreCommand_->createBackupSInfo(select_info_list_); - clearSelected(); - cancelOperation(); - update(); - } - else if (operate_type_ == OperationType::ALT_OPERATION) - { - coreCommand_->endOperationByAxis(select_info_list_, select_model_); - coreCommand_->createBackupSInfo(select_info_list_); - clearSelected(); - cancelOperation(); - update(); - } - - if (!select_info_list_.empty()) - { - std::cout << "select id is "; - for (size_t i = 0; i < select_info_list_.size(); i++) - { - std::cout << select_info_list_[i].object_id_ << "::" << select_info_list_[i].object_subselect_id_ << " "; - } - std::cout << std::endl; - } - - QGLViewer::mouseReleaseEvent(e); + if (is_frame_selection_) + { + is_frame_selection_ = false; + + frame_selection_rectangle_ = frame_selection_rectangle_.normalized(); + QPoint p = frame_selection_rectangle_.center(); + QPoint rv = frame_selection_rectangle_.bottomRight() - frame_selection_rectangle_.topLeft(); + QPoint c = frame_selection_rectangle_.center(); + + camera()->convertClickToLine(p, view_ori_, view_dir_); + // + + PyramidInf frustum; + frustum.ori_ = AMCAX::Coord3(view_ori_.X(), view_ori_.Y(), view_ori_.Z()); + frustum.dir_.resize(4); + if (rv.x() > 0 && rv.y() > 0) + { + camera()->convertClickToLine(frame_selection_rectangle_.topLeft(), view_ori_, view_dir_); + frustum.dir_[0] = view_dir_; + camera()->convertClickToLine(frame_selection_rectangle_.topRight(), view_ori_, view_dir_); + frustum.dir_[1] = view_dir_; + camera()->convertClickToLine(frame_selection_rectangle_.bottomRight(), view_ori_, view_dir_); + frustum.dir_[2] = view_dir_; + camera()->convertClickToLine(frame_selection_rectangle_.bottomLeft(), view_ori_, view_dir_); + frustum.dir_[3] = view_dir_; + } + else + { + return; + } + + selectTool_->setSelectRegionWidth(frame_selection_rectangle_.width()); + selectTool_->setSelectRegionHeight(frame_selection_rectangle_.height()); + + selectFrame(frame_selection_rectangle_.center(), frustum); + + selectTool_->setSelectRegionWidthDefault(); + selectTool_->setSelectRegionHeightDefault(); + + + + createOperateAxis(); + + + } + else if (operate_type_ == OperationType::NO_OPERATION && click_buttom == Qt::LeftButton) + { + if (createOperateAxis()) + { + //dataManager_->RecordAuto(); + //coreCommand_->createBackupSInfo(select_info_list_); + } + coreCommand_->endOperationByAxis(select_info_list_, select_model_); + } + else if (operate_type_ == OperationType::MOVE_OPERATION && click_buttom == Qt::LeftButton) + { + coreCommand_->endOperationByAxis(select_info_list_, select_model_); + coreCommand_->createBackupSInfo(select_info_list_); + } + else if (operate_type_ == OperationType::SCALE_OPERATION && click_buttom == Qt::LeftButton) + { + if (o_axis_ != nullptr) + { + o_axis_->reSetLen(); + + coreCommand_->endOperationByAxis(select_info_list_, select_model_); + coreCommand_->createBackupSInfo(select_info_list_); + } + } + else if (operate_type_ == OperationType::ROTATE_OPERATION && click_buttom == Qt::LeftButton) + { + coreCommand_->endOperationByAxis(select_info_list_, select_model_); + coreCommand_->createBackupSInfo(select_info_list_); + } + + if (operate_type_ == OperationType::PICK_OPERATION_MOVE && is_pick_move_select_) + { + if (select_info_list_.size() > 0) + { + coreCommand_->OperateSelectedObject_Subset_Split(select_model_, select_info_list_, operation_point_); + coreCommand_->createBackupSInfo(select_info_list_); + clearSelected(); + } + operation_point_.clear(); + is_pick_move_select_ = false; + update(); + } + + if (operate_type_ == OperationType::CTRL_OPERATION) + { + //dataManager_->RecordAuto(); + coreCommand_->endOperationByAxis(select_info_list_, select_model_); + coreCommand_->createBackupSInfo(select_info_list_); + clearSelected(); + cancelOperation(); + update(); + } + else if (operate_type_ == OperationType::ALT_OPERATION) + { + coreCommand_->endOperationByAxis(select_info_list_, select_model_); + coreCommand_->createBackupSInfo(select_info_list_); + clearSelected(); + cancelOperation(); + update(); + } + + if (!select_info_list_.empty()) + { + std::cout << "select id is "; + for (size_t i = 0; i < select_info_list_.size(); i++) + { + std::cout << select_info_list_[i].object_id_ << "::" << select_info_list_[i].object_subselect_id_ << " "; + } + std::cout << std::endl; + } + + QGLViewer::mouseReleaseEvent(e); } void RenderViewer::mouseDoubleClickEvent(QMouseEvent* e) { - bool shift_left = (e->modifiers() == Qt::ShiftModifier) && (e->button() == Qt::LeftButton); - - if (shift_left && select_model_ == SelectModel::EDGE_MODEL) - { - int s_size = select_info_list_.size(); - if (s_size == 1 ) - { - coreCommand_->getSelectedObject_Element_Related(select_info_list_, select_model_); - createOperateAxis(); - } - } - - QGLViewer::mouseDoubleClickEvent(e); + bool shift_left = (e->modifiers() == Qt::ShiftModifier) && (e->button() == Qt::LeftButton); + + if (shift_left && select_model_ == SelectModel::EDGE_MODEL) + { + int s_size = select_info_list_.size(); + if (s_size == 1) + { + coreCommand_->getSelectedObject_Element_Related(select_info_list_, select_model_); + createOperateAxis(); + } + } + + QGLViewer::mouseDoubleClickEvent(e); } //========================================================== void RenderViewer::keyPressEvent(QKeyEvent* e) { - if (e->key() == 0) { - e->ignore(); - return; - } - - const Qt::Key key = Qt::Key(e->key()); - const Qt::KeyboardModifiers modifiers = e->modifiers(); - - //取消当前的操作( Cancel the all operation) - if (key == Qt::Key_Escape) - { - cancelOperation(); - clearClicked(); - update(); - } - //enter with differente Operation type - else if (key == Qt::Key_Return && operate_type_ == OperationType::ENTER_OPERATION) { - beginEnterOperation(); - } - else if (key == Qt::Key_Return && operate_type_ == OperationType::PICK_OPERATION_MOVE_MULTI) - { - if (select_info_list_.size() > 0) - { - coreCommand_->OperateSelectedObject_Subset_Split(select_model_, select_info_list_, operation_point_); - coreCommand_->createBackupSInfo(select_info_list_); - clearSelected(); - } - operation_point_.clear(); - is_pick_move_select_ = false; - update(); - } - else if (key == Qt::Key_Return && operate_type_ == OperationType::CLICK_OPERATION_SELECT) - { - beginEnterClickOperation(); - } - // control , with undo / redo - else if (modifiers == Qt::ControlModifier && key == Qt::Key_Z) - { - slotUndo(); - } - else if (modifiers == Qt::ControlModifier && key == Qt::Key_Y) - { - slotRedo(); - } - //开关工作平面显示 - else if (modifiers == Qt::NoModifier && key == Qt::Key_G) { - changeGridIsDrawn(); - update(); - } - //移动模式 - else if (modifiers == Qt::NoModifier && key == Qt::Key_W) - { - setOperateType(OperationType::MOVE_OPERATION); - update(); - } - //旋转模式 - else if (modifiers == Qt::NoModifier && key == Qt::Key_R) - { - setOperateType(OperationType::ROTATE_OPERATION); - update(); - } - //缩放模式 - else if (modifiers == Qt::NoModifier && key == Qt::Key_E) - { - setOperateType(OperationType::SCALE_OPERATION); - update(); - } - //取消操作轴 - else if (modifiers == Qt::NoModifier && key == Qt::Key_Q) - { - setOperateType(OperationType::NO_OPERATION); - update(); - } - //顶点模式 - else if (modifiers == Qt::NoModifier && key == Qt::Key_A) - { - setSelectModel(SelectModel::VERTEX_MODEL); - clearSelected(); - emit selectedModelChanged(); - update(); - } - //边模式 - else if (modifiers == Qt::NoModifier && key == Qt::Key_S) - { - setSelectModel(SelectModel::EDGE_MODEL); - clearSelected(); - emit selectedModelChanged(); - update(); - } - //面模式 - else if (modifiers == Qt::NoModifier && key == Qt::Key_D) - { - setSelectModel(SelectModel::FACE_MODEL); - clearSelected(); - emit selectedModelChanged(); - update(); - } - //物体模式 - else if (modifiers == Qt::NoModifier && key == Qt::Key_F) - { - setSelectModel(SelectModel::OBJECT_MODEL); - clearSelected(); - emit selectedModelChanged(); - update(); - } - //切换样条显示 - else if (modifiers == Qt::NoModifier && key == Qt::Key_Tab) - { - if (draw_model_ == DrawModel::RENDERING_MODEL) - setDrawModel(DrawModel::SHADING_MODEL); - else if(draw_model_ == DrawModel::SHADING_MODEL) - setDrawModel(DrawModel::RENDERING_MODEL); - } - // 投影操作 - else if (modifiers == Qt::NoModifier && key == Qt::Key_P) - { - coreCommand_->setMeshOperationType(MeshOperationType::MeshProject); - coreCommand_->OperateSelectedObject(select_model_, select_info_list_, work_plane_->center(), work_plane_->normal()); - cancelOperation(); - update(); - } - //删除操作 (delete) - else if (key == Qt::Key_Delete) - { - if (select_model_ == SelectModel::OBJECT_MODEL) - { - if (!select_info_list_.empty()) - { - coreCommand_->setMeshOperationType(MeshOperationType::MeshDelete); - beginEnterOperation(); - } - } - else if (select_model_ == SelectModel::FACE_MODEL || - select_model_ == SelectModel::EDGE_MODEL || select_model_ == SelectModel::VERTEX_MODEL) - { - if (!select_info_list_.empty()) - { - coreCommand_->setMeshOperationType(MeshOperationType::MeshDeleteElement); - beginEnterOperation(); - cancelOperation(); - } - } - } - //保存操作 - else if (modifiers == Qt::ControlModifier && key == Qt::Key_S) - { - QString f = "AMCAD_work.obj"; - coreCommand_->saveObjects(f); - } - else - { - QGLViewer::keyPressEvent(e); - } + if (e->key() == 0) { + e->ignore(); + return; + } + + const Qt::Key key = Qt::Key(e->key()); + const Qt::KeyboardModifiers modifiers = e->modifiers(); + + //取消当前的操作( Cancel the all operation) + if (key == Qt::Key_Escape) + { + cancelOperation(); + clearClicked(); + update(); + } + //enter with differente Operation type + else if (key == Qt::Key_Return && operate_type_ == OperationType::ENTER_OPERATION) { + beginEnterOperation(); + } + else if (key == Qt::Key_Return && operate_type_ == OperationType::PICK_OPERATION_MOVE_MULTI) + { + if (select_info_list_.size() > 0) + { + coreCommand_->OperateSelectedObject_Subset_Split(select_model_, select_info_list_, operation_point_); + coreCommand_->createBackupSInfo(select_info_list_); + clearSelected(); + } + operation_point_.clear(); + is_pick_move_select_ = false; + update(); + } + else if (key == Qt::Key_Return && operate_type_ == OperationType::CLICK_OPERATION_SELECT) + { + beginEnterClickOperation(); + } + // control , with undo / redo + else if (modifiers == Qt::ControlModifier && key == Qt::Key_Z) + { + slotUndo(); + } + else if (modifiers == Qt::ControlModifier && key == Qt::Key_Y) + { + slotRedo(); + } + //开关工作平面显示 + else if (modifiers == Qt::NoModifier && key == Qt::Key_G) { + changeGridIsDrawn(); + update(); + } + //移动模式 + else if (modifiers == Qt::NoModifier && key == Qt::Key_W) + { + setOperateType(OperationType::MOVE_OPERATION); + update(); + } + //旋转模式 + else if (modifiers == Qt::NoModifier && key == Qt::Key_R) + { + setOperateType(OperationType::ROTATE_OPERATION); + update(); + } + //缩放模式 + else if (modifiers == Qt::NoModifier && key == Qt::Key_E) + { + setOperateType(OperationType::SCALE_OPERATION); + update(); + } + //取消操作轴 + else if (modifiers == Qt::NoModifier && key == Qt::Key_Q) + { + setOperateType(OperationType::NO_OPERATION); + update(); + } + //顶点模式 + else if (modifiers == Qt::NoModifier && key == Qt::Key_A) + { + setSelectModel(SelectModel::VERTEX_MODEL); + clearSelected(); + emit selectedModelChanged(); + update(); + } + //边模式 + else if (modifiers == Qt::NoModifier && key == Qt::Key_S) + { + setSelectModel(SelectModel::EDGE_MODEL); + clearSelected(); + emit selectedModelChanged(); + update(); + } + //面模式 + else if (modifiers == Qt::NoModifier && key == Qt::Key_D) + { + setSelectModel(SelectModel::FACE_MODEL); + clearSelected(); + emit selectedModelChanged(); + update(); + } + //物体模式 + else if (modifiers == Qt::NoModifier && key == Qt::Key_F) + { + setSelectModel(SelectModel::OBJECT_MODEL); + clearSelected(); + emit selectedModelChanged(); + update(); + } + //切换样条显示 + else if (modifiers == Qt::NoModifier && key == Qt::Key_Tab) + { + if (draw_model_ == DrawModel::RENDERING_MODEL) + setDrawModel(DrawModel::SHADING_MODEL); + else if (draw_model_ == DrawModel::SHADING_MODEL) + setDrawModel(DrawModel::RENDERING_MODEL); + } + // 投影操作 + else if (modifiers == Qt::NoModifier && key == Qt::Key_P) + { + coreCommand_->setMeshOperationType(MeshOperationType::MeshProject); + coreCommand_->OperateSelectedObject(select_model_, select_info_list_, work_plane_->center(), work_plane_->normal()); + cancelOperation(); + update(); + } + //删除操作 (delete) + else if (key == Qt::Key_Delete) + { + if (select_model_ == SelectModel::OBJECT_MODEL) + { + if (!select_info_list_.empty()) + { + coreCommand_->setMeshOperationType(MeshOperationType::MeshDelete); + beginEnterOperation(); + } + } + else if (select_model_ == SelectModel::FACE_MODEL || + select_model_ == SelectModel::EDGE_MODEL || select_model_ == SelectModel::VERTEX_MODEL) + { + if (!select_info_list_.empty()) + { + coreCommand_->setMeshOperationType(MeshOperationType::MeshDeleteElement); + beginEnterOperation(); + cancelOperation(); + } + } + } + //保存操作 + else if (modifiers == Qt::ControlModifier && key == Qt::Key_S) + { + QString f = "AMCAD_work.obj"; + coreCommand_->saveObjects(f); + } + else + { + QGLViewer::keyPressEvent(e); + } } void RenderViewer::keyReleaseEvent(QKeyEvent* e) { - QGLViewer::keyReleaseEvent(e); + QGLViewer::keyReleaseEvent(e); } //========================================================== @@ -877,199 +928,199 @@ void RenderViewer::keyReleaseEvent(QKeyEvent* e) //========================================================== void RenderViewer::setSelectBufferSize(int size) { - if (selectBuffer_) - delete[] selectBuffer_; - selectBufferSize_ = size; - selectBuffer_ = new GLuint[selectBufferSize()]; + if (selectBuffer_) + delete[] selectBuffer_; + selectBufferSize_ = size; + selectBuffer_ = new GLuint[selectBufferSize()]; } bool RenderViewer::select(const QMouseEvent* ev, bool is_select_muti) { - makeCurrent(); + makeCurrent(); - const QPoint point = ev->pos(); - AMCAX::CoordT p(point.x(), point.y()); - bool is_true = selectTool_->select(camera(), select_model_, p, is_select_muti); - select_info_list_ = selectTool_->getSelectInfoNew(); - select_object_center_ = selectTool_->getCenter(); - return is_true; + const QPoint point = ev->pos(); + AMCAX::CoordT p(point.x(), point.y()); + bool is_true = selectTool_->select(camera(), select_model_, p, is_select_muti); + select_info_list_ = selectTool_->getSelectInfoNew(); + select_object_center_ = selectTool_->getCenter(); + return is_true; - //const QPoint point = ev->pos(); - //return selectedDrawNeeded(point, is_select_muti); + //const QPoint point = ev->pos(); + //return selectedDrawNeeded(point, is_select_muti); } void RenderViewer::beginSelection(const QPoint& point) { - // Make OpenGL context current (may be needed with several viewers ?) - makeCurrent(); - - // Prepare the selection mode - glSelectBuffer(selectBufferSize(), selectBuffer()); - glRenderMode(GL_SELECT); - glInitNames(); - - // Loads the matrices - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - static GLint viewport[4]; - camera()->getViewport(viewport); - gluPickMatrix(point.x(), point.y(), selectRegionWidth(), selectRegionHeight(), viewport); - - // loadProjectionMatrix() first resets the GL_PROJECTION matrix with a glLoadIdentity() - // The false parameter prevents this and hence multiplies the matrices. - camera()->loadProjectionMatrix(false); - // Reset the original (world coordinates) modelview matrix - camera()->loadModelViewMatrix(); + // Make OpenGL context current (may be needed with several viewers ?) + makeCurrent(); + + // Prepare the selection mode + glSelectBuffer(selectBufferSize(), selectBuffer()); + glRenderMode(GL_SELECT); + glInitNames(); + + // Loads the matrices + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + static GLint viewport[4]; + camera()->getViewport(viewport); + gluPickMatrix(point.x(), point.y(), selectRegionWidth(), selectRegionHeight(), viewport); + + // loadProjectionMatrix() first resets the GL_PROJECTION matrix with a glLoadIdentity() + // The false parameter prevents this and hence multiplies the matrices. + camera()->loadProjectionMatrix(false); + // Reset the original (world coordinates) modelview matrix + camera()->loadModelViewMatrix(); } void RenderViewer::endSelection(const QPoint& point, SelectModel type) { - Q_UNUSED(point) - - // Flush GL buffers - glFlush(); - - // Get the number of objects that were seen through the pick matrix frustum. - // Reset GL_RENDER mode. - GLint nbHits = glRenderMode(GL_RENDER); - - if (nbHits <= 0) - selectedId_ = -1; - else { - // Interpret results: each object created 4 values in the selectBuffer(). - // selectBuffer[4*i+1] is the object minimum depth value, while - // selectBuffer[4*i+3] is the id pushed on the stack. Of all the objects - // that were projected in the pick region, we select the closest one (zMin comparison). - // This code needs to be modified if you use several stack levels. - - if (type == SelectModel::OBJECT_MODEL) - { - GLuint zMin = (selectBuffer())[1]; - selectedId_ = int((selectBuffer())[3]); - for (int i = 1; i < nbHits; ++i) - { - if ((selectBuffer())[4 * i + 1] < zMin) - { - zMin = (selectBuffer())[4 * i + 1]; - selectedId_ = int((selectBuffer())[4 * i + 3]); - } - } - } - else if (type == SelectModel::FACE_MODEL) - { - GLuint zMin = (selectBuffer())[1]; - selectedSubsetId_ = int((selectBuffer())[3]); - for (int i = 1; i < nbHits; ++i) - { - if ((selectBuffer())[4 * i + 1] < zMin) - { - zMin = (selectBuffer())[4 * i + 1]; - selectedSubsetId_ = int((selectBuffer())[4 * i + 3]); - } - } - } - else - { - - selectedId_ = -1; - selectedSubsetId_ = -1; - } - } + Q_UNUSED(point) + + // Flush GL buffers + glFlush(); + + // Get the number of objects that were seen through the pick matrix frustum. + // Reset GL_RENDER mode. + GLint nbHits = glRenderMode(GL_RENDER); + + if (nbHits <= 0) + selectedId_ = -1; + else { + // Interpret results: each object created 4 values in the selectBuffer(). + // selectBuffer[4*i+1] is the object minimum depth value, while + // selectBuffer[4*i+3] is the id pushed on the stack. Of all the objects + // that were projected in the pick region, we select the closest one (zMin comparison). + // This code needs to be modified if you use several stack levels. + + if (type == SelectModel::OBJECT_MODEL) + { + GLuint zMin = (selectBuffer())[1]; + selectedId_ = int((selectBuffer())[3]); + for (int i = 1; i < nbHits; ++i) + { + if ((selectBuffer())[4 * i + 1] < zMin) + { + zMin = (selectBuffer())[4 * i + 1]; + selectedId_ = int((selectBuffer())[4 * i + 3]); + } + } + } + else if (type == SelectModel::FACE_MODEL) + { + GLuint zMin = (selectBuffer())[1]; + selectedSubsetId_ = int((selectBuffer())[3]); + for (int i = 1; i < nbHits; ++i) + { + if ((selectBuffer())[4 * i + 1] < zMin) + { + zMin = (selectBuffer())[4 * i + 1]; + selectedSubsetId_ = int((selectBuffer())[4 * i + 3]); + } + } + } + else + { + + selectedId_ = -1; + selectedSubsetId_ = -1; + } + } } //=================================================================== -void RenderViewer::selectFrame(const QPoint& point, PyramidInf & frustum) +void RenderViewer::selectFrame(const QPoint& point, PyramidInf& frustum) { - AMCAX::CoordT p(point.x(), point.y()); - selectTool_->selectFrame(camera(), select_model_, p, frustum); - select_info_list_ = selectTool_->getSelectInfoNew(); - select_object_center_ = selectTool_->getCenter(); + AMCAX::CoordT p(point.x(), point.y()); + selectTool_->selectFrame(camera(), select_model_, p, frustum); + select_info_list_ = selectTool_->getSelectInfoNew(); + select_object_center_ = selectTool_->getCenter(); } //=================================================================== bool RenderViewer::selectOpAxis(const QMouseEvent* ev) { - const QPoint point = ev->pos(); - beginSelection(point); - selectDrawAxis(); - endSelection(point, SelectModel::OBJECT_MODEL); - - if (selectedId_ >= 0){ - o_axis_->setSelectPart(selectedId_); - return true; - } - else{ - if (o_axis_ != nullptr) - { - o_axis_->setSelectPart(-1); - } - return false; - } + const QPoint point = ev->pos(); + beginSelection(point); + selectDrawAxis(); + endSelection(point, SelectModel::OBJECT_MODEL); + + if (selectedId_ >= 0) { + o_axis_->setSelectPart(selectedId_); + return true; + } + else { + if (o_axis_ != nullptr) + { + o_axis_->setSelectPart(-1); + } + return false; + } } void RenderViewer::selectDrawAxis() { - std::string type; - if (operate_type_ == OperationType::MOVE_OPERATION) - type = "MOVE"; - else if (operate_type_ == OperationType::ROTATE_OPERATION) - type = "ROTATE"; - else if (operate_type_ == OperationType::SCALE_OPERATION) - type = "SCALE"; - else - return; - - if (o_axis_ == nullptr || select_info_list_.empty()) - return; - - o_axis_->drawForSelect(type); + std::string type; + if (operate_type_ == OperationType::MOVE_OPERATION) + type = "MOVE"; + else if (operate_type_ == OperationType::ROTATE_OPERATION) + type = "ROTATE"; + else if (operate_type_ == OperationType::SCALE_OPERATION) + type = "SCALE"; + else + return; + + if (o_axis_ == nullptr || select_info_list_.empty()) + return; + + o_axis_->drawForSelect(type); } void RenderViewer::endSelectionAxis(const QPoint& point) { - Q_UNUSED(point) - - // Flush GL buffers - glFlush(); - - // Get the number of objects that were seen through the pick matrix frustum. - // Reset GL_RENDER mode. - GLint nbHits = glRenderMode(GL_RENDER); - - if (nbHits <= 0) - selectedId_ = -1; - else - { - GLuint zMin = (selectBuffer())[1]; - selectedId_ = int((selectBuffer())[3]); - for (int i = 1; i < nbHits; ++i) - { - if ((selectBuffer())[4 * i + 1] < zMin) - { - zMin = (selectBuffer())[4 * i + 1]; - selectedId_ = int((selectBuffer())[4 * i + 3]); - } - } - } + Q_UNUSED(point) + + // Flush GL buffers + glFlush(); + + // Get the number of objects that were seen through the pick matrix frustum. + // Reset GL_RENDER mode. + GLint nbHits = glRenderMode(GL_RENDER); + + if (nbHits <= 0) + selectedId_ = -1; + else + { + GLuint zMin = (selectBuffer())[1]; + selectedId_ = int((selectBuffer())[3]); + for (int i = 1; i < nbHits; ++i) + { + if ((selectBuffer())[4 * i + 1] < zMin) + { + zMin = (selectBuffer())[4 * i + 1]; + selectedId_ = int((selectBuffer())[4 * i + 3]); + } + } + } } //=================================================================== void RenderViewer::click(const QMouseEvent* ev) { - const QPoint pixel = ev->pos(); + const QPoint pixel = ev->pos(); - camera()->convertClickToLine(pixel, view_ori_, view_dir_); - AMCAX::Coord3 c_begin(view_ori_.X(), view_ori_.Y(), view_ori_.Z()); - AMCAX::Coord3 c_dir(view_dir_.X(), view_dir_.Y(), view_dir_.Z()); c_dir.Normalize(); + camera()->convertClickToLine(pixel, view_ori_, view_dir_); + AMCAX::Coord3 c_begin(view_ori_.X(), view_ori_.Y(), view_ori_.Z()); + AMCAX::Coord3 c_dir(view_dir_.X(), view_dir_.Y(), view_dir_.Z()); c_dir.Normalize(); - ClickInfo c_info; - AMCAX::Coord3d w_point; - work_plane_->lineInsertPlane(c_begin, c_dir, w_point); - c_info.point_ = w_point; + ClickInfo c_info; + AMCAX::Coord3d w_point; + work_plane_->lineInsertPlane(c_begin, c_dir, w_point); + c_info.point_ = w_point; - click_info_list_.push_back(c_info); + click_info_list_.push_back(c_info); } //=================================================================== @@ -1078,86 +1129,86 @@ void RenderViewer::click(const QMouseEvent* ev) void RenderViewer::beginPickOperationSingle() { - if (select_info_list_.size() > 0) - { - coreCommand_->OperateSelectedObject_Subset(select_model_, select_info_list_); - clearSelected(); - update(); - } + if (select_info_list_.size() > 0) + { + coreCommand_->OperateSelectedObject_Subset(select_model_, select_info_list_); + clearSelected(); + update(); + } } void RenderViewer::beginEnterOperation() { - if (select_model_ == SelectModel::OBJECT_MODEL) - { - if (select_info_list_.size() > 0) - { - coreCommand_->OperateSelectedObject(select_model_, select_info_list_); - coreCommand_->OperateSelectedObject(select_model_, select_info_list_, work_plane_->center(), work_plane_->normal()); - - coreCommand_->OperateSelectedObjectFaceExtrude(select_model_, select_info_list_, operation_vector_); - - cancelOperation(); - update(); - } - } - else if (select_model_ == SelectModel::VERTEX_MODEL || select_model_ == SelectModel::EDGE_MODEL - || select_model_ == SelectModel::FACE_MODEL) - { - if (select_info_list_.size() > 0) - { - coreCommand_->OperateSelectedObject_Subset(select_model_, select_info_list_); - - if (coreCommand_->getMeshOperationType() == MeshOperationType::MeshCopy) - { - setOperateType(OperationType::NO_OPERATION); - coreCommand_->setOperationDataType(OperationDataType::UNKNOW_TYPE); - coreCommand_->setMeshOperationType(MeshOperationType::NO_operotion); - createOperateAxis(); - update(); - } - else if (coreCommand_->getMeshOperationType() == MeshOperationType::MeshWeldEdge - || coreCommand_->getMeshOperationType() == MeshOperationType::MeshSeparate - || coreCommand_->getMeshOperationType() == MeshOperationType::MeshChamferEdge - || coreCommand_->getMeshOperationType() == MeshOperationType::MeshFilletEdge) - { - cancelOperation(); - update(); - } - else - { - clearSelected(); - update(); - } - } - } + if (select_model_ == SelectModel::OBJECT_MODEL) + { + if (select_info_list_.size() > 0) + { + coreCommand_->OperateSelectedObject(select_model_, select_info_list_); + coreCommand_->OperateSelectedObject(select_model_, select_info_list_, work_plane_->center(), work_plane_->normal()); + + coreCommand_->OperateSelectedObjectFaceExtrude(select_model_, select_info_list_, operation_vector_); + + cancelOperation(); + update(); + } + } + else if (select_model_ == SelectModel::VERTEX_MODEL || select_model_ == SelectModel::EDGE_MODEL + || select_model_ == SelectModel::FACE_MODEL) + { + if (select_info_list_.size() > 0) + { + coreCommand_->OperateSelectedObject_Subset(select_model_, select_info_list_); + + if (coreCommand_->getMeshOperationType() == MeshOperationType::MeshCopy) + { + setOperateType(OperationType::NO_OPERATION); + coreCommand_->setOperationDataType(OperationDataType::CUSTOM_TYPE); + coreCommand_->setMeshOperationType(MeshOperationType::NO_operotion); + createOperateAxis(); + update(); + } + else if (coreCommand_->getMeshOperationType() == MeshOperationType::MeshWeldEdge + || coreCommand_->getMeshOperationType() == MeshOperationType::MeshSeparate + || coreCommand_->getMeshOperationType() == MeshOperationType::MeshChamferEdge + || coreCommand_->getMeshOperationType() == MeshOperationType::MeshFilletEdge) + { + cancelOperation(); + update(); + } + else + { + clearSelected(); + update(); + } + } + } } void RenderViewer::beginEnterClickOperation() { - if (select_model_ == SelectModel::CLICK_MODEL) - { - if (click_info_list_.size() > 0) - { - coreCommand_->OperatePointlistWithSelectedObject(select_model_, click_info_list_, select_info_list_); - - cancelOperation(); - update(); - } - } + if (select_model_ == SelectModel::CLICK_MODEL) + { + if (click_info_list_.size() > 0) + { + coreCommand_->OperatePointlistWithSelectedObject(select_model_, click_info_list_, select_info_list_); + + cancelOperation(); + update(); + } + } } void RenderViewer::cancelOperation() { - clearSelected(); - clearClicked(); - setOperateType(OperationType::NO_OPERATION); - coreCommand_->setOperationDataType(OperationDataType::UNKNOW_TYPE); - coreCommand_->setMeshOperationType(MeshOperationType::NO_operotion); + clearSelected(); + clearClicked(); + setOperateType(OperationType::NO_OPERATION); + coreCommand_->setOperationDataType(OperationDataType::CUSTOM_TYPE); + coreCommand_->setMeshOperationType(MeshOperationType::NO_operotion); - setSelectModel(SelectModel::OBJECT_MODEL); + setSelectModel(SelectModel::OBJECT_MODEL); - Q_EMIT selectedModelChanged(); + Q_EMIT selectedModelChanged(); } //==================================================================== @@ -1166,56 +1217,56 @@ void RenderViewer::cancelOperation() void RenderViewer::setScenesCenter() { - if (select_info_list_.empty()) - { - setSceneCenter(qglviewer::Vec(0.0, 0.0, 0.0)); - camera()->fitSphere(qglviewer::Vec(0.0, 0.0, 0.0), 5.0); - } - else - { - AMCAX::Coord3 c = AMCAX::Coord3(0.0, 0.0, 0.0); - AMCAX::Coord3 bb_min_f = AMCAX::Coord3(DBL_MAX, DBL_MAX, DBL_MAX); - AMCAX::Coord3 bb_max_f = AMCAX::Coord3(-DBL_MAX, -DBL_MAX, -DBL_MAX); - AMCAX::Coord3 bb_min = AMCAX::Coord3(0.0, 0.0, 0.0); - AMCAX::Coord3 bb_max = AMCAX::Coord3(0.0, 0.0, 0.0); - for (int i = 0; i < select_info_list_.size(); i++) - { - c += coreCommand_->getSelectedObject_Center(select_info_list_[i], select_model_); - coreCommand_->getSelectedObject_BBox(select_info_list_[i], select_model_, bb_min, bb_max); - - if (bb_min[0] < bb_min_f[0]) bb_min_f[0] = bb_min[0]; - if (bb_min[1] < bb_min_f[1]) bb_min_f[1] = bb_min[1]; - if (bb_min[2] < bb_min_f[2]) bb_min_f[2] = bb_min[2]; - - if (bb_max[0] > bb_max_f[0]) bb_max_f[0] = bb_max[0]; - if (bb_max[1] > bb_max_f[1]) bb_max_f[1] = bb_max[1]; - if (bb_max[2] > bb_max_f[2]) bb_max_f[2] = bb_max[2]; - } - - double r = (bb_max_f - bb_min_f).Norm() / 2; - r = r * 1.2; - if (r < 1.0) r = 1.0; - - setSceneCenter(qglviewer::Vec(c.X(), c.Y(), c.Z())); - camera()->fitSphere(qglviewer::Vec(c.X(), c.Y(), c.Z()), r); - } + if (select_info_list_.empty()) + { + setSceneCenter(qglviewer::Vec(0.0, 0.0, 0.0)); + camera()->fitSphere(qglviewer::Vec(0.0, 0.0, 0.0), 5.0); + } + else + { + AMCAX::Coord3 c = AMCAX::Coord3(0.0, 0.0, 0.0); + AMCAX::Coord3 bb_min_f = AMCAX::Coord3(DBL_MAX, DBL_MAX, DBL_MAX); + AMCAX::Coord3 bb_max_f = AMCAX::Coord3(-DBL_MAX, -DBL_MAX, -DBL_MAX); + AMCAX::Coord3 bb_min = AMCAX::Coord3(0.0, 0.0, 0.0); + AMCAX::Coord3 bb_max = AMCAX::Coord3(0.0, 0.0, 0.0); + for (int i = 0; i < select_info_list_.size(); i++) + { + c += coreCommand_->getSelectedObject_Center(select_info_list_[i], select_model_); + coreCommand_->getSelectedObject_BBox(select_info_list_[i], select_model_, bb_min, bb_max); + + if (bb_min[0] < bb_min_f[0]) bb_min_f[0] = bb_min[0]; + if (bb_min[1] < bb_min_f[1]) bb_min_f[1] = bb_min[1]; + if (bb_min[2] < bb_min_f[2]) bb_min_f[2] = bb_min[2]; + + if (bb_max[0] > bb_max_f[0]) bb_max_f[0] = bb_max[0]; + if (bb_max[1] > bb_max_f[1]) bb_max_f[1] = bb_max[1]; + if (bb_max[2] > bb_max_f[2]) bb_max_f[2] = bb_max[2]; + } + + double r = (bb_max_f - bb_min_f).Norm() / 2; + r = r * 1.2; + if (r < 1.0) r = 1.0; + + setSceneCenter(qglviewer::Vec(c.X(), c.Y(), c.Z())); + camera()->fitSphere(qglviewer::Vec(c.X(), c.Y(), c.Z()), r); + } } void RenderViewer::setWorkPlane() { - if (select_info_list_.empty()) - { - work_plane_->setCenter(AMCAX::Coord3(0.0, 0.0, 0.0)); - work_plane_->setNormal(AMCAX::Coord3(0.0, 0.0, 1.0)); - } - else - { - AMCAX::Coord3 c, n; - coreCommand_->getSelectedObject_Plane(select_info_list_, select_model_, c, n); - work_plane_->setCenter(c); - work_plane_->setNormal(n); - cancelOperation(); - } + if (select_info_list_.empty()) + { + work_plane_->setCenter(AMCAX::Coord3(0.0, 0.0, 0.0)); + work_plane_->setNormal(AMCAX::Coord3(0.0, 0.0, 1.0)); + } + else + { + AMCAX::Coord3 c, n; + coreCommand_->getSelectedObject_Plane(select_info_list_, select_model_, c, n); + work_plane_->setCenter(c); + work_plane_->setNormal(n); + cancelOperation(); + } } //==================================================================== @@ -1224,106 +1275,501 @@ void RenderViewer::setWorkPlane() bool RenderViewer::createOperateAxis() { - bool is_move = false; - if (select_info_list_.empty()) - { - if (o_axis_ != nullptr) - { - delete o_axis_; - o_axis_ = nullptr; - } - } - else - { - if (o_axis_ != nullptr) - { - delete o_axis_; - o_axis_ = nullptr; - } - - AMCAX::Coord3 c = AMCAX::Coord3(0.0, 0.0, 0.0); - for (int i = 0; i < select_info_list_.size(); i++) - { - c += coreCommand_->getSelectedObject_Center(select_info_list_[i], select_model_); - } - c /= select_info_list_.size(); - - if ((select_object_center_ - c).Norm() > 1e-4) - { - is_move = true; - } - - if (select_info_list_.size() == 1) - { - AMCAX::Coord3 n = coreCommand_->getSelectedObject_Normal(select_info_list_[0], select_model_); - o_axis_ = new AxisOperation(c, n); - } - else - { - o_axis_ = new AxisOperation(c); - } - } - - return is_move; + bool is_move = false; + if (select_info_list_.empty()) + { + if (o_axis_ != nullptr) + { + delete o_axis_; + o_axis_ = nullptr; + } + } + else + { + if (o_axis_ != nullptr) + { + delete o_axis_; + o_axis_ = nullptr; + } + + AMCAX::Coord3 c = AMCAX::Coord3(0.0, 0.0, 0.0); + for (int i = 0; i < select_info_list_.size(); i++) + { + c += coreCommand_->getSelectedObject_Center(select_info_list_[i], select_model_); + } + c /= select_info_list_.size(); + + if ((select_object_center_ - c).Norm() > 1e-4) + { + is_move = true; + } + + if (select_info_list_.size() == 1) + { + AMCAX::Coord3 n = coreCommand_->getSelectedObject_Normal(select_info_list_[0], select_model_); + o_axis_ = new AxisOperation(c, n); + } + else + { + o_axis_ = new AxisOperation(c); + } + } + + return is_move; } void RenderViewer::setSelectInfoCamera(const QPoint& pixel, acamcad::SelectInfoWithCamera& s_info) { - camera()->convertClickToLine(pixel, view_ori_, view_dir_); - qglviewer::Vec space_point_ = view_ori_ + 100.f * view_dir_; - s_info.c_begin_ = view_ori_; - s_info.c_end_ = space_point_; + camera()->convertClickToLine(pixel, view_ori_, view_dir_); + qglviewer::Vec space_point_ = view_ori_ + 100.f * view_dir_; + s_info.c_begin_ = view_ori_; + s_info.c_end_ = space_point_; } AMCAX::Coord3 RenderViewer::mouseMoveTrans(const QPoint& e_point, const AMCAX::Coord3& o_center) { - const QPoint delta = e_point - prevPos_; - qglviewer::Vec trans = qglviewer::Vec((double)(delta.x()), (double)(-delta.y()), 0.0); - qglviewer::Vec center(o_center.X(), o_center.Y(), o_center.Z()); - - trans *= 2.0 * tan(camera()->fieldOfView() / 2.0) * - fabs((camera()->frame()->coordinatesOf(center)).Z()) / camera()->screenHeight(); - trans = camera()->frame()->orientation().rotate(trans); - return AMCAX::Coord3(trans.X(), trans.Y(), trans.Z()); + const QPoint delta = e_point - prevPos_; + qglviewer::Vec trans = qglviewer::Vec((double)(delta.x()), (double)(-delta.y()), 0.0); + qglviewer::Vec center(o_center.X(), o_center.Y(), o_center.Z()); + + trans *= 2.0 * tan(camera()->fieldOfView() / 2.0) * + fabs((camera()->frame()->coordinatesOf(center)).Z()) / camera()->screenHeight(); + trans = camera()->frame()->orientation().rotate(trans); + return AMCAX::Coord3(trans.X(), trans.Y(), trans.Z()); } void RenderViewer::clearSelected() { - dataManager_->clearSelected(); - select_info_list_.clear(); - selectTool_->clearSelected(); + dataManager_->clearSelected(); + select_info_list_.clear(); + selectTool_->clearSelected(); } void RenderViewer::clearClicked() { - click_info_list_.clear(); - operation_point_.clear(); + click_info_list_.clear(); + operation_point_.clear(); } void RenderViewer::setDataManger(DataManager* dataManager) { - dataManager_ = dataManager; - selectTool_->setDataManger(dataManager); + dataManager_ = dataManager; + selectTool_->setDataManger(dataManager); } void RenderViewer::setCore(AMCore* core) { - coreCommand_ = core; - core->setRecord(record); + coreCommand_ = core; + //core->setRecord(record); } void RenderViewer::slotUndo() { - clearSelected(); - coreCommand_->Undo(); - createOperateAxis(); - update(); + setOperateType(OperationType::NO_OPERATION); + clearSelected(); + coreCommand_->Undo(); + createOperateAxis(); + update(); } void RenderViewer::slotRedo() { - clearSelected(); - coreCommand_->Redo(); - createOperateAxis(); - update(); + setOperateType(OperationType::NO_OPERATION); + clearSelected(); + coreCommand_->Redo(); + createOperateAxis(); + update(); +} + +// ==================== Mesh TAB ==================== +void RenderViewer::slotCreateSingleFaceMesh() +{ + MeshObjectOperation(SelectModel::CLICK_MODEL, OperationType::CLICK_OPERATION_SELECT, + MeshOperationType::MeshFaceAppend); +} + +void RenderViewer::slotCreatPlaneMesh() { + dialog->addElements(objectFillOuts[OPERATE_MESH_PLANE]); + dialog->setWindowTitle(tr("Create a plane mesh")); + connect(dialog, &ParamDialog::dataReady, this, &RenderViewer::slotCreatPlaneMeshAccepted); + dialog->open(); +} +void RenderViewer::slotCreatPlaneMeshAccepted(const ParamDialog::Response& data) { + + MPoint3 p0 = MPoint3(data[0].second.point.X(), data[0].second.point.Y(), data[0].second.point.Z()); + MPoint3 p1 = MPoint3(data[1].second.point.X(), data[1].second.point.Y(), data[1].second.point.Z()); + + size_t u_num = data[2].second.s; + size_t v_num = data[3].second.s; + coreCommand_->createPlaneMeshObject(p0, p1, u_num, v_num); + update(); + + objectFillOuts[OPERATE_MESH_PLANE][0].def.point = data[0].second.point; + objectFillOuts[OPERATE_MESH_PLANE][1].def.point = data[1].second.point; + objectFillOuts[OPERATE_MESH_PLANE][2].def.s = u_num; + objectFillOuts[OPERATE_MESH_PLANE][3].def.s = v_num; +} + +void RenderViewer::slotCreatCubeMesh() { + dialog->addElements(objectFillOuts[OPERATE_MESH_CUBE]); + dialog->setWindowTitle(tr("Create a cube mesh")); + connect(dialog, &ParamDialog::dataReady, this, &RenderViewer::slotCreatCubeMeshAccepted); + dialog->open(); +} + +void RenderViewer::slotCreatCubeMeshAccepted(const ParamDialog::Response& data) { + + AMCAX::Coord3 c_co = data[0].second.point; + AMCAX::Coord3 s_co = data[1].second.point; + + MPoint3 c(c_co.X(), c_co.Y(), c_co.Z()); + MPoint3 s(s_co.X(), s_co.Y(), s_co.Z()); + size_t x_num = data[2].second.s; + size_t y_num = data[3].second.s; + size_t z_num = data[4].second.s; + coreCommand_->createCubeMeshObject(c, s, x_num, y_num, z_num); + update(); + + objectFillOuts[OPERATE_MESH_CUBE][0].def.point = c_co; + objectFillOuts[OPERATE_MESH_CUBE][1].def.point = s_co; + objectFillOuts[OPERATE_MESH_CUBE][2].def.s = x_num; + objectFillOuts[OPERATE_MESH_CUBE][3].def.s = y_num; + objectFillOuts[OPERATE_MESH_CUBE][4].def.s = z_num; +} + +void RenderViewer::initTSpline() +{ + objectFillOuts[OPERATE_TSPLINE_PLANE] = QVector{ + ParamDialog::RequestUnit(ParamDialog::TYPE_MPOINT3_2, tr("p0p"), ParamDialog::DataUnit{MPoint3(0.0, 0.0, 0.0)}), + ParamDialog::RequestUnit(ParamDialog::TYPE_MPOINT3_2, tr("p1p"), ParamDialog::DataUnit{MPoint3(2.0, 2.0, 0.0)}), + ParamDialog::RequestUnit(ParamDialog::TYPE_SIZE_T, tr("u_num"), ParamDialog::DataUnit{3Ui64}), + ParamDialog::RequestUnit(ParamDialog::TYPE_SIZE_T, tr("v_num"), ParamDialog::DataUnit{3Ui64}), + }; + objectFillOuts[OPERATE_TSPLINE_CUBE] = QVector{ + ParamDialog::RequestUnit(ParamDialog::TYPE_MPOINT3, tr("first"), ParamDialog::DataUnit{MPoint3{.0, .0, .0}}), + ParamDialog::RequestUnit(ParamDialog::TYPE_MPOINT3, tr("second"), ParamDialog::DataUnit{MPoint3{1.0, 1.0, 1.0}}), + ParamDialog::RequestUnit(ParamDialog::TYPE_SIZE_T, tr("x_num"), ParamDialog::DataUnit{1Ui64}), + ParamDialog::RequestUnit(ParamDialog::TYPE_SIZE_T, tr("y_num"), ParamDialog::DataUnit{1Ui64}), + ParamDialog::RequestUnit(ParamDialog::TYPE_SIZE_T, tr("z_num"), ParamDialog::DataUnit{1Ui64}), + }; + objectFillOuts[OPERATE_TSPLINE_UVSPHERE] = QVector{ + ParamDialog::RequestUnit(ParamDialog::TYPE_MPOINT3, tr("center"), ParamDialog::DataUnit{MPoint3{.0, .0, .0}}), + ParamDialog::RequestUnit(ParamDialog::TYPE_DOUBLE, tr("radius"), ParamDialog::DataUnit{1.0}), + ParamDialog::RequestUnit(ParamDialog::TYPE_SIZE_T, tr("rf_num"), ParamDialog::DataUnit{8Ui64}), + ParamDialog::RequestUnit(ParamDialog::TYPE_SIZE_T, tr("vf_num"), ParamDialog::DataUnit{8Ui64}), + }; + objectFillOuts[OPERATE_TSPLINE_QUADSPHERE] = QVector{ + ParamDialog::RequestUnit(ParamDialog::TYPE_MPOINT3, tr("center"), ParamDialog::DataUnit{MPoint3{.0, .0, .0}}), + ParamDialog::RequestUnit(ParamDialog::TYPE_DOUBLE, tr("radius"), ParamDialog::DataUnit{1.0}), + ParamDialog::RequestUnit(ParamDialog::TYPE_SIZE_T, tr("subtime"), ParamDialog::DataUnit{2Ui64}), + }; + objectFillOuts[OPERATE_TSPLINE_CYLINDER] = QVector{ + ParamDialog::RequestUnit(ParamDialog::TYPE_MPOINT3, tr("b_center"), ParamDialog::DataUnit{MPoint3{.0, .0, .0}}), + ParamDialog::RequestUnit(ParamDialog::TYPE_MPOINT3, tr("axis"), ParamDialog::DataUnit{MPoint3{.0, .0, 1.0}}), + ParamDialog::RequestUnit(ParamDialog::TYPE_DOUBLE, tr("radius"), ParamDialog::DataUnit{1.0}), + ParamDialog::RequestUnit(ParamDialog::TYPE_DOUBLE, tr("height"), ParamDialog::DataUnit{2.0}), + ParamDialog::RequestUnit(ParamDialog::TYPE_SIZE_T, tr("rf_num"), ParamDialog::DataUnit{8Ui64}), + ParamDialog::RequestUnit(ParamDialog::TYPE_SIZE_T, tr("vf_num"), ParamDialog::DataUnit{4Ui64}), + ParamDialog::RequestUnit(ParamDialog::TYPE_BOOL, tr("top"), ParamDialog::DataUnit{true}), + ParamDialog::RequestUnit(ParamDialog::TYPE_BOOL, tr("bottom"), ParamDialog::DataUnit{true}), + }; + objectFillOuts[OPERATE_TSPLINE_CONE] = QVector{ + ParamDialog::RequestUnit(ParamDialog::TYPE_MPOINT3, tr("b_center"), ParamDialog::DataUnit{MPoint3{.0, .0, .0}}), + ParamDialog::RequestUnit(ParamDialog::TYPE_MPOINT3, tr("axis"), ParamDialog::DataUnit{MPoint3{.0, .0, 1.0}}), + ParamDialog::RequestUnit(ParamDialog::TYPE_DOUBLE, tr("radius"), ParamDialog::DataUnit{1.0}), + ParamDialog::RequestUnit(ParamDialog::TYPE_DOUBLE, tr("height"), ParamDialog::DataUnit{2.0}), + ParamDialog::RequestUnit(ParamDialog::TYPE_SIZE_T, tr("rf_num"), ParamDialog::DataUnit{8Ui64}), + ParamDialog::RequestUnit(ParamDialog::TYPE_SIZE_T, tr("vf_num"), ParamDialog::DataUnit{4Ui64}), + ParamDialog::RequestUnit(ParamDialog::TYPE_BOOL, tr("bottom"), ParamDialog::DataUnit{true}), + }; + objectFillOuts[OPERATE_TSPLINE_TORUS] = QVector{ + ParamDialog::RequestUnit(ParamDialog::TYPE_MPOINT3, tr("center"), ParamDialog::DataUnit{MPoint3{.0, .0, .0}}), + ParamDialog::RequestUnit(ParamDialog::TYPE_DOUBLE, tr("radius0"), ParamDialog::DataUnit{1.0}), + ParamDialog::RequestUnit(ParamDialog::TYPE_DOUBLE, tr("radius1"), ParamDialog::DataUnit{0.5}), + ParamDialog::RequestUnit(ParamDialog::TYPE_SIZE_T, tr("rf_num"), ParamDialog::DataUnit{8Ui64}), + ParamDialog::RequestUnit(ParamDialog::TYPE_SIZE_T, tr("vf_num"), ParamDialog::DataUnit{4Ui64}), + }; + objectFillOuts[OPERATE_TSPLINE_CIRCULAR] = QVector{ + ParamDialog::RequestUnit(ParamDialog::TYPE_MPOINT3, tr("center"), ParamDialog::DataUnit{MPoint3{.0, .0, .0}}), + ParamDialog::RequestUnit(ParamDialog::TYPE_DOUBLE, tr("radius"), ParamDialog::DataUnit{2.0}), + ParamDialog::RequestUnit(ParamDialog::TYPE_DOUBLE_PI, tr("angle"), ParamDialog::DataUnit{0.5}), + ParamDialog::RequestUnit(ParamDialog::TYPE_SIZE_T, tr("c_num"), ParamDialog::DataUnit{4Ui64}), + }; +} + +void RenderViewer::initMesh() +{ + objectFillOuts[OPERATE_MESH_PLANE] = QVector{ + ParamDialog::RequestUnit(ParamDialog::TYPE_MPOINT3_2, tr("p0"), ParamDialog::DataUnit{MPoint3{.0, .0, .0}}), + ParamDialog::RequestUnit(ParamDialog::TYPE_MPOINT3_2, tr("p1"), ParamDialog::DataUnit{MPoint3{2.0, 2.0, 0.0}}), + ParamDialog::RequestUnit(ParamDialog::TYPE_SIZE_T, tr("u_num"), ParamDialog::DataUnit{2Ui64}), + ParamDialog::RequestUnit(ParamDialog::TYPE_SIZE_T, tr("v_num"), ParamDialog::DataUnit{2Ui64}), + }; + + objectFillOuts[OPERATE_MESH_CUBE] = QVector{ + ParamDialog::RequestUnit(ParamDialog::TYPE_MPOINT3, tr("first"), ParamDialog::DataUnit{MPoint3{.0, .0, .0}}), + ParamDialog::RequestUnit(ParamDialog::TYPE_MPOINT3, tr("second"), ParamDialog::DataUnit{MPoint3{1.0, 1.0, 1.0}}), + ParamDialog::RequestUnit(ParamDialog::TYPE_SIZE_T, tr("x_num"), ParamDialog::DataUnit{2Ui64}), + ParamDialog::RequestUnit(ParamDialog::TYPE_SIZE_T, tr("y_num"), ParamDialog::DataUnit{2Ui64}), + ParamDialog::RequestUnit(ParamDialog::TYPE_SIZE_T, tr("z_num"), ParamDialog::DataUnit{2Ui64}), + }; +} + +void RenderViewer::slotMeshSubdiveCatmullClark() { + MeshObjectOperation(SelectModel::OBJECT_MODEL, OperationType::ENTER_OPERATION, + MeshOperationType::MeshSubdiceCC); +} + +void RenderViewer::slotMeshSubdiveLoop() { + MeshObjectOperation(SelectModel::OBJECT_MODEL, OperationType::ENTER_OPERATION, + MeshOperationType::MeshSubdiveLoop); +} +void RenderViewer::slotMeshTriangulation() { + MeshObjectOperation(SelectModel::OBJECT_MODEL, OperationType::ENTER_OPERATION, + MeshOperationType::MeshTriangulate); +} + +void RenderViewer::slotSetWorkPlane() { + changeGridIsDrawn(); + update(); +} + +void RenderViewer::slotDeleteObject() { + BaseObjectOperation(SelectModel::OBJECT_MODEL, OperationType::ENTER_OPERATION, + MeshOperationType::MeshDelete); +} + +void RenderViewer::slotMirrorObject() { + BaseObjectOperation(SelectModel::OBJECT_MODEL, OperationType::ENTER_OPERATION, + MeshOperationType::MeshMirror); +} + +void RenderViewer::TSplineObjectOperation(const SelectModel& s_model, + const OperationType& op_type, + const MeshOperationType + mesh_operate_type) +{ + coreCommand_->setOperationDataType(OperationDataType::TSPLINEU_TYPE); + BaseObjectOperation(s_model, op_type, mesh_operate_type); +} + +void RenderViewer::slotCreateSingleFaceTSpline() { + TSplineObjectOperation(SelectModel::CLICK_MODEL, OperationType::CLICK_OPERATION_SELECT, + MeshOperationType::MeshFaceAppend); +} + +void RenderViewer::slotCreatePlaneTSpline() { + dialog->addElements(objectFillOuts[OPERATE_TSPLINE_PLANE]); + + dialog->setWindowTitle(tr("Create a Plane TSpline")); + connect(dialog, &ParamDialog::dataReady, this, &RenderViewer::slotCreatePlaneTSplineAccepted); + dialog->open(); +} + +void RenderViewer::slotCreatePlaneTSplineAccepted(const ParamDialog::Response& data) { + MPoint3 p0(data[0].second.point); + MPoint3 p1(data[1].second.point); + size_t u_num = data[2].second.s; + size_t v_num = data[3].second.s; + coreCommand_->createPlaneObject(p0, p1, u_num, v_num); + update(); + + // updating the value stored in objectFillOuts so that the next time the dialog launches + // the data will remain the same as the user used the previous time + objectFillOuts[OPERATE_TSPLINE_PLANE][0].def.point = p0.Coord(); + objectFillOuts[OPERATE_TSPLINE_PLANE][1].def.point = p1.Coord(); + objectFillOuts[OPERATE_TSPLINE_PLANE][2].def.s = u_num; + objectFillOuts[OPERATE_TSPLINE_PLANE][3].def.s = v_num; +} + +void RenderViewer::slotCreateCubeTSpline() { + dialog->addElements(objectFillOuts[OPERATE_TSPLINE_CUBE]); + dialog->setWindowTitle(tr("Create a Cube TSpline")); + connect(dialog, &ParamDialog::dataReady, this, &RenderViewer::slotCreateCubeTSplineAccepted); + dialog->open(); +} + +void RenderViewer::slotCreateCubeTSplineAccepted(const ParamDialog::Response& data) { + MPoint3 c(data[0].second.point); + MPoint3 s(data[1].second.point); + size_t x_num = data[2].second.s; + size_t y_num = data[3].second.s; + size_t z_num = data[4].second.s; + coreCommand_->createCubeObject(c, s, x_num, y_num, z_num); + update(); + + // updating the value stored in objectFillOuts so that the next time the dialog launches + // the data will remain the same as the user used the previous time + objectFillOuts[OPERATE_TSPLINE_CUBE][0].def.point = c.Coord(); + objectFillOuts[OPERATE_TSPLINE_CUBE][1].def.point = s.Coord(); + objectFillOuts[OPERATE_TSPLINE_CUBE][2].def.s = x_num; + objectFillOuts[OPERATE_TSPLINE_CUBE][3].def.s = y_num; + objectFillOuts[OPERATE_TSPLINE_CUBE][4].def.s = z_num; +} + +void RenderViewer::slotCreateUVSphereTSpline() { + dialog->addElements(objectFillOuts[OPERATE_TSPLINE_UVSPHERE]); + dialog->setWindowTitle(tr("Create a UVSphere TSpline")); + connect(dialog, &ParamDialog::dataReady, this, &RenderViewer::slotCreateUVSphereTSplineAccepted); + dialog->open(); +} + +void RenderViewer::slotCreateUVSphereTSplineAccepted(const ParamDialog::Response& data) { + MPoint3 c(data[0].second.point); + double radius = data[1].second.d; + size_t rf_num = data[2].second.s; + size_t vf_num = data[3].second.s; + coreCommand_->createUVSphereObject(c, radius, rf_num, vf_num); + update(); + + objectFillOuts[OPERATE_TSPLINE_UVSPHERE][0].def.point = c.Coord(); + objectFillOuts[OPERATE_TSPLINE_UVSPHERE][1].def.d = radius; + objectFillOuts[OPERATE_TSPLINE_UVSPHERE][2].def.s = rf_num; + objectFillOuts[OPERATE_TSPLINE_UVSPHERE][3].def.s = vf_num; +} + +void RenderViewer::slotCreateQuadSphereTSpline() { + dialog->addElements(objectFillOuts[OPERATE_TSPLINE_QUADSPHERE]); + dialog->setWindowTitle(tr("Create a Quad Sphere TSpline")); + connect(dialog, &ParamDialog::dataReady, this, &RenderViewer::slotCreateQuadSphereTSplineAccepted); + dialog->open(); +} +void RenderViewer::slotCreateQuadSphereTSplineAccepted(const ParamDialog::Response& data) { + MPoint3 c(data[0].second.point); + double radius = data[1].second.d; + size_t subtime = data[2].second.s; + coreCommand_->createSubdSphereObject(c, radius, subtime); + update(); + + objectFillOuts[OPERATE_TSPLINE_QUADSPHERE][0].def.point = c.Coord(); + objectFillOuts[OPERATE_TSPLINE_QUADSPHERE][1].def.d = radius; + objectFillOuts[OPERATE_TSPLINE_QUADSPHERE][2].def.s = subtime; +} + + +void RenderViewer::slotCreateCylinderTSpline() { + dialog->addElements(objectFillOuts[OPERATE_TSPLINE_CYLINDER]); + dialog->setWindowTitle(tr("Create a Cylinder TSpline")); + connect(dialog, &ParamDialog::dataReady, this, &RenderViewer::slotCreateCylinderTSplineAccepted); + dialog->open(); +} +void RenderViewer::slotCreateCylinderTSplineAccepted(const ParamDialog::Response& data) { + MPoint3 c(data[0].second.point); + MVector3 v(data[1].second.point); + double radius = data[2].second.d; + double height = data[3].second.d; + size_t rf_num = data[4].second.s; + size_t vf_num = data[5].second.s; + bool top = data[6].second.b; + bool bottom = data[7].second.b; + coreCommand_->createCylinderObject(c, v, radius, height, rf_num, vf_num, top, bottom); + update(); + + objectFillOuts[OPERATE_TSPLINE_CYLINDER][0].def.point = c.Coord(); + objectFillOuts[OPERATE_TSPLINE_CYLINDER][1].def.vec = v.Coord(); + objectFillOuts[OPERATE_TSPLINE_CYLINDER][2].def.d = radius; + objectFillOuts[OPERATE_TSPLINE_CYLINDER][3].def.d = height; + objectFillOuts[OPERATE_TSPLINE_CYLINDER][4].def.s = rf_num; + objectFillOuts[OPERATE_TSPLINE_CYLINDER][5].def.s = vf_num; + objectFillOuts[OPERATE_TSPLINE_CYLINDER][6].def.b = top; + objectFillOuts[OPERATE_TSPLINE_CYLINDER][7].def.b = bottom; +} + +void RenderViewer::slotCreateConeTSpline() { + dialog->addElements(objectFillOuts[OPERATE_TSPLINE_CONE]); + dialog->setWindowTitle(tr("Create a Cone TSpline")); + connect(dialog, &ParamDialog::dataReady, this, &RenderViewer::slotCreateConeTSplineAccepted); + dialog->open(); +} +void RenderViewer::slotCreateConeTSplineAccepted(const ParamDialog::Response& data) { + MPoint3 c(data[0].second.point); + MVector3 v(data[1].second.point); + double radius = data[2].second.d; + double height = data[3].second.d; + size_t rf_num = data[4].second.s; + size_t vf_num = data[5].second.s; + bool bottom = data[6].second.b; + coreCommand_->createConeObject(c, v, radius, height, rf_num, vf_num, bottom); + update(); + + objectFillOuts[OPERATE_TSPLINE_CONE][0].def.point = c.Coord(); + objectFillOuts[OPERATE_TSPLINE_CONE][1].def.point = v.Coord(); + objectFillOuts[OPERATE_TSPLINE_CONE][2].def.d = radius; + objectFillOuts[OPERATE_TSPLINE_CONE][3].def.d = height; + objectFillOuts[OPERATE_TSPLINE_CONE][4].def.s = rf_num; + objectFillOuts[OPERATE_TSPLINE_CONE][5].def.s = vf_num; + objectFillOuts[OPERATE_TSPLINE_CONE][6].def.b = bottom; +} + +void RenderViewer::slotCreateTorusTSpline() { + dialog->addElements(objectFillOuts[OPERATE_TSPLINE_TORUS]); + dialog->setWindowTitle(tr("Create a Torus TSpline")); + connect(dialog, &ParamDialog::dataReady, this, &RenderViewer::slotCreateTorusTSplineAccepted); + dialog->open(); +} +void RenderViewer::slotCreateTorusTSplineAccepted(const ParamDialog::Response& data) { + MPoint3 c(data[0].second.point); + double radius0 = data[1].second.d; + double radius1 = data[2].second.d; + size_t rf_num = data[3].second.s; + size_t vf_num = data[4].second.s; + coreCommand_->creatTourObject(c, radius0, radius1, rf_num, vf_num); + update(); + + objectFillOuts[OPERATE_TSPLINE_TORUS][0].def.point = c.Coord(); + objectFillOuts[OPERATE_TSPLINE_TORUS][1].def.d = radius0; + objectFillOuts[OPERATE_TSPLINE_TORUS][2].def.d = radius1; + objectFillOuts[OPERATE_TSPLINE_TORUS][3].def.s = rf_num; + objectFillOuts[OPERATE_TSPLINE_TORUS][4].def.s = vf_num; +} + +void RenderViewer::slotCreateCircularTSpline() { + dialog->addElements(objectFillOuts[OPERATE_TSPLINE_CIRCULAR]); + dialog->setWindowTitle(tr("Create a Circular TSpline")); + connect(dialog, &ParamDialog::dataReady, this, &RenderViewer::slotCreateCircularTSplineAccepted); + dialog->open(); +} +void RenderViewer::slotCreateCircularTSplineAccepted(const ParamDialog::Response& data) { + MPoint3 c(data[0].second.point); + // //double angle = M_PI * 2; + // //size_t seg = 8; + // double angle = M_PI / 2; + // //size_t seg = angle / (M_PI / 2) + 1; + // size_t seg = 4; + double radius = data[1].second.d; + double angle = data[2].second.d; + size_t c_num = data[3].second.s; + coreCommand_->createCircular(c, radius, angle * M_PI, c_num); + update(); + + objectFillOuts[OPERATE_TSPLINE_CIRCULAR][0].def.point = c.Coord(); + objectFillOuts[OPERATE_TSPLINE_CIRCULAR][1].def.d = radius; + objectFillOuts[OPERATE_TSPLINE_CIRCULAR][2].def.d = angle; + objectFillOuts[OPERATE_TSPLINE_CIRCULAR][3].def.s = c_num; +} + +void RenderViewer::slotAddCreaseEdge() +{ + TSplineObjectOperation(SelectModel::EDGE_MODEL, OperationType::ENTER_OPERATION, MeshOperationType::MeshAddCreaseEdge); +} + +void RenderViewer::slotRemoveCreaseEdge() +{ + TSplineObjectOperation(SelectModel::EDGE_MODEL, OperationType::ENTER_OPERATION, MeshOperationType::MeshRemoveCreaseEdge); +} + +void RenderViewer::slotTsplineUniform() { + BaseObjectOperation(SelectModel::OBJECT_MODEL, OperationType::ENTER_OPERATION, + MeshOperationType::TSplineUniform); + +} +void RenderViewer::slotTsplineRepair() { + BaseObjectOperation(SelectModel::OBJECT_MODEL, OperationType::ENTER_OPERATION, + MeshOperationType::TSplineRepair); +} + +void RenderViewer::slotBRepExtrudeMesh() +{ + BaseObjectOperation(SelectModel::FACE_MODEL, OperationType::CTRL_OPERATION, + MeshOperationType::MeshExtrudeFaceNew); } \ No newline at end of file diff --git a/Src/Windows/RenderViewer.h b/Src/Windows/RenderViewer.h index c9fa98f..6f1bbdd 100644 --- a/Src/Windows/RenderViewer.h +++ b/Src/Windows/RenderViewer.h @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #pragma once @@ -25,287 +25,364 @@ namespace acamcad { -class DataManager; -class AMCore; -class SelectTool; + class DataManager; + class AMCore; + class SelectTool; + + class RenderViewer : public QGLViewer + { + Q_OBJECT + private: // type def + struct SelectAction { + SelectModel model; + QAction* action; + SelectAction(const SelectModel& sm, QAction*& act) : + model(sm), action(act) { } + SelectAction() {} + AMCAX::Coord3 mouseMoveTrans(const QPoint& e_point, const AMCAX::Coord3& o_center); + }; + + enum OperateType { + + OPERATE_BREP_PLANE, + OPERATE_BREP_POLYGON, + OPERATE_BREP_CUBE, + OPERATE_BREP_SPHERE, + OPERATE_BREP_CYLINDER, + OPERATE_BREP_CONE, + OPERATE_BREP_TORUS, + OPERATE_BREP_PRISM, + OPERATE_BREP_EXTRUDE, + + OPERATE_MESH_PLANE, + OPERATE_MESH_CUBE, + + OPERATE_TSPLINE_PLANE, + OPERATE_TSPLINE_CUBE, + OPERATE_TSPLINE_UVSPHERE, + OPERATE_TSPLINE_QUADSPHERE, + OPERATE_TSPLINE_CYLINDER, + OPERATE_TSPLINE_CONE, + OPERATE_TSPLINE_TORUS, + OPERATE_TSPLINE_CIRCULAR, + }; + + public: + RenderViewer(QWidget* parent = nullptr, Qt::WindowFlags flags = Qt::WindowFlags()); + virtual ~RenderViewer(); + + protected: + virtual void draw(); + virtual void postDraw(); + + virtual void init(); + virtual QString helpString() const; + + virtual void mousePressEvent(QMouseEvent* e); + virtual void mouseMoveEvent(QMouseEvent* e); + virtual void mouseReleaseEvent(QMouseEvent* e); + virtual void mouseDoubleClickEvent(QMouseEvent* e); + + virtual void keyPressEvent(QKeyEvent*); + virtual void keyReleaseEvent(QKeyEvent*); + + private: + void initTSpline(); + void initMesh(); + void initBRep(); + + private: + void beginPickOperationSingle(); + void beginEnterOperation(); + + /// do with the click operation, such as append face; + void beginEnterClickOperation(); + + void cancelOperation(); + + AMCAX::Coord3 mouseMoveTrans(const QPoint& e_point, const AMCAX::Coord3& o_center); + + /*! @name Select Method */ + public: + bool select(const QMouseEvent* ev, bool is_select_muti); + void beginSelection(const QPoint& point); + void endSelection(const QPoint& point, SelectModel type); + + public: + void selectFrame(const QPoint& point, PyramidInf& frustum); + + public: + bool selectOpAxis(const QMouseEvent* ev); + void selectDrawAxis(); + void endSelectionAxis(const QPoint& point); -class RenderViewer : public QGLViewer -{ - Q_OBJECT -private: // type def - struct SelectAction { - SelectModel model; - QAction *action; - SelectAction(const SelectModel &sm, QAction *&act): - model(sm), action(act) { } - SelectAction(){} - AMCAX::Coord3 mouseMoveTrans(const QPoint& e_point, const AMCAX::Coord3& o_center); - }; + public: + GLuint* selectBuffer() { return selectBuffer_; } + /*! Default value is 400, 100 for 1 object with 4 size. */ + void setSelectBufferSize(int size); + int selectBufferSize() const { return selectBufferSize_; } + + /*! Default value is 3 pixels. */ + int selectRegionWidth() const { return selectRegionWidth_; } + /*! Default value is 3 pixels. */ + int selectRegionHeight() const { return selectRegionHeight_; } + void setSelectRegionWidth(int width) { selectRegionWidth_ = width; } + void setSelectRegionHeight(int height) { selectRegionHeight_ = height; } + + void setSelectRegionWidthDefault() { selectRegionWidth_ = 3; } + void setSelectRegionHeightDefault() { selectRegionHeight_ = 3; } + private: + int selectRegionWidth_, selectRegionHeight_; + GLuint* selectBuffer_; + int selectBufferSize_; + int selectedId_; + int selectedSubsetId_; + + std::vector< SelectInfoWithCamera > select_info_list_; + + GLUquadricObj* glu_cylinder_;// = gluNewQuadric(); + ///GLUquadricObj* glu_shpere_; + + private: + void setFrameSelection(bool is_frame_select) { is_frame_selection_ = is_frame_select; } + bool is_frame_selection_; //标识是否开始框选 + QRect frame_selection_rectangle_; + std::vector selectedFrame_id_; + + Qt::MouseButton click_buttom; + + public: + void setSelectModel(SelectModel model) { select_model_ = model; } + SelectModel getSelectModel() { return select_model_; } + + void clearSelected(); + + private: + SelectModel select_model_; - enum OperateType { - - OPERATE_BREP_PLANE, - OPERATE_BREP_POLYGON, - OPERATE_BREP_CUBE, - OPERATE_BREP_SPHERE, - OPERATE_BREP_CYLINDER, - OPERATE_BREP_CONE, - OPERATE_BREP_TORUS, - OPERATE_BREP_PRISM, - OPERATE_BREP_EXTRUDE, - }; - -public: - RenderViewer(QWidget* parent = nullptr, Qt::WindowFlags flags = Qt::WindowFlags()); - -protected: - virtual void draw(); - virtual void postDraw(); - - virtual void init(); - virtual QString helpString() const; - - virtual void mousePressEvent(QMouseEvent* e); - virtual void mouseMoveEvent(QMouseEvent* e); - virtual void mouseReleaseEvent(QMouseEvent* e); - virtual void mouseDoubleClickEvent(QMouseEvent* e); - - virtual void keyPressEvent(QKeyEvent*); - virtual void keyReleaseEvent(QKeyEvent*); - -private: - void initTSpline(); - void initMesh(); - void initBRep(); + public: + void addSelector(const SelectModel& sm, QAction*& act); -private: - void beginPickOperationSingle(); - void beginEnterOperation(); + Q_SIGNALS: + void selectedModelChanged(); - /// do with the click operation, such as append face; - void beginEnterClickOperation(); + private: + void setSelectInfoCamera(const QPoint& pixel, acamcad::SelectInfoWithCamera& s_info); - void cancelOperation(); + /*! @name Click Method */ + public: + void click(const QMouseEvent* ev); - AMCAX::Coord3 mouseMoveTrans(const QPoint& e_point, const AMCAX::Coord3& o_center); + void clearClicked(); + private: + std::vector< ClickInfo > click_info_list_; - /*! @name Select Method */ -public: - bool select(const QMouseEvent* ev, bool is_select_muti); - void beginSelection(const QPoint& point); - void endSelection(const QPoint& point, SelectModel type); + /*! @name Draw Method */ + public: + void setDrawModel(DrawModel model) { draw_model_ = model; } + DrawModel getDrawModel() { return draw_model_; } -public: - void selectFrame(const QPoint& point, PyramidInf& frustum); + private: + DrawModel draw_model_; -public: - bool selectOpAxis(const QMouseEvent* ev); - void selectDrawAxis(); - void endSelectionAxis(const QPoint& point); + public: + void setScenesCenter(); -public: - GLuint* selectBuffer() { return selectBuffer_; } - /*! Default value is 400, 100 for 1 object with 4 size. */ - void setSelectBufferSize(int size); - int selectBufferSize() const { return selectBufferSize_; } + void setWorkPlane(); - /*! Default value is 3 pixels. */ - int selectRegionWidth() const { return selectRegionWidth_; } - /*! Default value is 3 pixels. */ - int selectRegionHeight() const { return selectRegionHeight_; } - void setSelectRegionWidth(int width) { selectRegionWidth_ = width; } - void setSelectRegionHeight(int height) { selectRegionHeight_ = height; } - void setSelectRegionWidthDefault() { selectRegionWidth_ = 3; } - void setSelectRegionHeightDefault() { selectRegionHeight_ = 3; } -private: - int selectRegionWidth_, selectRegionHeight_; - GLuint* selectBuffer_; - int selectBufferSize_; - int selectedId_; - int selectedSubsetId_; - - std::vector< SelectInfoWithCamera > select_info_list_; + private: + // 绘制选中的物体 + void drawSelectedElement(); -private: - void setFrameSelection(bool is_frame_select) { is_frame_selection_ = is_frame_select; } - bool is_frame_selection_; //标识是否开始框选 - QRect frame_selection_rectangle_; - std::vector selectedFrame_id_; + void drawSelectMovePoint() const; + void drawClickedElement() const; + void drawSelectionRectangle(QRect& rectangle_) const; - Qt::MouseButton click_buttom; + private: + void drawGrid(double size, int nbSubdivisions); + void drawWorkPlaneGrid(double size = 5.0, int nbSubdivisions = 50); //size 是 grid 的总 size -public: - void setSelectModel(SelectModel model) { select_model_ = model; } - SelectModel getSelectModel() { return select_model_; } + void setGridIsDrawn(bool draw = true) { is_draw_grid_ = draw; } + void changeGridIsDrawn() { setGridIsDrawn(!is_draw_grid_); } - void clearSelected(); - -private: - SelectModel select_model_; - -public: - void addSelector(const SelectModel &sm, QAction *&act); - -Q_SIGNALS: - void selectedModelChanged(); + void drawWorldAxis(); -private: - void setSelectInfoCamera(const QPoint& pixel, acamcad::SelectInfoWithCamera& s_info); + void drawAxis(); - /*! @name Click Method */ -public: - void click(const QMouseEvent* ev); + bool createOperateAxis(); + AxisOperation* o_axis_; - void clearClicked(); -private: - std::vector< ClickInfo > click_info_list_; + PlaneObject* work_plane_; + bool is_draw_grid_; - /*! @name Draw Method */ -public: - void setDrawModel(DrawModel model) { draw_model_ = model; } - DrawModel getDrawModel() { return draw_model_; } + public: + void setOperateType(OperationType op_type) { operate_type_ = op_type; } + OperationType operateType() { return operate_type_; } + void setOperationVector(const AMCAX::Coord3d& vector) { operation_vector_ = vector; } + void setRecord(Record* record) { record = record; } + private: + OperationType operate_type_; -private: - DrawModel draw_model_; + QVector selectActions; + QMap> objectFillOuts; -public: - void setScenesCenter(); + private: + //相机起点,选择射线方向 + qglviewer::Vec view_ori_, view_dir_; + //所有选中物体的中心的和,这个没有除以物体数目 + AMCAX::Coord3 select_object_center_; - void setWorkPlane(); + //prevPos_ 之前的鼠标位置,用于鼠标的迭代更新(鼠标移动) + //pressPos_ 鼠标点击时的位置 + QPoint prevPos_, pressPos_; + //operation_point_ 在交互对象上的点 + //operation_vector_ 约束交互的移动方向 + std::vector operation_point_; + // std::vector operation_vector_; + // MVector3 operation_point_; + AMCAX::Coord3 operation_vector_; -private: - // 绘制选中的物体 - void drawSelectedElement(); + bool is_pick_move_select_; //标识是否可以开始移动 - void drawSelectMovePoint() const; - void drawClickedElement() const; - void drawSelectionRectangle(QRect& rectangle_) const; + public: + void setDataManger(DataManager* dataManager); + void setCore(AMCore* core); -private: - void drawGrid(double size, int nbSubdivisions); - void drawWorkPlaneGrid(double size = 5.0, int nbSubdivisions = 50); //size 是 grid 的总 size + private: + DataManager* dataManager_; + AMCore* coreCommand_; + SelectTool* selectTool_; + ParamDialog* dialog; + //acamcad::Record record; - void setGridIsDrawn(bool draw = true) { is_draw_grid_ = draw; } - void changeGridIsDrawn() { setGridIsDrawn(!is_draw_grid_); } + private slots: + void selectCheckChanged(); - void drawWorldAxis(); - bool createOperateAxis(); - AxisOperation* o_axis_; - PlaneObject* work_plane_; - bool is_draw_grid_; + private: + void BaseObjectOperation(const SelectModel& s_model, + const OperationType& op_type, const MeshOperationType mesh_operate_type); + void BRepObjectOperation(const SelectModel& s_model, + const OperationType& op_type, const MeshOperationType mesh_operate_type); + void MeshObjectOperation(const SelectModel& s_model, + const OperationType& op_type, const MeshOperationType mesh_operate_type); + void TSplineObjectOperation(const SelectModel& s_model, + const OperationType& op_type, const MeshOperationType mesh_operate_type); -public: - void setOperateType(OperationType op_type) { operate_type_ = op_type; } - OperationType operateType() { return operate_type_; } - void setOperationVector(const AMCAX::Coord3d & vector) { operation_vector_ = vector; } - void setRecord(Record* record) { record = record; } -private: - OperationType operate_type_; + void disconnectDialog(); - QVector selectActions; - QMap> objectFillOuts; + public slots: + void slotUndo(); + void slotRedo(); -private: - //相机起点,选择射线方向 - qglviewer::Vec view_ori_, view_dir_; - //所有选中物体的中心的和,这个没有除以物体数目 - AMCAX::Coord3 select_object_center_; - //prevPos_ 之前的鼠标位置,用于鼠标的迭代更新(鼠标移动) - //pressPos_ 鼠标点击时的位置 - QPoint prevPos_, pressPos_; + friend class OperateToolBar; + friend class ACAMWindow; + private slots: // base tab + void slotRenderMode_Wire(); + void slotRenderMode_Rendering(); + void slotRenderMode_Shading(); - //operation_point_ 在交互对象上的点 - //operation_vector_ 约束交互的移动方向 - std::vector operation_point_; - // std::vector operation_vector_; - // MVector3 operation_point_; - AMCAX::Coord3 operation_vector_; + void slotSetScenesCenter(); - bool is_pick_move_select_; //标识是否可以开始移动 + void slotSelectMode_Vert(); + void slotSelectMode_Edge(); + void slotSelectMode_Face(); + void slotSelectMode_Object(); -public: - void setDataManger(DataManager* dataManager); - void setCore(AMCore* core); + void slotCopyObject(); + void slotDeleteObject(); + void slotMirrorObject(); + void slotCombineObject(); -private: - DataManager* dataManager_; - AMCore* coreCommand_; - SelectTool* selectTool_; - ParamDialog *dialog; - acamcad::Record record; + void slotSetWorkPlane(); -private slots: - void selectCheckChanged(); -private: - void BaseObjectOperation(const SelectModel &s_model, - const OperationType& op_type, const MeshOperationType mesh_operate_type); - void BRepObjectOperation(const SelectModel& s_model, - const OperationType& op_type, const MeshOperationType mesh_operate_type); + private slots: // BRep tab + void slotCreateSingleFaceBRep(); - void disconnectDialog(); + int getLastPersistentId(); -public slots: - void slotUndo(); - void slotRedo(); + void slotCreatPlaneBRep(); + void slotCreatPlaneBRepAccepted(const ParamDialog::Response& data); - friend class OperateToolBar; - friend class ACAMWindow; -private slots: // base tab - void slotRenderMode_Wire(); - void slotRenderMode_Rendering(); - void slotRenderMode_Shading(); + void slotCreatCubeBRep(); + void slotCreatCubeBRepAccepted(const ParamDialog::Response& data); - void slotSetScenesCenter(); + void slotCreateSphereBRep(); + void slotCreateSphereBRepAccepted(const ParamDialog::Response& data); - void slotSelectMode_Vert(); - void slotSelectMode_Edge(); - void slotSelectMode_Face(); - void slotSelectMode_Object(); + void slotCreateCylinderBRep(); + void slotCreateCylinderBRepAccepted(const ParamDialog::Response& data); - void slotCopyObject(); - void slotCombineObject(); + void slotCreateConeBrep(); + void slotCreateConeBrepAccepted(const ParamDialog::Response& data); + void slotCreateTorusBRep(); + void slotCreateTorusBRepAccepted(const ParamDialog::Response& data); -private slots: // BRep tab - void slotCreateSingleFaceBRep(); + void slotCreatePrismBRep(); + void slotCreatePrismBRepAccepted(const ParamDialog::Response& data); - int getLastPersistentId(); + void slotBRepExtrude(); + void slotBRepExtrudeAccepted(const ParamDialog::Response& data); - void slotCreatPlaneBRep(); - void slotCreatPlaneBRepAccepted(const ParamDialog::Response& data); + void slotCreatePolygonBRep(); + void slotCreatePolygonBRepAccepted(const ParamDialog::Response& data); + // Mesh Tab + void slotCreateSingleFaceMesh(); - void slotCreatCubeBRep(); - void slotCreatCubeBRepAccepted(const ParamDialog::Response& data); + void slotCreatPlaneMesh(); + void slotCreatPlaneMeshAccepted(const ParamDialog::Response& data); - void slotCreateSphereBRep(); - void slotCreateSphereBRepAccepted(const ParamDialog::Response& data); + void slotCreatCubeMesh(); + void slotCreatCubeMeshAccepted(const ParamDialog::Response& data); - void slotCreateCylinderBRep(); - void slotCreateCylinderBRepAccepted(const ParamDialog::Response& data); - void slotCreateConeBrep(); - void slotCreateConeBrepAccepted(const ParamDialog::Response& data); + void slotMeshSubdiveCatmullClark(); + void slotMeshSubdiveLoop(); + void slotMeshTriangulation(); + //void slotMeshSubdiveLoop(); - void slotCreateTorusBRep(); - void slotCreateTorusBRepAccepted(const ParamDialog::Response& data); - void slotCreatePrismBRep(); - void slotCreatePrismBRepAccepted(const ParamDialog::Response& data); + //TSpline Tab + void slotCreateSingleFaceTSpline(); - void slotBRepExtrude(); - void slotBRepExtrudeAccepted(const ParamDialog::Response& data); + void slotCreatePlaneTSpline(); + void slotCreatePlaneTSplineAccepted(const ParamDialog::Response& data); - void slotCreatePolygonBRep(); - void slotCreatePolygonBRepAccepted(const ParamDialog::Response& data); + void slotCreateCubeTSpline(); + void slotCreateCubeTSplineAccepted(const ParamDialog::Response& data); -}; + void slotCreateUVSphereTSpline(); + void slotCreateUVSphereTSplineAccepted(const ParamDialog::Response& data); + + void slotCreateQuadSphereTSpline(); + void slotCreateQuadSphereTSplineAccepted(const ParamDialog::Response& data); + + void slotCreateCylinderTSpline(); + void slotCreateCylinderTSplineAccepted(const ParamDialog::Response& data); + + void slotCreateConeTSpline(); + void slotCreateConeTSplineAccepted(const ParamDialog::Response& data); + + void slotCreateTorusTSpline(); + void slotCreateTorusTSplineAccepted(const ParamDialog::Response& data); + + void slotCreateCircularTSpline(); + void slotCreateCircularTSplineAccepted(const ParamDialog::Response& data); + + void slotAddCreaseEdge(); + void slotRemoveCreaseEdge(); + void slotTsplineUniform(); + void slotTsplineRepair(); + void slotBRepExtrudeMesh(); + + }; } diff --git a/Src/Windows/RenderViewerDraw.cpp b/Src/Windows/RenderViewerDraw.cpp index 28c767b..e0f5880 100644 --- a/Src/Windows/RenderViewerDraw.cpp +++ b/Src/Windows/RenderViewerDraw.cpp @@ -1,22 +1,29 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "RenderViewer.h" #include "../Core/DataManager.h" #include "../ObjectDraw/ObjectDraw.h" #include "../Utils/MathUtils.h" +#include "GL/freeglut.h" + +// VIEW_LEN > AXES_LEN + ARROW_LEN +#define VIEW_LEN 180 +#define AXES_LEN 120 +#define ARROW_LEN 30 +#define ARROW_RADIUS 18 //=================================================================== // This File is All Draw With renderViewer @@ -24,77 +31,170 @@ using namespace acamcad; using namespace qglviewer; -using namespace acamcad; +using namespace acamcad; void RenderViewer::drawWorkPlaneGrid(double size, int nbSubdivisions) { - AMCAX::Coord3& center = work_plane_->center(); - AMCAX::Coord3& d = work_plane_->normal(); - - glPushMatrix(); - glTranslated(center[0], center[1], center[2]); - glMultMatrixd(Quaternion(AMCAX::Coord3(0.0, 0.0, 1.0), d).matrix()); - RenderViewer::drawGrid(size, nbSubdivisions); - glPopMatrix(); + AMCAX::Coord3& center = work_plane_->center(); + AMCAX::Coord3& d = work_plane_->normal(); + + glPushMatrix(); + glTranslated(center[0], center[1], center[2]); + glMultMatrixd(Quaternion(AMCAX::Coord3(0.0, 0.0, 1.0), d).matrix()); + RenderViewer::drawGrid(size, nbSubdivisions); + glPopMatrix(); } void RenderViewer::drawGrid(double size, int nbSubdivisions) { - glLineWidth(1.0); - glColor3f(0.8, 0.8, 0.8); - GLboolean lighting; - glGetBooleanv(GL_LIGHTING, &lighting); - glDisable(GL_LIGHTING); - - glBegin(GL_LINES); - for (int i = 0; i <= nbSubdivisions; ++i) { - const qreal pos = size * (2.0 * i / nbSubdivisions - 1.0); - glVertex2d(pos, -size); - glVertex2d(pos, +size); - glVertex2d(-size, pos); - glVertex2d(size, pos); - } - glEnd(); - - if (lighting) - glEnable(GL_LIGHTING); + glLineWidth(1.0); + glColor3f(0.8, 0.8, 0.8); + GLboolean lighting; + glGetBooleanv(GL_LIGHTING, &lighting); + glDisable(GL_LIGHTING); + + glBegin(GL_LINES); + for (int i = 0; i <= nbSubdivisions; ++i) { + const qreal pos = size * (2.0 * i / nbSubdivisions - 1.0); + glVertex2d(pos, -size); + glVertex2d(pos, +size); + glVertex2d(-size, pos); + glVertex2d(size, pos); + } + glEnd(); + + if (lighting) + glEnable(GL_LIGHTING); } void RenderViewer::drawWorldAxis() { - glLineWidth(3.0); + glLineWidth(3.0); + + double length = 5.0; + + //GLboolean lighting, colorMaterial; + ////glGetBooleanv(GL_LIGHTING, &lighting); + //glGetBooleanv(GL_COLOR_MATERIAL, &colorMaterial); + + //glDisable(GL_COLOR_MATERIAL); - double length = 5.0; + //X R + float color[4]; + color[0] = 1.0f; color[1] = 0.1f; color[2] = 0.1f; color[3] = 1.0f; + glColor3f(1.0f, 0.1f, 0.1f); + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color); - GLboolean lighting, colorMaterial; - glGetBooleanv(GL_LIGHTING, &lighting); - glGetBooleanv(GL_COLOR_MATERIAL, &colorMaterial); + glBegin(GL_LINES); + glVertex3d(0, 0, 0); + glVertex3d(length, 0, 0); + glEnd(); - glDisable(GL_COLOR_MATERIAL); + //Y G + color[0] = 0.1f; color[1] = 1.0f; color[2] = 0.1f; color[3] = 1.0f; + glColor3f(0.1f, 1.0f, 0.1f); + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color); - float color[4]; - color[0] = 1.0f; color[1] = 0.1f; color[2] = 0.1f; color[3] = 1.0f; - glColor3f(1.0f, 0.1f, 0.1f); - glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color); + glBegin(GL_LINES); + glVertex3d(0, 0, 0); + glVertex3d(0, length, 0); + glEnd(); - glBegin(GL_LINES); - glVertex3d(0, 0, 0); - glVertex3d(length, 0, 0); - glEnd(); + //Z B + color[0] = 0.1f; color[1] = 0.1f; color[2] = 1.0f; color[3] = 1.0f; + glColor3f(0.1f, 0.1f, 1.0f); + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color); - color[0] = 0.1f; color[1] = 1.0f; color[2] = 0.1f; color[3] = 1.0f; - glColor3f(0.1f, 1.0f, 0.1f); - glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color); + glBegin(GL_LINES); + glVertex3d(0, 0, 0); + glVertex3d(0, 0, length); + glEnd(); - glBegin(GL_LINES); - glVertex3d(0, 0, 0); - glVertex3d(0, length, 0); - glEnd(); + //if (colorMaterial) + // glEnable(GL_COLOR_MATERIAL); + //if (!lighting) + // glDisable(GL_LIGHTING); + +} + +void RenderViewer::drawAxis() +{ - if (colorMaterial) - glEnable(GL_COLOR_MATERIAL); - if (!lighting) - glDisable(GL_LIGHTING); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + GLboolean lighting; + glGetBooleanv(GL_LIGHTING, &lighting); + + if (lighting) + glDisable(GL_LIGHTING); + + glViewport(0, 0, VIEW_LEN, VIEW_LEN); + + glClear(GL_DEPTH_BUFFER_BIT); + + glOrtho(-VIEW_LEN, VIEW_LEN, -VIEW_LEN, VIEW_LEN, -VIEW_LEN, VIEW_LEN); + //gluPerspective(45.0, 1.0f, 0.1f, 500.0); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + auto vec = camera()->upVector(); + auto coord = camera()->viewDirection(); + + auto point0 = -coord; + point0.Normalize(); + + gluLookAt(point0.X(), point0.Y(), point0.Z(), + 0, 0, 0, + vec.X(), vec.Y(), vec.Z()); + + //确定坐标系原点 + glPushMatrix(); + glColor3f(0.0f, 0.0f, 0.0f); + gluSphere(glu_cylinder_, 12, 12, 12); + glPopMatrix(); + + glPushMatrix(); + glColor3f(0.1f, 0.1f, 1.0f); + //glRotatef(90, 0.0, 0.0, 1.0); + //glutSolidSphere(0.25, 6, 6); + gluCylinder(glu_cylinder_, 6, 6, AXES_LEN, 6, 3); //z + glTranslatef(0, 0, AXES_LEN); + gluCylinder(glu_cylinder_, ARROW_RADIUS, 0, ARROW_LEN, 6, 3); //z arrow + glPopMatrix(); + + glPushMatrix(); + glColor3f(0.0f, 1.0f, 0.0f); + glRotatef(90, -1.0, 0.0, 0.0); + gluCylinder(glu_cylinder_, 6, 6, AXES_LEN, 6, 3); //Y + glTranslatef(0, 0, AXES_LEN); + gluCylinder(glu_cylinder_, ARROW_RADIUS, 0, ARROW_LEN, 6, 3); //Y arrow + glPopMatrix(); + + glPushMatrix(); + glColor3f(1.0f, 0.1f, 0.1f); + glRotatef(90, 0.0, 1.0, 0.0); + gluCylinder(glu_cylinder_, 6, 6, AXES_LEN, 6, 3); //X + glTranslatef(0, 0, AXES_LEN); + gluCylinder(glu_cylinder_, ARROW_RADIUS, 0, ARROW_LEN, 6, 3); //X arrow + glPopMatrix(); + + //SwapBuffers() + glRasterPos3f(150, -12, 0); + //glColor3f(1.0f, 0.1f, 0.1f); + glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, 'x'); + + glRasterPos3f(-12, 150, 0); + //glColor3f(0.1f, 1.0f, 0.1f); + glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, 'y'); + + glRasterPos3f(-12, -12, 150); + //glColor3f(0.1f, 0.1f, 1.0f); + glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, 'z'); + + //glFlush(); // remember to flush GL output! + + if (lighting) + glEnable(GL_LIGHTING); } @@ -102,32 +202,32 @@ void RenderViewer::drawWorldAxis() void RenderViewer::drawSelectedElement() { - if (select_info_list_.empty()) - return; - - for (int i = 0; i < select_info_list_.size(); i++) - { - const SelectInfoWithCamera& s_info = select_info_list_[i]; - BaseObject* object = dataManager_->getObjectByPersistentID(s_info.object_id_); - - const ObjectDraw* objectdraw = object->getDrawTool(); - objectdraw->drawSelected(select_model_, s_info.object_subselect_id_); - } - - if (o_axis_ != nullptr) - { - std::string type; - if (operate_type_ == OperationType::MOVE_OPERATION) - type = "MOVE"; - else if (operate_type_ == OperationType::ROTATE_OPERATION) - type = "ROTATE"; - else if (operate_type_ == OperationType::SCALE_OPERATION) - type = "SCALE"; - else - return; - - o_axis_->draw(type); - } + if (select_info_list_.empty()) + return; + + for (int i = 0; i < select_info_list_.size(); i++) + { + const SelectInfoWithCamera& s_info = select_info_list_[i]; + BaseObject* object = dataManager_->getObjectByPersistentID(s_info.object_id_); + + const ObjectDraw* objectdraw = object->getDrawTool(); + objectdraw->drawSelected(select_model_, s_info.object_subselect_id_); + } + + if (o_axis_ != nullptr) + { + std::string type; + if (operate_type_ == OperationType::MOVE_OPERATION) + type = "MOVE"; + else if (operate_type_ == OperationType::ROTATE_OPERATION) + type = "ROTATE"; + else if (operate_type_ == OperationType::SCALE_OPERATION) + type = "SCALE"; + else + return; + + o_axis_->draw(type); + } } @@ -135,68 +235,68 @@ void RenderViewer::drawSelectedElement() void RenderViewer::drawSelectMovePoint() const { - // 绘制具体的选择的点,用于显示选中后的移动,例如,选中边split,点在边上move选中一个好的位置 - if (operate_type_ == OperationType::PICK_OPERATION_MOVE || operate_type_ == OperationType::PICK_OPERATION_MOVE_MULTI) - { - glColor3f(0.85, 0.0, 0.0); - glPointSize(8); - - for (int i = 0; i < operation_point_.size(); i++) - { - glBegin(GL_POINTS); - glVertex3dv(operation_point_[i].Data()); - glEnd(); - } - } + // 绘制具体的选择的点,用于显示选中后的移动,例如,选中边split,点在边上move选中一个好的位置 + if (operate_type_ == OperationType::PICK_OPERATION_MOVE || operate_type_ == OperationType::PICK_OPERATION_MOVE_MULTI) + { + glColor3f(0.85, 0.0, 0.0); + glPointSize(8); + + for (int i = 0; i < operation_point_.size(); i++) + { + glBegin(GL_POINTS); + glVertex3dv(operation_point_[i].Data()); + glEnd(); + } + } } void RenderViewer::drawClickedElement() const { - glColor3f(0.15, 0.15, 0.15); - glPointSize(5); - - for (int i = 0; i < click_info_list_.size(); i++) - { - const AMCAX::Coord3& p = click_info_list_[i].point_; - glBegin(GL_POINTS); - glVertex3dv(p.Data()); - glEnd(); - } - - if (click_info_list_.size() > 1) - { - glColor3f(0.15, 0.15, 0.15); - glLineWidth(3); - - for (size_t i = 0; i < click_info_list_.size() - 1; i++) - { - const AMCAX::Coord3& p0 = click_info_list_[i].point_; - const AMCAX::Coord3& p1 = click_info_list_[i + 1].point_; - glBegin(GL_LINES); - glVertex3dv(p0.Data()); - glVertex3dv(p1.Data()); - glEnd(); - } - } + glColor3f(0.15, 0.15, 0.15); + glPointSize(5); + + for (int i = 0; i < click_info_list_.size(); i++) + { + const AMCAX::Coord3& p = click_info_list_[i].point_; + glBegin(GL_POINTS); + glVertex3dv(p.Data()); + glEnd(); + } + + if (click_info_list_.size() > 1) + { + glColor3f(0.15, 0.15, 0.15); + glLineWidth(3); + + for (size_t i = 0; i < click_info_list_.size() - 1; i++) + { + const AMCAX::Coord3& p0 = click_info_list_[i].point_; + const AMCAX::Coord3& p1 = click_info_list_[i + 1].point_; + glBegin(GL_LINES); + glVertex3dv(p0.Data()); + glVertex3dv(p1.Data()); + glEnd(); + } + } } void RenderViewer::drawSelectionRectangle(QRect& rectangle_) const { - startScreenCoordinatesSystem(); - glDisable(GL_LIGHTING); - glEnable(GL_BLEND); - - glLineWidth(2.0); - glColor4f(0.66f, 0.66f, 0.66f, 0.66f); - glBegin(GL_LINE_LOOP); - glVertex2i(rectangle_.left(), rectangle_.top()); - glVertex2i(rectangle_.right(), rectangle_.top()); - glVertex2i(rectangle_.right(), rectangle_.bottom()); - glVertex2i(rectangle_.left(), rectangle_.bottom()); - glEnd(); - - glDisable(GL_BLEND); - glEnable(GL_LIGHTING); - stopScreenCoordinatesSystem(); + startScreenCoordinatesSystem(); + glDisable(GL_LIGHTING); + glEnable(GL_BLEND); + + glLineWidth(2.0); + glColor4f(0.66f, 0.66f, 0.66f, 0.66f); + glBegin(GL_LINE_LOOP); + glVertex2i(rectangle_.left(), rectangle_.top()); + glVertex2i(rectangle_.right(), rectangle_.top()); + glVertex2i(rectangle_.right(), rectangle_.bottom()); + glVertex2i(rectangle_.left(), rectangle_.bottom()); + glEnd(); + + glDisable(GL_BLEND); + glEnable(GL_LIGHTING); + stopScreenCoordinatesSystem(); } diff --git a/Src/Windows/RenderViewerOps.cpp b/Src/Windows/RenderViewerOps.cpp index 2a8883a..bcd2ec4 100644 --- a/Src/Windows/RenderViewerOps.cpp +++ b/Src/Windows/RenderViewerOps.cpp @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "RenderViewer.h" @@ -28,40 +28,48 @@ using namespace acamcad; -void RenderViewer::addSelector(const SelectModel &sm, QAction *&act) { - selectActions.push_back(SelectAction{sm, act}); +void RenderViewer::addSelector(const SelectModel& sm, QAction*& act) { + selectActions.push_back(SelectAction{ sm, act }); } void RenderViewer::selectCheckChanged() { - auto sm = getSelectModel(); - std::for_each(selectActions.begin(), selectActions.end(), [&](SelectAction &sa) { - sa.action->setChecked(sm == sa.model); - }); + auto sm = getSelectModel(); + std::for_each(selectActions.begin(), selectActions.end(), [&](SelectAction& sa) { + sa.action->setChecked(sm == sa.model); + }); } void RenderViewer::BaseObjectOperation(const SelectModel& s_model, - const OperationType& op_type, - const MeshOperationType mesh_operate_type) { - clearSelected(); - setSelectModel(s_model); - setOperateType(op_type); + const OperationType& op_type, + const MeshOperationType mesh_operate_type) { + clearSelected(); + setSelectModel(s_model); + setOperateType(op_type); - coreCommand_->setMeshOperationType(mesh_operate_type); + coreCommand_->setMeshOperationType(mesh_operate_type); - selectCheckChanged(); - update(); + selectCheckChanged(); + update(); } +void RenderViewer::MeshObjectOperation(const SelectModel& s_model, + const OperationType& op_type, + const MeshOperationType mesh_operate_type) +{ + coreCommand_->setOperationDataType(OperationDataType::MESH_TYPE); + BaseObjectOperation(s_model, op_type, mesh_operate_type); +} -void RenderViewer::BRepObjectOperation(const SelectModel& s_model, - const OperationType& op_type, - const MeshOperationType mesh_operate_type) + +void RenderViewer::BRepObjectOperation(const SelectModel& s_model, + const OperationType& op_type, + const MeshOperationType mesh_operate_type) { - coreCommand_->setOperationDataType(OperationDataType::BREP_TYPE); - BaseObjectOperation(s_model, op_type, mesh_operate_type); + coreCommand_->setOperationDataType(OperationDataType::BREP_TYPE); + BaseObjectOperation(s_model, op_type, mesh_operate_type); } void RenderViewer::disconnectDialog() { - disconnect(dialog, &ParamDialog::dataReady, this, nullptr); -} + disconnect(dialog, &ParamDialog::dataReady, this, nullptr); +} \ No newline at end of file diff --git a/Src/Windows/RenderViewerOpsBRep.cpp b/Src/Windows/RenderViewerOpsBRep.cpp index 3d1fd10..44cfeba 100644 --- a/Src/Windows/RenderViewerOpsBRep.cpp +++ b/Src/Windows/RenderViewerOpsBRep.cpp @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "RenderViewer.h" #include "../Core/ACAMCore.h" @@ -22,295 +22,295 @@ using namespace acamcad; // ==================== BRep TAB NON SLOT METHODS ==================== void RenderViewer::initBRep() { - objectFillOuts[OPERATE_BREP_PLANE] = QVector { - ParamDialog::RequestUnit(ParamDialog::TYPE_STRING, tr("Label (Group)"), ParamDialog::DataUnit{tr("plane")}), - ParamDialog::RequestUnit(ParamDialog::TYPE_MPOINT3_2, tr("first"), ParamDialog::DataUnit{ AMCAX::Coord3{.0, .0, .0}, ParamDialog::ParamType::TYPE_MPOINT3}), - ParamDialog::RequestUnit(ParamDialog::TYPE_MPOINT3_2, tr("second"), ParamDialog::DataUnit{ AMCAX::Coord3{2.0, 2.0, .0}, ParamDialog::ParamType::TYPE_MPOINT3}), - }; - objectFillOuts[OPERATE_BREP_CUBE] = QVector { - ParamDialog::RequestUnit(ParamDialog::TYPE_STRING, tr("Label (Group)"), ParamDialog::DataUnit{tr("cube")}), - ParamDialog::RequestUnit(ParamDialog::TYPE_MPOINT3, tr("p0"), ParamDialog::DataUnit{ AMCAX::Coord3{.0, .0, .0}, ParamDialog::ParamType::TYPE_MPOINT3}), - ParamDialog::RequestUnit(ParamDialog::TYPE_MPOINT3, tr("p1"), ParamDialog::DataUnit{ AMCAX::Coord3{1.0, 1.0, 1.0}, ParamDialog::ParamType::TYPE_MPOINT3}), - }; - objectFillOuts[OPERATE_BREP_SPHERE] = QVector { - ParamDialog::RequestUnit(ParamDialog::TYPE_STRING, tr("Label (Group)"), ParamDialog::DataUnit{tr("sphere")}), - ParamDialog::RequestUnit(ParamDialog::TYPE_MPOINT3, tr("center"), ParamDialog::DataUnit{ AMCAX::Coord3{.0, .0, .0}, ParamDialog::ParamType::TYPE_MPOINT3}), - ParamDialog::RequestUnit(ParamDialog::TYPE_DOUBLE, tr("radius"), ParamDialog::DataUnit{1.0}), - ParamDialog::RequestUnit(ParamDialog::TYPE_DOUBLE_PI, tr("angle1"), ParamDialog::DataUnit{2.0}), - ParamDialog::RequestUnit(ParamDialog::TYPE_DOUBLE_PI, tr("angle2 (NOP)"), ParamDialog::DataUnit{0.0}), - ParamDialog::RequestUnit(ParamDialog::TYPE_DOUBLE_PI, tr("angle3 (NOP)"), ParamDialog::DataUnit{0.0}), - }; - objectFillOuts[OPERATE_BREP_CYLINDER] = QVector { - ParamDialog::RequestUnit(ParamDialog::TYPE_STRING, tr("Label (Group)"), ParamDialog::DataUnit{tr("cylinder")}), - ParamDialog::RequestUnit(ParamDialog::TYPE_MPOINT3, tr("b_center"), ParamDialog::DataUnit{ AMCAX::Coord3{.0, .0, .0}, ParamDialog::ParamType::TYPE_MPOINT3}), - ParamDialog::RequestUnit(ParamDialog::TYPE_MVEC, tr("axis"), ParamDialog::DataUnit{ AMCAX::Coord3{.0, .0, 1.0}, ParamDialog::ParamType::TYPE_MVEC3}), - ParamDialog::RequestUnit(ParamDialog::TYPE_MVEC, tr("X Axis direction"), ParamDialog::DataUnit{ AMCAX::Coord3{1.0, .0, .0}, ParamDialog::ParamType::TYPE_MVEC3}), - ParamDialog::RequestUnit(ParamDialog::TYPE_DOUBLE, tr("radius"), ParamDialog::DataUnit{1.0}), - ParamDialog::RequestUnit(ParamDialog::TYPE_DOUBLE, tr("height"), ParamDialog::DataUnit{1.0}), - ParamDialog::RequestUnit(ParamDialog::TYPE_DOUBLE_PI, tr("angle"), ParamDialog::DataUnit{2.0}), - }; - objectFillOuts[OPERATE_BREP_CONE] = QVector { - ParamDialog::RequestUnit(ParamDialog::TYPE_STRING, tr("Label (Group)"), ParamDialog::DataUnit{tr("cone")}), - ParamDialog::RequestUnit(ParamDialog::TYPE_MPOINT3, tr("b_center"), ParamDialog::DataUnit{ AMCAX::Coord3{.0, .0, .0}, ParamDialog::ParamType::TYPE_MPOINT3}), - ParamDialog::RequestUnit(ParamDialog::TYPE_MVEC, tr("axis"), ParamDialog::DataUnit{ AMCAX::Coord3{.0, .0, 1.0}, ParamDialog::ParamType::TYPE_MVEC3}), - ParamDialog::RequestUnit(ParamDialog::TYPE_MVEC, tr("X Axis direction"), ParamDialog::DataUnit{ AMCAX::Coord3{1.0, .0, .0}, ParamDialog::ParamType::TYPE_MVEC3}), - ParamDialog::RequestUnit(ParamDialog::TYPE_DOUBLE, tr("radiuR"), ParamDialog::DataUnit{1.0}), - ParamDialog::RequestUnit(ParamDialog::TYPE_DOUBLE, tr("radiur"), ParamDialog::DataUnit{0.0}), - ParamDialog::RequestUnit(ParamDialog::TYPE_DOUBLE, tr("height"), ParamDialog::DataUnit{1.0}), - ParamDialog::RequestUnit(ParamDialog::TYPE_DOUBLE_PI, tr("angle"), ParamDialog::DataUnit{2.0}), - }; - objectFillOuts[OPERATE_BREP_TORUS] = QVector { - ParamDialog::RequestUnit(ParamDialog::TYPE_STRING, tr("Label (Group)"), ParamDialog::DataUnit{tr("torus")}), - ParamDialog::RequestUnit(ParamDialog::TYPE_MPOINT3, tr("center"), ParamDialog::DataUnit{ AMCAX::Coord3{.0, .0, .0}, ParamDialog::ParamType::TYPE_MPOINT3}), - ParamDialog::RequestUnit(ParamDialog::TYPE_MVEC3, tr("axis"), ParamDialog::DataUnit{ AMCAX::Coord3{.0, .0, 1.0}, ParamDialog::ParamType::TYPE_MVEC3}), - ParamDialog::RequestUnit(ParamDialog::TYPE_MVEC, tr("X Axis direction"), ParamDialog::DataUnit{ AMCAX::Coord3{1.0, .0, .0}, ParamDialog::ParamType::TYPE_MVEC3}), - ParamDialog::RequestUnit(ParamDialog::TYPE_DOUBLE, tr("radiu0"), ParamDialog::DataUnit{2.0}), - ParamDialog::RequestUnit(ParamDialog::TYPE_DOUBLE, tr("radiu1"), ParamDialog::DataUnit{1.0}), - ParamDialog::RequestUnit(ParamDialog::TYPE_DOUBLE_PI, tr("angle"), ParamDialog::DataUnit{2.0}), - }; - objectFillOuts[OPERATE_BREP_PRISM] = QVector { - ParamDialog::RequestUnit(ParamDialog::TYPE_STRING, tr("Label (Group)"), ParamDialog::DataUnit{tr("prism")}), - ParamDialog::RequestUnit(ParamDialog::TYPE_ARR_MPOINT3, tr("Point List"), ParamDialog::DataUnit{AMCAX::Coord3{.0, .0, .0}, ParamDialog::ParamType::TYPE_MPOINT3}), - ParamDialog::RequestUnit(ParamDialog::TYPE_MVEC3, tr("Extrude Axis"), ParamDialog::DataUnit{ AMCAX::Coord3{.0, .0, 2.0}, ParamDialog::ParamType::TYPE_MVEC3}), - }; - objectFillOuts[OPERATE_BREP_EXTRUDE] = QVector { - std::make_tuple(ParamDialog::TYPE_MVEC, tr("dir"), ParamDialog::DataUnit{ AMCAX::Coord3{.0, .0, 1.0}, ParamDialog::ParamType::TYPE_MVEC3}), - }; - objectFillOuts[OPERATE_BREP_POLYGON] = QVector { - ParamDialog::RequestUnit(ParamDialog::TYPE_STRING, tr("Label (Group)"), ParamDialog::DataUnit{tr("prism")}), - ParamDialog::RequestUnit(ParamDialog::TYPE_ARR_MPOINT3, tr("Point List"), ParamDialog::DataUnit{AMCAX::Coord3{.0, .0, .0}, ParamDialog::ParamType::TYPE_MPOINT3}), - }; + objectFillOuts[OPERATE_BREP_PLANE] = QVector{ + ParamDialog::RequestUnit(ParamDialog::TYPE_STRING, tr("Label (Group)"), ParamDialog::DataUnit{tr("plane")}), + ParamDialog::RequestUnit(ParamDialog::TYPE_MPOINT3_2, tr("first"), ParamDialog::DataUnit{ AMCAX::Coord3{.0, .0, .0}, ParamDialog::ParamType::TYPE_MPOINT3}), + ParamDialog::RequestUnit(ParamDialog::TYPE_MPOINT3_2, tr("second"), ParamDialog::DataUnit{ AMCAX::Coord3{2.0, 2.0, .0}, ParamDialog::ParamType::TYPE_MPOINT3}), + }; + objectFillOuts[OPERATE_BREP_CUBE] = QVector{ + ParamDialog::RequestUnit(ParamDialog::TYPE_STRING, tr("Label (Group)"), ParamDialog::DataUnit{tr("cube")}), + ParamDialog::RequestUnit(ParamDialog::TYPE_MPOINT3, tr("p0"), ParamDialog::DataUnit{ AMCAX::Coord3{.0, .0, .0}, ParamDialog::ParamType::TYPE_MPOINT3}), + ParamDialog::RequestUnit(ParamDialog::TYPE_MPOINT3, tr("p1"), ParamDialog::DataUnit{ AMCAX::Coord3{1.0, 1.0, 1.0}, ParamDialog::ParamType::TYPE_MPOINT3}), + }; + objectFillOuts[OPERATE_BREP_SPHERE] = QVector{ + ParamDialog::RequestUnit(ParamDialog::TYPE_STRING, tr("Label (Group)"), ParamDialog::DataUnit{tr("sphere")}), + ParamDialog::RequestUnit(ParamDialog::TYPE_MPOINT3, tr("center"), ParamDialog::DataUnit{ AMCAX::Coord3{.0, .0, .0}, ParamDialog::ParamType::TYPE_MPOINT3}), + ParamDialog::RequestUnit(ParamDialog::TYPE_DOUBLE, tr("radius"), ParamDialog::DataUnit{1.0}), + ParamDialog::RequestUnit(ParamDialog::TYPE_DOUBLE_PI, tr("angle1"), ParamDialog::DataUnit{2.0}), + ParamDialog::RequestUnit(ParamDialog::TYPE_DOUBLE_PI, tr("angle2 (NOP)"), ParamDialog::DataUnit{0.0}), + ParamDialog::RequestUnit(ParamDialog::TYPE_DOUBLE_PI, tr("angle3 (NOP)"), ParamDialog::DataUnit{0.0}), + }; + objectFillOuts[OPERATE_BREP_CYLINDER] = QVector{ + ParamDialog::RequestUnit(ParamDialog::TYPE_STRING, tr("Label (Group)"), ParamDialog::DataUnit{tr("cylinder")}), + ParamDialog::RequestUnit(ParamDialog::TYPE_MPOINT3, tr("b_center"), ParamDialog::DataUnit{ AMCAX::Coord3{.0, .0, .0}, ParamDialog::ParamType::TYPE_MPOINT3}), + ParamDialog::RequestUnit(ParamDialog::TYPE_MVEC, tr("axis"), ParamDialog::DataUnit{ AMCAX::Coord3{.0, .0, 1.0}, ParamDialog::ParamType::TYPE_MVEC3}), + ParamDialog::RequestUnit(ParamDialog::TYPE_MVEC, tr("X Axis direction"), ParamDialog::DataUnit{ AMCAX::Coord3{1.0, .0, .0}, ParamDialog::ParamType::TYPE_MVEC3}), + ParamDialog::RequestUnit(ParamDialog::TYPE_DOUBLE, tr("radius"), ParamDialog::DataUnit{1.0}), + ParamDialog::RequestUnit(ParamDialog::TYPE_DOUBLE, tr("height"), ParamDialog::DataUnit{1.0}), + ParamDialog::RequestUnit(ParamDialog::TYPE_DOUBLE_PI, tr("angle"), ParamDialog::DataUnit{2.0}), + }; + objectFillOuts[OPERATE_BREP_CONE] = QVector{ + ParamDialog::RequestUnit(ParamDialog::TYPE_STRING, tr("Label (Group)"), ParamDialog::DataUnit{tr("cone")}), + ParamDialog::RequestUnit(ParamDialog::TYPE_MPOINT3, tr("b_center"), ParamDialog::DataUnit{ AMCAX::Coord3{.0, .0, .0}, ParamDialog::ParamType::TYPE_MPOINT3}), + ParamDialog::RequestUnit(ParamDialog::TYPE_MVEC, tr("axis"), ParamDialog::DataUnit{ AMCAX::Coord3{.0, .0, 1.0}, ParamDialog::ParamType::TYPE_MVEC3}), + ParamDialog::RequestUnit(ParamDialog::TYPE_MVEC, tr("X Axis direction"), ParamDialog::DataUnit{ AMCAX::Coord3{1.0, .0, .0}, ParamDialog::ParamType::TYPE_MVEC3}), + ParamDialog::RequestUnit(ParamDialog::TYPE_DOUBLE, tr("radiuR"), ParamDialog::DataUnit{1.0}), + ParamDialog::RequestUnit(ParamDialog::TYPE_DOUBLE, tr("radiur"), ParamDialog::DataUnit{0.0}), + ParamDialog::RequestUnit(ParamDialog::TYPE_DOUBLE, tr("height"), ParamDialog::DataUnit{1.0}), + ParamDialog::RequestUnit(ParamDialog::TYPE_DOUBLE_PI, tr("angle"), ParamDialog::DataUnit{2.0}), + }; + objectFillOuts[OPERATE_BREP_TORUS] = QVector{ + ParamDialog::RequestUnit(ParamDialog::TYPE_STRING, tr("Label (Group)"), ParamDialog::DataUnit{tr("torus")}), + ParamDialog::RequestUnit(ParamDialog::TYPE_MPOINT3, tr("center"), ParamDialog::DataUnit{ AMCAX::Coord3{.0, .0, .0}, ParamDialog::ParamType::TYPE_MPOINT3}), + ParamDialog::RequestUnit(ParamDialog::TYPE_MVEC3, tr("axis"), ParamDialog::DataUnit{ AMCAX::Coord3{.0, .0, 1.0}, ParamDialog::ParamType::TYPE_MVEC3}), + ParamDialog::RequestUnit(ParamDialog::TYPE_MVEC, tr("X Axis direction"), ParamDialog::DataUnit{ AMCAX::Coord3{1.0, .0, .0}, ParamDialog::ParamType::TYPE_MVEC3}), + ParamDialog::RequestUnit(ParamDialog::TYPE_DOUBLE, tr("radiu0"), ParamDialog::DataUnit{2.0}), + ParamDialog::RequestUnit(ParamDialog::TYPE_DOUBLE, tr("radiu1"), ParamDialog::DataUnit{1.0}), + ParamDialog::RequestUnit(ParamDialog::TYPE_DOUBLE_PI, tr("angle"), ParamDialog::DataUnit{2.0}), + }; + objectFillOuts[OPERATE_BREP_PRISM] = QVector{ + ParamDialog::RequestUnit(ParamDialog::TYPE_STRING, tr("Label (Group)"), ParamDialog::DataUnit{tr("prism")}), + ParamDialog::RequestUnit(ParamDialog::TYPE_ARR_MPOINT3, tr("Point List"), ParamDialog::DataUnit{AMCAX::Coord3{.0, .0, .0}, ParamDialog::ParamType::TYPE_MPOINT3}), + ParamDialog::RequestUnit(ParamDialog::TYPE_MVEC3, tr("Extrude Axis"), ParamDialog::DataUnit{ AMCAX::Coord3{.0, .0, 2.0}, ParamDialog::ParamType::TYPE_MVEC3}), + }; + objectFillOuts[OPERATE_BREP_EXTRUDE] = QVector{ + std::make_tuple(ParamDialog::TYPE_MVEC, tr("dir"), ParamDialog::DataUnit{ AMCAX::Coord3{.0, .0, 1.0}, ParamDialog::ParamType::TYPE_MVEC3}), + }; + objectFillOuts[OPERATE_BREP_POLYGON] = QVector{ + ParamDialog::RequestUnit(ParamDialog::TYPE_STRING, tr("Label (Group)"), ParamDialog::DataUnit{tr("prism")}), + ParamDialog::RequestUnit(ParamDialog::TYPE_ARR_MPOINT3, tr("Point List"), ParamDialog::DataUnit{AMCAX::Coord3{.0, .0, .0}, ParamDialog::ParamType::TYPE_MPOINT3}), + }; } // ==================== BRep TAB ==================== void RenderViewer::slotCreateSingleFaceBRep() { - BRepObjectOperation(SelectModel::CLICK_MODEL, OperationType::CLICK_OPERATION_SELECT, - MeshOperationType::MeshFaceAppend); + BRepObjectOperation(SelectModel::CLICK_MODEL, OperationType::CLICK_OPERATION_SELECT, + MeshOperationType::MeshFaceAppend); } int RenderViewer::getLastPersistentId() { - return coreCommand_->getLastPersistentId(); + return coreCommand_->getLastPersistentId(); } -void RenderViewer::slotCreatPlaneBRep() +void RenderViewer::slotCreatPlaneBRep() { - dialog->addElements(objectFillOuts[OPERATE_BREP_PLANE]); - dialog->setWindowTitle(tr("Create a plane mesh")); - connect(dialog, &ParamDialog::dataReady, this, &RenderViewer::slotCreatPlaneBRepAccepted); - dialog->open(); + dialog->addElements(objectFillOuts[OPERATE_BREP_PLANE]); + dialog->setWindowTitle(tr("Create a plane mesh")); + connect(dialog, &ParamDialog::dataReady, this, &RenderViewer::slotCreatPlaneBRepAccepted); + dialog->open(); } -void RenderViewer::slotCreatPlaneBRepAccepted(const ParamDialog::Response& data) -{ - QString label(data[0].second.str); - AMCAX::Coord3 p0(data[1].second.point); - AMCAX::Coord3 p1(data[2].second.point); - coreCommand_->createPlaneBRepObject(p0, p1, label.toStdString()); - record.recordPlane(getLastPersistentId(), p0, p1, label.toStdString()); - update(); +void RenderViewer::slotCreatPlaneBRepAccepted(const ParamDialog::Response& data) +{ + QString label(data[0].second.str); + AMCAX::Coord3 p0(data[1].second.point); + AMCAX::Coord3 p1(data[2].second.point); + coreCommand_->createPlaneBRepObject(p0, p1, label.toStdString()); + //record.recordPlane(getLastPersistentId(), p0, p1, label.toStdString()); + update(); - objectFillOuts[OPERATE_BREP_PLANE][0].def.str = label; - objectFillOuts[OPERATE_BREP_PLANE][1].def.point = p0; - objectFillOuts[OPERATE_BREP_PLANE][2].def.point = p1; + objectFillOuts[OPERATE_BREP_PLANE][0].def.str = label; + objectFillOuts[OPERATE_BREP_PLANE][1].def.point = p0; + objectFillOuts[OPERATE_BREP_PLANE][2].def.point = p1; } void RenderViewer::slotCreatCubeBRep() { - dialog->addElements(objectFillOuts[OPERATE_BREP_CUBE]); - dialog->setWindowTitle(tr("Create a cube BRep")); - connect(dialog, &ParamDialog::dataReady, this, &RenderViewer::slotCreatCubeBRepAccepted); - dialog->open(); + dialog->addElements(objectFillOuts[OPERATE_BREP_CUBE]); + dialog->setWindowTitle(tr("Create a cube BRep")); + connect(dialog, &ParamDialog::dataReady, this, &RenderViewer::slotCreatCubeBRepAccepted); + dialog->open(); } void RenderViewer::slotCreatCubeBRepAccepted(const ParamDialog::Response& data) { - QString label(data[0].second.str); - AMCAX::Coord3 c(data[1].second.point); - AMCAX::Coord3 s(data[2].second.point); - coreCommand_->createCubeBRepObject(c, s, label.toStdString()); - record.recordCube(getLastPersistentId(), c, s, label.toStdString()); - update(); + QString label(data[0].second.str); + AMCAX::Coord3 c(data[1].second.point); + AMCAX::Coord3 s(data[2].second.point); + coreCommand_->createCubeBRepObject(c, s, label.toStdString()); + //record.recordCube(getLastPersistentId(), c, s, label.toStdString()); + update(); - objectFillOuts[OPERATE_BREP_CUBE][0].def.str = label; - objectFillOuts[OPERATE_BREP_CUBE][1].def.point = c; - objectFillOuts[OPERATE_BREP_CUBE][2].def.point = s; + objectFillOuts[OPERATE_BREP_CUBE][0].def.str = label; + objectFillOuts[OPERATE_BREP_CUBE][1].def.point = c; + objectFillOuts[OPERATE_BREP_CUBE][2].def.point = s; } void RenderViewer::slotCreateSphereBRep() { - dialog->addElements(objectFillOuts[OPERATE_BREP_SPHERE]); - dialog->setWindowTitle(tr("Create a Sphere BRep")); - connect(dialog, &ParamDialog::dataReady, this, &RenderViewer::slotCreateSphereBRepAccepted); - dialog->open(); + dialog->addElements(objectFillOuts[OPERATE_BREP_SPHERE]); + dialog->setWindowTitle(tr("Create a Sphere BRep")); + connect(dialog, &ParamDialog::dataReady, this, &RenderViewer::slotCreateSphereBRepAccepted); + dialog->open(); } void RenderViewer::slotCreateSphereBRepAccepted(const ParamDialog::Response& data) { - QString label(data[0].second.str); - AMCAX::Coord3 center = data[1].second.point; - double radius = data[2].second.d; - double angle1 = data[3].second.d; - double angle2 = data[4].second.d; - double angle3 = data[5].second.d; + QString label(data[0].second.str); + AMCAX::Coord3 center = data[1].second.point; + double radius = data[2].second.d; + double angle1 = data[3].second.d; + double angle2 = data[4].second.d; + double angle3 = data[5].second.d; - coreCommand_->createSphereBRepObject(center, radius, angle1 * M_PI, angle2 * M_PI, - angle3 * M_PI, - label.toStdString()); - record.recordSphere(getLastPersistentId(), center, radius, angle1, angle2, - angle3, - label.toStdString()); - update(); + coreCommand_->createSphereBRepObject(center, radius, angle1 * M_PI, angle2 * M_PI, + angle3 * M_PI, + label.toStdString()); + //record.recordSphere(getLastPersistentId(), center, radius, angle1, angle2, + // angle3, + // label.toStdString()); + update(); - objectFillOuts[OPERATE_BREP_SPHERE][0].def.str = label; - objectFillOuts[OPERATE_BREP_SPHERE][1].def.point = center; - objectFillOuts[OPERATE_BREP_SPHERE][2].def.d = radius; - objectFillOuts[OPERATE_BREP_SPHERE][3].def.d = angle1; - objectFillOuts[OPERATE_BREP_SPHERE][4].def.d = angle2; - objectFillOuts[OPERATE_BREP_SPHERE][5].def.d = angle3; + objectFillOuts[OPERATE_BREP_SPHERE][0].def.str = label; + objectFillOuts[OPERATE_BREP_SPHERE][1].def.point = center; + objectFillOuts[OPERATE_BREP_SPHERE][2].def.d = radius; + objectFillOuts[OPERATE_BREP_SPHERE][3].def.d = angle1; + objectFillOuts[OPERATE_BREP_SPHERE][4].def.d = angle2; + objectFillOuts[OPERATE_BREP_SPHERE][5].def.d = angle3; } void RenderViewer::slotCreateCylinderBRep() { - dialog->addElements(objectFillOuts[OPERATE_BREP_CYLINDER]); - dialog->setWindowTitle(tr("Create a Cylinder BRep")); - connect(dialog, &ParamDialog::dataReady, this, &RenderViewer::slotCreateCylinderBRepAccepted); - dialog->open(); + dialog->addElements(objectFillOuts[OPERATE_BREP_CYLINDER]); + dialog->setWindowTitle(tr("Create a Cylinder BRep")); + connect(dialog, &ParamDialog::dataReady, this, &RenderViewer::slotCreateCylinderBRepAccepted); + dialog->open(); } void RenderViewer::slotCreateCylinderBRepAccepted(const ParamDialog::Response& data) { - QString label(data[0].second.str); - AMCAX::Coord3 b_center = data[1].second.point; - AMCAX::Coord3 axis = data[2].second.vec; - AMCAX::Coord3 xaxis = data[3].second.vec; - double radius = data[4].second.d; - double height = data[5].second.d; - double angle = data[6].second.d; + QString label(data[0].second.str); + AMCAX::Coord3 b_center = data[1].second.point; + AMCAX::Coord3 axis = data[2].second.vec; + AMCAX::Coord3 xaxis = data[3].second.vec; + double radius = data[4].second.d; + double height = data[5].second.d; + double angle = data[6].second.d; - coreCommand_->createCylinderBRepObject(b_center, axis, xaxis, radius, height, angle * M_PI, - label.toStdString()); - record.recordCylinder(getLastPersistentId(), b_center, axis, xaxis, radius, - height, angle, - label.toStdString()); - update(); + coreCommand_->createCylinderBRepObject(b_center, axis, xaxis, radius, height, angle * M_PI, + label.toStdString()); + //record.recordCylinder(getLastPersistentId(), b_center, axis, xaxis, radius, + // height, angle, + // label.toStdString()); + update(); - objectFillOuts[OPERATE_BREP_CYLINDER][0].def.str = label; - objectFillOuts[OPERATE_BREP_CYLINDER][1].def.point = b_center; - objectFillOuts[OPERATE_BREP_CYLINDER][2].def.vec = axis; - objectFillOuts[OPERATE_BREP_CYLINDER][3].def.vec = xaxis; - objectFillOuts[OPERATE_BREP_CYLINDER][4].def.d = radius; - objectFillOuts[OPERATE_BREP_CYLINDER][5].def.d = height; - objectFillOuts[OPERATE_BREP_CYLINDER][6].def.d = angle; + objectFillOuts[OPERATE_BREP_CYLINDER][0].def.str = label; + objectFillOuts[OPERATE_BREP_CYLINDER][1].def.point = b_center; + objectFillOuts[OPERATE_BREP_CYLINDER][2].def.vec = axis; + objectFillOuts[OPERATE_BREP_CYLINDER][3].def.vec = xaxis; + objectFillOuts[OPERATE_BREP_CYLINDER][4].def.d = radius; + objectFillOuts[OPERATE_BREP_CYLINDER][5].def.d = height; + objectFillOuts[OPERATE_BREP_CYLINDER][6].def.d = angle; } void RenderViewer::slotCreateConeBrep() { - dialog->addElements(objectFillOuts[OPERATE_BREP_CONE]); - dialog->setWindowTitle(tr("Create a Cone BRep")); - connect(dialog, &ParamDialog::dataReady, this, &RenderViewer::slotCreateConeBrepAccepted); - dialog->open(); + dialog->addElements(objectFillOuts[OPERATE_BREP_CONE]); + dialog->setWindowTitle(tr("Create a Cone BRep")); + connect(dialog, &ParamDialog::dataReady, this, &RenderViewer::slotCreateConeBrepAccepted); + dialog->open(); } void RenderViewer::slotCreateConeBrepAccepted(const ParamDialog::Response& data) { - QString label(data[0].second.str); - AMCAX::Coord3 b_center = data[1].second.point; - AMCAX::Coord3 axis = data[2].second.vec; - AMCAX::Coord3 xaxis = data[3].second.vec; - double radiusR = data[4].second.d; - double radiusr = data[5].second.d; - double height = data[6].second.d; - double angle = data[7].second.d; + QString label(data[0].second.str); + AMCAX::Coord3 b_center = data[1].second.point; + AMCAX::Coord3 axis = data[2].second.vec; + AMCAX::Coord3 xaxis = data[3].second.vec; + double radiusR = data[4].second.d; + double radiusr = data[5].second.d; + double height = data[6].second.d; + double angle = data[7].second.d; - coreCommand_->createConeBRepObject(b_center, axis, xaxis, radiusR, radiusr, height, angle * M_PI, - label.toStdString()); - record.recordCone(getLastPersistentId(), b_center, axis, xaxis, radiusR, radiusr, - height, angle, - label.toStdString()); - update(); + coreCommand_->createConeBRepObject(b_center, axis, xaxis, radiusR, radiusr, height, angle * M_PI, + label.toStdString()); + //record.recordCone(getLastPersistentId(), b_center, axis, xaxis, radiusR, radiusr, + // height, angle, + // label.toStdString()); + update(); - objectFillOuts[OPERATE_BREP_CONE][0].def.str = label; - objectFillOuts[OPERATE_BREP_CONE][1].def.point = b_center; - objectFillOuts[OPERATE_BREP_CONE][2].def.vec = axis; - objectFillOuts[OPERATE_BREP_CONE][3].def.vec = xaxis; - objectFillOuts[OPERATE_BREP_CONE][4].def.d = radiusR; - objectFillOuts[OPERATE_BREP_CONE][5].def.d = radiusr; - objectFillOuts[OPERATE_BREP_CONE][6].def.d = height; - objectFillOuts[OPERATE_BREP_CONE][7].def.d = angle; + objectFillOuts[OPERATE_BREP_CONE][0].def.str = label; + objectFillOuts[OPERATE_BREP_CONE][1].def.point = b_center; + objectFillOuts[OPERATE_BREP_CONE][2].def.vec = axis; + objectFillOuts[OPERATE_BREP_CONE][3].def.vec = xaxis; + objectFillOuts[OPERATE_BREP_CONE][4].def.d = radiusR; + objectFillOuts[OPERATE_BREP_CONE][5].def.d = radiusr; + objectFillOuts[OPERATE_BREP_CONE][6].def.d = height; + objectFillOuts[OPERATE_BREP_CONE][7].def.d = angle; } void RenderViewer::slotCreateTorusBRep() { - dialog->addElements(objectFillOuts[OPERATE_BREP_TORUS]); - dialog->setWindowTitle(tr("Create a Torus BRep")); - connect(dialog, &ParamDialog::dataReady, this, &RenderViewer::slotCreateTorusBRepAccepted); - dialog->open(); + dialog->addElements(objectFillOuts[OPERATE_BREP_TORUS]); + dialog->setWindowTitle(tr("Create a Torus BRep")); + connect(dialog, &ParamDialog::dataReady, this, &RenderViewer::slotCreateTorusBRepAccepted); + dialog->open(); } void RenderViewer::slotCreateTorusBRepAccepted(const ParamDialog::Response& data) { - QString label(data[0].second.str); - AMCAX::Coord3 center = data[1].second.point; - AMCAX::Coord3 axis = data[2].second.vec; - AMCAX::Coord3 xaxis = data[3].second.vec; - double radius0 = data[4].second.d; - double radius1 = data[5].second.d; - double angle = data[6].second.d; + QString label(data[0].second.str); + AMCAX::Coord3 center = data[1].second.point; + AMCAX::Coord3 axis = data[2].second.vec; + AMCAX::Coord3 xaxis = data[3].second.vec; + double radius0 = data[4].second.d; + double radius1 = data[5].second.d; + double angle = data[6].second.d; - coreCommand_->createTorusBRepObject(center, axis, xaxis, radius0, radius1, angle * M_PI, - label.toStdString()); + coreCommand_->createTorusBRepObject(center, axis, xaxis, radius0, radius1, angle * M_PI, + label.toStdString()); - record.recordTorus(getLastPersistentId(), center, axis, xaxis, radius0, - radius1, angle, - label.toStdString()); - update(); + //record.recordTorus(getLastPersistentId(), center, axis, xaxis, radius0, + // radius1, angle, + // label.toStdString()); + update(); - objectFillOuts[OPERATE_BREP_TORUS][0].def.str = label; - objectFillOuts[OPERATE_BREP_TORUS][1].def.point = center; - objectFillOuts[OPERATE_BREP_TORUS][2].def.vec = axis; - objectFillOuts[OPERATE_BREP_TORUS][3].def.vec = xaxis; - objectFillOuts[OPERATE_BREP_TORUS][4].def.d = radius0; - objectFillOuts[OPERATE_BREP_TORUS][5].def.d = radius1; - objectFillOuts[OPERATE_BREP_TORUS][6].def.d = angle; + objectFillOuts[OPERATE_BREP_TORUS][0].def.str = label; + objectFillOuts[OPERATE_BREP_TORUS][1].def.point = center; + objectFillOuts[OPERATE_BREP_TORUS][2].def.vec = axis; + objectFillOuts[OPERATE_BREP_TORUS][3].def.vec = xaxis; + objectFillOuts[OPERATE_BREP_TORUS][4].def.d = radius0; + objectFillOuts[OPERATE_BREP_TORUS][5].def.d = radius1; + objectFillOuts[OPERATE_BREP_TORUS][6].def.d = angle; } void RenderViewer::slotCreatePrismBRep() { - dialog->addElements(objectFillOuts[OPERATE_BREP_PRISM]); - dialog->setWindowTitle(tr("Create a Prism BRep")); - connect(dialog, &ParamDialog::dataReady, this, &RenderViewer::slotCreatePrismBRepAccepted); - dialog->open(); + dialog->addElements(objectFillOuts[OPERATE_BREP_PRISM]); + dialog->setWindowTitle(tr("Create a Prism BRep")); + connect(dialog, &ParamDialog::dataReady, this, &RenderViewer::slotCreatePrismBRepAccepted); + dialog->open(); } void RenderViewer::slotCreatePrismBRepAccepted(const ParamDialog::Response& data) { - QString label(data[0].second.str); - std::vector pl = data[1].second.pointarr; - AMCAX::Coord3d extaxis = AMCAX::Coord3d(data[2].second.vec.X(), data[2].second.vec.Y(), data[2].second.vec.Z()); + QString label(data[0].second.str); + std::vector pl = data[1].second.pointarr; + AMCAX::Coord3d extaxis = AMCAX::Coord3d(data[2].second.vec.X(), data[2].second.vec.Y(), data[2].second.vec.Z()); - coreCommand_->createPrismBRepObject(pl, extaxis, label.toStdString()); - record.recordPrism(getLastPersistentId(), pl, extaxis, label.toStdString()); - update(); + coreCommand_->createPrismBRepObject(pl, extaxis, label.toStdString()); + //record.recordPrism(getLastPersistentId(), pl, extaxis, label.toStdString()); + update(); - objectFillOuts[OPERATE_BREP_PRISM][0].def.str = label; - objectFillOuts[OPERATE_BREP_PRISM][1].def.point = pl[0]; - objectFillOuts[OPERATE_BREP_PRISM][2].def.vec = extaxis; + objectFillOuts[OPERATE_BREP_PRISM][0].def.str = label; + objectFillOuts[OPERATE_BREP_PRISM][1].def.point = pl[0]; + objectFillOuts[OPERATE_BREP_PRISM][2].def.vec = extaxis; } void RenderViewer::slotBRepExtrude() { - dialog->addElements(objectFillOuts[OPERATE_BREP_EXTRUDE]); - dialog->setWindowTitle(tr("Set The Extrude Dir and Length")); - connect(dialog, &ParamDialog::dataReady, this, &RenderViewer::slotBRepExtrudeAccepted); - dialog->open(); + dialog->addElements(objectFillOuts[OPERATE_BREP_EXTRUDE]); + dialog->setWindowTitle(tr("Set The Extrude Dir and Length")); + connect(dialog, &ParamDialog::dataReady, this, &RenderViewer::slotBRepExtrudeAccepted); + dialog->open(); } void RenderViewer::slotBRepExtrudeAccepted(const ParamDialog::Response& data) { - AMCAX::Coord3d vec = data[0].second.vec; - setOperationVector(vec); + AMCAX::Coord3d vec = data[0].second.vec; + setOperationVector(vec); - BRepObjectOperation(SelectModel::OBJECT_MODEL, OperationType::ENTER_OPERATION, - MeshOperationType::MeshExtrudeFace); + BRepObjectOperation(SelectModel::OBJECT_MODEL, OperationType::ENTER_OPERATION, + MeshOperationType::MeshExtrudeFace); - objectFillOuts[OPERATE_BREP_EXTRUDE][0].def.vec = vec; + objectFillOuts[OPERATE_BREP_EXTRUDE][0].def.vec = vec; } -void RenderViewer::slotCreatePolygonBRep() +void RenderViewer::slotCreatePolygonBRep() { - dialog->addElements(objectFillOuts[OPERATE_BREP_POLYGON]); - dialog->setWindowTitle(tr("Create a Polygon BRep")); - connect(dialog, &ParamDialog::dataReady, this, &RenderViewer::slotCreatePolygonBRepAccepted); - dialog->open(); + dialog->addElements(objectFillOuts[OPERATE_BREP_POLYGON]); + dialog->setWindowTitle(tr("Create a Polygon BRep")); + connect(dialog, &ParamDialog::dataReady, this, &RenderViewer::slotCreatePolygonBRepAccepted); + dialog->open(); } void RenderViewer::slotCreatePolygonBRepAccepted(const ParamDialog::Response& data) { - QString label(data[0].second.str); - std::vector pl = data[1].second.pointarr; + QString label(data[0].second.str); + std::vector pl = data[1].second.pointarr; - coreCommand_->createPolygonBRepObject(pl, label.toStdString()); - record.recordPolygon(getLastPersistentId(), pl, label.toStdString()); - update(); + coreCommand_->createPolygonBRepObject(pl, label.toStdString()); + //record.recordPolygon(getLastPersistentId(), pl, label.toStdString()); + update(); - objectFillOuts[OPERATE_BREP_POLYGON][0].def.str = label; - objectFillOuts[OPERATE_BREP_POLYGON][1].def.point = pl[0]; + objectFillOuts[OPERATE_BREP_POLYGON][0].def.str = label; + objectFillOuts[OPERATE_BREP_POLYGON][1].def.point = pl[0]; } diff --git a/Src/Windows/SelectTool.cpp b/Src/Windows/SelectTool.cpp index b4329be..f1b0951 100644 --- a/Src/Windows/SelectTool.cpp +++ b/Src/Windows/SelectTool.cpp @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #include "SelectTool.h" @@ -22,426 +22,431 @@ using namespace acamcad; acamcad::SelectTool::SelectTool() - :dataManager_(nullptr), selectBuffer_(nullptr) + :dataManager_(nullptr), selectBuffer_(nullptr) { - setSelectBufferSize(2000); - setSelectRegionWidthDefault(); - setSelectRegionHeightDefault(); + setSelectBufferSize(2000); + setSelectRegionWidthDefault(); + setSelectRegionHeightDefault(); } //=================================================================== bool SelectTool::select(qglviewer::Camera* camera, const SelectModel& s_model, const AMCAX::CoordT& point, bool is_select_muti) { - camera_ = camera; - select_model_ = s_model; - return selectedDrawNeeded(point, is_select_muti); + camera_ = camera; + select_model_ = s_model; + return selectedDrawNeeded(point, is_select_muti); } -bool SelectTool::selectFrame(qglviewer::Camera* camera, const SelectModel& s_model, const AMCAX::CoordT& point, const PyramidInf & frustum) +bool SelectTool::selectFrame(qglviewer::Camera* camera, const SelectModel& s_model, const AMCAX::CoordT& point, const PyramidInf& frustum) { - camera_ = camera; - select_model_ = s_model; - return selectedDrawNeededFrame(point, frustum); + camera_ = camera; + select_model_ = s_model; + return selectedDrawNeededFrame(point, frustum); } //=================================================================== void SelectTool::beginSelection(const AMCAX::CoordT& point) { - // Prepare the selection mode - glSelectBuffer(selectBufferSize(), selectBuffer()); - glRenderMode(GL_SELECT); - glInitNames(); - - // Loads the matrices - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - static GLint viewport[4]; - camera_->getViewport(viewport); - gluPickMatrix(point.X(), point.Y(), selectRegionWidth(), selectRegionHeight(), viewport); - - // loadProjectionMatrix() first resets the GL_PROJECTION matrix with a glLoadIdentity() - // The false parameter prevents this and hence multiplies the matrices. - camera_->loadProjectionMatrix(false); - // Reset the original (world coordinates) modelview matrix - camera_->loadModelViewMatrix(); + // Prepare the selection mode + glSelectBuffer(selectBufferSize(), selectBuffer()); + glRenderMode(GL_SELECT); + glInitNames(); + + // Loads the matrices + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + static GLint viewport[4]; + camera_->getViewport(viewport); + gluPickMatrix(point.X(), point.Y(), selectRegionWidth(), selectRegionHeight(), viewport); + + // loadProjectionMatrix() first resets the GL_PROJECTION matrix with a glLoadIdentity() + // The false parameter prevents this and hence multiplies the matrices. + camera_->loadProjectionMatrix(false); + // Reset the original (world coordinates) modelview matrix + camera_->loadModelViewMatrix(); } void SelectTool::endSelection(const AMCAX::CoordT& point, const SelectModel& type) { - Q_UNUSED(point) - - // Flush GL buffers - glFlush(); - - // Get the number of objects that were seen through the pick matrix frustum. - // Reset GL_RENDER mode. - GLint nbHits = glRenderMode(GL_RENDER); - - if (nbHits <= 0) - selectedId_ = -1; - else { - // Interpret results: each object created 4 values in the selectBuffer(). - // selectBuffer[4*i+1] is the object minimum depth value, while - // selectBuffer[4*i+3] is the id pushed on the stack. Of all the objects - // that were projected in the pick region, we select the closest one (zMin comparison). - // This code needs to be modified if you use several stack levels. - - if (type == SelectModel::OBJECT_MODEL) - { - GLuint zMin = (selectBuffer())[1]; - selectedId_ = int((selectBuffer())[3]); - for (int i = 1; i < nbHits; ++i) - { - if ((selectBuffer())[4 * i + 1] < zMin) - { - zMin = (selectBuffer())[4 * i + 1]; - selectedId_ = int((selectBuffer())[4 * i + 3]); - } - } - } - else if (type == SelectModel::FACE_MODEL) - { - GLuint zMin = (selectBuffer())[1]; - selectedSubsetId_ = int((selectBuffer())[3]); - for (int i = 1; i < nbHits; ++i) - { - if ((selectBuffer())[4 * i + 1] < zMin) - { - zMin = (selectBuffer())[4 * i + 1]; - selectedSubsetId_ = int((selectBuffer())[4 * i + 3]); - } - } - } - else - { - - selectedId_ = -1; - selectedSubsetId_ = -1; - } - } + Q_UNUSED(point) + + // Flush GL buffers + glFlush(); + + // Get the number of objects that were seen through the pick matrix frustum. + // Reset GL_RENDER mode. + GLint nbHits = glRenderMode(GL_RENDER); + + selectedSubsetId_ = selectedId_ = -1; + + + if (nbHits > 0) + { + // Interpret results: each object created 4 values in the selectBuffer(). + // selectBuffer[4*i+1] is the object minimum depth value, while + // selectBuffer[4*i+3] is the id pushed on the stack. Of all the objects + // that were projected in the pick region, we select the closest one (zMin comparison). + // This code needs to be modified if you use several stack levels. + + if (type == SelectModel::OBJECT_MODEL) + { + GLuint zMin = (selectBuffer())[1]; + selectedId_ = int((selectBuffer())[3]); + for (int i = 1; i < nbHits; ++i) + { + if ((selectBuffer())[4 * i + 1] < zMin) + { + zMin = (selectBuffer())[4 * i + 1]; + selectedId_ = int((selectBuffer())[4 * i + 3]); + } + } + } + else if (type == SelectModel::FACE_MODEL) + { + GLuint zMin = (selectBuffer())[1]; + selectedSubsetId_ = int((selectBuffer())[3]); + for (int i = 1; i < nbHits; ++i) + { + if ((selectBuffer())[4 * i + 1] < zMin) + { + zMin = (selectBuffer())[4 * i + 1]; + selectedSubsetId_ = int((selectBuffer())[4 * i + 3]); + } + } + } + } } bool SelectTool::selectedDrawNeeded(const AMCAX::CoordT& point, bool is_select_muti) { - beginSelection(point); - selectDrawObject(); - endSelection(point, SelectModel::OBJECT_MODEL); - - BaseObject* object = dataManager_->getObjectByPersistentID(selectedId_); - - if (object == nullptr) - { - if(!is_select_muti) - clearSelected(); - - return false; - } - - if (!is_select_muti) - { - clearSelected(); - } - - SelectInfoWithCamera s_info_camera; - s_info_camera.object_id_ = selectedId_; - s_info_camera.object_subpart_id_ = -1; - - AMCAX::Coord3 sc = AMCAX::Coord3(0.0, 0.0, 0.0); - if (select_model_ == SelectModel::OBJECT_MODEL) - { - object->setSelect(true); - selectedObject_Center(s_info_camera, select_model_, sc); - } - else if (select_model_ == SelectModel::FACE_MODEL || - select_model_ == SelectModel::VERTEX_MODEL || select_model_ == SelectModel::EDGE_MODEL) - { - object->setSelectSub(true); - - beginSelection(point); - selectDrawFace(object); - endSelection(point, SelectModel::FACE_MODEL); - - if (selectedSubsetId_ >= 0) - { - s_info_camera.object_subpart_id_ = selectedSubsetId_; - setSelectInfoCamera(point, s_info_camera); - selectedObject_Element(s_info_camera, select_model_); - - if (s_info_camera.object_subselect_id_ > -1) { - selectedObject_Center(s_info_camera, select_model_, sc); - } - else{ - return false; - } - } - } - - SelectInfo s_info(s_info_camera.object_id_, s_info_camera.object_subselect_id_); - - int fid = findSelect(select_model_, select_info_list_, s_info); - if (fid > -1) - { - if (is_select_muti) - { - select_info_list_.erase(select_info_list_.begin() + fid); - select_center_list_.erase(select_center_list_.begin() + fid); - - select_infoCamera_list_.erase(select_infoCamera_list_.begin() + fid); - return false; - } - } - else - { - select_info_list_.push_back(s_info); - select_center_list_.push_back(sc); - - select_infoCamera_list_.push_back(s_info_camera); - return true; - } - - return false; + //selectedId_ = -1; + beginSelection(point); + selectDrawObject(); + endSelection(point, SelectModel::OBJECT_MODEL); + + BaseObject* object = dataManager_->getObjectByPersistentID(selectedId_); + + if (object == nullptr) + { + if (!is_select_muti) + clearSelected(); + + return false; + } + + if (!is_select_muti) + { + clearSelected(); + } + + SelectInfoWithCamera s_info_camera; + s_info_camera.object_id_ = selectedId_; + s_info_camera.object_subpart_id_ = -1; + + AMCAX::Coord3 sc = AMCAX::Coord3(0.0, 0.0, 0.0); + if (select_model_ == SelectModel::OBJECT_MODEL) + { + object->setSelect(true); + selectedObject_Center(s_info_camera, select_model_, sc); + s_info_camera.object_subpart_id_ = s_info_camera.object_subselect_id_ = -1; + SelectInfo s_info(s_info_camera.object_id_, s_info_camera.object_subselect_id_); + + select_infoCamera_list_.push_back(s_info_camera); + select_info_list_.push_back(s_info); + + selectedObject_Center(s_info, select_model_, sc); + select_center_list_.push_back(sc); + + return true; + } + else if (select_model_ == SelectModel::FACE_MODEL || + select_model_ == SelectModel::VERTEX_MODEL || select_model_ == SelectModel::EDGE_MODEL) + { + object->setSelectSub(true); + //selectedSubsetId_ = -1; + beginSelection(point); + switch (select_model_) + { + case acamcad::SelectModel::VERTEX_MODEL: + object->getDrawTool()->drawWithVertexID(); + break; + case acamcad::SelectModel::EDGE_MODEL: + object->getDrawTool()->drawWithEdgeID(); + break; + case acamcad::SelectModel::FACE_MODEL: + object->getDrawTool()->drawWithFaceID(); + break; + default: + break; + } + endSelection(point, SelectModel::FACE_MODEL); + + + if (selectedSubsetId_ >= 0) + { + + s_info_camera.object_subpart_id_ = s_info_camera.object_subselect_id_ = selectedSubsetId_; + SelectInfo s_info(s_info_camera.object_id_, s_info_camera.object_subselect_id_); + + select_infoCamera_list_.push_back(s_info_camera); + select_info_list_.push_back(s_info); + + selectedObject_Center(s_info, select_model_, sc); + select_center_list_.push_back(sc); + return true; + } + } + + return false; } void SelectTool::selectDrawObject() { - for (ObjectIter o_it = dataManager_->objects_begin(); o_it != dataManager_->objects_end(); ++o_it) - { - BaseObject* object = *o_it; - glPushName(object->persistentId()); + for (ObjectIter o_it = dataManager_->objects_begin(); o_it != dataManager_->objects_end(); ++o_it) + { + //BaseObject* object = *o_it; + ///glPushName(object->persistentId()); - object->getDrawTool()->drawForSelect(); + (*o_it)->getDrawTool()->drawWithObjectID(); - glPopName(); - } -} - -void SelectTool::selectDrawFace(const BaseObject* object) -{ - object->getDrawTool()->drawForSelectPart(); + //glPopName(); + } } +// +//void SelectTool::selectDrawFace(const BaseObject* object) +//{ +// object->getDrawTool()->drawForSelectPart(); +//} //=================================================================== void SelectTool::beginSelectionFrame(const AMCAX::CoordT& point) { - beginSelection(point); + beginSelection(point); } void SelectTool::endSelectionFrame(const AMCAX::CoordT& point, SelectModel type) { - Q_UNUSED(point) - - // Flush GL buffers - glFlush(); - - // Get the number of objects that were seen through the pick matrix frustum. - // Reset GL_RENDER mode. - GLint nbHits = glRenderMode(GL_RENDER); - - selectedFrame_id_.clear(); - if (nbHits > 0) - { - // Same as endSelection - for (int i = 0; i < nbHits; ++i) - { - int id = (selectBuffer())[4 * i + 3]; - selectedFrame_id_.push_back(id); - } - } + Q_UNUSED(point) + + // Flush GL buffers + glFlush(); + + // Get the number of objects that were seen through the pick matrix frustum. + // Reset GL_RENDER mode. + GLint nbHits = glRenderMode(GL_RENDER); + + selectedFrame_id_.clear(); + if (nbHits > 0) + { + // Same as endSelection + for (int i = 0; i < nbHits; ++i) + { + int id = (selectBuffer())[4 * i + 3]; + selectedFrame_id_.push_back(id); + } + } } -bool SelectTool::selectedDrawNeededFrame(const AMCAX::CoordT& point, const PyramidInf & frustum) +bool SelectTool::selectedDrawNeededFrame(const AMCAX::CoordT& point, const PyramidInf& frustum) { - beginSelection(point); - selectDrawObject(); - endSelectionFrame(point, SelectModel::OBJECT_MODEL); - - std::vector object_sid_list = selectedFrame_id_; - std::vector< BaseObject* > select_object_list; select_object_list.clear(); - for (int i = 0; i < object_sid_list.size(); i++) - { - BaseObject* object = dataManager_->getObjectByPersistentID(object_sid_list[i]); - if (object != nullptr) - { - if (select_model_ == SelectModel::OBJECT_MODEL) - object->setSelect(true); - else - object->setSelectSub(true); - select_object_list.push_back(object); - } - } - - if (select_object_list.empty()) - { - clearSelected(); - return false; - } - - AMCAX::Coord3d sc = AMCAX::Coord3d(0.0, 0.0, 0.0); - if (select_model_ == SelectModel::OBJECT_MODEL) - { - for (int i = 0; i < select_object_list.size(); i++) - { - SelectInfoWithCamera s_info_camera; - s_info_camera.object_id_ = selectedFrame_id_[i]; - s_info_camera.object_subpart_id_ = -1; - SelectInfo s_info; - s_info.object_id_ = selectedFrame_id_[i]; - s_info.object_subselect_id_ = -1; - - selectedObject_Center(s_info_camera, select_model_, sc); - - select_center_list_.push_back(sc); - select_info_list_.push_back(s_info); - select_infoCamera_list_.push_back(s_info_camera); - } - } - else if (select_model_ == SelectModel::FACE_MODEL || - select_model_ == SelectModel::VERTEX_MODEL || select_model_ == SelectModel::EDGE_MODEL) - { - SelectInfo s_info; - std::vector select_info_object_; - for (int i = 0; i < select_object_list.size(); i++) - { - beginSelection(point); - selectDrawFace(select_object_list[i]); - endSelectionFrame(point, SelectModel::FACE_MODEL); - - s_info.object_id_ = object_sid_list[i]; - select_info_object_.clear(); - if (!selectedFrame_id_.empty()) - { - for (int j = 0; j < selectedFrame_id_.size(); j++) - { - s_info.object_subselect_id_ = selectedFrame_id_[j]; - select_info_object_.push_back(s_info); - } - - selectedObject_Element_Frame(select_info_object_, select_model_, frustum); - - for (int j = 0; j < select_info_object_.size(); j++) - { - SelectInfo& s_info = select_info_object_[j]; - selectedObject_Center(s_info, select_model_, sc); - - SelectInfoWithCamera s_info_camera; - s_info_camera.object_id_ = s_info.object_id_; - s_info_camera.object_subselect_id_ = s_info.object_subselect_id_; - - select_center_list_.push_back(sc); - select_info_list_.push_back(s_info); - select_infoCamera_list_.push_back(s_info_camera); - } - } - } - } - - if (!select_info_list_.empty()) - { - return true; - } - else - { - return false; - } + //selectedFrame_id_ = -1; + beginSelection(point); + selectDrawObject(); + endSelectionFrame(point, SelectModel::OBJECT_MODEL); + + std::vector object_sid_list = selectedFrame_id_; + std::vector select_object_list; select_object_list.clear(); + for (int i = 0; i < object_sid_list.size(); i++) + { + AdapterObject* object = dataManager_->getObjectByPersistentID(object_sid_list[i]); + if (object != nullptr) + { + if (select_model_ == SelectModel::OBJECT_MODEL) + object->setSelect(true); + else + object->setSelectSub(true); + select_object_list.push_back(object); + } + } + + if (select_object_list.empty()) + { + clearSelected(); + return false; + } + + AMCAX::Coord3d sc = AMCAX::Coord3d(0.0, 0.0, 0.0); + if (select_model_ == SelectModel::OBJECT_MODEL) + { + for (int i = 0; i < select_object_list.size(); i++) + { + SelectInfoWithCamera s_info_camera; + s_info_camera.object_id_ = selectedFrame_id_[i]; + s_info_camera.object_subpart_id_ = -1; + SelectInfo s_info; + s_info.object_id_ = selectedFrame_id_[i]; + s_info.object_subselect_id_ = -1; + + selectedObject_Center(s_info_camera, select_model_, sc); + + select_center_list_.push_back(sc); + select_info_list_.push_back(s_info); + select_infoCamera_list_.push_back(s_info_camera); + } + } + else if (select_model_ == SelectModel::FACE_MODEL || + select_model_ == SelectModel::VERTEX_MODEL || select_model_ == SelectModel::EDGE_MODEL) + { + //SelectInfo s_info; + //std::vector select_info_object_; + for (int i = 0; i < select_object_list.size(); i++) + { + beginSelection(point); + switch (select_model_) + { + case acamcad::SelectModel::VERTEX_MODEL: + select_object_list[i]->getDrawTool()->drawWithVertexID(); + break; + case acamcad::SelectModel::EDGE_MODEL: + select_object_list[i]->getDrawTool()->drawWithEdgeID(); + break; + case acamcad::SelectModel::FACE_MODEL: + select_object_list[i]->getDrawTool()->drawWithFaceID(); + break; + default: + break; + } + endSelectionFrame(point, SelectModel::FACE_MODEL); + + for (int j = 0; j < selectedFrame_id_.size(); j++) + { + SelectInfoWithCamera s_info_camera; + s_info_camera.object_id_ = object_sid_list[i]; + s_info_camera.object_subselect_id_ = selectedFrame_id_[j]; + select_infoCamera_list_.push_back(s_info_camera); + + SelectInfo s_info; + s_info.object_id_ = object_sid_list[i]; + s_info.object_subselect_id_ = selectedFrame_id_[j]; + select_info_list_.push_back(s_info); + + selectedObject_Center(s_info, select_model_, sc); + select_center_list_.push_back(sc); + } + + } + } + + if (!select_info_list_.empty()) + { + return true; + } + else + { + return false; + } } //================================================================ std::vector acamcad::SelectTool::getSelectInfoNew() { - return select_infoCamera_list_; + return select_infoCamera_list_; } AMCAX::Coord3 acamcad::SelectTool::getCenter() { - AMCAX::Coord3 c(0.0, 0.0, 0.0); - for (int i = 0; i < select_center_list_.size(); i++) - { - c += select_center_list_[i]; - } - c = c / select_center_list_.size(); - return c; + AMCAX::Coord3 c(0.0, 0.0, 0.0); + for (int i = 0; i < select_center_list_.size(); i++) + { + c += select_center_list_[i]; + } + c = c / select_center_list_.size(); + return c; } void SelectTool::clearSelected() { - dataManager_->clearSelected(); + dataManager_->clearSelected(); - select_info_list_.clear(); - select_infoCamera_list_.clear(); - select_center_list_.clear(); + select_info_list_.clear(); + select_infoCamera_list_.clear(); + select_center_list_.clear(); } void SelectTool::setSelectInfoCamera(const AMCAX::CoordT& pixel, acamcad::SelectInfoWithCamera& s_info) { - QPoint p(pixel.X(), pixel.Y()); + QPoint p(pixel.X(), pixel.Y()); - AMCAX::Coord3 view_ori_, view_dir_; - camera_->convertClickToLine(p, view_ori_, view_dir_); - s_info.c_begin_ = view_ori_; - s_info.c_end_ = view_ori_ + 100.f * view_dir_; + AMCAX::Coord3 view_ori_, view_dir_; + camera_->convertClickToLine(p, view_ori_, view_dir_); + s_info.c_begin_ = view_ori_; + s_info.c_end_ = view_ori_ + 100.f * view_dir_; } //================================================================ void SelectTool::selectedObject_Element(SelectInfoWithCamera& select_info, const SelectModel& type_) { - BaseObject* object = dataManager_->getObjectByPersistentID(select_info.object_id_); - - MOperation_Select* mo_select = new MOperation_Select(type_); - mo_select->setOperateId(select_info); - object->doOperate(mo_select); - select_info = mo_select->getSelectInfoNew(); - delete mo_select; + AdapterObject* object = dataManager_->getObjectByPersistentID(select_info.object_id_); + + MOperation_Select* mo_select = new MOperation_Select(type_); + mo_select->setOperateId(select_info); + ///object->doOperate(mo_select); + mo_select->operate(object); + select_info = mo_select->getSelectInfoNew(); + delete mo_select; } -void SelectTool::selectedObject_Element_Frame(std::vector& select_info_list, const SelectModel& type_, const PyramidInf & frustum) +void SelectTool::selectedObject_Element_Frame(std::vector& select_info_list, const SelectModel& type_, const PyramidInf& frustum) { - if (!isSelectOneObject(select_info_list)) - { - std::cout << "can not Fast select different object" << std::endl; - return; - } + if (!isSelectOneObject(select_info_list)) + { + std::cout << "can not Fast select different object" << std::endl; + return; + } } -void SelectTool::selectedObject_Center(SelectInfoWithCamera& select_info, const SelectModel& type_, AMCAX::Coord3 & center) +void SelectTool::selectedObject_Center(SelectInfoWithCamera& select_info, const SelectModel& type_, AMCAX::Coord3& center) { - BaseObject* object = dataManager_->getObjectByPersistentID(select_info.object_id_); - - MOperation_getCenter* mo_select = new MOperation_getCenter(type_); - mo_select->setSelectInfoCamera(select_info); - object->doOperate(mo_select); - center = mo_select->getCenter(); - delete mo_select; + AdapterObject* object = dataManager_->getObjectByPersistentID(select_info.object_id_); + + MOperation_getCenter* mo_select = new MOperation_getCenter(type_); + mo_select->setSelectInfoCamera(select_info); + //object->doOperate(mo_select); + mo_select->operate(object); + center = mo_select->getCenter(); + delete mo_select; } -void SelectTool::selectedObject_Center(SelectInfo& select_info, const SelectModel& type_, AMCAX::Coord3 & center) +void SelectTool::selectedObject_Center(SelectInfo& select_info, const SelectModel& type_, AMCAX::Coord3& center) { - BaseObject* object = dataManager_->getObjectByPersistentID(select_info.object_id_); - - MOperation_getCenter* mo_select = new MOperation_getCenter(type_); - mo_select->setOperateId(select_info); - object->doOperate(mo_select); - center = mo_select->getCenter(); - delete mo_select; + AdapterObject* object = dataManager_->getObjectByPersistentID(select_info.object_id_); + + MOperation_getCenter* mo_select = new MOperation_getCenter(type_); + mo_select->setOperateId(select_info); + //object->doOperate(mo_select); + mo_select->operate(object); + center = mo_select->getCenter(); + delete mo_select; } //================================================================ -void SelectTool::setSelectBufferSize(int size) +void SelectTool::setSelectBufferSize(int size) { - if (selectBuffer_) - delete[] selectBuffer_; - selectBufferSize_ = size; - selectBuffer_ = new GLuint[selectBufferSize()]; + if (selectBuffer_) + delete[] selectBuffer_; + selectBufferSize_ = size; + selectBuffer_ = new GLuint[selectBufferSize()]; } //================================================================ void acamcad::SelectTool::setDataManger(DataManager* dataManager) { - dataManager_ = dataManager; + dataManager_ = dataManager; } \ No newline at end of file diff --git a/Src/Windows/SelectTool.h b/Src/Windows/SelectTool.h index 9e97590..6745a09 100644 --- a/Src/Windows/SelectTool.h +++ b/Src/Windows/SelectTool.h @@ -1,17 +1,17 @@ /* =================================================================== -* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. +* Copyright (C) 2023 Hefei Jiushao Intelligent Technology Co., Ltd. * All rights reserved. * -* This software is licensed under the GNU Affero General Public License -* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this +* This software is licensed under the GNU Affero General Public License +* v3.0 (AGPLv3.0) or a commercial license. You may choose to use this * software under the terms of either license. * -* For more information about the AGPLv3.0 license, please visit: +* For more information about the AGPLv3.0 license, please visit: * https://www.gnu.org/licenses/agpl-3.0.html -* For licensing inquiries or to obtain a commercial license, please +* For licensing inquiries or to obtain a commercial license, please * contact Hefei Jiushao Intelligent Technology Co., Ltd. * =================================================================== -* Author: +* Author: */ #pragma once @@ -26,86 +26,86 @@ namespace acamcad { -class DataManager; - -class SelectTool -{ -public: - SelectTool(); - ~SelectTool() {}; - -public: - bool select(qglviewer::Camera* camera, const SelectModel& s_model, const AMCAX::CoordT& point, bool is_select_muti); - bool selectFrame(qglviewer::Camera* camera, const SelectModel& s_model, const AMCAX::CoordT& point, const PyramidInf & frustum); - -private: - void beginSelection(const AMCAX::CoordT& point); - void endSelection(const AMCAX::CoordT& point, const SelectModel& type); - bool selectedDrawNeeded(const AMCAX::CoordT& point, bool is_select_muti); - - void selectDrawObject(); - void selectDrawFace(const BaseObject* obj); - -private: - void beginSelectionFrame(const AMCAX::CoordT& point); - void endSelectionFrame(const AMCAX::CoordT& point, SelectModel type); - bool selectedDrawNeededFrame(const AMCAX::CoordT& point, const PyramidInf & frustum); - -public: - std::vector getSelectInfoNew(); - void clearSelected(); - - AMCAX::Coord3 getCenter(); -private: - std::vector select_info_list_; - std::vector select_infoCamera_list_; - - std::vector select_center_list_; - -public: - GLuint* selectBuffer() { return selectBuffer_; } - /*! Default value is 400, 100 for 1 object with 4 size. */ - void setSelectBufferSize(int size); - int selectBufferSize() const { return selectBufferSize_; } - - /*! Default value is 3 pixels. */ - int selectRegionWidth() const { return selectRegionWidth_; } - /*! Default value is 3 pixels. */ - int selectRegionHeight() const { return selectRegionHeight_; } - void setSelectRegionWidth(int width) { selectRegionWidth_ = width; } - void setSelectRegionHeight(int height) { selectRegionHeight_ = height; } - - void setSelectRegionWidthDefault() { selectRegionWidth_ = 3; } - void setSelectRegionHeightDefault() { selectRegionHeight_ = 3; } -private: - int selectRegionWidth_, selectRegionHeight_; - GLuint* selectBuffer_; - int selectBufferSize_; - int selectedId_; - int selectedSubsetId_; - - std::vector selectedFrame_id_; - -private: - qglviewer::Camera* camera_; - void setSelectInfoCamera(const AMCAX::CoordT& pixel, acamcad::SelectInfoWithCamera& s_info); - -private: - void selectedObject_Element(SelectInfoWithCamera& select_info, const SelectModel& type_); - void selectedObject_Element_Frame(std::vector& select_info_list, const SelectModel& type_, const PyramidInf & frustum); - - void selectedObject_Center(SelectInfoWithCamera& select_info, const SelectModel& type_, AMCAX::Coord3 & center); - void selectedObject_Center(SelectInfo& select_info, const SelectModel& type_, AMCAX::Coord3 & center); - -private: - SelectModel select_model_; - -public: - void setDataManger(DataManager* dataManager); -private: - DataManager* dataManager_; - -}; + class DataManager; + + class SelectTool + { + public: + SelectTool(); + ~SelectTool() {}; + + public: + bool select(qglviewer::Camera* camera, const SelectModel& s_model, const AMCAX::CoordT& point, bool is_select_muti); + bool selectFrame(qglviewer::Camera* camera, const SelectModel& s_model, const AMCAX::CoordT& point, const PyramidInf& frustum); + + private: + void beginSelection(const AMCAX::CoordT& point); + void endSelection(const AMCAX::CoordT& point, const SelectModel& type); + bool selectedDrawNeeded(const AMCAX::CoordT& point, bool is_select_muti); + + void selectDrawObject(); + //void selectDrawFace(const BaseObject* obj); + + private: + void beginSelectionFrame(const AMCAX::CoordT& point); + void endSelectionFrame(const AMCAX::CoordT& point, SelectModel type); + bool selectedDrawNeededFrame(const AMCAX::CoordT& point, const PyramidInf& frustum); + + public: + std::vector getSelectInfoNew(); + void clearSelected(); + + AMCAX::Coord3 getCenter(); + private: + std::vector select_info_list_; + std::vector select_infoCamera_list_; + + std::vector select_center_list_; + + public: + GLuint* selectBuffer() { return selectBuffer_; } + /*! Default value is 400, 100 for 1 object with 4 size. */ + void setSelectBufferSize(int size); + int selectBufferSize() const { return selectBufferSize_; } + + /*! Default value is 3 pixels. */ + int selectRegionWidth() const { return selectRegionWidth_; } + /*! Default value is 3 pixels. */ + int selectRegionHeight() const { return selectRegionHeight_; } + void setSelectRegionWidth(int width) { selectRegionWidth_ = width; } + void setSelectRegionHeight(int height) { selectRegionHeight_ = height; } + + void setSelectRegionWidthDefault() { selectRegionWidth_ = 3; } + void setSelectRegionHeightDefault() { selectRegionHeight_ = 3; } + private: + int selectRegionWidth_, selectRegionHeight_; + GLuint* selectBuffer_; + int selectBufferSize_; + int selectedId_; + int selectedSubsetId_; + + std::vector selectedFrame_id_; + + private: + qglviewer::Camera* camera_; + void setSelectInfoCamera(const AMCAX::CoordT& pixel, acamcad::SelectInfoWithCamera& s_info); + + private: + void selectedObject_Element(SelectInfoWithCamera& select_info, const SelectModel& type_); + void selectedObject_Element_Frame(std::vector& select_info_list, const SelectModel& type_, const PyramidInf& frustum); + + void selectedObject_Center(SelectInfoWithCamera& select_info, const SelectModel& type_, AMCAX::Coord3& center); + void selectedObject_Center(SelectInfo& select_info, const SelectModel& type_, AMCAX::Coord3& center); + + private: + SelectModel select_model_; + + public: + void setDataManger(DataManager* dataManager); + private: + DataManager* dataManager_; + + }; diff --git a/third_party/FreeGLUT/x64-Debug/bin/freeglutd.dll b/third_party/FreeGLUT/x64-Debug/bin/freeglutd.dll new file mode 100644 index 0000000000000000000000000000000000000000..0df31d7b732fe6a94879343b19c0b2049fac3ad6 GIT binary patch literal 435712 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 a=I)X&C{ach{kkYP0 zUP;a;y!6|H+**m9EH9&+4^ya&kb^-K@mpWiL^#Z_`CE!ij8Ca}>aFjQ+ah=46=CN> z2`XdE4dp_FQ*mMQpN`Zl3WLY10sB;>RB3+`hTsg%_BlijIFf-6yMDU~OVD<$s41o# zgE31D*t;R0Q(5f+$PY2_93qwb$xeJ1an3sR6D=w1VNTS zs$J7kq5k){@4|Y|xyZwcwiDp(Cs9o7E<#z&F2=u@dUIlZP zyLR5mk~P|c($5w^0c?`eF}qgco-1IVO|8mZAL-ER0o4H?3xMz|ym^N8++z}72NA`d z(2He}gCP@I>Yf`!OWC!+7Su-<4!e%0P-3%f%Z->pJjr3OWQ}z-{K)OqT&NUjuZGmf zVy|Bzi;^vPZ#;W_&&}uMu21if_8Kij%NdV?roG+;2KFjsZRM`Fb?DiE>h^j<0Ic@9 z+9Xbw9A@gp8jyowFKLuk8(@?<@W?2mSYn=}w)j?Hv!r$>-8cwGiOPBqW0%qENoJ* zi@@eItWmNZm;O%T(z(<-92f0P+Pk8{vcBVG#oa_BNBCdl`|3?=y!c!SpqbjPkA$4+F3t>aVm!^4gCl;$WDJh-$v&cGCh`z`<%9ics8E~D zHW6b=@dpT>0}vM=Y<_|#tYRp(8U>~(S1NbwL|U(J zWHC!fRDO8Sm6%c3SKR^UWgiD*CWy&uTh8o zf*F?ux38oAlr*vaqW(u+ghiDKT@%zKorD)aJ%Cu9VC=^`VX-#YYQTo;OL4~ze_X2I;W{BaJwhu-ch z^QDH4HN5FP-Hw^slOGC|<9L(4zF${=x{3D87QTtq1o$uV7sf8I|RaC{h{F7?lxUKWV|G3dFV9vo|s)!F=}z*ycuMv+3$?DcFGpGah1ylyUqV`p5?p=u zLal06b1SNel|oHDytIA3_BkH5GFsCAo!ESA0t*Y=)imJ51z#htud}(62f7G3dlMZ0hm=;av;fB`hciO+~0Fp zc#G8molSJM+^t$9M2$z)O9gNleD%E&frLmH5)34d8v5M|m`%IcxgA)4s z+rZLp?L?s_Co7e->WKh`K8tA}!#~m?m%A**GrhN`N3qRzTc)1yj|rrBy4uhbAeQv@ zG`#H=WT4U(Z@_Cxr;oZA*5l7gfgg>6{tH8w;xm?`$77l75+wXgT!6%#OynSOHxoUP zxQ~g>NX%#AL?jk6aU2rQGLeqNDkd5su^tHspFV8$wR2Oz(}DkE@!tXe8Tjvk|MT!~ z^yB(-d<%F7McybxUkiV*K#r6ijgOW>_%o(z-!_9wVg6><0`Eme^vDttuYFOK0Hopz z>I|^XqI4|}0i+~n3a*mCLBBEU88vX|Yz%oW5oM3p(nZ<6qAVQHv4ef*$JK|>Jt6Bm zF|r!voqG9==w>B3NvixBmVeeLzXVixam0ubsqc|q8U5Fb{+o{|CN^qM_NPrpv)301!uL{

Y;4*`+ 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⪙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
s?*1!%Mm`S3KGDOJ~p4*8uHa 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৺{r7t1hZ6gr2fcTZBK%Q}e2 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 akdr`80yzofB#@IpP69az + * Creation date: Thu Dec 2 1999 + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifdef __cplusplus + extern "C" { +#endif + +/* + * Additional GLUT Key definitions for the Special key function + */ +#define GLUT_KEY_NUM_LOCK 0x006D +#define GLUT_KEY_BEGIN 0x006E +#define GLUT_KEY_DELETE 0x006F +#define GLUT_KEY_SHIFT_L 0x0070 +#define GLUT_KEY_SHIFT_R 0x0071 +#define GLUT_KEY_CTRL_L 0x0072 +#define GLUT_KEY_CTRL_R 0x0073 +#define GLUT_KEY_ALT_L 0x0074 +#define GLUT_KEY_ALT_R 0x0075 +#define GLUT_KEY_SUPER_L 0x0076 +#define GLUT_KEY_SUPER_R 0x0077 + +/* + * Additional GLUT modifiers + */ +#define GLUT_ACTIVE_SUPER 0x0008 + +/* + * GLUT API Extension macro definitions -- behaviour when the user clicks on an "x" to close a window + */ +#define GLUT_ACTION_EXIT 0 +#define GLUT_ACTION_GLUTMAINLOOP_RETURNS 1 +#define GLUT_ACTION_CONTINUE_EXECUTION 2 + +/* + * Create a new rendering context when the user opens a new window? + */ +#define GLUT_CREATE_NEW_CONTEXT 0 +#define GLUT_USE_CURRENT_CONTEXT 1 + +/* + * Direct/Indirect rendering context options (has meaning only in Unix/X11) + */ +#define GLUT_FORCE_INDIRECT_CONTEXT 0 +#define GLUT_ALLOW_DIRECT_CONTEXT 1 +#define GLUT_TRY_DIRECT_CONTEXT 2 +#define GLUT_FORCE_DIRECT_CONTEXT 3 + +/* + * GLUT API Extension macro definitions -- the glutGet parameters + */ +#define GLUT_INIT_STATE 0x007C + +#define GLUT_ACTION_ON_WINDOW_CLOSE 0x01F9 + +#define GLUT_WINDOW_BORDER_WIDTH 0x01FA +#define GLUT_WINDOW_BORDER_HEIGHT 0x01FB +#define GLUT_WINDOW_HEADER_HEIGHT 0x01FB /* Docs say it should always have been GLUT_WINDOW_BORDER_HEIGHT, keep this for backward compatibility */ + +#define GLUT_VERSION 0x01FC + +#define GLUT_RENDERING_CONTEXT 0x01FD +#define GLUT_DIRECT_RENDERING 0x01FE + +#define GLUT_FULL_SCREEN 0x01FF + +#define GLUT_SKIP_STALE_MOTION_EVENTS 0x0204 + +#define GLUT_GEOMETRY_VISUALIZE_NORMALS 0x0205 + +#define GLUT_STROKE_FONT_DRAW_JOIN_DOTS 0x0206 /* Draw dots between line segments of stroke fonts? */ + +#define GLUT_ALLOW_NEGATIVE_WINDOW_POSITION 0x0207 /* GLUT doesn't allow negative window positions by default */ + +#define GLUT_WINDOW_SRGB 0x007D + +/* + * New tokens for glutInitDisplayMode. + * Only one GLUT_AUXn bit may be used at a time. + * Value 0x0400 is defined in OpenGLUT. + */ +#define GLUT_AUX 0x1000 + +#define GLUT_AUX1 0x1000 +#define GLUT_AUX2 0x2000 +#define GLUT_AUX3 0x4000 +#define GLUT_AUX4 0x8000 + +/* + * Context-related flags, see fg_state.c + * Set the requested OpenGL version + */ +#define GLUT_INIT_MAJOR_VERSION 0x0200 +#define GLUT_INIT_MINOR_VERSION 0x0201 +#define GLUT_INIT_FLAGS 0x0202 +#define GLUT_INIT_PROFILE 0x0203 + +/* + * Flags for glutInitContextFlags, see fg_init.c + */ +#define GLUT_DEBUG 0x0001 +#define GLUT_FORWARD_COMPATIBLE 0x0002 + + +/* + * Flags for glutInitContextProfile, see fg_init.c + */ +#define GLUT_CORE_PROFILE 0x0001 +#define GLUT_COMPATIBILITY_PROFILE 0x0002 + +/* +* GLUT API Extension macro definitions -- Spaceball button definitions +*/ + +#define GLUT_SPACEBALL_BUTTON_A 0x0001 +#define GLUT_SPACEBALL_BUTTON_B 0x0002 +#define GLUT_SPACEBALL_BUTTON_C 0x0004 +#define GLUT_SPACEBALL_BUTTON_D 0x0008 +#define GLUT_SPACEBALL_BUTTON_E 0x0010 + +/* + * Process loop function, see fg_main.c + */ +FGAPI void FGAPIENTRY glutMainLoopEvent( void ); +FGAPI void FGAPIENTRY glutLeaveMainLoop( void ); +FGAPI void FGAPIENTRY glutExit ( void ); + +/* + * Window management functions, see fg_window.c + */ +FGAPI void FGAPIENTRY glutFullScreenToggle( void ); +FGAPI void FGAPIENTRY glutLeaveFullScreen( void ); + +/* + * Menu functions + */ +FGAPI void FGAPIENTRY glutSetMenuFont( int menuID, void* font ); + +/* + * Window-specific callback functions, see fg_callbacks.c + */ +FGAPI void FGAPIENTRY glutMouseWheelFunc( void (* callback)( int, int, int, int ) ); +FGAPI void FGAPIENTRY glutPositionFunc( void (* callback)( int, int ) ); +FGAPI void FGAPIENTRY glutCloseFunc( void (* callback)( void ) ); +FGAPI void FGAPIENTRY glutWMCloseFunc( void (* callback)( void ) ); +/* And also a destruction callback for menus */ +FGAPI void FGAPIENTRY glutMenuDestroyFunc( void (* callback)( void ) ); + +/* + * State setting and retrieval functions, see fg_state.c + */ +FGAPI void FGAPIENTRY glutSetOption ( GLenum option_flag, int value ); +FGAPI int * FGAPIENTRY glutGetModeValues(GLenum mode, int * size); +/* A.Donev: User-data manipulation */ +FGAPI void* FGAPIENTRY glutGetWindowData( void ); +FGAPI void FGAPIENTRY glutSetWindowData(void* data); +FGAPI void* FGAPIENTRY glutGetMenuData( void ); +FGAPI void FGAPIENTRY glutSetMenuData(void* data); + +/* + * Font stuff, see fg_font.c + */ +FGAPI int FGAPIENTRY glutBitmapHeight( void* font ); +FGAPI GLfloat FGAPIENTRY glutStrokeHeight( void* font ); +FGAPI void FGAPIENTRY glutBitmapString( void* font, const unsigned char *string ); +FGAPI void FGAPIENTRY glutStrokeString( void* font, const unsigned char *string ); + +/* + * Geometry functions, see fg_geometry.c + */ +FGAPI void FGAPIENTRY glutWireRhombicDodecahedron( void ); +FGAPI void FGAPIENTRY glutSolidRhombicDodecahedron( void ); +FGAPI void FGAPIENTRY glutWireSierpinskiSponge ( int num_levels, double offset[3], double scale ); +FGAPI void FGAPIENTRY glutSolidSierpinskiSponge ( int num_levels, double offset[3], double scale ); +FGAPI void FGAPIENTRY glutWireCylinder( double radius, double height, GLint slices, GLint stacks); +FGAPI void FGAPIENTRY glutSolidCylinder( double radius, double height, GLint slices, GLint stacks); + +/* + * Rest of functions for rendering Newell's teaset, found in fg_teapot.c + * NB: front facing polygons have clockwise winding, not counter clockwise + */ +FGAPI void FGAPIENTRY glutWireTeacup( double size ); +FGAPI void FGAPIENTRY glutSolidTeacup( double size ); +FGAPI void FGAPIENTRY glutWireTeaspoon( double size ); +FGAPI void FGAPIENTRY glutSolidTeaspoon( double size ); + +/* + * Extension functions, see fg_ext.c + */ +typedef void (*GLUTproc)(); +FGAPI GLUTproc FGAPIENTRY glutGetProcAddress( const char *procName ); + +/* + * Multi-touch/multi-pointer extensions + */ + +#define GLUT_HAS_MULTI 1 + +/* TODO: add device_id parameter, + cf. http://sourceforge.net/mailarchive/forum.php?thread_name=20120518071314.GA28061%40perso.beuc.net&forum_name=freeglut-developer */ +FGAPI void FGAPIENTRY glutMultiEntryFunc( void (* callback)( int, int ) ); +FGAPI void FGAPIENTRY glutMultiButtonFunc( void (* callback)( int, int, int, int, int ) ); +FGAPI void FGAPIENTRY glutMultiMotionFunc( void (* callback)( int, int, int ) ); +FGAPI void FGAPIENTRY glutMultiPassiveFunc( void (* callback)( int, int, int ) ); + +/* + * Joystick functions, see fg_joystick.c + */ +/* USE OF THESE FUNCTIONS IS DEPRECATED !!!!! */ +/* If you have a serious need for these functions in your application, please either + * contact the "freeglut" developer community at freeglut-developer@lists.sourceforge.net, + * switch to the OpenGLUT library, or else port your joystick functionality over to PLIB's + * "js" library. + */ +int glutJoystickGetNumAxes( int ident ); +int glutJoystickGetNumButtons( int ident ); +int glutJoystickNotWorking( int ident ); +float glutJoystickGetDeadBand( int ident, int axis ); +void glutJoystickSetDeadBand( int ident, int axis, float db ); +float glutJoystickGetSaturation( int ident, int axis ); +void glutJoystickSetSaturation( int ident, int axis, float st ); +void glutJoystickSetMinRange( int ident, float *axes ); +void glutJoystickSetMaxRange( int ident, float *axes ); +void glutJoystickSetCenter( int ident, float *axes ); +void glutJoystickGetMinRange( int ident, float *axes ); +void glutJoystickGetMaxRange( int ident, float *axes ); +void glutJoystickGetCenter( int ident, float *axes ); + +/* + * Initialization functions, see fg_init.c + */ +/* to get the typedef for va_list */ +#include +FGAPI void FGAPIENTRY glutInitContextVersion( int majorVersion, int minorVersion ); +FGAPI void FGAPIENTRY glutInitContextFlags( int flags ); +FGAPI void FGAPIENTRY glutInitContextProfile( int profile ); +FGAPI void FGAPIENTRY glutInitErrorFunc( void (* callback)( const char *fmt, va_list ap ) ); +FGAPI void FGAPIENTRY glutInitWarningFunc( void (* callback)( const char *fmt, va_list ap ) ); + +/* OpenGL >= 2.0 support */ +FGAPI void FGAPIENTRY glutSetVertexAttribCoord3( GLint attrib ); +FGAPI void FGAPIENTRY glutSetVertexAttribNormal( GLint attrib ); +FGAPI void FGAPIENTRY glutSetVertexAttribTexCoord2( GLint attrib ); + +/* Mobile platforms lifecycle */ +FGAPI void FGAPIENTRY glutInitContextFunc( void (* callback)( void ) ); +FGAPI void FGAPIENTRY glutAppStatusFunc( void (* callback)( int ) ); +/* state flags that can be passed to callback set by glutAppStatusFunc */ +#define GLUT_APPSTATUS_PAUSE 0x0001 +#define GLUT_APPSTATUS_RESUME 0x0002 + +/* + * GLUT API macro definitions -- the display mode definitions + */ +#define GLUT_CAPTIONLESS 0x0400 +#define GLUT_BORDERLESS 0x0800 +#define GLUT_SRGB 0x1000 + +/* User-argument callbacks and implementation */ +#include "freeglut_ucall.h" + +#ifdef __cplusplus + } +#endif + +/*** END OF FILE ***/ + +#endif /* __FREEGLUT_EXT_H__ */ diff --git a/third_party/FreeGLUT/x64-Debug/include/GL/freeglut_std.h b/third_party/FreeGLUT/x64-Debug/include/GL/freeglut_std.h new file mode 100644 index 0000000..a658c7c --- /dev/null +++ b/third_party/FreeGLUT/x64-Debug/include/GL/freeglut_std.h @@ -0,0 +1,653 @@ +#ifndef __FREEGLUT_STD_H__ +#define __FREEGLUT_STD_H__ + +/* + * freeglut_std.h + * + * The GLUT-compatible part of the freeglut library include file + * + * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. + * Written by Pawel W. Olszta, + * Creation date: Thu Dec 2 1999 + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifdef __cplusplus + extern "C" { +#endif + +/* + * Under windows, we have to differentiate between static and dynamic libraries + */ +#ifdef _WIN32 +/* #pragma may not be supported by some compilers. + * Discussion by FreeGLUT developers suggests that + * Visual C++ specific code involving pragmas may + * need to move to a separate header. 24th Dec 2003 + */ + +/* Define FREEGLUT_LIB_PRAGMAS to 1 to include library + * pragmas or to 0 to exclude library pragmas. + * The default behavior depends on the compiler/platform. + */ +# ifndef FREEGLUT_LIB_PRAGMAS +# if ( defined(_MSC_VER) || defined(__WATCOMC__) ) && !defined(_WIN32_WCE) +# define FREEGLUT_LIB_PRAGMAS 1 +# else +# define FREEGLUT_LIB_PRAGMAS 0 +# endif +# endif + +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN 1 +# endif +# ifndef NOMINMAX +# define NOMINMAX +# endif +# include + +/* Windows static library */ +# ifdef FREEGLUT_STATIC + +# define FGAPI +# define FGAPIENTRY + + /* Link with Win32 static freeglut lib */ +# if FREEGLUT_LIB_PRAGMAS +# ifdef NDEBUG +# pragma comment (lib, "freeglut_static.lib") +# else +# pragma comment (lib, "freeglut_staticd.lib") +# endif +# endif + +/* Windows shared library (DLL) */ +# else + +# define FGAPIENTRY __stdcall +# if defined(FREEGLUT_EXPORTS) +# define FGAPI __declspec(dllexport) +# else +# define FGAPI __declspec(dllimport) + + /* Link with Win32 shared freeglut lib */ +# if FREEGLUT_LIB_PRAGMAS +# ifdef NDEBUG +# pragma comment (lib, "freeglut.lib") +# else +# pragma comment (lib, "freeglutd.lib") +# endif +# endif + +# endif + +# endif + +/* Drag in other Windows libraries as required by FreeGLUT */ +# if FREEGLUT_LIB_PRAGMAS +# pragma comment (lib, "glu32.lib") /* link OpenGL Utility lib */ +# pragma comment (lib, "opengl32.lib") /* link Microsoft OpenGL lib */ +# pragma comment (lib, "gdi32.lib") /* link Windows GDI lib */ +# pragma comment (lib, "winmm.lib") /* link Windows MultiMedia lib */ +# pragma comment (lib, "user32.lib") /* link Windows user lib */ +# endif + +#else + +/* Non-Windows definition of FGAPI and FGAPIENTRY */ +# define FGAPI +# define FGAPIENTRY + +#endif + +/* + * The freeglut and GLUT API versions + */ +#define FREEGLUT 1 +#define GLUT_API_VERSION 4 +#define GLUT_XLIB_IMPLEMENTATION 13 +/* Deprecated: + cf. http://sourceforge.net/mailarchive/forum.php?thread_name=CABcAi1hw7cr4xtigckaGXB5X8wddLfMcbA_rZ3NAuwMrX_zmsw%40mail.gmail.com&forum_name=freeglut-developer */ +#define FREEGLUT_VERSION_2_0 1 + +/* + * Always include OpenGL and GLU headers + */ +/* Note: FREEGLUT_GLES is only used to cleanly bootstrap headers + inclusion here; use GLES constants directly + (e.g. GL_ES_VERSION_2_0) for all other needs */ +#ifdef FREEGLUT_GLES +# include +# include +# include +#elif __APPLE__ +# include +# include +#else +# include +# include +#endif + +/* + * GLUT API macro definitions -- the special key codes: + */ +#define GLUT_KEY_F1 0x0001 +#define GLUT_KEY_F2 0x0002 +#define GLUT_KEY_F3 0x0003 +#define GLUT_KEY_F4 0x0004 +#define GLUT_KEY_F5 0x0005 +#define GLUT_KEY_F6 0x0006 +#define GLUT_KEY_F7 0x0007 +#define GLUT_KEY_F8 0x0008 +#define GLUT_KEY_F9 0x0009 +#define GLUT_KEY_F10 0x000A +#define GLUT_KEY_F11 0x000B +#define GLUT_KEY_F12 0x000C +#define GLUT_KEY_LEFT 0x0064 +#define GLUT_KEY_UP 0x0065 +#define GLUT_KEY_RIGHT 0x0066 +#define GLUT_KEY_DOWN 0x0067 +#define GLUT_KEY_PAGE_UP 0x0068 +#define GLUT_KEY_PAGE_DOWN 0x0069 +#define GLUT_KEY_HOME 0x006A +#define GLUT_KEY_END 0x006B +#define GLUT_KEY_INSERT 0x006C + +/* + * GLUT API macro definitions -- mouse state definitions + */ +#define GLUT_LEFT_BUTTON 0x0000 +#define GLUT_MIDDLE_BUTTON 0x0001 +#define GLUT_RIGHT_BUTTON 0x0002 +#define GLUT_DOWN 0x0000 +#define GLUT_UP 0x0001 +#define GLUT_LEFT 0x0000 +#define GLUT_ENTERED 0x0001 + +/* + * GLUT API macro definitions -- the display mode definitions + */ +#define GLUT_RGB 0x0000 +#define GLUT_RGBA 0x0000 +#define GLUT_INDEX 0x0001 +#define GLUT_SINGLE 0x0000 +#define GLUT_DOUBLE 0x0002 +#define GLUT_ACCUM 0x0004 +#define GLUT_ALPHA 0x0008 +#define GLUT_DEPTH 0x0010 +#define GLUT_STENCIL 0x0020 +#define GLUT_MULTISAMPLE 0x0080 +#define GLUT_STEREO 0x0100 +#define GLUT_LUMINANCE 0x0200 + +/* + * GLUT API macro definitions -- windows and menu related definitions + */ +#define GLUT_MENU_NOT_IN_USE 0x0000 +#define GLUT_MENU_IN_USE 0x0001 +#define GLUT_NOT_VISIBLE 0x0000 +#define GLUT_VISIBLE 0x0001 +#define GLUT_HIDDEN 0x0000 +#define GLUT_FULLY_RETAINED 0x0001 +#define GLUT_PARTIALLY_RETAINED 0x0002 +#define GLUT_FULLY_COVERED 0x0003 + +/* + * GLUT API macro definitions -- fonts definitions + * + * Steve Baker suggested to make it binary compatible with GLUT: + */ +#if defined(_MSC_VER) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__WATCOMC__) +# define GLUT_STROKE_ROMAN ((void *)0x0000) +# define GLUT_STROKE_MONO_ROMAN ((void *)0x0001) +# define GLUT_BITMAP_9_BY_15 ((void *)0x0002) +# define GLUT_BITMAP_8_BY_13 ((void *)0x0003) +# define GLUT_BITMAP_TIMES_ROMAN_10 ((void *)0x0004) +# define GLUT_BITMAP_TIMES_ROMAN_24 ((void *)0x0005) +# define GLUT_BITMAP_HELVETICA_10 ((void *)0x0006) +# define GLUT_BITMAP_HELVETICA_12 ((void *)0x0007) +# define GLUT_BITMAP_HELVETICA_18 ((void *)0x0008) +#else + /* + * I don't really know if it's a good idea... But here it goes: + */ + extern void* glutStrokeRoman; + extern void* glutStrokeMonoRoman; + extern void* glutBitmap9By15; + extern void* glutBitmap8By13; + extern void* glutBitmapTimesRoman10; + extern void* glutBitmapTimesRoman24; + extern void* glutBitmapHelvetica10; + extern void* glutBitmapHelvetica12; + extern void* glutBitmapHelvetica18; + + /* + * Those pointers will be used by following definitions: + */ +# define GLUT_STROKE_ROMAN ((void *) &glutStrokeRoman) +# define GLUT_STROKE_MONO_ROMAN ((void *) &glutStrokeMonoRoman) +# define GLUT_BITMAP_9_BY_15 ((void *) &glutBitmap9By15) +# define GLUT_BITMAP_8_BY_13 ((void *) &glutBitmap8By13) +# define GLUT_BITMAP_TIMES_ROMAN_10 ((void *) &glutBitmapTimesRoman10) +# define GLUT_BITMAP_TIMES_ROMAN_24 ((void *) &glutBitmapTimesRoman24) +# define GLUT_BITMAP_HELVETICA_10 ((void *) &glutBitmapHelvetica10) +# define GLUT_BITMAP_HELVETICA_12 ((void *) &glutBitmapHelvetica12) +# define GLUT_BITMAP_HELVETICA_18 ((void *) &glutBitmapHelvetica18) +#endif + +/* + * GLUT API macro definitions -- the glutGet parameters + */ +#define GLUT_WINDOW_X 0x0064 +#define GLUT_WINDOW_Y 0x0065 +#define GLUT_WINDOW_WIDTH 0x0066 +#define GLUT_WINDOW_HEIGHT 0x0067 +#define GLUT_WINDOW_BUFFER_SIZE 0x0068 +#define GLUT_WINDOW_STENCIL_SIZE 0x0069 +#define GLUT_WINDOW_DEPTH_SIZE 0x006A +#define GLUT_WINDOW_RED_SIZE 0x006B +#define GLUT_WINDOW_GREEN_SIZE 0x006C +#define GLUT_WINDOW_BLUE_SIZE 0x006D +#define GLUT_WINDOW_ALPHA_SIZE 0x006E +#define GLUT_WINDOW_ACCUM_RED_SIZE 0x006F +#define GLUT_WINDOW_ACCUM_GREEN_SIZE 0x0070 +#define GLUT_WINDOW_ACCUM_BLUE_SIZE 0x0071 +#define GLUT_WINDOW_ACCUM_ALPHA_SIZE 0x0072 +#define GLUT_WINDOW_DOUBLEBUFFER 0x0073 +#define GLUT_WINDOW_RGBA 0x0074 +#define GLUT_WINDOW_PARENT 0x0075 +#define GLUT_WINDOW_NUM_CHILDREN 0x0076 +#define GLUT_WINDOW_COLORMAP_SIZE 0x0077 +#define GLUT_WINDOW_NUM_SAMPLES 0x0078 +#define GLUT_WINDOW_STEREO 0x0079 +#define GLUT_WINDOW_CURSOR 0x007A + +#define GLUT_SCREEN_WIDTH 0x00C8 +#define GLUT_SCREEN_HEIGHT 0x00C9 +#define GLUT_SCREEN_WIDTH_MM 0x00CA +#define GLUT_SCREEN_HEIGHT_MM 0x00CB +#define GLUT_MENU_NUM_ITEMS 0x012C +#define GLUT_DISPLAY_MODE_POSSIBLE 0x0190 +#define GLUT_INIT_WINDOW_X 0x01F4 +#define GLUT_INIT_WINDOW_Y 0x01F5 +#define GLUT_INIT_WINDOW_WIDTH 0x01F6 +#define GLUT_INIT_WINDOW_HEIGHT 0x01F7 +#define GLUT_INIT_DISPLAY_MODE 0x01F8 +#define GLUT_ELAPSED_TIME 0x02BC +#define GLUT_WINDOW_FORMAT_ID 0x007B + +/* + * GLUT API macro definitions -- the glutDeviceGet parameters + */ +#define GLUT_HAS_KEYBOARD 0x0258 +#define GLUT_HAS_MOUSE 0x0259 +#define GLUT_HAS_SPACEBALL 0x025A +#define GLUT_HAS_DIAL_AND_BUTTON_BOX 0x025B +#define GLUT_HAS_TABLET 0x025C +#define GLUT_NUM_MOUSE_BUTTONS 0x025D +#define GLUT_NUM_SPACEBALL_BUTTONS 0x025E +#define GLUT_NUM_BUTTON_BOX_BUTTONS 0x025F +#define GLUT_NUM_DIALS 0x0260 +#define GLUT_NUM_TABLET_BUTTONS 0x0261 +#define GLUT_DEVICE_IGNORE_KEY_REPEAT 0x0262 +#define GLUT_DEVICE_KEY_REPEAT 0x0263 +#define GLUT_HAS_JOYSTICK 0x0264 +#define GLUT_OWNS_JOYSTICK 0x0265 +#define GLUT_JOYSTICK_BUTTONS 0x0266 +#define GLUT_JOYSTICK_AXES 0x0267 +#define GLUT_JOYSTICK_POLL_RATE 0x0268 + +/* + * GLUT API macro definitions -- the glutLayerGet parameters + */ +#define GLUT_OVERLAY_POSSIBLE 0x0320 +#define GLUT_LAYER_IN_USE 0x0321 +#define GLUT_HAS_OVERLAY 0x0322 +#define GLUT_TRANSPARENT_INDEX 0x0323 +#define GLUT_NORMAL_DAMAGED 0x0324 +#define GLUT_OVERLAY_DAMAGED 0x0325 + +/* + * GLUT API macro definitions -- the glutVideoResizeGet parameters + */ +#define GLUT_VIDEO_RESIZE_POSSIBLE 0x0384 +#define GLUT_VIDEO_RESIZE_IN_USE 0x0385 +#define GLUT_VIDEO_RESIZE_X_DELTA 0x0386 +#define GLUT_VIDEO_RESIZE_Y_DELTA 0x0387 +#define GLUT_VIDEO_RESIZE_WIDTH_DELTA 0x0388 +#define GLUT_VIDEO_RESIZE_HEIGHT_DELTA 0x0389 +#define GLUT_VIDEO_RESIZE_X 0x038A +#define GLUT_VIDEO_RESIZE_Y 0x038B +#define GLUT_VIDEO_RESIZE_WIDTH 0x038C +#define GLUT_VIDEO_RESIZE_HEIGHT 0x038D + +/* + * GLUT API macro definitions -- the glutUseLayer parameters + */ +#define GLUT_NORMAL 0x0000 +#define GLUT_OVERLAY 0x0001 + +/* + * GLUT API macro definitions -- the glutGetModifiers parameters + */ +#define GLUT_ACTIVE_SHIFT 0x0001 +#define GLUT_ACTIVE_CTRL 0x0002 +#define GLUT_ACTIVE_ALT 0x0004 + +/* + * GLUT API macro definitions -- the glutSetCursor parameters + */ +#define GLUT_CURSOR_RIGHT_ARROW 0x0000 +#define GLUT_CURSOR_LEFT_ARROW 0x0001 +#define GLUT_CURSOR_INFO 0x0002 +#define GLUT_CURSOR_DESTROY 0x0003 +#define GLUT_CURSOR_HELP 0x0004 +#define GLUT_CURSOR_CYCLE 0x0005 +#define GLUT_CURSOR_SPRAY 0x0006 +#define GLUT_CURSOR_WAIT 0x0007 +#define GLUT_CURSOR_TEXT 0x0008 +#define GLUT_CURSOR_CROSSHAIR 0x0009 +#define GLUT_CURSOR_UP_DOWN 0x000A +#define GLUT_CURSOR_LEFT_RIGHT 0x000B +#define GLUT_CURSOR_TOP_SIDE 0x000C +#define GLUT_CURSOR_BOTTOM_SIDE 0x000D +#define GLUT_CURSOR_LEFT_SIDE 0x000E +#define GLUT_CURSOR_RIGHT_SIDE 0x000F +#define GLUT_CURSOR_TOP_LEFT_CORNER 0x0010 +#define GLUT_CURSOR_TOP_RIGHT_CORNER 0x0011 +#define GLUT_CURSOR_BOTTOM_RIGHT_CORNER 0x0012 +#define GLUT_CURSOR_BOTTOM_LEFT_CORNER 0x0013 +#define GLUT_CURSOR_INHERIT 0x0064 +#define GLUT_CURSOR_NONE 0x0065 +#define GLUT_CURSOR_FULL_CROSSHAIR 0x0066 + +/* + * GLUT API macro definitions -- RGB color component specification definitions + */ +#define GLUT_RED 0x0000 +#define GLUT_GREEN 0x0001 +#define GLUT_BLUE 0x0002 + +/* + * GLUT API macro definitions -- additional keyboard and joystick definitions + */ +#define GLUT_KEY_REPEAT_OFF 0x0000 +#define GLUT_KEY_REPEAT_ON 0x0001 +#define GLUT_KEY_REPEAT_DEFAULT 0x0002 + +#define GLUT_JOYSTICK_BUTTON_A 0x0001 +#define GLUT_JOYSTICK_BUTTON_B 0x0002 +#define GLUT_JOYSTICK_BUTTON_C 0x0004 +#define GLUT_JOYSTICK_BUTTON_D 0x0008 + +/* + * GLUT API macro definitions -- game mode definitions + */ +#define GLUT_GAME_MODE_ACTIVE 0x0000 +#define GLUT_GAME_MODE_POSSIBLE 0x0001 +#define GLUT_GAME_MODE_WIDTH 0x0002 +#define GLUT_GAME_MODE_HEIGHT 0x0003 +#define GLUT_GAME_MODE_PIXEL_DEPTH 0x0004 +#define GLUT_GAME_MODE_REFRESH_RATE 0x0005 +#define GLUT_GAME_MODE_DISPLAY_CHANGED 0x0006 + +/* + * Initialization functions, see fglut_init.c + */ +FGAPI void FGAPIENTRY glutInit( int* pargc, char** argv ); +FGAPI void FGAPIENTRY glutInitWindowPosition( int x, int y ); +FGAPI void FGAPIENTRY glutInitWindowSize( int width, int height ); +FGAPI void FGAPIENTRY glutInitDisplayMode( unsigned int displayMode ); +FGAPI void FGAPIENTRY glutInitDisplayString( const char* displayMode ); + +/* + * Process loop function, see fg_main.c + */ +FGAPI void FGAPIENTRY glutMainLoop( void ); + +/* + * Window management functions, see fg_window.c + */ +FGAPI int FGAPIENTRY glutCreateWindow( const char* title ); +FGAPI int FGAPIENTRY glutCreateSubWindow( int window, int x, int y, int width, int height ); +FGAPI void FGAPIENTRY glutDestroyWindow( int window ); +FGAPI void FGAPIENTRY glutSetWindow( int window ); +FGAPI int FGAPIENTRY glutGetWindow( void ); +FGAPI void FGAPIENTRY glutSetWindowTitle( const char* title ); +FGAPI void FGAPIENTRY glutSetIconTitle( const char* title ); +FGAPI void FGAPIENTRY glutReshapeWindow( int width, int height ); +FGAPI void FGAPIENTRY glutPositionWindow( int x, int y ); +FGAPI void FGAPIENTRY glutShowWindow( void ); +FGAPI void FGAPIENTRY glutHideWindow( void ); +FGAPI void FGAPIENTRY glutIconifyWindow( void ); +FGAPI void FGAPIENTRY glutPushWindow( void ); +FGAPI void FGAPIENTRY glutPopWindow( void ); +FGAPI void FGAPIENTRY glutFullScreen( void ); + +/* + * Display-related functions, see fg_display.c + */ +FGAPI void FGAPIENTRY glutPostWindowRedisplay( int window ); +FGAPI void FGAPIENTRY glutPostRedisplay( void ); +FGAPI void FGAPIENTRY glutSwapBuffers( void ); + +/* + * Mouse cursor functions, see fg_cursor.c + */ +FGAPI void FGAPIENTRY glutWarpPointer( int x, int y ); +FGAPI void FGAPIENTRY glutSetCursor( int cursor ); + +/* + * Overlay stuff, see fg_overlay.c + */ +FGAPI void FGAPIENTRY glutEstablishOverlay( void ); +FGAPI void FGAPIENTRY glutRemoveOverlay( void ); +FGAPI void FGAPIENTRY glutUseLayer( GLenum layer ); +FGAPI void FGAPIENTRY glutPostOverlayRedisplay( void ); +FGAPI void FGAPIENTRY glutPostWindowOverlayRedisplay( int window ); +FGAPI void FGAPIENTRY glutShowOverlay( void ); +FGAPI void FGAPIENTRY glutHideOverlay( void ); + +/* + * Menu stuff, see fg_menu.c + */ +FGAPI int FGAPIENTRY glutCreateMenu( void (* callback)( int menu ) ); +FGAPI void FGAPIENTRY glutDestroyMenu( int menu ); +FGAPI int FGAPIENTRY glutGetMenu( void ); +FGAPI void FGAPIENTRY glutSetMenu( int menu ); +FGAPI void FGAPIENTRY glutAddMenuEntry( const char* label, int value ); +FGAPI void FGAPIENTRY glutAddSubMenu( const char* label, int subMenu ); +FGAPI void FGAPIENTRY glutChangeToMenuEntry( int item, const char* label, int value ); +FGAPI void FGAPIENTRY glutChangeToSubMenu( int item, const char* label, int value ); +FGAPI void FGAPIENTRY glutRemoveMenuItem( int item ); +FGAPI void FGAPIENTRY glutAttachMenu( int button ); +FGAPI void FGAPIENTRY glutDetachMenu( int button ); + +/* + * Global callback functions, see fg_callbacks.c + */ +FGAPI void FGAPIENTRY glutTimerFunc( unsigned int time, void (* callback)( int ), int value ); +FGAPI void FGAPIENTRY glutIdleFunc( void (* callback)( void ) ); + +/* + * Window-specific callback functions, see fg_callbacks.c + */ +FGAPI void FGAPIENTRY glutKeyboardFunc( void (* callback)( unsigned char, int, int ) ); +FGAPI void FGAPIENTRY glutSpecialFunc( void (* callback)( int, int, int ) ); +FGAPI void FGAPIENTRY glutReshapeFunc( void (* callback)( int, int ) ); +FGAPI void FGAPIENTRY glutVisibilityFunc( void (* callback)( int ) ); +FGAPI void FGAPIENTRY glutDisplayFunc( void (* callback)( void ) ); +FGAPI void FGAPIENTRY glutMouseFunc( void (* callback)( int, int, int, int ) ); +FGAPI void FGAPIENTRY glutMotionFunc( void (* callback)( int, int ) ); +FGAPI void FGAPIENTRY glutPassiveMotionFunc( void (* callback)( int, int ) ); +FGAPI void FGAPIENTRY glutEntryFunc( void (* callback)( int ) ); + +FGAPI void FGAPIENTRY glutKeyboardUpFunc( void (* callback)( unsigned char, int, int ) ); +FGAPI void FGAPIENTRY glutSpecialUpFunc( void (* callback)( int, int, int ) ); +FGAPI void FGAPIENTRY glutJoystickFunc( void (* callback)( unsigned int, int, int, int ), int pollInterval ); +FGAPI void FGAPIENTRY glutMenuStateFunc( void (* callback)( int ) ); +FGAPI void FGAPIENTRY glutMenuStatusFunc( void (* callback)( int, int, int ) ); +FGAPI void FGAPIENTRY glutOverlayDisplayFunc( void (* callback)( void ) ); +FGAPI void FGAPIENTRY glutWindowStatusFunc( void (* callback)( int ) ); + +FGAPI void FGAPIENTRY glutSpaceballMotionFunc( void (* callback)( int, int, int ) ); +FGAPI void FGAPIENTRY glutSpaceballRotateFunc( void (* callback)( int, int, int ) ); +FGAPI void FGAPIENTRY glutSpaceballButtonFunc( void (* callback)( int, int ) ); +FGAPI void FGAPIENTRY glutButtonBoxFunc( void (* callback)( int, int ) ); +FGAPI void FGAPIENTRY glutDialsFunc( void (* callback)( int, int ) ); +FGAPI void FGAPIENTRY glutTabletMotionFunc( void (* callback)( int, int ) ); +FGAPI void FGAPIENTRY glutTabletButtonFunc( void (* callback)( int, int, int, int ) ); + +/* + * State setting and retrieval functions, see fg_state.c + */ +FGAPI int FGAPIENTRY glutGet( GLenum query ); +FGAPI int FGAPIENTRY glutDeviceGet( GLenum query ); +FGAPI int FGAPIENTRY glutGetModifiers( void ); +FGAPI int FGAPIENTRY glutLayerGet( GLenum query ); + +/* + * Font stuff, see fg_font.c + */ +FGAPI void FGAPIENTRY glutBitmapCharacter( void* font, int character ); +FGAPI int FGAPIENTRY glutBitmapWidth( void* font, int character ); +FGAPI void FGAPIENTRY glutStrokeCharacter( void* font, int character ); +FGAPI int FGAPIENTRY glutStrokeWidth( void* font, int character ); +FGAPI GLfloat FGAPIENTRY glutStrokeWidthf( void* font, int character ); /* GLUT 3.8 */ +FGAPI int FGAPIENTRY glutBitmapLength( void* font, const unsigned char* string ); +FGAPI int FGAPIENTRY glutStrokeLength( void* font, const unsigned char* string ); +FGAPI GLfloat FGAPIENTRY glutStrokeLengthf( void* font, const unsigned char *string ); /* GLUT 3.8 */ + +/* + * Geometry functions, see fg_geometry.c + */ + +FGAPI void FGAPIENTRY glutWireCube( double size ); +FGAPI void FGAPIENTRY glutSolidCube( double size ); +FGAPI void FGAPIENTRY glutWireSphere( double radius, GLint slices, GLint stacks ); +FGAPI void FGAPIENTRY glutSolidSphere( double radius, GLint slices, GLint stacks ); +FGAPI void FGAPIENTRY glutWireCone( double base, double height, GLint slices, GLint stacks ); +FGAPI void FGAPIENTRY glutSolidCone( double base, double height, GLint slices, GLint stacks ); +FGAPI void FGAPIENTRY glutWireTorus( double innerRadius, double outerRadius, GLint sides, GLint rings ); +FGAPI void FGAPIENTRY glutSolidTorus( double innerRadius, double outerRadius, GLint sides, GLint rings ); +FGAPI void FGAPIENTRY glutWireDodecahedron( void ); +FGAPI void FGAPIENTRY glutSolidDodecahedron( void ); +FGAPI void FGAPIENTRY glutWireOctahedron( void ); +FGAPI void FGAPIENTRY glutSolidOctahedron( void ); +FGAPI void FGAPIENTRY glutWireTetrahedron( void ); +FGAPI void FGAPIENTRY glutSolidTetrahedron( void ); +FGAPI void FGAPIENTRY glutWireIcosahedron( void ); +FGAPI void FGAPIENTRY glutSolidIcosahedron( void ); + +/* + * Teapot rendering functions, found in fg_teapot.c + * NB: front facing polygons have clockwise winding, not counter clockwise + */ +FGAPI void FGAPIENTRY glutWireTeapot( double size ); +FGAPI void FGAPIENTRY glutSolidTeapot( double size ); + +/* + * Game mode functions, see fg_gamemode.c + */ +FGAPI void FGAPIENTRY glutGameModeString( const char* string ); +FGAPI int FGAPIENTRY glutEnterGameMode( void ); +FGAPI void FGAPIENTRY glutLeaveGameMode( void ); +FGAPI int FGAPIENTRY glutGameModeGet( GLenum query ); + +/* + * Video resize functions, see fg_videoresize.c + */ +FGAPI int FGAPIENTRY glutVideoResizeGet( GLenum query ); +FGAPI void FGAPIENTRY glutSetupVideoResizing( void ); +FGAPI void FGAPIENTRY glutStopVideoResizing( void ); +FGAPI void FGAPIENTRY glutVideoResize( int x, int y, int width, int height ); +FGAPI void FGAPIENTRY glutVideoPan( int x, int y, int width, int height ); + +/* + * Colormap functions, see fg_misc.c + */ +FGAPI void FGAPIENTRY glutSetColor( int color, GLfloat red, GLfloat green, GLfloat blue ); +FGAPI GLfloat FGAPIENTRY glutGetColor( int color, int component ); +FGAPI void FGAPIENTRY glutCopyColormap( int window ); + +/* + * Misc keyboard and joystick functions, see fg_misc.c + */ +FGAPI void FGAPIENTRY glutIgnoreKeyRepeat( int ignore ); +FGAPI void FGAPIENTRY glutSetKeyRepeat( int repeatMode ); +FGAPI void FGAPIENTRY glutForceJoystickFunc( void ); + +/* + * Misc functions, see fg_misc.c + */ +FGAPI int FGAPIENTRY glutExtensionSupported( const char* extension ); +FGAPI void FGAPIENTRY glutReportErrors( void ); + +/* Comment from glut.h of classic GLUT: + + Win32 has an annoying issue where there are multiple C run-time + libraries (CRTs). If the executable is linked with a different CRT + from the GLUT DLL, the GLUT DLL will not share the same CRT static + data seen by the executable. In particular, atexit callbacks registered + in the executable will not be called if GLUT calls its (different) + exit routine). GLUT is typically built with the + "/MD" option (the CRT with multithreading DLL support), but the Visual + C++ linker default is "/ML" (the single threaded CRT). + + One workaround to this issue is requiring users to always link with + the same CRT as GLUT is compiled with. That requires users supply a + non-standard option. GLUT 3.7 has its own built-in workaround where + the executable's "exit" function pointer is covertly passed to GLUT. + GLUT then calls the executable's exit function pointer to ensure that + any "atexit" calls registered by the application are called if GLUT + needs to exit. + + Note that the __glut*WithExit routines should NEVER be called directly. + To avoid the atexit workaround, #define GLUT_DISABLE_ATEXIT_HACK. */ + +/* to get the prototype for exit() */ +#include + +#if defined(_WIN32) && !defined(GLUT_DISABLE_ATEXIT_HACK) && !defined(__WATCOMC__) +FGAPI void FGAPIENTRY __glutInitWithExit(int *argcp, char **argv, void (__cdecl *exitfunc)(int)); +FGAPI int FGAPIENTRY __glutCreateWindowWithExit(const char *title, void (__cdecl *exitfunc)(int)); +FGAPI int FGAPIENTRY __glutCreateMenuWithExit(void (* func)(int), void (__cdecl *exitfunc)(int)); +#ifndef FREEGLUT_BUILDING_LIB +#if defined(__GNUC__) +#define FGUNUSED __attribute__((unused)) +#else +#define FGUNUSED +#endif +static void FGAPIENTRY FGUNUSED glutInit_ATEXIT_HACK(int *argcp, char **argv) { __glutInitWithExit(argcp, argv, exit); } +#define glutInit glutInit_ATEXIT_HACK +static int FGAPIENTRY FGUNUSED glutCreateWindow_ATEXIT_HACK(const char *title) { return __glutCreateWindowWithExit(title, exit); } +#define glutCreateWindow glutCreateWindow_ATEXIT_HACK +static int FGAPIENTRY FGUNUSED glutCreateMenu_ATEXIT_HACK(void (* func)(int)) { return __glutCreateMenuWithExit(func, exit); } +#define glutCreateMenu glutCreateMenu_ATEXIT_HACK +#endif +#endif + +#ifdef __cplusplus + } +#endif + +/*** END OF FILE ***/ + +#endif /* __FREEGLUT_STD_H__ */ + diff --git a/third_party/FreeGLUT/x64-Debug/include/GL/freeglut_ucall.h b/third_party/FreeGLUT/x64-Debug/include/GL/freeglut_ucall.h new file mode 100644 index 0000000..1ef2ae7 --- /dev/null +++ b/third_party/FreeGLUT/x64-Debug/include/GL/freeglut_ucall.h @@ -0,0 +1,113 @@ +#ifndef __FREEGLUT_UCALL_H__ +#define __FREEGLUT_UCALL_H__ + +/* + * freeglut_ucall.h + * + * Callbacks with user data arguments. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifdef __cplusplus + extern "C" { +#endif + +/* + * Menu stuff, see fg_menu.c + */ +FGAPI int FGAPIENTRY glutCreateMenuUcall( void (* callback)( int menu, void* user_data ), void* user_data ); + +/* + * Global callback functions, see fg_callbacks.c + */ +FGAPI void FGAPIENTRY glutTimerFuncUcall( unsigned int time, void (* callback)( int, void* ), int value, void* user_data ); +FGAPI void FGAPIENTRY glutIdleFuncUcall( void (* callback)( void* ), void* user_data ); + +/* + * Window-specific callback functions, see fg_callbacks.c + */ +FGAPI void FGAPIENTRY glutKeyboardFuncUcall( void (* callback)( unsigned char, int, int, void* ), void* user_data ); +FGAPI void FGAPIENTRY glutSpecialFuncUcall( void (* callback)( int, int, int, void* ), void* user_data ); +FGAPI void FGAPIENTRY glutReshapeFuncUcall( void (* callback)( int, int, void* ), void* user_data ); +FGAPI void FGAPIENTRY glutVisibilityFuncUcall( void (* callback)( int, void* ), void* user_data ); +FGAPI void FGAPIENTRY glutDisplayFuncUcall( void (* callback)( void* ), void* user_data ); +FGAPI void FGAPIENTRY glutMouseFuncUcall( void (* callback)( int, int, int, int, void* ), void* user_data ); +FGAPI void FGAPIENTRY glutMotionFuncUcall( void (* callback)( int, int, void* ), void* user_data ); +FGAPI void FGAPIENTRY glutPassiveMotionFuncUcall( void (* callback)( int, int, void* ), void* user_data ); +FGAPI void FGAPIENTRY glutEntryFuncUcall( void (* callback)( int, void* ), void* user_data ); + +FGAPI void FGAPIENTRY glutKeyboardUpFuncUcall( void (* callback)( unsigned char, int, int, void* ), void* user_data ); +FGAPI void FGAPIENTRY glutSpecialUpFuncUcall( void (* callback)( int, int, int, void* ), void* user_data ); +FGAPI void FGAPIENTRY glutJoystickFuncUcall( void (* callback)( unsigned int, int, int, int, void* ), int pollInterval, void* user_data ); +FGAPI void FGAPIENTRY glutMenuStatusFuncUcall( void (* callback)( int, int, int, void* ), void* user_data ); +FGAPI void FGAPIENTRY glutOverlayDisplayFuncUcall( void (* callback)( void* ), void* user_data ); +FGAPI void FGAPIENTRY glutWindowStatusFuncUcall( void (* callback)( int, void* ), void* user_data ); + +FGAPI void FGAPIENTRY glutSpaceballMotionFuncUcall( void (* callback)( int, int, int, void* ), void* user_data ); +FGAPI void FGAPIENTRY glutSpaceballRotateFuncUcall( void (* callback)( int, int, int, void* ), void* user_data ); +FGAPI void FGAPIENTRY glutSpaceballButtonFuncUcall( void (* callback)( int, int, void* ), void* user_data ); +FGAPI void FGAPIENTRY glutButtonBoxFuncUcall( void (* callback)( int, int, void* ), void* user_data ); +FGAPI void FGAPIENTRY glutDialsFuncUcall( void (* callback)( int, int, void* ), void* user_data ); +FGAPI void FGAPIENTRY glutTabletMotionFuncUcall( void (* callback)( int, int, void* ), void* user_data ); +FGAPI void FGAPIENTRY glutTabletButtonFuncUcall( void (* callback)( int, int, int, int, void* ), void* user_data ); + +FGAPI void FGAPIENTRY glutMouseWheelFuncUcall( void (* callback)( int, int, int, int, void* ), void* user_data ); +FGAPI void FGAPIENTRY glutPositionFuncUcall( void (* callback)( int, int, void* ), void* user_data ); +FGAPI void FGAPIENTRY glutCloseFuncUcall( void (* callback)( void* ), void* user_data ); +FGAPI void FGAPIENTRY glutWMCloseFuncUcall( void (* callback)( void* ), void* user_data ); +FGAPI void FGAPIENTRY glutMenuDestroyFuncUcall( void (* callback)( void* ), void* user_data ); + +/* + * Multi-touch/multi-pointer extensions + */ +FGAPI void FGAPIENTRY glutMultiEntryFuncUcall( void (* callback)( int, int, void* ), void* user_data ); +FGAPI void FGAPIENTRY glutMultiButtonFuncUcall( void (* callback)( int, int, int, int, int, void* ), void* user_data ); +FGAPI void FGAPIENTRY glutMultiMotionFuncUcall( void (* callback)( int, int, int, void* ), void* user_data ); +FGAPI void FGAPIENTRY glutMultiPassiveFuncUcall( void (* callback)( int, int, int, void* ), void* user_data ); + +/* + * Initialization functions, see fg_init.c + */ +#include +FGAPI void FGAPIENTRY glutInitErrorFuncUcall( void (* callback)( const char *fmt, va_list ap, void* user_data ), void* user_data ); +FGAPI void FGAPIENTRY glutInitWarningFuncUcall( void (* callback)( const char *fmt, va_list ap, void* user_data ), void* user_data ); + +/* Mobile platforms lifecycle */ +FGAPI void FGAPIENTRY glutInitContextFuncUcall( void (* callback)( void* ), void* user_data ); +FGAPI void FGAPIENTRY glutAppStatusFuncUcall( void (* callback)( int, void* ), void* user_data ); + +/* + * Continued "hack" from GLUT applied to Ucall functions. + * For more info, see bottom of freeglut_std.h + */ + +/* to get the prototype for exit() */ +#include + +#if defined(_WIN32) && !defined(GLUT_DISABLE_ATEXIT_HACK) && !defined(__WATCOMC__) +FGAPI int FGAPIENTRY __glutCreateMenuUcallWithExit(void(*func)(int, void*), void(__cdecl *exitfunc)(int), void* user_data); +#ifndef FREEGLUT_BUILDING_LIB +#if defined(__GNUC__) +#define FGUNUSED __attribute__((unused)) +#else +#define FGUNUSED +#endif +static int FGAPIENTRY FGUNUSED glutCreateMenuUcall_ATEXIT_HACK(void(*func)(int, void*), void* user_data) { return __glutCreateMenuUcallWithExit(func, exit, user_data); } +#define glutCreateMenuUcall glutCreateMenuUcall_ATEXIT_HACK +#endif +#endif + +#ifdef __cplusplus + } +#endif + +/*** END OF FILE ***/ + +#endif /* __FREEGLUT_UCALL_H__ */ + diff --git a/third_party/FreeGLUT/x64-Debug/lib/cmake/FreeGLUT/FreeGLUTConfig.cmake b/third_party/FreeGLUT/x64-Debug/lib/cmake/FreeGLUT/FreeGLUTConfig.cmake new file mode 100644 index 0000000..ac36b6c --- /dev/null +++ b/third_party/FreeGLUT/x64-Debug/lib/cmake/FreeGLUT/FreeGLUTConfig.cmake @@ -0,0 +1 @@ +include("${CMAKE_CURRENT_LIST_DIR}/FreeGLUTTargets.cmake") diff --git a/third_party/FreeGLUT/x64-Debug/lib/cmake/FreeGLUT/FreeGLUTConfigVersion.cmake b/third_party/FreeGLUT/x64-Debug/lib/cmake/FreeGLUT/FreeGLUTConfigVersion.cmake new file mode 100644 index 0000000..00f6f0c --- /dev/null +++ b/third_party/FreeGLUT/x64-Debug/lib/cmake/FreeGLUT/FreeGLUTConfigVersion.cmake @@ -0,0 +1,48 @@ +# This is a basic version file for the Config-mode of find_package(). +# It is used by write_basic_package_version_file() as input file for configure_file() +# to create a version-file which can be installed along a config.cmake file. +# +# The created file sets PACKAGE_VERSION_EXACT if the current version string and +# the requested version string are exactly the same and it sets +# PACKAGE_VERSION_COMPATIBLE if the current version is >= requested version. +# The variable CVF_VERSION must be set before calling configure_file(). + +set(PACKAGE_VERSION "3.4.0") + +if (PACKAGE_FIND_VERSION_RANGE) + # Package version must be in the requested version range + if ((PACKAGE_FIND_VERSION_RANGE_MIN STREQUAL "INCLUDE" AND PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION_MIN) + OR ((PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "INCLUDE" AND PACKAGE_VERSION VERSION_GREATER PACKAGE_FIND_VERSION_MAX) + OR (PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "EXCLUDE" AND PACKAGE_VERSION VERSION_GREATER_EQUAL PACKAGE_FIND_VERSION_MAX))) + set(PACKAGE_VERSION_COMPATIBLE FALSE) + else() + set(PACKAGE_VERSION_COMPATIBLE TRUE) + endif() +else() + if(PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION) + set(PACKAGE_VERSION_COMPATIBLE FALSE) + else() + set(PACKAGE_VERSION_COMPATIBLE TRUE) + if(PACKAGE_FIND_VERSION STREQUAL PACKAGE_VERSION) + set(PACKAGE_VERSION_EXACT TRUE) + endif() + endif() +endif() + + +# if the installed project requested no architecture check, don't perform the check +if("FALSE") + return() +endif() + +# if the installed or the using project don't have CMAKE_SIZEOF_VOID_P set, ignore it: +if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "" OR "8" STREQUAL "") + return() +endif() + +# check that the installed version has the same 32/64bit-ness as the one which is currently searching: +if(NOT CMAKE_SIZEOF_VOID_P STREQUAL "8") + math(EXPR installedBits "8 * 8") + set(PACKAGE_VERSION "${PACKAGE_VERSION} (${installedBits}bit)") + set(PACKAGE_VERSION_UNSUITABLE TRUE) +endif() diff --git a/third_party/FreeGLUT/x64-Debug/lib/cmake/FreeGLUT/FreeGLUTTargets-debug.cmake b/third_party/FreeGLUT/x64-Debug/lib/cmake/FreeGLUT/FreeGLUTTargets-debug.cmake new file mode 100644 index 0000000..d4ed12b --- /dev/null +++ b/third_party/FreeGLUT/x64-Debug/lib/cmake/FreeGLUT/FreeGLUTTargets-debug.cmake @@ -0,0 +1,29 @@ +#---------------------------------------------------------------- +# Generated CMake target import file for configuration "Debug". +#---------------------------------------------------------------- + +# Commands may need to know the format version. +set(CMAKE_IMPORT_FILE_VERSION 1) + +# Import target "FreeGLUT::freeglut" for configuration "Debug" +set_property(TARGET FreeGLUT::freeglut APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG) +set_target_properties(FreeGLUT::freeglut PROPERTIES + IMPORTED_IMPLIB_DEBUG "${_IMPORT_PREFIX}/lib/freeglutd.lib" + IMPORTED_LOCATION_DEBUG "${_IMPORT_PREFIX}/bin/freeglutd.dll" + ) + +list(APPEND _IMPORT_CHECK_TARGETS FreeGLUT::freeglut ) +list(APPEND _IMPORT_CHECK_FILES_FOR_FreeGLUT::freeglut "${_IMPORT_PREFIX}/lib/freeglutd.lib" "${_IMPORT_PREFIX}/bin/freeglutd.dll" ) + +# Import target "FreeGLUT::freeglut_static" for configuration "Debug" +set_property(TARGET FreeGLUT::freeglut_static APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG) +set_target_properties(FreeGLUT::freeglut_static PROPERTIES + IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "C;RC" + IMPORTED_LOCATION_DEBUG "${_IMPORT_PREFIX}/lib/freeglut_staticd.lib" + ) + +list(APPEND _IMPORT_CHECK_TARGETS FreeGLUT::freeglut_static ) +list(APPEND _IMPORT_CHECK_FILES_FOR_FreeGLUT::freeglut_static "${_IMPORT_PREFIX}/lib/freeglut_staticd.lib" ) + +# Commands beyond this point should not need to know the version. +set(CMAKE_IMPORT_FILE_VERSION) diff --git a/third_party/FreeGLUT/x64-Debug/lib/cmake/FreeGLUT/FreeGLUTTargets.cmake b/third_party/FreeGLUT/x64-Debug/lib/cmake/FreeGLUT/FreeGLUTTargets.cmake new file mode 100644 index 0000000..fe79d0d --- /dev/null +++ b/third_party/FreeGLUT/x64-Debug/lib/cmake/FreeGLUT/FreeGLUTTargets.cmake @@ -0,0 +1,108 @@ +# Generated by CMake + +if("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" LESS 2.5) + message(FATAL_ERROR "CMake >= 2.6.0 required") +endif() +cmake_policy(PUSH) +cmake_policy(VERSION 2.6...3.18) +#---------------------------------------------------------------- +# Generated CMake target import file. +#---------------------------------------------------------------- + +# Commands may need to know the format version. +set(CMAKE_IMPORT_FILE_VERSION 1) + +# Protect against multiple inclusion, which would fail when already imported targets are added once more. +set(_targetsDefined) +set(_targetsNotDefined) +set(_expectedTargets) +foreach(_expectedTarget FreeGLUT::freeglut FreeGLUT::freeglut_static) + list(APPEND _expectedTargets ${_expectedTarget}) + if(NOT TARGET ${_expectedTarget}) + list(APPEND _targetsNotDefined ${_expectedTarget}) + endif() + if(TARGET ${_expectedTarget}) + list(APPEND _targetsDefined ${_expectedTarget}) + endif() +endforeach() +if("${_targetsDefined}" STREQUAL "${_expectedTargets}") + unset(_targetsDefined) + unset(_targetsNotDefined) + unset(_expectedTargets) + set(CMAKE_IMPORT_FILE_VERSION) + cmake_policy(POP) + return() +endif() +if(NOT "${_targetsDefined}" STREQUAL "") + message(FATAL_ERROR "Some (but not all) targets in this export set were already defined.\nTargets Defined: ${_targetsDefined}\nTargets not yet defined: ${_targetsNotDefined}\n") +endif() +unset(_targetsDefined) +unset(_targetsNotDefined) +unset(_expectedTargets) + + +# Compute the installation prefix relative to this file. +get_filename_component(_IMPORT_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH) +get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) +get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) +get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) +if(_IMPORT_PREFIX STREQUAL "/") + set(_IMPORT_PREFIX "") +endif() + +# Create imported target FreeGLUT::freeglut +add_library(FreeGLUT::freeglut SHARED IMPORTED) + +set_target_properties(FreeGLUT::freeglut PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include" + INTERFACE_LINK_LIBRARIES "opengl32;winmm;gdi32" +) + +# Create imported target FreeGLUT::freeglut_static +add_library(FreeGLUT::freeglut_static STATIC IMPORTED) + +set_target_properties(FreeGLUT::freeglut_static PROPERTIES + INTERFACE_COMPILE_DEFINITIONS "FREEGLUT_STATIC" + INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include" + INTERFACE_LINK_LIBRARIES "opengl32;winmm;gdi32" +) + +if(CMAKE_VERSION VERSION_LESS 2.8.12) + message(FATAL_ERROR "This file relies on consumers using CMake 2.8.12 or greater.") +endif() + +# Load information for each installed configuration. +get_filename_component(_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) +file(GLOB CONFIG_FILES "${_DIR}/FreeGLUTTargets-*.cmake") +foreach(f ${CONFIG_FILES}) + include(${f}) +endforeach() + +# Cleanup temporary variables. +set(_IMPORT_PREFIX) + +# Loop over all imported files and verify that they actually exist +foreach(target ${_IMPORT_CHECK_TARGETS} ) + foreach(file ${_IMPORT_CHECK_FILES_FOR_${target}} ) + if(NOT EXISTS "${file}" ) + message(FATAL_ERROR "The imported target \"${target}\" references the file + \"${file}\" +but this file does not exist. Possible reasons include: +* The file was deleted, renamed, or moved to another location. +* An install or uninstall procedure did not complete successfully. +* The installation package was faulty and contained + \"${CMAKE_CURRENT_LIST_FILE}\" +but not all the files it references. +") + endif() + endforeach() + unset(_IMPORT_CHECK_FILES_FOR_${target}) +endforeach() +unset(_IMPORT_CHECK_TARGETS) + +# This file does not depend on other imported targets which have +# been exported from the same project but in a separate export set. + +# Commands beyond this point should not need to know the version. +set(CMAKE_IMPORT_FILE_VERSION) +cmake_policy(POP) diff --git a/third_party/FreeGLUT/x64-Debug/lib/freeglut_staticd.lib b/third_party/FreeGLUT/x64-Debug/lib/freeglut_staticd.lib new file mode 100644 index 0000000000000000000000000000000000000000..02b6613938d33b7664caf828539cf52ccf43c80f GIT binary patch literal 1257268 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%0DAU_l)?o;Fl>}_KREJ17fZ^ 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 _CUo4IYNyhX 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 fb{!<2yf<=SCa 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�Q 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 literal 0 HcmV?d00001 diff --git a/third_party/FreeGLUT/x64-Debug/lib/freeglutd.lib b/third_party/FreeGLUT/x64-Debug/lib/freeglutd.lib new file mode 100644 index 0000000000000000000000000000000000000000..f6c36db0d44669cf594efa0b09122084682566c7 GIT binary patch literal 46048 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 literal 0 HcmV?d00001 diff --git a/third_party/FreeGLUT/x64-Release/include/GL/freeglut.h b/third_party/FreeGLUT/x64-Release/include/GL/freeglut.h new file mode 100644 index 0000000..0e6f8c6 --- /dev/null +++ b/third_party/FreeGLUT/x64-Release/include/GL/freeglut.h @@ -0,0 +1,22 @@ +#ifndef __FREEGLUT_H__ +#define __FREEGLUT_H__ + +/* + * freeglut.h + * + * The freeglut library include file + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "freeglut_std.h" +#include "freeglut_ext.h" + +/*** END OF FILE ***/ + +#endif /* __FREEGLUT_H__ */ diff --git a/third_party/FreeGLUT/x64-Release/include/GL/freeglut_ext.h b/third_party/FreeGLUT/x64-Release/include/GL/freeglut_ext.h new file mode 100644 index 0000000..32bdcf3 --- /dev/null +++ b/third_party/FreeGLUT/x64-Release/include/GL/freeglut_ext.h @@ -0,0 +1,295 @@ +#ifndef __FREEGLUT_EXT_H__ +#define __FREEGLUT_EXT_H__ + +/* + * freeglut_ext.h + * + * The non-GLUT-compatible extensions to the freeglut library include file + * + * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. + * Written by Pawel W. Olszta, + * Creation date: Thu Dec 2 1999 + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifdef __cplusplus + extern "C" { +#endif + +/* + * Additional GLUT Key definitions for the Special key function + */ +#define GLUT_KEY_NUM_LOCK 0x006D +#define GLUT_KEY_BEGIN 0x006E +#define GLUT_KEY_DELETE 0x006F +#define GLUT_KEY_SHIFT_L 0x0070 +#define GLUT_KEY_SHIFT_R 0x0071 +#define GLUT_KEY_CTRL_L 0x0072 +#define GLUT_KEY_CTRL_R 0x0073 +#define GLUT_KEY_ALT_L 0x0074 +#define GLUT_KEY_ALT_R 0x0075 +#define GLUT_KEY_SUPER_L 0x0076 +#define GLUT_KEY_SUPER_R 0x0077 + +/* + * Additional GLUT modifiers + */ +#define GLUT_ACTIVE_SUPER 0x0008 + +/* + * GLUT API Extension macro definitions -- behaviour when the user clicks on an "x" to close a window + */ +#define GLUT_ACTION_EXIT 0 +#define GLUT_ACTION_GLUTMAINLOOP_RETURNS 1 +#define GLUT_ACTION_CONTINUE_EXECUTION 2 + +/* + * Create a new rendering context when the user opens a new window? + */ +#define GLUT_CREATE_NEW_CONTEXT 0 +#define GLUT_USE_CURRENT_CONTEXT 1 + +/* + * Direct/Indirect rendering context options (has meaning only in Unix/X11) + */ +#define GLUT_FORCE_INDIRECT_CONTEXT 0 +#define GLUT_ALLOW_DIRECT_CONTEXT 1 +#define GLUT_TRY_DIRECT_CONTEXT 2 +#define GLUT_FORCE_DIRECT_CONTEXT 3 + +/* + * GLUT API Extension macro definitions -- the glutGet parameters + */ +#define GLUT_INIT_STATE 0x007C + +#define GLUT_ACTION_ON_WINDOW_CLOSE 0x01F9 + +#define GLUT_WINDOW_BORDER_WIDTH 0x01FA +#define GLUT_WINDOW_BORDER_HEIGHT 0x01FB +#define GLUT_WINDOW_HEADER_HEIGHT 0x01FB /* Docs say it should always have been GLUT_WINDOW_BORDER_HEIGHT, keep this for backward compatibility */ + +#define GLUT_VERSION 0x01FC + +#define GLUT_RENDERING_CONTEXT 0x01FD +#define GLUT_DIRECT_RENDERING 0x01FE + +#define GLUT_FULL_SCREEN 0x01FF + +#define GLUT_SKIP_STALE_MOTION_EVENTS 0x0204 + +#define GLUT_GEOMETRY_VISUALIZE_NORMALS 0x0205 + +#define GLUT_STROKE_FONT_DRAW_JOIN_DOTS 0x0206 /* Draw dots between line segments of stroke fonts? */ + +#define GLUT_ALLOW_NEGATIVE_WINDOW_POSITION 0x0207 /* GLUT doesn't allow negative window positions by default */ + +#define GLUT_WINDOW_SRGB 0x007D + +/* + * New tokens for glutInitDisplayMode. + * Only one GLUT_AUXn bit may be used at a time. + * Value 0x0400 is defined in OpenGLUT. + */ +#define GLUT_AUX 0x1000 + +#define GLUT_AUX1 0x1000 +#define GLUT_AUX2 0x2000 +#define GLUT_AUX3 0x4000 +#define GLUT_AUX4 0x8000 + +/* + * Context-related flags, see fg_state.c + * Set the requested OpenGL version + */ +#define GLUT_INIT_MAJOR_VERSION 0x0200 +#define GLUT_INIT_MINOR_VERSION 0x0201 +#define GLUT_INIT_FLAGS 0x0202 +#define GLUT_INIT_PROFILE 0x0203 + +/* + * Flags for glutInitContextFlags, see fg_init.c + */ +#define GLUT_DEBUG 0x0001 +#define GLUT_FORWARD_COMPATIBLE 0x0002 + + +/* + * Flags for glutInitContextProfile, see fg_init.c + */ +#define GLUT_CORE_PROFILE 0x0001 +#define GLUT_COMPATIBILITY_PROFILE 0x0002 + +/* +* GLUT API Extension macro definitions -- Spaceball button definitions +*/ + +#define GLUT_SPACEBALL_BUTTON_A 0x0001 +#define GLUT_SPACEBALL_BUTTON_B 0x0002 +#define GLUT_SPACEBALL_BUTTON_C 0x0004 +#define GLUT_SPACEBALL_BUTTON_D 0x0008 +#define GLUT_SPACEBALL_BUTTON_E 0x0010 + +/* + * Process loop function, see fg_main.c + */ +FGAPI void FGAPIENTRY glutMainLoopEvent( void ); +FGAPI void FGAPIENTRY glutLeaveMainLoop( void ); +FGAPI void FGAPIENTRY glutExit ( void ); + +/* + * Window management functions, see fg_window.c + */ +FGAPI void FGAPIENTRY glutFullScreenToggle( void ); +FGAPI void FGAPIENTRY glutLeaveFullScreen( void ); + +/* + * Menu functions + */ +FGAPI void FGAPIENTRY glutSetMenuFont( int menuID, void* font ); + +/* + * Window-specific callback functions, see fg_callbacks.c + */ +FGAPI void FGAPIENTRY glutMouseWheelFunc( void (* callback)( int, int, int, int ) ); +FGAPI void FGAPIENTRY glutPositionFunc( void (* callback)( int, int ) ); +FGAPI void FGAPIENTRY glutCloseFunc( void (* callback)( void ) ); +FGAPI void FGAPIENTRY glutWMCloseFunc( void (* callback)( void ) ); +/* And also a destruction callback for menus */ +FGAPI void FGAPIENTRY glutMenuDestroyFunc( void (* callback)( void ) ); + +/* + * State setting and retrieval functions, see fg_state.c + */ +FGAPI void FGAPIENTRY glutSetOption ( GLenum option_flag, int value ); +FGAPI int * FGAPIENTRY glutGetModeValues(GLenum mode, int * size); +/* A.Donev: User-data manipulation */ +FGAPI void* FGAPIENTRY glutGetWindowData( void ); +FGAPI void FGAPIENTRY glutSetWindowData(void* data); +FGAPI void* FGAPIENTRY glutGetMenuData( void ); +FGAPI void FGAPIENTRY glutSetMenuData(void* data); + +/* + * Font stuff, see fg_font.c + */ +FGAPI int FGAPIENTRY glutBitmapHeight( void* font ); +FGAPI GLfloat FGAPIENTRY glutStrokeHeight( void* font ); +FGAPI void FGAPIENTRY glutBitmapString( void* font, const unsigned char *string ); +FGAPI void FGAPIENTRY glutStrokeString( void* font, const unsigned char *string ); + +/* + * Geometry functions, see fg_geometry.c + */ +FGAPI void FGAPIENTRY glutWireRhombicDodecahedron( void ); +FGAPI void FGAPIENTRY glutSolidRhombicDodecahedron( void ); +FGAPI void FGAPIENTRY glutWireSierpinskiSponge ( int num_levels, double offset[3], double scale ); +FGAPI void FGAPIENTRY glutSolidSierpinskiSponge ( int num_levels, double offset[3], double scale ); +FGAPI void FGAPIENTRY glutWireCylinder( double radius, double height, GLint slices, GLint stacks); +FGAPI void FGAPIENTRY glutSolidCylinder( double radius, double height, GLint slices, GLint stacks); + +/* + * Rest of functions for rendering Newell's teaset, found in fg_teapot.c + * NB: front facing polygons have clockwise winding, not counter clockwise + */ +FGAPI void FGAPIENTRY glutWireTeacup( double size ); +FGAPI void FGAPIENTRY glutSolidTeacup( double size ); +FGAPI void FGAPIENTRY glutWireTeaspoon( double size ); +FGAPI void FGAPIENTRY glutSolidTeaspoon( double size ); + +/* + * Extension functions, see fg_ext.c + */ +typedef void (*GLUTproc)(); +FGAPI GLUTproc FGAPIENTRY glutGetProcAddress( const char *procName ); + +/* + * Multi-touch/multi-pointer extensions + */ + +#define GLUT_HAS_MULTI 1 + +/* TODO: add device_id parameter, + cf. http://sourceforge.net/mailarchive/forum.php?thread_name=20120518071314.GA28061%40perso.beuc.net&forum_name=freeglut-developer */ +FGAPI void FGAPIENTRY glutMultiEntryFunc( void (* callback)( int, int ) ); +FGAPI void FGAPIENTRY glutMultiButtonFunc( void (* callback)( int, int, int, int, int ) ); +FGAPI void FGAPIENTRY glutMultiMotionFunc( void (* callback)( int, int, int ) ); +FGAPI void FGAPIENTRY glutMultiPassiveFunc( void (* callback)( int, int, int ) ); + +/* + * Joystick functions, see fg_joystick.c + */ +/* USE OF THESE FUNCTIONS IS DEPRECATED !!!!! */ +/* If you have a serious need for these functions in your application, please either + * contact the "freeglut" developer community at freeglut-developer@lists.sourceforge.net, + * switch to the OpenGLUT library, or else port your joystick functionality over to PLIB's + * "js" library. + */ +int glutJoystickGetNumAxes( int ident ); +int glutJoystickGetNumButtons( int ident ); +int glutJoystickNotWorking( int ident ); +float glutJoystickGetDeadBand( int ident, int axis ); +void glutJoystickSetDeadBand( int ident, int axis, float db ); +float glutJoystickGetSaturation( int ident, int axis ); +void glutJoystickSetSaturation( int ident, int axis, float st ); +void glutJoystickSetMinRange( int ident, float *axes ); +void glutJoystickSetMaxRange( int ident, float *axes ); +void glutJoystickSetCenter( int ident, float *axes ); +void glutJoystickGetMinRange( int ident, float *axes ); +void glutJoystickGetMaxRange( int ident, float *axes ); +void glutJoystickGetCenter( int ident, float *axes ); + +/* + * Initialization functions, see fg_init.c + */ +/* to get the typedef for va_list */ +#include +FGAPI void FGAPIENTRY glutInitContextVersion( int majorVersion, int minorVersion ); +FGAPI void FGAPIENTRY glutInitContextFlags( int flags ); +FGAPI void FGAPIENTRY glutInitContextProfile( int profile ); +FGAPI void FGAPIENTRY glutInitErrorFunc( void (* callback)( const char *fmt, va_list ap ) ); +FGAPI void FGAPIENTRY glutInitWarningFunc( void (* callback)( const char *fmt, va_list ap ) ); + +/* OpenGL >= 2.0 support */ +FGAPI void FGAPIENTRY glutSetVertexAttribCoord3( GLint attrib ); +FGAPI void FGAPIENTRY glutSetVertexAttribNormal( GLint attrib ); +FGAPI void FGAPIENTRY glutSetVertexAttribTexCoord2( GLint attrib ); + +/* Mobile platforms lifecycle */ +FGAPI void FGAPIENTRY glutInitContextFunc( void (* callback)( void ) ); +FGAPI void FGAPIENTRY glutAppStatusFunc( void (* callback)( int ) ); +/* state flags that can be passed to callback set by glutAppStatusFunc */ +#define GLUT_APPSTATUS_PAUSE 0x0001 +#define GLUT_APPSTATUS_RESUME 0x0002 + +/* + * GLUT API macro definitions -- the display mode definitions + */ +#define GLUT_CAPTIONLESS 0x0400 +#define GLUT_BORDERLESS 0x0800 +#define GLUT_SRGB 0x1000 + +/* User-argument callbacks and implementation */ +#include "freeglut_ucall.h" + +#ifdef __cplusplus + } +#endif + +/*** END OF FILE ***/ + +#endif /* __FREEGLUT_EXT_H__ */ diff --git a/third_party/FreeGLUT/x64-Release/include/GL/freeglut_std.h b/third_party/FreeGLUT/x64-Release/include/GL/freeglut_std.h new file mode 100644 index 0000000..a658c7c --- /dev/null +++ b/third_party/FreeGLUT/x64-Release/include/GL/freeglut_std.h @@ -0,0 +1,653 @@ +#ifndef __FREEGLUT_STD_H__ +#define __FREEGLUT_STD_H__ + +/* + * freeglut_std.h + * + * The GLUT-compatible part of the freeglut library include file + * + * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. + * Written by Pawel W. Olszta, + * Creation date: Thu Dec 2 1999 + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifdef __cplusplus + extern "C" { +#endif + +/* + * Under windows, we have to differentiate between static and dynamic libraries + */ +#ifdef _WIN32 +/* #pragma may not be supported by some compilers. + * Discussion by FreeGLUT developers suggests that + * Visual C++ specific code involving pragmas may + * need to move to a separate header. 24th Dec 2003 + */ + +/* Define FREEGLUT_LIB_PRAGMAS to 1 to include library + * pragmas or to 0 to exclude library pragmas. + * The default behavior depends on the compiler/platform. + */ +# ifndef FREEGLUT_LIB_PRAGMAS +# if ( defined(_MSC_VER) || defined(__WATCOMC__) ) && !defined(_WIN32_WCE) +# define FREEGLUT_LIB_PRAGMAS 1 +# else +# define FREEGLUT_LIB_PRAGMAS 0 +# endif +# endif + +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN 1 +# endif +# ifndef NOMINMAX +# define NOMINMAX +# endif +# include + +/* Windows static library */ +# ifdef FREEGLUT_STATIC + +# define FGAPI +# define FGAPIENTRY + + /* Link with Win32 static freeglut lib */ +# if FREEGLUT_LIB_PRAGMAS +# ifdef NDEBUG +# pragma comment (lib, "freeglut_static.lib") +# else +# pragma comment (lib, "freeglut_staticd.lib") +# endif +# endif + +/* Windows shared library (DLL) */ +# else + +# define FGAPIENTRY __stdcall +# if defined(FREEGLUT_EXPORTS) +# define FGAPI __declspec(dllexport) +# else +# define FGAPI __declspec(dllimport) + + /* Link with Win32 shared freeglut lib */ +# if FREEGLUT_LIB_PRAGMAS +# ifdef NDEBUG +# pragma comment (lib, "freeglut.lib") +# else +# pragma comment (lib, "freeglutd.lib") +# endif +# endif + +# endif + +# endif + +/* Drag in other Windows libraries as required by FreeGLUT */ +# if FREEGLUT_LIB_PRAGMAS +# pragma comment (lib, "glu32.lib") /* link OpenGL Utility lib */ +# pragma comment (lib, "opengl32.lib") /* link Microsoft OpenGL lib */ +# pragma comment (lib, "gdi32.lib") /* link Windows GDI lib */ +# pragma comment (lib, "winmm.lib") /* link Windows MultiMedia lib */ +# pragma comment (lib, "user32.lib") /* link Windows user lib */ +# endif + +#else + +/* Non-Windows definition of FGAPI and FGAPIENTRY */ +# define FGAPI +# define FGAPIENTRY + +#endif + +/* + * The freeglut and GLUT API versions + */ +#define FREEGLUT 1 +#define GLUT_API_VERSION 4 +#define GLUT_XLIB_IMPLEMENTATION 13 +/* Deprecated: + cf. http://sourceforge.net/mailarchive/forum.php?thread_name=CABcAi1hw7cr4xtigckaGXB5X8wddLfMcbA_rZ3NAuwMrX_zmsw%40mail.gmail.com&forum_name=freeglut-developer */ +#define FREEGLUT_VERSION_2_0 1 + +/* + * Always include OpenGL and GLU headers + */ +/* Note: FREEGLUT_GLES is only used to cleanly bootstrap headers + inclusion here; use GLES constants directly + (e.g. GL_ES_VERSION_2_0) for all other needs */ +#ifdef FREEGLUT_GLES +# include +# include +# include +#elif __APPLE__ +# include +# include +#else +# include +# include +#endif + +/* + * GLUT API macro definitions -- the special key codes: + */ +#define GLUT_KEY_F1 0x0001 +#define GLUT_KEY_F2 0x0002 +#define GLUT_KEY_F3 0x0003 +#define GLUT_KEY_F4 0x0004 +#define GLUT_KEY_F5 0x0005 +#define GLUT_KEY_F6 0x0006 +#define GLUT_KEY_F7 0x0007 +#define GLUT_KEY_F8 0x0008 +#define GLUT_KEY_F9 0x0009 +#define GLUT_KEY_F10 0x000A +#define GLUT_KEY_F11 0x000B +#define GLUT_KEY_F12 0x000C +#define GLUT_KEY_LEFT 0x0064 +#define GLUT_KEY_UP 0x0065 +#define GLUT_KEY_RIGHT 0x0066 +#define GLUT_KEY_DOWN 0x0067 +#define GLUT_KEY_PAGE_UP 0x0068 +#define GLUT_KEY_PAGE_DOWN 0x0069 +#define GLUT_KEY_HOME 0x006A +#define GLUT_KEY_END 0x006B +#define GLUT_KEY_INSERT 0x006C + +/* + * GLUT API macro definitions -- mouse state definitions + */ +#define GLUT_LEFT_BUTTON 0x0000 +#define GLUT_MIDDLE_BUTTON 0x0001 +#define GLUT_RIGHT_BUTTON 0x0002 +#define GLUT_DOWN 0x0000 +#define GLUT_UP 0x0001 +#define GLUT_LEFT 0x0000 +#define GLUT_ENTERED 0x0001 + +/* + * GLUT API macro definitions -- the display mode definitions + */ +#define GLUT_RGB 0x0000 +#define GLUT_RGBA 0x0000 +#define GLUT_INDEX 0x0001 +#define GLUT_SINGLE 0x0000 +#define GLUT_DOUBLE 0x0002 +#define GLUT_ACCUM 0x0004 +#define GLUT_ALPHA 0x0008 +#define GLUT_DEPTH 0x0010 +#define GLUT_STENCIL 0x0020 +#define GLUT_MULTISAMPLE 0x0080 +#define GLUT_STEREO 0x0100 +#define GLUT_LUMINANCE 0x0200 + +/* + * GLUT API macro definitions -- windows and menu related definitions + */ +#define GLUT_MENU_NOT_IN_USE 0x0000 +#define GLUT_MENU_IN_USE 0x0001 +#define GLUT_NOT_VISIBLE 0x0000 +#define GLUT_VISIBLE 0x0001 +#define GLUT_HIDDEN 0x0000 +#define GLUT_FULLY_RETAINED 0x0001 +#define GLUT_PARTIALLY_RETAINED 0x0002 +#define GLUT_FULLY_COVERED 0x0003 + +/* + * GLUT API macro definitions -- fonts definitions + * + * Steve Baker suggested to make it binary compatible with GLUT: + */ +#if defined(_MSC_VER) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__WATCOMC__) +# define GLUT_STROKE_ROMAN ((void *)0x0000) +# define GLUT_STROKE_MONO_ROMAN ((void *)0x0001) +# define GLUT_BITMAP_9_BY_15 ((void *)0x0002) +# define GLUT_BITMAP_8_BY_13 ((void *)0x0003) +# define GLUT_BITMAP_TIMES_ROMAN_10 ((void *)0x0004) +# define GLUT_BITMAP_TIMES_ROMAN_24 ((void *)0x0005) +# define GLUT_BITMAP_HELVETICA_10 ((void *)0x0006) +# define GLUT_BITMAP_HELVETICA_12 ((void *)0x0007) +# define GLUT_BITMAP_HELVETICA_18 ((void *)0x0008) +#else + /* + * I don't really know if it's a good idea... But here it goes: + */ + extern void* glutStrokeRoman; + extern void* glutStrokeMonoRoman; + extern void* glutBitmap9By15; + extern void* glutBitmap8By13; + extern void* glutBitmapTimesRoman10; + extern void* glutBitmapTimesRoman24; + extern void* glutBitmapHelvetica10; + extern void* glutBitmapHelvetica12; + extern void* glutBitmapHelvetica18; + + /* + * Those pointers will be used by following definitions: + */ +# define GLUT_STROKE_ROMAN ((void *) &glutStrokeRoman) +# define GLUT_STROKE_MONO_ROMAN ((void *) &glutStrokeMonoRoman) +# define GLUT_BITMAP_9_BY_15 ((void *) &glutBitmap9By15) +# define GLUT_BITMAP_8_BY_13 ((void *) &glutBitmap8By13) +# define GLUT_BITMAP_TIMES_ROMAN_10 ((void *) &glutBitmapTimesRoman10) +# define GLUT_BITMAP_TIMES_ROMAN_24 ((void *) &glutBitmapTimesRoman24) +# define GLUT_BITMAP_HELVETICA_10 ((void *) &glutBitmapHelvetica10) +# define GLUT_BITMAP_HELVETICA_12 ((void *) &glutBitmapHelvetica12) +# define GLUT_BITMAP_HELVETICA_18 ((void *) &glutBitmapHelvetica18) +#endif + +/* + * GLUT API macro definitions -- the glutGet parameters + */ +#define GLUT_WINDOW_X 0x0064 +#define GLUT_WINDOW_Y 0x0065 +#define GLUT_WINDOW_WIDTH 0x0066 +#define GLUT_WINDOW_HEIGHT 0x0067 +#define GLUT_WINDOW_BUFFER_SIZE 0x0068 +#define GLUT_WINDOW_STENCIL_SIZE 0x0069 +#define GLUT_WINDOW_DEPTH_SIZE 0x006A +#define GLUT_WINDOW_RED_SIZE 0x006B +#define GLUT_WINDOW_GREEN_SIZE 0x006C +#define GLUT_WINDOW_BLUE_SIZE 0x006D +#define GLUT_WINDOW_ALPHA_SIZE 0x006E +#define GLUT_WINDOW_ACCUM_RED_SIZE 0x006F +#define GLUT_WINDOW_ACCUM_GREEN_SIZE 0x0070 +#define GLUT_WINDOW_ACCUM_BLUE_SIZE 0x0071 +#define GLUT_WINDOW_ACCUM_ALPHA_SIZE 0x0072 +#define GLUT_WINDOW_DOUBLEBUFFER 0x0073 +#define GLUT_WINDOW_RGBA 0x0074 +#define GLUT_WINDOW_PARENT 0x0075 +#define GLUT_WINDOW_NUM_CHILDREN 0x0076 +#define GLUT_WINDOW_COLORMAP_SIZE 0x0077 +#define GLUT_WINDOW_NUM_SAMPLES 0x0078 +#define GLUT_WINDOW_STEREO 0x0079 +#define GLUT_WINDOW_CURSOR 0x007A + +#define GLUT_SCREEN_WIDTH 0x00C8 +#define GLUT_SCREEN_HEIGHT 0x00C9 +#define GLUT_SCREEN_WIDTH_MM 0x00CA +#define GLUT_SCREEN_HEIGHT_MM 0x00CB +#define GLUT_MENU_NUM_ITEMS 0x012C +#define GLUT_DISPLAY_MODE_POSSIBLE 0x0190 +#define GLUT_INIT_WINDOW_X 0x01F4 +#define GLUT_INIT_WINDOW_Y 0x01F5 +#define GLUT_INIT_WINDOW_WIDTH 0x01F6 +#define GLUT_INIT_WINDOW_HEIGHT 0x01F7 +#define GLUT_INIT_DISPLAY_MODE 0x01F8 +#define GLUT_ELAPSED_TIME 0x02BC +#define GLUT_WINDOW_FORMAT_ID 0x007B + +/* + * GLUT API macro definitions -- the glutDeviceGet parameters + */ +#define GLUT_HAS_KEYBOARD 0x0258 +#define GLUT_HAS_MOUSE 0x0259 +#define GLUT_HAS_SPACEBALL 0x025A +#define GLUT_HAS_DIAL_AND_BUTTON_BOX 0x025B +#define GLUT_HAS_TABLET 0x025C +#define GLUT_NUM_MOUSE_BUTTONS 0x025D +#define GLUT_NUM_SPACEBALL_BUTTONS 0x025E +#define GLUT_NUM_BUTTON_BOX_BUTTONS 0x025F +#define GLUT_NUM_DIALS 0x0260 +#define GLUT_NUM_TABLET_BUTTONS 0x0261 +#define GLUT_DEVICE_IGNORE_KEY_REPEAT 0x0262 +#define GLUT_DEVICE_KEY_REPEAT 0x0263 +#define GLUT_HAS_JOYSTICK 0x0264 +#define GLUT_OWNS_JOYSTICK 0x0265 +#define GLUT_JOYSTICK_BUTTONS 0x0266 +#define GLUT_JOYSTICK_AXES 0x0267 +#define GLUT_JOYSTICK_POLL_RATE 0x0268 + +/* + * GLUT API macro definitions -- the glutLayerGet parameters + */ +#define GLUT_OVERLAY_POSSIBLE 0x0320 +#define GLUT_LAYER_IN_USE 0x0321 +#define GLUT_HAS_OVERLAY 0x0322 +#define GLUT_TRANSPARENT_INDEX 0x0323 +#define GLUT_NORMAL_DAMAGED 0x0324 +#define GLUT_OVERLAY_DAMAGED 0x0325 + +/* + * GLUT API macro definitions -- the glutVideoResizeGet parameters + */ +#define GLUT_VIDEO_RESIZE_POSSIBLE 0x0384 +#define GLUT_VIDEO_RESIZE_IN_USE 0x0385 +#define GLUT_VIDEO_RESIZE_X_DELTA 0x0386 +#define GLUT_VIDEO_RESIZE_Y_DELTA 0x0387 +#define GLUT_VIDEO_RESIZE_WIDTH_DELTA 0x0388 +#define GLUT_VIDEO_RESIZE_HEIGHT_DELTA 0x0389 +#define GLUT_VIDEO_RESIZE_X 0x038A +#define GLUT_VIDEO_RESIZE_Y 0x038B +#define GLUT_VIDEO_RESIZE_WIDTH 0x038C +#define GLUT_VIDEO_RESIZE_HEIGHT 0x038D + +/* + * GLUT API macro definitions -- the glutUseLayer parameters + */ +#define GLUT_NORMAL 0x0000 +#define GLUT_OVERLAY 0x0001 + +/* + * GLUT API macro definitions -- the glutGetModifiers parameters + */ +#define GLUT_ACTIVE_SHIFT 0x0001 +#define GLUT_ACTIVE_CTRL 0x0002 +#define GLUT_ACTIVE_ALT 0x0004 + +/* + * GLUT API macro definitions -- the glutSetCursor parameters + */ +#define GLUT_CURSOR_RIGHT_ARROW 0x0000 +#define GLUT_CURSOR_LEFT_ARROW 0x0001 +#define GLUT_CURSOR_INFO 0x0002 +#define GLUT_CURSOR_DESTROY 0x0003 +#define GLUT_CURSOR_HELP 0x0004 +#define GLUT_CURSOR_CYCLE 0x0005 +#define GLUT_CURSOR_SPRAY 0x0006 +#define GLUT_CURSOR_WAIT 0x0007 +#define GLUT_CURSOR_TEXT 0x0008 +#define GLUT_CURSOR_CROSSHAIR 0x0009 +#define GLUT_CURSOR_UP_DOWN 0x000A +#define GLUT_CURSOR_LEFT_RIGHT 0x000B +#define GLUT_CURSOR_TOP_SIDE 0x000C +#define GLUT_CURSOR_BOTTOM_SIDE 0x000D +#define GLUT_CURSOR_LEFT_SIDE 0x000E +#define GLUT_CURSOR_RIGHT_SIDE 0x000F +#define GLUT_CURSOR_TOP_LEFT_CORNER 0x0010 +#define GLUT_CURSOR_TOP_RIGHT_CORNER 0x0011 +#define GLUT_CURSOR_BOTTOM_RIGHT_CORNER 0x0012 +#define GLUT_CURSOR_BOTTOM_LEFT_CORNER 0x0013 +#define GLUT_CURSOR_INHERIT 0x0064 +#define GLUT_CURSOR_NONE 0x0065 +#define GLUT_CURSOR_FULL_CROSSHAIR 0x0066 + +/* + * GLUT API macro definitions -- RGB color component specification definitions + */ +#define GLUT_RED 0x0000 +#define GLUT_GREEN 0x0001 +#define GLUT_BLUE 0x0002 + +/* + * GLUT API macro definitions -- additional keyboard and joystick definitions + */ +#define GLUT_KEY_REPEAT_OFF 0x0000 +#define GLUT_KEY_REPEAT_ON 0x0001 +#define GLUT_KEY_REPEAT_DEFAULT 0x0002 + +#define GLUT_JOYSTICK_BUTTON_A 0x0001 +#define GLUT_JOYSTICK_BUTTON_B 0x0002 +#define GLUT_JOYSTICK_BUTTON_C 0x0004 +#define GLUT_JOYSTICK_BUTTON_D 0x0008 + +/* + * GLUT API macro definitions -- game mode definitions + */ +#define GLUT_GAME_MODE_ACTIVE 0x0000 +#define GLUT_GAME_MODE_POSSIBLE 0x0001 +#define GLUT_GAME_MODE_WIDTH 0x0002 +#define GLUT_GAME_MODE_HEIGHT 0x0003 +#define GLUT_GAME_MODE_PIXEL_DEPTH 0x0004 +#define GLUT_GAME_MODE_REFRESH_RATE 0x0005 +#define GLUT_GAME_MODE_DISPLAY_CHANGED 0x0006 + +/* + * Initialization functions, see fglut_init.c + */ +FGAPI void FGAPIENTRY glutInit( int* pargc, char** argv ); +FGAPI void FGAPIENTRY glutInitWindowPosition( int x, int y ); +FGAPI void FGAPIENTRY glutInitWindowSize( int width, int height ); +FGAPI void FGAPIENTRY glutInitDisplayMode( unsigned int displayMode ); +FGAPI void FGAPIENTRY glutInitDisplayString( const char* displayMode ); + +/* + * Process loop function, see fg_main.c + */ +FGAPI void FGAPIENTRY glutMainLoop( void ); + +/* + * Window management functions, see fg_window.c + */ +FGAPI int FGAPIENTRY glutCreateWindow( const char* title ); +FGAPI int FGAPIENTRY glutCreateSubWindow( int window, int x, int y, int width, int height ); +FGAPI void FGAPIENTRY glutDestroyWindow( int window ); +FGAPI void FGAPIENTRY glutSetWindow( int window ); +FGAPI int FGAPIENTRY glutGetWindow( void ); +FGAPI void FGAPIENTRY glutSetWindowTitle( const char* title ); +FGAPI void FGAPIENTRY glutSetIconTitle( const char* title ); +FGAPI void FGAPIENTRY glutReshapeWindow( int width, int height ); +FGAPI void FGAPIENTRY glutPositionWindow( int x, int y ); +FGAPI void FGAPIENTRY glutShowWindow( void ); +FGAPI void FGAPIENTRY glutHideWindow( void ); +FGAPI void FGAPIENTRY glutIconifyWindow( void ); +FGAPI void FGAPIENTRY glutPushWindow( void ); +FGAPI void FGAPIENTRY glutPopWindow( void ); +FGAPI void FGAPIENTRY glutFullScreen( void ); + +/* + * Display-related functions, see fg_display.c + */ +FGAPI void FGAPIENTRY glutPostWindowRedisplay( int window ); +FGAPI void FGAPIENTRY glutPostRedisplay( void ); +FGAPI void FGAPIENTRY glutSwapBuffers( void ); + +/* + * Mouse cursor functions, see fg_cursor.c + */ +FGAPI void FGAPIENTRY glutWarpPointer( int x, int y ); +FGAPI void FGAPIENTRY glutSetCursor( int cursor ); + +/* + * Overlay stuff, see fg_overlay.c + */ +FGAPI void FGAPIENTRY glutEstablishOverlay( void ); +FGAPI void FGAPIENTRY glutRemoveOverlay( void ); +FGAPI void FGAPIENTRY glutUseLayer( GLenum layer ); +FGAPI void FGAPIENTRY glutPostOverlayRedisplay( void ); +FGAPI void FGAPIENTRY glutPostWindowOverlayRedisplay( int window ); +FGAPI void FGAPIENTRY glutShowOverlay( void ); +FGAPI void FGAPIENTRY glutHideOverlay( void ); + +/* + * Menu stuff, see fg_menu.c + */ +FGAPI int FGAPIENTRY glutCreateMenu( void (* callback)( int menu ) ); +FGAPI void FGAPIENTRY glutDestroyMenu( int menu ); +FGAPI int FGAPIENTRY glutGetMenu( void ); +FGAPI void FGAPIENTRY glutSetMenu( int menu ); +FGAPI void FGAPIENTRY glutAddMenuEntry( const char* label, int value ); +FGAPI void FGAPIENTRY glutAddSubMenu( const char* label, int subMenu ); +FGAPI void FGAPIENTRY glutChangeToMenuEntry( int item, const char* label, int value ); +FGAPI void FGAPIENTRY glutChangeToSubMenu( int item, const char* label, int value ); +FGAPI void FGAPIENTRY glutRemoveMenuItem( int item ); +FGAPI void FGAPIENTRY glutAttachMenu( int button ); +FGAPI void FGAPIENTRY glutDetachMenu( int button ); + +/* + * Global callback functions, see fg_callbacks.c + */ +FGAPI void FGAPIENTRY glutTimerFunc( unsigned int time, void (* callback)( int ), int value ); +FGAPI void FGAPIENTRY glutIdleFunc( void (* callback)( void ) ); + +/* + * Window-specific callback functions, see fg_callbacks.c + */ +FGAPI void FGAPIENTRY glutKeyboardFunc( void (* callback)( unsigned char, int, int ) ); +FGAPI void FGAPIENTRY glutSpecialFunc( void (* callback)( int, int, int ) ); +FGAPI void FGAPIENTRY glutReshapeFunc( void (* callback)( int, int ) ); +FGAPI void FGAPIENTRY glutVisibilityFunc( void (* callback)( int ) ); +FGAPI void FGAPIENTRY glutDisplayFunc( void (* callback)( void ) ); +FGAPI void FGAPIENTRY glutMouseFunc( void (* callback)( int, int, int, int ) ); +FGAPI void FGAPIENTRY glutMotionFunc( void (* callback)( int, int ) ); +FGAPI void FGAPIENTRY glutPassiveMotionFunc( void (* callback)( int, int ) ); +FGAPI void FGAPIENTRY glutEntryFunc( void (* callback)( int ) ); + +FGAPI void FGAPIENTRY glutKeyboardUpFunc( void (* callback)( unsigned char, int, int ) ); +FGAPI void FGAPIENTRY glutSpecialUpFunc( void (* callback)( int, int, int ) ); +FGAPI void FGAPIENTRY glutJoystickFunc( void (* callback)( unsigned int, int, int, int ), int pollInterval ); +FGAPI void FGAPIENTRY glutMenuStateFunc( void (* callback)( int ) ); +FGAPI void FGAPIENTRY glutMenuStatusFunc( void (* callback)( int, int, int ) ); +FGAPI void FGAPIENTRY glutOverlayDisplayFunc( void (* callback)( void ) ); +FGAPI void FGAPIENTRY glutWindowStatusFunc( void (* callback)( int ) ); + +FGAPI void FGAPIENTRY glutSpaceballMotionFunc( void (* callback)( int, int, int ) ); +FGAPI void FGAPIENTRY glutSpaceballRotateFunc( void (* callback)( int, int, int ) ); +FGAPI void FGAPIENTRY glutSpaceballButtonFunc( void (* callback)( int, int ) ); +FGAPI void FGAPIENTRY glutButtonBoxFunc( void (* callback)( int, int ) ); +FGAPI void FGAPIENTRY glutDialsFunc( void (* callback)( int, int ) ); +FGAPI void FGAPIENTRY glutTabletMotionFunc( void (* callback)( int, int ) ); +FGAPI void FGAPIENTRY glutTabletButtonFunc( void (* callback)( int, int, int, int ) ); + +/* + * State setting and retrieval functions, see fg_state.c + */ +FGAPI int FGAPIENTRY glutGet( GLenum query ); +FGAPI int FGAPIENTRY glutDeviceGet( GLenum query ); +FGAPI int FGAPIENTRY glutGetModifiers( void ); +FGAPI int FGAPIENTRY glutLayerGet( GLenum query ); + +/* + * Font stuff, see fg_font.c + */ +FGAPI void FGAPIENTRY glutBitmapCharacter( void* font, int character ); +FGAPI int FGAPIENTRY glutBitmapWidth( void* font, int character ); +FGAPI void FGAPIENTRY glutStrokeCharacter( void* font, int character ); +FGAPI int FGAPIENTRY glutStrokeWidth( void* font, int character ); +FGAPI GLfloat FGAPIENTRY glutStrokeWidthf( void* font, int character ); /* GLUT 3.8 */ +FGAPI int FGAPIENTRY glutBitmapLength( void* font, const unsigned char* string ); +FGAPI int FGAPIENTRY glutStrokeLength( void* font, const unsigned char* string ); +FGAPI GLfloat FGAPIENTRY glutStrokeLengthf( void* font, const unsigned char *string ); /* GLUT 3.8 */ + +/* + * Geometry functions, see fg_geometry.c + */ + +FGAPI void FGAPIENTRY glutWireCube( double size ); +FGAPI void FGAPIENTRY glutSolidCube( double size ); +FGAPI void FGAPIENTRY glutWireSphere( double radius, GLint slices, GLint stacks ); +FGAPI void FGAPIENTRY glutSolidSphere( double radius, GLint slices, GLint stacks ); +FGAPI void FGAPIENTRY glutWireCone( double base, double height, GLint slices, GLint stacks ); +FGAPI void FGAPIENTRY glutSolidCone( double base, double height, GLint slices, GLint stacks ); +FGAPI void FGAPIENTRY glutWireTorus( double innerRadius, double outerRadius, GLint sides, GLint rings ); +FGAPI void FGAPIENTRY glutSolidTorus( double innerRadius, double outerRadius, GLint sides, GLint rings ); +FGAPI void FGAPIENTRY glutWireDodecahedron( void ); +FGAPI void FGAPIENTRY glutSolidDodecahedron( void ); +FGAPI void FGAPIENTRY glutWireOctahedron( void ); +FGAPI void FGAPIENTRY glutSolidOctahedron( void ); +FGAPI void FGAPIENTRY glutWireTetrahedron( void ); +FGAPI void FGAPIENTRY glutSolidTetrahedron( void ); +FGAPI void FGAPIENTRY glutWireIcosahedron( void ); +FGAPI void FGAPIENTRY glutSolidIcosahedron( void ); + +/* + * Teapot rendering functions, found in fg_teapot.c + * NB: front facing polygons have clockwise winding, not counter clockwise + */ +FGAPI void FGAPIENTRY glutWireTeapot( double size ); +FGAPI void FGAPIENTRY glutSolidTeapot( double size ); + +/* + * Game mode functions, see fg_gamemode.c + */ +FGAPI void FGAPIENTRY glutGameModeString( const char* string ); +FGAPI int FGAPIENTRY glutEnterGameMode( void ); +FGAPI void FGAPIENTRY glutLeaveGameMode( void ); +FGAPI int FGAPIENTRY glutGameModeGet( GLenum query ); + +/* + * Video resize functions, see fg_videoresize.c + */ +FGAPI int FGAPIENTRY glutVideoResizeGet( GLenum query ); +FGAPI void FGAPIENTRY glutSetupVideoResizing( void ); +FGAPI void FGAPIENTRY glutStopVideoResizing( void ); +FGAPI void FGAPIENTRY glutVideoResize( int x, int y, int width, int height ); +FGAPI void FGAPIENTRY glutVideoPan( int x, int y, int width, int height ); + +/* + * Colormap functions, see fg_misc.c + */ +FGAPI void FGAPIENTRY glutSetColor( int color, GLfloat red, GLfloat green, GLfloat blue ); +FGAPI GLfloat FGAPIENTRY glutGetColor( int color, int component ); +FGAPI void FGAPIENTRY glutCopyColormap( int window ); + +/* + * Misc keyboard and joystick functions, see fg_misc.c + */ +FGAPI void FGAPIENTRY glutIgnoreKeyRepeat( int ignore ); +FGAPI void FGAPIENTRY glutSetKeyRepeat( int repeatMode ); +FGAPI void FGAPIENTRY glutForceJoystickFunc( void ); + +/* + * Misc functions, see fg_misc.c + */ +FGAPI int FGAPIENTRY glutExtensionSupported( const char* extension ); +FGAPI void FGAPIENTRY glutReportErrors( void ); + +/* Comment from glut.h of classic GLUT: + + Win32 has an annoying issue where there are multiple C run-time + libraries (CRTs). If the executable is linked with a different CRT + from the GLUT DLL, the GLUT DLL will not share the same CRT static + data seen by the executable. In particular, atexit callbacks registered + in the executable will not be called if GLUT calls its (different) + exit routine). GLUT is typically built with the + "/MD" option (the CRT with multithreading DLL support), but the Visual + C++ linker default is "/ML" (the single threaded CRT). + + One workaround to this issue is requiring users to always link with + the same CRT as GLUT is compiled with. That requires users supply a + non-standard option. GLUT 3.7 has its own built-in workaround where + the executable's "exit" function pointer is covertly passed to GLUT. + GLUT then calls the executable's exit function pointer to ensure that + any "atexit" calls registered by the application are called if GLUT + needs to exit. + + Note that the __glut*WithExit routines should NEVER be called directly. + To avoid the atexit workaround, #define GLUT_DISABLE_ATEXIT_HACK. */ + +/* to get the prototype for exit() */ +#include + +#if defined(_WIN32) && !defined(GLUT_DISABLE_ATEXIT_HACK) && !defined(__WATCOMC__) +FGAPI void FGAPIENTRY __glutInitWithExit(int *argcp, char **argv, void (__cdecl *exitfunc)(int)); +FGAPI int FGAPIENTRY __glutCreateWindowWithExit(const char *title, void (__cdecl *exitfunc)(int)); +FGAPI int FGAPIENTRY __glutCreateMenuWithExit(void (* func)(int), void (__cdecl *exitfunc)(int)); +#ifndef FREEGLUT_BUILDING_LIB +#if defined(__GNUC__) +#define FGUNUSED __attribute__((unused)) +#else +#define FGUNUSED +#endif +static void FGAPIENTRY FGUNUSED glutInit_ATEXIT_HACK(int *argcp, char **argv) { __glutInitWithExit(argcp, argv, exit); } +#define glutInit glutInit_ATEXIT_HACK +static int FGAPIENTRY FGUNUSED glutCreateWindow_ATEXIT_HACK(const char *title) { return __glutCreateWindowWithExit(title, exit); } +#define glutCreateWindow glutCreateWindow_ATEXIT_HACK +static int FGAPIENTRY FGUNUSED glutCreateMenu_ATEXIT_HACK(void (* func)(int)) { return __glutCreateMenuWithExit(func, exit); } +#define glutCreateMenu glutCreateMenu_ATEXIT_HACK +#endif +#endif + +#ifdef __cplusplus + } +#endif + +/*** END OF FILE ***/ + +#endif /* __FREEGLUT_STD_H__ */ + diff --git a/third_party/FreeGLUT/x64-Release/include/GL/freeglut_ucall.h b/third_party/FreeGLUT/x64-Release/include/GL/freeglut_ucall.h new file mode 100644 index 0000000..1ef2ae7 --- /dev/null +++ b/third_party/FreeGLUT/x64-Release/include/GL/freeglut_ucall.h @@ -0,0 +1,113 @@ +#ifndef __FREEGLUT_UCALL_H__ +#define __FREEGLUT_UCALL_H__ + +/* + * freeglut_ucall.h + * + * Callbacks with user data arguments. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifdef __cplusplus + extern "C" { +#endif + +/* + * Menu stuff, see fg_menu.c + */ +FGAPI int FGAPIENTRY glutCreateMenuUcall( void (* callback)( int menu, void* user_data ), void* user_data ); + +/* + * Global callback functions, see fg_callbacks.c + */ +FGAPI void FGAPIENTRY glutTimerFuncUcall( unsigned int time, void (* callback)( int, void* ), int value, void* user_data ); +FGAPI void FGAPIENTRY glutIdleFuncUcall( void (* callback)( void* ), void* user_data ); + +/* + * Window-specific callback functions, see fg_callbacks.c + */ +FGAPI void FGAPIENTRY glutKeyboardFuncUcall( void (* callback)( unsigned char, int, int, void* ), void* user_data ); +FGAPI void FGAPIENTRY glutSpecialFuncUcall( void (* callback)( int, int, int, void* ), void* user_data ); +FGAPI void FGAPIENTRY glutReshapeFuncUcall( void (* callback)( int, int, void* ), void* user_data ); +FGAPI void FGAPIENTRY glutVisibilityFuncUcall( void (* callback)( int, void* ), void* user_data ); +FGAPI void FGAPIENTRY glutDisplayFuncUcall( void (* callback)( void* ), void* user_data ); +FGAPI void FGAPIENTRY glutMouseFuncUcall( void (* callback)( int, int, int, int, void* ), void* user_data ); +FGAPI void FGAPIENTRY glutMotionFuncUcall( void (* callback)( int, int, void* ), void* user_data ); +FGAPI void FGAPIENTRY glutPassiveMotionFuncUcall( void (* callback)( int, int, void* ), void* user_data ); +FGAPI void FGAPIENTRY glutEntryFuncUcall( void (* callback)( int, void* ), void* user_data ); + +FGAPI void FGAPIENTRY glutKeyboardUpFuncUcall( void (* callback)( unsigned char, int, int, void* ), void* user_data ); +FGAPI void FGAPIENTRY glutSpecialUpFuncUcall( void (* callback)( int, int, int, void* ), void* user_data ); +FGAPI void FGAPIENTRY glutJoystickFuncUcall( void (* callback)( unsigned int, int, int, int, void* ), int pollInterval, void* user_data ); +FGAPI void FGAPIENTRY glutMenuStatusFuncUcall( void (* callback)( int, int, int, void* ), void* user_data ); +FGAPI void FGAPIENTRY glutOverlayDisplayFuncUcall( void (* callback)( void* ), void* user_data ); +FGAPI void FGAPIENTRY glutWindowStatusFuncUcall( void (* callback)( int, void* ), void* user_data ); + +FGAPI void FGAPIENTRY glutSpaceballMotionFuncUcall( void (* callback)( int, int, int, void* ), void* user_data ); +FGAPI void FGAPIENTRY glutSpaceballRotateFuncUcall( void (* callback)( int, int, int, void* ), void* user_data ); +FGAPI void FGAPIENTRY glutSpaceballButtonFuncUcall( void (* callback)( int, int, void* ), void* user_data ); +FGAPI void FGAPIENTRY glutButtonBoxFuncUcall( void (* callback)( int, int, void* ), void* user_data ); +FGAPI void FGAPIENTRY glutDialsFuncUcall( void (* callback)( int, int, void* ), void* user_data ); +FGAPI void FGAPIENTRY glutTabletMotionFuncUcall( void (* callback)( int, int, void* ), void* user_data ); +FGAPI void FGAPIENTRY glutTabletButtonFuncUcall( void (* callback)( int, int, int, int, void* ), void* user_data ); + +FGAPI void FGAPIENTRY glutMouseWheelFuncUcall( void (* callback)( int, int, int, int, void* ), void* user_data ); +FGAPI void FGAPIENTRY glutPositionFuncUcall( void (* callback)( int, int, void* ), void* user_data ); +FGAPI void FGAPIENTRY glutCloseFuncUcall( void (* callback)( void* ), void* user_data ); +FGAPI void FGAPIENTRY glutWMCloseFuncUcall( void (* callback)( void* ), void* user_data ); +FGAPI void FGAPIENTRY glutMenuDestroyFuncUcall( void (* callback)( void* ), void* user_data ); + +/* + * Multi-touch/multi-pointer extensions + */ +FGAPI void FGAPIENTRY glutMultiEntryFuncUcall( void (* callback)( int, int, void* ), void* user_data ); +FGAPI void FGAPIENTRY glutMultiButtonFuncUcall( void (* callback)( int, int, int, int, int, void* ), void* user_data ); +FGAPI void FGAPIENTRY glutMultiMotionFuncUcall( void (* callback)( int, int, int, void* ), void* user_data ); +FGAPI void FGAPIENTRY glutMultiPassiveFuncUcall( void (* callback)( int, int, int, void* ), void* user_data ); + +/* + * Initialization functions, see fg_init.c + */ +#include +FGAPI void FGAPIENTRY glutInitErrorFuncUcall( void (* callback)( const char *fmt, va_list ap, void* user_data ), void* user_data ); +FGAPI void FGAPIENTRY glutInitWarningFuncUcall( void (* callback)( const char *fmt, va_list ap, void* user_data ), void* user_data ); + +/* Mobile platforms lifecycle */ +FGAPI void FGAPIENTRY glutInitContextFuncUcall( void (* callback)( void* ), void* user_data ); +FGAPI void FGAPIENTRY glutAppStatusFuncUcall( void (* callback)( int, void* ), void* user_data ); + +/* + * Continued "hack" from GLUT applied to Ucall functions. + * For more info, see bottom of freeglut_std.h + */ + +/* to get the prototype for exit() */ +#include + +#if defined(_WIN32) && !defined(GLUT_DISABLE_ATEXIT_HACK) && !defined(__WATCOMC__) +FGAPI int FGAPIENTRY __glutCreateMenuUcallWithExit(void(*func)(int, void*), void(__cdecl *exitfunc)(int), void* user_data); +#ifndef FREEGLUT_BUILDING_LIB +#if defined(__GNUC__) +#define FGUNUSED __attribute__((unused)) +#else +#define FGUNUSED +#endif +static int FGAPIENTRY FGUNUSED glutCreateMenuUcall_ATEXIT_HACK(void(*func)(int, void*), void* user_data) { return __glutCreateMenuUcallWithExit(func, exit, user_data); } +#define glutCreateMenuUcall glutCreateMenuUcall_ATEXIT_HACK +#endif +#endif + +#ifdef __cplusplus + } +#endif + +/*** END OF FILE ***/ + +#endif /* __FREEGLUT_UCALL_H__ */ + diff --git a/third_party/FreeGLUT/x64-Release/lib/cmake/FreeGLUT/FreeGLUTConfig.cmake b/third_party/FreeGLUT/x64-Release/lib/cmake/FreeGLUT/FreeGLUTConfig.cmake new file mode 100644 index 0000000..ac36b6c --- /dev/null +++ b/third_party/FreeGLUT/x64-Release/lib/cmake/FreeGLUT/FreeGLUTConfig.cmake @@ -0,0 +1 @@ +include("${CMAKE_CURRENT_LIST_DIR}/FreeGLUTTargets.cmake") diff --git a/third_party/FreeGLUT/x64-Release/lib/cmake/FreeGLUT/FreeGLUTConfigVersion.cmake b/third_party/FreeGLUT/x64-Release/lib/cmake/FreeGLUT/FreeGLUTConfigVersion.cmake new file mode 100644 index 0000000..00f6f0c --- /dev/null +++ b/third_party/FreeGLUT/x64-Release/lib/cmake/FreeGLUT/FreeGLUTConfigVersion.cmake @@ -0,0 +1,48 @@ +# This is a basic version file for the Config-mode of find_package(). +# It is used by write_basic_package_version_file() as input file for configure_file() +# to create a version-file which can be installed along a config.cmake file. +# +# The created file sets PACKAGE_VERSION_EXACT if the current version string and +# the requested version string are exactly the same and it sets +# PACKAGE_VERSION_COMPATIBLE if the current version is >= requested version. +# The variable CVF_VERSION must be set before calling configure_file(). + +set(PACKAGE_VERSION "3.4.0") + +if (PACKAGE_FIND_VERSION_RANGE) + # Package version must be in the requested version range + if ((PACKAGE_FIND_VERSION_RANGE_MIN STREQUAL "INCLUDE" AND PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION_MIN) + OR ((PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "INCLUDE" AND PACKAGE_VERSION VERSION_GREATER PACKAGE_FIND_VERSION_MAX) + OR (PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "EXCLUDE" AND PACKAGE_VERSION VERSION_GREATER_EQUAL PACKAGE_FIND_VERSION_MAX))) + set(PACKAGE_VERSION_COMPATIBLE FALSE) + else() + set(PACKAGE_VERSION_COMPATIBLE TRUE) + endif() +else() + if(PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION) + set(PACKAGE_VERSION_COMPATIBLE FALSE) + else() + set(PACKAGE_VERSION_COMPATIBLE TRUE) + if(PACKAGE_FIND_VERSION STREQUAL PACKAGE_VERSION) + set(PACKAGE_VERSION_EXACT TRUE) + endif() + endif() +endif() + + +# if the installed project requested no architecture check, don't perform the check +if("FALSE") + return() +endif() + +# if the installed or the using project don't have CMAKE_SIZEOF_VOID_P set, ignore it: +if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "" OR "8" STREQUAL "") + return() +endif() + +# check that the installed version has the same 32/64bit-ness as the one which is currently searching: +if(NOT CMAKE_SIZEOF_VOID_P STREQUAL "8") + math(EXPR installedBits "8 * 8") + set(PACKAGE_VERSION "${PACKAGE_VERSION} (${installedBits}bit)") + set(PACKAGE_VERSION_UNSUITABLE TRUE) +endif() diff --git a/third_party/FreeGLUT/x64-Release/lib/cmake/FreeGLUT/FreeGLUTTargets-relwithdebinfo.cmake b/third_party/FreeGLUT/x64-Release/lib/cmake/FreeGLUT/FreeGLUTTargets-relwithdebinfo.cmake new file mode 100644 index 0000000..cb3702b --- /dev/null +++ b/third_party/FreeGLUT/x64-Release/lib/cmake/FreeGLUT/FreeGLUTTargets-relwithdebinfo.cmake @@ -0,0 +1,29 @@ +#---------------------------------------------------------------- +# Generated CMake target import file for configuration "RelWithDebInfo". +#---------------------------------------------------------------- + +# Commands may need to know the format version. +set(CMAKE_IMPORT_FILE_VERSION 1) + +# Import target "FreeGLUT::freeglut" for configuration "RelWithDebInfo" +set_property(TARGET FreeGLUT::freeglut APPEND PROPERTY IMPORTED_CONFIGURATIONS RELWITHDEBINFO) +set_target_properties(FreeGLUT::freeglut PROPERTIES + IMPORTED_IMPLIB_RELWITHDEBINFO "${_IMPORT_PREFIX}/lib/freeglut.lib" + IMPORTED_LOCATION_RELWITHDEBINFO "${_IMPORT_PREFIX}/bin/freeglut.dll" + ) + +list(APPEND _IMPORT_CHECK_TARGETS FreeGLUT::freeglut ) +list(APPEND _IMPORT_CHECK_FILES_FOR_FreeGLUT::freeglut "${_IMPORT_PREFIX}/lib/freeglut.lib" "${_IMPORT_PREFIX}/bin/freeglut.dll" ) + +# Import target "FreeGLUT::freeglut_static" for configuration "RelWithDebInfo" +set_property(TARGET FreeGLUT::freeglut_static APPEND PROPERTY IMPORTED_CONFIGURATIONS RELWITHDEBINFO) +set_target_properties(FreeGLUT::freeglut_static PROPERTIES + IMPORTED_LINK_INTERFACE_LANGUAGES_RELWITHDEBINFO "C;RC" + IMPORTED_LOCATION_RELWITHDEBINFO "${_IMPORT_PREFIX}/lib/freeglut_static.lib" + ) + +list(APPEND _IMPORT_CHECK_TARGETS FreeGLUT::freeglut_static ) +list(APPEND _IMPORT_CHECK_FILES_FOR_FreeGLUT::freeglut_static "${_IMPORT_PREFIX}/lib/freeglut_static.lib" ) + +# Commands beyond this point should not need to know the version. +set(CMAKE_IMPORT_FILE_VERSION) diff --git a/third_party/FreeGLUT/x64-Release/lib/cmake/FreeGLUT/FreeGLUTTargets.cmake b/third_party/FreeGLUT/x64-Release/lib/cmake/FreeGLUT/FreeGLUTTargets.cmake new file mode 100644 index 0000000..fe79d0d --- /dev/null +++ b/third_party/FreeGLUT/x64-Release/lib/cmake/FreeGLUT/FreeGLUTTargets.cmake @@ -0,0 +1,108 @@ +# Generated by CMake + +if("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" LESS 2.5) + message(FATAL_ERROR "CMake >= 2.6.0 required") +endif() +cmake_policy(PUSH) +cmake_policy(VERSION 2.6...3.18) +#---------------------------------------------------------------- +# Generated CMake target import file. +#---------------------------------------------------------------- + +# Commands may need to know the format version. +set(CMAKE_IMPORT_FILE_VERSION 1) + +# Protect against multiple inclusion, which would fail when already imported targets are added once more. +set(_targetsDefined) +set(_targetsNotDefined) +set(_expectedTargets) +foreach(_expectedTarget FreeGLUT::freeglut FreeGLUT::freeglut_static) + list(APPEND _expectedTargets ${_expectedTarget}) + if(NOT TARGET ${_expectedTarget}) + list(APPEND _targetsNotDefined ${_expectedTarget}) + endif() + if(TARGET ${_expectedTarget}) + list(APPEND _targetsDefined ${_expectedTarget}) + endif() +endforeach() +if("${_targetsDefined}" STREQUAL "${_expectedTargets}") + unset(_targetsDefined) + unset(_targetsNotDefined) + unset(_expectedTargets) + set(CMAKE_IMPORT_FILE_VERSION) + cmake_policy(POP) + return() +endif() +if(NOT "${_targetsDefined}" STREQUAL "") + message(FATAL_ERROR "Some (but not all) targets in this export set were already defined.\nTargets Defined: ${_targetsDefined}\nTargets not yet defined: ${_targetsNotDefined}\n") +endif() +unset(_targetsDefined) +unset(_targetsNotDefined) +unset(_expectedTargets) + + +# Compute the installation prefix relative to this file. +get_filename_component(_IMPORT_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH) +get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) +get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) +get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) +if(_IMPORT_PREFIX STREQUAL "/") + set(_IMPORT_PREFIX "") +endif() + +# Create imported target FreeGLUT::freeglut +add_library(FreeGLUT::freeglut SHARED IMPORTED) + +set_target_properties(FreeGLUT::freeglut PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include" + INTERFACE_LINK_LIBRARIES "opengl32;winmm;gdi32" +) + +# Create imported target FreeGLUT::freeglut_static +add_library(FreeGLUT::freeglut_static STATIC IMPORTED) + +set_target_properties(FreeGLUT::freeglut_static PROPERTIES + INTERFACE_COMPILE_DEFINITIONS "FREEGLUT_STATIC" + INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include" + INTERFACE_LINK_LIBRARIES "opengl32;winmm;gdi32" +) + +if(CMAKE_VERSION VERSION_LESS 2.8.12) + message(FATAL_ERROR "This file relies on consumers using CMake 2.8.12 or greater.") +endif() + +# Load information for each installed configuration. +get_filename_component(_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) +file(GLOB CONFIG_FILES "${_DIR}/FreeGLUTTargets-*.cmake") +foreach(f ${CONFIG_FILES}) + include(${f}) +endforeach() + +# Cleanup temporary variables. +set(_IMPORT_PREFIX) + +# Loop over all imported files and verify that they actually exist +foreach(target ${_IMPORT_CHECK_TARGETS} ) + foreach(file ${_IMPORT_CHECK_FILES_FOR_${target}} ) + if(NOT EXISTS "${file}" ) + message(FATAL_ERROR "The imported target \"${target}\" references the file + \"${file}\" +but this file does not exist. Possible reasons include: +* The file was deleted, renamed, or moved to another location. +* An install or uninstall procedure did not complete successfully. +* The installation package was faulty and contained + \"${CMAKE_CURRENT_LIST_FILE}\" +but not all the files it references. +") + endif() + endforeach() + unset(_IMPORT_CHECK_FILES_FOR_${target}) +endforeach() +unset(_IMPORT_CHECK_TARGETS) + +# This file does not depend on other imported targets which have +# been exported from the same project but in a separate export set. + +# Commands beyond this point should not need to know the version. +set(CMAKE_IMPORT_FILE_VERSION) +cmake_policy(POP) diff --git a/third_party/FreeGLUT/x64-Release/lib/freeglut.lib b/third_party/FreeGLUT/x64-Release/lib/freeglut.lib new file mode 100644 index 0000000000000000000000000000000000000000..ab658fc02bdee6c46dba8e3c9cad43f337280bb6 GIT binary patch literal 45834 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 literal 0 HcmV?d00001 diff --git a/third_party/FreeGLUT/x64-Release/lib/freeglut_static.lib b/third_party/FreeGLUT/x64-Release/lib/freeglut_static.lib new file mode 100644 index 0000000000000000000000000000000000000000..c5c3dbfe3c53edf01304920f42a2b9f21cabcc9b GIT binary patch literal 1511128 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

%1%2
%1
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 z℘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�M9Ny*{`3p^@0X=!ay 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
  • a6-?~fXDe^!>Vs(CZ$W$-44vg$=8HUD9n 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π;X;bHdqy3h8ndM~h%Re73Mn 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 literal 0 HcmV?d00001 diff --git a/third_party/FreeGLUT/x64-Release/lib/pkgconfig/freeglut.pc b/third_party/FreeGLUT/x64-Release/lib/pkgconfig/freeglut.pc new file mode 100644 index 0000000..39c28c4 --- /dev/null +++ b/third_party/FreeGLUT/x64-Release/lib/pkgconfig/freeglut.pc @@ -0,0 +1,10 @@ +prefix=C:/Users/fawei/Documents/freeglut-3.4.0/out/install/x64-Release +libdir=C:/Users/fawei/Documents/freeglut-3.4.0/out/install/x64-Release/lib +includedir=${prefix}/include + +Name: glut +Description: A freely licensed and improved alternative to the GLUT library +Version: 3.4.0 +Libs: -L${libdir} -lfreeglut +Libs.private: -lopengl32 -lwinmm -lgdi32 +Cflags: -I${includedir} -DFREEGLUT_STATIC -- Gitee From 2360eb5f7926afc224ba63813505b70afdf47c63 Mon Sep 17 00:00:00 2001 From: ray-amcax <13692933+ray-amcax@user.noreply.gitee.com> Date: Thu, 28 Mar 2024 17:13:27 +0800 Subject: [PATCH 3/3] remove test image --- Resources/images/test.png | Bin 55714 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 Resources/images/test.png diff --git a/Resources/images/test.png b/Resources/images/test.png deleted file mode 100644 index 1600eff18aecb1c764e690663b9b3605a8aa5661..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55714 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%0DlI43-+7tj_~XCOs2kkhg- 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