当前位置: 首页 > news >正文

基于C/C++的UG二次开发流程

文章目录

  • 基于C/C++的UG二次开发流程
    • 1 环境搭建
      • 1.1 新建工程
      • 1.2 项目属性设置
      • 1.3 添加入口函数并生成dll文件
      • 1.4 执行程序
      • 1.5 ufsta入口
        • 1.5.1 创建程序部署目录结构
        • 1.5.2 创建菜单文件
        • 1.5.3 设置系统环境变量
        • 1.5.4 制作对话框
        • 1.5.5 创建代码
        • 1.5.6 部署和执行

基于C/C++的UG二次开发流程

1 环境搭建

UG/Open API(UG 开放应用程序接口),也称 User Function(用户函数,简称 UF)。

UF 的编程可以采用标准 C 或 C++两种方式作为开发语言(这里我们使用C++)。

针对程序运行的环境不同,UF 程序又分为外部 UF内部 UF 两种形式。

外部 UF 程序是可执行程序(*.EXE)。优点是不必启动 UG,属于后台运行,缺点是不能实现用户的交互操作。一般多用于 Part 文件大量创建、存取和管理或控制出图,而不适用于用户交互性的几何建模和修改。

内部 UF 是以**动态链接库(*.DLL)**的形式创建并编译的。UG 调用内部 UF 的方式有两种,一种是启动 UG 后,点击菜单:【文件】→【执行】→【NX 打开】,从中选择需要执行的 DLL 文件(程序入口点:ufusr),另一种则是从用户创建的菜单中(Menu Script)调出用户定制的界面(UI Styler)来运行(程序入口点:ufsta)。内部 UF在用户的交互、屏幕选取等的复杂操作上具有优势。

下文中我们主要介绍内部UF程序的开发。

1.1 新建工程

启动VS2022,由于是内部UF的开发,新建动态链接库(DLL)项目。

在这里插入图片描述

1.2 项目属性设置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

libufun.lib
libugopenint.lib
libvmathpp.lib
libnxopencpp.lib
libnxopenuicpp.lib

1.3 添加入口函数并生成dll文件

新建项目后,VS2022会默认生成framework.h、pch.h、pch.cpp、dllmain.cpp文件。接下来我们只需要修改dllmain.cpp,修改后内容如下:

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"
#include "uf.h"				// 包含常用 UF 函数的声明
#include "uf_modl.h"		// 包含建模相关的 UF 函数声明
#include "uf_ui.h"			// 包含界面操作相关的 UF 函数声明
#include <stdio.h>#define UF_CALL(X) (report( __FILE__, __LINE__, #X, (X)))// 用于程序调试
static int report(char* file, int line, char* call, int irc)
{if (irc){char msg[133];printf("%s, line %d: %s\n", file, line, call);(UF_get_fail_message(irc, msg)) ?printf("returned a %d\n", irc) :printf("returned error %d: %s\n", irc, msg);}return(irc);
}// 实际工作函数
static void do_ugopen_api(void)
{/* 用户在此编写自己的 UF 程序 *//* 下面示例为创建长方体 */UF_FEATURE_SIGN sign = UF_NULLSIGN;double block_orig[3] = { 0.0,0.0,0.0 }; // 原点char* block_len[3] = { "1","2","3" };	// 三边长tag_t blk_obj;UF_CALL(UF_MODL_create_block1(sign, block_orig, block_len, &blk_obj)); // 调用UF_MODL_create_block1函数创建长方体
}void ufusr(char* param, int* retcode, int paramLen)
{if (!UF_CALL(UF_initialize()))//获取二次开发许可 {do_ugopen_api();//实际工作函数 UF_CALL(UF_terminate());//释放二次开发许可 }else{uc1601("获取开发许可失败,退出!", 1);//获取二次开发许可失败,提示用户 }
}// 卸载函数
int ufusr_ask_unload(void)
{return (UF_UNLOAD_IMMEDIATELY);//完成操作后立即从内存中卸载
}

修改属性页,将符合模式改为,防止编译运行报错“const char *“ 类型的实参与 “char *“ 类型的形参不兼容

参考文章:「VS」“const char *“ 类型的实参与 “char *“ 类型的形参不兼容
在这里插入图片描述

最后点击运行,即可得到内部UF的dll文件。

在这里插入图片描述

1.4 执行程序

打开UG,新建一个part文件。Ctrl+U打开上一步生成的DLL文件(test.dll)。UG 会执行此动态库中的入口函数ufusr,在 UG 建模工作区中生成一个长方体。
在这里插入图片描述

1.5 ufsta入口

在上面我们执行内部UF程序的方法是从ufusr入口进入(即Ctrl+U执行DLL文件),接下来我们介绍从ufsta入口进入的方法(即UI交互执行对应回调函数)。

1.5.1 创建程序部署目录结构

首先创建一个工作目录,其中分别再创建两个子目录“startup”和“application”。前者用来存放菜单文件(*.men)和动态库文件(*.dll),后者存放对话框文件(*.dlg)。
在这里插入图片描述-

1.5.2 创建菜单文件

startup目录下创建一个菜单文件(test_ufsta.men),内容如下:

VERSION 120
EDIT UG_GATEWAY_MAIN_MENUBAR
HIDE UG_HELP
!一级菜单编辑,在帮助菜单后
BEFORE UG_HELPCASCADE_BUTTON MENU_TestUfstaLABEL TestUfsta
END_OF_BEFORE 
!二级菜单编辑
MENU MENU_TestUfsta BUTTON BUTTON_TestUfsta LABEL 测试ufsta ACTIONS TestUfsta.dlg
END_OF_MENU
1.5.3 设置系统环境变量

新建一个环境变量UGII_USER_DIR,将上面的程序工作目录作为值。

在这里插入图片描述

新建完成后,打开UG,点击菜单,即可得到我们想要的效果。
如果出现中文乱码的问题,将men文件采用ANSI编码保存即可解决。
在这里插入图片描述

1.5.4 制作对话框

UG中提供了UI Styler模块用于制作对话框UI,支持图形化操作,自动生成代码框架(类似于Qt Designer)。该模块的打开方式如下(需要先打开一个部件):

在这里插入图片描述

我们便可以得到一个最基础的对话框,左下角为预览效果,左上角为控件对象层级树,右边为控件对象属性。

在这里插入图片描述

点击界面上方工具栏中的按钮,即可在对话框中添加一个按钮。

在这里插入图片描述

接着我们将按钮的标签更改成一个我们想要名称,最后点击保存,选择使用的语言(这里选择C++),文件名为TestUfsta.dlg,保存到application目录下,

在这里插入图片描述

  • xxx.dlg。对话框资源文件。

  • xxx.hxx。对此对话框编程使用的头文件。

  • xxx_template.c。对此对话框编程使用的代码框架。

1.5.5 创建代码

和ufusr入口一样,新建一个命名为TestUfsta的DLL工程,将上一步生成的xxx.h文件拷贝到工程目录下,再将xxx_template.c文件中的一个宏定义和两个静态变量,以及ufsta(UF 的入口点)、CHANGE_apply_cb(对话框上【apply】按钮的回调函数)、CHANGE_action_0_act_cb(对话框上用户定制的【创建长方体】按钮的回调函数)三个函数复制到TestUfsta.cpp中。修改后内容如下:

#include <stdio.h> 
#include <uf.h> 
#include <uf_defs.h> 
#include <uf_exit.h> 
#include <uf_ui.h> 
#include <uf_styler.h> 
#include <uf_mb.h> 
#include <stdio.h>
#include <uf_modl.h>
#include "TestUfsta.h"#define CHANGE_CB_COUNT ( 2 + 1 ) /* Add 1 for the terminator */
#define UF_CALL(X) (report( __FILE__, __LINE__, #X, (X)))// 用于程序调试
static int report(char* file, int line, char* call, int irc)
{if (irc){char msg[133];printf("%s, line %d: %s\n", file, line, call);(UF_get_fail_message(irc, msg)) ?printf("returned a %d\n", irc) :printf("returned error %d: %s\n", irc, msg);}return(irc);
}// 实际工作函数
static void do_ugopen_api(void)
{/* 用户在此编写自己的 UF 程序 *//* 下面示例为创建长方体 */UF_FEATURE_SIGN sign = UF_NULLSIGN;double block_orig[3] = { 0.0,0.0,0.0 }; // 原点char* block_len[3] = { "1","2","3" };	// 三边长tag_t blk_obj;UF_CALL(UF_MODL_create_block1(sign, block_orig, block_len, &blk_obj)); // 调用UF_MODL_create_block1函数创建长方体
}static UF_STYLER_callback_info_t CHANGE_cbs[CHANGE_CB_COUNT] =
{{UF_STYLER_DIALOG_INDEX, UF_STYLER_APPLY_CB        , 0, CHANGE_apply_cb},{CHANGE_ACTION_0       , UF_STYLER_ACTIVATE_CB     , 0, CHANGE_action_0_act_cb},{UF_STYLER_NULL_OBJECT, UF_STYLER_NO_CB, 0, 0 }
};static UF_MB_styler_actions_t actions[] = {{ "TestUfsta.dlg",  NULL,   CHANGE_cbs,  UF_MB_STYLER_IS_NOT_TOP },{ NULL,  NULL,  NULL,  0 } /* This is a NULL terminated list */
};extern void ufsta(char* param, int* retcode, int rlen)
{int  error_code;if ((UF_initialize()) != 0)return;if ((error_code = UF_MB_add_styler_actions(actions)) != 0){char fail_message[133];UF_get_fail_message(error_code, fail_message);printf("%s\n", fail_message);}UF_terminate();return;
}int CHANGE_apply_cb(int dialog_id,void* client_data,UF_STYLER_item_value_type_p_t callback_data)
{/* Make sure User Function is available. */if (UF_initialize() != 0)return (UF_UI_CB_CONTINUE_DIALOG);/* ---- Enter your callback code here ----- */UF_terminate();/* Callback acknowledged, do not terminate dialog                 *//* A return value of UF_UI_CB_EXIT_DIALOG will not be accepted    *//* for this callback type.  You must respond to your apply button.*/return (UF_UI_CB_CONTINUE_DIALOG);}int CHANGE_action_0_act_cb(int dialog_id,void* client_data,UF_STYLER_item_value_type_p_t callback_data)
{/* Make sure User Function is available. */if (UF_initialize() != 0)return (UF_UI_CB_CONTINUE_DIALOG);/* ---- Enter your callback code here ----- */do_ugopen_api();UF_terminate();/* Callback acknowledged, do not terminate dialog */return (UF_UI_CB_CONTINUE_DIALOG);/* or Callback acknowledged, terminate dialog.    *//* return ( UF_UI_CB_EXIT_DIALOG );               */}

运行生成DLL。

对于VS2022,新建DLL工程后会默认生成和使用pch.h作为预编译头文件,为了不必要的麻烦,我们将工程属性设置为不使用预编译头文件,即可删除pch相关的文件。
在这里插入图片描述

1.5.6 部署和执行

将所生成的DLL文件拷贝到startup目录下,打开UG即可成功运行。

在这里插入图片描述

相关文章:

基于C/C++的UG二次开发流程

文章目录 基于C/C的UG二次开发流程1 环境搭建1.1 新建工程1.2 项目属性设置1.3 添加入口函数并生成dll文件1.4 执行程序1.5 ufsta入口1.5.1 创建程序部署目录结构1.5.2 创建菜单文件1.5.3 设置系统环境变量1.5.4 制作对话框1.5.5 创建代码1.5.6 部署和执行 基于C/C的UG二次开发…...

“第五十二天”

算术逻辑单元&#xff1a; 之前提过的运算器包括MQ,ACC,ALU,X,PSW&#xff1b;运算器可以实现运算以及一些辅助功能&#xff08;移位&#xff0c;求补等&#xff09;。 其中ALU负责运算&#xff0c;运算包括算术运算&#xff08;加减乘除等&#xff09;和逻辑运算&#xff08…...

Lvs+Nginx+NDS

什么是&#xff1f;为什么&#xff1f;需要负载均衡 一个网站在创建初期&#xff0c;一般来说都是只有一台服务器对用户提供服务 ​ 从图里可以看出&#xff0c;用户经过互联网直接连接了后端服务器&#xff0c;如果这台服务器什么时候突然 GG 了&#xff0c;用户将无法访问这…...

JavaWeb——Servlet原理、生命周期、IDEA中实现一个Servlet(全过程)

6、servlet 6.1、什么是servlet 在JavaWeb中&#xff0c;Servlet是基于Java编写的服务器端组件&#xff0c;用于处理客户端&#xff08;通常是Web浏览器&#xff09;发送的HTTP请求并生成相应的HTTP响应。Servlet运行在Web服务器上&#xff0c;与Web容器&#xff08;如Tomcat&…...

Android 12.0 ota升级之SettingsProvider新增和修改系统数据相关功能实现

1. 前言 在12.0的系统rom定制化开发中,在解决一些已经上线的bug后,进行ota升级的过程中,由于在SettingsProvider中新增了系统属性和修改某项系统属性值,但是在ota升级以后发现没有 更新,需要恢复出厂设置以后才会更改,但是恢复出厂设置 会丢掉一些数据,这是应为系统数据…...

python---for循环结构中的else结构(是同级关系)

为什么需要在for循环中添加else结构 循环可以和else配合使用&#xff0c; else下方缩进的代码指的是当循环正常结束之后要执行的代码。 强调&#xff1a; 循环 正常结束&#xff0c;else之后要执行的代码。 非正常结束&#xff0c;其else中的代码是不会执行的。&#xf…...

XLua中lua读写cs对象的原理

LuaCallCS 1. 传递C#对象到Lua XLua在C#维护了两个数据结构&#xff0c;ObjectPool和ReverseMap。 首次传递一个C#对象obj到Lua时&#xff0c;对象被加入到ObjectPool中&#xff0c;并为它创建一个唯一标识objId&#xff0c;建立obj和objId的双向映射。 ObjectPool: objId-…...

新手小白怎么选择配音软件?

现在的配音软件软件很多&#xff0c;各种类型的都比较多&#xff0c;对于新手小白来说不知该如何选择&#xff0c;今天就来给你分享几款好用的配音软件。不论是制作短视频还是制作平常音频都完全可以。 第一款&#xff1a;悦音配音 这是一款专业的视频配音软件&#xff0c;多端…...

linux查看硬件信息命令

文章目录 cpu内核版本内存硬盘主板服务器参考链接 cpu cat /proc/cpuinfo 一个物理CPU可以有1个或者多个物理内核&#xff0c;一个物理内核可以作为1个或者2个逻辑CPU。 物理CPU数就是主板上实际插入的CPU数量。 在Linux上cat /proc/cpuinfo&#xff0c;会打印每个cpu的信息 …...

TSINGSEE青犀省级高速公路视频上云联网方案:全面实现联网化、共享化、智能化

一、需求背景 随着高速铁路的建设及铁路管理的精细化&#xff0c;原有的模拟安防视频监控系统已经不能满足视频监控需求&#xff0c;越来越多站点在建设时已开始规划高清安防视频监控系统。高速公路视频监控资源非常丰富&#xff0c;需要对其进行综合管理与利用。通过构建监控…...

知识图谱相关的操作

微软生成自己的图谱&#xff1a;GitHub - microsoft/SmartKG: This project accepts excel files as input which contains the description of a Knowledge Graph (Vertexes and Edges) and convert it into an in-memory Graph Store. This project implements APIs to searc…...

【Javascript】json

目录 什么是json&#xff1f; 书写格式 json 序列化和反序列化 序列化 反序列化 什么是json&#xff1f; JSON(JavaScript Object Notation)是⼀种轻量级的数据交换格式&#xff0c;它基于JavaScript的⼀个⼦集&#xff0c;易于⼈的编写和阅读&#xff0c;也易于机器解析…...

零资源的大语言模型幻觉预防

零资源的大语言模型幻觉预防 摘要1 引言2 相关工作2.1 幻觉检测和纠正方法2.2 幻觉检测数据集 3 方法论3.1 概念提取3.2 概念猜测3.2.1 概念解释3.2.2 概念推理 3.3 聚合3.3.1 概念频率分数3.3.2 加权聚合 4 实验5 总结 摘要 大语言模型&#xff08;LLMs&#xff09;在各个领域…...

智能终端界面自动化测试操作工具 - Appium常见用法

1. Appium 是什么可以做什么&#xff1f; Appium 是一款开源的移动应用自动化测试框架&#xff0c;用于测试移动应用程序的功能和用户界面。它支持多种移动平台&#xff0c;包括 Android 和 iOS&#xff0c;可以使用多种编程语言进行脚本编写&#xff0c;如 Python、Java、Jav…...

结构体数组经典运用---选票系统

结构体的引入 1、概念&#xff1a;结构体和其他类型基础数据类型一样&#xff0c;例如int类型&#xff0c;char类型&#xff0c;float类型等。整型数&#xff0c;浮点型数&#xff0c;字符串是分散的数据表示&#xff0c;有时候我们需要用很多类型的数据来表示一个整体&#x…...

code too large

描述&#xff1a;比较尴尬&#xff0c;一个方法的代码接近10000行了&#xff0c;部署服务器的时候提示(java :code[255,21] too large),提示代码过长&#xff0c;无法运行。 查看了一下百度&#xff1a;解决的思路 JVM规范&#xff1a;「类或接口可以声明的字段数量限制在 655…...

vue中把弹出层.vue文件注册成组件供其他.vue文件调用的写法

背景&#xff1a;因弹出层多个页面的详情都是一样的&#xff0c;因此把弹出层定义成组件&#xff0c;多次调用 定义组件的过程中出现很多问题&#xff0c;因此再次记录最终成功的写法 一、 简单实现页面调用弹出层组件的打开弹出层方法&#xff1a; 1. 弹出层组件 (in…...

mac 查看GPU使用

首先搜索活动监视器 然后 点击窗口->gpu历史记录 记住不是立马出结果&#xff0c;而是 需要等半分钟左右的...

工业4.0的安全挑战与解决方案

在当今数字化时代&#xff0c;工业4.0已经成为制造业的核心趋势。工业4.0的兴起为生产企业带来了前所未有的效率和灵活性&#xff0c;但与之伴随而来的是一系列的安全挑战。本文将深入探讨工业4.0的安全挑战&#xff0c;并提供一些解决方案&#xff0c;以确保制造业的数字化转型…...

如何查找特定基因集合免疫基因集 炎症基因集

温故而知新&#xff0c;再次看下Msigdb数据库。它更新了很多内容。给我们提供了一个查询基因集的地方。 关注微信&#xff1a;生信小博士 比如纤维化基因集&#xff1a; 打开网址&#xff1a;https://www.gsea-msigdb.org/gsea/msigdb/index.jsp 2.点击search 3.比如我对纤维…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...