NCF参数化建筑论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 36648|回复: 28
打印 上一主题 下一主题

[个人作品] 曲线网架

[复制链接]
跳转到指定楼层
1m
发表于 2011-1-9 13:36:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 licml 于 2011-1-10 11:54 编辑

之前看到这里有个代码是直线段网架,一直想做个贴着曲面的网架,今天终于做出来了。但是中间有个地方需要改进(见蓝色部分),还望高人指点
Option Explicit
'Script written by <insert name>
'Script copyrighted by <insert company name>
'Script version 2011年1月7日 22:50:05

Call Main()
Sub Main()

Dim strSrf,UDomain,VDomain,dU,dV,m,n,i,j
m=rhino.GetReal("input u segment",10)
n=rhino.GetReal("input v segment",10)
strSrf=rhino.GetObject("select a surface:")
UDomain=rhino.SurfaceDomain(strSrf,0)
VDomain=rhino.SurfaceDomain(strSrf,1)
dU=(UDomain(1)-UDomain(0))/m
dV=(VDomain(1)-VDomain(0))/n

Dim Pt,strCur,strStar,arrPlane,strPara,Cir
Dim puv():ReDim puv(m,n)
Dim p():ReDim p((m+1)*(n+1)-1)
For i = 0 To m
    For j = 0 To n
        puv(i,j)=array(dU*i,dV*j)
        p(i*(m+1)+j)=Rhino.EvaluateSurface (strSrf, puv(i,j))
        p(j)=p(i*(m+1)+j)
    Next
    strCur=rhino.AddInterpCrvOnSrf (strSrf,array(p(0),p(1),p(2),p(3),p(4),p(5),p(6),p(7),p(8),p(9),p(10)))
                '这里,怎么把p写进一个array里面,记得之前看过有只增加数据,不覆盖原数据的办法,但找不到在哪看的了
    strStar=rhino.CurveStartPoint(strCur)
    strPara=rhino.CurveClosestPoint(strCur,strStar)
    arrPlane=rhino.CurvePerpFrame(strCur,strPara)
    Cir=rhino.AddCircle(arrPlane,0.2)
    rhino.addsweep1 strCur,Cir

Next

For j=0 To n
    For i=0 to m
        puv(i,j)=array(dU*i,dV*j)
        p(i*(m+1)+j)=Rhino.EvaluateSurface (strSrf, puv(i,j))
        p(i)=p(i*(m+1)+j)
    Next
    strCur=rhino.AddInterpCrvOnSrf (strSrf,array(p(0),p(1),p(2),p(3),p(4),p(5),p(6),p(7),p(8),p(9),p(10)))
    strStar=rhino.CurveStartPoint(strCur)
    strPara=rhino.CurveClosestPoint(strCur,strStar)
    arrPlane=rhino.CurvePerpFrame(strCur,strPara)
    Cir=rhino.AddCircle(arrPlane,0.2)
    rhino.addsweep1 strCur,Cir
Next
End Sub


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享
2m
发表于 2011-1-9 16:58:11 | 只看该作者
不错啊,好人{:3_56:}
3m
 楼主| 发表于 2011-1-9 20:15:46 | 只看该作者
蓝色部分是纯手工录入,还望被指点,怎么做比较好,呵呵呵
4m
 楼主| 发表于 2011-1-10 09:37:09 | 只看该作者
to m,粘贴出了问题,我把rvb贴上来 1101_curveOnSrf_temp.rvb (1.51 KB, 下载次数: 29)
5m
发表于 2011-1-10 15:24:28 | 只看该作者
redim preserve p(10)
这样p就只保留从0到10的11个值,后面的都没了。
6m
 楼主| 发表于 2011-1-10 20:31:30 | 只看该作者
可我已经定义一个ReDim p((m+1)*(n+1)-1),我改怎么写:
For i = 0 To m
                ReDim Preserve p(n)
                For j = 0 To n
                        puv(i,j)=array(dU*i,dV*j)
                        p(i*(m+1)+j)=Rhino.EvaluateSurface (strSrf, puv(i,j))
                        p(j)=p(i*(m+1)+j)
                        p(n)=p(j)
                Next
30                strCur=rhino.AddInterpCrvOnSrf (strSrf,array(p(n)))
上面写的,老说我30行array required
对于array,我还真有点糊涂
7m
发表于 2011-1-10 20:53:38 | 只看该作者
谢谢分享!!!
8m
 楼主| 发表于 2011-1-10 21:53:38 | 只看该作者
搞定了,搞定了!用一个循环给数组数值,就可以了

Option Explicit
'Script written by <insert name>
'Script copyrighted by <insert company name>
'Script version 2011年1月7日 22:50:05

Call Main()
Sub Main()
        Dim strSrf,UDomain,VDomain,dU,dV,m,n,i,j
        m=rhino.GetReal("input u segment",10)
        n=rhino.GetReal("input v segment",10)
        strSrf=rhino.GetObject("select a surface:")
       
        UDomain=rhino.SurfaceDomain(strSrf,0)
        VDomain=rhino.SurfaceDomain(strSrf,1)
        dU=(UDomain(1)-UDomain(0))/m
        dV=(VDomain(1)-VDomain(0))/n
       
        Dim Pt,strCur,strStar,arrPlane,strPara,Cir
        Dim puv():ReDim puv(m,n)
        Dim p():ReDim p((m+1)*(n+1)-1)
        Dim arr1():ReDim arr1(n)
        For i = 0 To m
                For j = 0 To n
                        puv(i,j)=array(dU*i,dV*j)
                        p(i*(m+1)+j)=Rhino.EvaluateSurface (strSrf, puv(i,j))
                        p(j)=p(i*(m+1)+j)
                        arr1(j)=p(j)
                Next
                strCur=rhino.AddInterpCrvOnSrf (strSrf,arr1)
                strStar=rhino.CurveStartPoint(strCur)
                strPara=rhino.CurveClosestPoint(strCur,strStar)
                arrPlane=rhino.CurvePerpFrame(strCur,strPara)
                Cir=rhino.AddCircle(arrPlane,0.2)
                rhino.addsweep1 strCur,Cir
        Next
       
        Erase arr1
       
        Dim arr2():ReDim arr2(m)
        For j=0 To n
                For i=0 To m
                        puv(i,j)=array(dU*i,dV*j)
                        p(i*(m+1)+j)=Rhino.EvaluateSurface (strSrf, puv(i,j))
                        p(i)=p(i*(m+1)+j)
                        arr2(i)=p(i)
                Next
                strCur=rhino.AddInterpCrvOnSrf (strSrf,arr2)
                strStar=rhino.CurveStartPoint(strCur)
                strPara=rhino.CurveClosestPoint(strCur,strStar)
                arrPlane=rhino.CurvePerpFrame(strCur,strPara)
                Cir=rhino.AddCircle(arrPlane,0.2)
                rhino.addsweep1 strCur,Cir
        Next
        Erase arr2

End Sub
9m
发表于 2011-1-14 08:42:03 | 只看该作者
支持斑竹!!!!!!!!!!!
10m
发表于 2011-1-28 04:52:54 | 只看该作者
不错不错 支持一下!
11m
发表于 2011-4-28 17:00:52 | 只看该作者
quite good!
12m
发表于 2011-7-19 21:55:05 | 只看该作者
想看看!!!
13m
发表于 2011-7-29 12:24:13 | 只看该作者
谢谢,不过图片真的水了点。。。
14m
发表于 2011-11-5 22:02:58 | 只看该作者
学习了~~~~~~~
15m
发表于 2011-11-7 14:34:58 | 只看该作者
谢谢了学习了。
16m
发表于 2011-11-19 11:02:29 | 只看该作者
hao....................
17m
发表于 2012-2-18 16:19:06 | 只看该作者
好好,不错
18m
发表于 2012-3-10 18:30:35 | 只看该作者
sjfgsakjfhsakjhlfsdjfslkfjs
19m
发表于 2012-3-13 14:03:42 | 只看该作者
向楼主学习,准备精细学习VB脚本,网架一般做双层的
20m
发表于 2012-3-15 11:37:34 | 只看该作者
谢谢学习~~

小黑屋|手机版|NCF参数化建筑论坛 ( 浙ICP备2020044100号-2 )    辽公网安备21021102000973号

GMT+8, 2024-11-24 08:54 , Processed in 0.074633 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表