NX/UG二次开发:孔特征查找原理与实战指南
1. 项目缘起为什么要在NX/UG二次开发中“找孔”在机械设计、模具制造、工艺规划这些行当里NX或者大家更习惯叫它UG是绕不开的吃饭家伙。图纸画完了模型建好了你以为就万事大吉了真正的“麻烦”往往在后面。比如一个复杂的汽车发动机缸体模型上面密密麻麻分布着成百上千个孔螺纹孔、光孔、沉头孔、异形孔……工艺工程师需要统计所有孔的尺寸、位置、类型用来安排加工工序和刀具质检工程师需要生成所有孔的坐标用来编写三坐标检测程序甚至做有限元分析时也需要快速定位并施加边界条件的安装孔。手动去数去一个个点选在动辄几百个特征的复杂装配体面前这无异于大海捞针效率低下不说还极易出错漏。这时候“孔特征查找”这个功能就从“锦上添花”变成了“雪中送炭”。它不是一个简单的视觉高亮而是一个程序化的、可定制的、能批量处理数据的自动化过程。通过二次开发我们可以让NX自己“看懂”模型把里面所有的孔特征都找出来并且把它们的“身份证信息”类型、直径、深度、位置坐标、方向矢量等一一提取出来导出成Excel表格、生成加工清单或者直接驱动后续的自动化工艺设计。这背后的需求非常刚性将设计师的几何意图无缝转化为下游制造、检测环节可执行的、结构化的数据。我见过太多工程师把大量时间浪费在重复、繁琐的“数孔”、“列表”工作上。一次二次开发的投入换来的是整个团队长期效率的指数级提升。所以这个“查找”动作本质上是连接设计与制造的数据桥梁是数字化研发流程中非常关键的一环。2. 核心原理NX/UG如何“认识”一个孔在动手写代码之前我们必须先搞清楚NX系统内部是怎么定义和存储一个“孔”的。这不是玄学而是理解其API应用程序接口的基础。如果你把它想象成一个黑盒盲目调用函数很快就会遇到各种莫名其妙的报错和遗漏。2.1 特征Feature与标签TagNX是一个基于特征Feature的建模系统。你画的每一条线、做的每一次拉伸、打的每一个孔在NX内核中都是一个独立的“特征”对象。每个特征都有一个唯一的身份证号在二次开发里我们称之为“标签”Tag。它是一个整型数字tag_t是NX在内存中追踪和管理这个对象的句柄。我们查找孔实际上就是在当前工作部件Work Part的所有特征中筛选出那些“孔特征”。2.2 孔特征的“家族谱系”并不是所有“洞”都叫“孔特征”。在NX里孔特征Hole Feature有它明确的创建方式和类型定义。主要分为两大类标准孔特征通过NX的“孔”命令Insert - Design Feature - Hole创建的。这是最规范、信息最完整的孔。它又细分为常规孔简单孔、沉头孔、埋头孔。螺纹孔具有螺纹标识的孔其参数如螺纹规格、深度被系统完整记录。标准孔基于标准如GB、ISO的孔系列带有标准查找表。非标准“孔状”特征这些在几何上是个孔但并非由“孔”命令创建例如通过“拉伸”切除形成的圆孔。通过“旋转”切除形成的孔。通过“布尔运算”求差与其他零件形成的孔。这里就是第一个大坑很多初学者写的查找程序只能找到第1类标准孔特征会完全漏掉第2类。而对于下游工艺来说只要是个需要加工的孔不管你怎么做出来的它都关心。因此一个健壮的查找程序必须能同时处理这两种情况其技术路线也会完全不同。2.3 查找的技术路线选择根据目标的不同我们有两种主流的技术路线路线一基于特征类型的精确查找针对标准孔这种方法直接利用NX Open API提供的特征遍历和类型判断函数。它的优点是快、准、信息全。可以直接获取到孔的直径、深度、顶角、螺纹规格等所有参数属性。核心是使用UF_MODL_ask_feat_type函数来判断一个特征的类型是否为UF_hole_type。路线二基于几何面的拓扑查找针对所有孔状结构这种方法更底层不关心特征怎么来的只关心模型最终长什么样。它的思路是找到模型上所有的圆柱形内表面或圆锥形内表面然后根据这些面的几何属性半径、轴线方向和拓扑关系是否形成封闭的环来推断出这是一个“孔”。这种方法能抓到所有“孔”但缺点是信息可能不全比如不知道是螺纹孔还是光孔且逻辑更复杂需要处理面、边、环等几何体。在实际项目中我通常采用“主路线一辅以路线二校验”的策略。先快速抓取所有标准孔得到一个基准列表。然后对于有严格完整性要求的场景如全工序加工再用路线二的方法对整个模型进行几何扫描将找到的圆柱面与已有标准孔列表进行位置比对补上那些“漏网之鱼”。3. 实战基于NX Open API的孔特征查找程序详解理论说再多不如一行代码。下面我将以一个完整的、可运行的C示例同样逻辑也适用于.NET或Python来拆解如何实现一个查找标准孔特征的程序。我会在关键步骤穿插解释“为什么这么做”以及“踩过的坑”。3.1 环境准备与头文件首先确保你的开发环境已经配置好NX Open C的开发环境包含uf.h,uf_modl.h等头文件和库文件。#include uf.h #include uf_modl.h #include uf_obj.h #include uf_part.h #include vector #include iostream // 定义一个结构体来存储孔的信息方便后续处理 struct HoleInfo { tag_t featureTag; // 特征标签 char featureName[UF_OBJ_NAME_LEN 1]; // 特征名称 double origin[3]; // 孔原点坐标 double direction[3]; // 孔方向矢量 double diameter; // 直径 double depth; // 深度 int holeSubType; // 孔子类型简单、沉头、埋头、螺纹 // 可以根据需要添加更多字段如螺纹规格、顶角等 };注意为什么要把孔信息存到自定义结构体里因为NX的API函数是分散的你可能需要调用好几个函数才能凑齐一个孔的所有信息。在内存中用一个统一的结构体管理起来后续无论是打印、导出还是做其他计算都会非常方便。这是工程化思维的第一步。3.2 遍历部件中的所有特征这是查找的起点。我们需要获取当前工作部件然后拿到这个部件里所有特征的列表。extern C DllExport void ufusr(char *param, int *retCode, int rlen) { UF_initialize(); // 初始化NX Open API必须首先调用 tag_t workPart NULL_TAG; UF_PART_ask_display_part(workPart); // 获取当前显示部件通常即工作部件 if (workPart NULL_TAG) { std::cerr 错误未发现打开的部件 std::endl; UF_terminate(); return; } // 获取部件中所有特征的标签数组 int featureCount 0; tag_t *featureList NULL; UF_MODL_ask_feat_list(workPart, featureCount, featureList); std::vectorHoleInfo holeList; // 用于存储找到的孔 // ... 后续遍历逻辑将在这里展开 UF_free(featureList); // 释放NX API分配的内存防止内存泄漏 UF_terminate(); // 终止API }踩坑提醒UF_MODL_ask_feat_list返回的featureList数组内存是由NX API分配的使用完毕后必须用UF_free()释放否则会造成内存泄漏。这是一个非常常见的错误在长时间运行的自动化任务中累积的泄漏可能导致NX崩溃。3.3 识别并提取孔特征信息现在我们遍历每一个特征判断它是不是孔如果是就提取它的信息。for (int i 0; i featureCount; i) { tag_t currentFeature featureList[i]; char featType[UF_MODL_MAX_FEAT_TYPE_NAME_LEN 1]; // 获取特征类型名称 if (UF_MODL_ask_feat_type(currentFeature, featType) ! UF_NORMAL) { continue; // 获取失败跳过此特征 } // 判断是否为孔特征 if (strcmp(featType, HOLE) 0) { // 注意类型名是字符串HOLE HoleInfo hole; hole.featureTag currentFeature; // 1. 获取特征名可选便于调试和输出 UF_OBJ_ask_name(currentFeature, hole.featureName); // 2. 获取孔的原点和方向 - 这是最关键也最容易出错的一步 UF_MODL_ask_hole_parms(currentFeature, hole.origin, hole.direction, hole.diameter, hole.depth, hole.holeSubType); // 将找到的孔加入列表 holeList.push_back(hole); } }核心函数UF_MODL_ask_hole_parms详解这个函数是获取孔参数的核心。它一次性返回了原点、方向、直径、深度和子类型。但这里有三个巨坑原点坐标 (origin)这个坐标是**工作坐标系WCS**下的值不是绝对坐标系。如果你的模型不在WCS原点或者WCS被旋转过这个坐标直接拿来用就是错的。必须进行坐标转换通常需要用到UF_CSYS_map_point函数将其转换到绝对坐标系。方向矢量 (direction)这是一个单位矢量表示孔的轴线方向。例如[0, 0, 1]表示沿Z轴正向。注意它也是一个矢量不是欧拉角。子类型 (holeSubType)它是一个整数枚举值你需要查阅NX Open手册来对应其含义。例如UF_HOLE_SIMPLE_SUBTYPE(0): 简单孔UF_HOLE_COUNTERBORE_SUBTYPE(1): 沉头孔UF_HOLE_COUNTERSINK_SUBTYPE(2): 埋头孔UF_HOLE_TAPPED_SUBTYPE(3): 螺纹孔3.4 坐标转换与数据输出找到孔并拿到原始数据后必须进行后处理才能用。// 假设我们已经有了holeList for (auto hole : holeList) { double absOrigin[3]; double wcsOrigin[3] {hole.origin[0], hole.origin[1], hole.origin[2]}; tag_t wcsTag UF_CSYS_ask_wcs(); // 获取当前工作坐标系 tag_t absCsysTag UF_CSYS_ask_root_csys(); // 获取绝对坐标系 // 将原点从WCS转换到绝对坐标系 UF_CSYS_map_point(wcsTag, absCsysTag, wcsOrigin, absOrigin); // 现在 absOrigin 里才是模型空间中的绝对坐标 hole.origin[0] absOrigin[0]; hole.origin[1] absOrigin[1]; hole.origin[2] absOrigin[2]; // 输出信息示例输出到NX信息窗口 char msg[256]; sprintf(msg, 发现孔特征[%s]: 类型%d, 位置(%.2f, %.2f, %.2f), 直径%.2fmm, 深度%.2fmm, hole.featureName, hole.holeSubType, hole.origin[0], hole.origin[1], hole.origin[2], hole.diameter, hole.depth); UF_UI_write_listing_window(msg); } // 更常见的做法是导出到CSV文件 FILE *fp fopen(hole_report.csv, w); fprintf(fp, 特征名, 类型, X, Y, Z, 直径, 深度\n); for (auto hole : holeList) { const char* typeStr 未知; switch(hole.holeSubType) { case 0: typeStr 简单孔; break; case 1: typeStr 沉头孔; break; case 2: typeStr 埋头孔; break; case 3: typeStr 螺纹孔; break; } fprintf(fp, %s, %s, %.3f, %.3f, %.3f, %.3f, %.3f\n, hole.featureName, typeStr, hole.origin[0], hole.origin[1], hole.origin[2], hole.diameter, hole.depth); } fclose(fp); UF_UI_write_listing_window(孔信息已导出至 hole_report.csv);4. 进阶与避坑处理复杂场景与性能优化上面的代码是一个基础框架但在实际项目中你会遇到各种复杂情况。下面分享几个我踩过坑后总结的进阶要点。4.1 处理“非标准”孔状特征如前所述拉伸切除形成的孔不会被识别为HOLE特征。要找到它们你需要遍历所有体Body使用UF_MODL_ask_body_features获取体的特征或直接遍历所有面。识别圆柱面对每个面使用UF_MODL_ask_face_type判断是否为圆柱面 (UF_CYLINDRICAL_FACE_TYPE) 或圆锥面 (UF_CONICAL_FACE_TYPE)。判断是否为内表面获取面的法向矢量并结合面的位置判断它是外圆柱面如轴还是内圆柱面如孔。一个粗略的方法是计算面的中心点判断该点是否在实体内部可用UF_MODL_ask_point_containment内部的面很可能是孔。提取参数对于圆柱面用UF_MODL_ask_face_parms获取圆柱的轴点、轴方向、半径。这些信息就对应了孔的轴线位置和半径。这个过程代码量会大很多且容易误判比如一个通槽的侧面也是圆柱面。通常需要结合多个条件如相邻面的拓扑关系进行综合判断鲁棒性要求很高。4.2 处理装配体中的孔如果你的工作部件是一个装配体UF_MODL_ask_feat_list默认只返回顶级装配的特征不会深入到每个子组件。要查找整个装配中所有零件的孔你需要使用UF_ASSEM_ask_root_part_occ获取根部件。递归遍历整个装配树使用UF_ASSEM_ask_part_occ_children获取子组件。对每一个遇到的部件Part将其设为工作部件UF_PART_set_work_part然后再执行上述的孔查找逻辑。切记在查找和操作子部件前必须正确设置工作部件否则所有API操作对象都是错的。同时要管理好部件标签的切换避免混乱。4.3 性能优化与大规模模型处理当模型有上万个特征时逐一遍历所有特征并判断类型可能会慢。可以尝试以下优化使用特征类型过滤器NX Open 提供了更高效的特征遍历函数如UF_MODL_ask_feat_list_by_type你可以直接请求类型为HOLE的特征列表避免遍历无关特征。这是最有效的优化。int holeCount 0; tag_t *holeList NULL; const char* featType HOLE; UF_MODL_ask_feat_list_by_type(workPart, featType, 1, holeCount, holeList); // 现在holeList里就全是孔特征了无需再判断类型异步与进度提示对于非常耗时的操作考虑将查找逻辑放在一个后台线程中执行并在UI上显示进度条防止NX界面卡死无响应。可以使用UF_UI_start_progress_bar和UF_UI_update_progress_bar函数。增量式查找如果模型经常局部修改可以记录已查找过的特征标签和修改时间戳下次只查找新增或修改过的特征而不是全量扫描。4.4 常见错误与调试技巧UF_NORMAL错误检查几乎每一个NX Open API函数调用后都应该检查其返回值是否为UF_NORMAL表示成功。如果不是用UF_get_fail_message获取错误信息打印出来这是调试的黄金法则。标签有效性在传递tag_t给函数前特别是从数组或自定义数据结构中取出时最好用UF_OBJ_is_valid检查一下标签是否还有效。因为用户可能在程序运行期间删除了某个特征。单位制UF_MODL_ask_hole_parms返回的直径、深度值其单位是当前部件文件的单位毫米或英寸。在输出或与其他系统交互时务必进行单位换算和明确标注。多线程安全NX Open API 绝大多数函数不是线程安全的。不要在非主线程特别是你自己创建的线程中直接调用NX Open API这会导致不可预知的崩溃。如果必须多线程请使用NX提供的线程安全机制或通过队列将任务抛回主线程执行。5. 从查找到应用构建自动化工具链查找孔特征本身不是目的它只是一个数据采集的起点。真正的价值在于将这些数据用起来。这里分享几个我实践过的应用方向1. 自动孔表生成器将找到的孔信息按照图纸上的“孔表”格式自动生成一个表格并可以插入到NX制图模块中或者导出为Excel。这能节省绘图员大量的手工输入和校对时间。2. 加工工艺卡片自动填充将孔的坐标、直径、深度、类型信息自动填入工艺卡片模板的对应位置。甚至可以联动刀具库根据孔径和深度推荐合适的钻头、丝锥。3. 智能检查清单针对特定产品如模具模板预设一套孔系规范如哪些位置必须有顶针孔、水路孔。程序在查找后自动核对发现的孔与规范是否一致生成一份检查报告标注多孔、漏孔、尺寸不符等问题。4. 与CAM系统集成将孔坐标和参数直接传递给CAM软件如NX CAM本身或其他第三方软件作为自动钻孔编程的输入实现设计-加工的一键式流程。要实现这些应用关键在于设计好你的HoleInfo结构体让它包含足够丰富和规范的属性。然后你需要学习NX Open在其他模块的API比如制图模块 (UF_DRAFT) 来创建表格属性模块 (UF_ATTR) 来读写非几何信息或者文件IO操作来生成外部数据文件。最后我的个人体会是NX二次开发中“查找”类功能是许多自动化流程的基石。它考验的是你对NX数据模型理解的深度和代码的健壮性。把“找孔”这件事做扎实、做全面后续无论你想玩出什么花样数据源都是稳定可靠的。刚开始可能会被各种坐标转换、特征类型、装配层级搞得头晕但一旦打通你会发现很多其他特征的查找如倒角、圆角、凸台都是类似的思路一通百通。最实用的建议是从一个简单的小程序开始只找标准孔输出到列表窗口。成功之后再一步步增加坐标转换、导出文件、处理装配、兼容非标孔……每走一步都充分测试这样构建出来的工具才稳固可用。

相关新闻

AI原生时代:IT组织架构如何从职能筒仓向智能驱动转型

AI原生时代:IT组织架构如何从职能筒仓向智能驱动转型

1. 项目概述:当AI不再是“工具”,组织如何“换芯”最近和几个在不同规模公司做技术VP、CTO的朋友聊天,话题总绕不开一个词:焦虑。焦虑的源头不是业务下滑,恰恰相反,是业务对技术的要求正在以指数级变化。过…

2026/8/5 4:43:59 阅读更多 →
【往届均已检索、大连理工主办】第十届交通工程与运输系统国际学术会议(ICTETS 2026)

【往届均已检索、大连理工主办】第十届交通工程与运输系统国际学术会议(ICTETS 2026)

第十届交通工程与运输系统国际学术会议(ICTETS 2026)将由大连理工大学主办,将于2026年9月18-20日在大连隆重召开。会议旨在为从事交通运输、交通信息与控制、交通信号和物流系统与信息化技术等领域的研究的专家学者、工程技术人员、技术研发人…

2026/8/5 4:42:59 阅读更多 →
Oracle数据库NULL值处理:5大核心函数与实战避坑指南

Oracle数据库NULL值处理:5大核心函数与实战避坑指南

1. 从一次线上故障说起:为什么NULL处理是Oracle开发的必修课那天下午,系统监控突然告警,一个核心报表的汇总金额出现了负值。团队立刻进入紧急排查状态。这个报表的逻辑并不复杂,是对多张业务表的金额字段进行累加和条件筛选。经过…

2026/8/5 4:42:59 阅读更多 →

最新新闻

React Native构建物流签收App:离线队列与图片压缩实战

React Native构建物流签收App:离线队列与图片压缩实战

1. 从“派单”到“签收”:一个司机App的核心闭环 在物流运输行业,一个完整的订单流转,始于调度中心的系统派单,终于司机在客户现场的实物交付与签收。这个“最后一公里”的签收环节,看似只是点击一下屏幕,背…

2026/8/5 9:18:59 阅读更多 →
LAV Filters完全指南:5步打造Windows完美视频播放体验

LAV Filters完全指南:5步打造Windows完美视频播放体验

LAV Filters完全指南:5步打造Windows完美视频播放体验 【免费下载链接】LAVFilters LAV Filters - Open-Source DirectShow Media Splitter and Decoders 项目地址: https://gitcode.com/gh_mirrors/la/LAVFilters LAV Filters是一个基于ffmpeg的开源DirectS…

2026/8/5 9:18:59 阅读更多 →
商用机器人活动完整实施指南:商场巡游导览、编队表演技术与落地案例

商用机器人活动完整实施指南:商场巡游导览、编队表演技术与落地案例

随着大模型语音交互、多自由度仿生运动控制、自主导航技术成熟,人形机器人现已成为济南商场周年庆、新店开业、中庭主题展、文旅嘉年华的核心引流载体。本文结合济南本地商场真人落地活动案例,参考标准化机器人活动分层技术架构,完整拆解舞台…

2026/8/5 9:18:59 阅读更多 →
【C】零基础教我学会c语言(十二)

【C】零基础教我学会c语言(十二)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、void指针二.二级指针三.指针数组四.数组指针五.二维数组传参1.二维整型数组的传参总结前言 难死我了 提示:以下是本篇文章正文内容,…

2026/8/5 9:18:59 阅读更多 →
STM32引脚电路设计避坑指南:从电平匹配到PCB布局的实战经验

STM32引脚电路设计避坑指南:从电平匹配到PCB布局的实战经验

1. 项目概述:从“点灯”到“避坑”的必经之路搞STM32开发的朋友,估计都是从点亮第一个LED开始的。看着原理图上那个简单的LED和限流电阻,接上GPIO,写几行代码,灯亮了,成就感满满。但当你真正开始做一个项目…

2026/8/5 9:18:59 阅读更多 →
嵌入式:理解STM32文档和社区生态,工具链的选择与安装

嵌入式:理解STM32文档和社区生态,工具链的选择与安装

一、STM32 的文档与社区生态 1.理解文档化逻辑 产业依靠分工运转:CPU 设计、芯片制造、PCB 绘制、软件编程由不同人员各司其职;同时产业链需要紧密协作,不同领域人员想要配合,就必须依靠文档打通知识壁垒。 不懂硬件结构、引脚功…

2026/8/5 9:17:59 阅读更多 →

日新闻

Java缓存框架:JetCache

Java缓存框架:JetCache

TOC 一、简介 JetCache 是一个 Java 缓存抽象框架,为不同的缓存解决方案提供了统一的使用方式。 它提供的注解比 Spring Cache 更加强大。 JetCache 的注解支持原生 TTL、两级缓存以及在分布式环境中的自动刷新功能,同时你也可以通过代码直接操作 Cach…

2026/8/5 0:00:43 阅读更多 →
AD 铺铜设置十字连接,过孔全连接,新版AD的简单设置

AD 铺铜设置十字连接,过孔全连接,新版AD的简单设置

需求:通孔焊盘 十字花;过孔 Via 实心直连;贴片焊盘按需设置 AD 测试版本AD24 很多工程师踩坑:全部统一十字,导致接地过孔阻抗高、大电流发热! 一、快捷键打开规则 PCB 界面按下:D R 展开…

2026/8/5 0:00:43 阅读更多 →
AI素描转换技术深度拆解(2024最新论文+工业级落地代码):从Stable Diffusion ControlNet到LoRA微调全链路解析

AI素描转换技术深度拆解(2024最新论文+工业级落地代码):从Stable Diffusion ControlNet到LoRA微调全链路解析

更多请点击: https://kaifayun.com 第一章:AI生成素描效果 AI生成素描效果是计算机视觉与风格迁移技术融合的典型应用,其核心在于将彩色照片或RGB图像转换为具有手绘质感、明暗对比强烈、边缘清晰的单色素描图像。该过程通常依赖于深度学习模…

2026/8/5 0:00:43 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/4 13:24:41 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/4 11:41:39 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/4 5:26:40 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/4 13:38:24 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/4 11:09:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/4 13:38:40 阅读更多 →