Siemens NX(UG)Python 开发 – 制图首选项(研究中)

最近更新于 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()

file

公共

文字

file

file

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()

file

直线/箭头

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()

file
file
file
file
file

原点

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()

file

前缀/后缀(不完善)

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()

file
file

保留的注释

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()

file

层叠

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()

file

标准

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() 

file

符号

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()   

file

尺寸

工作流程

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()   

file

原点

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()  

file

公差(空)

双尺寸

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()    

file

折线

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()

file

窄尺寸

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()  

file

单侧尺寸

class DraftingPreferencesTest:
    """
    制图首选项测试类
    """
    @staticmethod
    def singleSideDimension(part: NXOpen.Part, lw: NXOpen.ListingWindow):
        """
        单侧尺寸
        """
        preference = getPartDraftingPreferences(part)

        # 长度
        preference.AnnotationStyle.SingleSidedDisplay.SingleSidedArrowLineLength = 11.1

        preference.Commit()
        preference.Destroy()  

file

尺寸集

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()    

file

倒斜角

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()  

file

尺寸线

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()

file

径向

class DraftingPreferencesTest:
    """
    制图首选项测试类
    """
    @staticmethod
    def radiaStyle(part: NXOpen.Part, lw: NXOpen.ListingWindow):
        """
        径向
        """
        preference = getPartDraftingPreferences(part)

        # 带折线半径尺寸的角度
        preference.AnnotationStyle.RadialStyle.FoldedRadiusAngle = 44.0

        preference.Commit()
        preference.Destroy()

file

坐标

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()

file

文本

参考

孔和螺纹标注

Siemens NX(UG)Python 开发 – 制图首选项(研究中)
Scroll to top
打开目录