news 2026/7/22 9:06:35

VC++ ProE二次开发实战:从环境搭建到高级应用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
VC++ ProE二次开发实战:从环境搭建到高级应用

1. 项目概述:为什么选择VC++进行ProE二次开发?

在机械设计、模具制造这些行当里混了十几年,Pro Engineer(现在叫Creo Parametric)和它的二次开发,一直是个绕不开的话题。很多朋友,尤其是刚入行的工程师或者是从其他CAD软件转过来的,一听到“二次开发”就觉得头大,感觉是程序员才搞的东西。其实不然,二次开发本质上就是给ProE这个“瑞士军刀”加装你自己定制的“刀片”,让它更贴合你手头的活。今天,我就以一个老鸟的身份,掰开揉碎了聊聊怎么用VC++这把“老牌锉刀”来打磨ProE,让它听你的话。

为什么偏偏是VC++?这得从ProE的“出身”说起。ProE的核心,包括它的内核和大量的API(应用程序接口),都是用C/C++写的。这就意味着,用VC++(Visual C++)去调用这些API,是“原汤化原食”,兼容性最好,运行效率最高,能触及的底层功能也最全。你用Python或者C#去搞,不是不行,但中间往往隔着一层“翻译”,遇到一些冷门或者对性能要求极高的操作,就可能卡壳或者干脆不支持。VC++直接和ProE的C语言API对话,几乎没有性能损耗,调试起来也更直接。尤其是当你需要开发一些复杂的、需要深度集成到ProE进程中的功能,比如自定义特征、深度干涉检查、高性能的批量处理工具时,VC++几乎是唯一的选择。那些网络热词里提到的“NX二次开发”、“SolidWorks二次开发”、“UG二次开发”,底层逻辑其实都类似,核心API大多基于C/C++,VC++是打通这些“任督二脉”的通用内功。

这个“ProE二次开发案例教学”的目标很明确:不是教你成为C++语言专家,而是让你——一个熟悉ProE操作的工程师——能快速上手,利用VC++这个工具,把脑子里那些能提升效率、减少重复劳动的“金点子”变成ProE里一个实实在在的按钮、菜单或者命令。我们会从一个最简单的“Hello World”开始,一步步深入到创建特征、遍历模型、读写参数、实现交互,最终让你能独立开发出解决实际问题的工具。无论是想实现“自动配管”、“壁厚检查”,还是定制专属的报表工具或工艺接口,这套方法都是通用的基石。

2. 开发环境搭建与核心概念解析

工欲善其事,必先利其器。用VC++搞ProE二次开发,第一步就是把“战场”布置好。这里面的坑,我当年几乎一个没落,全踩了一遍。

2.1 开发环境精准配置

首先,明确你的ProE(Creo)版本和VC++版本。它们之间有严格的对应关系,乱点鸳鸯谱会导致编译都过不了。一般来说:

  • ProE Wildfire 5.0 及更早版本:通常对应 VC++ 2005 或 VC++ 2008。
  • Creo Parametric 1.0 - 7.0:主流支持 VC++ 2008 和 VC++ 2010。Creo 7.0 之后,开始支持更高的VS版本,但官方文档会明确指明。
  • 黄金法则:永远以PTC官方发布的《API Wizard》或《Pro/TOOLKIT User‘s Guide》中指定的编译器版本为准。通常,安装ProE/Creo时,其安装目录下的protoolkit文件夹里就包含了对应版本的示例代码和必要的库文件。

配置VC++项目是关键一步,很多新手在这里就放弃了。你需要手动设置一堆东西:

  1. 包含目录:告诉VC++去哪里找ProE API的头文件(.h文件)。通常是%PROE安装路径%\protoolkit\includes%PROE安装路径%\protoolkit\protk_appls\includes
  2. 库目录:告诉VC++去哪里找链接所需的库文件(.lib文件)。通常是%PROE安装路径%\protoolkit\i486_nt\obj(32位)或%PROE安装路径%\protoolkit\x86e_win64\obj(64位)。
  3. 附加依赖项:你需要链接特定的.lib文件,最基本的是protk_dll.libprotoolkit.lib(取决于你是开发DLL还是独立exe)。这个信息在官方指南里有详细列表。
  4. 预处理器定义:必须定义PRO_USE_VAR_ARGSPT_WIN(Windows平台)等宏,否则编译会报一堆奇怪的错误。
  5. 运行时库:确保你的VC++项目使用的运行时库(如多线程DLL/MD)与ProE自身使用的兼容。不匹配会导致运行时崩溃。

注意:64位系统上,ProE/Creo也是64位程序。你必须使用VC++的64位编译器进行编译,并链接64位的库文件。在VC++中创建项目时,务必在“配置管理器”中将活动解决方案平台设置为“x64”。

2.2 Pro/TOOLKIT核心机制理解

ProE二次开发的官方工具包叫Pro/TOOLKIT。你可以把它理解为一本厚厚的“ProE功能字典”(头文件)和一套“调用语法规则”(库文件)。它的工作模式主要有两种:

  • 动态链接库模式:你编写的代码编译成一个.dll文件。ProE启动时,通过一个注册文件(.dat或 .psf)加载这个DLL。你的功能就变成了ProE的一部分。这是最常用、最集成的方式,适合开发长期使用的内部工具。
  • 异步模式:你的代码编译成一个独立的.exe可执行文件。它可以启动ProE,或者与一个已经运行的ProE会话进行通信。这种方式更灵活,适合开发需要独立界面或作为外部流程一部分的工具。

无论哪种模式,核心交互都通过ProError这个枚举类型来反馈。几乎每一个Pro/TOOLKIT API函数都会返回一个ProError值,比如PRO_TK_NO_ERROR表示成功,PRO_TK_BAD_INPUTS表示输入参数错误。养成习惯,每次调用API后都检查返回值,这是写出稳定插件的基石。

另一个核心概念是对象句柄。在Pro/TOOLKIT的世界里,模型、特征、边、面、坐标系等等,都不是直接操作C++对象,而是通过一个整型或指针类型的“句柄”来引用。比如ProMdl代表模型句柄,ProFeature代表特征句柄。你需要通过API函数,用这些句柄去获取信息或执行操作。

3. 第一个Pro/TOOLKIT程序:从“Hello”到菜单

理论说再多,不如动手敲一行代码。我们来创建一个最简单的DLL插件,它在ProE里添加一个菜单项,点击后弹出一个消息框。

3.1 创建项目与编写注册文件

首先,在VC++中创建一个新的“Win32项目”,选择“DLL”类型。然后,按照2.1节的说明配置好包含目录、库目录等。

接下来,编写一个注册文件(例如hello.dat)。这个文件告诉ProE如何加载你的插件。

name HelloWorldProTK startup dll exec_file ./HelloWorldProTK.dll text_dir ./text revision 24 end
  • name: 你的插件名称。
  • startup dll: 启动方式为动态链接库。
  • exec_file: 你的DLL文件路径(相对或绝对)。
  • text_dir: 存放菜单文本、资源文件的目录。
  • revision: Pro/TOOLKIT的修订版本号,必须与你的ProE版本匹配!Wildfire 5.0是24,Creo各个版本不同,务必查证。

3.2 编写入口函数与菜单动作

在你的DLL项目中,需要实现一个标准的入口函数user_initialize()。ProE在加载DLL时会调用它。

#include <ProToolkit.h> #include <ProMenu.h> #include <ProMessage.h> #include <ProUIMessage.h> extern "C" int user_initialize(int argc, char *argv[], char *version, char *build, wchar_t errbuf[80]) { ProError status; // 添加菜单栏 ProMenuItemName menu_name; ProStringToWstring(menu_name, "HelloMenu"); // 菜单内部名称 status = ProMenubarMenuAdd("HelloMenu", "HelloMenu", "Help", PRO_B_TRUE, menu_name); if (status != PRO_TK_NO_ERROR) { return status; } // 添加菜单按钮 ProMenuItemName action_name; ProStringToWstring(action_name, "SayHelloAction"); status = ProMenubarmenuPushbuttonAdd("HelloMenu", "SayHello", "Say Hello", "Say hello to the world", NULL, PRO_B_TRUE, action_name, SayHelloAction); if (status != PRO_TK_NO_ERROR) { return status; } return PRO_TK_NO_ERROR; } // 菜单按钮对应的动作函数 static uiCmdAccessState SayHelloAccess(uiCmdAccessMode access_mode) { return ACCESS_AVAILABLE; // 始终可用 } static void SayHelloAction(char *dialog, char *component, ProAppData data) { // 弹出消息框 ProUIMessageButton buttons[] = { PRO_UI_MESSAGE_OK }; ProUIMessageDialogDisplay(PROUIMESSAGE_INFO, L"Hello ProE World!", buttons, 1, L"Greeting", PRO_UI_MESSAGE_DEFAULT, PRO_UI_MESSAGE_DEFAULT, NULL); } extern "C" void user_terminate() { // 插件卸载时的清理工作,这里为空 }

代码解释:

  1. user_initialize: 插件入口。这里我们创建了一个名为“HelloMenu”的菜单,放在主菜单栏的“Help”旁边。然后在这个菜单下添加了一个按钮“Say Hello”。
  2. ProMenubarmenuPushbuttonAdd: 最后一个参数SayHelloAction是按钮点击时回调的函数指针。
  3. SayHelloAction: 这就是我们的业务逻辑函数,简单地弹出一个信息对话框。
  4. SayHelloAccess: 这是一个可选的“访问函数”,用来动态控制菜单按钮是否灰显(不可用)。这里我们让它始终可用。
  5. user_terminate: 插件被卸载时调用,用于释放资源。

3.3 编译、部署与调试

将编译生成的HelloWorldProTK.dllhello.dat注册文件放在同一个目录(例如D:\MyProTKPlugins\HelloWorld)。然后,你有两种方式加载它:

  • 临时加载:在ProE中,点击“工具”->“辅助应用程序”->“注册”,选择你的hello.dat文件,然后点击“启动”。你的“HelloMenu”菜单就会出现。
  • 自动加载:将你的hello.dat文件复制到ProE的启动目录(或修改config.pro中的toolkit_registry_file配置项指向它),这样每次启动ProE都会自动加载你的插件。

调试技巧:调试DLL插件需要一点技巧。在VC++项目属性中,设置“调试”->“命令”为你的ProE可执行文件路径(如creo.exe),并设置“命令参数”为-registry path\to\your\hello.dat。这样你就可以在VC++里设置断点,然后按F5启动ProE并自动加载插件进行调试。

4. 深入核心:模型遍历与信息提取

能弹出对话框只是第一步,真正的价值在于操作ProE模型本身。我们来看如何遍历模型树,获取特征信息,这几乎是所有复杂操作的基础。

4.1 获取当前模型与特征遍历

假设我们需要一个功能:列出当前活动零件所有特征的名称和类型。

#include <ProModelitem.h> #include <ProFeature.h> #include <ProSolid.h> void ListAllFeatures() { ProError status; ProMdl current_mdl; ProSolid solid; // 1. 获取当前活动窗口的模型 status = ProMdlCurrentGet(¤t_mdl); if (status != PRO_TK_NO_ERROR || current_mdl == NULL) { ProMessageDisplay(USER, "请激活一个零件或装配体窗口。"); return; } // 2. 确认是实体零件(ProSolid) if (ProMdlTypeGet(current_mdl) != PRO_MDL_PART) { ProMessageDisplay(USER, "当前模型不是零件。"); return; } solid = (ProSolid)current_mdl; // 3. 遍历所有特征 ProFeature *features; int n_features; status = ProSolidFeatVisit(solid, NULL, NULL, (ProFeatureVisitAction)FeatureVisitFunc, NULL, (ProFeatureFilterAction)FeatureFilterFunc, (ProAppData)&n_features); if (status == PRO_TK_NO_ERROR) { // 遍历结果存储在动态数组 features 中,元素个数为 n_features // 这里需要释放 features 内存: ProArrayFree((ProArray*)&features); } } // 特征访问动作函数 - 对每个特征执行的操作 static ProError FeatureVisitFunc(ProFeature *feature, ProError status, ProAppData app_data) { if (status != PRO_TK_NO_ERROR) return status; ProName feat_name; ProFeattype feat_type; ProError err; // 获取特征名称 err = ProFeatureNameGet(feature, feat_name); if (err == PRO_TK_NO_ERROR) { char name_buf[PRO_NAME_SIZE]; ProWstringToString(name_buf, feat_name); // 输出或处理特征名 name_buf } // 获取特征类型(拉伸、孔、倒角等) err = ProFeatureTypeGet(feature, &feat_type); if (err == PRO_TK_NO_ERROR) { // feat_type 是一个枚举值,可以转换为字符串理解 // 例如:PRO_FEAT_PROTRUSION, PRO_FEAT_HOLE, PRO_FEAT_ROUND } // 你可以在这里做更多事情,比如检查特征参数、抑制特征等 return PRO_TK_NO_ERROR; } // 特征过滤函数 - 决定哪些特征需要被访问 static ProError FeatureFilterFunc(ProFeature *feature, ProAppData app_data) { // 返回 PRO_TK_NO_ERROR 表示接受此特征,PRO_TK_CONTINUE 表示跳过 // 例如,只想处理“孔”特征: ProFeattype feat_type; if (ProFeatureTypeGet(feature, &feat_type) == PRO_TK_NO_ERROR && feat_type == PRO_FEAT_HOLE) { return PRO_TK_NO_ERROR; } return PRO_TK_CONTINUE; }

这个例子展示了Pro/TOOLKIT的经典“访问-过滤”模式。ProSolidFeatVisit这个API会遍历模型的所有特征,对每一个特征,先调用FeatureFilterFunc判断是否感兴趣,如果是,再调用FeatureVisitFunc执行具体操作。这种模式在遍历边、面、元件时同样适用。

4.2 参数与尺寸的读写

控制模型的核心是参数和尺寸。比如,我们想批量修改所有孔的直径。

void ModifyAllHoleDiameters(ProSolid solid, double new_diameter) { // ... 使用上面的遍历方法,过滤出所有孔特征 (PRO_FEAT_HOLE) // 在 FeatureVisitFunc 中: ProError VisitHoleFunc(ProFeature *hole_feat, ...) { // 1. 获取此孔特征的所有尺寸 ProDimension* dims; int n_dims; ProError err = ProFeatureDimGet(hole_feat, &dims, &n_dims); for (int i = 0; i < n_dims; ++i) { ProDimtype dim_type; ProDimensionTypeGet(&dims[i], &dim_type); // 2. 判断是否是直径尺寸(对于孔,通常有直径和深度) if (dim_type == PRO_DIM_DIAMETER) { // 3. 创建尺寸值对象并设置新值 ProParamvalue new_value; new_value.type = PRO_PARAM_DOUBLE; new_value.value.d_val = new_diameter; // 4. 写入新值 err = ProDimensionValueSet(&dims[i], &new_value, NULL); if (err == PRO_TK_NO_ERROR) { // 成功修改 } } } // 释放数组 ProArrayFree((ProArray*)&dims); return PRO_TK_NO_ERROR; } }

关键点

  • ProFeatureDimGet获取特征关联的所有尺寸句柄。
  • ProDimensionTypeGet判断尺寸类型(直径、长度、角度等)。
  • ProDimensionValueSet是修改尺寸的核心。修改后,必须调用ProSolidRegenerateProFeatureRedefine等函数来重新生成模型,否则修改不会在图形上体现。

实操心得:直接修改尺寸值有时会因父子关系或约束冲突导致再生失败。更稳健的做法是先通过ProParameterInitProParameterValueSet修改用户参数,然后通过关系式(Relation)驱动尺寸。这需要更深入的理解,但能避免很多再生错误。

5. 创建自定义特征与用户界面

遍历和修改是“读”操作,更强大的是“写”操作——创建新的几何。我们以一个简单的“创建基准点”功能为例,并给它加上一个自定义的UI对话框。

5.1 设计自定义UI对话框

Pro/TOOLKIT支持用资源文件定义对话框。我们创建一个简单的.res.dlg文件(可用VC++的资源编辑器编辑),定义如下控件:

  • 一个静态文本:“请输入点坐标:”
  • 三个编辑框:分别对应X, Y, Z坐标。
  • “确定”和“取消”按钮。

在代码中,我们需要编写对话框的回调函数。

// 对话框资源ID #define CREATE_POINT_DLG 1000 #define X_COORD_EDIT 1001 #define Y_COORD_EDIT 1002 #define Z_COORD_EDIT 1003 // “确定”按钮回调 static void CreatePointDlg_OK_CB(char *dialog, char *component, ProAppData data) { ProError err; double x, y, z; wchar_t wbuf[PRO_PATH_SIZE]; // 1. 从对话框控件读取用户输入的值 ProUIMessageTextRead(dialog, X_COORD_EDIT, wbuf); ProWstringToDouble(wbuf, &x); // ... 同理读取 y, z // 2. 关闭对话框 ProUIDialogExit(dialog, 1); // 3. 在后台执行创建点的函数,传入 x, y, z CreatePointAtCoordinate(x, y, z); } // 菜单动作,触发对话框 static void CreatePointAction(char *dialog, char *component, ProAppData data) { // 激活对话框 ProUIDialogActivate(CREATE_POINT_DLG, CreatePointDlg_OK_CB, NULL, NULL, PRO_B_TRUE); }

5.2 实现几何创建逻辑

CreatePointAtCoordinate函数是核心,它调用Pro/TOOLKIT的几何创建API。

static ProError CreatePointAtCoordinate(double x, double y, double z) { ProError err; ProSolid solid; ProMdl current_mdl; // 获取当前零件 err = ProMdlCurrentGet(¤t_mdl); if (err != PRO_TK_NO_ERROR) return err; solid = (ProSolid)current_mdl; // 定义点的坐标 ProPoint3d point_coord; point_coord[0] = x; point_coord[1] = y; point_coord[2] = z; // 创建基准点特征的定义结构 ProPointFeatDefinition feat_def; feat_def.location = point_coord; feat_def.placement = PRO_PNT_ON_SURF; // 假设放在默认平面上,实际需指定参照 // 需要设置更多属性,如参照平面、坐标系等,这里简化 ProFeatureCreateOptions opts[1] = { PRO_FEAT_CR_DEFINE }; ProFeature *new_feat; ProSelection model_sel; ProSelectionAlloc(NULL, &solid, &model_sel); // 执行创建 err = ProPointfeatureCreate(model_sel, &feat_def, opts, 1, &new_feat, NULL); ProSelectionFree(&model_sel); if (err == PRO_TK_NO_ERROR) { // 创建成功,可能需要刷新屏幕 ProWindowRepaint(PRO_VALUE_UNUSED); ProMessageDisplay(USER, "基准点创建成功!"); } else { ProMessageDisplay(USER, "基准点创建失败!错误码: %d", err); } return err; }

这个过程清晰地展示了二次开发的完整链条:用户输入 -> UI交互 -> 业务逻辑处理 -> 调用底层API -> 模型更新。创建拉伸、旋转、孔等特征流程类似,但Pro*featureCreate函数的参数和feat_def结构体会复杂得多,需要仔细查阅对应特征的API文档。

6. 高级应用与性能优化实战

当你的工具开始处理成百上千个特征或元件时,性能就成了大问题。结合热词中提到的“壁厚检查”、“自动配管”、“批量处理”等场景,这里分享几个高级技巧。

6.1 高效几何查询与计算

比如实现“壁厚检查”。最笨的方法是遍历每一个面,对每个面上的点沿法向做射线求交。这在复杂模型上会慢得无法忍受。

优化策略

  1. 空间划分过滤:首先利用ProSolidBoundingboxGet获取模型包围盒,进行粗略筛选。
  2. 特征级预判:对于抽壳、壳特征,其壁厚信息可能已存在于特征参数中,优先尝试读取。
  3. 采样优化:不要在每个面上密集采样。对于大平面,少量采样点即可;对于复杂曲面,根据曲率自适应增加采样密度。可以使用ProSurfaceEval等API评估曲面上的点。
  4. 并行计算:对于独立的计算任务(如不同区域的壁厚检测),可以利用多线程。但注意:Pro/TOOLKIT API本身不是完全线程安全的,对模型数据的读写必须在主线程或进行妥善同步。可以将耗时的纯计算部分(如向量运算、交点计算)放入子线程,将最终调用Pro*API修改模型的操作放回主线程。

6.2 与外部系统交互:读写Excel与数据库

“NX二次开发 读取excel”这个热词点出了一个常见需求。在ProE二次开发中,用VC++读写Excel非常普遍,用于输出BOM表、读取加工参数等。

  • 方案一:COM自动化。这是最直接的方式。VC++可以通过#import指令导入Excel的类型库,然后像使用普通C++类一样操作Excel。

    #import "C:\\Program Files\\Microsoft Office\\root\\Office16\\EXCEL.EXE" no_namespace rename("DialogBox", "ExcelDialogBox") ... _Application app; if (app.CreateInstance(__uuidof(Excel::Application)) != S_OK) { ... } app.Visible = VARIANT_TRUE; Workbooks books = app.Workbooks; _Workbook book = books.Add(...); _Worksheet sheet = book.ActiveSheet; sheet.Cells[1][1] = "零件号"; // 写入数据

    优点:功能强大,控制精细。缺点:依赖本地安装的Office版本,部署麻烦,且进程间通信有开销。

  • 方案二:使用第三方库。如LibXL、xlnt等。这些库可以直接读写.xlsx文件,无需安装Excel。优点:部署简单,轻量。缺点:可能不支持Excel的所有高级特性。

  • 方案三:导出为CSV。对于简单数据交换,让ProE工具生成.csv文件是最简单、最通用的方法。几乎所有系统都能处理CSV。

注意事项:与外部系统(如MES、ERP)交互时,务必做好错误处理和超时机制。ProE插件卡死可能会导致整个ProE会话无响应。对于长时间操作,一定要提供进度反馈,并允许用户取消。

6.3 内存管理与错误恢复

Pro/TOOLKIT编程中,内存泄漏和状态混乱是两大杀手。

  • 内存管理:凡是返回指针或数组的API(如ProSolidFeatVisit返回的features数组),使用完毕后必须用对应的ProArrayFreePro*Free函数释放。养成“谁申请,谁释放”的习惯,并在函数出口处统一清理。
  • 错误恢复:你的代码应该尽可能健壮。使用try...catch捕获C++异常。对于关键的模型操作,可以考虑在操作前使用ProMdlSave保存副本,或者利用ProSessionUndoPushProSessionUndoPop实现操作回滚。当检测到ProError不是PRO_TK_NO_ERROR时,不要简单地继续,应该清理已申请的资源,并向用户给出明确的错误信息。

7. 部署、维护与版本兼容性

开发完成只是成功了一半,让插件在不同电脑、不同版本的ProE/Creo上稳定运行,才是真正的挑战。

7.1 制作安装包与依赖项

你的插件DLL可能依赖特定的VC++运行时库(如msvcr100.dll,msvcp100.dll)。你需要将这些依赖项打包进安装程序,或者引导用户安装对应的Visual C++ Redistributable Package。使用Dependency Walker工具可以查看DLL的所有依赖。

对于注册文件(.dat),最佳实践是让安装程序将其内容写入到用户的config.pro中,或者直接复制到ProE的启动目录。更专业一点,可以写一个小的引导程序,在ProE启动时自动注入你的插件。

7.2 处理版本兼容性

这是ProE二次开发最头疼的问题之一。PTC不同版本间的API可能会有增减或变更。

  • 编译时兼容:为不同版本的Creo维护不同的项目文件或编译配置,链接对应版本的protoolkit.lib
  • 运行时适配:一种高级技巧是使用GetProcAddress动态加载ProE DLL中的函数,并检查函数指针是否为空,以此判断当前版本是否支持某个API。但这需要对API非常熟悉。
  • 配置检测:在user_initialize中,可以检查传入的versionbuild字符串,如果版本过低不支持某些功能,则禁用相关菜单,或给出友好提示。
  • 最低版本策略:明确声明你的插件支持的最低Creo版本,并建议用户使用该版本或更高。这是最省心的办法。

7.3 调试与日志

发布给同事用的插件,必须有完善的日志功能。不要依赖弹出消息框,那会干扰操作。可以写入一个文本日志文件,记录插件的运行状态、关键参数和错误信息。

void WriteLog(const char* format, ...) { FILE* fp = fopen("C:\\MyProTKPlugin.log", "a"); if (fp) { va_list args; va_start(args, format); vfprintf(fp, format, args); fprintf(fp, "\n"); va_end(args); fclose(fp); } }

在关键函数入口、出口、错误分支调用WriteLog。当用户报告问题时,第一件事就是让他把日志文件发给你,很多问题一目了然。

最后,我想说的是,ProE二次开发就像学一门新的方言,开始有点别扭,但一旦掌握,你和ProE的沟通效率将发生质变。从自动化报表到智能建模,从检查工具到工艺接口,想象空间巨大。最关键的是动手去做,从一个能运行的小例子开始,逐步添加功能,遇到问题就去查《Pro/TOOLKIT User‘s Guide》和在线社区。积累下来的每一个函数调用、每一个避坑经验,都会成为你宝贵的工具箱,让你在机械设计自动化的路上越走越顺。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/22 9:06:14

【SystemVerilog 验证】第六章 随机化

一、本章概述1. 本章学习目标本章是 SystemVerilog 约束随机测试完整核心章节&#xff0c;全书共 45 张配图分层讲解随机语法、约束、回调、内联随机、软硬约束、数组随机、种子管理、工程架构&#xff0c;承接第五章面向对象类基础&#xff0c;是 UVM 激励生成底层核心。 完整…

作者头像 李华
网站建设 2026/7/22 9:04:39

Crawl4AI:开源智能爬虫工具的技术解析与应用实践

1. Crawl4AI项目概述Crawl4AI是一个开源的、专为LLM优化的网络爬虫和内容提取工具&#xff0c;由GitHub上拥有超过7万星标的活跃社区支持。这个项目最初源于开发者对现有商业化爬虫解决方案的不满——它们往往需要账户注册、API密钥和昂贵的费用&#xff0c;却仍然无法满足基本…

作者头像 李华
网站建设 2026/7/22 9:04:38

为什么又造一个 Excel 库?

生态里 Excel 读写方案已经很成熟了——EPPlus、ClosedXML、MiniExcel、NPOI&#xff0c;各有各的适用场景。Magicodes.IE.IO 走的是另一条路&#xff1a;零运行时依赖&#xff0c;从 ZIP 到 OOXML 全部自研&#xff0c;不依赖任何第三方 Excel 库。对于类库作者来说&#xff0…

作者头像 李华
网站建设 2026/7/22 9:02:27

2026全球轮胎市场研究报告

轮胎是由橡胶及多种增强材料制成的圆形柔性部件&#xff0c;用于安装在车辆的车轮轮辋上。轮胎是车辆与地面之间唯一的接触点&#xff0c;在行车过程中起着至关重要的作用&#xff0c;直接影响行驶的安全性、舒适性和性能表现。它不仅提供车辆的牵引力和制动力&#xff0c;还能…

作者头像 李华
网站建设 2026/7/22 8:57:15

Claude Code终端AI编程助手极速入门指南

1. Claude Code 十分钟极速入门指南作为一名长期在终端里摸爬滚打的开发者&#xff0c;第一次接触Claude Code时就被它的高效惊艳到了。这个AI编程助手不像其他工具需要复杂的配置&#xff0c;一条命令就能完成从安装到编写第一行代码的全过程。今天我就带大家走一遍这个神奇的…

作者头像 李华