目录
一、概述
二、函数的介绍
2.1 UF_LAYER_ask_category_info (查询图层类别信息)
2.2 UF_LAYER_ask_category_tag(查询图层类别TAG)
2.3 UF_LAYER_ask_status(查询图层的状态)
2.4 UF_LAYER_ask_work_layer(查询工作图层)
2.5 UF_LAYER_set_status (设置图层状态)
2.6 UF_LAYER_set_all_but_work(设置除了工作图层的状态)
2.7 UF_LAYER_set_many_layers_status(设置多个图层的状态)
2.8 UF_LAYER_create_category(创建图层类别)
2.9 UF_LAYER_edit_category_descr(编辑图层类别里的描述)
2.10 UF_LAYER_edit_category_name(编辑图层类别里的名字)
2.11 UF_LAYER_edit_category_layer(编辑图层类别里的具体成员)
2.12 UF_LAYER_cycle_by_layer(遍历图层)
三、源码文件
一、概述
NX二次开发UF帮助文档中关于图层操作主要以下几个方面
(1) 查找工作层;
 (2)查询图层的分类、名字、描述及分类成员;
 (3)查取图层状态;
 (4)创建或编辑图层类别、名字、描述及分类成员;
 (5)设置图层状态;
 (6) 遍历图层。
注意:总是使用NX函数来确定给定名称的类别是否存在。不建议使用字符串比较来验证类别是否存在。以下是检查类别是否存在的一般准则。
(1)UF_LAYER_ask_category_tag根据层名称获得层组tag。下面是一个检查的函数示例是否已创建类别。
//根据层名称获得层组tag
static tag_t ask_category_tag(char name)
{
    tag_t object;
    UF_CALL(UF_LAYER_ask_category_tag(name, &object));
    return object;
} 
从上述函数返回的非空标记(NULL_TAG)表明存在该类别,否则类别不存在。所有其他类别相关的函数,如
UF_LAYER_ask_category_info(查询图层类别信息)
 UF_LAYER_ask_category_tag(查询图层类别TAG)
 UF_LAYER_ask_status(查询图层的状态)
 UF_LAYER_ask_work_layer(查询工作图层)
 UF_LAYER_create_category(创建图层类别)
 UF_LAYER_cycle_by_layer(遍历图层)
 UF_LAYER_edit_category_descr(编辑图层类别里的描述)
 UF_LAYER_edit_category_layer(编辑图层类别里的具体成员)
 UF_LAYER_edit_category_name(编辑图层类别里的名字)
 UF_LAYER_set_all_but_work(设置除了工作图层的状态)
 UF_LAYER_set_many_layers_status(设置多个图层的状态)
 UF_LAYER_set_status(设置某一个图层的状态)
可以利用所获得的标签。使用这种方法的优点是,这个函数返回与传递的名称相同的类别的标记。我们认为两个名字是相同的如果它们传递不区分大小写的比较。通过这种方式,即使使用大写,它的存在仍然可以使用混合大小写字符串查询。

二、函数的介绍
2.1 UF_LAYER_ask_category_info (查询图层类别信息)
(1)概述
读取类别名称、成员层和描述。
(2)用法说明

tag_t (tag_t类型)	        category	    Input(输入)	图层对象类别的TAG
UF_LAYER_category_info_p_t	category_info	Output(输出)	图层类别信息指针
//UF_LAYER_category_info_p_t
/*
name [MAX_ENTITY_NAME_SIZE+1]
char
这个类别的名称。
layer_mask [UF_LAYER_MAX_LAYER]
bool
包括哪些图层,总体来说就是就是true为存在否则不存在,也就是该类别下的图层。 
每一层的逻辑,是否属于这一类。layer_mask[0]如果层1属于类别,则为TRUE,否则为false。Layer_mask[1]适用于第2层,以此类推。
descr [UF_LAYER_CAT_DESC_LEN+1]
char
该层类别的描。*/	 
2.2 UF_LAYER_ask_category_tag(查询图层类别TAG)
(1)概述
通过类别名字查找该类别的TAG值。
(2)用法说明

char * (字符型指针)	    category_name	Input(输入)	类别名字
tag_t * (tag_t型的指针)	category	    Output(输出)	类别对象TAG。如果为null则类别名不存在 
实例:通过类别名称查询类别的名字、包含的图层、描述:
#include<uf_ui.h>
#include <uf_layer.h>
/*获取图层类别中的类别名字、包含的图层、类别描述*/
UF_initialize();
//获取一个图层类别的tag
tag_t categoryTAG = NULL_TAG;
UF_LAYER_ask_category_tag("00_FINAL_DATA", &categoryTAG);
//获得图层类别的信息
UF_LAYER_category_info_t info;
UF_LAYER_ask_category_info(categoryTAG, &info);
//数据转化
UF_UI_open_listing_window();
char msg[256];
for (int i = 0; i < 256; i++)
{
	if (info.layer_mask[i]==true)
	{
		sprintf(msg, "%d", i);
		UF_UI_write_listing_window(msg);
		UF_UI_write_listing_window("	");
	}
}
UF_UI_write_listing_window(info.name);
UF_UI_write_listing_window("\n");
UF_UI_write_listing_window(info.descr);
UF_terminate(); 

2.3 UF_LAYER_ask_status(查询图层的状态)
(1)概述
返回图层的状态。
(2)用法说明

const int	        layer_number	Input(输入)	图层数
int * (整数型指针)	layer_status	Output(输出)	图层的状态
UF_LAYER_WORK_LAYER        工作图层
UF_LAYER_ACTIVE_LAYER      活动图层  
UF_LAYER_REFERENCE_LAYER   引用图层 
UF_LAYER_INACTIVE_LAYER    不活动图层
#define UF_LAYER_WORK_LAYER           1
#define UF_LAYER_ACTIVE_LAYER         2
#define UF_LAYER_REFERENCE_LAYER      3
#define UF_LAYER_INACTIVE_LAYER       4    
 
实例:分别打印四类工作状态
    int layer_status, layer_status1, layer_status2, layer_status3;
	UF_LAYER_ask_status(1, &layer_status);
	UF_LAYER_ask_status(3, &layer_status1);
	UF_LAYER_ask_status(8, &layer_status2);
	UF_LAYER_ask_status(9, &layer_status3);
	UF_UI_open_listing_window();
	char msg[256], msg1[256], msg2[256], msg3[256];
	sprintf(msg, "%d", layer_status);
	sprintf(msg1, "%d", layer_status1);
	sprintf(msg2, "%d", layer_status2);
	sprintf(msg3, "%d", layer_status3);
	UF_UI_write_listing_window(msg);
	UF_UI_write_listing_window("\n");
	UF_UI_write_listing_window(msg1);
	UF_UI_write_listing_window("\n");
	UF_UI_write_listing_window(msg2);
	UF_UI_write_listing_window("\n");
	UF_UI_write_listing_window(msg3); 

2.4 UF_LAYER_ask_work_layer(查询工作图层)
(1)概述
返回工作图层。
(2)用法说明

int * (整数型指针)	layer_number	Output(输出)	Layer number 
2.5 UF_LAYER_set_status (设置图层状态)
(1)概述
设置图层状态为:工作层、活动层、参考层、或者说非活动层。当前工作层的状态不能被改变。你必须先设置另一层为工作层,然后更改状态前一个工作层。
(2)用法说明

const int	layer_number	Input(输入)	Layer number
const int	layer_status	Input(输入)	Layer status
UF_LAYER_WORK_LAYER
UF_LAYER_ACTIVE_LAYER
UF_LAYER_REFERENCE_LAYER
UF_LAYER_INACTIVE_LAYER 
2.6 UF_LAYER_set_all_but_work(设置除了工作图层的状态)
(1)概述
按指定设置除工作层外的所有层的状态。
(2)用法说明

const int	layer_status	Input(输入)	Layer status
UF_LAYER_WORK_LAYER
UF_LAYER_ACTIVE_LAYER
UF_LAYER_REFERENCE_LAYER
UF_LAYER_INACTIVE_LAYER
 
2.7 UF_LAYER_set_many_layers_status(设置多个图层的状态)
(1)概述
将指定层设置为相应的指定状态。工作层不是引用的或不活动的。只有一个层可以是工作层。如果出现任何错误,则不修改任何层的状态。
(2)用法说明

const int	                count_of_layers	Input(输入)	指定图层的数量
UF_LAYER_status_info_p_t	changes	        Input(输入)	一种结构数组,其中数组中的每个元素都是包含层号和状态的结构。
//UF_LAYER_status_info_p_t	
/*
layer_number
int
此状态所对应的层号。有效的层是UF_LAYER_MIN_LAYER到UF_LAYER_MAX_LAYER
layer_status
int
对应图层的状态
UF_LAYER_WORK_LAYER
UF_LAYER_ACTIVE_LAYER
UF_LAYER_REFERENCE_LAYER
UF_LAYER_INACTIVE_LAYER
*/ 
实例:设置图层4~11为活动图层
int count = 8;
UF_LAYER_status_info_t infox[256];
for (int i = 0; i < count; i++)
{
	infox[i].layer_number = 4 + i;
	infox[i].layer_status = UF_LAYER_ACTIVE_LAYER;
}
UF_LAYER_set_many_layers_status(8, infox); 

2.8 UF_LAYER_create_category(创建图层类别)
(1)概述
创建类别名称、成员层和描述。
(2)用法说明

UF_LAYER_category_info_p_t	    category_info	Input(输入)	类别消息结构体
tag_t * (tag_t型的指针)	        category	    Output(输出)	类别的TAG
//UF_LAYER_category_info_p_t
/*
name [MAX_ENTITY_NAME_SIZE+1]
char
这个类别的名称。
layer_mask [UF_LAYER_MAX_LAYER]
bool
包括哪些图层,总体来说就是就是true为存在否则不存在,也就是该类别下的图层。 
每一层的逻辑,是否属于这一类。layer_mask[0]如果层1属于类别,则为TRUE,否则为false。Layer_mask[1]适用于第2层,以此类推。
descr [UF_LAYER_CAT_DESC_LEN+1]
char
该层类别的描。*/	
 
实例:1~5图层进行创建类别,以及命名描述
    UF_LAYER_category_info_t category;
	tag_t categoryTAG = NULL_TAG;
	strcpy(category.name, "图层类别名字");
	strcpy(category.descr, "图层类别描述");
	for (int i = 0; i < 256; i++)
	{
		if (i>=0&&i<8)
		{
			category.layer_mask[i] = true;
		}
		else
		{
			category.layer_mask[i] = false;
		}
	}
	UF_LAYER_create_category(&category, &categoryTAG); 

2.9 UF_LAYER_edit_category_descr(编辑图层类别里的描述)
(1)概述
编辑图层类别的描述。
(2)用法说明

tag_t (tag_t类型)	category	Input(输入)	图层类别TAG
char * (字符型指针)	cat_descr	Input(输入)	图层类别的新的描述
 
2.10 UF_LAYER_edit_category_name(编辑图层类别里的名字)
(1)概述
编辑图层类别的名字。
(2)用法说明

tag_t (tag_t类型)	category	Input(输入)	图层类别TAG
char * (字符型指针)	cat_name	Input(输入)	图层类别的新名字 
2.11 UF_LAYER_edit_category_layer(编辑图层类别里的具体成员)
(1)概述
编辑图层类别的名字。
(2)用法说明

tag_t (tag_t类型)	        category	                    Input(输入)	图层类别TAG
logical	                    layer_mask[UF_LAYER_MAX_LAYER]	Input(输入)	A logical for each layer, does it belong to this category or not. layer_mask[0] is TRUE if layer 1 belongs to the category, otherwise it is false. layer_mask[1] applies to layer 2, and so on. 
实例:将上述的1~5图层换为6~10
    UF_LAYER_category_info_t category;
	tag_t categoryTAG = NULL_TAG;
	strcpy(category.name, "图层类别名字");
	strcpy(category.descr, "图层类别描述");
	for (int i = 0; i < 256; i++)
	{
		if (i>=0&&i<5)
		{
			category.layer_mask[i] = true;
		}
		else
		{
			category.layer_mask[i] = false;
		}
	}
	UF_LAYER_create_category(&category, &categoryTAG);
	for (int i = 0; i < 256; i++)
	{
		if (i >= 5 && i<10)
		{
			category.layer_mask[i] = true;
			UF_LAYER_edit_category_layer(categoryTAG, category.layer_mask);
		}
		else
		{
			category.layer_mask[i] = false;
		}
	} 

2.12 UF_LAYER_cycle_by_layer(遍历图层)
(1)概述
用来遍历图层的,它可以查找某一个图层下面的所有对象;或者是所有图层的所有对象,得到它的tag值。比如我们想开发一个一键删除所有图层的的所有对象的工具。
(2)用法说明

int (整数型)	            layer_number	Input(输入)	要遍历的图层,如果为0,遍历所有的图层
tag_t * (tag_t型的指针)	object_tag	    Input/Output	图层中对象的TAG,如果没有对象,则object_tag = NULL_TAG  
实例:遍历指定图层,删除图层中所有的对象
#include <uf_object_types.h>
#include <uf_layer.h>
#include <uf_ui.h>
#include <uf_modl.h>
#include <uf_obj.h>
UF_initialize();
tag_t objTAG = NULL_TAG;
char msg[256];
//UF_UI_open_listing_window();
int i = -1;
uf_list_p_t  list;
UF_MODL_create_list(&list);
do
{
	UF_LAYER_cycle_by_layer (0, &objTAG);
	i++;
	UF_MODL_put_list_item (list,objTAG);
	//sprintf (msg, "%d",objTAG);
	//UF_UI_write_listing_window (msg);
	//UF_UI_write_listing_window ("\n");
} while (objTAG !=NULL_TAG);
//删除链表里面的所有对象 
int coutlist;
tag_t objectTAG = NULL_TAG;
UF_MODL_ask_list_count (list,&coutlist);
for (int i = 0; i < coutlist; i++)
{
	UF_MODL_ask_list_item (list,i,&objectTAG);
	UF_OBJ_delete_object (objectTAG);
}
UF_MODL_delete_list(&list);
UF_terminate(); 


三、源码文件
https://download.csdn.net/download/weixin_47753171/89207997
https://download.csdn.net/download/weixin_47753171/89208115














![[图解]软件开发中的糊涂用语-04-为什么要追究糊涂用语](https://img-blog.csdnimg.cn/direct/464e3f6116b54b5086302c30131b707b.png)


