一个晚上的时间,我终于找到了 AutoCAD 图元对象透明度的 DXF 组码 440 及其取值的含义,图元对象的透明度终于可以用程序来控制了。
缘由
我院市政板块图纸的电子图章问题曾经困扰了我很长时间。在市政/公路行业,我们的图纸通常采用 A3 的图幅,集团的 A3 图框图签部分内容很多,但是其中并没有提供出图章、出图负责人章及注册工程师执业章的盖章空间,于是这些章就必须盖在绘图区域。本来在盖实体章的时代,这些内容盖在图纸绘图区域完全没有任何问题,即便印泥量再大不会掩盖图纸上文字图形等内容,底图上的内容完全能透过印泥,被阅读者轻松辨认。可在电子图章盖上去后,图纸上被印章文字占据的部分将被彻底遮盖住,给图纸的阅读带来了很大困难。因此,大多数人的做法是在图纸上为这些图章单独留出盖章空间,可这不但压缩了本来就不是很充裕的绘图空间,对于以文字为主的设计说明,留出这块空间还会把文字段落的行宽变得非常奇怪,使排版的文字段落版面相当丑陋。这样一来,图章的问题就成为亟待解决的问题。
解决方法
这个问题的解决方法其实也非常简单,那就是为引入的图章对象设置透明度。自 AutoCAD 2012 起,AutoCAD 为所有图元都增加了透明度的属性,无论是 pdfattach
引入的 PDF 底图(0 . "PDFUNDERLAY"
)还是 imageattach
引入的 光栅图像 (0 . "IMAGE"
),只要设置好透明度数值,并在打印选项选择 使用透明度打印
,在打印出的成果中相关对象都会表现出透明的效果,不会影响其覆盖的其他图线、文字等图元。透明度数值官方推荐采用 0~90 的整数,数字小则趋近于不透明,数字为 100 时则为完全透明。出于对程序性能的考虑,AutoCAD 默认所有图元都不附加透明度特性,其打印选项中默认也不采用 使用透明度打印
方式打印,因此,透明度的特性其实一直不太容易被人发现,要不是考虑图章的透明度问题,我直到现在都不会注意到 AutoCAD 为图元添加了这个特性。
手动修改对象的透明度非常简单,但是如果需要大批量修改对象透明度,就必须编写程序,那就需要知道控制图元透明度特性的 DXF 组码及其取值的含义,而修改的核心语句(AutoLisp 语句)只需要下面一句即可:
1 | (entmod (subst (cons dxfcode dxfvalue) (assoc dxfcode EntityLst) EntityLst)) |
在 AutoCAD 的官方帮助 Common Group Codes for Entities (DXF) 中给出了关于透明度的组码说明:
Group Code Description If omitted, defaults to… 440 Transparency value. The group code cannot be used by custom entities for their own data because the group code is reserved for AcDbEntity, class-level color data and AcDbEntity, class-level transparency data no default
很遗憾,虽然从中我们知道了控制图元透明度的组码是 440,但对其取值还是不知所以然。通过选择一条直线,将其图元名赋值给变量 ename
,修改其透明度为 0
后,通过 (assoc 440 (entget ename))
可以得到返回值 (440 . 33554687)
,再次修改透明度为 90
后运行相同代码,得到返回值 (440 . 33554457)
,二者数值相差 230,而:,等等,我好像发现了什么……调出计算器切换到程序员模块,33554687 对应的十六进制数是 0x020000FF
,而 33554457 对应十六进制数是 0x02000019
,那么 0x02000000
对应十进制数 33554432 似乎应该是对应透明度值为 100(如果 AutoCAD 允许这个取值的话),大胆尝试一下:
1 | (entmod (subst (cons 440 33554432) (assoc 440 (entget ename)) (entget ename)))) |
果然,属性框内透明度的数值变成了 100!居然被我猜到了!!那么,十六进制数0x020000XX
最后两位应该是 00
代表全透明,FF
代表不透明,有透明度时依透明度百分比则在此间内插,得到的十六进制数转换成十进制数就是 440 组码的取值。了解了这个关系,就可以通过程序任意设定对象的透明度了。
关于打印设置
AutoCAD 的打印选项 使用透明度打印
默认是不被选中的,这个问题可以通过修改 AutoCAD 系统变量 PLOTTRANSPARENCYOVERRIDE
的方法进行控制。该变量取值范围为 0~2的整数:
- 0:不使用透明度打印
- 1:根据打印设置中的选项选择是否使用透明度打印
- 2:使用透明度打印
因此,只要将 PLOTTRANSPARENCYOVERRIDE
设置为 2 即可实现使用透明度打印。
后续
其实,我了解这个方法并没有什么大的用处,关键是我们集团的信息部工程师要能知道怎么给自动加盖的图章设置上透明度。问题和方法我已经反应上去了,能不能改就看他们了。