明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1842|回复: 5

[基础] vb中如何用linq在选择集内区分块和直线等类型

[复制链接]
发表于 2013-3-29 11:48:26 | 显示全部楼层 |阅读模式
在vb中用linq实:在选择集里面挑出所有的圆,或者挑出所有的块。比如象下面代码
Dim acSSPrompt As PromptSelectionResult = acDocEd.SelectWindow((0,0,0),(1000,1000,0))
If acSSPrompt.Status = PromptStatus.OK Then
                        Dim acSSet As SelectionSet = acSSPrompt.Value
                        Dim blkId() As ObjectId = acSSet.GetObjectIds()

    Dim v = From id In blkId Where xxxxx Is Circle Select id
Application.ShowAlertDialog(blkId2.Count())
end if

如上面的代码, xxxxx这块该如何写代码才能实现,根据对象类型分离选择集?
用c#可以用以下代码实现,不知道用vb怎么实现,vb没有OpenObject()函数。
var v = from ObjectId id in btr
                where OpenObject(tr, id) is Circle &&
                        OpenObject(tr, id).ColorIndex == color &&
                        OpenObject(tr, id).Layer == layer &&
                        OpenObject(tr, id).Linetype == linetype
                select id;



 楼主| 发表于 2013-4-1 08:47:11 | 显示全部楼层
本帖最后由 fiyone 于 2013-4-1 08:48 编辑

xxxxx这部分改为 typeof id.getobject(openmode.forread)就行了。
但是现在,我想挑出在个某图层上的圆,就不知道该如何做了。
我是模仿http://www.bimcad.org/thread-4456-1-3.html这个帖子来做的。但我用的是vb,不是c#。用在线代码转换转换出来的东西根本不能用。哎。费劲
发表于 2013-4-1 21:04:57 | 显示全部楼层
本帖最后由 chmenf087 于 2013-4-2 08:27 编辑

From id In blkId Where
                                (typeof id.getobject(openmode.forread) Is Circle  and
                                 id.getobject(openmode.forread).Layer.name = "xxx"
                                …………)
Select id Application.ShowAlertDialog(blkId2.Count())
 楼主| 发表于 2013-4-2 10:31:46 | 显示全部楼层
本帖最后由 fiyone 于 2013-4-2 10:43 编辑

谢谢楼上,我用下面语句实现了。
From id In blkId2 _
                                Where TypeOf id.GetObject(OpenMode.ForRead) Is BlockReference _
                                Where DirectCast(id.GetObject(OpenMode.ForRead), Entity).ColorIndex = 6 _
                                 Select id
但是还有一个问题,如果我想筛选出对应的块,用ENTITY的blockname属性不能挑出,因为blockname属性居然是*MODLE_SPACE,不是我建立的块的名称。奇怪了。
 楼主| 发表于 2013-4-2 11:29:12 | 显示全部楼层
本帖最后由 fiyone 于 2013-4-2 12:07 编辑

根据块名字查询页实现了。
From id In blkId2 _
                                Where TypeOf id.GetObject(OpenMode.ForRead) Is BlockReference _
                                Where DirectCast(id.GetObject(OpenMode.ForRead), BlockReference).Name = "xxxx" Select id
但要注意,两个where的顺序,先找到块,然后再识别块的名称,不然会出错。
以上代码都是在vb2008速成版上实现的。
发表于 2013-5-13 21:44:32 | 显示全部楼层
用ofType<BlockReference>
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 15:19 , Processed in 0.263867 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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