02_业务逻辑从dll开始

这篇具有很好参考价值的文章主要介绍了02_业务逻辑从dll开始。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

业务逻辑从dll开始

C++环境配置

如何将UFUN库整合到C++工程上来呢? 这里让我们从创建一个二次开发的C++编程环境开始吧!

首先西门子在C:\Program Files\Siemens\NX 8.5\UGOPEN\vs_files 就提供了一些C++工程创建模板,我们将其复制到 Visual Studio的主目录下C:\Program Files (x86)\Microsoft Visual Studio 10.0 打开我们的Visual Studio IDEA,新建项目就有这个创建模板了。就像我之前入门C++ 创建Win32控制台应用程序一样简单。

02_业务逻辑从dll开始

入口函数和出口函数

项目创建好了之后,主程序入门mian.cpp默认会默认提供一个出口函数卸载函数 当在UG中执行了此DLL时,会从此入口函数ufsta开始执行。

/*****************************************************************************
**  Activation Methods
*****************************************************************************/
/*  Unigraphics Startup
**      This entry point activates the application at Unigraphics startup */
extern DllExport void ufsta(char* param, int* returnCode, int rlen)
{

	//获取NX二次开发许可 ,如果不能获取到 就终止此程序运行 获取成功返回0 失败则返回错误号
	/* Initialize the API environment */
	if (UF_CALL(UF_initialize()))
	{
		/* Failed to initialize */
		return;
	}

	/* TODO: Add your application code here */

	uc1601("HelloWorld End", 1);


	//释放NX二次开发许可
	/* Terminate the API environment */
	UF_CALL(UF_terminate());
}

当入口函数执行完毕之后,NG系统会自动调用卸载函数ufusr_ask_unload ,来完成一些卸载工作。并最终向NG返回一个整形数值。

/* Unload Handler
**     This function specifies when to unload your application from Unigraphics.
**     If your application registers a callback (from a MenuScript item or a
**     User Defined Object for example), this function MUST return
**     "UF_UNLOAD_UG_TERMINATE". */
extern int ufusr_ask_unload(void)
{
	return(UF_UNLOAD_UG_TERMINATE);
}

该整形数值会给NG带来不同的反馈。

#define  UF_UNLOAD_IMMEDIATELY         1 // UF程序运行之后,立即从内存中卸除,即当重新修改、编译成新的DLL文件时,UG不需要关闭重启动就可以调用此新的*.DLL文件
#define  UF_UNLOAD_SEL_DIALOG          2 // 通过一个卸载选择对话框来进行 来进行卸除操作。
#define  UF_UNLOAD_UG_TERMINATE        3 // 返回此数值,则设置不从内存中卸除,即一直到打开此动态链接库的UG会话结束时才卸除。

运行和调试DLL

运行:

在VS中,我们可以通过点选菜单条(生成>生成解决方案)来得到编辑链接好的动态链接库dll文件这里假定为NX8 Open Wizard1.dll,打开UG,点选菜单条(文件>执行>NXOpen(ctrl+u)),则NG会弹出执行用户函数窗口,找到NX8 Open Wizard1.dll 点击OK按钮。就完成了动态链接库在NG的运行。

调试:

在VS中,先对需要断点的地方设置断点,然后点选菜单条(调试>附加到进程),则VS系统弹出附加到进程 窗口,在可用进程项中,找到ugraf.exe进程并选中后,点击附加按钮。再运行,嘿嘿成功进入断点。
02_业务逻辑从dll开始

函数与数据结构

函数和模块化

在UF中,存在两种不同的UF函数命名方式,即标准命名法固定命名法

  • (1)标准命名法

从UFUN帮助手册,不难发现规律。UF_MODL Files 管理 .h文件 .h 管理函数Function ,即 UF_MODL Files>.h>Function

所以最小的层级的函数开头的大写部分表示此函数所在 UG/Open API的库名称,所以此函数需要include 声明头文件,简单举例如下,这既是C模块化编程的体现.

 头文件     	函数名
uf_part.h  	UF_PART_new
uf_curve.h 	UF_CURVE_create_point
uf_modl_primitives.h UF_MODL_create_block1
  • (2)固定命名法

额,可以说是早期版本的命名方式,比如uc1601() uf5943 这种就没啥子规律而言了,虽然在后期的版本有部分保留,但随着UG的版本升级,将逐渐放弃对这些函数的支持。所以建议在使用UG的函数的时候尽量避免使用他们,以保证开发程序有延续性。

UF是完全用C语言来实现的,其中运用到了C的结构,指针和预定义常数等,因此在UF中拥有大量特定的数据结构。一般从后缀上已经对他们的类型进行了明确的标识

类型名称下缀 含义
_t 原始数据结构类型
_p_t 指向该结构体的指针类型
_s 结构类型
_u_t 联合类型
_u_p_t 指向联合的指针
_f_t 指向函数的指针

绝大部分UF函数的返回值都是整型值,其返回值表示函数执行成功与否的状态。

若返回值为0时则表示函数执行成功;

若返回值不为0则表示函数执行失败,非零的返回值就是错误号。读者在使用UF进行编程时应注意检查每一个 UF调用的返回值,若非零则应进行相应的处理,以提高代码的可靠性。

数据结构

tag_t

typedef unsigned int tag_t; // 实际上就是无符号整型起了一个别名 tag_t
typedef tag_t *tag_p_t; // tag_t的指针 也起了一个别名叫 tag_p_t

UFUN中用的最多的数据类型,他是NX对象的唯一标识ID,他是一个无符号的整型数值。他可以是部件(part),特征(feat),草图,曲线,属性,表达式等。用来作为UG实体(entity)的ID来控制实体。

现在我们试着来创建一个工作部件并保存,以弹出框的方式输出此部件的ID,再进入到NX调试模式,查看两次tag_t 类型的ID.来验证任何NX对象在创建之后,只有一个唯一ID

#include<uf_part.h>
#include<stdio.h>

void MyClass::do_it()
{

	// TODO: add your code here
	UF_initialize();

 uc1601("输出消息啦!*wangnaixing",1);


 const char* part_name = "C:\\wnx.prt";
 int units = 1;
 tag_t id =  NULL_TAG;
 UF_PART_new(part_name, units, &id);


 char msg[256];
 sprintf(msg,"当前创建的部件的tagID为%d",id);
 uc1601(msg,1);
 UF_PART_save();

    UF_terminate();
    
}

uf_list_p_t

我们知道一个实体、特征、面、边被创建后,都会有一个唯一的tag_t的ID,来标识这个对象。那么如何把这些对象进行一个统一的管理呢?UFUN提供了链表容器。帮助我们进行管理。uf_list_p_t 表示一个UG实体链,是一个结构。有两个成员组成,eid 表示链中的一个实体,*next 表示指向下一项的指针,具体定义如下:

头文件:uf_modl_utilities.h

struct uf_list_s {
        tag_t                  eid ;  /* Object ID */
        struct uf_list_s      *next;  /* Pointer to the next OID in the list */
};
typedef struct uf_list_s *uf_list_p_t;

// 所以uf_list_s结构指针 等价于 uf_list_s
函数 功能描述
UF_MODL_create_list 创建链表。
UF_MODL_delete_list 删除链表所占空间
UF_MODL_ask_list_count 查询链表数量NX对象元素
UF_MODL_put_list_item 往链表里面加入NX对象
UF_MODL_delete_list_item 删除链表存储的某一个NX对象
int UF_MODL_create_list(uf_list_p_t * list ) //创建链表需要 uf_list_结构体指针的指针

int UF_MODL_ask_list_count(uf_list_p_t list, int * count)//查询链表元素个数需要  uf_list_结构体指针

    
int UF_MODL_put_list_item(uf_list_p_t list, tag_t obj_id) // 往链表里面添加元素 需要 uf_list_结构体指针 和对象ID

int UF_MODL_delete_list(uf_list_p_t * list) //删除链表 需要  uf_list_结构体指针的指针
    
int UF_MODL_delete_list_item(uf_list_p_t * list, tag_t object )//根据ID删除链表中的元素  uf_list_结构体指针的指针 和 NX对象ID

  • 创建链表,并给链表添加元素,用完销毁元素。
    uf_list_s* list;
    UF_MODL_create_list(&list);
    for (size_t i = 0; i < 3; i++)
    {
        UF_MODL_put_list_item(list, line1TAG[i]);

    }
    UF_MODL_delete_list(&list);
  • 遍历链表元素
void for_each(uf_list_s* L) {	//while 循环
	while (L)
	{
		char msg[256];
		sprintf(msg, "链表元素:%d", L->eid);
		uc1601(msg, 1);
		L = L->next;
	}
	cout << endl;
}
void for_each(uf_list_s* L) {	// do-while
	do {
		char msg[256];
		sprintf(msg, "链表元素:%d", L->eid);
		uc1601(msg, 1);
	} while (L = L->next);

	cout << endl;
}
  • 查询链表元素数量
  UF_MODL_ask_list_count(list, &count);
    show_list_count(count);
void show_list_count(int count) {
    char msg[256];
    sprintf(msg, "链表对象的数量为:%d", count);
    uc1601(msg, 1);
 }

string_list

string_list 是UFUN定义的一个数据结构,在创建有界平面的时候,有所运用。

struct string_list
{
    
    int        num;      /* Number of items in the string array and the
                            dir array. (Min = 1, Max = 150)*/
    
    int        *string;  /* <len:num> Number of items in the ID array for each string.
                            (Min = 1, Max = 402) */
    
    int        *dir;     /* <len:num> Indication of whether the string defined in id
                            should start from the beginning of the first curve
                            or the end of the first curve.  This should be set
                            to either UF_MODL_CURVE_START_FROM_BEGIN or
                            UF_MODL_CURVE_START_FROM_END. */
    
    tag_t      *id;      /* <len:num> The array of items defining the string.  This array
                            should be as long as the total of the number of
                            items indicated in string.  Although not all
                            functions allow all the data types, this array can
                            typically include curves, faces and edges. */
}
typedef struct string_list UF_STRING_t, *UF_STRING_p_t;
函数 用途
UF_MODL_init_string_list 初始化
UF_MODL_create_string_list 创建
UF_MODL_free_string_list 释放空间
void UF_MODL_init_string_list(UF_STRING_p_t string_list1 );//创建string_list 需要 string_list结构的指针



void UF_MODL_create_string_list(
    int num_string, //字符串数量
	int num_object,  //对象数量
	UF_STRING_p_t string_list1 //经过初始化的string_list 最后一定要 UF_MODL_free_string_list
);


void UF_MODL_free_string_list(UF_STRING_p_t string_list); //释放内存 同初始化

内存分配与释放

针对C语言动态开辟内存空间的函数进行了封装,一般我们是用这些API来在堆区动态开辟内存空间,释放内存空间。

void * UF_allocate_memory
(

unsigned int nbytes, //分配字节数
int * error_code //0成功

)

比如给一个double 类型的指针分配1600 字节的空间。文章来源地址https://www.toymoban.com/news/detail-508306.html

 double* pts = (double*)UF_allocate_memory(sizeof(double)*200, &errorCode);
void * UF_reallocate_memory
(

void * data, 
unsigned int nbytes, 
int * error_code 

)
void UF_free_string_array
(

int n_strings, 
char * * string_array 

)
void UF_free
(

void * data 

)
void UF_free_string_array
(

int n_strings, 
char * * string_array 

)
void * UF_reallocate_memory
(

void * data, 
unsigned int nbytes, 
int * error_code 

)
void UF_free_string_array
(

int n_strings, 
char * * string_array 

)
void UF_free
(

void * data 

)
void UF_free_string_array
(

int n_strings, 
char * * string_array 

)

到了这里,关于02_业务逻辑从dll开始的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java从0到1学习】02 Java 开发环境配置

    在本章节中我们将为大家介绍如何搭建Java开发环境。以及如何配置Java的开发环境。具体详情让我们一起来看看吧~ 首先我们需要下载 java 开发工具包 JDK,下载自己的系统选择对应的版本,本文以 Window 64位系统为例: 1、方式一:进入官网https://www.oracle.com/java/technologies/javas

    2024年02月16日
    浏览(36)
  • 【web实战-业务逻辑】评论点赞逻辑

        博主:网络安全领域狂热爱好者(承诺在CSDN永久无偿分享文章)。 殊荣:CSDN网络安全领域优质创作者,2022年双十一业务安全保卫战-某厂第一名,某厂特邀数字业务安全研究员,edusrc高白帽,vulfocus、攻防世界等平台排名100+、高校漏洞证书、cnvd原创漏洞证书等。 擅长

    2024年02月05日
    浏览(40)
  • 【业务安全-03】业务逻辑漏洞之暴力破解(Burte Force)

    暴力破解是一种针对于密码或身份认证的破译方法,即穷举尝试各种可能,找到突破身份认证的一种攻击方法。 暴力破解是一把双刃剑,一方面能够被恶意者使用,另一方面在计算机安全性方面却非常重要,它用于检查系统、网络或应用程序中使用的弱密码。 “暴力破解”

    2023年04月08日
    浏览(58)
  • cmseasy业务逻辑漏洞

    这个cmseasy靶场似乎感觉有点意思?       首先肯定先是注册一个账号(账号test,密码admin),去找到他的找回密码这里 随便 填点数字 (这个用户名与他的邮箱还是要对应的),然后抓包,把这个原来的step字段由1改成3,这样就饶过了邮箱验证码的验证 就会发现能成功修改

    2024年01月19日
    浏览(39)
  • 逻辑漏洞之业务安全

    业务授权安全 业务流程乱序 业务接口调用 业务一致性安全 业务数据篡改 时效绕过测试 业务授权安全 最小权限原则 : 确保用户和系统只有在其职责范围内才能访问和执行操作。 强身份验证 : 要求用户进行有效的身份验证,例如多因素身份验证,以确保只有授权用 户才能

    2024年04月27日
    浏览(41)
  • 外汇网站主要业务逻辑梳理

    上图为工行ICBC的外汇 保证金交易界面。 当需要买入帐户欧元(欧元人民币)时,买入100欧元,因为没有杠杆,虽然欧元中间价是782.34,但实际需要支付783.14元人民币的保证金,这个兑换不是真实的外汇兑换。银行只是将这些保证金扣除了,给您了一个100欧元的合约,这个合

    2024年02月02日
    浏览(37)
  • 业务逻辑漏洞—验证码绕过

    验证码绕过第一关: 前端验证码绕过: 打开pikachu靶场: 输入错误的验证码时会出现弹窗(alert)此时我们猜测这可能存在着前端限制 如果验证码有前端限制(只在前端有作用),不影响后端的操作 猜测验证码是前端还是后端: 进行断网测试:如果断开网络验证码没有则就是

    2024年01月23日
    浏览(47)
  • 如何从零开始配置前端环境以及安装必备的软件插件

    在当今快速发展的互联网时代,前端开发已经成为一项备受关注和需求不断增长的技术工作。作为一名前端工程师,拥有一台配置良好的电脑是提高工作效率和顺利进行项目开发的关键。在本文中,我们将向大家介绍如何 从零开始配置一台新的电脑 ,以便能够顺利地搭建和

    2024年02月14日
    浏览(56)
  • 从零开始配置pwn环境:sublime配置并解决pwn脚本报错问题

    Download - Sublime Text 用vscode鼠标右键调出命令平台  输入 convert indentation to Tabs,保存文件  完美解决,具体如下:

    2024年01月22日
    浏览(46)
  • 从零开始配置深度学习环境:CUDA+Anaconda+Pytorch+TensorFlow

    本文适用于电脑有GPU(显卡)的同学,没有的话直接安装cpu版是简单的。CUDA是系统调用GPU所必须的,所以教程从安装CUDA开始。 可以配合视频教程食用:https://www.bilibili.com/video/BV12m4y1m7pq/?vd_source=06e4e8652ea90d79dadb7a59ff8acd36 CUDA是加速深度学习计算的工具,诞生于NVIDIA公司,是一

    2023年04月14日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包