明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1650|回复: 6

[已解决]VBA如何创建出同dli命令创建的一样的标注呢?

[复制链接]
发表于 2008-7-5 00:13:00 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2008-7-12 13:54:14 编辑

我用VBA创建的都类似于DAL命令创建的标注,能否创建出同dli命令创建的一样的标注呢?有源代码最好,谢谢大家了!
发表于 2008-7-5 16:01:00 | 显示全部楼层
本帖最后由 作者 于 2010-5-31 16:47:11 编辑

  1. '自创建标注样式
  2. Public Function AddDimStyle(ByVal DimStyleName As String, Optional ByVal SetScale As Double = 1)
  3. Dim DimStyle As Object 'AcadDimStyle
  4. Set DimStyle = ThisDrawing.DimStyles.Add(DimStyleName)
  5. ThisDrawing.ActiveDimStyle = DimStyle '激活该标注样式
  6. With ThisDrawing
  7. '第一组定义全局和线性比例因子
  8. .SetVariable "DimScale", 1 '设置全局比例因子
  9. .SetVariable "DimLFac", 1 '线性比例因子. '1'=1:1, '2'=2:1,'.5'=1:2等
  10. '定义典型的标注特性
  11. .SetVariable "DimADec", 0 '控制角度标注的显示精确位数
  12. '.SetVariable "DimAso", 2 '控制标注对象的关联性
  13. '实际上该系统变量由图形控制
  14. .SetVariable "DimASz", 1.5 * SetScale '控制尺寸线、引线箭头的大小。并控制钩线的大小
  15. .SetVariable "DimAtFit", 3 '当尺寸界线的空间不足以同时放下标注文字和箭头时,确定这两者的排列方式
  16. '0 将文字和箭头均放置于尺寸界线之外
  17. '1 先移动箭头,然后移动文字
  18. '2 先移动文字,然后移动箭头
  19. '3 移动文字和箭头中较合适的一个
  20. .SetVariable "DimAUnit", 0 '设置角度标注的单位格式
  21. '0 十进制度数
  22. .SetVariable "DimAZin", 0 '对角度标注作消零处理
  23. '0 显示所有前导零和后续零
  24. .SetVariable "DimBlk", "" '设置尺寸线或引线末端显示的箭头块
  25. '"" 实心闭合
  26. .SetVariable "DimBlk1", "" '当 DIMSAH 系统变量打开时,设置尺寸线第一个端点的箭头
  27. .SetVariable "DimBlk2", "" '当 DIMSAH 系统变量打开时,设置尺寸线第二个端点的箭头
  28. .SetVariable "DimClrD", acByLayer '为尺寸线、箭头和标注引线指定颜色
  29. .SetVariable "DimClrE", acByLayer '为尺寸界线指定颜色。此颜色可以是任意有效的颜色编号
  30. .SetVariable "DimClrT", acByLayer '为标注文字指定颜色
  31. .SetVariable "DimDec", 0 '设置标注主单位显示的小数位位数
  32. .SetVariable "DimExe", 0.5 * SetScale '指定尺寸界线超出尺寸线的距离
  33. .SetVariable "DimExO", 0 '指定尺寸界线偏移原点的距离
  34. .SetVariable "DimFrac", 0 '在 DIMLUNIT 系统变量设置为 4(建筑)或 5(分数)时设置分数格式
  35. .SetVariable "DimGap", 0.5 * SetScale '当尺寸线分成段以在两段之间放置标注文字时,设置标注文字周围的距离
  36. .SetVariable "DimJust", 0 '控制标注文字的水平位置
  37. '0 将文字置于尺寸线之上,并在尺寸界线之间置中对正
  38. '1 紧邻第一条尺寸界线放置标注文字
  39. '2 紧邻第二条尺寸界线放置标注文字
  40. '3 将标注文字放在第一条尺寸界线以上,并与之对齐
  41. '4 将标注文字放在第二条尺寸界线以上,并与之对齐
  42. .SetVariable "DimLwd", acLnWtByLayer '指定尺寸线的线宽
  43. .SetVariable "DimLwe", acLnWtByLayer '指定尺寸界线的线宽
  44. .SetVariable "DimPost", "" '指定标注测量值的文字前缀或后缀(或者两者都指定)
  45. .SetVariable "DimRnd", 0 '将所有标注距离舍入到指定值
  46. .SetVariable "DimSAh", 0 '控制尺寸线箭头块的显示
  47. .SetVariable "DimSD1", 0 '控制是否禁止显示第一条尺寸线
  48. .SetVariable "DimSD2", 0 '控制是否禁止显示第二条尺寸线
  49. .SetVariable "DimSE1", 0 '控制是否禁止显示第一条尺寸界线
  50. .SetVariable "DimSE2", 0 '控制是否禁止显示第二条尺寸界线
  51. .SetVariable "DimSOXD", 0 '控制是否允许尺寸线绘制到尺寸界线之外
  52. .SetVariable "DimTAD", 1 '控制文字相对尺寸线的垂直位置
  53. '0 标注文字在尺寸界线之间居中放置
  54. '1 除非尺寸线不是水平放置的或者尺寸界线内的文字被强制为水平放置
  55. '(DIMTIH = 1),否则就将标注文字放置在尺寸线的上方。标注文字最底部
  56. '基线到尺寸线的距离值就是系统变量DIMGAP 的当前值。
  57. .SetVariable "DimTIH", 0 '控制所有标注类型(坐标标注除外)的标注文字在尺寸界线内的位置
  58. '0 或关 将文字与尺寸线对齐
  59. '1 或开 将文字水平放置
  60. .SetVariable "DimTIX", 1 '在尺寸界线之间绘制文字
  61. '0 或关 结果随标注类型的不同而不同。对于线性和角度标注,AutoCAD
  62. '将文字放置到尺寸界线之间(如果有足够的空间)。对于不适于放入圆
  63. '或圆弧中的半径标注和直径标注,DIMTIX 无效并总是强制将文字放到圆或圆弧之外
  64. '1 或开 将标注文字绘制在尺寸界线之间,即使 AutoCAD 通常将这些文字放置于尺寸界线之外。
  65. .SetVariable "DimTMOVE", 2 '设置标注文字的移动规则
  66. '0 尺寸线和标注文字一起移动
  67. '1 在移动标注文字时添加一条引线
  68. '2 允许标注文字自由移动而不用添加引线
  69. .SetVariable "DimTOFL", 0 '控制是否将尺寸线绘制在尺寸界线之间(即使文字放置在尺寸界线之外)
  70. .SetVariable "DimTOH", 0 '控制标注文字在尺寸界线外的位置
  71. .SetVariable "DimTSz", 0 '指定线性标注、半径标注以及直径标注中替代箭头的小斜线尺寸
  72. .SetVariable "DimTVP", 0 '控制尺寸线上方或下方标注文字的垂直位置
  73. .SetVariable "DimTxSty", "Arial" '指定标注的文字样式
  74. .SetVariable "DimTxt", 2 * SetScale '指定标注文字的高度,除非当前文字样式具有固定的高度
  75. .SetVariable "DimUPT", 0 '控制用户定位文字的选项
  76. .SetVariable "DimZIn", 0 '控制是否对主单位值作消零处理
  77. '
  78. '定义换算单位的特性
  79. .SetVariable "DimAlt", 0 '控制标注中换算单位的显示
  80. .SetVariable "DimAltD", 4 '控制换算单位中小数位的位数
  81. .SetVariable "DimAltF", 25.4 '控制换算单位乘数
  82. .SetVariable "DimAltRnd", 0 '舍入换算标注单位
  83. .SetVariable "DimAltTD", 4 '设置标注换算单位公差值小数位的位数
  84. .SetVariable "DimAltTZ", 0 '控制是否对公差值作消零处理
  85. .SetVariable "DimAltU", 2 '为所有标注样式族(角度标注除外)换算单位设置单位格式
  86. .SetVariable "DimAltZ", 0 '控制是否对换算单位标注值作消零处理
  87. .SetVariable "DimAPost", "" '为所有标注类型(角度标注除外)的换算标注测量值指定文字前缀或后缀(或两者都指定)
  88. End With
  89. '标注样式的特性从图形已有样式中获得
  90. DimStyle.CopyFrom ThisDrawing
  91. End Function
 楼主| 发表于 2008-7-5 16:33:00 | 显示全部楼层
非常感谢wylong  但是我想要VBA创建出标注出来,就像用到AddDimAngular 的。也就是要创建水平或垂直标注。
发表于 2008-7-5 17:44:00 | 显示全部楼层
本帖最后由 作者 于 2010-5-31 16:47:51 编辑

  1. ' 创建出同dli命令创建的一样的标注
  2. Sub AddDimRotated()
  3.     Dim dimObj As AcadDimRotated
  4.     Dim point1 As Variant
  5.     Dim point2 As Variant
  6.     Dim location As Variant
  7.     Dim rotAngle As Double
  8.     Dim rotAngleNunmer As Integer
  9.    
  10.     rotAngleNunmer = 1
  11.    
  12.     With ThisDrawing.Utility
  13.         point1 = (.GetPoint(, "请指定标注起始点(按Esc或Enter或左健退出):"))
  14.         If IsEmpty(point1) Then Exit Sub
  15.     End With
  16.    
  17.     With ThisDrawing.Utility
  18.         point2 = (.GetPoint(, "请指定标注结束点(按Esc或Enter或左健退出):"))
  19.         If IsEmpty(point2) Then Exit Sub
  20.     End With
  21.    
  22.     With ThisDrawing.Utility
  23.         location = (.GetPoint(, "请指定标注基准点(按Esc或Enter或左健退出):"))
  24.         If IsEmpty(location) Then Exit Sub
  25.     End With
  26.    
  27.     On Error Resume Next
  28.     rotAngleNunmer = ThisDrawing.Utility.GetInteger(vbCrLf & "输入标注位置 [上(1)/下(2)/左(3)/右(4)]: <" & rotAngleNunmer & ">:")
  29.    
  30.     Select Case rotAngleNunmer
  31.         Case 1, 2
  32.             rotAngle = 0
  33.         Case 3, 4
  34.             rotAngle = 90
  35.     End Select
  36.    
  37.     rotAngle = rotAngle * 3.141592 / 180#       ' covert to Radians
  38.    
  39.     Set dimObj = ThisDrawing.ModelSpace.AddDimRotated(point1, point2, location, rotAngle)
  40. End Sub
 楼主| 发表于 2008-7-10 17:13:00 | 显示全部楼层

wylong  

你真是高手啊!非常感谢你!愿意加入我建立的VBA群吗?兄弟们等你呢。群号码:65580621

 楼主| 发表于 2008-7-10 17:45:00 | 显示全部楼层

我把你的代码优化了下,不需要手动输入旋转角度,VBA自己会判断的。

Sub dli()
    Dim dimObj As AcadDimRotated
    Dim p1 As Variant
    Dim p2 As Variant
    Dim p3 As Variant
    Dim rotAngle As Double
    Dim rotAngleNunmer As Integer
    rotAngleNunmer = 1
    With ThisDrawing.Utility
        p1 = (.GetPoint(, "请指定标注起始点(按Esc或Enter或左健退出):"))
        If IsEmpty(p1) Then Exit Sub
    End With
    With ThisDrawing.Utility
        p2 = (.GetPoint(, "请指定标注结束点(按Esc或Enter或左健退出):"))
        If IsEmpty(p2) Then Exit Sub
    End With
    With ThisDrawing.Utility
        p3 = (.GetPoint(, "请指定标注基准点(按Esc或Enter或左健退出):"))
        If IsEmpty(p3) Then Exit Sub
    End With
    On Error Resume Next
    If p1(0) < p2(0) Then 'p1点在左边
       If p3(0) > p1(0) And p3(0) < p2(0) Then 'p3点X在p1 p2中间
          If p3(1) < p1(1) And p3(1) < p2(1) Then 'p3点Y在p1 p2下方
             rotAngleNunmer = 1
          End If
          If p3(1) > p1(1) And p3(1) > p2(1) Then 'p3点Y在p1 p2上方
             rotAngleNunmer = 2
          End If
       End If
    End If
    If p1(0) > p2(0) Then 'p1点在右边
       If p3(0) > p2(0) And p3(0) < p1(0) Then 'p3点X在p1 p2中间
          If p3(1) < p1(1) And p3(1) < p2(1) Then 'p3点Y在p1 p2下方
             rotAngleNunmer = 1
          End If
          If p3(1) > p1(1) And p3(1) > p2(1) Then 'p3点Y在p1 p2上方
             rotAngleNunmer = 2
          End If
       End If
    End If
     If p2(1) > p1(1) Then 'p1点在下边
       If p3(1) > p1(1) And p3(1) < p2(1) Then 'p3点y在p1 p2中间
          If p3(0) < p1(0) And p3(0) < p2(0) Then 'p3点x在p1 p2左方
             rotAngleNunmer = 3
          End If
          If p3(0) > p1(0) And p3(0) > p2(0) Then 'p3点Y在p1 p2右方
             rotAngleNunmer = 4
          End If
       End If
    End If
     If p1(1) > p2(1) Then 'p1点在上边
       If p3(1) > p2(1) And p3(1) < p1(1) Then 'p3点y在p1 p2中间
          If p3(0) < p1(0) And p3(0) < p2(0) Then 'p3点x在p1 p2左方
             rotAngleNunmer = 3
          End If
          If p3(0) > p1(0) And p3(0) > p2(0) Then 'p3点Y在p1 p2右方
             rotAngleNunmer = 4
          End If
       End If
    End If
    Select Case rotAngleNunmer
        Case 1, 2
            rotAngle = 0
        Case 3, 4
            rotAngle = 90
    End Select
    rotAngle = rotAngle * 3.141592 / 180#       ' covert to Radians
    If ThisDrawing.ActiveSpace = acPaperSpace Then '当前为图纸空间
       Set dimObj = ThisDrawing.PaperSpace.AddDimRotated(p1, p2, p3, rotAngle)
    Else
       Set dimObj = ThisDrawing.ModelSpace.AddDimRotated(p1, p2, p3, rotAngle)
    End If
    dimObj.Layer = "标注"
    ThisDrawing.SendCommand "dco" & vbCr
End Sub

 楼主| 发表于 2008-7-10 17:50:00 | 显示全部楼层
新的问题出现了,在图纸空间中标注的尺寸很小,标注线型比例是1了,二CAD的dli命令会自动修改这个标注线型比例的,诶!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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