Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-04-09 07:48:53

0001 #!/usr/bin/env python
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     # prims that form a solid  (aka layers) picked by the ridx of the compound "solid" 
0098     ridx_prims_ = lambda ridx:cf.prim[solid_primOffset[ridx]:solid_primOffset[ridx]+solid_numPrim[ridx]]     
0099 
0100     # prims picked by meshindex (aka lvIdx)
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     # prims picked by tranOffset 
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]   # mesh index
0144             cn = c_mx[i]   # number of prims with the mesh index
0145             nnd = prim_meshIdx_to_numNode[mx]   ## number of nodes of the prim 
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     #pl = make_boxplot( ridx_prims_(9) )
0160     #pl.show()    
0161 
0162     # meshnames of prim with tranOffset zero  
0163     #cf.meshname[prim_meshIdx_(toff_prims_(0))]   
0164 
0165 
0166