NCF参数化建筑论坛

标题: rhino.moveobject()遇到数据类型不匹配的问题 [打印本页]

作者: 熊猫无敌    时间: 2013-4-12 14:05
标题: rhino.moveobject()遇到数据类型不匹配的问题
你好,请问一下喔在rhinoscript中运行是,第35行报错,代码如下,28行之前都没问题,就是rhino.moveobject的时候出错,请问是什么原因,从rhino.GetPointCoordinates()中得到的数组是否是一维数组,还有我的现在是两个点,怎样改写成100个点

Option Explicit
'Script written by <insert name>
'Script copyrighted by <insert company name>
'Script version 2013年4月12日 10:06:53

Call Main()
Sub Main()
        Dim arrayX(),arrayY(),arrayZ()
        Dim s,i
        s = 10000
        For i = 0 To 1 Step 1
                Randomize
                ReDim Preserve arrayX(i),arrayY(i),arrayZ(i)
                arrayX(i) = rnd()*s + 1
                arrayY(i) = rnd()*s + 1
                arrayZ(i) = rnd()*s + 1        
        Next
        Dim strPt1,strPt2
        strPt1 = rhino.AddPoint(array(arrayX(0),arrayY(0),arrayZ(0)))
        strPt2 = rhino.AddPoint(array(arrayX(1),arrayY(1),arrayZ(1)))
        Dim dblSphere1,dblSphere2
        dblSphere1 = rhino.AddSphere(array(arrayX(0),arrayY(0),arrayZ(0)),1000)
        dblSphere2 = rhino.AddSphere(array(arrayX(1),arrayY(1),arrayZ(1)),1000)
        Do
                Dim dblDistance2Pt
                Dim arrPt1Coordinates,arrPt2Coordinates
                dblDistance2Pt = rhino.Distance(array(arrayX(0),arrayY(0),arrayZ(0)),array(arrayX(1),arrayY(1),arrayZ(1)))
                If  dblDistance2Pt > 5000 Then
                        If IsNull(dblDistance2Pt)Then Exit Do
                        '选择点1,点2,得到点1,点2的坐标
                        Call rhino.SelectObject(strPt1)
                        arrPt1Coordinates = rhino.GetPointCoordinates("strPt1",(rhino.SelectObject(strPt1)))
                        Call rhino.SelectObject(strPt2)
                        arrPt2Coordinates = rhino.GetPointCoordinates("strPt2",(rhino.SelectObject(strPt2)))
                        '移动点1,
                        Call rhino.MoveObject(strPt1,arrPt1Coordinates,arrPt2Coordinates)        
                        Call rhino.MoveObject(dblsphere1,arrPt1Coordinates,arrPt2Coordinates)
                        Call rhino.Sleep(1000)
                ElseIf      dblDistance2Pt < 5000 Then
                        If IsNull(dblDistance2Pt)Then Exit Do
                        '选择点1,点2,得到点1,点2的坐标
                        Call rhino.SelectObject(strPt1)
                        arrPt1Coordinates = rhino.GetPointCoordinates("strPt1",(rhino.SelectObject(strPt1)))
                        Call rhino.SelectObject(strPt2)
                        arrPt2Coordinates = rhino.GetPointCoordinates("strPt2",(rhino.SelectObject(strPt2)))
                        '移动点1,
                        Call rhino.MoveObject(strPt1,arrPt2Coordinates,arrPt1Coordinates)        
                        Call rhino.MoveObject(dblsphere1,arrPt2Coordinates,arrPt1Coordinates)
                        Call rhino.Sleep(1000)
                End If
               
        Loop  While dblDistance2Pt = 2000

End Sub
作者: ATM_KAKA    时间: 2013-4-12 15:04
楼主看不懂?指教指教......
作者: hyycq    时间: 2013-4-12 15:27
本帖最后由 hyycq 于 2013-4-12 15:57 编辑

你这段代码有两个地方错误。
1. rhino.GetPointCoordinates("strPt1",(rhino.SelectObject(strPt1)))
getpointcoordinates(str,bln)格式是这样的,你第一个给了message,后面给了个str,明显输入就是错的。如果是pre-select 的话 你就应该改成getpointcoordinates(strpt1,true)
2. 你对getpointcoordinates的输出没有正确理解。
他输出的是an array of 3D-points,你看清楚了是points,而且是个array。也就是说你一组array(x,y,z)数据。所以你应该选出你要的第一组,也就是要加上(0).
我建议你还是用pointcoordinate比较方便,他输出的是一个array,单个坐标数据。

根据你的思路我帮你吧小错误改了一下,仅供参考。你应该写个伪代码,或者说一下你这个是干什么的,否则我只能根据语法来修改,至于结果是不是你想要的,我没空仔细看你的代码了。

问题3. 你说为什么只有两个圆, 我没仔细看你的程序,但是你的问题是一看是就定了了2次循环,当然只有两个圆了!如果你要有n多个圆的话,还得再定义一个计数,用for或者其他的循环加进去,这个的话你输入多少就出来多少圆了。

以下是我修改的代码
Call Main()
Sub Main()
Dim arrayX(),arrayY(),arrayZ()
Dim s,i
s = 10000
For i = 0 To 1 Step 1
  Randomize
  ReDim Preserve arrayX(i),arrayY(i),arrayZ(i)
  arrayX(i) = rnd()*s + 1
  arrayY(i) = rnd()*s + 1
  arrayZ(i) = rnd()*s + 1        
Next
Dim strPt1,strPt2
strPt1 = rhino.AddPoint(array(arrayX(0),arrayY(0),arrayZ(0)))
strPt2 = rhino.AddPoint(array(arrayX(1),arrayY(1),arrayZ(1)))
Dim dblSphere1,dblSphere2
dblSphere1 = rhino.AddSphere(array(arrayX(0),arrayY(0),arrayZ(0)),1000)
dblSphere2 = rhino.AddSphere(array(arrayX(1),arrayY(1),arrayZ(1)),1000)
Do
  Dim dblDistance2Pt
  Dim arrPt1Coordinates,arrPt2Coordinates
  dblDistance2Pt = rhino.Distance(array(arrayX(0),arrayY(0),arrayZ(0)),array(arrayX(1),arrayY(1),arrayZ(1)))
  If  dblDistance2Pt > 5000 Then
   If IsNull(dblDistance2Pt)Then Exit Do
   '选择点1,点2,得到点1,点2的坐标
   Call rhino.SelectObject(strPt1)
   arrPt1Coordinates = rhino.GetPointCoordinates(strPt1,True)
   Call rhino.SelectObject(strPt2)
   arrPt2Coordinates = rhino.GetPointCoordinates(strPt2,True)
   '移动点1,
   Call rhino.MoveObject(strPt1,arrPt1Coordinates(0),arrPt2Coordinates(0))        
   Call rhino.MoveObject(dblsphere1,arrPt1Coordinates(0),arrPt2Coordinates(0))
   Call rhino.Sleep(1000)
  ElseIf      dblDistance2Pt < 5000 Then
   If IsNull(dblDistance2Pt)Then Exit Do
   '选择点1,点2,得到点1,点2的坐标
   Call rhino.SelectObject(strPt1)
   arrPt1Coordinates = rhino.GetPointCoordinates(strPt1,True)
   Call rhino.SelectObject(strPt2)
   arrPt2Coordinates = rhino.GetPointCoordinates(strPt2,True)
   '移动点1,
   Call rhino.MoveObject(strPt1,arrPt2Coordinates(0),arrPt1Coordinates(0))        
   Call rhino.MoveObject(dblsphere1,arrPt2Coordinates(0),arrPt1Coordinates(0))
   Call rhino.Sleep(1000)
  End If
               
Loop  While dblDistance2Pt = 2000
End Sub
作者: 熊猫无敌    时间: 2013-4-12 22:29
hyycq 发表于 2013-4-12 15:27
你这段代码有两个地方错误。
1. rhino.GetPointCoordinates("strPt1",(rhino.SelectObject(strPt1)))
get ...

非常感谢,改过之后就对了,最近开始研究rhinoscript,之前没有编程基础,搞不清好多基本概念,所以经常出错。
作者: 2256286451    时间: 2013-4-14 08:35
卧虎藏龙 到处都是高手啊




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