Python AutoCAD 注释
文字标注......文本样式......尺寸标准......标注样式......多重引线......
Blog Links
一、前言
标注是向图形中添加测量注释的过程,我们可以为各种对象沿各个方向创建标注。要简化图形组织和标注缩放,建议在图纸空间上创建标注,而不是在模型空间中创建标注。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
=============================
Author: DalNur
Email: liyang@alu.hit.edu.cn
=============================
'''
from pyautocad import Autocad
from pyautocad import APoint
import math
acad = Autocad(create_if_not_exists = True)
acad.prompt("Hello! AutoCAD from pyautocad.")
print(acad.doc.Name)
二、单行文本
2.1. 创建新文本
textString = "Harb Insti of Tec"
insertPnt = APoint(0, 0)
height = 2.5
textObj = acad.model.AddText(textString, insertPnt, height)
# textString:文本内容;height:字高;
# 系统默认对齐夹点位于文字基线左侧;
# 采用系统默认对齐方式时,insertPnt为对齐夹点的位置坐标;
# 当用户自定义对齐方式时,insertPnt以对齐方式中的为准。
2.2. 对齐方式
AlignNum = 7
textObj.Alignment = AlignNum
# AlignNum为对齐夹点位置标识号,其取值范围为[0,14];
# 0 基线左对齐、1 基线居中对齐、2 基线右对齐;
# 7 表示对齐夹点位于 top cennter;
insertPnt = APoint(0, 10)
textObj.TextAlignmentPoint = insertPnt
# 设置对齐夹点在图纸空间中的绝对位置,可为任意一已知点;
# 若用户自定义对齐方式,则需设置此项。
Item | enum | Item | enum | Item | enum | Item | enum |
---|---|---|---|---|---|---|---|
acAlignmentLeft | 0 | acAlignmentMiddle | 4 | acAlignmentTopRight | 8 | acAlignmentBottomLeft | 12 |
acAlignmentCenter | 1 | acAlignmentFit | 5 | acAlignmentMiddleLeft | 9 | acAlignmentBottomCenter | 13 |
acAlignmentRight | 2 | acAlignmentTopLeft | 6 | acAlignmentMiddleCenter | 10 | acAlignmentBottomRight | 14 |
acAlignmentAligned | 3 | acAlignmentTopCenter | 7 | acAlignmentMiddleRight | 11 |
2.3. 文本缩放
BasePoint = insertPnt
ScaleFactor = 5
textObj.ScaleFactor = 5
# 水平方向文本缩放,即只缩放字宽(x方向),不缩放字高(y方向);
# ScaleFactor为比例系数,非负,>1为放大,<1为缩小。宽度因子
textObj.ScaleEntity(BasePoint, ScaleFactor)
# 两个方向同步缩放;
# 基点与insertPnt重合,文字放大后对齐夹点位置保持不变。
三、多行文本
四、文本样式
4.1. 创建文字样式
txtStyleObj = acad.ActiveDocument.TextStyles.Add("HIT_TxtStyle")
4.2. 将特定文字样式设为当前
acad.ActiveDocument.ActiveTextStyle = acad.ActiveDocument.TextStyles.Item("Standard")
4.3. 设置字体
4.3.1. 为当前文本样式设置字体
acad.ActiveDocument.ActiveTextStyle.SetFont("楷体", False, False, 1, 0 or 0)
# acad.ActiveDocument.ActiveTextStyle.SetFont(Typeface, Bold, Italic, charSet, PitchandFamily)
# Typeface 字体名称;
# Bold 加粗,布尔值,False为不加粗字体;
# Italic 倾斜,布尔值,False为倾斜字体;
# CharSet 字体字符集,1为默认字符集;
# PitchAndFamily 字节及笔画形式。
4.3.2. 为特定文本样式设置字体
acad.ActiveDocument.TextStyles.Item("HIT_TxtStyle").SetFont("宋体", False, False, 1, 0 or 0)
4.4. 设置字体倾斜角度
txtStyleObj.ObliqueAngle = math.radians(30)
# 倾斜角度变化范围为[-85,85],取正值时右偏。
五、尺寸标注
5.1. 线性及旋转线性标注
import math
XLine1Point = APoint(5, 25)
XLine2Point = APoint(25, 35)
DimLineLocation = APoint(10, 20)
RotationAngle = math.radians(0)
dimRotObj = acad.model.AddDimRotated(XLine1Point, XLine2Point, DimLineLocation, RotationAngle)
# XLine1Point 第一尺寸界线的起点;
# XLine2Point 第二尺寸界线的起点;
# DimLineLocation 尺寸线定位点,尺寸线或其延长线过该点;
# RotationAngle 尺寸线与水平方向的夹角,去弧度制;
# RotationAngle=0 水平标注,RotationAngle=90 竖直标注。
5.2. 对齐标注
ExtLine1Point = APoint(5, 25)
ExtLine2Point = APoint(25, 35)
TextPosition = APoint(-5, 25)
dimAliObj = acad.model.AddDimAligned(ExtLine1Point, ExtLine2Point, TextPosition)
# ExtLine1Point 第一尺寸界线的起点;
# ExtLine2Point 第二尺寸界线的起点;
# TextPosition 尺寸线定位点,尺寸线或其延长线过该点。
# dimObj.Update
5.3. 角度标注
AngleVertex = APoint(0, 0)
FirstEndPoint = APoint(6, 8)
SecondEndPoint = APoint(6, -8)
TextPoint = APoint(10, 10)
dimAngObj = acad.model.AddDimAngular(AngleVertex, FirstEndPoint, SecondEndPoint, TextPoint)
# AngleVertex 角度顶点;
# FirstEndPoint 第一尺寸界线端点;
# SecondEndPoint 第二尺寸界线端点;
# TextPoint 尺寸圆弧线定位点,即尺寸圆弧线过该点。
5.4. 弧长标注
ArcCenter = APoint(0, 0)
FirstEndPoint = APoint(6, 8)
SecondEndPoint = APoint(6, -8)
ArcPoint = APoint(20, 0)
dimArcObj = acad.model.AddDimArc(ArcCenter, FirstEndPoint, SecondEndPoint, ArcPoint)
# ArcCenter 圆弧中心;
# FirstEndPoint 第一尺寸界线端点;
# SecondEndPoint 第二尺寸界线端点;
# ArcPoint 尺寸圆弧线定位点,即尺寸圆弧线过该点。
5.5. 直径及半径标注
ChordPoint = APoint(0, 10)
FarChordPoint = APoint(0, -10)
LeaderLength = 40
dimDiaObj = acad.model.AddDimDiametric(ChordPoint, FarChordPoint, LeaderLength)
# ChordPoint 圆任意一直径的端点;
# FarChordPoint 直径的另一端点;
# LeaderLength 引线长度,为点ChordPoint到标准文字定位夹点的距离;
# 标注类型可在相应的系统变量如DIMUPT等中更改。
Center = APoint(0, 0)
ChordPoint = APoint(10, 0)
LeaderLength = 10
dimRadObj = acad.model.AddDimRadial(Center, ChordPoint, LeaderLength)
# Center 被标注圆或圆弧的圆心
六、标注样式
6.1. 创建新标注样式
DimStyleObj = acad.ActiveDocument.DimStyles.Add("HIT_DimStyle")
print(dimAliObj.StyleName)
# 打印标注对象的标准样式名称
# 系统自带标注样式 ISO-25
6.2. 将特定标注样式设为当前
acad.ActiveDocument.ActiveDimStyle = acad.ActiveDocument.DimStyles.Item("HIT_DimStyle")
6.3. 设置尺寸线及尺寸界限
说明: 以下即 (3) ~ (6) 的设置将生效为<样式替代>,程序自动画图时<样式替代>不起作用,新添加的标注仍采用系统默认。手动画图时<样式替代>起作用,新添加的标注<样式替代>。
设置永久标注样式见 (7),后续添加详细代码。
标注样式替代是对当前标注样式中的指定设置所做的更改,它与在不更改当前标注样式的情况下更改尺寸标注系统变量等效。使用标注样式替代,无需更改当前标注样式便可临时更改标注系统变量。
6.3.1. 超出标记
acad.ActiveDocument.SetVariable("DIMDLE", 0)
# 当箭头使用倾斜、建筑标记、积分和无标记时尺寸线超过尺寸界线的距离。
6.3.2. 基线间距
acad.ActiveDocument.SetVariable("DIMDLI", 3.75)
# 设定尺寸线之间的距离;
# 如有必要,每条尺寸线都将按此值偏离其前一尺寸线,以避免覆盖它。
6.3.3. 超出尺寸线
acad.ActiveDocument.SetVariable("DIMEXE", 1.25) # 指定尺寸界线超出尺寸线的距离。
6.3.4. 起点偏移量
acad.ActiveDocument.SetVariable("DIMEXO", 0.625) # 设定自图形中定义标注的点到尺寸界线的偏移距离。
6.4. 设置箭头
6.4.1. 设定尺寸线箭头类型
acad.ActiveDocument.SetVariable("DIMBLK", "_ARCHTICK") # "_ARCHTICK"表示建筑标记
6.4.2. 设定引线箭头
acad.ActiveDocument.SetVariable("DIMLDRBLK", "") # ""表示实心闭合
6.4.3. 尺寸线箭头大小
acad.ActiveDocument.SetVariable("DIMASZ", 2.5)
6.5. 设置标注文字
6.5.1. 标注文字样式
acad.ActiveDocument.SetVariable("DIMTXSTY", "HIT_TxtStyle")
6.5.2. 标注文字高度
acad.ActiveDocument.SetVariable("DIMTXT", 2.5)
# 设定当前标注文字样式的高度;
# 如果在此选项卡上指定的字样式具有固定的文字高度,则该高度将替代在此处设置的文字高度;
# 如果要在此处设置标注文字的高度,请确保将文字样式的高度设置为 0。
6.5.3. 标注文字位置
acad.ActiveDocument.SetVariable("DIMTAD", 1)
# 控制标注文字相对尺寸线的垂直位置;
# 0 表示标注文字在尺寸界线之间居中放置;
# 1 表示将标注文字放置在尺寸线上方,从尺寸线到文字最低基线的距离为当前 DIMGAP 的值。
acad.ActiveDocument.SetVariable("DIMJUST", 0)
# 水平控制标注文字在尺寸线上相对于尺寸界线的水平位置;
# 0 表示将文字置于尺寸线之上,并在尺寸界线之间置中对正。
acad.ActiveDocument.SetVariable("DIMGAP", 0.625)
# 设定文字相对尺寸线的位置。
6.5.4. 标注文字对齐
acad.ActiveDocument.SetVariable("DIMTIH", 0)
# 控制所有标注类型(坐标标注除外)的标注文字在尺寸界线内的位置;
# 0 表示将文字与尺寸线对齐;
# 1 表示水平绘制文字。
acad.ActiveDocument.SetVariable("DIMTOH", 0)
# 控制标注文字在尺寸界线外的位置。
6.5.5. 标注文字替代
修改实际尺寸数值为用户自定义数值。例如:标注的实际长度为20,用户自定义的数值为171,具体代码如下:
XLine1Point = APoint(5, 25)
XLine2Point = APoint(25, 35)
DimLineLocation = APoint(10, 20)
RotationAngle = math.radians(0)
dimRotObj = acad.model.AddDimRotated(XLine1Point, XLine2Point, DimLineLocation, RotationAngle)
dimRotObj.TextOverride = 171 # 指定文字替代为171,即171替代20。
dimRotObj.TextOverride = "" # 恢复标注为实际尺寸数值20
dimRotObj.TextOverride = "<> mm" # 恢复标注为实际尺寸数值并加个单位
dimRotObj.Update()
6.6. 设置主单位
6.6.1. 线性标注精度
acad.ActiveDocument.SetVariable("DIMDEC", 2) # 设定标注文字中的小数位数;2 表示显示小数点后三位;
6.6.2. 小数分隔符
acad.ActiveDocument.SetVariable("DIMDSEP", ".") # "."表示小数分隔符,也可设置为","。
acad.ActiveDocument.SetVariable("DIMADEC", -1) # 设置角度标注精度与线性标注精度相同
6.7. 设置永久标注样式
## (7)、设置永久标注样式
### ①、添加三个标注样式
dimstyleobj_1 = DimStyleObj = acad.ActiveDocument.DimStyles.Add("newStyle1")
dimstyleobj_2 = DimStyleObj = acad.ActiveDocument.DimStyles.Add("newStyle2")
dimstyleobj_3 = DimStyleObj = acad.ActiveDocument.DimStyles.Add("newStyle3")
### ②、为三个标注样式分别设置具体样式
dimstyleobj_1.CopyFrom(acad.ActiveDocument.ModelSpace(0))
# (方法一)
# 与图形空间中已存在的标注图元样式一致;
# 0为模型空间中的第一个图元,此为示例;
# 具体操作时0应替换为已知标注图元在图纸空间中的索引号。
dimstyleobj_2.CopyFrom(acad.ActiveDocument.DimStyles.Item("newStyle1"))
# (方法二)
# 与标注样式newStyle1一致
acad.ActiveDocument.SetVariable("DIMCLRD", 3) # 设置尺寸线的颜色为绿色
acad.ActiveDocument.SetVariable("DIMBLK", "_ARCHTICK") # "_ARCHTICK"表示建筑标记
acad.ActiveDocument.SetVariable("DIMASZ", 2) # 尺寸线箭头大小
dimstyleobj_3.CopyFrom(acad.ActiveDocument)
# (方法三)
# 与当前文件的设置保持一致
acad.ActiveDocument.ActiveDimStyle = acad.ActiveDocument.DimStyles.Item("newStyle3")
# 以下画出的标注即采用标注样式newStyle3
ExtLine1Point = APoint(5, 25)
ExtLine2Point = APoint(25, 35)
TextPosition = APoint(-5, 25)
dimAliObj = acad.model.AddDimAligned(ExtLine1Point, ExtLine2Point, TextPosition)
print(dimAliObj.styleName)
# 设置永久标注样式的思路:
# 若采用方法一,则需要提前绘制好相应的标注图元,
# 如:尺寸线、尺寸界线、箭头尺寸等,以方便引用,而后删除。
# 若采用方法三,则需要利用SetVariable方法设置好相应的系统变量,而后引用。
# 方法二为直接复制已有标注样式。
# 方法四(采用command方式)
# DimStyle1 = acad.ActiveDocument.DimStyles.Add("DimStyle1") # 创建标注式样
# acad.ActiveDocument.ActiveDimStyle = DimStyle1
# acad.ActiveDocument.SetVariable("DIMCLRD", 1)
# acad.ActiveDocument.SetVariable("DIMCLRE", 1)
# acad.ActiveDocument.SetVariable("DIMEXE", 3)
# acad.ActiveDocument.SetVariable("DIMEXO", 1.75)
# acad.ActiveDocument.SetVariable("DIMFXLON", 1)
# acad.ActiveDocument.SetVariable("DIMFXL", 3)
# acad.ActiveDocument.SetVariable("DIMBLK", "_OBLIQUE")
# acad.ActiveDocument.SetVariable("DIMBLK1", "_OBLIQUE")
# acad.ActiveDocument.SetVariable("DIMBLK2", "_OBLIQUE")
# acad.ActiveDocument.SetVariable("DIMLDRBLK", "_OBLIQUE")
# acad.ActiveDocument.SetVariable("DIMASZ", 5)
# acad.ActiveDocument.SetVariable("DIMCEN", 3)
# acad.ActiveDocument.SetVariable("DIMARCSYM", 1)
# acad.ActiveDocument.SetVariable("DIMCLRT", 1)
# acad.ActiveDocument.SetVariable("DIMTXT", 4)
# acad.ActiveDocument.SetVariable("DIMTAD", 1)
# acad.ActiveDocument.SetVariable("DIMTOH", 0)
# acad.ActiveDocument.SetVariable("DIMTMOVE", 2)
# acad.ActiveDocument.SetVariable("DIMDEC", 1)
# print(chr(13))
# acad.ActiveDocument.SendCommand("-dimstyle" + chr(13) + "S" + chr(13) + "DimStyle1" + chr(13) + "Y" + chr(13))
# print("-dimstyle" + chr(13) + "S" + chr(13) + "DimStyle1" + chr(13) + "Y" + chr(13))
## 其他
# dimAliObj.StyleName = "ISO-25"
# dimAliObj.Update()
七、多重引线
7.1. 创建多重引线
ArrowPnt = APoint(0, 0)
BaselinePnt = APoint(10, 10)
PntsArray = np.array([ArrowPnt, BaselinePnt])
PntsArray = PntsArray.reshape(1, PntsArray.shape[0] * PntsArray.shape[1])[0]
MLeaderObj = acad.model.AddMLeader(PntsArray, 0)
# ArrowPnt 箭头位置;
# BaselinePnt 基线位置 ;
# 1 表示多重引线的索引号,为正整数。
7.2. 设置箭头大小
MLeaderObj.ArrowheadSize = 2 # 指箭头高度;此项将覆盖系统变量DIMASZ的值。
7.3. 设置基线长度
MLeaderObj.DoglegLength = 8
7.4. 设置基线间隙
MLeaderObj.LandingGap = 3 # 基线端点到文字起点的距离
7.5. 指定文字样式
MLeaderObj.TextStyleName = "HIT_TxtStyle"
7.6. 指定文字内容
MLeaderObj.TextString = "HIT"
八、尾声
以上,便是一些关于 AutoCAD 注释 的基本代码,因篇幅有限,某些非关键功能未做详细介绍,如有疑问,欢迎邮件来询。
本文部分功能的实现离不开广大博友的大力帮助,有些功能看似简单,但第一次实现出来却是相当不容易的。
鉴于,相关示例代码相对较少,特写本文,一方面是为自己的阶段性学习做一个总结,另一方面更是为有需要的人提供多一点参考。
如果您已实现一些本文未提及的功能,还请在评论区呈现,以便为后续学习者提供更多的帮助。
胸藏文墨怀若谷,腹有诗书气自华,希望各位都能在知识的pāo子里快乐徜徉。
因个人水平有限,文中难免有所疏漏,还请各位大神不吝批评指正。
最后,祝各位攻城狮们,珍爱生命,保护发际线!
本文最早发表于 2018-12-13 18:20:21,作为博客 Python 二次开发 AutoCAD 简介 的一部分。
为了清晰直观,于 2019-07-26 16:21:52 单独创建本文。
本文部分内容,源于网络!
欢迎大家点赞、评论及转载,转载请注明出处!
为我打call,不如为我打款!
打赏可备注邮箱,本人将赠送本系列博客的全部 Python 源代码。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)