op --dlv65 --gltf 3
8 segments in an ring with box cuts making the gaps
377.713 SstBotCirRibBase0xc26e2d0 lvidx 65 nsp 204 intersection difference cylinder slab box3 nds[ 16] 4440 4441 4442 4443 4444 4445 4446 4447 6100 6101 ...
377.713 SstBotCirRibBase0xc26e2d0 lvidx 65 nsp 204
amn ( 1400.071 390.181 -215.000)
bmn ( 1407.720 12.467 -215.000)
dmn ( -7.649 377.713 0.000)
amx ( 1961.571 1414.214 215.000)
bmx ( 1998.360 1404.240 215.000)
dmx ( -36.789 9.974 0.000)
Possibibly a coincidence between box
\
\
\
|
+ | -> X
080 # generated by tboolean.py : 20170708-1036
81 # opticks-;opticks-tbool 65
82 # opticks-;opticks-tbool-vi 65
83
84
85 a = CSG("cylinder", param = [0.000,0.000,0.000,2000.000],param1 = [-215.000,215.000,0.000,0.000])
86 b = CSG("cylinder", param = [0.000,0.000,0.000,1980.000],param1 = [-217.150,217.150,0.000,0.000])
87 ab = CSG("difference", left=a, right=b)
88
89 c = CSG("slab", param = [0.000,1.000,0.000,0.000],param1 = [0.000,2001.000,0.000,0.000])
90 abc = CSG("intersection", left=ab, right=c)
91
92 d = CSG("slab", param = [0.707,-0.707,0.000,0.000],param1 = [0.000,2001.000,0.000,0.000])
93 abcd = CSG("intersection", left=abc, right=d)
94
95 e = CSG("box3", param = [2020.000,25.000,440.000,0.000],param1 = [0.000,0.000,0.000,0.000])
96 e.transform = [[1.000,0.000,0.000,0.000],[0.000,1.000,0.000,0.000],[0.000,0.000,1.000,0.000],[1255.000,0.000,0.000,1.000]]
97 abcde = CSG("union", left=abcd, right=e)
/// x
In [1]: (-1010+1255,1010+1255)
Out[1]: (245, 2265)
/// y
98
99 f = CSG("box3", param = [2020.000,25.000,440.000,0.000],param1 = [0.000,0.000,0.000,0.000])
100 f.transform = [[0.707,-0.707,0.000,0.000],[0.707,0.707,0.000,0.000],[0.000,0.000,1.000,0.000],[887.419,887.419,0.000,1.000]]
101 abcdef = CSG("union", left=abcde, right=f)
102
103
### difference changed to union
104
105 raw = abcdef
106
107 raw.dump("raw")
108
109 maxcsgheight = 4
110 maxcsgheight2 = 5
111 obj = Sc.optimize_csg(raw, maxcsgheight, maxcsgheight2 )
112
113 obj.dump("optimized")
114
115 uobj = raw
116
1020 <tube aunit="deg" deltaphi="45" lunit="mm" name="SstBotCirRibPri0xc26d4e0" rmax="2000" rmin="1980" startphi="0" z="430"/>
1021 <box lunit="mm" name="SstBotRibBase00xc0d1e90" x="2020" y="25" z="440"/>
1022 <subtraction name="SstBotCirRibPri-ChildForSstBotCirRibBase0xc26e0a0">
1023 <first ref="SstBotCirRibPri0xc26d4e0"/>
1024 <second ref="SstBotRibBase00xc0d1e90"/>
1025 <position name="SstBotCirRibPri-ChildForSstBotCirRibBase0xc26e0a0_pos" unit="mm" x="1255" y="0" z="0"/>
1026 </subtraction>
1027 <box lunit="mm" name="SstBotRibBase10xbfa4950" x="2020" y="25" z="440"/>
1028 <subtraction name="SstBotCirRibBase0xc26e2d0">
1029 <first ref="SstBotCirRibPri-ChildForSstBotCirRibBase0xc26e0a0"/>
1030 <second ref="SstBotRibBase10xbfa4950"/>
1031 <position name="SstBotCirRibBase0xc26e2d0_pos" unit="mm" x="887.419010389117" y="887.419010389117" z="0"/>
1032 <rotation name="SstBotCirRibBase0xc26e2d0_rot" unit="deg" x="0" y="0" z="45"/>
1033 </subtraction>
delta:opticks_refs blyth$ opticks-;opticks-tbool- 65
opticks-tbool- : sourcing /usr/local/opticks/opticksdata/export/DayaBay_VGDX_20140414-1300/extras/65/tbool65.bash
args:
[2017-07-08 11:09:25,699] p8578 {/Users/blyth/opticks/analytic/csg.py:822} INFO - raw name:union
un(un(in(in(di(cy,cy),sl),sl),bo),bo) height:5 totnodes:63
un abcdef
un abcde bo f
in abcd bo e
in abc sl d
di ab sl c
cy a cy b
[2017-07-08 11:09:25,700] p8578 {/Users/blyth/opticks/analytic/treebuilder.py:34} WARNING - balancing trees of this structure not implemented
// this was because switched diff to union to see the sub-objects
[2017-07-08 11:09:25,700] p8578 {/Users/blyth/opticks/analytic/csg.py:822} INFO - optimized name:union
un(un(in(in(in(cy,!cy),sl),sl),bo),bo) height:5 totnodes:63
un abcdef
un abcde bo f
in abcd bo e
in abc sl d
in ab sl c
cy a !cy b
[2017-07-08 11:09:25,701] p8578 {/Users/blyth/opticks/analytic/csg.py:417} INFO - CSG.Serialize : writing 2 trees to directory /tmp/blyth/opticks/tbool/65
analytic=1_csgpath=/tmp/blyth/opticks/tbool/65_name=65_mode=PyCsgInBox
delta:opticks_refs blyth$
11 class TreeBuilder(object):
12 @classmethod
13 def balance(cls, tree):
14 """
15 Note that positivization is done inplace whereas
16 the balanced tree is created separately
17 """
18 if not tree.is_positive_form():
19 log.fatal("cannot balance tree that is not in positive form")
20 assert 0
21 pass
22 ops = tree.operators_()
23 hops = tree.operators_(minsubdepth=2) # operators above the bileaf operators
24
25 if len(ops) == 1:
26 op = ops[0]
27 prims = tree.primitives()
28 balanced = cls.commontree(op, prims, tree.name+"_prim_balanced" )
29 elif len(hops) == 1:
30 op = hops[0]
31 bileafs = tree.subtrees_(subdepth=1)
32 balanced = cls.bileaftree(op, bileafs, tree.name+"_bileaf_balanced" )
33 else:
34 log.warning("balancing trees of this structure not implemented")
35 balanced = tree
36 pass
37 return balanced