diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..fc57dcf
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,82 @@
+#cmake最低版本
+cmake_minimum_required(VERSION 3.19)
+
+SET(VCPKG_ROOT ${PROJECT_SOURCE_DIR}/vcpkg)
+SET(VCPKG_TARGET_TRIPLET "x64-mingw-static")
+SET(CMAKE_C_COMPILER "x86_64-w64-mingw32-gcc.exe")
+SET(CMAKE_CXX_COMPILER "x86_64-w64-mingw32-g++.exe")
+#项目版本
+project(aicam VERSION 1.0.0 LANGUAGES CXX)
+
+#设置C++版本
+SET(CMAKE_CXX_STANDARD 17)
+
+#包含所有.h文件
+SET(CMAKE_INCLUDE_CURRENT_DIR ON)
+
+#release编译下依然输出符号和行号
+ADD_DEFINITIONS(-DQT_MESSAGELOGCONTEXT)
+
+#编译类型 debug和release输出路径
+SET(CMAKE_VERBOSE_MAKEFILE ON)
+SET(CMAKE_CXX_FLAGS"-Wall -Wextra")
+SET(CMAKE_CXX_FLAGS_RELEASE"-O3 -s")
+SET(CMAKE_BUILD_TYPE "Release")
+
+#增加QT库
+#设置moc ui rcc编译开关
+SET(CMAKE_AUTOMOC ON)
+SET(CMAKE_AUTOUIC ON)
+SET(CMAKE_AUTORCC ON)
+SET(QT_STATU "static")
+
+if(QT_STATU STREQUAL "dynamic")
+ SET(Qt6_DIR "D:/Dev/Qt/6.9.1/mingw_64/lib/cmake")
+else()
+ SET(Qt6_DIR "D:/Dev/Qt/6.9.1/mingw1310_static_x64/lib/cmake")
+endif()
+#输出路径
+MESSAGE(STATUS "----------基础路径输出 START-------------")
+MESSAGE(STATUS "QT_DIR_PATH=${Qt6_DIR}")
+MESSAGE(STATUS "MSYS2_DIR_PATH=${MSYS_DIR}")
+MESSAGE(STATUS "JSON_DIR_PATH=${JSON}")
+MESSAGE(STATUS "CMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}")
+MESSAGE(STATUS "----------基础路径输出 END---------------")
+
+
+MESSAGE(STATUS ${PROJECT_BINARY_DIR})
+MESSAGE(STATUS "----------编译模式 START-------------")
+if(NOT CMAKE_BUILD_TYPE)
+ MESSAGE(STATUS "[CMAKE_BUILD_TYPE]当前值[Debug]")
+ SET(CMAKE_BUILD_TYPE "Debug")
+ SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/build/debug)
+else()
+ MESSAGE(STATUS "[CMAKE_BUILD_TYPE]当前值[Release]")
+ SET(CMAKE_BUILD_TYPE "Release")
+ SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/release/)
+endif()
+ MESSAGE(STATUS "----------编译模式 END---------------")
+
+#增加sui的cpp
+FILE(GLOB src_aicam "${PROJECT_SOURCE_DIR}/src/*.cpp" "${PROJECT_SOURCE_DIR}/src/*.h")
+
+SET(PROJECT_SOURCES ${src_aicam})
+QT6_ADD_RESOURCES(RCFILES aicam.qrc)
+find_package(OpenCASCADE CONFIG REQUIRED)
+
+#WIN32
+add_executable(${PROJECT_NAME} ${PROJECT_SOURCES} ${RCFILES} aicam.rc)
+# 设置编译器标志
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libstdc++ -static-libgcc")
+set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libstdc++ -static-libgcc -static")
+# 如果你的项目包含 C 代码,也需要设置 C 标志
+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -static-libgcc")
+
+target_link_libraries(
+ ${PROJECT_NAME} PRIVATE Qt6::Core Qt6::Gui Qt6::Widgets TKBO TKDE TKBin TKCAF
+ -lws2_32
+ -lzstd
+ -lb2
+)
+
+
diff --git a/CMakePresets.json b/CMakePresets.json
new file mode 100644
index 0000000..91284a7
--- /dev/null
+++ b/CMakePresets.json
@@ -0,0 +1,32 @@
+{
+ "version": 8,
+ "configurePresets": [
+ {
+ "name": "msys2-ucrt-mingw64",
+ "displayName": "GCC 14.2.0 x86_64-w64-mingw32 (ucrt64)",
+ "description": "正在使用编译器: C = D:\\Dev\\msys64\\ucrt64\\bin\\gcc.exe, CXX = D:\\Dev\\msys64\\ucrt64\\bin\\g++.exe",
+ "generator": "MinGW Makefiles",
+ "binaryDir": "${sourceDir}/build/${presetName}",
+ "cacheVariables": {
+ "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}",
+ "CMAKE_C_COMPILER": "D:/Dev/msys64/ucrt64/bin/gcc.exe",
+ "CMAKE_CXX_COMPILER": "D:/Dev/msys64/ucrt64/bin/g++.exe",
+ "CMAKE_BUILD_TYPE": "Release"
+ }
+ },
+ {
+ "name": "vcpkg-mingw-x64",
+ "generator": "Ninja",
+ "binaryDir": "${sourceDir}/build",
+ "cacheVariables": {
+ "CMAKE_BUILD_TYPE":"Release",
+ "CMAKE_MAKE_PROGRAM": "ninja.exe",
+ "CMAKE_C_COMPILER": "x86_64-w64-mingw32-gcc.exe",
+ "CMAKE_CXX_COMPILER": "x86_64-w64-mingw32-g++.exe",
+ "VCPKG_TARGET_TRIPLET":"x64-mingw-static",
+ "VCPKG_HOST_TRIPLET":"x64-mingw-static",
+ "CMAKE_TOOLCHAIN_FILE": "${sourceDir}/vcpkg/scripts/buildsystems/vcpkg.cmake"
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/README.md b/README.md
index c0aeed5..58521ae 100644
--- a/README.md
+++ b/README.md
@@ -1 +1 @@
-AICAM
\ No newline at end of file
+##AICam
\ No newline at end of file
diff --git a/aicam.qrc b/aicam.qrc
new file mode 100644
index 0000000..6b964e7
--- /dev/null
+++ b/aicam.qrc
@@ -0,0 +1,48 @@
+
+
+ res/icons/3dModel.png
+ res/icons/add.png
+ res/icons/axis.png
+ res/icons/colors.svg
+ res/icons/cursor_rotate.png
+ res/icons/cursor_zoom.png
+ res/icons/datumPln.png
+ res/icons/delete.svg
+ res/icons/DrawStyleFlatLines.svg
+ res/icons/DrawStyleShaded.svg
+ res/icons/DrawStyleWireFrame.svg
+ res/icons/edge-selection.svg
+ res/icons/edit_OK.svg
+ res/icons/edit-delete.svg
+ res/icons/face-selection.svg
+ res/icons/help.png
+ res/icons/hide.png
+ res/icons/hideAll.png
+ res/icons/license.png
+ res/icons/linear.png
+ res/icons/Material.svg
+ res/icons/new_file.png
+ res/icons/point.png
+ res/icons/print.png
+ res/icons/quit.png
+ res/icons/run.png
+ res/icons/saveAs.png
+ res/icons/sel-bbox.svg
+ res/icons/set.png
+ res/icons/show.png
+ res/icons/showAll.png
+ res/icons/triangle.png
+ res/icons/utilities-terminal.svg
+ res/icons/vertex-selection.svg
+ res/icons/view-axonometric.svg
+ res/icons/view-bottom.svg
+ res/icons/view-front.svg
+ res/icons/view-fullscreen.svg
+ res/icons/view-left.svg
+ res/icons/view-rear.svg
+ res/icons/view-right.svg
+ res/icons/view-select.svg
+ res/icons/view-top.svg
+ res/icons/perspective.png
+
+
diff --git a/aicam.rc b/aicam.rc
new file mode 100644
index 0000000..25010dd
--- /dev/null
+++ b/aicam.rc
@@ -0,0 +1 @@
+IDI_ICON1 ICON DISCARDABLE "res\\img\\aicam.ico"
\ No newline at end of file
diff --git a/release/aicam.exe b/release/aicam.exe
new file mode 100644
index 0000000..770575e
Binary files /dev/null and b/release/aicam.exe differ
diff --git a/release/ef.igs b/release/ef.igs
new file mode 100644
index 0000000..3ea03b1
--- /dev/null
+++ b/release/ef.igs
@@ -0,0 +1,3553 @@
+ S 1
+1H,,1H;,8H.prt,6Hef.igs,8HNX V2506,32HSIEMENS PLM Software NX2506.50G 1
+01,32,38,16,38,16,8H.prt,1.0,2,2HMM,300,2.0,15H20251007.194621, G 2
+1.0E-05,10000.0,,,11,0,15H20250731.151000; G 3
+ 406 1 1 1 0 0 10000D 1
+ 406 27 0 1 1 0D 2
+ 406 2 1 -1 0 0 D 3
+ 406 27 0 1 3 0D 4
+ 406 3 1 1 0 0 10000D 5
+ 406 27 0 1 1 0D 6
+ 406 4 1 -5 0 0 D 7
+ 406 27 0 1 3 0D 8
+ 406 5 1 1 0 0 10000D 9
+ 406 27 0 2 1 0D 10
+ 406 7 1 -9 0 0 D 11
+ 406 27 0 1 3 0D 12
+ 406 8 1 1 0 0 10000D 13
+ 406 27 0 2 1 0D 14
+ 406 10 1 -13 0 0 D 15
+ 406 27 0 1 3 0D 16
+ 406 11 1 1 0 0 10000D 17
+ 406 27 0 2 1 0D 18
+ 406 13 1 -17 0 0 D 19
+ 406 27 0 1 3 0D 20
+ 124 14 1 1 0 0 0D 21
+ 124 27 0 1 0 0D 22
+ 314 15 1 1 0 0 200D 23
+ 314 27 4 1 0 0D 24
+ 116 16 1 61 0 21 0D 25
+ 116 75 -23 1 0 0D 26
+ 314 17 1 1 0 0 200D 27
+ 314 27 4 2 0 0D 28
+ 406 19 1 1 0 0 10000D 29
+ 406 27 0 1 15 0D 30
+ 110 20 1 1 0 21 1000000D 31
+ 110 105 -27 1 0 Line9 9D 32
+ 406 21 1 1 0 0 10000D 33
+ 406 27 0 1 15 0D 34
+ 110 22 1 1 0 21 1000000D 35
+ 110 105 -27 1 0 Line10 10D 36
+ 406 23 1 1 0 0 10000D 37
+ 406 27 0 1 15 0D 38
+ 110 24 1 1 0 21 1000000D 39
+ 110 105 -27 1 0 Line11 11D 40
+ 406 25 1 1 0 0 10000D 41
+ 406 27 0 1 15 0D 42
+ 110 26 1 1 0 21 1000000D 43
+ 110 105 -27 2 0 Line12 12D 44
+ 406 28 1 1 0 0 10000D 45
+ 406 27 0 1 15 0D 46
+ 110 29 3 1 0 21 1000000D 47
+ 110 105 -27 1 0 Line13 13D 48
+ 406 30 1 1 0 0 10000D 49
+ 406 27 0 1 15 0D 50
+ 110 31 1 1 0 21 1000000D 51
+ 110 105 -27 1 0 Line15 15D 52
+ 406 32 1 1 0 0 10000D 53
+ 406 27 0 1 15 0D 54
+ 110 33 1 1 0 21 1000000D 55
+ 110 105 -27 2 0 Line19 19D 56
+ 406 35 1 1 0 0 10000D 57
+ 406 27 0 1 15 0D 58
+ 110 36 1 1 0 21 1000000D 59
+ 110 105 -27 1 0 Line20 20D 60
+ 406 37 1 1 0 0 10000D 61
+ 406 27 0 1 15 0D 62
+ 110 38 1 1 0 21 1000000D 63
+ 110 105 -27 1 0 Line21 21D 64
+ 110 39 1 1 0 21 1000000D 65
+ 110 105 -27 1 0 0D 66
+ 110 40 1 1 0 21 1000000D 67
+ 110 105 -27 1 0 0D 68
+ 406 41 1 1 0 0 10000D 69
+ 406 27 0 1 15 0D 70
+ 110 42 1 1 0 21 1000000D 71
+ 110 105 -27 2 0 Line22 22D 72
+ 406 44 1 1 0 0 10000D 73
+ 406 27 0 1 15 0D 74
+ 110 45 1 1 0 21 1000000D 75
+ 110 105 -27 2 0 Line23 23D 76
+ 406 47 1 1 0 0 10000D 77
+ 406 27 0 1 15 0D 78
+ 110 48 1 1 0 21 1000000D 79
+ 110 105 -27 2 0 Line24 24D 80
+ 406 50 1 1 0 0 10000D 81
+ 406 27 0 1 15 0D 82
+ 110 51 1 1 0 21 1000000D 83
+ 110 105 -27 1 0 Line26 26D 84
+ 406 52 1 1 0 0 10000D 85
+ 406 27 0 1 15 0D 86
+ 110 53 1 1 0 21 1000000D 87
+ 110 105 -27 1 0 Line27 27D 88
+ 406 54 1 1 0 0 10000D 89
+ 406 27 0 1 15 0D 90
+ 110 55 1 1 0 21 1000000D 91
+ 110 105 -27 1 0 Line28 28D 92
+ 110 56 1 1 0 21 1000000D 93
+ 110 105 -27 1 0 0D 94
+ 110 57 1 1 0 21 1000000D 95
+ 110 105 -27 1 0 0D 96
+ 406 58 1 1 0 0 10000D 97
+ 406 27 0 1 15 0D 98
+ 110 59 1 1 0 21 1000000D 99
+ 110 105 -27 2 0 Line29 29D 100
+ 406 61 1 1 0 0 10000D 101
+ 406 27 0 1 15 0D 102
+ 110 62 3 1 0 21 1000000D 103
+ 110 105 -27 1 0 Line30 30D 104
+ 406 63 1 1 0 0 10000D 105
+ 406 27 0 1 15 0D 106
+ 110 64 1 1 0 21 1000000D 107
+ 110 105 -27 2 0 Line32 32D 108
+ 406 66 1 1 0 0 10000D 109
+ 406 27 0 1 15 0D 110
+ 110 67 3 1 0 21 1000000D 111
+ 110 105 -27 2 0 Line34 34D 112
+ 406 69 1 1 0 0 10000D 113
+ 406 27 0 1 15 0D 114
+ 110 70 1 1 0 21 1000000D 115
+ 110 105 -27 2 0 Line35 35D 116
+ 406 72 1 1 0 0 10000D 117
+ 406 27 0 1 15 0D 118
+ 110 73 1 1 0 21 1000000D 119
+ 110 105 -27 2 0 Line37 37D 120
+ 406 75 1 1 0 0 10000D 121
+ 406 27 0 1 15 0D 122
+ 110 76 1 1 0 21 1000000D 123
+ 110 105 -27 2 0 Line38 38D 124
+ 406 78 1 1 0 0 10000D 125
+ 406 27 0 1 15 0D 126
+ 100 79 1 1 0 21 1000000D 127
+ 100 105 -27 1 0 Arc1 1D 128
+ 124 80 1 1 0 0 0D 129
+ 124 27 0 2 0 0D 130
+ 406 82 1 1 0 0 10000D 131
+ 406 27 0 1 15 0D 132
+ 100 83 1 1 0 129 1000000D 133
+ 100 105 -27 2 0 Arc2 2D 134
+ 406 85 1 1 0 0 10000D 135
+ 406 27 0 1 15 0D 136
+ 100 86 1 1 0 129 1000000D 137
+ 100 105 -27 2 0 Arc3 3D 138
+ 406 88 1 1 0 0 10000D 139
+ 406 27 0 1 15 0D 140
+ 100 89 1 1 0 129 1000000D 141
+ 100 105 -27 3 0 Arc4 4D 142
+ 406 92 1 1 0 0 10000D 143
+ 406 27 0 1 15 0D 144
+ 100 93 1 1 0 129 1000000D 145
+ 100 105 -27 3 0 Arc5 5D 146
+ 406 96 1 1 0 0 10000D 147
+ 406 27 0 1 15 0D 148
+ 100 97 1 1 0 129 1000000D 149
+ 100 105 -27 2 0 Arc6 6D 150
+ 406 99 1 1 0 0 10000D 151
+ 406 27 0 1 15 0D 152
+ 100 100 1 1 0 129 1000000D 153
+ 100 105 -27 2 0 Arc7 7D 154
+ 108 102 1 1 0 0 10100D 155
+ 108 27 0 2 0 0D 156
+ 108 104 1 1 0 0 10100D 157
+ 108 27 0 2 0 0D 158
+ 108 106 1 1 0 0 10100D 159
+ 108 27 0 1 0 0D 160
+ 108 107 1 1 0 0 10100D 161
+ 108 27 0 1 0 0D 162
+ 406 108 1 1 0 0 10000D 163
+ 406 27 0 1 15 0D 164
+ 410 109 1 256 0 21 100D 165
+ 410 27 0 1 0 TOP 0D 166
+ 124 110 1 1 0 0 0D 167
+ 124 27 0 1 0 0D 168
+ 108 111 1 1 0 0 10100D 169
+ 108 27 0 2 0 0D 170
+ 108 113 1 1 0 0 10100D 171
+ 108 27 0 2 0 0D 172
+ 108 115 1 1 0 0 10100D 173
+ 108 27 0 2 0 0D 174
+ 108 117 1 1 0 0 10100D 175
+ 108 27 0 2 0 0D 176
+ 406 119 1 1 0 0 10000D 177
+ 406 27 0 1 15 0D 178
+ 410 120 1 256 0 167 100D 179
+ 410 27 0 1 0 FRONT 0D 180
+ 124 121 1 1 0 0 0D 181
+ 124 27 0 1 0 0D 182
+ 108 122 1 1 0 0 10100D 183
+ 108 27 0 1 0 0D 184
+ 108 123 1 1 0 0 10100D 185
+ 108 27 0 1 0 0D 186
+ 108 124 1 1 0 0 10100D 187
+ 108 27 0 2 0 0D 188
+ 108 126 1 1 0 0 10100D 189
+ 108 27 0 2 0 0D 190
+ 406 128 1 1 0 0 10000D 191
+ 406 27 0 1 15 0D 192
+ 410 129 1 256 0 181 100D 193
+ 410 27 0 1 0 RIGHT 0D 194
+ 124 130 1 1 0 0 0D 195
+ 124 27 0 1 0 0D 196
+ 108 131 1 1 0 0 10100D 197
+ 108 27 0 2 0 0D 198
+ 108 133 1 1 0 0 10100D 199
+ 108 27 0 2 0 0D 200
+ 108 135 1 1 0 0 10100D 201
+ 108 27 0 2 0 0D 202
+ 108 137 1 1 0 0 10100D 203
+ 108 27 0 2 0 0D 204
+ 406 139 1 1 0 0 10000D 205
+ 406 27 0 1 15 0D 206
+ 410 140 1 256 0 195 100D 207
+ 410 27 0 1 0 BACK 0D 208
+ 124 141 1 1 0 0 0D 209
+ 124 27 0 1 0 0D 210
+ 108 142 1 1 0 0 10100D 211
+ 108 27 0 2 0 0D 212
+ 108 144 1 1 0 0 10100D 213
+ 108 27 0 2 0 0D 214
+ 108 146 1 1 0 0 10100D 215
+ 108 27 0 1 0 0D 216
+ 108 147 1 1 0 0 10100D 217
+ 108 27 0 1 0 0D 218
+ 406 148 1 1 0 0 10000D 219
+ 406 27 0 1 15 0D 220
+ 410 149 1 256 0 209 100D 221
+ 410 27 0 1 0 BOTTOM 0D 222
+ 124 150 1 1 0 0 0D 223
+ 124 27 0 1 0 0D 224
+ 108 151 1 1 0 0 10100D 225
+ 108 27 0 1 0 0D 226
+ 108 152 1 1 0 0 10100D 227
+ 108 27 0 1 0 0D 228
+ 108 153 1 1 0 0 10100D 229
+ 108 27 0 2 0 0D 230
+ 108 155 1 1 0 0 10100D 231
+ 108 27 0 2 0 0D 232
+ 406 157 1 1 0 0 10000D 233
+ 406 27 0 1 15 0D 234
+ 410 158 1 256 0 223 100D 235
+ 410 27 0 1 0 LEFT 0D 236
+ 124 159 1 1 0 0 0D 237
+ 124 27 0 3 0 0D 238
+ 108 162 1 1 0 0 10100D 239
+ 108 27 0 2 0 0D 240
+ 108 164 1 1 0 0 10100D 241
+ 108 27 0 2 0 0D 242
+ 108 166 1 1 0 0 10100D 243
+ 108 27 0 3 0 0D 244
+ 108 169 1 1 0 0 10100D 245
+ 108 27 0 3 0 0D 246
+ 406 172 1 1 0 0 10000D 247
+ 406 27 0 1 15 0D 248
+ 410 173 1 256 0 237 100D 249
+ 410 27 0 1 0 TFR-ISO 0D 250
+ 124 174 1 1 0 0 0D 251
+ 124 27 0 3 0 0D 252
+ 108 177 1 1 0 0 10100D 253
+ 108 27 0 2 0 0D 254
+ 108 179 1 1 0 0 10100D 255
+ 108 27 0 2 0 0D 256
+ 108 181 1 1 0 0 10100D 257
+ 108 27 0 3 0 0D 258
+ 108 184 1 1 0 0 10100D 259
+ 108 27 0 3 0 0D 260
+ 406 187 1 1 0 0 10000D 261
+ 406 27 0 1 15 0D 262
+ 410 188 1 256 0 251 100D 263
+ 410 27 0 1 0 TFR-TRI 0D 264
+ 124 189 1 1 0 0 0D 265
+ 124 27 0 1 0 0D 266
+ 124 190 1 1 0 0 0D 267
+ 124 27 0 1 0 0D 268
+ 314 191 1 1 0 0 200D 269
+ 314 27 8 2 0 0D 270
+ 128 193 1 1 0 21 10000D 271
+ 128 53 -269 14 0 0D 272
+ 126 207 1 1 0 0 10500D 273
+ 126 53 -269 2 0 0D 274
+ 126 209 1 1 0 0 10500D 275
+ 126 53 -269 2 0 0D 276
+ 126 211 1 1 0 0 10500D 277
+ 126 53 -269 2 0 0D 278
+ 126 213 1 1 0 0 10500D 279
+ 126 53 -269 2 0 0D 280
+ 102 215 1 1 0 21 10500D 281
+ 102 53 -269 1 0 0D 282
+ 100 216 1 1 0 265 10000D 283
+ 100 53 -269 2 0 0D 284
+ 110 218 1 1 0 21 10000D 285
+ 110 53 -269 1 0 0D 286
+ 100 219 1 1 0 267 10000D 287
+ 100 53 -269 2 0 0D 288
+ 110 221 1 1 0 21 10000D 289
+ 110 53 -269 2 0 0D 290
+ 102 223 1 1 0 21 10000D 291
+ 102 53 -269 1 0 0D 292
+ 142 224 1 1 0 0 10500D 293
+ 142 53 -269 1 0 0D 294
+ 126 225 1 1 0 0 10500D 295
+ 126 53 -269 26 0 0D 296
+ 126 251 1 1 0 21 10000D 297
+ 126 53 -269 41 0 0D 298
+ 142 292 1 1 0 0 10500D 299
+ 142 53 -269 1 0 0D 300
+ 144 293 1 1 0 21 0D 301
+ 144 53 -269 1 0 0D 302
+ 124 294 1 1 0 0 0D 303
+ 124 27 0 3 0 0D 304
+ 124 297 1 1 0 0 0D 305
+ 124 27 0 3 0 0D 306
+ 124 300 1 1 0 0 0D 307
+ 124 27 0 3 0 0D 308
+ 124 303 1 1 0 0 0D 309
+ 124 27 0 3 0 0D 310
+ 128 306 1 1 0 21 10000D 311
+ 128 53 -269 3 0 0D 312
+ 126 309 1 1 0 0 10500D 313
+ 126 53 -269 28 0 0D 314
+ 100 337 1 1 0 265 10000D 315
+ 100 53 -269 1 0 0D 316
+ 142 338 1 1 0 0 10500D 317
+ 142 53 -269 1 0 0D 318
+ 126 339 1 1 0 0 10500D 319
+ 126 53 -269 15 0 0D 320
+ 100 354 1 1 0 303 10000D 321
+ 100 53 -269 2 0 0D 322
+ 142 356 1 1 0 0 10500D 323
+ 142 53 -269 1 0 0D 324
+ 126 357 1 1 0 0 10500D 325
+ 126 53 -269 15 0 0D 326
+ 100 372 1 1 0 305 10000D 327
+ 100 53 -269 2 0 0D 328
+ 142 374 1 1 0 0 10500D 329
+ 142 53 -269 1 0 0D 330
+ 126 375 1 1 0 0 10500D 331
+ 126 53 -269 15 0 0D 332
+ 100 390 1 1 0 267 10000D 333
+ 100 53 -269 2 0 0D 334
+ 142 392 1 1 0 0 10500D 335
+ 142 53 -269 1 0 0D 336
+ 126 393 1 1 0 0 10500D 337
+ 126 53 -269 15 0 0D 338
+ 100 408 1 1 0 307 10000D 339
+ 100 53 -269 2 0 0D 340
+ 142 410 1 1 0 0 10500D 341
+ 142 53 -269 1 0 0D 342
+ 126 411 1 1 0 0 10500D 343
+ 126 53 -269 15 0 0D 344
+ 100 426 1 1 0 309 10000D 345
+ 100 53 -269 2 0 0D 346
+ 142 428 1 1 0 0 10500D 347
+ 142 53 -269 1 0 0D 348
+ 126 429 1 1 0 0 10500D 349
+ 126 53 -269 15 0 0D 350
+ 100 444 1 1 0 209 10000D 351
+ 100 53 -269 2 0 0D 352
+ 142 446 1 1 0 0 10500D 353
+ 142 53 -269 1 0 0D 354
+ 126 447 1 1 0 0 10500D 355
+ 126 53 -269 28 0 0D 356
+ 100 475 1 1 0 209 10000D 357
+ 100 53 -269 2 0 0D 358
+ 142 477 1 1 0 0 10500D 359
+ 142 53 -269 1 0 0D 360
+ 144 478 1 1 0 21 0D 361
+ 144 53 -269 1 0 0D 362
+ 128 479 1 1 0 21 10000D 363
+ 128 53 -269 3 0 0D 364
+ 126 482 1 1 0 0 10500D 365
+ 126 53 -269 29 0 0D 366
+ 100 511 1 1 0 267 10000D 367
+ 100 53 -269 1 0 0D 368
+ 142 512 1 1 0 0 10500D 369
+ 142 53 -269 1 0 0D 370
+ 126 513 1 1 0 0 10500D 371
+ 126 53 -269 15 0 0D 372
+ 100 528 1 1 0 265 10000D 373
+ 100 53 -269 2 0 0D 374
+ 142 530 1 1 0 0 10500D 375
+ 142 53 -269 1 0 0D 376
+ 126 531 1 1 0 0 10500D 377
+ 126 53 -269 15 0 0D 378
+ 100 546 1 1 0 265 10000D 379
+ 100 53 -269 2 0 0D 380
+ 142 548 1 1 0 0 10500D 381
+ 142 53 -269 1 0 0D 382
+ 126 549 1 1 0 0 10500D 383
+ 126 53 -269 15 0 0D 384
+ 100 564 1 1 0 265 10000D 385
+ 100 53 -269 2 0 0D 386
+ 142 566 1 1 0 0 10500D 387
+ 142 53 -269 1 0 0D 388
+ 126 567 1 1 0 0 10500D 389
+ 126 53 -269 15 0 0D 390
+ 100 582 1 1 0 265 10000D 391
+ 100 53 -269 2 0 0D 392
+ 142 584 1 1 0 0 10500D 393
+ 142 53 -269 1 0 0D 394
+ 126 585 1 1 0 0 10500D 395
+ 126 53 -269 15 0 0D 396
+ 100 600 1 1 0 265 10000D 397
+ 100 53 -269 2 0 0D 398
+ 142 602 1 1 0 0 10500D 399
+ 142 53 -269 1 0 0D 400
+ 126 603 1 1 0 0 10500D 401
+ 126 53 -269 15 0 0D 402
+ 100 618 1 1 0 265 10000D 403
+ 100 53 -269 2 0 0D 404
+ 142 620 1 1 0 0 10500D 405
+ 142 53 -269 1 0 0D 406
+ 126 621 1 1 0 0 10500D 407
+ 126 53 -269 28 0 0D 408
+ 100 649 1 1 0 265 10000D 409
+ 100 53 -269 2 0 0D 410
+ 142 651 1 1 0 0 10500D 411
+ 142 53 -269 1 0 0D 412
+ 144 652 1 1 0 21 0D 413
+ 144 53 -269 1 0 0D 414
+ 128 653 1 1 0 21 10000D 415
+ 128 53 -269 9 0 0D 416
+ 126 662 1 1 0 0 10500D 417
+ 126 53 -269 2 0 0D 418
+ 126 664 1 1 0 0 10500D 419
+ 126 53 -269 2 0 0D 420
+ 126 666 1 1 0 0 10500D 421
+ 126 53 -269 2 0 0D 422
+ 126 668 1 1 0 0 10500D 423
+ 126 53 -269 2 0 0D 424
+ 102 670 1 1 0 21 10500D 425
+ 102 53 -269 1 0 0D 426
+ 100 671 1 1 0 267 10000D 427
+ 100 53 -269 1 0 0D 428
+ 110 672 1 1 0 21 10000D 429
+ 110 53 -269 1 0 0D 430
+ 100 673 1 1 0 265 10000D 431
+ 100 53 -269 1 0 0D 432
+ 110 674 1 1 0 21 10000D 433
+ 110 53 -269 1 0 0D 434
+ 102 675 1 1 0 21 10000D 435
+ 102 53 -269 1 0 0D 436
+ 142 676 1 1 0 0 10500D 437
+ 142 53 -269 1 0 0D 438
+ 144 677 1 1 0 21 0D 439
+ 144 53 -269 1 0 0D 440
+ 128 678 1 1 0 21 10000D 441
+ 128 53 -269 5 0 0D 442
+ 126 683 1 1 0 0 10500D 443
+ 126 53 -269 29 0 0D 444
+ 100 712 1 1 0 267 10000D 445
+ 100 53 -269 2 0 0D 446
+ 142 714 1 1 0 0 10500D 447
+ 142 53 -269 1 0 0D 448
+ 126 715 1 1 0 0 10500D 449
+ 126 53 -269 28 0 0D 450
+ 100 743 1 1 0 265 10000D 451
+ 100 53 -269 2 0 0D 452
+ 142 745 1 1 0 0 10500D 453
+ 142 53 -269 1 0 0D 454
+ 144 746 1 1 0 21 0D 455
+ 144 53 -269 1 0 0D 456
+ 128 747 1 1 0 21 10000D 457
+ 128 53 -269 5 0 0D 458
+ 126 752 1 1 0 0 10500D 459
+ 126 53 -269 29 0 0D 460
+ 100 781 1 1 0 267 10000D 461
+ 100 53 -269 2 0 0D 462
+ 142 783 1 1 0 0 10500D 463
+ 142 53 -269 1 0 0D 464
+ 126 784 1 1 0 0 10500D 465
+ 126 53 -269 14 0 0D 466
+ 100 798 1 1 0 265 10000D 467
+ 100 53 -269 1 0 0D 468
+ 142 799 1 1 0 0 10500D 469
+ 142 53 -269 1 0 0D 470
+ 144 800 1 1 0 21 0D 471
+ 144 53 -269 1 0 0D 472
+ 128 801 1 1 0 21 10000D 473
+ 128 53 -269 13 0 0D 474
+ 126 814 1 1 0 0 10500D 475
+ 126 53 -269 2 0 0D 476
+ 126 816 1 1 0 0 10500D 477
+ 126 53 -269 2 0 0D 478
+ 126 818 1 1 0 0 10500D 479
+ 126 53 -269 2 0 0D 480
+ 126 820 1 1 0 0 10500D 481
+ 126 53 -269 2 0 0D 482
+ 102 822 1 1 0 21 10500D 483
+ 102 53 -269 1 0 0D 484
+ 100 823 1 1 0 267 10000D 485
+ 100 53 -269 2 0 0D 486
+ 110 825 1 1 0 21 10000D 487
+ 110 53 -269 1 0 0D 488
+ 100 826 1 1 0 265 10000D 489
+ 100 53 -269 2 0 0D 490
+ 110 828 1 1 0 21 10000D 491
+ 110 53 -269 1 0 0D 492
+ 102 829 1 1 0 21 10000D 493
+ 102 53 -269 1 0 0D 494
+ 142 830 1 1 0 0 10500D 495
+ 142 53 -269 1 0 0D 496
+ 144 831 1 1 0 21 0D 497
+ 144 53 -269 1 0 0D 498
+ 128 832 1 1 0 21 10000D 499
+ 128 53 -269 9 0 0D 500
+ 126 841 1 1 0 0 10500D 501
+ 126 53 -269 2 0 0D 502
+ 126 843 1 1 0 0 10500D 503
+ 126 53 -269 2 0 0D 504
+ 126 845 1 1 0 0 10500D 505
+ 126 53 -269 2 0 0D 506
+ 126 847 1 1 0 0 10500D 507
+ 126 53 -269 2 0 0D 508
+ 126 849 1 1 0 0 10500D 509
+ 126 53 -269 2 0 0D 510
+ 102 851 1 1 0 21 10500D 511
+ 102 53 -269 1 0 0D 512
+ 100 852 1 1 0 267 10000D 513
+ 100 53 -269 1 0 0D 514
+ 110 853 1 1 0 21 10000D 515
+ 110 53 -269 1 0 0D 516
+ 100 854 1 1 0 21 10000D 517
+ 100 53 -269 2 0 0D 518
+ 100 856 1 1 0 21 10000D 519
+ 100 53 -269 2 0 0D 520
+ 110 858 1 1 0 21 10000D 521
+ 110 53 -269 1 0 0D 522
+ 102 859 1 1 0 21 10000D 523
+ 102 53 -269 1 0 0D 524
+ 142 860 1 1 0 0 10500D 525
+ 142 53 -269 1 0 0D 526
+ 144 861 1 1 0 21 0D 527
+ 144 53 -269 1 0 0D 528
+ 128 862 1 1 0 21 10000D 529
+ 128 53 -269 15 0 0D 530
+ 126 877 1 1 0 0 10500D 531
+ 126 53 -269 2 0 0D 532
+ 126 879 1 1 0 0 10500D 533
+ 126 53 -269 2 0 0D 534
+ 126 881 1 1 0 0 10500D 535
+ 126 53 -269 2 0 0D 536
+ 126 883 1 1 0 0 10500D 537
+ 126 53 -269 2 0 0D 538
+ 102 885 1 1 0 21 10500D 539
+ 102 53 -269 1 0 0D 540
+ 100 886 1 1 0 265 10000D 541
+ 100 53 -269 2 0 0D 542
+ 110 888 1 1 0 21 10000D 543
+ 110 53 -269 2 0 0D 544
+ 100 890 1 1 0 267 10000D 545
+ 100 53 -269 2 0 0D 546
+ 110 892 1 1 0 21 10000D 547
+ 110 53 -269 2 0 0D 548
+ 102 894 1 1 0 21 10000D 549
+ 102 53 -269 1 0 0D 550
+ 142 895 1 1 0 0 10500D 551
+ 142 53 -269 1 0 0D 552
+ 126 896 1 1 0 0 10500D 553
+ 126 53 -269 25 0 0D 554
+ 126 921 1 1 0 21 10000D 555
+ 126 53 -269 39 0 0D 556
+ 142 960 1 1 0 0 10500D 557
+ 142 53 -269 1 0 0D 558
+ 144 961 1 1 0 21 0D 559
+ 144 53 -269 1 0 0D 560
+ 128 962 1 1 0 21 10000D 561
+ 128 53 -269 5 0 0D 562
+ 126 967 1 1 0 0 10500D 563
+ 126 53 -269 28 0 0D 564
+ 100 995 1 1 0 265 10000D 565
+ 100 53 -269 2 0 0D 566
+ 142 997 1 1 0 0 10500D 567
+ 142 53 -269 1 0 0D 568
+ 126 998 1 1 0 0 10500D 569
+ 126 53 -269 14 0 0D 570
+ 100 1012 1 1 0 209 10000D 571
+ 100 53 -269 1 0 0D 572
+ 142 1013 1 1 0 0 10500D 573
+ 142 53 -269 1 0 0D 574
+ 144 1014 1 1 0 21 0D 575
+ 144 53 -269 1 0 0D 576
+ 128 1015 1 1 0 21 10000D 577
+ 128 53 -269 17 0 0D 578
+ 126 1032 1 1 0 0 10500D 579
+ 126 53 -269 2 0 0D 580
+ 126 1034 1 1 0 0 10500D 581
+ 126 53 -269 2 0 0D 582
+ 126 1036 1 1 0 0 10500D 583
+ 126 53 -269 2 0 0D 584
+ 126 1038 1 1 0 0 10500D 585
+ 126 53 -269 2 0 0D 586
+ 126 1040 1 1 0 0 10500D 587
+ 126 53 -269 2 0 0D 588
+ 102 1042 1 1 0 21 10500D 589
+ 102 53 -269 1 0 0D 590
+ 100 1043 1 1 0 21 10000D 591
+ 100 53 -269 2 0 0D 592
+ 110 1045 1 1 0 21 10000D 593
+ 110 53 -269 2 0 0D 594
+ 100 1047 1 1 0 267 10000D 595
+ 100 53 -269 2 0 0D 596
+ 110 1049 1 1 0 21 10000D 597
+ 110 53 -269 2 0 0D 598
+ 100 1051 1 1 0 21 10000D 599
+ 100 53 -269 2 0 0D 600
+ 102 1053 1 1 0 21 10000D 601
+ 102 53 -269 1 0 0D 602
+ 142 1054 1 1 0 0 10500D 603
+ 142 53 -269 1 0 0D 604
+ 144 1055 1 1 0 21 0D 605
+ 144 53 -269 1 0 0D 606
+ 128 1056 1 1 0 21 10000D 607
+ 128 53 -269 13 0 0D 608
+ 126 1069 1 1 0 0 10500D 609
+ 126 53 -269 2 0 0D 610
+ 126 1071 1 1 0 0 10500D 611
+ 126 53 -269 2 0 0D 612
+ 126 1073 1 1 0 0 10500D 613
+ 126 53 -269 2 0 0D 614
+ 126 1075 1 1 0 0 10500D 615
+ 126 53 -269 2 0 0D 616
+ 126 1077 1 1 0 0 10500D 617
+ 126 53 -269 2 0 0D 618
+ 102 1079 1 1 0 21 10500D 619
+ 102 53 -269 1 0 0D 620
+ 100 1080 1 1 0 267 10000D 621
+ 100 53 -269 2 0 0D 622
+ 110 1082 1 1 0 21 10000D 623
+ 110 53 -269 2 0 0D 624
+ 100 1084 1 1 0 21 10000D 625
+ 100 53 -269 2 0 0D 626
+ 110 1086 1 1 0 21 10000D 627
+ 110 53 -269 2 0 0D 628
+ 100 1088 1 1 0 267 10000D 629
+ 100 53 -269 2 0 0D 630
+ 102 1090 1 1 0 21 10000D 631
+ 102 53 -269 1 0 0D 632
+ 142 1091 1 1 0 0 10500D 633
+ 142 53 -269 1 0 0D 634
+ 144 1092 1 1 0 21 0D 635
+ 144 53 -269 1 0 0D 636
+ 124 1093 1 1 0 0 0D 637
+ 124 27 0 3 0 0D 638
+ 128 1096 1 1 0 21 10000D 639
+ 128 53 -269 15 0 0D 640
+ 126 1111 1 1 0 0 10500D 641
+ 126 53 -269 3 0 0D 642
+ 126 1114 1 1 0 0 10500D 643
+ 126 53 -269 2 0 0D 644
+ 126 1116 1 1 0 0 10500D 645
+ 126 53 -269 2 0 0D 646
+ 126 1118 1 1 0 0 10500D 647
+ 126 53 -269 2 0 0D 648
+ 126 1120 1 1 0 0 10500D 649
+ 126 53 -269 3 0 0D 650
+ 102 1123 1 1 0 21 10500D 651
+ 102 53 -269 1 0 0D 652
+ 100 1124 1 1 0 267 10000D 653
+ 100 53 -269 2 0 0D 654
+ 110 1126 1 1 0 21 10000D 655
+ 110 53 -269 2 0 0D 656
+ 100 1128 1 1 0 637 10000D 657
+ 100 53 -269 2 0 0D 658
+ 110 1130 1 1 0 21 10000D 659
+ 110 53 -269 2 0 0D 660
+ 100 1132 1 1 0 267 10000D 661
+ 100 53 -269 2 0 0D 662
+ 102 1134 1 1 0 21 10000D 663
+ 102 53 -269 1 0 0D 664
+ 142 1135 1 1 0 0 10500D 665
+ 142 53 -269 1 0 0D 666
+ 144 1136 1 1 0 21 0D 667
+ 144 53 -269 1 0 0D 668
+ 124 1137 1 1 0 0 0D 669
+ 124 27 0 3 0 0D 670
+ 128 1140 1 1 0 21 10000D 671
+ 128 53 -269 15 0 0D 672
+ 126 1155 1 1 0 0 10500D 673
+ 126 53 -269 3 0 0D 674
+ 126 1158 1 1 0 0 10500D 675
+ 126 53 -269 2 0 0D 676
+ 126 1160 1 1 0 0 10500D 677
+ 126 53 -269 2 0 0D 678
+ 126 1162 1 1 0 0 10500D 679
+ 126 53 -269 2 0 0D 680
+ 126 1164 1 1 0 0 10500D 681
+ 126 53 -269 3 0 0D 682
+ 102 1167 1 1 0 21 10500D 683
+ 102 53 -269 1 0 0D 684
+ 100 1168 1 1 0 267 10000D 685
+ 100 53 -269 2 0 0D 686
+ 110 1170 1 1 0 21 10000D 687
+ 110 53 -269 2 0 0D 688
+ 100 1172 1 1 0 669 10000D 689
+ 100 53 -269 2 0 0D 690
+ 110 1174 1 1 0 21 10000D 691
+ 110 53 -269 2 0 0D 692
+ 100 1176 1 1 0 267 10000D 693
+ 100 53 -269 2 0 0D 694
+ 102 1178 1 1 0 21 10000D 695
+ 102 53 -269 1 0 0D 696
+ 142 1179 1 1 0 0 10500D 697
+ 142 53 -269 1 0 0D 698
+ 144 1180 1 1 0 21 0D 699
+ 144 53 -269 1 0 0D 700
+ 124 1181 1 1 0 0 0D 701
+ 124 27 0 3 0 0D 702
+ 128 1184 1 1 0 21 10000D 703
+ 128 53 -269 15 0 0D 704
+ 126 1199 1 1 0 0 10500D 705
+ 126 53 -269 3 0 0D 706
+ 126 1202 1 1 0 0 10500D 707
+ 126 53 -269 2 0 0D 708
+ 126 1204 1 1 0 0 10500D 709
+ 126 53 -269 2 0 0D 710
+ 126 1206 1 1 0 0 10500D 711
+ 126 53 -269 2 0 0D 712
+ 126 1208 1 1 0 0 10500D 713
+ 126 53 -269 3 0 0D 714
+ 102 1211 1 1 0 21 10500D 715
+ 102 53 -269 1 0 0D 716
+ 100 1212 1 1 0 267 10000D 717
+ 100 53 -269 2 0 0D 718
+ 110 1214 1 1 0 21 10000D 719
+ 110 53 -269 2 0 0D 720
+ 100 1216 1 1 0 701 10000D 721
+ 100 53 -269 2 0 0D 722
+ 110 1218 1 1 0 21 10000D 723
+ 110 53 -269 2 0 0D 724
+ 100 1220 1 1 0 267 10000D 725
+ 100 53 -269 2 0 0D 726
+ 102 1222 1 1 0 21 10000D 727
+ 102 53 -269 1 0 0D 728
+ 142 1223 1 1 0 0 10500D 729
+ 142 53 -269 1 0 0D 730
+ 144 1224 1 1 0 21 0D 731
+ 144 53 -269 1 0 0D 732
+ 128 1225 1 1 0 21 10000D 733
+ 128 53 -269 12 0 0D 734
+ 126 1237 1 1 0 0 10500D 735
+ 126 53 -269 2 0 0D 736
+ 126 1239 1 1 0 0 10500D 737
+ 126 53 -269 2 0 0D 738
+ 126 1241 1 1 0 0 10500D 739
+ 126 53 -269 2 0 0D 740
+ 126 1243 1 1 0 0 10500D 741
+ 126 53 -269 2 0 0D 742
+ 102 1245 1 1 0 21 10500D 743
+ 102 53 -269 1 0 0D 744
+ 100 1246 1 1 0 267 10000D 745
+ 100 53 -269 2 0 0D 746
+ 110 1248 1 1 0 21 10000D 747
+ 110 53 -269 2 0 0D 748
+ 100 1250 1 1 0 265 10000D 749
+ 100 53 -269 2 0 0D 750
+ 110 1252 1 1 0 21 10000D 751
+ 110 53 -269 2 0 0D 752
+ 102 1254 1 1 0 21 10000D 753
+ 102 53 -269 1 0 0D 754
+ 142 1255 1 1 0 0 10500D 755
+ 142 53 -269 1 0 0D 756
+ 144 1256 1 1 0 21 0D 757
+ 144 53 -269 1 0 0D 758
+ 124 1257 1 1 0 0 0D 759
+ 124 27 0 2 0 0D 760
+ 128 1259 1 1 0 21 10000D 761
+ 128 53 -269 15 0 0D 762
+ 126 1274 1 1 0 0 10500D 763
+ 126 53 -269 3 0 0D 764
+ 126 1277 1 1 0 0 10500D 765
+ 126 53 -269 2 0 0D 766
+ 126 1279 1 1 0 0 10500D 767
+ 126 53 -269 2 0 0D 768
+ 126 1281 1 1 0 0 10500D 769
+ 126 53 -269 2 0 0D 770
+ 126 1283 1 1 0 0 10500D 771
+ 126 53 -269 3 0 0D 772
+ 102 1286 1 1 0 21 10500D 773
+ 102 53 -269 1 0 0D 774
+ 100 1287 1 1 0 267 10000D 775
+ 100 53 -269 2 0 0D 776
+ 110 1289 1 1 0 21 10000D 777
+ 110 53 -269 2 0 0D 778
+ 100 1291 1 1 0 759 10000D 779
+ 100 53 -269 2 0 0D 780
+ 110 1293 1 1 0 21 10000D 781
+ 110 53 -269 2 0 0D 782
+ 100 1295 1 1 0 267 10000D 783
+ 100 53 -269 2 0 0D 784
+ 102 1297 1 1 0 21 10000D 785
+ 102 53 -269 1 0 0D 786
+ 142 1298 1 1 0 0 10500D 787
+ 142 53 -269 1 0 0D 788
+ 144 1299 1 1 0 21 0D 789
+ 144 53 -269 1 0 0D 790
+ 124 1300 1 1 0 0 0D 791
+ 124 27 0 2 0 0D 792
+ 128 1302 1 1 0 21 10000D 793
+ 128 53 -269 19 0 0D 794
+ 126 1321 1 1 0 0 10500D 795
+ 126 53 -269 2 0 0D 796
+ 126 1323 1 1 0 0 10500D 797
+ 126 53 -269 2 0 0D 798
+ 126 1325 1 1 0 0 10500D 799
+ 126 53 -269 2 0 0D 800
+ 126 1327 1 1 0 0 10500D 801
+ 126 53 -269 2 0 0D 802
+ 102 1329 1 1 0 21 10500D 803
+ 102 53 -269 1 0 0D 804
+ 100 1330 1 1 0 791 10000D 805
+ 100 53 -269 3 0 0D 806
+ 110 1333 1 1 0 21 10000D 807
+ 110 53 -269 2 0 0D 808
+ 100 1335 1 1 0 129 10000D 809
+ 100 53 -269 3 0 0D 810
+ 110 1338 1 1 0 21 10000D 811
+ 110 53 -269 2 0 0D 812
+ 102 1340 1 1 0 21 10000D 813
+ 102 53 -269 1 0 0D 814
+ 142 1341 1 1 0 0 10500D 815
+ 142 53 -269 1 0 0D 816
+ 144 1342 1 1 0 21 0D 817
+ 144 53 -269 1 0 0D 818
+ 128 1343 1 1 0 21 10000D 819
+ 128 53 -269 6 0 0D 820
+ 126 1349 1 1 0 0 10500D 821
+ 126 53 -269 3 0 0D 822
+ 126 1352 1 1 0 0 10500D 823
+ 126 53 -269 3 0 0D 824
+ 126 1355 1 1 0 0 10500D 825
+ 126 53 -269 3 0 0D 826
+ 126 1358 1 1 0 0 10500D 827
+ 126 53 -269 3 0 0D 828
+ 102 1361 1 1 0 21 10500D 829
+ 102 53 -269 1 0 0D 830
+ 110 1362 1 1 0 21 10000D 831
+ 110 53 -269 2 0 0D 832
+ 110 1364 1 1 0 21 10000D 833
+ 110 53 -269 2 0 0D 834
+ 110 1366 1 1 0 21 10000D 835
+ 110 53 -269 2 0 0D 836
+ 110 1368 1 1 0 21 10000D 837
+ 110 53 -269 2 0 0D 838
+ 102 1370 1 1 0 21 10000D 839
+ 102 53 -269 1 0 0D 840
+ 142 1371 1 1 0 0 10500D 841
+ 142 53 -269 1 0 0D 842
+ 144 1372 1 1 0 21 0D 843
+ 144 53 -269 1 0 0D 844
+ 128 1373 1 1 0 21 10000D 845
+ 128 53 -269 6 0 0D 846
+ 126 1379 1 1 0 0 10500D 847
+ 126 53 -269 3 0 0D 848
+ 126 1382 1 1 0 0 10500D 849
+ 126 53 -269 3 0 0D 850
+ 126 1385 1 1 0 0 10500D 851
+ 126 53 -269 3 0 0D 852
+ 126 1388 1 1 0 0 10500D 853
+ 126 53 -269 3 0 0D 854
+ 102 1391 1 1 0 21 10500D 855
+ 102 53 -269 1 0 0D 856
+ 110 1392 1 1 0 21 10000D 857
+ 110 53 -269 2 0 0D 858
+ 110 1394 1 1 0 21 10000D 859
+ 110 53 -269 2 0 0D 860
+ 110 1396 1 1 0 21 10000D 861
+ 110 53 -269 2 0 0D 862
+ 110 1398 1 1 0 21 10000D 863
+ 110 53 -269 2 0 0D 864
+ 102 1400 1 1 0 21 10000D 865
+ 102 53 -269 1 0 0D 866
+ 142 1401 1 1 0 0 10500D 867
+ 142 53 -269 1 0 0D 868
+ 144 1402 1 1 0 21 0D 869
+ 144 53 -269 1 0 0D 870
+ 124 1403 1 1 0 0 0D 871
+ 124 27 0 2 0 0D 872
+ 128 1405 1 1 0 21 10000D 873
+ 128 53 -269 6 0 0D 874
+ 126 1411 1 1 0 0 10500D 875
+ 126 53 -269 3 0 0D 876
+ 126 1414 1 1 0 0 10500D 877
+ 126 53 -269 9 0 0D 878
+ 126 1423 1 1 0 0 10500D 879
+ 126 53 -269 3 0 0D 880
+ 126 1426 1 1 0 0 10500D 881
+ 126 53 -269 8 0 0D 882
+ 102 1434 1 1 0 21 10500D 883
+ 102 53 -269 1 0 0D 884
+ 110 1435 1 1 0 21 10000D 885
+ 110 53 -269 2 0 0D 886
+ 100 1437 1 1 0 871 10000D 887
+ 100 53 -269 2 0 0D 888
+ 110 1439 1 1 0 21 10000D 889
+ 110 53 -269 2 0 0D 890
+ 100 1441 1 1 0 791 10000D 891
+ 100 53 -269 3 0 0D 892
+ 102 1444 1 1 0 21 10000D 893
+ 102 53 -269 1 0 0D 894
+ 142 1445 1 1 0 0 10500D 895
+ 142 53 -269 1 0 0D 896
+ 126 1446 1 1 0 0 10500D 897
+ 126 53 -269 15 0 0D 898
+ 100 1461 1 1 0 129 10000D 899
+ 100 53 -269 3 0 0D 900
+ 142 1464 1 1 0 0 10500D 901
+ 142 53 -269 1 0 0D 902
+ 144 1465 1 1 0 21 0D 903
+ 144 53 -269 1 0 0D 904
+ 128 1466 1 1 0 21 10000D 905
+ 128 53 -269 11 0 0D 906
+ 126 1477 1 1 0 0 10500D 907
+ 126 53 -269 2 0 0D 908
+ 126 1479 1 1 0 0 10500D 909
+ 126 53 -269 2 0 0D 910
+ 126 1481 1 1 0 0 10500D 911
+ 126 53 -269 2 0 0D 912
+ 126 1483 1 1 0 0 10500D 913
+ 126 53 -269 2 0 0D 914
+ 102 1485 1 1 0 21 10500D 915
+ 102 53 -269 1 0 0D 916
+ 100 1486 1 1 0 791 10000D 917
+ 100 53 -269 3 0 0D 918
+ 110 1489 1 1 0 21 10000D 919
+ 110 53 -269 2 0 0D 920
+ 100 1491 1 1 0 129 10000D 921
+ 100 53 -269 3 0 0D 922
+ 110 1494 1 1 0 21 10000D 923
+ 110 53 -269 2 0 0D 924
+ 102 1496 1 1 0 21 10000D 925
+ 102 53 -269 1 0 0D 926
+ 142 1497 1 1 0 0 10500D 927
+ 142 53 -269 1 0 0D 928
+ 144 1498 1 1 0 21 0D 929
+ 144 53 -269 1 0 0D 930
+ 124 1499 1 1 0 0 0D 931
+ 124 27 0 2 0 0D 932
+ 128 1501 1 1 0 21 10000D 933
+ 128 53 -269 15 0 0D 934
+ 126 1516 1 1 0 0 10500D 935
+ 126 53 -269 4 0 0D 936
+ 126 1520 1 1 0 0 10500D 937
+ 126 53 -269 2 0 0D 938
+ 126 1522 1 1 0 0 10500D 939
+ 126 53 -269 2 0 0D 940
+ 126 1524 1 1 0 0 10500D 941
+ 126 53 -269 3 0 0D 942
+ 126 1527 1 1 0 0 10500D 943
+ 126 53 -269 3 0 0D 944
+ 126 1530 1 1 0 0 10500D 945
+ 126 53 -269 3 0 0D 946
+ 126 1533 1 1 0 0 10500D 947
+ 126 53 -269 2 0 0D 948
+ 126 1535 1 1 0 0 10500D 949
+ 126 53 -269 2 0 0D 950
+ 126 1537 1 1 0 0 10500D 951
+ 126 53 -269 3 0 0D 952
+ 126 1540 1 1 0 0 10500D 953
+ 126 53 -269 3 0 0D 954
+ 126 1543 1 1 0 0 10500D 955
+ 126 53 -269 2 0 0D 956
+ 126 1545 1 1 0 0 10500D 957
+ 126 53 -269 2 0 0D 958
+ 126 1547 1 1 0 0 10500D 959
+ 126 53 -269 28 0 0D 960
+ 102 1575 1 1 0 21 10500D 961
+ 102 53 -269 1 0 0D 962
+ 126 1576 1 1 0 21 10000D 963
+ 126 53 -269 8 0 0D 964
+ 110 1584 1 1 0 21 10000D 965
+ 110 53 -269 2 0 0D 966
+ 100 1586 1 1 0 791 10000D 967
+ 100 53 -269 3 0 0D 968
+ 110 1589 1 1 0 21 10000D 969
+ 110 53 -269 2 0 0D 970
+ 100 1591 1 1 0 931 10000D 971
+ 100 53 -269 2 0 0D 972
+ 110 1593 1 1 0 21 10000D 973
+ 110 53 -269 2 0 0D 974
+ 100 1595 1 1 0 791 10000D 975
+ 100 53 -269 3 0 0D 976
+ 110 1598 1 1 0 21 10000D 977
+ 110 53 -269 2 0 0D 978
+ 100 1600 1 1 0 931 10000D 979
+ 100 53 -269 2 0 0D 980
+ 110 1602 1 1 0 21 10000D 981
+ 110 53 -269 2 0 0D 982
+ 100 1604 1 1 0 791 10000D 983
+ 100 53 -269 3 0 0D 984
+ 110 1607 1 1 0 21 10000D 985
+ 110 53 -269 2 0 0D 986
+ 126 1609 1 1 0 21 10000D 987
+ 126 53 -269 34 0 0D 988
+ 102 1643 1 1 0 21 10000D 989
+ 102 53 -269 1 0 0D 990
+ 142 1644 1 1 0 0 10500D 991
+ 142 53 -269 1 0 0D 992
+ 144 1645 1 1 0 21 0D 993
+ 144 53 -269 1 0 0D 994
+ 128 1646 1 1 0 21 10000D 995
+ 128 53 -269 5 0 0D 996
+ 126 1651 1 1 0 0 10500D 997
+ 126 53 -269 8 0 0D 998
+ 126 1659 1 1 0 0 10500D 999
+ 126 53 -269 3 0 0D 1000
+ 126 1662 1 1 0 0 10500D 1001
+ 126 53 -269 4 0 0D 1002
+ 126 1666 1 1 0 0 10500D 1003
+ 126 53 -269 3 0 0D 1004
+ 126 1669 1 1 0 0 10500D 1005
+ 126 53 -269 8 0 0D 1006
+ 126 1677 1 1 0 0 10500D 1007
+ 126 53 -269 3 0 0D 1008
+ 126 1680 1 1 0 0 10500D 1009
+ 126 53 -269 4 0 0D 1010
+ 126 1684 1 1 0 0 10500D 1011
+ 126 53 -269 3 0 0D 1012
+ 102 1687 1 1 0 21 10500D 1013
+ 102 53 -269 1 0 0D 1014
+ 100 1688 1 1 0 791 10000D 1015
+ 100 53 -269 3 0 0D 1016
+ 110 1691 1 1 0 21 10000D 1017
+ 110 53 -269 2 0 0D 1018
+ 100 1693 1 1 0 791 10000D 1019
+ 100 53 -269 3 0 0D 1020
+ 110 1696 1 1 0 21 10000D 1021
+ 110 53 -269 2 0 0D 1022
+ 100 1698 1 1 0 791 10000D 1023
+ 100 53 -269 3 0 0D 1024
+ 110 1701 1 1 0 21 10000D 1025
+ 110 53 -269 2 0 0D 1026
+ 100 1703 1 1 0 791 10000D 1027
+ 100 53 -269 3 0 0D 1028
+ 110 1706 1 1 0 21 10000D 1029
+ 110 53 -269 2 0 0D 1030
+ 102 1708 1 1 0 21 10000D 1031
+ 102 53 -269 1 0 0D 1032
+ 142 1709 1 1 0 0 10500D 1033
+ 142 53 -269 1 0 0D 1034
+ 126 1710 1 1 0 0 10500D 1035
+ 126 53 -269 28 0 0D 1036
+ 100 1738 1 1 0 871 10000D 1037
+ 100 53 -269 2 0 0D 1038
+ 142 1740 1 1 0 0 10500D 1039
+ 142 53 -269 1 0 0D 1040
+ 126 1741 1 1 0 0 10500D 1041
+ 126 53 -269 15 0 0D 1042
+ 100 1756 1 1 0 129 10000D 1043
+ 100 53 -269 3 0 0D 1044
+ 142 1759 1 1 0 0 10500D 1045
+ 142 53 -269 1 0 0D 1046
+ 126 1760 1 1 0 0 10500D 1047
+ 126 53 -269 15 0 0D 1048
+ 100 1775 1 1 0 129 10000D 1049
+ 100 53 -269 3 0 0D 1050
+ 142 1778 1 1 0 0 10500D 1051
+ 142 53 -269 1 0 0D 1052
+ 144 1779 1 1 0 21 0D 1053
+ 144 53 -269 1 0 0D 1054
+ 128 1780 1 1 0 21 10000D 1055
+ 128 53 -269 6 0 0D 1056
+ 126 1786 1 1 0 0 10500D 1057
+ 126 53 -269 3 0 0D 1058
+ 126 1789 1 1 0 0 10500D 1059
+ 126 53 -269 3 0 0D 1060
+ 126 1792 1 1 0 0 10500D 1061
+ 126 53 -269 3 0 0D 1062
+ 126 1795 1 1 0 0 10500D 1063
+ 126 53 -269 3 0 0D 1064
+ 102 1798 1 1 0 21 10500D 1065
+ 102 53 -269 1 0 0D 1066
+ 110 1799 1 1 0 21 10000D 1067
+ 110 53 -269 2 0 0D 1068
+ 110 1801 1 1 0 21 10000D 1069
+ 110 53 -269 2 0 0D 1070
+ 110 1803 1 1 0 21 10000D 1071
+ 110 53 -269 2 0 0D 1072
+ 110 1805 1 1 0 21 10000D 1073
+ 110 53 -269 2 0 0D 1074
+ 102 1807 1 1 0 21 10000D 1075
+ 102 53 -269 1 0 0D 1076
+ 142 1808 1 1 0 0 10500D 1077
+ 142 53 -269 1 0 0D 1078
+ 144 1809 1 1 0 21 0D 1079
+ 144 53 -269 1 0 0D 1080
+ 128 1810 1 1 0 21 10000D 1081
+ 128 53 -269 6 0 0D 1082
+ 126 1816 1 1 0 0 10500D 1083
+ 126 53 -269 3 0 0D 1084
+ 126 1819 1 1 0 0 10500D 1085
+ 126 53 -269 3 0 0D 1086
+ 126 1822 1 1 0 0 10500D 1087
+ 126 53 -269 3 0 0D 1088
+ 126 1825 1 1 0 0 10500D 1089
+ 126 53 -269 3 0 0D 1090
+ 102 1828 1 1 0 21 10500D 1091
+ 102 53 -269 1 0 0D 1092
+ 110 1829 1 1 0 21 10000D 1093
+ 110 53 -269 2 0 0D 1094
+ 110 1831 1 1 0 21 10000D 1095
+ 110 53 -269 2 0 0D 1096
+ 110 1833 1 1 0 21 10000D 1097
+ 110 53 -269 2 0 0D 1098
+ 110 1835 1 1 0 21 10000D 1099
+ 110 53 -269 2 0 0D 1100
+ 102 1837 1 1 0 21 10000D 1101
+ 102 53 -269 1 0 0D 1102
+ 142 1838 1 1 0 0 10500D 1103
+ 142 53 -269 1 0 0D 1104
+ 144 1839 1 1 0 21 0D 1105
+ 144 53 -269 1 0 0D 1106
+ 128 1840 1 1 0 21 10000D 1107
+ 128 53 -269 19 0 0D 1108
+ 126 1859 1 1 0 0 10500D 1109
+ 126 53 -269 2 0 0D 1110
+ 126 1861 1 1 0 0 10500D 1111
+ 126 53 -269 2 0 0D 1112
+ 126 1863 1 1 0 0 10500D 1113
+ 126 53 -269 2 0 0D 1114
+ 126 1865 1 1 0 0 10500D 1115
+ 126 53 -269 2 0 0D 1116
+ 102 1867 1 1 0 21 10500D 1117
+ 102 53 -269 1 0 0D 1118
+ 100 1868 1 1 0 791 10000D 1119
+ 100 53 -269 3 0 0D 1120
+ 110 1871 1 1 0 21 10000D 1121
+ 110 53 -269 2 0 0D 1122
+ 100 1873 1 1 0 129 10000D 1123
+ 100 53 -269 3 0 0D 1124
+ 110 1876 1 1 0 21 10000D 1125
+ 110 53 -269 2 0 0D 1126
+ 102 1878 1 1 0 21 10000D 1127
+ 102 53 -269 1 0 0D 1128
+ 142 1879 1 1 0 0 10500D 1129
+ 142 53 -269 1 0 0D 1130
+ 144 1880 1 1 0 21 0D 1131
+ 144 53 -269 1 0 0D 1132
+ 128 1881 1 1 0 21 10000D 1133
+ 128 53 -269 11 0 0D 1134
+ 126 1892 1 1 0 0 10500D 1135
+ 126 53 -269 2 0 0D 1136
+ 126 1894 1 1 0 0 10500D 1137
+ 126 53 -269 2 0 0D 1138
+ 126 1896 1 1 0 0 10500D 1139
+ 126 53 -269 2 0 0D 1140
+ 126 1898 1 1 0 0 10500D 1141
+ 126 53 -269 2 0 0D 1142
+ 102 1900 1 1 0 21 10500D 1143
+ 102 53 -269 1 0 0D 1144
+ 100 1901 1 1 0 791 10000D 1145
+ 100 53 -269 3 0 0D 1146
+ 110 1904 1 1 0 21 10000D 1147
+ 110 53 -269 2 0 0D 1148
+ 100 1906 1 1 0 129 10000D 1149
+ 100 53 -269 3 0 0D 1150
+ 110 1909 1 1 0 21 10000D 1151
+ 110 53 -269 2 0 0D 1152
+ 102 1911 1 1 0 21 10000D 1153
+ 102 53 -269 1 0 0D 1154
+ 142 1912 1 1 0 0 10500D 1155
+ 142 53 -269 1 0 0D 1156
+ 144 1913 1 1 0 21 0D 1157
+ 144 53 -269 1 0 0D 1158
+ 128 1914 1 1 0 21 10000D 1159
+ 128 53 -269 5 0 0D 1160
+ 126 1919 1 1 0 0 10500D 1161
+ 126 53 -269 3 0 0D 1162
+ 126 1922 1 1 0 0 10500D 1163
+ 126 53 -269 9 0 0D 1164
+ 126 1931 1 1 0 0 10500D 1165
+ 126 53 -269 3 0 0D 1166
+ 126 1934 1 1 0 0 10500D 1167
+ 126 53 -269 8 0 0D 1168
+ 102 1942 1 1 0 21 10500D 1169
+ 102 53 -269 1 0 0D 1170
+ 110 1943 1 1 0 21 10000D 1171
+ 110 53 -269 2 0 0D 1172
+ 100 1945 1 1 0 871 10000D 1173
+ 100 53 -269 2 0 0D 1174
+ 110 1947 1 1 0 21 10000D 1175
+ 110 53 -269 2 0 0D 1176
+ 100 1949 1 1 0 791 10000D 1177
+ 100 53 -269 3 0 0D 1178
+ 102 1952 1 1 0 21 10000D 1179
+ 102 53 -269 1 0 0D 1180
+ 142 1953 1 1 0 0 10500D 1181
+ 142 53 -269 1 0 0D 1182
+ 126 1954 1 1 0 0 10500D 1183
+ 126 53 -269 15 0 0D 1184
+ 100 1969 1 1 0 129 10000D 1185
+ 100 53 -269 3 0 0D 1186
+ 142 1972 1 1 0 0 10500D 1187
+ 142 53 -269 1 0 0D 1188
+ 144 1973 1 1 0 21 0D 1189
+ 144 53 -269 1 0 0D 1190
+ 128 1974 1 1 0 21 10000D 1191
+ 128 53 -269 15 0 0D 1192
+ 126 1989 1 1 0 0 10500D 1193
+ 126 53 -269 2 0 0D 1194
+ 126 1991 1 1 0 0 10500D 1195
+ 126 53 -269 2 0 0D 1196
+ 126 1993 1 1 0 0 10500D 1197
+ 126 53 -269 10 0 0D 1198
+ 126 2003 1 1 0 0 10500D 1199
+ 126 53 -269 18 0 0D 1200
+ 126 2021 1 1 0 0 10500D 1201
+ 126 53 -269 2 0 0D 1202
+ 102 2023 1 1 0 21 10500D 1203
+ 102 53 -269 1 0 0D 1204
+ 100 2024 1 1 0 931 10000D 1205
+ 100 53 -269 2 0 0D 1206
+ 110 2026 1 1 0 21 10000D 1207
+ 110 53 -269 2 0 0D 1208
+ 126 2028 1 1 0 21 10000D 1209
+ 126 53 -269 13 0 0D 1210
+ 126 2041 1 1 0 21 10000D 1211
+ 126 53 -269 22 0 0D 1212
+ 110 2063 1 1 0 21 10000D 1213
+ 110 53 -269 2 0 0D 1214
+ 102 2065 1 1 0 21 10000D 1215
+ 102 53 -269 1 0 0D 1216
+ 142 2066 1 1 0 0 10500D 1217
+ 142 53 -269 1 0 0D 1218
+ 144 2067 1 1 0 21 0D 1219
+ 144 53 -269 1 0 0D 1220
+ 124 2068 1 1 0 0 0D 1221
+ 124 27 0 3 0 0D 1222
+ 124 2071 1 1 0 0 0D 1223
+ 124 27 0 3 0 0D 1224
+ 128 2074 1 1 0 21 10000D 1225
+ 128 53 -269 108 0 0D 1226
+ 126 2182 1 1 0 0 10500D 1227
+ 126 53 -269 2 0 0D 1228
+ 126 2184 1 1 0 0 10500D 1229
+ 126 53 -269 2 0 0D 1230
+ 126 2186 1 1 0 0 10500D 1231
+ 126 53 -269 3 0 0D 1232
+ 126 2189 1 1 0 0 10500D 1233
+ 126 53 -269 2 0 0D 1234
+ 126 2191 1 1 0 0 10500D 1235
+ 126 53 -269 2 0 0D 1236
+ 126 2193 1 1 0 0 10500D 1237
+ 126 53 -269 2 0 0D 1238
+ 102 2195 1 1 0 21 10500D 1239
+ 102 53 -269 1 0 0D 1240
+ 126 2196 1 1 0 21 10000D 1241
+ 126 53 -269 35 0 0D 1242
+ 100 2231 1 1 0 1221 10000D 1243
+ 100 53 -269 3 0 0D 1244
+ 126 2234 1 1 0 21 10000D 1245
+ 126 53 -269 36 0 0D 1246
+ 126 2270 1 1 0 21 10000D 1247
+ 126 53 -269 8 0 0D 1248
+ 100 2278 1 1 0 1223 10000D 1249
+ 100 53 -269 3 0 0D 1250
+ 126 2281 1 1 0 21 10000D 1251
+ 126 53 -269 7 0 0D 1252
+ 102 2288 1 1 0 21 10000D 1253
+ 102 53 -269 1 0 0D 1254
+ 142 2289 1 1 0 0 10500D 1255
+ 142 53 -269 1 0 0D 1256
+ 144 2290 1 1 0 21 0D 1257
+ 144 53 -269 1 0 0D 1258
+406,10,1,2,3,4,5,6,7,8,9,10,0,0; 1P 1
+406,2,0,6HSOLIDS,0,0; 3P 2
+406,10,11,12,13,14,15,16,17,18,19,20,0,0; 5P 3
+406,2,0,6HSHEETS,0,0; 7P 4
+406,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39, 9P 5
+40,0,0; 9P 6
+406,2,0,8HSKETCHES,0,0; 11P 7
+406,20,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59, 13P 8
+60,0,0; 13P 9
+406,2,0,6HCURVES,0,0; 15P 10
+406,20,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79, 17P 11
+80,0,0; 17P 12
+406,2,0,6HDATUMS,0,0; 19P 13
+124,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0,0; 21P 14
+314,0.0,0.0,100.0,4HBlue,0,0; 23P 15
+116,0.0,0.0,0.0,0,0,0; 25P 16
+314,30.1960784313725,42.7450980392157,70.1960784313725,12HMedium 27P 17
+ Royal,0,0; 27P 18
+406,1,5HLine9,0,0; 29P 19
+110,0.0,0.0,0.0,62.5,0.0,0.0,0,1,29; 31P 20
+406,1,6HLine10,0,0; 33P 21
+110,44.9999999999997,0.0,8.0,62.5,0.0,8.0,0,1,33; 35P 22
+406,1,6HLine11,0,0; 37P 23
+110,62.5,0.0,8.0,62.5,0.0,0.0,0,1,37; 39P 24
+406,1,6HLine12,0,0; 41P 25
+110,9.9475983006414E-14,0.0,85.0,17.5000000000001,0.0,85.0,0,1, 43P 26
+41; 43P 27
+406,1,6HLine13,0,0; 45P 28
+110,0.0,0.0,0.0,1.55803563489476E-13,0.0,133.0,0,1,45; 47P 29
+406,1,6HLine15,0,0; 49P 30
+110,17.5000000000001,0.0,85.0,17.5000000000001,0.0,73.0,0,1,49; 51P 31
+406,1,6HLine19,0,0; 53P 32
+110,23.8961038961039,0.0,73.0,44.9999999999997,0.0, 55P 33
+7.99999999999999,0,1,53; 55P 34
+406,1,6HLine20,0,0; 57P 35
+110,17.5000000000001,0.0,73.0,23.8961038961039,0.0,73.0,0,1,57; 59P 36
+406,1,6HLine21,0,0; 61P 37
+110,0.0,0.0,85.0,-1.6660457803815E-13,0.0,0.0,0,1,61; 63P 38
+110,-23.8961038961039,0.0,73.0,-44.9999999999997,0.0,8.0,0,0; 65P 39
+110,44.9999999999997,0.0,8.0,23.8961038961039,0.0,73.0,0,0; 67P 40
+406,1,6HLine22,0,0; 69P 41
+110,39.7430663251921,0.0,7.99999999999997,20.262546844673,0.0, 71P 42
+68.0,0,1,69; 71P 43
+406,1,6HLine23,0,0; 73P 44
+110,-2.1316282072803E-14,0.0,68.0,20.262546844673,0.0,68.0,0,1, 75P 45
+73; 75P 46
+406,1,6HLine24,0,0; 77P 47
+110,-1.8682053493363E-14,0.0,68.0,-3.10122087989826E-13,0.0, 79P 48
+-10.0,0,1,77; 79P 49
+406,1,6HLine26,0,0; 81P 50
+110,39.7430663251921,0.0,8.0,39.7430663251921,0.0,-9.0,0,1,81; 83P 51
+406,1,6HLine27,0,0; 85P 52
+110,0.0,0.0,-10.0,39.7430663251921,0.0,-9.0,0,1,85; 87P 53
+406,1,6HLine28,0,0; 89P 54
+110,0.0,0.0,0.0,-90.0,2.10861965624854E-13,0.0,0,1,89; 91P 55
+110,-23.8961038961039,0.0,73.0,-44.9999999999997,0.0,8.0,0,0; 93P 56
+110,44.9999999999997,0.0,8.0,23.8961038961039,0.0,73.0,0,0; 95P 57
+406,1,6HLine29,0,0; 97P 58
+110,56.4134976226792,0.0,11.7056810463245,35.3096015187835,0.0, 99P 59
+76.7056810463244,0,1,97; 99P 60
+406,1,6HLine30,0,0; 101P 61
+110,-58.0,0.0,50.0,95.0,0.0,50.0,0,1,101; 103P 62
+406,1,6HLine32,0,0; 105P 63
+110,89.7314058284572,0.0,64.8542625471695,43.9802771831744,0.0, 107P 64
+50.0,0,1,105; 107P 65
+406,1,6HLine34,0,0; 109P 66
+110,43.9802771831744,0.0,50.0,43.9802771831744,30.0,50.0,0,1, 111P 67
+109; 111P 68
+406,1,6HLine35,0,0; 113P 69
+110,41.0688191867627,33.3333333333335,58.9672906289481, 115P 70
+38.157361190351,6.66666666666669,67.9345812578962,0,1,113; 115P 71
+406,1,6HLine37,0,0; 117P 72
+110,46.8917351795861,33.3333333333334,41.032709371052, 119P 73
+49.8031931759977,6.6666666666666,32.065418742104,0,1,117; 119P 74
+406,1,6HLine38,0,0; 121P 75
+110,37.8041421059669,0.0,69.0224960377994,50.1564122603818,0.0, 123P 76
+30.9775039622009,0,1,121; 123P 77
+406,1,4HArc1,0,0; 125P 78
+100,0.0,0.0,0.0,52.5,0.0,52.5,-1.28587913910472E-14,0,1,125; 127P 79
+124,0.308806753860372,0.0,0.951124801889962,0.0,0.0,1.0,0.0,0.0, 129P 80
+-0.951124801889962,0.0,0.308806753860372,0.0,0,0; 129P 81
+406,1,4HArc2,0,0; 131P 82
+100,57.2710701159311,-33.9748334636827,0.0,-13.9748334636827, 133P 83
+0.0,-15.118652632048,6.66666666668504,0,1,131; 133P 84
+406,1,4HArc3,0,0; 135P 85
+100,57.271070115931,-33.9748334636827,0.0,-18.9748334636827,0.0, 137P 86
+-18.9748334636827,-3.67394039744206E-15,0,1,135; 137P 87
+406,1,4HArc4,0,0; 139P 88
+100,57.271070115931,-33.9748334636826,30.0000000000001, 141P 89
+-24.5467430478588,33.3333333333245,-43.4029238794955, 141P 90
+33.3333333333554,0,1,139; 141P 91
+406,1,4HArc5,0,0; 143P 92
+100,57.271070115931,-33.9748334636827,30.0000000000002, 145P 93
+-30.4748334636827,30.0000000000002,-30.4748334636827, 145P 94
+30.0000000000002,0,1,143; 145P 95
+406,1,4HArc6,0,0; 147P 96
+100,57.2710701159311,-33.9748334636827,0.0,-52.8310142953085, 149P 97
+6.66666666671065,-53.9748334636827,2.22602004912835E-11,0,1,147; 149P 98
+406,1,4HArc7,0,0; 151P 99
+100,57.271070115931,-33.9748334636828,0.0,-13.9748334636828,0.0, 153P 100
+-13.9748334636828,-4.89858719658942E-15,0,1,151; 153P 101
+108,1.0,0.0,0.0,177.138541666667,0,177.138541666667,0.0,42.5, 155P 102
+0.0,0,0; 155P 103
+108,1.0,0.0,0.0,-177.138541666667,0,-177.138541666667,0.0,42.5, 157P 104
+0.0,0,0; 157P 105
+108,0.0,1.0,0.0,110.728125,0,0.0,110.728125,42.5,0.0,0,0; 159P 106
+108,0.0,1.0,0.0,-110.728125,0,0.0,-110.728125,42.5,0.0,0,0; 161P 107
+406,1,3HTOP,0,0; 163P 108
+410,1,1.0,157,159,155,161,0,0,0,1,163; 165P 109
+124,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,-1.0,0.0,0.0,0,0; 167P 110
+108,1.0,0.0,0.0,177.138541666667,0,177.138541666667,0.0,42.5, 169P 111
+0.0,0,0; 169P 112
+108,1.0,0.0,0.0,-177.138541666667,0,-177.138541666667,0.0,42.5, 171P 113
+0.0,0,0; 171P 114
+108,0.0,0.0,1.0,751.792241944336,0,0.0,0.0,751.792241944336,0.0, 173P 115
+0,0; 173P 116
+108,0.0,0.0,1.0,-666.792241944336,0,0.0,0.0,-666.792241944336, 175P 117
+0.0,0,0; 175P 118
+406,1,5HFRONT,0,0; 177P 119
+410,2,1.0,171,173,169,175,0,0,0,1,177; 179P 120
+124,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0,0; 181P 121
+108,0.0,1.0,0.0,110.728125,0,0.0,110.728125,42.5,0.0,0,0; 183P 122
+108,0.0,1.0,0.0,-110.728125,0,0.0,-110.728125,42.5,0.0,0,0; 185P 123
+108,0.0,0.0,1.0,751.792241944336,0,0.0,0.0,751.792241944336,0.0, 187P 124
+0,0; 187P 125
+108,0.0,0.0,1.0,-666.792241944336,0,0.0,0.0,-666.792241944336, 189P 126
+0.0,0,0; 189P 127
+406,1,5HRIGHT,0,0; 191P 128
+410,3,1.0,185,187,183,189,0,0,0,1,191; 193P 129
+124,-1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0,0; 195P 130
+108,-1.0,0.0,0.0,177.138541666667,0,-177.138541666667,0.0,42.5, 197P 131
+0.0,0,0; 197P 132
+108,-1.0,0.0,0.0,-177.138541666667,0,177.138541666667,0.0,42.5, 199P 133
+0.0,0,0; 199P 134
+108,0.0,0.0,1.0,751.792241944336,0,0.0,0.0,751.792241944336,0.0, 201P 135
+0,0; 201P 136
+108,0.0,0.0,1.0,-666.792241944336,0,0.0,0.0,-666.792241944336, 203P 137
+0.0,0,0; 203P 138
+406,1,4HBACK,0,0; 205P 139
+410,4,1.0,199,201,197,203,0,0,0,1,205; 207P 140
+124,1.0,0.0,0.0,0.0,0.0,-1.0,0.0,0.0,0.0,0.0,-1.0,0.0,0,0; 209P 141
+108,1.0,0.0,0.0,177.138541666667,0,177.138541666667,0.0,42.5, 211P 142
+0.0,0,0; 211P 143
+108,1.0,0.0,0.0,-177.138541666667,0,-177.138541666667,0.0,42.5, 213P 144
+0.0,0,0; 213P 145
+108,0.0,-1.0,0.0,110.728125,0,0.0,-110.728125,42.5,0.0,0,0; 215P 146
+108,0.0,-1.0,0.0,-110.728125,0,0.0,110.728125,42.5,0.0,0,0; 217P 147
+406,1,6HBOTTOM,0,0; 219P 148
+410,5,1.0,213,215,211,217,0,0,0,1,219; 221P 149
+124,0.0,-1.0,0.0,0.0,0.0,0.0,1.0,0.0,-1.0,0.0,0.0,0.0,0,0; 223P 150
+108,0.0,-1.0,0.0,110.728125,0,0.0,-110.728125,42.5,0.0,0,0; 225P 151
+108,0.0,-1.0,0.0,-110.728125,0,0.0,110.728125,42.5,0.0,0,0; 227P 152
+108,0.0,0.0,1.0,751.792241944336,0,0.0,0.0,751.792241944336,0.0, 229P 153
+0,0; 229P 154
+108,0.0,0.0,1.0,-666.792241944336,0,0.0,0.0,-666.792241944336, 231P 155
+0.0,0,0; 231P 156
+406,1,4HLEFT,0,0; 233P 157
+410,6,1.0,227,229,225,231,0,0,0,1,233; 235P 158
+124,0.707106781186548,0.707106781186548,0.0,0.0, 237P 159
+-0.408248290463863,0.408248290463863,0.816496580927726,0.0, 237P 160
+0.577350269189626,-0.577350269189626,0.577350269189626,0.0,0,0; 237P 161
+108,0.707106781186548,0.707106781186548,0.0,203.552472077568,0, 239P 162
+143.933333333333,143.933333333333,42.5,0.0,0,0; 239P 163
+108,0.707106781186548,0.707106781186548,0.0,-203.552472077568,0, 241P 164
+-143.933333333333,-143.933333333333,42.5,0.0,0,0; 241P 165
+108,-0.408248290463863,0.408248290463863,0.816496580927726, 243P 166
+731.356869663737,0,-284.408525092556,284.408525092556, 243P 167
+611.317050185113,0.0,0,0; 243P 168
+108,-0.408248290463863,0.408248290463863,0.816496580927726, 245P 169
+-661.954660284881,0,284.408525092556,-284.408525092556, 245P 170
+-526.317050185113,0.0,0,0; 245P 171
+406,1,7HTFR-ISO,0,0; 247P 172
+410,7,1.0,241,243,239,245,0,0,0,1,247; 249P 173
+124,0.63121905864763,0.775604602874428,0.0,0.0, 251P 174
+-0.291176881826266,0.236971772169955,0.926855114181588,0.0, 251P 175
+0.718873092756943,-0.585048612676443,0.375419228750255,0.0,0,0; 251P 176
+108,0.63121905864763,0.775604602874428,0.0,197.694466938702,0, 253P 177
+124.788515320893,153.332738520464,42.5,0.0,0,0; 253P 178
+108,0.63121905864763,0.775604602874428,0.0,-197.694466938702,0, 255P 179
+-124.788515320893,-153.332738520464,42.5,0.0,0,0; 255P 180
+108,-0.291176881826266,0.236971772169955,0.926855114181588, 257P 181
+774.620572472207,0,-214.081754653719,174.228573612567, 257P 182
+723.95097203204,0.0,0,0; 257P 183
+108,-0.291176881826266,0.236971772169955,0.926855114181588, 259P 184
+-695.837887766772,0,214.081754653719,-174.228573612567, 259P 185
+-638.95097203204,0.0,0,0; 259P 186
+406,1,7HTFR-TRI,0,0; 261P 187
+410,8,1.0,255,257,253,259,0,0,0,1,261; 263P 188
+124,-1.0,0.0,0.0,0.0,0.0,-1.0,0.0,0.0,0.0,0.0,1.0,0.0,0,0; 265P 189
+124,-1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,-1.0,0.0,0,0; 267P 190
+314,61.1764705882353,65.8823529411765,67.0588235294118,12HMedium 269P 191
+ Steel,0,0; 269P 192
+128,1,6,1,3,0,0,0,0,0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.5,0.5, 271P 193
+0.5,1.0,1.0,1.0,1.0,1.0,1.0,0.333333333333333,0.333333333333333, 271P 194
+0.333333333333333,0.333333333333333,1.0,1.0,0.333333333333333, 271P 195
+0.333333333333333,0.333333333333333,0.333333333333333,1.0,1.0, 271P 196
+-44.9999999999997,0.0,8.00000000000001,-23.8961038961039,0.0, 271P 197
+73.0,-44.9999999999997,89.9999999999994,8.00000000000001, 271P 198
+-23.8961038961039,47.7922077922079,73.0,44.9999999999997, 271P 199
+89.9999999999994,8.00000000000001,23.8961038961039, 271P 200
+47.7922077922079,73.0,44.9999999999997,0.0,8.00000000000001, 271P 201
+23.8961038961039,0.0,73.0,44.9999999999997,-89.9999999999994, 271P 202
+8.00000000000001,23.8961038961039,-47.7922077922079,73.0, 271P 203
+-44.9999999999997,-89.9999999999994,8.00000000000001, 271P 204
+-23.8961038961039,-47.7922077922079,73.0,-44.9999999999997,0.0, 271P 205
+8.00000000000001,-23.8961038961039,0.0,73.0,0.0,1.0,0.0,1.0,0,0; 271P 206
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0, 273P 207
+0.0,1.0,0.0,0.0,1.0,0,0; 273P 208
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0, 275P 209
+0.0,1.0,0.0,0.0,1.0,0,0; 275P 210
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,1.0,1.0,0.0, 277P 211
+0.0,1.0,0.0,0.0,1.0,0,0; 277P 212
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,1.0,0.0, 279P 213
+0.0,1.0,0.0,0.0,1.0,0,0; 279P 214
+102,4,273,275,277,279,0,0; 281P 215
+100,8.00000000000001,0.0,0.0,44.9999999999997,0.0, 283P 216
+44.9999999999997,-1.10218211923261E-14,0,0; 283P 217
+110,-44.9999999999997,0.0,8.0,-23.8961038961039,0.0,73.0,0,0; 285P 218
+100,-73.0,0.0,0.0,23.8961038961039,0.0,23.8961038961039, 287P 219
+-5.85285742969126E-15,0,0; 287P 220
+110,-23.8961038961039,0.0,73.0,-44.9999999999997,0.0, 289P 221
+8.00000000000001,0,0; 289P 222
+102,4,283,285,287,289,0,0; 291P 223
+142,0,271,281,291,3,0,0; 293P 224
+126,28,2,1,1,1,1,-0.0535714285714286,0.0,0.0,0.0625,0.0625, 295P 225
+0.125,0.125,0.1875,0.1875,0.25,0.25,0.375,0.375,0.4375,0.4375, 295P 226
+0.5,0.5,0.5625,0.5625,0.625,0.625,0.6875,0.6875,0.75,0.75,0.875, 295P 227
+0.875,0.946428571428571,0.946428571428571,1.0,1.0,1.0625,1.0, 295P 228
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 295P 229
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 295P 230
+0.345452877707507,0.569808938947633,0.0,0.374075632623966, 295P 231
+0.587140625536844,0.0,0.417752379784419,0.600335462845841,0.0, 295P 232
+0.46226787155683,0.613783686668672,0.0,0.515107280927215, 295P 233
+0.620883503656017,0.0,0.572677724899784,0.628619010561863,0.0, 295P 234
+0.629862857321487,0.627365392840733,0.0,0.690419059469675, 295P 235
+0.626037874219679,0.0,0.741472201431567,0.614882657018381,0.0, 295P 236
+0.855697833228542,0.58992412001782,0.0,0.877080185862735, 295P 237
+0.528781158096307,0.0,0.889881458125743,0.492175845485739,0.0, 295P 238
+0.871532188284078,0.458796036382718,0.0,0.855420197632904, 295P 239
+0.429486141392528,0.0,0.81398492544976,0.409203378855573,0.0, 295P 240
+0.776040775978328,0.390629537467635,0.0,0.720733038202146, 295P 241
+0.381071620780776,0.0,0.667476942838274,0.371868255338219,0.0, 295P 242
+0.606677055097954,0.372504102772359,0.0,0.549431203143717, 295P 243
+0.373102781971171,0.0,0.493547763452023,0.382344564659657,0.0, 295P 244
+0.441992106048955,0.39087063579468,0.0,0.400517850685862, 295P 245
+0.405241511062703,0.0,0.31462308542517,0.435004142047418,0.0, 295P 246
+0.299655856379888,0.480118650975164,0.0,0.289963972637671, 295P 247
+0.50933211288532,0.0,0.307474497422744,0.535794539309424,0.0, 295P 248
+0.319639209145204,0.554178213863852,0.0,0.345452877707507, 295P 249
+0.569808938947633,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 295P 250
+126,33,3,0,1,1,1,-0.0624999999999999,-0.0624999999999999,0.0, 297P 251
+0.0,0.0625,0.0625,0.125,0.125,0.1875,0.1875,0.25,0.25,0.3125, 297P 252
+0.3125,0.375,0.375,0.4375,0.4375,0.5,0.5,0.5625,0.5625,0.625, 297P 253
+0.625,0.6875,0.6875,0.75,0.75,0.8125,0.8125,0.875,0.875,0.9375, 297P 254
+0.9375,1.0,1.0,1.0625,1.0625,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 297P 255
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 297P 256
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,36.90916009877, 297P 257
+-9.82538806915516,29.1836862372981,34.6399298961, 297P 258
+-14.0237828769544,31.7251878646779,33.2960039306477, 297P 259
+-15.7517887283086,33.2933703301528,30.4903898191817, 297P 260
+-18.429561242235,37.0144390418217,29.0561656029594, 297P 261
+-19.3445595002335,39.1358044221728,26.6036423498096, 297P 262
+-20.1675018615076,43.8281420983652,25.6175539466612, 297P 263
+-20.0494199629582,46.407274172548,24.5303333280694, 297P 264
+-18.765993612595,51.4748972792453,24.415106772113, 297P 265
+-17.6094148966923,53.9768862700471,24.6950088461535, 297P 266
+-14.5521671539885,58.4144999160566,25.0665173479896, 297P 267
+-12.6639060743223,60.3526854251241,25.7860177866907, 297P 268
+-8.33441366537225,63.3938496895874,26.1358019166432, 297P 269
+-5.84582490630733,64.5088357633532,26.4507585706977, 297P 270
+-0.602004816394264,65.5115883988024,26.4066327478873, 297P 271
+2.1561796014904,65.3857658650269,25.9563675406208, 297P 272
+7.32562323962228,63.9134186119033,25.5654767344866, 297P 273
+9.71175226032634,62.5966308690251,24.8560610548458, 297P 274
+13.8226244133921,59.2214094394436,24.5375530403117, 297P 275
+15.5851497470399,57.1370673827832,24.4659459516302, 297P 276
+18.3024277920213,52.5582275834958,24.7372900289035, 297P 277
+19.2883538416977,49.9858031575922,26.1512883033246, 297P 278
+20.1689085596903,44.8822140051419,27.2881289276557, 297P 279
+20.0620990030854,42.3535852474281,29.9140038120082, 297P 280
+18.8247741323718,37.8076240013349,31.3843401697049, 297P 281
+17.7091152332303,35.7729876180556,34.1317790616451, 297P 282
+14.7026251557529,32.2943329711065,35.4330749735572, 297P 283
+12.7794613023048,30.8208760356573,37.4655191077208, 297P 284
+8.37016193654155,28.5928893971257,38.2135209407527, 297P 285
+5.83477838025855,27.8195098615177,38.8738455347674, 297P 286
+0.560446377511514,27.1357514678676,38.7890400156121, 297P 287
+-2.18190266433371,27.2211745526813,37.7943688672823, 297P 288
+-7.4138750527059,28.2575403199749,36.90916009877, 297P 289
+-9.82538806915516,29.1836862372981,34.6399298961, 297P 290
+-14.0237828769544,31.7251878646779,0.0,1.0,0.0,0.0,0.0,0,0; 297P 291
+142,0,271,295,297,3,0,0; 299P 292
+144,271,1,1,293,299,0,0; 301P 293
+124,0.499999999999996,-0.866025403784441,0.0,0.0, 303P 294
+-0.866025403784441,-0.499999999999996,0.0,0.0,0.0,0.0,-1.0,0.0, 303P 295
+0,0; 303P 296
+124,-0.500000000000003,-0.866025403784437,0.0,0.0, 305P 297
+-0.866025403784437,0.500000000000003,0.0,0.0,0.0,0.0,-1.0,0.0,0, 305P 298
+0; 305P 299
+124,-0.500000000000003,0.866025403784437,0.0,0.0, 307P 300
+0.866025403784437,0.500000000000003,0.0,0.0,0.0,0.0,-1.0,0.0,0, 307P 301
+0; 307P 302
+124,0.499999999999996,0.866025403784441,0.0,0.0, 309P 303
+0.866025403784441,-0.499999999999996,0.0,0.0,0.0,0.0,-1.0,0.0,0, 309P 304
+0; 309P 305
+128,1,1,1,1,0,0,1,0,0,0.0,0.0,1.0,1.0,0.0,0.0,1.0,1.0,1.0,1.0, 311P 306
+1.0,1.0,-63.25,-63.25,0.0,-63.25,63.25,0.0,63.25,-63.25,0.0, 311P 307
+63.25,63.25,0.0,0.0,1.0,0.0,1.0,0,0; 311P 308
+126,32,2,1,1,1,1,-0.0625,-0.0625,0.0,0.0625,0.0625,0.125,0.125, 313P 309
+0.1875,0.1875,0.25,0.25,0.3125,0.3125,0.375,0.375,0.4375,0.4375, 313P 310
+0.5,0.5,0.5625,0.5625,0.625,0.625,0.6875,0.6875,0.75,0.75, 313P 311
+0.8125,0.8125,0.875,0.875,0.9375,0.9375,1.0,1.0625,1.0625,1.0, 313P 312
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 313P 313
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 313P 314
+0.598276861353586,0.00592885375494062,0.0,0.401723138646414, 313P 315
+0.00592885375494062,0.0,0.310927157922386,0.0435377803797991, 313P 316
+0.0,0.220131177198359,0.0811467070046575,0.0,0.150638942101508, 313P 317
+0.150638942101508,0.0,0.0811467070046574,0.220131177198359,0.0, 313P 318
+0.0435377803797991,0.310927157922386,0.0,0.00592885375494068, 313P 319
+0.401723138646414,0.0,0.00592885375494068,0.5,0.0, 313P 320
+0.00592885375494068,0.598276861353586,0.0,0.0435377803797992, 313P 321
+0.689072842077614,0.0,0.0811467070046576,0.779868822801641,0.0, 313P 322
+0.150638942101508,0.849361057898492,0.0,0.220131177198359, 313P 323
+0.918853292995343,0.0,0.310927157922387,0.956462219620201,0.0, 313P 324
+0.401723138646414,0.994071146245059,0.0,0.5,0.994071146245059, 313P 325
+0.0,0.598276861353586,0.994071146245059,0.0,0.689072842077614, 313P 326
+0.956462219620201,0.0,0.779868822801641,0.918853292995343,0.0, 313P 327
+0.849361057898492,0.849361057898492,0.0,0.918853292995343, 313P 328
+0.779868822801641,0.0,0.956462219620201,0.689072842077614,0.0, 313P 329
+0.994071146245059,0.598276861353586,0.0,0.994071146245059,0.5, 313P 330
+0.0,0.994071146245059,0.401723138646414,0.0,0.956462219620201, 313P 331
+0.310927157922386,0.0,0.918853292995343,0.220131177198359,0.0, 313P 332
+0.849361057898492,0.150638942101508,0.0,0.779868822801641, 313P 333
+0.0811467070046575,0.0,0.689072842077613,0.043537780379799,0.0, 313P 334
+0.598276861353586,0.00592885375494062,0.0,0.401723138646414, 313P 335
+0.00592885375494062,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 313P 336
+100,0.0,0.0,0.0,62.5,0.0,62.5,-1.53080849893419E-14,0,0; 315P 337
+142,0,311,313,315,3,0,0; 317P 338
+126,16,2,1,1,1,1,-0.125,-0.125,0.0,0.125,0.125,0.25,0.25,0.375, 319P 339
+0.375,0.5,0.5,0.625,0.625,0.75,0.75,0.875,0.875,1.0,1.125,1.125, 319P 340
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 319P 341
+1.0,0.838582286231554,0.319643303323549,0.0,0.825484624180231, 319P 342
+0.29695748719029,0.0,0.82887454856543,0.284306117150911,0.0, 319P 343
+0.832264472950629,0.271654747111531,0.0,0.843607381017259, 319P 344
+0.26510591608587,0.0,0.854950289083888,0.258557085060208,0.0, 319P 345
+0.867601659123267,0.261947009445407,0.0,0.880253029162647, 319P 346
+0.265336933830606,0.0,0.886801860188308,0.276679841897236,0.0, 319P 347
+0.89335069121397,0.288022749963865,0.0,0.889960766828771, 319P 348
+0.300674120003244,0.0,0.886570842443572,0.313325490042624,0.0, 319P 349
+0.875227934376942,0.319874321068285,0.0,0.863885026310313, 319P 350
+0.326423152093947,0.0,0.851233656270934,0.323033227708748,0.0, 319P 351
+0.838582286231554,0.319643303323549,0.0,0.825484624180231, 319P 352
+0.29695748719029,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 319P 353
+100,0.0,-52.5,-1.27897692436818E-13,-48.5,-1.35003119794419E-13, 321P 354
+-48.5,-1.35982837233737E-13,0,0; 321P 355
+142,0,311,319,321,3,0,0; 323P 356
+126,16,2,1,1,1,1,-0.125,-0.125,0.0,0.125,0.125,0.25,0.25,0.375, 325P 357
+0.375,0.5,0.5,0.625,0.625,0.75,0.75,0.875,0.875,1.0,1.125,1.125, 325P 358
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 325P 359
+1.0,0.825484624180229,0.703042512809714,0.0,0.838582286231552, 325P 360
+0.680356696676456,0.0,0.851233656270931,0.676966772291257,0.0, 325P 361
+0.863885026310311,0.673576847906058,0.0,0.87522793437694, 325P 362
+0.680125678931719,0.0,0.886570842443569,0.686674509957381,0.0, 325P 363
+0.889960766828768,0.69932587999676,0.0,0.893350691213967, 325P 364
+0.71197725003614,0.0,0.886801860188305,0.723320158102769,0.0, 325P 365
+0.880253029162644,0.734663066169398,0.0,0.867601659123264, 325P 366
+0.738052990554597,0.0,0.854950289083885,0.741442914939796,0.0, 325P 367
+0.843607381017256,0.734894083914134,0.0,0.832264472950627, 325P 368
+0.728345252888473,0.0,0.828874548565428,0.715693882849094,0.0, 325P 369
+0.825484624180229,0.703042512809714,0.0,0.838582286231552, 325P 370
+0.680356696676456,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 325P 371
+100,0.0,-52.5,-1.17239551400417E-13,-48.5,-1.13686837721616E-13, 327P 372
+-48.5,-1.14666555160934E-13,0,0; 327P 373
+142,0,311,325,327,3,0,0; 329P 374
+126,16,2,1,1,1,1,-0.125,-0.125,0.0,0.125,0.125,0.25,0.25,0.375, 331P 375
+0.375,0.5,0.5,0.625,0.625,0.75,0.75,0.875,0.875,1.0,1.125,1.125, 331P 376
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 331P 377
+1.0,0.486902337948675,0.883399209486166,0.0,0.513097662051321, 331P 378
+0.883399209486166,0.0,0.522359107705502,0.892660655140347,0.0, 331P 379
+0.531620553359682,0.901922100794527,0.0,0.531620553359682, 331P 380
+0.91501976284585,0.0,0.531620553359682,0.928117424897173,0.0, 331P 381
+0.522359107705502,0.937378870551353,0.0,0.513097662051321, 331P 382
+0.946640316205534,0.0,0.499999999999998,0.946640316205534,0.0, 331P 383
+0.486902337948675,0.946640316205534,0.0,0.477640892294494, 331P 384
+0.937378870551353,0.0,0.468379446640314,0.928117424897173,0.0, 331P 385
+0.468379446640314,0.91501976284585,0.0,0.468379446640314, 331P 386
+0.901922100794527,0.0,0.477640892294495,0.892660655140346,0.0, 331P 387
+0.486902337948675,0.883399209486166,0.0,0.513097662051321, 331P 388
+0.883399209486166,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 331P 389
+100,0.0,-52.5,-1.23002813281165E-13,-48.5,-1.23002813281165E-13, 333P 390
+-48.5,-1.23982530720483E-13,0,0; 333P 391
+142,0,311,331,333,3,0,0; 335P 392
+126,16,2,1,1,1,1,-0.125,-0.125,0.0,0.125,0.125,0.25,0.25,0.375, 337P 393
+0.375,0.5,0.5,0.625,0.625,0.75,0.75,0.875,0.875,1.0,1.125,1.125, 337P 394
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 337P 395
+1.0,0.161417713768446,0.680356696676452,0.0,0.174515375819769, 337P 396
+0.703042512809711,0.0,0.17112545143457,0.71569388284909,0.0, 337P 397
+0.167735527049371,0.72834525288847,0.0,0.156392618982742, 337P 398
+0.734894083914131,0.0,0.145049710916113,0.741442914939793,0.0, 337P 399
+0.132398340876733,0.738052990554594,0.0,0.119746970837354, 337P 400
+0.734663066169395,0.0,0.113198139811693,0.723320158102765,0.0, 337P 401
+0.106649308786031,0.711977250036136,0.0,0.11003923317123, 337P 402
+0.699325879996757,0.0,0.113429157556429,0.686674509957378,0.0, 337P 403
+0.124772065623058,0.680125678931716,0.0,0.136114973689688, 337P 404
+0.673576847906054,0.0,0.148766343729067,0.676966772291253,0.0, 337P 405
+0.161417713768446,0.680356696676452,0.0,0.174515375819769, 337P 406
+0.703042512809711,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 337P 407
+100,0.0,-52.5,-1.24344978758018E-13,-48.5,-1.27897692436818E-13, 339P 408
+-48.5,-1.28877409876136E-13,0,0; 339P 409
+142,0,311,337,339,3,0,0; 341P 410
+126,16,2,1,1,1,1,-0.125,-0.125,0.0,0.125,0.125,0.25,0.25,0.375, 343P 411
+0.375,0.5,0.5,0.625,0.625,0.75,0.75,0.875,0.875,1.0,1.125,1.125, 343P 412
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 343P 413
+1.0,0.174515375819771,0.296957487190287,0.0,0.161417713768447, 343P 414
+0.319643303323545,0.0,0.148766343729068,0.323033227708744,0.0, 343P 415
+0.136114973689689,0.326423152093943,0.0,0.12477206562306, 343P 416
+0.319874321068281,0.0,0.11342915755643,0.31332549004262,0.0, 343P 417
+0.110039233171231,0.300674120003241,0.0,0.106649308786032, 343P 418
+0.288022749963861,0.0,0.113198139811694,0.276679841897232,0.0, 343P 419
+0.119746970837356,0.265336933830603,0.0,0.132398340876735, 343P 420
+0.261947009445404,0.0,0.145049710916114,0.258557085060205,0.0, 343P 421
+0.156392618982743,0.265105916085866,0.0,0.167735527049373, 343P 422
+0.271654747111528,0.0,0.171125451434572,0.284306117150907,0.0, 343P 423
+0.174515375819771,0.296957487190287,0.0,0.161417713768447, 343P 424
+0.319643303323545,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 343P 425
+100,0.0,-52.5,-1.20792265079217E-13,-48.5,-1.17239551400417E-13, 345P 426
+-48.5,-1.18219268839734E-13,0,0; 345P 427
+142,0,311,343,345,3,0,0; 347P 428
+126,16,2,1,1,1,1,-0.125,-0.125,0.0,0.125,0.125,0.25,0.25,0.375, 349P 429
+0.375,0.5,0.5,0.625,0.625,0.75,0.75,0.875,0.875,1.0,1.125,1.125, 349P 430
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 349P 431
+1.0,0.513097662051324,0.116600790513834,0.0,0.486902337948678, 349P 432
+0.116600790513834,0.0,0.477640892294497,0.107339344859653,0.0, 349P 433
+0.468379446640317,0.0980778992054732,0.0,0.468379446640317, 349P 434
+0.08498023715415,0.0,0.468379446640317,0.0718825751028269,0.0, 349P 435
+0.477640892294497,0.0626211294486466,0.0,0.486902337948678, 349P 436
+0.0533596837944662,0.0,0.500000000000001,0.0533596837944662,0.0, 349P 437
+0.513097662051324,0.0533596837944662,0.0,0.522359107705504, 349P 438
+0.0626211294486466,0.0,0.531620553359685,0.071882575102827,0.0, 349P 439
+0.531620553359685,0.08498023715415,0.0,0.531620553359685, 349P 440
+0.0980778992054731,0.0,0.522359107705504,0.107339344859653,0.0, 349P 441
+0.513097662051324,0.116600790513834,0.0,0.486902337948678, 349P 442
+0.116600790513834,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 349P 443
+100,0.0,-52.5,-1.23002813281165E-13,-48.5,-1.26555526959965E-13, 351P 444
+-48.5,-1.27535244399283E-13,0,0; 351P 445
+142,0,311,349,351,3,0,0; 353P 446
+126,32,2,1,1,1,1,-0.0625,-0.0625,0.0,0.0625,0.0625,0.125,0.125, 355P 447
+0.1875,0.1875,0.25,0.25,0.3125,0.3125,0.375,0.375,0.4375,0.4375, 355P 448
+0.5,0.5,0.5625,0.5625,0.625,0.625,0.6875,0.6875,0.75,0.75, 355P 449
+0.8125,0.8125,0.875,0.875,0.9375,0.9375,1.0,1.0625,1.0625,1.0, 355P 450
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 355P 451
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 355P 452
+0.562493181104116,0.814174437353297,0.0,0.437506818895884, 355P 453
+0.814174437353297,0.0,0.379770647952269,0.790259332308961,0.0, 355P 454
+0.322034477008655,0.766344227264624,0.0,0.277845124872015, 355P 455
+0.722154875127985,0.0,0.233655772735376,0.677965522991345,0.0, 355P 456
+0.209740667691039,0.620229352047731,0.0,0.185825562646703, 355P 457
+0.562493181104116,0.0,0.185825562646703,0.5,0.0, 355P 458
+0.185825562646703,0.437506818895884,0.0,0.209740667691039, 355P 459
+0.379770647952269,0.0,0.233655772735376,0.322034477008655,0.0, 355P 460
+0.277845124872015,0.277845124872015,0.0,0.322034477008655, 355P 461
+0.233655772735376,0.0,0.379770647952269,0.209740667691039,0.0, 355P 462
+0.437506818895884,0.185825562646703,0.0,0.5,0.185825562646703, 355P 463
+0.0,0.562493181104116,0.185825562646703,0.0,0.620229352047731, 355P 464
+0.209740667691039,0.0,0.677965522991345,0.233655772735376,0.0, 355P 465
+0.722154875127985,0.277845124872015,0.0,0.766344227264624, 355P 466
+0.322034477008655,0.0,0.790259332308961,0.379770647952269,0.0, 355P 467
+0.814174437353297,0.437506818895884,0.0,0.814174437353297,0.5, 355P 468
+0.0,0.814174437353297,0.562493181104116,0.0,0.790259332308961, 355P 469
+0.620229352047731,0.0,0.766344227264624,0.677965522991345,0.0, 355P 470
+0.722154875127985,0.722154875127985,0.0,0.677965522991345, 355P 471
+0.766344227264624,0.0,0.620229352047731,0.790259332308961,0.0, 355P 472
+0.562493181104116,0.814174437353297,0.0,0.437506818895884, 355P 473
+0.814174437353297,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 355P 474
+100,0.0,0.0,0.0,39.7430663251921,0.0,39.7430663251921, 357P 475
+-9.73424379268949E-15,0,0; 357P 476
+142,0,311,355,357,3,0,0; 359P 477
+144,311,1,7,317,323,329,335,341,347,353,359,0,0; 361P 478
+128,1,1,1,1,0,0,1,0,0,0.0,0.0,1.0,1.0,0.0,0.0,1.0,1.0,1.0,1.0, 363P 479
+1.0,1.0,63.25,-63.25,8.0,63.25,63.25,8.0,-63.25,-63.25,8.0, 363P 480
+-63.25,63.25,8.0,0.0,1.0,0.0,1.0,0,0; 363P 481
+126,32,2,1,1,1,1,-0.0625,-0.0625,0.0,0.0625,0.0625,0.125,0.125, 365P 482
+0.1875,0.1875,0.25,0.25,0.3125,0.3125,0.375,0.375,0.4375,0.4375, 365P 483
+0.5,0.5,0.5625,0.5625,0.625,0.625,0.6875,0.6875,0.75,0.75, 365P 484
+0.8125,0.8125,0.875,0.875,0.9375,0.9375,1.0,1.0625,1.0625,1.0, 365P 485
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 365P 486
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 365P 487
+0.401723138646414,0.994071146245059,0.0,0.598276861353586, 365P 488
+0.994071146245059,0.0,0.689072842077614,0.956462219620201,0.0, 365P 489
+0.779868822801641,0.918853292995343,0.0,0.849361057898492, 365P 490
+0.849361057898492,0.0,0.918853292995343,0.779868822801641,0.0, 365P 491
+0.956462219620201,0.689072842077614,0.0,0.994071146245059, 365P 492
+0.598276861353586,0.0,0.994071146245059,0.5,0.0, 365P 493
+0.994071146245059,0.401723138646414,0.0,0.956462219620201, 365P 494
+0.310927157922387,0.0,0.918853292995343,0.220131177198359,0.0, 365P 495
+0.849361057898492,0.150638942101508,0.0,0.779868822801641, 365P 496
+0.0811467070046573,0.0,0.689072842077614,0.0435377803797991,0.0, 365P 497
+0.598276861353586,0.00592885375494068,0.0,0.5, 365P 498
+0.00592885375494068,0.0,0.401723138646414,0.00592885375494068, 365P 499
+0.0,0.310927157922387,0.043537780379799,0.0,0.220131177198359, 365P 500
+0.0811467070046573,0.0,0.150638942101508,0.150638942101508,0.0, 365P 501
+0.0811467070046575,0.220131177198359,0.0,0.0435377803797992, 365P 502
+0.310927157922386,0.0,0.00592885375494068,0.401723138646414,0.0, 365P 503
+0.00592885375494068,0.5,0.0,0.00592885375494068, 365P 504
+0.598276861353586,0.0,0.0435377803797991,0.689072842077614,0.0, 365P 505
+0.0811467070046574,0.779868822801641,0.0,0.150638942101508, 365P 506
+0.849361057898492,0.0,0.220131177198359,0.918853292995342,0.0, 365P 507
+0.310927157922386,0.956462219620201,0.0,0.401723138646414, 365P 508
+0.994071146245059,0.0,0.598276861353586,0.994071146245059,0.0, 365P 509
+0.0,1.0,0.0,0.0,1.0,0,0; 365P 510
+100,-8.0,0.0,0.0,62.5,0.0,62.5,-1.53080849893419E-14,0,0; 367P 511
+142,0,363,365,367,3,0,0; 369P 512
+126,16,2,1,1,1,1,-0.125,-0.125,0.0,0.125,0.125,0.25,0.25,0.375, 371P 513
+0.375,0.5,0.5,0.625,0.625,0.75,0.75,0.875,0.875,1.0,1.125,1.125, 371P 514
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 371P 515
+1.0,0.872515319748424,0.739130434782606,0.0,0.846319995645777, 371P 516
+0.739130434782606,0.0,0.837058549991597,0.729868989128426,0.0, 371P 517
+0.827797104337417,0.720607543474246,0.0,0.827797104337417, 371P 518
+0.707509881422922,0.0,0.827797104337417,0.694412219371599,0.0, 371P 519
+0.837058549991597,0.685150773717419,0.0,0.846319995645777, 371P 520
+0.675889328063239,0.0,0.8594176576971,0.675889328063239,0.0, 371P 521
+0.872515319748424,0.675889328063239,0.0,0.881776765402604, 371P 522
+0.685150773717419,0.0,0.891038211056784,0.694412219371599,0.0, 371P 523
+0.891038211056784,0.707509881422922,0.0,0.891038211056784, 371P 524
+0.720607543474246,0.0,0.881776765402604,0.729868989128426,0.0, 371P 525
+0.872515319748424,0.739130434782606,0.0,0.846319995645777, 371P 526
+0.739130434782606,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 371P 527
+100,8.0,26.2499999999997,-45.4663336986832,30.2499999999997, 373P 528
+-45.4663336986832,30.2499999999997,-45.4663336986832,0,0; 373P 529
+142,0,363,371,373,3,0,0; 375P 530
+126,16,2,1,1,1,1,-0.125,-0.125,0.0,0.125,0.125,0.25,0.25,0.375, 377P 531
+0.375,0.5,0.5,0.625,0.625,0.75,0.75,0.875,0.875,1.0,1.125,1.125, 377P 532
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 377P 533
+1.0,0.872515319748421,0.324110671936757,0.0,0.846319995645775, 377P 534
+0.324110671936757,0.0,0.837058549991594,0.314849226282577,0.0, 377P 535
+0.827797104337414,0.305587780628396,0.0,0.827797104337414, 377P 536
+0.292490118577073,0.0,0.827797104337414,0.27939245652575,0.0, 377P 537
+0.837058549991594,0.27013101087157,0.0,0.846319995645775, 377P 538
+0.260869565217389,0.0,0.859417657697098,0.260869565217389,0.0, 377P 539
+0.872515319748421,0.260869565217389,0.0,0.881776765402601, 377P 540
+0.27013101087157,0.0,0.891038211056782,0.27939245652575,0.0, 377P 541
+0.891038211056782,0.292490118577073,0.0,0.891038211056782, 377P 542
+0.305587780628396,0.0,0.881776765402601,0.314849226282577,0.0, 377P 543
+0.872515319748421,0.324110671936757,0.0,0.846319995645775, 377P 544
+0.324110671936757,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 377P 545
+100,8.0,-26.2500000000002,-45.4663336986829,-22.2500000000002, 379P 546
+-45.4663336986829,-22.2500000000002,-45.4663336986829,0,0; 379P 547
+142,0,363,377,379,3,0,0; 381P 548
+126,16,2,1,1,1,1,-0.125,-0.125,0.0,0.125,0.125,0.25,0.25,0.375, 383P 549
+0.375,0.5,0.5,0.625,0.625,0.75,0.75,0.875,0.875,1.0,1.125,1.125, 383P 550
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 383P 551
+1.0,0.513097662051321,0.116600790513834,0.0,0.486902337948675, 383P 552
+0.116600790513834,0.0,0.477640892294495,0.107339344859654,0.0, 383P 553
+0.468379446640314,0.0980778992054734,0.0,0.468379446640314, 383P 554
+0.0849802371541502,0.0,0.468379446640314,0.071882575102827,0.0, 383P 555
+0.477640892294495,0.0626211294486467,0.0,0.486902337948675, 383P 556
+0.0533596837944664,0.0,0.499999999999998,0.0533596837944664,0.0, 383P 557
+0.513097662051321,0.0533596837944664,0.0,0.522359107705502, 383P 558
+0.0626211294486467,0.0,0.531620553359682,0.071882575102827,0.0, 383P 559
+0.531620553359682,0.0849802371541502,0.0,0.531620553359682, 383P 560
+0.0980778992054734,0.0,0.522359107705502,0.107339344859654,0.0, 383P 561
+0.513097662051321,0.116600790513834,0.0,0.486902337948675, 383P 562
+0.116600790513834,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 383P 563
+100,8.0,-52.5,2.4600562656233E-13,-48.5,2.49558340241131E-13, 385P 564
+-48.5,2.48578622801813E-13,0,0; 385P 565
+142,0,363,383,385,3,0,0; 387P 566
+126,16,2,1,1,1,1,-0.125,-0.125,0.0,0.125,0.125,0.25,0.25,0.375, 389P 567
+0.375,0.5,0.5,0.625,0.625,0.75,0.75,0.875,0.875,1.0,1.125,1.125, 389P 568
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 389P 569
+1.0,0.153680004354223,0.32411067193676,0.0,0.127484680251577, 389P 570
+0.32411067193676,0.0,0.118223234597397,0.31484922628258,0.0, 389P 571
+0.108961788943216,0.3055877806284,0.0,0.108961788943216, 389P 572
+0.292490118577077,0.0,0.108961788943216,0.279392456525753,0.0, 389P 573
+0.118223234597397,0.270131010871573,0.0,0.127484680251577, 389P 574
+0.260869565217393,0.0,0.1405823423029,0.260869565217393,0.0, 389P 575
+0.153680004354223,0.260869565217393,0.0,0.162941450008404, 389P 576
+0.270131010871573,0.0,0.172202895662584,0.279392456525753,0.0, 389P 577
+0.172202895662584,0.292490118577077,0.0,0.172202895662584, 389P 578
+0.3055877806284,0.0,0.162941450008404,0.31484922628258,0.0, 389P 579
+0.153680004354223,0.32411067193676,0.0,0.127484680251577, 389P 580
+0.32411067193676,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 389P 581
+100,8.0,-26.2499999999998,45.4663336986831,-22.2499999999998, 391P 582
+45.4663336986831,-22.2499999999998,45.4663336986831,0,0; 391P 583
+142,0,363,389,391,3,0,0; 393P 584
+126,16,2,1,1,1,1,-0.125,-0.125,0.0,0.125,0.125,0.25,0.25,0.375, 395P 585
+0.375,0.5,0.5,0.625,0.625,0.75,0.75,0.875,0.875,1.0,1.125,1.125, 395P 586
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 395P 587
+1.0,0.153680004354225,0.73913043478261,0.0,0.127484680251578, 395P 588
+0.73913043478261,0.0,0.118223234597398,0.729868989128429,0.0, 395P 589
+0.108961788943218,0.720607543474249,0.0,0.108961788943218, 395P 590
+0.707509881422926,0.0,0.108961788943218,0.694412219371603,0.0, 395P 591
+0.118223234597398,0.685150773717423,0.0,0.127484680251578, 395P 592
+0.675889328063242,0.0,0.140582342302902,0.675889328063242,0.0, 395P 593
+0.153680004354225,0.675889328063242,0.0,0.162941450008405, 395P 594
+0.685150773717423,0.0,0.172202895662585,0.694412219371603,0.0, 395P 595
+0.172202895662585,0.707509881422926,0.0,0.172202895662585, 395P 596
+0.720607543474249,0.0,0.162941450008405,0.729868989128429,0.0, 395P 597
+0.153680004354225,0.73913043478261,0.0,0.127484680251578, 395P 598
+0.73913043478261,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 395P 599
+100,8.0,26.2500000000001,45.4663336986829,30.2500000000001, 397P 600
+45.4663336986829,30.2500000000001,45.4663336986829,0,0; 397P 601
+142,0,363,395,397,3,0,0; 399P 602
+126,16,2,1,1,1,1,-0.125,-0.125,0.0,0.125,0.125,0.25,0.25,0.375, 401P 603
+0.375,0.5,0.5,0.625,0.625,0.75,0.75,0.875,0.875,1.0,1.125,1.125, 401P 604
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 401P 605
+1.0,0.513097662051324,0.946640316205534,0.0,0.486902337948678, 401P 606
+0.946640316205534,0.0,0.477640892294497,0.937378870551353,0.0, 401P 607
+0.468379446640317,0.928117424897173,0.0,0.468379446640317, 401P 608
+0.91501976284585,0.0,0.468379446640317,0.901922100794527,0.0, 401P 609
+0.477640892294497,0.892660655140346,0.0,0.486902337948678, 401P 610
+0.883399209486166,0.0,0.500000000000001,0.883399209486166,0.0, 401P 611
+0.513097662051324,0.883399209486166,0.0,0.522359107705504, 401P 612
+0.892660655140346,0.0,0.531620553359685,0.901922100794527,0.0, 401P 613
+0.531620553359685,0.91501976284585,0.0,0.531620553359685, 401P 614
+0.928117424897173,0.0,0.522359107705504,0.937378870551353,0.0, 401P 615
+0.513097662051324,0.946640316205534,0.0,0.486902337948678, 401P 616
+0.946640316205534,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 401P 617
+100,8.0,52.5,-1.23002813281165E-13,56.5,-1.26555526959965E-13, 403P 618
+56.5,-1.27535244399283E-13,0,0; 403P 619
+142,0,363,401,403,3,0,0; 405P 620
+126,32,2,1,1,1,1,-0.0625,-0.0625,0.0,0.0625,0.0625,0.125,0.125, 407P 621
+0.1875,0.1875,0.25,0.25,0.3125,0.3125,0.375,0.375,0.4375,0.4375, 407P 622
+0.5,0.5,0.5625,0.5625,0.625,0.625,0.6875,0.6875,0.75,0.75, 407P 623
+0.8125,0.8125,0.875,0.875,0.9375,0.9375,1.0,1.0625,1.0625,1.0, 407P 624
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 407P 625
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 407P 626
+0.570759340174581,0.85573122529644,0.0,0.429240659825418, 407P 627
+0.85573122529644,0.0,0.363867553704119,0.828652798126542,0.0, 407P 628
+0.29849444758282,0.801574370956645,0.0,0.248460038313088, 407P 629
+0.751539961686912,0.0,0.198425629043355,0.70150555241718,0.0, 407P 630
+0.171347201873458,0.636132446295881,0.0,0.14426877470356, 407P 631
+0.570759340174581,0.0,0.14426877470356,0.5,0.0,0.14426877470356, 407P 632
+0.429240659825419,0.0,0.171347201873458,0.363867553704119,0.0, 407P 633
+0.198425629043356,0.29849444758282,0.0,0.248460038313088, 407P 634
+0.248460038313088,0.0,0.29849444758282,0.198425629043355,0.0, 407P 635
+0.363867553704119,0.171347201873458,0.0,0.429240659825419, 407P 636
+0.14426877470356,0.0,0.5,0.14426877470356,0.0,0.570759340174581, 407P 637
+0.14426877470356,0.0,0.636132446295881,0.171347201873458,0.0, 407P 638
+0.70150555241718,0.198425629043355,0.0,0.751539961686912, 407P 639
+0.248460038313088,0.0,0.801574370956645,0.29849444758282,0.0, 407P 640
+0.828652798126542,0.363867553704119,0.0,0.85573122529644, 407P 641
+0.429240659825419,0.0,0.85573122529644,0.5,0.0,0.85573122529644, 407P 642
+0.570759340174581,0.0,0.828652798126542,0.636132446295881,0.0, 407P 643
+0.801574370956645,0.70150555241718,0.0,0.751539961686912, 407P 644
+0.751539961686912,0.0,0.70150555241718,0.801574370956645,0.0, 407P 645
+0.636132446295881,0.828652798126542,0.0,0.570759340174581, 407P 646
+0.85573122529644,0.0,0.429240659825418,0.85573122529644,0.0,0.0, 407P 647
+1.0,0.0,0.0,1.0,0,0; 407P 648
+100,8.00000000000001,0.0,0.0,44.9999999999997,0.0, 409P 649
+44.9999999999997,-1.10218211923261E-14,0,0; 409P 650
+142,0,363,407,409,3,0,0; 411P 651
+144,363,1,7,369,375,381,387,393,399,405,411,0,0; 413P 652
+128,6,1,3,1,0,0,0,0,0,0.0,0.0,0.0,0.0,0.5,0.5,0.5,1.0,1.0,1.0, 415P 653
+1.0,0.0,0.0,1.0,1.0,1.0,0.333333333333333,0.333333333333333,1.0, 415P 654
+0.333333333333333,0.333333333333333,1.0,1.0,0.333333333333333, 415P 655
+0.333333333333333,1.0,0.333333333333333,0.333333333333333,1.0, 415P 656
+-62.5,0.0,8.8,-62.5,125.0,8.8,62.5,125.0,8.8,62.5, 415P 657
+7.65404249467096E-15,8.8,62.5,-125.0,8.8,-62.5,-125.0,8.8,-62.5, 415P 658
+0.0,8.8,-62.5,0.0,-0.8,-62.5,125.0,-0.8,62.5,125.0,-0.8,62.5, 415P 659
+7.65404249467096E-15,-0.8,62.5,-125.0,-0.8,-62.5,-125.0,-0.8, 415P 660
+-62.5,0.0,-0.8,0.0,1.0,0.0,1.0,0,0; 415P 661
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,0.0833333333333334, 417P 662
+0.0,1.0,0.0833333333333334,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 417P 663
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,0.0833333333333334, 419P 664
+0.0,1.0,0.916666666666667,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 419P 665
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,0.916666666666667, 421P 666
+0.0,0.0,0.916666666666667,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 421P 667
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,0.916666666666667, 423P 668
+0.0,0.0,0.0833333333333334,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 423P 669
+102,4,417,419,421,423,0,0; 425P 670
+100,-8.0,0.0,0.0,62.5,0.0,62.5,-1.53080849893419E-14,0,0; 427P 671
+110,-62.5,0.0,8.0,-62.5,0.0,0.0,0,0; 429P 672
+100,0.0,0.0,0.0,62.5,0.0,62.5,-1.53080849893419E-14,0,0; 431P 673
+110,-62.5,0.0,0.0,-62.5,0.0,8.0,0,0; 433P 674
+102,4,427,429,431,433,0,0; 435P 675
+142,0,415,425,435,3,0,0; 437P 676
+144,415,1,0,437,0,0; 439P 677
+128,1,1,1,1,0,0,1,0,0,0.0,0.0,1.0,1.0,0.0,0.0,1.0,1.0,1.0,1.0, 441P 678
+1.0,1.0,24.1828571428572,-24.1828571428572,73.0, 441P 679
+24.1828571428572,24.1828571428572,73.0,-24.1828571428572, 441P 680
+-24.1828571428572,73.0,-24.1828571428572,24.1828571428572,73.0, 441P 681
+0.0,1.0,0.0,1.0,0,0; 441P 682
+126,32,2,1,1,1,1,-0.0625,-0.0625,0.0,0.0625,0.0625,0.125,0.125, 443P 683
+0.1875,0.1875,0.25,0.25,0.3125,0.3125,0.375,0.375,0.4375,0.4375, 443P 684
+0.5,0.5,0.5625,0.5625,0.625,0.625,0.6875,0.6875,0.75,0.75, 443P 685
+0.8125,0.8125,0.875,0.875,0.9375,0.9375,1.0,1.0625,1.0625,1.0, 443P 686
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 443P 687
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 443P 688
+0.401723138646414,0.994071146245059,0.0,0.598276861353586, 443P 689
+0.994071146245059,0.0,0.689072842077614,0.956462219620201,0.0, 443P 690
+0.779868822801641,0.918853292995343,0.0,0.849361057898492, 443P 691
+0.849361057898492,0.0,0.918853292995343,0.779868822801641,0.0, 443P 692
+0.956462219620201,0.689072842077614,0.0,0.994071146245059, 443P 693
+0.598276861353586,0.0,0.994071146245059,0.5,0.0, 443P 694
+0.994071146245059,0.401723138646414,0.0,0.956462219620201, 443P 695
+0.310927157922387,0.0,0.918853292995343,0.220131177198359,0.0, 443P 696
+0.849361057898492,0.150638942101508,0.0,0.779868822801641, 443P 697
+0.0811467070046573,0.0,0.689072842077614,0.043537780379799,0.0, 443P 698
+0.598276861353586,0.00592885375494075,0.0,0.5, 443P 699
+0.00592885375494075,0.0,0.401723138646414,0.00592885375494075, 443P 700
+0.0,0.310927157922387,0.0435377803797989,0.0,0.220131177198359, 443P 701
+0.0811467070046573,0.0,0.150638942101508,0.150638942101508,0.0, 443P 702
+0.0811467070046576,0.220131177198359,0.0,0.0435377803797992, 443P 703
+0.310927157922386,0.0,0.00592885375494072,0.401723138646414,0.0, 443P 704
+0.00592885375494072,0.5,0.0,0.00592885375494072, 443P 705
+0.598276861353586,0.0,0.0435377803797991,0.689072842077614,0.0, 443P 706
+0.0811467070046574,0.779868822801641,0.0,0.150638942101508, 443P 707
+0.849361057898492,0.0,0.220131177198359,0.918853292995342,0.0, 443P 708
+0.310927157922386,0.956462219620201,0.0,0.401723138646414, 443P 709
+0.994071146245059,0.0,0.598276861353586,0.994071146245059,0.0, 443P 710
+0.0,1.0,0.0,0.0,1.0,0,0; 443P 711
+100,-73.0,0.0,0.0,23.8961038961039,0.0,23.8961038961039, 445P 712
+-5.85285742969126E-15,0,0; 445P 713
+142,0,441,443,445,3,0,0; 447P 714
+126,32,2,1,1,1,1,-0.0625,-0.0625,0.0,0.0625,0.0625,0.125,0.125, 449P 715
+0.1875,0.1875,0.25,0.25,0.3125,0.3125,0.375,0.375,0.4375,0.4375, 449P 716
+0.5,0.5,0.5625,0.5625,0.625,0.625,0.6875,0.6875,0.75,0.75, 449P 717
+0.8125,0.8125,0.875,0.875,0.9375,0.9375,1.0,1.0625,1.0625,1.0, 449P 718
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 449P 719
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 449P 720
+0.571971777540194,0.861826559546315,0.0,0.428028222459806, 449P 721
+0.861826559546315,0.0,0.361534970271964,0.834284152683817,0.0, 449P 722
+0.295041718084123,0.806741745821318,0.0,0.244149986131403, 449P 723
+0.755850013868597,0.0,0.193258254178682,0.704958281915877,0.0, 449P 724
+0.165715847316183,0.638465029728035,0.0,0.138173440453685, 449P 725
+0.571971777540194,0.0,0.138173440453685,0.5,0.0, 449P 726
+0.138173440453685,0.428028222459806,0.0,0.165715847316183, 449P 727
+0.361534970271964,0.0,0.193258254178682,0.295041718084123,0.0, 449P 728
+0.244149986131403,0.244149986131403,0.0,0.295041718084124, 449P 729
+0.193258254178682,0.0,0.361534970271965,0.165715847316183,0.0, 449P 730
+0.428028222459806,0.138173440453685,0.0,0.5,0.138173440453685, 449P 731
+0.0,0.571971777540194,0.138173440453685,0.0,0.638465029728035, 449P 732
+0.165715847316183,0.0,0.704958281915876,0.193258254178682,0.0, 449P 733
+0.755850013868597,0.244149986131403,0.0,0.806741745821318, 449P 734
+0.295041718084124,0.0,0.834284152683817,0.361534970271965,0.0, 449P 735
+0.861826559546315,0.428028222459806,0.0,0.861826559546315,0.5, 449P 736
+0.0,0.861826559546315,0.571971777540194,0.0,0.834284152683817, 449P 737
+0.638465029728035,0.0,0.806741745821318,0.704958281915876,0.0, 449P 738
+0.755850013868597,0.755850013868597,0.0,0.704958281915876, 449P 739
+0.806741745821318,0.0,0.638465029728035,0.834284152683817,0.0, 449P 740
+0.571971777540194,0.861826559546315,0.0,0.428028222459806, 449P 741
+0.861826559546315,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 449P 742
+100,73.0,0.0,0.0,17.5000000000001,0.0,17.5000000000001, 451P 743
+-4.28626379701576E-15,0,0; 451P 744
+142,0,441,449,451,3,0,0; 453P 745
+144,441,1,1,447,453,0,0; 455P 746
+128,1,1,1,1,0,0,1,0,0,0.0,0.0,1.0,1.0,0.0,0.0,1.0,1.0,1.0,1.0, 457P 747
+1.0,1.0,17.7100000000001,-17.7100000000001,85.0, 457P 748
+17.7100000000001,17.7100000000001,85.0,-17.7100000000001, 457P 749
+-17.7100000000001,85.0,-17.7100000000001,17.7100000000001,85.0, 457P 750
+0.0,1.0,0.0,1.0,0,0; 457P 751
+126,32,2,1,1,1,1,-0.0625,-0.0625,0.0,0.0625,0.0625,0.125,0.125, 459P 752
+0.1875,0.1875,0.25,0.25,0.3125,0.3125,0.375,0.375,0.4375,0.4375, 459P 753
+0.5,0.5,0.5625,0.5625,0.625,0.625,0.6875,0.6875,0.75,0.75, 459P 754
+0.8125,0.8125,0.875,0.875,0.9375,0.9375,1.0,1.0625,1.0625,1.0, 459P 755
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 459P 756
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 459P 757
+0.401723138646414,0.994071146245059,0.0,0.598276861353586, 459P 758
+0.994071146245059,0.0,0.689072842077614,0.956462219620201,0.0, 459P 759
+0.779868822801641,0.918853292995343,0.0,0.849361057898492, 459P 760
+0.849361057898492,0.0,0.918853292995343,0.779868822801641,0.0, 459P 761
+0.956462219620201,0.689072842077614,0.0,0.994071146245059, 459P 762
+0.598276861353586,0.0,0.994071146245059,0.5,0.0, 459P 763
+0.994071146245059,0.401723138646414,0.0,0.956462219620201, 459P 764
+0.310927157922387,0.0,0.918853292995343,0.220131177198359,0.0, 459P 765
+0.849361057898492,0.150638942101508,0.0,0.779868822801641, 459P 766
+0.0811467070046574,0.0,0.689072842077614,0.0435377803797991,0.0, 459P 767
+0.598276861353586,0.00592885375494073,0.0,0.5, 459P 768
+0.00592885375494073,0.0,0.401723138646414,0.00592885375494073, 459P 769
+0.0,0.310927157922387,0.043537780379799,0.0,0.220131177198359, 459P 770
+0.0811467070046573,0.0,0.150638942101508,0.150638942101508,0.0, 459P 771
+0.0811467070046576,0.220131177198359,0.0,0.0435377803797992, 459P 772
+0.310927157922386,0.0,0.00592885375494074,0.401723138646414,0.0, 459P 773
+0.00592885375494073,0.5,0.0,0.00592885375494073, 459P 774
+0.598276861353586,0.0,0.0435377803797991,0.689072842077614,0.0, 459P 775
+0.0811467070046574,0.779868822801641,0.0,0.150638942101508, 459P 776
+0.849361057898492,0.0,0.220131177198359,0.918853292995342,0.0, 459P 777
+0.310927157922386,0.956462219620201,0.0,0.401723138646414, 459P 778
+0.994071146245059,0.0,0.598276861353586,0.994071146245059,0.0, 459P 779
+0.0,1.0,0.0,0.0,1.0,0,0; 459P 780
+100,-85.0,0.0,0.0,17.5000000000001,0.0,17.5000000000001, 461P 781
+-4.28626379701576E-15,0,0; 461P 782
+142,0,457,459,461,3,0,0; 463P 783
+126,16,2,1,1,1,1,-0.125,-0.125,0.0,0.125,0.125,0.25,0.25,0.375, 465P 784
+0.375,0.5,0.5,0.625,0.625,0.75,0.75,0.875,0.875,1.0,1.125,1.125, 465P 785
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 465P 786
+1.0,0.646179263965659,0.852907961603612,0.0,0.353820736034341, 465P 787
+0.852907961603612,0.0,0.250456387215364,0.749543612784635,0.0, 465P 788
+0.147092038396388,0.646179263965659,0.0,0.147092038396388,0.5, 465P 789
+0.0,0.147092038396388,0.35382073603434,0.0,0.250456387215364, 465P 790
+0.250456387215364,0.0,0.35382073603434,0.147092038396388,0.0, 465P 791
+0.5,0.147092038396388,0.0,0.64617926396566,0.147092038396388, 465P 792
+0.0,0.749543612784636,0.250456387215364,0.0,0.852907961603612, 465P 793
+0.353820736034341,0.0,0.852907961603612,0.5,0.0, 465P 794
+0.852907961603612,0.646179263965659,0.0,0.749543612784636, 465P 795
+0.749543612784636,0.0,0.646179263965659,0.852907961603612,0.0, 465P 796
+0.353820736034341,0.852907961603612,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 465P 797
+100,85.0,0.0,0.0,12.5,0.0,12.5,-3.06161699786838E-15,0,0; 467P 798
+142,0,457,465,467,3,0,0; 469P 799
+144,457,1,1,463,469,0,0; 471P 800
+128,6,1,3,1,0,0,0,0,0,0.0,0.0,0.0,0.0,0.5,0.5,0.5,1.0,1.0,1.0, 473P 801
+1.0,0.0,0.0,1.0,1.0,1.0,0.333333333333333,0.333333333333333,1.0, 473P 802
+0.333333333333333,0.333333333333333,1.0,1.0,0.333333333333333, 473P 803
+0.333333333333333,1.0,0.333333333333333,0.333333333333333,1.0, 473P 804
+-17.5000000000001,0.0,85.0,-17.5000000000001,35.0000000000002, 473P 805
+85.0,17.5000000000001,35.0000000000002,85.0,17.5000000000001, 473P 806
+2.14313189850788E-15,85.0,17.5000000000001,-35.0000000000002, 473P 807
+85.0,-17.5000000000001,-35.0000000000002,85.0,-17.5000000000001, 473P 808
+0.0,85.0,-17.5000000000001,0.0,73.0,-17.5000000000001, 473P 809
+35.0000000000002,73.0,17.5000000000001,35.0000000000002,73.0, 473P 810
+17.5000000000001,2.14313189850788E-15,73.0,17.5000000000001, 473P 811
+-35.0000000000002,73.0,-17.5000000000001,-35.0000000000002,73.0, 473P 812
+-17.5000000000001,0.0,73.0,0.0,1.0,0.0,1.0,0,0; 473P 813
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0, 475P 814
+0.0,1.0,0.0,0.0,1.0,0,0; 475P 815
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,1.0,1.0,0.0, 477P 816
+0.0,1.0,0.0,0.0,1.0,0,0; 477P 817
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,1.0,0.0, 479P 818
+0.0,1.0,0.0,0.0,1.0,0,0; 479P 819
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0, 481P 820
+0.0,1.0,0.0,0.0,1.0,0,0; 481P 821
+102,4,475,477,479,481,0,0; 483P 822
+100,-85.0,0.0,0.0,17.5000000000001,0.0,17.5000000000001, 485P 823
+-4.28626379701576E-15,0,0; 485P 824
+110,-17.5000000000001,0.0,85.0,-17.5000000000001,0.0,73.0,0,0; 487P 825
+100,73.0,0.0,0.0,17.5000000000001,0.0,17.5000000000001, 489P 826
+-4.28626379701576E-15,0,0; 489P 827
+110,-17.5000000000001,0.0,73.0,-17.5000000000001,0.0,85.0,0,0; 491P 828
+102,4,485,487,489,491,0,0; 493P 829
+142,0,473,483,493,3,0,0; 495P 830
+144,473,1,0,495,0,0; 497P 831
+128,1,6,1,3,0,0,0,0,0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.5,0.5, 499P 832
+0.5,1.0,1.0,1.0,1.0,1.0,1.0,0.333333333333333,0.333333333333333, 499P 833
+0.333333333333333,0.333333333333333,1.0,1.0,0.333333333333333, 499P 834
+0.333333333333333,0.333333333333333,0.333333333333333,1.0,1.0, 499P 835
+-12.5,0.0,85.0,-12.5,0.0,68.0,-12.5,25.0,85.0,-12.5,25.0,68.0, 499P 836
+12.5,25.0,85.0,12.5,25.0,68.0,12.5,1.53080849893419E-15,85.0, 499P 837
+12.5,1.53080849893419E-15,68.0,12.5,-25.0,85.0,12.5,-25.0,68.0, 499P 838
+-12.5,-25.0,85.0,-12.5,-25.0,68.0,-12.5,0.0,85.0,-12.5,0.0,68.0, 499P 839
+0.0,1.0,0.0,1.0,0,0; 499P 840
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0, 501P 841
+0.0,1.0,0.0,0.0,1.0,0,0; 501P 842
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,1.0,0.0,1.0,1.0,0.0, 503P 843
+0.0,1.0,0.0,0.0,1.0,0,0; 503P 844
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,1.0,0.5,0.0, 505P 845
+0.0,1.0,0.0,0.0,1.0,0,0; 505P 846
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,0.5,0.0,1.0,0.0,0.0, 507P 847
+0.0,1.0,0.0,0.0,1.0,0,0; 507P 848
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0, 509P 849
+0.0,1.0,0.0,0.0,1.0,0,0; 509P 850
+102,5,501,503,505,507,509,0,0; 511P 851
+100,-85.0,0.0,0.0,12.5,0.0,12.5,-3.06161699786838E-15,0,0; 513P 852
+110,-12.5,0.0,85.0,-12.5,0.0,68.0,0,0; 515P 853
+100,68.0,0.0,0.0,-12.5,1.53080849893419E-15,12.5, 517P 854
+-3.06161699786838E-15,0,0; 517P 855
+100,68.0,0.0,0.0,12.5,1.53080849893419E-15,-12.5, 519P 856
+1.53080849893419E-15,0,0; 519P 857
+110,-12.5,0.0,68.0,-12.5,0.0,85.0,0,0; 521P 858
+102,5,513,515,517,519,521,0,0; 523P 859
+142,0,499,511,523,3,0,0; 525P 860
+144,499,1,0,525,0,0; 527P 861
+128,6,1,3,1,0,0,0,0,0,0.0,0.0,0.0,0.0,0.5,0.5,0.5,1.0,1.0,1.0, 529P 862
+1.0,0.0,0.0,1.0,1.0,1.0,0.333333333333333,0.333333333333333,1.0, 529P 863
+0.333333333333333,0.333333333333333,1.0,1.0,0.333333333333333, 529P 864
+0.333333333333333,1.0,0.333333333333333,0.333333333333333,1.0, 529P 865
+-39.7430663251921,0.0,7.99999999999999,-39.7430663251921, 529P 866
+79.4861326503843,7.99999999999999,39.7430663251921, 529P 867
+79.4861326503843,7.99999999999999,39.7430663251921,0.0, 529P 868
+7.99999999999999,39.7430663251921,-79.4861326503843, 529P 869
+7.99999999999999,-39.7430663251921,-79.4861326503843, 529P 870
+7.99999999999999,-39.7430663251921,0.0,7.99999999999999, 529P 871
+-20.262546844673,0.0,68.0,-20.262546844673,40.525093689346,68.0, 529P 872
+20.262546844673,40.525093689346,68.0,20.262546844673,0.0,68.0, 529P 873
+20.262546844673,-40.525093689346,68.0,-20.262546844673, 529P 874
+-40.525093689346,68.0,-20.262546844673,0.0,68.0,0.0,1.0,0.0,1.0, 529P 875
+0,0; 529P 876
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0, 531P 877
+0.0,1.0,0.0,0.0,1.0,0,0; 531P 878
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0, 533P 879
+0.0,1.0,0.0,0.0,1.0,0,0; 533P 880
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,1.0,0.0,1.0,1.0,0.0, 535P 881
+0.0,1.0,0.0,0.0,1.0,0,0; 535P 882
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,1.0,0.0,0.0, 537P 883
+0.0,1.0,0.0,0.0,1.0,0,0; 537P 884
+102,4,531,533,535,537,0,0; 539P 885
+100,7.99999999999999,0.0,0.0,39.7430663251921,0.0, 541P 886
+39.7430663251921,-9.7342437926895E-15,0,0; 541P 887
+110,-39.7430663251921,0.0,7.99999999999999,-20.262546844673,0.0, 543P 888
+68.0,0,0; 543P 889
+100,-68.0,0.0,0.0,20.262546844673,0.0,20.262546844673, 545P 890
+-4.96289262718041E-15,0,0; 545P 891
+110,-20.262546844673,0.0,68.0,-39.7430663251921,0.0, 547P 892
+7.99999999999999,0,0; 547P 893
+102,4,541,543,545,547,0,0; 549P 894
+142,0,529,539,549,3,0,0; 551P 895
+126,28,2,1,1,1,1,-0.125,0.0,0.0,0.0625,0.0625,0.125,0.125, 553P 896
+0.1875,0.1875,0.25,0.25,0.3125,0.3125,0.375,0.375,0.4375,0.4375, 553P 897
+0.5,0.5,0.5625,0.5625,0.625,0.625,0.75,0.75,0.8125,0.8125,0.875, 553P 898
+0.875,1.0,1.0,1.0625,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 553P 899
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 553P 900
+1.0,1.0,1.0,0.600160645375039,0.475270038419586,0.0, 553P 901
+0.611451058132377,0.519186452291426,0.0,0.61625978197636, 553P 902
+0.569027045132457,0.0,0.62135588214723,0.621846184250052,0.0, 553P 903
+0.618286835399609,0.672709371129969,0.0,0.615052267297737, 553P 904
+0.726315736679436,0.0,0.603273614187553,0.769692950379905,0.0, 553P 905
+0.590476891630838,0.816819405655879,0.0,0.5694023076767, 553P 906
+0.844762688031149,0.0,0.545670254970939,0.876229570202822,0.0, 553P 907
+0.512511402887588,0.881096075983916,0.0,0.475985085654655, 553P 908
+0.886456802390529,0.0,0.447936297982976,0.863177887965743,0.0, 553P 909
+0.423018980127439,0.842497917164728,0.0,0.406507593981457, 553P 910
+0.799781614819817,0.0,0.391578961590317,0.761160025500914,0.0, 553P 911
+0.385059187405837,0.709099757594884,0.0,0.378880679602962, 553P 912
+0.659764494995937,0.0,0.381193563283151,0.605639175269759,0.0, 553P 913
+0.383359138473158,0.554961118887491,0.0,0.392637656209417, 553P 914
+0.507302873253466,0.0,0.41144902687499,0.410680012859595,0.0, 553P 915
+0.44829131508289,0.368996696374758,0.0,0.467706907815595, 553P 916
+0.347029920260007,0.0,0.491180457985202,0.343644138377009,0.0, 553P 917
+0.516078849085702,0.340052840047835,0.0,0.537315383253639, 553P 918
+0.355663339593384,0.0,0.576889917406436,0.384753691273286,0.0, 553P 919
+0.600160645375039,0.475270038419586,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 553P 920
+126,31,3,0,1,1,1,-0.0624999999999999,-0.0624999999999999,0.0, 555P 921
+0.0,0.0625,0.0625,0.125,0.125,0.1875,0.1875,0.25,0.25,0.3125, 555P 922
+0.3125,0.375,0.375,0.4375,0.4375,0.5,0.5,0.5625,0.5625,0.625, 555P 923
+0.625,0.75,0.75,0.8125,0.8125,0.875,0.875,0.9375,0.9375,1.0,1.0, 555P 924
+1.0625,1.0625,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 555P 925
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 555P 926
+1.0,1.0,1.0,1.0,27.9873273425545,-13.4787944137588, 555P 927
+34.8164050553931,25.7818091324183,-15.2633929201404, 555P 928
+38.2159995549572,24.709124707393,-15.7868964371178, 555P 929
+40.1152733883852,22.9698551647346,-16.022962685004, 555P 930
+44.1679720275096,22.3267445322623,-15.7263183074069, 555P 931
+46.3025796398342,21.6142949468969,-14.399904862404, 555P 932
+50.4225448957621,21.5347303864722,-13.3696088646196, 555P 933
+52.4222096391006,21.6807574601452,-10.7650773865531, 555P 934
+55.940944406488,21.8998532151794,-9.16770236181921, 555P 935
+57.501193343568,22.3149607750019,-5.46522479482952, 555P 936
+59.8703292201699,22.5028887417066,-3.33745797721361, 555P 937
+60.6637003284692,22.5953743769593,1.02103683269022, 555P 938
+61.0678287896008,22.4951913343221,3.25824484823679, 555P 939
+60.6687759660329,22.1381750349317,7.25932725621567, 555P 940
+58.9125705898563,21.8927369340436,9.04599639507617, 555P 941
+57.5821043205547,21.5775123941433,12.0661170714768, 555P 942
+54.3916894578234,21.5104409637156,13.2938932650853, 555P 943
+52.5525806772402,21.862926566983,15.1330890073785, 555P 944
+48.5393902341458,22.299713369333,15.7084559618546, 555P 945
+46.3993304482588,23.6933934641992,16.0453468966987, 555P 946
+42.2773705841123,24.6598734010005,15.8070928429567, 555P 947
+40.2508899422445,27.7979806160542,13.9678752104182, 555P 948
+34.812737301135,30.2411714502892,11.2098867492864, 555P 949
+31.8513680467079,32.4293039107115,5.51236452342079, 555P 950
+29.2840186503743,32.903939446239,3.37216680192471, 555P 951
+28.7569710014746,33.1508532139409,-0.999267399178356, 555P 952
+28.4803256037664,32.9176911804422,-3.23366398960809, 555P 953
+28.7364341752681,31.863192440654,-7.28386580809152, 555P 954
+29.943166575938,31.0342925288119,-9.14978573894277, 555P 955
+30.9047408956938,29.1058294621721,-12.2246174538612, 555P 956
+33.329888601933,27.9873273425545,-13.4787944137588, 555P 957
+34.8164050553931,25.7818091324183,-15.2633929201404, 555P 958
+38.2159995549572,0.0,1.0,0.0,0.0,0.0,0,0; 555P 959
+142,0,529,553,555,3,0,0; 557P 960
+144,529,1,1,551,557,0,0; 559P 961
+128,1,1,1,1,0,0,1,0,0,0.0,0.0,1.0,1.0,0.0,0.0,1.0,1.0,1.0,1.0, 561P 962
+1.0,1.0,-20.5056974068091,-20.5056974068091,68.0, 561P 963
+-20.5056974068091,20.5056974068091,68.0,20.5056974068091, 561P 964
+-20.5056974068091,68.0,20.5056974068091,20.5056974068091,68.0, 561P 965
+0.0,1.0,0.0,1.0,0,0; 561P 966
+126,32,2,1,1,1,1,-0.0625,-0.0625,0.0,0.0625,0.0625,0.125,0.125, 563P 967
+0.1875,0.1875,0.25,0.25,0.3125,0.3125,0.375,0.375,0.4375,0.4375, 563P 968
+0.5,0.5,0.5625,0.5625,0.625,0.625,0.6875,0.6875,0.75,0.75, 563P 969
+0.8125,0.8125,0.875,0.875,0.9375,0.9375,1.0,1.0625,1.0625,1.0, 563P 970
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 563P 971
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 563P 972
+0.598276861353586,0.00592885375494084,0.0,0.401723138646414, 563P 973
+0.00592885375494084,0.0,0.310927157922386,0.0435377803797993, 563P 974
+0.0,0.220131177198359,0.0811467070046577,0.0,0.150638942101508, 563P 975
+0.150638942101508,0.0,0.0811467070046574,0.220131177198359,0.0, 563P 976
+0.0435377803797991,0.310927157922386,0.0,0.00592885375494068, 563P 977
+0.401723138646414,0.0,0.00592885375494068,0.5,0.0, 563P 978
+0.00592885375494068,0.598276861353586,0.0,0.0435377803797991, 563P 979
+0.689072842077614,0.0,0.0811467070046575,0.779868822801641,0.0, 563P 980
+0.150638942101508,0.849361057898492,0.0,0.220131177198359, 563P 981
+0.918853292995343,0.0,0.310927157922387,0.956462219620201,0.0, 563P 982
+0.401723138646414,0.994071146245059,0.0,0.5,0.994071146245059, 563P 983
+0.0,0.598276861353586,0.994071146245059,0.0,0.689072842077614, 563P 984
+0.956462219620201,0.0,0.779868822801641,0.918853292995343,0.0, 563P 985
+0.849361057898492,0.849361057898492,0.0,0.918853292995343, 563P 986
+0.779868822801641,0.0,0.956462219620201,0.689072842077614,0.0, 563P 987
+0.994071146245059,0.598276861353586,0.0,0.994071146245059,0.5, 563P 988
+0.0,0.994071146245059,0.401723138646414,0.0,0.956462219620201, 563P 989
+0.310927157922387,0.0,0.918853292995343,0.220131177198359,0.0, 563P 990
+0.849361057898492,0.150638942101508,0.0,0.779868822801641, 563P 991
+0.0811467070046576,0.0,0.689072842077614,0.0435377803797992,0.0, 563P 992
+0.598276861353586,0.00592885375494084,0.0,0.401723138646414, 563P 993
+0.00592885375494084,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 563P 994
+100,68.0,0.0,0.0,20.262546844673,0.0,20.262546844673, 565P 995
+-4.96289262718041E-15,0,0; 565P 996
+142,0,561,563,565,3,0,0; 567P 997
+126,16,2,1,1,1,1,-0.125,-0.125,0.0,0.125,0.125,0.25,0.25,0.375, 569P 998
+0.375,0.5,0.5,0.625,0.625,0.75,0.75,0.875,0.875,1.0,1.125,1.125, 569P 999
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 569P 1000
+1.0,0.626249535115651,0.804793339919502,0.0,0.37375046488435, 569P 1001
+0.804793339919502,0.0,0.284478562482424,0.715521437517576,0.0, 569P 1002
+0.195206660080498,0.62624953511565,0.0,0.195206660080498,0.5, 569P 1003
+0.0,0.195206660080498,0.37375046488435,0.0,0.284478562482424, 569P 1004
+0.284478562482424,0.0,0.37375046488435,0.195206660080498,0.0, 569P 1005
+0.5,0.195206660080498,0.0,0.626249535115651,0.195206660080498, 569P 1006
+0.0,0.715521437517576,0.284478562482424,0.0,0.804793339919502, 569P 1007
+0.373750464884349,0.0,0.804793339919502,0.5,0.0, 569P 1008
+0.804793339919502,0.626249535115651,0.0,0.715521437517576, 569P 1009
+0.715521437517576,0.0,0.626249535115651,0.804793339919502,0.0, 569P 1010
+0.37375046488435,0.804793339919502,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 569P 1011
+100,-68.0,0.0,0.0,12.5,0.0,12.5,-3.06161699786838E-15,0,0; 571P 1012
+142,0,561,569,571,3,0,0; 573P 1013
+144,561,1,1,567,573,0,0; 575P 1014
+128,1,6,1,3,0,0,0,0,0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.5,0.5, 577P 1015
+0.5,1.0,1.0,1.0,1.0,1.0,1.0,0.333333333333333,0.333333333333333, 577P 1016
+0.333333333333333,0.333333333333333,1.0,1.0,0.333333333333333, 577P 1017
+0.333333333333333,0.333333333333333,0.333333333333333,1.0,1.0, 577P 1018
+-39.7430663251921,0.0,8.79999999999999,-39.7430663251921,0.0, 577P 1019
+-0.799999999999995,-39.7430663251921,79.4861326503842, 577P 1020
+8.79999999999999,-39.7430663251921,79.4861326503842, 577P 1021
+-0.799999999999995,39.7430663251921,79.4861326503842, 577P 1022
+8.79999999999999,39.7430663251921,79.4861326503842, 577P 1023
+-0.799999999999995,39.7430663251921,4.86712189634475E-15, 577P 1024
+8.79999999999999,39.7430663251921,4.86712189634475E-15, 577P 1025
+-0.799999999999995,39.7430663251921,-79.4861326503842, 577P 1026
+8.79999999999999,39.7430663251921,-79.4861326503842, 577P 1027
+-0.799999999999995,-39.7430663251921,-79.4861326503842, 577P 1028
+8.79999999999999,-39.7430663251921,-79.4861326503842, 577P 1029
+-0.799999999999995,-39.7430663251921,0.0,8.79999999999999, 577P 1030
+-39.7430663251921,0.0,-0.799999999999995,0.0,1.0,0.0,1.0,0,0; 577P 1031
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.916666666666667,0.5, 579P 1032
+0.0,0.916666666666667,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 579P 1033
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.916666666666667,0.0, 581P 1034
+0.0,0.083333333333333,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 581P 1035
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.083333333333333,0.0, 583P 1036
+0.0,0.083333333333333,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 583P 1037
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.083333333333333,1.0, 585P 1038
+0.0,0.916666666666667,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 585P 1039
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.916666666666667,1.0, 587P 1040
+0.0,0.916666666666667,0.5,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 587P 1041
+102,5,579,581,583,585,587,0,0; 589P 1042
+100,0.0,0.0,0.0,39.7430663251921,4.86712189634475E-15, 591P 1043
+-39.7430663251921,4.86712189634475E-15,0,0; 591P 1044
+110,-39.7430663251921,0.0,0.0,-39.7430663251921,0.0, 593P 1045
+7.99999999999999,0,0; 593P 1046
+100,-7.99999999999999,0.0,0.0,39.7430663251921,0.0, 595P 1047
+39.7430663251921,-9.7342437926895E-15,0,0; 595P 1048
+110,-39.7430663251921,0.0,7.99999999999999,-39.7430663251921, 597P 1049
+0.0,0.0,0,0; 597P 1050
+100,0.0,0.0,0.0,-39.7430663251921,4.86712189634475E-15, 599P 1051
+39.7430663251921,-9.73424379268949E-15,0,0; 599P 1052
+102,5,591,593,595,597,599,0,0; 601P 1053
+142,0,577,589,601,3,0,0; 603P 1054
+144,577,1,0,603,0,0; 605P 1055
+128,1,6,1,3,0,0,0,0,0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.5,0.5, 607P 1056
+0.5,1.0,1.0,1.0,1.0,1.0,1.0,0.333333333333333,0.333333333333333, 607P 1057
+0.333333333333333,0.333333333333333,1.0,1.0,0.333333333333333, 607P 1058
+0.333333333333333,0.333333333333333,0.333333333333333,1.0,1.0, 607P 1059
+-48.5,1.23002813281165E-13,-0.8,-48.5,1.23002813281165E-13,8.8, 607P 1060
+-48.5,8.00000000000012,-0.800000000000001,-48.5, 607P 1061
+8.00000000000012,8.8,-56.5,8.00000000000012,-0.800000000000001, 607P 1062
+-56.5,8.00000000000012,8.8,-56.5,1.23492672000824E-13,-0.8, 607P 1063
+-56.5,1.23492672000824E-13,8.8,-56.5,-7.99999999999987, 607P 1064
+-0.800000000000001,-56.5,-7.99999999999987,8.8,-48.5, 607P 1065
+-7.99999999999987,-0.800000000000001,-48.5,-7.99999999999987, 607P 1066
+8.8,-48.5,1.23002813281165E-13,-0.8,-48.5,1.23002813281165E-13, 607P 1067
+8.8,0.0,1.0,0.0,1.0,0,0; 607P 1068
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.916666666666667,0.5, 609P 1069
+0.0,0.916666666666667,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 609P 1070
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.916666666666667,0.0, 611P 1071
+0.0,0.0833333333333333,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 611P 1072
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.0833333333333333,0.0, 613P 1073
+0.0,0.0833333333333333,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 613P 1074
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.0833333333333333,1.0, 615P 1075
+0.0,0.916666666666667,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 615P 1076
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.916666666666667,1.0, 617P 1077
+0.0,0.916666666666667,0.5,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 617P 1078
+102,5,609,611,613,615,617,0,0; 619P 1079
+100,-8.0,52.5,1.23002813281165E-13,56.5,1.23492672000824E-13, 621P 1080
+48.5,1.23492672000824E-13,0,0; 621P 1081
+110,-48.5,1.23002813281165E-13,8.0,-48.5,1.23002813281165E-13, 623P 1082
+0.0,0,0; 623P 1083
+100,0.0,-52.5,1.23002813281165E-13,-48.5,1.23002813281165E-13, 625P 1084
+-48.5,1.22023095841847E-13,0,0; 625P 1085
+110,-48.5,1.23002813281165E-13,0.0,-48.5,1.23002813281165E-13, 627P 1086
+8.0,0,0; 627P 1087
+100,-8.0,52.5,1.23002813281165E-13,48.5,1.23492672000824E-13, 629P 1088
+56.5,1.22023095841847E-13,0,0; 629P 1089
+102,5,621,623,625,627,629,0,0; 631P 1090
+142,0,607,619,631,3,0,0; 633P 1091
+144,607,1,0,633,0,0; 635P 1092
+124,-0.500000000000003,-0.866025403784437,0.0,0.0, 637P 1093
+0.866025403784437,-0.500000000000003,0.0,0.0,0.0,0.0,1.0,0.0,0, 637P 1094
+0; 637P 1095
+128,1,6,1,3,0,0,0,0,0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.5,0.5, 639P 1096
+0.5,1.0,1.0,1.0,1.0,1.0,1.0,0.333333333333334,0.333333333333334, 639P 1097
+0.333333333333334,0.333333333333334,1.0,1.0,0.333333333333333, 639P 1098
+0.333333333333333,0.333333333333333,0.333333333333333,1.0,1.0, 639P 1099
+24.2499999999998,-42.0022320835454,-0.8,24.2499999999998, 639P 1100
+-42.0022320835454,8.8,17.3217967697243,-46.0022320835454,-0.8, 639P 1101
+17.3217967697243,-46.0022320835454,8.8,21.3217967697243, 639P 1102
+-52.9304353138209,-0.8,21.3217967697243,-52.9304353138209,8.8, 639P 1103
+28.2499999999998,-48.9304353138209,-0.8,28.2499999999998, 639P 1104
+-48.9304353138209,8.8,35.1782032302753,-44.9304353138209, 639P 1105
+-0.800000000000001,35.1782032302753,-44.9304353138209,8.8, 639P 1106
+31.1782032302753,-38.0022320835454,-0.800000000000001, 639P 1107
+31.1782032302753,-38.0022320835454,8.8,24.2499999999998, 639P 1108
+-42.0022320835454,-0.8,24.2499999999998,-42.0022320835454,8.8, 639P 1109
+0.0,1.0,0.0,1.0,0,0; 639P 1110
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.916666666666667, 641P 1111
+0.18301270189222,0.0,0.916666666666667,0.0,0.0,0.0,1.0,0.0,0.0, 641P 1112
+1.0,0,0; 641P 1113
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.916666666666667,0.0, 643P 1114
+0.0,0.0833333333333333,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 643P 1115
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.0833333333333333,0.0, 645P 1116
+0.0,0.0833333333333333,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 645P 1117
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.0833333333333333,1.0, 647P 1118
+0.0,0.916666666666667,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 647P 1119
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.916666666666667,1.0, 649P 1120
+0.0,0.916666666666667,0.18301270189222,0.0,0.0,1.0,0.0,0.0,1.0, 649P 1121
+0,0; 649P 1122
+102,5,641,643,645,647,649,0,0; 651P 1123
+100,-8.0,-26.2499999999998,-45.4663336986831,-22.2499999999998, 653P 1124
+-45.4663336986831,-24.2499999999998,-42.0022320835454,0,0; 653P 1125
+110,24.2499999999998,-42.0022320835454,8.0,24.2499999999998, 655P 1126
+-42.0022320835454,1.0842021724855E-16,0,0; 655P 1127
+100,0.0,-52.5,1.24344978758018E-13,-48.5,1.24778659627012E-13, 657P 1128
+-48.5,1.233652613187E-13,0,0; 657P 1129
+110,24.2499999999998,-42.0022320835454,1.0842021724855E-16, 659P 1130
+24.2499999999998,-42.0022320835454,8.0,0,0; 659P 1131
+100,-8.0,-26.2499999999998,-45.4663336986831,-24.2499999999998, 661P 1132
+-42.0022320835454,-22.2499999999998,-45.4663336986831,0,0; 661P 1133
+102,5,653,655,657,659,661,0,0; 663P 1134
+142,0,639,651,663,3,0,0; 665P 1135
+144,639,1,0,665,0,0; 667P 1136
+124,0.499999999999996,0.866025403784441,0.0,0.0, 669P 1137
+-0.866025403784441,0.499999999999996,0.0,0.0,0.0,0.0,1.0,0.0,0, 669P 1138
+0; 669P 1139
+128,1,6,1,3,0,0,0,0,0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.5,0.5, 671P 1140
+0.5,1.0,1.0,1.0,1.0,1.0,1.0,0.333333333333333,0.333333333333333, 671P 1141
+0.333333333333333,0.333333333333333,1.0,1.0,0.333333333333333, 671P 1142
+0.333333333333333,0.333333333333333,0.333333333333333,1.0,1.0, 671P 1143
+-24.2499999999997,42.0022320835454,-0.8,-24.2499999999997, 671P 1144
+42.0022320835454,8.8,-17.3217967697242,46.0022320835454, 671P 1145
+-0.800000000000001,-17.3217967697242,46.0022320835454,8.8, 671P 1146
+-21.3217967697242,52.9304353138209,-0.800000000000001, 671P 1147
+-21.3217967697242,52.9304353138209,8.8,-28.2499999999997, 671P 1148
+48.930435313821,-0.8,-28.2499999999997,48.930435313821,8.8, 671P 1149
+-35.1782032302752,44.930435313821,-0.800000000000001, 671P 1150
+-35.1782032302752,44.930435313821,8.8,-31.1782032302752, 671P 1151
+38.0022320835455,-0.800000000000001,-31.1782032302752, 671P 1152
+38.0022320835455,8.8,-24.2499999999997,42.0022320835454,-0.8, 671P 1153
+-24.2499999999997,42.0022320835454,8.8,0.0,1.0,0.0,1.0,0,0; 671P 1154
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.916666666666667, 673P 1155
+0.68301270189222,0.0,0.916666666666667,0.0,0.0,0.0,1.0,0.0,0.0, 673P 1156
+1.0,0,0; 673P 1157
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.916666666666667,0.0, 675P 1158
+0.0,0.0833333333333333,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 675P 1159
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.0833333333333333,0.0, 677P 1160
+0.0,0.0833333333333333,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 677P 1161
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.0833333333333333,1.0, 679P 1162
+0.0,0.916666666666667,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 679P 1163
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.916666666666667,1.0, 681P 1164
+0.0,0.916666666666667,0.68301270189222,0.0,0.0,1.0,0.0,0.0,1.0, 681P 1165
+0,0; 681P 1166
+102,5,673,675,677,679,681,0,0; 683P 1167
+100,-8.0,26.2499999999997,45.4663336986832,30.2499999999997, 685P 1168
+45.4663336986832,24.2499999999997,42.0022320835454,0,0; 685P 1169
+110,-24.2499999999997,42.0022320835454,8.0,-24.2499999999997, 687P 1170
+42.0022320835454,0.0,0,0; 687P 1171
+100,0.0,-52.5,1.27897692436818E-13,-48.5,1.27897692436818E-13, 689P 1172
+-48.5,1.269179749975E-13,0,0; 689P 1173
+110,-24.2499999999997,42.0022320835454,0.0,-24.2499999999997, 691P 1174
+42.0022320835454,8.0,0,0; 691P 1175
+100,-8.0,26.2499999999997,45.4663336986832,24.2499999999997, 693P 1176
+42.0022320835454,30.2499999999997,45.4663336986832,0,0; 693P 1177
+102,5,685,687,689,691,693,0,0; 695P 1178
+142,0,671,683,695,3,0,0; 697P 1179
+144,671,1,0,697,0,0; 699P 1180
+124,-0.500000000000003,0.866025403784437,0.0,0.0, 701P 1181
+-0.866025403784437,-0.500000000000003,0.0,0.0,0.0,0.0,1.0,0.0,0, 701P 1182
+0; 701P 1183
+128,1,6,1,3,0,0,0,0,0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.5,0.5, 703P 1184
+0.5,1.0,1.0,1.0,1.0,1.0,1.0,0.333333333333333,0.333333333333333, 703P 1185
+0.333333333333333,0.333333333333333,1.0,1.0,0.333333333333333, 703P 1186
+0.333333333333333,0.333333333333333,0.333333333333333,1.0,1.0, 703P 1187
+24.2500000000002,42.0022320835451,-0.8,24.2500000000002, 703P 1188
+42.0022320835451,8.8,31.1782032302757,38.0022320835451, 703P 1189
+-0.800000000000001,31.1782032302757,38.0022320835451,8.8, 703P 1190
+35.1782032302757,44.9304353138206,-0.800000000000001, 703P 1191
+35.1782032302757,44.9304353138206,8.8,28.2500000000003, 703P 1192
+48.9304353138206,-0.8,28.2500000000003,48.9304353138206,8.8, 703P 1193
+21.3217967697248,52.9304353138207,-0.800000000000001, 703P 1194
+21.3217967697248,52.9304353138207,8.8,17.3217967697247, 703P 1195
+46.0022320835451,-0.800000000000001,17.3217967697247, 703P 1196
+46.0022320835451,8.8,24.2500000000002,42.0022320835451,-0.8, 703P 1197
+24.2500000000002,42.0022320835451,8.8,0.0,1.0,0.0,1.0,0,0; 703P 1198
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.916666666666667, 705P 1199
+0.816987298107781,0.0,0.916666666666667,0.0,0.0,0.0,1.0,0.0,0.0, 705P 1200
+1.0,0,0; 705P 1201
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.916666666666667,0.0, 707P 1202
+0.0,0.0833333333333333,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 707P 1203
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.0833333333333333,0.0, 709P 1204
+0.0,0.0833333333333333,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 709P 1205
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.0833333333333333,1.0, 711P 1206
+0.0,0.916666666666667,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 711P 1207
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.916666666666667,1.0, 713P 1208
+0.0,0.916666666666667,0.816987298107781,0.0,0.0,1.0,0.0,0.0,1.0, 713P 1209
+0,0; 713P 1210
+102,5,705,707,709,711,713,0,0; 715P 1211
+100,-8.0,-26.2500000000002,45.4663336986829,-22.2500000000002, 717P 1212
+45.4663336986829,-24.2500000000002,42.0022320835451,0,0; 717P 1213
+110,24.2500000000002,42.0022320835451,8.0,24.2500000000002, 719P 1214
+42.0022320835451,0.0,0,0; 719P 1215
+100,0.0,-52.5,1.20792265079217E-13,-48.5,1.20792265079217E-13, 721P 1216
+-48.5,1.19812547639899E-13,0,0; 721P 1217
+110,24.2500000000002,42.0022320835451,0.0,24.2500000000002, 723P 1218
+42.0022320835451,8.0,0,0; 723P 1219
+100,-8.0,-26.2500000000002,45.4663336986829,-24.2500000000002, 725P 1220
+42.0022320835451,-22.2500000000002,45.4663336986829,0,0; 725P 1221
+102,5,717,719,721,723,725,0,0; 727P 1222
+142,0,703,715,727,3,0,0; 729P 1223
+144,703,1,0,729,0,0; 731P 1224
+128,1,6,1,3,0,0,0,0,0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.5,0.5, 733P 1225
+0.5,1.0,1.0,1.0,1.0,1.0,1.0,0.333333333333333,0.333333333333333, 733P 1226
+0.333333333333333,0.333333333333333,1.0,1.0,0.333333333333333, 733P 1227
+0.333333333333333,0.333333333333333,0.333333333333333,1.0,1.0, 733P 1228
+48.5,-2.3663398364567E-13,-0.8,48.5,-2.3663398364567E-13,8.8, 733P 1229
+48.5,-8.00000000000024,-0.8,48.5,-8.00000000000024,8.8,56.5, 733P 1230
+-8.00000000000026,-0.8,56.5,-8.00000000000026,8.8,56.5, 733P 1231
+-2.53111053919931E-13,-0.8,56.5,-2.53111053919931E-13,8.8,56.5, 733P 1232
+7.99999999999975,-0.800000000000001,56.5,7.99999999999975,8.8, 733P 1233
+48.5,7.99999999999976,-0.800000000000001,48.5,7.99999999999976, 733P 1234
+8.8,48.5,-2.3841034048507E-13,-0.8,48.5,-2.3841034048507E-13, 733P 1235
+8.8,0.0,1.0,0.0,1.0,0,0; 733P 1236
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.916666666666667,1.0, 735P 1237
+0.0,0.916666666666667,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 735P 1238
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.916666666666667,0.0, 737P 1239
+0.0,0.0833333333333333,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 737P 1240
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.0833333333333333,0.0, 739P 1241
+0.0,0.0833333333333333,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 739P 1242
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.0833333333333333,1.0, 741P 1243
+0.0,0.916666666666667,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 741P 1244
+102,4,735,737,739,741,0,0; 743P 1245
+100,-8.0,-52.5,-2.4600562656233E-13,-48.5,-2.3841034048507E-13, 745P 1246
+-48.5,-2.39879916644047E-13,0,0; 745P 1247
+110,48.5,-2.3663398364567E-13,8.0,48.5,-2.3663398364567E-13, 747P 1248
+1.0842021724855E-16,0,0; 747P 1249
+100,0.0,-52.5,1.23002813281165E-13,-48.5,1.23002813281165E-13, 749P 1250
+-48.5,1.22023095841847E-13,0,0; 749P 1251
+110,48.5,-2.3663398364567E-13,1.0842021724855E-16,48.5, 751P 1252
+-2.3663398364567E-13,8.0,0,0; 751P 1253
+102,4,745,747,749,751,0,0; 753P 1254
+142,0,733,743,753,3,0,0; 755P 1255
+144,733,1,0,755,0,0; 757P 1256
+124,0.499999999999996,-0.866025403784441,0.0,0.0, 759P 1257
+0.866025403784441,0.499999999999996,0.0,0.0,0.0,0.0,1.0,0.0,0,0; 759P 1258
+128,1,6,1,3,0,0,0,0,0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.5,0.5, 761P 1259
+0.5,1.0,1.0,1.0,1.0,1.0,1.0,0.333333333333333,0.333333333333333, 761P 1260
+0.333333333333333,0.333333333333333,1.0,1.0,0.333333333333333, 761P 1261
+0.333333333333333,0.333333333333333,0.333333333333333,1.0,1.0, 761P 1262
+-24.2500000000001,-42.0022320835452,-0.8,-24.2500000000001, 761P 1263
+-42.0022320835452,8.8,-31.1782032302756,-38.0022320835452, 761P 1264
+-0.800000000000001,-31.1782032302756,-38.0022320835452,8.8, 761P 1265
+-35.1782032302756,-44.9304353138207,-0.800000000000001, 761P 1266
+-35.1782032302756,-44.9304353138207,8.8,-28.2500000000001, 761P 1267
+-48.9304353138207,-0.8,-28.2500000000001,-48.9304353138207,8.8, 761P 1268
+-21.3217967697246,-52.9304353138207,-0.800000000000001, 761P 1269
+-21.3217967697246,-52.9304353138207,8.8,-17.3217967697246, 761P 1270
+-46.0022320835452,-0.800000000000001,-17.3217967697246, 761P 1271
+-46.0022320835452,8.8,-24.2500000000001,-42.0022320835452,-0.8, 761P 1272
+-24.2500000000001,-42.0022320835452,8.8,0.0,1.0,0.0,1.0,0,0; 761P 1273
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.916666666666667, 763P 1274
+0.316987298107781,0.0,0.916666666666667,0.0,0.0,0.0,1.0,0.0,0.0, 763P 1275
+1.0,0,0; 763P 1276
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.916666666666667,0.0, 765P 1277
+0.0,0.0833333333333333,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 765P 1278
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.0833333333333333,0.0, 767P 1279
+0.0,0.0833333333333333,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 767P 1280
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.0833333333333333,1.0, 769P 1281
+0.0,0.916666666666667,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 769P 1282
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.916666666666667,1.0, 771P 1283
+0.0,0.916666666666667,0.316987298107781,0.0,0.0,1.0,0.0,0.0,1.0, 771P 1284
+0,0; 771P 1285
+102,5,763,765,767,769,771,0,0; 773P 1286
+100,-8.0,26.2500000000001,-45.4663336986829,30.2500000000001, 775P 1287
+-45.4663336986829,24.2500000000001,-42.0022320835452,0,0; 775P 1288
+110,-24.2500000000001,-42.0022320835452,8.0,-24.2500000000001, 777P 1289
+-42.0022320835452,0.0,0,0; 777P 1290
+100,0.0,-52.5,1.24344978758018E-13,-48.5,1.24344978758018E-13, 779P 1291
+-48.5,1.233652613187E-13,0,0; 779P 1292
+110,-24.2500000000001,-42.0022320835452,0.0,-24.2500000000001, 781P 1293
+-42.0022320835452,8.0,0,0; 781P 1294
+100,-8.0,26.2500000000001,-45.4663336986829,24.2500000000001, 783P 1295
+-42.0022320835452,30.2500000000001,-45.4663336986829,0,0; 783P 1296
+102,5,775,777,779,781,783,0,0; 785P 1297
+142,0,761,773,785,3,0,0; 787P 1298
+144,761,1,0,787,0,0; 789P 1299
+124,0.308806753860372,0.0,-0.951124801889962,0.0,0.0,-1.0,0.0, 791P 1300
+0.0,-0.951124801889962,0.0,-0.308806753860372,0.0,0,0; 791P 1301
+128,1,6,1,3,0,0,0,0,0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.5,0.5, 793P 1302
+0.5,1.0,1.0,1.0,1.0,1.0,1.0,0.333333333333333,0.333333333333333, 793P 1303
+0.333333333333333,0.333333333333333,1.0,1.0,0.333333333333333, 793P 1304
+0.333333333333333,0.333333333333333,0.333333333333333,1.0,1.0, 793P 1305
+36.6912025650541,30.0000000000002,43.9535637594139, 793P 1306
+45.8220006631977,30.0000000000002,46.9181085964735, 793P 1307
+36.6912025650541,37.0000000000002,43.9535637594139, 793P 1308
+45.8220006631977,37.0000000000002,46.9181085964735, 793P 1309
+34.5295552880315,37.0000000000002,50.6114373726437, 793P 1310
+43.6603533861751,37.0000000000002,53.5759822097032, 793P 1311
+34.5295552880315,30.0000000000002,50.6114373726437, 793P 1312
+43.6603533861751,30.0000000000002,53.5759822097032, 793P 1313
+34.5295552880315,23.0000000000002,50.6114373726437, 793P 1314
+43.6603533861751,23.0000000000002,53.5759822097032, 793P 1315
+36.6912025650541,23.0000000000002,43.9535637594139, 793P 1316
+45.8220006631977,23.0000000000002,46.9181085964735, 793P 1317
+36.6912025650541,30.0000000000002,43.9535637594139, 793P 1318
+45.8220006631977,30.0000000000002,46.9181085964735,0.0,1.0,0.0, 793P 1319
+1.0,0,0; 793P 1320
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.916666666666667,1.0, 795P 1321
+0.0,0.916666666666667,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 795P 1322
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.916666666666667,0.0, 797P 1323
+0.0,0.0833333333333338,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 797P 1324
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.0833333333333338,0.0, 799P 1325
+0.0,0.0833333333333338,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 799P 1326
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.0833333333333338,1.0, 801P 1327
+0.0,0.916666666666667,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 801P 1328
+102,4,795,797,799,801,0,0; 803P 1329
+100,-57.2710701159311,-33.9748334636827,-30.0000000000002, 805P 1330
+-30.4748334636827,-30.0000000000002,-30.4748334636827, 805P 1331
+-30.0000000000002,0,0; 805P 1332
+110,45.0611008216858,30.0000000000002,46.6710631933852, 807P 1333
+37.4521024065661,30.0000000000002,44.2006091625022,0,0; 807P 1334
+100,49.2710701159311,-33.9748334636827,30.0000000000002, 809P 1335
+-30.4748334636827,30.0000000000002,-30.4748334636827, 809P 1336
+30.0000000000002,0,0; 809P 1337
+110,37.4521024065661,30.0000000000002,44.2006091625022, 811P 1338
+45.0611008216858,30.0000000000002,46.6710631933852,0,0; 811P 1339
+102,4,805,807,809,811,0,0; 813P 1340
+142,0,793,803,813,3,0,0; 815P 1341
+144,793,1,0,815,0,0; 817P 1342
+128,1,1,1,1,0,0,1,0,0,0.0,0.0,1.0,1.0,0.0,0.0,1.0,1.0,1.0,1.0, 819P 1343
+1.0,1.0,39.2196140259982,34.3098500423554,38.9047530490262, 819P 1344
+49.8663159144669,33.180906654803,41.9418220869696, 819P 1345
+39.2196140259982,6.81909334518812,28.6858519953003, 819P 1346
+49.8663159144669,5.69014995763573,31.7229210332438,0.0,1.0,0.0, 819P 1347
+1.0,0,0; 819P 1348
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.720610122642625, 821P 1349
+0.00592885375494069,0.0,0.00592885375494054,0.035278162019032, 821P 1350
+0.0,0.0,1.0,0.0,0.0,1.0,0,0; 821P 1351
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.00592885375493662, 823P 1352
+0.0352781620190323,0.0,0.279389877357375,0.99407114624506,0.0, 823P 1353
+0.0,1.0,0.0,0.0,1.0,0,0; 823P 1354
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.279389877357375, 825P 1355
+0.994071146245059,0.0,0.994071146245059,0.964721837980968,0.0, 825P 1356
+0.0,1.0,0.0,0.0,1.0,0,0; 825P 1357
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.994071146245059, 827P 1358
+0.964721837980968,0.0,0.720610122642622,0.0059288537549408,0.0, 827P 1359
+0.0,1.0,0.0,0.0,1.0,0,0; 827P 1360
+102,4,821,823,825,827,0,0; 829P 1361
+110,46.8917351795871,33.3333333333245,41.032709371049, 831P 1362
+39.2827367644674,33.3333333333245,38.562255340166,0,0; 831P 1363
+110,39.2827367644673,33.3333333333245,38.562255340166, 833P 1364
+42.194194760878,6.66666666666658,29.594964711221,0,0; 833P 1365
+110,42.194194760878,6.6666666666666,29.594964711221, 835P 1366
+49.8031931759977,6.6666666666666,32.065418742104,0,0; 835P 1367
+110,49.8031931759977,6.66666666666658,32.065418742104, 837P 1368
+46.891735179587,33.3333333333245,41.032709371049,0,0; 837P 1369
+102,4,831,833,835,837,0,0; 839P 1370
+142,0,819,829,839,3,0,0; 841P 1371
+144,819,1,0,841,0,0; 843P 1372
+128,1,1,1,1,0,0,1,0,0,0.0,0.0,1.0,1.0,0.0,0.0,1.0,1.0,1.0,1.0, 845P 1373
+1.0,1.0,30.4852400367671,5.69014995767995,65.8066249358586, 845P 1374
+41.1319419252319,6.81909334523194,68.8436939738009, 845P 1375
+30.4852400367671,33.1809066548122,55.5877238821456, 845P 1376
+41.1319419252319,34.3098500423642,58.6247929200879,0.0,1.0,0.0, 845P 1377
+1.0,0,0; 845P 1378
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.720610122642885, 847P 1379
+0.00592885375494069,0.0,0.00592885375494085,0.0352781620190701, 847P 1380
+0.0,0.0,1.0,0.0,0.0,1.0,0,0; 847P 1381
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.00592885375493007, 849P 1382
+0.0352781620190704,0.0,0.279389877357115,0.994071146245059,0.0, 849P 1383
+0.0,1.0,0.0,0.0,1.0,0,0; 849P 1384
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.279389877357115, 851P 1385
+0.994071146245059,0.0,0.994071146245059,0.96472183798093,0.0, 851P 1386
+0.0,1.0,0.0,0.0,1.0,0,0; 851P 1387
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.994071146245059, 853P 1388
+0.96472183798093,0.0,0.720610122642874,0.0059288537549411,0.0, 853P 1389
+0.0,1.0,0.0,0.0,1.0,0,0; 853P 1390
+102,4,847,849,851,853,0,0; 855P 1391
+110,38.1573611903559,6.66666666671063,67.9345812578815, 857P 1392
+30.5483627752362,6.66666666671063,65.4641272269985,0,0; 857P 1393
+110,30.5483627752361,6.66666666671062,65.4641272269984, 859P 1394
+33.459820771643,33.3333333333335,56.4968365980651,0,0; 859P 1395
+110,33.459820771643,33.3333333333335,56.4968365980651, 861P 1396
+41.0688191867627,33.3333333333335,58.967290628948,0,0; 861P 1397
+110,41.0688191867627,33.3333333333335,58.9672906289481, 863P 1398
+38.1573611903558,6.66666666671062,67.9345812578814,0,0; 863P 1399
+102,4,857,859,861,863,0,0; 865P 1400
+142,0,845,855,865,3,0,0; 867P 1401
+144,845,1,0,867,0,0; 869P 1402
+124,-0.308806753860372,0.0,0.951124801889962,0.0,0.0,-1.0,0.0, 871P 1403
+0.0,0.951124801889962,0.0,0.308806753860372,0.0,0,0; 871P 1404
+128,1,1,1,1,0,0,1,0,0,0.0,0.0,1.0,1.0,0.0,0.0,1.0,1.0,1.0,1.0, 873P 1405
+1.0,1.0,42.264069752792,-40.2000000000001,29.3797497361263, 873P 1406
+30.4784877833224,-40.2000000000001,65.6793422020932, 873P 1407
+42.264069752792,-6.46666666666659,29.3797497361263, 873P 1408
+30.4784877833224,-6.46666666666659,65.6793422020932,0.0,1.0,0.0, 873P 1409
+1.0,0,0; 873P 1410
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.747035573122832, 875P 1411
+0.203557312252961,0.0,0.994071146245057,0.994071146243754,0.0, 875P 1412
+0.0,1.0,0.0,0.0,1.0,0,0; 875P 1413
+126,8,2,1,0,1,0,0.0,0.0,0.0,0.25,0.25,0.5,0.5,0.75,0.75,1.0,1.0, 877P 1414
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.994071146245061, 877P 1415
+0.994071146243753,0.0,0.938551168134157,0.816407216290253,0.0, 877P 1416
+0.802555551232681,0.707610722769522,0.0,0.666559934331481, 877P 1417
+0.598814229249011,0.0,0.499999999999593,0.598814229249011,0.0, 877P 1418
+0.333440065668257,0.598814229249011,0.0,0.197444448766731, 877P 1419
+0.707610722770323,0.0,0.0614488318654796,0.816407216291415,0.0, 877P 1420
+0.00592885375494333,0.994071146245061,0.0,0.0,1.0,0.0,0.0,1.0,0, 877P 1421
+0; 877P 1422
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.00592885375494049, 879P 1423
+0.994071146245059,0.0,0.252964426877488,0.203557312253226,0.0, 879P 1424
+0.0,1.0,0.0,0.0,1.0,0,0; 879P 1425
+126,8,2,1,0,1,0,0.0,0.0,0.0,0.25,0.25,0.5,0.5,0.75,0.75,1.0,1.0, 881P 1426
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.252964426877487, 881P 1427
+0.203557312253225,0.0,0.280724415932721,0.114725347276247,0.0, 881P 1428
+0.348722224383437,0.0603271005156153,0.0,0.416720032834208, 881P 1429
+0.00592885375493939,0.0,0.500000000000077,0.00592885375493938, 881P 1430
+0.0,0.583279967166056,0.00592885375493938,0.0,0.651277775616762, 881P 1431
+0.0603271005154541,0.0,0.719275584067523,0.114725347276013,0.0, 881P 1432
+0.747035573122831,0.203557312252962,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 881P 1433
+102,4,875,877,879,881,0,0; 883P 1434
+110,33.459820771643,-33.3333333333335,56.4968365980651, 885P 1435
+30.5483627752361,-6.66666666671063,65.4641272269984,0,0; 885P 1436
+100,49.2710701159311,33.9748334636828,0.0,52.8310142953086, 887P 1437
+6.66666666671066,15.1186526320415,6.66666666666655,0,0; 887P 1438
+110,42.194194760878,-6.66666666666659,29.594964711221, 889P 1439
+39.2827367644673,-33.3333333333246,38.562255340166,0,0; 889P 1440
+100,-49.2710701159311,-33.9748334636826,30.0000000000001, 891P 1441
+-24.5467430478589,33.3333333333246,-43.4029238795033, 891P 1442
+33.3333333333335,0,0; 891P 1443
+102,4,885,887,889,891,0,0; 893P 1444
+142,0,873,883,893,3,0,0; 895P 1445
+126,16,2,1,1,1,1,-0.125,-0.125,0.0,0.125,0.125,0.25,0.25,0.375, 897P 1446
+0.375,0.5,0.5,0.625,0.625,0.75,0.75,0.875,0.875,1.0,1.125,1.125, 897P 1447
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 897P 1448
+1.0,0.408292722301811,0.259394837896067,0.0,0.408292722301811, 897P 1449
+0.345348245107875,0.0,0.435153162055512,0.375737363660654,0.0, 897P 1450
+0.462013601809213,0.406126482213433,0.0,0.500000000000203, 897P 1451
+0.406126482213433,0.0,0.537986398191192,0.406126482213433,0.0, 897P 1452
+0.564846837944893,0.375737363660654,0.0,0.591707277698595, 897P 1453
+0.345348245107874,0.0,0.591707277698595,0.302371541501971,0.0, 897P 1454
+0.591707277698595,0.259394837896067,0.0,0.564846837944893, 897P 1455
+0.229005719343288,0.0,0.537986398191192,0.198616600790509,0.0, 897P 1456
+0.500000000000203,0.198616600790509,0.0,0.462013601809213, 897P 1457
+0.198616600790509,0.0,0.435153162055512,0.229005719343288,0.0, 897P 1458
+0.408292722301811,0.259394837896067,0.0,0.408292722301811, 897P 1459
+0.345348245107875,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 897P 1460
+100,49.2710701159311,-33.9748334636827,-30.0000000000002, 899P 1461
+-30.4748334636827,-30.0000000000002,-30.4748334636827, 899P 1462
+-30.0000000000002,0,0; 899P 1463
+142,0,873,897,899,3,0,0; 901P 1464
+144,873,1,1,895,901,0,0; 903P 1465
+128,3,1,3,1,0,0,0,0,0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,0.0, 905P 1466
+1.0,1.0,1.0,0.55555555555526,0.55555555555526,1.0,1.0, 905P 1467
+0.55555555555526,0.55555555555526,1.0,38.5218369229554, 905P 1468
+33.3333333333245,38.3152099370777,37.357253724393, 905P 1469
+44.0000000000022,41.9021261886498,33.8635041286966, 905P 1470
+44.0000000000076,52.662874943395,32.6989209301311, 905P 1471
+33.3333333333335,56.2497911949767,47.6526350210991, 905P 1472
+33.3333333333245,41.2797547741373,46.4880518225367, 905P 1473
+44.0000000000022,44.8666710257094,42.9943022268403, 905P 1474
+44.0000000000076,55.6274197804546,41.8297190282748, 905P 1475
+33.3333333333335,59.2143360320363,0.0,1.0,0.0,1.0,0,0; 905P 1476
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,0.916666666666668, 907P 1477
+0.0,0.0,0.916666666666667,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 907P 1478
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,0.916666666666667, 909P 1479
+0.0,0.0,0.0833333333333388,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 909P 1480
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,0.0833333333333388, 911P 1481
+0.0,1.0,0.0833333333333394,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 911P 1482
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,0.0833333333333333, 913P 1483
+0.0,1.0,0.916666666666661,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 913P 1484
+102,4,907,909,911,913,0,0; 915P 1485
+100,-57.271070115931,-33.9748334636826,-30.0000000000001, 917P 1486
+-43.4029238795032,-33.3333333333335,-24.5467430478588, 917P 1487
+-33.3333333333246,0,0; 917P 1488
+110,46.8917351795871,33.3333333333245,41.032709371049, 919P 1489
+39.2827367644674,33.3333333333245,38.562255340166,0,0; 919P 1490
+100,49.2710701159311,-33.9748334636826,30.0000000000001, 921P 1491
+-24.5467430478588,33.3333333333246,-43.4029238795032, 921P 1492
+33.3333333333335,0,0; 921P 1493
+110,33.459820771643,33.3333333333335,56.4968365980651, 923P 1494
+41.0688191867627,33.3333333333335,58.9672906289481,0,0; 923P 1495
+102,4,917,919,921,923,0,0; 925P 1496
+142,0,905,915,925,3,0,0; 927P 1497
+144,905,1,0,927,0,0; 929P 1498
+124,-0.308806753860372,0.0,-0.951124801889962,0.0,0.0,1.0,0.0, 931P 1499
+0.0,0.951124801889962,0.0,-0.308806753860372,0.0,0,0; 931P 1500
+128,6,1,3,1,0,0,0,0,0,0.0,0.0,0.0,0.0,0.5,0.5,0.5,1.0,1.0,1.0, 933P 1501
+1.0,0.0,0.0,1.0,1.0,1.0,0.333333333333333,0.333333333333333,1.0, 933P 1502
+0.333333333333333,0.333333333333333,1.0,1.0,0.333333333333333, 933P 1503
+0.333333333333333,1.0,0.333333333333333,0.333333333333333,1.0, 933P 1504
+32.458086062301,0.0,25.2312941576293,32.458086062301,40.0, 933P 1505
+25.2312941576293,20.1058159078861,40.0,63.2762862332278, 933P 1506
+20.1058159078861,2.44929359829471E-15,63.2762862332278, 933P 1507
+20.1058159078861,-40.0,63.2762862332278,32.458086062301,-40.0, 933P 1508
+25.2312941576293,32.458086062301,0.0,25.2312941576293, 933P 1509
+50.1564122603819,0.0,30.9775039622009,50.1564122603819,40.0, 933P 1510
+30.9775039622009,37.804142105967,40.0,69.0224960377994, 933P 1511
+37.804142105967,2.44929359829471E-15,69.0224960377994, 933P 1512
+37.804142105967,-40.0,69.0224960377994,50.1564122603819,-40.0, 933P 1513
+30.9775039622009,50.1564122603819,0.0,30.9775039622009,0.0,1.0, 933P 1514
+0.0,1.0,0,0; 933P 1515
+126,2,2,1,0,1,0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0, 935P 1516
+0.8757360426961,0.256199652356708,0.0,0.930612803584798, 935P 1517
+0.355108641634298,0.0,1.0,0.355108641634298,0.0,0.0,1.0,0.0,0.0, 935P 1518
+1.0,0,0; 935P 1519
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,0.355108641634298, 937P 1520
+0.0,1.0,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 937P 1521
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0, 939P 1522
+0.926776695296638,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 939P 1523
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.926776695296638,1.0, 941P 1524
+0.0,0.926776695296638,0.570072427756196,0.0,0.0,1.0,0.0,0.0,1.0, 941P 1525
+0,0; 941P 1526
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.926776695296638, 943P 1527
+0.570072427756202,0.0,0.5732233047038,0.570072427756202,0.0,0.0, 943P 1528
+1.0,0.0,0.0,1.0,0,0; 943P 1529
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.5732233047038, 945P 1530
+0.570072427756204,0.0,0.5732233047038,1.0,0.0,0.0,1.0,0.0,0.0, 945P 1531
+1.0,0,0; 945P 1532
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.5732233047038,1.0,0.0, 947P 1533
+0.4267766952962,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 947P 1534
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.4267766952962,1.0,0.0, 949P 1535
+0.4267766952962,0.570072427756202,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 949P 1536
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.4267766952962, 951P 1537
+0.570072427756202,0.0,0.0732233047033622,0.570072427756202,0.0, 951P 1538
+0.0,1.0,0.0,0.0,1.0,0,0; 951P 1539
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.0732233047033623, 953P 1540
+0.570072427756196,0.0,0.0732233047033623,1.0,0.0,0.0,1.0,0.0, 953P 1541
+0.0,1.0,0,0; 953P 1542
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.0732233047033623,1.0, 955P 1543
+0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 955P 1544
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,1.0,0.0,0.0, 957P 1545
+0.355108641634298,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 957P 1546
+126,32,2,1,0,1,0,0.0,0.0,0.0,0.125,0.125,0.1875,0.1875,0.25, 959P 1547
+0.25,0.3125,0.3125,0.375,0.375,0.40625,0.40625,0.4375,0.4375, 959P 1548
+0.5,0.5,0.5625,0.5625,0.625,0.625,0.6875,0.6875,0.75,0.75, 959P 1549
+0.8125,0.8125,0.875,0.875,0.9375,0.9375,1.0,1.0,1.0,1.0,1.0,1.0, 959P 1550
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 959P 1551
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0, 959P 1552
+0.355108641634298,0.0,0.0749862983989136,0.355108641634298,0.0, 959P 1553
+0.135713596839331,0.234492097837648,0.0,0.148999001914202, 959P 1554
+0.20810462985829,0.0,0.184904996723405,0.124262085124846,0.0, 959P 1555
+0.21375536858974,0.0568948221752132,0.0,0.230473461783832, 959P 1556
+0.0330403798303956,0.0,0.254215133662568,-0.00083575283771381, 959P 1557
+0.0,0.275817751610287,0.0125032240285923,0.0,0.295887860988765, 959P 1558
+0.0248959222354325,0.0,0.321994004256595,0.085021422968646,0.0, 959P 1559
+0.330403138089515,0.104388641529036,0.0,0.345969357854133, 959P 1560
+0.14417438180346,0.0,0.363462287161794,0.188884603848211,0.0, 959P 1561
+0.371426292707439,0.207921495206889,0.0,0.403117975084427, 959P 1562
+0.283676228290217,0.0,0.430827481405164,0.317162213032865,0.0, 959P 1563
+0.466573654958744,0.360360233537741,0.0,0.510307278548336, 959P 1564
+0.354422777431524,0.0,0.550091643828123,0.349021488830809,0.0, 959P 1565
+0.584208997272435,0.296513976703686,0.0,0.608377081296361, 959P 1566
+0.259318654181175,0.0,0.64031354584456,0.179074407904186,0.0, 959P 1567
+0.679724956083686,0.0800484526492191,0.0,0.688623307432802, 959P 1568
+0.0618683645860038,0.0,0.713444238268915,0.0111570933957163,0.0, 959P 1569
+0.734497534733137,0.00871167372254265,0.0,0.755189403727357, 959P 1570
+0.00630823521118237,0.0,0.779619678029766,0.0491483247328024, 959P 1571
+0.0,0.793513030493888,0.0735112301979993,0.0,0.825279580173849, 959P 1572
+0.148171146145254,0.0,0.856466067070305,0.221467758897891,0.0, 959P 1573
+0.8757360426961,0.256199652356708,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 959P 1574
+102,13,935,937,939,941,943,945,947,949,951,953,955,957,959,0,0; 961P 1575
+126,5,3,0,0,1,0,0.0,0.0,0.0,0.0,0.5,0.5,1.0,1.0,1.0,1.0,1.0,1.0, 963P 1576
+1.0,1.0,1.0,1.0,35.774544997435,-11.9245854730548, 963P 1577
+30.454437050988,36.6837876948938,-10.2423586916781, 963P 1578
+29.4360997344144,37.4369131435727,-8.34719925877022, 963P 1579
+28.6361441996386,38.4664318311186,-4.30855561616309, 963P 1580
+27.5541852492621,38.7429146377022,-2.15222445783283, 963P 1581
+27.2718229158765,38.7429146377022,2.01759219600322E-15, 963P 1582
+27.2718229158765,0.0,1.0,0.0,0.0,0.0,0,0; 963P 1583
+110,38.7429146377023,0.0,27.2718229158764,50.1564122603819,0.0, 965P 1584
+30.9775039622009,0,0; 965P 1585
+100,-57.2710701159311,-33.9748334636827,-4.16071710528635E-15, 967P 1586
+-13.9748334636827,-1.71142350699164E-15,-15.1186526320414, 967P 1587
+6.66666666666656,0,0; 967P 1588
+110,49.8031931759978,-6.6666666666666,32.065418742104, 969P 1589
+42.194194760878,-6.6666666666666,29.594964711221,0,0; 969P 1590
+100,-49.2710701159311,33.9748334636828,0.0,15.1186526320415, 971P 1591
+-6.66666666666655,52.8310142953086,-6.66666666671067,0,0; 971P 1592
+110,30.5483627752363,-6.66666666671065,65.4641272269985, 973P 1593
+38.157361190356,-6.66666666671065,67.9345812578815,0,0; 973P 1594
+100,-57.2710701159311,-33.9748334636828,-4.16071710528635E-15, 975P 1595
+-52.8310142953085,6.66666666671061,-52.8310142953085, 975P 1596
+-6.66666666671062,0,0; 975P 1597
+110,38.157361190356,6.66666666671063,67.9345812578815, 977P 1598
+30.5483627752362,6.66666666671063,65.4641272269985,0,0; 977P 1599
+100,-49.2710701159311,33.9748334636828,0.0,52.8310142953086, 979P 1600
+6.66666666671066,15.1186526320415,6.66666666666655,0,0; 979P 1601
+110,42.194194760878,6.6666666666666,29.594964711221, 981P 1602
+49.8031931759978,6.6666666666666,32.065418742104,0,0; 981P 1603
+100,-57.2710701159311,-33.9748334636827,-4.16071710528635E-15, 983P 1604
+-15.1186526320414,-6.66666666666659,-13.9748334636827, 983P 1605
+-9.05930430187576E-15,0,0; 983P 1606
+110,50.1564122603819,0.0,30.9775039622009,38.7429146377023,0.0, 985P 1607
+27.2718229158764,0,0; 985P 1608
+126,27,3,0,0,1,0,0.0,0.0,0.0,0.0,0.0624999999999999, 987P 1609
+0.0624999999999999,0.125,0.125,0.25,0.25,0.3125,0.3125,0.375, 987P 1610
+0.375,0.5,0.5,0.5625,0.5625,0.625,0.625,0.75,0.75,0.8125,0.8125, 987P 1611
+0.875,0.875,0.9375,0.9375,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 987P 1612
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 987P 1613
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,38.7429146377022, 987P 1614
+-1.08609834959478E-14,27.2718229158765,38.7429146377022, 987P 1615
+2.41666452863888,27.2718229158765,38.3952563581479, 987P 1616
+4.82286369610075,27.6260534936937,37.1146154782978, 987P 1617
+9.28556288053541,28.9788503889501,36.1915727664703, 987P 1618
+11.3249942002618,29.96742727782,32.9251438625661, 987P 1619
+16.6070633725716,33.7116211486607,30.0476282130896, 987P 1620
+19.0137012672118,37.2362320959829,26.7146588460742, 987P 1621
+20.1293345774676,43.6170600541639,25.8016492921934, 987P 1622
+20.0690405424657,45.9217058070248,24.6804840565774, 987P 1623
+19.0867705863682,50.5045368410947,24.4688592014531, 987P 1624
+18.1605671172695,52.799981903919,24.5680878975443, 987P 1625
+14.4893330596366,58.9781720264313,25.5228098438764, 987P 1626
+10.76070217238,62.4187573364572,26.2828134779157, 987P 1627
+4.01099359088783,65.00461863605,26.4223805547647, 987P 1628
+1.58263908325216,65.415838215713,26.3455713119369, 987P 1629
+-3.26577033774065,65.1762137215609,26.130754279056, 987P 1630
+-5.64063108442624,64.5263030490073,25.2594233000924, 987P 1631
+-12.0644280100167,61.3906980252548,24.3574889412869, 987P 1632
+-15.5620944606522,57.7213556260048,24.5963721101912, 987P 1633
+-18.8081213175798,51.267270086834,24.9653976968924, 987P 1634
+-19.5489250377121,48.9395832098739,26.3808112771493, 987P 1635
+-20.1446354608985,44.3683712055891,27.4109831743522, 987P 1636
+-20.0030440307541,42.142337019093,29.7790494676454, 987P 1637
+-18.8895247899513,38.0398274660791,31.0543495392186, 987P 1638
+-17.9608906203832,36.2343327989784,33.5748696841913, 987P 1639
+-15.3883676092636,32.9687841075742,34.7535852332824, 987P 1640
+-13.8135045292823,31.5978957001062,35.774544997435, 987P 1641
+-11.9245854730548,30.454437050988,0.0,1.0,0.0,0.0,0.0,0,0; 987P 1642
+102,13,963,965,967,969,971,973,975,977,979,981,983,985,987,0,0; 989P 1643
+142,0,933,961,989,3,0,0; 991P 1644
+144,933,1,0,991,0,0; 993P 1645
+128,1,1,1,1,0,0,1,0,0,0.0,0.0,1.0,1.0,0.0,0.0,1.0,1.0,1.0,1.0, 995P 1646
+1.0,1.0,50.2305258813084,-40.4800000000001,30.7492340097473, 995P 1647
+50.2305258813084,40.48,30.7492340097473,37.7300284850405, 995P 1648
+-40.4800000000001,69.250765990253,37.7300284850405,40.48, 995P 1649
+69.250765990253,0.0,1.0,0.0,1.0,0,0; 995P 1650
+126,8,2,1,0,1,0,0.0,0.0,0.0,0.25,0.25,0.5,0.5,0.75,0.75,1.0,1.0, 997P 1651
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.911725955204217, 997P 1652
+0.732907371932324,0.0,0.948739273944612,0.706735003256771,0.0, 997P 1653
+0.971405210094845,0.642626054641654,0.0,0.99407114624506, 997P 1654
+0.57851710602659,0.0,0.99407114624506,0.499999999999879,0.0, 997P 1655
+0.99407114624506,0.421482893973274,0.0,0.971405210094778, 997P 1656
+0.357373945358148,0.0,0.948739273944515,0.293264996743074,0.0, 997P 1657
+0.911725955204107,0.267092628067591,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 997P 1658
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.911725955204107, 999P 1659
+0.267092628067591,0.0,0.582345191040842,0.0341852561353424,0.0, 999P 1660
+0.0,1.0,0.0,0.0,1.0,0,0; 999P 1661
+126,2,2,1,0,1,0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0, 1001P 1662
+0.582345191040842,0.0341852561353433,0.0,0.5, 1001P 1663
+-0.0240415868477371,0.0,0.417654808959158,0.0341852561353433, 1001P 1664
+0.0,0.0,1.0,0.0,0.0,1.0,0,0; 1001P 1665
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.417654808959158, 1003P 1666
+0.0341852561353424,0.0,0.088274044795893,0.267092628067591,0.0, 1003P 1667
+0.0,1.0,0.0,0.0,1.0,0,0; 1003P 1668
+126,8,2,1,0,1,0,0.0,0.0,0.0,0.25,0.25,0.5,0.5,0.75,0.75,1.0,1.0, 1005P 1669
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0882740447958929, 1005P 1670
+0.267092628067591,0.0,0.0512607260554853,0.293264996743074,0.0, 1005P 1671
+0.0285947899052219,0.357373945358148,0.0,0.00592885375494021, 1005P 1672
+0.421482893973274,0.0,0.0059288537549402,0.49999999999988,0.0, 1005P 1673
+0.0059288537549402,0.578517106026591,0.0,0.0285947899051547, 1005P 1674
+0.642626054641655,0.0,0.0512607260553878,0.706735003256772,0.0, 1005P 1675
+0.088274044795783,0.732907371932324,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 1005P 1676
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.088274044795783, 1007P 1677
+0.732907371932324,0.0,0.417654808958614,0.965814743864271,0.0, 1007P 1678
+0.0,1.0,0.0,0.0,1.0,0,0; 1007P 1679
+126,2,2,1,0,1,0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0, 1009P 1680
+0.417654808958614,0.965814743864272,0.0,0.5,1.02404158684817, 1009P 1681
+0.0,0.582345191041386,0.965814743864272,0.0,0.0,1.0,0.0,0.0,1.0, 1009P 1682
+0,0; 1009P 1683
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.582345191041386, 1011P 1684
+0.965814743864271,0.0,0.911725955204217,0.732907371932325,0.0, 1011P 1685
+0.0,1.0,0.0,0.0,1.0,0,0; 1011P 1686
+102,8,997,999,1001,1003,1005,1007,1009,1011,0,0; 1013P 1687
+100,-57.271070115931,-33.9748334636826,-30.0000000000001, 1015P 1688
+-43.4029238795032,-33.3333333333335,-24.5467430478588, 1015P 1689
+-33.3333333333246,0,0; 1015P 1690
+110,46.891735179587,33.3333333333245,41.032709371049, 1017P 1691
+49.8031931759977,6.66666666666658,32.065418742104,0,0; 1017P 1692
+100,-57.2710701159311,-33.9748334636827,-4.16071710528635E-15, 1019P 1693
+-15.1186526320414,-6.66666666666659,-15.1186526320414, 1019P 1694
+6.66666666666657,0,0; 1019P 1695
+110,49.8031931759977,-6.66666666666659,32.065418742104, 1021P 1696
+46.891735179587,-33.3333333333246,41.032709371049,0,0; 1021P 1697
+100,-57.2710701159311,-33.9748334636826,30.0000000000001, 1023P 1698
+-24.5467430478588,33.3333333333246,-43.4029238795032, 1023P 1699
+33.3333333333335,0,0; 1023P 1700
+110,41.0688191867627,-33.3333333333335,58.9672906289481, 1025P 1701
+38.1573611903558,-6.66666666671063,67.9345812578814,0,0; 1025P 1702
+100,-57.2710701159311,-33.9748334636828,-4.16071710528635E-15, 1027P 1703
+-52.8310142953085,6.66666666671062,-52.8310142953085, 1027P 1704
+-6.66666666671062,0,0; 1027P 1705
+110,38.1573611903558,6.66666666671062,67.9345812578814, 1029P 1706
+41.0688191867627,33.3333333333335,58.9672906289481,0,0; 1029P 1707
+102,8,1015,1017,1019,1021,1023,1025,1027,1029,0,0; 1031P 1708
+142,0,995,1013,1031,3,0,0; 1033P 1709
+126,32,2,1,1,1,1,-0.0625,-0.0625,0.0,0.0625,0.0625,0.125,0.125, 1035P 1710
+0.1875,0.1875,0.25,0.25,0.3125,0.3125,0.375,0.375,0.4375,0.4375, 1035P 1711
+0.5,0.5,0.5625,0.5625,0.625,0.625,0.6875,0.6875,0.75,0.75, 1035P 1712
+0.8125,0.8125,0.875,0.875,0.9375,0.9375,1.0,1.0625,1.0625,1.0, 1035P 1713
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 1035P 1714
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 1035P 1715
+0.536853823007595,0.870553359683794,0.0,0.463146176992406, 1035P 1716
+0.870553359683794,0.0,0.429097684220895,0.84234666471515,0.0, 1035P 1717
+0.395049191449385,0.814139969746506,0.0,0.368989603288066, 1035P 1718
+0.762020793423869,0.0,0.342930015126747,0.709901617101231,0.0, 1035P 1719
+0.328826667642425,0.64180463155821,0.0,0.314723320158103, 1035P 1720
+0.573707646015189,0.0,0.314723320158103,0.5,0.0, 1035P 1721
+0.314723320158103,0.42629235398481,0.0,0.328826667642425, 1035P 1722
+0.35819536844179,0.0,0.342930015126747,0.290098382898769,0.0, 1035P 1723
+0.368989603288066,0.237979206576131,0.0,0.395049191449385, 1035P 1724
+0.185860030253493,0.0,0.429097684220895,0.157653335284849,0.0, 1035P 1725
+0.463146176992405,0.129446640316206,0.0,0.5,0.129446640316206, 1035P 1726
+0.0,0.536853823007595,0.129446640316206,0.0,0.570902315779105, 1035P 1727
+0.157653335284849,0.0,0.604950808550615,0.185860030253493,0.0, 1035P 1728
+0.631010396711934,0.237979206576131,0.0,0.657069984873253, 1035P 1729
+0.290098382898769,0.0,0.671173332357575,0.35819536844179,0.0, 1035P 1730
+0.685276679841897,0.42629235398481,0.0,0.685276679841897,0.5, 1035P 1731
+0.0,0.685276679841897,0.573707646015189,0.0,0.671173332357575, 1035P 1732
+0.64180463155821,0.0,0.657069984873253,0.709901617101231,0.0, 1035P 1733
+0.631010396711934,0.762020793423869,0.0,0.604950808550616, 1035P 1734
+0.814139969746506,0.0,0.570902315779105,0.84234666471515,0.0, 1035P 1735
+0.536853823007595,0.870553359683794,0.0,0.463146176992406, 1035P 1736
+0.870553359683794,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 1035P 1737
+100,57.2710701159311,33.9748334636827,0.0,48.9748334636827,0.0, 1037P 1738
+48.9748334636827,-3.67394039744206E-15,0,0; 1037P 1739
+142,0,995,1035,1037,3,0,0; 1039P 1740
+126,16,2,1,1,1,1,-0.125,-0.125,0.0,0.125,0.125,0.25,0.25,0.375, 1041P 1741
+0.375,0.5,0.5,0.625,0.625,0.75,0.75,0.875,0.875,1.0,1.125,1.125, 1041P 1742
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 1041P 1743
+1.0,0.852646399848003,0.413537549407113,0.0,0.88846031951959, 1041P 1744
+0.413537549407113,0.0,0.901122452249914,0.438861814867762,0.0, 1041P 1745
+0.913784584980239,0.464186080328411,0.0,0.913784584980239, 1041P 1746
+0.499999999999998,0.0,0.913784584980239,0.535813919671585,0.0, 1041P 1747
+0.901122452249914,0.561138185132234,0.0,0.88846031951959, 1041P 1748
+0.586462450592883,0.0,0.870553359683796,0.586462450592883,0.0, 1041P 1749
+0.852646399848003,0.586462450592883,0.0,0.839984267117678, 1041P 1750
+0.561138185132234,0.0,0.827322134387354,0.535813919671585,0.0, 1041P 1751
+0.827322134387354,0.499999999999998,0.0,0.827322134387354, 1041P 1752
+0.464186080328411,0.0,0.839984267117678,0.438861814867762,0.0, 1041P 1753
+0.852646399848003,0.413537549407113,0.0,0.88846031951959, 1041P 1754
+0.413537549407113,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 1041P 1755
+100,57.2710701159311,-33.9748334636827,30.0000000000002, 1043P 1756
+-30.4748334636827,30.0000000000002,-30.4748334636827, 1043P 1757
+30.0000000000002,0,0; 1043P 1758
+142,0,995,1041,1043,3,0,0; 1045P 1759
+126,16,2,1,1,1,1,-0.125,-0.125,0.0,0.125,0.125,0.25,0.25,0.375, 1047P 1760
+0.375,0.5,0.5,0.625,0.625,0.75,0.75,0.875,0.875,1.0,1.125,1.125, 1047P 1761
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 1047P 1762
+1.0,0.11153968048041,0.413537549407113,0.0,0.147353600151997, 1047P 1763
+0.413537549407113,0.0,0.160015732882322,0.438861814867763,0.0, 1047P 1764
+0.172677865612646,0.464186080328412,0.0,0.172677865612646, 1047P 1765
+0.499999999999999,0.0,0.172677865612646,0.535813919671585,0.0, 1047P 1766
+0.160015732882322,0.561138185132235,0.0,0.147353600151997, 1047P 1767
+0.586462450592884,0.0,0.129446640316204,0.586462450592884,0.0, 1047P 1768
+0.11153968048041,0.586462450592884,0.0,0.0988775477500856, 1047P 1769
+0.561138185132235,0.0,0.086215415019761,0.535813919671585,0.0, 1047P 1770
+0.086215415019761,0.499999999999999,0.0,0.086215415019761, 1047P 1771
+0.464186080328412,0.0,0.0988775477500856,0.438861814867763,0.0, 1047P 1772
+0.11153968048041,0.413537549407113,0.0,0.147353600151997, 1047P 1773
+0.413537549407113,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 1047P 1774
+100,57.2710701159311,-33.9748334636827,-30.0000000000002, 1049P 1775
+-30.4748334636827,-30.0000000000002,-30.4748334636827, 1049P 1776
+-30.0000000000002,0,0; 1049P 1777
+142,0,995,1047,1049,3,0,0; 1051P 1778
+144,995,1,3,1033,1039,1045,1051,0,0; 1053P 1779
+128,1,1,1,1,0,0,1,0,0,0.0,0.0,1.0,1.0,0.0,0.0,1.0,1.0,1.0,1.0, 1055P 1780
+1.0,1.0,39.2196140259982,-34.3098500423554,38.9047530490262, 1055P 1781
+39.2196140259982,-6.81909334518811,28.6858519953003, 1055P 1782
+49.8663159144669,-33.1809066548031,41.9418220869697, 1055P 1783
+49.8663159144669,-5.69014995763573,31.7229210332438,0.0,1.0,0.0, 1055P 1784
+1.0,0,0; 1055P 1785
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.964721837980968, 1057P 1786
+0.994071146245059,0.0,0.00592885375494112,0.72061012264262,0.0, 1057P 1787
+0.0,1.0,0.0,0.0,1.0,0,0; 1057P 1788
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.00592885375494078, 1059P 1789
+0.720610122642628,0.0,0.0352781620190323,0.0059288537549408,0.0, 1059P 1790
+0.0,1.0,0.0,0.0,1.0,0,0; 1059P 1791
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.0352781620190327, 1061P 1792
+0.00592885375493337,0.0,0.99407114624506,0.279389877357373,0.0, 1061P 1793
+0.0,1.0,0.0,0.0,1.0,0,0; 1061P 1794
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.994071146245059, 1063P 1795
+0.279389877357373,0.0,0.964721837980968,0.994071146245059,0.0, 1063P 1796
+0.0,1.0,0.0,0.0,1.0,0,0; 1063P 1797
+102,4,1057,1059,1061,1063,0,0; 1065P 1798
+110,49.8031931759977,-6.66666666666658,32.065418742104, 1067P 1799
+46.891735179587,-33.3333333333246,41.032709371049,0,0; 1067P 1800
+110,46.8917351795871,-33.3333333333246,41.032709371049, 1069P 1801
+39.2827367644674,-33.3333333333246,38.562255340166,0,0; 1069P 1802
+110,39.2827367644673,-33.3333333333246,38.562255340166, 1071P 1803
+42.194194760878,-6.66666666666658,29.594964711221,0,0; 1071P 1804
+110,42.194194760878,-6.6666666666666,29.594964711221, 1073P 1805
+49.8031931759977,-6.6666666666666,32.065418742104,0,0; 1073P 1806
+102,4,1067,1069,1071,1073,0,0; 1075P 1807
+142,0,1055,1065,1075,3,0,0; 1077P 1808
+144,1055,1,0,1077,0,0; 1079P 1809
+128,1,1,1,1,0,0,1,0,0,0.0,0.0,1.0,1.0,0.0,0.0,1.0,1.0,1.0,1.0, 1081P 1810
+1.0,1.0,30.4852400367671,-5.69014995767996,65.8066249358586, 1081P 1811
+30.4852400367671,-33.1809066548122,55.5877238821456, 1081P 1812
+41.1319419252319,-6.81909334523195,68.8436939738009, 1081P 1813
+41.1319419252319,-34.3098500423642,58.6247929200879,0.0,1.0,0.0, 1081P 1814
+1.0,0,0; 1081P 1815
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.96472183798093, 1083P 1816
+0.994071146245059,0.0,0.00592885375494136,0.720610122642873,0.0, 1083P 1817
+0.0,1.0,0.0,0.0,1.0,0,0; 1083P 1818
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.00592885375494068, 1085P 1819
+0.720610122642888,0.0,0.03527816201907,0.00592885375494072,0.0, 1085P 1820
+0.0,1.0,0.0,0.0,1.0,0,0; 1085P 1821
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.0352781620190708, 1087P 1822
+0.00592885375492614,0.0,0.994071146245059,0.279389877357112,0.0, 1087P 1823
+0.0,1.0,0.0,0.0,1.0,0,0; 1087P 1824
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.994071146245059, 1089P 1825
+0.279389877357112,0.0,0.96472183798093,0.994071146245059,0.0, 1089P 1826
+0.0,1.0,0.0,0.0,1.0,0,0; 1089P 1827
+102,4,1083,1085,1087,1089,0,0; 1091P 1828
+110,41.0688191867627,-33.3333333333335,58.9672906289481, 1093P 1829
+38.1573611903558,-6.66666666671063,67.9345812578814,0,0; 1093P 1830
+110,38.157361190356,-6.66666666671065,67.9345812578815, 1095P 1831
+30.5483627752363,-6.66666666671065,65.4641272269985,0,0; 1095P 1832
+110,30.5483627752361,-6.66666666671063,65.4641272269984, 1097P 1833
+33.459820771643,-33.3333333333335,56.4968365980651,0,0; 1097P 1834
+110,33.459820771643,-33.3333333333335,56.4968365980651, 1099P 1835
+41.0688191867627,-33.3333333333335,58.967290628948,0,0; 1099P 1836
+102,4,1093,1095,1097,1099,0,0; 1101P 1837
+142,0,1081,1091,1101,3,0,0; 1103P 1838
+144,1081,1,0,1103,0,0; 1105P 1839
+128,1,6,1,3,0,0,0,0,0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.5,0.5, 1107P 1840
+0.5,1.0,1.0,1.0,1.0,1.0,1.0,0.333333333333333,0.333333333333333, 1107P 1841
+0.333333333333333,0.333333333333333,1.0,1.0,0.333333333333333, 1107P 1842
+0.333333333333333,0.333333333333333,0.333333333333333,1.0,1.0, 1107P 1843
+36.6912025650541,-30.0000000000002,43.953563759414, 1107P 1844
+45.8220006631977,-30.0000000000002,46.9181085964735, 1107P 1845
+36.6912025650541,-23.0000000000002,43.953563759414, 1107P 1846
+45.8220006631977,-23.0000000000002,46.9181085964735, 1107P 1847
+34.5295552880315,-23.0000000000002,50.6114373726437, 1107P 1848
+43.6603533861751,-23.0000000000002,53.5759822097033, 1107P 1849
+34.5295552880315,-30.0000000000002,50.6114373726437, 1107P 1850
+43.6603533861751,-30.0000000000002,53.5759822097033, 1107P 1851
+34.5295552880315,-37.0000000000002,50.6114373726437, 1107P 1852
+43.6603533861751,-37.0000000000002,53.5759822097033, 1107P 1853
+36.6912025650541,-37.0000000000002,43.953563759414, 1107P 1854
+45.8220006631977,-37.0000000000002,46.9181085964735, 1107P 1855
+36.6912025650541,-30.0000000000002,43.953563759414, 1107P 1856
+45.8220006631977,-30.0000000000002,46.9181085964735,0.0,1.0,0.0, 1107P 1857
+1.0,0,0; 1107P 1858
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.916666666666667,1.0, 1109P 1859
+0.0,0.916666666666667,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 1109P 1860
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.916666666666668,0.0, 1111P 1861
+0.0,0.0833333333333338,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 1111P 1862
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.0833333333333338,0.0, 1113P 1863
+0.0,0.0833333333333338,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 1113P 1864
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.0833333333333338,1.0, 1115P 1865
+0.0,0.916666666666668,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 1115P 1866
+102,4,1109,1111,1113,1115,0,0; 1117P 1867
+100,-57.2710701159311,-33.9748334636827,30.0000000000002, 1119P 1868
+-30.4748334636827,30.0000000000002,-30.4748334636827, 1119P 1869
+30.0000000000002,0,0; 1119P 1870
+110,45.0611008216858,-30.0000000000002,46.6710631933852, 1121P 1871
+37.4521024065661,-30.0000000000002,44.2006091625023,0,0; 1121P 1872
+100,49.2710701159311,-33.9748334636827,-30.0000000000002, 1123P 1873
+-30.4748334636827,-30.0000000000002,-30.4748334636827, 1123P 1874
+-30.0000000000002,0,0; 1123P 1875
+110,37.4521024065661,-30.0000000000002,44.2006091625023, 1125P 1876
+45.0611008216858,-30.0000000000002,46.6710631933852,0,0; 1125P 1877
+102,4,1119,1121,1123,1125,0,0; 1127P 1878
+142,0,1107,1117,1127,3,0,0; 1129P 1879
+144,1107,1,0,1129,0,0; 1131P 1880
+128,3,1,3,1,0,0,0,0,0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,0.0, 1133P 1881
+1.0,1.0,1.0,0.55555555555526,0.55555555555526,1.0,1.0, 1133P 1882
+0.55555555555526,0.55555555555526,1.0,32.6989209301311, 1133P 1883
+-33.3333333333335,56.2497911949768,33.8635041286965, 1133P 1884
+-44.0000000000076,52.662874943395,37.357253724393, 1133P 1885
+-44.0000000000023,41.9021261886499,38.5218369229554, 1133P 1886
+-33.3333333333246,38.3152099370777,41.8297190282748, 1133P 1887
+-33.3333333333335,59.2143360320364,42.9943022268403, 1133P 1888
+-44.0000000000076,55.6274197804546,46.4880518225367, 1133P 1889
+-44.0000000000023,44.8666710257095,47.6526350210991, 1133P 1890
+-33.3333333333246,41.2797547741373,0.0,1.0,0.0,1.0,0,0; 1133P 1891
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,0.916666666666667, 1135P 1892
+0.0,0.0,0.916666666666666,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 1135P 1893
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,0.916666666666657, 1137P 1894
+0.0,0.0,0.083333333333334,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 1137P 1895
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,0.0833333333333425, 1139P 1896
+0.0,1.0,0.0833333333333427,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 1139P 1897
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,0.0833333333333427, 1141P 1898
+0.0,1.0,0.916666666666667,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 1141P 1899
+102,4,1135,1137,1139,1141,0,0; 1143P 1900
+100,-57.2710701159311,-33.9748334636826,30.0000000000001, 1145P 1901
+-24.5467430478588,33.3333333333246,-43.4029238795033, 1145P 1902
+33.3333333333335,0,0; 1145P 1903
+110,41.0688191867627,-33.3333333333335,58.9672906289481, 1147P 1904
+33.459820771643,-33.3333333333335,56.4968365980651,0,0; 1147P 1905
+100,49.2710701159311,-33.9748334636826,-30.0000000000001, 1149P 1906
+-43.4029238795032,-33.3333333333335,-24.5467430478588, 1149P 1907
+-33.3333333333246,0,0; 1149P 1908
+110,39.2827367644674,-33.3333333333246,38.562255340166, 1151P 1909
+46.8917351795871,-33.3333333333246,41.032709371049,0,0; 1151P 1910
+102,4,1145,1147,1149,1151,0,0; 1153P 1911
+142,0,1133,1143,1153,3,0,0; 1155P 1912
+144,1133,1,0,1155,0,0; 1157P 1913
+128,1,1,1,1,0,0,1,0,0,0.0,0.0,1.0,1.0,0.0,0.0,1.0,1.0,1.0,1.0, 1159P 1914
+1.0,1.0,42.264069752792,6.46666666666659,29.3797497361263, 1159P 1915
+30.4784877833224,6.46666666666659,65.6793422020932, 1159P 1916
+42.264069752792,40.2,29.3797497361263,30.4784877833224,40.2, 1159P 1917
+65.6793422020932,0.0,1.0,0.0,1.0,0,0; 1159P 1918
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.252964426877487, 1161P 1919
+0.796442687746774,0.0,0.00592885375494049,0.00592885375494065, 1161P 1920
+0.0,0.0,1.0,0.0,0.0,1.0,0,0; 1161P 1921
+126,8,2,1,0,1,0,0.0,0.0,0.0,0.25,0.25,0.5,0.5,0.75,0.75,1.0,1.0, 1163P 1922
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.00592885375494346, 1163P 1923
+0.00592885375493957,0.0,0.0614488318654797,0.183592783708586, 1163P 1924
+0.0,0.19744444876673,0.292389277229677,0.0,0.333440065668257, 1163P 1925
+0.401185770750989,0.0,0.499999999999593,0.401185770750989,0.0, 1163P 1926
+0.66655993433148,0.401185770750989,0.0,0.80255555123268, 1163P 1927
+0.292389277230478,0.0,0.938551168134156,0.183592783709746,0.0, 1163P 1928
+0.994071146245059,0.00592885375624697,0.0,0.0,1.0,0.0,0.0,1.0,0, 1163P 1929
+0; 1163P 1930
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.994071146245057, 1165P 1931
+0.00592885375624589,0.0,0.747035573122831,0.796442687747039,0.0, 1165P 1932
+0.0,1.0,0.0,0.0,1.0,0,0; 1165P 1933
+126,8,2,1,0,1,0,0.0,0.0,0.0,0.25,0.25,0.5,0.5,0.75,0.75,1.0,1.0, 1167P 1934
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.74703557312283, 1167P 1935
+0.796442687747039,0.0,0.719275584067521,0.885274652723987,0.0, 1167P 1936
+0.65127777561676,0.939672899484546,0.0,0.583279967166055, 1167P 1937
+0.994071146245061,0.0,0.500000000000076,0.994071146245061,0.0, 1167P 1938
+0.416720032834208,0.994071146245061,0.0,0.348722224383436, 1167P 1939
+0.939672899484385,0.0,0.280724415932721,0.885274652723753,0.0, 1167P 1940
+0.252964426877487,0.796442687746775,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 1167P 1941
+102,4,1161,1163,1165,1167,0,0; 1169P 1942
+110,39.2827367644673,33.3333333333245,38.562255340166, 1171P 1943
+42.194194760878,6.66666666666658,29.594964711221,0,0; 1171P 1944
+100,49.2710701159311,33.9748334636828,0.0,15.1186526320415, 1173P 1945
+-6.66666666666654,52.8310142953086,-6.66666666671065,0,0; 1173P 1946
+110,30.5483627752361,6.66666666671061,65.4641272269984, 1175P 1947
+33.459820771643,33.3333333333335,56.4968365980651,0,0; 1175P 1948
+100,-49.2710701159311,-33.9748334636826,-30.0000000000001, 1177P 1949
+-43.4029238795032,-33.3333333333335,-24.5467430478588, 1177P 1950
+-33.3333333333246,0,0; 1177P 1951
+102,4,1171,1173,1175,1177,0,0; 1179P 1952
+142,0,1159,1169,1179,3,0,0; 1181P 1953
+126,16,2,1,1,1,1,-0.125,-0.125,0.0,0.125,0.125,0.25,0.25,0.375, 1183P 1954
+0.375,0.5,0.5,0.625,0.625,0.75,0.75,0.875,0.875,1.0,1.125,1.125, 1183P 1955
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 1183P 1956
+1.0,0.40829272230181,0.654651754892125,0.0,0.40829272230181, 1183P 1957
+0.740605162103933,0.0,0.435153162055511,0.770994280656712,0.0, 1183P 1958
+0.462013601809212,0.801383399209491,0.0,0.500000000000201, 1183P 1959
+0.801383399209491,0.0,0.537986398191191,0.801383399209491,0.0, 1183P 1960
+0.564846837944892,0.770994280656712,0.0,0.591707277698593, 1183P 1961
+0.740605162103933,0.0,0.591707277698593,0.697628458498029,0.0, 1183P 1962
+0.591707277698593,0.654651754892125,0.0,0.564846837944892, 1183P 1963
+0.624262636339346,0.0,0.537986398191191,0.593873517786567,0.0, 1183P 1964
+0.500000000000201,0.593873517786567,0.0,0.462013601809212, 1183P 1965
+0.593873517786567,0.0,0.435153162055511,0.624262636339346,0.0, 1183P 1966
+0.40829272230181,0.654651754892125,0.0,0.40829272230181, 1183P 1967
+0.740605162103933,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 1183P 1968
+100,49.2710701159311,-33.9748334636827,30.0000000000002, 1185P 1969
+-30.4748334636827,30.0000000000002,-30.4748334636827, 1185P 1970
+30.0000000000002,0,0; 1185P 1971
+142,0,1159,1183,1185,3,0,0; 1187P 1972
+144,1159,1,1,1181,1187,0,0; 1189P 1973
+128,1,6,1,3,0,0,0,0,0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.5,0.5, 1191P 1974
+0.5,1.0,1.0,1.0,1.0,1.0,1.0,0.333333333333333,0.333333333333333, 1191P 1975
+0.333333333333333,0.333333333333333,1.0,1.0,0.333333333333333, 1191P 1976
+0.333333333333333,0.333333333333333,0.333333333333333,1.0,1.0, 1191P 1977
+39.3481758752689,0.0,64.2668720283496,20.1337387744592,0.0, 1191P 1978
+58.0284184241907,39.3481758752689,30.0,64.2668720283496, 1191P 1979
+20.1337387744592,30.0,58.0284184241907,48.6123784910801,30.0, 1191P 1980
+35.7331279716507,29.3979413902704,30.0,29.4946743674918, 1191P 1981
+48.6123784910801,1.83697019872103E-15,35.7331279716507, 1191P 1982
+29.3979413902704,1.83697019872103E-15,29.4946743674918, 1191P 1983
+48.6123784910801,-30.0,35.7331279716507,29.3979413902704,-30.0, 1191P 1984
+29.4946743674918,39.3481758752689,-30.0,64.2668720283496, 1191P 1985
+20.1337387744592,-30.0,58.0284184241907,39.3481758752689,0.0, 1191P 1986
+64.2668720283496,20.1337387744592,0.0,58.0284184241907,0.0,1.0, 1191P 1987
+0.0,1.0,0,0; 1191P 1988
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0, 1193P 1989
+0.0,1.0,0.0,0.0,1.0,0,0; 1193P 1990
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,1.0,0.0, 1195P 1991
+0.742507935751514,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 1195P 1992
+126,10,2,1,0,1,0,0.0,0.0,0.0,0.25,0.25,0.375,0.375,0.5,0.5,0.75, 1197P 1993
+0.75,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 1197P 1994
+0.742507935751517,1.0,0.0,0.742507935751517,0.943839093311886, 1197P 1995
+0.0,0.808658059436134,0.896507552604822,0.0,0.831374470369977, 1197P 1996
+0.880253573489684,0.0,0.871854315283958,0.857797456851559,0.0, 1197P 1997
+0.926710828581352,0.827365910891222,0.0,0.933856477957971, 1197P 1998
+0.823072084138343,0.0,0.996007751235116,0.785725331470053,0.0, 1197P 1999
+0.991087848405085,0.757031265830409,0.0,0.986680097770748, 1197P 2000
+0.731324195915771,0.0,0.922576118459584,0.692077548059626,0.0, 1197P 2001
+0.0,1.0,0.0,0.0,1.0,0,0; 1197P 2002
+126,20,2,1,0,1,0,0.0,0.0,0.0,0.05,0.05,0.125,0.125,0.25,0.25, 1199P 2003
+0.375,0.375,0.5,0.5,0.625,0.625,0.75,0.75,0.8125,0.8125,0.875, 1199P 2004
+0.875,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 1199P 2005
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.922576118459584, 1199P 2006
+0.692077548059626,0.0,0.898904506864131,0.677584978105979,0.0, 1199P 2007
+0.874898266950247,0.663653710231719,0.0,0.83386173347792, 1199P 2008
+0.639839446003552,0.0,0.805652283468699,0.616811474882371,0.0, 1199P 2009
+0.748026817884669,0.569770587630762,0.0,0.743062433977208, 1199P 2010
+0.51300544510974,0.0,0.7374732352022,0.449095870234834,0.0, 1199P 2011
+0.786652859126596,0.400211820206958,0.0,0.815744132273444, 1199P 2012
+0.371295388188866,0.0,0.899847158420387,0.321542539872807,0.0, 1199P 2013
+0.975755913378729,0.276637178623323,0.0,0.987667343001322, 1199P 2014
+0.253035894900372,0.0,1.00361389942976,0.221439418692537,0.0, 1199P 2015
+0.944942663838379,0.183798092068026,0.0,0.929469256235418, 1199P 2016
+0.173870917640787,0.0,0.881824334033351,0.147702483413666,0.0, 1199P 2017
+0.837514183792795,0.123365634940156,0.0,0.814751695626981, 1199P 2018
+0.107758950294288,0.0,0.742507935751517,0.0582263346243787,0.0, 1199P 2019
+0.742507935751517,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 1199P 2020
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.742507935751514,0.0, 1201P 2021
+0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 1201P 2022
+102,5,1193,1195,1197,1199,1201,0,0; 1203P 2023
+100,-57.2710701159311,33.9748334636827,0.0,48.9748334636827,0.0, 1205P 2024
+48.9748334636827,-3.67394039744206E-15,0,0; 1205P 2025
+110,39.3481758752689,0.0,64.2668720283496,25.0813038469194,0.0, 1207P 2026
+59.634770720444,0,0; 1207P 2027
+126,9,3,0,0,1,0,0.0,0.0,0.0,0.0,0.25,0.25,0.5,0.5,0.75,0.75,1.0, 1209P 2028
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 1209P 2029
+25.0813038469193,-1.94688338601542E-15,59.634770720444, 1209P 2030
+25.0813038469193,-2.5816215925065,59.634770720444, 1209P 2031
+24.7727597156644,-5.16537018988854,58.7982530948171, 1209P 2032
+24.0295347173871,-9.49638154820665,56.0061139072506, 1209P 2033
+23.6141881041413,-11.3009293834154,54.0818178907353, 1209P 2034
+23.4699316019488,-13.9765766477519,49.633836650947, 1209P 2035
+23.8079123323392,-14.8308642624179,47.0529480029752, 1209P 2036
+25.5455510987422,-15.1217120993791,42.1850989905407, 1209P 2037
+26.8967655941417,-14.5802256381637,39.8981506142633, 1209P 2038
+28.2905673953404,-13.4716377312383,37.9703729747534,0.0,1.0,0.0, 1209P 2039
+0.0,0.0,0,0; 1209P 2040
+126,17,3,0,0,1,0,0.0,0.0,0.0,0.0,0.125,0.125,0.25,0.25,0.375, 1211P 2041
+0.375,0.5,0.5,0.625,0.625,0.75,0.75,0.875,0.875,1.0,1.0,1.0,1.0, 1211P 2042
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 1211P 2043
+1.0,1.0,28.2905673953404,-13.4716377312383,37.9703729747534, 1211P 2044
+29.7573901949155,-12.3049711249727,35.9415994491976, 1211P 2045
+31.2239916799214,-10.5605358607171,34.3191030620324, 1211P 2046
+33.4650488134674,-6.17473547894252,31.9473553085455, 1211P 2047
+34.2112239120222,-3.51386290011516,31.2323815292215, 1211P 2048
+34.4452755067262,1.91267336312612,31.0034240489493, 1211P 2049
+33.9288272017811,4.68173705753268,31.4921848721437, 1211P 2050
+31.9812635518232,9.40292900236706,33.4992823343716, 1211P 2051
+30.5896163264265,11.3477976422354,34.979599098565, 1211P 2052
+27.6917483685633,14.1105332877539,38.6982467769469, 1211P 2053
+26.1793293921518,14.92924522659,40.9664478424276, 1211P 2054
+24.0512488855229,15.061908086468,46.0176169614602, 1211P 2055
+23.534565883817,14.3365932674158,48.7626474195268, 1211P 2056
+23.5279535907969,11.7317235638413,53.5690432234499, 1211P 2057
+23.9506680734047,9.89331939307189,55.6607971934702, 1211P 2058
+24.7359781510136,5.43347799292117,58.7024880957592, 1211P 2059
+25.0813038469193,2.71687223284332,59.634770720444, 1211P 2060
+25.0813038469193,-1.94688338601542E-15,59.634770720444,0.0,1.0, 1211P 2061
+0.0,0.0,0.0,0,0; 1211P 2062
+110,25.0813038469194,0.0,59.634770720444,39.3481758752689,0.0, 1213P 2063
+64.2668720283496,0,0; 1213P 2064
+102,5,1205,1207,1209,1211,1213,0,0; 1215P 2065
+142,0,1191,1203,1215,3,0,0; 1217P 2066
+144,1191,1,0,1217,0,0; 1219P 2067
+124,0.844396670390406,-0.195371670902216,-0.498822787412997,0.0, 1221P 2068
+2.77555756156289E-17,0.931128623164149,-0.364690947412239,0.0, 1221P 2069
+0.535718455005608,0.307943821716417,0.786241909105011,0.0,0,0; 1221P 2070
+124,0.844396670390406,0.195371670902216,0.498822787412997,0.0, 1223P 2071
+2.77555756156289E-17,-0.931128623164149,0.364690947412239,0.0, 1223P 2072
+0.535718455005608,-0.307943821716417,-0.78624190910501,0.0,0,0; 1223P 2073
+128,27,2,3,2,0,0,0,0,0,0.0,0.0,0.0,0.0,0.00679479883637048, 1225P 2074
+0.00679479883637048,0.013589597672741,0.013589597672741, 1225P 2075
+0.0203843965091114,0.0203843965091114,0.0271791953454819, 1225P 2076
+0.0271791953454819,0.0407687930182229,0.0407687930182229, 1225P 2077
+0.0475635918545934,0.0475635918545934,0.0543583906909638, 1225P 2078
+0.0543583906909638,0.0679479883637048,0.0679479883637048, 1225P 2079
+0.0747427872000753,0.0747427872000753,0.0815375860364458, 1225P 2080
+0.0815375860364458,0.0951271837091867,0.0951271837091867, 1225P 2081
+0.101921982545557,0.101921982545557,0.108716781381928, 1225P 2082
+0.108716781381928,0.108716781381928,0.108716781381928,0.0,0.0, 1225P 2083
+0.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 1225P 2084
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 1225P 2085
+0.84232816425809,0.825607579791268,0.80525905354372, 1225P 2086
+0.765188823814688,0.745430100912741,0.716579964884929, 1225P 2087
+0.707576939307635,0.706674744149929,0.714746414011712, 1225P 2088
+0.756600217381586,0.80592650766926,0.856653196507632, 1225P 2089
+0.869947819904309,0.881446340567467,0.879435008451449, 1225P 2090
+0.848000694446067,0.789898081102129,0.723781497000352, 1225P 2091
+0.707977256051806,0.706312016693116,0.720619944544387, 1225P 2092
+0.784488658926397,0.844385549823309,0.878420408548522, 1225P 2093
+0.88153023436277,0.871690575870073,0.859048748724911, 1225P 2094
+0.84232816425809,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 1225P 2095
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 1225P 2096
+1.0,27.7058081905616,-13.9060526534759,38.8038000799358, 1225P 2097
+28.7748889920642,-13.1679144718142,37.2317431498434, 1225P 2098
+29.8838865150197,-12.0947802642772,35.8766679185391, 1225P 2099
+31.8694396258428,-9.40028019796303,33.611542612016, 1225P 2100
+32.7468371067773,-7.76613669370669,32.7034713831664, 1225P 2101
+33.9728574767828,-4.16545248551604,31.4605050118556, 1225P 2102
+34.3266816945262,-2.16111934808395,31.1194312052157, 1225P 2103
+34.3628049261152,1.82432069598381,31.0841143364072, 1225P 2104
+34.0470017043412,3.83822719318673,31.3878043474678, 1225P 2105
+32.2788327693176,9.3349936786132,33.1735763209116, 1225P 2106
+29.9941616275378,12.261194984657,35.4970568723986, 1225P 2107
+26.8072547296044,14.5552790997203,40.0992617262551, 1225P 2108
+25.7896967845689,14.9791647833047,41.8446680775398, 1225P 2109
+24.2769817509732,15.0193062972825,45.5336874875462, 1225P 2110
+23.7895101470943,14.6295475186337,47.5023696226233, 1225P 2111
+23.2667693706279,12.3761557519627,53.1101054748346, 1225P 2112
+24.0873819975143,9.56505753904566,56.3700220810518, 1225P 2113
+24.8860137114615,4.16932696205591,59.0894748470784, 1225P 2114
+25.0711188614674,2.17687399058674,59.6049317265233, 1225P 2115
+25.0906030028066,-1.81400165466274,59.6620146438112, 1225P 2116
+24.9237635208062,-3.82580571414092,59.2006183056627, 1225P 2117
+24.1534956033214,-9.27361500619258,56.6255099743738, 1225P 2118
+23.3052795727684,-12.1694792733455,53.3942439230096, 1225P 2119
+23.7294681432021,-14.5338424020292,47.8413343494906, 1225P 2120
+24.1761985650112,-14.9735699771095,45.8687096974304, 1225P 2121
+25.6360822381267,-15.0240349215071,42.1440450784611, 1225P 2122
+26.636727389059,-14.6441908351376,40.3758570100282, 1225P 2123
+27.7058081905616,-13.9060526534759,38.8038000799358, 1225P 2124
+26.6066231912879,-13.7949216543144,38.1579809624746, 1225P 2125
+27.6390555497015,-12.9805171311979,36.4870712772865, 1225P 2126
+28.6601287239679,-11.8163901311065,35.1004845027482, 1225P 2127
+30.4259356808486,-9.03083265665518,32.8262297510548, 1225P 2128
+31.156596653385,-7.38673248290243,31.9667051263368, 1225P 2129
+32.164726639681,-3.88226662983834,30.7938401169178, 1225P 2130
+32.4284907269799,-2.02673066494811,30.5000996128073, 1225P 2131
+32.4568431362887,1.71308193531912,30.4680599798765, 1225P 2132
+32.2228157546083,3.57059041808847,30.7282006969455, 1225P 2133
+30.8015236622524,8.80506392703801,32.3765545466552, 1225P 2134
+28.8507778248284,11.9503852561447,34.5830321052963, 1225P 2135
+25.7785661509224,14.4791590871161,39.4743187002105, 1225P 2136
+24.7744005569044,14.9676241104212,41.3296348537193, 1225P 2137
+23.2542518709929,15.0289670846728,45.2045199612861, 1225P 2138
+22.7234909406871,14.6012417269737,47.3030876361868, 1225P 2139
+22.008659947892,12.1395154306862,53.1543337141868, 1225P 2140
+22.6175970465231,8.9072046100643,56.3106514131299, 1225P 2141
+23.0795285018926,3.7729396672786,58.6193563496025, 1225P 2142
+23.1735829129605,1.98305164887656,58.9935472541287, 1225P 2143
+23.1840615418339,-1.65643379559322,59.0387648753137, 1225P 2144
+23.1004512115822,-3.44968208062226,58.7074988112839, 1225P 2145
+22.6577522656412,-8.60701013135296,56.5376484686711, 1225P 2146
+22.0317727645107,-11.9111482402046,53.4461289889425, 1225P 2147
+22.6554688713172,-14.496534948375,47.657595811496, 1225P 2148
+23.1481250932206,-14.9809416320613,45.5574784727209, 1225P 2149
+24.6225536789961,-15.018332012061,41.6464021045559, 1225P 2150
+25.6143815030331,-14.5776229251088,39.7638452435013, 1225P 2151
+26.6066231912879,-13.7949216543144,38.1579809624746, 1225P 2152
+26.2805424275164,-14.8255475284704,37.4730563410019, 1225P 2153
+27.3871686879187,-14.0556647571991,35.6695131204277, 1225P 2154
+28.5219767608464,-12.9225089254597,34.1075604859748, 1225P 2155
+30.5474206416731,-10.0591023771834,31.4914613684679, 1225P 2156
+31.438666684881,-8.31512090504049,30.4394994983278, 1225P 2157
+32.6832307578265,-4.46376849582805,28.998595240381, 1225P 2158
+33.0417845933659,-2.31600740998127,28.6025252334342, 1225P 2159
+33.0784086736013,1.95506999101434,28.5615338466433, 1225P 2160
+32.758407828986,4.11333318163697,28.9142219102374, 1225P 2161
+30.9637404899062,9.99395882470146,30.9846356747354, 1225P 2162
+28.6464529343611,13.1070616449137,33.6778427680468, 1225P 2163
+25.3516785179331,15.5039781193598,38.9599635675795, 1225P 2164
+24.28666578229,15.9333886049467,40.9557475676017, 1225P 2165
+22.6448194089228,15.9279589180356,45.1489714839184, 1225P 2166
+22.0736198481746,15.4866113489123,47.3742032927442, 1225P 2167
+21.2605330727219,13.0280372653075,53.6788070504177, 1225P 2168
+21.8372481096086,10.0285462997175,57.2997930533337, 1225P 2169
+22.4142968847657,4.35876575066783,60.3159861195343, 1225P 2170
+22.5538400253116,2.27529540432513,60.8863675519458, 1225P 2171
+22.5683803738007,-1.8960179043764,60.9495726878257, 1225P 2172
+22.4424661608485,-3.99900119616654,60.4390571780897, 1225P 2173
+21.8834598078023,-9.72019353024073,57.583508370948, 1225P 2174
+21.2803649896725,-12.8063312246401,53.9957097081597, 1225P 2175
+21.9977641992047,-15.3805316967682,47.7564047752318, 1225P 2176
+22.5306032995434,-15.8748370056993,45.5283504086014, 1225P 2177
+24.1240104137061,-15.97729575032,41.2972507864013, 1225P 2178
+25.1739161671141,-15.5954302997416,39.2765995615761, 1225P 2179
+26.2805424275164,-14.8255475284704,37.4730563410019,0.0, 1225P 2180
+0.108716781381928,0.0,1.0,0,0; 1225P 2181
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.00123202779517798,0.0, 1227P 2182
+0.0,0.108716781381928,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 1227P 2183
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.108716781381928,0.0, 1229P 2184
+0.0,0.108716781381928,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 1229P 2185
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.108716781381928,1.0, 1231P 2186
+0.0,0.00123199471848352,0.999825060748766,0.0,0.0,1.0,0.0,0.0, 1231P 2187
+1.0,0,0; 1231P 2188
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.00123199471848352, 1233P 2189
+0.999825060748766,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 1233P 2190
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0, 1235P 2191
+0.0,1.0,0.0,0.0,1.0,0,0; 1235P 2192
+126,1,1,1,0,1,0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0, 1237P 2193
+0.00123202779517798,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0,0; 1237P 2194
+102,6,1227,1229,1231,1233,1235,1237,0,0; 1239P 2195
+126,27,3,0,0,1,0,0.0,0.0,0.0,0.0,0.0624999999999999, 1241P 2196
+0.0624999999999999,0.125,0.125,0.1875,0.1875,0.25,0.25,0.375, 1241P 2197
+0.375,0.437499999999999,0.437499999999999,0.499999999999999, 1241P 2198
+0.499999999999999,0.625,0.625,0.6875,0.6875,0.75,0.75,0.875, 1241P 2199
+0.875,0.9375,0.9375,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 1241P 2200
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 1241P 2201
+1.0,1.0,1.0,1.0,1.0,28.2905673953404,-13.4716377312383, 1241P 2202
+37.9703729747534,29.3601746746492,-12.6209043672971, 1241P 2203
+36.4909911901015,30.436487778095,-11.4538115342603, 1241P 2204
+35.2254486531201,32.299957263021,-8.63232582286862, 1241P 2205
+33.1565010435248,33.1036990716615,-6.93907747713329, 1241P 2206
+32.3375936339553,34.1539706417853,-3.27576714764353, 1241P 2207
+31.2838130566985,34.409008783574,-1.25482852472921, 1241P 2208
+31.0389094320528,34.2534560077443,2.71114387536998, 1241P 2209
+31.1910609105447,33.8498351961138,4.66788560441381, 1241P 2210
+31.5812643663518,31.8696739454424,9.99462520780392, 1241P 2211
+33.6024334198496,29.5722255060707,12.6871516302781, 1241P 2212
+35.9926246816508,26.4781320288358,14.7135976667608, 1241P 2213
+40.6473227157727,25.4976865649701,15.0568508398643, 1241P 2214
+42.4268123671004,24.0991140225917,14.9271569126518, 1241P 2215
+46.1471809669487,23.6878602891378,14.4541177835401, 1241P 2216
+48.1026397377022,23.3373695577069,12.0114898283555, 1241P 2217
+53.6014091375301,24.1690896235725,9.18592257780612, 1241P 2218
+56.6814898992305,24.9250621619096,3.80511757496859, 1241P 2219
+59.20300134505,25.0901109010881,1.80790988921522, 1241P 2220
+59.6605726273965,25.0716934784121,-2.15346786245637, 1241P 2221
+59.6066154874218,24.8889828511482,-4.13588708402606, 1241P 2222
+59.0966757117158,24.1058428946795,-9.46647854807571, 1241P 2223
+56.4385688286984,23.2971942031746,-12.2521784824218, 1241P 2224
+53.261485409246,23.7449164471992,-14.5535139933834, 1241P 2225
+47.7631710480555,24.1970478873593,-14.9821990757575, 1241P 2226
+45.800839049237,25.6587464855448,-15.0166701372188, 1241P 2227
+42.1013429988628,26.6500041438186,-14.635023983284, 1241P 2228
+40.3563338073418,27.7058081905616,-13.9060526534759, 1241P 2229
+38.8038000799358,0.0,1.0,0.0,0.0,0.0,0,0; 1241P 2230
+100,21.7602969031927,43.9960750376793,-8.40314594463538, 1243P 2231
+44.1826040137551,-6.41186320703026,42.2662103691883, 1243P 2232
+-7.399368963077,0,0; 1243P 2233
+126,27,3,0,0,1,0,0.0,0.0,0.0,0.0,0.0624999999999998, 1245P 2234
+0.0624999999999998,0.125,0.125,0.25,0.25,0.312499999999999, 1245P 2235
+0.312499999999999,0.374999999999999,0.374999999999999, 1245P 2236
+0.499999999999999,0.499999999999999,0.5625,0.5625,0.625,0.625, 1245P 2237
+0.75,0.75,0.8125,0.8125,0.875,0.875,0.9375,0.9375,1.0,1.0,1.0, 1245P 2238
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 1245P 2239
+1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 1245P 2240
+26.2805424275164,-14.8255475284704,37.4730563410019, 1245P 2241
+25.2026528642162,-15.5754381819234,39.2297653173805, 1245P 2242
+24.192125143606,-15.9504788614792,41.1684098299911, 1245P 2243
+22.6311725939042,-15.9092697997503,45.214667528471, 1245P 2244
+22.0888307827986,-15.4847314274173,47.3367039164331, 1245P 2245
+21.2806171274733,-13.1800830204374,53.3696304538195, 1245P 2246
+21.7929414025311,-10.3411858535289,57.0220489344436, 1245P 2247
+22.3918015937663,-4.63434542755715,60.2190237836542, 1245P 2248
+22.5471870158992,-2.490465179907,60.8574300008883, 1245P 2249
+22.5736465785761,1.8228824283751,60.9724810618492, 1245P 2250
+22.4430007934934,4.00160011875894,60.4438536298566, 1245P 2251
+21.8725757701903,9.81523491179063,57.5237253740906, 1245P 2252
+21.3046130002624,12.7657863074886,53.9967305879295, 1245P 2253
+21.9596318889661,15.3038525583413,47.9881218169273, 1245P 2254
+22.4418128722386,15.805987417244,45.8707553419465, 1245P 2255
+23.8959449547615,16.0136107906056,41.8167050136757, 1245P 2256
+24.8770323507705,15.7190625485974,39.8356748406096, 1245P 2257
+28.0145867246726,13.7487603686013,34.5288673454046, 1245P 2258
+30.3977530538177,10.9564259820759,31.661766788658, 1245P 2259
+32.4993048195997,5.2446640479101,29.2051513752077, 1245P 2260
+32.940149250878,3.12108026502943,28.7163628091955, 1245P 2261
+33.1376747615381,-1.19887575761649,28.4951339076399, 1245P 2262
+32.8877213651622,-3.40422138071755,28.7699800400258, 1245P 2263
+31.819783083166,-7.39115035832679,29.9936466865049, 1245P 2264
+30.9933560244574,-9.22665208778233,30.9543364500211, 1245P 2265
+29.0803651610672,-12.2532131029231,33.3638621751651, 1245P 2266
+27.9746925860418,-13.4890178467359,34.835880319096, 1245P 2267
+26.8845682374864,-14.3710936669496,36.5162023051751,0.0,1.0,0.0, 1245P 2268
+0.0,0.0,0,0; 1245P 2269
+126,5,3,0,0,1,0,0.0,0.0,0.0,0.0,0.5,0.5,1.0,1.0,1.0,1.0,1.0,1.0, 1247P 2270
+1.0,1.0,1.0,1.0,26.8845682374864,-14.3710936669496, 1247P 2271
+36.5162023051751,26.7834901853848,-14.4528811307663, 1247P 2272
+36.6720044147982,26.6822427470568,-14.5318981903792, 1247P 2273
+36.8301063208103,26.4808473637166,-14.6833795598997, 1247P 2274
+37.149025471256,26.380486050997,-14.7560164821813, 1247P 2275
+37.3101715089393,26.2805424275164,-14.8255475284704, 1247P 2276
+37.4730563410019,0.0,1.0,0.0,0.0,0.0,0,0; 1247P 2277
+100,-21.7602969031927,43.9960750376793,8.40314594463538, 1249P 2278
+42.2662103691883,7.399368963077,44.1826040137551, 1249P 2279
+6.41186320703027,0,0; 1249P 2280
+126,4,3,0,0,1,0,0.0,0.0,0.0,0.0,0.5,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 1251P 2281
+1.0,1.0,27.7058081905616,-13.9060526534759,38.8038000799358, 1251P 2282
+27.8025795994272,-13.8392376201126,38.6615001175744, 1251P 2283
+27.9969243758542,-13.699998522051,38.3803865201169, 1251P 2284
+28.192530829113,-13.5496130586218,38.1059680787811, 1251P 2285
+28.2905673953404,-13.4716377312383,37.9703729747534,0.0,1.0,0.0, 1251P 2286
+0.0,0.0,0,0; 1251P 2287
+102,6,1241,1243,1245,1247,1249,1251,0,0; 1253P 2288
+142,0,1225,1239,1253,3,0,0; 1255P 2289
+144,1225,1,0,1255,0,0; 1257P 2290
+S 1G 3D 1258P 2290 T 1
diff --git a/release/ef.log b/release/ef.log
new file mode 100644
index 0000000..3b724c6
--- /dev/null
+++ b/release/ef.log
@@ -0,0 +1,154 @@
+UG to STEP
+! INFO- NX STEP AP214 - V2506.5001
+! INFO-
+! INFO- Start of Translation: 7-OCT-2025 7:45:57 PM
+! INFO-
+! STATUS- Converting Part: F:\NXUG\NX2506\耳阀.prt
+! SUMMARY-
+! SUMMARY- Summary of Unigraphics Part Entities
+! SUMMARY- For Part: F:\NXUG\NX2506\耳阀.prt
+! SUMMARY- Entities Processed Count
+! SUMMARY- ------------------ -----
+! SUMMARY- Part Attribute ..............: 1
+! SUMMARY- Font ........................: 1
+! SUMMARY- Color Table .................: 2
+! SUMMARY- Coordinate System ...........: 2
+! SUMMARY- Parameter ...................: 1
+! SUMMARY- Matrix ......................: 1
+! SUMMARY- Solid/Sheet .................:
+! SUMMARY- Body .....................: 1
+! SUMMARY- -----
+! SUMMARY- Total 9
+! STATUS-
+! STATUS- Converting to Output Form (Phase 2 of 3): 7-OCT-2025 7:45:58 PM
+! STATUS-
+! STATUS-
+! STATUS- Generating UG geometry and placing them in parts
+! STATUS-
+! SUMMARY-
+! SUMMARY- STEP Header Information
+! SUMMARY-
+! SUMMARY- Description Unknown
+! SUMMARY- Imp_Level 1
+! SUMMARY- File_Name ef.stp
+! SUMMARY- Date 2025-10-07T19:45:58+08:00
+! SUMMARY- Author Unknown
+! SUMMARY- Organization Unknown
+! SUMMARY- Pre_Version ST-DEVELOPER v20
+! SUMMARY- Orig_System SIEMENS PLM Software NX2506.5001
+! SUMMARY- Authorization Unknown
+! SUMMARY- Schema_ID step_merged_ap_schema
+! SUMMARY-
+! SUMMARY- Summary of STEP Entities
+! SUMMARY-
+! SUMMARY- Entity Type Count
+! SUMMARY- ----------- ------
+! SUMMARY- advanced_face ..............................................: 31
+! SUMMARY- application_context ........................................: 1
+! SUMMARY- axis2_placement_3d .........................................: 67
+! SUMMARY- b_spline_curve_with_knots ..................................: 3
+! SUMMARY- b_spline_surface_with_knots_and_rational_b_spline_surface ..: 1
+! SUMMARY- cartesian_point ............................................: 376
+! SUMMARY- circle .....................................................: 36
+! SUMMARY- closed_shell ...............................................: 1
+! SUMMARY- conical_surface ............................................: 2
+! SUMMARY- conversion_based_unit_and_plane_angle_unit .................: 1
+! SUMMARY- cylindrical_surface ........................................: 16
+! SUMMARY- dimensional_exponents ......................................: 1
+! SUMMARY- direction ..................................................: 150
+! SUMMARY- edge_curve .................................................: 55
+! SUMMARY- edge_loop ..................................................: 72
+! SUMMARY- face_bound .................................................: 66
+! SUMMARY- face_outer_bound ...........................................: 6
+! SUMMARY- geometric_representation_context_and_global_uncertainty_a ..: 1
+! SUMMARY- length_unit_and_si_unit ....................................: 1
+! SUMMARY- line .......................................................: 16
+! SUMMARY- manifold_solid_brep ........................................: 1
+! SUMMARY- oriented_edge ..............................................: 110
+! SUMMARY- plane ......................................................: 12
+! SUMMARY- plane_angle_measure_with_unit ..............................: 1
+! SUMMARY- plane_angle_unit_and_si_unit ...............................: 1
+! SUMMARY- product ....................................................: 1
+! SUMMARY- product_context ............................................: 1
+! SUMMARY- product_definition .........................................: 1
+! SUMMARY- product_definition_context .................................: 1
+! SUMMARY- product_definition_formation_with_specified_source .........: 1
+! SUMMARY- product_definition_shape ...................................: 1
+! SUMMARY- product_related_product_category ...........................: 1
+! SUMMARY- si_unit_and_solid_angle_unit ...............................: 1
+! SUMMARY- uncertainty_measure_with_unit ..............................: 1
+! SUMMARY- vector .....................................................: 16
+! SUMMARY- vertex_point ...............................................: 47
+! SUMMARY- -------
+! SUMMARY- Total 1100
+! INFO- Bspline aprx. value in effect for this translation :0.025400 millimeter
+! INFO-
+! INFO- Total number of solids input for this translation : 1
+! INFO-
+! INFO- Number of solids processed without problems : 1
+! INFO-
+! INFO- Number of solids with problems output as sheets : 0
+! INFO-
+! INFO- Number of solids not processed : 0
+! INFO-
+! INFO- End of Translation: 7-OCT-2025 7:45:58 PM
+! INFO-
+UG to IGES
+! INFO- NX V2506.5001 / IGES Specification 5.3
+! INFO-
+! INFO- Start of Translation: 7-OCT-2025 7:46:20 PM
+! INFO-
+! STATUS- Converting Part: F:\NXUG\NX2506\耳阀.prt
+! SUMMARY-
+! SUMMARY- Summary of Unigraphics Input Entities
+! SUMMARY- For Part: F:\NXUG\NX2506\耳阀.prt
+! SUMMARY- Entities Processed Count
+! SUMMARY- ------------------ -----
+! SUMMARY- Point .......................: 1
+! SUMMARY- Line ........................: 90
+! SUMMARY- Arc/Circle ..................: 89
+! SUMMARY- B-Curve .....................: 166
+! SUMMARY- Part Attribute ..............: 1
+! SUMMARY- Layer Category ..............: 6
+! SUMMARY- Font ........................: 1
+! SUMMARY- Color Table .................: 2
+! SUMMARY- Coordinate System ...........: 2
+! SUMMARY- Parameter ...................: 2
+! SUMMARY- Matrix ......................: 24
+! SUMMARY- View ........................: 8
+! SUMMARY- Layout ......................: 5
+! SUMMARY- Solid/Sheet .................:
+! SUMMARY- Face .....................: 31
+! SUMMARY- Trim Curve ..................: 55
+! SUMMARY- -----
+! SUMMARY- Total 483
+! STATUS-
+! STATUS- Converting to Output Form (Phase 2 of 3): 7-OCT-2025 7:46:21 PM
+! STATUS-
+! STATUS- Creating the IGES file (Phase 3 of 3): 7-OCT-2025 7:46:21 PM
+! SUMMARY-
+! SUMMARY- Summary of IGES Output Entities
+! SUMMARY-
+! SUMMARY- Entities Processed Count
+! SUMMARY- ------------------ -----
+! SUMMARY- Point ........................ 1
+! SUMMARY- Arc .......................... 89
+! SUMMARY- Line ......................... 90
+! SUMMARY- BSpline Curve ................ 166
+! SUMMARY- Composite Curve .............. 52
+! SUMMARY- Curve on Surface ............. 55
+! SUMMARY- Plane ........................
+! SUMMARY- Unbounded ................ 32
+! SUMMARY- Trimmed Surface .............. 31
+! SUMMARY- BSpline Surface .............. 31
+! SUMMARY- Color ........................ 3
+! SUMMARY- Name ......................... 37
+! SUMMARY- Transformation ............... 24
+! SUMMARY- Definition Levels ............ 5
+! SUMMARY- Level Function ............... 5
+! SUMMARY- View ......................... 8
+! SUMMARY- -----
+! SUMMARY- Total 629
+! INFO-
+! INFO- End of Translation: 7-OCT-2025 7:46:21 PM
+! INFO-
diff --git a/release/ef.stl b/release/ef.stl
new file mode 100644
index 0000000..62734f2
Binary files /dev/null and b/release/ef.stl differ
diff --git a/release/ef.stp b/release/ef.stp
new file mode 100644
index 0000000..32288c8
--- /dev/null
+++ b/release/ef.stp
@@ -0,0 +1,1228 @@
+ISO-10303-21;
+HEADER;
+/* Generated by software containing ST-Developer
+ * from STEP Tools, Inc. (www.steptools.com)
+ */
+/* OPTION: using custom schema-name function */
+
+FILE_DESCRIPTION(
+/* description */ (''),
+/* implementation_level */ '2;1');
+
+FILE_NAME(
+/* name */ 'ef.stp',
+/* time_stamp */ '2025-10-07T19:45:58+08:00',
+/* author */ (''),
+/* organization */ (''),
+/* preprocessor_version */ 'ST-DEVELOPER v20',
+/* originating_system */ 'SIEMENS PLM Software NX2506.5001',
+/* authorisation */ '');
+
+FILE_SCHEMA (('AUTOMOTIVE_DESIGN { 1 0 10303 214 3 1 1 1 }'));
+ENDSEC;
+
+DATA;
+#10=SHAPE_REPRESENTATION_RELATIONSHIP('None',
+'relationship between \X2\80339600\X0\-None and \X2\80339600\X0\-None',
+#22,#11);
+#11=ADVANCED_BREP_SHAPE_REPRESENTATION('\X2\80339600\X0\-None',(#32),#1117);
+#12=SHAPE_DEFINITION_REPRESENTATION(#13,#22);
+#13=PRODUCT_DEFINITION_SHAPE('','',#14);
+#14=PRODUCT_DEFINITION(' ','',#16,#15);
+#15=PRODUCT_DEFINITION_CONTEXT('part definition',#21,'design');
+#16=PRODUCT_DEFINITION_FORMATION_WITH_SPECIFIED_SOURCE(' ',' ',#18,
+ .NOT_KNOWN.);
+#17=PRODUCT_RELATED_PRODUCT_CATEGORY('part','',(#18));
+#18=PRODUCT('\X2\80339600\X0\','\X2\80339600\X0\',' ',(#19));
+#19=PRODUCT_CONTEXT(' ',#21,'mechanical');
+#20=APPLICATION_PROTOCOL_DEFINITION('international standard',
+'automotive_design',2010,#21);
+#21=APPLICATION_CONTEXT(
+'core data for automotive mechanical design processes');
+#22=SHAPE_REPRESENTATION('\X2\80339600\X0\-None',(#523),#1117);
+#23=PRESENTATION_LAYER_ASSIGNMENT('1','Layer 1',(#32));
+#24=STYLED_ITEM('',(#25),#32);
+#25=PRESENTATION_STYLE_ASSIGNMENT((#26));
+#26=SURFACE_STYLE_USAGE(.BOTH.,#27);
+#27=SURFACE_SIDE_STYLE('',(#28));
+#28=SURFACE_STYLE_FILL_AREA(#29);
+#29=FILL_AREA_STYLE('',(#30));
+#30=FILL_AREA_STYLE_COLOUR('',#31);
+#31=COLOUR_RGB('medium steel',0.611764705882353,0.658823529411765,0.670588235294118);
+#32=MANIFOLD_SOLID_BREP('',#33);
+#33=CLOSED_SHELL('',(#101,#102,#103,#104,#105,#106,#107,#108,#109,#110,
+#111,#112,#113,#114,#115,#116,#117,#118,#119,#120,#121,#122,#123,#124,#125,
+#126,#127,#128,#129,#130,#131));
+#34=(
+BOUNDED_SURFACE()
+B_SPLINE_SURFACE(3,2,((#966,#967,#968),(#969,#970,#971),(#972,#973,#974),
+(#975,#976,#977),(#978,#979,#980),(#981,#982,#983),(#984,#985,#986),(#987,
+#988,#989),(#990,#991,#992),(#993,#994,#995),(#996,#997,#998),(#999,#1000,
+#1001),(#1002,#1003,#1004),(#1005,#1006,#1007),(#1008,#1009,#1010),(#1011,
+#1012,#1013),(#1014,#1015,#1016),(#1017,#1018,#1019),(#1020,#1021,#1022),
+(#1023,#1024,#1025),(#1026,#1027,#1028),(#1029,#1030,#1031),(#1032,#1033,
+#1034),(#1035,#1036,#1037),(#1038,#1039,#1040),(#1041,#1042,#1043),(#1044,
+#1045,#1046),(#1047,#1048,#1049),(#1050,#1051,#1052),(#1053,#1054,#1055),
+(#1056,#1057,#1058),(#1059,#1060,#1061),(#1062,#1063,#1064),(#1065,#1066,
+#1067),(#1068,#1069,#1070),(#1071,#1072,#1073),(#1074,#1075,#1076),(#1077,
+#1078,#1079),(#1080,#1081,#1082),(#1083,#1084,#1085),(#1086,#1087,#1088),
+(#1089,#1090,#1091),(#1092,#1093,#1094),(#1095,#1096,#1097),(#1098,#1099,
+#1100),(#1101,#1102,#1103),(#1104,#1105,#1106),(#1107,#1108,#1109),(#1110,
+#1111,#1112),(#1113,#1114,#1115)),.UNSPECIFIED.,.T.,.F.,.F.)
+B_SPLINE_SURFACE_WITH_KNOTS((1,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+2,2,2,2,3,1),(3,3),(-0.0312499999999999,0.,0.03125,0.0625,0.09375,0.125,
+0.1875,0.25,0.3125,0.34375,0.375,0.40625,0.4375,0.5,0.53125,0.5625,0.625,
+0.65625,0.6875,0.75,0.8125,0.84375,0.875,0.9375,0.96875,1.,1.03125),(0.,
+1.),.UNSPECIFIED.)
+GEOMETRIC_REPRESENTATION_ITEM()
+RATIONAL_B_SPLINE_SURFACE(((1.,0.84232816425809,1.),(1.,0.833967872024679,
+1.),(1.,0.82478943902848,1.),(1.,0.805475867976033,1.),(1.,0.795241496111462,
+1.),(1.,0.775206381246946,1.),(1.,0.765367870305502,1.),(1.,0.746875778000135,
+1.),(1.,0.738217566905788,1.),(1.,0.716579964884929,1.),(1.,0.707576939307635,
+1.),(1.,0.706674744149929,1.),(1.,0.714746414011712,1.),(1.,0.742648949591628,
+1.),(1.,0.762056985616015,1.),(1.,0.792251855578479,1.),(1.,0.802335025520835,
+1.),(1.,0.821806748308551,1.),(1.,0.831289852088446,1.),(1.,0.848198748367903,
+1.),(1.,0.855678902812178,1.),(1.,0.868000297502957,1.),(1.,0.872822450070098,
+1.),(1.,0.881446340567467,1.),(1.,0.879435008451449,1.),(1.,0.863717851448758,
+1.),(1.,0.856419703179562,1.),(1.,0.838900980249515,1.),(1.,0.828616782312594,
+1.),(1.,0.794451501937611,1.),(1.,0.76785921973487,1.),(1.,0.734800927683981,
+1.),(1.,0.725277903073682,1.),(1.,0.711588106475119,1.),(1.,0.707560946212134,
+1.),(1.,0.706312016693116,1.),(1.,0.720619944544387,1.),(1.,0.763199087465727,
+1.),(1.,0.790133640588644,1.),(1.,0.824838324301896,1.),(1.,0.83541567056888,
+1.),(1.,0.853666156960364,1.),(1.,0.861402979185916,1.),(1.,0.878420408548522,
+1.),(1.,0.88153023436277,1.),(1.,0.874150490493247,1.),(1.,0.869714847021339,
+1.),(1.,0.857978409218467,1.),(1.,0.8506884564915,1.),(1.,0.84232816425809,
+1.)))
+REPRESENTATION_ITEM('')
+SURFACE()
+);
+#35=CYLINDRICAL_SURFACE('',#537,10.);
+#36=CYLINDRICAL_SURFACE('',#541,20.);
+#37=CYLINDRICAL_SURFACE('',#543,3.5);
+#38=CYLINDRICAL_SURFACE('',#549,10.);
+#39=CYLINDRICAL_SURFACE('',#551,3.5);
+#40=CYLINDRICAL_SURFACE('',#566,62.5);
+#41=CYLINDRICAL_SURFACE('',#578,17.5000000000001);
+#42=CYLINDRICAL_SURFACE('',#580,12.5);
+#43=CYLINDRICAL_SURFACE('',#581,39.7430663251921);
+#44=CYLINDRICAL_SURFACE('',#583,4.);
+#45=CYLINDRICAL_SURFACE('',#584,4.);
+#46=CYLINDRICAL_SURFACE('',#585,4.);
+#47=CYLINDRICAL_SURFACE('',#586,4.);
+#48=CYLINDRICAL_SURFACE('',#587,4.);
+#49=CYLINDRICAL_SURFACE('',#588,4.);
+#50=CYLINDRICAL_SURFACE('',#589,15.);
+#51=FACE_OUTER_BOUND('',#243,.T.);
+#52=FACE_OUTER_BOUND('',#244,.T.);
+#53=FACE_OUTER_BOUND('',#245,.T.);
+#54=FACE_OUTER_BOUND('',#254,.T.);
+#55=FACE_OUTER_BOUND('',#255,.T.);
+#56=FACE_OUTER_BOUND('',#256,.T.);
+#57=PLANE('',#530);
+#58=PLANE('',#534);
+#59=PLANE('',#535);
+#60=PLANE('',#538);
+#61=PLANE('',#547);
+#62=PLANE('',#548);
+#63=PLANE('',#550);
+#64=PLANE('',#556);
+#65=PLANE('',#564);
+#66=PLANE('',#574);
+#67=PLANE('',#577);
+#68=PLANE('',#582);
+#69=LINE('',#779,#85);
+#70=LINE('',#784,#86);
+#71=LINE('',#790,#87);
+#72=LINE('',#795,#88);
+#73=LINE('',#799,#89);
+#74=LINE('',#802,#90);
+#75=LINE('',#803,#91);
+#76=LINE('',#807,#92);
+#77=LINE('',#809,#93);
+#78=LINE('',#811,#94);
+#79=LINE('',#815,#95);
+#80=LINE('',#816,#96);
+#81=LINE('',#860,#97);
+#82=LINE('',#864,#98);
+#83=LINE('',#868,#99);
+#84=LINE('',#870,#100);
+#85=VECTOR('',#600,1.);
+#86=VECTOR('',#603,1.);
+#87=VECTOR('',#610,1.);
+#88=VECTOR('',#613,1.);
+#89=VECTOR('',#618,1.);
+#90=VECTOR('',#619,1.);
+#91=VECTOR('',#620,1.);
+#92=VECTOR('',#625,1.);
+#93=VECTOR('',#628,1.);
+#94=VECTOR('',#629,1.);
+#95=VECTOR('',#634,1.);
+#96=VECTOR('',#635,1.);
+#97=VECTOR('',#646,1.);
+#98=VECTOR('',#649,1.);
+#99=VECTOR('',#654,1.);
+#100=VECTOR('',#657,1.);
+#101=ADVANCED_FACE('',(#170,#171,#172),#132,.F.);
+#102=ADVANCED_FACE('',(#173,#174),#57,.T.);
+#103=ADVANCED_FACE('',(#175,#176),#58,.T.);
+#104=ADVANCED_FACE('',(#51),#59,.F.);
+#105=ADVANCED_FACE('',(#52),#35,.T.);
+#106=ADVANCED_FACE('',(#53),#60,.F.);
+#107=ADVANCED_FACE('',(#177,#178),#36,.T.);
+#108=ADVANCED_FACE('',(#179,#180),#37,.F.);
+#109=ADVANCED_FACE('',(#181,#182,#183,#184),#61,.F.);
+#110=ADVANCED_FACE('',(#54),#62,.T.);
+#111=ADVANCED_FACE('',(#55),#38,.T.);
+#112=ADVANCED_FACE('',(#56),#63,.T.);
+#113=ADVANCED_FACE('',(#185,#186),#39,.F.);
+#114=ADVANCED_FACE('',(#187,#188,#189),#133,.T.);
+#115=ADVANCED_FACE('',(#190,#191),#64,.F.);
+#116=ADVANCED_FACE('',(#192,#193,#194,#195,#196,#197,#198,#199),#65,.F.);
+#117=ADVANCED_FACE('',(#200,#201),#40,.T.);
+#118=ADVANCED_FACE('',(#202,#203,#204,#205,#206,#207,#208,#209),#66,.F.);
+#119=ADVANCED_FACE('',(#210,#211),#67,.F.);
+#120=ADVANCED_FACE('',(#212,#213),#41,.T.);
+#121=ADVANCED_FACE('',(#214,#215),#42,.F.);
+#122=ADVANCED_FACE('',(#216,#217),#43,.F.);
+#123=ADVANCED_FACE('',(#218,#219),#68,.F.);
+#124=ADVANCED_FACE('',(#220,#221),#44,.F.);
+#125=ADVANCED_FACE('',(#222,#223),#45,.F.);
+#126=ADVANCED_FACE('',(#224,#225),#46,.F.);
+#127=ADVANCED_FACE('',(#226,#227),#47,.F.);
+#128=ADVANCED_FACE('',(#228,#229),#48,.F.);
+#129=ADVANCED_FACE('',(#230,#231),#49,.F.);
+#130=ADVANCED_FACE('',(#232,#233),#50,.F.);
+#131=ADVANCED_FACE('',(#234,#235),#34,.T.);
+#132=CONICAL_SURFACE('',#526,39.7430663251921,17.9873346520612);
+#133=CONICAL_SURFACE('',#554,23.8961038961039,17.9873346520612);
+#134=CIRCLE('',#524,20.262546844673);
+#135=CIRCLE('',#525,39.7430663251921);
+#136=CIRCLE('',#527,3.5);
+#137=CIRCLE('',#528,20.);
+#138=CIRCLE('',#529,10.);
+#139=CIRCLE('',#531,3.5);
+#140=CIRCLE('',#532,20.);
+#141=CIRCLE('',#533,10.);
+#142=CIRCLE('',#536,10.);
+#143=CIRCLE('',#539,20.);
+#144=CIRCLE('',#540,20.);
+#145=CIRCLE('',#542,3.5);
+#146=CIRCLE('',#544,15.);
+#147=CIRCLE('',#545,10.);
+#148=CIRCLE('',#546,3.5);
+#149=CIRCLE('',#552,23.8961038961039);
+#150=CIRCLE('',#553,44.9999999999997);
+#151=CIRCLE('',#555,17.5000000000001);
+#152=CIRCLE('',#557,4.);
+#153=CIRCLE('',#558,4.);
+#154=CIRCLE('',#559,4.);
+#155=CIRCLE('',#560,4.);
+#156=CIRCLE('',#561,4.);
+#157=CIRCLE('',#562,4.);
+#158=CIRCLE('',#563,62.5);
+#159=CIRCLE('',#565,62.5);
+#160=CIRCLE('',#567,4.);
+#161=CIRCLE('',#568,4.);
+#162=CIRCLE('',#569,4.);
+#163=CIRCLE('',#570,4.);
+#164=CIRCLE('',#571,4.);
+#165=CIRCLE('',#572,4.);
+#166=CIRCLE('',#573,39.7430663251921);
+#167=CIRCLE('',#575,12.5);
+#168=CIRCLE('',#576,17.5000000000001);
+#169=CIRCLE('',#579,12.5);
+#170=FACE_BOUND('',#236,.T.);
+#171=FACE_BOUND('',#237,.T.);
+#172=FACE_BOUND('',#238,.T.);
+#173=FACE_BOUND('',#239,.T.);
+#174=FACE_BOUND('',#240,.T.);
+#175=FACE_BOUND('',#241,.T.);
+#176=FACE_BOUND('',#242,.T.);
+#177=FACE_BOUND('',#246,.T.);
+#178=FACE_BOUND('',#247,.T.);
+#179=FACE_BOUND('',#248,.T.);
+#180=FACE_BOUND('',#249,.T.);
+#181=FACE_BOUND('',#250,.T.);
+#182=FACE_BOUND('',#251,.T.);
+#183=FACE_BOUND('',#252,.T.);
+#184=FACE_BOUND('',#253,.T.);
+#185=FACE_BOUND('',#257,.T.);
+#186=FACE_BOUND('',#258,.T.);
+#187=FACE_BOUND('',#259,.T.);
+#188=FACE_BOUND('',#260,.T.);
+#189=FACE_BOUND('',#261,.T.);
+#190=FACE_BOUND('',#262,.T.);
+#191=FACE_BOUND('',#263,.T.);
+#192=FACE_BOUND('',#264,.T.);
+#193=FACE_BOUND('',#265,.T.);
+#194=FACE_BOUND('',#266,.T.);
+#195=FACE_BOUND('',#267,.T.);
+#196=FACE_BOUND('',#268,.T.);
+#197=FACE_BOUND('',#269,.T.);
+#198=FACE_BOUND('',#270,.T.);
+#199=FACE_BOUND('',#271,.T.);
+#200=FACE_BOUND('',#272,.T.);
+#201=FACE_BOUND('',#273,.T.);
+#202=FACE_BOUND('',#274,.T.);
+#203=FACE_BOUND('',#275,.T.);
+#204=FACE_BOUND('',#276,.T.);
+#205=FACE_BOUND('',#277,.T.);
+#206=FACE_BOUND('',#278,.T.);
+#207=FACE_BOUND('',#279,.T.);
+#208=FACE_BOUND('',#280,.T.);
+#209=FACE_BOUND('',#281,.T.);
+#210=FACE_BOUND('',#282,.T.);
+#211=FACE_BOUND('',#283,.T.);
+#212=FACE_BOUND('',#284,.T.);
+#213=FACE_BOUND('',#285,.T.);
+#214=FACE_BOUND('',#286,.T.);
+#215=FACE_BOUND('',#287,.T.);
+#216=FACE_BOUND('',#288,.T.);
+#217=FACE_BOUND('',#289,.T.);
+#218=FACE_BOUND('',#290,.T.);
+#219=FACE_BOUND('',#291,.T.);
+#220=FACE_BOUND('',#292,.T.);
+#221=FACE_BOUND('',#293,.T.);
+#222=FACE_BOUND('',#294,.T.);
+#223=FACE_BOUND('',#295,.T.);
+#224=FACE_BOUND('',#296,.T.);
+#225=FACE_BOUND('',#297,.T.);
+#226=FACE_BOUND('',#298,.T.);
+#227=FACE_BOUND('',#299,.T.);
+#228=FACE_BOUND('',#300,.T.);
+#229=FACE_BOUND('',#301,.T.);
+#230=FACE_BOUND('',#302,.T.);
+#231=FACE_BOUND('',#303,.T.);
+#232=FACE_BOUND('',#304,.T.);
+#233=FACE_BOUND('',#305,.T.);
+#234=FACE_BOUND('',#306,.T.);
+#235=FACE_BOUND('',#307,.T.);
+#236=EDGE_LOOP('',(#308));
+#237=EDGE_LOOP('',(#309));
+#238=EDGE_LOOP('',(#310));
+#239=EDGE_LOOP('',(#311));
+#240=EDGE_LOOP('',(#312,#313,#314,#315));
+#241=EDGE_LOOP('',(#316));
+#242=EDGE_LOOP('',(#317,#318,#319,#320));
+#243=EDGE_LOOP('',(#321,#322,#323,#324));
+#244=EDGE_LOOP('',(#325,#326,#327,#328));
+#245=EDGE_LOOP('',(#329,#330,#331,#332));
+#246=EDGE_LOOP('',(#333,#334,#335,#336,#337,#338,#339,#340));
+#247=EDGE_LOOP('',(#341));
+#248=EDGE_LOOP('',(#342));
+#249=EDGE_LOOP('',(#343));
+#250=EDGE_LOOP('',(#344));
+#251=EDGE_LOOP('',(#345,#346,#347,#348,#349,#350,#351,#352));
+#252=EDGE_LOOP('',(#353));
+#253=EDGE_LOOP('',(#354));
+#254=EDGE_LOOP('',(#355,#356,#357,#358));
+#255=EDGE_LOOP('',(#359,#360,#361,#362));
+#256=EDGE_LOOP('',(#363,#364,#365,#366));
+#257=EDGE_LOOP('',(#367));
+#258=EDGE_LOOP('',(#368));
+#259=EDGE_LOOP('',(#369));
+#260=EDGE_LOOP('',(#370));
+#261=EDGE_LOOP('',(#371));
+#262=EDGE_LOOP('',(#372));
+#263=EDGE_LOOP('',(#373));
+#264=EDGE_LOOP('',(#374));
+#265=EDGE_LOOP('',(#375));
+#266=EDGE_LOOP('',(#376));
+#267=EDGE_LOOP('',(#377));
+#268=EDGE_LOOP('',(#378));
+#269=EDGE_LOOP('',(#379));
+#270=EDGE_LOOP('',(#380));
+#271=EDGE_LOOP('',(#381));
+#272=EDGE_LOOP('',(#382));
+#273=EDGE_LOOP('',(#383));
+#274=EDGE_LOOP('',(#384));
+#275=EDGE_LOOP('',(#385));
+#276=EDGE_LOOP('',(#386));
+#277=EDGE_LOOP('',(#387));
+#278=EDGE_LOOP('',(#388));
+#279=EDGE_LOOP('',(#389));
+#280=EDGE_LOOP('',(#390));
+#281=EDGE_LOOP('',(#391));
+#282=EDGE_LOOP('',(#392));
+#283=EDGE_LOOP('',(#393));
+#284=EDGE_LOOP('',(#394));
+#285=EDGE_LOOP('',(#395));
+#286=EDGE_LOOP('',(#396));
+#287=EDGE_LOOP('',(#397));
+#288=EDGE_LOOP('',(#398));
+#289=EDGE_LOOP('',(#399));
+#290=EDGE_LOOP('',(#400));
+#291=EDGE_LOOP('',(#401));
+#292=EDGE_LOOP('',(#402));
+#293=EDGE_LOOP('',(#403));
+#294=EDGE_LOOP('',(#404));
+#295=EDGE_LOOP('',(#405));
+#296=EDGE_LOOP('',(#406));
+#297=EDGE_LOOP('',(#407));
+#298=EDGE_LOOP('',(#408));
+#299=EDGE_LOOP('',(#409));
+#300=EDGE_LOOP('',(#410));
+#301=EDGE_LOOP('',(#411));
+#302=EDGE_LOOP('',(#412));
+#303=EDGE_LOOP('',(#413));
+#304=EDGE_LOOP('',(#414));
+#305=EDGE_LOOP('',(#415));
+#306=EDGE_LOOP('',(#416));
+#307=EDGE_LOOP('',(#417));
+#308=ORIENTED_EDGE('',*,*,#465,.T.);
+#309=ORIENTED_EDGE('',*,*,#466,.T.);
+#310=ORIENTED_EDGE('',*,*,#467,.F.);
+#311=ORIENTED_EDGE('',*,*,#468,.F.);
+#312=ORIENTED_EDGE('',*,*,#469,.F.);
+#313=ORIENTED_EDGE('',*,*,#470,.T.);
+#314=ORIENTED_EDGE('',*,*,#471,.F.);
+#315=ORIENTED_EDGE('',*,*,#472,.F.);
+#316=ORIENTED_EDGE('',*,*,#473,.T.);
+#317=ORIENTED_EDGE('',*,*,#474,.T.);
+#318=ORIENTED_EDGE('',*,*,#475,.T.);
+#319=ORIENTED_EDGE('',*,*,#476,.T.);
+#320=ORIENTED_EDGE('',*,*,#477,.T.);
+#321=ORIENTED_EDGE('',*,*,#478,.T.);
+#322=ORIENTED_EDGE('',*,*,#479,.F.);
+#323=ORIENTED_EDGE('',*,*,#476,.F.);
+#324=ORIENTED_EDGE('',*,*,#480,.T.);
+#325=ORIENTED_EDGE('',*,*,#481,.T.);
+#326=ORIENTED_EDGE('',*,*,#482,.F.);
+#327=ORIENTED_EDGE('',*,*,#477,.F.);
+#328=ORIENTED_EDGE('',*,*,#479,.T.);
+#329=ORIENTED_EDGE('',*,*,#483,.T.);
+#330=ORIENTED_EDGE('',*,*,#484,.F.);
+#331=ORIENTED_EDGE('',*,*,#474,.F.);
+#332=ORIENTED_EDGE('',*,*,#482,.T.);
+#333=ORIENTED_EDGE('',*,*,#485,.T.);
+#334=ORIENTED_EDGE('',*,*,#486,.F.);
+#335=ORIENTED_EDGE('',*,*,#470,.F.);
+#336=ORIENTED_EDGE('',*,*,#487,.T.);
+#337=ORIENTED_EDGE('',*,*,#488,.T.);
+#338=ORIENTED_EDGE('',*,*,#480,.F.);
+#339=ORIENTED_EDGE('',*,*,#475,.F.);
+#340=ORIENTED_EDGE('',*,*,#484,.T.);
+#341=ORIENTED_EDGE('',*,*,#489,.F.);
+#342=ORIENTED_EDGE('',*,*,#473,.F.);
+#343=ORIENTED_EDGE('',*,*,#490,.T.);
+#344=ORIENTED_EDGE('',*,*,#491,.F.);
+#345=ORIENTED_EDGE('',*,*,#478,.F.);
+#346=ORIENTED_EDGE('',*,*,#488,.F.);
+#347=ORIENTED_EDGE('',*,*,#492,.T.);
+#348=ORIENTED_EDGE('',*,*,#493,.T.);
+#349=ORIENTED_EDGE('',*,*,#494,.T.);
+#350=ORIENTED_EDGE('',*,*,#485,.F.);
+#351=ORIENTED_EDGE('',*,*,#483,.F.);
+#352=ORIENTED_EDGE('',*,*,#481,.F.);
+#353=ORIENTED_EDGE('',*,*,#490,.F.);
+#354=ORIENTED_EDGE('',*,*,#495,.T.);
+#355=ORIENTED_EDGE('',*,*,#492,.F.);
+#356=ORIENTED_EDGE('',*,*,#487,.F.);
+#357=ORIENTED_EDGE('',*,*,#469,.T.);
+#358=ORIENTED_EDGE('',*,*,#496,.T.);
+#359=ORIENTED_EDGE('',*,*,#493,.F.);
+#360=ORIENTED_EDGE('',*,*,#496,.F.);
+#361=ORIENTED_EDGE('',*,*,#472,.T.);
+#362=ORIENTED_EDGE('',*,*,#497,.T.);
+#363=ORIENTED_EDGE('',*,*,#494,.F.);
+#364=ORIENTED_EDGE('',*,*,#497,.F.);
+#365=ORIENTED_EDGE('',*,*,#471,.T.);
+#366=ORIENTED_EDGE('',*,*,#486,.T.);
+#367=ORIENTED_EDGE('',*,*,#468,.T.);
+#368=ORIENTED_EDGE('',*,*,#495,.F.);
+#369=ORIENTED_EDGE('',*,*,#498,.T.);
+#370=ORIENTED_EDGE('',*,*,#499,.F.);
+#371=ORIENTED_EDGE('',*,*,#489,.T.);
+#372=ORIENTED_EDGE('',*,*,#498,.F.);
+#373=ORIENTED_EDGE('',*,*,#500,.T.);
+#374=ORIENTED_EDGE('',*,*,#501,.T.);
+#375=ORIENTED_EDGE('',*,*,#502,.T.);
+#376=ORIENTED_EDGE('',*,*,#503,.T.);
+#377=ORIENTED_EDGE('',*,*,#504,.T.);
+#378=ORIENTED_EDGE('',*,*,#505,.T.);
+#379=ORIENTED_EDGE('',*,*,#506,.T.);
+#380=ORIENTED_EDGE('',*,*,#507,.F.);
+#381=ORIENTED_EDGE('',*,*,#499,.T.);
+#382=ORIENTED_EDGE('',*,*,#508,.F.);
+#383=ORIENTED_EDGE('',*,*,#507,.T.);
+#384=ORIENTED_EDGE('',*,*,#509,.T.);
+#385=ORIENTED_EDGE('',*,*,#510,.T.);
+#386=ORIENTED_EDGE('',*,*,#511,.T.);
+#387=ORIENTED_EDGE('',*,*,#512,.T.);
+#388=ORIENTED_EDGE('',*,*,#513,.T.);
+#389=ORIENTED_EDGE('',*,*,#514,.T.);
+#390=ORIENTED_EDGE('',*,*,#515,.T.);
+#391=ORIENTED_EDGE('',*,*,#508,.T.);
+#392=ORIENTED_EDGE('',*,*,#516,.T.);
+#393=ORIENTED_EDGE('',*,*,#517,.F.);
+#394=ORIENTED_EDGE('',*,*,#500,.F.);
+#395=ORIENTED_EDGE('',*,*,#517,.T.);
+#396=ORIENTED_EDGE('',*,*,#518,.T.);
+#397=ORIENTED_EDGE('',*,*,#516,.F.);
+#398=ORIENTED_EDGE('',*,*,#467,.T.);
+#399=ORIENTED_EDGE('',*,*,#515,.F.);
+#400=ORIENTED_EDGE('',*,*,#466,.F.);
+#401=ORIENTED_EDGE('',*,*,#518,.F.);
+#402=ORIENTED_EDGE('',*,*,#514,.F.);
+#403=ORIENTED_EDGE('',*,*,#506,.F.);
+#404=ORIENTED_EDGE('',*,*,#513,.F.);
+#405=ORIENTED_EDGE('',*,*,#505,.F.);
+#406=ORIENTED_EDGE('',*,*,#512,.F.);
+#407=ORIENTED_EDGE('',*,*,#504,.F.);
+#408=ORIENTED_EDGE('',*,*,#511,.F.);
+#409=ORIENTED_EDGE('',*,*,#503,.F.);
+#410=ORIENTED_EDGE('',*,*,#510,.F.);
+#411=ORIENTED_EDGE('',*,*,#502,.F.);
+#412=ORIENTED_EDGE('',*,*,#509,.F.);
+#413=ORIENTED_EDGE('',*,*,#501,.F.);
+#414=ORIENTED_EDGE('',*,*,#519,.T.);
+#415=ORIENTED_EDGE('',*,*,#491,.T.);
+#416=ORIENTED_EDGE('',*,*,#465,.F.);
+#417=ORIENTED_EDGE('',*,*,#519,.F.);
+#418=VERTEX_POINT('',#771);
+#419=VERTEX_POINT('',#773);
+#420=VERTEX_POINT('',#775);
+#421=VERTEX_POINT('',#778);
+#422=VERTEX_POINT('',#780);
+#423=VERTEX_POINT('',#781);
+#424=VERTEX_POINT('',#783);
+#425=VERTEX_POINT('',#785);
+#426=VERTEX_POINT('',#789);
+#427=VERTEX_POINT('',#791);
+#428=VERTEX_POINT('',#792);
+#429=VERTEX_POINT('',#794);
+#430=VERTEX_POINT('',#796);
+#431=VERTEX_POINT('',#800);
+#432=VERTEX_POINT('',#801);
+#433=VERTEX_POINT('',#806);
+#434=VERTEX_POINT('',#810);
+#435=VERTEX_POINT('',#814);
+#436=VERTEX_POINT('',#817);
+#437=VERTEX_POINT('',#853);
+#438=VERTEX_POINT('',#856);
+#439=VERTEX_POINT('',#859);
+#440=VERTEX_POINT('',#861);
+#441=VERTEX_POINT('',#863);
+#442=VERTEX_POINT('',#866);
+#443=VERTEX_POINT('',#875);
+#444=VERTEX_POINT('',#877);
+#445=VERTEX_POINT('',#880);
+#446=VERTEX_POINT('',#883);
+#447=VERTEX_POINT('',#885);
+#448=VERTEX_POINT('',#887);
+#449=VERTEX_POINT('',#889);
+#450=VERTEX_POINT('',#891);
+#451=VERTEX_POINT('',#893);
+#452=VERTEX_POINT('',#895);
+#453=VERTEX_POINT('',#898);
+#454=VERTEX_POINT('',#901);
+#455=VERTEX_POINT('',#903);
+#456=VERTEX_POINT('',#905);
+#457=VERTEX_POINT('',#907);
+#458=VERTEX_POINT('',#909);
+#459=VERTEX_POINT('',#911);
+#460=VERTEX_POINT('',#913);
+#461=VERTEX_POINT('',#916);
+#462=VERTEX_POINT('',#918);
+#463=VERTEX_POINT('',#922);
+#464=VERTEX_POINT('',#964);
+#465=EDGE_CURVE('',#418,#418,#520,.T.);
+#466=EDGE_CURVE('',#419,#419,#134,.T.);
+#467=EDGE_CURVE('',#420,#420,#135,.T.);
+#468=EDGE_CURVE('',#421,#421,#136,.T.);
+#469=EDGE_CURVE('',#422,#423,#69,.T.);
+#470=EDGE_CURVE('',#422,#424,#137,.T.);
+#471=EDGE_CURVE('',#425,#424,#70,.T.);
+#472=EDGE_CURVE('',#423,#425,#138,.T.);
+#473=EDGE_CURVE('',#426,#426,#139,.T.);
+#474=EDGE_CURVE('',#427,#428,#71,.T.);
+#475=EDGE_CURVE('',#428,#429,#140,.T.);
+#476=EDGE_CURVE('',#429,#430,#72,.T.);
+#477=EDGE_CURVE('',#430,#427,#141,.T.);
+#478=EDGE_CURVE('',#431,#432,#73,.T.);
+#479=EDGE_CURVE('',#430,#432,#74,.T.);
+#480=EDGE_CURVE('',#429,#431,#75,.T.);
+#481=EDGE_CURVE('',#432,#433,#142,.T.);
+#482=EDGE_CURVE('',#427,#433,#76,.T.);
+#483=EDGE_CURVE('',#433,#434,#77,.T.);
+#484=EDGE_CURVE('',#428,#434,#78,.T.);
+#485=EDGE_CURVE('',#434,#435,#143,.T.);
+#486=EDGE_CURVE('',#424,#435,#79,.T.);
+#487=EDGE_CURVE('',#422,#436,#80,.T.);
+#488=EDGE_CURVE('',#436,#431,#144,.T.);
+#489=EDGE_CURVE('',#437,#437,#521,.T.);
+#490=EDGE_CURVE('',#438,#438,#145,.T.);
+#491=EDGE_CURVE('',#439,#439,#146,.T.);
+#492=EDGE_CURVE('',#436,#440,#81,.T.);
+#493=EDGE_CURVE('',#440,#441,#147,.T.);
+#494=EDGE_CURVE('',#441,#435,#82,.T.);
+#495=EDGE_CURVE('',#442,#442,#148,.T.);
+#496=EDGE_CURVE('',#423,#440,#83,.T.);
+#497=EDGE_CURVE('',#425,#441,#84,.T.);
+#498=EDGE_CURVE('',#443,#443,#149,.T.);
+#499=EDGE_CURVE('',#444,#444,#150,.T.);
+#500=EDGE_CURVE('',#445,#445,#151,.T.);
+#501=EDGE_CURVE('',#446,#446,#152,.T.);
+#502=EDGE_CURVE('',#447,#447,#153,.T.);
+#503=EDGE_CURVE('',#448,#448,#154,.T.);
+#504=EDGE_CURVE('',#449,#449,#155,.T.);
+#505=EDGE_CURVE('',#450,#450,#156,.T.);
+#506=EDGE_CURVE('',#451,#451,#157,.T.);
+#507=EDGE_CURVE('',#452,#452,#158,.T.);
+#508=EDGE_CURVE('',#453,#453,#159,.T.);
+#509=EDGE_CURVE('',#454,#454,#160,.T.);
+#510=EDGE_CURVE('',#455,#455,#161,.T.);
+#511=EDGE_CURVE('',#456,#456,#162,.T.);
+#512=EDGE_CURVE('',#457,#457,#163,.T.);
+#513=EDGE_CURVE('',#458,#458,#164,.T.);
+#514=EDGE_CURVE('',#459,#459,#165,.T.);
+#515=EDGE_CURVE('',#460,#460,#166,.T.);
+#516=EDGE_CURVE('',#461,#461,#167,.T.);
+#517=EDGE_CURVE('',#462,#462,#168,.T.);
+#518=EDGE_CURVE('',#463,#463,#169,.T.);
+#519=EDGE_CURVE('',#464,#464,#522,.T.);
+#520=B_SPLINE_CURVE_WITH_KNOTS('',3,(#741,#742,#743,#744,#745,#746,#747,
+#748,#749,#750,#751,#752,#753,#754,#755,#756,#757,#758,#759,#760,#761,#762,
+#763,#764,#765,#766,#767,#768,#769,#770),.UNSPECIFIED.,.T.,.F.,(2,2,2,2,
+2,2,2,2,2,2,2,2,2,2,2,2,2),(-0.0625,0.,0.0624999999999999,0.125,0.1875,
+0.25,0.375,0.4375,0.5,0.5625,0.625,0.6875,0.75,0.875,0.9375,1.,1.0625),
+ .UNSPECIFIED.);
+#521=B_SPLINE_CURVE_WITH_KNOTS('',3,(#819,#820,#821,#822,#823,#824,#825,
+#826,#827,#828,#829,#830,#831,#832,#833,#834,#835,#836,#837,#838,#839,#840,
+#841,#842,#843,#844,#845,#846,#847,#848,#849,#850,#851,#852),
+ .UNSPECIFIED.,.T.,.F.,(2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2),(-0.0625,
+0.,0.0624999999999999,0.125,0.1875,0.25,0.3125,0.375,0.4375,0.5,0.5625,
+0.625,0.6875,0.75,0.8125,0.875,0.9375,1.,1.0625),.UNSPECIFIED.);
+#522=B_SPLINE_CURVE_WITH_KNOTS('',3,(#932,#933,#934,#935,#936,#937,#938,
+#939,#940,#941,#942,#943,#944,#945,#946,#947,#948,#949,#950,#951,#952,#953,
+#954,#955,#956,#957,#958,#959,#960,#961,#962,#963),.UNSPECIFIED.,.T.,.F.,
+(2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2),(-0.0625,0.,0.0624999999999999,0.125,
+0.1875,0.25,0.3125,0.375,0.4375,0.499999999999999,0.562499999999999,0.624999999999999,
+0.749999999999999,0.8125,0.875,0.9375,1.,1.0625),.UNSPECIFIED.);
+#523=AXIS2_PLACEMENT_3D('',#740,#590,#591);
+#524=AXIS2_PLACEMENT_3D('',#772,#592,#593);
+#525=AXIS2_PLACEMENT_3D('',#774,#594,#595);
+#526=AXIS2_PLACEMENT_3D('',#776,#596,#597);
+#527=AXIS2_PLACEMENT_3D('',#777,#598,#599);
+#528=AXIS2_PLACEMENT_3D('',#782,#601,#602);
+#529=AXIS2_PLACEMENT_3D('',#786,#604,#605);
+#530=AXIS2_PLACEMENT_3D('',#787,#606,#607);
+#531=AXIS2_PLACEMENT_3D('',#788,#608,#609);
+#532=AXIS2_PLACEMENT_3D('',#793,#611,#612);
+#533=AXIS2_PLACEMENT_3D('',#797,#614,#615);
+#534=AXIS2_PLACEMENT_3D('',#798,#616,#617);
+#535=AXIS2_PLACEMENT_3D('',#804,#621,#622);
+#536=AXIS2_PLACEMENT_3D('',#805,#623,#624);
+#537=AXIS2_PLACEMENT_3D('',#808,#626,#627);
+#538=AXIS2_PLACEMENT_3D('',#812,#630,#631);
+#539=AXIS2_PLACEMENT_3D('',#813,#632,#633);
+#540=AXIS2_PLACEMENT_3D('',#818,#636,#637);
+#541=AXIS2_PLACEMENT_3D('',#854,#638,#639);
+#542=AXIS2_PLACEMENT_3D('',#855,#640,#641);
+#543=AXIS2_PLACEMENT_3D('',#857,#642,#643);
+#544=AXIS2_PLACEMENT_3D('',#858,#644,#645);
+#545=AXIS2_PLACEMENT_3D('',#862,#647,#648);
+#546=AXIS2_PLACEMENT_3D('',#865,#650,#651);
+#547=AXIS2_PLACEMENT_3D('',#867,#652,#653);
+#548=AXIS2_PLACEMENT_3D('',#869,#655,#656);
+#549=AXIS2_PLACEMENT_3D('',#871,#658,#659);
+#550=AXIS2_PLACEMENT_3D('',#872,#660,#661);
+#551=AXIS2_PLACEMENT_3D('',#873,#662,#663);
+#552=AXIS2_PLACEMENT_3D('',#874,#664,#665);
+#553=AXIS2_PLACEMENT_3D('',#876,#666,#667);
+#554=AXIS2_PLACEMENT_3D('',#878,#668,#669);
+#555=AXIS2_PLACEMENT_3D('',#879,#670,#671);
+#556=AXIS2_PLACEMENT_3D('',#881,#672,#673);
+#557=AXIS2_PLACEMENT_3D('',#882,#674,#675);
+#558=AXIS2_PLACEMENT_3D('',#884,#676,#677);
+#559=AXIS2_PLACEMENT_3D('',#886,#678,#679);
+#560=AXIS2_PLACEMENT_3D('',#888,#680,#681);
+#561=AXIS2_PLACEMENT_3D('',#890,#682,#683);
+#562=AXIS2_PLACEMENT_3D('',#892,#684,#685);
+#563=AXIS2_PLACEMENT_3D('',#894,#686,#687);
+#564=AXIS2_PLACEMENT_3D('',#896,#688,#689);
+#565=AXIS2_PLACEMENT_3D('',#897,#690,#691);
+#566=AXIS2_PLACEMENT_3D('',#899,#692,#693);
+#567=AXIS2_PLACEMENT_3D('',#900,#694,#695);
+#568=AXIS2_PLACEMENT_3D('',#902,#696,#697);
+#569=AXIS2_PLACEMENT_3D('',#904,#698,#699);
+#570=AXIS2_PLACEMENT_3D('',#906,#700,#701);
+#571=AXIS2_PLACEMENT_3D('',#908,#702,#703);
+#572=AXIS2_PLACEMENT_3D('',#910,#704,#705);
+#573=AXIS2_PLACEMENT_3D('',#912,#706,#707);
+#574=AXIS2_PLACEMENT_3D('',#914,#708,#709);
+#575=AXIS2_PLACEMENT_3D('',#915,#710,#711);
+#576=AXIS2_PLACEMENT_3D('',#917,#712,#713);
+#577=AXIS2_PLACEMENT_3D('',#919,#714,#715);
+#578=AXIS2_PLACEMENT_3D('',#920,#716,#717);
+#579=AXIS2_PLACEMENT_3D('',#921,#718,#719);
+#580=AXIS2_PLACEMENT_3D('',#923,#720,#721);
+#581=AXIS2_PLACEMENT_3D('',#924,#722,#723);
+#582=AXIS2_PLACEMENT_3D('',#925,#724,#725);
+#583=AXIS2_PLACEMENT_3D('',#926,#726,#727);
+#584=AXIS2_PLACEMENT_3D('',#927,#728,#729);
+#585=AXIS2_PLACEMENT_3D('',#928,#730,#731);
+#586=AXIS2_PLACEMENT_3D('',#929,#732,#733);
+#587=AXIS2_PLACEMENT_3D('',#930,#734,#735);
+#588=AXIS2_PLACEMENT_3D('',#931,#736,#737);
+#589=AXIS2_PLACEMENT_3D('',#965,#738,#739);
+#590=DIRECTION('',(0.,0.,1.));
+#591=DIRECTION('',(1.,0.,0.));
+#592=DIRECTION('',(0.,0.,1.));
+#593=DIRECTION('',(-1.,0.,0.));
+#594=DIRECTION('',(0.,0.,1.));
+#595=DIRECTION('',(-1.,0.,0.));
+#596=DIRECTION('',(0.,0.,-1.));
+#597=DIRECTION('',(-1.,0.,3.80820182255702E-17));
+#598=DIRECTION('',(-0.951124801889962,0.,-0.308806753860372));
+#599=DIRECTION('',(0.308806753860372,0.,-0.951124801889963));
+#600=DIRECTION('',(0.102935584620125,-0.942809041582063,-0.317041600629988));
+#601=DIRECTION('',(0.951124801889962,0.,0.308806753860372));
+#602=DIRECTION('',(-0.308806753860372,0.,0.951124801889962));
+#603=DIRECTION('',(0.102935584620122,0.942809041582065,-0.317041600629984));
+#604=DIRECTION('',(0.951124801889962,0.,0.308806753860372));
+#605=DIRECTION('',(0.308806753860372,0.,-0.951124801889963));
+#606=DIRECTION('',(-0.951124801889962,0.,-0.308806753860372));
+#607=DIRECTION('',(-0.308806753860372,0.,0.951124801889962));
+#608=DIRECTION('',(0.951124801889962,0.,0.308806753860372));
+#609=DIRECTION('',(0.308806753860372,0.,-0.951124801889963));
+#610=DIRECTION('',(0.102935584620122,-0.942809041582065,-0.317041600629984));
+#611=DIRECTION('',(0.951124801889962,0.,0.308806753860372));
+#612=DIRECTION('',(-0.308806753860372,0.,0.951124801889962));
+#613=DIRECTION('',(0.102935584620125,0.942809041582063,-0.317041600629988));
+#614=DIRECTION('',(-0.951124801889962,0.,-0.308806753860372));
+#615=DIRECTION('',(0.308806753860372,0.,-0.951124801889963));
+#616=DIRECTION('',(-0.951124801889962,0.,-0.308806753860372));
+#617=DIRECTION('',(-0.308806753860372,0.,0.951124801889962));
+#618=DIRECTION('',(0.102935584620125,0.942809041582063,-0.317041600629988));
+#619=DIRECTION('',(0.951124801889962,0.,0.308806753860372));
+#620=DIRECTION('',(0.951124801889962,0.,0.308806753860372));
+#621=DIRECTION('',(0.291145799641166,-0.333333333333335,-0.896729062894804));
+#622=DIRECTION('',(0.,0.937335668305246,-0.348427675311188));
+#623=DIRECTION('',(-0.951124801889962,0.,-0.308806753860372));
+#624=DIRECTION('',(0.308806753860372,0.,-0.951124801889962));
+#625=DIRECTION('',(0.951124801889962,0.,0.308806753860372));
+#626=DIRECTION('',(0.951124801889962,0.,0.308806753860372));
+#627=DIRECTION('',(0.308806753860372,0.,-0.951124801889963));
+#628=DIRECTION('',(0.102935584620122,-0.942809041582065,-0.317041600629984));
+#629=DIRECTION('',(0.951124801889962,0.,0.308806753860372));
+#630=DIRECTION('',(-0.291145799641166,-0.33333333333333,0.896729062894806));
+#631=DIRECTION('',(0.,-0.937335668305248,-0.348427675311182));
+#632=DIRECTION('',(-0.951124801889962,0.,-0.308806753860372));
+#633=DIRECTION('',(0.308806753860372,1.22464679914735E-16,-0.951124801889962));
+#634=DIRECTION('',(0.951124801889962,0.,0.308806753860372));
+#635=DIRECTION('',(0.951124801889962,0.,0.308806753860372));
+#636=DIRECTION('',(-0.951124801889962,0.,-0.308806753860372));
+#637=DIRECTION('',(0.308806753860373,1.22464679914735E-16,-0.951124801889962));
+#638=DIRECTION('',(0.951124801889962,0.,0.308806753860372));
+#639=DIRECTION('',(0.308806753860372,0.,-0.951124801889962));
+#640=DIRECTION('',(0.951124801889962,0.,0.308806753860372));
+#641=DIRECTION('',(0.308806753860372,0.,-0.951124801889963));
+#642=DIRECTION('',(0.951124801889962,0.,0.308806753860372));
+#643=DIRECTION('',(0.308806753860372,0.,-0.951124801889963));
+#644=DIRECTION('',(0.951124801889962,0.,0.308806753860372));
+#645=DIRECTION('',(-0.308806753860372,0.,0.951124801889962));
+#646=DIRECTION('',(0.102935584620125,-0.942809041582063,-0.317041600629988));
+#647=DIRECTION('',(0.951124801889962,0.,0.308806753860372));
+#648=DIRECTION('',(0.308806753860372,0.,-0.951124801889962));
+#649=DIRECTION('',(0.102935584620122,0.942809041582065,-0.317041600629984));
+#650=DIRECTION('',(-0.951124801889962,0.,-0.308806753860372));
+#651=DIRECTION('',(0.308806753860372,0.,-0.951124801889963));
+#652=DIRECTION('',(-0.951124801889962,0.,-0.308806753860372));
+#653=DIRECTION('',(-0.308806753860372,0.,0.951124801889962));
+#654=DIRECTION('',(0.951124801889962,0.,0.308806753860372));
+#655=DIRECTION('',(-0.291145799641166,-0.333333333333335,0.896729062894804));
+#656=DIRECTION('',(0.,-0.937335668305246,-0.348427675311188));
+#657=DIRECTION('',(0.951124801889962,0.,0.308806753860372));
+#658=DIRECTION('',(0.951124801889962,0.,0.308806753860372));
+#659=DIRECTION('',(0.308806753860372,0.,-0.951124801889963));
+#660=DIRECTION('',(0.291145799641166,-0.33333333333333,-0.896729062894806));
+#661=DIRECTION('',(0.,0.937335668305248,-0.348427675311182));
+#662=DIRECTION('',(0.951124801889962,0.,0.308806753860372));
+#663=DIRECTION('',(0.308806753860372,0.,-0.951124801889963));
+#664=DIRECTION('',(0.,0.,-1.));
+#665=DIRECTION('',(-1.,0.,0.));
+#666=DIRECTION('',(0.,0.,-1.));
+#667=DIRECTION('',(-1.,0.,0.));
+#668=DIRECTION('',(0.,0.,-1.));
+#669=DIRECTION('',(-1.,0.,-1.19439977034471E-16));
+#670=DIRECTION('',(0.,0.,-1.));
+#671=DIRECTION('',(-1.,0.,0.));
+#672=DIRECTION('',(0.,0.,-1.));
+#673=DIRECTION('',(-1.,0.,0.));
+#674=DIRECTION('',(0.,0.,-1.));
+#675=DIRECTION('',(-1.,0.,0.));
+#676=DIRECTION('',(0.,0.,-1.));
+#677=DIRECTION('',(-1.,0.,0.));
+#678=DIRECTION('',(0.,0.,-1.));
+#679=DIRECTION('',(-0.999999999999999,0.,0.));
+#680=DIRECTION('',(0.,0.,-1.));
+#681=DIRECTION('',(-1.,0.,0.));
+#682=DIRECTION('',(0.,0.,-1.));
+#683=DIRECTION('',(-1.,0.,0.));
+#684=DIRECTION('',(0.,0.,-1.));
+#685=DIRECTION('',(-0.999999999999999,0.,0.));
+#686=DIRECTION('',(0.,0.,-1.));
+#687=DIRECTION('',(-1.,0.,0.));
+#688=DIRECTION('',(0.,0.,-1.));
+#689=DIRECTION('',(-1.,0.,0.));
+#690=DIRECTION('',(0.,0.,-1.));
+#691=DIRECTION('',(-1.,0.,0.));
+#692=DIRECTION('',(0.,0.,-1.));
+#693=DIRECTION('',(-1.,0.,0.));
+#694=DIRECTION('',(0.,0.,1.));
+#695=DIRECTION('',(0.499999999999996,-0.866025403784441,0.));
+#696=DIRECTION('',(0.,0.,1.));
+#697=DIRECTION('',(-0.500000000000003,-0.866025403784438,0.));
+#698=DIRECTION('',(0.,0.,1.));
+#699=DIRECTION('',(-0.999999999999999,2.34291072916505E-15,0.));
+#700=DIRECTION('',(0.,0.,1.));
+#701=DIRECTION('',(-0.499999999999999,0.866025403784439,0.));
+#702=DIRECTION('',(0.,0.,1.));
+#703=DIRECTION('',(0.5,0.866025403784438,0.));
+#704=DIRECTION('',(0.,0.,1.));
+#705=DIRECTION('',(0.999999999999999,0.,0.));
+#706=DIRECTION('',(0.,0.,1.));
+#707=DIRECTION('',(1.,0.,0.));
+#708=DIRECTION('',(0.,0.,1.));
+#709=DIRECTION('',(1.,0.,0.));
+#710=DIRECTION('',(0.,0.,-1.));
+#711=DIRECTION('',(-1.,0.,0.));
+#712=DIRECTION('',(0.,0.,-1.));
+#713=DIRECTION('',(-1.,0.,0.));
+#714=DIRECTION('',(0.,0.,-1.));
+#715=DIRECTION('',(-1.,0.,0.));
+#716=DIRECTION('',(0.,0.,-1.));
+#717=DIRECTION('',(-1.,0.,0.));
+#718=DIRECTION('',(0.,0.,-1.));
+#719=DIRECTION('',(1.,0.,0.));
+#720=DIRECTION('',(0.,0.,-1.));
+#721=DIRECTION('',(-1.,0.,0.));
+#722=DIRECTION('',(0.,0.,-1.));
+#723=DIRECTION('',(-1.,0.,0.));
+#724=DIRECTION('',(0.,0.,1.));
+#725=DIRECTION('',(1.,0.,0.));
+#726=DIRECTION('',(0.,0.,1.));
+#727=DIRECTION('',(0.999999999999999,0.,0.));
+#728=DIRECTION('',(0.,0.,1.));
+#729=DIRECTION('',(0.5,0.866025403784438,0.));
+#730=DIRECTION('',(0.,0.,1.));
+#731=DIRECTION('',(-0.499999999999999,0.866025403784439,0.));
+#732=DIRECTION('',(0.,0.,1.));
+#733=DIRECTION('',(-0.999999999999999,2.34291072916505E-15,0.));
+#734=DIRECTION('',(0.,0.,1.));
+#735=DIRECTION('',(-0.500000000000003,-0.866025403784438,0.));
+#736=DIRECTION('',(0.,0.,1.));
+#737=DIRECTION('',(0.499999999999996,-0.866025403784441,0.));
+#738=DIRECTION('',(-0.951124801889962,0.,-0.308806753860372));
+#739=DIRECTION('',(-0.308806753860373,0.,0.951124801889962));
+#740=CARTESIAN_POINT('',(0.,0.,0.));
+#741=CARTESIAN_POINT('',(25.7818091324183,-15.2633929201404,38.2159995549572));
+#742=CARTESIAN_POINT('',(27.9873273425545,-13.4787944137588,34.8164050553931));
+#743=CARTESIAN_POINT('',(29.1058294621721,-12.2246174538612,33.329888601933));
+#744=CARTESIAN_POINT('',(31.0342925288119,-9.14978573894277,30.9047408956938));
+#745=CARTESIAN_POINT('',(31.863192440654,-7.28386580809152,29.943166575938));
+#746=CARTESIAN_POINT('',(32.9176911804422,-3.23366398960809,28.7364341752681));
+#747=CARTESIAN_POINT('',(33.1508532139409,-0.999267399178356,28.4803256037664));
+#748=CARTESIAN_POINT('',(32.903939446239,3.37216680192471,28.7569710014746));
+#749=CARTESIAN_POINT('',(32.4293039107115,5.5123645234208,29.2840186503743));
+#750=CARTESIAN_POINT('',(30.2411714502892,11.2098867492864,31.8513680467079));
+#751=CARTESIAN_POINT('',(27.7979806160542,13.9678752104182,34.812737301135));
+#752=CARTESIAN_POINT('',(24.6598734010005,15.8070928429567,40.2508899422445));
+#753=CARTESIAN_POINT('',(23.6933934641992,16.0453468966987,42.2773705841123));
+#754=CARTESIAN_POINT('',(22.299713369333,15.7084559618546,46.3993304482588));
+#755=CARTESIAN_POINT('',(21.862926566983,15.1330890073785,48.5393902341458));
+#756=CARTESIAN_POINT('',(21.5104409637156,13.2938932650853,52.5525806772402));
+#757=CARTESIAN_POINT('',(21.5775123941433,12.0661170714768,54.3916894578234));
+#758=CARTESIAN_POINT('',(21.8927369340436,9.04599639507617,57.5821043205547));
+#759=CARTESIAN_POINT('',(22.1381750349317,7.25932725621567,58.9125705898563));
+#760=CARTESIAN_POINT('',(22.4951913343221,3.25824484823679,60.6687759660329));
+#761=CARTESIAN_POINT('',(22.5953743769593,1.02103683269022,61.0678287896008));
+#762=CARTESIAN_POINT('',(22.5028887417066,-3.33745797721361,60.6637003284692));
+#763=CARTESIAN_POINT('',(22.3149607750019,-5.46522479482951,59.8703292201698));
+#764=CARTESIAN_POINT('',(21.6922994352681,-11.0189411453141,56.3166254052671));
+#765=CARTESIAN_POINT('',(21.2580701542141,-13.7366981399025,52.482527523726));
+#766=CARTESIAN_POINT('',(22.3267445322623,-15.7263183074069,46.3025796398342));
+#767=CARTESIAN_POINT('',(22.9698551647346,-16.022962685004,44.1679720275096));
+#768=CARTESIAN_POINT('',(24.709124707393,-15.7868964371178,40.1152733883852));
+#769=CARTESIAN_POINT('',(25.7818091324183,-15.2633929201404,38.2159995549572));
+#770=CARTESIAN_POINT('',(27.9873273425545,-13.4787944137588,34.8164050553931));
+#771=CARTESIAN_POINT('',(26.8845682374864,-14.3710936669496,36.5162023051751));
+#772=CARTESIAN_POINT('',(0.,0.,68.));
+#773=CARTESIAN_POINT('',(-20.262546844673,0.,68.));
+#774=CARTESIAN_POINT('',(0.,0.,7.99999999999999));
+#775=CARTESIAN_POINT('',(-39.7430663251921,0.,7.99999999999999));
+#776=CARTESIAN_POINT('',(0.,0.,7.99999999999999));
+#777=CARTESIAN_POINT('',(36.3712787680548,-30.0000000000002,47.5295459691171));
+#778=CARTESIAN_POINT('',(37.4521024065661,-30.0000000000002,44.2006091625023));
+#779=CARTESIAN_POINT('',(30.5483627752313,-6.66666666666669,65.4641272270132));
+#780=CARTESIAN_POINT('',(30.5483627752363,-6.66666666671065,65.4641272269985));
+#781=CARTESIAN_POINT('',(33.459820771643,-33.3333333333335,56.4968365980651));
+#782=CARTESIAN_POINT('',(36.3712787680547,0.,47.5295459691173));
+#783=CARTESIAN_POINT('',(42.194194760878,-6.6666666666666,29.594964711221));
+#784=CARTESIAN_POINT('',(39.2827367644664,-33.3333333333334,38.562255340169));
+#785=CARTESIAN_POINT('',(39.2827367644674,-33.3333333333246,38.562255340166));
+#786=CARTESIAN_POINT('',(36.3712787680548,-30.0000000000001,47.5295459691171));
+#787=CARTESIAN_POINT('',(36.3712787680548,0.,47.5295459691172));
+#788=CARTESIAN_POINT('',(36.3712787680548,30.0000000000002,47.5295459691171));
+#789=CARTESIAN_POINT('',(37.4521024065661,30.0000000000002,44.2006091625022));
+#790=CARTESIAN_POINT('',(39.2827367644664,33.3333333333334,38.562255340169));
+#791=CARTESIAN_POINT('',(39.2827367644674,33.3333333333245,38.562255340166));
+#792=CARTESIAN_POINT('',(42.194194760878,6.6666666666666,29.594964711221));
+#793=CARTESIAN_POINT('',(36.3712787680547,0.,47.5295459691173));
+#794=CARTESIAN_POINT('',(30.5483627752362,6.66666666671066,65.4641272269986));
+#795=CARTESIAN_POINT('',(30.5483627752313,6.66666666666669,65.4641272270132));
+#796=CARTESIAN_POINT('',(33.459820771643,33.3333333333335,56.4968365980651));
+#797=CARTESIAN_POINT('',(36.3712787680548,30.0000000000001,47.529545969117));
+#798=CARTESIAN_POINT('',(36.3712787680548,0.,47.5295459691172));
+#799=CARTESIAN_POINT('',(38.157361190351,6.66666666666669,67.9345812578962));
+#800=CARTESIAN_POINT('',(38.1573611903559,6.66666666671063,67.9345812578815));
+#801=CARTESIAN_POINT('',(41.0688191867627,33.3333333333335,58.9672906289481));
+#802=CARTESIAN_POINT('',(33.459820771643,33.3333333333335,56.4968365980651));
+#803=CARTESIAN_POINT('',(30.5483627752362,6.66666666671063,65.4641272269985));
+#804=CARTESIAN_POINT('',(30.5483627752313,6.66666666666669,65.4641272270132));
+#805=CARTESIAN_POINT('',(43.9802771831745,30.0000000000001,50.));
+#806=CARTESIAN_POINT('',(46.8917351795871,33.3333333333245,41.032709371049));
+#807=CARTESIAN_POINT('',(39.2827367644674,33.3333333333245,38.562255340166));
+#808=CARTESIAN_POINT('',(36.3712787680548,30.0000000000001,47.529545969117));
+#809=CARTESIAN_POINT('',(46.8917351795861,33.3333333333334,41.032709371052));
+#810=CARTESIAN_POINT('',(49.8031931759977,6.6666666666666,32.065418742104));
+#811=CARTESIAN_POINT('',(42.194194760878,6.6666666666666,29.594964711221));
+#812=CARTESIAN_POINT('',(39.2827367644664,33.3333333333334,38.562255340169));
+#813=CARTESIAN_POINT('',(43.9802771831744,0.,50.0000000000002));
+#814=CARTESIAN_POINT('',(49.8031931759977,-6.6666666666666,32.065418742104));
+#815=CARTESIAN_POINT('',(42.194194760878,-6.6666666666666,29.594964711221));
+#816=CARTESIAN_POINT('',(30.5483627752363,-6.66666666671065,65.4641272269985));
+#817=CARTESIAN_POINT('',(38.157361190356,-6.66666666671065,67.9345812578815));
+#818=CARTESIAN_POINT('',(43.9802771831745,0.,50.0000000000002));
+#819=CARTESIAN_POINT('',(36.90916009877,-9.82538806915515,29.1836862372981));
+#820=CARTESIAN_POINT('',(34.6399298961,-14.0237828769544,31.7251878646779));
+#821=CARTESIAN_POINT('',(33.2960039306477,-15.7517887283086,33.2933703301528));
+#822=CARTESIAN_POINT('',(30.4903898191817,-18.429561242235,37.0144390418216));
+#823=CARTESIAN_POINT('',(29.0561656029594,-19.3445595002335,39.1358044221728));
+#824=CARTESIAN_POINT('',(26.6036423498096,-20.1675018615076,43.8281420983652));
+#825=CARTESIAN_POINT('',(25.6175539466612,-20.0494199629582,46.407274172548));
+#826=CARTESIAN_POINT('',(24.5303333280694,-18.765993612595,51.4748972792452));
+#827=CARTESIAN_POINT('',(24.415106772113,-17.6094148966923,53.9768862700472));
+#828=CARTESIAN_POINT('',(24.6950088461535,-14.5521671539885,58.4144999160565));
+#829=CARTESIAN_POINT('',(25.0665173479896,-12.6639060743223,60.3526854251241));
+#830=CARTESIAN_POINT('',(25.7860177866907,-8.33441366537226,63.3938496895874));
+#831=CARTESIAN_POINT('',(26.1358019166432,-5.84582490630732,64.5088357633532));
+#832=CARTESIAN_POINT('',(26.4507585706977,-0.602004816394276,65.5115883988024));
+#833=CARTESIAN_POINT('',(26.4066327478873,2.15617960149039,65.3857658650269));
+#834=CARTESIAN_POINT('',(25.9563675406208,7.32562323962226,63.9134186119033));
+#835=CARTESIAN_POINT('',(25.5654767344866,9.71175226032634,62.5966308690251));
+#836=CARTESIAN_POINT('',(24.8560610548458,13.8226244133921,59.2214094394436));
+#837=CARTESIAN_POINT('',(24.5375530403117,15.5851497470399,57.1370673827832));
+#838=CARTESIAN_POINT('',(24.4659459516302,18.3024277920213,52.5582275834958));
+#839=CARTESIAN_POINT('',(24.7372900289035,19.2883538416977,49.9858031575922));
+#840=CARTESIAN_POINT('',(26.1512883033246,20.1689085596903,44.8822140051419));
+#841=CARTESIAN_POINT('',(27.2881289276557,20.0620990030854,42.3535852474281));
+#842=CARTESIAN_POINT('',(29.9140038120082,18.8247741323718,37.8076240013349));
+#843=CARTESIAN_POINT('',(31.3843401697049,17.7091152332303,35.7729876180556));
+#844=CARTESIAN_POINT('',(34.131779061645,14.7026251557529,32.2943329711065));
+#845=CARTESIAN_POINT('',(35.4330749735572,12.7794613023048,30.8208760356573));
+#846=CARTESIAN_POINT('',(37.4655191077208,8.37016193654156,28.5928893971257));
+#847=CARTESIAN_POINT('',(38.2135209407527,5.83477838025855,27.8195098615177));
+#848=CARTESIAN_POINT('',(38.8738455347674,0.56044637751152,27.1357514678676));
+#849=CARTESIAN_POINT('',(38.7890400156121,-2.18190266433372,27.2211745526813));
+#850=CARTESIAN_POINT('',(37.7943688672823,-7.41387505270589,28.2575403199749));
+#851=CARTESIAN_POINT('',(36.90916009877,-9.82538806915515,29.1836862372981));
+#852=CARTESIAN_POINT('',(34.6399298961,-14.0237828769544,31.7251878646779));
+#853=CARTESIAN_POINT('',(35.774544997435,-11.9245854730548,30.454437050988));
+#854=CARTESIAN_POINT('',(36.3712787680548,0.,47.5295459691172));
+#855=CARTESIAN_POINT('',(43.9802771831745,30.0000000000002,50.0000000000001));
+#856=CARTESIAN_POINT('',(45.0611008216858,30.0000000000002,46.6710631933852));
+#857=CARTESIAN_POINT('',(36.3712787680548,30.0000000000002,47.5295459691171));
+#858=CARTESIAN_POINT('',(43.9802771831745,0.,50.0000000000002));
+#859=CARTESIAN_POINT('',(39.3481758752689,0.,64.2668720283496));
+#860=CARTESIAN_POINT('',(38.157361190351,-6.66666666666669,67.9345812578962));
+#861=CARTESIAN_POINT('',(41.0688191867627,-33.3333333333335,58.9672906289481));
+#862=CARTESIAN_POINT('',(43.9802771831745,-30.0000000000001,50.));
+#863=CARTESIAN_POINT('',(46.8917351795871,-33.3333333333246,41.032709371049));
+#864=CARTESIAN_POINT('',(46.8917351795861,-33.3333333333334,41.032709371052));
+#865=CARTESIAN_POINT('',(43.9802771831745,-30.0000000000002,50.0000000000001));
+#866=CARTESIAN_POINT('',(45.0611008216858,-30.0000000000002,46.6710631933852));
+#867=CARTESIAN_POINT('',(43.9802771831745,0.,50.0000000000002));
+#868=CARTESIAN_POINT('',(33.459820771643,-33.3333333333335,56.4968365980651));
+#869=CARTESIAN_POINT('',(30.5483627752313,-6.66666666666669,65.4641272270132));
+#870=CARTESIAN_POINT('',(39.2827367644674,-33.3333333333246,38.562255340166));
+#871=CARTESIAN_POINT('',(36.3712787680548,-30.0000000000001,47.5295459691171));
+#872=CARTESIAN_POINT('',(39.2827367644664,-33.3333333333334,38.562255340169));
+#873=CARTESIAN_POINT('',(36.3712787680548,-30.0000000000002,47.5295459691171));
+#874=CARTESIAN_POINT('',(0.,0.,73.));
+#875=CARTESIAN_POINT('',(-23.8961038961039,0.,73.));
+#876=CARTESIAN_POINT('',(0.,0.,8.00000000000001));
+#877=CARTESIAN_POINT('',(-44.9999999999997,0.,8.00000000000001));
+#878=CARTESIAN_POINT('',(0.,0.,73.));
+#879=CARTESIAN_POINT('',(0.,0.,73.));
+#880=CARTESIAN_POINT('',(-17.5000000000001,0.,73.));
+#881=CARTESIAN_POINT('',(17.5000000000001,0.,73.));
+#882=CARTESIAN_POINT('',(-26.2499999999997,45.4663336986832,8.));
+#883=CARTESIAN_POINT('',(-30.2499999999997,45.4663336986832,8.));
+#884=CARTESIAN_POINT('',(26.2500000000002,45.4663336986829,8.));
+#885=CARTESIAN_POINT('',(22.2500000000002,45.4663336986829,8.));
+#886=CARTESIAN_POINT('',(52.5,-2.4600562656233E-13,8.));
+#887=CARTESIAN_POINT('',(48.5,-2.4600562656233E-13,8.));
+#888=CARTESIAN_POINT('',(26.2499999999998,-45.4663336986831,8.));
+#889=CARTESIAN_POINT('',(22.2499999999998,-45.4663336986831,8.));
+#890=CARTESIAN_POINT('',(-26.2500000000001,-45.4663336986829,8.));
+#891=CARTESIAN_POINT('',(-30.2500000000001,-45.4663336986829,8.));
+#892=CARTESIAN_POINT('',(-52.5,1.23002813281165E-13,8.));
+#893=CARTESIAN_POINT('',(-56.5,1.23002813281165E-13,8.));
+#894=CARTESIAN_POINT('',(0.,0.,8.));
+#895=CARTESIAN_POINT('',(-62.5,0.,8.));
+#896=CARTESIAN_POINT('',(44.9999999999997,0.,8.));
+#897=CARTESIAN_POINT('',(0.,0.,0.));
+#898=CARTESIAN_POINT('',(-62.5,0.,0.));
+#899=CARTESIAN_POINT('',(0.,0.,0.));
+#900=CARTESIAN_POINT('',(-26.2499999999997,45.4663336986832,0.));
+#901=CARTESIAN_POINT('',(-24.2499999999997,42.0022320835454,0.));
+#902=CARTESIAN_POINT('',(26.2500000000002,45.4663336986829,0.));
+#903=CARTESIAN_POINT('',(24.2500000000002,42.0022320835451,0.));
+#904=CARTESIAN_POINT('',(52.5,-2.4600562656233E-13,0.));
+#905=CARTESIAN_POINT('',(48.5,-2.3663398364567E-13,0.));
+#906=CARTESIAN_POINT('',(26.2499999999998,-45.4663336986831,0.));
+#907=CARTESIAN_POINT('',(24.2499999999998,-42.0022320835454,0.));
+#908=CARTESIAN_POINT('',(-26.2500000000001,-45.4663336986829,0.));
+#909=CARTESIAN_POINT('',(-24.2500000000001,-42.0022320835452,0.));
+#910=CARTESIAN_POINT('',(-52.5,1.23002813281165E-13,0.));
+#911=CARTESIAN_POINT('',(-48.5,1.23002813281165E-13,0.));
+#912=CARTESIAN_POINT('',(0.,0.,0.));
+#913=CARTESIAN_POINT('',(39.7430663251921,0.,0.));
+#914=CARTESIAN_POINT('',(62.5,0.,0.));
+#915=CARTESIAN_POINT('',(0.,0.,85.));
+#916=CARTESIAN_POINT('',(-12.5,0.,85.));
+#917=CARTESIAN_POINT('',(0.,0.,85.));
+#918=CARTESIAN_POINT('',(-17.5000000000001,0.,85.));
+#919=CARTESIAN_POINT('',(9.9475983006414E-14,0.,85.));
+#920=CARTESIAN_POINT('',(0.,0.,0.));
+#921=CARTESIAN_POINT('',(0.,0.,68.));
+#922=CARTESIAN_POINT('',(12.5,0.,68.));
+#923=CARTESIAN_POINT('',(0.,0.,85.));
+#924=CARTESIAN_POINT('',(0.,0.,85.));
+#925=CARTESIAN_POINT('',(20.262546844673,0.,68.));
+#926=CARTESIAN_POINT('',(-52.5,1.23002813281165E-13,0.));
+#927=CARTESIAN_POINT('',(-26.2500000000001,-45.4663336986829,0.));
+#928=CARTESIAN_POINT('',(26.2499999999998,-45.4663336986831,0.));
+#929=CARTESIAN_POINT('',(52.5,-2.4600562656233E-13,0.));
+#930=CARTESIAN_POINT('',(26.2500000000002,45.4663336986829,0.));
+#931=CARTESIAN_POINT('',(-26.2499999999997,45.4663336986832,0.));
+#932=CARTESIAN_POINT('',(29.3724292454276,-12.6111574513741,36.4740418020981));
+#933=CARTESIAN_POINT('',(27.2087055452532,-14.3321180111024,39.4667041474088));
+#934=CARTESIAN_POINT('',(26.1567689298963,-14.8531866294316,41.1579050552722));
+#935=CARTESIAN_POINT('',(24.4987314329191,-15.0934616642318,44.8497992450432));
+#936=CARTESIAN_POINT('',(23.9307573857517,-14.7935362065591,46.8263130447389));
+#937=CARTESIAN_POINT('',(23.4469968599541,-13.4646201462435,50.5886599058399));
+#938=CARTESIAN_POINT('',(23.5119840800473,-12.4414510882626,52.3873051996232));
+#939=CARTESIAN_POINT('',(23.9092804399435,-9.9098113577535,55.4893871038178));
+#940=CARTESIAN_POINT('',(24.2359910956032,-8.38456857146601,56.8260343097558));
+#941=CARTESIAN_POINT('',(24.7970880195267,-4.88891403678588,58.8214774701341));
+#942=CARTESIAN_POINT('',(25.0203536306245,-2.92266221731434,59.4557256761608));
+#943=CARTESIAN_POINT('',(25.1194322721817,1.08011733681092,59.746859414828));
+#944=CARTESIAN_POINT('',(24.9910329621423,3.12868490272913,59.3954757253597));
+#945=CARTESIAN_POINT('',(24.5216449583142,6.82437888232142,57.8765562606341));
+#946=CARTESIAN_POINT('',(24.1900824825925,8.4953687312687,56.7248338088029));
+#947=CARTESIAN_POINT('',(23.6661700706372,11.3452176589245,53.9128532538046));
+#948=CARTESIAN_POINT('',(23.476090113674,12.5245478475148,52.2649621160542));
+#949=CARTESIAN_POINT('',(23.6150093089882,14.2905678173981,48.6087256011044));
+#950=CARTESIAN_POINT('',(23.9725382985254,14.8393101498881,46.6282029505568));
+#951=CARTESIAN_POINT('',(25.2983047586406,15.0982920709399,42.8434803782284));
+#952=CARTESIAN_POINT('',(26.2660564506468,14.8083769229116,41.0114498787245));
+#953=CARTESIAN_POINT('',(29.3616932773844,12.9009991854589,36.2315857744026));
+#954=CARTESIAN_POINT('',(31.7196698944498,10.2370984712834,33.7609899342618));
+#955=CARTESIAN_POINT('',(33.7864545976156,4.91094126398105,31.6434984544442));
+#956=CARTESIAN_POINT('',(34.2212383865413,2.93897536206055,31.2226067280694));
+#957=CARTESIAN_POINT('',(34.4229268905604,-1.07365204241195,31.025265828141));
+#958=CARTESIAN_POINT('',(34.1834830317867,-3.1212596521168,31.2549289378926));
+#959=CARTESIAN_POINT('',(33.1455572560569,-6.84126012923913,32.2949170941927));
+#960=CARTESIAN_POINT('',(32.3393558452228,-8.56186018087863,33.1145479938099));
+#961=CARTESIAN_POINT('',(30.461028725119,-11.4271050305038,35.1964717666608));
+#962=CARTESIAN_POINT('',(29.3724292454276,-12.6111574513741,36.4740418020981));
+#963=CARTESIAN_POINT('',(27.2087055452532,-14.3321180111024,39.4667041474088));
+#964=CARTESIAN_POINT('',(28.2905673953404,-13.4716377312383,37.9703729747534));
+#965=CARTESIAN_POINT('',(114.820277183175,0.,72.9999999999999));
+#966=CARTESIAN_POINT('',(27.7058081905616,-13.9060526534759,38.8038000799358));
+#967=CARTESIAN_POINT('',(26.6066231912879,-13.7949216543144,38.1579809624746));
+#968=CARTESIAN_POINT('',(26.2805424275164,-14.8255475284704,37.4730563410019));
+#969=CARTESIAN_POINT('',(28.2403485913129,-13.5369835626451,38.0177716148896));
+#970=CARTESIAN_POINT('',(27.1176644491835,-13.3918014803508,37.3309013185737));
+#971=CARTESIAN_POINT('',(26.8338555577176,-14.4406061428348,36.5712847307148));
+#972=CARTESIAN_POINT('',(28.7804389541372,-13.0878868317209,37.293433225839));
+#973=CARTESIAN_POINT('',(27.6224146357274,-12.9074768118167,36.581029060134));
+#974=CARTESIAN_POINT('',(27.3895478651345,-13.9687779382096,35.7384268624657));
+#975=CARTESIAN_POINT('',(29.8482240044953,-12.0334368252998,35.9417941055823));
+#976=CARTESIAN_POINT('',(28.6040692404529,-11.7905226292429,35.1935531916591));
+#977=CARTESIAN_POINT('',(28.4845897064084,-12.8554966343671,34.1819387023768));
+#978=CARTESIAN_POINT('',(30.3802747927255,-11.4211552476987,35.3103865919083));
+#979=CARTESIAN_POINT('',(29.084897726537,-11.1463177512175,34.5534071913237));
+#980=CARTESIAN_POINT('',(29.0283377310531,-12.2066572883906,33.453535706598));
+#981=CARTESIAN_POINT('',(31.3730513481371,-10.0739052145416,34.1778239386468));
+#982=CARTESIAN_POINT('',(29.9673700416728,-9.75421917337225,33.4168351282706));
+#983=CARTESIAN_POINT('',(30.0410596714664,-10.7749540142525,32.1454861478446));
+#984=CARTESIAN_POINT('',(31.8363749637903,-9.33840775843837,33.6729916999811));
+#985=CARTESIAN_POINT('',(30.36967403461,-9.00307656683793,32.9199710106626));
+#986=CARTESIAN_POINT('',(30.5127099335185,-9.99157902899643,31.5616172227858));
+#987=CARTESIAN_POINT('',(32.6765749865611,-7.73694468390074,32.7802015862109));
+#988=CARTESIAN_POINT('',(31.088476335714,-7.39585486767923,32.0499002239789));
+#989=CARTESIAN_POINT('',(31.3671480824141,-8.28293978517981,30.5282363736615));
+#990=CARTESIAN_POINT('',(33.0533421992787,-6.86596564165903,32.3927297903387));
+#991=CARTESIAN_POINT('',(31.4012419255124,-6.53629552146069,31.6820832191439));
+#992=CARTESIAN_POINT('',(31.7498077031174,-7.35228280273738,30.0792734338411));
+#993=CARTESIAN_POINT('',(33.9728574767828,-4.16545248551604,31.4605050118556));
+#994=CARTESIAN_POINT('',(32.164726639681,-3.88226662983834,30.7938401169178));
+#995=CARTESIAN_POINT('',(32.6832307578265,-4.46376849582805,28.998595240381));
+#996=CARTESIAN_POINT('',(34.3266816945262,-2.16111934808395,31.1194312052157));
+#997=CARTESIAN_POINT('',(32.4284907269799,-2.02673066494811,30.5000996128073));
+#998=CARTESIAN_POINT('',(33.0417845933659,-2.31600740998127,28.6025252334342));
+#999=CARTESIAN_POINT('',(34.3628049261152,1.82432069598381,31.0841143364072));
+#1000=CARTESIAN_POINT('',(32.4568431362887,1.71308193531912,30.4680599798765));
+#1001=CARTESIAN_POINT('',(33.0784086736013,1.95506999101434,28.5615338466433));
+#1002=CARTESIAN_POINT('',(34.0470017043413,3.83822719318673,31.3878043474678));
+#1003=CARTESIAN_POINT('',(32.2228157546083,3.57059041808847,30.7282006969455));
+#1004=CARTESIAN_POINT('',(32.758407828986,4.11333318163697,28.9142219102374));
+#1005=CARTESIAN_POINT('',(32.8682224143255,7.50273818347105,32.5783189964303));
+#1006=CARTESIAN_POINT('',(31.2574876035974,7.12579533415471,31.8477470467141));
+#1007=CARTESIAN_POINT('',(31.5619629362661,8.03375027701329,30.2944977532361));
+#1008=CARTESIAN_POINT('',(32.0142569355367,9.15617521575157,33.4566057027322));
+#1009=CARTESIAN_POINT('',(30.5511723488914,8.78165696439188,32.6742359849009));
+#1010=CARTESIAN_POINT('',(30.6947210793451,9.79891742912248,31.3121648980953));
+#1011=CARTESIAN_POINT('',(30.5325062893338,11.23337179754,35.1326761405799));
+#1012=CARTESIAN_POINT('',(29.2215628616916,10.9503338024878,34.3738699331742));
+#1013=CARTESIAN_POINT('',(29.1837954462539,12.0074097069995,33.2484284306864));
+#1014=CARTESIAN_POINT('',(30.0139624740847,11.8488827139453,35.7418881056761));
+#1015=CARTESIAN_POINT('',(28.7545827749847,11.5963727922097,34.9900219593479));
+#1016=CARTESIAN_POINT('',(28.6541150428007,12.6600753092589,33.9514297275609));
+#1017=CARTESIAN_POINT('',(28.9510863148229,12.9345717359626,37.0702516441026));
+#1018=CARTESIAN_POINT('',(27.7806497489659,12.743684115765,36.3508703106936));
+#1019=CARTESIAN_POINT('',(27.5648728592776,13.8073235990808,35.4816426001648));
+#1020=CARTESIAN_POINT('',(28.4007081785711,13.4082370421887,37.7981592993268));
+#1021=CARTESIAN_POINT('',(27.2678041218608,13.2533496674774,37.1032940127654));
+#1022=CARTESIAN_POINT('',(26.9990657261471,14.3055198821367,36.3189031678131));
+#1023=CARTESIAN_POINT('',(27.33840587926,14.1729317472098,39.3322275839457));
+#1024=CARTESIAN_POINT('',(26.2650827898462,14.0787014769546,38.6997326473085));
+#1025=CARTESIAN_POINT('',(25.9008075873377,15.1044920402855,38.0796101009907));
+#1026=CARTESIAN_POINT('',(26.8245726110352,14.4677917881826,40.1394401585292));
+#1027=CARTESIAN_POINT('',(25.7714743653109,14.4033719139915,39.5459325919886));
+#1028=CARTESIAN_POINT('',(25.3664674588188,15.4093666419641,39.0043100604934));
+#1029=CARTESIAN_POINT('',(25.8618261336211,14.8771885262242,41.8527765454294));
+#1030=CARTESIAN_POINT('',(24.8368625821346,14.8549090414735,41.3435072166332));
+#1031=CARTESIAN_POINT('',(24.3550419579883,15.8245423778824,40.9620093484901));
+#1032=CARTESIAN_POINT('',(25.41151802617,14.9892001617992,42.7669229300414));
+#1033=CARTESIAN_POINT('',(24.3906084419652,14.983111378241,42.3079275459816));
+#1034=CARTESIAN_POINT('',(23.8762041889482,15.9320311832189,42.0040535466809));
+#1035=CARTESIAN_POINT('',(24.2769817509732,15.0193062972825,45.5336874875462));
+#1036=CARTESIAN_POINT('',(23.2542518709929,15.0289670846728,45.2045199612861));
+#1037=CARTESIAN_POINT('',(22.6448194089228,15.9279589180356,45.1489714839184));
+#1038=CARTESIAN_POINT('',(23.7895101470943,14.6295475186337,47.5023696226233));
+#1039=CARTESIAN_POINT('',(22.7234909406872,14.6012417269737,47.3030876361868));
+#1040=CARTESIAN_POINT('',(22.0736198481746,15.4866113489123,47.3742032927442));
+#1041=CARTESIAN_POINT('',(23.5281397588611,13.5028516352982,50.3062375487289));
+#1042=CARTESIAN_POINT('',(22.3725793685313,13.3927767141883,50.1754728307246));
+#1043=CARTESIAN_POINT('',(21.6670764604482,14.2573243071099,50.5265051715809));
+#1044=CARTESIAN_POINT('',(23.5135839074718,13.0373407298124,51.2195881365236));
+#1045=CARTESIAN_POINT('',(22.3216766098279,12.8871044666753,51.1111264744063));
+#1046=CARTESIAN_POINT('',(21.6009315730353,13.753437722722,51.5505927267497));
+#1047=CARTESIAN_POINT('',(23.5868932293998,11.9745565568271,52.9305573705953));
+#1048=CARTESIAN_POINT('',(22.3118292099149,11.7474839488309,52.8361955447918));
+#1049=CARTESIAN_POINT('',(21.570555010065,12.6105414610172,53.4650654939166));
+#1050=CARTESIAN_POINT('',(23.6735934275258,11.3732386396899,53.7391973236479));
+#1051=CARTESIAN_POINT('',(22.3529333220306,11.1019755043353,53.6409378572882));
+#1052=CARTESIAN_POINT('',(21.6045987215657,11.9670949984071,54.3678470070406));
+#1053=CARTESIAN_POINT('',(24.0202548118661,9.3497191491131,56.0167008968706));
+#1054=CARTESIAN_POINT('',(22.5487450946363,8.9390575159379,55.8942288751009));
+#1055=CARTESIAN_POINT('',(21.7946684835446,9.81209356993349,56.9064836395212));
+#1056=CARTESIAN_POINT('',(24.3535925688301,7.76648068004908,57.276506336394));
+#1057=CARTESIAN_POINT('',(22.7627353877216,7.29402436782798,57.036043894853));
+#1058=CARTESIAN_POINT('',(22.0295977013276,8.1386194500343,58.3051907420672));
+#1059=CARTESIAN_POINT('',(24.7529084258037,5.0686153915542,58.6362327194073));
+#1060=CARTESIAN_POINT('',(22.9967671360927,4.69281376137713,58.2057201454634));
+#1061=CARTESIAN_POINT('',(22.3181220889062,5.30372917550945,59.8132872751675));
+#1062=CARTESIAN_POINT('',(24.8668377409068,4.13497630120685,58.9900433168891));
+#1063=CARTESIAN_POINT('',(23.0611659752935,3.80658849123844,58.4967145967838));
+#1064=CARTESIAN_POINT('',(22.4021849000754,4.32502716962656,60.2053122781167));
+#1065=CARTESIAN_POINT('',(25.0290251074269,2.19212607468601,59.4834244236807));
+#1066=CARTESIAN_POINT('',(23.1516319215274,1.99262376605851,58.9003465835231));
+#1067=CARTESIAN_POINT('',(22.5223376096051,2.29135089546443,60.7518526949216));
+#1068=CARTESIAN_POINT('',(25.0759898968022,1.17915507927437,59.6192024558452));
+#1069=CARTESIAN_POINT('',(23.1761979461712,1.07478631930664,59.0048317058004));
+#1070=CARTESIAN_POINT('',(22.5574751124339,1.23246707714975,60.9021688359158));
+#1071=CARTESIAN_POINT('',(25.0906030028066,-1.81400165466274,59.6620146438112));
+#1072=CARTESIAN_POINT('',(23.1840615418339,-1.65643379559322,59.0387648753137));
+#1073=CARTESIAN_POINT('',(22.5683803738007,-1.8960179043764,60.9495726878257));
+#1074=CARTESIAN_POINT('',(24.9237635208062,-3.82580571414092,59.2006183056627));
+#1075=CARTESIAN_POINT('',(23.1004512115822,-3.44968208062226,58.7074988112839));
+#1076=CARTESIAN_POINT('',(22.4424661608485,-3.99900119616654,60.4390571780897));
+#1077=CARTESIAN_POINT('',(24.4102515758164,-7.4576785755087,57.4838794181368));
+#1078=CARTESIAN_POINT('',(22.7970858048244,-6.98381049054641,57.2205796807421));
+#1079=CARTESIAN_POINT('',(22.0697952588177,-7.81312941888266,58.5353579733286));
+#1080=CARTESIAN_POINT('',(24.0725902814268,-9.08814341915776,56.2444334370694));
+#1081=CARTESIAN_POINT('',(22.5821011236201,-8.666334690826,56.1086773153415));
+#1082=CARTESIAN_POINT('',(21.8299198213869,-9.53506093172548,57.1596353731394));
+#1083=CARTESIAN_POINT('',(23.7087023224782,-11.1517164652659,54.0139237004469));
+#1084=CARTESIAN_POINT('',(22.3711119660708,-10.8665165279244,53.9116318846079));
+#1085=CARTESIAN_POINT('',(21.6213603136967,-11.7305922919783,54.6743355253301));
+#1086=CARTESIAN_POINT('',(23.6132051926045,-11.7685754402393,53.2179729379975));
+#1087=CARTESIAN_POINT('',(22.322299022001,-11.5271504156133,53.1230227815698));
+#1088=CARTESIAN_POINT('',(21.5784666023465,-12.3899231402996,53.7861182573435));
+#1089=CARTESIAN_POINT('',(23.5168880312559,-12.8664858965716,51.5257189852851));
+#1090=CARTESIAN_POINT('',(22.3116040019711,-12.7027610493707,51.4222738717837));
+#1091=CARTESIAN_POINT('',(21.5863736165642,-13.5690777063675,51.8935192089847));
+#1092=CARTESIAN_POINT('',(23.5173738579853,-13.3516608376874,50.6177891362501));
+#1093=CARTESIAN_POINT('',(22.3497815259088,-13.2293793720457,50.4946847743922));
+#1094=CARTESIAN_POINT('',(21.6390645944386,-14.0934314607041,50.8760572416957));
+#1095=CARTESIAN_POINT('',(23.7294681432021,-14.5338424020292,47.8413343494906));
+#1096=CARTESIAN_POINT('',(22.6554688713172,-14.496534948375,47.657595811496));
+#1097=CARTESIAN_POINT('',(21.9977641992047,-15.3805316967682,47.7564047752318));
+#1098=CARTESIAN_POINT('',(24.1761985650112,-14.9735699771095,45.8687096974304));
+#1099=CARTESIAN_POINT('',(23.1481250932206,-14.9809416320613,45.5574784727209));
+#1100=CARTESIAN_POINT('',(22.5306032995434,-15.8748370056993,45.5283504086014));
+#1101=CARTESIAN_POINT('',(25.2711113198478,-15.0114186854077,43.0752112332034));
+#1102=CARTESIAN_POINT('',(24.2508346812648,-15.0089055028951,42.6324257083103));
+#1103=CARTESIAN_POINT('',(23.7256586351654,-15.9516810641648,42.3550256919513));
+#1104=CARTESIAN_POINT('',(25.7090743918902,-14.9220076331829,42.153412027617));
+#1105=CARTESIAN_POINT('',(24.6866009759151,-14.9053534432753,41.659637315456));
+#1106=CARTESIAN_POINT('',(24.1930875405423,-15.8684541212744,41.3048890555885));
+#1107=CARTESIAN_POINT('',(26.6583343879225,-14.5528685669216,40.4146650523678));
+#1108=CARTESIAN_POINT('',(25.6111736187364,-14.4968677810341,39.8345446192221));
+#1109=CARTESIAN_POINT('',(25.1928833653376,-15.4967446999194,39.3192423488248));
+#1110=CARTESIAN_POINT('',(27.1712677898103,-14.2751217443067,39.589828544982));
+#1111=CARTESIAN_POINT('',(26.1056266312526,-14.1901183577435,38.9688040615252));
+#1112=CARTESIAN_POINT('',(25.7272292973153,-15.210488914106,38.374827951289));
+#1113=CARTESIAN_POINT('',(27.7058081905616,-13.9060526534759,38.8038000799358));
+#1114=CARTESIAN_POINT('',(26.6066231912879,-13.7949216543144,38.1579809624746));
+#1115=CARTESIAN_POINT('',(26.2805424275164,-14.8255475284704,37.4730563410019));
+#1116=MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#24),
+#1117);
+#1117=(
+GEOMETRIC_REPRESENTATION_CONTEXT(3)
+GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#1118))
+GLOBAL_UNIT_ASSIGNED_CONTEXT((#1124,#1120,#1119))
+REPRESENTATION_CONTEXT('ef','TOP_LEVEL_ASSEMBLY_PART')
+);
+#1118=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(0.0508),#1124,
+'DISTANCE_ACCURACY_VALUE','Maximum Tolerance applied to model');
+#1119=(
+NAMED_UNIT(*)
+SI_UNIT($,.STERADIAN.)
+SOLID_ANGLE_UNIT()
+);
+#1120=(
+CONVERSION_BASED_UNIT('DEGREE',#1122)
+NAMED_UNIT(#1121)
+PLANE_ANGLE_UNIT()
+);
+#1121=DIMENSIONAL_EXPONENTS(0.,0.,0.,0.,0.,0.,0.);
+#1122=PLANE_ANGLE_MEASURE_WITH_UNIT(PLANE_ANGLE_MEASURE(0.0174532925),#1123);
+#1123=(
+NAMED_UNIT(*)
+PLANE_ANGLE_UNIT()
+SI_UNIT($,.RADIAN.)
+);
+#1124=(
+LENGTH_UNIT()
+NAMED_UNIT(*)
+SI_UNIT(.MILLI.,.METRE.)
+);
+ENDSEC;
+END-ISO-10303-21;
diff --git a/release/lang/zh_cn.json b/release/lang/zh_cn.json
new file mode 100644
index 0000000..e69de29
diff --git a/release/save/sui.json b/release/save/sui.json
new file mode 100644
index 0000000..226d09e
--- /dev/null
+++ b/release/save/sui.json
@@ -0,0 +1,8 @@
+{
+ "sui": {
+ "font": 1,
+ "font_bold": 0,
+ "style": 0,
+ "style_system": 0
+ }
+}
\ No newline at end of file
diff --git a/res/bin/luapacka.exe b/res/bin/luapacka.exe
new file mode 100644
index 0000000..7c7105b
Binary files /dev/null and b/res/bin/luapacka.exe differ
diff --git a/res/icons/3dModel.png b/res/icons/3dModel.png
new file mode 100644
index 0000000..1f12ff4
Binary files /dev/null and b/res/icons/3dModel.png differ
diff --git a/res/icons/DrawStyleFlatLines.svg b/res/icons/DrawStyleFlatLines.svg
new file mode 100644
index 0000000..4a4f544
--- /dev/null
+++ b/res/icons/DrawStyleFlatLines.svg
@@ -0,0 +1,181 @@
+
+
diff --git a/res/icons/DrawStyleShaded.svg b/res/icons/DrawStyleShaded.svg
new file mode 100644
index 0000000..595c633
--- /dev/null
+++ b/res/icons/DrawStyleShaded.svg
@@ -0,0 +1,138 @@
+
+
diff --git a/res/icons/DrawStyleWireFrame.svg b/res/icons/DrawStyleWireFrame.svg
new file mode 100644
index 0000000..3f7686a
--- /dev/null
+++ b/res/icons/DrawStyleWireFrame.svg
@@ -0,0 +1,142 @@
+
+
diff --git a/res/icons/Material.svg b/res/icons/Material.svg
new file mode 100644
index 0000000..f39bfbc
--- /dev/null
+++ b/res/icons/Material.svg
@@ -0,0 +1,589 @@
+
+
+
+
diff --git a/res/icons/add.png b/res/icons/add.png
new file mode 100644
index 0000000..cd7d9a5
Binary files /dev/null and b/res/icons/add.png differ
diff --git a/res/icons/axis.png b/res/icons/axis.png
new file mode 100644
index 0000000..12edf2a
Binary files /dev/null and b/res/icons/axis.png differ
diff --git a/res/icons/colors.svg b/res/icons/colors.svg
new file mode 100644
index 0000000..1f6f2d1
--- /dev/null
+++ b/res/icons/colors.svg
@@ -0,0 +1,210 @@
+
+
+
+
diff --git a/res/icons/cursor_rotate.png b/res/icons/cursor_rotate.png
new file mode 100644
index 0000000..c30776c
Binary files /dev/null and b/res/icons/cursor_rotate.png differ
diff --git a/res/icons/cursor_zoom.png b/res/icons/cursor_zoom.png
new file mode 100644
index 0000000..497b4f5
Binary files /dev/null and b/res/icons/cursor_zoom.png differ
diff --git a/res/icons/datumPln.png b/res/icons/datumPln.png
new file mode 100644
index 0000000..9e1d27d
Binary files /dev/null and b/res/icons/datumPln.png differ
diff --git a/res/icons/delete.svg b/res/icons/delete.svg
new file mode 100644
index 0000000..de25bd7
--- /dev/null
+++ b/res/icons/delete.svg
@@ -0,0 +1,62 @@
+
+
+
+
diff --git a/res/icons/edge-selection.svg b/res/icons/edge-selection.svg
new file mode 100644
index 0000000..bc5fb16
--- /dev/null
+++ b/res/icons/edge-selection.svg
@@ -0,0 +1,220 @@
+
+
diff --git a/res/icons/edit-delete.svg b/res/icons/edit-delete.svg
new file mode 100644
index 0000000..3d84f37
--- /dev/null
+++ b/res/icons/edit-delete.svg
@@ -0,0 +1,102 @@
+
+
+
+
diff --git a/res/icons/edit_OK.svg b/res/icons/edit_OK.svg
new file mode 100644
index 0000000..da595a2
--- /dev/null
+++ b/res/icons/edit_OK.svg
@@ -0,0 +1,134 @@
+
+
+
+
diff --git a/res/icons/face-selection.svg b/res/icons/face-selection.svg
new file mode 100644
index 0000000..6b6ae6c
--- /dev/null
+++ b/res/icons/face-selection.svg
@@ -0,0 +1,218 @@
+
+
+
+
diff --git a/res/icons/help.png b/res/icons/help.png
new file mode 100644
index 0000000..a6b37e3
Binary files /dev/null and b/res/icons/help.png differ
diff --git a/res/icons/hide.png b/res/icons/hide.png
new file mode 100644
index 0000000..50f7c16
Binary files /dev/null and b/res/icons/hide.png differ
diff --git a/res/icons/hideAll.png b/res/icons/hideAll.png
new file mode 100644
index 0000000..147fdae
Binary files /dev/null and b/res/icons/hideAll.png differ
diff --git a/res/icons/license.png b/res/icons/license.png
new file mode 100644
index 0000000..99bfbe3
Binary files /dev/null and b/res/icons/license.png differ
diff --git a/res/icons/linear.png b/res/icons/linear.png
new file mode 100644
index 0000000..1bbb2f9
Binary files /dev/null and b/res/icons/linear.png differ
diff --git a/res/icons/new_file.png b/res/icons/new_file.png
new file mode 100644
index 0000000..a6942a9
Binary files /dev/null and b/res/icons/new_file.png differ
diff --git a/res/icons/perspective.png b/res/icons/perspective.png
new file mode 100644
index 0000000..8a225c7
Binary files /dev/null and b/res/icons/perspective.png differ
diff --git a/res/icons/point.png b/res/icons/point.png
new file mode 100644
index 0000000..d1b0b4b
Binary files /dev/null and b/res/icons/point.png differ
diff --git a/res/icons/print.png b/res/icons/print.png
new file mode 100644
index 0000000..451f678
Binary files /dev/null and b/res/icons/print.png differ
diff --git a/res/icons/quit.png b/res/icons/quit.png
new file mode 100644
index 0000000..6f8aff3
Binary files /dev/null and b/res/icons/quit.png differ
diff --git a/res/icons/run.png b/res/icons/run.png
new file mode 100644
index 0000000..d9fd642
Binary files /dev/null and b/res/icons/run.png differ
diff --git a/res/icons/saveAs.png b/res/icons/saveAs.png
new file mode 100644
index 0000000..edcd4d3
Binary files /dev/null and b/res/icons/saveAs.png differ
diff --git a/res/icons/sel-bbox.svg b/res/icons/sel-bbox.svg
new file mode 100644
index 0000000..36859dc
--- /dev/null
+++ b/res/icons/sel-bbox.svg
@@ -0,0 +1,283 @@
+
+
+
+
diff --git a/res/icons/set.png b/res/icons/set.png
new file mode 100644
index 0000000..5b04926
Binary files /dev/null and b/res/icons/set.png differ
diff --git a/res/icons/show.png b/res/icons/show.png
new file mode 100644
index 0000000..53ad229
Binary files /dev/null and b/res/icons/show.png differ
diff --git a/res/icons/showAll.png b/res/icons/showAll.png
new file mode 100644
index 0000000..55a2fe8
Binary files /dev/null and b/res/icons/showAll.png differ
diff --git a/res/icons/triangle.png b/res/icons/triangle.png
new file mode 100644
index 0000000..baac778
Binary files /dev/null and b/res/icons/triangle.png differ
diff --git a/res/icons/utilities-terminal.svg b/res/icons/utilities-terminal.svg
new file mode 100644
index 0000000..30f7d72
--- /dev/null
+++ b/res/icons/utilities-terminal.svg
@@ -0,0 +1,531 @@
+
+
+
+
diff --git a/res/icons/vertex-selection.svg b/res/icons/vertex-selection.svg
new file mode 100644
index 0000000..5421ea5
--- /dev/null
+++ b/res/icons/vertex-selection.svg
@@ -0,0 +1,223 @@
+
+
diff --git a/res/icons/view-axonometric.svg b/res/icons/view-axonometric.svg
new file mode 100644
index 0000000..5f849c3
--- /dev/null
+++ b/res/icons/view-axonometric.svg
@@ -0,0 +1,212 @@
+
+
+
+
diff --git a/res/icons/view-bottom.svg b/res/icons/view-bottom.svg
new file mode 100644
index 0000000..73a0903
--- /dev/null
+++ b/res/icons/view-bottom.svg
@@ -0,0 +1,210 @@
+
+
+
+
diff --git a/res/icons/view-front.svg b/res/icons/view-front.svg
new file mode 100644
index 0000000..243bfa6
--- /dev/null
+++ b/res/icons/view-front.svg
@@ -0,0 +1,247 @@
+
+
+
+
diff --git a/res/icons/view-fullscreen.svg b/res/icons/view-fullscreen.svg
new file mode 100644
index 0000000..34589cc
--- /dev/null
+++ b/res/icons/view-fullscreen.svg
@@ -0,0 +1,681 @@
+
+
+
+
diff --git a/res/icons/view-left.svg b/res/icons/view-left.svg
new file mode 100644
index 0000000..8c309dc
--- /dev/null
+++ b/res/icons/view-left.svg
@@ -0,0 +1,231 @@
+
+
+
+
diff --git a/res/icons/view-rear.svg b/res/icons/view-rear.svg
new file mode 100644
index 0000000..d6f32d0
--- /dev/null
+++ b/res/icons/view-rear.svg
@@ -0,0 +1,231 @@
+
+
+
+
diff --git a/res/icons/view-right.svg b/res/icons/view-right.svg
new file mode 100644
index 0000000..217123b
--- /dev/null
+++ b/res/icons/view-right.svg
@@ -0,0 +1,247 @@
+
+
+
+
diff --git a/res/icons/view-select.svg b/res/icons/view-select.svg
new file mode 100644
index 0000000..44535e7
--- /dev/null
+++ b/res/icons/view-select.svg
@@ -0,0 +1,140 @@
+
+
+
+
diff --git a/res/icons/view-top.svg b/res/icons/view-top.svg
new file mode 100644
index 0000000..f941238
--- /dev/null
+++ b/res/icons/view-top.svg
@@ -0,0 +1,204 @@
+
+
+
+
diff --git a/res/img/aicam.ico b/res/img/aicam.ico
new file mode 100644
index 0000000..5607e9c
Binary files /dev/null and b/res/img/aicam.ico differ
diff --git a/res/img/aicam.png b/res/img/aicam.png
new file mode 100644
index 0000000..703806e
Binary files /dev/null and b/res/img/aicam.png differ
diff --git a/res/img/btn/btn_about.png b/res/img/btn/btn_about.png
new file mode 100644
index 0000000..02b74f8
Binary files /dev/null and b/res/img/btn/btn_about.png differ
diff --git a/res/img/btn/btn_close.png b/res/img/btn/btn_close.png
new file mode 100644
index 0000000..913fab1
Binary files /dev/null and b/res/img/btn/btn_close.png differ
diff --git a/res/img/btn/btn_download.png b/res/img/btn/btn_download.png
new file mode 100644
index 0000000..fc662d2
Binary files /dev/null and b/res/img/btn/btn_download.png differ
diff --git a/res/img/btn/btn_max.png b/res/img/btn/btn_max.png
new file mode 100644
index 0000000..97ab345
Binary files /dev/null and b/res/img/btn/btn_max.png differ
diff --git a/res/img/btn/btn_max_restore.png b/res/img/btn/btn_max_restore.png
new file mode 100644
index 0000000..6838947
Binary files /dev/null and b/res/img/btn/btn_max_restore.png differ
diff --git a/res/img/btn/btn_min.png b/res/img/btn/btn_min.png
new file mode 100644
index 0000000..f0a6683
Binary files /dev/null and b/res/img/btn/btn_min.png differ
diff --git a/res/img/btn/btn_setting.png b/res/img/btn/btn_setting.png
new file mode 100644
index 0000000..7727e69
Binary files /dev/null and b/res/img/btn/btn_setting.png differ
diff --git a/res/img/btn/btn_update.png b/res/img/btn/btn_update.png
new file mode 100644
index 0000000..d96ec8b
Binary files /dev/null and b/res/img/btn/btn_update.png differ
diff --git a/res/img/btn/net_error.png b/res/img/btn/net_error.png
new file mode 100644
index 0000000..67b77bd
Binary files /dev/null and b/res/img/btn/net_error.png differ
diff --git a/res/img/btn/net_ok.png b/res/img/btn/net_ok.png
new file mode 100644
index 0000000..756b356
Binary files /dev/null and b/res/img/btn/net_ok.png differ
diff --git a/res/img/btn/net_wait.png b/res/img/btn/net_wait.png
new file mode 100644
index 0000000..d55eebf
Binary files /dev/null and b/res/img/btn/net_wait.png differ
diff --git a/res/qss/dark.qsst b/res/qss/dark.qsst
new file mode 100644
index 0000000..f7f6c96
--- /dev/null
+++ b/res/qss/dark.qsst
@@ -0,0 +1,419 @@
+/*ZvoɫʽQSSļ*/
+$Button_Hover_BackGround_Color = ;
+$m_QWidget_BackGround_Color = #1b1b1b;
+
+/*ɫ#ff9000*/
+$m_QWidget_Font_Color = #F0F0F0F0;
+
+QWidget{
+ background-color: $m_QWidget_BackGround_Color;
+ color:$m_QWidget_Font_Color;
+ font:10pt;
+}
+
+QPushButton#icoButton{
+ image:url(:/res/img/zvo.png);
+ border:none;
+}
+
+QPushButton#t_backButton{
+ image:url(:/res/img/dark/exit.png);
+ border:none;
+}
+/*бؼʽ*/
+QPushButton#searchButton{
+ image:url(:/res/img/dark/search.png);
+ border:none;
+ width:15px;
+ height:15px;
+}
+QPushButton:hover{
+padding-left:1px;
+padding-top:1px;
+}
+/*ť-Pressed*/
+QPushButton:pressed{
+ padding-left:2px;
+ padding-top:2px;
+}
+
+QMenu {
+ background-color : rgb(253,253,254);
+ border-radius:15px;
+}
+QMenu::item {
+ font-size:10pt;
+ color: rgb(0,0,0);
+ background-color:rgb(253,253,254);
+ padding: 8px 25px 6px 10px;
+ margin: 1px 1px;
+}
+QMenu::item:selected {
+ background-color : rgb(236,236,237);
+}
+QMenu::icon:checked {
+ background: rgb(253,253,254);
+ position: absolute;
+ top: 1px;
+ right: 1px;
+ bottom: 1px;
+ left: 1px;
+}
+QMenu::icon:checked:selected {
+ background-color : rgb(236,236,237);
+ background-image: url(:/space_selected.png);
+}
+QMenu::separator {
+ height: 2px;
+ background: rgb(235,235,236);
+ margin-left: 10px;
+ margin-right: 10px;
+}
+
+QPushButton#searchButton,#t_backButton:hover{
+padding-left:1px;
+padding-top:1px;
+}
+QPushButton#searchButton,#t_backButton:pressed{
+padding-left:2px;
+padding-top:2px;
+}
+
+QLineEdit#search_QLineEdit{
+background: $m_QWidget_BackGround_Color;
+color:$m_QWidget_Font_Color;
+border: 1px solid gray;
+border-radius: 2px;
+padding: 0 8px;
+selection-background-color: darkgray;
+}
+/*QComboBoxʽ*/
+QComboBox {
+ height: 25px;
+ border-radius: 4px;
+ border: 1px solid rgb(100, 100, 100);
+ background: rgb(72, 72, 73);
+}
+QComboBox:enabled {
+ color:$m_QWidget_Font_Color;
+}
+QComboBox:!enabled {
+ color: rgb(155, 155, 155);
+}
+QComboBox:enabled:hover, QComboBox:enabled:focus {
+ color: rgb(230, 230, 230);
+ background: rgb(68, 69, 73);
+}
+QComboBox::drop-down {
+ width: 20px;
+ border: none;
+ background: transparent;
+}
+QComboBox::drop-down:hover {
+ background: rgba(255, 255, 255, 30);
+}
+
+QComboBox::down-arrow:on {
+ top: 1px;
+}
+QComboBox QAbstractItemView {
+ border: 1px solid rgb(100, 100, 100);
+ background: rgb(68, 69, 73);
+ outline: none;
+}
+QComboBox QAbstractItemView::item {
+ height: 25px;
+ color: rgb(175, 175, 175);
+}
+QComboBox QAbstractItemView::item:selected {
+ background: rgba(255, 255, 255, 40);
+ color: rgb(230, 230, 230);
+}
+
+/*QTabWidgetʽ*/
+QTabWidget{
+background-color:transparent;
+}
+
+QTabWidget::pane{
+border:2px;
+}
+
+QTabWidget::tab-bar{
+border:2px;
+alignment:left;
+}
+
+QTabBar::tab{
+border: 1px solid gray;
+border-radius: 5px;
+border:2px;
+background:$m_QWidget_BackGround_Color;
+color:$m_QWidget_Font_Color;
+min-width:20ex;
+min-height:6ex;
+}
+
+QTabBar::tab:hover{
+background:#006161;
+color:$m_QWidget_Font_Color = #F0F0F0F0;
+}
+
+QTabBar::tab:selected{
+border-color: black;
+background:#9fa493;
+color:$m_QWidget_Font_Color;
+}
+
+/*QTableViewʽ*/
+QTableView
+{
+background: rgb(55,55,55);
+}
+
+QTableView{
+selection-background-color:rgb(255,0,0);
+background-color:rgb(50,50,50);
+border:1px solid rgb(70,70,70);
+color:rgb(200,200,200)
+}
+
+QTableView::item
+{
+background-color:$m_QWidget_BackGround_Color;
+border:1px solid rgb(65,65,65);
+color:$m_QWidget_Font_Color;
+}
+QTableView::item:hover
+{
+background-color: rgb(30,30,30);
+color:rgb(31,163,246);
+}
+QTableView::item::selected
+{
+background-color: rgb(30,30,30);
+color:rgb(31,163,246);
+}
+QHeaderView::section{
+background-color:rgb(90,90,90);
+color:rgb(200,200,200);
+border:1px solid rgb(60,60,60);
+border-bottom:1px solid rgb(70,70,70);
+}
+QHeaderView::section:hover
+{
+background-color:rgb(80,80,80);
+}
+/*ʽ*/
+QScrollBar:vertical{
+border: none;
+background-color:$m_QWidget_BackGround_Color;
+width:10px;
+}
+QScrollBar::handle:vertical{
+background:#9fa480;
+border-radius:4px;
+}
+QScrollBar::handle:vertical:hover{
+background:#9fa493;
+}
+QScrollBar::add-line:vertical{
+border: none;
+height: 0px;
+}
+QScrollBar::sub-line:vertical{
+border: none;
+height: 0px;
+}
+QScrollBar::add-page:vertical,QScrollBar::sub-page:vertical
+{
+background:$m_QWidget_BackGround_Color;
+border-radius:3px;
+}
+/*Ž*/
+QSlider::groove:horizontal {
+border: 0px solid #bbb;
+}
+
+QSlider::sub-page:horizontal {
+background: rgb(235,97,0);
+border-radius: 0px;
+margin-top:8px;
+margin-bottom:8px;
+}
+
+QSlider::add-page:horizontal {
+background: rgb(255,255, 255);
+border: 0px solid #777;
+border-radius: 2px;
+margin-top:8px;
+margin-bottom:8px;
+}
+
+QSlider::handle:horizontal {
+background: rgb(255,153,102);
+border: 1px solid rgb(255,153,102);
+width: 14px;
+height:10px;
+border-radius: 7px;
+margin-top:2px;
+margin-bottom:2px;
+
+}
+
+QSlider::handle:horizontal:hover {
+background: rgb(255,128,6);
+border: 1px solid rgba(102,102,102,102);
+border-radius: 7px;
+}
+
+QSlider::sub-page:horizontal:disabled {
+background: #bbb;
+border-color: #999;
+}
+
+QSlider::add-page:horizontal:disabled {
+background: #eee;
+border-color: #999;
+}
+
+QSlider::handle:horizontal:disabled {
+background: #eee;
+border: 1px solid #aaa;
+border-radius: 4px;
+}
+
+
+/*------------------ʽ С ر---------------------*/
+/*ֵ*/
+$titleBar_QWidget_BackGround_Color = #ffffff; /**/
+QWidget#mediaTitle{
+ background-color: $titleBar_QWidget_BackGround_Color;
+ margin-top:1px;
+ margin-right:1px;
+ margin-bottom:1px;
+ margin-left:1px;
+}
+QPushButton#minimizeButton{
+ image:url(":/res/img/btn/btn_min.png");
+ border:none;
+ width:20px;
+ height:20px;
+}
+QPushButton#maximizeButton{
+ image:url(":/res/img/btn/btn_max.png");
+ border:none;
+ width:20px;
+ height:20px;
+}
+QPushButton#closeButton{
+ image:url(":/res/img/btn/btn_close.png");
+ border:none;
+ width:20px;
+ height:20px;
+}
+/*----------------------ƶť---------------------------*/
+QPushButton#minimizeButton:hover{
+ padding-left:1px;
+ padding-top:1px;
+}
+QPushButton#maximizeButton:hover{
+ padding-left:1px;
+ padding-top:1px;
+}
+QPushButton#closeButton:hover{
+ padding-left:1px;
+ padding-top:1px;
+}
+/*----------------------갴µť---------------------------*/
+QPushButton#minimizeButton:pressed{
+ padding-left:2px;
+ padding-top:2px;
+}
+QPushButton#maximizeButton:pressed{
+ padding-left:2px;
+ padding-top:2px;
+}
+QPushButton#closeButton:pressed{
+ padding-left:1px;
+ padding-top:1px;
+}
+/*------------------ʽ---------------------*/
+/*ֵ*/
+$m_MediaPlayer_Slider_QWidget_Color = #c7fdff;
+$b_max_size = 25px;
+QWidget#m_MediaPlayerSliderQWidget{
+ background-color: $m_QWidget_BackGround_Color;
+}
+QWidget#m_videoWidget{
+ background-color:$m_QWidget_BackGround_Color;
+ background-image:url(:/res/img/zvo.png);
+ background-position:center;
+ background-repeat:no-repeat;
+}
+/*ť-Ĭ*/
+QPushButton#m_btnvolume{
+ image:url(":/res/img/dark/volume_open.png");
+ border:none;
+ max-width:$b_max_size;
+ max-height:$b_max_size;
+}
+QPushButton#m_btnPlay{
+ image:url(":/res/img/dark/play.png");
+ border:none;
+ max-width:$b_max_size;
+ max-height:$b_max_size;
+}
+QPushButton#m_btnClose{
+ image:url(":/res/img/dark/close.png");
+ border:none;
+ border:none;
+ max-width:$b_max_size;
+ max-height:$b_max_size;
+}
+QPushButton#m_btnStop{
+ image:url(":/res/img/dark/stop.png");
+ border:none;
+ max-width:$b_max_size;
+ max-height:$b_max_size;
+}
+QPushButton#m_btnPrev{
+ image:url(":/res/img/dark/prev.png");
+ border:none;
+ max-width:$b_max_size;
+ max-height:$b_max_size;
+}
+QPushButton#m_btnNext{
+ image:url(":/res/img/dark/next.png");
+ border:none;
+ max-width:$b_max_size;
+ max-height:$b_max_size;
+}
+QPushButton#m_btnEq{
+ image:url(":/res/img/dark/equalizer.png");
+ border:none;
+ max-width:$b_max_size;
+ max-height:$b_max_size;
+}
+QPushButton#m_btnSet{
+ image:url(":/res/img/dark/setting.png");
+ border:none;
+ max-width:$b_max_size;
+ max-height:$b_max_size;
+}
+QPushButton#m_btnMenuOpt{
+ image:url(":/res/img/dark/menu.png");
+ border:none;
+ max-width:$b_max_size;
+ max-height:$b_max_size;
+}
+QPushButton#m_btnDown{
+ image:url(":/res/img/dark/download.png");
+ border:none;
+ max-width:$b_max_size;
+ max-height:$b_max_size;
+}
+/*ť-Hover*/
+QPushButton#m_btnvolume:hover{
+background: $Button_Hover_BackGround_Color;
+}
diff --git a/res/qss/dark_style.qss b/res/qss/dark_style.qss
new file mode 100644
index 0000000..a58fc2a
--- /dev/null
+++ b/res/qss/dark_style.qss
@@ -0,0 +1,138 @@
+QWidget#m_widget{
+ border-radius:10px;
+ background-color: rgba(27,27,27,0.9);
+ color:#F0F0F0F0;
+}
+
+QPushButton#btn_opt{
+ image:url(:/res/img/sui.png);
+ width:35px;
+ height:35px;
+ border:none;
+}
+
+QLabel{
+ color:#F2F2F2;
+}
+
+QPushButton{
+ height:25px;
+}
+QComboBox{
+ height:25px;
+}
+QPushButton:hover{
+padding-left:1px;
+padding-top:1px;
+}
+
+QPushButton#BTN_DOWNLOAD{
+ width:25px;
+ height:25px;
+ border:none;
+ image:url(":/res/img/btn/btn_download.png");
+}
+QPushButton#BTN_SETS{
+ width:25px;
+ height:25px;
+ border:none;
+ image:url(":/res/img/btn/btn_setting.png");
+}
+QPushButton#BTN_UPDATE{
+ width:25px;
+ height:25px;
+ border:none;
+ image:url(":/res/img/btn/btn_update.png");
+}
+QPushButton#BTN_ABOUT{
+ width:25px;
+ height:25px;
+ border:none;
+ image:url(":/res/img/btn/btn_about.png");
+}
+
+QGroupBox {
+ color: #F2F2F2;
+}
+
+QTableView#GAME_INFO_TABLE::item:selected {
+ background-color: #0078d4;
+}
+
+QMenu {
+ background-color: #444;
+ color: #fff;
+ border: 1px solid #666;
+}
+
+QMenu::item {
+ padding: 2px 20px 2px 20px;
+}
+
+QMenu::icon:checked {
+ background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:1 #fff, stop:0 #aaa);
+}
+
+QMenu::item:selected {
+ background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:1 #ffc, stop:0 #9c9);
+ color: black;
+}
+
+/*------------------标题栏样式 最小化 最大化 关闭---------------------*/
+/*标题栏变量参数值定义*/
+/*标题栏背景*/
+QWidget#sui_title{
+ background-color: #ffffff;
+ margin-top:1px;
+ margin-right:1px;
+ margin-bottom:1px;
+ margin-left:1px;
+}
+QPushButton#btn_min,QPushButton#btn_max,QPushButton#btn_close{
+ margin-right:3px;
+ margin-bottom:0px;
+ border-radius:8px;
+ font-family: "Microsoft YaHei";
+ font-weight: bold;
+ font: bold 12px;
+}
+QPushButton#btn_min{
+ image:url(":/res/img/btn/btn_min.png");
+ border:none;
+ width:20px;
+ height:20px;
+}
+QPushButton#btn_max{
+ image:url(":/res/img/btn/btn_max.png");
+ border:none;
+ width:20px;
+ height:20px;
+}
+QPushButton#btn_max[maximizeProperty='maximize'] {
+ image:url(":/res/img/btn/btn_max.png");
+ border:none;
+ width:20px;
+ height:20px;
+}
+QPushButton#btn_max[maximizeProperty='restore'] {
+ image:url(":/res/img/btn/btn_max_restore.png");
+ border:none;
+ width:20px;
+ height:20px;
+}
+QPushButton#btn_close{
+ image:url(":/res/img/btn/btn_close.png");
+ border:none;
+ width:20px;
+ height:20px;
+}
+
+QPushButton#btn_min:hover,QPushButton#btn_max:hover,QPushButton#btn_close:hover{
+ padding-left:1px;
+ padding-top:1px;
+}
+
+QPushButton#btn_min:pressed,QPushButton#btn_max:pressed,QPushButton#btn_close:pressed{
+ padding-left:1px;
+ padding-top:1px;
+}
diff --git a/res/qss/light.qsst b/res/qss/light.qsst
new file mode 100644
index 0000000..25eae3e
--- /dev/null
+++ b/res/qss/light.qsst
@@ -0,0 +1,462 @@
+/*ZvoɫʽQSSļ*/
+$Button_Hover_BackGround_Color = #ffffff;
+$m_QWidget_BackGround_Color = #F3F3F3;
+$m_QWidget_Font_Color = #2F4F4F;
+
+QWidget{
+ background-color: $m_QWidget_BackGround_Color;
+ color:$m_QWidget_Font_Color;
+}
+QWidget#m_QWidget{
+ border-radius:10px;
+}
+
+QToolButton{
+ margin-right:3px;
+ margin-bottom:0px;
+ border-radius:8px;
+ font-family: "Microsoft YaHei";
+ font-weight: bold;
+ font: bold 12px;
+}
+QPushButton{
+ margin-right:3px;
+ margin-bottom:0px;
+ border-radius:8px;
+ font-family: "Microsoft YaHei";
+ font-weight: bold;
+ font: bold 12px;
+}
+
+QPushButton#icoButton{
+ image:url(:/res/img/zvo.png);
+ border:none;
+}
+
+QPushButton#t_backButton{
+ image:url(:/res/img/light/exit.png);
+ border:none;
+}
+/*бؼʽ*/
+QPushButton#searchButton{
+ image:url(:/res/img/light/search.png);
+ border:none;
+ width:15px;
+ height:15px;
+}
+QPushButton:hover{
+padding-left:1px;
+padding-top:1px;
+}
+/*ť-Pressed*/
+QPushButton:pressed{
+ padding-left:2px;
+ padding-top:2px;
+}
+
+QMenu {
+ background-color : rgb(253,253,254);
+ border-radius:15px;
+}
+QMenu::item {
+ font-size:10pt;
+ color: rgb(0,0,0);
+ background-color:rgb(253,253,254);
+ padding: 8px 25px 6px 10px;
+ margin: 1px 1px;
+}
+QMenu::item:selected {
+ background-color : rgb(236,236,237);
+}
+QMenu::icon:checked {
+ background: rgb(253,253,254);
+ position: absolute;
+ top: 1px;
+ right: 1px;
+ bottom: 1px;
+ left: 1px;
+}
+QMenu::icon:checked:selected {
+ background-color : rgb(236,236,237);
+ background-image: url(:/space_selected.png);
+}
+QMenu::separator {
+ height: 2px;
+ background: rgb(235,235,236);
+ margin-left: 10px;
+ margin-right: 10px;
+}
+
+QPushButton#searchButton,#t_backButton:hover{
+padding-left:1px;
+padding-top:1px;
+}
+QPushButton#searchButton,#t_backButton:pressed{
+padding-left:2px;
+padding-top:2px;
+}
+
+QLineEdit#search_QLineEdit{
+background: $m_QWidget_BackGround_Color;
+color:$m_QWidget_Font_Color;
+border: 1px solid gray;
+border-radius: 2px;
+padding: 0 8px;
+selection-background-color: darkgray;
+}
+
+/*QComboBoxʽ*/
+QComboBox {
+ height: 25px;
+ border-radius: 4px;
+ border: 1px solid rgb(100, 100, 100);
+ background: #f3f3f3;
+}
+QComboBox:enabled {
+ color:#2f4f4f;
+}
+QComboBox:!enabled {
+ color: rgb(155, 155, 155);
+}
+
+QComboBox::drop-down {
+ width: 20px;
+ border: none;
+}
+QComboBox::drop-down:hover {
+ color:$Button_Hover_BackGround_Color;
+}
+
+QComboBox::down-arrow:on {
+ top: 1px;
+}
+QComboBox QAbstractItemView {
+ border: 1px solid rgb(100, 100, 100);
+ background: #f3f3f3;
+ outline: none;
+}
+QComboBox QAbstractItemView::item {
+ height: 25px;
+ color: $m_QWidget_Font_Color;
+}
+QComboBox QAbstractItemView::item:selected {
+ color:$Button_Hover_BackGround_Color;
+ background:rgb(0,120,215);
+}
+QComboBox QAbstractItemView::item:hover {
+ color:$Button_Hover_BackGround_Color;
+ background:rgb(0,120,215);
+}
+/*QTabWidgetʽ*/
+QTabWidget{
+background-color:transparent;
+}
+
+QTabWidget::pane{
+border:0px;
+}
+
+QTabWidget::tab-bar{
+alignment: center;
+border:1px rgb(255,255,255);
+}
+/*ͨQTabBarʽ*/
+QTabBar::tab{
+/*border: 1px solid gray;*/
+border-radius: 3px;
+color:$m_QWidget_Font_Color;
+min-width:25ex;
+min-height:8ex;
+}
+
+QTabBar::tab:hover{
+background:rgb(0,120,215);
+color:$Button_Hover_BackGround_Color;
+}
+
+QTabBar::tab:selected{
+border-color: $m_QWidget_BackGround_Color;
+background:rgb(0,120,215);
+color:$Button_Hover_BackGround_Color;
+}
+
+/*QTabBarʽ*/
+QTabBar#MediaTitleBar::tab{
+border-bottom: 0px;
+border-radius: 3px;
+color:$m_QWidget_Font_Color;
+min-width:50ex;
+height: 40px;
+}
+
+QTabBar#MediaTitleBar::tab:hover{
+background:rgb(214,214,214);
+color:$m_QWidget_Font_Color;
+}
+
+QTabBar#MediaTitleBar::tab:selected{
+border-color: $m_QWidget_BackGround_Color;
+background:rgb(214,214,214);
+color:$m_QWidget_Font_Color;
+}
+
+QTabBar#MediaTitleBar::close-button{
+ min-width:30px;
+ min-height:30px;
+ subcontrol-origin: padding;
+ subcontrol-position: bottom right;
+ border-image: url(:/res/img/light/close_little.png);
+}
+QTabBar#MediaTitleBar::close-button:hover{
+ background: rgb(192,192,192);
+}
+
+/*QTableViewʽ*/
+QTableView{
+selection-background-color:rgb(255,0,0);
+background:$m_QWidget_BackGround_Color;
+border:1px rgb(255,255,255);
+color:rgb(200,200,200)
+}
+
+QTableView::item
+{
+background-color:$m_QWidget_BackGround_Color;
+border:1px solid #2f4f4f;
+color:$m_QWidget_Font_Color;
+}
+QTableView::item:hover
+{
+color:$Button_Hover_BackGround_Color;
+background:rgb(0,120,215);
+}
+QTableView::item::selected
+{
+color:$Button_Hover_BackGround_Color;
+background:rgb(0,120,215);
+outline:0px;
+}
+QHeaderView::section{
+color:#2f4f4f;
+background:#f3f3f3;
+border:1px solid #2f4f4f;
+border-bottom:1px solid #f3f3f3;
+}
+QHeaderView::section:hover
+{
+color:$Button_Hover_BackGround_Color;
+background:rgb(0,120,215);
+}
+/*ʽ*/
+QScrollBar:vertical{
+border: none;
+background-color:$m_QWidget_BackGround_Color;
+width:10px;
+}
+QScrollBar::handle:vertical{
+background:rgb(0,120,215);
+border-radius:4px;
+}
+QScrollBar::handle:vertical:hover{
+background:rgb(0,120,215);
+}
+QScrollBar::handle:vertical{
+background:rgb(0,120,215);
+border-radius:4px;
+}
+QScrollBar::handle:vertical:hover{
+background:rgb(0,120,255);;
+}
+
+QScrollBar::add-page:vertical,QScrollBar::sub-page:vertical
+{
+background:$m_QWidget_BackGround_Color;
+border-radius:3px;
+}
+/*Ž*/
+QSlider::groove:horizontal {
+border: 0px solid #bbb;
+}
+
+QSlider::sub-page:horizontal {
+background: rgb(235,97,0);
+border-radius: 3px;
+margin-top:8px;
+margin-bottom:8px;
+}
+
+QSlider::add-page:horizontal {
+background: rgb(255,255, 255);
+border: 0px solid #777;
+border-radius: 2px;
+margin-top:8px;
+margin-bottom:8px;
+}
+
+QSlider::handle:horizontal {
+background: rgb(255,153,102);
+border: 1px solid rgb(255,153,102);
+width: 14px;
+height:10px;
+border-radius: 8px;
+margin-top:3px;
+margin-bottom:3px;
+
+}
+
+QSlider::handle:horizontal:hover {
+background: rgb(255,128,6);
+border: 1px solid rgba(102,102,102,102);
+border-radius: 7px;
+}
+
+QSlider::sub-page:horizontal:disabled {
+background: #bbb;
+border-color: #999;
+}
+
+QSlider::add-page:horizontal:disabled {
+background: #eee;
+border-color: #999;
+}
+
+QSlider::handle:horizontal:disabled {
+background: #eee;
+border: 1px solid #aaa;
+border-radius: 4px;
+}
+
+
+/*------------------ʽ С ر---------------------*/
+/*ֵ*/
+$titleBar_QWidget_BackGround_Color = #ffffff; /**/
+QWidget#mediaTitle{
+ background-color: $titleBar_QWidget_BackGround_Color;
+ margin-top:1px;
+ margin-right:1px;
+ margin-bottom:1px;
+ margin-left:1px;
+}
+QPushButton#minimizeButton{
+ image:url(":/res/img/btn/btn_min.png");
+ border:none;
+ width:20px;
+ height:20px;
+}
+QPushButton#maximizeButton{
+ image:url(":/res/img/btn/btn_max.png");
+ border:none;
+ width:20px;
+ height:20px;
+}
+QPushButton#closeButton{
+ image:url(":/res/img/btn/btn_close.png");
+ border:none;
+ width:20px;
+ height:20px;
+}
+/*----------------------ƶť---------------------------*/
+QPushButton#minimizeButton:hover{
+ padding-left:1px;
+ padding-top:1px;
+}
+QPushButton#maximizeButton:hover{
+ padding-left:1px;
+ padding-top:1px;
+}
+QPushButton#closeButton:hover{
+ padding-left:1px;
+ padding-top:1px;
+}
+/*----------------------갴µť---------------------------*/
+QPushButton#minimizeButton:pressed{
+ padding-left:2px;
+ padding-top:2px;
+}
+QPushButton#maximizeButton:pressed{
+ padding-left:2px;
+ padding-top:2px;
+}
+QPushButton#closeButton:pressed{
+ padding-left:1px;
+ padding-top:1px;
+}
+/*------------------ʽ---------------------*/
+/*ֵ*/
+$m_MediaPlayer_Slider_QWidget_Color = #c7fdff;
+$b_max_size = 25px;
+QWidget#m_MediaPlayerSliderQWidget{
+ background-color: $m_QWidget_BackGround_Color;
+}
+QWidget#m_videoWidget{
+ background-color:$m_QWidget_BackGround_Color;
+ background-image:url(:/res/img/zvo.png);
+ background-position:center;
+ background-repeat:no-repeat;
+}
+/*ť-Ĭ*/
+QPushButton#m_btnvolume{
+ image:url(":/res/img/light/volume_open.png");
+ border:none;
+ max-width:$b_max_size;
+ max-height:$b_max_size;
+}
+QPushButton#m_btnPlay{
+ image:url(":/res/img/light/play.png");
+ border:none;
+ max-width:$b_max_size;
+ max-height:$b_max_size;
+}
+QPushButton#m_btnClose{
+ image:url(":/res/img/light/close.png");
+ border:none;
+ border:none;
+ max-width:$b_max_size;
+ max-height:$b_max_size;
+}
+QPushButton#m_btnStop{
+ image:url(":/res/img/light/stop.png");
+ border:none;
+ max-width:$b_max_size;
+ max-height:$b_max_size;
+}
+QPushButton#m_btnPrev{
+ image:url(":/res/img/light/prev.png");
+ border:none;
+ max-width:$b_max_size;
+ max-height:$b_max_size;
+}
+QPushButton#m_btnNext{
+ image:url(":/res/img/light/next.png");
+ border:none;
+ max-width:$b_max_size;
+ max-height:$b_max_size;
+}
+QPushButton#m_btnEq{
+ image:url(":/res/img/light/equalizer.png");
+ border:none;
+ max-width:$b_max_size;
+ max-height:$b_max_size;
+}
+QPushButton#m_btnSet{
+ image:url(":/res/img/light/setting.png");
+ border:none;
+ max-width:$b_max_size;
+ max-height:$b_max_size;
+}
+QPushButton#m_btnMenuOpt{
+ image:url(":/res/img/light/menu.png");
+ border:none;
+ max-width:$b_max_size;
+ max-height:$b_max_size;
+}
+QPushButton#m_btnDown{
+ image:url(":/res/img/light/download.png");
+ border:none;
+ max-width:$b_max_size;
+ max-height:$b_max_size;
+}
+/*ť-Hover*/
+QPushButton#m_btnvolume:hover{
+background: $Button_Hover_BackGround_Color;
+}
diff --git a/res/qss/light_style.qss b/res/qss/light_style.qss
new file mode 100644
index 0000000..affc5a5
--- /dev/null
+++ b/res/qss/light_style.qss
@@ -0,0 +1,113 @@
+QWidget#m_widget{
+ border-radius:10px;
+ background-color: rgba(243,243,243,0.9);
+ color:#2F4F4F;
+}
+
+QPushButton#btn_opt{
+ image:url(:/res/img/sui.png);
+ width:35px;
+ height:35px;
+ border:none;
+}
+
+QLabel{
+ color:#404040;
+}
+
+QPushButton{
+ height:25px;
+}
+QComboBox{
+ height:25px;
+}
+QPushButton:hover{
+ padding-left:1px;
+ padding-top:1px;
+}
+
+QPushButton#BTN_DOWNLOAD{
+ width:25px;
+ height:25px;
+ border:none;
+ image:url(":/res/img/btn/btn_download.png");
+}
+QPushButton#BTN_SETS{
+ width:25px;
+ height:25px;
+ border:none;
+ image:url(":/res/img/btn/btn_setting.png");
+}
+QPushButton#BTN_UPDATE{
+ width:25px;
+ height:25px;
+ border:none;
+ image:url(":/res/img/btn/btn_update.png");
+}
+QPushButton#BTN_ABOUT{
+ width:25px;
+ height:25px;
+ border:none;
+ image:url(":/res/img/btn/btn_about.png");
+}
+QTableView#GAME_INFO_TABLE::item:selected {
+ background-color: #0078d4;
+}
+
+/*------------------标题栏样式 最小化 最大化 关闭---------------------*/
+/*标题栏变量参数值定义*/
+/*标题栏背景*/
+QWidget#sui_title{
+ background-color: #ffffff;
+ margin-top:1px;
+ margin-right:1px;
+ margin-bottom:1px;
+ margin-left:1px;
+}
+QPushButton#btn_min,QPushButton#btn_max,QPushButton#btn_close{
+ margin-right:3px;
+ margin-bottom:0px;
+ border-radius:8px;
+}
+
+QPushButton#btn_min{
+ image:url(":/res/img/btn/btn_min.png");
+ border:none;
+ width:20px;
+ height:20px;
+}
+QPushButton#btn_max{
+ image:url(":/res/img/btn/btn_max.png");
+ border:none;
+ width:20px;
+ height:20px;
+}
+QPushButton#btn_max[maximizeProperty='maximize'] {
+ image:url(":/res/img/btn/btn_max.png");
+ border:none;
+ width:20px;
+ height:20px;
+}
+QPushButton#btn_max[maximizeProperty='restore'] {
+ image:url(":/res/img/btn/btn_max_restore.png");
+ border:none;
+ width:20px;
+ height:20px;
+}
+QPushButton#btn_close{
+ image:url(":/res/img/btn/btn_close.png");
+ border:none;
+ width:20px;
+ height:20px;
+}
+
+QPushButton#btn_min:hover,QPushButton#btn_max:hover,QPushButton#btn_close:hover{
+ padding-left:1px;
+ padding-top:1px;
+}
+
+QPushButton#btn_min:pressed,QPushButton#btn_max:pressed,QPushButton#btn_close:pressed{
+ padding-left:1px;
+ padding-top:1px;
+}
+
diff --git a/res/translator/qtbase_zh_CN.qm b/res/translator/qtbase_zh_CN.qm
new file mode 100644
index 0000000..2443d85
Binary files /dev/null and b/res/translator/qtbase_zh_CN.qm differ
diff --git a/res/txt/about.txt b/res/txt/about.txt
new file mode 100644
index 0000000..b3fa552
--- /dev/null
+++ b/res/txt/about.txt
@@ -0,0 +1,17 @@
+#### 作者申明
+**本软件仅供学习和研究,软件内置数据仅限于测试**
+**开发者不对本软件所造成的计算机软件侵权法律问题承担任何法律责任**
+**禁止本软件源码和软件用于任何商业用途**
+**禁止任何人恶意举报本软件**
+**禁止任何人恶意盗窃本软件测试数据**
+
+
+#### 鸣谢列表
+**皓月代码托管平台**
+
+
+#### About XSteam
+**software name:XSteam**
+**builder:JackLee_CN**
+**github:vek-zvo**
+**src github(don't open)**
diff --git a/src/DataExchange.cpp b/src/DataExchange.cpp
new file mode 100644
index 0000000..ab3c19f
--- /dev/null
+++ b/src/DataExchange.cpp
@@ -0,0 +1,136 @@
+#include "DataExchange.h"
+
+void DataExchange::ExportStep(const QString& fileName, STEPControl_StepModelType stepType)
+{
+ IFSelect_ReturnStatus aStatus;
+
+ STEPControl_Writer aStepWriter;
+ for (auto aisObj : aisObjs)
+ {
+ if (Handle(MAisDemo) aShape = Handle(MAisDemo)::DownCast(aisObj))
+ {
+ aStatus = aStepWriter.Transfer(aShape->Shape() , stepType);
+ if (aStatus != IFSelect_RetDone)
+ {
+ std::cout << "A shape was not transferred successfully" << std::endl;
+ return;
+ }
+ }
+ }
+ aStatus = aStepWriter.Write(fileName.toStdString().c_str());
+
+ switch (aStatus)
+ {
+ case IFSelect_RetError:
+ std::cout << "Incorrect Data." << std::endl;
+ break;
+ case IFSelect_RetFail:
+ std::cout << "Writing error" << std::endl;
+ break;
+ case IFSelect_RetVoid:
+ std::cout << "Nothing to transfer." << std::endl;
+ break;
+ case IFSelect_RetStop:
+ case IFSelect_RetDone:
+ std::cout << "A STEP file was successfully written" << std::endl;
+ break;
+ }
+}
+
+void DataExchange::ImportStep(const QString& fileName)
+{
+ STEPControl_Reader aReader;
+ const IFSelect_ReturnStatus aStatus = aReader.ReadFile(fileName.toStdString().c_str());
+ if (aStatus != IFSelect_RetDone)
+ {
+ std::cout << "A BREP file was not read successfully" << std::endl;
+ return;
+ }
+
+ bool anIsFailsOnly = false;
+ aReader.PrintCheckLoad(anIsFailsOnly , IFSelect_ItemsByEntity);
+
+ int aRootsNumber = aReader.NbRootsForTransfer();
+ aReader.PrintCheckTransfer(anIsFailsOnly , IFSelect_ItemsByEntity);
+ for (int i = 1; i <= aRootsNumber; i++)
+ {
+ aReader.TransferRoot(i);
+ }
+
+ aisObjs.clear();
+ int aShapesNumber = aReader.NbShapes();
+ for (int i = 1; i <= aShapesNumber; i++)
+ {
+ TopoDS_Shape aTopoShape = aReader.Shape(i);
+ Handle(MAisDemo) anAisShape = new MAisDemo(aTopoShape);
+ aisObjs.push_back(anAisShape);
+ }
+ std::cout << "A STEP file was read successfully" << std::endl;
+}
+
+void DataExchange::ExportIges(const QString& fileName)
+{
+ IGESControl_Controller::Init();
+ IGESControl_Writer anIgesWriter(Interface_Static::CVal("XSTEP.iges.unit") ,
+ Interface_Static::IVal("XSTEP.iges.writebrep.mode"));
+
+ bool anIsShapeExist = false;
+ for (auto aisObj : aisObjs)
+ {
+ if (Handle(MAisDemo) aShape = Handle(MAisDemo)::DownCast(aisObj))
+ {
+ anIsShapeExist = Standard_True;
+ anIgesWriter.AddShape(aShape->Shape());
+ }
+ }
+
+ if (anIsShapeExist)
+ {
+ anIgesWriter.ComputeModel();
+ if (anIgesWriter.Write(fileName.toStdString().c_str()))
+ {
+ std::cout << "A IGES file was successfully written" << std::endl;
+ }
+ else
+ {
+ std::cout << "A IGES file was not written" << std::endl;
+ }
+ }
+ else
+ {
+ std::cout << "Shapes do not exist" << std::endl;
+ }
+}
+
+void DataExchange::ImportIges(const QString& fileName)
+{
+ IGESControl_Reader aReader;
+ int status = aReader.ReadFile(fileName.toStdString().c_str());
+ if (status != IFSelect_RetDone)
+ {
+ std::cout << "A IGES file was not read successfully" << std::endl;
+ return;
+ }
+ aReader.TransferRoots();
+ TopoDS_Shape aTopoShape = aReader.OneShape();
+ Handle(MAisDemo) anAisShape = new MAisDemo(aTopoShape);
+
+ aisObjs.clear();
+ aisObjs.push_back(anAisShape);
+ std::cout << "A IGES file was read successfully" << std::endl;
+}
+
+void DataExchange::ImportObj(const QString& fileName)
+{
+ RWObj_TriangulationReader reader;
+ Message_ProgressRange process;
+ bool status = reader.Read(fileName.toStdString().c_str() , process);
+
+ TopoDS_Shape shape = reader.ResultShape();
+
+ Handle(MAisDemo) anAisShape = new MAisDemo(shape);
+
+ aisObjs.clear();
+ aisObjs.push_back(anAisShape);
+ std::cout << "A OBJ file was read successfully" << std::endl;
+}
diff --git a/src/DataExchange.h b/src/DataExchange.h
new file mode 100644
index 0000000..a29396e
--- /dev/null
+++ b/src/DataExchange.h
@@ -0,0 +1,48 @@
+#pragma once
+
+#include "MAISObj.h"
+
+#include
+#include
+
+#include
+#include
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include
+
+class DataExchange
+{
+public:
+ DataExchange() = default;
+
+ void setAisObjs(std::vector& objs)
+ {
+ aisObjs = objs;
+ }
+
+ std::vector getAisObjs()
+ {
+ return aisObjs;
+ }
+
+ void ExportStep(const QString& fileName , STEPControl_StepModelType stepType = STEPControl_AsIs);
+ void ImportStep(const QString& fileName);
+
+ void ExportIges(const QString& fileName);
+ void ImportIges(const QString& fileName);
+
+ void ImportObj(const QString& fileName);
+
+private:
+ std::vector aisObjs;
+};
\ No newline at end of file
diff --git a/src/MAISObj.cpp b/src/MAISObj.cpp
new file mode 100644
index 0000000..0dffd3e
--- /dev/null
+++ b/src/MAISObj.cpp
@@ -0,0 +1,989 @@
+#include "MAISObj.h"
+
+MAisDemo::MAisDemo(const TopoDS_Shape& shap, bool indexVisible) :
+ myShape(shap),
+ faceIndexIsVisible(indexVisible)
+{
+ myDrawer->SetFaceBoundaryDraw(true);// 要放开头,其余样式设置位置随便
+ myDrawer->SetFaceBoundaryAspect(new Prs3d_LineAspect(Quantity_NOC_BLACK , Aspect_TOL_SOLID , 1.0));
+}
+
+void MAisDemo::Compute(const Handle(PrsMgr_PresentationManager)& thePrsMgr , const Handle(Prs3d_Presentation)& thePrs , const Standard_Integer theMode)
+{
+ if (theMode == MDispMode_WireFrame)
+ {
+ StdPrs_WFShape::Add(thePrs , myShape , myDrawer);
+ setFaceIndex(thePrs);
+ }
+ else if (theMode == MDispMode_Shaded)
+ {
+ StdPrs_ShadedShape::Add(thePrs , myShape , myDrawer);
+ setFaceIndex(thePrs);
+ }
+}
+
+void MAisDemo::ComputeSelection(const Handle(SelectMgr_Selection)& theSel , const Standard_Integer theMode)
+{
+ TopAbs_ShapeEnum TypOfSel = SelectionType(theMode);
+ Standard_Real aDefl = StdPrs_ToolTriangulatedShape::GetDeflection(myShape , myDrawer);
+ StdSelect_BRepSelectionTool::Load(theSel , this , myShape , TypOfSel , aDefl ,
+ myDrawer->DeviationAngle() ,
+ myDrawer->IsAutoTriangulation());
+}
+
+void MAisDemo::SetColor(const Quantity_Color& theColor)
+{
+ myDrawer->SetupOwnShadingAspect();
+ myDrawer->ShadingAspect()->SetColor(theColor);
+}
+
+void MAisDemo::setFaceIndex(const Handle(Prs3d_Presentation)& thePrs)
+{
+ if (faceIndexIsVisible)
+ {
+ int i = 1;
+ for (TopExp_Explorer exp(myShape , TopAbs_FACE); exp.More(); exp.Next() , ++i)
+ {
+ TopoDS_Face face = TopoDS::Face(exp.Current());
+
+ GProp_GProps props;
+ BRepGProp::SurfaceProperties(face , props);
+ gp_Pnt center = props.CentreOfMass(); // 获取几何中心
+
+ Handle(Graphic3d_Group) group = thePrs->NewGroup();
+ Handle(Graphic3d_AspectText3d) textAspect = new Graphic3d_AspectText3d();
+ textAspect->SetColor(Quantity_NOC_BLUE);
+ textAspect->SetTextZoomable(false);
+ textAspect->SetFont("Consolas");
+ textAspect->SetStyle(Aspect_TOST_ANNOTATION);
+ group->SetPrimitivesAspect(textAspect);
+
+ Handle(Graphic3d_Text) text = new Graphic3d_Text(20.0);
+ text->SetText(std::to_string(i).c_str());
+ text->SetPosition(center);
+ group->AddText(text);
+
+ }
+ }
+}
+
+MAisObject::MAisObject(std::shared_ptr< MSLinearRect> shap) :
+ myShape(shap)
+{
+ myShadeStyle = new Prs3d_Drawer();
+ myShadeStyle->SetupOwnDefaults();
+ myShadeStyle->SetFaceBoundaryDraw(true);// 要放开头,其余样式设置位置随便
+ myShadeStyle->SetFaceBoundaryAspect(new Prs3d_LineAspect(Quantity_NOC_BLACK , Aspect_TOL_SOLID , 1.0));
+ myShadeStyle->SetWireAspect(new Prs3d_LineAspect(Quantity_NOC_GREEN , Aspect_TOL_SOLID , 1.0));
+ // 增加透明度可增加被覆盖内容识别率
+ myShadeStyle->ShadingAspect()->SetTransparency(0.5);
+
+ myShadeStyleHighLight = new Prs3d_Drawer();
+ myShadeStyleHighLight->SetShadingAspect(new Prs3d_ShadingAspect()); // 新建必须添加aspect,不然后面访问空指针报错
+ myShadeStyleHighLight->ShadingAspect()->SetTransparency(0.5);
+ myShadeStyleHighLight->SetFaceBoundaryDraw(true);
+ myShadeStyleHighLight->SetFaceBoundaryAspect(new Prs3d_LineAspect(Quantity_NOC_GRAY80 , Aspect_TOL_SOLID , 1.0));
+}
+
+void MAisObject::Compute(const Handle(PrsMgr_PresentationManager)& thePrsMgr ,
+ const Handle(Prs3d_Presentation)& thePrs ,
+ const Standard_Integer theMode)
+{
+ if (theMode == MDispMode_WireFrame)
+ {
+ SetDisplayMode(MDispMode_WireFrame);
+
+ StdPrs_WFShape::Add(thePrs , myShape->getShape() , myShadeStyle);
+ StdPrs_WFShape::Add(thePrs , myShape->getPath() , myShadeStyle);
+ StdPrs_WFShape::Add(thePrs , myShape->getProfile() , myShadeStyle);
+ }
+ else if (theMode == MDispMode_Shaded)
+ {
+ SetDisplayMode(MDispMode_Shaded);
+
+ StdPrs_ShadedShape::Add(thePrs , myShape->getShape() , myShadeStyle);
+ StdPrs_WFShape::Add(thePrs , myShape->getPath() , myShadeStyle);
+ StdPrs_WFShape::Add(thePrs , myShape->getProfile() , myShadeStyle);
+ }
+ else if (theMode == MDispMode_Shaded_HighLight)
+ {
+ myShadeStyleHighLight->SetFaceBoundaryAspect(new Prs3d_LineAspect(Quantity_NOC_GRAY80 , Aspect_TOL_SOLID , 1.0));
+ StdPrs_ShadedShape::Add(thePrs , myShape->getShape() , myShadeStyleHighLight);
+
+ StdPrs_WFShape::Add(thePrs , myShape->getPath() , myShadeStyle);
+ StdPrs_WFShape::Add(thePrs , myShape->getProfile() , myShadeStyle);
+ }
+ else if (theMode == MDispMode_Shaded_HighLightDynamic)
+ {
+ myShadeStyleHighLight->SetFaceBoundaryAspect(new Prs3d_LineAspect(Quantity_NOC_CYAN , Aspect_TOL_SOLID , 1.0));
+ StdPrs_ShadedShape::Add(thePrs , myShape->getShape() , myShadeStyleHighLight);
+
+ StdPrs_WFShape::Add(thePrs , myShape->getPath() , myShadeStyle);
+ StdPrs_WFShape::Add(thePrs , myShape->getProfile() , myShadeStyle);
+ }
+ else if (theMode == MDispMode_WireFrame_HighLight)
+ {
+ Handle(Prs3d_Drawer) wireStyle = new Prs3d_Drawer();
+ wireStyle->SetupOwnDefaults();
+ Handle(Prs3d_LineAspect) lineAspect = new Prs3d_LineAspect(Quantity_NOC_WHITE , Aspect_TOL_SOLID , 1.0);
+ wireStyle->SetWireAspect(lineAspect);
+ // 默认FreeBoundary绿色
+ wireStyle->SetFreeBoundaryAspect(lineAspect);
+ // 默认UnFreeBoundary黄色
+ wireStyle->SetUnFreeBoundaryAspect(lineAspect);
+ StdPrs_WFShape::Add(thePrs , myShape->getPath() , wireStyle);
+ StdPrs_WFShape::Add(thePrs , myShape->getShape() , wireStyle);
+ StdPrs_WFShape::Add(thePrs , myShape->getProfile() , wireStyle);
+ }
+}
+
+void MAisObject::ComputeSelection(const Handle(SelectMgr_Selection)& theSel , const Standard_Integer theMode)
+{
+ TopoDS_Wire path = myShape->getPath();
+ TopoDS_Shape aShape = myShape->getShape();
+ gp_Pnt endPoint = myShape->getPoints()[0];
+ gp_Pnt endPoint1 = myShape->getPoints()[1];
+ gp_Pnt aMidPnt = endPoint1.Translated(gp_Vec(endPoint1 , endPoint) * 0.5);
+
+ if (theMode == 0)
+ {
+ Handle(MAisOwner) aOwner = new MAisOwner(this);
+ Standard_Real aDefl = StdPrs_ToolTriangulatedShape::GetDeflection(aShape , myShadeStyle);
+ StdSelect_BRepSelectionTool::ComputeSensitive(aShape , aOwner , theSel ,
+ aDefl , myShadeStyle->DeviationAngle() , 9 , 500 , myShadeStyle->IsAutoTriangulation());
+ }
+ else if (theMode == 1)
+ {
+ Handle(MCaptureOwnerEdge) aCaptureOwnerEdge = new MCaptureOwnerEdge(path , this , 1);
+ Handle(Select3D_SensitiveSegment) aSensEdge = new Select3D_SensitiveSegment(aCaptureOwnerEdge , endPoint , endPoint1);
+ aSensEdge->SetSensitivityFactor(20);
+ theSel->Add(aSensEdge);
+
+ Handle(MCaptureOwnerEndPonit) aCaptureOwnerEndPonit = new MCaptureOwnerEndPonit(endPoint , this , 2);
+ Handle(Select3D_SensitivePoint) aSensEndPnt = new Select3D_SensitivePoint(aCaptureOwnerEndPonit , endPoint);
+ aSensEndPnt->SetSensitivityFactor(20);
+ theSel->Add(aSensEndPnt);
+
+ Handle(MCaptureOwnerEndPonit) aCaptureOwnerEndPonit1 = new MCaptureOwnerEndPonit(endPoint1 , this , 2);
+ Handle(Select3D_SensitivePoint) aSensEndPnt1 = new Select3D_SensitivePoint(aCaptureOwnerEndPonit1 , endPoint1);
+ aSensEndPnt1->SetSensitivityFactor(20);
+ theSel->Add(aSensEndPnt1);
+
+ Handle(MCaptureOwnerMidPoint) aCaptureOwnerMidPoint = new MCaptureOwnerMidPoint(aMidPnt , this , 2);
+ Handle(Select3D_SensitivePoint) aSensMidPnt = new Select3D_SensitivePoint(aCaptureOwnerMidPoint , aMidPnt);
+ aSensMidPnt->SetSensitivityFactor(20);
+ theSel->Add(aSensMidPnt);
+ }
+}
+
+void MAisObject::SetColor(const Quantity_Color& theColor)
+{
+ // 自带的myDrawer设置是全局的,所有MAisObject实例都会变
+ myShadeStyle->ShadingAspect()->SetColor(theColor);
+ // myShadeStyleHighLight设置是实例才会变
+ myShadeStyleHighLight->ShadingAspect()->SetColor(theColor);
+}
+
+void MAisOwner::HilightWithColor(const Handle(PrsMgr_PresentationManager)& thePrsMgr ,
+ const Handle(Prs3d_Drawer)& theStyle ,
+ const Standard_Integer theMode)
+{
+ MAisObject* anObj = dynamic_cast(mySelectable);
+ std::shared_ptr< MSLinearRect> aShape = anObj->Shape();
+ int displayMode = anObj->DisplayMode();
+ if (myPrsWire.IsNull())
+ {
+ myPrsWire = new Prs3d_Presentation(thePrsMgr->StructureManager());
+ myPrsWire->SetZLayer(Graphic3d_ZLayerId_Topmost);
+ anObj->Compute(thePrsMgr , myPrsWire , MAisObject::MDispMode_WireFrame_HighLight);
+ }
+ if (myPrs.IsNull())
+ {
+ myPrs = new Prs3d_Presentation(thePrsMgr->StructureManager());
+ myPrs->SetZLayer(Graphic3d_ZLayerId_Topmost);
+ anObj->Compute(thePrsMgr , myPrs , MAisObject::MDispMode_Shaded_HighLight);
+ }
+
+ if (thePrsMgr->IsImmediateModeOn())
+ {
+ // 动态高亮指针需与选择高亮指针分开new。如果用同一个,ImmediateList机制会自动erase,导致选择高亮模式也被清除
+ // theStyle在Compute中最好也new一个
+ if (displayMode == 0)
+ {
+ Handle(Prs3d_Presentation) myPrsWireD = new Prs3d_Presentation(thePrsMgr->StructureManager());
+ anObj->Compute(thePrsMgr , myPrsWireD , MAisObject::MDispMode_WireFrame_HighLight);
+ myPrsWireD->Highlight(theStyle);
+ thePrsMgr->AddToImmediateList(myPrsWireD);
+ }
+ else
+ {
+ Handle(Prs3d_Presentation) myPrsD = new Prs3d_Presentation(thePrsMgr->StructureManager());
+ myPrsD->SetZLayer(Graphic3d_ZLayerId_Topmost);
+ anObj->Compute(thePrsMgr , myPrsD , MAisObject::MDispMode_Shaded_HighLightDynamic);
+ thePrsMgr->AddToImmediateList(myPrsD);
+ }
+ }
+ else
+ {
+ if (displayMode == 0)
+ myPrsWire->Display();
+ else
+ myPrs->Display();
+ }
+}
+
+void MAisOwner::Unhilight(const Handle(PrsMgr_PresentationManager)& thePrsMgr , const Standard_Integer theMode)
+{
+ if (!myPrs.IsNull())
+ {
+ myPrs->Erase();
+ }
+ if (!myPrsWire.IsNull())
+ {
+ myPrsWire->Erase();
+ }
+}
+
+MCaptureOwnerEndPonit::MCaptureOwnerEndPonit(gp_Pnt& pnt , const Handle(AIS_InteractiveObject)& theObj , int thePriority) :
+ SelectMgr_EntityOwner(theObj , thePriority) ,
+ myPoint(pnt)
+{
+ // 不使用HilightWithColor函数参数的全局theStyle,有时中点/端点会错乱。
+ myStyle = new Prs3d_Drawer();
+ myStyle->SetupOwnDefaults();
+ myStyle->PointAspect()->SetScale(Standard_Real(10));
+ myStyle->PointAspect()->SetTypeOfMarker(Aspect_TOM_POINT);
+ myStyle->PointAspect()->SetColor(Quantity_NOC_YELLOW);
+}
+
+void MCaptureOwnerEndPonit::HilightWithColor(const Handle(PrsMgr_PresentationManager)& thePrsMgr ,
+ const Handle(Prs3d_Drawer)& theStyle ,
+ const Standard_Integer theMode)
+{
+ if (myPrs.IsNull())
+ {
+ myPrs = new Prs3d_Presentation(thePrsMgr->StructureManager());
+
+ Handle(Graphic3d_Group) aGroupSegs = myPrs->NewGroup();
+ aGroupSegs->SetGroupPrimitivesAspect(myStyle->PointAspect()->Aspect());
+ Handle(Graphic3d_ArrayOfPoints) arrPnts = new Graphic3d_ArrayOfPoints(1);
+ arrPnts->AddVertex(myPoint);
+ aGroupSegs->AddPrimitiveArray(arrPnts);
+ myPrs->SetZLayer(Graphic3d_ZLayerId_TopOSD);
+
+ }
+ if (myPrsDynamic.IsNull())
+ {
+ myPrsDynamic = new Prs3d_Presentation(thePrsMgr->StructureManager());
+ myPrsDynamic->SetZLayer(Graphic3d_ZLayerId_TopOSD);
+ Handle(Graphic3d_Group) aGroupSegs = myPrsDynamic->NewGroup();
+ aGroupSegs->SetGroupPrimitivesAspect(myStyle->PointAspect()->Aspect());
+ Handle(Graphic3d_ArrayOfPoints) arrPnts = new Graphic3d_ArrayOfPoints(1);
+ arrPnts->AddVertex(myPoint);
+ aGroupSegs->AddPrimitiveArray(arrPnts);
+
+ myPrsDynamic->Highlight(myStyle); // 和下面有先后顺序
+ myPrsDynamic->HighlightStyle()->SetColor(Quantity_NOC_CYAN);
+ }
+ if (thePrsMgr->IsImmediateModeOn())
+ {
+ thePrsMgr->AddToImmediateList(myPrsDynamic);
+ }
+ else
+ {
+ myPrs->Display();
+ }
+}
+
+void MCaptureOwnerEndPonit::Unhilight(const Handle(PrsMgr_PresentationManager)& thePrsMgr , const Standard_Integer theMode)
+{
+ if (!myPrs.IsNull())
+ {
+ myPrs->Erase();
+ }
+ if (!myPrsDynamic.IsNull())
+ {
+ myPrsDynamic->Erase();
+ }
+}
+
+MCaptureOwnerMidPoint::MCaptureOwnerMidPoint(gp_Pnt& pnt , const Handle(AIS_InteractiveObject)& theObj , int thePriority) :
+ SelectMgr_EntityOwner(theObj , thePriority) ,
+ myPoint(pnt)
+{
+ const char* path = "E:/8other/CppLearn/OCCTTutorial/OCCTQtDemo/icons/triangle.png";
+ Handle(Image_AlienPixMap) pix = new Image_AlienPixMap();
+ pix->Load(path);
+ img = new Graphic3d_MarkerImage(pix);
+
+ myStyle = new Prs3d_Drawer();
+ myStyle->SetupOwnDefaults();
+ myStyle->PointAspect()->SetTypeOfMarker(Aspect_TOM_USERDEFINED);
+ myStyle->PointAspect()->Aspect()->SetMarkerImage(img);
+}
+
+void MCaptureOwnerMidPoint::HilightWithColor(const Handle(PrsMgr_PresentationManager)& thePrsMgr , const Handle(Prs3d_Drawer)& theStyle , const Standard_Integer theMode)
+{
+ if (myPrs.IsNull())
+ {
+ myPrs = new Prs3d_Presentation(thePrsMgr->StructureManager());
+
+ Handle(Graphic3d_Group) aGroupSegs = myPrs->NewGroup();
+ aGroupSegs->SetGroupPrimitivesAspect(myStyle->PointAspect()->Aspect());
+ Handle(Graphic3d_ArrayOfPoints) arrPnts = new Graphic3d_ArrayOfPoints(1);
+ arrPnts->AddVertex(myPoint);
+ aGroupSegs->AddPrimitiveArray(arrPnts);
+ myPrs->SetZLayer(Graphic3d_ZLayerId_TopOSD);
+ }
+ if (myPrsDynamic.IsNull())
+ {
+ myPrsDynamic = new Prs3d_Presentation(thePrsMgr->StructureManager());
+
+ Handle(Graphic3d_Group) aGroupSegs = myPrsDynamic->NewGroup();
+ aGroupSegs->SetGroupPrimitivesAspect(myStyle->PointAspect()->Aspect());
+ Handle(Graphic3d_ArrayOfPoints) arrPnts = new Graphic3d_ArrayOfPoints(1);
+ arrPnts->AddVertex(myPoint);
+ aGroupSegs->AddPrimitiveArray(arrPnts);
+ myPrsDynamic->SetZLayer(Graphic3d_ZLayerId_TopOSD);
+
+ myPrsDynamic->Highlight(myStyle); // 和下面有先后顺序
+ myPrsDynamic->HighlightStyle()->SetColor(Quantity_NOC_CYAN);
+ }
+ if (thePrsMgr->IsImmediateModeOn())
+ {
+ thePrsMgr->AddToImmediateList(myPrsDynamic);
+ }
+ else
+ {
+ myPrs->Display();
+ }
+}
+
+void MCaptureOwnerMidPoint::Unhilight(const Handle(PrsMgr_PresentationManager)& thePrsMgr , const Standard_Integer theMode)
+{
+ if (!myPrs.IsNull())
+ {
+ myPrs->Erase();
+ }
+ if (!myPrsDynamic.IsNull())
+ {
+ myPrsDynamic->Erase();
+ }
+}
+
+MCaptureOwnerEdge::MCaptureOwnerEdge(TopoDS_Wire& edge , const Handle(AIS_InteractiveObject)& theObj , int thePriority) :
+ SelectMgr_EntityOwner(theObj , thePriority) ,
+ myEdge(edge)
+{
+ myStyle = new Prs3d_Drawer();
+ myStyle->SetupOwnDefaults();
+ myStyle->WireAspect()->SetColor(Quantity_NOC_YELLOW);
+}
+
+void MCaptureOwnerEdge::HilightWithColor(const Handle(PrsMgr_PresentationManager)& thePrsMgr ,
+ const Handle(Prs3d_Drawer)& theStyle , const Standard_Integer theMode)
+{
+ if (myPrs.IsNull())
+ {
+ myPrs = new Prs3d_Presentation(thePrsMgr->StructureManager());
+ myPrs->SetZLayer(Graphic3d_ZLayerId_TopOSD);
+
+ StdPrs_ShadedShape::Add(myPrs , myEdge , myStyle);
+ }
+
+ if (thePrsMgr->IsImmediateModeOn())
+ {
+ Handle(Prs3d_Presentation) myPrsD = new Prs3d_Presentation(thePrsMgr->StructureManager());
+ myPrsD->SetZLayer(Graphic3d_ZLayerId_TopOSD);
+
+ StdPrs_ShadedShape::Add(myPrsD , myEdge , myStyle);
+ myPrsD->Highlight(myStyle); // 和下面有先后顺序
+ myPrsD->HighlightStyle()->SetColor(Quantity_NOC_CYAN);
+ thePrsMgr->AddToImmediateList(myPrsD);
+ }
+ else
+ {
+ myPrs->Display();
+ }
+}
+
+void MCaptureOwnerEdge::Unhilight(const Handle(PrsMgr_PresentationManager)& thePrsMgr , const Standard_Integer theMode)
+{
+ if (!myPrs.IsNull())
+ {
+ myPrs->Erase();
+ }
+}
+
+MAisObject0::MAisObject0(const TopoDS_Shape& shap) :
+ aShape(shap)
+{
+ SetDisplayMode(MyDispMode_Main);
+ SetHilightMode(MyDispMode_Highlight);
+}
+
+void MAisObject0::Compute(const Handle(PrsMgr_PresentationManager)& thePrsMgr ,
+ const Handle(Prs3d_Presentation)& thePrs ,
+ const Standard_Integer theMode)
+{
+ if (theMode == MyDispMode_Main)
+ {
+ StdPrs_ShadedShape::Add(thePrs , aShape , myDrawer);
+ StdPrs_WFShape::Add(thePrs , aShape , myDrawer);
+ }
+ else if (theMode == MyDispMode_Highlight)
+ {
+ Bnd_Box aBox;
+ BRepBndLib::Add(aShape , aBox);
+ Prs3d_BndBox::Add(thePrs , aBox , myDrawer);
+ }
+}
+
+MAisObject1::MAisObject1(const TopoDS_Shape& shap) :
+ aShape(shap)
+{
+ SetDisplayMode(MyDispMode_Main);
+ SetHilightMode(MyDispMode_Highlight);
+}
+
+void MAisObject1::Compute(const Handle(PrsMgr_PresentationManager)& thePrsMgr ,
+ const Handle(Prs3d_Presentation)& thePrs ,
+ const Standard_Integer theMode)
+{
+ const double aRadius = 100.0 , aHeight = 100.0;
+ if (theMode == MyDispMode_Main)
+ {
+ StdPrs_ShadedShape::Add(thePrs , aShape , myDrawer);
+ //StdPrs_WFShape::Add (thePrs, aShape, myDrawer);
+ const double aRadius = 100.0 , aHeight = 100.0;
+ Handle(Graphic3d_ArrayOfSegments) aSegs = new Graphic3d_ArrayOfSegments(4 , 4 * 2 , Graphic3d_ArrayFlags_None);
+ aSegs->AddVertex(gp_Pnt(0.0 , -aRadius , 0.0));
+ aSegs->AddVertex(gp_Pnt(0.0 , -aRadius , aHeight));
+ aSegs->AddVertex(gp_Pnt(0.0 , aRadius , aHeight));
+ aSegs->AddVertex(gp_Pnt(0.0 , aRadius , 0.0));
+ aSegs->AddEdges(1 , 2);
+ aSegs->AddEdges(2 , 3);
+ aSegs->AddEdges(3 , 4);
+ aSegs->AddEdges(4 , 1);
+ Handle(Graphic3d_Group) aGroupSegs = thePrs->NewGroup();
+ aGroupSegs->SetGroupPrimitivesAspect(myDrawer->WireAspect()->Aspect());
+ aGroupSegs->AddPrimitiveArray(aSegs);
+ }
+ else if (theMode == MyDispMode_Highlight)
+ {
+ Bnd_Box aBox;
+ BRepBndLib::Add(aShape , aBox);
+ Prs3d_BndBox::Add(thePrs , aBox , myDrawer);
+ }
+}
+
+MAisObject2::MAisObject2(const TopoDS_Shape& shap) :
+ aShape(shap)
+{
+ SetHilightMode(MyDispMode_Highlight);
+ myDrawer->SetupOwnShadingAspect();
+ myDrawer->ShadingAspect()->SetMaterial(Graphic3d_NameOfMaterial_Silver);
+ myDrawer->SetWireAspect(new Prs3d_LineAspect(Quantity_NOC_GREEN , Aspect_TOL_SOLID , 2.0));
+}
+
+void MAisObject2::Compute(const Handle(PrsMgr_PresentationManager)& thePrsMgr ,
+ const Handle(Prs3d_Presentation)& thePrs ,
+ const Standard_Integer theMode)
+{
+ if (theMode == MyDispMode_Main)
+ {
+ StdPrs_ShadedShape::Add(thePrs , aShape , myDrawer);
+ //StdPrs_WFShape::Add (thePrs, aShape, myDrawer);
+ const double aRadius = 100.0 , aHeight = 100.0;
+ Handle(Graphic3d_ArrayOfSegments) aSegs = new Graphic3d_ArrayOfSegments(4 , 4 * 2 , Graphic3d_ArrayFlags_None);
+ aSegs->AddVertex(gp_Pnt(0.0 , -aRadius , 0.0));
+ aSegs->AddVertex(gp_Pnt(0.0 , -aRadius , aHeight));
+ aSegs->AddVertex(gp_Pnt(0.0 , aRadius , aHeight));
+ aSegs->AddVertex(gp_Pnt(0.0 , aRadius , 0.0));
+ aSegs->AddEdges(1 , 2);
+ aSegs->AddEdges(2 , 3);
+ aSegs->AddEdges(3 , 4);
+ aSegs->AddEdges(4 , 1);
+ Handle(Graphic3d_Group) aGroupSegs = thePrs->NewGroup();
+ aGroupSegs->SetGroupPrimitivesAspect(myDrawer->WireAspect()->Aspect());
+ aGroupSegs->AddPrimitiveArray(aSegs);
+ }
+ else if (theMode == MyDispMode_Highlight)
+ {
+ Bnd_Box aBox;
+ BRepBndLib::Add(aShape , aBox);
+ Prs3d_BndBox::Add(thePrs , aBox , myDrawer);
+ }
+}
+
+MAisObject3::MAisObject3(const TopoDS_Shape& shap) :
+ aShape(shap)
+{
+ SetHilightMode(MyDispMode_Highlight);
+ myDrawer->SetupOwnShadingAspect();
+ myDrawer->ShadingAspect()->SetMaterial(Graphic3d_NameOfMaterial_Silver);
+ myDrawer->SetWireAspect(new Prs3d_LineAspect(Quantity_NOC_GREEN , Aspect_TOL_SOLID , 2.0));
+}
+
+void MAisObject3::Compute(const Handle(PrsMgr_PresentationManager)& thePrsMgr ,
+ const Handle(Prs3d_Presentation)& thePrs ,
+ const Standard_Integer theMode)
+{
+ const double aRadius = 100.0 , aHeight = 100.0;
+ if (theMode == MyDispMode_Main)
+ {
+ Prs3d_ToolCylinder aCyl(aRadius , aRadius , aHeight , 25 , 25);
+ Prs3d_ToolDisk aDisk(0.0 , aRadius , 25 , 1);
+ Handle(Graphic3d_ArrayOfTriangles) aTris =
+ new Graphic3d_ArrayOfTriangles(aCyl.VerticesNb() + 2 * aDisk.VerticesNb() ,
+ 3 * (aCyl.TrianglesNb() + 2 * aDisk.TrianglesNb()) ,
+ Graphic3d_ArrayFlags_VertexNormal);
+ aCyl.FillArray(aTris , gp_Trsf());
+ aDisk.FillArray(aTris , gp_Trsf());
+
+ gp_Trsf aDisk2Trsf;
+ aDisk2Trsf.SetTransformation(gp_Ax3(gp_Pnt(0.0 , 0.0 , aHeight) , -gp::DZ() , gp::DX()) , gp::XOY());
+ aDisk.FillArray(aTris , aDisk2Trsf);
+
+ Handle(Graphic3d_Group) aGroupTris = thePrs->NewGroup();
+ aGroupTris->SetGroupPrimitivesAspect(myDrawer->ShadingAspect()->Aspect());
+ aGroupTris->AddPrimitiveArray(aTris);
+ aGroupTris->SetClosed(true);
+
+ Handle(Graphic3d_ArrayOfSegments) aSegs = new Graphic3d_ArrayOfSegments(4 , 4 * 2 , Graphic3d_CappingFlags_None);
+ aSegs->AddVertex(gp_Pnt(0.0 , -aRadius , 0.0));
+ aSegs->AddVertex(gp_Pnt(0.0 , -aRadius , aHeight));
+ aSegs->AddVertex(gp_Pnt(0.0 , aRadius , aHeight));
+ aSegs->AddVertex(gp_Pnt(0.0 , aRadius , 0.0));
+ aSegs->AddEdges(1 , 2);
+ aSegs->AddEdges(2 , 3);
+ aSegs->AddEdges(3 , 4);
+ aSegs->AddEdges(4 , 1);
+ Handle(Graphic3d_Group) aGroupSegs = thePrs->NewGroup();
+ aGroupSegs->SetGroupPrimitivesAspect(myDrawer->WireAspect()->Aspect());
+ aGroupSegs->AddPrimitiveArray(aSegs);
+ }
+ else if (theMode == MyDispMode_Highlight)
+ {
+ Bnd_Box aBox;
+ BRepBndLib::Add(aShape , aBox);
+ Prs3d_BndBox::Add(thePrs , aBox , myDrawer);
+ }
+}
+
+MAisObject4::MAisObject4(const TopoDS_Shape& shap) :
+ aShape(shap)
+{
+ SetDisplayMode(MyDispMode_Main);
+ SetHilightMode(MyDispMode_Highlight);
+}
+
+void MAisObject4::Compute(const Handle(PrsMgr_PresentationManager)& thePrsMgr ,
+ const Handle(Prs3d_Presentation)& thePrs ,
+ const Standard_Integer theMode)
+{
+ const double aRadius = 100.0 , aHeight = 100.0;
+ if (theMode == MyDispMode_Main)
+ {
+ Prs3d_ToolCylinder aCyl(aRadius , aRadius , aHeight , 25 , 25);
+ Prs3d_ToolDisk aDisk(0.0 , aRadius , 25 , 1);
+ Handle(Graphic3d_ArrayOfTriangles) aTris =
+ new Graphic3d_ArrayOfTriangles(aCyl.VerticesNb() + 2 * aDisk.VerticesNb() ,
+ 3 * (aCyl.TrianglesNb() + 2 * aDisk.TrianglesNb()) ,
+ Graphic3d_ArrayFlags_VertexNormal);
+ aCyl.FillArray(aTris , gp_Trsf());
+ aDisk.FillArray(aTris , gp_Trsf());
+
+ gp_Trsf aDisk2Trsf;
+ aDisk2Trsf.SetTransformation(gp_Ax3(gp_Pnt(0.0 , 0.0 , aHeight) , -gp::DZ() , gp::DX()) , gp::XOY());
+ aDisk.FillArray(aTris , aDisk2Trsf);
+
+ Handle(Graphic3d_Group) aGroupTris = thePrs->NewGroup();
+ aGroupTris->SetGroupPrimitivesAspect(myDrawer->ShadingAspect()->Aspect());
+ aGroupTris->AddPrimitiveArray(aTris);
+ aGroupTris->SetClosed(true);
+
+ Handle(Graphic3d_ArrayOfSegments) aSegs = new Graphic3d_ArrayOfSegments(4 , 4 * 2 , Graphic3d_CappingFlags_None);
+ aSegs->AddVertex(gp_Pnt(0.0 , -aRadius , 0.0));
+ aSegs->AddVertex(gp_Pnt(0.0 , -aRadius , aHeight));
+ aSegs->AddVertex(gp_Pnt(0.0 , aRadius , aHeight));
+ aSegs->AddVertex(gp_Pnt(0.0 , aRadius , 0.0));
+ aSegs->AddEdges(1 , 2);
+ aSegs->AddEdges(2 , 3);
+ aSegs->AddEdges(3 , 4);
+ aSegs->AddEdges(4 , 1);
+ Handle(Graphic3d_Group) aGroupSegs = thePrs->NewGroup();
+ aGroupSegs->SetGroupPrimitivesAspect(myDrawer->WireAspect()->Aspect());
+ aGroupSegs->AddPrimitiveArray(aSegs);
+ }
+ else if (theMode == MyDispMode_Highlight)
+ {
+ Bnd_Box aBox;
+ BRepBndLib::Add(aShape , aBox);
+ Prs3d_BndBox::Add(thePrs , aBox , myDrawer);
+ }
+}
+
+void MAisObject4::ComputeSelection(const Handle(SelectMgr_Selection)& theSel , const Standard_Integer theMode)
+{
+ if (theMode != 0) {
+ return;
+ }
+ Bnd_Box aBox;
+ BRepBndLib::Add(aShape , aBox);
+ Handle(SelectMgr_EntityOwner) anOwner = new SelectMgr_EntityOwner(this);
+ Handle(Select3D_SensitiveBox) aSensBox = new Select3D_SensitiveBox(anOwner , aBox);
+ theSel->Add(aSensBox);
+
+ //Standard_Real aDefl = StdPrs_ToolTriangulatedShape::GetDeflection (aShape,myDrawer);
+ //StdSelect_BRepSelectionTool::Load (theSel,this,aShape,TopAbs_SHAPE,aDefl,
+ // myDrawer->DeviationAngle(),
+ // myDrawer->IsAutoTriangulation());
+
+ //const double aRadius = 100.0 , aHeight = 100.0;
+ //Handle(SelectMgr_EntityOwner) anOwner = new SelectMgr_EntityOwner(this);
+ //Handle(Graphic3d_ArrayOfTriangles) aTris =
+ // Prs3d_ToolCylinder::Create(aRadius , aRadius , aHeight , 25 , 25 , gp_Trsf());
+ //Handle(Select3D_SensitivePrimitiveArray) aSensTri =
+ // new Select3D_SensitivePrimitiveArray(anOwner);
+ //aSensTri->InitTriangulation(aTris->Attributes() , aTris->Indices() ,
+ // TopLoc_Location());
+ //theSel->Add(aSensTri);
+}
+
+MAisObject5::MAisObject5(const TopoDS_Shape& shap) :
+ aShape(shap)
+{
+ myDrawer->SetupOwnShadingAspect();
+ myDrawer->ShadingAspect()->SetMaterial(Graphic3d_NameOfMaterial_Silver);
+ myDrawer->SetWireAspect(new Prs3d_LineAspect(Quantity_NOC_GREEN , Aspect_TOL_SOLID , 2.0));
+}
+
+void MAisObject5::Compute(const Handle(PrsMgr_PresentationManager)& thePrsMgr ,
+ const Handle(Prs3d_Presentation)& thePrs ,
+ const Standard_Integer theMode)
+{
+ const double aRadius = 100.0 , aHeight = 100.0;
+ if (theMode == MyDispMode_Main)
+ {
+ Prs3d_ToolCylinder aCyl(aRadius , aRadius , aHeight , 25 , 25);
+ Prs3d_ToolDisk aDisk(0.0 , aRadius , 25 , 1);
+ Handle(Graphic3d_ArrayOfTriangles) aTris =
+ new Graphic3d_ArrayOfTriangles(aCyl.VerticesNb() + 2 * aDisk.VerticesNb() ,
+ 3 * (aCyl.TrianglesNb() + 2 * aDisk.TrianglesNb()) ,
+ Graphic3d_ArrayFlags_VertexNormal);
+ aCyl.FillArray(aTris , gp_Trsf());
+ aDisk.FillArray(aTris , gp_Trsf());
+
+ gp_Trsf aDisk2Trsf;
+ aDisk2Trsf.SetTransformation(gp_Ax3(gp_Pnt(0.0 , 0.0 , aHeight) , -gp::DZ() , gp::DX()) , gp::XOY());
+ aDisk.FillArray(aTris , aDisk2Trsf);
+
+ Handle(Graphic3d_Group) aGroupTris = thePrs->NewGroup();
+ aGroupTris->SetGroupPrimitivesAspect(myDrawer->ShadingAspect()->Aspect());
+ aGroupTris->AddPrimitiveArray(aTris);
+ aGroupTris->SetClosed(true);
+
+ Handle(Graphic3d_ArrayOfSegments) aSegs = new Graphic3d_ArrayOfSegments(4 , 4 * 2 , Graphic3d_CappingFlags_None);
+ aSegs->AddVertex(gp_Pnt(0.0 , -aRadius , 0.0));
+ aSegs->AddVertex(gp_Pnt(0.0 , -aRadius , aHeight));
+ aSegs->AddVertex(gp_Pnt(0.0 , aRadius , aHeight));
+ aSegs->AddVertex(gp_Pnt(0.0 , aRadius , 0.0));
+ aSegs->AddEdges(1 , 2);
+ aSegs->AddEdges(2 , 3);
+ aSegs->AddEdges(3 , 4);
+ aSegs->AddEdges(4 , 1);
+ Handle(Graphic3d_Group) aGroupSegs = thePrs->NewGroup();
+ aGroupSegs->SetGroupPrimitivesAspect(myDrawer->WireAspect()->Aspect());
+ aGroupSegs->AddPrimitiveArray(aSegs);
+ }
+ else if (theMode == MyDispMode_Highlight)
+ {
+ Bnd_Box aBox;
+ BRepBndLib::Add(aShape , aBox);
+ Prs3d_BndBox::Add(thePrs , aBox , myDrawer);
+ }
+}
+
+void MAisObject5::ComputeSelection(const Handle(SelectMgr_Selection)& theSel , const Standard_Integer theMode)
+{
+ if (theMode != 0) {
+ return;
+ }
+ const double aRadius = 100.0 , aHeight = 100.0;
+ Handle(MAisOwner5) anOwner = new MAisOwner5(this);
+ Handle(Graphic3d_ArrayOfTriangles) aTris =
+ Prs3d_ToolCylinder::Create(aRadius , aRadius , aHeight , 25 , 25 , gp_Trsf());
+ Handle(Select3D_SensitivePrimitiveArray) aSensTri =
+ new Select3D_SensitivePrimitiveArray(anOwner);
+ aSensTri->InitTriangulation(aTris->Attributes() , aTris->Indices() ,
+ TopLoc_Location());
+ theSel->Add(aSensTri);
+}
+
+MAisObject6::MAisObject6(const TopoDS_Shape& shap) :
+ aShape(shap)
+{
+ myDrawer->SetupOwnShadingAspect();
+ myDrawer->ShadingAspect()->SetMaterial(Graphic3d_NameOfMaterial_Silver);
+ myDrawer->SetWireAspect(new Prs3d_LineAspect(Quantity_NOC_GREEN , Aspect_TOL_SOLID , 2.0));
+}
+
+void MAisObject6::Compute(const Handle(PrsMgr_PresentationManager)& thePrsMgr ,
+ const Handle(Prs3d_Presentation)& thePrs ,
+ const Standard_Integer theMode)
+{
+ const double aRadius = 100.0 , aHeight = 100.0;
+ if (theMode == MyDispMode_Main)
+ {
+ Prs3d_ToolCylinder aCyl(aRadius , aRadius , aHeight , 25 , 25);
+ Prs3d_ToolDisk aDisk(0.0 , aRadius , 25 , 1);
+ Handle(Graphic3d_ArrayOfTriangles) aTris =
+ new Graphic3d_ArrayOfTriangles(aCyl.VerticesNb() + 2 * aDisk.VerticesNb() ,
+ 3 * (aCyl.TrianglesNb() + 2 * aDisk.TrianglesNb()) ,
+ Graphic3d_ArrayFlags_VertexNormal);
+ aCyl.FillArray(aTris , gp_Trsf());
+ aDisk.FillArray(aTris , gp_Trsf());
+
+ gp_Trsf aDisk2Trsf;
+ aDisk2Trsf.SetTransformation(gp_Ax3(gp_Pnt(0.0 , 0.0 , aHeight) , -gp::DZ() , gp::DX()) , gp::XOY());
+ aDisk.FillArray(aTris , aDisk2Trsf);
+
+ Handle(Graphic3d_Group) aGroupTris = thePrs->NewGroup();
+ aGroupTris->SetGroupPrimitivesAspect(myDrawer->ShadingAspect()->Aspect());
+ aGroupTris->AddPrimitiveArray(aTris);
+ aGroupTris->SetClosed(true);
+
+ Handle(Graphic3d_ArrayOfSegments) aSegs = new Graphic3d_ArrayOfSegments(4 , 4 * 2 , Graphic3d_CappingFlags_None);
+ aSegs->AddVertex(gp_Pnt(0.0 , -aRadius , 0.0));
+ aSegs->AddVertex(gp_Pnt(0.0 , -aRadius , aHeight));
+ aSegs->AddVertex(gp_Pnt(0.0 , aRadius , aHeight));
+ aSegs->AddVertex(gp_Pnt(0.0 , aRadius , 0.0));
+ aSegs->AddEdges(1 , 2);
+ aSegs->AddEdges(2 , 3);
+ aSegs->AddEdges(3 , 4);
+ aSegs->AddEdges(4 , 1);
+ Handle(Graphic3d_Group) aGroupSegs = thePrs->NewGroup();
+ aGroupSegs->SetGroupPrimitivesAspect(myDrawer->WireAspect()->Aspect());
+ aGroupSegs->AddPrimitiveArray(aSegs);
+ }
+ else if (theMode == MyDispMode_Highlight)
+ {
+ Bnd_Box aBox;
+ BRepBndLib::Add(aShape , aBox);
+ Prs3d_BndBox::Add(thePrs , aBox , myDrawer);
+ }
+}
+
+void MAisObject6::ComputeSelection(const Handle(SelectMgr_Selection)& theSel , const Standard_Integer theMode)
+{
+ if (theMode != 0) {
+ return;
+ }
+ const double aRadius = 100.0 , aHeight = 100.0;
+ Handle(MAisOwner6) anOwner = new MAisOwner6(this);
+ Handle(Graphic3d_ArrayOfTriangles) aTris =
+ Prs3d_ToolCylinder::Create(aRadius , aRadius , aHeight , 25 , 25 , gp_Trsf());
+ Handle(Select3D_SensitivePrimitiveArray) aSensTri =
+ new Select3D_SensitivePrimitiveArray(anOwner);
+ aSensTri->InitTriangulation(aTris->Attributes() , aTris->Indices() ,
+ TopLoc_Location());
+ theSel->Add(aSensTri);
+}
+
+myPk_IShape::myPk_IShape(const TopoDS_Shape& theShape , PrsMgr_TypeOfPresentation3d theType) :
+ AIS_InteractiveObject(theType) ,
+ myShape(theShape)
+{
+ SetHilightMode(0);
+}
+
+void myPk_IShape::Compute(const Handle(PrsMgr_PresentationManager)& thePrsMgr ,
+ const Handle(Prs3d_Presentation)& thePrs ,
+ const Standard_Integer theMode)
+{
+ switch (theMode)
+ {
+ // algo for calculation of wireframe presentation
+ case 0: StdPrs_WFShape::Add(thePrs , myShape , myDrawer); return;
+ // algo for calculation of shading presentation
+ case 1: StdPrs_ShadedShape::Add(thePrs , myShape , myDrawer); return;
+ }
+}
+
+void myPk_IShape::computeHLR(const Handle(Graphic3d_Camera)& theProjector ,
+ const Handle(TopLoc_Datum3D)& theTrsf ,
+ const Handle(Prs3d_Presentation)& thePrs)
+{
+ // Hidden line mode calculation algorithm
+ StdPrs_HLRPolyShape hlr;
+ hlr.ComputeHLR(thePrs , myShape , myDrawer , theProjector);
+}
+
+void myPk_IShape::SetColor(const Quantity_Color& theColor)
+{
+ myDrawer->ShadingAspect()->SetColor(theColor);
+}
+
+MAisObject7::MAisObject7()
+{
+}
+
+void MAisObject7::Compute(const Handle(PrsMgr_PresentationManager)& thePrsMgr ,
+ const Handle(Prs3d_Presentation)& thePrs ,
+ const Standard_Integer theMode)
+{
+ if (theMode == MDispMode_WireFrame)
+ {
+ Handle(Graphic3d_ArrayOfTriangles) anArray = new Graphic3d_ArrayOfTriangles(4 , 6 , Graphic3d_ArrayFlags_None);
+ anArray->AddVertex(-1.0 , 0.0 , 0.0); // vertex 1
+ anArray->AddVertex(1.0 , 0.0 , 0.0); // vertex 2
+ anArray->AddVertex(0.0 , 1.0 , 0.0); // vertex 3
+ anArray->AddVertex(0.0 , -1.0 , 0.0); // vertex 4
+ // add edges to the array
+ anArray->AddEdges(1 , 2 , 3); // first triangle
+ anArray->AddEdges(1 , 2 , 4); // second triangle
+ // add the array to the structure
+ Handle(Graphic3d_Group) aGroup = thePrs->NewGroup();
+ aGroup->AddPrimitiveArray(anArray);
+ aGroup->SetGroupPrimitivesAspect(myDrawer->ShadingAspect()->Aspect());
+ }
+}
+
+void MAisObject7::ComputeSelection(const Handle(SelectMgr_Selection)& theSel , const Standard_Integer theMode)
+{
+}
+
+void MAisObject8::Compute(const Handle(PrsMgr_PresentationManager)& thePrsMgr ,
+ const Handle(Prs3d_Presentation)& thePrs , const Standard_Integer theMode)
+{
+ Handle(Graphic3d_Group) aGroup = thePrs->NewGroup();
+ // change the text aspect
+ Handle(Graphic3d_AspectText3d) aTextAspect = new Graphic3d_AspectText3d();
+ aTextAspect->SetTextZoomable(true);
+ //aTextAspect->SetTextAngle(45.0);
+ aTextAspect->SetFont("Consolas");
+ aGroup->SetPrimitivesAspect(aTextAspect);
+
+ // add a text primitive to the structure
+ Handle(Graphic3d_Text) aText = new Graphic3d_Text(16.0f);
+ aText->SetText("Text你好啊");
+ aText->SetPosition(gp_Pnt(1 , 1 , 1));
+ aGroup->AddText(aText);
+}
+
+MAisObject9::MAisObject9(TopoDS_Shape& shap) :
+ myShape(shap)
+{
+ myDrawer->SetFaceBoundaryDraw(true);// 要放开头,其余样式设置位置随便
+ myDrawer->SetFaceBoundaryAspect(new Prs3d_LineAspect(Quantity_NOC_BLACK , Aspect_TOL_SOLID , 1.0));
+}
+
+void MAisObject9::Compute(const Handle(PrsMgr_PresentationManager)& thePrsMgr ,
+ const Handle(Prs3d_Presentation)& thePrs ,
+ const Standard_Integer theMode)
+{
+ if (theMode == MDispMode_WireFrame)
+ {
+ StdPrs_ShadedShape::Add(thePrs , myShape , myDrawer);
+
+ Bnd_Box aBox;
+ BRepBndLib::Add(myShape , aBox);
+ Prs3d_BndBox::Add(thePrs , aBox , myDrawer);
+ }
+ else if (theMode == MDispMode_Shaded)
+ {
+ StdPrs_ShadedShape::Add(thePrs , myShape , myDrawer);
+
+ Bnd_OBB aBox;
+ BRepBndLib::AddOBB(myShape , aBox);
+ Prs3d_BndBox::Add(thePrs , aBox , myDrawer);
+ }
+}
+
+void MAisObject9::ComputeSelection(const Handle(SelectMgr_Selection)& theSel , const Standard_Integer theMode)
+{
+ Bnd_Box aBox;
+ BRepBndLib::Add(myShape , aBox);
+
+ Handle(SelectMgr_EntityOwner) anOwner = new SelectMgr_EntityOwner(this);
+ Handle(Select3D_SensitiveBox) aSensBox = new Select3D_SensitiveBox(anOwner , aBox);
+ theSel->Add(aSensBox);
+}
+
+void MAisOwner5::HilightWithColor(const Handle(PrsMgr_PresentationManager)& thePrsMgr ,
+ const Handle(Prs3d_Drawer)& theStyle ,
+ const Standard_Integer theMode)
+{
+ if (myPrs.IsNull())
+ {
+ myPrs = new Prs3d_Presentation(thePrsMgr->StructureManager());
+ MAisObject5* anObj = dynamic_cast (mySelectable);
+ anObj->Compute(thePrsMgr , myPrs , MAisObject5::MyDispMode_Highlight);
+ }
+ if (thePrsMgr->IsImmediateModeOn())
+ {
+ // 使用此方法获取的aShadow不能高亮显示Box
+ Handle(Prs3d_PresentationShadow) aShadow =
+ new Prs3d_PresentationShadow(thePrsMgr->StructureManager() , myPrs);
+ // 自动设置myPrs的高亮颜色
+ aShadow->SetZLayer(Graphic3d_ZLayerId_Top);
+ aShadow->Highlight(theStyle);
+
+ thePrsMgr->AddToImmediateList(aShadow);
+ }
+ else
+ {
+ myPrs->Display();
+ }
+}
+
+void MAisOwner5::Unhilight(const Handle(PrsMgr_PresentationManager)& thePrsMgr , const Standard_Integer theMode)
+{
+ if (!myPrs.IsNull()) {
+ myPrs->Erase();
+ }
+}
+
+void MAisOwner6::HilightWithColor(const Handle(PrsMgr_PresentationManager)& thePrsMgr ,
+ const Handle(Prs3d_Drawer)& theStyle ,
+ const Standard_Integer theMode)
+{
+ MAisObject6* anObj = dynamic_cast(mySelectable);
+ if (thePrsMgr->IsImmediateModeOn())
+ {
+ // 文档有误, 类型为StdSelect_ViewerSelector3d
+ Handle(StdSelect_ViewerSelector3d) aSelector = anObj->InteractiveContext()->MainSelector();
+ SelectMgr_SortCriterion aPickPnt;
+ for (int aPickIter = 1; aPickIter <= aSelector->NbPicked(); ++aPickIter)
+ {
+ if (aSelector->Picked(aPickIter) == this)
+ {
+ aPickPnt = aSelector->PickedData(aPickIter);
+ break;
+ }
+ }
+
+ Handle(Prs3d_Presentation) aPrs = mySelectable->GetHilightPresentation(thePrsMgr);
+ aPrs->SetZLayer(Graphic3d_ZLayerId_Top);
+ aPrs->Clear();
+ // 文档有误,变量名为aGroupPnt
+ Handle(Graphic3d_Group) aGroupPnt = aPrs->NewGroup();
+ aGroupPnt->SetGroupPrimitivesAspect(theStyle->ArrowAspect()->Aspect());
+ gp_Trsf aTrsfInv = mySelectable->LocalTransformation().Inverted();
+ gp_Dir aNorm(aPickPnt.Normal.x() , aPickPnt.Normal.y() , aPickPnt.Normal.z());
+ Handle(Graphic3d_ArrayOfTriangles) aTris = Prs3d_Arrow::DrawShaded(
+ gp_Ax1(aPickPnt.Point , aNorm).Transformed(aTrsfInv) ,
+ 1.0 , 15.0 ,
+ 3.0 , 4.0 , 10);
+ aGroupPnt->AddPrimitiveArray(aTris);
+ thePrsMgr->AddToImmediateList(aPrs);
+ }
+}
+
+void MAisOwner6::Unhilight(const Handle(PrsMgr_PresentationManager)& thePrsMgr , const Standard_Integer theMode)
+{
+ if (!myPrs.IsNull()) {
+ myPrs->Erase();
+ }
+}
\ No newline at end of file
diff --git a/src/MAISObj.h b/src/MAISObj.h
new file mode 100644
index 0000000..c1c887a
--- /dev/null
+++ b/src/MAISObj.h
@@ -0,0 +1,677 @@
+#pragma once
+
+#include "MShape.h"
+
+#include "AIS_InteractiveObject.hxx"
+#include "AIS_InteractiveContext.hxx"
+#include "AIS_Point.hxx"
+#include "AIS_Axis.hxx"
+#include "AIS_Line.hxx"
+#include "AIS_Circle.hxx"
+#include "AIS_Plane.hxx"
+#include "AIS_PlaneTrihedron.hxx"
+#include "AIS_PointCloud.hxx"
+
+#include "PrsDim_ParallelRelation.hxx"
+#include "PrsDim_PerpendicularRelation.hxx"
+#include "PrsDim_LengthDimension.hxx"
+
+#include "StdPrs_ShadedShape.hxx"
+#include "StdPrs_WFShape.hxx"
+#include "StdPrs_ToolTriangulatedShape.hxx"
+#include "StdPrs_HLRPolyShape.hxx"
+
+#include "Prs3d_ShadingAspect.hxx"
+#include "Prs3d_ArrowAspect.hxx"
+#include "Prs3d_Arrow.hxx"
+#include "Prs3d_BndBox.hxx"
+#include "Prs3d_ToolCylinder.hxx"
+#include "Prs3d_ToolDisk.hxx"
+#include "Prs3d_PresentationShadow.hxx"
+
+#include "Graphic3d_ArrayOfPoints.hxx"
+#include "Graphic3d_Text.hxx"
+
+#include "SelectMgr_EntityOwner.hxx"
+#include "Select3D_SensitivePrimitiveArray.hxx"
+#include "Select3D_SensitivePoint.hxx"
+#include "Select3D_SensitiveSegment.hxx"
+#include "Select3D_SensitiveFace.hxx"
+#include "Select3D_SensitiveBox.hxx"
+#include "StdSelect_FaceFilter.hxx"
+#include "StdSelect_ViewerSelector3d.hxx"
+#include "StdSelect_BRepSelectionTool.hxx"
+
+#include "Image_AlienPixMap.hxx"
+
+// 添加边界线条
+class MAisDemo : public AIS_InteractiveObject
+{
+ DEFINE_STANDARD_RTTI_INLINE(MAisDemo , AIS_InteractiveObject)
+public:
+ enum MDispMode {
+ MDispMode_WireFrame ,
+ MDispMode_Shaded
+ };
+
+ MAisDemo(const TopoDS_Shape& shap, bool indexVisible = false);
+
+ virtual void Compute(const Handle(PrsMgr_PresentationManager)& thePrsMgr ,
+ const Handle(Prs3d_Presentation)& thePrs ,
+ const Standard_Integer theMode) override;
+
+ virtual void ComputeSelection(const Handle(SelectMgr_Selection)& theSel ,
+ const Standard_Integer theMode) override;
+
+ virtual bool AcceptDisplayMode(const Standard_Integer theMode) const override
+ {
+ return theMode == MDispMode_WireFrame || theMode == MDispMode_Shaded;
+ }
+
+ virtual void SetColor(const Quantity_Color& theColor) override;
+
+ TopoDS_Shape Shape() const
+ {
+ return myShape;
+ }
+
+ void setShape(TopoDS_Shape& theShape)
+ {
+ myShape = theShape;
+ }
+
+ void setFaceIndex(const Handle(Prs3d_Presentation)& thePrs);
+
+ static TopAbs_ShapeEnum SelectionType(const Standard_Integer theSelMode)
+ {
+ switch (theSelMode)
+ {
+ case 1:
+ return TopAbs_VERTEX;
+ case 2:
+ return TopAbs_EDGE;
+ case 3:
+ return TopAbs_WIRE;
+ case 4:
+ return TopAbs_FACE;
+ case 5:
+ return TopAbs_SHELL;
+ case 6:
+ return TopAbs_SOLID;
+ case 7:
+ return TopAbs_COMPSOLID;
+ case 8:
+ return TopAbs_COMPOUND;
+ case 0:
+ return TopAbs_SHAPE;
+ }
+ return TopAbs_SHAPE;
+ }
+
+ static Standard_Integer SelectionMode(const TopAbs_ShapeEnum theShapeType)
+ {
+ switch (theShapeType)
+ {
+ case TopAbs_VERTEX:
+ return 1;
+ case TopAbs_EDGE:
+ return 2;
+ case TopAbs_WIRE:
+ return 3;
+ case TopAbs_FACE:
+ return 4;
+ case TopAbs_SHELL:
+ return 5;
+ case TopAbs_SOLID:
+ return 6;
+ case TopAbs_COMPSOLID:
+ return 7;
+ case TopAbs_COMPOUND:
+ return 8;
+ case TopAbs_SHAPE:
+ return 0;
+ }
+ return 0;
+ }
+
+private:
+ TopoDS_Shape myShape;
+ bool faceIndexIsVisible;
+};
+
+// None
+class MAisObject : public AIS_InteractiveObject
+{
+ DEFINE_STANDARD_RTTI_INLINE(MAisObject , AIS_InteractiveObject)
+public:
+ enum MDispMode {
+ MDispMode_WireFrame ,
+ MDispMode_Shaded ,
+ MDispMode_Shaded_HighLight ,
+ MDispMode_Shaded_HighLightDynamic ,
+ MDispMode_WireFrame_HighLight
+ };
+
+ MAisObject(std::shared_ptr< MSLinearRect> shap);
+
+ virtual void Compute(const Handle(PrsMgr_PresentationManager)& thePrsMgr ,
+ const Handle(Prs3d_Presentation)& thePrs ,
+ const Standard_Integer theMode) override;
+
+ virtual void ComputeSelection(const Handle(SelectMgr_Selection)& theSel ,
+ const Standard_Integer theMode) override;
+
+ virtual bool AcceptDisplayMode(const Standard_Integer theMode) const override
+ {
+ return theMode == MDispMode_WireFrame || theMode == MDispMode_Shaded;
+ }
+
+ virtual void SetColor(const Quantity_Color& theColor) override;
+
+ std::shared_ptr< MSLinearRect> Shape() const {
+ return myShape;
+ }
+
+ void setShape(std::shared_ptr< MSLinearRect> theShape)
+ {
+ myShape = theShape;
+ }
+
+private:
+ std::shared_ptr< MSLinearRect> myShape;
+ Handle(Prs3d_Drawer) myShadeStyle;
+ Handle(Prs3d_Drawer) myShadeStyleHighLight;
+};
+
+class MAisOwner : public SelectMgr_EntityOwner
+{
+ DEFINE_STANDARD_RTTI_INLINE(MAisOwner , SelectMgr_EntityOwner)
+public:
+ MAisOwner(const Handle(AIS_InteractiveObject)& theObj , int thePriority = 0)
+ : SelectMgr_EntityOwner(theObj , thePriority) {
+ }
+
+ virtual void HilightWithColor(const Handle(PrsMgr_PresentationManager)& thePrsMgr ,
+ const Handle(Prs3d_Drawer)& theStyle ,
+ const Standard_Integer theMode) override;
+ // 选择高亮对应的erase
+ virtual void Unhilight(const Handle(PrsMgr_PresentationManager)& thePrsMgr ,
+ const Standard_Integer theMode) override;
+
+protected:
+ Handle(Prs3d_Presentation) myPrsWire;
+ Handle(Prs3d_Presentation) myPrs;
+};
+
+class MCaptureOwnerEndPonit : public SelectMgr_EntityOwner
+{
+ DEFINE_STANDARD_RTTI_INLINE(MCaptureOwnerEndPonit , SelectMgr_EntityOwner)
+public:
+ MCaptureOwnerEndPonit(gp_Pnt& pnt , const Handle(AIS_InteractiveObject)& theObj , int thePriority = 0);
+
+
+ virtual void HilightWithColor(const Handle(PrsMgr_PresentationManager)& thePrsMgr ,
+ const Handle(Prs3d_Drawer)& theStyle ,
+ const Standard_Integer theMode) override;
+
+ virtual void Unhilight(const Handle(PrsMgr_PresentationManager)& thePrsMgr ,
+ const Standard_Integer theMode) override;
+
+ gp_Pnt getPonit() const { return myPoint; }
+
+protected:
+ Handle(Prs3d_Presentation) myPrs;
+ Handle(Prs3d_Presentation) myPrsDynamic;
+
+ Handle(Prs3d_Drawer) myStyle;
+
+ gp_Pnt myPoint;
+};
+
+class MCaptureOwnerMidPoint : public SelectMgr_EntityOwner
+{
+ DEFINE_STANDARD_RTTI_INLINE(MCaptureOwnerMidPoint , SelectMgr_EntityOwner)
+public:
+ MCaptureOwnerMidPoint(gp_Pnt& pnt , const Handle(AIS_InteractiveObject)& theObj , int thePriority = 0);
+
+ virtual void HilightWithColor(const Handle(PrsMgr_PresentationManager)& thePrsMgr ,
+ const Handle(Prs3d_Drawer)& theStyle ,
+ const Standard_Integer theMode) override;
+
+ virtual void Unhilight(const Handle(PrsMgr_PresentationManager)& thePrsMgr ,
+ const Standard_Integer theMode) override;
+
+ gp_Pnt getPonit() const { return myPoint; }
+
+protected:
+ Handle(Prs3d_Presentation) myPrs;
+ Handle(Prs3d_Presentation) myPrsDynamic;
+ Handle(Graphic3d_MarkerImage) img;
+ Handle(Prs3d_Drawer) myStyle;
+ gp_Pnt myPoint;
+};
+
+class MCaptureOwnerEdge : public SelectMgr_EntityOwner
+{
+ DEFINE_STANDARD_RTTI_INLINE(MCaptureOwnerEdge , SelectMgr_EntityOwner)
+public:
+ MCaptureOwnerEdge(TopoDS_Wire& edge , const Handle(AIS_InteractiveObject)& theObj , int thePriority = 0);
+
+ virtual void HilightWithColor(const Handle(PrsMgr_PresentationManager)& thePrsMgr ,
+ const Handle(Prs3d_Drawer)& theStyle ,
+ const Standard_Integer theMode) override;
+
+ virtual void Unhilight(const Handle(PrsMgr_PresentationManager)& thePrsMgr ,
+ const Standard_Integer theMode) override;
+protected:
+ Handle(Prs3d_Presentation) myPrs;
+ Handle(Prs3d_Drawer) myStyle;
+ TopoDS_Wire myEdge;
+};
+
+// Presentation builders
+class MAisObject0 : public AIS_InteractiveObject
+{
+ DEFINE_STANDARD_RTTI_INLINE(MAisObject0 , AIS_InteractiveObject)
+public:
+ enum MyDispMode {
+ MyDispMode_Main = 0 , MyDispMode_Highlight = 1
+ };
+
+ MAisObject0(const TopoDS_Shape& shap);
+
+ virtual void Compute(const Handle(PrsMgr_PresentationManager)& thePrsMgr ,
+ const Handle(Prs3d_Presentation)& thePrs ,
+ const Standard_Integer theMode) override;
+
+ virtual void ComputeSelection(const Handle(SelectMgr_Selection)& theSel ,
+ const Standard_Integer theMode) override {
+ }
+
+ virtual bool AcceptDisplayMode(const Standard_Integer theMode) const override
+ {
+ return theMode == 0 || theMode == 1;
+ }
+
+ const TopoDS_Shape& Shape() const {
+ return aShape;
+ }
+
+ void SetShape(const TopoDS_Shape& theShape)
+ {
+ aShape = theShape;
+ }
+private:
+ TopoDS_Shape aShape;
+};
+
+// Primitive arrays
+class MAisObject1 : public AIS_InteractiveObject
+{
+ DEFINE_STANDARD_RTTI_INLINE(MAisObject1 , AIS_InteractiveObject)
+public:
+ enum MyDispMode {
+ MyDispMode_Main = 0 , MyDispMode_Highlight = 1
+ };
+
+ MAisObject1(const TopoDS_Shape& shap);
+
+ virtual void Compute(const Handle(PrsMgr_PresentationManager)& thePrsMgr ,
+ const Handle(Prs3d_Presentation)& thePrs ,
+ const Standard_Integer theMode) override;
+
+ virtual void ComputeSelection(const Handle(SelectMgr_Selection)& theSel ,
+ const Standard_Integer theMode) override {
+ }
+
+ virtual bool AcceptDisplayMode(const Standard_Integer theMode) const override
+ {
+ return theMode == 0 || theMode == 1;
+ }
+
+ const TopoDS_Shape& Shape() const {
+ return aShape;
+ }
+
+ void SetShape(const TopoDS_Shape& theShape)
+ {
+ aShape = theShape;
+ }
+private:
+ TopoDS_Shape aShape;
+};
+
+// Primitive aspects
+class MAisObject2 : public AIS_InteractiveObject
+{
+ DEFINE_STANDARD_RTTI_INLINE(MAisObject2 , AIS_InteractiveObject)
+public:
+ enum MyDispMode {
+ MyDispMode_Main = 0 , MyDispMode_Highlight = 1
+ };
+
+ MAisObject2(const TopoDS_Shape& shap);
+
+ virtual void Compute(const Handle(PrsMgr_PresentationManager)& thePrsMgr ,
+ const Handle(Prs3d_Presentation)& thePrs ,
+ const Standard_Integer theMode) override;
+
+ virtual void ComputeSelection(const Handle(SelectMgr_Selection)& theSel ,
+ const Standard_Integer theMode) override {
+ }
+
+ virtual bool AcceptDisplayMode(const Standard_Integer theMode) const override
+ {
+ return theMode == 0 || theMode == 1;
+ }
+
+ const TopoDS_Shape& Shape() const {
+ return aShape;
+ }
+
+ void SetShape(const TopoDS_Shape& theShape)
+ {
+ aShape = theShape;
+ }
+private:
+ TopoDS_Shape aShape;
+};
+
+//Quadric builders
+class MAisObject3 : public AIS_InteractiveObject
+{
+ DEFINE_STANDARD_RTTI_INLINE(MAisObject3 , AIS_InteractiveObject)
+public:
+ enum MyDispMode {
+ MyDispMode_Main = 0 , MyDispMode_Highlight = 1
+ };
+
+ MAisObject3(const TopoDS_Shape& shap);
+
+ virtual void Compute(const Handle(PrsMgr_PresentationManager)& thePrsMgr ,
+ const Handle(Prs3d_Presentation)& thePrs ,
+ const Standard_Integer theMode) override;
+
+ virtual void ComputeSelection(const Handle(SelectMgr_Selection)& theSel ,
+ const Standard_Integer theMode) override {
+ }
+
+ virtual bool AcceptDisplayMode(const Standard_Integer theMode) const override
+ {
+ return theMode == 0 || theMode == 1;
+ }
+
+ const TopoDS_Shape& Shape() const {
+ return aShape;
+ }
+
+ void SetShape(const TopoDS_Shape& theShape)
+ {
+ aShape = theShape;
+ }
+private:
+ TopoDS_Shape aShape;
+};
+
+// Computing selection
+class MAisObject4 : public AIS_InteractiveObject
+{
+ DEFINE_STANDARD_RTTI_INLINE(MAisObject4 , AIS_InteractiveObject)
+public:
+ enum MyDispMode {
+ MyDispMode_Main = 0 , MyDispMode_Highlight = 1
+ };
+
+ MAisObject4(const TopoDS_Shape& shap);
+
+ virtual void Compute(const Handle(PrsMgr_PresentationManager)& thePrsMgr ,
+ const Handle(Prs3d_Presentation)& thePrs ,
+ const Standard_Integer theMode) override;
+
+ virtual void ComputeSelection(const Handle(SelectMgr_Selection)& theSel ,
+ const Standard_Integer theMode) override;
+
+ virtual bool AcceptDisplayMode(const Standard_Integer theMode) const override
+ {
+ return theMode == 0 || theMode == 1;
+ }
+
+ const TopoDS_Shape& Shape() const {
+ return aShape;
+ }
+
+ void SetShape(const TopoDS_Shape& theShape)
+ {
+ aShape = theShape;
+ }
+private:
+ TopoDS_Shape aShape;
+};
+
+// HighlightingSelectionOwner
+class MAisObject5 : public AIS_InteractiveObject
+{
+ DEFINE_STANDARD_RTTI_INLINE(MAisObject5 , AIS_InteractiveObject)
+public:
+ enum MyDispMode {
+ MyDispMode_Main = 0 , MyDispMode_Highlight = 1
+ };
+
+ MAisObject5(const TopoDS_Shape& shap);
+
+ virtual void Compute(const Handle(PrsMgr_PresentationManager)& thePrsMgr ,
+ const Handle(Prs3d_Presentation)& thePrs ,
+ const Standard_Integer theMode) override;
+
+ virtual void ComputeSelection(const Handle(SelectMgr_Selection)& theSel ,
+ const Standard_Integer theMode) override;
+
+ virtual bool AcceptDisplayMode(const Standard_Integer theMode) const override
+ {
+ return theMode == 0 || theMode == 1;
+ }
+
+ const TopoDS_Shape& Shape() const {
+ return aShape;
+ }
+
+ void SetShape(const TopoDS_Shape& theShape)
+ {
+ aShape = theShape;
+ }
+private:
+ TopoDS_Shape aShape;
+};
+
+// add arrow
+class MAisObject6 : public AIS_InteractiveObject
+{
+ DEFINE_STANDARD_RTTI_INLINE(MAisObject6 , AIS_InteractiveObject)
+public:
+ enum MyDispMode {
+ MyDispMode_Main = 0 , MyDispMode_Highlight = 1
+ };
+
+ MAisObject6(const TopoDS_Shape& shap);
+
+ virtual void Compute(const Handle(PrsMgr_PresentationManager)& thePrsMgr ,
+ const Handle(Prs3d_Presentation)& thePrs ,
+ const Standard_Integer theMode) override;
+
+ virtual void ComputeSelection(const Handle(SelectMgr_Selection)& theSel ,
+ const Standard_Integer theMode) override;
+
+ virtual bool AcceptDisplayMode(const Standard_Integer theMode) const override
+ {
+ return theMode == 0 || theMode == 1;
+ }
+
+ const TopoDS_Shape& Shape() const {
+ return aShape;
+ }
+
+ void SetShape(const TopoDS_Shape& theShape)
+ {
+ aShape = theShape;
+ }
+private:
+ TopoDS_Shape aShape;
+};
+
+// HLR
+class myPk_IShape : public AIS_InteractiveObject
+{
+ DEFINE_STANDARD_RTTI_INLINE(myPk_IShape , AIS_InteractiveObject)
+public:
+
+ myPk_IShape(const TopoDS_Shape& theShape , PrsMgr_TypeOfPresentation3d theType);
+
+ virtual void Compute(const Handle(PrsMgr_PresentationManager)& thePrsMgr ,
+ const Handle(Prs3d_Presentation)& thePrs ,
+ const Standard_Integer theMode) override;
+
+ virtual void computeHLR(const Handle(Graphic3d_Camera)& theProjector ,
+ const Handle(TopLoc_Datum3D)& theTrsf ,
+ const Handle(Prs3d_Presentation)& thePrs) override;
+
+ virtual void ComputeSelection(const Handle(SelectMgr_Selection)& theSel ,
+ const Standard_Integer theMode) override {
+ }
+
+ virtual bool AcceptDisplayMode(const Standard_Integer theMode) const override
+ {
+ return theMode == 0 || theMode == 1;
+ }
+
+ virtual void SetColor(const Quantity_Color& theColor) override;
+
+private:
+ TopoDS_Shape myShape;
+};
+
+// Primitive arrays
+class MAisObject7 : public AIS_InteractiveObject
+{
+ DEFINE_STANDARD_RTTI_INLINE(MAisObject7 , AIS_InteractiveObject)
+public:
+ enum MDispMode {
+ MDispMode_WireFrame ,
+ MDispMode_Shaded
+ };
+
+ MAisObject7();
+
+ virtual void Compute(const Handle(PrsMgr_PresentationManager)& thePrsMgr ,
+ const Handle(Prs3d_Presentation)& thePrs ,
+ const Standard_Integer theMode) override;
+
+ virtual void ComputeSelection(const Handle(SelectMgr_Selection)& theSel ,
+ const Standard_Integer theMode) override;
+
+ virtual bool AcceptDisplayMode(const Standard_Integer theMode) const override
+ {
+ return theMode == MDispMode_WireFrame || theMode == MDispMode_Shaded;
+ }
+
+private:
+
+};
+
+// Text primitive
+class MAisObject8 : public AIS_InteractiveObject
+{
+ DEFINE_STANDARD_RTTI_INLINE(MAisObject8 , AIS_InteractiveObject)
+public:
+ enum MDispMode {
+ MDispMode_WireFrame ,
+ MDispMode_Shaded
+ };
+
+ MAisObject8() {};
+
+ virtual void Compute(const Handle(PrsMgr_PresentationManager)& thePrsMgr ,
+ const Handle(Prs3d_Presentation)& thePrs ,
+ const Standard_Integer theMode) override;
+
+ virtual void ComputeSelection(const Handle(SelectMgr_Selection)& theSel ,
+ const Standard_Integer theMode) override {
+ };
+
+ virtual bool AcceptDisplayMode(const Standard_Integer theMode) const override
+ {
+ return theMode == MDispMode_WireFrame || theMode == MDispMode_Shaded;
+ }
+
+private:
+
+};
+
+
+// Bounding boxes
+class MAisObject9 : public AIS_InteractiveObject
+{
+ DEFINE_STANDARD_RTTI_INLINE(MAisObject9 , AIS_InteractiveObject)
+public:
+ enum MDispMode {
+ MDispMode_WireFrame ,
+ MDispMode_Shaded
+ };
+
+ MAisObject9(TopoDS_Shape& shap);
+
+ virtual void Compute(const Handle(PrsMgr_PresentationManager)& thePrsMgr ,
+ const Handle(Prs3d_Presentation)& thePrs ,
+ const Standard_Integer theMode) override;
+
+ virtual void ComputeSelection(const Handle(SelectMgr_Selection)& theSel ,
+ const Standard_Integer theMode) override;
+
+ virtual bool AcceptDisplayMode(const Standard_Integer theMode) const override
+ {
+ return theMode == MDispMode_WireFrame || theMode == MDispMode_Shaded;
+ }
+
+private:
+ TopoDS_Shape myShape;
+};
+
+// HighlightingSelectionOwner
+class MAisOwner5 : public SelectMgr_EntityOwner
+{
+ DEFINE_STANDARD_RTTI_INLINE(MAisOwner5 , SelectMgr_EntityOwner)
+public:
+ MAisOwner5(const Handle(MAisObject5)& theObj , int thePriority = 0)
+ : SelectMgr_EntityOwner(theObj , thePriority) {
+ }
+
+ virtual void HilightWithColor(const Handle(PrsMgr_PresentationManager)& thePrsMgr ,
+ const Handle(Prs3d_Drawer)& theStyle ,
+ const Standard_Integer theMode) override;
+
+ virtual void Unhilight(const Handle(PrsMgr_PresentationManager)& thePrsMgr ,
+ const Standard_Integer theMode) override;
+protected:
+ Handle(Prs3d_Presentation) myPrs;
+};
+
+// add arrow
+class MAisOwner6 : public SelectMgr_EntityOwner
+{
+ DEFINE_STANDARD_RTTI_INLINE(MAisOwner6 , SelectMgr_EntityOwner)
+public:
+ MAisOwner6(const Handle(MAisObject6)& theObj , int thePriority = 0)
+ : SelectMgr_EntityOwner(theObj , thePriority) {
+ }
+
+ virtual void HilightWithColor(const Handle(PrsMgr_PresentationManager)& thePrsMgr ,
+ const Handle(Prs3d_Drawer)& theStyle ,
+ const Standard_Integer theMode) override;
+
+ virtual void Unhilight(const Handle(PrsMgr_PresentationManager)& thePrsMgr ,
+ const Standard_Integer theMode) override;
+ virtual bool IsForcedHilight() const override {
+ return true;
+ }
+protected:
+ Handle(Prs3d_Presentation) myPrs;
+};
diff --git a/src/MShape.cpp b/src/MShape.cpp
new file mode 100644
index 0000000..90aafb8
--- /dev/null
+++ b/src/MShape.cpp
@@ -0,0 +1,236 @@
+#include "MShape.h"
+
+std::ostream& operator<<(std::ostream& os , const gp_Pnt& pnt)
+{
+ os << pnt.X() << ", " << pnt.Y() << ", " << pnt.Z();
+ return os;
+}
+
+Handle(Geom_BSplineCurve) createBSplineCurve(std::vector& pnts, int mode)
+{
+ int pntSize = pnts.size();
+ Handle(TColgp_HArray1OfPnt) pntsArr = new TColgp_HArray1OfPnt(1 , pntSize);
+ for (int i = 0; i < pntSize; ++i)
+ {
+ TopoDS_Vertex aVertex = BRepBuilderAPI_MakeVertex(pnts[i]);
+ pntsArr->SetValue(i + 1 , pnts[i]);
+ }
+
+ Handle(Geom_BSplineCurve) curve;
+ if (mode == 0)
+ {
+ GeomAPI_Interpolate Interp(pntsArr , false , Precision::Confusion());
+ Interp.Perform();
+ curve = Interp.Curve();
+ }
+ else if (mode == 1)
+ {
+ GeomAPI_PointsToBSpline Approx(pntsArr->Array1());
+ curve = Approx.Curve();
+ }
+
+ return curve;
+}
+
+TopoDS_Shape correctionProfile(TopoDS_Shape& aProfile , gp_Pnt fromPnt , Handle(Geom_Curve) CPath , double toParam)
+{
+ TopoDS_Face aFace;
+ if (aProfile.ShapeType() == TopAbs_FACE)
+ {
+ aFace = TopoDS::Face(aProfile);
+ }
+ else if (aProfile.ShapeType() == TopAbs_WIRE)
+ {
+ aFace = BRepBuilderAPI_MakeFace(TopoDS::Wire(aProfile));
+ }
+
+ gp_Pnt toPoint;
+ gp_Vec derivative;
+ CPath->D1(toParam , toPoint , derivative);
+ //Handle(Geom_Surface) surface = BRep_Tool::Surface(aFace);
+ BRepAdaptor_Surface surface(aFace);
+ gp_Vec direc = surface.Plane().Axis().Direction();
+
+ gp_Trsf T;
+ T.SetTranslation(gp_Vec(fromPnt , gp_Pnt(0 , 0 , 0)));
+ BRepBuilderAPI_Transform theTrsf(aProfile , T);
+
+ gp_Quaternion quater(direc , derivative);
+ gp_Vec vecTranslate = gp_Vec(gp_Pnt(0 , 0 , 0) , toPoint);
+ gp_Trsf TRet;
+ TRet.SetTransformation(quater , vecTranslate);
+ BRepBuilderAPI_Transform theTrsfRet(theTrsf.Shape() , TRet);
+
+ return theTrsfRet.Shape();
+}
+
+TopoDS_Wire convertFaceToWire(const TopoDS_Shape& aShape)
+{
+ BRepBuilderAPI_MakeWire wireBuilder;
+ for (TopExp_Explorer anEdgeExp(aShape , TopAbs_EDGE); anEdgeExp.More(); anEdgeExp.Next())
+ {
+ const TopoDS_Edge& anEdge = TopoDS::Edge(anEdgeExp.Current());
+ wireBuilder.Add(anEdge);
+ }
+ return wireBuilder.Wire();
+}
+
+MSAbstract::MSAbstract(const QString& n) :
+ myName(n)
+{
+ myType = MSType::MSType_NONE;
+}
+
+gp_Pnt MSAbstract::transformPoint(gp_Pnt& p , gp_Vec vecTranslate)
+{
+ gp_Pnt ret;
+ gp_Trsf T;
+ T.SetTranslation(vecTranslate);
+ ret = p.Transformed(T);
+
+ return ret;
+}
+
+TopoDS_Shape MSAbstract::transformShape(TopoDS_Shape& aShape , gp_Quaternion quater , gp_Vec vecTranslate)
+{
+ gp_Trsf T;
+ T.SetTransformation(quater , vecTranslate);
+ BRepBuilderAPI_Transform theTrsf(T);
+ theTrsf.Perform(aShape);
+
+ return theTrsf.Shape();
+}
+
+MSLinearRect::MSLinearRect(const std::vector& points , double width , double height , const QString& n) :
+ MSAbstract(n) ,
+ myPoints(points) ,
+ myWidth(width) ,
+ myHeight(height)
+{
+ setType(MSType::MSType_LINEAR_RECT);
+ compute();
+}
+
+TopoDS_Shape MSLinearRect::createProfile()
+{
+ gp_Pnt aStart = myPoints[0];
+ gp_Pnt aEnd = myPoints[1];
+
+ gp_Vec vec = gp_Vec(aStart , aEnd);
+ gp_Vec vecX = vec.Crossed(gp_Vec(0 , 0 , 1));
+ gp_Ax3 ax3 = gp_Ax3(aStart , vec , vecX);
+ Handle(Geom_Surface) surf = new Geom_Plane(ax3);
+
+ gp_Pnt2d pnt2d1 = gp_Pnt2d(-myWidth / 2 , myHeight / 2);
+ gp_Pnt2d pnt2d2 = gp_Pnt2d(myWidth / 2 , myHeight / 2);
+ gp_Pnt2d pnt2d3 = gp_Pnt2d(myWidth / 2 , -myHeight / 2);
+ gp_Pnt2d pnt2d4 = gp_Pnt2d(-myWidth / 2 , -myHeight / 2);
+ Handle(Geom2d_Line) geom2dLin1 = GCE2d_MakeLine(pnt2d1 , pnt2d2).Value();
+ Handle(Geom2d_Line) geom2dLin2 = GCE2d_MakeLine(pnt2d2 , pnt2d3).Value();
+ Handle(Geom2d_Line) geom2dLin3 = GCE2d_MakeLine(pnt2d3 , pnt2d4).Value();
+ Handle(Geom2d_Line) geom2dLin4 = GCE2d_MakeLine(pnt2d4 , pnt2d1).Value();
+
+ BRepBuilderAPI_MakeWire MW;
+ MW.Add(BRepBuilderAPI_MakeEdge(geom2dLin1 , surf , 0 , myWidth));
+ MW.Add(BRepBuilderAPI_MakeEdge(geom2dLin2 , surf , 0 , myHeight));
+ MW.Add(BRepBuilderAPI_MakeEdge(geom2dLin3 , surf , 0 , myWidth));
+ MW.Add(BRepBuilderAPI_MakeEdge(geom2dLin4 , surf , 0 , myHeight));
+ TopoDS_Shape aProfile = MW;
+ BRepLib::BuildCurves3d(aProfile);
+
+ return aProfile;
+}
+
+void MSLinearRect::updateCompute(const std::vector& pointsNew)
+{
+ myPoints = pointsNew;
+ compute();
+}
+
+void MSLinearRect::compute()
+{
+ gp_Pnt aStart = myPoints[0];
+ gp_Pnt aEnd = myPoints[1];
+
+ TopoDS_Edge aEdgePath = BRepBuilderAPI_MakeEdge(aStart , aEnd);
+ myPath = BRepBuilderAPI_MakeWire(aEdgePath);
+ myProfile = createProfile();
+ myShape = BRepOffsetAPI_MakePipe(myPath , myProfile);
+}
+
+MSPipeFitting::MSPipeFitting(std::shared_ptr< MSLinearRect> l , std::shared_ptr< MSLinearRect> r , const QString& n) :
+ MSAbstract(n) ,
+ lhs(l) ,
+ rhs(r)
+{
+ std::vector pntsLhs = l->getPoints();
+ std::vector pntsRhs = r->getPoints();
+ myPoints = { pntsLhs[0] ,pntsLhs[1] ,pntsRhs[0], pntsRhs[1] };
+
+ setType(MSType::MSType_PIPEFITING);
+ compute();
+}
+
+TopoDS_Shape MSPipeFitting::createProfile()
+{
+ return TopoDS_Shape();
+}
+
+void MSPipeFitting::setAdjacent(const std::vector& pointsLhs , const std::vector& pointsRhs)
+{
+ lhs->updateCompute(pointsLhs);
+ rhs->updateCompute(pointsRhs);
+}
+
+void MSPipeFitting::restoreAdjacent()
+{
+ std::vector pntsLhs = {myPoints[0],myPoints[1] };
+ std::vector pntsRhs = { myPoints[2],myPoints[3] };
+ lhs->updateCompute(pntsLhs);
+ rhs->updateCompute(pntsRhs);
+}
+
+void MSPipeFitting::compute()
+{
+ gp_Pnt aFirst = myPoints[0];
+ gp_Pnt aSecond = myPoints[1];
+ gp_Pnt aThird = myPoints[2];
+ gp_Pnt aFourth = myPoints[3];
+
+ gp_Vec vecFirst = gp_Vec(aFirst , aSecond);
+ gp_Vec vecSecond = gp_Vec(aThird , aFourth);
+
+ double lhsWidth = lhs->getWidth();
+ double rhsWidth = rhs->getWidth();
+ double maxWidth = lhsWidth > rhsWidth ? lhsWidth : rhsWidth;
+ double length = maxWidth / 2;
+
+ double scalar = length / vecFirst.Magnitude();
+ gp_Vec tanslate = vecFirst * scalar;
+ gp_Pnt aSecondNew = transformPoint(aSecond , tanslate.Reversed());
+
+ double scalar1 = length / vecSecond.Magnitude();
+ gp_Vec tanslate1 = vecSecond * scalar1;
+ gp_Pnt aThirdNew = transformPoint(aThird , tanslate1);
+ setAdjacent({ aFirst ,aSecondNew } , { aThirdNew, aFourth });
+
+ Handle(TColgp_HArray1OfPnt) points = new TColgp_HArray1OfPnt(1 , 2);
+ points->SetValue(1 , aSecondNew);
+ points->SetValue(2 , aThirdNew);
+ GeomAPI_Interpolate interpolator(points , false , Precision::Confusion());
+ interpolator.Load(vecFirst , vecSecond);
+ interpolator.Perform();
+ Handle(Geom_BSplineCurve) geomPath = interpolator.Curve();
+ TopoDS_Edge aEdgePath = BRepBuilderAPI_MakeEdge(geomPath , geomPath->FirstParameter() , geomPath->LastParameter());
+ myPath = BRepBuilderAPI_MakeWire(aEdgePath);
+
+ TopoDS_Shape aProfile = lhs->createProfile();
+ TopoDS_Shape aCorrection = correctionProfile(aProfile , aFirst , geomPath , geomPath->FirstParameter());
+ TopoDS_Shape aProfile1 = rhs->createProfile();
+
+ BRepOffsetAPI_MakePipeShell PipeShell(myPath);
+ PipeShell.Add(aCorrection , false , false);
+ PipeShell.Add(aProfile1 , false , false);
+
+ myShape = PipeShell.Shape();
+}
\ No newline at end of file
diff --git a/src/MShape.h b/src/MShape.h
new file mode 100644
index 0000000..a01bf44
--- /dev/null
+++ b/src/MShape.h
@@ -0,0 +1,228 @@
+#pragma once
+
+#include
+#include
+
+#include
+
+#include "gp_Ax2.hxx"
+#include "gp_Ax3.hxx"
+#include "gp_Quaternion.hxx"
+#include "gp_Pnt.hxx"
+#include "gp_Circ.hxx"
+#include "gp_Pln.hxx"
+
+#include "ProjLib.hxx"
+#include "ElSLib.hxx"
+
+#include "GCE2d_MakeLine.hxx"
+#include "GccAna_Circ2d2TanRad.hxx"
+#include "GccEnt.hxx"
+#include "GccEnt_QualifiedLin.hxx"
+#include "gce_MakeCirc.hxx"
+#include "GCPnts_AbscissaPoint.hxx"
+#include "GC_MakeSegment.hxx"
+
+#include "Geom2d_Line.hxx"
+#include "Geom2d_Circle.hxx"
+#include "Geom2d_TrimmedCurve.hxx"
+#include "Geom_CartesianPoint.hxx"
+#include "Geom_Line.hxx"
+#include "Geom_Curve.hxx"
+#include "Geom_Circle.hxx"
+#include "Geom_Plane.hxx"
+#include "Geom_Surface.hxx"
+#include "Geom_BezierCurve.hxx"
+#include "Geom_BSplineSurface.hxx"
+#include "Geom_Axis2Placement.hxx"
+#include "GeomAPI_Interpolate.hxx"
+#include "GeomAPI_PointsToBSpline.hxx"
+#include "GeomAPI_IntCS.hxx"
+#include "GeomAPI_ProjectPointOnCurve.hxx"
+#include "GeomAPI_ProjectPointOnSurf.hxx"
+#include "GeomFill_BSplineCurves.hxx"
+#include "GeomAdaptor_Curve.hxx"
+
+#include "TopoDS.hxx"
+#include "TopoDS_Edge.hxx"
+#include "TopoDS_Shape.hxx"
+#include "TopoDS_Face.hxx"
+#include "TopExp_Explorer.hxx"
+#include "TopAbs.hxx"
+#include "TopAbs_ShapeEnum.hxx"
+
+#include "BRep_Tool.hxx"
+#include "BRepTools.hxx"
+#include "BRepLib.hxx"
+#include "BRepBndLib.hxx"
+#include "BRepBuilderAPI_MakeVertex.hxx"
+#include "BRepBuilderAPI_MakeEdge.hxx"
+#include "BRepBuilderAPI_MakePolygon.hxx"
+#include "BRepBuilderAPI_MakeWire.hxx"
+#include "BRepBuilderAPI_MakeFace.hxx"
+#include "BRepBuilderAPI_MakeShell.hxx"
+#include "BRepBuilderAPI_MakeSolid.hxx"
+#include "BRepBuilderAPI_Transform.hxx"
+#include "BRepBuilderAPI_Copy.hxx"
+#include "BRepBuilderAPI_Sewing.hxx"
+#include "BRepPrimAPI_MakeBox.hxx"
+#include "BRepPrimAPI_MakeCone.hxx"
+#include "BRepPrimAPI_MakeSphere.hxx"
+#include "BRepPrimAPI_MakeCylinder.hxx"
+#include "BRepPrimAPI_MakeRevolution.hxx"
+#include "BRepPrimAPI_MakeRevol.hxx"
+#include "BRepPrimAPI_MakePrism.hxx"
+#include "BRepAlgoAPI_Fuse.hxx"
+#include "BRepAlgoAPI_Cut.hxx"
+#include "BRepAlgoAPI_Common.hxx"
+#include "BRepAlgoAPI_Section.hxx"
+#include "BRepAlgoAPI_Splitter.hxx"
+#include "BRepOffsetAPI_MakeOffsetShape.hxx"
+#include "BRepOffsetAPI_MakeThickSolid.hxx"
+#include "BRepOffsetAPI_MakePipe.hxx"
+#include "BRepOffsetAPI_MakePipeShell.hxx"
+#include "BRepOffsetAPI_ThruSections.hxx"
+#include "BRepFilletAPI_MakeFillet.hxx"
+#include "BRepFilletAPI_MakeChamfer.hxx"
+#include "BRepFilletAPI_MakeFillet2d.hxx"
+#include "BRepFeat_MakePrism.hxx"
+#include "BRepFeat_MakePipe.hxx"
+#include "BRepAlgoAPI_Defeaturing.hxx"
+#include "BRepAdaptor_Surface.hxx"
+#include "BRepGProp.hxx"
+#include "GProp_GProps.hxx"
+
+#include "BOPTools_AlgoTools3D.hxx"
+#include "BOPAlgo_MakePeriodic.hxx"
+#include "BOPAlgo_Builder.hxx"
+#include "BOPAlgo_Splitter.hxx"
+#include "BOPAlgo_BOP.hxx"
+
+#include "HLRBRep_Algo.hxx"
+#include "HLRBRep_HLRToShape.hxx"
+
+#include "AIS_TextLabel.hxx"
+
+
+// OCCT自带dump函数可打印信息
+std::ostream& operator<<(std::ostream& os , const gp_Pnt& pnt);
+
+Handle(Geom_BSplineCurve) createBSplineCurve(std::vector& pnts, int mode = 0);
+
+TopoDS_Shape correctionProfile(TopoDS_Shape& aProfile , gp_Pnt fromPnt , Handle(Geom_Curve) CPath , double toParam);
+
+TopoDS_Wire convertFaceToWire(const TopoDS_Shape& aShape);
+
+enum MSType
+{
+ MSType_NONE ,
+ MSType_POINT ,
+ MSType_LINEAR_RECT ,
+ MSType_LINEAR_CIRCLE,
+ MSType_PIPEFITING
+};
+
+class MSAbstract
+{
+public:
+ MSAbstract(const QString& n);
+ virtual ~MSAbstract() = default;
+
+ virtual TopoDS_Shape createProfile() = 0;
+
+ QString getName() const {
+ return myName;
+ }
+
+ MSType getType() const {
+ return myType;
+ }
+
+ TopoDS_Wire getPath() const {
+ return myPath;
+ }
+
+ TopoDS_Shape getProfile() const {
+ return myProfile;
+ }
+
+ TopoDS_Shape getShape() const {
+ return myShape;
+ }
+
+protected:
+ virtual void compute() = 0;
+
+ void setType(MSType t) {
+ myType = t;
+ }
+ gp_Pnt transformPoint(gp_Pnt& p , gp_Vec vecTranslate);
+ TopoDS_Shape transformShape(TopoDS_Shape& aShape , gp_Quaternion quater , gp_Vec vecTranslate);
+
+ TopoDS_Wire myPath;
+ TopoDS_Shape myProfile;
+ TopoDS_Shape myShape;
+
+private:
+ QString myName;
+ MSType myType;
+};
+
+class MSLinearRect :public MSAbstract
+{
+public:
+ MSLinearRect(const std::vector& points , double width = 20.0 , double height = 10.0 , const QString& n = "");
+ virtual TopoDS_Shape createProfile() override;
+ void updateCompute(const std::vector& pointsNew = {});
+
+ std::vector getPoints() const
+ {
+ return myPoints;
+ }
+
+ double getWidth() const { return myWidth; }
+ double getHeight() const { return myHeight; }
+protected:
+ virtual void compute() override;
+
+private:
+ std::vector myPoints;
+
+ double myWidth;
+ double myHeight;
+};
+
+class MSPipeFitting :public MSAbstract
+{
+public:
+ MSPipeFitting() = default;
+ MSPipeFitting(std::shared_ptr< MSLinearRect> l , std::shared_ptr< MSLinearRect> r , const QString& n = "");
+ virtual TopoDS_Shape createProfile() override;
+ void setAdjacent(const std::vector& pointsLhs , const std::vector& pointsRhs);
+ void restoreAdjacent();
+
+ std::vector getPoints() const
+ {
+ return myPoints;
+ }
+
+protected:
+ virtual void compute() override;
+
+private:
+ std::vector myPoints;
+ std::shared_ptr< MSLinearRect> lhs;
+ std::shared_ptr< MSLinearRect> rhs;
+};
+
+class MSPoint :public MSAbstract
+{
+public:
+ MSPoint() = default;
+ MSPoint(const QString& n) :MSAbstract(n) {}
+
+protected:
+ virtual void compute() override {};
+ virtual TopoDS_Shape createProfile() override {};
+};
+
diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp
new file mode 100644
index 0000000..27d9cd9
--- /dev/null
+++ b/src/MainWindow.cpp
@@ -0,0 +1,2532 @@
+#include "MainWindow.h"
+
+MainWindow::MainWindow(QWidget* parent) :
+ QMainWindow(parent) ,
+ _devPx(devicePixelRatio())
+{
+ initMenuToolbar();
+ initOCCTView();
+ initSignals();
+}
+
+MainWindow::~MainWindow()
+{
+}
+
+void MainWindow::initMenuToolbar()
+{
+ setWindowTitle("OCCTTutorial");
+ setWindowIcon(QIcon(":/icons/icons/3dModel.png"));
+
+ stb = new QStatusBar(this);
+ this->setStatusBar(stb);
+ lb_positionInfo = new QLabel(this);
+ stb->addWidget(lb_positionInfo);
+
+ tb_view = new QToolBar(this);
+ //tb_view->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
+ addToolBar(tb_view);
+
+ act_hideAll = new QAction(QIcon(":/icons/icons/hideAll.png") , "hideAll" , this);
+ act_hide = new QAction(QIcon(":/icons/icons/hide.png") , "hide" , this);
+ act_fitAll = new QAction(QIcon(":/icons/icons/view-fullscreen.svg") , "fitAll" , this);
+ act_axo = new QAction(QIcon(":/icons/icons/view-axonometric.svg") , "axo" , this);
+ act_top = new QAction(QIcon(":/icons/icons/view-top.svg") , "top" , this);
+ act_buttom = new QAction(QIcon(":/icons/icons/view-bottom.svg") , "buttom" , this);
+ act_left = new QAction(QIcon(":/icons/icons/view-left.svg") , "left" , this);
+ act_right = new QAction(QIcon(":/icons/icons/view-right.svg") , "right" , this);
+ act_front = new QAction(QIcon(":/icons/icons/view-front.svg") , "front" , this);
+ act_back = new QAction(QIcon(":/icons/icons/view-rear.svg") , "back" , this);
+ act_shade = new QAction(QIcon(":/icons/icons/DrawStyleShaded.svg") , "shade" , this);
+ act_wireframe = new QAction(QIcon(":/icons/icons/DrawStyleWireFrame.svg") , "wireframe" , this);
+ act_perspective = new QAction(QIcon(":/icons/icons/perspective.png") , "perspective" , this);
+ act_perspective->setCheckable(true);
+ act_axis = new QAction(QIcon(":/icons/icons/axis.png") , "axis" , this);
+ act_test = new QAction(QIcon(":/icons/icons/utilities-terminal.svg") , "test" , this);
+
+ tb_view->addActions({ act_hideAll,act_hide,act_fitAll,act_axo,
+ act_top,act_buttom,act_left,act_right,act_front,act_back });
+ tb_view->addSeparator();
+ tb_view->addActions({ act_shade,act_wireframe,act_perspective,act_axis,act_test });
+
+ tb_style = new QToolBar(this);
+ addToolBar(tb_style);
+ addToolBarBreak();
+
+ act_color = new QAction(QIcon(":/icons/icons/colors.svg") , "color" , this);
+ act_material = new QAction(QIcon(":/icons/icons/Material.svg") , "material" , this);
+
+ actgp_selectMode = new QActionGroup(this);
+ actgp_selectMode->setExclusionPolicy(QActionGroup::ExclusionPolicy::ExclusiveOptional);
+ act_selectVertex = new QAction(QIcon(":/icons/icons/vertex-selection.svg") , "selectVertex" , this);
+ act_selectVertex->setCheckable(true);
+ act_selectEdge = new QAction(QIcon(":/icons/icons/edge-selection.svg") , "selectEdge" , this);
+ act_selectEdge->setCheckable(true);
+ act_selectFace = new QAction(QIcon(":/icons/icons/face-selection.svg") , "selectFace" , this);
+ act_selectFace->setCheckable(true);
+ lb_workArea = new QLabel(this);
+ lb_workArea->setText("workArea: ");
+ cbb_workArea = new QComboBox(this);
+ cbb_workArea->addItems({ "None", "AISCustomPresentation","ModelingData","ModelingAlgorithms" ,
+"DataExchange","Visualization", "MShape" });
+
+ tb_style->addActions({ act_color,act_material });
+ tb_style->addSeparator();
+ tb_style->addActions({ act_selectVertex, act_selectEdge, act_selectFace });
+ tb_style->addSeparator();
+ tb_style->addWidget(lb_workArea);
+ tb_style->addWidget(cbb_workArea);
+
+ tb_aisCustom = new QToolBar(this);
+ tb_aisCustom->setVisible(false);
+ addToolBar(tb_aisCustom);
+ tbs.push_back(tb_aisCustom);
+
+ cbb_aisCustom = new QComboBox(this);
+ cbb_aisCustom->addItems({ "Presentation builders", "Primitive arrays" ,"Primitive aspects" ,"Quadric builders" ,
+ "Computing selection" ,"HighlightingSelectionOwner" ,"add arrow" });
+ tb_aisCustom->addWidget(cbb_aisCustom);
+ act_aisCustom = new QAction(QIcon(":/icons/icons/run.png") , "run" , this);
+ tb_aisCustom->addAction(act_aisCustom);
+
+ tb_ModelData = new QToolBar(this);
+ tb_ModelData->setVisible(false);
+ addToolBar(tb_ModelData);
+ tbs.push_back(tb_ModelData);
+
+ cbb_ModelData = new QComboBox(this);
+ cbb_ModelData->addItems({ "Interpolations and Approximations","Direct Construction" ,"2D Geometry",
+ "Points on Curves","Extrema","Topological types","Exploration" ,"Properties","Bounding boxes",
+ "transform" });
+ tb_ModelData->addWidget(cbb_ModelData);
+ act_ModelData = new QAction(QIcon(":/icons/icons/run.png") , "run" , this);
+ tb_ModelData->addAction(act_ModelData);
+
+ tb_ModelAlgorithm = new QToolBar(this);
+ tb_ModelAlgorithm->setVisible(false);
+ addToolBar(tb_ModelAlgorithm);
+ tbs.push_back(tb_ModelAlgorithm);
+
+ cbb_BRepBuilderAPI = new QComboBox(this);
+ cbb_BRepBuilderAPI->addItems({ "Intersections","LinesAndCirclesFromConstraints","GeomFill_BSplineCurves","Projection","Edge",
+ "Polygon","Face","Wire","Shell","Solid" });
+ tb_ModelAlgorithm->addWidget(cbb_BRepBuilderAPI);
+ act_BRepBuilderAPI = new QAction(QIcon(":/icons/icons/run.png") , "run" , this);
+ tb_ModelAlgorithm->addAction(act_BRepBuilderAPI);
+
+ cbb_BRepPrimAPI = new QComboBox(this);
+ cbb_BRepPrimAPI->addItems({ "Making Primitives","Rotation object","Rotational Sweep","Prism",
+ "Boolean Operations" ,"Getting normal for the face","History support" ,"Fillets and Chamfers" });
+ tb_ModelAlgorithm->addWidget(cbb_BRepPrimAPI);
+ act_BRepPrimAPI = new QAction(QIcon(":/icons/icons/run.png") , "run" , this);
+ tb_ModelAlgorithm->addAction(act_BRepPrimAPI);
+
+ cbb_BRepOffsetAPI = new QComboBox(this);
+ cbb_BRepOffsetAPI->addItems({ "MakePipe","Offset computation" ,"Shelling","loft","PipeShell"});
+ tb_ModelAlgorithm->addWidget(cbb_BRepOffsetAPI);
+ act_BRepOffsetAPI = new QAction(QIcon(":/icons/icons/run.png") , "run" , this);
+ tb_ModelAlgorithm->addAction(act_BRepOffsetAPI);
+
+ cbb_Modification = new QComboBox(this);
+ cbb_Modification->addItems({ "Transformation","Duplication","Sewing","BRepFeat_MakePrism" ,
+ "BRepFeat_MakePipe" ,"3DModelDefeaturing","3DModelPeriodicity","drillExample" });
+ tb_ModelAlgorithm->addWidget(cbb_Modification);
+ act_Modification = new QAction(QIcon(":/icons/icons/run.png") , "run" , this);
+ tb_ModelAlgorithm->addAction(act_Modification);
+
+ cbb_Boolean = new QComboBox(this);
+ cbb_Boolean->addItems({ "GFA","SPA","BOA","BRepAlgoAPI_Splitter" });
+ tb_ModelAlgorithm->addWidget(cbb_Boolean);
+ act_Boolean = new QAction(QIcon(":/icons/icons/run.png") , "run" , this);
+ tb_ModelAlgorithm->addAction(act_Boolean);
+
+ cbb_HLR = new QComboBox(this);
+ cbb_HLR->addItems({ "HLRBRep_Algo" });
+ tb_ModelAlgorithm->addWidget(cbb_HLR);
+ act_HLR = new QAction(QIcon(":/icons/icons/run.png") , "run" , this);
+ tb_ModelAlgorithm->addAction(act_HLR);
+
+ tb_DataExchange = new QToolBar(this);
+ tb_DataExchange->setVisible(false);
+ addToolBar(tb_DataExchange);
+ tbs.push_back(tb_DataExchange);
+
+ cbb_DataExchange = new QComboBox(this);
+ cbb_DataExchange->addItems({ "ExportBrep" ,"ImportBrep","ExportStep","ImportStep" ,"ExportIges","ImportIges",
+ "ExportObj" ,"ImportObj" });
+ tb_DataExchange->addWidget(cbb_DataExchange);
+ act_DataExchange = new QAction(QIcon(":/icons/icons/run.png") , "run" , this);
+ tb_DataExchange->addAction(act_DataExchange);
+
+ tb_Visualization = new QToolBar(this);
+ tb_Visualization->setVisible(false);
+ addToolBar(tb_Visualization);
+ tbs.push_back(tb_Visualization);
+
+ cbb_ais = new QComboBox(this);
+ cbb_ais->addItems({ "HLR","setLocation","ObjectHierarchy","Fitter","Selection/Capture" });
+ tb_Visualization->addWidget(cbb_ais);
+ act_ais = new QAction(QIcon(":/icons/icons/run.png") , "run" , this);
+ tb_Visualization->addAction(act_ais);
+
+ cbb_stdAis = new QComboBox(this);
+ cbb_stdAis->addItems({ "Datum","AIS_PointCloud","Relations","Dimensions" });
+ tb_Visualization->addWidget(cbb_stdAis);
+ act_stdAis = new QAction(QIcon(":/icons/icons/run.png") , "run" , this);
+ tb_Visualization->addAction(act_stdAis);
+
+ cbb_Graphic3d = new QComboBox(this);
+ cbb_Graphic3d->addItems({ "Primitive arrays","Text primitive","Clipping planes" });
+ tb_Visualization->addWidget(cbb_Graphic3d);
+ act_Graphic3d = new QAction(QIcon(":/icons/icons/run.png") , "run" , this);
+ tb_Visualization->addAction(act_Graphic3d);
+
+ tb_MShape = new QToolBar(this);
+ tb_MShape->setVisible(false);
+ addToolBar(tb_MShape);
+ tbs.push_back(tb_MShape);
+
+ cbb_MShape = new QComboBox(this);
+ cbb_MShape->addItems({ "PipeFitting" });
+ tb_MShape->addWidget(cbb_MShape);
+ act_MShape = new QAction(QIcon(":/icons/icons/run.png") , "run" , this);
+ tb_MShape->addAction(act_MShape);
+}
+
+void MainWindow::initOCCTView()
+{
+ myViewer = Viewer(V3d_XposYnegZpos);
+ myContext = new AIS_InteractiveContext(myViewer);
+ view_occt = new View(myContext , this);
+ view_occt->installEventFilter(this);
+ setCentralWidget(view_occt);
+}
+
+void MainWindow::initSignals()
+{
+ connect(view_occt , &View::selectionChanged , this , &MainWindow::processSelectChanged);
+ connect(act_hideAll , &QAction::triggered , view_occt , &View::removeAll);
+ connect(act_hide , &QAction::triggered , view_occt , &View::remove);
+ connect(act_fitAll , &QAction::triggered , view_occt , &View::fitAll);
+ connect(act_axo , &QAction::triggered , view_occt , &View::setAxo);
+ connect(act_top , &QAction::triggered , view_occt , &View::setTop);
+ connect(act_buttom , &QAction::triggered , view_occt , &View::setBottom);
+ connect(act_left , &QAction::triggered , view_occt , &View::setLeft);
+ connect(act_right , &QAction::triggered , view_occt , &View::setRight);
+ connect(act_front , &QAction::triggered , view_occt , &View::setFront);
+ connect(act_back , &QAction::triggered , view_occt , &View::setBack);
+
+ connect(act_shade , &QAction::triggered , view_occt , &View::setShading);
+ connect(act_wireframe , &QAction::triggered , view_occt , &View::setWireframe);
+ connect(act_perspective , &QAction::triggered , this , &MainWindow::setPerspective);
+ connect(act_axis , &QAction::triggered , view_occt , &View::setAxis);
+ connect(act_test , &QAction::triggered , this , &MainWindow::test);
+
+ connect(act_color , &QAction::triggered , this , &MainWindow::setColor);
+ connect(act_selectVertex , &QAction::triggered , this , &MainWindow::setSelectMode);
+ connect(act_selectEdge , &QAction::triggered , this , &MainWindow::setSelectMode);
+ connect(act_selectFace , &QAction::triggered , this , &MainWindow::setSelectMode);
+
+ connect(cbb_workArea , &QComboBox::currentIndexChanged , this , &MainWindow::setWorkArea);
+ connect(act_aisCustom , &QAction::triggered , this , &MainWindow::runAisCustom);
+ connect(act_ModelData , &QAction::triggered , this , &MainWindow::runModelData);
+ connect(act_BRepBuilderAPI , &QAction::triggered , this , &MainWindow::runBRepBuilderAPI);
+ connect(act_BRepPrimAPI , &QAction::triggered , this , &MainWindow::runBRepPrimAPI);
+ connect(act_BRepOffsetAPI , &QAction::triggered , this , &MainWindow::runBRepOffsetAPI);
+ connect(act_Modification , &QAction::triggered , this , &MainWindow::runModification);
+ connect(act_Boolean , &QAction::triggered , this , &MainWindow::runBoolean);
+ connect(act_HLR , &QAction::triggered , this , &MainWindow::runHLR);
+ connect(act_DataExchange , &QAction::triggered , this , &MainWindow::runDataExchange);
+ connect(act_ais , &QAction::triggered , this , &MainWindow::runAis);
+ connect(act_stdAis , &QAction::triggered , this , &MainWindow::runStdAis);
+ connect(act_Graphic3d , &QAction::triggered , this , &MainWindow::runGraphic3d);
+ connect(act_MShape , &QAction::triggered , this , &MainWindow::runMShape);
+}
+
+void MainWindow::setPerspective(bool check)
+{
+ if (check)
+ view_occt->setProjectionType(Graphic3d_Camera::Projection::Projection_Perspective);
+ else
+ view_occt->setProjectionType(Graphic3d_Camera::Projection::Projection_Orthographic);
+}
+
+void MainWindow::test()
+{
+ TopoDS_Shape box = BRepPrimAPI_MakeBox(20 , 20 , 20);
+ //BRepFilletAPI_MakeFillet MFFillet(box);
+ //TopExp_Explorer ex(box , TopAbs_EDGE);
+ //double r = 2.;
+ //int i = 0;
+ //while (ex.More())
+ //{
+ // if (i == 0)
+ // {
+ // MFFillet.Add(r , TopoDS::Edge(ex.Current()));
+ // }
+ // i++;
+ // ex.Next();
+ //}
+ //Handle(AIS_InteractiveObject) aisFillet = new MAisDemo(MFFillet.Shape());
+ //myContext->Display(aisFillet , 1 , 0 , false);
+ Handle(AIS_InteractiveObject) ais = new MAisDemo(box , true);
+ myContext->Display(ais , 1 , 0 , false);
+}
+
+void MainWindow::setColor()
+{
+ QColor color = QColorDialog::getColor(Qt::white , this , "选择颜色");
+ if (color.isValid())
+ {
+ myContext->InitSelected();
+ Handle(AIS_InteractiveObject) selectedObject = myContext->SelectedInteractive();
+ while (myContext->MoreSelected())
+ {
+ Handle(Prs3d_Drawer) drawer = selectedObject->Attributes();
+ drawer->ShadingAspect()->SetColor(Quantity_Color(color.redF() ,
+ color.greenF() ,
+ color.blueF() ,
+ Quantity_TOC_RGB));
+ myContext->Redisplay(selectedObject , true);
+
+ myContext->NextSelected();
+ }
+ }
+}
+
+void MainWindow::setSelectMode()
+{
+ bool checkVertex = act_selectVertex->isChecked();
+ bool checkEdge = act_selectEdge->isChecked();
+ bool checkFace = act_selectFace->isChecked();
+
+ myContext->Deactivate();
+ if (checkVertex && !checkEdge && !checkFace)
+ {
+ myContext->Activate(AIS_Shape::SelectionMode(TopAbs_VERTEX));
+ }
+ else if (!checkVertex && checkEdge && !checkFace)
+ {
+ myContext->Activate(AIS_Shape::SelectionMode(TopAbs_EDGE));
+ }
+ else if (!checkVertex && !checkEdge && checkFace)
+ {
+ myContext->Activate(AIS_Shape::SelectionMode(TopAbs_FACE));
+ }
+ else if (checkVertex && checkEdge && !checkFace)
+ {
+ myContext->Activate(AIS_Shape::SelectionMode(TopAbs_VERTEX));
+ myContext->Activate(AIS_Shape::SelectionMode(TopAbs_EDGE));
+ }
+ else if (checkVertex && !checkEdge && checkFace)
+ {
+ myContext->Activate(AIS_Shape::SelectionMode(TopAbs_VERTEX));
+ myContext->Activate(AIS_Shape::SelectionMode(TopAbs_FACE));
+ }
+ else if (!checkVertex && checkEdge && checkFace)
+ {
+ myContext->Activate(AIS_Shape::SelectionMode(TopAbs_EDGE));
+ myContext->Activate(AIS_Shape::SelectionMode(TopAbs_FACE));
+ }
+ else if (checkVertex && checkEdge && checkFace)
+ {
+ myContext->Activate(AIS_Shape::SelectionMode(TopAbs_VERTEX));
+ myContext->Activate(AIS_Shape::SelectionMode(TopAbs_EDGE));
+ myContext->Activate(AIS_Shape::SelectionMode(TopAbs_FACE));
+ }
+ else
+ {
+ myContext->Activate(0);
+ }
+}
+
+void MainWindow::setWorkArea(int index)
+{
+ if (index == 0)
+ {
+ for (int i = 0; i < tbs.size(); ++i)
+ {
+ tbs[i]->setVisible(false);
+ }
+ }
+ else
+ {
+ for (int i = 0; i < tbs.size(); ++i)
+ {
+ if (i == index - 1)
+ {
+ tbs[i]->setVisible(true);
+ }
+ else
+ {
+ tbs[i]->setVisible(false);
+ }
+ }
+ }
+}
+
+void MainWindow::processSelectChanged()
+{
+ myContext->InitSelected();
+
+ TopoDS_Shape selShape = myContext->SelectedShape();
+ if (!selShape.IsNull() && selShape.ShapeType() == TopAbs_EDGE)
+ {
+ //TopoDS_Edge edge = TopoDS::Edge(selShape);
+
+ //Handle(AIS_InteractiveObject) selected = myContext->SelectedInteractive();
+ //Handle(MAisDemo) sel = Handle(MAisDemo)::DownCast(selected);
+ //TopoDS_Shape aShape = sel->Shape();
+ //
+ //BRepFilletAPI_MakeFillet MFFillet(aShape, ChFi3d_Polynomial);
+ //TopExp_Explorer ex(aShape , TopAbs_EDGE);
+ //double r = 2.;
+ //MFFillet.Add(r , edge);
+ //Handle(AIS_InteractiveObject) aisFillet = new MAisDemo(MFFillet.Shape());
+
+ //myContext->Remove(selected , false);
+ //myContext->Display(aisFillet , 1 , 0 , true);
+ //myContext->Activate(aisFillet , MAisDemo::SelectionMode(TopAbs_EDGE));
+ }
+}
+
+void MainWindow::runAisCustom()
+{
+ if (cbb_aisCustom->currentText() == "Presentation builders")
+ {
+ TopoDS_Shape aShape = BRepPrimAPI_MakeCylinder(100.0 , 100.0);
+ Handle(AIS_InteractiveObject) ais = new MAisObject0(aShape);
+ myContext->Display(ais , 0 , 0 , false);
+ myContext->HilightWithColor(ais , ais->HilightAttributes() , false);
+ }
+ else if (cbb_aisCustom->currentText() == "Primitive arrays")
+ {
+ TopoDS_Shape aShape = BRepPrimAPI_MakeCylinder(100.0 , 100.0);
+ Handle(AIS_InteractiveObject) ais = new MAisObject1(aShape);
+ myContext->Display(ais , 0 , 0 , false);
+ }
+ else if (cbb_aisCustom->currentText() == "Primitive aspects")
+ {
+ TopoDS_Shape aShape = BRepPrimAPI_MakeCylinder(100.0 , 100.0);
+ Handle(AIS_InteractiveObject) ais = new MAisObject2(aShape);
+ myContext->Display(ais , 0 , 0 , false);
+ }
+ else if (cbb_aisCustom->currentText() == "Quadric builders")
+ {
+ TopoDS_Shape aShape = BRepPrimAPI_MakeCylinder(100.0 , 100.0);
+ Handle(AIS_InteractiveObject) ais = new MAisObject3(aShape);
+ myContext->Display(ais , 0 , 0 , false);
+ }
+ else if (cbb_aisCustom->currentText() == "Computing selection")
+ {
+ TopoDS_Shape aShape = BRepPrimAPI_MakeCylinder(100.0 , 100.0);
+ Handle(AIS_InteractiveObject) ais = new MAisObject4(aShape);
+ myContext->Display(ais , 0 , 0 , false);
+ }
+ else if (cbb_aisCustom->currentText() == "HighlightingSelectionOwner")
+ {
+ TopoDS_Shape aShape = BRepPrimAPI_MakeCylinder(100.0 , 100.0);
+ Handle(AIS_InteractiveObject) ais = new MAisObject5(aShape);
+ myContext->Display(ais , 0 , 0 , false);
+ }
+ else if (cbb_aisCustom->currentText() == "add arrow")
+ {
+ TopoDS_Shape aShape = BRepPrimAPI_MakeCylinder(100.0 , 100.0);
+ Handle(AIS_InteractiveObject) ais = new MAisObject6(aShape);
+ myContext->Display(ais , 0 , 0 , false);
+ }
+ view_occt->fitAll();
+}
+
+void MainWindow::runModelData()
+{
+ if (cbb_ModelData->currentText() == "Interpolations and Approximations")
+ {
+ std::vector pnts = { gp_Pnt(0 , 0 , 0) ,gp_Pnt(0 , 100 , 0) ,gp_Pnt(100 , 150 , 0),gp_Pnt(200 , 200 , 0) };
+ Handle(TColgp_HArray1OfPnt) ps = new TColgp_HArray1OfPnt(1 , 4);
+ int i = 1;
+ for (auto p : pnts)
+ {
+ TopoDS_Vertex aVertex = BRepBuilderAPI_MakeVertex(p);
+ Handle(AIS_InteractiveObject) aisVertex = new AIS_Shape(aVertex);
+ myContext->Display(aisVertex , false);
+ ps->SetValue(i , p);
+ ++i;
+ }
+
+ // 插值法不是完全通过构造点
+ GeomAPI_Interpolate Interp(ps , false , Precision::Confusion());
+ Interp.Perform();
+ Handle(Geom_BSplineCurve) C = Interp.Curve();
+ TopoDS_Edge aEdge = BRepBuilderAPI_MakeEdge(C);
+ Handle(AIS_InteractiveObject) ais = new AIS_Shape(aEdge);
+ myContext->Display(ais , false);
+
+ auto psArr = ps->Array1();
+ GeomAPI_PointsToBSpline Approx(psArr);
+ Handle(Geom_BSplineCurve) CApprox = Approx.Curve();
+ CApprox->Translate(gp_Vec(0 , 0 , 100));
+ TopoDS_Edge aEdgeApprox = BRepBuilderAPI_MakeEdge(CApprox);
+ Handle(AIS_InteractiveObject) aisApprox = new AIS_Shape(aEdgeApprox);
+ myContext->Display(aisApprox , false);
+
+ // 只有首位两点保证通过
+ Handle(Geom_BezierCurve) CBezier = new Geom_BezierCurve(psArr);
+ CBezier->Translate(gp_Vec(0 , 0 , 200));
+ TopoDS_Edge aEdgeBezier = BRepBuilderAPI_MakeEdge(CBezier);
+ Handle(AIS_InteractiveObject) aisBezier = new AIS_Shape(aEdgeBezier);
+ myContext->Display(aisBezier , false);
+
+ // 控制斜率
+ Handle(TColgp_HArray1OfPnt) points = new TColgp_HArray1OfPnt(1 , 2);
+ points->SetValue(1 , gp_Pnt(0 , 0 , 0));
+ points->SetValue(2 , gp_Pnt(200 , 0 , 0));
+
+ GeomAPI_Interpolate interpolator(points , false , Precision::Confusion());
+ interpolator.Load(gp_Vec(0 , 1 , 0) , gp_Vec(0 , -1 , 0));
+ interpolator.Perform();
+
+ Handle(Geom_BSplineCurve) cir = interpolator.Curve();
+ TopoDS_Edge aEdgeCir = BRepBuilderAPI_MakeEdge(cir);
+ Handle(AIS_InteractiveObject) aisCir = new AIS_Shape(aEdgeCir);
+ myContext->Display(aisCir , false);
+ }
+ else if (cbb_ModelData->currentText() == "Direct Construction")
+ {
+ gp_Pnt pnt0 = gp_Pnt(0 , 0 , 0);
+ gp_Pnt pnt1 = gp_Pnt(0 , 100 , 0);
+ gp_Pnt pnt2 = gp_Pnt(100 , 150 , 0);
+ TopoDS_Vertex aVertex0 = BRepBuilderAPI_MakeVertex(pnt0);
+ TopoDS_Vertex aVertex1 = BRepBuilderAPI_MakeVertex(pnt1);
+ TopoDS_Vertex aVertex2 = BRepBuilderAPI_MakeVertex(pnt2);
+
+ Handle(AIS_InteractiveObject) aisVertex0 = new AIS_Shape(aVertex0);
+ Handle(AIS_InteractiveObject) aisVertex1 = new AIS_Shape(aVertex1);
+ Handle(AIS_InteractiveObject) aisVertex2 = new AIS_Shape(aVertex2);
+ myContext->Display(aisVertex0 , false);
+ myContext->Display(aisVertex1 , false);
+ myContext->Display(aisVertex2 , false);
+
+ gce_MakeCirc MC(pnt0 , pnt1 , pnt2);
+ if (MC.IsDone())
+ {
+ const gp_Circ& C = MC.Value();
+ TopoDS_Edge aEdge = BRepBuilderAPI_MakeEdge(C);
+ Handle(AIS_InteractiveObject) ais = new AIS_Shape(aEdge);
+ myContext->Display(ais , false);
+ }
+ }
+ else if (cbb_ModelData->currentText() == "2D Geometry")
+ {
+ gp_Pnt aStart = gp_Pnt(0 , 0 , 0);
+ gp_Pnt aEnd = gp_Pnt(200 , 200 , 200);
+ TopoDS_Edge aPath = BRepBuilderAPI_MakeEdge(aStart , aEnd);
+ Handle(AIS_InteractiveObject) aisPath = new MAisDemo(aPath);
+ myContext->Display(aisPath , 1 , 0 , false);
+
+ double myWidth = 100;
+ double myHeight = 50;
+
+ gp_Vec vec = gp_Vec(aStart , aEnd);
+
+ // 设置平面X方向平行于OXY
+ gp_Vec vecX = vec.Crossed(gp_Vec(0 , 0 , 1));
+ gp_Ax3 ax3 = gp_Ax3(aStart , vec , vecX);
+ Handle(Geom_Surface) surf = new Geom_Plane(ax3);
+ TopoDS_Face aFace = BRepBuilderAPI_MakeFace(surf , -200 , 200 , -100 , 100 , 0);
+ Handle(AIS_InteractiveObject) aisFace = new MAisDemo(aFace);
+ aisFace->SetTransparency(0.5);
+ myContext->Display(aisFace , 1 , 0 , false);
+
+ gp_Pnt2d pnt2d1 = gp_Pnt2d(-myWidth / 2 , myHeight / 2);
+ gp_Pnt2d pnt2d2 = gp_Pnt2d(myWidth / 2 , myHeight / 2);
+ gp_Pnt2d pnt2d3 = gp_Pnt2d(myWidth / 2 , -myHeight / 2);
+ gp_Pnt2d pnt2d4 = gp_Pnt2d(-myWidth / 2 , -myHeight / 2);
+ Handle(Geom2d_Line) geom2dLin1 = GCE2d_MakeLine(pnt2d1 , pnt2d2).Value();
+ Handle(Geom2d_Line) geom2dLin2 = GCE2d_MakeLine(pnt2d2 , pnt2d3).Value();
+ Handle(Geom2d_Line) geom2dLin3 = GCE2d_MakeLine(pnt2d3 , pnt2d4).Value();
+ Handle(Geom2d_Line) geom2dLin4 = GCE2d_MakeLine(pnt2d4 , pnt2d1).Value();
+
+ BRepBuilderAPI_MakeWire MW;
+ MW.Add(BRepBuilderAPI_MakeEdge(geom2dLin1 , surf , 0 , myWidth));
+ MW.Add(BRepBuilderAPI_MakeEdge(geom2dLin2 , surf , 0 , myHeight));
+ MW.Add(BRepBuilderAPI_MakeEdge(geom2dLin3 , surf , 0 , myWidth));
+ MW.Add(BRepBuilderAPI_MakeEdge(geom2dLin4 , surf , 0 , myHeight));
+ TopoDS_Wire myProfile = MW;
+ BRepLib::BuildCurves3d(myProfile); // 没有此步骤后面无法扫掠
+ Handle(AIS_InteractiveObject) aisProfile = new MAisDemo(myProfile);
+ myContext->Display(aisProfile , 1 , 0 , false);
+
+
+ TopoDS_Wire myPath = BRepBuilderAPI_MakeWire(aPath);
+ TopoDS_Shape myShape = BRepOffsetAPI_MakePipe(myPath , myProfile);
+ Handle(AIS_InteractiveObject) ais = new MAisDemo(myShape);
+ myContext->Display(ais , 1 , 0 , false);
+
+ //gp_Pnt pnt1 , pnt2 , pnt3 , pnt4;
+ //surf->D0(-myWidth / 2 , myHeight / 2 , pnt1);
+ //surf->D0(myWidth / 2 , myHeight / 2 , pnt2);
+ //surf->D0(myWidth / 2 , -myHeight / 2 , pnt3);
+ //surf->D0(-myWidth / 2 , -myHeight / 2 , pnt4);
+ //BRepBuilderAPI_MakeWire MW;
+ //MW.Add(BRepBuilderAPI_MakeEdge(pnt1 , pnt2));
+ //MW.Add(BRepBuilderAPI_MakeEdge(pnt2 , pnt3));
+ //MW.Add(BRepBuilderAPI_MakeEdge(pnt3 , pnt4));
+ //MW.Add(BRepBuilderAPI_MakeEdge(pnt4 , pnt1));
+ //TopoDS_Wire myProfile = MW;
+
+ //Handle(AIS_InteractiveObject) aisProfile = new MAisDemo(myProfile);
+ //myContext->Display(aisProfile , 1 , 0 , false);
+
+ //TopoDS_Wire myPath = BRepBuilderAPI_MakeWire(aPath);
+ //TopoDS_Shape myShape = BRepOffsetAPI_MakePipe(myPath , myProfile);
+ //Handle(AIS_InteractiveObject) ais = new MAisDemo(myShape);
+ //myContext->Display(ais , 1 , 0 , false);
+ }
+ else if (cbb_ModelData->currentText() == "Points on Curves")
+ {
+ std::vector pnts = { gp_Pnt(0 , 0 , 0) ,gp_Pnt(0 , 100 , 0) ,gp_Pnt(100 , 150 , 0),gp_Pnt(200 , 200 , 0) };
+
+ for (auto p : pnts)
+ {
+ TopoDS_Vertex aVertex = BRepBuilderAPI_MakeVertex(p);
+ Handle(AIS_InteractiveObject) aisVertex = new AIS_Shape(aVertex);
+ myContext->Display(aisVertex , false);
+ }
+
+ Handle(Geom_BSplineCurve) C = createBSplineCurve(pnts);
+ TopoDS_Edge aEdge = BRepBuilderAPI_MakeEdge(C);
+ Handle(AIS_InteractiveObject) ais = new AIS_Shape(aEdge);
+ myContext->Display(ais , false);
+
+ std::cout << C->FirstParameter() << std::endl;
+ std::cout << C->LastParameter() << std::endl;
+ gp_Pnt p1 , p2;
+ C->D0(C->FirstParameter() , p1);
+ C->D0(C->LastParameter() , p2);
+ std::cout << p1 << std::endl;
+ std::cout << p2 << std::endl;
+
+ GeomAdaptor_Curve adp(C);
+ GCPnts_AbscissaPoint myAlgo(adp , 100 , 0);
+ std::cout << myAlgo.Parameter() << std::endl;
+ std::cout << GCPnts_AbscissaPoint::Length(adp) << std::endl;
+ }
+ else if (cbb_ModelData->currentText() == "Extrema")
+ {
+ std::vector pnts = { gp_Pnt(0 , 0 , 0) ,gp_Pnt(0 , 100 , 0) ,gp_Pnt(100 , 150 , 0),gp_Pnt(200 , 200 , 0) };
+
+ for (auto p : pnts)
+ {
+ TopoDS_Vertex aVertex = BRepBuilderAPI_MakeVertex(p);
+ Handle(AIS_InteractiveObject) aisVertex = new AIS_Shape(aVertex);
+ myContext->Display(aisVertex , false);
+ }
+
+ Handle(Geom_BSplineCurve) C = createBSplineCurve(pnts);
+ TopoDS_Edge aEdge = BRepBuilderAPI_MakeEdge(C);
+ Handle(AIS_InteractiveObject) ais = new AIS_Shape(aEdge);
+ myContext->Display(ais , false);
+
+ gp_Pnt aPnt = gp_Pnt(0 , 100 , 100);
+ TopoDS_Vertex aVertexS = BRepBuilderAPI_MakeVertex(aPnt);
+ Handle(AIS_InteractiveObject) aisVertexS = new AIS_Shape(aVertexS);
+ myContext->Display(aisVertexS , false);
+ GeomAPI_ProjectPointOnCurve project(aPnt , C);
+
+ std::cout << project.LowerDistance() << std::endl;
+ std::cout << project.Point(1) << std::endl;
+ }
+ else if (cbb_ModelData->currentText() == "Topological types")
+ {
+ TopoDS_Shape aShape = BRepBuilderAPI_MakeEdge(gp_Pnt(0 , 0 , 200) , gp_Pnt(0 , 0 , 400));
+ TopoDS_Shape aShape1 = BRepPrimAPI_MakeBox(100 , 100 , 100);
+ Handle(AIS_InteractiveObject) ais = new MAisDemo(aShape);
+ myContext->Display(ais , 1 , 0 , false);
+ Handle(AIS_InteractiveObject) ais1 = new MAisDemo(aShape1);
+ myContext->Display(ais1 , 1 , 0 , false);
+
+ TopAbs::Print(aShape.ShapeType() , std::cout);
+ std::cout << std::endl;
+
+ bool check = (aShape.ShapeType() == TopAbs_EDGE);
+ std::cout << check << std::endl;
+
+ TopAbs::Print(aShape1.ShapeType() , std::cout);
+ std::cout << std::endl;
+
+ TopoDS_Solid V = TopoDS::Solid(aShape1);
+ TopAbs::Print(V.ShapeType() , std::cout);
+ }
+ else if (cbb_ModelData->currentText() == "Exploration")
+ {
+ TopoDS_Shape aShape = BRepPrimAPI_MakeBox(100 , 100 , 100);
+ Handle(AIS_InteractiveObject) ais = new MAisDemo(aShape);
+ myContext->Display(ais , 1 , 0 , false);
+
+ // 此方法所有edge都会参与迭代,若考虑共享,需使用TopExp::MapShapes方法
+ // demo可参考ModelingAlgorithms/Fillets and Chamfers最后的示例
+
+ for (TopExp_Explorer Ex(aShape , TopAbs_EDGE); Ex.More(); Ex.Next())
+ {
+ TopAbs::Print(Ex.Current().ShapeType() , std::cout);
+ std::cout << std::endl;
+ }
+
+ }
+ else if (cbb_ModelData->currentText() == "Properties")
+ {
+ TopoDS_Shape aShape = BRepBuilderAPI_MakeEdge(gp_Pnt(0 , 0 , 200) , gp_Pnt(0 , 0 , 400));
+ TopoDS_Shape aShape1 = BRepPrimAPI_MakeBox(100 , 100 , 100);
+ Handle(AIS_InteractiveObject) ais = new MAisDemo(aShape);
+ myContext->Display(ais , 1 , 0 , false);
+ Handle(AIS_InteractiveObject) ais1 = new MAisDemo(aShape1);
+ myContext->Display(ais1 , 1 , 0 , false);
+
+ GProp_GProps props;
+ BRepGProp::LinearProperties(aShape , props);
+ int length = props.Mass();
+ std::cout << length << std::endl;
+ gp_Pnt center = props.CentreOfMass();
+ std::cout << center << std::endl;
+
+ gp_Circ cir = gp_Circ(gp_Ax2(gp_Pnt(0 , 50 , 0) , gp_Dir(0 , 0 , 1)) , 50);
+ TopoDS_Edge aCirc = BRepBuilderAPI_MakeEdge(cir , 0 , M_PI / 2);
+ Handle(AIS_InteractiveObject) aisCirc = new MAisDemo(aCirc);
+ myContext->Display(aisCirc , false);
+
+ // 此方法适合线性的算法,不适合圆弧
+ GProp_GProps propsCirc;
+ BRepGProp::LinearProperties(aCirc , propsCirc);
+ int lengthCirc = propsCirc.Mass();
+ std::cout << lengthCirc << std::endl;
+ gp_Pnt centreCirc = propsCirc.CentreOfMass();
+ std::cout << centreCirc << std::endl;
+ TopoDS_Vertex aVertex = BRepBuilderAPI_MakeVertex(centreCirc);
+ Handle(AIS_InteractiveObject) aisVertex = new MAisDemo(aVertex);
+ myContext->Display(aisVertex , false);
+
+ }
+ else if (cbb_ModelData->currentText() == "Bounding boxes")
+ {
+ TopoDS_Edge aShape = BRepBuilderAPI_MakeEdge(gp_Pnt(0 , 0 , 0) , gp_Pnt(0 , 100 , 100));
+ TopoDS_Shape aShape1 = BRepPrimAPI_MakeBox(gp_Ax2(gp_Pnt(0 , 200 , 0) , gp_Dir(0 , 0 , 1)) , 100 , 100 , 100);
+ Handle(AIS_InteractiveObject) ais = new MAisObject9(aShape);
+ Handle(AIS_InteractiveObject) ais1 = new MAisObject9(aShape1);
+ myContext->Display(ais , 1 , 0 , false);
+ myContext->Display(ais1 , 1 , 0 , false);
+ gp_Circ cir = gp_Circ(gp_Ax2(gp_Pnt(0 , 50 , 0) , gp_Dir(0 , 0 , 1)) , 50);
+ TopoDS_Edge aCirc = BRepBuilderAPI_MakeEdge(cir , 0 , M_PI / 2);
+ Handle(AIS_InteractiveObject) aisCirc = new MAisObject9(aCirc);
+ myContext->Display(aisCirc , 1 , 0 , false);
+ }
+ else if (cbb_ModelData->currentText() == "transform")
+ {
+ gp_Pnt aPnt = gp_Pnt(0 , 0 , 0);
+ TopoDS_Vertex aVertex = BRepBuilderAPI_MakeVertex(aPnt);
+ Handle(AIS_InteractiveObject) aisPnt = new MAisDemo(aVertex);
+ myContext->Display(aisPnt , 1 , 0 , false);
+
+ gp_Pnt aPnt1 = aPnt.Translated(gp_Pnt(10 , 0 , 0) , gp_Pnt(30 , 0 , 0));
+ TopoDS_Vertex aVertex1 = BRepBuilderAPI_MakeVertex(aPnt1);
+ Handle(AIS_InteractiveObject) aisPnt1 = new MAisDemo(aVertex1);
+ myContext->Display(aisPnt1 , 1 , 0 , false);
+
+ gp_Trsf T;
+ gp_Vec vec = gp_Vec(0 , 20 , 0);
+ std::cout << vec.Magnitude() << std::endl;
+ T.SetTranslation(vec);
+ gp_Pnt aPnt2 = aPnt.Transformed(T);
+ TopoDS_Vertex aVertex2 = BRepBuilderAPI_MakeVertex(aPnt2);
+ Handle(AIS_InteractiveObject) aisPnt2 = new MAisDemo(aVertex2);
+ myContext->Display(aisPnt2 , 1 , 0 , false);
+
+ gp_Circ cir = gp_Circ(gp_Ax2(gp_Pnt(0 , 50 , 0) , gp_Dir(0 , 0 , 1)) , 50);
+ TopoDS_Edge aCirc = BRepBuilderAPI_MakeEdge(cir , 0 , M_PI / 2);
+ Handle(AIS_InteractiveObject) aisCirc = new MAisDemo(aCirc);
+ myContext->Display(aisCirc , 1 , 0 , false);
+
+ gp_Pln aPln = gp_Pln(gp_Pnt(0 , 0 , 0) , gp_Dir(1 , 0 , 0));
+ Handle(Geom_Plane) geomPln = new Geom_Plane(aPln);
+ TopoDS_Face aFace = BRepBuilderAPI_MakeFace(geomPln , -100 , 100 , -200 , 200 , 0);
+ Handle(AIS_InteractiveObject) aisFace = new MAisDemo(aFace);
+ myContext->Display(aisFace , 1 , 0 , false);
+
+ T.SetTranslation(gp_Vec(200 , 0 , 0));
+ BRepBuilderAPI_Transform trsf(aFace , T);
+ Handle(AIS_InteractiveObject) aisFace1 = new MAisDemo(trsf.Shape());
+ myContext->Display(aisFace1 , 1 , 0 , false);
+ }
+
+ view_occt->fitAll();
+}
+
+void MainWindow::runBRepBuilderAPI()
+{
+ if (cbb_BRepBuilderAPI->currentText() == "Intersections")
+ {
+ std::vector pnts = { gp_Pnt(0 , 0 , 0) ,gp_Pnt(0 , 100 , 0) ,gp_Pnt(100 , 150 , 0),gp_Pnt(200 , 200 , 0) };
+
+ for (auto p : pnts)
+ {
+ TopoDS_Vertex aVertex = BRepBuilderAPI_MakeVertex(p);
+ Handle(AIS_InteractiveObject) aisVertex = new MAisDemo(aVertex);
+ myContext->Display(aisVertex , false);
+ }
+
+ Handle(Geom_BSplineCurve) C = createBSplineCurve(pnts);
+ TopoDS_Edge aEdge = BRepBuilderAPI_MakeEdge(C);
+ Handle(AIS_InteractiveObject) ais = new MAisDemo(aEdge);
+ myContext->Display(ais , 1 , 0 , false);
+
+ gp_Pln pln = gp_Pln(gp_Pnt(100 , 0 , 0) , gp_Dir(1 , 0 , 0));
+ Handle(Geom_Surface) S = new Geom_Plane(pln);
+ TopoDS_Face aFace = BRepBuilderAPI_MakeFace(S , -200 , 200 , -200 , 200 , 0);
+ Handle(AIS_InteractiveObject) aisFace = new MAisDemo(aFace);
+ myContext->Display(aisFace , 1 , 0 , false);
+
+ GeomAPI_IntCS Intersector(C , S);
+ if (Intersector.NbPoints() != 0)
+ {
+ std::cout << Intersector.Point(1) << std::endl;
+ }
+ else
+ std::cout << "empty" << std::endl;
+
+ }
+ if (cbb_BRepBuilderAPI->currentText() == "LinesAndCirclesFromConstraints")
+ {
+ gp_Lin2d C1 = gp_Lin2d(gp_Pnt2d(0 , 0) , gp_Dir2d(1 , 0));
+ gp_Lin2d C2 = gp_Lin2d(gp_Pnt2d(0 , 10) , gp_Dir2d(1 , 1));
+
+ gp_Pln pln = gp_Pln(gp_Pnt(0 , 0 , 0) , gp_Dir(0 , 0 , 1));
+ Handle(Geom_Surface) surf = new Geom_Plane(pln);
+
+ Handle(Geom2d_Curve) aL1 = new Geom2d_Line(C1);
+ Handle(Geom2d_Curve) aC1 = new Geom2d_TrimmedCurve(aL1 , -20 , 20);
+ TopoDS_Edge aEdge1 = BRepBuilderAPI_MakeEdge(aC1 , surf);
+
+ Handle(Geom2d_Curve) aL2 = new Geom2d_Line(C2);
+ Handle(Geom2d_Curve) aC2 = new Geom2d_TrimmedCurve(aL2 , -20 , 20);
+ TopoDS_Edge aEdge2 = BRepBuilderAPI_MakeEdge(aC2 , surf);
+
+ Handle(AIS_InteractiveObject) ais1 = new MAisDemo(aEdge1);
+ myContext->Display(ais1 , 1 , 0 , false);
+ Handle(AIS_InteractiveObject) ais2 = new MAisDemo(aEdge2);
+ myContext->Display(ais2 , 1 , 0 , false);
+
+ GccAna_Circ2d2TanRad Solver(GccEnt::Enclosed(C1) , GccEnt::Outside(C2) , 1 , 0);
+ std::cout << Solver.NbSolutions() << std::endl;
+
+ gp_Circ2d c = Solver.ThisSolution(1);
+
+ Handle(Geom2d_Curve) aCir = new Geom2d_Circle(c);
+ TopoDS_Edge aEdge3 = BRepBuilderAPI_MakeEdge(aCir , surf);
+ Handle(AIS_InteractiveObject) ais3 = new MAisDemo(aEdge3);
+ myContext->Display(ais3 , 1 , 0 , false);
+
+ }
+ else if (cbb_BRepBuilderAPI->currentText() == "GeomFill_BSplineCurves")
+ {
+ std::vector pnts = { gp_Pnt(0 , 0 , 0) ,gp_Pnt(0 , 100 , 0) ,gp_Pnt(100 , 150 , 0) ,gp_Pnt(200 , 200 , 0) };
+ for (auto p : pnts)
+ {
+ TopoDS_Vertex aVertex = BRepBuilderAPI_MakeVertex(p);
+ Handle(AIS_InteractiveObject) aisVertex = new MAisDemo(aVertex);
+ myContext->Display(aisVertex , false);
+ }
+
+ Handle(Geom_BSplineCurve) C = createBSplineCurve(pnts);
+ TopoDS_Edge aEdge = BRepBuilderAPI_MakeEdge(C);
+ Handle(AIS_InteractiveObject) ais = new MAisDemo(aEdge);
+ myContext->Display(ais , 1 , 0 , false);
+
+ gp_Trsf T;
+ T.SetTranslation(gp_Vec(0 , 0 , 500));
+ Handle(Geom_Geometry) geom = C->Transformed(T);
+ Handle(Geom_BSplineCurve) C1 = Handle(Geom_BSplineCurve)::DownCast(geom);
+ TopoDS_Edge aEdge1 = BRepBuilderAPI_MakeEdge(C1);
+ Handle(AIS_InteractiveObject) ais1 = new MAisDemo(aEdge1);
+ myContext->Display(ais1 , 1 , 0 , false);
+
+ // 此方法的curve必须开放
+ GeomFill_BSplineCurves fill(C , C1 , GeomFill_StretchStyle);
+ Handle(Geom_Surface) suf = fill.Surface();
+ TopoDS_Face aFace = BRepBuilderAPI_MakeFace(suf , 0);
+ Handle(AIS_InteractiveObject) aisFace = new MAisDemo(aFace);
+ myContext->Display(aisFace , 1 , 0 , false);
+ }
+ else if (cbb_BRepBuilderAPI->currentText() == "Projection")
+ {
+ std::vector pnts = { gp_Pnt(0 , 0 , 0) ,gp_Pnt(0 , 100 , 0) ,gp_Pnt(100 , 150 , 0) ,gp_Pnt(200 , 200 , 0) };
+ for (auto p : pnts)
+ {
+ TopoDS_Vertex aVertex = BRepBuilderAPI_MakeVertex(p);
+ Handle(AIS_InteractiveObject) aisVertex = new MAisDemo(aVertex);
+ myContext->Display(aisVertex , false);
+ }
+
+ Handle(Geom_BSplineCurve) C = createBSplineCurve(pnts);
+ TopoDS_Edge aEdge = BRepBuilderAPI_MakeEdge(C);
+ Handle(AIS_InteractiveObject) ais = new MAisDemo(aEdge);
+ myContext->Display(ais , 1 , 0 , false);
+
+ gp_Trsf T;
+ T.SetTranslation(gp_Vec(0 , 0 , 500));
+ Handle(Geom_Geometry) geom = C->Transformed(T);
+ Handle(Geom_BSplineCurve) C1 = Handle(Geom_BSplineCurve)::DownCast(geom);
+ TopoDS_Edge aEdge1 = BRepBuilderAPI_MakeEdge(C1);
+ Handle(AIS_InteractiveObject) ais1 = new MAisDemo(aEdge1);
+ myContext->Display(ais1 , 1 , 0 , false);
+
+ // 此方法的curve必须开放
+ GeomFill_BSplineCurves fill(C , C1 , GeomFill_StretchStyle);
+ Handle(Geom_Surface) suf = fill.Surface();
+ TopoDS_Face aFace = BRepBuilderAPI_MakeFace(suf , 0);
+ Handle(AIS_InteractiveObject) aisFace = new MAisDemo(aFace);
+ myContext->Display(aisFace , 1 , 0 , false);
+
+ gp_Pnt pnt = gp_Pnt(50 , 50 , 100);
+ TopoDS_Vertex aVertex = BRepBuilderAPI_MakeVertex(pnt);
+ Handle(AIS_InteractiveObject) aisPnt = new MAisDemo(aVertex);
+ myContext->Display(aisPnt , false);
+
+ GeomAPI_ProjectPointOnSurf Proj(pnt , suf);
+
+ int NumSolutions = Proj.NbPoints();
+ std::cout << NumSolutions << std::endl;
+
+ for (int i = 1; i <= NumSolutions; ++i)
+ {
+ gp_Pnt pntProj = Proj.Point(i);
+ std::cout << "Project point: " << pntProj << std::endl;
+ TopoDS_Vertex aVertexProj = BRepBuilderAPI_MakeVertex(pntProj);
+ Handle(AIS_InteractiveObject) aisProj = new MAisDemo(aVertexProj);
+ myContext->Display(aisProj , false);
+
+ TopoDS_Edge aEdge = BRepBuilderAPI_MakeEdge(aVertex , aVertexProj);
+ Handle(AIS_InteractiveObject) aisEdgeProj = new MAisDemo(aEdge);
+ myContext->Display(aisEdgeProj , false);
+
+ Standard_Real U , V;
+ Proj.Parameters(i , U , V);
+ std::cout << "U: " << U << ", V: " << V << std::endl;
+
+ gp_Pnt pntRet;
+ //suf->D0(U , V , pntRet);
+ pntRet = suf->Value(U , V);// 同上
+ std::cout << "D0: " << pntRet << std::endl;
+
+ double D = Proj.Distance(i);
+ std::cout << "distance: " << D << std::endl;
+ }
+ }
+ else if (cbb_BRepBuilderAPI->currentText() == "Edge")
+ {
+ gp_Pnt pnt1(100 , 0 , 0);
+ gp_Pnt pnt2(200 , 0 , 0);
+
+ TopoDS_Vertex V1 = BRepBuilderAPI_MakeVertex(pnt1);
+ TopoDS_Vertex V2 = BRepBuilderAPI_MakeVertex(pnt2);
+ Handle(AIS_InteractiveObject) aisV1 = new MAisDemo(V1);
+ myContext->Display(aisV1 , 1 , 0 , false);
+ Handle(AIS_InteractiveObject) aisV2 = new MAisDemo(V2);
+ myContext->Display(aisV2 , 1 , 0 , false);
+
+ Handle(Geom_TrimmedCurve) C = GC_MakeSegment(pnt1 , pnt2);
+ double p1 = C->FirstParameter();
+ double p2 = C->LastParameter(); // 长度
+ std::cout << "first: " << p1 << ",last: " << p2 << std::endl;
+ gp_Pnt pntMid = C->Value(p2 * 0.5);
+ std::cout << "pntMid: " << pntMid << std::endl;
+ TopoDS_Edge E = BRepBuilderAPI_MakeEdge(C , p1 , p2);
+ //TopoDS_Edge E = BRepBuilderAPI_MakeEdge(pnt1 , pnt2);
+
+ Handle(AIS_InteractiveObject) aisEdge = new MAisDemo(E);
+ myContext->Display(aisEdge , 1 , 0 , false);
+
+ gp_Ax2 Origin = gp::XOY();
+ //0:X轴,M_PI:-X轴
+ BRepBuilderAPI_MakeEdge ME(gp_Circ(Origin , 100) , 0 , M_PI);
+ Handle(AIS_InteractiveObject) aisME = new MAisDemo(ME);
+ myContext->Display(aisME , 1 , 0 , false);
+ }
+ else if (cbb_BRepBuilderAPI->currentText() == "Polygon")
+ {
+ std::vector pnts = { gp_Pnt(100 , 0 , 0) ,gp_Pnt(200 , 200 , 0) ,
+ gp_Pnt(300 , 100 , 0) ,gp_Pnt(0 , 500 , 300) };
+
+ BRepBuilderAPI_MakePolygon MP;
+ for (auto p : pnts)
+ {
+ MP.Add(p);
+ }
+ //MP.Close();
+ TopoDS_Wire aWire = MP.Wire();
+ Handle(AIS_InteractiveObject) aisWire = new MAisDemo(aWire);
+ myContext->Display(aisWire , false);
+ }
+ else if (cbb_BRepBuilderAPI->currentText() == "Face")
+ {
+ std::vector pnts = { gp_Pnt(0 , 0 , 0) ,gp_Pnt(0 , 100 , 0) ,gp_Pnt(100 , 150 , 0) ,gp_Pnt(200 , 200 , 0) };
+ for (auto p : pnts)
+ {
+ TopoDS_Vertex aPnt = BRepBuilderAPI_MakeVertex(p);
+ Handle(AIS_InteractiveObject) aisPnt = new MAisDemo(aPnt);
+ myContext->Display(aisPnt , false);
+ }
+
+ Handle(Geom_BSplineCurve) C = createBSplineCurve(pnts);
+ TopoDS_Edge aEdge = BRepBuilderAPI_MakeEdge(C);
+ Handle(AIS_InteractiveObject) ais = new MAisDemo(aEdge);
+ myContext->Display(ais , 1 , 0 , false);
+
+ gp_Trsf T;
+ T.SetTranslation(gp_Vec(0 , 0 , 500));
+ Handle(Geom_Geometry) geom = C->Transformed(T);
+ Handle(Geom_BSplineCurve) C1 = Handle(Geom_BSplineCurve)::DownCast(geom);
+ TopoDS_Edge aEdge1 = BRepBuilderAPI_MakeEdge(C1);
+ Handle(AIS_InteractiveObject) ais1 = new MAisDemo(aEdge1);
+ myContext->Display(ais1 , 1 , 0 , false);
+
+ // 此方法的curve必须开放
+ GeomFill_BSplineCurves fill(C , C1 , GeomFill_StretchStyle);
+ Handle(Geom_Surface) suf = fill.Surface();
+ //TopoDS_Face aFace = BRepBuilderAPI_MakeFace(suf , 0);
+
+ double umin , umax , vmin , vmax;
+ suf->Bounds(umin , umax , vmin , vmax);
+ std::cout << "umin: " << umin << ",umax: " << umax << ",vmin: " << vmin << ",vmax: " << vmax << std::endl;
+ TopoDS_Face aFace = BRepBuilderAPI_MakeFace(suf , umax * 0.2 , umax * 0.5 , vmin , vmax * 0.5 , 0);
+
+ Handle(AIS_InteractiveObject) aisFace = new MAisDemo(aFace);
+ myContext->Display(aisFace , 1 , 0 , false);
+ }
+ else if (cbb_BRepBuilderAPI->currentText() == "Wire")
+ {
+ std::vector pnts = { gp_Pnt(100,0,0), gp_Pnt(200,0,0), gp_Pnt(150,100,0), gp_Pnt(500,200,0) };
+
+ BRepBuilderAPI_MakeWire MW;
+ for (int i = 0; i < pnts.size() - 1; ++i)
+ {
+ // 已有Edge必须有点可使新Edge首尾相连
+ //if (i % 2 == 0)
+ //{
+ // TopoDS_Edge E = BRepBuilderAPI_MakeEdge(pnts[i] , pnts[i + 1]);
+ // Handle(AIS_InteractiveObject) aisEdge = new AIS_Shape(E);
+ // myContext->Display(aisEdge , 1 , 0 , false);
+ // MW.Add(E);
+ //}
+ TopoDS_Edge E = BRepBuilderAPI_MakeEdge(pnts[i] , pnts[i + 1]);
+ MW.Add(E);
+ }
+ TopoDS_Wire W = MW;
+ Handle(AIS_InteractiveObject) aisWire = new AIS_Shape(W);
+ myContext->Display(aisWire , 1 , 0 , false);
+ }
+ else if (cbb_BRepBuilderAPI->currentText() == "Shell")
+ {
+ std::vector pnts = { gp_Pnt(100,0,0), gp_Pnt(200,100,0), gp_Pnt(250,300,0), gp_Pnt(500,400,0) };
+ std::vector pnts1 = { gp_Pnt(0,0,300), gp_Pnt(0,100,300), gp_Pnt(200,200,300), gp_Pnt(300,250,300) };
+
+ Handle(Geom_BSplineCurve) C = createBSplineCurve(pnts);
+ Handle(Geom_BSplineCurve) C1 = createBSplineCurve(pnts1);
+
+ gp_Trsf T;
+ T.SetTranslation(gp_Vec(500 , 0 , 0));
+ Handle(Geom_Geometry) geom = C->Transformed(T);
+ Handle(Geom_BSplineCurve) C2 = Handle(Geom_BSplineCurve)::DownCast(geom);
+
+ T.SetTranslation(gp_Vec(500 , 0 , 300));
+ Handle(Geom_Geometry) geom1 = C1->Transformed(T);
+ Handle(Geom_BSplineCurve) C3 = Handle(Geom_BSplineCurve)::DownCast(geom1);
+
+ std::vector curves = { C,C1,C3,C2,C };
+ //for (int i = 0; i < curves.size() - 1; ++i)
+ //{
+ // GeomFill_BSplineCurves fill(curves[i] , curves[i + 1] , GeomFill_StretchStyle);
+ // Handle(Geom_Surface) suf = fill.Surface();
+ // // MakeShell只能一个面一个面的构造
+ // TopoDS_Shell shell = BRepBuilderAPI_MakeShell(suf);
+
+ // Handle(AIS_InteractiveObject) aisshell = new MAisDemo(shell);
+ // myContext->Display(aisshell , 1 , 0 , false);
+ //}
+
+ // 此方法可添加多个面
+ TopoDS_Shell shell;
+ BRep_Builder builder;
+ builder.MakeShell(shell);
+ for (int i = 0; i < curves.size() - 1; ++i)
+ {
+ GeomFill_BSplineCurves fill(curves[i] , curves[i + 1] , GeomFill_StretchStyle);
+ Handle(Geom_Surface) suf = fill.Surface();
+
+ TopoDS_Face face = BRepBuilderAPI_MakeFace(suf , 0);
+ builder.Add(shell , face);
+ }
+ TopAbs::Print(shell.ShapeType() , std::cout);
+ Handle(AIS_InteractiveObject) aisshell = new MAisDemo(shell);
+ myContext->Display(aisshell , 1 , 0 , false);
+ }
+ else if (cbb_BRepBuilderAPI->currentText() == "Solid")
+ {
+ std::vector pnts = { gp_Pnt(100,0,0), gp_Pnt(200,100,0), gp_Pnt(250,300,0), gp_Pnt(500,400,0) };
+ std::vector pnts1 = { gp_Pnt(0,0,300), gp_Pnt(0,100,300), gp_Pnt(200,200,300), gp_Pnt(300,250,300) };
+
+ Handle(Geom_BSplineCurve) C = createBSplineCurve(pnts);
+ Handle(Geom_BSplineCurve) C1 = createBSplineCurve(pnts1);
+
+ gp_Trsf T;
+ T.SetTranslation(gp_Vec(500 , 0 , 0));
+ Handle(Geom_Geometry) geom = C->Transformed(T);
+ Handle(Geom_BSplineCurve) C2 = Handle(Geom_BSplineCurve)::DownCast(geom);
+
+ T.SetTranslation(gp_Vec(500 , 0 , 300));
+ Handle(Geom_Geometry) geom1 = C1->Transformed(T);
+ Handle(Geom_BSplineCurve) C3 = Handle(Geom_BSplineCurve)::DownCast(geom1);
+
+ std::vector curves = { C,C1,C3,C2,C };
+ BRepBuilderAPI_MakeSolid solidBuilder;
+ for (int i = 0; i < curves.size() - 1; ++i)
+ {
+ GeomFill_BSplineCurves fill(curves[i] , curves[i + 1] , GeomFill_StretchStyle);
+ Handle(Geom_Surface) suf = fill.Surface();
+ TopoDS_Shell shell = BRepBuilderAPI_MakeShell(suf);
+ TopAbs::Print(shell.ShapeType() , std::cout);
+ std::cout << std::endl;
+ solidBuilder.Add(shell);
+ }
+ Handle(AIS_InteractiveObject) aisSolid = new MAisDemo(solidBuilder.Solid());
+ TopAbs::Print(solidBuilder.Solid().ShapeType() , std::cout);
+ std::cout << std::endl;
+ myContext->Display(aisSolid , 1 , 0 , false);
+ }
+
+ view_occt->fitAll();
+}
+
+void MainWindow::runBRepPrimAPI()
+{
+ if (cbb_BRepPrimAPI->currentText() == "Making Primitives")
+ {
+ TopoDS_Shape Box = BRepPrimAPI_MakeBox(10 , 20 , 30);
+ Handle(AIS_InteractiveObject) aisBox = new MAisDemo(Box);
+ myContext->Display(aisBox , 1 , 0 , false);
+
+ TopoDS_Shape Cone = BRepPrimAPI_MakeCone(10 , 5 , 30, M_PI * 2);
+ Handle(AIS_InteractiveObject) aisCone = new MAisDemo(Cone);
+ myContext->Display(aisCone , 1 , 0 , false);
+
+ gp_Trsf T;
+ T.SetTranslation(gp_Vec(0 , 50 , 0));
+ aisCone->SetLocalTransformation(T);
+
+ TopoDS_Shape Cylinder = BRepPrimAPI_MakeCylinder(10 , 30 , M_PI * 2);
+ Handle(AIS_InteractiveObject) aisCylinder = new MAisDemo(Cylinder);
+ myContext->Display(aisCylinder , 1 , 0 , false);
+ T.SetTranslation(gp_Vec(0 , 100 , 0));
+ aisCylinder->SetLocalTransformation(T);
+
+ TopoDS_Shape Sphere = BRepPrimAPI_MakeSphere(10 );
+ Handle(AIS_InteractiveObject) aisSphere = new MAisDemo(Sphere);
+ myContext->Display(aisSphere , 1 , 0 , false);
+ T.SetTranslation(gp_Vec(0 , 150 , 0));
+ aisSphere->SetLocalTransformation(T);
+ }
+ else if (cbb_BRepPrimAPI->currentText() == "Rotation object")
+ {
+ std::vector pnts = { gp_Pnt(100,0,100), gp_Pnt(200,0,200), gp_Pnt(150,0,300), gp_Pnt(400,0,500) };
+ Handle(Geom_BSplineCurve) C = createBSplineCurve(pnts);
+ TopoDS_Shape aEdge = BRepBuilderAPI_MakeEdge(C);
+ Handle(AIS_InteractiveObject) aisEdge = new MAisDemo(aEdge);
+ myContext->Display(aisEdge , 1 , 0 , false);
+ // 只支持Z轴,自动封口,曲线斜率有一定要求
+ BRepPrimAPI_MakeRevolution revolutionBuilder(C , M_PI / 2);
+ TopoDS_Shape aShape = revolutionBuilder.Solid();
+ Handle(AIS_InteractiveObject) aisShape = new MAisDemo(aShape);
+ myContext->Display(aisShape , 1 , 0 , false);
+ }
+ else if (cbb_BRepPrimAPI->currentText() == "Rotational Sweep")
+ {
+ std::vector pnts = { gp_Pnt(300,0,100), gp_Pnt(400,0,200), gp_Pnt(350,0,300),
+ gp_Pnt(300,0,500) };
+ Handle(Geom_BSplineCurve) C = createBSplineCurve(pnts);
+ C->SetPeriodic();
+ TopoDS_Edge aEdge = BRepBuilderAPI_MakeEdge(C);
+ TopoDS_Wire aWire = BRepBuilderAPI_MakeWire(aEdge);
+ TopoDS_Face aFace = BRepBuilderAPI_MakeFace(aWire);
+ Handle(AIS_InteractiveObject) aisFace = new MAisDemo(aFace);
+ myContext->Display(aisFace , 1 , 0 , false);
+
+ gp_Ax1 axis(gp_Pnt(0 , 0 , 0) , gp_Dir(0 , 0 , 1));
+ TopoDS_Shape R1 = BRepPrimAPI_MakeRevol(aFace , axis , M_PI / 2);
+ //TopoDS_Shape R1 = BRepPrimAPI_MakeRevol(aFace , gp::OZ() , M_PI / 2);
+
+ Handle(AIS_InteractiveObject) aisRotation = new MAisDemo(R1);
+ myContext->Display(aisRotation , 1 , 0 , false);
+ }
+ else if (cbb_BRepPrimAPI->currentText() == "Prism")
+ {
+ std::vector pnts = { gp_Pnt(100,100,0), gp_Pnt(200,200,0), gp_Pnt(150,300,0), gp_Pnt(-400,500,0) };
+ Handle(Geom_BSplineCurve) C = createBSplineCurve(pnts);
+ C->SetPeriodic(); // 也可在pnts追加起点,曲线会更加光滑。
+ TopoDS_Edge aEdge = BRepBuilderAPI_MakeEdge(C);
+ TopoDS_Wire aWire = BRepBuilderAPI_MakeWire(aEdge);
+ TopoDS_Face aFace = BRepBuilderAPI_MakeFace(aWire);
+ Handle(AIS_InteractiveObject) aisFace = new MAisDemo(aFace);
+ myContext->Display(aisFace , 1 , 0 , false);
+
+ BRepAdaptor_Surface surface(aFace);
+ gp_Dir direc = surface.Plane().Axis().Direction();
+ //gp_Dir direc(0 , 0 , 1);
+ gp_Vec v = direc;
+ v *= 100;
+ TopoDS_Shape P1 = BRepPrimAPI_MakePrism(aFace , v);
+ //TopoDS_Shape P1 = BRepPrimAPI_MakePrism(aFace , direc);
+ //TopoDS_Shape P1 = BRepPrimAPI_MakePrism(aFace , direc,false);
+
+ Handle(AIS_InteractiveObject) aisPrism = new MAisDemo(P1);
+ myContext->Display(aisPrism , 1 , 0 , false);
+ }
+ else if (cbb_BRepPrimAPI->currentText() == "Boolean Operations")
+ {
+ TopoDS_Shape box = BRepPrimAPI_MakeBox(10 , 20 , 30);
+ Handle(AIS_InteractiveObject) aisBox = new MAisDemo(box);
+ myContext->Display(aisBox , 1 , 0 , false);
+
+ TopoDS_Shape sphere = BRepPrimAPI_MakeSphere(gp_Pnt(10 , 5 , 0) , 5);
+ Handle(AIS_InteractiveObject) aissphere = new MAisDemo(sphere);
+ myContext->Display(aissphere , 1 , 0 , false);
+
+ TopoDS_Shape aFuse = BRepAlgoAPI_Fuse(box , sphere);
+ TopAbs::Print(aFuse.ShapeType() , std::cout);
+ std::cout << std::endl;
+ Handle(AIS_InteractiveObject) aisFuse = new MAisDemo(aFuse);
+ myContext->Display(aisFuse , 1 , 0 , false);
+ gp_Trsf T;
+ T.SetTranslation(gp_Vec(50 , 0 , 0));
+ aisFuse->SetLocalTransformation(T);
+
+ TopoDS_Shape aCut = BRepAlgoAPI_Cut(box , sphere);
+ TopAbs::Print(aCut.ShapeType() , std::cout);
+ std::cout << std::endl;
+ Handle(AIS_InteractiveObject) aisCut = new MAisDemo(aCut);
+ myContext->Display(aisCut , 1 , 0 , false);
+ T.SetTranslation(gp_Vec(100 , 0 , 0));
+ aisCut->SetLocalTransformation(T);
+
+ TopoDS_Shape aCommon = BRepAlgoAPI_Common(box , sphere);
+ TopAbs::Print(aCommon.ShapeType() , std::cout);
+ std::cout << std::endl;
+ Handle(AIS_InteractiveObject) aisCommon = new MAisDemo(aCommon);
+ myContext->Display(aisCommon , 1 , 0 , false);
+ T.SetTranslation(gp_Vec(150 , 0 , 0));
+ aisCommon->SetLocalTransformation(T);
+
+ // 相交的截面(由edge组成)
+ TopoDS_Shape aSection = BRepAlgoAPI_Section(box , sphere);
+ TopAbs::Print(aSection.ShapeType() , std::cout);
+ std::cout << std::endl;
+ Handle(AIS_InteractiveObject) aisSection = new MAisDemo(aSection);
+ myContext->Display(aisSection , 1 , 0 , false);
+ T.SetTranslation(gp_Vec(200 , 0 , 0));
+ aisSection->SetLocalTransformation(T);
+
+ Handle(Geom_Plane) geomPln = new Geom_Plane(gp_Pnt(0 , 0 , 20) , gp_Dir(0 , 0 , 1));
+ BRepBuilderAPI_MakeShell aShell = BRepBuilderAPI_MakeShell(geomPln , -15 , 15 , -25 , 25);
+ Handle(AIS_InteractiveObject) aisShell = new MAisDemo(aShell);
+ myContext->Display(aisShell , 1 , 0 , false);
+
+ // 只能shell为object,solid为tool
+ TopoDS_Shape aCutShell = BRepAlgoAPI_Cut(aShell , box);
+ TopAbs::Print(aCutShell.ShapeType() , std::cout);
+ std::cout << std::endl;
+ Handle(AIS_InteractiveObject) aisCutShell = new MAisDemo(aCutShell);
+ myContext->Display(aisCutShell , 1 , 0 , false);
+ T.SetTranslation(gp_Vec(0 , 100 , 0));
+ aisCutShell->SetLocalTransformation(T);
+ }
+ else if (cbb_BRepPrimAPI->currentText() == "Getting normal for the face")
+ {
+ Handle(Geom_Plane) geomPln = new Geom_Plane(gp_Pnt(0,0,0), gp::DZ());
+ TopoDS_Face aFace = BRepBuilderAPI_MakeFace(geomPln , -100 , 100 , -50 , 50 , 0);
+ Handle(AIS_InteractiveObject) aisFace = new MAisDemo(aFace);
+ myContext->Display(aisFace , 1 , 0 , false);
+ gp_Trsf T;
+ T.SetRotation(gp::OY(), M_PI / 4);
+ aisFace->SetLocalTransformation(T);
+
+ Handle(Geom_Surface) sur = BRep_Tool::Surface(aFace);
+ gp_Trsf T1 = aisFace->Transformation();
+ sur->Transform(T1);
+
+ gp_Dir dir;
+ gp_Pnt pnt;
+ sur->D0(0 , 0, pnt);
+ BOPTools_AlgoTools3D::GetNormalToSurface(sur , 0 , 0 , dir);
+ Handle(AIS_Axis) axis = new AIS_Axis(gp_Ax1(pnt ,dir), 100);
+ axis->SetColor(Quantity_NOC_YELLOW);
+ myContext->Display(axis , 1 , 0 , false);
+
+ BRepAdaptor_Surface surface(aFace);
+ gp_Dir dir1 = surface.Plane().Axis().Direction();
+ gp_Pnt pnt1;
+ sur->D0(50 , 20 , pnt1);
+ Handle(AIS_Axis) axis1 = new AIS_Axis(gp_Ax1(pnt1 , dir1) , 100);
+ axis1->SetColor(Quantity_NOC_PURPLE);
+ myContext->Display(axis1 , 1 , 0 , false);
+ }
+ else if (cbb_BRepPrimAPI->currentText() == "History support")
+ {
+ TopoDS_Shape aS = BRepPrimAPI_MakeBox(10 , 20 , 30);
+ Handle(AIS_InteractiveObject) aisS = new MAisDemo(aS);
+ myContext->Display(aisS , 1 , 0 , false);
+
+ gp_Trsf T;
+ T.SetTranslation(gp_Vec(0 , 0 , 100));
+ BRepBuilderAPI_Transform trsf(aS , T);
+
+ //TopTools_ListOfShape anArguments;
+ //anArguments.Append(aS);
+ //BRepTools_History aHistory(anArguments , trsf);
+
+ BRepTools_History aHistory;
+ aHistory.AddModified(aS , trsf);
+
+ TopoDS_Shape res = aHistory.Modified(aS).Last();
+ T.SetTranslation(gp_Vec(50 , 50 , 0));
+ BRepBuilderAPI_Transform trsf1(res , T);
+ aHistory.AddModified(aS , trsf1);
+
+ TopoDS_Shape res1 = aHistory.Modified(aS).Last();
+ T.SetTranslation(gp_Vec(0 , 0 , 50));
+ BRepBuilderAPI_Transform trsf2(res1 , T);
+ aHistory.AddModified(aS , trsf2);
+
+ TopTools_ListOfShape aMo = aHistory.Modified(aS);
+ std::cout << aMo.Size() << std::endl;
+ for (auto it = aMo.begin(); it != aMo.end(); ++it)
+ {
+ Handle(AIS_InteractiveObject) ais = new MAisDemo(*it);
+ myContext->Display(ais , 1 , 0 , false);
+ }
+ aHistory.Dump(std::cout);
+ std::cout << std::endl;
+
+ gp_Pnt pnt(100 , 100 , 0);
+ pnt.DumpJson(std::cout);
+ std::cout << std::endl;
+
+ aS.DumpJson(std::cout);
+ }
+ else if (cbb_BRepPrimAPI->currentText() == "Fillets and Chamfers")
+ {
+ TopoDS_Solid Box = BRepPrimAPI_MakeBox(100 , 200 , 300);
+ BRepFilletAPI_MakeFillet MFFillet(Box);
+ TopExp_Explorer ex(Box , TopAbs_EDGE);
+ double r = 10.;
+ int i = 0;
+ // 一个MFFillet实例中选相邻边正常倒角,
+ // 若先倒角一条边,再新创建了个MFFillet实例,倒相邻边,那么会给与两相邻边都相邻的第三条边也倒角
+ while (ex.More())
+ {
+ if (i == 0 || i == 1)
+ {
+ MFFillet.Add(r , TopoDS::Edge(ex.Current()));
+ }
+ i++;
+ ex.Next();
+ }
+ Handle(AIS_InteractiveObject) aisFillet = new MAisDemo(MFFillet.Shape());
+ myContext->Display(aisFillet , 1 , 0 , false);
+
+ TopoDS_Solid BoxChamfer = BRepPrimAPI_MakeBox(gp_Pnt(200 , 0 , 0) , 100 , 200 , 300);
+ BRepFilletAPI_MakeChamfer MFChamfer(BoxChamfer);
+ TopExp_Explorer exChamfer(BoxChamfer , TopAbs_EDGE);
+ double rChamfer = 10.;
+ while (exChamfer.More())
+ {
+ MFChamfer.Add(rChamfer , TopoDS::Edge(exChamfer.Current()));
+ exChamfer.Next();
+ }
+ Handle(AIS_InteractiveObject) aisChamfer = new MAisDemo(MFChamfer.Shape());
+ myContext->Display(aisChamfer , 1 , 0 , false);
+
+ TopoDS_Solid BoxFillet2d = BRepPrimAPI_MakeBox(gp_Pnt(400 , 0 , 0) , 100 , 200 , 300);
+ TopExp_Explorer ex1(BoxFillet2d , TopAbs_FACE);
+
+ TopoDS_Face F = TopoDS::Face(ex1.Current());
+ BRepFilletAPI_MakeFillet2d MFFillet2d(F);
+ double rFillet2d = 20;
+ TopTools_IndexedMapOfShape mapVertex;
+ // 教程错误,以下为修正后代码
+ TopExp::MapShapes(F , TopAbs_VERTEX , mapVertex);
+ for (int i = 1; i <= mapVertex.Size(); ++i)
+ {
+ MFFillet2d.AddFillet(TopoDS::Vertex(mapVertex(i)) , rFillet2d);
+ }
+
+ Handle(AIS_InteractiveObject) aisFillet2d = new MAisDemo(MFFillet2d.Shape());
+ myContext->Display(aisFillet2d , 1 , 0 , false);
+ }
+
+ view_occt->fitAll();
+}
+
+void MainWindow::runBRepOffsetAPI()
+{
+ if (cbb_BRepOffsetAPI->currentText() == "MakePipe")
+ {
+ Handle(Geom_Circle) C = new Geom_Circle(gp_Ax2(gp_Pnt(500 , 0 , 0) , gp::DY()) , 100);
+ TopoDS_Edge aEdge = BRepBuilderAPI_MakeEdge(C);
+ TopoDS_Wire aWire = BRepBuilderAPI_MakeWire(aEdge);
+ TopoDS_Face aFace = BRepBuilderAPI_MakeFace(aWire);
+ Handle(AIS_InteractiveObject) aisWire = new MAisDemo(aWire);
+ myContext->Display(aisWire , 1 , 0 , false);
+ Handle(AIS_InteractiveObject) aisFace = new MAisDemo(aFace);
+ myContext->Display(aisFace , 1 , 0 , false);
+
+ std::vector pntsPath = { gp_Pnt(0,100,100), gp_Pnt(0,200,300), gp_Pnt(0,400,300), gp_Pnt(0,500,500) };
+ Handle(Geom_BSplineCurve) CPath = createBSplineCurve(pntsPath);
+ TopoDS_Edge aEdgePath = BRepBuilderAPI_MakeEdge(CPath);
+ TopoDS_Wire aWirePath = BRepBuilderAPI_MakeWire(aEdgePath);
+ Handle(AIS_InteractiveObject) aisWirePath = new MAisDemo(aWirePath);
+ myContext->Display(aisWirePath , 1 , 0 , false);
+
+ int startParam = CPath->FirstParameter();
+ TopoDS_Shape aProfileNew = correctionProfile(aFace , gp_Pnt(500 , 0 , 0) , CPath , startParam);
+
+ // 需将profile的中心点旋转/移动到path起点处
+ TopoDS_Shape P = BRepOffsetAPI_MakePipe(aWirePath , aProfileNew);
+ TopAbs::Print(P.ShapeType() , std::cout);
+ Handle(AIS_InteractiveObject) aisPipe = new MAisDemo(P);
+ myContext->Display(aisPipe , 1 , 0 , false);
+ }
+ else if (cbb_BRepOffsetAPI->currentText() == "Offset computation")
+ {
+ gp_Pln aPln = gp_Pln(gp_Pnt(0 , 0 , 0) , gp_Dir(0 , 0 , 1));
+ TopoDS_Shape aShape = BRepBuilderAPI_MakeFace(aPln , 0 , 10 , 0 , 10);
+ //TopoDS_Shape aShape = BRepPrimAPI_MakeBox(10 , 20 , 30);
+ Handle(AIS_InteractiveObject) aisShape = new MAisDemo(aShape);
+ myContext->Display(aisShape , 1 , 0 , false);
+
+ BRepOffsetAPI_MakeOffsetShape OffsetMaker1;
+ double OffsetValue = 5.;
+ OffsetMaker1.PerformByJoin(aShape , OffsetValue , Precision::Confusion());
+ //OffsetMaker1.PerformBySimple(aShape , OffsetValue);
+ TopoDS_Shape NewShape;
+ if (OffsetMaker1.IsDone())
+ NewShape = OffsetMaker1.Shape();
+ Handle(AIS_InteractiveObject) aisOffset = new MAisDemo(NewShape);
+ myContext->Display(aisOffset , 1 , 0 , false);
+ gp_Trsf T;
+ T.SetTranslation(gp_Vec(50 , 0 , 0));
+ aisOffset->SetLocalTransformation(T);
+ }
+ else if (cbb_BRepOffsetAPI->currentText() == "Shelling")
+ {
+ TopoDS_Shape SolidInitial = BRepPrimAPI_MakeBox(10 , 20 , 30);
+ Handle(AIS_InteractiveObject) aisInitial = new MAisDemo(SolidInitial , true);
+ myContext->Display(aisInitial , 1 , 0 , false);
+
+ TopTools_ListOfShape LCF;
+ TopExp_Explorer ex(SolidInitial , TopAbs_FACE);
+ int i = 1;
+ while (ex.More())
+ {
+ if (i == 2 || i == 6)
+ //if (i == 6)
+ {
+ LCF.Append(ex.Current());
+ }
+
+ ex.Next();
+ ++i;
+ }
+
+ BRepOffsetAPI_MakeThickSolid SolidMaker;
+ double Of = 2.;
+ SolidMaker.MakeThickSolidByJoin(SolidInitial , LCF , Of , Precision::Confusion());
+ TopoDS_Shape Result;
+ if (SolidMaker.IsDone())
+ Result = SolidMaker.Shape();
+ Handle(AIS_InteractiveObject) aisOffset = new MAisDemo(Result);
+ myContext->Display(aisOffset , 1 , 0 , false);
+ gp_Trsf T;
+ T.SetTranslation(gp_Vec(50 , 0 , 0));
+ aisOffset->SetLocalTransformation(T);
+
+ double Of1 = -2.;
+ SolidMaker.MakeThickSolidByJoin(SolidInitial , LCF , Of1 , Precision::Confusion());
+ Handle(AIS_InteractiveObject) aisOffset1 = new MAisDemo(SolidMaker.Shape());
+ myContext->Display(aisOffset1 , 1 , 0 , false);
+ T.SetTranslation(gp_Vec(100 , 0 , 0));
+ aisOffset1->SetLocalTransformation(T);
+ }
+ else if (cbb_BRepOffsetAPI->currentText() == "loft")
+ {
+ Handle(Geom_Circle) c = new Geom_Circle(gp_Ax2(gp_Pnt(0 , 0 , 0) , gp_Dir(1 , 0 , 0)) , 10);
+ TopoDS_Edge e = BRepBuilderAPI_MakeEdge(c);
+ BRepBuilderAPI_MakeWire w;
+ w.Add(e);
+ TopoDS_Wire aProfile = w.Wire();
+
+ Handle(Geom_Circle) c1 = new Geom_Circle(gp_Ax2(gp_Pnt(100 , 100 , 0) , gp_Dir(1 , 0 , 0)) , 20);
+ TopoDS_Edge e1 = BRepBuilderAPI_MakeEdge(c1);
+ BRepBuilderAPI_MakeWire w1;
+ w1.Add(e1);
+ TopoDS_Wire aProfile1 = w1.Wire();
+
+ Handle(Geom_Circle) c2 = new Geom_Circle(gp_Ax2(gp_Pnt(300 , 500 , 0) , gp_Dir(-1 , 1 , 0)) , 40);
+ TopoDS_Edge e2 = BRepBuilderAPI_MakeEdge(c2);
+ BRepBuilderAPI_MakeWire w2;
+ w2.Add(e2);
+ TopoDS_Wire aProfile2 = w2.Wire();
+
+ TopoDS_Edge e3 = BRepBuilderAPI_MakeEdge(gp_Pnt(300 , 500 , 0) , gp_Pnt(400 , 600 , -200));
+ TopoDS_Edge e4 = BRepBuilderAPI_MakeEdge(gp_Pnt(400 , 600 , -200) , gp_Pnt(400 , 600 , 200));
+ TopoDS_Edge e5 = BRepBuilderAPI_MakeEdge(gp_Pnt(400 , 600 , 200) , gp_Pnt(300 , 500 , 0));
+ BRepBuilderAPI_MakeWire w3;
+ w3.Add(e3);
+ w3.Add(e4);
+ w3.Add(e5);
+ TopoDS_Wire aProfile3 = w3.Wire();
+
+ // profile中心点在曲线时,需调整法线方向,否则生成异常。没有pipeShell好用
+ // 支持不同形状profile
+ BRepOffsetAPI_ThruSections loft(true , false);
+ loft.AddWire(aProfile);
+ loft.AddWire(aProfile1);
+ loft.AddWire(aProfile3);
+
+ TopoDS_Shape aShape = loft.Shape();
+ Handle(AIS_InteractiveObject) ais = new MAisDemo(aShape);
+ myContext->Display(ais , 1 , 0 , false);
+ }
+ else if (cbb_BRepOffsetAPI->currentText() == "PipeShell")
+ {
+ std::vector pnts = { gp_Pnt(0,0,0), gp_Pnt(50,20,0), gp_Pnt(80,60,0) };
+ BRepBuilderAPI_MakePolygon MP;
+ for (auto p : pnts)
+ {
+ MP.Add(p);
+ }
+ TopoDS_Wire path = MP.Wire();
+ Handle(AIS_InteractiveObject) aisPath = new MAisDemo(path);
+ myContext->Display(aisPath , 1 , 0 , false);
+
+ Handle(Geom_Circle) cir = new Geom_Circle(gp_Ax2(gp_Pnt(0 , 0 , 0) , gp_Dir(1 , 0 , 0)) , 5);
+ TopoDS_Shape aProfile = BRepBuilderAPI_MakeWire(BRepBuilderAPI_MakeEdge(cir));
+ Handle(AIS_InteractiveObject) aisProfile = new MAisDemo(aProfile);
+ myContext->Display(aisProfile , 1 , 0 , false);
+
+ BRepOffsetAPI_MakePipeShell PipeShell(TopoDS::Wire(path));
+
+ // WithContact将profile移动到path上,WithCorrection自动调整法向量与path相符(相比手动调整位置来说不太好用,建议手动调整)
+ // 添加多个profile时,需将所有profile中心点放在path上,e.g. profile1放在第二个构造点,后续自动生成渐变的profile
+ // 支持不同形状profile
+ PipeShell.Add(aProfile , false , true);
+ Handle(AIS_InteractiveObject) ais = new MAisDemo(PipeShell.Shape());
+ myContext->Display(ais , 1 , 0 , false);
+
+ PipeShell.SetTransitionMode(BRepBuilderAPI_RightCorner);
+ PipeShell.Build();
+ Handle(AIS_InteractiveObject) ais1 = new MAisDemo(PipeShell.Shape());
+ myContext->Display(ais1 , 1 , 0 , false);
+ gp_Trsf T;
+ T.SetTranslation(gp_Vec(0 , 0 , 20));
+ ais1->SetLocalTransformation(T);
+
+ PipeShell.SetTransitionMode(BRepBuilderAPI_RoundCorner);
+ PipeShell.Build();
+ Handle(AIS_InteractiveObject) ais2 = new MAisDemo(PipeShell.Shape());
+ myContext->Display(ais2 , 1 , 0 , false);
+ T.SetTranslation(gp_Vec(0 , 0 , 40));
+ ais2->SetLocalTransformation(T);
+
+ Handle(Geom_Circle) cir1 = new Geom_Circle(
+ gp_Ax2(gp_Pnt(80 , 60 , 0) , gp_Vec(gp_Pnt(50 , 20 , 0) , gp_Pnt(80 , 60 , 0))) ,
+ 10);
+ TopoDS_Shape aProfile1 = BRepBuilderAPI_MakeWire(BRepBuilderAPI_MakeEdge(cir1));
+ Handle(AIS_InteractiveObject) aisProfile1 = new MAisDemo(aProfile1);
+ myContext->Display(aisProfile1 , 1 , 0 , false);
+
+ // 添加多个profile时,sharpPath的过渡生成不理想,自动过渡比较耗时
+ PipeShell.SetTransitionMode(BRepBuilderAPI_Transformed);
+ //PipeShell.SetTransitionMode(BRepBuilderAPI_RightCorner);
+ PipeShell.Add(aProfile1);
+ PipeShell.Build();
+ Handle(AIS_InteractiveObject) ais3 = new MAisDemo(PipeShell.Shape());
+ myContext->Display(ais3 , 1 , 0 , false);
+ T.SetTranslation(gp_Vec(0 , 0 , 60));
+ ais3->SetLocalTransformation(T);
+
+ // 曲线路径
+ std::vector pnts1 = { gp_Pnt(200,0,0), gp_Pnt(220,210,0), gp_Pnt(210,220,0), gp_Pnt(200,230,0) };
+ Handle(Geom_BSplineCurve) C = createBSplineCurve(pnts1);
+ TopoDS_Wire path1 = BRepBuilderAPI_MakeWire(BRepBuilderAPI_MakeEdge(C));
+ Handle(AIS_InteractiveObject) aisPath1 = new MAisDemo(path1);
+ myContext->Display(aisPath1 , 1 , 0 , false);
+
+ TopoDS_Shape wCorrection = correctionProfile(aProfile , gp_Pnt(0 , 0 , 0) , C , C->FirstParameter());
+ Handle(AIS_InteractiveObject) aisCorrection = new MAisDemo(wCorrection);
+ myContext->Display(aisCorrection , 1 , 0 , false);
+
+ TopoDS_Shape wCorrection1 = correctionProfile(aProfile1 , gp_Pnt(80 , 60 , 0) , C , C->LastParameter());
+ Handle(AIS_InteractiveObject) aisCorrection1 = new MAisDemo(wCorrection1);
+ myContext->Display(aisCorrection1 , 1 , 0 , false);
+
+ BRepOffsetAPI_MakePipeShell PipeShell1(TopoDS::Wire(path1));
+ PipeShell1.Add(wCorrection , false , false);
+ PipeShell1.Add(wCorrection1 , false , false);
+ Handle(AIS_InteractiveObject) ais4 = new MAisDemo(PipeShell1.Shape());
+ myContext->Display(ais4 , 1 , 0 , false);
+
+ std::vector pnts2 = { gp_Pnt(-20,10,0), gp_Pnt(20,10,0), gp_Pnt(20,-10,0) ,gp_Pnt(-20,-10,0) };
+ BRepBuilderAPI_MakePolygon MPRect;
+ for (auto p : pnts2)
+ {
+ MPRect.Add(p);
+ }
+ MPRect.Close();
+ TopoDS_Shape aProfile2 = MPRect.Wire();
+
+ TopoDS_Shape wCorrection2 = correctionProfile(aProfile2 , gp_Pnt(0 , 0 , 0) , C , C->LastParameter());
+ Handle(AIS_InteractiveObject) aisCorrection2 = new MAisDemo(wCorrection2);
+ myContext->Display(aisCorrection2 , 1 , 0 , false);
+
+ BRepOffsetAPI_MakePipeShell PipeShell2(TopoDS::Wire(path1));
+ PipeShell2.Add(wCorrection , false , false);
+ PipeShell2.Add(wCorrection2 , false , false);
+ Handle(AIS_InteractiveObject) ais5 = new MAisDemo(PipeShell2.Shape());
+ myContext->Display(ais5 , 1 , 0 , false);
+ T.SetTranslation(gp_Vec(0 , 0 , 50));
+ ais5->SetLocalTransformation(T);
+
+ // path不封闭时,生成的是两端开放的shell,需手动封口
+ TopoDS_Face aFace = BRepBuilderAPI_MakeFace(TopoDS::Wire(wCorrection));
+ TopoDS_Shell shell;
+ BRep_Builder builder;
+ builder.MakeShell(shell);
+ builder.Add(shell , aFace);
+
+ TopoDS_Face aFace1 = BRepBuilderAPI_MakeFace(TopoDS::Wire(wCorrection2));
+ builder.Add(shell , aFace1);
+
+ BRepBuilderAPI_MakeSolid solidBuilder;
+ solidBuilder.Add(shell);
+ solidBuilder.Add(TopoDS::Shell(PipeShell2.Shape()));
+ TopoDS_Shape aShape = solidBuilder.Solid();
+ TopAbs::Print(aShape.ShapeType() , std::cout);
+
+ //BRepBuilderAPI_Sewing Sew;
+ //Sew.Add(shell);
+ //Sew.Add(TopoDS::Shell(PipeShell2.Shape()));
+ //Sew.Perform();
+ //TopoDS_Shape aShape = Sew.SewedShape();
+ //TopAbs::Print(aShape.ShapeType() , std::cout);
+
+ Handle(AIS_InteractiveObject) aisSolid = new MAisDemo(aShape);
+ myContext->Display(aisSolid , 1 , 0 , false);
+ T.SetTranslation(gp_Vec(0 , 0 , 100));
+ aisSolid->SetLocalTransformation(T);
+ }
+
+ view_occt->fitAll();
+}
+
+void MainWindow::runModification()
+{
+ if (cbb_Modification->currentText() == "Transformation")
+ {
+ TopoDS_Shape aBox = BRepPrimAPI_MakeBox(100 , 200 , 300);
+
+ Handle(AIS_InteractiveObject) aisBox = new MAisDemo(aBox);
+ myContext->Display(aisBox , 1 , 0 , false);
+
+ gp_Trsf T;
+ T.SetTranslation(gp_Vec(300 , 0 , 0));
+ BRepBuilderAPI_Transform trsf(aBox , T);
+ Handle(AIS_InteractiveObject) aisTrsf = new MAisDemo(trsf.Shape());
+ myContext->Display(aisTrsf , 1 , 0 , false);
+
+ gp_Quaternion quater(gp_Vec(0 , 1 , 0) , gp_Vec(1 , 1 , 0));
+ T.SetRotation(quater);
+ BRepBuilderAPI_Transform trsf1(trsf.Shape() , T);
+ Handle(AIS_InteractiveObject) aisTrsf1 = new MAisDemo(trsf1.Shape());
+ myContext->Display(aisTrsf1 , 1 , 0 , false);
+
+ T.SetTransformation(quater , gp_Vec(600 , 0 , 0));
+ BRepBuilderAPI_Transform trsf2(aBox , T);
+ Handle(AIS_InteractiveObject) aisTrsf2 = new MAisDemo(trsf2.Shape());
+ myContext->Display(aisTrsf2 , 1 , 0 , false);
+ }
+ else if (cbb_Modification->currentText() == "Duplication")
+ {
+ Handle(Geom_Plane) geomPln = new Geom_Plane(gp_Pln(gp_Pnt(0 , 0 , 0) , gp_Dir(0 , 0 , 1)));
+
+ TopoDS_Shape aFace = BRepBuilderAPI_MakeFace(geomPln , -100 , 100 , -100 , 100 , 0);
+ Handle(AIS_InteractiveObject) aisO = new MAisDemo(aFace);
+ myContext->Display(aisO , 1 , 0 , false);
+
+ TopoDS_Shape myCopy = BRepBuilderAPI_Copy(aFace);
+ Handle(AIS_InteractiveObject) ais = new MAisDemo(myCopy);
+ myContext->Display(ais , 1 , 0 , false);
+ }
+ else if (cbb_Modification->currentText() == "Sewing")
+ {
+ // 类似fuse功能,sewing可调整间隙,也可参考PipeShell示例
+ Handle(Geom_Plane) geomPln1 = new Geom_Plane(gp_Pln(gp_Pnt(0 , 0 , 0) , gp_Dir(0 , 0 , 1)));
+ Handle(Geom_Plane) geomPln2 = new Geom_Plane(gp_Pln(gp_Pnt(100 , 0 , 100) , gp_Dir(1 , 0 , 0)));
+ Handle(Geom_Plane) geomPln3 = new Geom_Plane(gp_Pln(gp_Pnt(-100 , 0 , 100) , gp_Dir(1 , 0 , 0)));
+ std::vector geomPlns = { geomPln1 ,geomPln2 ,geomPln3 };
+ std::vector faces;
+ for (auto e : geomPlns)
+ {
+ TopoDS_Face aFace = BRepBuilderAPI_MakeFace(e , -100 , 100 , -100 , 100 , 0);
+ faces.push_back(aFace);
+
+ Handle(AIS_InteractiveObject) aisFace = new MAisDemo(aFace);
+ myContext->Display(aisFace , 1 , 0 , false);
+ }
+
+ BRepBuilderAPI_Sewing Sew;
+ for (auto e : faces)
+ {
+ Sew.Add(e);
+ }
+ Sew.Perform();
+ TopoDS_Shape aShape = Sew.SewedShape();
+ TopAbs::Print(aShape.ShapeType() , std::cout);
+ std::cout << std::endl;
+ Handle(AIS_InteractiveObject) ais = new MAisDemo(aShape);
+ myContext->Display(ais , 1 , 0 , false);
+ gp_Trsf T;
+ T.SetTranslation(gp_Vec(300 , 0 , 0));
+ ais->SetLocalTransformation(T);
+
+ //TopoDS_Compound aComp;
+ //BRep_Builder aB;
+ //aB.MakeCompound(aComp);
+ //aB.Add(aComp , faces[0]);
+ //aB.Add(aComp , faces[1]);
+ //aB.Add(aComp , faces[2]);
+
+ //BRepBuilderAPI_Sewing Sew;
+ //Sew.Load(aComp);
+ //Sew.Add(faces[0]);
+ //Sew.Add(faces[1]);
+ //Sew.Add(faces[2]);
+ //Sew.Perform();
+ //TopoDS_Shape aShape = Sew.SewedShape();
+ //TopAbs::Print(aShape.ShapeType() , std::cout);
+ //std::cout << std::endl;
+ //Handle(AIS_InteractiveObject) ais = new MAisDemo(aShape);
+ //myContext->Display(ais , 1 , 0 , false);
+ //gp_Trsf T;
+ //T.SetTranslation(gp_Vec(300 , 0 , 0));
+ //ais->SetLocalTransformation(T);
+ }
+ else if (cbb_Modification->currentText() == "BRepFeat_MakePrism")
+ {
+ TopoDS_Shape Sbase = BRepPrimAPI_MakeBox(400. , 250. , 300.);
+ Handle(AIS_InteractiveObject) aisSbase = new MAisDemo(Sbase , true);
+ myContext->Display(aisSbase , 1 , 0 , false);
+
+ TopExp_Explorer Ex(Sbase , TopAbs_FACE);
+ Ex.Next();
+ Ex.Next();
+ Ex.Next();
+ Ex.Next();
+ Ex.Next();
+ TopoDS_Face F = TopoDS::Face(Ex.Current());
+
+ Handle(Geom_Surface) surf = BRep_Tool::Surface(F);
+ gp_Circ2d c(gp_Ax2d(gp_Pnt2d(200. , 130.) , gp_Dir2d(1. , 0.)) , 50.);
+ Handle(Geom2d_Curve) aline = new Geom2d_Circle(c);
+
+ BRepBuilderAPI_MakeWire MW;
+ MW.Add(BRepBuilderAPI_MakeEdge(aline , surf));
+ TopoDS_Face Fbase = BRepBuilderAPI_MakeFace(MW.Wire());
+
+ Handle(AIS_InteractiveObject) aisFbase = new MAisDemo(Fbase);
+ myContext->Display(aisFbase , 1 , 0 , false);
+
+ BRepLib::BuildCurves3d(Fbase); // 没有此步骤后面无法扫掠
+ gp_Dir Extrusion(0. , 0. , 1.);
+ // TopoDS_Face()指定F也行
+ BRepFeat_MakePrism thePrism(Sbase , Fbase , F , Extrusion , true , true);
+ thePrism.Perform(100.);
+
+ TopoDS_Shape res = thePrism.Shape();
+ TopAbs::Print(res.ShapeType() , std::cout);
+ std::cout << std::endl;
+ Handle(AIS_InteractiveObject) ais = new MAisDemo(res);
+ myContext->Display(ais , 1 , 0 , false);
+ gp_Trsf T;
+ T.SetTranslation(gp_Vec(500 , 0 , 0));
+ ais->SetLocalTransformation(T);
+ }
+ else if (cbb_Modification->currentText() == "BRepFeat_MakePipe")
+ {
+ TopoDS_Shape S = BRepPrimAPI_MakeBox(400. , 250. , 300.);
+ Handle(AIS_InteractiveObject) aisSbase = new MAisDemo(S , true);
+ myContext->Display(aisSbase , 1 , 0 , false);
+
+ TopExp_Explorer Ex;
+ Ex.Init(S , TopAbs_FACE);
+ Ex.Next();
+ Ex.Next();
+ TopoDS_Face F1 = TopoDS::Face(Ex.Current());
+
+ Handle(Geom_Surface) surf = BRep_Tool::Surface(F1);
+ BRepBuilderAPI_MakeWire MW1;
+ gp_Pnt2d p1 , p2;
+ p1 = gp_Pnt2d(100. , 100.);
+ p2 = gp_Pnt2d(200. , 100.);
+ Handle(Geom2d_Line) aline = GCE2d_MakeLine(p1 , p2).Value();
+ MW1.Add(BRepBuilderAPI_MakeEdge(aline , surf , 0. , p1.Distance(p2)));
+
+ p1 = p2;
+ p2 = gp_Pnt2d(150. , 200.);
+ aline = GCE2d_MakeLine(p1 , p2).Value();
+ MW1.Add(BRepBuilderAPI_MakeEdge(aline , surf , 0. , p1.Distance(p2)));
+
+ p1 = p2;
+ p2 = gp_Pnt2d(100. , 100.);
+ aline = GCE2d_MakeLine(p1 , p2).Value();
+ MW1.Add(BRepBuilderAPI_MakeEdge(aline , surf , 0. , p1.Distance(p2)));
+
+ TopoDS_Face FP = BRepBuilderAPI_MakeFace(surf , MW1.Wire() , false);
+ BRepLib::BuildCurves3d(FP);
+
+ TColgp_Array1OfPnt CurvePoles(1 , 3);
+ gp_Pnt pt = gp_Pnt(150. , 0. , 150.);
+ CurvePoles(1) = pt;
+ pt = gp_Pnt(200. , 100. , 150.);
+ CurvePoles(2) = pt;
+ pt = gp_Pnt(150. , 200. , 150.);
+ CurvePoles(3) = pt;
+ Handle(Geom_BezierCurve) curve = new Geom_BezierCurve(CurvePoles);
+ TopoDS_Edge E = BRepBuilderAPI_MakeEdge(curve);
+ TopoDS_Wire W = BRepBuilderAPI_MakeWire(E);
+
+ BRepFeat_MakePipe MKPipe(S , FP , F1 , W , false , true);
+ MKPipe.Perform();
+ TopoDS_Shape res = MKPipe.Shape();
+ TopAbs::Print(res.ShapeType() , std::cout);
+ std::cout << std::endl;
+ Handle(AIS_InteractiveObject) ais = new MAisDemo(res);
+ myContext->Display(ais , 1 , 0 , false);
+ gp_Trsf T;
+ T.SetTranslation(gp_Vec(500 , 0 , 0));
+ ais->SetLocalTransformation(T);
+ }
+ else if (cbb_Modification->currentText() == "3DModelDefeaturing")
+ {
+ TopoDS_Shape S = BRepPrimAPI_MakeBox(200. , 600. , 100.);
+ TopoDS_Shape S1 = BRepPrimAPI_MakeBox(gp_Pnt(100 , -300 , 50.) , 200. , 600. , 100.);
+ TopoDS_Shape S2 = BRepPrimAPI_MakeBox(gp_Pnt(50 , 300 , 0) , 200. , 100. , 100.);
+ TopoDS_Shape aCut = BRepAlgoAPI_Cut(S , S1);
+ aCut = BRepAlgoAPI_Cut(aCut , S2);
+ Handle(AIS_InteractiveObject) aisCut = new MAisDemo(aCut, true);
+ myContext->Display(aisCut , 1 , 0 , false);
+
+ TopExp_Explorer ex(aCut , TopAbs_FACE);
+ int i = 1;
+ TopTools_ListOfShape aFeatures;
+ TopTools_ListOfShape aFeatures1;
+ while (ex.More())
+ {
+ TopoDS_Face face = TopoDS::Face(ex.Current());
+ if (i == 11 || i == 12)
+ aFeatures1.Append(face);
+ if (i == 10 || i == 11)
+ aFeatures.Append(face);
+ ++i;
+ ex.Next();
+ }
+ BRepAlgoAPI_Defeaturing aDF;
+ aDF.SetShape(aCut);
+ aDF.AddFacesToRemove(aFeatures);
+ aDF.SetRunParallel(false);
+ aDF.SetToFillHistory(true);
+ aDF.Build();
+ TopoDS_Shape aResult = aDF.Shape();
+ Handle(AIS_InteractiveObject) aisResult = new MAisDemo(aResult);
+ myContext->Display(aisResult , 1 , 0 , false);
+ gp_Trsf T;
+ T.SetTranslation(gp_Vec(300 , 0 , 0));
+ aisResult->SetLocalTransformation(T);
+
+ BRepAlgoAPI_Defeaturing aDF1;
+ aDF1.SetShape(aCut);
+ aDF1.AddFacesToRemove(aFeatures1);
+ aDF1.SetRunParallel(false);
+ aDF1.SetToFillHistory(true);
+ aDF1.Build();
+ TopoDS_Shape aResult1 = aDF1.Shape();
+ Handle(AIS_InteractiveObject) aisResult1 = new MAisDemo(aResult1);
+ myContext->Display(aisResult1 , 1 , 0 , false);
+ T.SetTranslation(gp_Vec(700 , 0 , 0));
+ aisResult1->SetLocalTransformation(T);
+ }
+ else if (cbb_Modification->currentText() == "3DModelPeriodicity")
+ {
+ std::vector pnts = { gp_Pnt(0,0,0), gp_Pnt(0,0,10) ,gp_Pnt(5,0,10),gp_Pnt(5,0,5) ,gp_Pnt(10,0,5) ,
+ gp_Pnt(10,0,0),gp_Pnt(0,0,0) };
+ BRepBuilderAPI_MakePolygon MP;
+ for (auto p : pnts)
+ {
+ MP.Add(p);
+ }
+ TopoDS_Wire aWire = MP.Wire();
+ TopoDS_Face aFace = BRepBuilderAPI_MakeFace(aWire);
+ TopoDS_Shape aShape = BRepPrimAPI_MakePrism(aFace , gp_Vec(0 , 5 , 0));
+ //Handle(AIS_InteractiveObject) ais = new MAisDemo(aShape);
+ //myContext->Display(ais , 1 , 0 , false);
+
+ BOPAlgo_MakePeriodic aPeriodicityMaker;
+ aPeriodicityMaker.SetShape(aShape);
+ aPeriodicityMaker.MakeXPeriodic(true , 11);
+ aPeriodicityMaker.MakeZPeriodic(true , 11);
+ //aPeriodicityMaker.SetTrimmed(0 , false);
+ //aPeriodicityMaker.SetRunParallel(true);
+ aPeriodicityMaker.Perform();
+ //TopoDS_Shape aPeriodicShape = aPeriodicityMaker.Shape();
+ aPeriodicityMaker.XRepeat(1);
+ aPeriodicityMaker.ZRepeat(1);
+ TopoDS_Shape aRepeat = aPeriodicityMaker.RepeatedShape();
+ aPeriodicityMaker.ClearRepetitions();
+
+ Handle(AIS_InteractiveObject) aisRepeat = new MAisDemo(aRepeat);
+ myContext->Display(aisRepeat , 1 , 0 , false);
+ }
+ else if (cbb_Modification->currentText() == "drillExample")
+ {
+ TopoDS_Shape plate = BRepPrimAPI_MakeBox(gp_Pnt(-50 , -50 , 0) , 100 , 100 , 1);
+ TopoDS_Shape drill = BRepPrimAPI_MakeCylinder(gp_Ax2(gp_Pnt(-48 , -48 , 0) , gp_Dir(0 , 0 , 1)) , 1 , 1);
+
+ BOPAlgo_MakePeriodic aPeriodicityMaker;
+ aPeriodicityMaker.SetShape(drill);
+ aPeriodicityMaker.MakeXPeriodic(true , 4);
+ aPeriodicityMaker.MakeYPeriodic(true , 4);
+ aPeriodicityMaker.Perform();
+ //aPeriodicityMaker.SetTrimmed(0 , true, 50);
+ //aPeriodicityMaker.SetTrimmed(1 , true , 50);
+ aPeriodicityMaker.XRepeat(24);
+ aPeriodicityMaker.YRepeat(24);
+ BRepAlgoAPI_Cut B(plate , aPeriodicityMaker.RepeatedShape());
+ B.SetRunParallel(true);
+ TopoDS_Shape aCut = B.Shape();
+ Handle(AIS_InteractiveObject) ais = new MAisDemo(aCut);
+ myContext->Display(ais , 1 , 0 , false);
+ }
+
+ view_occt->fitAll();
+}
+
+void MainWindow::runBoolean()
+{
+ if (cbb_Boolean->currentText() == "GFA")
+ {
+ BOPAlgo_Builder aBuilder;
+ // Setting arguments
+ TopoDS_Shape aShape = BRepPrimAPI_MakeBox(100 , 100 , 200);
+ TopoDS_Shape aShape1 = BRepPrimAPI_MakeBox(gp_Pnt(50 , 50 , 100) , 100 , 100 , 50);
+ TopoDS_Shape aShape2 = BRepPrimAPI_MakeSphere(30);
+ std::vector< TopoDS_Shape> shapes = { { aShape ,aShape1 ,aShape2 } };
+ TopTools_ListOfShape aLSObjects;
+ for (auto& s : shapes)
+ {
+ aLSObjects.Append(s);
+ }
+ aBuilder.SetArguments(aLSObjects);
+
+ // Setting options for GF
+ // Set parallel processing mode (default is false)
+ aBuilder.SetRunParallel(true);
+
+ // Set Fuzzy value (default is Precision::Confusion())
+ double aFuzzyValue = 1.e-5;
+ aBuilder.SetFuzzyValue(aFuzzyValue);
+
+ // Set safe processing mode (default is false)
+ aBuilder.SetNonDestructive(true);
+
+ // Set Gluing mode for coinciding arguments (default is off)
+ aBuilder.SetGlue(BOPAlgo_GlueShift);
+
+ // Disabling/Enabling the check for inverted solids (default is true)
+ aBuilder.SetCheckInverted(false);
+
+ // Set OBB usage (default is false)
+ aBuilder.SetUseOBB(true);
+
+ // Perform the operation
+ aBuilder.Perform();
+
+ TopoDS_Shape aResult = aBuilder.Shape();
+ TopAbs::Print(aResult.ShapeType() , std::cout);
+ std::cout << std::endl;
+
+ Handle(AIS_InteractiveObject) aisGFA = new MAisDemo(aResult);
+ myContext->Display(aisGFA , 1 , 0 , false);
+ }
+ else if (cbb_Boolean->currentText() == "SPA")
+ {
+ BOPAlgo_Splitter aBuilder;
+ // Setting arguments
+ TopoDS_Shape aShape = BRepPrimAPI_MakeSphere(50);
+ std::vector< TopoDS_Shape> shapes = { { aShape } };
+ TopTools_ListOfShape aLSObjects;
+ for (auto& s : shapes)
+ {
+ aLSObjects.Append(s);
+ }
+ aBuilder.SetArguments(aLSObjects);
+
+ TopoDS_Shape aFace = BRepBuilderAPI_MakeFace(gp_Pln(gp_Pnt(0 , 0 , -10) , gp_Dir(0 , 0 , 1)) , -100 , 100 , -100 , 100);
+ TopoDS_Shape aFace1 = BRepBuilderAPI_MakeFace(gp_Pln(gp_Pnt(0 , 0 , 10) , gp_Dir(0 , 0 , 1)) , -100 , 100 , -100 , 100);
+ TopoDS_Shape aFace2 = BRepBuilderAPI_MakeFace(gp_Pln(gp_Pnt(0 , 0 , 40) , gp_Dir(0 , 0 , 1)) , -100 , 100 , -100 , 100);
+ std::vector< TopoDS_Shape> tools = { { aFace,aFace1,aFace2 } };
+ TopTools_ListOfShape aLSTools;
+ for (auto& s : tools)
+ {
+ aLSTools.Append(s);
+ Handle(AIS_InteractiveObject) aisF = new MAisDemo(s);
+ aisF->SetTransparency(0.8);
+ aisF->Attributes()->ShadingAspect()->SetColor(Quantity_NOC_BLUE);
+ myContext->Display(aisF , 1 , 0 , false);
+ }
+ aBuilder.SetTools(aLSTools);
+
+ aBuilder.SetRunParallel(true);
+ aBuilder.Perform();
+ TopoDS_Compound aResult = TopoDS::Compound(aBuilder.Shape());
+ TopAbs::Print(aResult.ShapeType() , std::cout);
+ std::cout << std::endl;
+
+ TopExp_Explorer ex(aResult , TopAbs_SOLID);
+ while (ex.More())
+ {
+ Handle(AIS_InteractiveObject) aisSPA = new MAisDemo(ex.Current());
+ myContext->Display(aisSPA , 1 , 0 , false);
+
+ ex.Next();
+ }
+ }
+ else if (cbb_Boolean->currentText() == "BOA")
+ {
+ // BOPAlgo可更直观添加多个shape
+
+ BOPAlgo_BOP aBuilder;
+ // Setting arguments
+ TopoDS_Shape aShape = BRepPrimAPI_MakeBox(100 , 100 , 200);
+ std::vector< TopoDS_Shape> shapes = { { aShape} };
+ TopTools_ListOfShape aLSObjects;
+ for (auto& s : shapes)
+ {
+ aLSObjects.Append(s);
+ }
+ aBuilder.SetArguments(aLSObjects);
+
+ TopoDS_Shape aT1 = BRepPrimAPI_MakeBox(gp_Pnt(50 , 50 , 100) , 100 , 100 , 50);
+ TopoDS_Shape aT2 = BRepPrimAPI_MakeSphere(30);
+ std::vector< TopoDS_Shape> tools = { { aT1,aT2} };
+ TopTools_ListOfShape aLSTools;
+ for (auto& s : tools)
+ {
+ aLSTools.Append(s);
+ }
+ aBuilder.SetTools(aLSTools);
+
+ aBuilder.SetOperation(BOPAlgo_CUT);
+ aBuilder.SetRunParallel(true);
+ aBuilder.Perform();
+
+ TopoDS_Shape aResult = aBuilder.Shape();
+ TopAbs::Print(aResult.ShapeType() , std::cout);
+ std::cout << std::endl;
+
+ Handle(AIS_InteractiveObject) ais = new MAisDemo(aResult);
+ myContext->Display(ais , 1 , 0 , false);
+ }
+ else if (cbb_Boolean->currentText() == "BRepAlgoAPI_Splitter")
+ {
+ BRepAlgoAPI_Splitter aBuilder;
+ // Setting arguments
+ TopoDS_Shape aShape = BRepPrimAPI_MakeSphere(50);
+ std::vector< TopoDS_Shape> shapes = { { aShape } };
+ TopTools_ListOfShape aLSObjects;
+ for (auto& s : shapes)
+ {
+ aLSObjects.Append(s);
+ }
+ aBuilder.SetArguments(aLSObjects);
+
+ TopoDS_Shape aFace = BRepBuilderAPI_MakeFace(gp_Pln(gp_Pnt(0 , 0 , -10) , gp_Dir(0 , 0 , 1)) , -100 , 100 , -100 , 100);
+ TopoDS_Shape aFace1 = BRepBuilderAPI_MakeFace(gp_Pln(gp_Pnt(0 , 0 , 10) , gp_Dir(0 , 0 , 1)) , -100 , 100 , -100 , 100);
+ TopoDS_Shape aFace2 = BRepBuilderAPI_MakeFace(gp_Pln(gp_Pnt(0 , 0 , 40) , gp_Dir(0 , 0 , 1)) , -100 , 100 , -100 , 100);
+ std::vector< TopoDS_Shape> tools = { { aFace,aFace1,aFace2 } };
+ TopTools_ListOfShape aLSTools;
+ for (auto& s : tools)
+ {
+ aLSTools.Append(s);
+ Handle(AIS_InteractiveObject) aisF = new MAisDemo(s);
+ aisF->SetTransparency(0.8);
+ aisF->Attributes()->ShadingAspect()->SetColor(Quantity_NOC_BLUE);
+ myContext->Display(aisF , 1 , 0 , false);
+ }
+ aBuilder.SetTools(aLSTools);
+
+ aBuilder.SetRunParallel(true);
+ aBuilder.Build();
+ TopoDS_Compound aResult = TopoDS::Compound(aBuilder.Shape());
+ TopAbs::Print(aResult.ShapeType() , std::cout);
+ std::cout << std::endl;
+
+ TopExp_Explorer ex(aResult , TopAbs_SOLID);
+ while (ex.More())
+ {
+ Handle(AIS_InteractiveObject) aisSPA = new MAisDemo(ex.Current());
+ myContext->Display(aisSPA , 1 , 0 , false);
+
+ ex.Next();
+ }
+ }
+ view_occt->fitAll();
+}
+
+void MainWindow::runHLR()
+{
+ if (cbb_HLR->currentText() == "HLRBRep_Algo")
+ {
+ TopoDS_Shape aCylinder = BRepPrimAPI_MakeCylinder(gp_Ax2(gp_Pnt() , gp_Dir(1 , 0 , 0)) , 10 , 100);
+ TopoDS_Shape aCylinder1 = BRepPrimAPI_MakeCylinder(gp_Ax2(gp_Pnt(100 , 0 , 0) , gp_Dir(1 , 0 , 0)) , 20 , 25);
+ BRepFilletAPI_MakeFillet MFFillet(aCylinder1);
+ TopExp_Explorer exFillet(aCylinder1 , TopAbs_EDGE);
+ double rFillet = 10.;
+ MFFillet.Add(rFillet , TopoDS::Edge(exFillet.Current()));
+ TopoDS_Shape aCylinderFillet = MFFillet.Shape();
+ TopoDS_Shape aScrew = BRepAlgoAPI_Fuse(aCylinder , aCylinderFillet);
+
+ Handle(AIS_InteractiveObject) aisScrew = new MAisDemo(aScrew);
+ myContext->Display(aisScrew , 1 , 0 , false);
+
+ Handle(HLRBRep_Algo) myAlgo = new HLRBRep_Algo();
+ myAlgo->Add(aScrew , 1);
+ HLRAlgo_Projector myProjector = HLRAlgo_Projector(gp_Ax2(gp_Pnt(0 , 0 , 0) , gp_Dir(0 , 0 , 1)));
+ myAlgo->Projector(myProjector);
+ myAlgo->Update();
+ myAlgo->Hide();
+
+ HLRBRep_HLRToShape aHLRToShape(myAlgo);
+ TopoDS_Shape VCompound = aHLRToShape.VCompound();
+ TopoDS_Shape Rg1LineVCompound = aHLRToShape.Rg1LineVCompound();
+ TopoDS_Shape RgNLineVCompound = aHLRToShape.RgNLineVCompound();
+ TopoDS_Shape OutLineVCompound = aHLRToShape.OutLineVCompound();
+ TopoDS_Shape IsoLineVCompound = aHLRToShape.IsoLineVCompound();
+ TopoDS_Shape HCompound = aHLRToShape.HCompound();
+ TopoDS_Shape Rg1LineHCompound = aHLRToShape.Rg1LineHCompound();
+ TopoDS_Shape RgNLineHCompound = aHLRToShape.RgNLineHCompound();
+ TopoDS_Shape OutLineHCompound = aHLRToShape.OutLineHCompound();
+ TopoDS_Shape IsoLineHCompound = aHLRToShape.IsoLineHCompound();
+ std::vector shapes = { VCompound,Rg1LineVCompound,RgNLineVCompound ,OutLineVCompound,IsoLineVCompound,
+ HCompound ,Rg1LineHCompound, RgNLineHCompound ,OutLineHCompound ,IsoLineHCompound };
+ std::vector types =
+ { "VCompoun","Rg1LineVCompound" ,"RgNLineVCompound" ,"OutLineVCompound" ,"IsoLineVCompound" ,
+ "HCompound","Rg1LineHCompound" ,"RgNLineHCompound" ,"OutLineHCompound" ,"IsoLineHCompound"
+ };
+ int distance = 100;
+ int i = 0;
+ gp_Trsf T;
+ for (auto s : shapes)
+ {
+ if (!s.IsNull())
+ {
+ T.SetTranslation(gp_Vec(0 , distance , 0));
+ BRepBuilderAPI_Transform trsf(s , T);
+ Handle(AIS_InteractiveObject) ais = new MAisDemo(trsf.Shape());
+ myContext->Display(ais , 1 , 0 , false);
+ }
+
+ Handle(AIS_TextLabel) aisText = new AIS_TextLabel();
+ aisText->SetText(types[i].c_str());
+ aisText->SetPosition(gp_Pnt(250 , distance , 0));
+ myContext->Display(aisText , 0 , 0 , false);
+
+ ++i;
+ distance += 100;
+ }
+ }
+
+ view_occt->fitAll();
+}
+
+void MainWindow::runDataExchange()
+{
+ if (cbb_DataExchange->currentText() == "ExportBrep")
+ {
+
+ }
+ else if (cbb_DataExchange->currentText() == "ImportBrep")
+ {
+
+ }
+ else if (cbb_DataExchange->currentText() == "ExportStep")
+ {
+ std::string filePath = "E:/8other/CppLearn/OCCTTutorial/models/step/testStep.step";
+
+ DataExchange dx;
+ dx.setAisObjs(objs);
+ dx.ExportStep(filePath.c_str());
+ }
+ else if (cbb_DataExchange->currentText() == "ImportStep")
+ {
+ std::string filePath = "E:/8other/CppLearn/OCCTTutorial/models/step/linkrods.step";
+ //std::string filePath = "E:/8other/CppLearn/OCCTTutorial/models/step/screw.step";
+
+ DataExchange dx;
+ dx.ImportStep(filePath.c_str());
+ objs = dx.getAisObjs();
+
+ for (auto e : objs)
+ {
+ myContext->Display(e , 1 , 0 , false);
+ }
+ }
+ else if (cbb_DataExchange->currentText() == "ExportIges")
+ {
+ std::string filePath = "E:/8other/CppLearn/OCCTTutorial/models/step/testIges.iges";
+
+ DataExchange dx;
+ dx.setAisObjs(objs);
+ dx.ExportIges(filePath.c_str());
+ }
+ else if (cbb_DataExchange->currentText() == "ImportIges")
+ {
+ //std::string filePath = "E:/8other/CppLearn/OCCTTutorial/models/iges/bearing.iges";
+ std::string filePath = "E:/8other/CppLearn/OCCTTutorial/models/iges/hammer.iges";
+
+ DataExchange dx;
+ dx.ImportIges(filePath.c_str());
+ objs = dx.getAisObjs();
+
+ for (auto e : objs)
+ {
+ myContext->Display(e , 1 , 0 , false);
+ }
+ }
+ else if (cbb_DataExchange->currentText() == "ExportObj")
+ {
+
+ }
+ else if (cbb_DataExchange->currentText() == "ImportObj")
+ {
+ std::string filePath = "E:/other/CppLearn/OCCTTutorial/models/obj/gundam.obj";
+
+ DataExchange dx;
+ dx.ImportObj(filePath.c_str());
+ objs = dx.getAisObjs();
+
+ for (auto e : objs)
+ {
+ myContext->Display(e , 1 , 0 , false);
+ }
+ }
+
+ view_occt->fitAll();
+}
+
+void MainWindow::runAis()
+{
+ if (cbb_ais->currentText() == "HLR")
+ {
+ TopoDS_Shape aBox = BRepPrimAPI_MakeBox(100 , 100 , 200);
+ Handle(AIS_InteractiveObject) ais = new myPk_IShape(aBox , PrsMgr_TOP_AllView);
+ myContext->Display(ais , 1 , 0 , false);
+ //ais->computeHlrPresentation();
+ }
+ else if (cbb_ais->currentText() == "setLocation")
+ {
+ TopoDS_Shape aBox = BRepPrimAPI_MakeBox(100 , 100 , 200);
+ Handle(AIS_InteractiveObject) ais = new MAisDemo(aBox);
+ myContext->Display(ais , 1 , 0 , false);
+ gp_Trsf T;
+ T.SetTranslation(gp_Vec(0 , 300 , 0));
+ TopLoc_Location L = TopLoc_Location(T);
+ myContext->SetLocation(ais , L);
+ }
+ else if (cbb_ais->currentText() == "ObjectHierarchy")
+ {
+ TopoDS_Shape aBox = BRepPrimAPI_MakeBox(100 , 100 , 200);
+ Handle(AIS_InteractiveObject) ais = new MAisDemo(aBox);
+ myContext->Display(ais , 1 , 0 , false);
+ TopoDS_Shape aBox1 = BRepPrimAPI_MakeBox(gp_Pnt(100 , 0 , 0) , 100 , 100 , 200);
+ Handle(AIS_InteractiveObject) ais1 = new MAisDemo(aBox1);
+ myContext->Display(ais1 , 1 , 0 , false);
+ TopoDS_Shape aBox2 = BRepPrimAPI_MakeBox(100 , 100 , 200);
+ Handle(AIS_InteractiveObject) ais2 = new MAisDemo(aBox2);
+ myContext->Display(ais2 , 1 , 0 , false);
+ ais1->AddChild(ais);
+ gp_Trsf T;
+ T.SetTranslation(gp_Vec(0 , 300 , 0));
+ TopLoc_Location L = TopLoc_Location(T);
+ myContext->SetLocation(ais1 , L);
+ }
+ else if (cbb_ais->currentText() == "Fitter")
+ {
+ TopoDS_Shape theShape = BRepPrimAPI_MakeCylinder(10 , 20);
+ Handle(AIS_InteractiveObject) aShapePrs = new MAisDemo(theShape);
+ myContext->Display(aShapePrs , AIS_Shaded , 0 , true , true);
+
+ int aSubShapeSelMode = MAisDemo::SelectionMode(TopAbs_FACE);
+ myContext->Activate(aShapePrs , aSubShapeSelMode);
+
+ //Handle(StdSelect_FaceFilter) aFil1 = new StdSelect_FaceFilter(StdSelect_Revol);
+ //myContext->AddFilter(aFil1);
+ Handle(StdSelect_FaceFilter) aFil2 = new StdSelect_FaceFilter(StdSelect_Plane);
+ myContext->AddFilter(aFil2);
+ }
+ else if (cbb_ais->currentText() == "Selection/Capture")
+ {
+ for (myContext->InitSelected(); myContext->MoreSelected(); myContext->NextSelected())
+ {
+ // 两者等同
+ //Handle(AIS_InteractiveObject) anObj = myContext->SelectedInteractive();
+ //Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast(anOwner->Selectable());
+
+ Handle(SelectMgr_EntityOwner) anOwner = myContext->SelectedOwner();
+ // 如果选择的是个端点
+ if (Handle(MCaptureOwnerEndPonit) aEndPonitOwner = Handle(MCaptureOwnerEndPonit)::DownCast(anOwner))
+ {
+ std::cout << aEndPonitOwner->getPonit() << std::endl;
+ }
+ }
+ }
+
+ view_occt->fitAll();
+}
+
+void MainWindow::runStdAis()
+{
+ if (cbb_stdAis->currentText() == "Datum")
+ {
+ Handle(Geom_CartesianPoint) aGeoPnt = new Geom_CartesianPoint(50 , 50 , 0);
+ Handle(AIS_InteractiveObject) ais = new AIS_Point(aGeoPnt);
+ // 只有线框模式
+ myContext->Display(ais , 0 , 0 , false);
+
+ gp_Ax1 ax1 = gp_Ax1(gp_Pnt(100 , 0 , 0) , gp_Dir(0 , 0 , 1));
+ Handle(AIS_InteractiveObject) aisAxi = new AIS_Axis(ax1);
+ myContext->Display(aisAxi , 0 , 0 , false);
+
+ Handle(Geom_Line) aGeoLine = new Geom_Line(gp_Pnt(0 , 100 , 0) , gp_Dir(0 , 1 , 0));
+ // infinite
+ Handle(AIS_InteractiveObject) aisLine = new AIS_Line(aGeoLine);
+ myContext->Display(aisLine , 0 , 0 , false);
+
+ gp_Ax2 ax2 = gp_Ax2(gp_Pnt(200 , 0 , 0) , gp_Dir(1 , 0 , 0));
+ Handle(Geom_Circle) aGeoCircle = new Geom_Circle(ax2 , 50);
+ Handle(AIS_InteractiveObject) aisCircle = new AIS_Circle(aGeoCircle);
+ myContext->Display(aisCircle , 0 , 0 , false);
+
+ Handle(Geom_Plane) aGeoPlane = new Geom_Plane(gp_Pnt(200 , 0 , 0) , gp_Dir(0 , 0 , 1));
+ // 需设置中心点,不然shade模式位置错误
+ Handle(AIS_InteractiveObject) aisPlane = new AIS_Plane(aGeoPlane , gp_Pnt(200 , 0 , 0));
+ myContext->Display(aisPlane , 1 , 0 , false);
+
+ gp_Ax2 ax22 = gp_Ax2(gp_Pnt(0 , 0 , 0) , gp_Dir(0 , 0 , 1));
+ Handle(Geom_Axis2Placement) aGeoAxis2Placement = new Geom_Axis2Placement(ax22);
+ Handle(AIS_Trihedron) aisTrihedron = new AIS_Trihedron(aGeoAxis2Placement);
+ // 显示模式在此设置,display方法报错
+ aisTrihedron->SetDatumDisplayMode(Prs3d_DM_Shaded);
+ aisTrihedron->SetDatumPartColor(Prs3d_DP_XArrow , Quantity_NOC_RED2);
+ aisTrihedron->SetDatumPartColor(Prs3d_DP_YArrow , Quantity_NOC_GREEN2);
+ aisTrihedron->SetDatumPartColor(Prs3d_DP_ZArrow , Quantity_NOC_BLUE2);
+ aisTrihedron->SetDatumPartColor(Prs3d_DP_XAxis , Quantity_NOC_RED2);
+ aisTrihedron->SetDatumPartColor(Prs3d_DP_YAxis , Quantity_NOC_GREEN2);
+ aisTrihedron->SetDatumPartColor(Prs3d_DP_ZAxis , Quantity_NOC_BLUE2);
+ myContext->Display(aisTrihedron , 0 , AIS_TrihedronSelectionMode_Axes , false);
+
+ Handle(AIS_PlaneTrihedron) aisPlaneTrihedron = new AIS_PlaneTrihedron(aGeoPlane);
+ aisPlaneTrihedron->SetLength(100);
+ myContext->Display(aisPlaneTrihedron , 0 , 0 , false);
+
+ }
+ else if (cbb_stdAis->currentText() == "AIS_PointCloud")
+ {
+ Handle(Graphic3d_ArrayOfPoints) aPoints = new Graphic3d_ArrayOfPoints(2000 , true);
+ aPoints->AddVertex(gp_Pnt(-40.0 , -40.0 , -40.0) , Quantity_Color(Quantity_NOC_BLUE1));
+ aPoints->AddVertex(gp_Pnt(40.0 , 40.0 , 40.0) , Quantity_Color(Quantity_NOC_BLUE2));
+
+ Handle(AIS_PointCloud) aPntCloud = new AIS_PointCloud();
+ aPntCloud->SetPoints(aPoints);
+ myContext->Display(aPntCloud , 0 , 0 , false);
+ }
+ else if (cbb_stdAis->currentText() == "Relations")
+ {
+ TopoDS_Edge aEdge = BRepBuilderAPI_MakeEdge(gp_Pnt(0 , 0 , 0) , gp_Pnt(0 , 100 , 0));
+ TopoDS_Edge aEdge1 = BRepBuilderAPI_MakeEdge(gp_Pnt(200 , 0 , 0) , gp_Pnt(200 , 100 , 0));
+ TopoDS_Edge aEdge2 = BRepBuilderAPI_MakeEdge(gp_Pnt(0 , 100 , 0) , gp_Pnt(100 , 100 , 0));
+ Handle(AIS_InteractiveObject) aisEdge = new AIS_Shape(aEdge);
+ Handle(AIS_InteractiveObject) aisEdge1 = new AIS_Shape(aEdge1);
+ Handle(AIS_InteractiveObject) aisEdge2 = new AIS_Shape(aEdge2);
+ myContext->Display(aisEdge , 0 , 0 , false);
+ myContext->Display(aisEdge1 , 0 , 0 , false);
+ myContext->Display(aisEdge2 , 0 , 0 , false);
+
+ Handle(Geom_Plane) aGeoPlane = new Geom_Plane(gp_Pnt(0 , 0 , 0) , gp_Dir(0 , 0 , 1));
+ Handle(PrsDim_ParallelRelation) aisParallel = new PrsDim_ParallelRelation(aEdge , aEdge1 , aGeoPlane);
+ myContext->Display(aisParallel , 0 , 0 , false);
+ // 不垂直也会显示歪的标记
+ Handle(PrsDim_PerpendicularRelation) aisPerpendicular = new PrsDim_PerpendicularRelation(aEdge , aEdge2 , aGeoPlane);
+ myContext->Display(aisPerpendicular , 0 , 0 , false);
+ }
+ else if (cbb_stdAis->currentText() == "Dimensions")
+ {
+ TopoDS_Edge aEdge = BRepBuilderAPI_MakeEdge(gp_Pnt(0 , 0 , 0) , gp_Pnt(0 , 100 , 0));
+ Handle(AIS_InteractiveObject) aisEdge = new AIS_Shape(aEdge);
+ myContext->Display(aisEdge , 0 , 0 , false);
+ gp_Pln aPln = gp_Pln(gp_Pnt(0 , 0 , 0) , gp_Dir(0 , 0 , 1));
+ Handle(PrsDim_LengthDimension) aisLength = new PrsDim_LengthDimension(aEdge , aPln);
+ myContext->Display(aisLength , 0 , 0 , false);
+ }
+ view_occt->fitAll();
+}
+
+void MainWindow::runGraphic3d()
+{
+ if (cbb_Graphic3d->currentText() == "Primitive arrays")
+ {
+ Handle(AIS_InteractiveObject) ais = new MAisObject7();
+ myContext->Display(ais , 0 , 0 , false);
+ }
+ else if (cbb_Graphic3d->currentText() == "Text primitive")
+ {
+ Handle(AIS_InteractiveObject) ais = new MAisObject8();
+ myContext->Display(ais , 0 , 0 , false);
+ }
+ else if (cbb_Graphic3d->currentText() == "Clipping planes")
+ {
+ Standard_Integer aMaxClipPlanes = myViewer->Driver()->InquireLimit(Graphic3d_TypeOfLimit_MaxNbClipPlanes);
+ std::cout << aMaxClipPlanes << std::endl;
+
+ TopoDS_Shape box = BRepPrimAPI_MakeBox(200 , 400 , 800);
+ Handle(AIS_InteractiveObject) ais = new MAisDemo(box);
+ myContext->Display(ais , 1 , 0 , false);
+
+ gp_Pln aPln = gp_Pln(gp_Pnt(0 , 0 , 35) , gp_Dir(0 , 0 , 1));
+ Handle(Graphic3d_ClipPlane) aClipPlane = new Graphic3d_ClipPlane(aPln);
+ gp_Pln aPln1 = gp_Pln(gp_Pnt(0 , 0 , 110) , gp_Dir(0 , 0 , -1));
+ Handle(Graphic3d_ClipPlane) aClipPlane1 = new Graphic3d_ClipPlane(aPln1);
+ //aClipPlane->SetCapping(true);
+ //aClipPlane->SetOn(false);
+ //aClipPlane1->SetOn(false);
+ view_occt->getView()->AddClipPlane(aClipPlane);
+ view_occt->getView()->AddClipPlane(aClipPlane1);
+
+ }
+
+ view_occt->fitAll();
+}
+
+void MainWindow::runMShape()
+{
+ if (cbb_MShape->currentText() == "PipeFitting")
+ {
+ std::vector pnts = { gp_Pnt(0 , 0 , 0) ,gp_Pnt(100 , 0 , 0) };
+ std::shared_ptr< MSLinearRect> p = std::make_shared< MSLinearRect>(pnts);
+
+ std::vector pnts1 = { gp_Pnt(100 , 0 , 0) ,gp_Pnt(200 , 200 , 0) };
+ std::shared_ptr< MSLinearRect> p1 = std::make_shared< MSLinearRect>(pnts1);
+
+ std::vector pnts2 = { gp_Pnt(200 , 200 , 0) ,gp_Pnt(300 , 200 , 0) };
+ std::shared_ptr< MSLinearRect> p2 = std::make_shared< MSLinearRect>(pnts2 , 40 , 20 , "");
+
+ std::vector pnts3 = { gp_Pnt(300 , 200 , 0) ,gp_Pnt(500 , 200 , 150) };
+ std::shared_ptr< MSLinearRect> p3 = std::make_shared< MSLinearRect>(pnts3);
+
+ std::shared_ptr< MSPipeFitting> pipe = std::make_shared< MSPipeFitting>(p , p1);
+ std::shared_ptr< MSPipeFitting> pipe1 = std::make_shared< MSPipeFitting>(p1 , p2);
+ std::shared_ptr< MSPipeFitting> pipe2 = std::make_shared< MSPipeFitting>(p2 , p3);
+
+ std::vector< std::shared_ptr< MSAbstract>> ps = { p,pipe,p1,pipe1,p2,pipe2,p3 };
+ for (auto e : ps)
+ {
+ TopoDS_Shape s = e->getShape();
+ Handle(AIS_InteractiveObject) ais = new MAisDemo(s);
+ myContext->Display(ais , 1 , 0 , false);
+
+ TopoDS_Shape path = e->getPath();
+ Handle(AIS_InteractiveObject) aisPath = new MAisDemo(path);
+ myContext->Display(aisPath , 1 , 0 , false);
+ }
+ }
+ view_occt->fitAll();
+}
+
+bool MainWindow::eventFilter(QObject* watched , QEvent* event)
+{
+ if (event->type() == QEvent::MouseMove)
+ {
+ QMouseEvent* theEvent = static_cast(event);
+ Qt::MouseButtons aMouseButtons = theEvent->buttons();
+ myClickPos = { _devPx * theEvent->pos().x() , _devPx * theEvent->pos().y() };
+ updateStatusBar(myClickPos);
+ }
+
+ return QMainWindow::eventFilter(watched , event);
+}
+
+Handle(V3d_Viewer) MainWindow::Viewer(const V3d_TypeOfOrientation theViewProj)
+{
+ static Handle(OpenGl_GraphicDriver) aGraphicDriver;
+ Handle(Aspect_DisplayConnection) aDisplayConnection;
+ aGraphicDriver = new OpenGl_GraphicDriver(aDisplayConnection);
+ Handle(V3d_Viewer) aViewer = new V3d_Viewer(aGraphicDriver);
+ aViewer->SetDefaultViewProj(theViewProj);
+
+ aViewer->SetDefaultLights();
+ aViewer->SetLightOn();
+ return aViewer;
+}
+
+void MainWindow::updateStatusBar(const std::vector& aNewPos)
+{
+ double XScreen = aNewPos[0];
+ double YScreen = aNewPos[1];
+
+ double x , y , z;
+ view_occt->getView()->Convert(XScreen , YScreen , x , y , z);
+ gp_Pnt worldPnt = gp_Pnt(x , y , z);
+
+ double xEye , yEye , zEye , xAt , yAt , zAt;
+ view_occt->getView()->Eye(xEye , yEye , zEye);
+ view_occt->getView()->At(xAt , yAt , zAt);
+ gp_Pnt eyePoint(xEye , yEye , zEye);
+ gp_Pnt atPoint(xAt , yAt , zAt);
+
+ gp_Dir eyeDir(gp_Vec(eyePoint , atPoint));
+ gp_Pln plnAt = gp_Pln(atPoint , eyeDir);
+
+ Handle(Geom_Plane) geoPlane = new Geom_Plane(plnAt);
+ GeomAPI_ProjectPointOnSurf project(worldPnt , geoPlane);
+ gp_Pnt position = project.NearestPoint();
+
+
+ // 同上
+ //gp_Pnt2d ConvertedPointOnPlane = ProjLib::Project(plnAt , worldPnt);
+ //gp_Pnt position1 = ElSLib::Value(ConvertedPointOnPlane.X() , ConvertedPointOnPlane.Y() , plnAt);
+ //QString positionInfo1 = QString("Position: %0, %1, %2").arg(position1.X()).arg(position1.Y()).arg(position1.Z());
+
+ //QString screenPntInfo = QString("Screen: %0, %1").arg(XScreen).arg(YScreen);
+ //QString worldPntInfo = QString("World: %0, %1, %2").arg(x).arg(y).arg(z);
+ //QString eyePntInfo = QString("Eye: %0, %1, %2").arg(xEye).arg(yEye).arg(zEye);
+ //QString atPntInfo = QString("At: %0, %1, %2").arg(xAt).arg(yAt).arg(zAt);
+ QString positionInfo = QString("WCS: %0, %1, %2").arg(position.X()).arg(position.Y()).arg(position.Z());
+ //QString info = screenPntInfo + " " + positionInfo;
+ lb_positionInfo->setText(positionInfo);
+}
diff --git a/src/MainWindow.h b/src/MainWindow.h
new file mode 100644
index 0000000..a38a1ee
--- /dev/null
+++ b/src/MainWindow.h
@@ -0,0 +1,140 @@
+#pragma once
+
+#include "View.h"
+#include "MAISObj.h"
+#include "DataExchange.h"
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "Geom_Plane.hxx"
+#include "GeomAPI_ProjectPointOnSurf.hxx"
+#include "RWObj_TriangulationReader.hxx"
+
+class MainWindow: public QMainWindow
+{
+ Q_OBJECT
+public:
+ MainWindow(QWidget* parent = nullptr);
+ ~MainWindow();
+ void initMenuToolbar();
+ void initOCCTView();
+ void setViewer(const Handle(V3d_Viewer)& theViewer) {
+ myViewer = theViewer;
+ }
+ void initSignals();
+ void setPerspective(bool check);
+ void test();
+ void setColor();
+ void setSelectMode();
+ void setWorkArea(int index);
+ void processSelectChanged();
+
+ void runAisCustom();
+
+ void runModelData();
+
+ void runBRepBuilderAPI();
+ void runBRepPrimAPI();
+ void runBRepOffsetAPI();
+ void runModification();
+ void runBoolean();
+ void runHLR();
+
+ void runDataExchange();
+
+ void runAis();
+ void runStdAis();
+ void runGraphic3d();
+
+ void runMShape();
+
+protected:
+ virtual bool eventFilter(QObject* watched , QEvent* event) override;
+
+private:
+ Handle(V3d_Viewer) Viewer(const V3d_TypeOfOrientation theViewProj);
+
+ void updateStatusBar(const std::vector& aNewPos);
+
+ double _devPx;
+ Handle(V3d_Viewer) myViewer;
+ Handle(AIS_InteractiveContext) myContext;
+ std::vector myClickPos;
+ std::vector objs;
+
+ View* view_occt;
+ QStatusBar* stb;
+ QLabel* lb_positionInfo;
+
+ std::vector< QToolBar*> tbs;
+ QToolBar* tb_view;
+ QAction* act_hideAll;
+ QAction* act_hide;
+ QAction* act_fitAll;
+ QAction* act_axo;
+ QAction* act_top;
+ QAction* act_buttom;
+ QAction* act_left;
+ QAction* act_right;
+ QAction* act_front;
+ QAction* act_back;
+ QAction* act_shade;
+ QAction* act_wireframe;
+ QAction* act_perspective;
+ QAction* act_axis;
+ QAction* act_test;
+
+ QToolBar* tb_style;
+ QAction* act_color;
+ QAction* act_material;
+ QActionGroup* actgp_selectMode;
+ QAction* act_selectVertex;
+ QAction* act_selectEdge;
+ QAction* act_selectFace;
+ QLabel* lb_workArea;
+ QComboBox* cbb_workArea;
+
+ QToolBar* tb_aisCustom;
+ QComboBox* cbb_aisCustom;
+ QAction* act_aisCustom;
+
+ QToolBar* tb_ModelData;
+ QComboBox* cbb_ModelData;
+ QAction* act_ModelData;
+
+ QToolBar* tb_ModelAlgorithm;
+ QComboBox* cbb_BRepBuilderAPI;
+ QAction* act_BRepBuilderAPI;
+ QComboBox* cbb_BRepPrimAPI;
+ QAction* act_BRepPrimAPI;
+ QComboBox* cbb_BRepOffsetAPI;
+ QAction* act_BRepOffsetAPI;
+ QComboBox* cbb_Modification;
+ QAction* act_Modification;
+ QComboBox* cbb_Boolean;
+ QAction* act_Boolean;
+ QComboBox* cbb_HLR;
+ QAction* act_HLR;
+
+ QToolBar* tb_DataExchange;
+ QComboBox* cbb_DataExchange;
+ QAction* act_DataExchange;
+
+ QToolBar* tb_Visualization;
+ QComboBox* cbb_ais;
+ QAction* act_ais;
+ QComboBox* cbb_stdAis;
+ QAction* act_stdAis;
+ QComboBox* cbb_Graphic3d;
+ QAction* act_Graphic3d;
+
+ QToolBar* tb_MShape;
+ QComboBox* cbb_MShape;
+ QAction* act_MShape;
+};
diff --git a/src/OcctWindow.cpp b/src/OcctWindow.cpp
new file mode 100644
index 0000000..c1f3d37
--- /dev/null
+++ b/src/OcctWindow.cpp
@@ -0,0 +1,129 @@
+#include "Occtwindow.h"
+
+OcctWindow::OcctWindow(QWidget *parent, const Quantity_NameOfColor theBackColor) :
+ Aspect_Window(),
+ _devPx(parent->devicePixelRatio()),
+ _myWidget(parent)
+{
+ SetBackground(theBackColor);
+ _xLeft = _devPx * _myWidget->rect().left();
+ _yTop = _devPx * _myWidget->rect().top();
+ _xRight = _devPx * _myWidget->rect().right();
+ _yBottom = _devPx * _myWidget->rect().bottom();
+}
+
+
+Aspect_Drawable OcctWindow::NativeParentHandle() const
+{
+ auto parentWidget = _myWidget->parentWidget();
+ if (parentWidget)
+ return (Aspect_Drawable)parentWidget->winId();
+ else
+ return 0;
+}
+
+
+Aspect_Drawable OcctWindow::NativeHandle() const
+{
+ return (Aspect_Drawable)_myWidget->winId();
+}
+
+
+Standard_Boolean OcctWindow::IsMapped() const
+{
+ return !( _myWidget->isMinimized() || _myWidget->isHidden() );
+}
+
+
+void OcctWindow::Map() const
+{
+ _myWidget->show();
+ _myWidget->update();
+}
+
+
+void OcctWindow::Unmap() const
+{
+ _myWidget->hide();
+ _myWidget->update();
+}
+
+
+Aspect_TypeOfResize OcctWindow::DoResize()
+{
+ int aMask {0};
+ auto aMode = Aspect_TOR_UNKNOWN;
+
+ if (!_myWidget->isMinimized()) {
+ if ( Abs(_devPx * _myWidget->rect().left() - _xLeft ) > 2 ) aMask |= 1;
+ if ( Abs(_devPx * _myWidget->rect().right() - _xRight ) > 2 ) aMask |= 2;
+ if ( Abs(_devPx * _myWidget->rect().top() - _yTop ) > 2 ) aMask |= 4;
+ if ( Abs(_devPx * _myWidget->rect().bottom() - _yBottom ) > 2 ) aMask |= 8;
+
+ switch ( aMask )
+ {
+ case 0:
+ aMode = Aspect_TOR_NO_BORDER;
+ break;
+ case 1:
+ aMode = Aspect_TOR_LEFT_BORDER;
+ break;
+ case 2:
+ aMode = Aspect_TOR_RIGHT_BORDER;
+ break;
+ case 4:
+ aMode = Aspect_TOR_TOP_BORDER;
+ break;
+ case 5:
+ aMode = Aspect_TOR_LEFT_AND_TOP_BORDER;
+ break;
+ case 6:
+ aMode = Aspect_TOR_TOP_AND_RIGHT_BORDER;
+ break;
+ case 8:
+ aMode = Aspect_TOR_BOTTOM_BORDER;
+ break;
+ case 9:
+ aMode = Aspect_TOR_BOTTOM_AND_LEFT_BORDER;
+ break;
+ case 10:
+ aMode = Aspect_TOR_RIGHT_AND_BOTTOM_BORDER;
+ break;
+ default:
+ break;
+ } // end switch
+
+ _xLeft = static_cast(_devPx * _myWidget->rect().left());
+ _xRight = static_cast(_devPx * _myWidget->rect().right());
+ _yTop = static_cast(_devPx * _myWidget->rect().top());
+ _yBottom = static_cast(_devPx * _myWidget->rect().bottom());
+ } // end if
+
+ return aMode;
+}
+
+Standard_Real OcctWindow::Ratio() const
+{
+ auto aRect = _myWidget->rect();
+ return Standard_Real(aRect.right() - aRect.left()) / Standard_Real(aRect.bottom() - aRect.top());
+}
+
+void OcctWindow::Size(Standard_Integer &theWidth, Standard_Integer &theHeight) const
+{
+ theWidth = _devPx * _myWidget->rect().right();
+ theHeight = _devPx * _myWidget->rect().bottom();
+}
+
+
+void OcctWindow::Position(Standard_Integer &theX1,
+ Standard_Integer &theY1,
+ Standard_Integer &theX2,
+ Standard_Integer &theY2) const
+{
+ theX1 = _devPx * _myWidget->rect().left();
+ theX2 = _devPx * _myWidget->rect().right();
+ theY1 = _devPx * _myWidget->rect().top();
+ theY2 = _devPx * _myWidget->rect().bottom();
+}
+
+IMPLEMENT_STANDARD_RTTIEXT(OcctWindow,Aspect_Window)
\ No newline at end of file
diff --git a/src/OcctWindow.h b/src/OcctWindow.h
new file mode 100644
index 0000000..833e969
--- /dev/null
+++ b/src/OcctWindow.h
@@ -0,0 +1,68 @@
+#ifndef OCCTWINDOW_H
+#define OCCTWINDOW_H
+
+// Qt headers
+#include
+
+// occ headers
+#include
+
+class OcctWindow : public Aspect_Window
+{
+ DEFINE_STANDARD_RTTIEXT(OcctWindow, Aspect_Window)
+
+public:
+
+ // constructor
+ OcctWindow(QWidget *parent = nullptr, const Quantity_NameOfColor theBackColor = Quantity_NOC_MATRAGRAY);
+
+ // destructor
+ virtual ~OcctWindow() { _myWidget = nullptr; }
+
+ // Returns native Window handle
+ virtual Aspect_Drawable NativeHandle() const override;
+
+ // Returns parent of native Window handle.
+ virtual Aspect_Drawable NativeParentHandle() const override;
+
+ // Applies the resizing to the window
+ virtual Aspect_TypeOfResize DoResize() override;
+
+ // Returns True if the window is opened
+ // and False if the window is closed.
+ virtual Standard_Boolean IsMapped() const override;
+
+ // Apply the mapping change to the window
+ // and returns TRUE if the window is mapped at screen.
+ virtual Standard_Boolean DoMapping() const override { return Standard_True; }
+
+ // Opens the window .
+ virtual void Map() const override;
+
+ //! Closes the window .
+ virtual void Unmap() const override;
+
+ virtual void Position( Standard_Integer& theX1,
+ Standard_Integer& theY1,
+ Standard_Integer& theX2,
+ Standard_Integer& theY2
+ ) const override;
+
+ // Returns the window RATIO equal to the physical
+ // WIDTH/HEIGHT dimensions.
+ virtual Standard_Real Ratio() const override;
+
+ virtual void Size(Standard_Integer& theWidth, Standard_Integer& theHeight ) const override;
+
+ virtual Aspect_FBConfig NativeFBConfig() const Standard_OVERRIDE { return NULL; }
+
+protected:
+ Standard_Integer _xLeft;
+ Standard_Integer _yTop;
+ Standard_Integer _xRight;
+ Standard_Integer _yBottom;
+ const Standard_Real _devPx;
+ QWidget* _myWidget;
+};
+
+#endif // OCCTWINDOW_H
diff --git a/src/View.cpp b/src/View.cpp
new file mode 100644
index 0000000..8275a14
--- /dev/null
+++ b/src/View.cpp
@@ -0,0 +1,502 @@
+#include "View.h"
+
+static QCursor* defCursor = nullptr;
+static QCursor* handCursor = nullptr;
+static QCursor* panCursor = nullptr;
+static QCursor* globPanCursor = nullptr;
+static QCursor* zoomCursor = nullptr;
+static QCursor* rotCursor = nullptr;
+
+View::View(const Handle(AIS_InteractiveContext)& theContext , bool theIs3dView , QWidget* theParent) :
+ QWidget(theParent) ,
+ myIs3dView(theIs3dView) ,
+ _devPx(devicePixelRatio()) ,
+ myIsRaytracing(false) ,
+ myIsShadowsEnabled(true) ,
+ myIsReflectionsEnabled(false) ,
+ myIsAntialiasingEnabled(false)
+{
+ myContext = theContext;
+ myCurrentMode = CurrentAction3d_Nothing;
+
+ setAttribute(Qt::WA_PaintOnScreen);
+ setAttribute(Qt::WA_NoSystemBackground);
+ setBackgroundRole(QPalette::NoRole);
+ setFocusPolicy(Qt::StrongFocus);
+ setMouseTracking(true);
+ init();
+ initCursors();
+}
+
+void View::init()
+{
+ if (myV3dView.IsNull())
+ {
+ myV3dView = myContext->CurrentViewer()->CreateView();
+ }
+
+ Handle(OcctWindow) hWnd = new OcctWindow(this);
+ // 设置视图窗口
+ myV3dView->SetWindow(hWnd);
+ if (!hWnd->IsMapped())
+ {
+ hWnd->Map();
+ }
+
+ if (myIs3dView)
+ {
+ Quantity_Color color1(Quantity_NOC_BLACK);
+ Quantity_Color color2(Quantity_NOC_GRAY);
+ myV3dView->SetBgGradientColors(color1 , color2 , Aspect_GFM_VER);
+ //myV3dView->SetBackgroundColor(Quantity_NOC_BLUE);
+ }
+ else
+ {
+ myV3dView->SetBackgroundColor(Quantity_TOC_RGB , 33.0 / 255.0 , 40.0 / 255.0 , 48.0 / 255.0);
+ myV3dView->SetProj(V3d_Zpos);
+ }
+
+ myV3dView->MustBeResized();
+
+ // 添加viewcube
+ aViewCube = new AIS_ViewCube();
+ aViewCube->SetBoxTransparency(0.5);
+ Handle(Prs3d_Drawer) myDrawer = aViewCube->Attributes();
+ Handle(Prs3d_DatumAspect) datumAspect = new Prs3d_DatumAspect();
+ datumAspect->ShadingAspect(Prs3d_DP_XAxis)->SetColor(Quantity_NOC_RED);
+ datumAspect->ShadingAspect(Prs3d_DP_YAxis)->SetColor(Quantity_NOC_GREEN);
+ datumAspect->ShadingAspect(Prs3d_DP_ZAxis)->SetColor(Quantity_NOC_BLUE);
+ datumAspect->TextAspect(Prs3d_DP_XAxis)->SetColor(Quantity_NOC_RED);
+ datumAspect->TextAspect(Prs3d_DP_YAxis)->SetColor(Quantity_NOC_GREEN);
+ datumAspect->TextAspect(Prs3d_DP_ZAxis)->SetColor(Quantity_NOC_BLUE);
+ myDrawer->SetDatumAspect(datumAspect);
+ aViewCube->SetTransformPersistence(new Graphic3d_TransformPers(Graphic3d_TMF_TriedronPers ,
+ Aspect_TOTP_RIGHT_UPPER ,
+ Graphic3d_Vec2i(100 , 100)));
+ myContext->Display(aViewCube , false);
+
+ // 添加矩形选择框
+ myRubberBand = new AIS_RubberBand();
+ myRubberBand->SetLineType(Aspect_TOL_DASH);
+ myRubberBand->SetLineColor(Quantity_NOC_WHITE);
+
+ setShading();
+}
+
+QPaintEngine* View::paintEngine() const
+{
+ return nullptr;
+}
+
+void View::removeAll()
+{
+ myContext->RemoveAll(false);
+ if (!myContext->IsDisplayed(aViewCube))
+ {
+ myContext->Display(aViewCube , true);
+ }
+}
+
+void View::remove()
+{
+ std::vector selectedObjects;
+ myContext->InitSelected();
+ while (myContext->MoreSelected())
+ {
+ Handle(AIS_InteractiveObject) aAis = myContext->SelectedInteractive();
+ selectedObjects.push_back(aAis);
+ myContext->NextSelected();
+ }
+ for (auto aAis : selectedObjects)
+ {
+ myContext->Remove(aAis , false);
+ }
+ myContext->UpdateCurrentViewer();
+}
+
+void View::setProjectionType(Graphic3d_Camera::Projection prj)
+{
+ myV3dView->Camera()->SetProjectionType(prj);
+ myV3dView->Redraw();
+}
+
+void View::fitAll()
+{
+ if (myContext->NbSelected() > 0)
+ {
+ myContext->FitSelected(myV3dView);
+ }
+ else
+ {
+ myV3dView->FitAll();
+ }
+
+ myV3dView->ZFitAll();
+ myV3dView->Redraw();
+}
+
+void View::setAxo()
+{
+ if (myIs3dView)
+ {
+ myV3dView->SetProj(V3d_XposYnegZpos);
+ }
+}
+
+void View::setFront()
+{
+ myV3dView->SetProj(V3d_Yneg);
+}
+
+void View::setBack()
+{
+ myV3dView->SetProj(V3d_Ypos);
+}
+
+void View::setLeft()
+{
+ myV3dView->SetProj(V3d_Xneg);
+}
+
+void View::setRight()
+{
+ myV3dView->SetProj(V3d_Xpos);
+}
+
+void View::setTop()
+{
+ myV3dView->SetProj(V3d_Zpos);
+}
+
+void View::setBottom()
+{
+ myV3dView->SetProj(V3d_Zneg);
+}
+
+void View::setShading()
+{
+ myContext->InitSelected();
+ while (myContext->MoreSelected())
+ {
+ Handle(AIS_InteractiveObject) aAis = myContext->SelectedInteractive();
+ myContext->SetDisplayMode(aAis , 1 , false);
+ myContext->NextSelected();
+ }
+
+ myContext->UpdateCurrentViewer();
+}
+
+void View::setWireframe()
+{
+ myContext->InitSelected();
+ while (myContext->MoreSelected())
+ {
+ Handle(AIS_InteractiveObject) aAis = myContext->SelectedInteractive();
+ myContext->SetDisplayMode(aAis , 0 , false);
+
+ myContext->NextSelected();
+ }
+
+ myContext->UpdateCurrentViewer();
+}
+
+void View::setAxis()
+{
+ gp_Ax2 ax2 = gp_Ax2(gp_Pnt(0 , 0 , 0) , gp_Dir(0 , 0 , 1));
+ Handle(Geom_Axis2Placement) aGeoAxis2Placement = new Geom_Axis2Placement(ax2);
+ Handle(AIS_Trihedron) aisTrihedron = new AIS_Trihedron(aGeoAxis2Placement);
+
+ aisTrihedron->SetDatumPartColor(Prs3d_DP_XArrow , Quantity_NOC_RED2);
+ aisTrihedron->SetDatumPartColor(Prs3d_DP_YArrow , Quantity_NOC_GREEN2);
+ aisTrihedron->SetDatumPartColor(Prs3d_DP_ZArrow , Quantity_NOC_BLUE2);
+ aisTrihedron->SetDatumPartColor(Prs3d_DP_XAxis , Quantity_NOC_RED2);
+ aisTrihedron->SetDatumPartColor(Prs3d_DP_YAxis , Quantity_NOC_GREEN2);
+ aisTrihedron->SetDatumPartColor(Prs3d_DP_ZAxis , Quantity_NOC_BLUE2);
+
+ // 显示模式shade在此设置,否则display方法报错
+ //aisTrihedron->SetDatumDisplayMode(Prs3d_DM_Shaded);
+ aisTrihedron->SetDrawArrows(true);
+ myContext->Display(aisTrihedron , 0 , AIS_TrihedronSelectionMode_EntireObject , false);
+}
+
+void View::setHLR(bool theState)
+{
+ QApplication::setOverrideCursor(Qt::WaitCursor);
+ myV3dView->SetComputedMode(theState);
+ myV3dView->Redraw();
+
+ QApplication::restoreOverrideCursor();
+}
+
+void View::setRaytracing(bool theState)
+{
+ QApplication::setOverrideCursor(Qt::WaitCursor);
+ if (theState)
+ {
+ myV3dView->ChangeRenderingParams().Method = Graphic3d_RM_RAYTRACING;
+ }
+ else
+ {
+ myV3dView->ChangeRenderingParams().Method = Graphic3d_RM_RASTERIZATION;
+ }
+ myIsRaytracing = theState;
+ myContext->UpdateCurrentViewer();
+ QApplication::restoreOverrideCursor();
+}
+
+void View::SetRaytracedShadows(bool theState)
+{
+ myV3dView->ChangeRenderingParams().IsShadowEnabled = theState;
+ myIsShadowsEnabled = theState;
+ myContext->UpdateCurrentViewer();
+}
+
+void View::SetRaytracedReflections(bool theState)
+{
+ myV3dView->ChangeRenderingParams().IsReflectionEnabled = theState;
+ myIsReflectionsEnabled = theState;
+ myContext->UpdateCurrentViewer();
+}
+
+void View::SetRaytracedAntialiasing(bool theState)
+{
+ myV3dView->ChangeRenderingParams().IsAntialiasingEnabled = theState;
+ myIsAntialiasingEnabled = theState;
+ myContext->UpdateCurrentViewer();
+}
+
+void View::setBackgroundColor(QColor aRetColor)
+{
+ Standard_Real R1;
+ Standard_Real G1;
+ Standard_Real B1;
+ if (aRetColor.isValid())
+ {
+ R1 = aRetColor.red() / 255.;
+ G1 = aRetColor.green() / 255.;
+ B1 = aRetColor.blue() / 255.;
+ myV3dView->SetBackgroundColor(Quantity_TOC_RGB , R1 , G1 , B1);
+ }
+ myV3dView->Redraw();
+}
+
+void View::setEnvironmentMap(const QString& fileName)
+{
+ if (!fileName.isEmpty())
+ {
+ Handle(Graphic3d_TextureEnv) aTexture = new Graphic3d_TextureEnv(fileName.toStdString().c_str());
+ myV3dView->SetTextureEnv(aTexture);
+ }
+ else
+ {
+ myV3dView->SetTextureEnv(Handle(Graphic3d_TextureEnv)());
+ }
+
+ myV3dView->Redraw();
+}
+
+void View::setTransparency(double aTranspValue)
+{
+ AIS_ListOfInteractive anAisObjectsList;
+ myContext->DisplayedObjects(anAisObjectsList);
+ if (anAisObjectsList.Extent() == 0)
+ {
+ return;
+ }
+ for (AIS_ListOfInteractive::Iterator anIter(anAisObjectsList); anIter.More(); anIter.Next())
+ {
+ const Handle(AIS_InteractiveObject)& anAisObject = anIter.Value();
+ myContext->SetTransparency(anAisObject , aTranspValue , Standard_False);
+ }
+ myContext->UpdateCurrentViewer();
+}
+
+void View::activateCursor(const CurrentAction3d theMode)
+{
+ QCursor* aCursor = defCursor;
+ switch (theMode)
+ {
+ case CurrentAction3d_DynamicPanning:
+ aCursor = panCursor;
+ break;
+ case CurrentAction3d_DynamicZooming:
+ aCursor = zoomCursor;
+ break;
+ case CurrentAction3d_DynamicRotation:
+ aCursor = rotCursor;
+ break;
+ case CurrentAction3d_GlobalPanning:
+ aCursor = globPanCursor;
+ break;
+ case CurrentAction3d_WindowZooming:
+ aCursor = handCursor;
+ break;
+ case CurrentAction3d_Nothing:
+ aCursor = defCursor;
+ break;
+ default:
+ break;
+ }
+ setCursor(*aCursor);
+}
+
+void View::paintEvent(QPaintEvent* event)
+{
+ myV3dView->Redraw();
+}
+
+void View::resizeEvent(QResizeEvent* event)
+{
+ if (!myV3dView.IsNull())
+ {
+ myV3dView->MustBeResized();
+ }
+}
+
+void View::mousePressEvent(QMouseEvent* theEvent)
+{
+ myClickPos = Graphic3d_Vec2i(_devPx * theEvent->pos().x() , _devPx * theEvent->pos().y());
+
+ if (!myV3dView.IsNull())
+ {
+ if (theEvent->button() == Qt::MiddleButton)
+ {
+ myCurrentMode = CurrentAction3d_DynamicPanning;
+ }
+
+ else if (theEvent->button() == Qt::RightButton && theEvent->modifiers() & Qt::ShiftModifier)
+ {
+ if (myIs3dView)
+ {
+ myCurrentMode = CurrentAction3d_DynamicRotation;
+ myV3dView->StartRotation(myClickPos.x() , myClickPos.y());
+ }
+ }
+
+ activateCursor(myCurrentMode);
+ update();
+ }
+}
+
+void View::mouseReleaseEvent(QMouseEvent* theEvent)
+{
+ const Graphic3d_Vec2i aNewPos = Graphic3d_Vec2i(_devPx * theEvent->pos().x() , _devPx * theEvent->pos().y());
+ if (!myV3dView.IsNull())
+ {
+ myCurrentMode = CurrentAction3d_Nothing;
+ activateCursor(myCurrentMode);
+ bool hasRubberBand= myContext->IsDisplayed(myRubberBand);
+ if (theEvent->button() == Qt::LeftButton && !hasRubberBand)
+ {
+ if (theEvent->modifiers() & Qt::ControlModifier)
+ myContext->SelectDetected(AIS_SelectionScheme_XOR);
+ else if (theEvent->modifiers() & Qt::ShiftModifier)
+ {
+ myContext->SelectDetected(AIS_SelectionScheme_Add);
+ }
+ else
+ {
+ myContext->SelectDetected(); // 此代码没有viewcube无法旋转
+ }
+ }
+ else if (theEvent->button() == Qt::LeftButton && hasRubberBand)
+ {
+ if (theEvent->modifiers() & Qt::ControlModifier)
+ {
+ myContext->SelectRectangle(myClickPos , aNewPos , myV3dView , AIS_SelectionScheme_XOR);
+ }
+ else if (theEvent->modifiers() & Qt::ShiftModifier)
+ {
+ myContext->SelectRectangle(myClickPos , aNewPos , myV3dView , AIS_SelectionScheme_Add);
+
+ }
+ else if (!(theEvent->modifiers() & (Qt::ShiftModifier | Qt::ControlModifier)))
+ {
+ myContext->SelectRectangle(myClickPos , aNewPos , myV3dView);
+ }
+ myContext->Remove(myRubberBand , false);
+ }
+
+ myClickPos = aNewPos;
+
+ update();
+ emit selectionChanged();
+ }
+}
+
+void View::mouseMoveEvent(QMouseEvent* theEvent)
+{
+ const Graphic3d_Vec2i aNewPos(_devPx * theEvent->pos().x() , _devPx * theEvent->pos().y());
+ if (!myV3dView.IsNull())
+ {
+ myContext->MoveTo(aNewPos.x() , aNewPos.y() , myV3dView , false);
+
+ if (theEvent->buttons() & Qt::LeftButton)
+ {
+ myRubberBand->SetRectangle(myClickPos.x() , height() * _devPx - myClickPos.y() ,
+ aNewPos.x() , height() * _devPx - aNewPos.y());
+ if (myContext->IsDisplayed(myRubberBand))
+ myContext->Redisplay(myRubberBand , false);
+ else
+ myContext->Display(myRubberBand , false);
+ }
+ else
+ {
+ switch (myCurrentMode)
+ {
+ case CurrentAction3d_Nothing:
+ break;
+ case CurrentAction3d_DynamicZooming:
+ myCurrentMode = CurrentAction3d_Nothing;
+ break;
+ case CurrentAction3d_DynamicPanning:
+ myV3dView->Pan(aNewPos.x() - myClickPos.x() , myClickPos.y() - aNewPos.y());
+ myClickPos = aNewPos;
+ break;
+ case CurrentAction3d_DynamicRotation:
+ if (myIs3dView)
+ {
+ myV3dView->Rotation(aNewPos.x() , aNewPos.y());
+ }
+ break;
+ case CurrentAction3d_ObjectDececting:
+ break;
+ default:
+ break;
+ }
+ activateCursor(myCurrentMode);
+ }
+ update();
+ }
+}
+
+void View::wheelEvent(QWheelEvent* theEvent)
+{
+ myClickPos = Graphic3d_Vec2i(_devPx * theEvent->position().x() , _devPx * theEvent->position().y());
+ if (!myV3dView.IsNull())
+ {
+ myCurrentMode = CurrentAction3d_DynamicZooming;
+
+ myV3dView->StartZoomAtPoint(myClickPos.x() , myClickPos.y());
+ myV3dView->ZoomAtPoint(0 , 0 , theEvent->angleDelta().y() / 8 , 0);
+
+ activateCursor(myCurrentMode);
+ update();
+ }
+}
+
+void View::initCursors()
+{
+ if (!defCursor)
+ defCursor = new QCursor(Qt::ArrowCursor);
+ if (!handCursor)
+ handCursor = new QCursor(Qt::PointingHandCursor);
+ if (!panCursor)
+ panCursor = new QCursor(Qt::SizeAllCursor);
+ if (!globPanCursor)
+ globPanCursor = new QCursor(Qt::CrossCursor);
+ if (!zoomCursor)
+ zoomCursor = new QCursor(QPixmap(":/icons/icons/cursor_zoom.png"));
+ if (!rotCursor)
+ rotCursor = new QCursor(QPixmap(":/icons/icons/cursor_rotate.png"));
+}
diff --git a/src/View.h b/src/View.h
new file mode 100644
index 0000000..ca5be1d
--- /dev/null
+++ b/src/View.h
@@ -0,0 +1,137 @@
+#pragma once
+
+#include
+#include
+#include
+#include
+
+#include "Geom_Axis2Placement.hxx"
+
+#include "OpenGl_GraphicDriver.hxx"
+#include "Aspect_DisplayConnection.hxx"
+#include "AIS_TrihedronSelectionMode.hxx"
+#include "AIS_InteractiveContext.hxx"
+#include "AIS_ViewCube.hxx"
+#include "AIS_Trihedron.hxx"
+#include "AIS_Shape.hxx"
+#include "AIS_RubberBand.hxx"
+#include "V3d_Viewer.hxx"
+#include "V3d_View.hxx"
+
+#include "OcctWindow.h"
+
+enum CurrentAction3d
+{
+ CurrentAction3d_Nothing,
+ CurrentAction3d_DynamicZooming,
+ CurrentAction3d_WindowZooming,
+ CurrentAction3d_DynamicPanning,
+ CurrentAction3d_GlobalPanning,
+ CurrentAction3d_DynamicRotation,
+ CurrentAction3d_ObjectDececting
+};
+enum ViewAction
+{
+ ViewAction_FitAll,
+ ViewAction_FitArea,
+ ViewAction_Zoom,
+ ViewAction_Pan,
+ ViewAction_GlobalPan,
+ ViewAction_Front,
+ ViewAction_Back,
+ ViewAction_Top,
+ ViewAction_Bottom,
+ ViewAction_Left,
+ ViewAction_Right,
+ ViewAction_Axo,
+ ViewAction_Rotation,
+ ViewAction_Reset,
+ ViewAction_HlrOff,
+ ViewAction_HlrOn,
+ ViewAction_Shading,
+ ViewAction_Wireframe,
+ ViewAction_Transparency
+};
+enum RaytraceAction
+{
+ RaytraceAction_Raytracing,
+ RaytraceAction_Shadows,
+ RaytraceAction_Reflections,
+ RaytraceAction_Antialiasing
+};
+
+class View :public QWidget
+{
+ Q_OBJECT
+
+signals:
+ void selectionChanged();
+
+public:
+ View(const Handle(AIS_InteractiveContext)& theContext, bool theIs3dView = true, QWidget* theParent = nullptr);
+
+ virtual void init();
+ virtual QPaintEngine* paintEngine() const;
+
+ void removeAll();
+ void remove();
+ void setProjectionType(Graphic3d_Camera::Projection prj = Graphic3d_Camera::Projection_Orthographic);
+ void fitAll();
+ void setAxo();
+ void setFront();
+ void setBack();
+ void setLeft();
+ void setRight();
+ void setTop();
+ void setBottom();
+
+ void setShading();
+ void setWireframe();
+ void setAxis();
+
+ void setHLR(bool theState);
+ void setRaytracing(bool theState);
+ void SetRaytracedShadows(bool theState);
+ void SetRaytracedReflections (bool theState);
+ void SetRaytracedAntialiasing (bool theState);
+
+ void setBackgroundColor(QColor aRetColor);
+ void setEnvironmentMap(const QString& fileName);
+ void setTransparency(double aTranspValue);
+
+ const Handle(V3d_View)& getView() const
+ {
+ return myV3dView;
+ }
+ Handle(AIS_InteractiveContext)& getContext()
+ {
+ return myContext;
+ }
+
+protected:
+ void activateCursor(const CurrentAction3d);
+ virtual void paintEvent(QPaintEvent*) override;
+ virtual void resizeEvent(QResizeEvent*) override;
+ virtual void mousePressEvent(QMouseEvent*) override;
+ virtual void mouseReleaseEvent(QMouseEvent*) override;
+ virtual void mouseMoveEvent(QMouseEvent*) override;
+ virtual void wheelEvent(QWheelEvent*) override;
+
+private:
+ void initCursors();
+
+ bool myIs3dView;
+ double _devPx;
+ Handle(V3d_View) myV3dView;
+ Handle(AIS_InteractiveContext) myContext;
+ Handle(AIS_ViewCube) aViewCube;
+ Handle(AIS_RubberBand) myRubberBand;
+
+ CurrentAction3d myCurrentMode;
+ Graphic3d_Vec2i myClickPos;
+
+ bool myIsRaytracing;
+ bool myIsShadowsEnabled;
+ bool myIsReflectionsEnabled;
+ bool myIsAntialiasingEnabled;
+};
diff --git a/src/main.cpp b/src/main.cpp
new file mode 100644
index 0000000..0c1639b
--- /dev/null
+++ b/src/main.cpp
@@ -0,0 +1,12 @@
+#include "MainWindow.h"
+
+#include
+
+int main(int argc, char* argv[])
+{
+ QApplication a(argc,argv);
+ MainWindow w;
+ w.showMaximized();
+
+ return a.exec();
+}
\ No newline at end of file
diff --git a/vcpkg-configuration.json b/vcpkg-configuration.json
new file mode 100644
index 0000000..25ff0d7
--- /dev/null
+++ b/vcpkg-configuration.json
@@ -0,0 +1,14 @@
+{
+ "default-registry": {
+ "kind": "git",
+ "baseline": "6ecbbbdf31cba47aafa7cf6189b1e73e10ac61f8",
+ "repository": "https://github.com/microsoft/vcpkg"
+ },
+ "registries": [
+ {
+ "kind": "artifact",
+ "location": "https://github.com/microsoft/vcpkg-ce-catalog/archive/refs/heads/main.zip",
+ "name": "microsoft"
+ }
+ ]
+}
diff --git a/vcpkg.json b/vcpkg.json
new file mode 100644
index 0000000..1a8b6f0
--- /dev/null
+++ b/vcpkg.json
@@ -0,0 +1,14 @@
+{
+ "name": "aicam",
+ "version-string": "1.0.0",
+ "dependencies": [
+ {
+ "name": "opencascade",
+ "default-features": false,
+ "version>=": "7.9.1",
+ "features": [
+ "vtk"
+ ]
+ }
+ ]
+}