乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 77|回复: 3

VB.NET 按颜色显示图元,运行效率欠佳,请高手赐教

[复制链接]

1

主题

2

帖子

1

银币

初来乍到

Rank: 1

铜币
6
发表于 2015-12-24 16:37:00 | 显示全部楼层 |阅读模式
不知道是算法欠佳,还是其他问题,同样是选择41张a1图中显示某几种颜色,此程序需10s,而msteel箱仅2s左右,请高手优化,谢谢。YXX ,按色显示,QXX,全部显示。
  1. _
  2.     Public Sub YXX()
  3.         '' 获得当前文档和数据库   Get the current document and database
  4.         Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
  5.         Dim acCurDb As Database = acDoc.Database
  6.         Dim acLyrTblRec As LayerTableRecord
  7.         Dim acLyrTbl As LayerTable
  8.         On Error Resume Next
  9.         ''启动一个事务   Start a transaction
  10.         Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
  11.             'Dim ColorList As New List(Of String)
  12.             'Dim ColorList As New ArrayList
  13.             Dim ColorList As New List(Of String)
  14.             Dim acSSPrompt As PromptSelectionResult = acDoc.Editor.GetSelection()
  15.             If acSSPrompt.Status = PromptStatus.OK Then
  16.                 Dim acSSet As SelectionSet = acSSPrompt.Value
  17.                 For Each acSSObj As SelectedObject In acSSet
  18.                     If Not IsDBNull(acSSObj) Then
  19.                         Dim acEnt As Entity = acTrans.GetObject(acSSObj.ObjectId, OpenMode.ForWrite)
  20.                         If Not IsDBNull(acEnt) Then
  21.                             Dim acEntColor As String = acEnt.Color.ToString
  22.                             'MsgBox(acEntColor)
  23.                             If acEntColor = "BYLAYER" Then
  24.                                 acLyrTbl = acTrans.GetObject(acCurDb.LayerTableId, OpenMode.ForRead)
  25.                                 acLyrTblRec = acTrans.GetObject(acLyrTbl(acEnt.Layer), OpenMode.ForWrite)
  26.                                 acEntColor = acLyrTblRec.Color.ToString
  27.                                 'MsgBox(acEntColor)
  28.                             End If
  29.                             '去重
  30.                             If ColorList.Contains(acEntColor) = False Then
  31.                                 ColorList.Add(acEntColor)
  32.                             End If
  33.                         End If
  34.                     End If
  35.                 Next
  36.             End If
  37.             Dim acSSPrompt1 As PromptSelectionResult = acDoc.Editor.SelectAll()
  38.             If acSSPrompt1.Status = PromptStatus.OK Then
  39.                 Dim acSSet1 As SelectionSet = acSSPrompt1.Value
  40.                 For Each acSSObj1 As SelectedObject In acSSet1
  41.                     If Not IsDBNull(acSSObj1) Then
  42.                         Dim acEnt1 As Entity = acTrans.GetObject(acSSObj1.ObjectId, OpenMode.ForWrite)
  43.                         If Not IsDBNull(acEnt1) Then
  44.                             Dim acEnt1Color As String = acEnt1.Color.ToString
  45.                             'MsgBox(acEntColor)
  46.                             If acEnt1Color = "BYLAYER" Then
  47.                                 acLyrTbl = acTrans.GetObject(acCurDb.LayerTableId, OpenMode.ForRead)
  48.                                 acLyrTblRec = acTrans.GetObject(acLyrTbl(acEnt1.Layer), OpenMode.ForWrite)
  49.                                 acEnt1Color = acLyrTblRec.Color.ToString
  50.                                 'MsgBox(acEntColor)
  51.                             End If
  52.                             If ColorList.Contains(acEnt1Color) = True Then
  53.                                 acEnt1.Visible = True
  54.                             Else
  55.                                 acEnt1.Visible = False
  56.                             End If
  57.                         End If
  58.                     End If
  59.                 Next
  60.             End If
  61.             acTrans.Commit()
  62.         End Using
  63.     End Sub
  64. _
  65.     Public Sub QXX()
  66.         '' 获得当前文档和数据库   Get the current document and database
  67.         Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
  68.         Dim acCurDb As Database = acDoc.Database
  69.         'On Error Resume Next
  70.         ''启动一个事务   Start a transaction
  71.         Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
  72.             Dim acSSPrompt1 As PromptSelectionResult = acDoc.Editor.SelectAll()
  73.             If acSSPrompt1.Status = PromptStatus.OK Then
  74.                 Dim acSSet1 As SelectionSet = acSSPrompt1.Value
  75.                 For Each acSSObj1 As SelectedObject In acSSet1
  76.                     If Not IsDBNull(acSSObj1) Then
  77.                         Dim acEnt1 As Entity = acTrans.GetObject(acSSObj1.ObjectId, OpenMode.ForWrite)
  78.                         acEnt1.Visible = True
  79.                     End If
  80.                 Next
  81.             End If
  82.             acTrans.Commit()
  83.         End Using
  84.     End Sub
回复

使用道具 举报

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 2015-12-25 15:46:00 | 显示全部楼层
你的代码是全图选择图元
用过滤器要快些的
回复

使用道具 举报

1

主题

2

帖子

1

银币

初来乍到

Rank: 1

铜币
6
发表于 2015-12-25 23:52:00 | 显示全部楼层

我的思路是:1.任选几个图元,取图元色彩集。2.遍历所有对象,取每个对象颜色,若在色彩集中则显示,反之关闭。
过滤器?通过色彩不太好选,不同层,不同色,颜色随层时,都是256(BYLAYER),选不中啊
.visible的对象不能是选择集。。所以遍历了所有图元判断.
回复

使用道具 举报

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 2015-12-26 16:58:00 | 显示全部楼层
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=75642最后一个帖子我贴了按线型过滤的例子 颜色过滤类似
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2024-11-22 09:09 , Processed in 0.144521 second(s), 60 queries .

© 2020-2024 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表