hillskysea 发表于 2009-6-2 16:23:00

[已解决]遍历数组造成原对象消失的情况还是不太懂



之前发了一个帖子:
我的源代码是:
照着老大的做法,vb提示“实时错误,要求对象”,在For i=gearObj.Count-1 to 0这一句上
后来又想了一些方法,但都没成功,没办法只能来问大侠了。。。
我的源码是:
dim gearobj as variant
Set cylinder = acadApp.ActiveDocument.ModelSpace.AddCylinder(pnt, Rf, L)
dim i as integer
For i=gearObj.Count-1 to 0                            ‘这句出错
cylinder.Boolean 0, gearObj(i)
Next

mccad 发表于 2009-6-2 17:51:00

直接把gearObj.Count写到循环中是有问题的,因为每一循环gearObj.Count值都在变。

hillskysea 发表于 2009-6-2 17:56:00


具体要怎么弄啊,还是不懂啊,恳求大侠帮帮我啊

mccad 发表于 2009-6-2 22:45:00

我的意思是先把gearObj.Count保存到一个变量中,如
ObjCount=gearObj.Count
然后用
For i=ObjCount-1 to 0

hillskysea 发表于 2009-6-3 00:23:00


objcount = gearObj.Count这句还是提示“实时错误424,要求对象”啊 5555555

雪山飞狐_lzh 发表于 2009-6-3 00:28:00

代码贴完整点

hillskysea 发表于 2009-6-3 00:32:00


Dim objcount As Integer
objcount = gearObj.Count
For i = objcount - 1 To 0
cylinder.Boolean 0, gearObj(i)
Next
前面关于齿轮生成的代码写得很乱,我把后面的整理一下贴出来

hillskysea 发表于 2009-6-3 00:37:00


      ‘前面的代码太乱了,就是先形成了单个轮齿面域regobj,然后沿着path路径拉伸(画的斜齿轮,路径弄成斜的),形成斜齿轮单个齿圈。
Dim gearR As Acad3DSolid                                                             ’geaR是单个齿圈,阵列一周后形成齿轮所有齿圈(所有齿圈就是后面的gearobj)
Set gearR = acadApp.ActiveDocument.ModelSpace.AddExtrudedSolidAlongPath(regObj(0), path)    '面域是regobj,样条曲线是path
Dim gearObj As Variant
Dim pnt(0 To 2) As Double
pnt(0) = InsertPnt(0): pnt(1) = InsertPnt(1): pnt(2) = InsertPnt(2) + L / 2            ‘L是齿宽
Dim cylinder As Object                                                                                 ’cylinder是齿根圆圆柱,下面与gearobj进行交布尔运算
gearObj = gearR.ArrayPolar(gearZ, 6.28, InsertPnt)                                    'gearz是齿数
Set cylinder = acadApp.ActiveDocument.ModelSpace.AddCylinder(pnt, Rf, L)
Dim objcount As Integer                     
objcount = gearObj.Count                              
For i = objcount - 1 To 0                                    ’这里会报错,实时错误,要求对象
cylinder.Boolean 0, gearObj(i)
Next
‘我用for i=0 to ubound(gearobj)就会有一个轮齿未进行布尔运算,我齿数设为30时,感觉ubound(gearobj)应该是29(包括0),但是我逐行调试程序时ubound(gearobj)显示为28,搞不懂是怎么回事????

mccad 发表于 2009-6-3 06:22:00

不好意思,有误。
1. objcount应该用 objcount=ubound(gearobj)
2.应该是 for i=0 to objcount step -1
3.阵列后的对象数组中并不包含原对象,所以循环并集完成后,需要把原对象也并集一次。
4.原来你所用的for each obj in gearobj 是没有问题的,一样可以进行循环。
另外,以后贴代码时,最好象这一次一样,贴全,这样找问题容易一些。

hillskysea 发表于 2009-6-3 09:03:00

搞定了!我理解了老大说的第三点的意思了,第一次先把gearR(原对象)和cylinder进行交运算,后面在和数组对象进行交运算,成功解决了这个问题!代码都在这:
Dim gearR As Acad3DSolid                                                             ’geaR是单个齿圈,阵列一周后形成齿轮所有齿圈(所有齿圈就是后面的gearobj)
Set gearR = acadApp.ActiveDocument.ModelSpace.AddExtrudedSolidAlongPath(regObj(0), path)    '面域是regobj,样条曲线是path
Dim gearObj As Variant
Dim pnt(0 To 2) As Double
pnt(0) = InsertPnt(0): pnt(1) = InsertPnt(1): pnt(2) = InsertPnt(2) + L / 2            ‘L是齿宽
Dim cylinder As Object                                                                                 ’cylinder是齿根圆圆柱,下面与gearobj进行交布尔运算
gearObj = gearR.ArrayPolar(gearZ, 6.28, InsertPnt)                                    'gearz是齿数
Set cylinder = acadApp.ActiveDocument.ModelSpace.AddCylinder(pnt, Rf, L)
cylinder.boolean 0,gearR                        '先和原对象进行交运算
Dim obj
For Each obj In gearObj
cylinder.Boolean acUnion, obj
Next               
                        
两个老大真是我心中的神啊!!感激不尽!!
页: [1]
查看完整版本: [已解决]遍历数组造成原对象消失的情况还是不太懂