Arch GO! 论坛
http://www.archgo.com/bbs/

建筑设计 Rhino Scripting 教程(1)
http://www.archgo.com/bbs/viewtopic.php?f=1&t=8
分页: 1 / 1

作者:  parameter [ 2009-02-21 23:58 ]
文章标题 :  建筑设计 Rhino Scripting 教程(1)

附件:
文件注释: 脚本计算结果
student-pic-1a.jpeg
student-pic-1a.jpeg [ 34.48 KiB | 被浏览 6576 次 ]


代码:
'<生成三角形屋顶>

'版权所有(C)2009 <清华大学建筑学院人居环境模拟实验室>

'本程序为自由软件;您可依据自由软件基金会所发表的GNU 通用公共授权条款,对本程
'序再次发布和/或修改;无论您依据的是本授权的第三版,或(您可选的)任一日后发
'行的版本。
'本程序是基于使用目的而加以发布,然而不负任何担保责任;亦无对适售性或特定目的
'适用性所为的默示性担保。详情请参照GNU 通用公共授权。
'您应已收到附随于本程序的GNU 通用公共授权的副本;如果没有,请参照
'   <http://www.gnu.org/licenses/>.

'基于 GPL 的软件允许商业化销售,但不允许封闭源代码。在一个软件产品中使用("使用"
'指类库引用,修改后的代码或者衍生代码)此源代码,则该软件产品必须继承 GPL 协议,
'不允许封闭源代码。

'Do man want thick road.(做人要厚道)

Option Explicit
'Script written by <王韶宁>
'Script copyrighted by <清华大学建筑学院人居环境模拟实验室>
'Script version 2009年1月7日 19:47:42

Dim dbThickness
dbThickness = 0.5
Dim hight_ratio
hight_ratio = 1.4

Call Main()
Sub Main()
   
   '请用户选择brep
   Dim strBrep
   strBrep = Rhino.GetObject("Select a brep", 24)
   If IsNull(strBrep) Then
      Exit Sub
   End If
         
   '请用户选择最大的高度
   Dim maxHeight
   maxHeight = Rhino.GetReal("Max height", 50, 1.0,100)
   If IsNull(maxHeight) Then
      Exit Sub
   End If
   
   '请用户选择左下点
   Dim arrLeftDownPt, arrRightUpPt
   arrLeftDownPt = Rhino.GetPoint("Pick Left Down Point")

   If Not IsArray(arrLeftDownPt) Then
      Exit Sub
   End If

   '请用户选择右上点
   arrRightUpPt = Rhino.GetPoint("Pick Right Up Point", arrLeftDownPt)
   If Not IsArray(arrRightUpPt) Then
      Exit Sub
   End If
   
   '请用户输入有多少列
   Dim col
   col = Rhino.GetInteger("请输入列数,(不要超过100)")
   If IsNull(col) Then
      Exit Sub
   End If

   
   '请用户输入有多少行
   Dim row
   row = Rhino.GetInteger("请输入行数,(不要超过100)")
   If IsNull(row) Then
      Exit Sub
   End If
   
   '建立2维数组
   Dim arrBasePoint(102,102)
   
   '建立底部的数组的坐标
   '
   Dim min_x, max_x, range_x, min_y, max_y, range_y
   
   range_x = abs(arrRightUpPt(0)-arrLeftDownPt(0))/col
   range_y = abs(arrRightUpPt(1)-arrLeftDownPt(1))/row
   
   
   if(arrRightUpPt(0)-arrLeftDownPt(0))<0 then
      min_x = arrRightUpPt(0)
      max_x = arrLeftDownPt(0)
   else
      max_x = arrRightUpPt(0)
      min_x = arrLeftDownPt(0)
   End If
   
   If(arrRightUpPt(1)-arrLeftDownPt(1))<0 Then
      min_y = arrRightUpPt(1)
      max_y = arrLeftDownPt(1)
   else
      max_y = arrRightUpPt(1)
      min_y = arrLeftDownPt(1)
   End If

   Dim j,k
   Call Rhino.enableredraw(False)
   For j =0 To row Step 1
      For k=0 To col Step 1
         arrBasePoint(j,k)=Array(min_x+range_x*k,min_y+ range_y*j,0)
         '   arrBasePoint(j,k)=
         
         '画线,求交得出在brep面上的交点
         Dim arrStart,arrEnd,line, arrStrIntersectionPoint
         arrStart = arrBasePoint(j,k)'Array(arrBasePoint(j,k,0),arrBasePoint(j,k,1),0)
         arrEnd = Array(arrBasePoint(j,k)(0),arrBasePoint(j,k)(1),100)
         line = Rhino.AddLine (arrStart, arrEnd)
         
         arrStrIntersectionPoint = Rhino.CurveBrepIntersect (line, strBrep)
         
     
         '取得string identifier的坐标的数字
         '(此方法太复杂了,有谁能找到更好的方法,请email: )
         Dim strDump
         strDump = Rhino.ObjectDump(arrStrIntersectionPoint(0),1)

         Dim totallen
         totallen = Len(strDump)     
         Dim txt
         txt = Left(strDump,totallen-3)
         txt = Right(txt,totallen-26)
         
         Dim arrPoint

         arrPoint = Rhino.Str2Pt(txt)
         arrBasePoint(j,k)(2) = arrPoint(2)
         
         '删除line
         Rhino.DeleteObject (line)
         '删除point
         Rhino.DeleteObject (arrStrIntersectionPoint(0))
      Next
   Next
   
   '画图
   Dim l,m
   For l =0 To (row-1) Step 1
      For m=0 To (col-1) Step 1
         '底边上的逆时针的4个点是(l,m)(l+1,m)(l+1,m+1)(j,k+1)
         '画顶面
         Call DrawPanel(l, m,arrBasePoint)
                 
      Next
   Next
   
   Call Rhino.enableredraw(True)
   
End Sub

Public Function DrawPanel(l, m,ByVal arrBasePointInput)

   '底边上的逆时针的4个点是(l,m)(l+1,m)(l+1,m+1)(l,m+1)
   '顶面上,0,1,3点组成一个面
   '求出中心点的位置:arrCenterPoint
   Dim arrCenterPoint(2)
   
   arrCenterPoint(0)=(arrBasePointInput(l,m)(0)+arrBasePointInput(l+1,m+1)(0))/2
   arrCenterPoint(1)=(arrBasePointInput(l,m)(1)+arrBasePointInput(l+1,m+1)(1))/2
   arrCenterPoint(2)= (arrBasePointInput(l,m)(2)+arrBasePointInput(l+1,m)(2)+arrBasePointInput(l+1,m+1)(2)+arrBasePointInput(l,m+1)(2))/4 * hight_ratio
     
   Call DrawThicknessTriangle(arrBasePointInput(l,m), arrBasePointInput(l+1,m), arrBasePointInput(l,m+1), dbThickness)
   Call DrawThicknessTriangle(arrBasePointInput(l+1,m), arrBasePointInput(l+1,m+1), arrCenterPoint, dbThickness)
   Call DrawThicknessTriangle(arrBasePointInput(l+1,m+1), arrBasePointInput(l,m+1), arrCenterPoint, dbThickness)
   
   
End Function

Public Function DrawThicknessTriangle(arrPointA, arrPointB,arrPointC,thinckness)

   '   Dim arrVertices(2)
   '   arrVertices(0) = arrPointA
   '   arrVertices(1) = arrPointB
   '   arrVertices(2) = arrPointC
   '   Dim arrFaceVertices(0)
   '   arrFaceVertices(0) = Array(0,1,2,2)
   '   Rhino.AddMesh arrVertices, arrFaceVertices
   
   Dim arrPoints(2), strTriangleSurface,  arrPoint, arrParam, arrNormal, line
     
   arrpoints(0) = arrPointA
   arrpoints(1) = arrPointB
   arrpoints(2) = arrPointC

   If IsArray(arrPoints) Then

      strTriangleSurface = Rhino.AddSrfPt(arrPoints)

   End If
   
   Dim vectorBA, vectorCA, vectorCross,lengthVector
   vectorBA = Rhino.VectorCreate (arrPointB, arrPointA)
   vectorCA = Rhino.VectorCreate (arrPointC, arrPointA)
   vectorCross = Rhino.VectorCrossProduct(vectorBA, vectorCA)
   
   lengthVector = Rhino.VectorLength(vectorCross)
   
   vectorCross = Rhino.VectorReverse(vectorCross)
   vectorCross = Rhino.VectorScale(vectorCross, thinckness/lengthVector)
   
   line = Rhino.AddLine( Array(0,0,0), vectorCross)
   
   Rhino.ExtrudeSurface strTriangleSurface, line
   
   '   arrPoint = Rhino.GetPointOnSurface(strTriangleSurface)
'   rhino.Print("test1")
'   arrParam = Rhino.SurfaceClosestPoint(strTriangleSurface, arrPoint)
'   rhino.Print("test2")
'   arrNormal = Rhino.SurfaceNormal(strTriangleSurface, arrParam)
'   rhino.Print("test3")
'   line = Rhino.AddLine( Array(0,0,0), arrNormal)
   

   
End Function

作者:  uuuf8 [ 2009-04-06 5:57 ]
文章标题 :  Re: 建筑设计 Rhino Scripting 教程(1)

121 strDump = Rhino.ObjectDump(arrStrIntersectionPoint(0),1)
132 arrBasePoint(j,k)(2) = arrPoint(2)

这两句是不是有点问题,望指明,谢谢

作者:  Cleven [ 2009-09-22 8:20 ]
文章标题 :  Re: 建筑设计 Rhino Scripting 教程(1)

只是单纯的膜拜一下,太牛逼了

分页: 1 / 1 当前时区为 UTC
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/