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.
- netgen/NgOCC.py +7 -0
- netgen/__init__.py +114 -0
- netgen/__init__.pyi +22 -0
- netgen/__main__.py +53 -0
- netgen/cmake/NetgenConfig.cmake +79 -0
- netgen/cmake/netgen-targets-release.cmake +69 -0
- netgen/cmake/netgen-targets.cmake +146 -0
- netgen/config/__init__.py +1 -0
- netgen/config/__init__.pyi +52 -0
- netgen/config/__main__.py +4 -0
- netgen/config/config.py +68 -0
- netgen/config/config.pyi +54 -0
- netgen/csg.py +25 -0
- netgen/geom2d.py +178 -0
- netgen/gui.py +82 -0
- netgen/include/core/archive.hpp +1256 -0
- netgen/include/core/array.hpp +1760 -0
- netgen/include/core/autodiff.hpp +1131 -0
- netgen/include/core/autodiffdiff.hpp +733 -0
- netgen/include/core/bitarray.hpp +240 -0
- netgen/include/core/concurrentqueue.h +3619 -0
- netgen/include/core/exception.hpp +145 -0
- netgen/include/core/flags.hpp +199 -0
- netgen/include/core/hashtable.hpp +1281 -0
- netgen/include/core/localheap.hpp +318 -0
- netgen/include/core/logging.hpp +117 -0
- netgen/include/core/memtracer.hpp +221 -0
- netgen/include/core/mpi4py_pycapi.h +245 -0
- netgen/include/core/mpi_wrapper.hpp +643 -0
- netgen/include/core/ng_mpi.hpp +94 -0
- netgen/include/core/ng_mpi_generated_declarations.hpp +155 -0
- netgen/include/core/ng_mpi_native.hpp +25 -0
- netgen/include/core/ngcore.hpp +32 -0
- netgen/include/core/ngcore_api.hpp +152 -0
- netgen/include/core/ngstream.hpp +115 -0
- netgen/include/core/paje_trace.hpp +279 -0
- netgen/include/core/profiler.hpp +382 -0
- netgen/include/core/python_ngcore.hpp +457 -0
- netgen/include/core/ranges.hpp +109 -0
- netgen/include/core/register_archive.hpp +100 -0
- netgen/include/core/signal.hpp +82 -0
- netgen/include/core/simd.hpp +160 -0
- netgen/include/core/simd_arm64.hpp +407 -0
- netgen/include/core/simd_avx.hpp +394 -0
- netgen/include/core/simd_avx512.hpp +285 -0
- netgen/include/core/simd_generic.hpp +1053 -0
- netgen/include/core/simd_math.hpp +178 -0
- netgen/include/core/simd_sse.hpp +289 -0
- netgen/include/core/statushandler.hpp +37 -0
- netgen/include/core/symboltable.hpp +153 -0
- netgen/include/core/table.hpp +810 -0
- netgen/include/core/taskmanager.hpp +1161 -0
- netgen/include/core/type_traits.hpp +65 -0
- netgen/include/core/utils.hpp +385 -0
- netgen/include/core/version.hpp +102 -0
- netgen/include/core/xbool.hpp +47 -0
- netgen/include/csg/algprim.hpp +563 -0
- netgen/include/csg/brick.hpp +150 -0
- netgen/include/csg/csg.hpp +43 -0
- netgen/include/csg/csgeom.hpp +389 -0
- netgen/include/csg/csgparser.hpp +101 -0
- netgen/include/csg/curve2d.hpp +67 -0
- netgen/include/csg/edgeflw.hpp +112 -0
- netgen/include/csg/explicitcurve2d.hpp +113 -0
- netgen/include/csg/extrusion.hpp +185 -0
- netgen/include/csg/gencyl.hpp +70 -0
- netgen/include/csg/geoml.hpp +16 -0
- netgen/include/csg/identify.hpp +213 -0
- netgen/include/csg/manifold.hpp +29 -0
- netgen/include/csg/meshsurf.hpp +46 -0
- netgen/include/csg/polyhedra.hpp +121 -0
- netgen/include/csg/revolution.hpp +180 -0
- netgen/include/csg/singularref.hpp +84 -0
- netgen/include/csg/solid.hpp +295 -0
- netgen/include/csg/specpoin.hpp +194 -0
- netgen/include/csg/spline3d.hpp +99 -0
- netgen/include/csg/splinesurface.hpp +85 -0
- netgen/include/csg/surface.hpp +394 -0
- netgen/include/csg/triapprox.hpp +63 -0
- netgen/include/csg/vscsg.hpp +34 -0
- netgen/include/general/autodiff.hpp +356 -0
- netgen/include/general/autoptr.hpp +39 -0
- netgen/include/general/gzstream.h +121 -0
- netgen/include/general/hashtabl.hpp +1692 -0
- netgen/include/general/myadt.hpp +48 -0
- netgen/include/general/mystring.hpp +226 -0
- netgen/include/general/netgenout.hpp +205 -0
- netgen/include/general/ngarray.hpp +797 -0
- netgen/include/general/ngbitarray.hpp +149 -0
- netgen/include/general/ngpython.hpp +74 -0
- netgen/include/general/optmem.hpp +44 -0
- netgen/include/general/parthreads.hpp +138 -0
- netgen/include/general/seti.hpp +50 -0
- netgen/include/general/sort.hpp +47 -0
- netgen/include/general/spbita2d.hpp +59 -0
- netgen/include/general/stack.hpp +114 -0
- netgen/include/general/table.hpp +280 -0
- netgen/include/general/template.hpp +509 -0
- netgen/include/geom2d/csg2d.hpp +750 -0
- netgen/include/geom2d/geometry2d.hpp +280 -0
- netgen/include/geom2d/spline2d.hpp +234 -0
- netgen/include/geom2d/vsgeom2d.hpp +28 -0
- netgen/include/gprim/adtree.hpp +1392 -0
- netgen/include/gprim/geom2d.hpp +858 -0
- netgen/include/gprim/geom3d.hpp +749 -0
- netgen/include/gprim/geomfuncs.hpp +212 -0
- netgen/include/gprim/geomobjects.hpp +544 -0
- netgen/include/gprim/geomops.hpp +404 -0
- netgen/include/gprim/geomtest3d.hpp +101 -0
- netgen/include/gprim/gprim.hpp +33 -0
- netgen/include/gprim/spline.hpp +778 -0
- netgen/include/gprim/splinegeometry.hpp +73 -0
- netgen/include/gprim/transform3d.hpp +216 -0
- netgen/include/include/acisgeom.hpp +3 -0
- netgen/include/include/csg.hpp +1 -0
- netgen/include/include/geometry2d.hpp +1 -0
- netgen/include/include/gprim.hpp +1 -0
- netgen/include/include/incopengl.hpp +62 -0
- netgen/include/include/inctcl.hpp +13 -0
- netgen/include/include/incvis.hpp +6 -0
- netgen/include/include/linalg.hpp +1 -0
- netgen/include/include/meshing.hpp +1 -0
- netgen/include/include/myadt.hpp +1 -0
- netgen/include/include/mydefs.hpp +70 -0
- netgen/include/include/mystdlib.h +59 -0
- netgen/include/include/netgen_config.hpp +27 -0
- netgen/include/include/netgen_version.hpp +9 -0
- netgen/include/include/nginterface_v2_impl.hpp +395 -0
- netgen/include/include/ngsimd.hpp +1 -0
- netgen/include/include/occgeom.hpp +1 -0
- netgen/include/include/opti.hpp +1 -0
- netgen/include/include/parallel.hpp +1 -0
- netgen/include/include/stlgeom.hpp +1 -0
- netgen/include/include/visual.hpp +1 -0
- netgen/include/interface/rw_medit.hpp +11 -0
- netgen/include/interface/writeuser.hpp +80 -0
- netgen/include/linalg/densemat.hpp +414 -0
- netgen/include/linalg/linalg.hpp +29 -0
- netgen/include/linalg/opti.hpp +142 -0
- netgen/include/linalg/polynomial.hpp +47 -0
- netgen/include/linalg/vector.hpp +217 -0
- netgen/include/meshing/adfront2.hpp +274 -0
- netgen/include/meshing/adfront3.hpp +332 -0
- netgen/include/meshing/basegeom.hpp +370 -0
- netgen/include/meshing/bcfunctions.hpp +53 -0
- netgen/include/meshing/bisect.hpp +72 -0
- netgen/include/meshing/boundarylayer.hpp +113 -0
- netgen/include/meshing/classifyhpel.hpp +1984 -0
- netgen/include/meshing/clusters.hpp +46 -0
- netgen/include/meshing/curvedelems.hpp +274 -0
- netgen/include/meshing/delaunay2d.hpp +73 -0
- netgen/include/meshing/fieldlines.hpp +103 -0
- netgen/include/meshing/findip.hpp +198 -0
- netgen/include/meshing/findip2.hpp +103 -0
- netgen/include/meshing/geomsearch.hpp +69 -0
- netgen/include/meshing/global.hpp +54 -0
- netgen/include/meshing/hpref_hex.hpp +330 -0
- netgen/include/meshing/hpref_prism.hpp +3405 -0
- netgen/include/meshing/hpref_pyramid.hpp +154 -0
- netgen/include/meshing/hpref_quad.hpp +2082 -0
- netgen/include/meshing/hpref_segm.hpp +122 -0
- netgen/include/meshing/hpref_tet.hpp +4230 -0
- netgen/include/meshing/hpref_trig.hpp +848 -0
- netgen/include/meshing/hprefinement.hpp +366 -0
- netgen/include/meshing/improve2.hpp +178 -0
- netgen/include/meshing/improve3.hpp +151 -0
- netgen/include/meshing/localh.hpp +223 -0
- netgen/include/meshing/meshclass.hpp +1076 -0
- netgen/include/meshing/meshfunc.hpp +47 -0
- netgen/include/meshing/meshing.hpp +63 -0
- netgen/include/meshing/meshing2.hpp +163 -0
- netgen/include/meshing/meshing3.hpp +123 -0
- netgen/include/meshing/meshtool.hpp +90 -0
- netgen/include/meshing/meshtype.hpp +1930 -0
- netgen/include/meshing/msghandler.hpp +62 -0
- netgen/include/meshing/paralleltop.hpp +172 -0
- netgen/include/meshing/python_mesh.hpp +206 -0
- netgen/include/meshing/ruler2.hpp +172 -0
- netgen/include/meshing/ruler3.hpp +211 -0
- netgen/include/meshing/soldata.hpp +141 -0
- netgen/include/meshing/specials.hpp +17 -0
- netgen/include/meshing/surfacegeom.hpp +73 -0
- netgen/include/meshing/topology.hpp +1003 -0
- netgen/include/meshing/validate.hpp +21 -0
- netgen/include/meshing/visual_interface.hpp +71 -0
- netgen/include/mydefs.hpp +70 -0
- netgen/include/nginterface.h +474 -0
- netgen/include/nginterface_v2.hpp +406 -0
- netgen/include/nglib.h +697 -0
- netgen/include/nglib_occ.h +50 -0
- netgen/include/occ/occ_edge.hpp +47 -0
- netgen/include/occ/occ_face.hpp +52 -0
- netgen/include/occ/occ_solid.hpp +23 -0
- netgen/include/occ/occ_utils.hpp +376 -0
- netgen/include/occ/occ_vertex.hpp +30 -0
- netgen/include/occ/occgeom.hpp +659 -0
- netgen/include/occ/occmeshsurf.hpp +168 -0
- netgen/include/occ/vsocc.hpp +33 -0
- netgen/include/pybind11/LICENSE +29 -0
- netgen/include/pybind11/attr.h +722 -0
- netgen/include/pybind11/buffer_info.h +208 -0
- netgen/include/pybind11/cast.h +2361 -0
- netgen/include/pybind11/chrono.h +228 -0
- netgen/include/pybind11/common.h +2 -0
- netgen/include/pybind11/complex.h +74 -0
- netgen/include/pybind11/conduit/README.txt +15 -0
- netgen/include/pybind11/conduit/pybind11_conduit_v1.h +116 -0
- netgen/include/pybind11/conduit/pybind11_platform_abi_id.h +87 -0
- netgen/include/pybind11/conduit/wrap_include_python_h.h +72 -0
- netgen/include/pybind11/critical_section.h +56 -0
- netgen/include/pybind11/detail/class.h +823 -0
- netgen/include/pybind11/detail/common.h +1348 -0
- netgen/include/pybind11/detail/cpp_conduit.h +75 -0
- netgen/include/pybind11/detail/descr.h +226 -0
- netgen/include/pybind11/detail/dynamic_raw_ptr_cast_if_possible.h +39 -0
- netgen/include/pybind11/detail/exception_translation.h +71 -0
- netgen/include/pybind11/detail/function_record_pyobject.h +191 -0
- netgen/include/pybind11/detail/init.h +538 -0
- netgen/include/pybind11/detail/internals.h +799 -0
- netgen/include/pybind11/detail/native_enum_data.h +209 -0
- netgen/include/pybind11/detail/pybind11_namespace_macros.h +82 -0
- netgen/include/pybind11/detail/struct_smart_holder.h +378 -0
- netgen/include/pybind11/detail/type_caster_base.h +1591 -0
- netgen/include/pybind11/detail/typeid.h +65 -0
- netgen/include/pybind11/detail/using_smart_holder.h +22 -0
- netgen/include/pybind11/detail/value_and_holder.h +90 -0
- netgen/include/pybind11/eigen/common.h +9 -0
- netgen/include/pybind11/eigen/matrix.h +723 -0
- netgen/include/pybind11/eigen/tensor.h +521 -0
- netgen/include/pybind11/eigen.h +12 -0
- netgen/include/pybind11/embed.h +320 -0
- netgen/include/pybind11/eval.h +161 -0
- netgen/include/pybind11/functional.h +147 -0
- netgen/include/pybind11/gil.h +199 -0
- netgen/include/pybind11/gil_safe_call_once.h +102 -0
- netgen/include/pybind11/gil_simple.h +37 -0
- netgen/include/pybind11/iostream.h +265 -0
- netgen/include/pybind11/native_enum.h +67 -0
- netgen/include/pybind11/numpy.h +2312 -0
- netgen/include/pybind11/operators.h +202 -0
- netgen/include/pybind11/options.h +92 -0
- netgen/include/pybind11/pybind11.h +3645 -0
- netgen/include/pybind11/pytypes.h +2680 -0
- netgen/include/pybind11/stl/filesystem.h +114 -0
- netgen/include/pybind11/stl.h +666 -0
- netgen/include/pybind11/stl_bind.h +858 -0
- netgen/include/pybind11/subinterpreter.h +299 -0
- netgen/include/pybind11/trampoline_self_life_support.h +65 -0
- netgen/include/pybind11/type_caster_pyobject_ptr.h +61 -0
- netgen/include/pybind11/typing.h +298 -0
- netgen/include/pybind11/warnings.h +75 -0
- netgen/include/stlgeom/meshstlsurface.hpp +67 -0
- netgen/include/stlgeom/stlgeom.hpp +491 -0
- netgen/include/stlgeom/stlline.hpp +193 -0
- netgen/include/stlgeom/stltool.hpp +331 -0
- netgen/include/stlgeom/stltopology.hpp +419 -0
- netgen/include/stlgeom/vsstl.hpp +58 -0
- netgen/include/visualization/meshdoc.hpp +42 -0
- netgen/include/visualization/mvdraw.hpp +325 -0
- netgen/include/visualization/vispar.hpp +128 -0
- netgen/include/visualization/visual.hpp +28 -0
- netgen/include/visualization/visual_api.hpp +10 -0
- netgen/include/visualization/vssolution.hpp +399 -0
- netgen/lib/libnggui.lib +0 -0
- netgen/lib/ngcore.lib +0 -0
- netgen/lib/nglib.lib +0 -0
- netgen/lib/togl.lib +0 -0
- netgen/libnggui.dll +0 -0
- netgen/libngguipy.lib +0 -0
- netgen/libngguipy.pyd +0 -0
- netgen/libngpy/_NgOCC.pyi +1545 -0
- netgen/libngpy/__init__.pyi +7 -0
- netgen/libngpy/_csg.pyi +259 -0
- netgen/libngpy/_geom2d.pyi +323 -0
- netgen/libngpy/_meshing.pyi +1111 -0
- netgen/libngpy/_stl.pyi +131 -0
- netgen/libngpy.lib +0 -0
- netgen/libngpy.pyd +0 -0
- netgen/meshing.py +65 -0
- netgen/ngcore.dll +0 -0
- netgen/nglib.dll +0 -0
- netgen/occ.py +52 -0
- netgen/read_gmsh.py +259 -0
- netgen/read_meshio.py +22 -0
- netgen/stl.py +2 -0
- netgen/togl.dll +0 -0
- netgen/version.py +2 -0
- netgen/webgui.py +529 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/boundarycondition.geo +16 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/boxcyl.geo +32 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/circle_on_cube.geo +27 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cone.geo +13 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cube.geo +16 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubeandring.geo +55 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubeandspheres.geo +21 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubemcyl.geo +18 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubemsphere.geo +19 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cylinder.geo +12 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cylsphere.geo +12 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/doc/ng4.pdf +0 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/ellipsoid.geo +8 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/ellipticcyl.geo +10 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/extrusion.geo +99 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/fichera.geo +24 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/frame.step +11683 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/hinge.stl +8486 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/lshape3d.geo +26 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/manyholes.geo +26 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/manyholes2.geo +26 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/matrix.geo +27 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/ortho.geo +11 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/part1.stl +2662 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/period.geo +33 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/py_tutorials/exportNeutral.py +26 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/py_tutorials/mesh.py +19 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/py_tutorials/shaft.geo +65 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/revolution.geo +18 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/screw.step +1694 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/sculpture.geo +13 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/shaft.geo +65 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/shell.geo +10 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/sphere.geo +8 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/sphereincube.geo +17 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/square.in2d +35 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/squarecircle.in2d +48 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/squarehole.in2d +47 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/torus.geo +8 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/trafo.geo +57 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/twobricks.geo +15 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/twocubes.geo +18 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/twocyl.geo +16 -0
- netgen_mesher-6.2.2506.post35.dev0.dist-info/METADATA +15 -0
- netgen_mesher-6.2.2506.post35.dev0.dist-info/RECORD +340 -0
- netgen_mesher-6.2.2506.post35.dev0.dist-info/WHEEL +5 -0
- netgen_mesher-6.2.2506.post35.dev0.dist-info/entry_points.txt +2 -0
- netgen_mesher-6.2.2506.post35.dev0.dist-info/licenses/AUTHORS +1 -0
- netgen_mesher-6.2.2506.post35.dev0.dist-info/licenses/LICENSE +504 -0
- netgen_mesher-6.2.2506.post35.dev0.dist-info/top_level.txt +2 -0
- pyngcore/__init__.py +1 -0
- 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,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
|
+
|