明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1864|回复: 9

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

[复制链接]
发表于 2009-6-2 16:23:00 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2009-6-3 9:04:59 编辑

之前发了一个帖子:http://bbs.mjtd.com/forum.php?mod=viewthread&tid=75425&replyID=&skin=1

我的源代码是:

照着老大的做法,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


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2009-6-2 17:51:00 | 显示全部楼层
直接把gearObj.Count写到循环中是有问题的,因为每一循环gearObj.Count值都在变。
 楼主| 发表于 2009-6-2 17:56:00 | 显示全部楼层
mccad发表于2009-6-2 17:51:00直接把gearObj.Count写到循环中是有问题的,因为每一循环gearObj.Count值都在变。

具体要怎么弄啊,还是不懂啊,恳求大侠帮帮我啊
发表于 2009-6-2 22:45:00 | 显示全部楼层

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

 楼主| 发表于 2009-6-3 00:23:00 | 显示全部楼层
mccad发表于2009-6-2 22:45:00我的意思是先把gearObj.Count保存到一个变量中,如ObjCount=gearObj.Count然后用For i=ObjCount-1 to 0

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

发表于 2009-6-3 00:28:00 | 显示全部楼层

代码贴完整点

 楼主| 发表于 2009-6-3 00:32:00 | 显示全部楼层
本帖最后由 作者 于 2009-6-3 0:54:17 编辑

Dim objcount As Integer
objcount = gearObj.Count
For i = objcount - 1 To 0
cylinder.Boolean 0, gearObj(i)
Next

前面关于齿轮生成的代码写得很乱,我把后面的整理一下贴出来

 楼主| 发表于 2009-6-3 00:37:00 | 显示全部楼层
本帖最后由 作者 于 2009-6-3 1:02:29 编辑

     ‘前面的代码太乱了,就是先形成了单个轮齿面域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,搞不懂是怎么回事????

发表于 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 是没有问题的,一样可以进行循环。

另外,以后贴代码时,最好象这一次一样,贴全,这样找问题容易一些。

 楼主| 发表于 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                
                          

两个老大真是我心中的神啊!!感激不尽!!

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-26 02:49 , Processed in 0.185705 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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