参考链接:基于VS + Qt编程的UG/NX二次开发 – 神奇代码串

一般情况下,VS版本和UG版本需对应版本来开发,但本人较懒,而且习惯了现有VS2019版本+QT5.12版本,不想再折腾,所以在此基础上进行摸索。网络上基于QT编程的UG二次开发相关资料虽然很少,但也极大的帮助我快速建立了开发环境以及后续一些列配置工作。

一、工具:

编程工具:VS2019+QT5.12(VS和QT的安装和配置,请自行百度)

UG版本:UG11.0

二、项目创建:

打开VS2019,创建新项目,选择Qt Class Library,进入下一步

填写项目名称和项目存储路径,点击创建

选择64位版本,模块选择Core、GUI、Widgts

创建后,默认模板如下

三、相关配置:

需要把UG二次开发所需的头文件目录包含进去

运行库设置为多线程,否则可能其他电脑或用户运行会有问题。

添加库目录,即UG文件夹下的UGOPEN文件夹,所有库文件都在这个文件夹内

添加依赖项,不知道具体需要用到那些依赖项的话,就把UGOPEN文件夹内的所有库文件都填进去

生成DLL文件后,进行自动签名。数字签名是为了让其他电脑的正版UG可以正常调用,否则可能会出错。(signcpp.exe位于GUOPEN文件夹内)

四、程序测试

加入相关头文件,其中uf.h是入口函数 ufusr 和卸载函数 ufusr_ask_unload 需要用到的,uf_ui.h是uc1601()需要用到的,NXSigningResource.cpp是生成DLL后进行签名需要用到的文件,代码如下截图。

编译生成DLL后,打开UG,按CTRL+U打开执行函数对话框,选择生成的DLL文件,点击OK按钮

成功生成如下消息框

右击项目,选择添加QT类,进入界面后选择Qt Widgets Class

然后在项目下生成了三个文件

双击QtDlg.ui进行编辑,添加按钮和其他控件等,保存后退出,如下图

QtDlg.h代码:

#pragma once#include <QtWidgets/QWidget>
#include "ui_QtDlg.h"
#include <uf.h>
#include <uf_ui.h>
#include <uf_modl.h>
#include <uf_styler.h>class QtDlg : public QWidget
{Q_OBJECTpublic:QtDlg(QWidget *parent = Q_NULLPTR);~QtDlg();tag_t CreateLuomao(double);void selectData();
private:Ui::QtDlg ui;public slots:void on_pushButton_clicked();void m_CreateBlock();void m_CreateCylinder();
};#define UF_CALL(X) (report( __FILE__, __LINE__, #X, (X)))
static int report(char* file, int line, char* call, int irc)
{if (irc){char err[133], msg[133];sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ", irc, line, file);UF_get_fail_message(irc, err);UF_print_syslog(msg, FALSE);UF_print_syslog(err, FALSE);UF_print_syslog("\n", FALSE);UF_print_syslog(call, FALSE);UF_print_syslog(";\n", FALSE);if (!UF_UI_open_listing_window()){UF_UI_write_listing_window(msg);UF_UI_write_listing_window(err);UF_UI_write_listing_window("\n");UF_UI_write_listing_window(call);UF_UI_write_listing_window(";\n");}}return(irc);
}struct LuomaoData
{//对边距离double S;//对角距离double E;//单边长double L;//锥体顶部直径char* D1;//厚度char* K;//锥体底部直径char* D2;
};

QtDlg.cpp代码:

#include "QtDlg.h"
#include <uf_part.h>
#include <uf_vec.h>#if _MSC_VER >=1600    // MSVC2015>1899,对于MSVC2010以上版本都可以使用
#pragma execution_character_set("utf-8")  //设置编码格式为utf-8,可能会出现乱码
#endifLuomaoData luomao_data;QtDlg::QtDlg(QWidget *parent): QWidget(parent)
{ui.setupUi(this);QObject::connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(on_pushButton_clicked()));//QObject::connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(m_CreateBlock()));QObject::connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(m_CreateCylinder()));setWindowFlags(windowFlags() & ~Qt::WindowMinMaxButtonsHint);
}QtDlg::~QtDlg()
{
}void QtDlg::on_pushButton_clicked()
{ui.label->setText("UG二次开发测试!");
}void QtDlg::m_CreateBlock()
{UF_FEATURE_SIGN Sign = UF_NULLSIGN;//设置布尔double Corner_pt[3] = { 0.0, 0.0, 0.0 };//设置原点char* Edge_Len[3] = { "100", "100", "100" };//设置长宽高tag_t BlkTag = NULL_TAG;UF_MODL_create_block1(Sign, Corner_pt, Edge_Len, &BlkTag);//QMessageBox::information(NULL, "提示:", "创建成功!");
}void QtDlg::m_CreateCylinder()
{char charD[256], charH[256];QString len = ui.lineEdit->text();QString D = ui.comboBox->currentText();double point[3] = { 0,0,0 }, centroid[3] = { 0,0,0 }, distance = 0;sprintf(charD, "%4s", D.toLatin1().data());sprintf(charH, "%4s", len.toLatin1().data());UF_FEATURE_SIGN sign = UF_NULLSIGN;//布尔方式 : 布尔 无//UF_NULLSIGN    //布尔 无//UF_POSITIVE    //布尔 求和//UF_NEGATIVE    //布尔 求差//UF_UNSIGNED    //布尔 求交double dPoint1[3] = { 0,0,0 };    //圆柱底面圆心double dVector[3] = { 0,0,1 };   //圆柱方向tag_t  body1 = NULL_TAG, body2 = NULL_TAG;  //圆柱特征标签UF_MODL_create_cylinder(sign, NULL_TAG, dPoint1, charH, charD, dVector, &body1);  //创建圆柱UF_MODL_ask_feat_body(body1, &body1);   //查找特整体if (body1 != NULL_TAG){//UF_MODL_ask_feat_body(body1, &body1);   //查找特整体//UF_MODL_ask_feat_body(cyl_tag, &cyl_tag);//倒角uf_list_p_t edges;tag_t edge_id[2], feature_obj_id = NULL_TAG;UF_MODL_ask_body_edges(body1, &edges);UF_MODL_ask_list_item(edges, 0, &edge_id[0]);UF_MODL_ask_list_item(edges, 1, &edge_id[1]);UF_MODL_create_list(&edges);UF_CURVE_ask_centroid(edge_id[0], centroid);UF_VEC3_distance(centroid, point, &distance);if (distance > 0.01){UF_MODL_put_list_item(edges, edge_id[1]);}UF_CURVE_ask_centroid(edge_id[1], centroid);UF_VEC3_distance(centroid, point, &distance);if (distance > 0.01){UF_MODL_put_list_item(edges, edge_id[0]);}UF_MODL_create_chamfer(1, "1", "1", "45", edges, &feature_obj_id);}body2 = CreateLuomao(len.toDouble());if (body1 != NULL_TAG && body2 != NULL_TAG){UF_MODL_operations(body1, body2, UF_POSITIVE); //布尔合并}
}//由正六边形拉伸体和圆锥体进行布尔交运算得到。在坐标中定义正六边形六个点的坐标,然后按次序连接成线,合为一体后进行拉伸,然后与圆锥体求布尔交得到。
tag_t QtDlg::CreateLuomao(double H)
{//略..............................
}void QtDlg::selectData()
{//略..............................
}

UgModelTest.cpp文件修改为以下截图中代码

显示窗口的代码是以下这几行, w.show() 放在ufusr函数内执行。

int argc = 0;
QApplication a(argc, 0);
QtDlg w;w.show();

编译运行生成DLL,UG调用结果如下:

五、未完待续。。。。在下一篇幅讲述由QT编译生成的DLL在其他电脑上如何被UG正常调用。

基于VS + Qt编程的UG/NX二次开发相关推荐

  1. UG NX二次开发(C#)-CAM-加工模板、程序、方法、刀具和几何体的读取

    1.前言 在UG NX的CAM模块中,加工程序是根据UG NX设置的加工模板来编程的,本人是针对CAM模块的UG NX二次开发,获取加工模板.程序名称.加工方法.刀具和几何体的字符串. 2.进入加工模 ...

  2. UG NX二次开发(C#)-装配-删除阵列矩阵

    前言 在外部模式对装配体进行替换或者删除时,有时遇到部分组件不能替换或者删除,其中一个原因是阵列主组件,是不允许更改的.下面介绍下采用UG NX二次开发的方法删除阵列主组件. 错误介绍 在一个装配体模 ...

  3. UG NX二次开发(C#)-装配-添加组件AddComponent

    在UG NX的使用过程中,装配是很重要的一环,本文是为了实现组件的批量装配,采用UG NX二次开发,采用的主要函数为AddComponent. AddComponent()的帮助说明如下: 其是属于N ...

  4. UG\NX二次开发 获取曲线上某个位置的点坐标、切线矢量、主法线矢量、副法线矢量 UF_MODL_ask_curve_props

    文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: UG\NX二次开发 获取曲线上某个位置的点坐标.切线矢量.主法线矢量.副法线矢量 U ...

  5. UG/NX二次开发Siemens官方NXOPEN实例解析—1.6 BlockStyler/SelectionExample

    列文章目录 UG/NX二次开发Siemens官方NXOPEN实例解析-1.1 BlockStyler/ColoredBlock UG/NX二次开发Siemens官方NXOPEN实例解析-1.2 Blo ...

  6. UG\NX二次开发 获取相切面的三种方法

    文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: UG\NX二次开发 获取相切面的三种方法 方法1: 使用NX Open C++ 的面 ...

  7. UG/NX二次开发 选择坐标系控件 uc1630

    文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: UG/NX二次开发 uc1630 选择坐标系控件.第二个参数可以按照下图使用: 效果 ...

  8. UG\NX二次开发 获取当前工作部件 UF_ASSEM_ask_work_part

    文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: UG\NX二次开发 获取当前工作部件 UF_ASSEM_ask_work_part ...

  9. UG/NX二次开发 选择坐标系控件 UF_UI_specify_csys

    文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: UG/NX二次开发 选择坐标系控件 UF_UI_specify_csys 与 老函数 ...

  10. UG/NX 二次开发(C#)自动出2D零件图(标准件配置Bata版)

    一.前言 昨天分享了自动出2D零件图的思路(UG/NX 二次开发(C#)自动出2D零件图思路),今天整理了Q群里各位大佬的意见,结合当前实际项目情况,做了一个可配置的半自动出图版本,暂且称之为标准件配 ...

最新文章

  1. 不就是发个短信吗?这你都会?
  2. DEDECMS中Showmsg的用法及参数介绍
  3. win10切第二屏幕_Win10特有的31个快捷键,装逼利器,赶快收藏吧!学习电脑知识...
  4. python预测新航线的票价_浙江长龙航空有限公司四条新航线(线路+票价)
  5. android切图倍数,【Flutter工具】fmaker:自动生成倍率切图/自动更换App图标
  6. redhat7图形界面网卡设置_Redhat Linux Interprise基本网络配置与调试
  7. CF1083(Round #526 Div. 1) 简要题解
  8. Javascript使用模板字符串,find,findIndex,some,every查找数据以及map,filter过滤数据,reduce求和或平均值
  9. C语言实现钢琴块小游戏(低仿拉胯版)
  10. geogebra画一段椭圆
  11. 当你已经25:男生女生都该看
  12. 出现 Uncaught (in promise) NavigationDuplicated: Avoided redundant navigation 问题
  13. OpenCV:字符分割——方向投影法
  14. 面试题:数组和链表的区别
  15. 【入门案例系列】学英语太难?这款英语单词小游戏教你一键学会。
  16. html表单元素占位符是,HTML各种表单元素模板及写法
  17. outlook反复出现验证
  18. 利用相对性原理推导Lorentz变换
  19. Windows系统下,tracert路由跟踪指令详解
  20. loadrunner server压力测试 sql_LoadRunner进行负载压力测试

热门文章

  1. 虚拟机VMware安装windows7 64位操作系统(图文版详解版)
  2. 1688api 图片搜索功能 item_search_img-按图搜索1688商品(拍立淘)
  3. 厉害了!小学生用大数据研究苏轼,结论出人意料
  4. 微信小程序 转发 自定义全局配置
  5. python将图片转换成手绘_利用Python生成手绘效果的图片
  6. 商业方向的大数据专业_大数据行业5个职位方向
  7. 大数据职业理解_大数据职业规划总结
  8. 从勒索病毒加密的SQLServer数据库中恢复数据
  9. 您的计算机无法访问dota2服务器,提示“已连接至DOTA2游戏协调服务器,正在登陆中”该如何解决?...
  10. dota2显示连接不上服务器没有响应,Win10登录不上dota2提示“无法与任何服务器建立连接”怎么办?...