尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Python驱动NX二次开发:UF API实现参数化几何特征自动建模

Python驱动NX二次开发:UF API实现参数化几何特征自动建模 1. 项目概述当Python遇见NX开启参数化建模新篇章在三维CAD设计领域Siemens NX通常也被称为UG无疑是航空、汽车、模具等高端制造业的基石软件。其强大的参数化建模能力是工程师将创意转化为精确数字模型的核心工具。然而日常设计中充斥着大量重复性、规则性的建模任务比如批量创建标准件、根据Excel表格数据驱动模型变更或者将特定设计逻辑固化下来。这时如果还停留在手动点击图标、输入参数的传统交互模式效率瓶颈会非常明显而且极易出错。这正是NX二次开发的价值所在。它允许我们跳出交互界面通过编程的方式直接与NX内核对话实现设计过程的自动化与智能化。而Python凭借其简洁的语法、丰富的生态和极高的开发效率正逐渐成为NX二次开发领域的一股新兴力量尤其对于需要快速原型验证、数据处理或与外部系统如PDM、CAE软件集成的场景。今天我想和大家深入聊聊的就是如何用Python结合NX的User FunctionUF接口来程序化地创建那些最基础的几何特征块长方体、圆柱、圆锥圆台、球体和管道。这不仅仅是几个API函数的调用演示。通过这个项目你将掌握如何用代码“驱动”NX理解特征创建背后的对象层级与参数逻辑并学会构建稳健、可复用的自动化脚本。无论你是希望提升个人效率的工程师还是负责开发定制化设计工具的开发者这套方法都能为你打开一扇新的大门。我们将从环境配置讲起逐步深入到每个特征的创建细节、参数化技巧以及实际开发中必然会遇到的“坑”与解决方案。2. 开发环境搭建与UF API初探2.1 Python与NX版本兼容性确认在开始写第一行代码之前确保环境匹配是成功的第一步。NX的二次开发接口对其内置的Python解释器版本有严格绑定。以NX 1980系列版本为例它通常内置的是Python 3.8。这意味着如果你在系统上安装了Python 3.10或更高版本NX很可能无法直接调用其site-packages中的第三方库。最稳妥的做法是直接使用NX自带的Python解释器。你可以在NX的安装目录下找到它例如C:\Program Files\Siemens\NX1980\PYTHON\python.exe。在PyCharm或VSCode等IDE中创建新项目时将这个解释器路径指定为项目的Python环境。这样做的好处是你使用的win32com、pywin32用于COM接口以及NX Python模块的路径都是天然正确的避免了大量因环境变量导致的导入错误。注意不建议将系统Python环境与NX Python环境混用。如果脚本需要用到numpy,pandas等第三方库请务必使用NX Python解释器对应的pip即NX安装目录\PYTHON\Scripts\pip.exe进行安装。2.2 理解NX Open Python与UF API的关系NX二次开发主要有两套Python接口NX Open Python和User Function (UF) API。它们有重叠但定位不同。NX Open Python是一套面向对象的、更现代的API其设计思想与Java/.NET版本的NX Open类似提供了对NX对象模型如PartBodyFeature的封装。它的代码可读性更好更符合Pythonic风格。UF API则是历史更悠久、更底层的一套C语言接口的Python绑定通过ufunc模块。它函数式风格更浓直接操作NX内核的“标签”tag_t功能极为全面和底层几乎能实现NX GUI的所有操作。本文聚焦于UF API因为它更直接、更原始能让我们更清晰地理解NX内部的对象标识和创建流程。在Python中UF函数主要通过NXOpen.ufunc模块调用其函数名和参数与C语言版本高度一致。一个典型的UF函数调用看起来像这样theUfSession.Modl.CreateBlock1(...)。2.3 基础开发流程与脚本结构一个完整的UF API开发脚本通常遵循以下结构导入模块导入NXOpen和NXOpen.UF。获取会话获取全局的UF会话对象这是所有UF函数调用的入口。设置错误处理UF函数通常返回一个整数状态码0表示成功。严谨的脚本需要检查这些返回值。核心建模逻辑调用具体的UF函数进行创建、查询、修改等操作。更新与清理操作完成后通知NX更新模型显示。下面是一个最简化的“Hello World”式模板用于验证环境并创建一个长方体import NXOpen import NXOpen.UF def main(): # 1. 获取UF会话 theUfSession NXOpen.UF.UFSession.GetUFSession() # 2. 获取当前工作部件Part的tag part_tag theUfSession.Part.AskDisplayPart() # 3. 定义长方体参数角点坐标(0,0,0)边长(100,50,30) corner_pt [0.0, 0.0, 0.0] block_len [100.0, 50.0, 30.0] # 4. 创建特征对象 feature_tag NXOpen.UF.UFConstants.NULL_TAG # 调用创建长方体的UF函数 response theUfSession.Modl.CreateBlock1(UF_feature_type0, # 0代表实体 corner_ptcorner_pt, block_lenblock_len, feature_tagfeature_tag) # 5. 检查操作是否成功 if response 0: print(长方体创建成功) # 可选更新模型视图 theUfSession.Disp.RegenerateDisplay() else: print(f创建失败错误代码: {response}) if __name__ __main__: main()将这个脚本保存为.py文件可以直接在NX外部用其自带的Python解释器运行但更常见的做法是在NX内部通过“文件-执行-NX Open”来运行这样可以直接在当前打开的部件中看到结果。3. 核心特征创建从参数到实体的代码实现掌握了基础框架后我们进入核心环节逐一拆解五种基础特征的创建。关键在于理解每个UF函数所需的参数列表及其几何意义。3.1 创建块长方体特征创建长方体的主要UF函数是Modl.CreateBlock1。这个“1”代表它是该函数的一个特定版本。参数看似简单但有几个细节极易出错。关键参数解析UF_feature_type: 特征类型。0表示创建实体Solid1表示创建片体Sheet Body。对于绝大多数情况我们填0。corner_pt: 长方体定位点的坐标。这是一个长度为3的列表[x, y, z]。重要这个点定义的是长方体在建模坐标系绝对坐标系中的位置与工作坐标系WCS无关。如果你希望基于WCS创建需要先获取WCS原点坐标进行换算。block_len: 长方体的长度、宽度、高度。同样是长度为3的列表[length_x, length_y, length_z]。长度方向与绝对坐标系的X, Y, Z轴正方向一致。一个更贴近实战的例子创建带圆角的长方体基座在实际设计中纯粹的长方体很少见通常需要结合其他操作。下面的代码展示了如何创建一个长方体并立即为其添加边倒圆特征形成一个简单的基座。import NXOpen import NXOpen.UF import math def create_block_with_fillet(): theUfSession NXOpen.UF.UFSession.GetUFSession() part_tag theUfSession.Part.AskDisplayPart() # 1. 创建基础长方体 base_corner [0.0, 0.0, 0.0] base_size [200.0, 100.0, 20.0] # 长200宽100高20 base_block_tag NXOpen.UF.UFConstants.NULL_TAG resp theUfSession.Modl.CreateBlock1(0, base_corner, base_size, base_block_tag) if resp ! 0: print(f创建基础块失败: {resp}) return # 2. 获取长方体的边进行倒圆。这里需要先找到边的tag。 # 假设我们要对长方体顶面的四条竖直边倒圆。 # 首先通过特征找到其所属的体Body body_tag NXOpen.UF.UFConstants.NULL_TAG theUfSession.Modl.AskFeatBody(base_block_tag, body_tag) # 然后遍历体的边通过几何属性筛选出目标边例如长度接近20的边。 # 这是一个简化示例实际中需要更精确的边选择逻辑可能用到循环和几何查询函数。 edge_list [] # ... (此处省略复杂的边遍历与筛选代码通常需要用到theUfSession.Obj.CycleObjsInPart, theUfSession.Modl.AskEdgeData等) # 3. 假设我们已经获得了四条边的tag列表 edge_tags edge_tags [] # 这里应是具体的边tag列表 if len(edge_tags) 0: radius 10.0 # 倒圆半径10mm # 创建边倒圆特征 blend_tag NXOpen.UF.UFConstants.NULL_TAG resp theUfSession.Modl.CreateBlend(radii[radius]*len(edge_tags), edge_tagsedge_tags, blend_tagblend_tag) if resp 0: print(边倒圆创建成功) theUfSession.Disp.RegenerateDisplay() print(带圆角的长方体基座创建完成。)实操心得CreateBlock1创建的长方体其边和面是平行于绝对坐标系的。如果你需要一个倾斜的或与现有几何对齐的长方体不能直接通过这个函数实现。通常的 workflow 是先创建然后通过移动对象theUfSession.Modl.MoveObject或变换特征theUfSession.Modl.CreateTransform将其定位到目标位置和方向。更高级的做法是使用CreateBlock2或CreateBlock3等函数它们支持方向矩阵参数。3.2 创建圆柱特征创建圆柱使用Modl.CreateCyl1函数。圆柱的定义需要轴线的方向、轴线上一点的坐标、直径和高度。关键参数与方向矩阵origin_pt: 圆柱底面圆心的坐标[x, y, z]。height: 圆柱的高度。diameter: 圆柱的直径。direction: 一个长度为3的列表[i, j, k]代表圆柱轴线的方向向量。例如[0, 0, 1]表示沿Z轴正方向。UF_feature_type: 同上0为实体。这里最大的挑战是direction参数。它必须是一个单位向量长度为1。如果你直接传入[0, 0, 5]NX会报错或产生不可预料的结果。因此在传入前必须对方向向量进行归一化处理。def create_cylinder(): theUfSession NXOpen.UF.UFSession.GetUFSession() origin [50.0, 50.0, 0.0] height 80.0 diameter 30.0 # 定义轴线方向从原点指向点[20, 30, 40] raw_dir [20.0, 30.0, 40.0] # 计算向量长度 length math.sqrt(raw_dir[0]**2 raw_dir[1]**2 raw_dir[2]**2) # 归一化得到单位方向向量 if length 0: direction [raw_dir[0]/length, raw_dir[1]/length, raw_dir[2]/length] else: direction [0.0, 0.0, 1.0] # 防止零向量默认Z轴 cyl_tag NXOpen.UF.UFConstants.NULL_TAG resp theUfSession.Modl.CreateCyl1(UF_feature_type0, origin_ptorigin, directiondirection, heightheight, diamdiameter, feature_tagcyl_tag) # ... 错误检查与更新3.3 创建圆锥或圆台特征圆锥和圆台在UF API中由同一个函数Modl.CreateCone1创建通过顶部直径和底部直径的参数来控制形状。关键参数解析origin_pt: 圆锥底面圆心的坐标。direction: 圆锥轴线的单位方向向量。height: 圆锥的高度。base_diameter: 底部圆的直径。top_diameter: 顶部圆的直径。如果top_diameter 0则创建的是一个尖顶的圆锥。如果top_diameter 0且不等于base_diameter则创建的是一个圆台。如果top_diameter base_diameter则创建的是一个圆柱虽然用这个函数创建圆柱效率不高。创建不同锥度的圆锥示例def create_cone_and_frustum(): theUfSession NXOpen.UF.UFSession.GetUFSession() # 参数原点方向高度 origin [0, 0, 0] direction [0, 0, 1] # 沿Z轴 height 60.0 base_dia 50.0 # 1. 创建尖顶圆锥 (top_diameter 0) cone_tag NXOpen.UF.UFConstants.NULL_TAG resp theUfSession.Modl.CreateCone1(0, origin, direction, height, base_dia, 0.0, cone_tag) # 2. 在另一个位置创建圆台 (top_diameter 20) origin2 [100, 0, 0] frustum_tag NXOpen.UF.UFConstants.NULL_TAG resp2 theUfSession.Modl.CreateCone1(0, origin2, direction, height, base_dia, 20.0, frustum_tag) # 错误检查...3.4 创建球体特征球体的创建相对简单使用Modl.CreateSphere1函数只需定义球心和半径。关键参数解析center_pt: 球心的坐标[x, y, z]。diameter: 球的直径注意是直径不是半径。def create_sphere(): theUfSession NXOpen.UF.UFSession.GetUFSession() center [0, 0, 50] diameter 40.0 sphere_tag NXOpen.UF.UFConstants.NULL_TAG resp theUfSession.Modl.CreateSphere1(0, center, diameter, sphere_tag) # ... 错误检查与更新3.5 创建管道特征管道或称为扫掠体的创建是这几个特征中最复杂的因为它涉及到引导线路径和截面圆的定义。主要使用Modl.CreateTube函数。关键参数与创建流程定义引导线首先需要创建或获取一条曲线直线、圆弧、样条等作为管道的中心路径。这条曲线必须连续。定义截面管道是圆形截面所以需要指定外径和内径内径为0则是实心管。创建管道调用CreateTube传入曲线、内外径等参数。def create_tube_along_spline(): theUfSession NXOpen.UF.UFSession.GetUFSession() part_tag theUfSession.Part.AskDisplayPart() # 1. 创建一条样条曲线作为引导线这里简化假设通过点创建 # 定义样条通过的点集 points [ [0, 0, 0], [30, 20, 10], [70, 10, 40], [100, 30, 20] ] spline_tag NXOpen.UF.UFConstants.NULL_TAG # 注意这里需要调用创建样条的UF函数如 theUfSession.Curve.CreateSpline过程较复杂此处省略具体代码。 # 假设 spline_tag 已成功获得。 # 2. 定义管道参数 outer_diameter 12.0 inner_diameter 8.0 # 如果为0则是实心杆 tolerance 0.0254 # 公差通常一个较小的值如0.001英寸 # 3. 创建管道特征 tube_tag NXOpen.UF.UFConstants.NULL_TAG # 注意CreateTube函数可能需要曲线tag的列表即使只有一条曲线。 curve_list [spline_tag] resp theUfSession.Modl.CreateTube(curve_list, len(curve_list), outer_diameter, inner_diameter, tolerance, tube_tag) if resp 0: print(管道特征创建成功) else: print(f管道创建失败错误码: {resp}) # 更详细的错误信息可以通过 theUfSession.UF.GetFailMessage(resp) 获取注意事项管道创建失败的概率远高于其他简单特征。常见原因包括引导线不连续有缝隙、曲率半径小于管道半径导致自相交、公差设置过小导致计算失败。在复杂路径下建议先将引导线简化或分段创建管道再布尔合并。4. 参数化与高级控制技巧仅仅创建出静态的几何体是远远不够的。二次开发的精髓在于“参数化”和“程序化控制”。下面介绍几个提升脚本智能性和健壮性的关键技巧。4.1 特征的参数化与表达式驱动在NX中所有特征的尺寸参数都可以被“表达式”控制。通过UF API我们可以在创建特征的同时或之后为其尺寸参数创建并赋值表达式从而实现尺寸关联和公式驱动。核心函数Modl.CreateExp和Modl.EditExp假设我们要创建一个长、宽、高由表达式控制的长方体def create_param_block(): theUfSession NXOpen.UF.UFSession.GetUFSession() part_tag theUfSession.Part.AskDisplayPart() # 1. 先创建表达式 exp_names [block_length, block_width, block_height] exp_values [100, 50, 30] # 表达式可以是数字字符串也可以是公式如 block_length/2 exp_tags [] for name, value in zip(exp_names, exp_values): exp_tag NXOpen.UF.UFConstants.NULL_TAG resp theUfSession.Modl.CreateExp(name, value, exp_tag) if resp 0: exp_tags.append(exp_tag) else: print(f创建表达式 {name} 失败) # 2. 创建长方体但尺寸先填0或任意值因为我们后续要链接表达式 block_tag NXOpen.UF.UFConstants.NULL_TAG resp theUfSession.Modl.CreateBlock1(0, [0,0,0], [1.0, 1.0, 1.0], block_tag) # 3. 获取长方体特征的参数对象并将其与表达式关联此步骤较复杂涉及特征参数查询与编辑 # 通常需要AskFeatureParams - 找到对应尺寸参数的索引 - EditFeatureDimension # 这里展示概念具体API调用链较长。 # theUfSession.Modl.AskFeatureParams(block_tag, ...) # theUfSession.Modl.EditFeatureDimension(block_tag, param_index, exp_tags[0]) print(参数化长方体创建完成表达式关联步骤需具体实现。)4.2 特征定位与布尔运算创建的特征默认是独立的实体。在实际建模中我们经常需要将它们与其他实体进行布尔运算求和、求差、求交或者精确定位到某个面或边上。布尔运算示例将圆柱与长方体求差打孔def subtract_cylinder_from_block(): theUfSession NXOpen.UF.UFSession.GetUFSession() # 假设已存在一个长方体tag: target_body_tag # 假设已创建好一个圆柱tag: tool_body_tag # 进行布尔减运算 resp theUfSession.Modl.CreateSubtract([target_body_tag], 1, [tool_body_tag], 1) # 参数说明第一个列表是目标体第二个参数是目标体数量 # 第三个列表是工具体第四个参数是工具体数量。 if resp 0: print(布尔减运算成功。) # 注意布尔运算后原特征圆柱可能被消耗或隐藏取决于NX设置。特征定位更复杂通常涉及获取目标面/边的几何信息如平面方程、曲线参数。计算新建特征所需的定位点或方向向量。在创建特征时使用这些计算好的参数。或者创建特征后使用Modl.MoveObject进行移动/旋转。4.3 错误处理与日志记录工业级脚本必须健壮。UF函数几乎都会返回一个状态码。基础错误处理模式def robust_feature_creation(): theUfSession NXOpen.UF.UFSession.GetUFSession() # 尝试创建一个特征 feature_tag NXOpen.UF.UFConstants.NULL_TAG resp theUfSession.Modl.CreateBlock1(...) # 填入参数 if resp ! 0: # 获取详细的错误信息 error_message theUfSession.UF.GetFailMessage(resp) print(f[错误] 特征创建失败。代码: {resp}, 信息: {error_message}) # 可以根据不同的错误码进行不同的处理 if resp 4000001: # 假设这是内存不足的错误码需查手册 print(可能内存不足尝试简化模型。) elif resp 4000002: # 几何错误 print(几何参数无效请检查尺寸或位置。) # ... 其他错误处理 return None # 或抛出异常 else: print(特征创建成功。) return feature_tag建议将常用的创建操作封装成函数并加入详细的日志记录便于调试。5. 实战案例自动化创建标准零件库让我们综合运用以上知识完成一个简单的实战案例编写一个脚本根据输入的参数表批量生成一系列不同规格的六角头螺栓的简化模型圆柱体作为杆部六棱柱作为头部。设计思路定义一个Python字典或读取CSV文件存储螺栓规格如M6, M8, M10及其对应的杆部直径、长度、头部对边宽度等参数。为每种规格创建一个新的部件Part或在当前部件中指定位置创建。在对应位置创建圆柱体杆部。在杆部一端创建六棱柱头部。六棱柱可以通过创建一个外接圆直径等于对边宽度的正六边形截面然后拉伸得到。将头部和杆部进行布尔求和运算。可选添加倒角等工艺特征。简化代码框架import NXOpen import NXOpen.UF import math def create_hex_bolt(diameter, length, head_width, head_height, position): 在指定位置创建一个简化六角头螺栓。 :param diameter: 螺纹杆部直径 (mm) :param length: 杆部长度 (mm) :param head_width: 头部对边宽度 (mm) :param head_height: 头部高度 (mm) :param position: 螺栓定位点 [x, y, z] :return: 螺栓实体特征的tag theUfSession NXOpen.UF.UFSession.GetUFSession() # 1. 创建杆部 (圆柱) shank_origin position shank_direction [0, 0, 1] shank_tag NXOpen.UF.UFConstants.NULL_TAG resp theUfSession.Modl.CreateCyl1(0, shank_origin, shank_direction, length, diameter, shank_tag) if resp ! 0: return None # 2. 创建头部 (六棱柱) # 2.1 计算六边形外接圆半径 hex_circumradius head_width / math.sqrt(3) # 2.2 创建六边形截面草图此处简化直接调用创建多边形函数或创建六条直线 # 假设我们有一个函数 create_hexagon_sketch(center, circumradius, normal) hex_sketch_tag create_hexagon_sketch([position[0], position[1], position[2]length], hex_circumradius, [0,0,1]) # 2.3 拉伸草图形成头部 head_tag NXOpen.UF.UFConstants.NULL_TAG # 使用 Modl.CreateExtrude 函数指定草图、拉伸方向、距离等。 # resp theUfSession.Modl.CreateExtrude(...) # 3. 布尔求和将头部和杆部合并 target_bodies [shank_tag] tool_bodies [head_tag] resp theUfSession.Modl.CreateUnite(target_bodies, 1, tool_bodies, 1) # 4. 返回合并后的实体tag (通常是target_bodies中的第一个) return shank_tag if resp 0 else None # 批量创建 bolt_specs [ {name: M6x20, diameter: 6, length: 20, head_width: 10, head_height: 4}, {name: M8x25, diameter: 8, length: 25, head_width: 13, head_height: 5}, {name: M10x30, diameter: 10, length: 30, head_width: 17, head_height: 6}, ] start_pos [0, 0, 0] x_offset 50 for i, spec in enumerate(bolt_specs): pos [start_pos[0] i * x_offset, start_pos[1], start_pos[2]] bolt_tag create_hex_bolt(spec[diameter], spec[length], spec[head_width], spec[head_height], pos) if bolt_tag: print(f已创建 {spec[name]}) else: print(f创建 {spec[name]} 失败)这个案例涵盖了多个特征创建、几何计算、布尔运算和循环控制是一个综合性很强的练习。通过完善create_hexagon_sketch等辅助函数你可以将其发展成一个真正可用的标准件生成工具。6. 调试技巧与常见问题排查即使理解了所有API在实际开发中依然会遇到各种问题。以下是一些高频问题的排查思路。6.1 特征创建失败常见原因表问题现象可能原因排查步骤与解决方案函数返回非零错误码1. 参数无效如负尺寸、零向量。2. 几何矛盾如管道自相交。3. 内存不足。4. 当前不是建模状态如在制图模块。1. 使用theUfSession.UF.GetFailMessage(resp)获取错误描述。2. 检查所有输入参数确保在合理范围内正数、单位向量。3. 简化操作或关闭其他大型部件。4. 确保在“建模”应用模块中执行脚本。特征创建成功但看不见1. 特征被隐藏。2. 特征创建在不可见图层。3. 显示未更新。1. 检查部件导航器确认特征是否存在且未被抑制/隐藏。2. 检查当前工作图层和可见图层设置。3. 调用theUfSession.Disp.RegenerateDisplay()强制更新视图。布尔运算失败1. 目标体和工具体没有接触或相交。2. 工具体完全在目标体内部/外部导致无意义操作。3. 实体拓扑错误如破面。1. 确保两个实体在空间上有交集求差、求交或接触求和。2. 对于求差工具体必须与目标体有重叠部分。3. 尝试先对参与运算的实体进行“修复几何体”操作。方向不正确方向向量未归一化。在传入direction参数前务必计算其长度并除以长度确保是单位向量。脚本在NX外运行无反应1. 未获取正确的UF会话。2. 未指定工作部件。1. 确保脚本通过NX内部的“执行”菜单运行或在外部运行时正确初始化NX会话这通常更复杂。2. 在脚本开头使用theUfSession.Part.AskDisplayPart()或theUfSession.Part.New(...)明确部件上下文。6.2 高效的调试方法分步执行与打印在关键步骤后添加print语句输出中间变量的值如坐标、向量、tag值这是最直接的调试方式。使用NX Open Journal在NX中手动操作一遍你想自动化的流程然后打开“菜单-帮助-日志文件”查看生成的.journal文件。这里面记录了对应的NX Open API调用可能是C/Java/.NET版本但函数名和逻辑极具参考价值可以帮你找到正确的UF函数序列。查阅官方文档Siemens提供了NX Open API的官方文档通常是一个CHM帮助文件。虽然主要是C接口但函数名和参数与Python UF API几乎一一对应是终极参考。简化问题如果创建一个复杂特征失败尝试先创建一个最简单的版本如原点处、默认尺寸成功后再逐步添加复杂的参数和定位逻辑。异常捕获使用Python的try...except块捕获运行时异常并结合UF的错误码进行综合处理。6.3 性能优化建议当需要创建成百上千个特征时脚本性能变得重要。减少视图更新在循环创建特征时不要在每次创建后都调用RegenerateDisplay()。可以在所有操作完成后统一更新一次。批量操作某些UF函数支持批量处理比循环单次调用效率高。合理使用表达式对于有关联的尺寸使用表达式比在代码中硬计算更高效且便于后期修改。避免频繁的部件保存除非必要不要在脚本中频繁保存部件。我个人在长期开发中的体会是NX二次开发就像是在和一个庞大而精密的机器对话你必须遵循它的“语言”API和“礼仪”对象生命周期、状态管理。初期会感到繁琐但一旦掌握了核心对象的操作逻辑Part-Body-Feature-Face/Edge并养成了严谨的错误处理习惯你就会发现它能释放出的生产力是惊人的。从自动化一个简单的垫片建模到构建一个连接ERP系统、自动根据BOM生成整套模具组件的工具这条路充满了挑战但回报也同样丰厚。最后再分享一个小技巧为你编写的每一个重要功能函数都写一个清晰的文档字符串Docstring说明其功能、参数和返回值半年后当你回头维护代码时你会感谢自己的这个习惯。
返回列表