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:48 编辑
xxxxx这部分改为 typeof id.getobject(openmode.forread)就行了。
但是现在,我想挑出在个某图层上的圆,就不知道该如何做了。
我是模仿http://www.bimcad.org/thread-4456-1-3.html这个帖子来做的。但我用的是vb,不是c#。用在线代码转换转换出来的东西根本不能用。哎。费劲 本帖最后由 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: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 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速成版上实现的。
用ofType<BlockReference>
页:
[1]