明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1655|回复: 7

[求助]关于循环!

[复制链接]
发表于 2010-4-28 21:02:00 | 显示全部楼层 |阅读模式

我在VB.NET中开发CAD中,我一直用不好循环,想请大家帮个忙!

我想连续选择多个不同图层上的实体,从而获得几个图层,直到我点击右键,图面上只显示这几个图层,其他图层都关闭!
是否需要循环,怎么用呢?

发表于 2010-4-28 21:08:00 | 显示全部楼层

简单写下流程

1、使用选择集选择实体

2、遍历选择集,获取实体的图层ID集合

3、只显示这几个图层,其他图层都关闭

 楼主| 发表于 2010-4-28 21:48:00 | 显示全部楼层
需要用到循环么?
看我的代码,我感觉这个代码写的不好!
  1.     <CommandMethod("CloseOtherAllLayer")> Public Sub CloseOtherAllLayer()
  2.             Dim db As Database = HostApplicationServices.WorkingDatabase
  3.             Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
  4.             Try
  5.                 Dim entIdCollection As New ObjectIdCollection
  6.                 Do
  7.                     Dim optEntity As New PromptEntityOptions(vbCrLf & "请选择图层上的实体")
  8.                     Dim resEntity As PromptEntityResult = ed.GetEntity(optEntity)
  9.                     If resEntity.Status = PromptStatus.OK Then
  10.                         Dim entId As ObjectId = resEntity.ObjectId
  11.                         entIdCollection.Add(entId)
  12.                     Else
  13.                         Exit Do
  14.                     End If
  15.                 Loop
  16.                 If entIdCollection.Count = 0 Then
  17.                     Exit Sub
  18.                 End If
  19.                 Using trans As Transaction = db.TransactionManager.StartTransaction
  20.                     Dim lt As LayerTable = trans.GetObject(db.LayerTableId, OpenMode.ForRead)
  21.                     db.Clayer = lt.Item("0")
  22.                     For Each objId As ObjectId In lt
  23.                         Dim ltr As LayerTableRecord = trans.GetObject(objId, OpenMode.ForWrite)
  24.                         If ltr.Name <> "0" Then
  25.                             ltr.UpgradeOpen()
  26.                             ltr.IsFrozen = True
  27.                         End If
  28.                     Next
  29.                     For Each entId As ObjectId In entIdCollection
  30.                         Dim ent As Entity = trans.GetObject(entId, OpenMode.ForRead)
  31.                         Dim ltr As LayerTableRecord = trans.GetObject(lt.Item(ent.Layer), OpenMode.ForWrite)
  32.                         ltr.IsFrozen = False
  33.                     Next
  34.                     trans.Commit()
  35.                 End Using
  36.             Catch ex As Exception
  37.                 ed.WriteMessage("有错误,请重试!")
  38.             End Try
  39.         End Sub
发表于 2010-4-28 22:01:00 | 显示全部楼层

嗯,很不好,呵呵

1、选择的部分用选择集ed.GetSelect()

2、先遍历选择的实体集合,把图层Id放在一个集合中,要考虑去除重复项

3、遍历图层Id集合,依次改变

 楼主| 发表于 2010-4-28 22:25:00 | 显示全部楼层
懂了,谢谢版主!我再试试!
 楼主| 发表于 2010-4-28 22:46:00 | 显示全部楼层
但是我想单个单个的选,ed.getselection()是框选呀!怎么办呢?
发表于 2010-4-29 11:43:00 | 显示全部楼层
单个的选 GetEntity()
发表于 2010-11-9 12:38:00 | 显示全部楼层
我也试试!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-26 00:23 , Processed in 0.164916 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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