MakeBridge Revision-ssss
From scripting
Direct: http://ssssociety.blogspot.com/2008/09/makebridge-revision.html
Option Explicit 'Author: YukiukiH 'Date: 08/10/03 'compatibility: Rhino4 'draw normal at each division point using vector 'then create bridge structure 'first things first... '---------------------------------------------------------------------------------------------- Call Rhino.AddLayer ("splineCenter", RGB(255,0,0)) 'black Call Rhino.AddLayer ("centerPt", RGB(0,0,0)) 'black Call Rhino.AddLayer ("normalAxis", RGB(0,0,0)) 'black Call Rhino.AddLayer ("normal01", RGB(255,161,0)) 'gold Call Rhino.AddLayer ("normal02", RGB(255,127,0)) 'orange Call Rhino.AddLayer ("side01", RGB(0,0,0)) 'black Call Rhino.AddLayer ("side02", RGB(0,0,0)) 'black Call Rhino.AddLayer ("Pt", RGB(0,0,0)) 'black Call Rhino.AddLayer ("Line011", RGB(63,191,191)) 'turquoise Call Rhino.AddLayer ("Line022", RGB(63,191,191)) 'turquoise Call Rhino.AddLayer ("Line033", RGB(0,0,0)) 'black Call Rhino.AddLayer ("Line044", RGB(0,0,0)) 'black Call Rhino.AddLayer ("Line055", RGB(255,0,0)) 'red Dim strSpline strSpline = Rhino.GetObject ("select a spline curve", 4) Call Rhino.ObjectLayer (strSpline , "splineCenter") Call Rhino.LayerVisible ("splineCenter", False) Dim dblsegLength dblsegLength = 1500 '1500 Dim dblWidth dblWidth = 2000 '2000 Dim dblSideAngle dblSideAngle = 100 '100 Dim dblSideHeight dblSideHeight = 900 '900 Dim dblDiagLength dblDiagLength = dblSideHeight*Sec(dblSideAngle-90) Call Rhino.Print (dblDiagLength) '913.884 Function Sec(x) Dim dblPi dblPi = Rhino.Pi Sec = 1 / Cos(x*2*dblPi/360) End Function Call ribaBridge (strSpline, dblSegLength, dblWidth, dblSideAngle, dblDiagLength) Call Rhino.print("execution completed") '---------------------------------------------------------------------------------------------- '---------------------------------------------------------------------------------------------- Function ribaBridge (strSpline, dblSegLength, dblWidth, dblSideAngle, dblDiagLength) 'division points '--------------------------------------- Dim arrCenPts, strCenPt Dim a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z If Rhino.IsCurve(strSpline) Then 'by length segment arrCenPts = Rhino.DivideCurveLength(strSpline, dblSegLength) 'by segments 'intSegments = 130 'arrPoints = Rhino.DivideCurve(strSpline, intSegments) Call Rhino.CurrentLayer ("centerPt") For i = 0 To UBound(arrCenPts) strCenPt = Rhino.AddPoint (arrCenPts(i)) Next End If 'normal '--------------------------------------- Dim dblParam, arrTangents(), arrNormals() Dim strNormalSides01(), strNormalSides02() For i = 0 To UBound(arrCenPts) dblParam = Rhino.CurveClosestPoint(strSpline, arrCenPts(i)) ReDim Preserve arrTangents(i) arrTangents(i) = Rhino.CurveTangent(strSpline, dblParam) ReDim Preserve arrNormals(i) arrNormals(i) = Rhino.VectorCrossProduct(arrTangents(i), Array(0,0,1)) ReDim Preserve arrNormals(i) arrNormals(i) = Rhino.VectorUnitize(arrNormals(i)) ReDim Preserve arrNormals(i) arrNormals(i) = Rhino.VectorScale(arrNormals(i), dblWidth) Call Rhino.CurrentLayer ("normal01") ReDim Preserve strNormalSides01(i) strNormalSides01(i) = Rhino.addLine(arrCenPts(i), Rhino.VectorAdd(arrCenPts(i), arrNormals(i))) ReDim Preserve strNormalSides02(i) strNormalSides02(i) = Rhino.RotateObject (strNormalSides01(i), arrCenPts(i), 180, Array(0,0,1), True) Call Rhino.ObjectLayer (strNormalSides02(i), "normal02") Next 'prepare vector for 3d rotation '--------------------------------------- Dim arrAxiss(), arrSides(), dilDiagLength(), strSides01, strSides02 Dim arrSides01EdPts(), arrSides02EdPts() Dim arrSides01TpPts(), arrSides02TpPts() For i = 0 To UBound(arrCenPts) ReDim Preserve arrSides01EdPts(i) arrSides01EdPts(i) = Rhino.CurveEndPoint (strNormalSides01(i)) ReDim Preserve arrSides02EdPts(i) arrSides02EdPts(i) = Rhino.CurveEndPoint (strNormalSides02(i)) ReDim Preserve arrAxis(i) arrAxis(i) = Rhino.VectorRotate (arrNormals(i), -90, Array(0,0,1)) ReDim Preserve arrSides(i) arrSides(i) = Rhino.VectorRotate (arrNormals(i), 180-dblSideAngle, arrAxis(i)) ReDim Preserve arrSides(i) arrSides(i) = Rhino.VectorUnitize (arrSides(i)) ReDim Preserve arrSides(i) arrSides(i) = Rhino.VectorScale (arrSides(i), dblDiagLength) Call Rhino.CurrentLayer ("side01") strSides01 = Rhino.addLine (arrSides01EdPts(i), Rhino.VectorAdd(arrSides01EdPts(i), arrSides(i))) ReDim Preserve arrSides(i) arrSides(i) = Rhino.VectorRotate (arrSides(i), (dblSideAngle-90)*2, arrAxis(i)) Call Rhino.CurrentLayer ("side02") strSides02 = Rhino.addLine (arrSides02EdPts(i), Rhino.VectorAdd(arrSides02EdPts(i), arrSides(i))) 'add points ReDim Preserve arrSides01TpPts(i) arrSides01TpPts(i) = Rhino.CurveEndPoint (strSides01) ReDim Preserve arrSides02TpPts(i) arrSides02TpPts(i) = Rhino.CurveEndPoint (strSides02) Call Rhino.CurrentLayer ("Pt") Call Rhino.AddPoint (arrSides01EdPts(i)) Call Rhino.AddPoint (arrSides02EdPts(i)) Call Rhino.AddPoint (arrSides01TpPts(i)) Call Rhino.AddPoint (arrSides02TpPts(i)) Next 'create lines between (i) and (i+1) ' --------------------------------------- Dim strLine011, strLine022, strLine033, strLine044, strLine055 For i = 0 To UBound(arrCenPts)-1 Call Rhino.CurrentLayer ("Line011") strLine011 = Rhino.AddLine (arrSides01EdPts(i), arrSides01EdPts(i+1)) Call Rhino.CurrentLayer ("Line022") strLine022 = Rhino.AddLine (arrSides02EdPts(i), arrSides02EdPts(i+1)) Call Rhino.CurrentLayer ("Line033") strLine033 = Rhino.AddLine (arrSides01TpPts(i), arrSides01TpPts(i+1)) Call Rhino.CurrentLayer ("Line044") strLine044 = Rhino.AddLine (arrSides02TpPts(i), arrSides02TpPts(i+1)) Call Rhino.CurrentLayer ("Line055") strLine055 = Rhino.AddLine (arrCenPts(i), arrCenPts(i+1)) Next End Function '---------------------------------------------------------------------------------------------- '----------------------------------------------------------------------------------------------