当前位置: 首页 > news >正文

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

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

自己封装的函数:

//获取最低的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();
		}

 

相关文章:

  • 【数据结构篇】算法征途:穿越时间复杂度与空间复杂度的迷雾森林
  • 基于javaweb的SpringBoot实验室管理系统设计与实现(源码+文档+部署讲解)
  • 【差分隐私相关概念】差分隐私中的稀疏向量技术
  • Java虚拟机JVM知识点(持续更新)
  • 解决element plus el-dialog 被el-header覆盖问题
  • 【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的 AOP:实现日志记录与性能监控
  • 阻塞式IO与非阻塞IO的区别
  • 【当你在抖音滑动手指时,时间正在被做成期货交易】
  • 八股总结(go)实时更新!
  • 【AI大模型系列】DeepSeek V3的混合专家模型机制-MoE架构(八)
  • HarmonyOS NEXT开发进阶(十五):日志打印 hilog 与 console.log 的区别
  • Android adb 的功能和用法
  • OpenCV图像拼接(8)用于实现并查集(也称为不相交集合)数据结构类cv::detail::DisjointSets
  • 【实战】渗透测试下的文件操作
  • RCE学习
  • 开源等宽编程字体 Maple Mono 正式发布 7.0
  • Flutter DatePicker 详解
  • 配置go开发环境
  • C/C++ 基础 - 回调函数
  • 设计模式——设计模式理念
  • 阿里云做淘宝客网站吗/拉新app推广平台
  • v9双语版网站怎么做/360优化大师
  • 自己的网络平台怎么做/合肥seo推广公司
  • 山东网站优化公司/广告营销是做什么的
  • p2p网站建设cms/中国互联网公司排名
  • 在线做动图的网站/石家庄百度快照优化排名