"""cylindrical
    Inputs:
        x: The x script variable
        y: The y script variable
    Output:
        a: The a output variable"""

__author__ = "tvllpik3"
__version__ = "2022.03.10"

import rhinoscriptsyntax as rs
import math
import copy
import Rhino.Geometry as geom
import random
import scriptcontext as sc
import random

MTOL = sc.doc.ModelAbsoluteTolerance
ATOL = sc.doc.ModelAngleToleranceRadians

r = 100
facets =5

def rotate(curve,xA, yA, zA):
  rotate = geom.Transform.RotationZYX(math.radians(zA),math.radians(yA),math.radians(xA))
  curve.Transform(rotate)

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)

def polyPoints(z, r):
  points = []
  for i in range(0,facets+1):
    angle = i*360/facets
    x = r*math.cos(math.radians(angle))
    y = r*math.sin(math.radians(angle))
    points.append(rs.CreatePoint(x,y,z))
  return points

def polygon(z, r):
  points = polyPoints(z, r)
  polygon = rs.AddPolyline(points)
  return polygon

def cosPoints(z, in_r,a,b):
  points = []
  for i in range(0,360+1):
    r = in_r + a + a*math.cos( math.radians(i)*b )
    x = r * math.cos( math.radians(i) )
    y = r * math.sin( math.radians(i) )
    points.append(rs.CreatePoint(x,y,z))
  return points

def cosPoly(z, in_r,a,b):
  points = cosPoints(z, in_r,a,b)
  curve = rs.AddCurve(points)
  curve = rs.CloseCurve(curve,1)
  return curve

def curvePoly(z, r):
  points = polyPoints(z, r)
  curve = rs.AddCurve(points)
  return curve


def createCurvesInner(thinkn):
  curves = []
  height = 180
  step = 40
  for i in range(0, height, step):
    # print(i)
    if i == 0:
      curves.append(curvePoly(i,30-thinkn))
      # print(25)
    elif i == step*1:
      curves.append(curvePoly(i,25-thinkn))
    else:
      curves.append(curvePoly(i,15-thinkn))
  curves.append(curvePoly(180,15-thinkn))
  return curves

def createCurvesInnerConst(thinkn):
  hr = [(0, 30),(40, 25),(80, 15),(120, 15),(160, 15)]
  # print( ("len(hr)", len(hr)) )
  l = len(hr)
  l = l -1
  curves = []
  curves.append(curvePoly(180,15-thinkn))
  for i in range(len(hr)):
    # print(i)
    h = hr[l-i][0]
    r = hr[l-i][1] - thinkn
    curves.append( curvePoly(h,r)  )
  return curves

def createCurvesConst():
  hr = [(0, 30),(40, 25),(80, 15),(120, 15),(160, 15)]
  # print( ("len(hr)", len(hr)) )
  l = len(hr)
  l = l -1
  curves = []
  for i in range(len(hr)):
    # print(i)
    h = hr[l-i][0]
    r = hr[l-i][1]
    curves.append( curvePoly(h,r)  )
  # curves.append(curvePoly(0, 30)  )
  # curves.append(curvePoly(40, 25) )
  # curves.append(curvePoly(80, 15) )
  # curves.append(curvePoly(120, 15))
  # curves.append(curvePoly(160, 15))
  return curves

def createCurves():
  curves = []
  height = 180
  step = 40
  for i in range(0, height, step):
    # print(i)
    if i == 0:
      r = 30
      # print(25)
    elif i == step*1:
      r = 25
    else:
      r = 15
    curves.append(curvePoly(i,r))
    print( (i,r) )
  return curves

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


# curves = createCurves()
# curvesInner = createCurvesInner(0.8)
curves = createCurvesConst()
curvesInner = createCurvesInnerConst(0.8)
# surface = rs.AddLoftSrf(curves)
# print(len(surface))
# brepH = geom.Brep.CapPlanarHoles(surface, MTOL)
# a = brepH


p0 = geom.Point3d.Unset

curvs = []
for i in curves:
  l = rs.coercecurve(i)
  curvs.append(l)
brepH = geom.Brep.CreateFromLoft(curvs, p0, p0, 0, False)
brepH = geom.Brep.CapPlanarHoles(brepH[0], ATOL)

curvs = []
for i in curvesInner:
  l = rs.coercecurve(i)
  curvs.append(l)
brepHI = geom.Brep.CreateFromLoft(curvs, p0, p0, 0, False)
brepHI = geom.Brep.CapPlanarHoles(brepHI[0], ATOL)

brepH = geom.Brep.CreateBooleanDifference(brepH, brepHI, ATOL )[0]

t = 20
pt1 = rs.CreatePoint(0,0,0)
pt2 = rs.CreatePoint(0,0,4)
pt3 = rs.CreatePoint(t+4,t+4,t-10)
pt4 = rs.CreatePoint(t,t,t+10)
t2 = createCurveTube([pt1, pt2, pt3, pt4], 2, 0.8)
t2 = createCurveTube([pt4, pt3, pt2, pt1], 4, 0.8)
translate = geom.Transform.Translation(0,0,20)
t2.Transform(translate)
# t2 = geom.Brep.CreateBooleanDifference(t2, brepH, ATOL )[0]



# a = geom.Brep.JoinBreps([brepH, brep], ATOL)
a = geom.Brep.JoinBreps([t2, brepH], ATOL)
# a = brepH
