NX/UG二次开发—CAM获取加工操作的最低Z深度值的方法

news2025/4/2 2:53:46

        网上已经有些大佬给出了解决方案,但是基本有两种,一种内部函数,另外一种就是导出程序的刀轨文件找坐标计算。使用内部函数进行操作,可以自己学习,不做解释。下面只是针对第二种进行说明,参考胡君老师的教程。

自己封装的函数:

//获取最低的Z的深度值
static double GetOperMinZz(tag_t groupTag);

		
// 读取文本文件内容 fileNamePath: 文件路径 vTextStrs: 存储读取内容的字符串向量 mode: 读取模式,0 - 读取所有行,1 - 跳过空行
static int ReadTextStrs(string fileNamePath, vector<string> &vTextStrs, int mode = 1);
//寻找字符串并返回位置,如果没有找到,返回-1
static int StrFind(string str, string s);
//取中间文本
static string StrSubmid(string str, string startStr, string endStr);


//获取最低的Z的深度值
double LiangFuns::UserUFBaseFun::GetOperMinZz(tag_t groupTag)
{
	tag_t setup_tag = NULL_TAG;
	UF_SETUP_ask_setup(&setup_tag);
	//获得当前dll所在的路径GetDllPanthAndName()
	string strNCfile = UserUFBaseFun::GetDllPanthAndName(1) + "//666.nc";
	UF_SETUP_generate_program(setup_tag, groupTag, "MILL_3_AXIS", strNCfile.c_str(), UF_SETUP_OUTPUT_UNITS_METRIC);

	vector<string> vTextDatas;
	UserUFBaseFun::ReadTextStrs(strNCfile, vTextDatas);
	double minZzVal = 0.0;
	for (int i = 0; i<vTextDatas.size(); i++)
	{
		//HuUFBase::print(vTextDatas[i]);
		string strLineDate = vTextDatas[i];

		if (UserUFBaseFun::StrFind(strLineDate, " Z") != -1)
		{
			string strVal = UserUFBaseFun::StrSubmid(strLineDate, " Z", " ");
			double zVal = atof(strVal.c_str());
			//HuUFBase::print(zVal);
			if (zVal<minZzVal)
				minZzVal = zVal;
		}
	}

	//HuUFBase::print(minZzVal);
	remove(strNCfile.c_str());
	return  minZzVal;
}

// 读取文本文件内容 fileNamePath: 文件路径 vTextStrs: 存储读取内容的字符串向量 mode: 读取模式,0 - 读取所有行,1 - 跳过空行
int LiangFuns::UserUFBaseFun::ReadTextStrs(string fileNamePath, vector<string>& vTextStrs, int mode)
{
	ifstream file(fileNamePath);
	if (!file.is_open())
	{
		cerr << "无法打开文件: " << fileNamePath << endl;
		return -1; // 文件打开失败
	}
	string line;
	while (getline(file, line))
	{
		if (mode == 1)
		{
			if (line.empty())
				continue; // 跳过空行

						  // 去掉行首空格并获取第一个非空字符
			string temptrimstr = line.erase(0, line.find_first_not_of(" ")).substr(0, 1);
			// 如果行不是注释行(不以#、!、/、*开头),则添加到vTextStrs中
			if (temptrimstr != "#" && temptrimstr != "!" && temptrimstr != "/" && temptrimstr != "*" && temptrimstr != "%")
				vTextStrs.push_back(line);  // 添加有效行
		}
		else if (mode == 0)
		{
			vTextStrs.push_back(line);
		}
	}
	file.close();
	return 0; // 成功
}

//寻找字符串并返回位置,如果没有找到,返回-1
int LiangFuns::UserUFBaseFun::StrFind(string str, string s)
{
	if (str.find(s) != string::npos)
		return (int)str.find(s);
	else
		return -1;
}

//取中间文本
string  LiangFuns::UserUFBaseFun::StrSubmid(string str, string startStr, string endStr)
{
	int intStartIdx = str.find(startStr) + startStr.length();
	int intEndIdx = intStartIdx + str.substr(intStartIdx, str.length() - intStartIdx).find(endStr);
	return str.substr(intStartIdx, intEndIdx - intStartIdx);
}

函数调用:

        //加工设置的TAG
		tag_t setup_tag = NULL_TAG;
		UF_SETUP_ask_setup(&setup_tag);

		//获得根组的TAG
		tag_t programRootgroup = NULL_TAG;
		UF_SETUP_ask_program_root(setup_tag, &programRootgroup);

		//获取成员列表
		int count = 0;
		tag_t * list = NULL;
		UF_NCGROUP_ask_member_list(programRootgroup, &count, &list);

		vector<vector<string>> vVProgrmDatas;

		for (int i = 0; i<count; i++)
		{
			vector<string> vTempDatas;

			//获取程序组名字
			string strGroupName = UserUFBaseFun::GetTagName(list[i]);
			if (strGroupName == "NONE")
				continue;
			//UserUFBaseFun::PrintMessage(strGroupName);

			int count2 = 0;
			tag_t * list2 = NULL;
			UF_NCGROUP_ask_member_list(list[i], &count2, &list2);
			if (count2 <= 0)
				continue;

			//获取刀具名字
			tag_t toolTag = NULL_TAG;
			UF_OPER_ask_cutter_group(list2[0], &toolTag);
			string strToolName = UserUFBaseFun::GetTagName(toolTag);


			//获取转数进给率
			double spindleVal = 0.0;
			UF_PARAM_ask_double_value(list2[0], UF_PARAM_SPINDLE_RPM, &spindleVal);
			UF_PARAM_feedrate_t feed_value;
			UF_PARAM_ask_subobj_ptr_value(list2[0], UF_PARAM_FEED_CUT, &feed_value);
			double feedVal = feed_value.value;
			string strZhuansu = UserUFBaseFun::double_toString(spindleVal, 2, true);
			string strJingeilv = UserUFBaseFun::double_toString(feedVal, 2, true);


			//获取部件余量
			double stockVal = 0.0;
			UF_PARAM_ask_double_value(list2[0], UF_PARAM_STOCK_PART, &stockVal);
			string strYuliang = UserUFBaseFun::double_toString(stockVal, 2, true);


			//获得加工时间
			double operTimes = UserUFBaseFun::GetOperTime(list[i]);
			string strOperTime = UserUFBaseFun::double_toString(operTimes, 2, true);

			//获取最低的Z深度值
			double operMinZz = UserUFBaseFun::GetOperMinZz(list[i]);
			string strOperMinZz = UserUFBaseFun::double_toString(operMinZz, 2, true);

			vTempDatas.push_back(strGroupName);
			vTempDatas.push_back(strToolName);
			vTempDatas.push_back(strZhuansu);
			vTempDatas.push_back(strJingeilv);
			vTempDatas.push_back(strYuliang);
			vTempDatas.push_back(strOperTime);
			vTempDatas.push_back(strOperMinZz);

			vVProgrmDatas.push_back(vTempDatas);
			vTempDatas.clear();
		}

 

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

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

相关文章

解决pyinstaller GUI打包时无法打包图片问题

当我们的python GuI在开发时。经常会用到图片作为背景&#xff0c;但是在打包后再启动GUI后却发现&#xff1a;原先调试时好端端的背景图片竟然不翼而飞或者直接报错。这说明图片没有被pyinstaller一起打包…… 要解决这个问题很简单&#xff0c;就是更改图片的存储方式。 tk…

蓝桥杯真题------R格式(高精度乘法,高精度加法)

对于高精度乘法和加法的同学可以学学这几个题 高精度乘法 高精度加法 文章目录 题意分析部分解全解 后言 题意 给出一个整数和一个浮点数&#xff0c;求2的整数次幂和这个浮点数相乘的结果最后四舍五入。、 分析 我们可以发现&#xff0c;n的范围是1000,2的1000次方非常大&am…

Nginx — Nginx安装证书模块(配置HTTPS和TCPS)

一、安装和编译证书模块 [rootmaster nginx]# wget https://nginx.org/download/nginx-1.25.3.tar.gz [rootmaster nginx]# tar -zxvf nginx-1.25.3.tar.gz [rootmaster nginx]# cd nginx-1.25.3 [rootmaster nginx]# ./configure --prefix/usr/local/nginx --with-http_stub_…

回调后门基础

回调后门概述 回调后门&#xff08;Reverse Shell&#xff09;是一种常见的攻击方式&#xff0c;攻击者通过受害主机主动连接到远程服务器&#xff08;攻击者控制的机器&#xff09;&#xff0c;从而获得远程控制权限。 工作原理 受害者主机 运行一个恶意代码&#xff0c;尝…

深度学习 Deep Learning 第13章 线性因子模型

深度学习 Deep Learning 第13章 线性因子模型 内容概要 本章深入探讨了线性因子模型&#xff0c;这是一类基于潜在变量的概率模型&#xff0c;用于描述数据的生成过程。这些模型通过简单的线性解码器和噪声项捕捉数据的复杂结构&#xff0c;广泛应用于信号分离、特征提取和数…

【个人笔记】用户注册登录思路及实现 springboot+mybatis+redis

基本思路 获取验证码接口 验证码操作用了com.pig4cloud.plugin的captcha-core这个库。 AccountControl的"/checkCode"接口代码&#xff0c;通过ArithmeticCaptcha生成一张验证码图片&#xff0c;通过text()函数得到验证码的答案保存到变量code&#xff0c;然后把图…

聚类(Clustering)基础知识3

文章目录 一、聚类的性能评价1、聚类性能评价&#xff08;1&#xff09;聚类性能评价方法&#xff1a; 2、参考模型 (reference model)&#xff08;1&#xff09;数据集&#xff1a;&#xff08;2&#xff09;聚类结果&#xff1a;&#xff08;3&#xff09;参考模型&#xff1…

RK3588使用笔记:设置程序/服务开机自启

一、前言 一般将系统用作嵌入式设备时肯定要布置某些程序&#xff0c;这时候就需要对程序设置开机自己&#xff0c;否则每次都要人为启动&#xff0c;当有些嵌入式系统未连接显示屏或者无桌面环境去操作启动程序时&#xff0c;程序自启就是必须的了&#xff0c;本文介绍在纯li…

python实现股票数据可视化

最近在做一个涉及到股票数据清洗及预测的项目&#xff0c;项目中需要用到可视化股票数据这一功能&#xff0c;这里我与大家分享一下股票数据可视化的一些基本方法。 股票数据获取 目前&#xff0c;我已知的使用python来获取股票数据方式有以下三种: 爬虫获取&#xff0c;实现…

JavaScript DOM与元素操作

目录 DOM 树、DOM 对象、元素操作 一、DOM 树与 DOM 对象 二、获取 DOM 元素 1. 基础方法 2. 现代方法&#xff08;ES6&#xff09; 三、修改元素内容 四、修改元素常见属性 1. 标准属性 2. 通用方法 五、通过 style 修改样式 六、通过类名修改样式 1. className 属…

ARM向量表

向量表作用说明RVBAR在 AArch64 中&#xff0c;重置向量不再是异常向量表的一部分。 有复位向量的专用配置输入引脚和寄存器。在 AArch64 中&#xff0c;处理器从 IMPLEMENTAION‑DEFINED 地址开始执行&#xff0c; 该地址由硬件输入引 脚RVBARADDR定义&#xff0c; 可以通过 R…

leetcode刷题日记——除自身以外数组的乘积

[ 题目描述 ]&#xff1a; [ 思路 ]&#xff1a; 题目要求获取数组中每个元素除自己以外的各元素的乘积最简单的方法就是算出数组所有元素的乘积&#xff0c;然后除以自身&#xff0c;即可得到除自身外各元素的乘积 但要考虑到其自身为0的情况&#xff0c;即当期自身为0时&am…

【信奥一本通提高篇】基础算法之贪心算法

原文 https://bbs.fmcraft.top/blog/index.php/archives/22/ 贪心算法 概述 近年来的信息学竞赛试题&#xff0c;经常出现求一个问题的可行解或最优解的题目。这类问题就是我们通常所说的最优化问题。贪心算法是求解这类问题的一种常用算法。在众多的算法中&#xff0c;贪心…

PyQt6实例_批量下载pdf工具_批量pdf网址获取

目录 前置&#xff1a; 步骤&#xff1a; step one 安装包 step two 获取股票代码 step three 敲代码&#xff0c;实现 step four 网址转pdf网址 视频 前置&#xff1a; 1 本系列将以 “PyQt6实例_批量下载pdf工具”开头&#xff0c;放在 【PyQt6实例】 专栏 2 本节讲…

KMeans算法案例

KMeans算法案例 案例介绍 已知&#xff1a;客户性别、年龄、年收入、消费指数 需求&#xff1a;对客户进行分析&#xff0c;找到业务突破口&#xff0c;寻找黄金客户 数据集共包含顾客的数据, 数据共有 4 个特征, 数据共有 200 条。接下来&#xff0c;使用聚类算法对具有相似…

IDApro直接 debug STM32 MCU

使用IDA pro 逆向分析muc 固件的时候&#xff0c; 难免要进行一些动态的debug&#xff0c;来进一步搞清楚一些内存的数据、算法等&#xff0c;这时候使用远程debug 的方式直接在mcu上进行debug 最合适不过了。 不过有个前提条件就是一般来说有的mcu 会被运行中的代码屏蔽 RDP、…

六十天前端强化训练之第三十六天之E2E测试(Cypress)大师级完整指南

欢迎来到编程星辰海的博客讲解 看完可以给一个免费的三连吗&#xff0c;谢谢大佬&#xff01; 目录 一、知识讲解 1. E2E测试核心概念 2. Cypress框架特性 3. 工作原理 4. 测试金字塔定位 二、核心代码示例&#xff1a;用户登录全流程测试 三、实现效果展示 四、学习要…

20250330-傅里叶级数专题之离散傅里叶变换(5/6)

5. 傅里叶级数专题之离散傅里叶变换 推荐视频: 工科生以最快的速度理解离散傅立叶变换(DFT) 哔哩哔哩 20250328-傅里叶级数专题之数学基础(0/6)-CSDN博客20250330-傅里叶级数专题之傅里叶级数(1/6)-CSDN博客20250330-傅里叶级数专题之傅里叶变换(2/6)-CSDN博客20250330-傅里叶…

3.29:数据结构-绪论线性表-上

一、时间复杂度 1、ADT 2、定义法计算时间复杂度&#xff1a;统计核心语句的总执行次数 &#xff08;1&#xff09;例题1&#xff0c;与2022年的真题对比着写 此题关键在于求和公式的转化&#xff0c;类型为&#xff1a;线性循环嵌套非线性循环 2022年那道题如果考场上实在脑…

大模型架构记录13【hr agent】

一 Function calling 函数调用 from dotenv import load_dotenv, find_dotenvload_dotenv(find_dotenv())from openai import OpenAI import jsonclient OpenAI()# Example dummy function hard coded to return the same weather # In production, this could be your back…