netgen-mesher 6.2.2506.post35.dev0__cp314-cp314-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (340) hide show
  1. netgen/NgOCC.py +7 -0
  2. netgen/__init__.py +114 -0
  3. netgen/__init__.pyi +22 -0
  4. netgen/__main__.py +53 -0
  5. netgen/cmake/NetgenConfig.cmake +79 -0
  6. netgen/cmake/netgen-targets-release.cmake +69 -0
  7. netgen/cmake/netgen-targets.cmake +146 -0
  8. netgen/config/__init__.py +1 -0
  9. netgen/config/__init__.pyi +52 -0
  10. netgen/config/__main__.py +4 -0
  11. netgen/config/config.py +68 -0
  12. netgen/config/config.pyi +54 -0
  13. netgen/csg.py +25 -0
  14. netgen/geom2d.py +178 -0
  15. netgen/gui.py +82 -0
  16. netgen/include/core/archive.hpp +1256 -0
  17. netgen/include/core/array.hpp +1760 -0
  18. netgen/include/core/autodiff.hpp +1131 -0
  19. netgen/include/core/autodiffdiff.hpp +733 -0
  20. netgen/include/core/bitarray.hpp +240 -0
  21. netgen/include/core/concurrentqueue.h +3619 -0
  22. netgen/include/core/exception.hpp +145 -0
  23. netgen/include/core/flags.hpp +199 -0
  24. netgen/include/core/hashtable.hpp +1281 -0
  25. netgen/include/core/localheap.hpp +318 -0
  26. netgen/include/core/logging.hpp +117 -0
  27. netgen/include/core/memtracer.hpp +221 -0
  28. netgen/include/core/mpi4py_pycapi.h +245 -0
  29. netgen/include/core/mpi_wrapper.hpp +643 -0
  30. netgen/include/core/ng_mpi.hpp +94 -0
  31. netgen/include/core/ng_mpi_generated_declarations.hpp +155 -0
  32. netgen/include/core/ng_mpi_native.hpp +25 -0
  33. netgen/include/core/ngcore.hpp +32 -0
  34. netgen/include/core/ngcore_api.hpp +152 -0
  35. netgen/include/core/ngstream.hpp +115 -0
  36. netgen/include/core/paje_trace.hpp +279 -0
  37. netgen/include/core/profiler.hpp +382 -0
  38. netgen/include/core/python_ngcore.hpp +457 -0
  39. netgen/include/core/ranges.hpp +109 -0
  40. netgen/include/core/register_archive.hpp +100 -0
  41. netgen/include/core/signal.hpp +82 -0
  42. netgen/include/core/simd.hpp +160 -0
  43. netgen/include/core/simd_arm64.hpp +407 -0
  44. netgen/include/core/simd_avx.hpp +394 -0
  45. netgen/include/core/simd_avx512.hpp +285 -0
  46. netgen/include/core/simd_generic.hpp +1053 -0
  47. netgen/include/core/simd_math.hpp +178 -0
  48. netgen/include/core/simd_sse.hpp +289 -0
  49. netgen/include/core/statushandler.hpp +37 -0
  50. netgen/include/core/symboltable.hpp +153 -0
  51. netgen/include/core/table.hpp +810 -0
  52. netgen/include/core/taskmanager.hpp +1161 -0
  53. netgen/include/core/type_traits.hpp +65 -0
  54. netgen/include/core/utils.hpp +385 -0
  55. netgen/include/core/version.hpp +102 -0
  56. netgen/include/core/xbool.hpp +47 -0
  57. netgen/include/csg/algprim.hpp +563 -0
  58. netgen/include/csg/brick.hpp +150 -0
  59. netgen/include/csg/csg.hpp +43 -0
  60. netgen/include/csg/csgeom.hpp +389 -0
  61. netgen/include/csg/csgparser.hpp +101 -0
  62. netgen/include/csg/curve2d.hpp +67 -0
  63. netgen/include/csg/edgeflw.hpp +112 -0
  64. netgen/include/csg/explicitcurve2d.hpp +113 -0
  65. netgen/include/csg/extrusion.hpp +185 -0
  66. netgen/include/csg/gencyl.hpp +70 -0
  67. netgen/include/csg/geoml.hpp +16 -0
  68. netgen/include/csg/identify.hpp +213 -0
  69. netgen/include/csg/manifold.hpp +29 -0
  70. netgen/include/csg/meshsurf.hpp +46 -0
  71. netgen/include/csg/polyhedra.hpp +121 -0
  72. netgen/include/csg/revolution.hpp +180 -0
  73. netgen/include/csg/singularref.hpp +84 -0
  74. netgen/include/csg/solid.hpp +295 -0
  75. netgen/include/csg/specpoin.hpp +194 -0
  76. netgen/include/csg/spline3d.hpp +99 -0
  77. netgen/include/csg/splinesurface.hpp +85 -0
  78. netgen/include/csg/surface.hpp +394 -0
  79. netgen/include/csg/triapprox.hpp +63 -0
  80. netgen/include/csg/vscsg.hpp +34 -0
  81. netgen/include/general/autodiff.hpp +356 -0
  82. netgen/include/general/autoptr.hpp +39 -0
  83. netgen/include/general/gzstream.h +121 -0
  84. netgen/include/general/hashtabl.hpp +1692 -0
  85. netgen/include/general/myadt.hpp +48 -0
  86. netgen/include/general/mystring.hpp +226 -0
  87. netgen/include/general/netgenout.hpp +205 -0
  88. netgen/include/general/ngarray.hpp +797 -0
  89. netgen/include/general/ngbitarray.hpp +149 -0
  90. netgen/include/general/ngpython.hpp +74 -0
  91. netgen/include/general/optmem.hpp +44 -0
  92. netgen/include/general/parthreads.hpp +138 -0
  93. netgen/include/general/seti.hpp +50 -0
  94. netgen/include/general/sort.hpp +47 -0
  95. netgen/include/general/spbita2d.hpp +59 -0
  96. netgen/include/general/stack.hpp +114 -0
  97. netgen/include/general/table.hpp +280 -0
  98. netgen/include/general/template.hpp +509 -0
  99. netgen/include/geom2d/csg2d.hpp +750 -0
  100. netgen/include/geom2d/geometry2d.hpp +280 -0
  101. netgen/include/geom2d/spline2d.hpp +234 -0
  102. netgen/include/geom2d/vsgeom2d.hpp +28 -0
  103. netgen/include/gprim/adtree.hpp +1392 -0
  104. netgen/include/gprim/geom2d.hpp +858 -0
  105. netgen/include/gprim/geom3d.hpp +749 -0
  106. netgen/include/gprim/geomfuncs.hpp +212 -0
  107. netgen/include/gprim/geomobjects.hpp +544 -0
  108. netgen/include/gprim/geomops.hpp +404 -0
  109. netgen/include/gprim/geomtest3d.hpp +101 -0
  110. netgen/include/gprim/gprim.hpp +33 -0
  111. netgen/include/gprim/spline.hpp +778 -0
  112. netgen/include/gprim/splinegeometry.hpp +73 -0
  113. netgen/include/gprim/transform3d.hpp +216 -0
  114. netgen/include/include/acisgeom.hpp +3 -0
  115. netgen/include/include/csg.hpp +1 -0
  116. netgen/include/include/geometry2d.hpp +1 -0
  117. netgen/include/include/gprim.hpp +1 -0
  118. netgen/include/include/incopengl.hpp +62 -0
  119. netgen/include/include/inctcl.hpp +13 -0
  120. netgen/include/include/incvis.hpp +6 -0
  121. netgen/include/include/linalg.hpp +1 -0
  122. netgen/include/include/meshing.hpp +1 -0
  123. netgen/include/include/myadt.hpp +1 -0
  124. netgen/include/include/mydefs.hpp +70 -0
  125. netgen/include/include/mystdlib.h +59 -0
  126. netgen/include/include/netgen_config.hpp +27 -0
  127. netgen/include/include/netgen_version.hpp +9 -0
  128. netgen/include/include/nginterface_v2_impl.hpp +395 -0
  129. netgen/include/include/ngsimd.hpp +1 -0
  130. netgen/include/include/occgeom.hpp +1 -0
  131. netgen/include/include/opti.hpp +1 -0
  132. netgen/include/include/parallel.hpp +1 -0
  133. netgen/include/include/stlgeom.hpp +1 -0
  134. netgen/include/include/visual.hpp +1 -0
  135. netgen/include/interface/rw_medit.hpp +11 -0
  136. netgen/include/interface/writeuser.hpp +80 -0
  137. netgen/include/linalg/densemat.hpp +414 -0
  138. netgen/include/linalg/linalg.hpp +29 -0
  139. netgen/include/linalg/opti.hpp +142 -0
  140. netgen/include/linalg/polynomial.hpp +47 -0
  141. netgen/include/linalg/vector.hpp +217 -0
  142. netgen/include/meshing/adfront2.hpp +274 -0
  143. netgen/include/meshing/adfront3.hpp +332 -0
  144. netgen/include/meshing/basegeom.hpp +370 -0
  145. netgen/include/meshing/bcfunctions.hpp +53 -0
  146. netgen/include/meshing/bisect.hpp +72 -0
  147. netgen/include/meshing/boundarylayer.hpp +113 -0
  148. netgen/include/meshing/classifyhpel.hpp +1984 -0
  149. netgen/include/meshing/clusters.hpp +46 -0
  150. netgen/include/meshing/curvedelems.hpp +274 -0
  151. netgen/include/meshing/delaunay2d.hpp +73 -0
  152. netgen/include/meshing/fieldlines.hpp +103 -0
  153. netgen/include/meshing/findip.hpp +198 -0
  154. netgen/include/meshing/findip2.hpp +103 -0
  155. netgen/include/meshing/geomsearch.hpp +69 -0
  156. netgen/include/meshing/global.hpp +54 -0
  157. netgen/include/meshing/hpref_hex.hpp +330 -0
  158. netgen/include/meshing/hpref_prism.hpp +3405 -0
  159. netgen/include/meshing/hpref_pyramid.hpp +154 -0
  160. netgen/include/meshing/hpref_quad.hpp +2082 -0
  161. netgen/include/meshing/hpref_segm.hpp +122 -0
  162. netgen/include/meshing/hpref_tet.hpp +4230 -0
  163. netgen/include/meshing/hpref_trig.hpp +848 -0
  164. netgen/include/meshing/hprefinement.hpp +366 -0
  165. netgen/include/meshing/improve2.hpp +178 -0
  166. netgen/include/meshing/improve3.hpp +151 -0
  167. netgen/include/meshing/localh.hpp +223 -0
  168. netgen/include/meshing/meshclass.hpp +1076 -0
  169. netgen/include/meshing/meshfunc.hpp +47 -0
  170. netgen/include/meshing/meshing.hpp +63 -0
  171. netgen/include/meshing/meshing2.hpp +163 -0
  172. netgen/include/meshing/meshing3.hpp +123 -0
  173. netgen/include/meshing/meshtool.hpp +90 -0
  174. netgen/include/meshing/meshtype.hpp +1930 -0
  175. netgen/include/meshing/msghandler.hpp +62 -0
  176. netgen/include/meshing/paralleltop.hpp +172 -0
  177. netgen/include/meshing/python_mesh.hpp +206 -0
  178. netgen/include/meshing/ruler2.hpp +172 -0
  179. netgen/include/meshing/ruler3.hpp +211 -0
  180. netgen/include/meshing/soldata.hpp +141 -0
  181. netgen/include/meshing/specials.hpp +17 -0
  182. netgen/include/meshing/surfacegeom.hpp +73 -0
  183. netgen/include/meshing/topology.hpp +1003 -0
  184. netgen/include/meshing/validate.hpp +21 -0
  185. netgen/include/meshing/visual_interface.hpp +71 -0
  186. netgen/include/mydefs.hpp +70 -0
  187. netgen/include/nginterface.h +474 -0
  188. netgen/include/nginterface_v2.hpp +406 -0
  189. netgen/include/nglib.h +697 -0
  190. netgen/include/nglib_occ.h +50 -0
  191. netgen/include/occ/occ_edge.hpp +47 -0
  192. netgen/include/occ/occ_face.hpp +52 -0
  193. netgen/include/occ/occ_solid.hpp +23 -0
  194. netgen/include/occ/occ_utils.hpp +376 -0
  195. netgen/include/occ/occ_vertex.hpp +30 -0
  196. netgen/include/occ/occgeom.hpp +659 -0
  197. netgen/include/occ/occmeshsurf.hpp +168 -0
  198. netgen/include/occ/vsocc.hpp +33 -0
  199. netgen/include/pybind11/LICENSE +29 -0
  200. netgen/include/pybind11/attr.h +722 -0
  201. netgen/include/pybind11/buffer_info.h +208 -0
  202. netgen/include/pybind11/cast.h +2361 -0
  203. netgen/include/pybind11/chrono.h +228 -0
  204. netgen/include/pybind11/common.h +2 -0
  205. netgen/include/pybind11/complex.h +74 -0
  206. netgen/include/pybind11/conduit/README.txt +15 -0
  207. netgen/include/pybind11/conduit/pybind11_conduit_v1.h +116 -0
  208. netgen/include/pybind11/conduit/pybind11_platform_abi_id.h +87 -0
  209. netgen/include/pybind11/conduit/wrap_include_python_h.h +72 -0
  210. netgen/include/pybind11/critical_section.h +56 -0
  211. netgen/include/pybind11/detail/class.h +823 -0
  212. netgen/include/pybind11/detail/common.h +1348 -0
  213. netgen/include/pybind11/detail/cpp_conduit.h +75 -0
  214. netgen/include/pybind11/detail/descr.h +226 -0
  215. netgen/include/pybind11/detail/dynamic_raw_ptr_cast_if_possible.h +39 -0
  216. netgen/include/pybind11/detail/exception_translation.h +71 -0
  217. netgen/include/pybind11/detail/function_record_pyobject.h +191 -0
  218. netgen/include/pybind11/detail/init.h +538 -0
  219. netgen/include/pybind11/detail/internals.h +799 -0
  220. netgen/include/pybind11/detail/native_enum_data.h +209 -0
  221. netgen/include/pybind11/detail/pybind11_namespace_macros.h +82 -0
  222. netgen/include/pybind11/detail/struct_smart_holder.h +378 -0
  223. netgen/include/pybind11/detail/type_caster_base.h +1591 -0
  224. netgen/include/pybind11/detail/typeid.h +65 -0
  225. netgen/include/pybind11/detail/using_smart_holder.h +22 -0
  226. netgen/include/pybind11/detail/value_and_holder.h +90 -0
  227. netgen/include/pybind11/eigen/common.h +9 -0
  228. netgen/include/pybind11/eigen/matrix.h +723 -0
  229. netgen/include/pybind11/eigen/tensor.h +521 -0
  230. netgen/include/pybind11/eigen.h +12 -0
  231. netgen/include/pybind11/embed.h +320 -0
  232. netgen/include/pybind11/eval.h +161 -0
  233. netgen/include/pybind11/functional.h +147 -0
  234. netgen/include/pybind11/gil.h +199 -0
  235. netgen/include/pybind11/gil_safe_call_once.h +102 -0
  236. netgen/include/pybind11/gil_simple.h +37 -0
  237. netgen/include/pybind11/iostream.h +265 -0
  238. netgen/include/pybind11/native_enum.h +67 -0
  239. netgen/include/pybind11/numpy.h +2312 -0
  240. netgen/include/pybind11/operators.h +202 -0
  241. netgen/include/pybind11/options.h +92 -0
  242. netgen/include/pybind11/pybind11.h +3645 -0
  243. netgen/include/pybind11/pytypes.h +2680 -0
  244. netgen/include/pybind11/stl/filesystem.h +114 -0
  245. netgen/include/pybind11/stl.h +666 -0
  246. netgen/include/pybind11/stl_bind.h +858 -0
  247. netgen/include/pybind11/subinterpreter.h +299 -0
  248. netgen/include/pybind11/trampoline_self_life_support.h +65 -0
  249. netgen/include/pybind11/type_caster_pyobject_ptr.h +61 -0
  250. netgen/include/pybind11/typing.h +298 -0
  251. netgen/include/pybind11/warnings.h +75 -0
  252. netgen/include/stlgeom/meshstlsurface.hpp +67 -0
  253. netgen/include/stlgeom/stlgeom.hpp +491 -0
  254. netgen/include/stlgeom/stlline.hpp +193 -0
  255. netgen/include/stlgeom/stltool.hpp +331 -0
  256. netgen/include/stlgeom/stltopology.hpp +419 -0
  257. netgen/include/stlgeom/vsstl.hpp +58 -0
  258. netgen/include/visualization/meshdoc.hpp +42 -0
  259. netgen/include/visualization/mvdraw.hpp +325 -0
  260. netgen/include/visualization/vispar.hpp +128 -0
  261. netgen/include/visualization/visual.hpp +28 -0
  262. netgen/include/visualization/visual_api.hpp +10 -0
  263. netgen/include/visualization/vssolution.hpp +399 -0
  264. netgen/lib/libnggui.lib +0 -0
  265. netgen/lib/ngcore.lib +0 -0
  266. netgen/lib/nglib.lib +0 -0
  267. netgen/lib/togl.lib +0 -0
  268. netgen/libnggui.dll +0 -0
  269. netgen/libngguipy.lib +0 -0
  270. netgen/libngguipy.pyd +0 -0
  271. netgen/libngpy/_NgOCC.pyi +1545 -0
  272. netgen/libngpy/__init__.pyi +7 -0
  273. netgen/libngpy/_csg.pyi +259 -0
  274. netgen/libngpy/_geom2d.pyi +323 -0
  275. netgen/libngpy/_meshing.pyi +1111 -0
  276. netgen/libngpy/_stl.pyi +131 -0
  277. netgen/libngpy.lib +0 -0
  278. netgen/libngpy.pyd +0 -0
  279. netgen/meshing.py +65 -0
  280. netgen/ngcore.dll +0 -0
  281. netgen/nglib.dll +0 -0
  282. netgen/occ.py +52 -0
  283. netgen/read_gmsh.py +259 -0
  284. netgen/read_meshio.py +22 -0
  285. netgen/stl.py +2 -0
  286. netgen/togl.dll +0 -0
  287. netgen/version.py +2 -0
  288. netgen/webgui.py +529 -0
  289. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/boundarycondition.geo +16 -0
  290. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/boxcyl.geo +32 -0
  291. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/circle_on_cube.geo +27 -0
  292. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cone.geo +13 -0
  293. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cube.geo +16 -0
  294. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubeandring.geo +55 -0
  295. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubeandspheres.geo +21 -0
  296. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubemcyl.geo +18 -0
  297. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubemsphere.geo +19 -0
  298. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cylinder.geo +12 -0
  299. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cylsphere.geo +12 -0
  300. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/doc/ng4.pdf +0 -0
  301. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/ellipsoid.geo +8 -0
  302. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/ellipticcyl.geo +10 -0
  303. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/extrusion.geo +99 -0
  304. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/fichera.geo +24 -0
  305. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/frame.step +11683 -0
  306. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/hinge.stl +8486 -0
  307. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/lshape3d.geo +26 -0
  308. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/manyholes.geo +26 -0
  309. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/manyholes2.geo +26 -0
  310. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/matrix.geo +27 -0
  311. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/ortho.geo +11 -0
  312. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/part1.stl +2662 -0
  313. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/period.geo +33 -0
  314. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/py_tutorials/exportNeutral.py +26 -0
  315. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/py_tutorials/mesh.py +19 -0
  316. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/py_tutorials/shaft.geo +65 -0
  317. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/revolution.geo +18 -0
  318. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/screw.step +1694 -0
  319. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/sculpture.geo +13 -0
  320. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/shaft.geo +65 -0
  321. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/shell.geo +10 -0
  322. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/sphere.geo +8 -0
  323. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/sphereincube.geo +17 -0
  324. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/square.in2d +35 -0
  325. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/squarecircle.in2d +48 -0
  326. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/squarehole.in2d +47 -0
  327. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/torus.geo +8 -0
  328. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/trafo.geo +57 -0
  329. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/twobricks.geo +15 -0
  330. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/twocubes.geo +18 -0
  331. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/twocyl.geo +16 -0
  332. netgen_mesher-6.2.2506.post35.dev0.dist-info/METADATA +15 -0
  333. netgen_mesher-6.2.2506.post35.dev0.dist-info/RECORD +340 -0
  334. netgen_mesher-6.2.2506.post35.dev0.dist-info/WHEEL +5 -0
  335. netgen_mesher-6.2.2506.post35.dev0.dist-info/entry_points.txt +2 -0
  336. netgen_mesher-6.2.2506.post35.dev0.dist-info/licenses/AUTHORS +1 -0
  337. netgen_mesher-6.2.2506.post35.dev0.dist-info/licenses/LICENSE +504 -0
  338. netgen_mesher-6.2.2506.post35.dev0.dist-info/top_level.txt +2 -0
  339. pyngcore/__init__.py +1 -0
  340. pyngcore/pyngcore.cp314-win_amd64.pyd +0 -0
netgen/webgui.py ADDED
@@ -0,0 +1,529 @@
1
+ import math
2
+ import numpy as np
3
+ from time import time
4
+ import os
5
+
6
+ try:
7
+ import webgui_jupyter_widgets
8
+ from webgui_jupyter_widgets import BaseWebGuiScene, WebGuiDocuWidget
9
+ import webgui_jupyter_widgets.widget as wg
10
+ except ImportError:
11
+ class BaseWebGuiScene:
12
+ pass
13
+
14
+ wg = None
15
+
16
+ def encodeData( data, dtype=None, encoding='b64' ):
17
+ import numpy as np
18
+ from base64 import b64encode
19
+ dtype = dtype or data.dtype
20
+ values = np.array(data.flatten(), dtype=dtype)
21
+ if encoding=='b64':
22
+ return b64encode(values).decode("ascii")
23
+ elif encoding=='binary':
24
+ return values.tobytes()
25
+ else:
26
+ raise RuntimeError("unknown encoding" + str(encoding))
27
+
28
+ from packaging.version import parse
29
+
30
+ import netgen.meshing as ng
31
+
32
+ if wg is not None and parse(webgui_jupyter_widgets.__version__) >= parse("0.2.18"):
33
+ _default_width = None
34
+ _default_height = None
35
+ else:
36
+ _default_width = "100%"
37
+ _default_height = "50vh"
38
+
39
+
40
+ _registered_draw_types = {}
41
+
42
+
43
+ def register_draw_type(*types):
44
+ def inner(func):
45
+ for typ in types:
46
+ _registered_draw_types[typ] = func
47
+
48
+ return inner
49
+
50
+
51
+ _bernstein_cache = {}
52
+
53
+
54
+ def GetIBernsteinBasis(etype, order):
55
+ if (etype, order) in _bernstein_cache:
56
+ return _bernstein_cache[(etype, order)]
57
+ bvals = None
58
+
59
+ if etype == "segment":
60
+
61
+ def Binomial(n, i):
62
+ return math.factorial(n) / math.factorial(i) / math.factorial(n - i)
63
+
64
+ def Bernstein(x, i, n):
65
+ return Binomial(n, i) * x**i * (1 - x) ** (n - i)
66
+
67
+ bvals = np.zeros(
68
+ (order + 1, order + 1), dtype=float
69
+ ) # .Matrix(order+1,order+1)
70
+ for i in range(order + 1):
71
+ for j in range(order + 1):
72
+ bvals[i, j] = Bernstein(i / order, j, order)
73
+
74
+ if etype == "trig":
75
+
76
+ def BernsteinTrig(x, y, i, j, n):
77
+ return (
78
+ math.factorial(n)
79
+ / math.factorial(i)
80
+ / math.factorial(j)
81
+ / math.factorial(n - i - j)
82
+ * x**i
83
+ * y**j
84
+ * (1 - x - y) ** (n - i - j)
85
+ )
86
+
87
+ og = order
88
+ ndtrig = int((og + 1) * (og + 2) / 2)
89
+ bvals = np.zeros((ndtrig, ndtrig))
90
+ ii = 0
91
+ for ix in range(og + 1):
92
+ for iy in range(og + 1 - ix):
93
+ jj = 0
94
+ for jx in range(og + 1):
95
+ for jy in range(og + 1 - jx):
96
+ bvals[ii, jj] = BernsteinTrig(ix / og, iy / og, jx, jy, og)
97
+ jj += 1
98
+ ii += 1
99
+
100
+ if bvals is None:
101
+ raise RuntimeError(f"Unkown element type {etype}")
102
+
103
+ ibvals = _bernstein_cache[(etype, order)] = np.linalg.inv(bvals)
104
+ return ibvals
105
+
106
+
107
+ def GetWireframePoints(etype, order):
108
+ n = order
109
+ if etype == "trig":
110
+ return np.array(
111
+ [(i / n, 0) for i in range(n + 1)]
112
+ + [(0, i / n) for i in range(n + 1)]
113
+ + [(i / n, 1.0 - i / n) for i in range(n + 1)]
114
+ )
115
+ if etype == "quad":
116
+ return np.array(
117
+ [(i / n, 0) for i in range(n + 1)]
118
+ + [(0, i / n) for i in range(n + 1)]
119
+ + [(i / n, 1.0) for i in range(n + 1)]
120
+ + [(1.0, i / n) for i in range(n + 1)]
121
+ )
122
+
123
+ raise RuntimeError(f"Unknown element type {etype}")
124
+
125
+
126
+ def GetElementPoints(etype, order):
127
+ n = order
128
+ if etype == "trig":
129
+ return np.array(
130
+ [(i / n, j / n) for j in range(n + 1) for i in range(n + 1 - j)]
131
+ )
132
+ if etype == "quad":
133
+ return np.array(
134
+ [(i / n, j / n) for j in range(n + 1) for i in range(n + 1 - j)]
135
+ + [(1 - i / n, 1 - j / n) for j in range(n + 1) for i in range(n + 1 - j)]
136
+ )
137
+
138
+ raise RuntimeError(f"Unknown element type {etype}")
139
+
140
+
141
+ def MapBernstein(pnts, etype, order):
142
+ """
143
+ Maps function values at equidistant control points to the Bernstein basis function.
144
+ Parameters:
145
+ pnts (numpy.ndarray): The input control points with shape (number_of_elements, points_per_element, function_dimension)
146
+ point_per_element must be a multiple of the basis size
147
+ etype (str): Element type (currently ignored and trig assumed)
148
+ order (int): Polynomial order
149
+
150
+ Returns:
151
+ numpy.ndarray: The mapped points with the shape (points_per_element, number_of_elements, function_dimension)
152
+ """
153
+ ibvals = GetIBernsteinBasis(etype, order)
154
+ # for wireframe or subdivided elements, we have multiple point sets per element
155
+ # so do a reshape to simulate more elements with correct number of control points per element instead
156
+ if pnts.shape[1] != ibvals.shape[0]:
157
+ pnts = pnts.reshape((-1, ibvals.shape[0], pnts.shape[2]))
158
+
159
+ points = np.zeros(pnts.shape, dtype=np.float32).transpose(1, 0, 2)
160
+ for i in range(points.shape[2]):
161
+ points[:, :, i] = np.tensordot(ibvals, pnts[:, :, i], axes=(1, 1))
162
+ return points
163
+
164
+
165
+ @register_draw_type(ng.Mesh)
166
+ def GetData(mesh, args, kwargs):
167
+ d = {}
168
+ d["gui_settings"] = kwargs["settings"]
169
+ d["mesh_dim"] = mesh.dim
170
+
171
+ pmin, pmax = mesh.bounding_box
172
+ diag = pmax - pmin
173
+ pmid = pmin + 0.5 * diag
174
+ d["mesh_center"] = [pmid[i] for i in range(3)]
175
+ d["mesh_radius"] = diag.Norm()
176
+
177
+ d["funcdim"] = 0
178
+ d["show_mesh"] = True
179
+ d["draw_surf"] = True
180
+ d["funcmin"] = 0.0
181
+ d["funcmax"] = 1.0
182
+
183
+ # Generate surface element data
184
+ # webgui code assumes 4 scalar fields (x,y,z, mesh_index)
185
+ # TODO: other element types than trigs
186
+ order = kwargs["order"]
187
+ refpts = GetElementPoints("trig", order)
188
+ pnts = np.ndarray((len(mesh.Elements2D()), refpts.shape[0], 4))
189
+ mesh.CalcElementMapping(refpts, pnts)
190
+
191
+ # set mesh_index
192
+ for i, el in enumerate(mesh.Elements2D()):
193
+ pnts[i, :, 3] = el.index - 1
194
+ fds = mesh.FaceDescriptors()
195
+ d["colors"] = [fd.color +(fd.transparency,) for fd in fds]
196
+ d["mesh_regions_2d"] = len(fds)
197
+ d["names"] = [fd.bcname for fd in fds]
198
+
199
+ d["Bezier_trig_points"] = MapBernstein(pnts, "trig", order)
200
+ d["order2d"] = order
201
+
202
+ # Generate wireframe data
203
+ refpts = GetWireframePoints("trig", order)
204
+ pnts = np.ndarray((len(mesh.Elements2D()), refpts.shape[0], 4))
205
+ mesh.CalcElementMapping(refpts, pnts)
206
+ d["Bezier_points"] = MapBernstein(pnts, "segment", order)
207
+ d["show_wireframe"] = True
208
+
209
+ # TODO: Generate edge data
210
+ d["edges"] = []
211
+
212
+ # encode data as b64
213
+ for name in ["Bezier_trig_points", "edges", "Bezier_points"]:
214
+ pnew = []
215
+ for plist in d[name]:
216
+ pnew.append(encodeData(np.array(plist, dtype=np.float32)))
217
+ d[name] = pnew
218
+ return d
219
+
220
+ class WebGLScene(BaseWebGuiScene):
221
+ class Widget:
222
+ def __init__(self):
223
+ self.value = {}
224
+
225
+ def __init__(self, obj, args=[], kwargs={}):
226
+ self.widget = self.Widget()
227
+ self.obj = obj
228
+ self.args = args
229
+ self.kwargs = kwargs
230
+ self.encoding = "b64"
231
+
232
+ def Redraw(self, *args, **kwargs):
233
+ if args or kwargs:
234
+ if 'show' not in kwargs:
235
+ kwargs['show'] = False
236
+
237
+ new_scene = Draw(*args, **kwargs)
238
+ self.obj = new_scene.obj
239
+ self.args = new_scene.args
240
+ self.kwargs = new_scene.kwargs
241
+ super().Redraw()
242
+
243
+ def GetData(self, set_minmax=True):
244
+ self.kwargs["encoding"] = self.encoding
245
+ typ = type(self.obj)
246
+ d = None
247
+ if type(self.obj) in _registered_draw_types:
248
+ d = _registered_draw_types[typ](self.obj, self.args, self.kwargs)
249
+ else:
250
+ import inspect
251
+
252
+ for t in inspect.getmro(typ):
253
+ if t in _registered_draw_types:
254
+ d = _registered_draw_types[t](self.obj, self.args, self.kwargs)
255
+ break
256
+ if d is None and hasattr(self.obj, "_webgui_data"):
257
+ d = self.obj._webgui_data()
258
+ bp = d["Bezier_trig_points"]
259
+ for i in range(len(bp)):
260
+ bp[i] = encodeData(np.array(bp[i], dtype=np.float32))
261
+
262
+ ep = d["edges"]
263
+ for i in range(len(ep)):
264
+ ep[i] = encodeData(np.array(ep[i], dtype=np.float32))
265
+
266
+ if d is None:
267
+ raise RuntimeError(f"Cannot draw object of type {typ}")
268
+
269
+ args = self.args
270
+ kwargs = self.kwargs
271
+ if "clipping" in kwargs:
272
+ clipping = kwargs["clipping"]
273
+ d["clipping"] = True
274
+ if isinstance(clipping, dict):
275
+ allowed_args = ("x", "y", "z", "dist", "function", "pnt", "vec")
276
+ if "vec" in clipping:
277
+ vec = clipping["vec"]
278
+ clipping["x"] = vec[0]
279
+ clipping["y"] = vec[1]
280
+ clipping["z"] = vec[2]
281
+ if "pnt" in clipping:
282
+ d["mesh_center"] = list(clipping["pnt"])
283
+ for name, val in clipping.items():
284
+ if not (name in allowed_args):
285
+ raise Exception(
286
+ "Only {} allowed as arguments for clipping!".format(
287
+ ", ".join(allowed_args)
288
+ )
289
+ )
290
+ d["clipping_" + name] = val
291
+
292
+ id_ = kwargs.get("id", None)
293
+ js_code = kwargs.get("js_code", "")
294
+ if id_ is not None:
295
+ js_code += f"""
296
+ if(window._webgui_scenes === undefined)
297
+ window._webgui_scenes = {{}};
298
+ window._webgui_scenes['{id_}'] = scene;
299
+ """
300
+ if js_code:
301
+ d["on_init"] = js_code
302
+
303
+ if "min" in kwargs:
304
+ d["funcmin"] = kwargs["min"]
305
+ if "max" in kwargs:
306
+ d["funcmax"] = kwargs["max"]
307
+ d["autoscale"] = kwargs["autoscale"]
308
+
309
+ if "vectors" in kwargs:
310
+ d["vectors"] = True
311
+ if isinstance(kwargs["vectors"], dict):
312
+ for name, val in kwargs["vectors"].items():
313
+ if not (name in ("grid_size", "offset")):
314
+ raise Exception(
315
+ 'Only "grid_size" and "offset" allowed as arguments for vectors!'
316
+ )
317
+ d["vectors_" + name] = val
318
+
319
+ if "eval_function" in kwargs:
320
+ d["user_eval_function"] = kwargs["eval_function"]
321
+
322
+ # see shaders/utils.h for value explanation (function_mode)
323
+ if "eval_" in kwargs:
324
+ eval_ = kwargs["eval"]
325
+ if isinstance(eval_, int):
326
+ d["eval"] = eval_
327
+ elif eval_ == "norm":
328
+ d["eval"] = 3
329
+ elif eval_ == "real":
330
+ d["eval"] = 5
331
+ elif eval_ == "imag":
332
+ d["eval"] = 6
333
+
334
+ if "fullscreen" in kwargs:
335
+ d["fullscreen"] = kwargs["fullscreen"]
336
+ if "gui_settings" not in d:
337
+ d["gui_settings"] = self.kwargs["settings"]
338
+
339
+ if "euler_angles" in kwargs:
340
+ camera = d["gui_settings"].get("camera", {})
341
+ camera["euler_angles"] = kwargs["euler_angles"]
342
+ d["gui_settings"]['camera'] = camera
343
+
344
+ d["objects"] = []
345
+ for obj in kwargs["objects"]:
346
+ if isinstance(obj, dict):
347
+ d["objects"].append(obj)
348
+ else:
349
+ d["objects"].append(obj._GetWebguiData())
350
+
351
+ if 'center' in kwargs:
352
+ center = list(kwargs['center'])
353
+ if len(center) == 2:
354
+ center.append(0.)
355
+ d["mesh_center"] = center
356
+
357
+ if 'radius' in kwargs:
358
+ d["mesh_radius"] = kwargs['radius']
359
+
360
+ return d
361
+
362
+ def DownloadScreenshot(self, filename="image.jpg"):
363
+ from IPython.display import Javascript, display
364
+
365
+ if "id" not in self.kwargs:
366
+ raise Exception(
367
+ "To make a screenshot, please provide an id='some_unique_id' argument to Draw()"
368
+ )
369
+ format = filename.split(".")[-1].lower()
370
+ display(
371
+ Javascript(
372
+ f"""
373
+ {{
374
+ var scene = window._webgui_scenes['{self.kwargs['id']}'];
375
+ console.log("screenshot of scene", scene);
376
+ const toimage = () => {{
377
+ var link = document.createElement('a');
378
+ link.href = scene.renderer.domElement.toDataURL('image/{format}');
379
+ link.download = '{filename}';
380
+ link.click();
381
+ scene.event_handlers['afterrender'].pop(toimage);
382
+ }};
383
+ scene.on('afterrender', toimage);
384
+ scene.render();
385
+ }}
386
+ """
387
+ )
388
+ )
389
+
390
+
391
+ bezier_trig_trafos = {} # cache trafos for different orders
392
+
393
+ # def Draw(shape, clipping=None, js_code=None, filename=""):
394
+ # # todo: also handle occ geometry, list of shapes, etc.
395
+
396
+ # scene = WebGLScene(shape, clipping=clipping, on_init=js_code)
397
+
398
+ # if wg._IN_IPYTHON:
399
+ # if wg._IN_GOOGLE_COLAB:
400
+ # from IPython.display import display, HTML
401
+ # html = scene.GenerateHTML()
402
+ # display(HTML(html))
403
+ # else:
404
+ # # render scene using widgets.DOMWidget
405
+ # scene.Draw()
406
+ # return scene
407
+ # else:
408
+ # if filename:
409
+ # scene.GenerateHTML(filename=filename)
410
+ # return scene
411
+
412
+
413
+ def _get_draw_default_args():
414
+ return dict(
415
+ name="function",
416
+ order=2,
417
+ draw_vol=True,
418
+ draw_surf=True,
419
+ autoscale=True,
420
+ deformation=False,
421
+ interpolate_multidim=False,
422
+ animate=False,
423
+ objects=[],
424
+ nodal_p1=False,
425
+ settings={},
426
+ fullscreen=False,
427
+ scale=1.0,
428
+ width=_default_width,
429
+ height=_default_height,
430
+ )
431
+
432
+
433
+ def Draw(obj, *args, show=True, **kwargs):
434
+ kwargs_with_defaults = _get_draw_default_args()
435
+ kwargs_with_defaults.update(kwargs)
436
+
437
+ scene = WebGLScene(obj, args, kwargs_with_defaults)
438
+ if show and wg is not None and wg._IN_IPYTHON:
439
+ if wg._IN_GOOGLE_COLAB:
440
+ from IPython.display import display, HTML
441
+
442
+ html = scene.GenerateHTML()
443
+ display(HTML(html))
444
+ return
445
+ else:
446
+ import webgui_jupyter_widgets as wjw
447
+ from packaging.version import parse
448
+
449
+ # render scene using widgets.DOMWidget
450
+ if parse(wjw.__version__) < parse("0.2.15"):
451
+ scene.Draw()
452
+ else:
453
+ scene.Draw(
454
+ kwargs_with_defaults["width"], kwargs_with_defaults["height"]
455
+ )
456
+ if "filename" in kwargs_with_defaults:
457
+ scene.GenerateHTML(filename=kwargs_with_defaults["filename"])
458
+ return scene
459
+
460
+ async def _MakeScreenshot(data, png_file, width=1200, height=600):
461
+ """Uses playwright to make a screenshot of the given html file."""
462
+ # pylint: disable=import-outside-toplevel
463
+ from playwright.async_api import async_playwright
464
+ from webgui_jupyter_widgets.html import GenerateHTML, getScreenshotHTML
465
+
466
+ html_file = png_file + ".html"
467
+ GenerateHTML(data, filename=html_file, template=getScreenshotHTML())
468
+
469
+ async with async_playwright() as play:
470
+ browser = await play.chromium.launch()
471
+ page = await browser.new_page(viewport={"width": width, "height": height})
472
+ await page.goto(f"file://{os.path.abspath(html_file)}")
473
+ await page.screenshot(path=png_file)
474
+ await browser.close()
475
+
476
+ def _DrawDocu(obj, *args, **kwargs):
477
+ import json
478
+ import asyncio
479
+
480
+ kwargs_with_defaults = _get_draw_default_args()
481
+ kwargs_with_defaults.update(kwargs)
482
+ scene = WebGLScene(obj, args, kwargs_with_defaults)
483
+
484
+ docu_path = os.environ["NETGEN_DOCUMENTATION_OUT_DIR"]
485
+ src_path = os.environ["NETGEN_DOCUMENTATION_SRC_DIR"]
486
+ cwd_path = os.path.abspath(".")
487
+ rel_path = os.path.relpath(".", src_path)
488
+ path = os.path.join(docu_path, rel_path)
489
+
490
+ if not os.path.exists(path):
491
+ os.makedirs(path)
492
+ counter_file = os.path.join(docu_path, ".counter")
493
+ if os.path.exists(counter_file):
494
+ file_counter = int(open(counter_file, "r").read()) + 1
495
+ else:
496
+ file_counter = 0
497
+
498
+ open(counter_file, "w").write(str(file_counter))
499
+
500
+ data_file = "render_data_{}.json".format(file_counter)
501
+ data_file_abs = os.path.join(path, data_file)
502
+ preview_file = "preview_{}.png".format(file_counter)
503
+ preview_file_abs = os.path.join(path, preview_file)
504
+
505
+ widget = WebGuiDocuWidget()
506
+ widget.value = {"render_data": data_file, "preview": preview_file}
507
+ scene.widget = widget
508
+ data = scene.GetData()
509
+ json.dump(data, open(data_file_abs, "w"))
510
+ asyncio.run(_MakeScreenshot(data, preview_file_abs, 1200, 600))
511
+ scene.Redraw = lambda: None
512
+ from IPython.display import display, HTML
513
+
514
+ display(widget)
515
+ return scene
516
+
517
+
518
+ if "NETGEN_DOCUMENTATION_SRC_DIR" in os.environ:
519
+ # use nest_asyncio to allow reentrant asyncio when executing jupyter notebooks
520
+ import nest_asyncio
521
+ nest_asyncio.apply()
522
+
523
+ # we are buiding the documentation, some things are handled differently:
524
+ # 1) Draw() is generating a .png (using headless chromium via selenium) and a render_data.json
525
+ # to show a preview image and load the render_data only when requested by user
526
+ # 2) return a NGSDocuWebGuiWidget instead of NGSWebGuiWidget implementing the preview/load on demand of webgui
527
+
528
+ _Draw = Draw
529
+ Draw = _DrawDocu
@@ -0,0 +1,16 @@
1
+ algebraic3d
2
+
3
+ solid p1 = plane (0.5, 0, 0; 1, 0, 0);
4
+
5
+ # since surfaces of both bricks are identic they get the same bc id:
6
+ solid brick1 = orthobrick (0,0,0; 1,1,1) and p1 -bc=1;
7
+ solid brick2 = orthobrick (0,0,-1; 1,1,0) and p1 -bc=2;
8
+
9
+
10
+ tlo brick1;
11
+ tlo brick2;
12
+
13
+ # override bc number:
14
+ # all faces of solid p1 belonging to the boundary of tlo brick1 get bc=3
15
+
16
+ boundarycondition p1 brick1 3;
@@ -0,0 +1,32 @@
1
+ #
2
+ ## Two cylinders on a box
3
+ #
4
+ algebraic3d
5
+
6
+ #define box:
7
+
8
+ solid box = plane (0, 0, 0.5; -1, 0, 0)
9
+ and plane (0, 0, 0.5; 0, -1, 0)
10
+ and plane (0, 0, 0.5; 0, 0, -1)
11
+ and plane (2, 1.5, 1; 1, 0, 0)
12
+ and plane (2, 1.5, 1; 0, 1, 0)
13
+ and plane (2, 1.5, 1; 0, 0, 1);
14
+
15
+ #define cylinders:
16
+
17
+ solid cyls = (cylinder (0.5, 0.75, 0; 0.5, 0.75, 2; 0.3)
18
+ or cylinder (1.5, 0.75, 0; 1.5, 0.75, 2; 0.3) )
19
+ and plane (0, 0, 0.7; 0, 0, -1)
20
+ and plane (0, 0, 1.5; 0, 0, 1);
21
+
22
+ #combine both:
23
+
24
+ solid main = box or cyls;
25
+
26
+
27
+ #define sub-domains:
28
+ tlo main;
29
+
30
+ singular edge box cyls;
31
+
32
+
@@ -0,0 +1,27 @@
1
+ #
2
+ ## A cube
3
+ #
4
+ algebraic3d
5
+
6
+ # cube consisting of 6 planes:
7
+
8
+ solid cube = plane (0, 0, 0; 0, 0, -1)
9
+ and plane (0, 0, 0; 0, -1, 0)
10
+ and plane (0, 0, 0; -1, 0, 0)
11
+ and plane (1, 1, 1; 0, 0, 1)
12
+ and plane (1, 1, 1; 0, 1, 0)
13
+ and plane (1, 1, 1; 1, 0, 0);
14
+
15
+
16
+ solid top = plane (1,1,1; 0, 0, 1);
17
+ solid cyl = top
18
+ and plane (0,0,0; 0, 0, -1)
19
+ and cylinder (0.5, 0.5, 0; 0.5, 0.5, 1; 0.2);
20
+
21
+
22
+ tlo cube;
23
+
24
+ # take just surface 'top' of solid 'cyl'
25
+ tlo cyl top -col=[1,0,0];
26
+
27
+
@@ -0,0 +1,13 @@
1
+ #
2
+ ## A cone
3
+ #
4
+ algebraic3d
5
+
6
+ # Cone given by bottom circle and top circle
7
+ # and cut by planes:
8
+
9
+ solid cutcone = cone ( 0, 0, 0; 1; 3, 0, 0; 0.1 )
10
+ and plane (0, 0, 0; -1, 0, 0)
11
+ and plane (3, 0, 0; 1, 0, 0);
12
+
13
+ tlo cutcone;
@@ -0,0 +1,16 @@
1
+ #
2
+ ## A cube
3
+ #
4
+ algebraic3d
5
+
6
+ # cube consisting of 6 planes:
7
+
8
+ solid cube = plane (0, 0, 0; 0, 0, -1)
9
+ and plane (0, 0, 0; 0, -1, 0)
10
+ and plane (0, 0, 0; -1, 0, 0)
11
+ and plane (1, 1, 1; 0, 0, 1)
12
+ and plane (1, 1, 1; 0, 1, 0)
13
+ and plane (1, 1, 1; 1, 0, 0);
14
+
15
+ tlo cube;
16
+
@@ -0,0 +1,55 @@
1
+ algebraic3d
2
+
3
+ curve2d testcurve=(8;
4
+ -0.5,1;
5
+ -0.55,1.5;
6
+ # -0.275,1.775;
7
+ -0.5,2;
8
+ 0,2.05;
9
+ 0.5,2;
10
+ 0.55,1.5;
11
+ 0.5,1;
12
+ 0,0.95;
13
+ 4;
14
+ 3,8,1,2;
15
+ 3,2,3,4;
16
+ 3,4,5,6;
17
+ 3,6,7,8);
18
+
19
+ #curve2d testcurve=(8;
20
+ # -0.5,1;
21
+ # -0.55,1.5;
22
+ # -0.5,2;
23
+ # 0,2.05;
24
+ # 0.5,2;
25
+ # 0.55,1.5;
26
+ # 0.5,1;
27
+ # 0,0.95;
28
+ # 4;
29
+ # 3,8,1,2;
30
+ # 3,2,3,4;
31
+ # 3,4,5,6;
32
+ # 3,6,7,8);
33
+
34
+ curve2d testcurve1=(4;
35
+ -0.55,1.5;
36
+ 0,2.05;
37
+ 0.55,1.5;
38
+ 0,0.95;
39
+ 4;
40
+ 2,1,2;
41
+ 2,2,3;
42
+ 2,3,4;
43
+ 2,4,1);
44
+
45
+
46
+ solid mytorus = revolution(0,0,0.5;1,0,0.5;testcurve);
47
+ #solid mytorus = revolution(0,0,0.5;1,0,0.5;testcurve1);
48
+
49
+ solid bbb = orthobrick(-4,-4,-4;4,4,0.1);
50
+
51
+ solid brickandring = mytorus or bbb;
52
+
53
+
54
+ tlo brickandring;
55
+