File indexing completed on 2026-04-09 07:48:53
0001
0002 """
0003 CSGSignedDistanceFieldTest.py
0004 ===============================
0005
0006 see env/graphics/pyvista_/sdContour.py
0007
0008 """
0009 import os
0010 import pyvista as pv
0011 import numpy as np
0012 from opticks.ana.fold import Fold
0013 from opticks.ana.gridspec import CrossHairs
0014 from opticks.ana.npmeta import NPMeta
0015
0016 SIZE = np.array([1280, 720])
0017
0018 class CSGSignedDistanceFieldTest(object):
0019 BASE = "$TMP/CSG/CSGSignedDistanceFieldTest" ;
0020 def __init__(self, geom):
0021 fold = Fold.Load( self.BASE, geom )
0022 self.geom = geom
0023 self.fold = fold
0024 self.sdf = fold.sdf
0025 self.xyzd = fold.xyzd
0026
0027
0028
0029 if __name__ == '__main__':
0030 geom = os.environ.get("GEOM", "UnionBoxSphere")
0031 t = CSGSignedDistanceFieldTest(geom)
0032
0033 sdf = t.sdf
0034 xyzd = t.xyzd
0035
0036
0037 sdf_meta = t.fold.sdf_meta
0038 pm = NPMeta(t.fold.sdf_meta)
0039
0040 ox = float(pm.find("ox:"))
0041 oy = float(pm.find("oy:"))
0042 oz = float(pm.find("oz:"))
0043
0044 sx = float(pm.find("sx:"))
0045 sy = float(pm.find("sy:"))
0046 sz = float(pm.find("sz:"))
0047
0048 assert len(sdf.shape) == 3, "unexpected sdf.shape %s " % str(sdf.shape)
0049 ni, nj, nk = sdf.shape
0050
0051
0052 dims=(ni, nj, nk)
0053 spacing=(sx,sy,sz)
0054 origin=(ox,oy,oz)
0055
0056 grid = pv.UniformGrid(dims, spacing, origin)
0057 print(grid)
0058
0059
0060
0061 values = sdf.ravel()
0062 values_2 = xyzd.reshape(-1,4)[:,3]
0063 assert np.all( values == values_2 )
0064
0065 grid.point_arrays["values"] = values
0066
0067 method = ['marching_cubes','contour','flying_edges'][1]
0068 isovalue = 0
0069 num_isosurfaces = 1
0070 mesh = grid.contour(num_isosurfaces, scalars="values", rng=[isovalue, isovalue], method=method )
0071
0072 show_edges = "EDGES" in os.environ
0073 pl = pv.Plotter(window_size=SIZE*2)
0074 pl.add_mesh(mesh, smooth_shading=False, color='tan', show_edges=show_edges )
0075 pl.show_grid()
0076
0077 CrossHairs.draw(pl)
0078
0079 pl.show()
0080
0081
0082
0083
0084