"""Provides a scripting component.
    Inputs:
        x: The x script variable
        y: The y script variable
    Output:
        a: The a output variable"""

__author__ = "tvllpik3"
__version__ = "2022.03.27"

import rhinoscriptsyntax as rs
import math
import copy
import Rhino.Geometry as geom
import scriptcontext as sc

MTOL = sc.doc.ModelAbsoluteTolerance
ATOL = sc.doc.ModelAngleToleranceRadians


def rotate(curve,xA, yA, zA):
  rotate = geom.Transform.RotationZYX(math.radians(zA),math.radians(yA),math.radians(xA))
  curve.Transform(rotate)

def createBoxHolder():
  boxBr = createBoxVessel(xW = 20,yL = 20,zH = 100)
  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)
  translate = geom.Transform.Translation(0,-4,80)
  brepCut.Transform(translate)
  brep = geom.Brep.CreateBooleanDifference(boxBr, brepCut, ATOL )
  # print(len(brep))
  return brep[0]

def createBoxVessel(xW = 10,yL = 10,zH = 10):
  # sideL = 10
  # r = sideL
  thickn = 1
  # r = 2*r
  pt0 = geom.Point3d(xW, yL, zH)
  pt1 = geom.Point3d(0,0,0)
  box = geom.BoundingBox(pt1, pt0)
  # brep = box.ToBrep()
  brepBox = geom.Brep.CreateFromBox(box)
  # innerR = 2*sideL - thickn
  pt0 = geom.Point3d(xW - thickn, yL - thickn, zH + thickn)
  pt1 = geom.Point3d(thickn,thickn,thickn)
  box = geom.BoundingBox(pt1, pt0)
  # brepCut = box.ToBrep()
  brepCut = geom.Brep.CreateFromBox(box)
  # brep = geom.Brep.CreateBooleanDifference(brepCut, brepBox, ATOL )
  brep = geom.Brep.CreateBooleanDifference(brepBox, brepCut, ATOL )
  # rotate(brep[0],xA, yA, zA)
  # rotate(brep[0],45, 45, 0)
  # translate = geom.Transform.Translation(pc[0]-4,pc[1],pc[2])
  return brep[0]

def createTube(p, p2, r, t): # C = Cap
  # p2 = rs.CreatePoint(p[0],p[1],h)
  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 createTubeVerticalB(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)
  pb = rs.CreatePoint(p[0],p[1],1)
  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]
  return breps

translate = geom.Transform.Translation(0, 0, -7)
x.Transform(translate)

pt0 = geom.Point3d(30, 30, 0)
pt1 = geom.Point3d(-30, -30, 5)
box = geom.BoundingBox(pt0, pt1)
brep = box.ToBrep()
# brepx = x.ToBrep()

pt0 = geom.Point3d(20, 20, 0)
pt1 = geom.Point3d(-20, -20, 5)
box = geom.BoundingBox(pt0, pt1)
brepCut = box.ToBrep()

# joined = geom.Brep.JoinBreps(x, ATOL)
# print(joined)
p0 = geom.Point3d(0, 0, 0)
p1 = geom.Point3d(0, 0, 8)
# brep = geom.Brep.CreateBooleanDifference(brep, brepCut, ATOL )
brep = createTube(p0, p1, 28, 5 )
print(brep)
a = x


pt0 = geom.Point3d(13, 30, 0)
pt1 = geom.Point3d(0, 15, 20)
box = geom.BoundingBox(pt0, pt1)
boxbrep = box.ToBrep()

pt0 = geom.Point3d(7, -25, 0)
pt1 = geom.Point3d(22, 0, 23)
box = geom.BoundingBox(pt0, pt1)
boxbrep2 = box.ToBrep()

pt0 = geom.Point3d(-15, -11, 0)
pt1 = geom.Point3d(-30, 0, 23)
box = geom.BoundingBox(pt0, pt1)
boxbrep3 = box.ToBrep()
# boxbreps = geom.Brep.JoinBreps([boxbrep,boxbrep2,boxbrep3], ATOL)

#
holder = createBoxHolder()
translate = geom.Transform.Translation(37,0,0)
holder.Transform(translate)

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)
p3 = geom.Point3d(20,-15,20)
p4 = geom.Point3d(37,-10,30)
pc = geom.Point3d(45,5,40)
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]
t3c = geom.Brep.CreateBooleanDifference(t3, holder, ATOL )
t3cc = geom.Brep.CreateBooleanDifference(t3c[0], sphbrepToCut, ATOL )
holderc = geom.Brep.CreateBooleanDifference(holder, brepsA, ATOL )
sphShellc = geom.Brep.CreateBooleanDifference(sphShell[0], brepsA, ATOL )
# print(len(holderc))
#
#
sp0 = geom.Point3d(45,15,90)
p2 = geom.Point3d(0,0,110)
p3 = geom.Point3d(0,0,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]
t4c = geom.Brep.CreateBooleanDifference(t4, holder, ATOL )
# t3c = geom.Brep.CreateBooleanDifference(t3, holder, ATOL )
# t3cc = geom.Brep.CreateBooleanDifference(t3c[0], sphbrepToCut, ATOL )
# holderc = geom.Brep.CreateBooleanDifference(holder, brepsA, ATOL )
# sphShellc = geom.Brep.CreateBooleanDifference(sphShell[0], brepsA, ATOL )
#
sp0 = geom.Point3d(0,0,200)
r=40
sph = geom.Sphere(sp0, r)
sphbrep = geom.Brep.CreateQuadSphere(sph)

pt1 = rs.CreatePoint(sp0[0],sp0[1],sp0[2]+r+15)
l = rs.AddLine(sp0, pt1)
ll = copy.copy( rs.coercecurve(l) )
brepH = geom.Brep.CapPlanarHoles(geom.Brep.CreatePipe(ll, r-10, 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)
sphShellUp = geom.Brep.CreateBooleanDifference(sphbrep, sphbrepToCut, ATOL )[0]
sphShellUp1 = geom.Brep.CreateBooleanDifference(sphShellUp, brepsB, ATOL )[0]
#
pt1 = rs.CreatePoint(-8,-13,155)
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)
sphShellUp2 = geom.Brep.CreateBooleanDifference(sphShellUp1, brepH, ATOL )[0]
# 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 )
#
sp0 = geom.Point3d(0,0,160)
r=7
sphPlug = geom.Sphere(sp0, r)
sphPlbrep = geom.Brep.CreateQuadSphere(sphPlug)
pt1 = rs.CreatePoint(sp0[0],sp0[1],sp0[2]-r-15)
l = rs.AddLine(sp0, pt1)
ll = copy.copy( rs.coercecurve(l) )
brepH = geom.Brep.CapPlanarHoles(geom.Brep.CreatePipe(ll, 3, True, 0, False, MTOL, ATOL)[0], MTOL)

sphPlbrep = geom.Brep.CreateBooleanDifference(sphPlbrep, brepH, ATOL )[0]
sph = geom.Sphere(sp0, r-1)
sphPlbrepToCut = geom.Brep.CreateQuadSphere(sph)
sphPlbrep1 = geom.Brep.CreateBooleanDifference(sphPlbrep, sphPlbrepToCut, ATOL )[0]
sphPlbrep1c = geom.Brep.CreateBooleanDifference(sphPlbrep1, sphShellUp2, ATOL )[0]
#
#
pt0 = rs.CreatePoint(-6.5,-10,155)
pt1 = rs.CreatePoint(-6.5,-10,170)
tFl = createTube(pt0, pt1, 3, 0.8)
tFlc = geom.Brep.CreateBooleanDifference(tFl, sphShellUp2, ATOL )[0]
#
sp0 = geom.Point3d(-4,-10,165)
r=4
sphFl = geom.Sphere(sp0, r)
sphFlbrep = geom.Brep.CreateQuadSphere(sphFl)
tFlc1 = geom.Brep.CreateBooleanDifference(tFlc, sphFlbrep, ATOL )[0]
#

breps = geom.Brep.JoinBreps([holderc[0], tb, sphShellc[0], t3cc[0], t4c[0], sphShellUp2, sphPlbrep1c, tFlc1 ], ATOL)



