fiyone 发表于 2013-3-29 11:48:26

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

在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;


fiyone 发表于 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#。用在线代码转换转换出来的东西根本不能用。哎。费劲

chmenf087 发表于 2013-4-1 21:04:57

本帖最后由 chmenf087 于 2013-4-2 08:27 编辑

From id In blkId Where
                              (typeof id.getobject(openmode.forread) Is Circleand
                                 id.getobject(openmode.forread).Layer.name = "xxx"
                              …………)
Select id Application.ShowAlertDialog(blkId2.Count())

fiyone 发表于 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,不是我建立的块的名称。奇怪了。

fiyone 发表于 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速成版上实现的。

sxpd 发表于 2013-5-13 21:44:32

用ofType<BlockReference>
页: [1]
查看完整版本: vb中如何用linq在选择集内区分块和直线等类型