[已解决]遍历数组造成原对象消失的情况还是不太懂
之前发了一个帖子:
我的源代码是:
照着老大的做法,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
直接把gearObj.Count写到循环中是有问题的,因为每一循环gearObj.Count值都在变。
具体要怎么弄啊,还是不懂啊,恳求大侠帮帮我啊 我的意思是先把gearObj.Count保存到一个变量中,如
ObjCount=gearObj.Count
然后用
For i=ObjCount-1 to 0
objcount = gearObj.Count这句还是提示“实时错误424,要求对象”啊 5555555
代码贴完整点
Dim objcount As Integer
objcount = gearObj.Count
For i = objcount - 1 To 0
cylinder.Boolean 0, gearObj(i)
Next
前面关于齿轮生成的代码写得很乱,我把后面的整理一下贴出来
‘前面的代码太乱了,就是先形成了单个轮齿面域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,搞不懂是怎么回事????
不好意思,有误。
1. objcount应该用 objcount=ubound(gearobj)
2.应该是 for i=0 to objcount step -1
3.阵列后的对象数组中并不包含原对象,所以循环并集完成后,需要把原对象也并集一次。
4.原来你所用的for each obj in gearobj 是没有问题的,一样可以进行循环。
另外,以后贴代码时,最好象这一次一样,贴全,这样找问题容易一些。
搞定了!我理解了老大说的第三点的意思了,第一次先把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]