| 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 [ 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/ |
|