明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 926|回复: 8

[VBA群] 2013-08-22 明经AutoCAD.VBA编程(45054712) 群聊记录:for each ent in set .... ent.delete ne

 关闭 [复制链接]
发表于 2013-8-22 08:52:45 | 显示全部楼层 |阅读模式
无痕/ws 08:52:45
for each ent in set
....
ent.delete
next
选择集中查找图元,并将符合条件的删除,但发现执行到next时会出错,是不是选择集被改变的原因?
如何处理
[ygy7170229][ygy7170229]one 08:53:39
选择集的集合大小变了
不用foreach
[ygy7170229][ygy7170229]one 08:54:23
for i = set.count-1 to 0 step -1
next i
无痕/ws 08:55:53
哦,然后,对找到的图元用什么方式删除,删除后set.count也同时在变吧
[ygy7170229][ygy7170229]one 08:56:32
你可以把set.count先付给一个值啊
[mccad]mccad 09:03:53
对,反向删除则可
 楼主| 发表于 2013-8-22 09:17:24 | 显示全部楼层
无痕/ws 09:17:24
for i = set.count-1 to 0 step -1
...
set(i).delete
set.count=set.count-1
next i
这个样子?
[ygy7170229][ygy7170229]one 09:18:03
不是的
[ygy7170229][ygy7170229]one 09:18:48
x = set.count
for i = x to 0 step -1
...
set(i).delete
next i
[VB&.NET]ppyyff 09:18:57
还要有一个循环吧set(i)=set(i+1) 以后的复制到 I 然后-1
还要有一个循环吧set(i)=set(i+1) 以后,然后-1
[ygy7170229][ygy7170229]one 09:20:05
不需要
[VB&.NET]ppyyff 09:21:07
没对选择集进行操作过
一般循环都是这样的
[mccad]mccad 09:22:34
X应该是x=set.count-1
 楼主| 发表于 2013-8-22 09:35:05 | 显示全部楼层
无痕/ws 09:35:05
x = set.count
for i = x to 0 step -1
...
set(i).delete
x=x-1
next i
但这可能会存在一个问题
例如set(3)被删除,原集合中的set(4),是不是会变成set(3)呢?
[mccad]mccad 09:38:44
x=set.count-1
for i=x to 0 step -1
里面就不要再出现x=x-1了
[mccad]mccad 09:39:40
而删除是从选择集的后面向前面删除,所以不会出现你说的先删除(3)再删除(4)的问题
无痕/ws 09:40:34
问题在于set(i).delete后,x就不等于set.count了,会提示错误
我是在set中查找符合条件的删除
所以并不是自后到前逐一删除。
无痕/ws 09:42:47
是不是得换种方法,建个文本数组,把查找符合条件的图元的句柄记录到这个数组,最后做个循环,逐一将这些句柄的图元删掉
[mccad]mccad 09:43:34
当然最好,但这种删除方法从后向前删除,就算有选择性的删除也不应该会出现错误的
X不等于set.count也没有关系
因为是从后向前,只要x值不会超过选择集的总数,就不会出错
[mccad]mccad 09:45:05
选择集会随着删除而变化,但这种循环机制并不是象foreach那样直接针对选择集
而只是每次循环只针对选择集中的特定图元进行操作
[VB&.NET]ppyyff 09:46:26
想起来了,我是用无痕方法实现的
无痕/ws 09:46:47
嗯,谢谢大家的建议,主要是我的图元筛选有二个循环,第一个遍历set,与第二个遍历set进行一一比较,符合条件的删除,所以前面方法还会存在问题
[ygy7170229][ygy7170229]one 09:48:40
还是不懂无痕你的问题,你描述的太少
[ygy7170229][ygy7170229]one 09:49:59
因为在删除图元的时候选择集的个数和索引都会发生混乱,从后往前遍历可以避免这个问题
无痕/ws 09:50:24
其实我的目的是去重,在屏幕上选择一组图元,过滤PL线,然后比较这些线的坐标,若是重合的,删除
[ygy7170229][ygy7170229]one 09:51:04
用两个选择集啊,用一个选择集不好弄
除非你记录handle
遍历两次,第一次比较第二次删除
无痕/ws 09:52:19
嗯,现在就是卡在第一个查找出来后,删除。。之后就报错了。哈
[ygy7170229][ygy7170229]one 09:52:57
这是必然的,你这样的逻辑本来就不对
轻舞飞扬 09:53:19
你这提取问题的水平也够可以的。第二个问题这种情况都能提取出第一个问题
[ygy7170229][ygy7170229]one 09:53:58
轻舞飞扬 09:56:00
for step-1
     for each
         比较
         delete
         exit for
   next
next
[ygy7170229][ygy7170229]one 09:56:36
无痕/ws 09:58:49
for each
         比较
         delete
         exit for
   next
会有问题,delete后的选择集不再是原来的
轻舞飞扬 09:59:52
不用就算
无痕/ws 10:01:17
还是谢谢提出的方法
在路上26 10:02:20
我在用常青藤的时候,发现,打印的时候,如果有100多个图框,为封闭的多段线,(在20000个实体的情况下),他能很快的识别出来,我自己做,用从数据库中循环筛选的情况下,很慢啊,它用的什么方法啊,能很快筛选出封闭多段线
[ygy7170229][ygy7170229]one 10:03:36
图层,你把这些图框设置成单独图层
在路上26 10:05:35
我说的情况,是100多个图框,不再同一个图层
无痕/ws 10:05:45
同感,在选择集中刷选重合的多段线,一一比较顶点,重合线还存在起始点不同,方向不同的情况
无痕/ws 10:06:18
感觉很复杂,编了个VBA,超长呀
小学生 10:06:35
用过滤选择
轻舞飞扬 10:08:08
总有一致的特性供选择确定。颜色、图层、线型、线宽等等,看看有没有xdata
在路上26 10:08:19
第一步:过滤出多段线
第二部:挑选出封闭多段线,面积为A的
是这个步骤吗?
我也这么做过,感觉还是慢,不如他的快
[VB&.NET]ppyyff 10:09:46
现在计算机速度这快慢点就慢点吧
无痕/ws 10:10:13
我想这可能是查找方法的不同
轻舞飞扬 10:10:45
不编译的程序比编译程序慢
无痕/ws 10:10:52
我们一般是遍历,但软件公司好的是采用二分法
当然那个查找思路复杂得多
轻舞飞扬 10:11:12
二分个屁
在路上26 10:11:22
怎么二分?又不是数字
无痕/ws 10:12:47
将属性给数组再进行查,或用字典
在路上26 10:19:32
没明白
[ygy7170229][ygy7170229]one 10:19:58
方法很多,就看效率
在路上26 10:20:29
求高人指教
 楼主| 发表于 2013-8-22 11:01:55 | 显示全部楼层
[VB&.NET]ppyyff 11:01:55
硬件发展了无所谓了,比如说以前有限元算法大家都不咋用,就是因为运算量大,现在大家都用了,管他快慢,只要出结果 ,还在乎哪几秒钟时间吗
 楼主| 发表于 2013-8-22 11:17:01 | 显示全部楼层
[mccad]mccad 11:17:01
当然,你用同一个选择集来做二次循环,而循环中又存在着删除,你能确保第一循环OK,无法确保外循环不出问题,因为你的外循环还是在用没有经过删除的数量在做计算
所以,你需要做的是将要删除的图元标记出来,统一删除
[mccad]mccad 11:20:33
64位下的VBA彻底完蛋,原来调用AutoCAD颜色对话框的代码无法运行
Private Declare Function acedSetColorDialog Lib _
   "acad.exe" (color As Long, ByVal bAllowMetaColor _
   As Boolean, ByVal nCurLayerColor As Long) As Boolean
Public Function ChooseColor(ByVal lngInitClr As Long, _
        ByVal blnMetaColor As Boolean, _
        ByVal lngCurClr As Long) As Long

    ChooseColor = -1

    On Error Resume Next

    If acedSetColorDialog(lngInitClr, blnMetaColor, lngCurClr) Then
        ChooseColor = lngInitClr
    End If
    If Err Then MsgBox ("程序在64位系统中无法显示颜色选择对话框,请直接输入颜色代码")
    On Error GoTo 0

End Function
[VB&.NET]ppyyff 11:24:58
64位要用.Interop
否则你调用不到
[mccad]mccad 11:29:40
说说详细一些
[VB&.NET]ppyyff 11:30:50
我理解错了,我以为你用.net
[mccad]mccad 11:31:01
:)
难怪找不到资料
[VB&.NET]ppyyff 11:31:43
VB6在64位中,十分不好用
[mccad]mccad 11:31:48
出错提示是ACAD.exe文件找不到,但给全路径也没用
VBA7在64位中,一样也不好用
[mccad]mccad 11:32:37
所以真的得放弃VBA才行
[VB&.NET]ppyyff 11:33:25
但是在.net中对通过Interop方式好像都能调用
[VBA/VB/C#]efan2000 11:39:26
.net里调用与vba里调用是两者开发环境不一样。
 楼主| 发表于 2013-8-22 11:51:24 | 显示全部楼层
[VB&.NET]ppyyff 11:51:24
转换很简单
传统的api调用在64位好多不好用了
[VB&.NET]ppyyff 11:57:33
你调用哪个颜色对话框好像是用的API模式的,这种模式效率更低下
[mccad]mccad 11:59:37
但只有这种方法,在VBA中
 楼主| 发表于 2013-8-22 14:58:24 | 显示全部楼层
有声 14:58:24
有人用过Revit吗


Revit核心特性:
参数化构件(亦称族)是在Revit中设计使用的所有建筑构件的基础。它们提供了一个开放的图形式系统,让您能够自由地构思设计、创建外型,并以逐步细化的方式来表达设计意图。您可以使用参数化构件创建最复杂的组件(例如细木家具和设备),以及最基础的建筑构件(例如墙和柱)。
最重要的是,您无需任何编程语言或代码。
有声 15:07:10
所见即所得的设计:

不仅可得到效果图、 建筑动画,同时可直接生成建筑施工图 ,并可统计构件数量、材料用量以生成门窗表、 材料用量表等明细表。

可随时切换到三维图、平面图、立面图、剖视图,这些图样信息完全一致,不管在设计哪一阶段 ,哪怕是设计接近尾声时发现问题,修改起来都很方便 ,只对一处或一张图样进行修改 ,与其相关的图样及统计数据随之变动 ,避免了大量重复劳动。
有声 15:07:59
看来再拼命在CAD下编程什么的,也没多大用了,是不是呢
[mccad]mccad 15:11:14
低端和高端的问题
[VB&.NET]ppyyff 15:11:44
没你想得那么简单
[VB&.NET]ppyyff 15:12:34
建模麻烦死,当然模型建立起来后就方便了
在路上26 15:13:01
有没有人做过包含线段的属性块,然后想办法实现,里面的线段可以让用户自动拉伸?
[VB&.NET]ppyyff 15:13:08
CAD下编写几个代码,主要提高自己工作效率,给我解放一点时间
[mccad]mccad 15:13:29
从二维模式转到三维模式,建模的思路要有大改变
有声 15:13:53
建模简单的啦,我在CAD下建模都感觉不麻烦
[VB&.NET]ppyyff 15:14:09
尤其是CAD建模,没UG好用
[mccad]mccad 15:14:16
用动态块试试
小学生 15:14:20
自动拉伸,就别想了
有声 15:15:33
主要看自己应用方面,我们弄土木什么的,大多数比较规则的
[VB&.NET]ppyyff 15:16:08
三维建模在不同行业也是要做二次开发才能用,
在路上26 15:16:16
我原先想的是,在属性快里,在线段的拐点,中点加入点,然后让用户去拉点,从而实现拉伸线段
有声 15:16:33
参数化构件(亦称族)
无需任何编程语言或代码。
在路上26 15:16:51
但发现,属性快生成后,默认情况只有一个热点,属性块的文字才有热点
有声 15:17:04
看见没有,建立参数化构件,无需任何编程语言或代码。
[VB&.NET]ppyyff 15:17:28
这个只是宣传,别幼稚了
有声 15:17:45
随你了
[VB&.NET]ppyyff 15:17:55
你获得参数也也麻烦,参数输入也麻烦
天下没万能的东西
有声 15:18:43
XSTEEL,SW,CATIA很多三维软件都有那功能的,只是功能强弱
[VB&.NET]ppyyff 15:19:17
CATIA的还不错,协同设计做得很好
有声 15:20:36
哎,看来还得往前走一步
[VB&.NET]ppyyff 15:20:56
CAD协同有些问题
[VBA/VB/C#]efan2000 15:22:15
CAD有协同吗?
有声 15:22:19
大势所趋,三维、参数化
[VB&.NET]ppyyff 15:22:23
现在好多三维采用Sql数据库,进行协同,
CAd好像不行
有声 15:23:11
revit就是autodesk公司开发用来代替CAD的
[VB&.NET]ppyyff 15:23:15
参数化,本来二、三维都是参数化,关键是协同
有声 15:23:41
协同个球,你先了解一下revit
[VB&.NET]ppyyff 15:24:04
revit仅仅在建筑上用得多点而已
有声 15:24:05
revit就有一个统一的关系数据库
[VB&.NET]ppyyff 15:24:27
所以revit也没啥好强烈推荐的
有声 15:24:29
什么是万能的,抬杠
有声 15:31:54
随你了
有声 15:33:51
上海迪斯尼项目,美国业主全要REVIT模型
有声 15:34:57
我们总是被世界推动才往前走一步,什么时候,我们推动世界往前走啊
[VB&.NET]ppyyff 15:40:23
你也搞一个好用可协同三维,我们用用,就行
有声 15:41:26
我没那本事
 楼主| 发表于 2013-8-22 17:26:25 | 显示全部楼层
崗 子 17:26:25
初学 .NET  
请教 怎么加载 窗体呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-12-23 13:01 , Processed in 0.194312 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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