UG/Open API基础知识-语法1

数据类型

UG/Open API编程接口是C语言的语法格式,因而,它支持C语言的标准数据类型,除此之外,UG/Open API大量使用了 类型定义,如struct(声明结构体变量)、enum(枚举类型)、union(联合数据类型)等 UG/Open API数据结构的命名规则是:_t——数据类型;_s——结构体类型;_u_t——共用体类型;_t_p——数据类型指针;_u_p_t——共用体类型指针。
如:

union UF_STYLER_value_u
{
	char *string;
	char **strings;
	int integer;
	int *integers;
	double real;
	double *reals;
	UF_UI_selection_p_t selection;
	UF_STYLER_notification_p_t notify;
	UF_UI_attachment_t attach;
	UF_UI_option_toggle_t option_toggle;
};
typedef union UF_STYLER_value_u UF_STYLER_value_t;

上面的数据类型UF_STYLER_value_u是定义的共用体数据类型,通过typedef union关键字把UF_STYLER_value_u数据类型定义成UF_STYLER_value_t别名,即通过UF_STYLER_value_uUF_STYLER_value_t定义的数据类型都表示同一种类型。
UF_STYLER_value_t数据类型主要用在UF_STYLER_item_value_type_s数据类型中,作为它的成员,UF_STYLER_item_value_type_s表示定义的是结构体类型的数据,定义如下:

struct UF_STYLER_item_value_type_s
{
	int reason;
	const char *item_id;
	int subitem_index;
	int count;
	int item_atttr;
	int indicator;
	UF_STYLER_value_t value;
};

此外,在UG/Open API中,用来识别对象的数据类型是tag_t,是对象语柄,实际上,tag_t是无符号整数数据类型,在uf_defs.h中定义如下:

typedef unsigned int tag_t,*tag_p_t; 

大多数情况下,数据类型都在相应的头文件中有说明,因此,对于在程序中使用到的数据类型,也应在程序开头将相应的头文件用#include包含进来。下面是获取当前显示模型句柄tag_t,并将其关闭的代码:

tag_t tModel;
tModel = UF_PART_ask_display_part ();
UF_PART_CLOSE( tModel , 1 , 1 );

struct-声明结构体变量

首先介绍一下什么是定义?什么是声明?它们有何区别?
什么是定义:所谓的定义就是(编译器)创建一个对象,为这个对象分配一块内存并给它取上一个名字(即我们经常说的变量名或对象名)。但注意,这个名字一旦和这块内存匹配,它们就同生共死。一个变量或对象在一定区域(比如函数内,全局等)只能被定义一次,否则编译器会提醒你重复定义同一个变量或对象。
什么是声明:有两重含义,如下:
第一重含义:告诉编译器,这个名字已经匹配到一块内存上了,下面的代码用到的变量或对象是在别的地方定义的。声明可以出现多次。
第二重含义:告诉编译器,这个名字我先预定了,别的地方再也不能用它来作为变量名或对象名。比如你在图书馆用书占了个位子,但你本人并没坐在这儿。这种声明最典型的例子就是函数参数的声明,例如

void fun (int i , char c);

定义声明最重要的区别:定义创建了对象并为这个对象分配了内存,声明没有分配内存。
struct是个神奇的关键字,它将一些相关联的数据打包成一个整体,方便使用。
平时我们要求函数的参数尽量不超过4个,如果函数的参数多于4个使用起来非常容易出错(包括每个参数的意义和顺序都容易弄错),效率也会降低(与具体CPU有关,ARM芯片对于超过4个参数的处理就很讲究,具体请参考相关资料)。这个时候,可以用结构体压缩参数个数。
在C++中struct和class关键字一般可以通用,只有一个很小的区别。struct的成员默认情况下属性是public的,而class成员却是private的。

union-声明联合数据类型

union关键字的用法与struct的用法非常类似。
union维护足够的空间来置放多个数据成员中的“一种”,而不是为每一个数据成员配置空间,在union中所有的数据成员共有一个空间,同一时间只能储存其中一个数据成员,所有的数据成员具有相同的起始地址。如:

union StateMachine
{
	char character;
	int number;
	char *str;
	double exp;
};

一个union只配置一个足够大的空间来容纳最大长度的数据成员,如上例,最大长度是double型态,所以StateMachine的空间大小就是double数据类型的大小。
在C++中,union的成员默认属性为public。union主要用来压缩空间。如果一些数据不可能在同一时间同时被用到,则可以使用union。
例子:用程序确认当前系统存储是大端模式还是小端模式,请写一个C函数,若处理器是Big_endian,则返回0;若是Little_endian,则返回1。
注:大端模式(Big_endian):字数据的高字节存储在低地址,而字数据的低字节则存放在高地址中。
小端模式(Little_endian):字数据的高字节存储在高地址,而字数据的低字节则存放在低地址中。

对union型的成员的存取都是对该联合体基地址的偏移量为0处开始,也就是联合体的访问不论对哪个变量的存取都是从union的首地址开始。

int checkSystem()  //检查系统存储方式为大端模式还是小端模式
{
	union check
	{
		int i;
		char ch;
	}c;  		//联合体c在内存中占4字节
	c.i = 1;    //变量i占4字节,但只有一个字节值为1,另外三个字节为0
	return (c.ch == 1);
}

enum-声明枚举类型

定义方法:

enum enum_type_name
{
	ENUM_CONST_1,
	ENUM_CONST_2,
	...
	ENUM_CONST_n
}enum_variable_name;

注意:enum_type_name是自定义的一种数据类型名,即enum_type_name类型是对一个变量取值范围的限定,而花括号内是它的取值范围,即enum_type_name类型的变量enum_variable_name只能取值为花括号内的任何一个值,如果赋给该变量的值不在列表中,会报错。ENUM_CONST_1、ENUM_CONST_2、…、ENUM_CONST_n,这些成员就是我们平时所说的枚举常量(常量一般大写)。**enum变量类型还可以给其中的常量符号赋值,如果不赋值则会从被赋初值的那个常量开始依次加1,如果都没有赋值,他们的值从0开始依次递增1.如分别用一个常数表示不同颜色:

enum color
{
	GREEN = 1,
	RED,
	BLUE,
	GREEN_RED = 10,
	GREEN_BLUE
}ColorVal;

其中各常量名代表的数值分别为:

GREEN = 1
RED = 2
BLUE = 3
GREEN_RED = 10
GREEN_BLUE = 11

枚举与#define宏的区别

  1. #define宏常量是在预编译阶段进行替换。枚举常量则是在编译的时候确定其值。
  2. 一般在编译器里,可以调试枚举常量,但不能调试宏常量。
  3. 枚举可以一次定义大量相关常量,而#define宏一次只能定义一个。

typedef-用于给数据类型取别名(当然还有其他作用)

typedef是给一个已经存在的数据类型(注意:是类型不是变量)取一个别名,而非定义一个新的数据类型。
在实际项目中,为了方便,可能很多数据类型(尤其是结构体之类的自定义数据类型)需要我们重新取一个适用实际情况的别名。这时候typedef就可以帮助我们。如:

typedef struct student
{
	//code
}Stu_st,*Stu_pst;
//struct student stu1;和Stu_st stu1;没有区别
//struct student *stu2;和Stu_pst stu2;和Stu_st *stu2;没有区别
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是使用 C++ 语言结合 UG/Open API 实现上述步骤的示例代码: ```cpp #include <uf_defs.h> #include <uf_part.h> #include <uf_ui.h> #include <string> using namespace std; int main(int argc, char* argv[]) { tag_t part_tag; char* part_name = "sample_part.prt"; double origin[3] = {0.0, 0.0, 0.0}; char* layer_name = "MyLayer"; tag_t layer_tag; UF_PART_load_status_t load_status; char* feature_name = "MyFeature"; tag_t feature_tag; int num_faces; tag_t* face_tags; char* material_name = "MyMaterial"; tag_t material_tag; // Initialize UG/Open API if (UF_initialize() != 0) { return 1; } // Create a new part UF_PART_new(part_name, UF_PART_ENGLISH, &part_tag); // Set the origin UF_PART_set_origin(part_tag, origin); // Create a new layer UF_LAYER_create(layer_name, &layer_tag); // Set the active layer UF_LAYER_set_active(layer_tag); // Load the part UF_PART_open(part_name, &part_tag, &load_status); // Create a new feature UF_MODL_create_feature(UF_NULLSIGN, feature_name, &feature_tag); // Get the faces of the part UF_MODL_ask_body_faces(part_tag, &num_faces, &face_tags); // Set the faces to the feature UF_MODL_edit_feature(feature_tag, UF_MODL_FEATURE_BODY, &num_faces, face_tags); // Create a new material UF_MATERIAL_create(material_name, &material_tag); // Set the material to the feature UF_MODL_set_material(feature_tag, material_tag); // Save the part UF_PART_save(); // Exit UG/Open API UF_terminate(); return 0; } ``` 这个示例代码演示了如何使用 UG/Open API 创建一个新零件,设置原点,创建一个新图层,并将其设置为活动图层,加载零件,创建一个新特征(基于零件面),设置一个新材料,并保存零件。这只是一个简单的示例,UG/Open API 可以实现更多功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值