明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 8069|回复: 22

[求助]关于cad标注的问题

  [复制链接]
发表于 2003-6-3 21:08 | 显示全部楼层 |阅读模式
大家好,我有个想法,就是当选择标注进行标注后,跟着直接新建一个标注的层。调试了一下,好象没任何反映,是不是程序执行完ThisDrawing.SendCommand "_dimaligned" & vbCr就退出了
请大家帮助解决这个问题,程序如下:
Sub a()
Dim layer1 As AcadLayer
Set layer1 = ThisDrawing.Layers.add("标注")
layer1.Color = acGreen
Dim n As Integer
ThisDrawing.SendCommand "_dimaligned" & vbCr
For Each ent In ThisDrawing.ModelSpace
If TypeOf ent Is AcadDimAligned Then
ent.Layer = "标注"
End If
Next
End Sub
发表于 2022-7-13 20:59 | 显示全部楼层
mccad 发表于 2003-6-10 17:29
链接地址:
http://www.mjtd.com/mcdown/list.asp?id=370

能否重新提供下载,现在无链接了
发表于 2003-6-4 13:12 | 显示全部楼层

个人看法

(1)未定义ent对象。
    (2)引入SendCommand命令引起了程序执行顺序的混乱,后面的循环语句并不是没有执行,而是在SendCommand之前执行!
    我的建议是,不用SendCommand函数,而是要求用户输入数据,根据数据自动创建一个标注对象。
    第(2)条是我测试的结果,可能会有不妥之处。
发表于 2003-6-5 20:07 | 显示全部楼层

Z兄说得对,SendCommand后如果命令未完或需要人手选择的话,则会退出程序

你所需要的方法就是在标注时把标注对象放到指定的标注图层中,可以使用事件来解决。
但使用事件有一个缺点就是当标注时按了取消键时不能回复先前的图层。
或者可以这样:
在开始命令的事件中记下当前空间的对象数量,然后在结束命令的事件中写入判断刚才的命令是否为标注命令,如果是标注命令则从当前空间对象数量后的对象开始判断对象是否为标注对象,如果是则改变其图层。

这样做就也就是在开始命令时不对图层进行切换,而是在对象建立后再改对象的图层,所以标注时对象还是在当前图层中,而标注完成后才会把对象放到指定的图层中。
为什么不直接判断最后建立的对象来切换呢,因为有些标注命令可以建立多个标注对象,如连接标注,所以只判断最后一个命令是不正确的。
希望大家能用这个思路写出一个程序出来供大家使用(我也想用)。
发表于 2003-6-5 20:49 | 显示全部楼层

我等不及了,还是把我写的程序贴出来吧!

注意程序只考虑了新建图层,而没有考虑新图层的颜色及线型等其它属性,大家可以自己添加上去。
程序有一个好处就是等所有对象添加后才改变对象的图层,所以按了ESC键也没关系,不会造成当前图层换成其它图层的问题。
有一个缺点:在使用连接标注时如果按了取消,则已经创建的标注对象不能改图层。


  1. Public EntCount As Integer

  2. Private Sub AcadDocument_BeginCommand(ByVal CommandName As String)
  3.    EntCount = ThisDrawing.ModelSpace.Count
  4.    
  5. End Sub

  6. Private Sub AcadDocument_EndCommand(ByVal CommandName As String)
  7.     If Left(UCase(CommandName), 3) = "DIM" Then
  8.         Dim NewEnt As AcadEntity
  9.         Dim i As Integer
  10.         Dim NewLayerName As String
  11.         '以下定义了要将标注对象移动到的图层名称
  12.         NewLayerName = "3"
  13.         CreateLayer ("NewLayerName")
  14.         For i = EntCount To ThisDrawing.ModelSpace.Count - 1
  15.         Set NewEnt = ThisDrawing.ModelSpace.Item(i)
  16.         NewEnt.Layer = "NewLayerName"
  17.         Next
  18.     End If
  19. End Sub

  20. Public Function CreateLayer(ssLayerName As String) As AcadLayer
  21. On Error Resume Next
  22.     Set CreateLayer = ThisDrawing.Layers(ssLayerName)
  23.     If Err Then
  24.         Err.Clear
  25.         Set CreateLayer = ThisDrawing.Layers.Add(ssLayerName)
  26.     End If

  27. End Function
发表于 2003-6-6 18:27 | 显示全部楼层

新改的程序,利用注册表来保存切换的图层配置

程序利用注册表来保存切换的图层配置,现在还未完成生成注册表部分,大家可以把以下文件导入到注册表中先试试吧:


注意以下程序下载:

以下是程序内容:
  1. ' AutoLayer.dvb
  2. Public EntCount As Integer
  3. Public LayerSet As Variant
  4. Public GetReg As Boolean

  5. Private Sub AutoLayerLoad()
  6.     Dim LayerSetting() As String
  7.     Dim SplitSetting As Variant
  8.     Dim LayerName As Variant
  9.     Dim LayerCount As Integer
  10.     LayerName = GetAllSettings("MCCAD", "AutoLayer")
  11.     For LayerCount = LBound(LayerName, 1) To UBound(LayerName, 1)
  12.         ReDim Preserve LayerSetting(2, LayerCount)
  13.         LayerSetting(0, LayerCount) = LayerName(LayerCount, 0)
  14.         SplitSetting = Split(LayerName(LayerCount, 1), ",")
  15.         LayerSetting(1, LayerCount) = SplitSetting(0)
  16.         LayerSetting(2, LayerCount) = SplitSetting(1)
  17.     Next
  18.         LayerSet = LayerSetting()
  19. End Sub
  20. Private Sub AcadDocument_BeginCommand(ByVal CommandName As String)
  21.    EntCount = ThisDrawing.ModelSpace.Count
  22. End Sub

  23. Private Sub AcadDocument_EndCommand(ByVal CommandName As String)
  24.    If GetReg = False Then
  25.         AutoLayerLoad
  26.         GetReg = True
  27.    End If
  28.    Dim NewEnt As AcadEntity
  29.    Dim i As Integer
  30.    Dim NewLayerName As String
  31.    Dim j As Integer
  32.    Dim NewLayerColor As Integer
  33.    For j = LBound(LayerSet, 2) To UBound(LayerSet, 2)
  34.        If UCase(CommandName) Like LayerSet(0, j) Then
  35.            NewLayerName = LayerSet(1, j)
  36.            NewLayerColor = CVar(LayerSet(2, j))
  37.            CreateLayer NewLayerName, NewLayerColor
  38.            If ThisDrawing.ModelSpace.Count > EntCount Then
  39.                For i = EntCount To ThisDrawing.ModelSpace.Count - 1
  40.                    Set NewEnt = ThisDrawing.ModelSpace.Item(i)
  41.                    NewEnt.Layer = NewLayerName
  42.                Next
  43.            End If
  44.            Exit For
  45.        End If
  46.    Next
  47. End Sub

  48. Public Function CreateLayer(ssLayerName As String, Optional EntColor As Integer) As AcadLayer
  49. On Error Resume Next
  50.     Set CreateLayer = ThisDrawing.Layers(ssLayerName)
  51.     If Err Then
  52.         Err.Clear
  53.         Set CreateLayer = ThisDrawing.Layers.Add(ssLayerName)
  54.         If EntColor <> 0 Then CreateLayer.color = EntColor
  55.     End If
  56. End Function

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 2003-6-7 09:15 | 显示全部楼层

谢谢了,明老大的程序让我受益菲浅

谢谢了,明老大的程序让我受益菲浅,因为是
发表于 2003-6-10 17:29 | 显示全部楼层

程序已经开发出来,放到下载中心供下载了,大家试用后提点意见

链接地址:
http://www.mjtd.com/mcdown/list.asp?id=370

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2003-6-10 18:51 | 显示全部楼层

加载后,运行宏,提示类型不匹配

发表于 2003-6-10 21:08 | 显示全部楼层

已增加多项错误处理,请重新下载试用

发表于 2003-6-12 11:12 | 显示全部楼层

123

斑竹做的东西真的是专业,学习学习。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-5 11:21 , Processed in 0.339121 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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