File indexing completed on 2026-04-09 07:48:53
0001
0002
0003 import os, logging, numpy as np
0004 np.set_printoptions(edgeitems=16)
0005
0006 from opticks.ana.key import keydir
0007 from opticks.ana.gridspec import CrossHairs
0008 from opticks.CSG.CSGFoundry import CSGFoundry
0009
0010 log = logging.getLogger(__name__)
0011
0012 SIZE = np.array([1280, 720])
0013
0014 try:
0015 import pyvista as pv
0016 except ImportError:
0017 pv = None
0018 pass
0019
0020 COLORS = "red green blue cyan magenta yellow pink violet".split()
0021
0022
0023
0024 def boxplot(pl, ridx_prims):
0025 """
0026 ::
0027
0028 pr[2,0] pr[2,1] pr[2,2]
0029 pr[2,3] pr[3,0] pr[3,1]
0030
0031 """
0032 for i in range(len(ridx_prims)):
0033 pr = ridx_prims[i]
0034 bb = (pr[2,0], pr[2,3], pr[2,1], pr[3,0], pr[2,2], pr[3,1] )
0035 bx = pv.Box(bounds=bb)
0036 pl.add_mesh(bx, style='wireframe', color=COLORS[i%len(COLORS)], line_width=5)
0037 pass
0038
0039
0040 def make_boxplot(prims, crosshairs=0):
0041 pl = pv.Plotter(window_size=SIZE*2 )
0042
0043 boxplot(pl, prims)
0044
0045 if crosshairs > 0.:
0046 CrossHairs.draw(pl, 6000)
0047 pass
0048
0049 pl.show_grid()
0050 return pl
0051
0052
0053
0054 if __name__ == '__main__':
0055 logging.basicConfig(level=logging.INFO)
0056
0057 arg = os.environ.get("OPTICKS_GEOCACHE_HOOKUP_ARG", None)
0058 kd = keydir(os.environ["OPTICKS_KEY"])
0059 cfdir = os.path.join(kd, "CSG_GGeo/CSGFoundry")
0060
0061 log.info("arg : %s " % arg )
0062 log.info("kd : %s " % kd )
0063 log.info("cfdir : %s " % cfdir)
0064
0065 cf = CSGFoundry(cfdir) if os.path.isdir(cfdir) else None
0066 if not cf is None:
0067 print(cf)
0068 pass
0069
0070 solid_numPrim = cf.solid[:,1,0]
0071 solid_primOffset = cf.solid[:,1,1]
0072 solid_type = cf.solid[:,1,2] ; assert np.all(solid_type == 0 )
0073
0074
0075
0076 prim_bounds = np.zeros( (len(cf.prim), 6), dtype=np.float32 )
0077 prim_bounds[:,0] = cf.prim[:,2,0]
0078 prim_bounds[:,1] = cf.prim[:,2,3]
0079 prim_bounds[:,2] = cf.prim[:,2,1]
0080 prim_bounds[:,3] = cf.prim[:,3,0]
0081 prim_bounds[:,4] = cf.prim[:,2,2]
0082 prim_bounds[:,5] = cf.prim[:,3,1]
0083
0084 node_tran = cf.node.view(np.int32)[:,3,3] & 0x7fffffff
0085
0086 prim_numNode_ = lambda a:a.view(np.int32)[:,0,0]
0087 prim_nodeOffset_ = lambda a:a.view(np.int32)[:,0,1]
0088 prim_tranOffset_ = lambda a:a.view(np.int32)[:,0,2]
0089 prim_planOffset_ = lambda a:a.view(np.int32)[:,0,3]
0090
0091 prim_sbtIndexOffset_ = lambda a:a.view(np.int32)[:,1,0]
0092 prim_meshIdx_ = lambda a:a.view(np.int32)[:,1,1]
0093 prim_repeatIdx_ = lambda a:a.view(np.int32)[:,1,2]
0094 prim_primIdx_ = lambda a:a.view(np.int32)[:,1,3]
0095
0096
0097
0098 ridx_prims_ = lambda ridx:cf.prim[solid_primOffset[ridx]:solid_primOffset[ridx]+solid_numPrim[ridx]]
0099
0100
0101 midx_prims_ = lambda midx:cf.prim[prim_meshIdx_(cf.prim) == midx]
0102
0103 midx_prims_bbox_ = lambda midx:midx_prims_(midx)[:,2:].reshape(-1,8)
0104
0105
0106
0107 toff_prims_ = lambda toff:cf.prim[prim_tranOffset_(cf.prim) == toff]
0108
0109
0110 prim_numNode = prim_numNode_(cf.prim)
0111 prim_nodeOffset = prim_nodeOffset_(cf.prim)
0112 prim_tranOffset = prim_tranOffset_(cf.prim)
0113 prim_planOffset = prim_planOffset_(cf.prim) ; assert np.all( prim_planOffset == 0 ), "no planOffset"
0114
0115 prim_sbtIndexOffset = prim_sbtIndexOffset_(cf.prim)
0116 prim_meshIdx = prim_meshIdx_(cf.prim)
0117 prim_repeatIdx = prim_repeatIdx_(cf.prim)
0118 prim_primIdx = prim_primIdx_(cf.prim)
0119
0120 prim_meshIdx_to_numNode = dict(zip(prim_meshIdx,prim_numNode))
0121
0122
0123 mname_skip = "Flange"
0124 all_ridxs = list(range(0,len(cf.solid)))
0125 ridxs = all_ridxs if not "RIDX" in os.environ else list(map(int, os.environ["RIDX"].split(",")))
0126
0127 print("\n\n all_ridxs: %s ridxs:%s nmame_skip:%s geocache_hookup_arg:%s " % (str(all_ridxs), str(ridxs), mname_skip, arg ))
0128 skip = 0
0129 for ridx in ridxs:
0130 ridx_prims = ridx_prims_(ridx)
0131
0132 print("\n ridx : %2d ridx_prims.shape %s " % (ridx, str(ridx_prims.shape)))
0133
0134 midx = prim_meshIdx_(ridx_prims)
0135 numn = prim_numNode_(ridx_prims)
0136
0137 u_mx, c_mx = np.unique(midx, return_counts=True)
0138 print(" %4s %4s %4s : %60s : %s " % ("u_mx","c_mx", "nnd", " unique midx prim counts and meshname ", "prs.shape" ))
0139 for i in range(len(u_mx)):
0140 sel = prim_meshIdx_(cf.prim) == u_mx[i]
0141 prs = cf.prim[sel]
0142 mname = cf.meshname[u_mx[i]]
0143 mx = u_mx[i]
0144 cn = c_mx[i]
0145 nnd = prim_meshIdx_to_numNode[mx]
0146
0147 bb = midx_prims_bbox_(mx)
0148
0149 if mname.find(mname_skip) > -1:
0150 skip += 1
0151 continue
0152 pass
0153 print(" %4d %4d %4d : %60s : %20s : %s " % (mx, cn, nnd, mname, str(prs.shape), str(bb[0]) ))
0154 pass
0155 pass
0156 print(" skip:%d nmame_skip:%s " % (skip, mname_skip))
0157
0158
0159
0160
0161
0162
0163
0164
0165
0166