import rhinoscriptsyntax as rs
import math
import copy
import Rhino.Geometry as geom
import scriptcontext as sc
import random

MTOL = sc.doc.ModelAbsoluteTolerance
ATOL = sc.doc.ModelAngleToleranceRadians

brepDict = {}

def rotate(curve,xA, yA, zA):
  rotate = geom.Transform.RotationZYX(math.radians(zA),math.radians(yA),math.radians(xA))
  curve.Transform(rotate)

def createBoxHolder(name):
  boxBr, boxPt = createBoxVessel(xW = 20,yL = 20,zH = 120)
  brepDict[name + "Inner"] = boxPt
  boxT1 = createBoxTubeHolder(xW = 15,yL = 5,zH = 10, thickn = 0.8)
  translate = geom.Transform.Translation(0,0,110)
  boxT1.Transform(translate)
  boxT2 = createBoxTubeHolder(xW = 15,yL = 5,zH = 10, thickn = 0.8)
  translate = geom.Transform.Translation(0,0,62)
  boxT2.Transform(translate)
  #
  sideL = 10
  r = sideL*math.sqrt(2)
  r = 2*r
  pt0 = geom.Point3d(r, r, r)
  pt1 = geom.Point3d(0,0,0)
  box = geom.BoundingBox(pt1, pt0)
  brepCut = geom.Brep.CreateFromBox(box)
  translate = geom.Transform.Translation(0,-r/2,-r/2)
  brepCut.Transform(translate)
  rotate(brepCut,45,0, 0)
  #
  pt0 = geom.Point3d(r, r, r)
  pt1 = geom.Point3d(0,0,0)
  box = geom.BoundingBox(pt1, pt0)
  brepCut1 = geom.Brep.CreateFromBox(box)
  translate = geom.Transform.Translation(0,13,-10)
  brepCut1.Transform(translate)
  brepCut = geom.Brep.CreateBooleanDifference(brepCut, brepCut1, ATOL )[0]
  #
  translate = geom.Transform.Translation(0,0,90)
  brepCut.Transform(translate)
  brepDict[name + "Cut"] = brepCut
  brep = geom.Brep.CreateBooleanDifference(boxBr, brepCut, ATOL )
  # print(len(brep))
  return brep[0], boxT1, boxT2

def createBoxHolderV2(name):
  boxBr, boxPt = createBoxVessel(xW = 20,yL = 20,zH = 120, thickn = 1)
  brepDict[name + "Inner"] = boxPt
  # boxBr2, boxPt2 = createBoxVessel(xW = 20,yL = 20,zH = 120, thickn = 1)
  # brepDict[name + "Inner2"] = boxPt2
  boxT1 = createBoxTubeHolder(xW = 15,yL = 5,zH = 10, thickn = 0.8)
  translate = geom.Transform.Translation(0,0,110)
  boxT1.Transform(translate)
  boxT2 = createBoxTubeHolder(xW = 15,yL = 5,zH = 10, thickn = 0.8)
  translate = geom.Transform.Translation(0,0,62)
  boxT2.Transform(translate)
  #
  sideL = 10
  r = sideL*math.sqrt(2)
  r = 2*r
  pt0 = geom.Point3d(r, r, r)
  pt1 = geom.Point3d(0,0,0)
  box = geom.BoundingBox(pt1, pt0)
  brepCut = geom.Brep.CreateFromBox(box)
  translate = geom.Transform.Translation(0,-r/2,-r/2)
  brepCut.Transform(translate)
  rotate(brepCut,45,0, 0)
  #
  pt0 = geom.Point3d(r, r, r)
  pt1 = geom.Point3d(0,0,0)
  box = geom.BoundingBox(pt1, pt0)
  brepCut1 = geom.Brep.CreateFromBox(box)
  translate = geom.Transform.Translation(0,13,-10)
  brepCut1.Transform(translate)
  brepCut = geom.Brep.CreateBooleanDifference(brepCut, brepCut1, ATOL )[0]
  #
  translate = geom.Transform.Translation(0,0,90)
  brepCut.Transform(translate)
  brepDict[name + "Cut"] = brepCut
  brep = geom.Brep.CreateBooleanDifference(boxBr, brepCut, ATOL )
  # print(len(brep))
  return brep[0], boxT1, boxT2#, boxBr2

def createBoxVessel(xW = 10,yL = 10,zH = 10, thickn = 1):
  pt0 = geom.Point3d(xW, yL, zH)
  pt1 = geom.Point3d(0,0,0)
  box = geom.BoundingBox(pt1, pt0)
  brepBox = geom.Brep.CreateFromBox(box)
  pt0 = geom.Point3d(xW - thickn, yL - thickn, zH + thickn)
  pt1 = geom.Point3d(thickn,thickn,thickn+0.5)
  box = geom.BoundingBox(pt1, pt0)
  brepCut = geom.Brep.CreateFromBox(box)
  brep = geom.Brep.CreateBooleanDifference(brepBox, brepCut, ATOL )
  return brep[0], [pt0, pt1]

def createBoxTubeHolder(xW = 10,yL = 10,zH = 10, thickn = 1):
  boxT1 = createBoxTube(xW,yL,zH, thickn = thickn)
  r=20
  pt0 = geom.Point3d(r, r, r)
  pt1 = geom.Point3d(0,0,0)
  box = geom.BoundingBox(pt0, pt1)
  brepCut1 = geom.Brep.CreateFromBox(box)
  rotate(brepCut1,30,0, 0)
  boxT1 = geom.Brep.CreateBooleanDifference(boxT1, brepCut1, ATOL )[0]
  box = geom.BoundingBox(pt1, pt0)
  brepCut1 = geom.Brep.CreateFromBox(box)
  rotate(brepCut1,0,80, 0)
  boxT1 = geom.Brep.CreateBooleanDifference(boxT1, brepCut1, ATOL )[0]

  return boxT1

def createBoxTube(xW = 10,yL = 10,zH = 10, thickn = 1):
  pt0 = geom.Point3d(xW, yL, zH)
  pt1 = geom.Point3d(0,0,0)
  box = geom.BoundingBox(pt1, pt0)
  brepBox = geom.Brep.CreateFromBox(box)
  pt0 = geom.Point3d(xW - thickn, yL - thickn, zH + thickn)
  pt1 = geom.Point3d(thickn,thickn,0)
  box = geom.BoundingBox(pt1, pt0)
  brepCut = geom.Brep.CreateFromBox(box)
  brep = geom.Brep.CreateBooleanDifference(brepBox, brepCut, ATOL )
  return brep[0]


def createCurveTube(points, r, t): # C = Cap
  l = rs.AddCurve(points)
  ll = copy.copy( rs.coercecurve(l) )
  brepsA = geom.Brep.CapPlanarHoles(geom.Brep.CreatePipe(ll, r, True, 0, False, MTOL, ATOL)[0], MTOL)
  brepsB = geom.Brep.CapPlanarHoles(geom.Brep.CreatePipe(ll, r - t, True, 0, False, MTOL, ATOL)[0], MTOL)
  t3 = geom.Brep.CreateBooleanDifference(brepsA, brepsB, ATOL )[0]
  return t3

def createTube(p, p2, r, t):
  l = rs.AddLine(p, p2)
  ll = copy.copy( rs.coercecurve(l) )
  brepsA = geom.Brep.CapPlanarHoles(geom.Brep.CreatePipe(ll, r, True, 0, False, MTOL, ATOL)[0], MTOL)
  brepsB = geom.Brep.CapPlanarHoles(geom.Brep.CreatePipe(ll, r - t, True, 0, False, MTOL, ATOL)[0], MTOL)
  breps = geom.Brep.CreateBooleanDifference(brepsA, brepsB, ATOL )[0]
  return breps


def createGearOut(r=10):
  r=r+1
  sp0 = geom.Point3d(0,0,0)
  sph = geom.Sphere(sp0, r)
  sphbrep = geom.Brep.CreateQuadSphere(sph)
  
  t1R = 5
  pt0 = rs.CreatePoint(0,0,0)
  pt1 = rs.CreatePoint(0,0,r*2)
  l = rs.AddLine(pt0, pt1)
  ll = copy.copy( rs.coercecurve(l) )
  brepH = geom.Brep.CapPlanarHoles(geom.Brep.CreatePipe(ll, t1R, True, 0, False, MTOL, ATOL)[0], MTOL)
  
  sphbrep = geom.Brep.CreateBooleanDifference(sphbrep, brepH, ATOL )[0]
  pt0 = rs.CreatePoint(0,0,0)
  pt2 = rs.CreatePoint(0,0,r*2)
  pt22 = rs.CreatePoint(0,0,r*2.3)
  m=1.2
  pt3 = rs.CreatePoint(r*m,r*m,r*m)
  pt4 = rs.CreatePoint(r*m,r*m,r*m*2)
  t1 = createTube(pt0, pt22, t1R, 0.8)
  t2 = createCurveTube([pt0, pt2, pt3, pt4], 2, 0.8)
  #
  l = rs.AddLine(pt0, pt2)
  ll = copy.copy( rs.coercecurve(l) )
  brepsB = geom.Brep.CapPlanarHoles(geom.Brep.CreatePipe(ll, t1R - 0.8, True, 0, False, MTOL, ATOL)[0], MTOL)
  brepDict["t1" + "inner"] = brepsB
  #
  
  sph = geom.Sphere(sp0, r-1)
  sphbrepToCut = geom.Brep.CreateQuadSphere(sph)
  sphShell = geom.Brep.CreateBooleanDifference(sphbrep, sphbrepToCut, ATOL )
  pt0 = geom.Point3d(r, r, 0)
  pt1 = geom.Point3d(-r,-r,-r)
  box = geom.BoundingBox(pt1, pt0)
  brepBox = geom.Brep.CreateFromBox(box)
  sphShell = geom.Brep.CreateBooleanDifference(sphShell[0], brepBox, ATOL )
  t1 = geom.Brep.CreateBooleanDifference(t1, sphbrepToCut, ATOL )
  # t2 = geom.Brep.CreateBooleanDifference(t2, sphbrepToCut, ATOL )
  #
  sphShell2 = copy.copy(sphShell[0])
  rotate(sphShell2,0,180, 0)
  translate = geom.Transform.Translation(0,0,r*2.5)
  sphShell2.Transform(translate)
  translate = geom.Transform.Translation(0,0,r*3)
  brepBox.Transform(translate)
  sphShell2 = geom.Brep.CreateBooleanDifference(sphShell2, brepBox, ATOL )[0]
  t2 = geom.Brep.CreateBooleanDifference(t2, brepDict["t1" + "inner"], ATOL )[0]
  #
  translate = geom.Transform.Translation(0,0,r*0.8)
  t2.Transform(translate)
  #
  return sphShell[0], t1[0], sphShell2, t2

def createTubeVerticalB(p, p2, r, t, name="x"):
  l = rs.AddLine(p, p2)
  ll = copy.copy( rs.coercecurve(l) )
  brepsA = geom.Brep.CapPlanarHoles(geom.Brep.CreatePipe(ll, r, True, 0, False, MTOL, ATOL)[0], MTOL)
  pb = rs.CreatePoint(p[0],p[1],1.3)
  l = rs.AddLine(pb, p2)
  ll = copy.copy( rs.coercecurve(l) )
  brepsB = geom.Brep.CapPlanarHoles(geom.Brep.CreatePipe(ll, r - t, True, 0, False, MTOL, ATOL)[0], MTOL)
  breps = geom.Brep.CreateBooleanDifference(brepsA, brepsB, ATOL )[0]
  brepDict[name + "Inner"] = brepsB
  return breps

def scale(curve, x,y,z):
  p0 = rs.CreatePoint(0,0,0)
  px = rs.CreatePoint(1,0,0)
  py = rs.CreatePoint(0,1,0)
  plane = geom.Plane(p0,px,py)
  scale = geom.Transform.Scale(plane,x,y,z)
  curve.Transform(scale)

cosR = size*math.cos(math.radians(60))
sinR = size*math.sin(math.radians(60))
pa = rs.CreatePoint(0,0,0)
pb = rs.CreatePoint(size,0,0)
pc = rs.CreatePoint(size+cosR,sinR,0)
pd = rs.CreatePoint(size,2*sinR,0)
pe = rs.CreatePoint(0,2*sinR,0)
pf = rs.CreatePoint(-cosR,sinR,0)
pg = rs.CreatePoint(0,0,0)

pcf = rs.CreatePoint(size/2,sinR,0)
pcfcf = rs.CreatePoint(size*1.5 + cosR,0,0)

p0 = pcf

p2 = rs.CreatePoint(p0[0], p0[1], p0[2] - 20)
x = (p2[0] + pc[0])/2
y = (p2[1] + pc[1])/2
z = (p2[2] + pc[2])/2
p3 = rs.CreatePoint(x,y,z)

# holder, boxT1, boxT2, boxBr2 = createBoxHolderV2("holder")
holder, boxT1, boxT2 = createBoxHolderV2("holder")
brepDict["holder"] = holder
translate = geom.Transform.Translation(57,0,0)
for i in [holder, boxT1, boxT2]:
  i.Transform(translate)
# name + "Inner"
# "holder" + "Inner"
for i in brepDict["holder" + "Inner"]:
  i.Transform(translate)

def createTubeHolder():
  pt0 = geom.Point3d(0,0, 0)
  pt1 = geom.Point3d(0,0, 120)
  # boxBr2, boxPt2 = createBoxVessel(xW = 20,yL = 20,zH = 120, thickn = 1)
  boxBr2 = createTubeVerticalB(pt0, pt1, 25, 0.8, name="holderTube")
  #
  p0 = geom.Point3d(-15,0,0)
  p1 = geom.Point3d(40,0,0)
  t1 = createTube(p0,p1,7,0.8)
  rotate(t1,0,20, 0)
  translate = geom.Transform.Translation(0,1,67)
  t1.Transform(translate)
  #
  boxT1 = createBoxTube(xW = 14,yL = 5,zH = 20, thickn = 0.8)
  # boxT2 = copy.copy(boxT1)
  translate = geom.Transform.Translation(57,0,57)
  boxT1.Transform(translate)
  # translate = geom.Transform.Translation(57,0,57)
  # boxT2.Transform(translate)
  #
  pt1 = geom.Point3d(0,0, 13)
  flBrIBox, _ = createBoxVessel(xW = 15,yL = 5,zH = 5, thickn = 0.8)
  flBr = createTubeVerticalB(pt0, pt1, 13, 0.8)
  # brepDict["holder" + "Inner2"] = boxPt2
  translate = geom.Transform.Translation(57,0,0)
  flBrIBox.Transform(translate)
  #
  # name = "holder"
  # cut1 = copy.copy(brepDict[name + "Cut"]) # cut1 = copy.copy(brepDict["holderCut"])
  # scale(cut1,1,1,1)
  # translate = geom.Transform.Translation(37,0,0)
  # cut1.Transform(translate)
  # boxBr2 = geom.Brep.CreateBooleanDifference(boxBr2, cut1, ATOL )[0]
  #
  translate = geom.Transform.Translation(64,2,0)
  for i in [boxBr2, t1, flBr]:
    i.Transform(translate)
  brepDict["holderTube" + "Inner"].Transform(translate)
  #
  # boxBr2 = geom.Brep.CreateBooleanDifference(boxBr2, cut1, ATOL )[0]
  pt0 = geom.Point3d(80, -30, 200)
  pt1 = geom.Point3d(30,30,70)
  box = geom.BoundingBox(pt0, pt1)
  cut1 = geom.Brep.CreateFromBox(box)
  boxBr2 = geom.Brep.CreateBooleanDifference(boxBr2, cut1, ATOL )[0]
  # xW = 15;yL = 5;zH = 10; thickn = 0.8
  thickn = 0.8
  pt0 = geom.Point3d(14-thickn,5-thickn,30)
  pt1 = geom.Point3d(thickn,thickn,-10)
  box = geom.BoundingBox(pt1, pt0)
  cut1 = geom.Brep.CreateFromBox(box)
  translate = geom.Transform.Translation(57,0,62)
  cut1.Transform(translate)
  # t1 = geom.Brep.CreateBooleanDifference(cut1, t1, ATOL )[0]
  boxT1 = geom.Brep.CreateBooleanDifference(boxT1, t1, ATOL )[2]
  #
  boxT2 = copy.copy(boxT1)
  translate = geom.Transform.Translation(0,0,105-57)
  boxT2.Transform(translate)
  #
  t1 = geom.Brep.CreateBooleanDifference(t1, cut1, ATOL )[0]
  t1 = geom.Brep.CreateBooleanDifference(t1, boxBr2, ATOL )[1]
  t2 = copy.copy(t1)
  translate = geom.Transform.Translation(0,0,48)
  t2.Transform(translate)
  brepDict["holderTube"] = boxBr2
  #
  r=39
  pt0 = geom.Point3d(r, r, r)
  pt1 = geom.Point3d(0,0,0)
  box = geom.BoundingBox(pt1, pt0)
  brepCut1 = geom.Brep.CreateFromBox(box)
  translate = geom.Transform.Translation(39,-10,70)
  brepCut1.Transform(translate)
  boxT1 = geom.Brep.CreateBooleanDifference(boxT1, brepCut1, ATOL )[0]
  t1 = geom.Brep.CreateBooleanDifference(t1, brepCut1, ATOL )[0]
  #
  return t1, t2, flBr, flBrIBox, boxT1, boxT2, brepCut1

t1, t2, flBr, flBrIBox, boxT1, boxT2, brepCut1 = createTubeHolder()

# sphShell, t1, sphShell2, t2 = createGearOut(r=10)
# translate = geom.Transform.Translation(47,4,90)
# for i in [sphShell, t1, sphShell2, t2]:
#   rotate(i,90,0, 0)
#   i.Transform(translate)

#
def createBottomConn():
  pt0 = geom.Point3d(-4, -21, 0)
  pt1 = geom.Point3d(-4, -21, 13)
  tb = createTubeVerticalB(pt0, pt1, 10, 0.8)
  sp0 = geom.Point3d(-4, -21, 10)
  r=10
  sph = geom.Sphere(sp0, r+0.5)
  sphbrep = geom.Brep.CreateQuadSphere(sph)
  pt1 = rs.CreatePoint(sp0[0]-20,sp0[1]+15,sp0[2]+15)
  l = rs.AddLine(sp0, pt1)
  ll = copy.copy( rs.coercecurve(l) )
  brepH = geom.Brep.CapPlanarHoles(geom.Brep.CreatePipe(ll, 2, True, 0, False, MTOL, ATOL)[0], MTOL)
  sphbrep = geom.Brep.CreateBooleanDifference(sphbrep, brepH, ATOL )[0]
  sph = geom.Sphere(sp0, r-1)
  sphbrepToCut = geom.Brep.CreateQuadSphere(sph)
  sphShell = geom.Brep.CreateBooleanDifference(sphbrep, sphbrepToCut, ATOL )
  pt0 = geom.Point3d(sp0[0]+r, sp0[1]+r, 10)
  pt1 = geom.Point3d(sp0[0]-r, sp0[1]-r,-r)
  box = geom.BoundingBox(pt1, pt0)
  brepBox = geom.Brep.CreateFromBox(box)
  sphShell = geom.Brep.CreateBooleanDifference(sphShell[0], brepBox, ATOL )
  #
  p2 = geom.Point3d(4,-21,15)
  p2 = geom.Point3d(4,-21,15)
  p3 = geom.Point3d(20,10,20)
  p4 = geom.Point3d(47,35,40)
  pc = geom.Point3d(60,15,50)
  points = [sp0, p2, p3, p4, pc]
  l = rs.AddCurve(points)
  ll = copy.copy( rs.coercecurve(l) )
  r = 3
  t = 0.8
  brepsA = geom.Brep.CapPlanarHoles(geom.Brep.CreatePipe(ll, r, True, 0, False, MTOL, ATOL)[0], MTOL)
  brepsB = geom.Brep.CapPlanarHoles(geom.Brep.CreatePipe(ll, r - t, True, 0, False, MTOL, ATOL)[0], MTOL)
  t3 = geom.Brep.CreateBooleanDifference(brepsA, brepsB, ATOL )[0]
  #
  brepDict["holder"] = geom.Brep.CreateBooleanDifference(brepDict["holder"],brepsB, ATOL )[0]
  #
  pt0, pt1 = brepDict["holder" + "Inner"]
  box = geom.BoundingBox(pt1, pt0)
  brepBox = geom.Brep.CreateFromBox(box)
  #
  t3c = geom.Brep.CreateBooleanDifference(t3, brepBox, ATOL )
  t3cc = geom.Brep.CreateBooleanDifference(t3c[0], sphbrepToCut, ATOL )
  holderc = geom.Brep.CreateBooleanDifference(holder, brepsA, ATOL )
  sphShellc = geom.Brep.CreateBooleanDifference(sphShell[0], brepsA, ATOL )
  return tb, sphbrep, sphShellc[0], t3cc[0]

def createBottomConnTube():
  pt0 = geom.Point3d(-4, -21, 0)
  pt1 = geom.Point3d(-4, -21, 13)
  tb = createTubeVerticalB(pt0, pt1, 10, 0.8)
  sp0 = geom.Point3d(-4, -21, 10)
  r=10
  sph = geom.Sphere(sp0, r+0.5)
  sphbrep = geom.Brep.CreateQuadSphere(sph)
  pt1 = rs.CreatePoint(sp0[0]-20,sp0[1]+15,sp0[2]+15)
  l = rs.AddLine(sp0, pt1)
  ll = copy.copy( rs.coercecurve(l) )
  brepH = geom.Brep.CapPlanarHoles(geom.Brep.CreatePipe(ll, 2, True, 0, False, MTOL, ATOL)[0], MTOL)
  sphbrep = geom.Brep.CreateBooleanDifference(sphbrep, brepH, ATOL )[0]
  sph = geom.Sphere(sp0, r-1)
  sphbrepToCut = geom.Brep.CreateQuadSphere(sph)
  sphShell = geom.Brep.CreateBooleanDifference(sphbrep, sphbrepToCut, ATOL )
  pt0 = geom.Point3d(sp0[0]+r, sp0[1]+r, 10)
  pt1 = geom.Point3d(sp0[0]-r, sp0[1]-r,-r)
  box = geom.BoundingBox(pt1, pt0)
  brepBox = geom.Brep.CreateFromBox(box)
  sphShell = geom.Brep.CreateBooleanDifference(sphShell[0], brepBox, ATOL )
  #
  p2 = geom.Point3d(4,-21,15)
  p2 = geom.Point3d(4,-21,15)
  p3 = geom.Point3d(20,10,20)
  p4 = geom.Point3d(47,35,40)
  pc = geom.Point3d(60,15,50)
  points = [sp0, p2, p3, p4, pc]
  l = rs.AddCurve(points)
  l = rs.AddLine(sp0, pc)
  ll = copy.copy( rs.coercecurve(l) )
  r = 3
  t = 0.8
  brepsA = geom.Brep.CapPlanarHoles(geom.Brep.CreatePipe(ll, r, True, 0, False, MTOL, ATOL)[0], MTOL)
  brepsB = geom.Brep.CapPlanarHoles(geom.Brep.CreatePipe(ll, r - t, True, 0, False, MTOL, ATOL)[0], MTOL)
  t3 = geom.Brep.CreateBooleanDifference(brepsA, brepsB, ATOL )[0]
  # t3 = createTube(sp0, pc, r, t)
  #
  brepDict["holder"] = geom.Brep.CreateBooleanDifference(brepDict["holder"],brepsB, ATOL )[0]
  brepDict["holderTube"] = geom.Brep.CreateBooleanDifference(brepDict["holderTube"],brepsB, ATOL )[0]
  #
  pt0, pt1 = brepDict["holder" + "Inner"]
  box = geom.BoundingBox(pt1, pt0)
  brepBox = geom.Brep.CreateFromBox(box)
  brepBox = brepDict["holderTube" + "Inner"]
  #
  t3c = geom.Brep.CreateBooleanDifference(t3, brepBox, ATOL )
  t3cc = geom.Brep.CreateBooleanDifference(t3c[0], sphbrepToCut, ATOL )
  holderc = geom.Brep.CreateBooleanDifference(holder, brepsA, ATOL )
  sphShellc = geom.Brep.CreateBooleanDifference(sphShell[0], brepsA, ATOL )
  return tb, sphbrep, sphShellc[0], t3cc[0]

tb, sphbrep, sphShellc, t3cc = createBottomConnTube()
#
def createTopConn():
  sp0 = geom.Point3d(65,15,90)
  p2 = geom.Point3d(0,5,120)
  p3 = geom.Point3d(0,5,140)
  pc = geom.Point3d(0,0,170)
  points = [sp0, p2, p3, pc]
  l = rs.AddCurve(points)
  ll = copy.copy( rs.coercecurve(l) )
  r = 5
  t = 1
  brepsA = geom.Brep.CapPlanarHoles(geom.Brep.CreatePipe(ll, r, True, 0, False, MTOL, ATOL)[0], MTOL)
  brepsB = geom.Brep.CapPlanarHoles(geom.Brep.CreatePipe(ll, r - t, True, 0, False, MTOL, ATOL)[0], MTOL)
  t4 = geom.Brep.CreateBooleanDifference(brepsA, brepsB, ATOL )[0]
  #
  pt0, pt1 = brepDict["holder" + "Inner"]
  box = geom.BoundingBox(pt1, pt0)
  brepBox = geom.Brep.CreateFromBox(box)
  #
  t4c = geom.Brep.CreateBooleanDifference(t4, brepBox, ATOL )[1]
  return t4c

t4c = createTopConn()


def createGearHolderV2():
  hox = 1# holderOffset
  sp0 = geom.Point3d(70,5,40)
  p2 = geom.Point3d(50,0,50)
  p3 = geom.Point3d(47-hox,-10,60)
  pc = geom.Point3d(47-hox,-10,80)
  points = [sp0, p2, p3, pc]
  l = rs.AddCurve(points)
  ll = copy.copy( rs.coercecurve(l) )
  r = 5
  t = 1
  brepsA = geom.Brep.CapPlanarHoles(geom.Brep.CreatePipe(ll, r, True, 0, False, MTOL, ATOL)[0], MTOL)
  brepsB = geom.Brep.CapPlanarHoles(geom.Brep.CreatePipe(ll, r - t, True, 0, False, MTOL, ATOL)[0], MTOL)
  t4 = geom.Brep.CreateBooleanDifference(brepsA, brepsB, ATOL )[0]
  #
  pt0, pt1 = brepDict["holder" + "Inner"]
  box = geom.BoundingBox(pt1, pt0)
  brepBox = geom.Brep.CreateFromBox(box)
  #
  t5c = geom.Brep.CreateBooleanDifference(t4, brepBox, ATOL )[0]
  name = "gearHolder"
  boxBrO, boxPt = createBoxVessel(xW = 20,yL = 7.6,zH = 20)
  rotate(boxBrO,0,45, 0)
  #
  t1R = 5
  p = geom.Point3d(0, 0, 0)
  p2 = geom.Point3d(0, 0, 20)
  l = rs.AddLine(p, p2)
  ll = copy.copy( rs.coercecurve(l) )
  brepsA = geom.Brep.CapPlanarHoles(geom.Brep.CreatePipe(ll, t1R+0.6, True, 0, False, MTOL, ATOL)[0], MTOL)
  d = 20*math.sqrt(2)/2
  translate = geom.Transform.Translation(d,0,0)
  brepsA.Transform(translate)
  #
  # boxBrO = geom.Brep.CreateBooleanDifference(boxBrO, brepsA, ATOL )[0]
  translate = geom.Transform.Translation(0,7.6,0)
  brepsA.Transform(translate)
  #
  translate = geom.Transform.Translation(0,-7.6,-10)
  brepsAA = copy.copy(brepsA)
  brepsAA.Transform(translate)
  rotate(brepsAA,90,0, 0)
  boxBrO = geom.Brep.CreateBooleanDifference(boxBrO, brepsAA, ATOL )[0]
  rotate(brepsA,0,45, 0)
  translate = geom.Transform.Translation(4,0,10)
  brepsA.Transform(translate)
  boxBrO = geom.Brep.CreateBooleanDifference(boxBrO, brepsA, ATOL )[0]
  translate = geom.Transform.Translation(0,-7.6,0)
  brepsA.Transform(translate)
  boxBrO = geom.Brep.CreateBooleanDifference(boxBrO, brepsA, ATOL )[0]
  translate = geom.Transform.Translation(33-hox,-13.5,90)
  boxBrO.Transform(translate)
  boxBrO = geom.Brep.CreateBooleanDifference(boxBrO, brepsB, ATOL )[0]
  return t5c , boxBrO

def createGearHolderV3():
  hox = 1# holderOffset
  sp0 = geom.Point3d(50,5,40)
  p2 = geom.Point3d(15,0,55)
  p3 = geom.Point3d(47-hox,-10,70)
  pc = geom.Point3d(47-hox,-10,80)
  points = [sp0, p2, p3, pc]
  l = rs.AddCurve(points)
  ll = copy.copy( rs.coercecurve(l) )
  r = 5
  t = 1
  brepsA = geom.Brep.CapPlanarHoles(geom.Brep.CreatePipe(ll, r, True, 0, False, MTOL, ATOL)[0], MTOL)
  brepsB = geom.Brep.CapPlanarHoles(geom.Brep.CreatePipe(ll, r - t, True, 0, False, MTOL, ATOL)[0], MTOL)
  t4 = geom.Brep.CreateBooleanDifference(brepsA, brepsB, ATOL )[0]
  #
  pt0, pt1 = brepDict["holder" + "Inner"]
  box = geom.BoundingBox(pt1, pt0)
  brepBox = geom.Brep.CreateFromBox(box)
  brepBox = brepDict["holderTube"]
  #
  t5c = geom.Brep.CreateBooleanDifference(t4, brepBox, ATOL )
  print("t5c", len(t5c))
  name = "gearHolder"
  boxBrO, boxPt = createBoxVessel(xW = 20,yL = 7.6,zH = 20)
  rotate(boxBrO,0,45, 0)
  #
  t1R = 5
  p = geom.Point3d(0, 0, 0)
  p2 = geom.Point3d(0, 0, 20)
  l = rs.AddLine(p, p2)
  ll = copy.copy( rs.coercecurve(l) )
  brepsA = geom.Brep.CapPlanarHoles(geom.Brep.CreatePipe(ll, t1R+0.4, True, 0, False, MTOL, ATOL)[0], MTOL)
  d = 20*math.sqrt(2)/2
  translate = geom.Transform.Translation(d,0,0)
  brepsA.Transform(translate)
  #
  # boxBrO = geom.Brep.CreateBooleanDifference(boxBrO, brepsA, ATOL )[0]
  translate = geom.Transform.Translation(0,7.6,0)
  brepsA.Transform(translate)
  #
  translate = geom.Transform.Translation(0,-7.6,-10)
  brepsAA = copy.copy(brepsA)
  brepsAA.Transform(translate)
  rotate(brepsAA,90,0, 0)
  boxBrO = geom.Brep.CreateBooleanDifference(boxBrO, brepsAA, ATOL )[0]
  rotate(brepsA,0,45, 0)
  translate = geom.Transform.Translation(4,0,10)
  brepsA.Transform(translate)
  boxBrO = geom.Brep.CreateBooleanDifference(boxBrO, brepsA, ATOL )[0]
  translate = geom.Transform.Translation(0,-7.6,0)
  brepsA.Transform(translate)
  boxBrO = geom.Brep.CreateBooleanDifference(boxBrO, brepsA, ATOL )[0]
  translate = geom.Transform.Translation(33-hox,-13.5,90)
  boxBrO.Transform(translate)
  boxBrO = geom.Brep.CreateBooleanDifference(boxBrO, brepsB, ATOL )[0]
  return t5c[0] , boxBrO

t5c , boxBrO = createGearHolderV3()

translate = geom.Transform.Translation(20,0,0)
brepDict["holderCut"].Transform(translate)

name = "holder"
# tile = geom.Brep.JoinBreps([brepDict["holder"], boxT1, boxT2], ATOL)
# tile = geom.Brep.JoinBreps([ boxT1, boxT2, brepDict["holderTube"], t1, t2, brepDict["holderCut"] ], ATOL)
tile = geom.Brep.JoinBreps([ brepDict["holderTube"], t1, t2, boxT1, boxT2 ], ATOL)
# GearOut = geom.Brep.JoinBreps([sphShell, t1, sphShell2, t2], ATOL)
bottomConn = geom.Brep.JoinBreps([tb, sphShellc, t3cc], ATOL)
# breps = geom.Brep.JoinBreps([t4c, t5c, boxBrO], ATOL)
# breps = geom.Brep.JoinBreps([t5c, boxBrO, t3test], ATOL)
breps = geom.Brep.JoinBreps([t5c, boxBrO], ATOL)
# flBrOut = geom.Brep.JoinBreps([flBr, flBrIBox], ATOL)
