UG/NX二次开发Siemens官方NXOPEN实例解析—2.6 CreateNote

news2024/12/24 2:48:02

列文章目录

UG/NX二次开发Siemens官方NXOPEN实例解析—2.1 AssemblyViewer

UG/NX二次开发Siemens官方NXOPEN实例解析—2.2 Selection

UG/NX二次开发Siemens官方NXOPEN实例解析—2.3 Selection_UIStyler

UG/NX二次开发Siemens官方NXOPEN实例解析—2.4 File2Points

UG/NX二次开发Siemens官方NXOPEN实例解析—2.5 QuickExtrude

UG/NX二次开发Siemens官方NXOPEN实例解析—2.6 CreateNote


前言

        随着工业智能化的不断发展,UG二次开发的需求越来越多,也吸引了大批的二开从业人员,本人作为一名资深IT从业者(10年+)也毅然加入二次开发大军。

        然而,和流行IT行业(互联网、金融、医疗等)相比,工业智能化的门槛显得更高一点,专业的工业软件,相对封闭的开发理念和更小的开发圈子,让刚进入二开的从业者有点举步维艰。边学边整理,希望通过这系列文章的整理能给二开的生态增添一叶绿。


一、知识点提取

本实例主要实现了创建注释、拷贝注释,主要设计的知识点如下:

1、通过ug_default.sbf文件,加载注释列表

2、创建新的注释

3、选择已有注释,拷贝注释

二、案例需求分析

1、效果图

2、需求分解

1、通过ug_default.sbf文件,加载注释列表

2、创建新的注释

3、选择已有注释,拷贝注释

三、程序分析

1、源码所在目录

UGOPEN\SampleNXOpenApplications\C++\CreateNote

2、主要功能分析 

1、通过ug_default.sbf文件,加载注释列表

//Load all the symbols from current sbf file to the enum list
void CreateNote::LoadSbfFile()
{
	NXOpen::BlockStyler::PropertyList *sbfFileBrowseProps = sbfFileBrowse->GetProperties();
	NXOpen::NXString sbfFileBrowse1 = sbfFileBrowseProps->GetString("Path");	

	if(!strcmp(sbfFileBrowse1.GetText(),""))
	{
		char *rootDir=NULL;
		UF_translate_variable("UGII_ROOT_DIR",&rootDir);
		NXString symbolDir = rootDir ;
		sbfFileBrowseProps->SetString("Path", symbolDir + "\\ug_default.sbf");	
	}

	sbfFileBrowse1 = sbfFileBrowseProps->GetString("Path");	
	delete sbfFileBrowseProps;
	theSession->Parts()->Work()->Annotations()->SetCurrentSbfFile(sbfFileBrowse1.GetText());
	std::vector<NXString> symbolNames= theSession->Parts()->Work()->Annotations()->ReadAllSymbolNamesFromSbfFile();
	NXOpen::BlockStyler::PropertyList *symListProps = symList->GetProperties();	
	symListProps->SetEnumMembers("Value",symbolNames);
	delete symListProps;
}

这个方法里面包括了以下知识点:

1、获取环境变量的方法 UF_translate_variable("UGII_ROOT_DIR",&rootDir)

2、解析sbf文件方法theSession->Parts()->Work()->Annotations()->ReadAllSymbolNamesFromSbfFile()

2、创建新的注释 

if(!strcmp(noteType2.GetText(),"Create from user defined symbol"))
{
	NXOpen::BlockStyler::PropertyList *symListProps = symList->GetProperties();
	NXString text = symListProps->GetEnumAsString("Value");
	delete symListProps;
	double scaleVal = scale->GetProperties()->GetDouble("Value");
	double aspectRatioVal = aspectRatio->GetProperties()->GetDouble("Value");
	double symWidth[256],symHeight[256];
	NXOpen::SymbolFont *noteSymbol = theSession->Parts()->Work()->Annotations()->LoadSymbolFontFromSbfFile(text,symWidth,symHeight);
	userSymbolPreferences1 = theSession->Parts()->Work()->Annotations()->NewUserSymbolPreferences(Annotations::UserSymbolPreferences::SizeTypeScaleAspectRatio,scaleVal,aspectRatioVal);

	//Selected text of the symbol is converted to symbol
	text = "<%"  + text + ">";
	string noteText = text.GetText();
	std::remove(noteText.begin(),noteText.end(),' ');
	size_t pos1 = noteText.find_first_of(">");
	noteText = noteText.substr(0,++pos1);
	NXString text1 = noteText;
	stringArray1.push_back(text1.GetText());	
	NXOpen::BlockStyler::PropertyList *selLocationProps = selLocation->GetProperties();
	NXOpen::Point3d cursor = selLocationProps->GetPoint("CursorLocation");
	delete selLocationProps;

	//Creates note in the given location
	theSession->Parts()->Work()->Annotations()->CreateNote(stringArray1,cursor,AxisOrientationHorizontal,letteringPreferences1,userSymbolPreferences1);		
}

这个方法里面包括了以下知识点:

1、创建注释方法:theSession->Parts()->Work()->Annotations()->CreateNote()

2、获取点选坐标方法:NXOpen::Point3d cursor = selLocationProps->GetPoint("CursorLocation")

3、选择已有注释,拷贝注释

if(!strcmp(noteType2.GetText(),"Copy existing symbol"))
{
	std::vector<NXOpen::TaggedObject *>selectedObject;

	NXOpen::BlockStyler::PropertyList *selectNoteProps = selectNote->GetProperties();		
	selectedObject = selectNoteProps->GetTaggedObjectVector("SelectedObjects");
	delete selectNoteProps;

	NXOpen::BlockStyler::PropertyList *selLocationProps = selLocation->GetProperties();
	NXOpen::Point3d cursor = selLocationProps->GetPoint("CursorLocation");
	delete selLocationProps;

	//Here the user selected note/symbol is copied
	if (selectedObject.size()>0)
	{
		Annotations::Note *note1(dynamic_cast<Annotations::Note *>(selectedObject[0]));
		if(note1!=NULL)
		{				
			letteringPreferences1 = note1->GetLetteringPreferences();
			userSymbolPreferences1 = note1->GetUserSymbolPreferences(); 
			stringArray1 = note1->GetText();
			theSession->Parts()->Work()->Annotations()->CreateNote(stringArray1,cursor,AxisOrientationHorizontal,letteringPreferences1,userSymbolPreferences1);
		}
	}
}

1、获取选择注释对象方法:selectedObject = selectNoteProps->GetTaggedObjectVector("SelectedObjects");

2、获取点选坐标方法:NXOpen::Point3d cursor = selLocationProps->GetPoint("CursorLocation")

3、创建注释方法:theSession->Parts()->Work()->Annotations()->CreateNote()

4、 补充一个知识点,选择对象控件根据注释过滤的方法

selectNote = dynamic_cast<NXOpen::BlockStyler::UIBlock* >(theDialog->TopBlock()->FindBlock("selectNote"));
//Setting selection mask to select only drafting notes or symbols
NXOpen::Selection::SelectionAction action = Selection::SelectionActionClearAndEnableSpecific;
std::vector<NXOpen::Selection::MaskTriple>selectionMask_array(2);
selectionMask_array[0].Type = UF_drafting_entity_type;
selectionMask_array[0].Subtype = UF_draft_note_subtype;
selectionMask_array[1].Type = UF_drafting_entity_type;
selectionMask_array[1].Subtype = UF_draft_label_subtype;
selLocation->GetProperties()->SetEnumAsString("StepStatus","Required");		
selectNote->GetProperties()->SetEnumAsString("StepStatus","Required");
selectNote->GetProperties()->SetSelectionFilter("SelectionFilter",action,selectionMask_array);

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/108700.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【java随笔】面向对象思维

1.怎么建立面向对象的思维方式 &#xff08;1&#xff09;先整体&#xff0c;再局部 &#xff08;2&#xff09;先抽象&#xff0c;再具体 &#xff08;3&#xff09;能做什么&#xff0c;再怎么做 2.如何学习面向对象 &#xff08;1&#xff09;语法 &#xff08;2&#xff09…

执行docker restart [CONTAINER ID]命令时会把之前的参数都带上吗

我在搭建rocketmq时候&#xff0c;运行了好几个容器命令也比较长如下&#xff1a; # 启动 namesrv docker run -d -p 9876:9876 -v "D:/Program Files/rocketmq/namesrv/logs:/root/logs" -v "D:/Program Files/rocketmq/namesrv/store:/root/store" …

JAVA手机网站销售

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a;

Hazelcast 在springboot下的使用集成

一、Hazelcast简介 Hazelcast是一款由Hazelcast公司开发的基于jvm环境的为各种应用提供分布式集群服务的分布式缓存解决方案。可以嵌入到java、c、.net等开发的产品中使用。其主要功能有&#xff1a; 提供了 Map、Queue、MultiMap、Set、List、Semaphore、Atomic 等接口的分布…

RocketMQ消费者没有成功消费消息的问题排查

背景 今天下游同事反馈&#xff0c;有一些以取消的订单库存还原异常了&#xff0c;导致部分商品库存没有还原。查日志发现没有收到还原消息&#xff0c;但是查看发送方是可以确认消息是已经发了的&#xff0c;那么是什么原因导致消费者没有收到&#xff0c;或者收到后没有处理消…

算法刷题打卡第53天:排序数组---希尔排序

排序数组 难度&#xff1a;中等 给你一个整数数组 nums&#xff0c;请你将该数组升序排列。 示例 1&#xff1a; 输入&#xff1a;nums [5,2,3,1] 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; 输入&#xff1a;nums [5,1,1,2,0,0] 输出&#xff1a;[0,0,1,1,2,5]希尔排…

六、Buffer缓冲区和Stream流

Buffer —— 缓冲区 JavaScript 提供了大量对字符串的便捷操作&#xff0c;但没有读取或操作二进制数据流机制&#xff0c;而在Node.js中可以直接用Buffer类提供的构造函数创建Buffer实例&#xff0c;一个Buffer实例代表一个缓冲区&#xff0c;Buffer的缓冲区专门用于存放二进制…

全球「数字游民」现状,有人已经72岁了

近年来&#xff0c;“数字游民”在国内越来越流行&#xff0c;特别是受疫情的影响&#xff0c;很多人对这种工作生活方式越来越喜欢&#xff0c;也越来越习惯&#xff0c;在此之前&#xff0c;当你告诉别人你是一名“数字游民”时&#xff0c;大家通常会认为你是没有工作的无业…

RocketMQ-双主双从集群+DashBorad搭建(云服务器)

文章目录一、理论垫基础1. NameServer 集群2. Producer集群3. Consumer集群4. Broker集群4.1 节点间数据同步 以及 消息的持久化4.2 Broker的集群模式4.2.1、单Master模式4.2.2、多Master模式4.2.3、多Master多Slave模式-异步复制4.2.4、多Master多Slave模式-同步双写最佳实践4…

APM32F103 RTC内部时钟源报警中断例程测试

APM32F103 RTC内部时钟源报警中断例程测试✨相关篇推荐《【开源电路】STM32F103VCT6开发板》&#x1f4cc;关篇《APM32F103 RTC内部时钟源秒中断例程测试》&#x1f4cc;本案例来源于官方的SDK固件包&#xff1a;https://www.geehy.com/support/apm32 &#x1f388;源码位置&am…

二极管:烧IC与我相干!

趁“羊”未到&#xff0c;还有心力接着上节继续讲。 话说&#xff0c;烧IC&#xff0c;不只本身IC烧&#xff0c;还火烧连营连带后端IC一并烧&#xff0c;为何呢&#xff01;&#xff1f; 那得回到过去&#xff0c;必须翻翻《硬件先生》中的《电源知识-DC-DC》&#xff0c;从D…

GPU与CPU的性能比较及影响因素

CPU的主要指标是主频和线程。 Intel&#xff1a;后缀F表示无核显&#xff0c;后缀K代表可以超频&#xff0c;H代表移动端&#xff1b;AMD&#xff1a;后缀G代表有核显&#xff0c;后缀X代表加强版&#xff0c;后缀XT代表超级加强版。 CPU 常见计算操作&#xff1a; 数据加载、…

4.0、Hibernate-延迟加载 2

4.0、Hibernate-延迟加载 2 消费者 和 订单 属于 一对多 的 关系&#xff0c;通过上一章节 3.0 的内容我们知道了可以通过设置 customer 来实现延迟加载&#xff0c;本章节来介绍一下如何设置 orders 去实现延迟加载&#xff1b; one-to-many 的 lazy 默认是 true 是开启的&…

%29 身份认证

1、Web 开发模式 &#xff08;1&#xff09;、基于服务器渲染的开发模式&#xff1a;服务器发送给客户端的 HTML 页面&#xff0c;是在服务器通过字符串的拼接&#xff0c;动态生成的&#xff08;企业级网站&#xff09; &#xff08;2&#xff09;、基于前后端分离的开发模式&…

登录过程(vuex存储token、token持久化)

登录过程(vuex存储数据) 点击登录按钮通过表单校验 this.$refs.loginForm.validate(valid > {if (valid) {//按钮动画加载,禁用 this.loading true// 调用vuex的action发送登录请求this.$store.dispatch(user/login, this.loginForm).then(() > {this.$router.push({ p…

内存分配函数(动态内存分配)详解

目录 &#x1f391;为什么要进行动态内存开辟&#xff1f; &#x1f391;malloc和free &#x1f3a0;malloc函数 &#x1f3a0;free函数 &#x1f3a0;malloc函数和free函数的实际应用 &#x1f391;calloc函数 &#x1f391;realloc函数 &#x1f3a0;realloc函数的使用示例 &…

通过脚手架vue-cli创建一个vue项目

我需要在vue-demo文件下新建vue项目 步骤一 ①在该文件夹下打开集成终端 输入创建命令 命令 vue create 项目名称 &#xff0c;注意不要使用驼峰命名法 如果是第一次配置&#xff0c;有面的提示&#xff0c;这里说你这样速度会很慢的&#xff0c;用不用镜像啊&#xff0c;这…

样品制备丨艾美捷硝酸盐/亚硝酸盐荧光法检测试剂盒

一氧化氮&#xff08;NO&#xff09;是由一氧化氮合酶&#xff08;NOS&#xff09;在生物系统中合成的。NOS是一种非常复杂的酶&#xff0c;作用于分子氧、精氨酸和NADPH&#xff0c;产生NO、瓜氨酸和NADP。这个过程需要五个额外的辅因子&#xff08;FMN、FAD、血红素、钙调素和…

制造业ERP管理系统在企业采购管理中的作用是什么?

对于任何一家企业&#xff0c;采购都是头等大事。企业的采购工作往往是决定了企业产品的交货速度、成本和质量&#xff0c;特别是在制造行业&#xff0c;采购成本甚至占比产品成本的60%以上&#xff0c;降低采购成本是提高企业竞争力的关键。因此&#xff0c;对于企业采购领域的…

Effective C++条款34:区分接口继承和实现继承

Effective C条款34&#xff1a;区分接口继承和实现继承&#xff08;Differentiate between inheritance of interface and inheritance of implementation&#xff09;条款34&#xff1a;区分接口继承和实现继承1、纯虚函数2、虚函数&#xff08;非纯&#xff09;2.1 将默认实现…