Advertisement
Guest User

Untitled

a guest
May 12th, 2020
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Option Explicit
  2. Const pi As Double = 3.14159265358979
  3. Public Sub z6(r1 As Double, r2 As Double, r3 As Double, h As Double, n As Integer)
  4.     Dim pline1 As AcadLWPolyline, pline2 As AcadLWPolyline
  5.     Dim solid1 As Acad3DSolid, solid2 As Acad3DSolid
  6.     Set pline1 = plineToExtrude(r2, r3, n)
  7.     Set pline2 = plineToRevolve(r1, r2, r3, h)
  8.     Set solid1 = Extrude0(pline1, h)
  9.     Set solid2 = Revolve0(pline2, Array(0, 1, 0), -pi / 2, Array(0, 0, 1), 2 * pi)
  10.     Call solid1.Boolean(acIntersection, solid2)
  11.     solid1.Update
  12.    
  13. End Sub
  14. Private Function plineToExtrude(r2 As Double, r3 As Double, n As Integer) As AcadLWPolyline
  15.     Dim i As Integer, outer_angle As Double, inner_angle As Double, vertices() As Double
  16.     ReDim vertices(6 * n - 1)
  17.     For i = 0 To 2 * n - 1
  18.        outer_angle = pi / n * (i - 0.5)
  19.         inner_angle = pi / n * (i - 1)
  20.         If i Mod 2 = 0 Then vertices(3 * i) = r2 * Cos(inner_angle):  vertices(3 * i + 1) = r2 * Sin(inner_angle): vertices(3 * i + 2) = r3 * Cos(outer_angle): vertices(3 * i + 3) = r3 * Sin(outer_angle)
  21.         If i Mod 2 <> 0 Then vertices(3 * i + 1) = r3 * Cos(outer_angle): vertices(3 * i + 2) = r3 * Sin(outer_angle)
  22.     Next
  23.     Set plineToExtrude = ThisDrawing.ModelSpace.AddLightWeightPolyline(vertices)
  24.     plineToExtrude.Closed = True
  25.     Dim bulge As Double
  26.     bulge = CalcBulge(plineToExtrude.Coordinate(0), plineToExtrude.Coordinate(1), r3)
  27.     For i = 0 To 3 * n - 1
  28.         If i Mod 3 = 1 Then Call plineToExtrude.SetBulge(i, bulge)
  29.     Next
  30.     plineToExtrude.Update
  31. End Function
  32.    
  33. Private Function plineToRevolve(r1 As Double, r2 As Double, r3 As Double, h As Double) As AcadLWPolyline
  34.     Dim vertices() As Double
  35.     vertices = VerticesFromParamArray(0, r1, h, r1, h, r2 - h / 3, 2 * h / 3, r2, 2 * h / 3, r3 - h / 3, h, r3, 2 * h / 3, r3, h / 3, r3 - h / 3, h / 3, r2, 0, r2 - h / 3)
  36.     Set plineToRevolve = ThisDrawing.ModelSpace.AddLightWeightPolyline(vertices)
  37.     plineToRevolve.Closed = True
  38.    
  39.     Dim bulge As Double, d As Double
  40.     d = Sqr((2 * h / 3) * (2 * h / 3)) / 2
  41.     bulge = (2 * h / 3 - Sqr((2 * h / 3) * (2 * h / 3) - d * d)) / d
  42.    
  43.     Dim i As Integer
  44.     For i = 0 To 8
  45.     If i Mod 2 = 0 And i Mod 2 <> 0 Then Call plineToRevolve.SetBulge(i, -bulge)
  46.     Next
  47.     plineToRevolve.Update
  48.    
  49. End Function
  50. Private Function CalcBulge(p1 As Variant, p2 As Variant, r As Double) As Double
  51.     Dim d As Double
  52.     d = Sqr((p2(0) - p1(0)) * (p2(0) - p1(0)) + (p2(1) - p1(1)) * (p2(1) - p1(1))) / 2
  53.     CalcBulge = (r - Sqr(r * r - d * d)) / d
  54. End Function
  55. Private Function VerticesFromParamArray(ParamArray input() As Variant) As Double()
  56.     ReDim output(UBound(ulaz)) As Double: Dim i As Integer
  57.     For i = 0 To UBound(ulaz)
  58.         output(i) = input(i)
  59.     Next
  60.     VerticesFromParamArray = output
  61. End Function
  62. Private Function Extrude0(ent As AcadEntity, h As Double) As Acad3DSolid
  63.     Dim rgn As AcadRegion
  64.     Set rgn = RegionFromEntity(ent)
  65.     Set Extrude0 = ThisDrawing.ModelSpace.AddExtrudedSolid(rgn, h, 0)
  66.     Extrude0.Update
  67.     rgn.Delete: ent.Delete
  68. End Function
  69. Private Function Revolve0(ent As AcadEntity, v1 As Variant, a1 As Double, v2 As Variant, _
  70.                           a2 As Double) As Acad3DSolid
  71.     Dim p1(2) As Double, p2(2) As Double, rgn As AcadRegion
  72.     Set rgn = RegionFromEntity(ent)
  73.     p2(0) = v1(0): p2(1) = v1(1): p2(2) = v1(2)
  74.     Call rgn.Rotate3D(p1, p2, a1)
  75.     p2(0) = v2(0): p2(1) = v2(1): p2(2) = v2(2)
  76.     Set Revolve0 = ThisDrawing.ModelSpace.AddRevolvedSolid(rgn, p1, p2, a2)
  77.     Revolve0.Update
  78.     rgn.Delete: ent.Delete
  79. End Function
  80. Private Function RegionFromEntity(ent As AcadEntity) As AcadRegion
  81.     Dim ents(0) As AcadEntity: Set ents(0) = ent
  82.     Set RegionFromEntity = ThisDrawing.ModelSpace.AddRegion(ents)(0)
  83. End Function
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement