明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4454|回复: 1

[VBA]冻结当前视口中的图层示例

[复制链接]
发表于 2004-4-29 21:38 | 显示全部楼层 |阅读模式
  1. Option Explicit
  2. ' 冻结当前视口中的图层示例
  3. ' VBA没有直接的方法来冻结当前视口中的图层
  4. ' 这里通过扩展数据的方法来进行操作。Public Sub selectVPobjectsToFreeze()Dim objEntity As AcadObject
  5. Dim strLayer As String
  6. Dim PT1 As Variant
  7. Dim newSS As AcadSelectionSet
  8. Dim vLayers() As VariantOn Error GoTo err_selectVPobjectsToFreezeThisDrawing.StartUndoMarkIf ThisDrawing.ActiveSpace = acModelSpace Then
  9.        MsgBox "该程序只能在图纸空间视口中运行。" & vbCr & _
  10.        "请切换到图纸空间", vbCritical, "明经通道VBA示例"
  11.      Exit Sub
  12. End IfThisDrawing.MSpace = True
  13. Set newSS = ThisDrawing.SelectionSets.Add("Vplayers")
  14. ThisDrawing.Utility.Prompt ("选择视口中需要冻结图层的对象:" & vbCr)
  15. newSS.SelectOnScreen
  16. For Each objEntity In newSS
  17.        strLayer = objEntity.Layer
  18.        VpLayerOff (strLayer)
  19. NextViewPortUpdate
  20. newSS.Delete
  21. ThisDrawing.EndUndoMarkExit Suberr_selectVPobjectsToFreeze:
  22. MsgBox Err.Description, vbInformation
  23. Err.Clear
  24. ThisDrawing.EndUndoMark
  25. End SubSub ViewPortUpdate()
  26. ' 更新视口...
  27. Dim objPViewport As AcadObjectSet objPViewport = ThisDrawing.ActivePViewport
  28. ThisDrawing.MSpace = False
  29. objPViewport.Display (False)
  30. objPViewport.Display (True)
  31. ThisDrawing.MSpace = True
  32. ThisDrawing.Utility.Prompt ("完成!" & vbCr)
  33. End SubSub VpLayerOff(strLayer As String)
  34. ' 使图层在当前视口中不显示(冻结)
  35. Dim objEntity As AcadObject
  36. Dim objPViewport As AcadObject
  37. Dim objPViewport2 As AcadObject
  38. Dim XdataType As Variant
  39. Dim XdataValue As Variant
  40. Dim I As Integer
  41. Dim Counter As Integer
  42. Dim PT1 As Variant' 获得活动的视口
  43. Set objPViewport = ThisDrawing.ActivePViewport' 从视口中获取扩展数据
  44. objPViewport.GetXData "ACAD", XdataType, XdataValueFor I = LBound(XdataType) To UBound(XdataType)
  45.      ' 在视口中查看已冻结的图层
  46.      If XdataType(I) = 1003 Then
  47.            ' 设置冻结图层的计数器
  48.              Counter = I + 1
  49.            ' 如果指定图层已经在视口扩展数据中的冻结图层列表中
  50.            ' 则退出该程序
  51.            If XdataValue(I) = strLayer Then Exit Sub
  52.      End If
  53. Next' 如果视口中无冻结的图层则
  54. ' 查找位于1002的Xdata并在1002扩展数据的"}"前设置冻结图层
  55. If Counter = 0 Then
  56.      For I = LBound(XdataType) To UBound(XdataType)
  57.              If XdataType(I) = 1002 Then Counter = I - 1
  58.        Next
  59. End If' 设置图层的Xdata为冻结
  60. XdataType(Counter) = 1003
  61. XdataValue(Counter) = strLayerReDim Preserve XdataType(Counter + 1)
  62. ReDim Preserve XdataValue(Counter + 1)' 将第一个 "}" 设置回到xdata数组中
  63. XdataType(Counter + 1) = 1002
  64. XdataValue(Counter + 1) = "}"' 保持xdata数组并再增加一个元素到该数组中
  65. ReDim Preserve XdataType(Counter + 2)
  66. ReDim Preserve XdataValue(Counter + 2)' 将第二个 "}" 放到xdata数组中
  67. XdataType(Counter + 2) = 1002
  68. XdataValue(Counter + 2) = "}"' 重新设置视口的Xdata。
  69. objPViewport.SetXData XdataType, XdataValue' 注意此时视口中不会显示任何的变化。
  70. ' 可切换到布局或将Mview设置为关然后再设为开就会显示视口的Xdata更改后的情况。
  71. ' 参阅 ViewPortUpdate 以了解怎样更新视口。End Sub
发表于 2014-1-15 10:47 | 显示全部楼层
本帖最后由 wxd20130610 于 2014-1-17 13:58 编辑

方法可行的。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-17 19:01 , Processed in 0.347433 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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