最近更新于 2025-12-02 23:04
前言
2025/11/12
我研究制图首选项通过编程设置的目的是:实现将一个模板的制图首选项复制给另外一个部件,做到一键设置制图首选项(关系到出图纸时的字体、标注、表等设置内容)。
在零件内插入图纸页的时候,制图首选项的设置内容不是来源于图纸模板,而是零件模板。然而零件模板有很多,新建模型、新建装配、导入step、导入x_t、导入sldprt、导入sldasm 等等都是不同的模板,分别去设置模板工作量大,去找这些模板文件在什么位置也有点烦人。因此我想通过程序读取模板的制图首选项,再把值设置给部件,这样只需要设置好一个模板文件,使用时同步到工作部件就行。
测试环境
- Windows 11 25H2
- NX 2506
- 内置 Python 3.12.8
测试用通用代码
后续的测试项都以 DraftingPreferencesTest 类方法呈现,只需要为 DraftingPreferencesTest 类添加方法即可,运行代码时会自动遍历 DraftingPreferencesTest 类方法执行
import NXOpen
from NXOpen import Annotations, Drafting, DisplayableObject, LineFontBuilder
import inspect
class DraftingPreferencesTest:
"""
制图首选项测试类
"""
@staticmethod
def common(part: NXOpen.Part, lw: NXOpen.ListingWindow):
"""
示例
"""
lw.WriteLine('这是示例程序')
lw.WriteLine('只需要将测试方法放置于 DraftingPreferencesTest 类中,执行时会自动调用')
def getEnumName(enumClass, value) -> str | None:
"""
获取枚举类中对应值的名称
Args:
enumClass (enum): 枚举类
value (int): 枚举值
Returns:
str: 枚举名称
"""
for attrName in dir(enumClass):
# 排除特殊属性
if attrName.startswith("__"):
continue
# 获取属性值
attrValue = getattr(enumClass, attrName)
if attrValue == value:
return attrName
return None
def getPartDraftingPreferences(part: NXOpen.Part) -> Drafting.PreferencesBuilder:
"""
获取部件制图首选项
Args:
part (NXOpen.Part): 部件
Returns:
Drafting.PreferencesBuilder: 制图首选项对象
"""
preferences = part.SettingsManager.CreatePreferencesBuilder()
preferences.TableSection.ApplyToAllSections = True # 应用到所有表格区段
return preferences
def callUserDefinedMethods(obj: object, part: NXOpen.Part, lw: NXOpen.ListingWindow):
"""
调用用户定义的方法
Args:
obj (object): 被调用方法所属类对象
part (NXOpen.Part): 部件
lw (NXOpen.ListingWindow): 列表窗口
"""
# 获取类
cls = obj.__class__
# 遍历用户定义方法
for name, func in inspect.getmembers(cls, predicate=inspect.isfunction):
# 排除魔术方法和特殊方法
if name.startswith("__") or name.startswith("_"):
continue
# 获取函数签名,检查参数数量
sig = inspect.signature(func)
expectedParams = list(sig.parameters.keys())
if len(expectedParams) == 2:
getattr(obj, name)(part, lw)
else:
lw.WriteLine(f'方法 {name} 不符合要求,未调用')
def main():
# 获取会话
session = NXOpen.Session.GetSession()
# 列表窗口
lw = session.ListingWindow
if not lw.IsOpen:
lw.Open()
# 工作部件
workPart = session.Parts.Work
# 调用制图首选项测试类
callUserDefinedMethods(DraftingPreferencesTest(), workPart, lw)
if __name__ == '__main__':
main()

公共
文字


class DraftingPreferencesTest:
"""
制图首选项测试类
"""
@staticmethod
def commonText(part: NXOpen.Part, lw: NXOpen.ListingWindow):
"""
公共 - 文字
"""
# 第一次获取首选项
preferences1 = getPartDraftingPreferences(part)
# 【1】对齐位置 #
# 读取
alignPosition = preferences1.AnnotationStyle.LetteringStyle.AlignPosition
alignPositionName = getEnumName(Annotations.AlignmentPosition, alignPosition)
lw.WriteLine(f'初始对齐位置:{alignPositionName}')
# 修改
preferences1.AnnotationStyle.LetteringStyle.AlignPosition = Annotations.AlignmentPosition.BottomCenter
# 【2】文字对正 #
# 读取
horizontalTextJustification = preferences1.AnnotationStyle.LetteringStyle.HorizontalTextJustification
horizontalTextJustificationName = getEnumName(Annotations.TextJustification, horizontalTextJustification)
lw.WriteLine(f'初始文字对正:{horizontalTextJustificationName}')
# 修改
preferences1.AnnotationStyle.LetteringStyle.HorizontalTextJustification = Annotations.TextJustification.Center
# 【3】字体 #
# 读取
fontIndex = preferences1.AnnotationStyle.LetteringStyle.GeneralTextFont
fontName = part.Fonts.GetFontName(fontIndex)
lw.WriteLine(f'初始字体:{fontName}')
# 修改
fontIndex = part.Fonts.AddFont('黑体', NXOpen.FontCollection.Type.Standard)
preferences1.AnnotationStyle.LetteringStyle.GeneralTextFont = fontIndex
# 【4】高度
# 读取
generalTextSize = preferences1.AnnotationStyle.LetteringStyle.GeneralTextSize
lw.WriteLine(f'初始高度:{generalTextSize}')
# 修改
preferences1.AnnotationStyle.LetteringStyle.GeneralTextSize = 1.0
#【5】NX 字体间隙因子
# 读取
generalNxTextCharacterSpaceFactor = preferences1.AnnotationStyle.LetteringStyle.GeneralNxTextCharacterSpaceFactor
lw.WriteLine(f'初始 NX 字体间隙因子:{generalNxTextCharacterSpaceFactor}')
# 修改
preferences1.AnnotationStyle.LetteringStyle.GeneralNxTextCharacterSpaceFactor = 2.0
#【6】标准字体间隙因子
# 读取
generalStandardTextCharacterSpaceFactor = preferences1.AnnotationStyle.LetteringStyle.GeneralStandardTextCharacterSpaceFactor
lw.WriteLine(f'初始标准字体间隙因子:{generalStandardTextCharacterSpaceFactor}')
# 修改
preferences1.AnnotationStyle.LetteringStyle.GeneralStandardTextCharacterSpaceFactor = 3.0
# 【7】文本宽高比
# 读取
generalTextAspectRatio = preferences1.AnnotationStyle.LetteringStyle.GeneralTextAspectRatio
lw.WriteLine(f'初始文本宽高比:{generalTextAspectRatio}')
# 修改
preferences1.AnnotationStyle.LetteringStyle.GeneralTextAspectRatio = 4.0
# 【8】符号宽高比
# 读取
generalTextSymbolAspectRatio = preferences1.AnnotationStyle.LetteringStyle.GeneralTextSymbolAspectRatio
lw.WriteLine(f'初始符号宽高比:{generalTextSymbolAspectRatio}')
# 修改
preferences1.AnnotationStyle.LetteringStyle.GeneralTextSymbolAspectRatio = 5.0
# 【9】行间隙因子
# 读取
generalTextLineSpaceFactor = preferences1.AnnotationStyle.LetteringStyle.GeneralTextLineSpaceFactor
lw.WriteLine(f'初始行间隙因子:{generalTextLineSpaceFactor}')
# 修改
preferences1.AnnotationStyle.LetteringStyle.GeneralTextLineSpaceFactor = 6.0
# 【10】文本角度
angle = preferences1.AnnotationStyle.LetteringStyle.Angle
lw.WriteLine(f'初始文本角度:{angle}')
# 修改
preferences1.AnnotationStyle.LetteringStyle.Angle = 90.0
# 【11】高度因子
gdtFrameHeightFactor = preferences1.AnnotationStyle.LetteringStyle.GdtFrameHeightFactor
lw.WriteLine(f'初始高度因子:{gdtFrameHeightFactor}')
# 修改
preferences1.AnnotationStyle.LetteringStyle.GdtFrameHeightFactor = 3.0
# 【12】符号字体文件
symbolFontFile = preferences1.AnnotationStyle.LetteringStyle.SymbolFontFile
lw.WriteLine(f'初始符号字体文件:{symbolFontFile}')
# 修改
preferences1.AnnotationStyle.LetteringStyle.SymbolFontFile = 'NX ISO Symbols'
# 提交修改
preferences1.Commit()
# 销毁
preferences1.Destroy()
###########################################################################################
lw.WriteLine('-' * 100)
# 第二次获取首选项
preferences2 = getPartDraftingPreferences(part)
# 【1】读取对齐位置
alignPosition = preferences2.AnnotationStyle.LetteringStyle.AlignPosition
alignPositionName = getEnumName(Annotations.AlignmentPosition, alignPosition)
lw.WriteLine(f'修改后对齐位置:{alignPositionName}')
# 【2】读取文字对正
horizontalTextJustification = preferences2.AnnotationStyle.LetteringStyle.HorizontalTextJustification
horizontalTextJustificationName = getEnumName(Annotations.TextJustification, horizontalTextJustification)
lw.WriteLine(f'修改后文字对正:{horizontalTextJustificationName}')
# 【3】读取字体
fontIndex = preferences2.AnnotationStyle.LetteringStyle.GeneralTextFont
fontName = part.Fonts.GetFontName(fontIndex)
lw.WriteLine(f'修改后字体:{fontName}')
# 【4】读取高度
generalTextSize = preferences2.AnnotationStyle.LetteringStyle.GeneralTextSize
lw.WriteLine(f'修改后高度:{generalTextSize}')
# 【5】读取 NX 字体间隙因子
generalNxTextCharacterSpaceFactor = preferences2.AnnotationStyle.LetteringStyle.GeneralNxTextCharacterSpaceFactor
lw.WriteLine(f'修改后 NX 字体间隙因子:{generalNxTextCharacterSpaceFactor}')
# 【6】读取标准字体间隙因子
generalStandardTextCharacterSpaceFactor = preferences2.AnnotationStyle.LetteringStyle.GeneralStandardTextCharacterSpaceFactor
lw.WriteLine(f'修改后标准字体间隙因子:{generalStandardTextCharacterSpaceFactor}')
# 【7】读取文本宽高比
generalTextAspectRatio = preferences2.AnnotationStyle.LetteringStyle.GeneralTextAspectRatio
lw.WriteLine(f'修改后文本宽高比:{generalTextAspectRatio}')
# 【8】读取符号宽高比
generalTextSymbolAspectRatio = preferences2.AnnotationStyle.LetteringStyle.GeneralTextSymbolAspectRatio
lw.WriteLine(f'修改后符号宽高比:{generalTextSymbolAspectRatio}')
# 【9】读取行间隙因子
generalTextLineSpaceFactor = preferences2.AnnotationStyle.LetteringStyle.GeneralTextLineSpaceFactor
lw.WriteLine(f'修改后行间隙因子:{generalTextLineSpaceFactor}')
# 【10】读取文本角度
angle = preferences2.AnnotationStyle.LetteringStyle.Angle
lw.WriteLine(f'修改后文本角度:{angle}')
# 【11】读取高度因子
gdtFrameHeightFactor = preferences2.AnnotationStyle.LetteringStyle.GdtFrameHeightFactor
lw.WriteLine(f'修改后高度因子:{gdtFrameHeightFactor}')
# 【12】读取符号字体文件
symbolFontFile = preferences2.AnnotationStyle.LetteringStyle.SymbolFontFile
lw.WriteLine(f'修改后符号字体文件:{symbolFontFile}')
# 销毁
preferences2.Destroy()

直线/箭头
class DraftingPreferencesTest:
"""
制图首选项测试类
"""
@staticmethod
def line_arrow(part: NXOpen.Part, lw: NXOpen.ListingWindow):
"""
公共 - 直线/箭头
"""
preference = getPartDraftingPreferences(part)
# 【一】 箭头
# 【1】工作流程 - 自动定位
# preference.AnnotationStyle.DimensionStyle.TextArrowPlacement = Annotations.TextPlacement.Automatic # 自动定位
preference.AnnotationStyle.DimensionStyle.TextArrowPlacement = Annotations.TextPlacement.ManualArrowsIn # 手动,箭头向内
# preference.AnnotationStyle.DimensionStyle.TextArrowPlacement = Annotations.TextPlacement.ManualArrowsOut # 手动,箭头向外
# preference.AnnotationStyle.DimensionStyle.TextArrowPlacement = Annotations.TextPlacement.ManualArrowsInSameDirection # 手动,箭头同向
# 【2】箭头类型
arrowType = Annotations.ArrowheadType.FilledArrow
preference.AnnotationStyle.LineArrowStyle.FirstArrowType = arrowType # 第一侧
preference.AnnotationStyle.LineArrowStyle.SecondArrowType = arrowType # 第二侧
# 【3】箭头颜色
arrowheadColor = part.Colors.Find('Red')
preference.AnnotationStyle.LineArrowStyle.FirstArrowheadColor = arrowheadColor # 第一侧
preference.AnnotationStyle.LineArrowStyle.SecondArrowheadColor = arrowheadColor # 第二侧
# 【4】 箭头样式
arrowheadFont = DisplayableObject.ObjectFont.Dotted
preference.AnnotationStyle.LineArrowStyle.FirstArrowheadFont = arrowheadFont # 第一侧
preference.AnnotationStyle.LineArrowStyle.SecondArrowheadFont = arrowheadFont # 第二侧
# 【5】 箭头宽度
arrowheadWidth = Annotations.LineWidth.One # 1-9 种线宽对应:用户默认设置 - 基本环境 - 线宽
preference.AnnotationStyle.LineArrowStyle.FirstArrowheadWidth = arrowheadWidth # 第一侧
preference.AnnotationStyle.LineArrowStyle.SecondArrowheadWidth = arrowheadWidth # 第二侧
# 【6】 箭头长度
preference.AnnotationStyle.LineArrowStyle.ArrowheadLength = 4.0
# 【7】箭头角度
preference.AnnotationStyle.LineArrowStyle.ArrowheadIncludedAngle = 30.0
# 【8】圆点直径
preference.AnnotationStyle.LineArrowStyle.DotArrowheadDiameter = 3.0
# 【9】显示箭头/箭头线
preference.AnnotationStyle.DimensionStyle.DimArrowDisplay = Annotations.ArrowDisplay.Two # 两个都显示
# 【二】箭头线
# 【1】 箭头线颜色
arrowLineColor = part.Colors.Find('Blue')
preference.AnnotationStyle.LineArrowStyle.FirstArrowLineColor = arrowLineColor # 第一侧
preference.AnnotationStyle.LineArrowStyle.SecondArrowLineColor = arrowLineColor # 第二侧
# 【2】 箭头线样式
arrowLineFont = DisplayableObject.ObjectFont.DottedDashed
preference.AnnotationStyle.LineArrowStyle.FirstArrowLineFont = arrowLineFont # 第一侧
preference.AnnotationStyle.LineArrowStyle.SecondArrowLineFont = arrowLineFont # 第二侧
# 【3】 箭头线宽度
arrowLineWidth = Annotations.LineWidth.Three
preference.AnnotationStyle.LineArrowStyle.FirstArrowLineWidth = arrowLineWidth # 第一侧
preference.AnnotationStyle.LineArrowStyle.SecondArrowLineWidth = arrowLineWidth # 第二侧
# 【4】文本与线的间隙
preference.AnnotationStyle.LineArrowStyle.TextToLineDistance = 2.0
# 【5】剪切坐标尺寸线
preference.AnnotationStyle.LineArrowStyle.ClipOrdinateDimensionLine = True
# 【6】短划线长度
preference.AnnotationStyle.LineArrowStyle.StubLength = 0.15
# 【7】短划线上文本间隙因子
preference.AnnotationStyle.LineArrowStyle.TextOverStubFactor = 0.22
# 【8】短划线显示符号
preference.AnnotationStyle.LineArrowStyle.StubSymbolType = Annotations.StubSymbolType.AllAround
# 【9】全圆符号大小
preference.AnnotationStyle.LineArrowStyle.AllAroundSymbolSize = 3.3
# 【10】指引线竖直对齐
preference.AnnotationStyle.LineArrowStyle.LeaderLocation = Annotations.VerticalTextJustification.Bottom
# 【11】指引线上文本间隙因子
preference.AnnotationStyle.LineArrowStyle.TextOverLeaderGapFactor = 0.45
# 【三】延伸线
# 【1】显示延伸线
preference.AnnotationStyle.DimensionStyle.ExtensionLineDisplay = Annotations.ExtensionLineDisplay.NotSet # 都不显示
# 【2】延伸线颜色
extensionLineColor = part.Colors.Find('Green')
preference.AnnotationStyle.LineArrowStyle.FirstExtensionLineColor = extensionLineColor # 第一侧
preference.AnnotationStyle.LineArrowStyle.SecondExtensionLineColor = extensionLineColor # 第二侧
# 【3】延伸线样式
extensionLineFont = DisplayableObject.ObjectFont.DottedDashed
preference.AnnotationStyle.LineArrowStyle.FirstExtensionLineFont = extensionLineFont # 第一侧
preference.AnnotationStyle.LineArrowStyle.SecondExtensionLineFont = extensionLineFont # 第二侧
# 【4】延伸线宽度
extensionLineWidth = Annotations.LineWidth.Eight
preference.AnnotationStyle.LineArrowStyle.FirstExtensionLineWidth = extensionLineWidth # 第一侧
preference.AnnotationStyle.LineArrowStyle.SecondExtensionLineWidth = extensionLineWidth # 第二侧
# 【5】延伸线间隙
posToExtensionLineDistance = 0.11
preference.AnnotationStyle.LineArrowStyle.FirstPosToExtensionLineDistance = posToExtensionLineDistance # 第一侧
preference.AnnotationStyle.LineArrowStyle.SecondPosToExtensionLineDistance = posToExtensionLineDistance # 第二侧
# 【6】延伸线延展
preference.AnnotationStyle.LineArrowStyle.LinePastArrowDistance = 33.0
# 【7】延伸线角度
preference.AnnotationStyle.LineArrowStyle.ObliqueExtensionLineAngle = 45.0
# 【8】指引线附着延伸
preference.AnnotationStyle.LineArrowStyle.DatumLengthPastArrow = 55.0
# 【四】断开
# 【1】创建断开
preference.AnnotationStyle.BreakSettings.CreateBreaks = True
# 【2】断开大小
preference.AnnotationStyle.BreakSettings.BreakSize = 1.0
# 【五】透视缩短符号
# 【1】类型
preference.AnnotationStyle.ForeshorteningSymbolSettings.ForeshorteningSymbolType = Annotations.ForeshorteningSymbolSettingsBuilder.SymbolType.Regular
# 【2】方法
preference.AnnotationStyle.ForeshorteningSymbolSettings.ForeshorteningSymbolMethodType = Annotations.ForeshorteningSymbolSettingsBuilder.MethodType.WidthAndAngle
# 【3】宽度
preference.AnnotationStyle.ForeshorteningSymbolSettings.Width = 1.1
# 【4】高度
preference.AnnotationStyle.ForeshorteningSymbolSettings.Height = 2.2
# 【5】角度
preference.AnnotationStyle.ForeshorteningSymbolSettings.Angle = 45.0
preference.Commit()
preference.Destroy()





原点
class DraftingPreferencesTest:
"""
制图首选项测试类
"""
@staticmethod
def origin(part: NXOpen.Part, lw: NXOpen.ListingWindow):
"""
公共 - 原点
"""
preference = getPartDraftingPreferences(part)
# 【1】第一偏置
preference.AnnotationStyle.OrdinateStyle.MarginFirstOffset = 1.1
# 【2】间距
preference.AnnotationStyle.OrdinateStyle.MarginSpacing = 2.2
# 【3】全局选择中动态对齐
preference.CommonWorkflow.DynamicAlignmentInGlobalSelection = True
preference.Commit()
preference.Destroy()

前缀/后缀(不完善)
class DraftingPreferencesTest:
"""
制图首选项测试类
"""
@staticmethod
def origin(part: NXOpen.Part, lw: NXOpen.ListingWindow):
"""
公共 - 原点
"""
preference = getPartDraftingPreferences(part)
# 【一】半径尺寸
# 【1】位置
preference.AnnotationStyle.RadialStyle.DiameterRadiusPlacement = Annotations.DiameterRadiusSymbolPlacement.Before
# 【2】直径符号
preference.AnnotationStyle.RadialStyle.DiameterSymbolType = Annotations.DiameterSymbol.Standard
# 【3】半径符号
preference.AnnotationStyle.RadialStyle.RadiusSymbolType = Annotations.RadiusSymbol.R
# 【4】文本间隙
preference.AnnotationStyle.RadialStyle.SymbolToDimensionTextDistance = 2.2
# 【二】线性尺寸
# 【1】真实长度位置
preference.AnnotationStyle.DimensionStyle.TrueLengthTextPosition = Annotations.TrueLengthTextPosition.Prefix
# 【2】文本
preference.AnnotationStyle.DimensionStyle.TrueLengthText = 'T.L.'
# 【三】倒斜角尺寸
# 【1】位置
preference.AnnotationStyle.DimensionStyle.ChamferSymbolType = Annotations.ChamferSymbolPlacement.Prefix
# 【2】文本
preference.AnnotationStyle.DimensionStyle.ChamferSymbolName = 'AAA'
# 【四】孔和螺纹标注
# 特征
featureTypes = preference.AnnotationStyle.HoleCalloutSettings.GetListOfFeatures()
# 遍历特征
text = ''
for featureType in featureTypes:
# 获取对应特征的参数
parameters = preference.AnnotationStyle.HoleCalloutSettings.GetListOfParameters(featureType)
# 获取特征名
featureTypeName = getEnumName(Annotations.HoleCalloutSettingsBuilder.Featuretype, featureType)
for nth, parameter in enumerate(parameters):
# 获取参数名
parameterName = getEnumName(Annotations.HoleCalloutSettingsBuilder.Parametertype, parameter)
# 2025/11/16 无法解决,我已经折腾了好几个小时,无法搞定
# nth 表示某个特征的第 nth 个参数,但是参数列表获取到的参数中有些不能读取(或写入)前缀或后缀,直接读取会出现 C++ 层面的异常,Python 无法捕获,会导致 NX 崩溃
# 【五】表单元格
# 【1】前缀
preference.TableCellStyle.Prefix = 'pp'
# 【2】后缀
preference.TableCellStyle.Suffix = 'uu'
# 【六】零件明细表
# 【1】显示参考标注后缀
preference.PartsList.ShowReferenceCalloutSuffix = True
# 【2】文本
preference.PartsList.CalloutSuffix = '(REF)'
preference.Commit()
preference.Destroy()


保留的注释
class DraftingPreferencesTest:
"""
制图首选项测试类
"""
@staticmethod
def retainedAnnotations(part: NXOpen.Part, lw: NXOpen.ListingWindow):
"""
保留的注释
"""
preference = getPartDraftingPreferences(part)
# 【1】显示保留的注释
preference.RetainedAnnotations.ShowRetainedAnnotations = False
# 【2】颜色
preference.RetainedAnnotations.LineColorFontWidth.LineColor = part.Colors.Find('Yellow')
# 【3】线型
preference.RetainedAnnotations.LineColorFontWidth.LineFont.LineFont = LineFontBuilder.LineFontType.Dotted
# 【4】线宽
preference.RetainedAnnotations.LineColorFontWidth.LineWidth = DisplayableObject.ObjectWidth.Five
# 【5】删除保留的注释
part.DeleteRetainedDraftingObjectsInCurrentLayout()
# 【6】应用非关联原点
preference.RetainedAnnotations.ApplyNonAssociativeOrigins()
preference.Commit()
preference.Destroy()

层叠
class DraftingPreferencesTest:
"""
制图首选项测试类
"""
@staticmethod
def stack(part: NXOpen.Part, lw: NXOpen.ListingWindow):
"""
层叠
"""
preference = getPartDraftingPreferences(part)
# 【1】水平对齐
preference.AnnotationStyle.LetteringStyle.StackHorizontalAlignment = Annotations.StackHorizontalAlignment.Bottom
# 【2】前间隙因子
preference.AnnotationStyle.LetteringStyle.StackLeftSpaceFactor = 0.555
# 【3】后间隙因子
preference.AnnotationStyle.LetteringStyle.StackRightSpaceFactor = 0.666
# 【4】竖直对齐
preference.AnnotationStyle.LetteringStyle.StackVerticalAlignment = Annotations.StackVerticalAlignment.Right
# 【5】上间隙因子
preference.AnnotationStyle.LetteringStyle.StackAboveSpaceFactor = 0.777
# 【6】下间隙因子
preference.AnnotationStyle.LetteringStyle.StackBelowSpaceFactor = 0.888
# 【7】自动间距堆叠符号
preference.AnnotationStyle.LetteringStyle.StackAutospace = False
preference.Commit()
preference.Destroy()

标准
class DraftingPreferencesTest:
"""
制图首选项测试类
"""
@staticmethod
def standard(part: NXOpen.Part, lw: NXOpen.ListingWindow):
"""
标准
"""
preference = getPartDraftingPreferences(part)
# 【1】图纸页边界
# 2025/11/17 我没找到枚举定义,不得不用魔法值了,不尝试都不知道数值什么含义
# 0 ASME;1 ISO;2 DIN;3 JIS;4 ESKD;5 GB;6 船舶设计
preference.BorderAndZoneStyle.BorderAndZoneStandard = 6
# 【2】表面粗糙度(含版本)
preference.AnnotationStyle.SymbolStyle.DraftingSurfaceFinishStandard = Annotations.SurfaceFinishStandard.Iso25178
# 【3】焊接
preference.AnnotationStyle.SymbolStyle.WeldSymbolStandard = Annotations.WeldStandard.Gb
preference.Commit()
preference.Destroy()

符号
class DraftingPreferencesTest:
"""
制图首选项测试类
"""
@staticmethod
def symbolStyle(part: NXOpen.Part, lw: NXOpen.ListingWindow):
"""
符号
"""
preference = getPartDraftingPreferences(part)
# 【1】颜色
preference.AnnotationStyle.SymbolStyle.UserDefinedSymbolColor = part.Colors.Find('Purple')
# 【2】线型
preference.AnnotationStyle.SymbolStyle.UserDefinedSymbolFont = DisplayableObject.ObjectFont.Eight
# 【3】 线宽
preference.AnnotationStyle.SymbolStyle.UserDefinedSymbolWidth = Annotations.LineWidth.Six
preference.Commit()
preference.Destroy()

尺寸
工作流程
class DraftingPreferencesTest:
"""
制图首选项测试类
"""
@staticmethod
def dimensionWorkflow(part: NXOpen.Part, lw: NXOpen.ListingWindow):
"""
尺寸工作流程
"""
preference = getPartDraftingPreferences(part)
# 【1】定向尺寸
preference.DimensionWorkflow.EnableDirectedDimension = True
# 【2】暂停屏显对话框延迟
preference.DimensionWorkflow.HoverSceneDialogDelay = 2
# 【2】自动创建相交符号
preference.DimensionWorkflow.AutomaticCreationIntersectionSymbol = True
preference.Commit()
preference.Destroy()

原点
class DraftingPreferencesTest:
"""
制图首选项测试类
"""
@staticmethod
def dimensionOriginAlignment(part: NXOpen.Part, lw: NXOpen.ListingWindow):
"""
尺寸原点对齐
"""
preference = getPartDraftingPreferences(part)
# 【1】自动对齐
preference.DimensionOriginAlignment.AutoAlignment = Annotations.OriginAlignmentBuilder.AutoAlignmentType.NonAssociative
# 【2】与尺寸线对齐
preference.DimensionOriginAlignment.AlignToDimensionLine = False
# 【3】堆叠注释
preference.DimensionOriginAlignment.StackAnnotation = True
# 【4】水平或竖直对齐
preference.DimensionOriginAlignment.AlignHorizontalVertical = True
# 【5】相对于几何体的位置
preference.DimensionOriginAlignment.PositionRelativeToGeom = True
# 【6】捕捉点处的位置
preference.DimensionOriginAlignment.PositionAtSnapPoint = True
# 【7】空白处的位置
preference.DimensionOriginAlignment.PositionOnMargin = False
preference.Commit()
preference.Destroy()

公差(空)
双尺寸
class DraftingPreferencesTest:
"""
制图首选项测试类
"""
@staticmethod
def dualDimension(part: NXOpen.Part, lw: NXOpen.ListingWindow):
"""
双尺寸
"""
preference = getPartDraftingPreferences(part)
# 【1】双尺寸位置
preference.AnnotationStyle.UnitsStyle.DualDimensionFormat = Annotations.DualDimensionPlacement.NotSet # 不勾选显示双尺寸
# 【2】单位
preference.AnnotationStyle.UnitsStyle.DualDimensionUnits = Annotations.DimensionUnit.Micrometers
# 【3】数字显示
preference.AnnotationStyle.UnitsStyle.DualFractionType = Annotations.DimensionTextFormat.Decimal
# 【4】小数位数
preference.AnnotationStyle.DimensionStyle.DualDimensionValuePrecision = 4
# 【5】分数分母
preference.AnnotationStyle.DimensionStyle.DualDimensionFractionDenominator = Annotations.FractionDenominatorFormat.ThirtyTwo
# 【6】尺寸线居中
preference.AnnotationStyle.UnitsStyle.DualDimensionCenterDimensionLine = True
# 【7】公差小数位数
preference.AnnotationStyle.DimensionStyle.DualToleranceValuePrecision = 3
# 【8】公差上限
preference.AnnotationStyle.DimensionStyle.UpperToleranceMetric = 0.11
# 【9】公差下限
preference.AnnotationStyle.DimensionStyle.LowerToleranceMetric = -0.12
# 【10】单限制偏置
preference.AnnotationStyle.DimensionStyle.SingleLimitOffsetValueMetric = 0.13
preference.Commit()
preference.Destroy()

折线
class DraftingPreferencesTest:
"""
制图首选项测试类
"""
@staticmethod
def ordinateStyle(part: NXOpen.Part, lw: NXOpen.ListingWindow):
"""
坐标标注样式
"""
preference = getPartDraftingPreferences(part)
# 样式
preference.AnnotationStyle.OrdinateStyle.DoglegCreationOption = Annotations.OrdinateDoglegCreationOption.Infer
# 方法
preference.AnnotationStyle.OrdinateStyle.DoglegSetting = Annotations.OrdinateDoglegDefinition.StartAngle
# 开始偏置
preference.AnnotationStyle.OrdinateStyle.DoglegStartOffset = 6.0
# 结束偏置
preference.AnnotationStyle.OrdinateStyle.DoglegEndOffset = 3.0
# 角度
preference.AnnotationStyle.OrdinateStyle.DoglegAngle = 44 * math.pi / 180 # 弧度
# 第一侧方位
preference.AnnotationStyle.LineArrowStyle.FirstJogOrientation = Annotations.JogOrientation.JogIn
# 第一侧开始偏置
preference.AnnotationStyle.LineArrowStyle.FirstJogStartOffset = 6.0
# 第一侧结束偏置
preference.AnnotationStyle.LineArrowStyle.FirstJogEndOffset = 3.0
# 第一侧角度
preference.AnnotationStyle.LineArrowStyle.FirstJogAngle = 44.0 # 角度
# 第二侧方位
preference.AnnotationStyle.LineArrowStyle.SecondJogOrientation = Annotations.JogOrientation.JogIn
# 第二侧开始偏置
preference.AnnotationStyle.LineArrowStyle.SecondJogStartOffset = 6.0
# 第二侧结束偏置
preference.AnnotationStyle.LineArrowStyle.SecondJogEndOffset = 3.0
# 第二侧角度
preference.AnnotationStyle.LineArrowStyle.SecondJogAngle = 44.0 # 角度
preference.Commit()
preference.Destroy()

窄尺寸
class DraftingPreferencesTest:
"""
制图首选项测试类
"""
@staticmethod
def narrowDimension(part: NXOpen.Part, lw: NXOpen.ListingWindow):
"""
窄尺寸
"""
preference = getPartDraftingPreferences(part)
# 样式
preference.AnnotationStyle.DimensionStyle.NarrowDisplayType = Annotations.NarrowDisplayOption.AfterStub
# 文本方位
preference.AnnotationStyle.DimensionStyle.NarrowTextOrientation = Annotations.NarrowTextOrientation.Horizontal
# 箭头
preference.AnnotationStyle.DimensionStyle.NarrowArrowType = Annotations.ArrowheadType.FilledDot
# 文本偏置
preference.AnnotationStyle.DimensionStyle.NarrowTextOffset = 11.0
# 指引线角度
preference.AnnotationStyle.DimensionStyle.NarrowLeaderAngle = 70.0
preference.Commit()
preference.Destroy()

单侧尺寸
class DraftingPreferencesTest:
"""
制图首选项测试类
"""
@staticmethod
def singleSideDimension(part: NXOpen.Part, lw: NXOpen.ListingWindow):
"""
单侧尺寸
"""
preference = getPartDraftingPreferences(part)
# 长度
preference.AnnotationStyle.SingleSidedDisplay.SingleSidedArrowLineLength = 11.1
preference.Commit()
preference.Destroy()

尺寸集
class DraftingPreferencesTest:
"""
制图首选项测试类
"""
@staticmethod
def dimensionSets(part: NXOpen.Part, lw: NXOpen.ListingWindow):
"""
尺寸集
"""
preference = getPartDraftingPreferences(part)
# 链
preference.AnnotationStyle.DimensionStyle.ChainOffset = 3.3
# 基线
preference.AnnotationStyle.DimensionStyle.BaselineOffset = 12.4
preference.Commit()
preference.Destroy()

倒斜角
class DraftingPreferencesTest:
"""
制图首选项测试类
"""
@staticmethod
def chamfer(part: NXOpen.Part, lw: NXOpen.ListingWindow):
"""
倒角
"""
preference = getPartDraftingPreferences(part)
# 样式
preference.AnnotationStyle.DimensionStyle.ChamferForm = Annotations.ChamferForm.AngleSize
# 分隔线
preference.AnnotationStyle.DimensionStyle.ChamferSeparator = Annotations.ChamferSeparatorType.LowercaseX
# 间距
preference.AnnotationStyle.DimensionStyle.ChamferSpaceFactor = 0.11
# 指引线样式
preference.AnnotationStyle.DimensionStyle.ChamferLeaderType = Annotations.ChamferLeaderPlacement.Linear
# 文本对齐
preference.AnnotationStyle.DimensionStyle.ChamferStubType = Annotations.ChamferStubType.NoneTextAfterLeader
preference.Commit()
preference.Destroy()

尺寸线
class DraftingPreferencesTest:
"""
制图首选项测试类
"""
@staticmethod
def dimensionLine(part: NXOpen.Part, lw: NXOpen.ListingWindow):
"""
尺寸线
"""
preference = getPartDraftingPreferences(part)
# 箭头之间有线
preference.AnnotationStyle.DimensionStyle.LineBetweenArrows = False
# 修剪尺寸线
preference.AnnotationStyle.DimensionStyle.TrimDimLine = Annotations.TrimDimensionLineStyle.Trim
preference.Commit()
preference.Destroy()

径向
class DraftingPreferencesTest:
"""
制图首选项测试类
"""
@staticmethod
def radiaStyle(part: NXOpen.Part, lw: NXOpen.ListingWindow):
"""
径向
"""
preference = getPartDraftingPreferences(part)
# 带折线半径尺寸的角度
preference.AnnotationStyle.RadialStyle.FoldedRadiusAngle = 44.0
preference.Commit()
preference.Destroy()

坐标
class DraftingPreferencesTest:
"""
制图首选项测试类
"""
@staticmethod
def ordinateStyle(part: NXOpen.Part, lw: NXOpen.ListingWindow):
"""
坐标
"""
preference = getPartDraftingPreferences(part)
# 正方向
preference.AnnotationStyle.OrdinateStyle.PositiveDirection = Annotations.OrdinatePositiveDirection.LowerLeft
# 显示尺寸线
preference.AnnotationStyle.OrdinateStyle.DisplayDimensionLine = Annotations.OrdinateLineArrowDisplayOption.NotSet
# 在基准线处显示零
preference.AnnotationStyle.OrdinateStyle.DisplayZeroAtBaseline = False
# 显示名称样式
preference.AnnotationStyle.OrdinateStyle.DisplayNameStyle = Annotations.OrdinateOriginDisplayOption.OrdinateSetName
# 用户定义文本
preference.AnnotationStyle.OrdinateStyle.UserDefinedText = '自定义文本'
# 与基准线对齐
preference.AnnotationStyle.OrdinateStyle.AlignSymbolWithBaseline = False
# 符号角度
preference.AnnotationStyle.OrdinateStyle.SymbolAngle = 45 / 180 * math.pi
# 边距数
preference.AnnotationStyle.OrdinateStyle.NumberOfMargins = 1
preference.Commit()
preference.Destroy()

文本
参考
孔和螺纹标注
Siemens NX(UG)Python 开发 – 制图首选项(研究中)
