xq4u 发表于 2011-3-8 12:53:02

AutoLisp用DXF组码生成标注样式(标注文字样式、标注箭头样式)方法

本帖最后由 xq4u 于 2011-3-13 22:47 编辑

本文介绍AutoLisp用DXF组码来生成标注样式(标注文字样式、标注箭头样式)方法。
一、先生成标注文本样式(若已存在则忽略此步)
说明:用DXF组码生成标注样式中的标注文字样式时,其DXF参考中组码:340,说明:DIMTXSTY(参照的 STYLE 的句柄),DIMTXSTY系统变量:指定标注的文字样式。实际AutoLisp用DXF组码来生成标注样式中的标注文字样式时应是使用文字样式对象的图元名,即(340. <标注文字样式图元名>)。
二、生成标注箭头块(若已存在则忽略此步)
说明:
1、用DXF组码生成标注样式中的标注箭头样式时,其DXF参考中组码:


341
DIMLDRBLK(参照的 BLOCK 的句柄)

342
DIMBLK(参照的 BLOCK 的句柄)

343
DIMBLK1(参照的 BLOCK 的句柄)

344
DIMBLK2(参照的 BLOCK 的句柄)

实际AutoLisp用DXF组码来生成标注样式中的标注箭头样式时应是使用标注箭头块所对应的"BLOCK_RECORD"(块参照表)对象的图元名,而不是"BLOCK"对象的图元名,这点DXF参考中描述的似乎有误。
2、创建块会自动生成该块的BLOCK_RECORD(块参照表)数据,其"BLOCK_RECORD"对象的组码(2 . "块名")与"BLOCK"对象的组码(2 . "块名")相同。
3、要注意的是要根据查找标注箭头块所对应的"BLOCK_RECORD"(块参照表)对象的图元名,直接用(tblobjname table-name symbol) 会提示错误信息,因为 AutoLisp 的 tblobjname 命令有效的 table-name 值为 "LAYER"、"LTYPE"、"VIEW"、"STYLE"、"BLOCK"、"UCS"、"APPID"、"DIMSTYLE" 和 "VPORT",而"BLOCK_RECORD"是无效的 table-name 值,所以只能通过间接的方式来获得"BLOCK_RECORD"对象的图元名。
三、生成标注样式
1、关于DXF参考中组码:278,说明:DIMDSEP,指定一个单字符作为创建十进制标注时使用的小数分隔符,在创建标注样式中若要设置此项,则应用字符所对应的ASCII 码值,即使用(cons 278 (ascii "."))、(cons 278 (ascii ","))、(cons 278 (ascii " "))分别为设置成句点“.”、逗号“,”、空格“ ”。
四、样例
在此,给出一个完整的AutoLisp用DXF组码来生成标注样式(标注文字样式、标注箭头样式)的样例。需注意的是,用entmake生成对象时,entmake 函数不检查对象定义表中的名称冲突,所以它会重新定义现有的对象。
五、恳请各位大虾指出本文的错误和不足之处,不胜感激。

;;;=======AutoLisp用DXF组码来生成标注样式(标注文字样式、标注箭头样式)的样例=======
;;;运行时输入命令:(Dimstyle_b(1:100)_DXF),本实例在CAD2010中测试成功。
;;;转载请注明出处。明经通道:xq4u,2011年3月8日首发。

(defun Dimstyle_b(1:100)_DXF ()
;;;entmake *** "STYLE" *** object:
(entmake (list
    '(0 . "STYLE")
    '(100 . "AcDbSymbolTableRecord")
    '(100 . "AcDbTextStyleTableRecord")
    '(2 . "c小五(1:100)")
    '(70 . 0)
    '(40 . 0.21)
    '(41 . 1.0)
    '(50 . 0.0)
    '(71 . 0)
    '(42 . 2.5)
    '(3 . "SimSun.ttf")
    '(4 . "")
      )
    )
;;;entmake *** "BLOCK" *** object:
(entmake (list
    '(0 . "BLOCK")
    '(100 . "AcDbEntity")
    '(67 . 0)
    '(8 . "0")
    '(100 . "AcDbBlockBegin")
    '(70 . 0)
    '(10 0.0 0.0 0.0)
    '(2 . "_Oblique")
    '(1 . "")
      )
    )
;;;entmake *** "LINE" *** object:
(entmake (list
    '(0 . "LINE")
    '(100 . "AcDbEntity")
    '(67 . 0)
    '(8 . "0")
    '(62 . 0)
    '(6 . "ByBlock")
    '(370 . -2)
    '(100 . "AcDbLine")
    '(10 -0.5 -0.5 0.0)
    '(11 0.5 0.5 0.0)
    '(210 0.0 0.0 1.0)
      )
    )
;;;entmake *** "ENDBLK" *** object:
(entmake (list
    '(0 . "ENDBLK")
      )
    )
(entupd (tblobjname "Block" "_Oblique"))
;;;entmake *** "DIMSTYLE" *** object:
    (setq My_DIMSCALE 0.1);;;DIMSCALE:为标注变量(指定尺寸、距离或偏移量)设置全局比例因子
    (setq My_DIMASZ 2.5);;;DIMASZ:控制尺寸线和引线箭头的大小。并控制基线的大小。
    (setq My_DIMEXO 0.625);;;DIMEXO:指定尺寸界线偏移原点的距离
    (setq My_DIMDLI 3.75);;;DIMDLI:控制基线标注中尺寸线的间距
    (setq My_DIMEXE 1.25);;;DIMEXE:指定尺寸界线超出尺寸线的距离
    (setq My_DIMTXT 2.5);;;DIMTXT:指定标注文字的高度,除非当前文字样式具有固定的高度
    (setq My_DIMLFAC 100.0);;;DIMLFAC:设置线性标注测量值的比例因子
    (setq My_DIMTIH 0);;;DIMTIH:控制所有标注类型(坐标标注除外)的标注文字在尺寸界线内的位置
    (setq My_DIMTOH 0);;;DIMTOH:控制标注文字在尺寸界线外的位置
    (setq My_DIMTAD 1);;;DIMTAD:控制文字相对尺寸线的垂直位置
    (setq My_DIMZIN 8);;;DIMZIN:控制是否对主单位值作消零处理
    (setq My_DIMTOFL 1);;;DIMTOFL:控制是否将尺寸线绘制在尺寸界线之间(即使文字放置在尺寸界线之外)
    (setq My_DIMCLRD 256);;;DIMCLRD:为尺寸线、箭头和标注引线指定颜色
    (setq My_DIMCLRE 256);;;DIMCLRE:为尺寸界线指定颜色
    (setq My_DIMCLRT 256);;;DIMCLRT:为标注文字指定颜色
    (setq My_DIMAUNIT 1);;;DIMAUNIT:设置角度标注的单位格式
    (setq My_DIMDSEP 46);;;DIMDSEP:指定一个单字符作为创建十进制标注时使用的小数分隔符
    (setq My_DIMLWD -1);;;DIMLWD:(线宽枚举值)为尺寸线指定线宽。
    (setq My_DIMLWE -1);;;DIMLWE:(线宽枚举值)为延伸线指定线宽。
(entmake (list
    '(0 . "DIMSTYLE")
    '(100 . "AcDbSymbolTableRecord")
    '(100 . "AcDbDimStyleTableRecord")
    '(2 . "b(1:100)")
    '(70 . 0)
    '(141 . 2.5);;;DIMCEN:控制由 DIMCENTER、DIMDIAMETER 和 DIMRADIUS 命令绘制的圆或圆弧的圆心标记和中
心线图形
    '(143 . 0.0393701);;;DIMALTF:控制换算单位中的比例因子
    '(147 . 0.625);;;DIMGAP:当尺寸线分成段以在两段之间放置标注文字时,设置标注文字周围的距离
    '(171 . 3);;;DIMALTD:控制换算单位中小数位的位数
    '(271 . 1);;;DIMDEC:为所有标注类型(角度标注除外)的换算标注测量值指定文字前缀或后缀(或两者都指
定)
    '(272 . 1);;;DIMTDEC:为标注主单位的公差值设置显示的小数位位数
    '(274 . 3);;;DIMALTTD:设置换算标注单位中的公差值的小数位数
    '(283 . 0);;;DIMTOLJ:设置公差值相对于表面标注文字的垂直对正方式。
    '(284 . 8);;;DIMTZIN:控制是否对公差值作消零处理
    (cons 40 My_DIMSCALE)
    (cons 41 My_DIMASZ)
    (cons 42 My_DIMEXO)
    (cons 43 My_DIMDLI)
    (cons 44 My_DIMEXE)
    (cons 140 My_DIMTXT)
    (cons 144 My_DIMLFAC)
    (cons 73 My_DIMTIH)
    (cons 74 My_DIMTOH)
    (cons 77 My_DIMTAD)
    (cons 78 My_DIMZIN)
    (cons 172 My_DIMTOFL)
    (cons 176 My_DIMCLRD)
    (cons 177 My_DIMCLRE)
    (cons 178 My_DIMCLRT)
    (cons 275 My_DIMAUNIT)
    (cons 278 My_DIMDSEP)
    (cons 371 My_DIMLWD)
    (cons 372 My_DIMLWE)
    (cons 340 (tblobjname "STYLE" "c小五(1:100)"));;;DIMTXSTY:(参照的 STYLE 的句柄)指定标注的文字
样式。
    (cons 342 (cdr (assoc 330 (entget (tblobjname "BLOCK" "_Oblique")))));;;DIMBLK:(参照的 BLOCK 的
句柄)设置尺寸线或引线末端显示的箭头块。
      )
    )
(entupd (tblobjname "Dimstyle" "b(1:100)"))
(princ) ;静默退出
)
;;;=======AutoLisp用DXF组码来生成标注样式(标注文字样式、标注箭头样式)的样例=======

sfzyr 发表于 2021-1-4 23:44:46

标注箭头样式 用setvar 来改变系统变量很容易实现各种系统自带的箭头样式,请问怎么才能用DXF组码的形式,指定一种系统自带的箭头形式.我遍历了所有的块名,也没找到那个图元对应的东西,还请指点,谢谢

20060510412 发表于 2019-7-21 17:22:14

能不能介绍如果使用activex来实现呢,dxf组码,太繁琐了

Sonnenblumen 发表于 2020-7-13 12:12:54

感谢大师指点,解决了困扰我的问题,非常感谢

taocitc 发表于 2011-10-22 10:23:33

正需要,多谢

tm20038175 发表于 2012-5-26 19:07:52

好帖,我就是很不明白,在块中的标注块怎么更新!…

zxczhanghu 发表于 2013-2-28 18:29:23

下载了试试效果

smartstar 发表于 2013-2-28 21:27:26

学习学习!

jyzas 发表于 2013-8-12 21:06:47

整在找这方面,谢谢分享

hnfsf 发表于 2014-3-14 00:09:08

这个不错,好使,dxf帮助里面没有啊,哪儿能找到?

aben687 发表于 2014-3-14 12:05:43

一直想自己做的lsp 可惜水平太菜没做出来 下来学习一下

czcxxx 发表于 2015-9-10 10:30:03

整在找这方面,谢谢分享

start4444 发表于 2016-7-26 19:25:21

页: [1] 2
查看完整版本: AutoLisp用DXF组码生成标注样式(标注文字样式、标注箭头样式)方法