NCF参数化建筑论坛

标题: 寻找错误——用script的command方法的参数带入错误 [打印本页]

作者: woodwest    时间: 2014-6-28 18:55
标题: 寻找错误——用script的command方法的参数带入错误
本人新学rhinoscript,想编写一段script,用于将“在曲面上偏移曲线”,原配的命令每次只能偏移一根曲线,所以我想通过自动循环,做到可以自动偏移,将第一次偏移生成的曲线变成下一次的起始曲线。这个功能在rhino5当中已经有了,但是我尝试在4的script中把它写出来时区老是出错。
高手帮我看看:

Option Explicit
Call moretimeoffside_Main()

Sub moretimeoffside_Main()
        Dim strSrf, strcur
        strcur = rhino.GetObject("sel the curve on surface",4)
        strSrf =  Rhino.GetObject("sel the surface" ,8)
        rhino.Command "_SelNone"
        rhino.Command        "_OffsetCrvOnSrf " & strcur &" " & strSrf &" " &  "100 _enter"
        Do
        strcur = rhino.LastCreatedObjects
        rhino.Command "_SelNone"
         rhino.Command        "_OffsetCrvOnSrf " & strcur &" " & strSrf &" " &  "100 _enter"
        Loop
End Sub

本想使用:rhino.OffsetCrvOnSrf  之类的语句来直接调用,但这个4.0版本没有这个命令。
就想用最原始的script来呼叫command。
运行后,错误表现在:传送到command指令里的表示曲线的名字为: 03394740-94a5-4eec-a7e6-de18a98d4480,不能被识别,就会循环出错。
我想应该是:
strcur = rhino.GetObject("sel the curve on surface",4)
这里出错了,应该是数据类型的错误。
我尝试改用 strcur = Rhino.SelectObject的写法,但是不行,会一闪而过,看不清楚过程。

我猜应该是比较简单的script,但我就是被卡在这里下不去,求各位大师帮忙看看。



作者: 月之眼    时间: 2014-6-28 20:38
换个rhino5呗
作者: woodwest    时间: 2014-6-29 18:44
问题搞了我一天,还未解决
如何将此次生成的结果曲线,作为下一步偏移的起始曲线?

虽然我找到了一个函数Rhino.offsetcurveonsurface
可以直接运行一次“曲线在曲面上的偏移”,生成了第一根偏移后的曲线,
但是后续的循环过程就进行不下去了,出错。如下图:
[attach]42143[/attach]我用vrhino.print vartype(new_strCurve)的方式检查 new_strCurve = Rhino.offsetcurveonsurface ( strCurve, strSurface, dblDistance) 生成的new_strCurve 的数据类型,得到的数字是8204,
而弹出的错误对话框中说是要一个string,这个就是关键问题,如何从“8204”的那种类型转化到string?

简单地说:
如何将此次生成的结果曲线,作为下一步偏移的起始曲线?

Option Explicit
Call chm_OffsetCurveOnSurface()

Sub chm_OffsetCurveOnSurface
        Const rhCurve = 4
        Const rhSurface = 8
        Dim strCurve, strSurface, arrPoint, dblDistance, arrParameter ,x, arrObjects, new_strCurve, arrDomain

        dblDistance = 100    '偏移距离
        strCurve = Rhino.GetObject("Select curve on a surface", rhCurve)
        If IsNull(strCurve) Then Exit Sub
       
        strSurface = Rhino.GetObject("Select base surface", rhSurface)
        If IsNull(strCurve) Then Exit Sub
       
        new_strCurve = Rhino.offsetcurveonsurface ( strCurve, strSurface, dblDistance)
        If IsNull(new_strCurve) Then Exit Sub

        For x = 1 To 6 Step 1
                new_strCurve = Rhino.offsetcurveonsurface ( new_strCurve  , strSurface, dblDistance)
                If IsNull(new_strCurve) Then Exit Sub
        Next
       
End Sub


作者: 月之眼    时间: 2014-6-30 09:55
#coding=utf-8
import rhinoscriptsyntax as rs
sur=rs.GetObject("选择曲面",8)
curve=rs.GetObject("选着曲线",4)
num=rs.GetReal("输入偏移的条数")
dis=rs.GetReal("输入偏移的距离")
for i in rs.frange(dis,dis*num,dis):
    rs.OffsetCurveOnSurface(curve,sur,i)
以前刚学python的时候写过一个,比较挫,很多情况没有判定,楼主将就看吧
作者: 月之眼    时间: 2014-6-30 10:05
#coding=utf-8
a=[]
import rhinoscriptsyntax as rs
sur=rs.GetObject("选择曲面",8)
curve=rs.GetObject("选着曲线",4)
num=rs.GetReal("输入偏移的条数")
dis=rs.GetReal("输入偏移的距离")
a.append(curve)
for j in range(int(num)) :
    cv=rs.OffsetCurveOnSurface(a[-1],sur,dis)
    a.append(cv)
这个是把生成的曲线当成下一次偏移的曲线,先把曲线放到一个列表里,然后去LIST最后一个曲线当偏移的曲线
作者: 月之眼    时间: 2014-6-30 10:05
月之眼 发表于 2014-6-30 09:55
#coding=utf-8
import rhinoscriptsyntax as rs
sur=rs.GetObject("选择曲面",8)

这个是用的距离循环
作者: woodwest    时间: 2014-7-1 11:44
非常感谢月之眼前辈的指教!
我现在还在用rhinoscript在写这一段程序,还是没有调出来。
不过我还会继续试验下去。
只是我产生了一个疑问:
rhinoscript的数据类型太繁杂,变量的类型不够灵活。
我很多年前尝试运用VBA在AutoCAD中编程,极其吃力,后来还是改用lisp。
只有在Excel里面VBA还算比较好用。
现在在Rhino,大家都在用GH,那么是不是说明:script已经没有人理睬了呢?
我看月之眼前辈的代码,使用的是python,我感觉python更像是lisp,灵活,还居然可以变成GH的一颗电池,实在太牛x了。
所以我对从头学习rhinoscript产生了怀疑。我是否可以放弃rhinoscript,直奔python而去,还是先练习一段时间rhinoscript?

作者: 月之眼    时间: 2014-7-1 13:57
woodwest 发表于 2014-7-1 11:44
非常感谢月之眼前辈的指教!
我现在还在用rhinoscript在写这一段程序,还是没有调出来。
不过我还会继续试 ...

我感觉都差不多的啊,,以前看过一段时间rhinoscript,最后感觉python比较简洁风格不错就转到python了。GH是可视化编程也差不多,不过对循环不咋在行还是没有代码好,适合自己的就是最好的啦。rhino5自带了猴子插件啊,感觉方便些,
作者: 月之眼    时间: 2014-7-1 14:00
woodwest 发表于 2014-7-1 11:44
非常感谢月之眼前辈的指教!
我现在还在用rhinoscript在写这一段程序,还是没有调出来。
不过我还会继续试 ...

GH是可视化编程,大大降低了入门参数化的门槛啊,很多人不用和代码打交道就可以做出比较复杂的造型了,我感觉如果想把这条路走的更长的话,学习一两门语言还是很有必要的
作者: woodwest    时间: 2014-7-2 11:04
其实这算是我第一次用rhinoscript写程序,基本没有看书,就是靠以前学VB的记忆,再加上网络上下来的只言片语,再根据帮助文件来学着写,摸石头过河,还都是英文的,很吃力,到今天第5天了,还是很有收获。
那个问题已经找到两种方法解决了,就是使用FirstObject属性来定义最后生成的那条曲线。或者是new_strCurve改写为:new_strCurve(0),一搞通了,居然就那么简单!

继续探索中!
作者: 熊猫无敌    时间: 2014-7-6 01:55
楼主还是用python吧,既然有vb基础就没必要在写rhinoscript了,vb是面向过程的,而python是面向对象的,差别很大呀,我之前就是用vb写的,涉及到循环和迭代问题vb就有点不给力呀(这是面向过程语言的通病吧),python更简洁,代码更灵活,而且更多的软件都开始支持python了(比如说maya,除了mel,现在也支持python编程了),so,推荐python
作者: 横穿马路    时间: 2016-7-8 10:32
谢谢分享,辛苦了。
作者: DONNA    时间: 2016-7-10 23:51
看到这些,就知道好厉害了,学些了




欢迎光临 NCF参数化建筑论坛 (http://ncf-china.com/) Powered by Discuz! X3.2