实例:NX二次开发抽取平面以及标准柱面中心线

news2024/10/7 16:18:02

一、概述

        最近体验许多外挂,包括胡波外挂、星空外挂及模圣等都有抽取面的中心线,由于刚刚学习,我尝试看看能不能做出来,本博客代码没有封装函数,代码有待改进,但基本可以实现相应的功能。

二、案例实现的功能

1、可以抽取平面的中心线,主要利用面上的UV线;

2、可以抽取柱面的中心线,这里方法有很多我的思路是识别柱面上的两个圆弧,获得两段圆弧的中心坐标,然后连线。

3、适用范围:目前有三类

图1 平面类型

图2 圆柱面类型

图3 标准圆弧类型

非标准圆弧类型目前只想到用抽取虚拟曲线来实现,下一篇博客写

三、代码说明以及详细注解

//NXOpen_CreateFaceCentreLine

// Mandatory UF Includes
#include <uf.h>
#include <uf_object_types.h>

// Internal Includes
#include <NXOpen/ListingWindow.hxx>
#include <NXOpen/NXMessageBox.hxx>
#include <NXOpen/UI.hxx>

// Internal+External Includes
#include <NXOpen/Annotations.hxx>
#include <NXOpen/Assemblies_Component.hxx>
#include <NXOpen/Assemblies_ComponentAssembly.hxx>
#include <NXOpen/Body.hxx>
#include <NXOpen/BodyCollection.hxx>
#include <NXOpen/Face.hxx>
#include <NXOpen/Line.hxx>
#include <NXOpen/NXException.hxx>
#include <NXOpen/NXObject.hxx>
#include <NXOpen/Part.hxx>
#include <NXOpen/PartCollection.hxx>
#include <NXOpen/Session.hxx>

// Std C++ Includes
#include <iostream>
#include <sstream>

//用户定义
#include "uf_all.h"
#include <vector>
using namespace NXOpen;
using std::string;
using std::exception;
using std::stringstream;
using std::endl;
using std::cout;
using std::cerr;

static  int   init_proc(UF_UI_selection_p_t select, void *user_data)
{
	int  errorCode = 0;
	int  num_triples = 1; //选择类型 数量
	UF_UI_mask_t mask_triples[1] = { { UF_face_type , 0,0 }    //定义选择面类型

	};
	errorCode = UF_UI_set_sel_mask(select,
		UF_UI_SEL_MASK_CLEAR_AND_ENABLE_SPECIFIC,
		num_triples,
		mask_triples);
	if (errorCode == 0)
	{
		return UF_UI_SEL_SUCCESS;
	}
	else
	{
		return UF_UI_SEL_FAILURE;
	}
}
//------------------------------------------------------------------------------
// NXOpen c++ test class 
//------------------------------------------------------------------------------
class MyClass
{
    // class members
public:
    static Session *theSession;
    static UI *theUI;

    MyClass();
    ~MyClass();

	void do_it();
	void print(const NXString &);
	void print(const string &);
	void print(const char*);

private:
	BasePart *workPart, *displayPart;
	NXMessageBox *mb;
	ListingWindow *lw;
	LogFile *lf;
};

//------------------------------------------------------------------------------
// Initialize static variables
//------------------------------------------------------------------------------
Session *(MyClass::theSession) = NULL;
UI *(MyClass::theUI) = NULL;

//------------------------------------------------------------------------------
// Constructor 
//------------------------------------------------------------------------------
MyClass::MyClass()
{

	// Initialize the NX Open C++ API environment
	MyClass::theSession = NXOpen::Session::GetSession();
	MyClass::theUI = UI::GetUI();
	mb = theUI->NXMessageBox();
	lw = theSession->ListingWindow();
	lf = theSession->LogFile();

    workPart = theSession->Parts()->BaseWork();
	displayPart = theSession->Parts()->BaseDisplay();
	
}

//------------------------------------------------------------------------------
// Destructor
//------------------------------------------------------------------------------
MyClass::~MyClass()
{
}

//------------------------------------------------------------------------------
// Print string to listing window or stdout
//------------------------------------------------------------------------------
void MyClass::print(const NXString &msg)
{
	if(! lw->IsOpen() ) lw->Open();
	lw->WriteLine(msg);
}
void MyClass::print(const string &msg)
{
	if(! lw->IsOpen() ) lw->Open();
	lw->WriteLine(msg);
}
void MyClass::print(const char * msg)
{
	if(! lw->IsOpen() ) lw->Open();
	lw->WriteLine(msg);
}




//------------------------------------------------------------------------------
// Do something
//------------------------------------------------------------------------------
void MyClass::do_it()
{

	// TODO: add your code here
	L10:
	// TODO: add your code here
	int response = 0;
	tag_t object = NULL_TAG;
	double cursor[3];
	tag_t view = NULL_TAG;
	UF_UI_select_with_single_dialog("提示:请选择面", "选择面", UF_UI_SEL_SCOPE_WORK_PART, init_proc, NULL, &response, &object, cursor, &view);
	if (response == UF_UI_OK || response == UF_UI_OBJECT_SELECTED || response == UF_UI_OBJECT_SELECTED_BY_NAME)
	{
		UF_DISP_set_highlight(object, 0);
		//判断面的类型
		int faceType = 0;
		UF_MODL_ask_face_type(object, &faceType);
		if (faceType == UF_MODL_CYLINDRICAL_FACE)
		{
			//面找边
			uf_list_p_t list;
			tag_t edge1Tag = NULL_TAG;
			tag_t edge1Tag2 = NULL_TAG;
			UF_CURVE_line_t line1;
			tag_t line1TAG = NULL_TAG;
			int count = 0;
			UF_MODL_ask_face_edges(object, &list);//得到面的边
			UF_MODL_ask_list_count(list, &count);//查询链表数量
			std::vector<tag_t> edgeTAG;
			for (int j = 0; j < count; j++)
			{
				UF_MODL_ask_list_item(list, j, &edge1Tag);//得到边的tag

				//判断边的类型
				int edge_type;
				UF_MODL_ask_edge_type(edge1Tag, &edge_type);
				if (edge_type == UF_MODL_CIRCULAR_EDGE)
				{
					/*****************************************
					UF_MODL_LINEAR_EDGE					线性边
					UF_MODL_CIRCULAR_EDGE				圆形边
					UF_MODL_ELLIPTICAL_EDGE				椭圆形边		
					UF_MODL_INTERSECTION_EDGE			相交边
					UF_MODL_SPLINE_EDGE					样条边
					UF_MODL_SP_CURVE_EDGE				曲线边
					UF_MODL_FOREIGN_EDGE				外边缘
					UF_MODL_CONST_PARAMETER_EDGE		参数边
					UF_MODL_TRIMMED_CURVE_EDGE			裁剪曲线边
					******************************************/
					edgeTAG.push_back(edge1Tag);
				}			

				if (edgeTAG.size() == 2)
				{
					//UF_CURVE_ask_centroid(edgeTAG[0], centroid1);//得到第一条边的中心坐标
					//UF_CURVE_ask_centroid(edgeTAG[1], centroid2);//得到第二条边的中心坐标
					UF_CURVE_arc_t arc_coords1, arc_coords2;
					UF_CURVE_ask_arc_data(edgeTAG[0], &arc_coords1);
					UF_CURVE_ask_arc_data(edgeTAG[1], &arc_coords2);
					
					double douMatrixValue1[9];
					UF_CSYS_ask_matrix_values(arc_coords1.matrix_tag, douMatrixValue1);
					double douPoint1[3];
					UF_MTX3_vec_multiply_t(arc_coords1.arc_center, douMatrixValue1, douPoint1);
					double douMatrixValue2[9];
					UF_CSYS_ask_matrix_values(arc_coords2.matrix_tag, douMatrixValue2);
					double douPoint2[3];
					UF_MTX3_vec_multiply_t(arc_coords2.arc_center, douMatrixValue2, douPoint2);

					//画直线
					line1.start_point[0] = douPoint1[0];
					line1.start_point[1] = douPoint1[1];
					line1.start_point[2] = douPoint1[2];
					line1.end_point[0] = douPoint2[0];
					line1.end_point[1] = douPoint2[1];
					line1.end_point[2] = douPoint2[2];

					UF_CURVE_create_line(&line1, &line1TAG);

					UF_OBJ_set_color(line1TAG, 186);
					UF_OBJ_set_font(line1TAG, UF_OBJ_FONT_CENTERLINE);
					//移动放置图层
					UF_OBJ_set_layer(line1TAG, 5);					
				}
			
			}

			UF_free(list);
			goto L10;
		}
		else if (faceType == UF_MODL_PLANAR_FACE)
		{
			double uv_min_max1[4];
			UF_MODL_ask_face_uv_minmax(object, uv_min_max1);
			double parameter1 = (uv_min_max1[0] + uv_min_max1[1]) / 2;
			double parameter2 = (uv_min_max1[2] + uv_min_max1[3]) / 2;
			tag_t * isocurve_id1, *isocurve_id2;
			int isocurve_cnt1 = 0;
			int isocurve_cnt2 = 0;
			UF_MODL_create_isocurve(object, 1, parameter1, 0.01, &isocurve_id1, &isocurve_cnt1);
			UF_MODL_create_isocurve(object, 2, parameter2, 0.01, &isocurve_id2, &isocurve_cnt2);

			UF_OBJ_set_color(isocurve_id1[0], 186);
			UF_OBJ_set_color(isocurve_id2[0], 186);
			UF_OBJ_set_font(isocurve_id1[0], UF_OBJ_FONT_CENTERLINE);
			UF_OBJ_set_font(isocurve_id2[0], UF_OBJ_FONT_CENTERLINE);
			//移动放置图层
			UF_OBJ_set_layer(isocurve_id1[0], 5);
			UF_OBJ_set_layer(isocurve_id2[0], 5);
			UF_free(isocurve_id1);
			UF_free(isocurve_id2);


			double param[2] = { 0 };
			param[0] = parameter1;
			param[1] = parameter2;
			double point[3] = { 0 };
			double u1[3] = { 0 };
			double v1[3] = { 0 };
			double u2[3] = { 0 };
			double v2[3] = { 0 };
			double unit_norm[3] = { 0 };
			double radii[2] = { 0 };
			UF_MODL_ask_face_props(object, param, point, u1, v1, u2, v2, unit_norm, radii);
			tag_t facePoint;
			UF_CURVE_create_point(point, &facePoint);

			goto L10;
		}
		else
		{
			uc1601("请正确选择面!", 1);
			goto L10;
		}
	}
}

//------------------------------------------------------------------------------
// Entry point(s) for unmanaged internal NXOpen C/C++ programs
//------------------------------------------------------------------------------
//  Explicit Execution
extern "C" DllExport void ufusr( char *parm, int *returnCode, int rlen )
{
	UF_initialize();
    try
    {
		// Create NXOpen C++ class instance
		MyClass *theMyClass;
		theMyClass = new MyClass();
		theMyClass->do_it();
		delete theMyClass;
	}
    catch (const NXException& e1)
    {
		UI::GetUI()->NXMessageBox()->Show("NXException", NXOpen::NXMessageBox::DialogTypeError, e1.Message());
    }
	catch (const exception& e2)
    {
		UI::GetUI()->NXMessageBox()->Show("Exception", NXOpen::NXMessageBox::DialogTypeError, e2.what());
    }
	catch (...)
    {
		UI::GetUI()->NXMessageBox()->Show("Exception", NXOpen::NXMessageBox::DialogTypeError, "Unknown Exception.");
    }
	UF_terminate();
}


//------------------------------------------------------------------------------
// Unload Handler
//------------------------------------------------------------------------------
extern "C" DllExport int ufusr_ask_unload()
{
	return (int)NXOpen::Session::LibraryUnloadOptionImmediately;
}


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

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

相关文章

浅谈MySQL的B树索引与索引优化

MySQL的MyISAM、InnoDB引擎默认均使用B树索引&#xff08;查询时都显示为“BTREE”&#xff09;&#xff0c;本文讨论两个问题&#xff1a; 为什么MySQL等主流数据库选择B树的索引结构&#xff1f;如何基于索引结构&#xff0c;理解常见的MySQL索引优化思路&#xff1f; 为什…

火锅底料加工厂污废水如何处理达标排放

火锅底料加工厂作为食品加工行业的一员&#xff0c;其生产过程中不可避免地会产生大量的污废水。为了保护环境和维护公共健康&#xff0c;火锅底料加工厂应当采取措施对污废水进行处理&#xff0c;使其达到国家相关排放标准。那么&#xff0c;火锅底料加工厂污废水该如何处理才…

ffmpeg单张图片生成固定时长的视频

ffmpeg -r 25 -f image2 -loop 1 -i fps_1.jpg -vcodec libx264 -pix_fmt yuv420p -s 1080*1920 -r 25 -t 30 -y fps.mp4这个命令将 fps_1.jpg 图片转换为一个 30 秒长的视频&#xff0c;分辨率为 1920x1080&#xff0c;帧率为 25 帧/秒&#xff0c;并使用 libx264 编码器进行压…

数据中心GPU集群高性能组网技术分析

数据中心GPU集群组网技术是指将多个GPU设备连接在一起&#xff0c;形成一个高性能计算的集群系统。通过集群组网技术&#xff0c;可以实现多个GPU设备之间的协同计算&#xff0c;提供更大规模的计算能力&#xff0c;适用于需要大规模并行计算的应用场景。 常用的组网技术&…

HTML5+CSS3小实例:环绕小球弹性loading动画

实例:环绕小球弹性loading动画 技术栈:HTML+CSS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge&quo…

C# WPF编程-创建项目

1.创建新项目 选择“WPF应用程序”》“下一步” 2. 设置项目 设置项目名称&#xff0c;保存位置等参数>下一步 3.选择框架 4.项目创建成功 5.运行项目

Failed to build tree: parent link [base_link] of joint [lidar_joint] not found

参考&#xff1a; Failed to build tree: parent link [base_link] of joint 在古月居gazebo 的基础教程里&#xff0c;运行古月居的mbot的launch文件报错&#xff0c;小机器人不出现。 主要原因是提供的xacro文件的宏定义没有放在xacro的命名空间。 解决&#xff1a; 将<mb…

网络编程第二天

1.基于TCP的通信(面向连接的通信) 服务器代码实现&#xff1a; #include <myhead.h> #define IP "192.168.126.91" #define PORT 9999 int main(int argc, const char *argv[]) {//1、创建套接字int sfd-1;if((sfdsocket(AF_INET,SOCK_STREAM,0))-1){perror(…

ROS 2基础概念#2:节点(Node)| ROS 2学习笔记

ROS 2节点简介 节点是执行计算的进程。节点组合在一起形成一个图&#xff08;graph&#xff09;&#xff0c;并使用主题&#xff08;topic&#xff09;、服务&#xff08;service&#xff09;和参数服务器&#xff08;paramter server&#xff09;相互通信。这些节点旨在以细粒…

Ps:路径面板

Ps菜单&#xff1a;窗口/路径 Window/Paths “路径”面板 Paths Panel提供了一系列功能&#xff0c;使用户能够创建、编辑、保存和利用路径。 ◆ ◆ ◆ 路径分类 在“路径”面板上的路径可分为五大类。 常规路径 Saved Path 也称“已保存的路径”&#xff0c;指的是已经存储在…

【三维重建】【SLAM】SplaTAM:基于3D高斯的密集RGB-D SLAM

题目&#xff1a;SplaTAM: Splat, Track & Map 3D Gaussians for Dense RGB-D SLAM 地址&#xff1a;spla-tam.github.io 机构&#xff1a;CMU&#xff08;卡内基梅隆大学&#xff09;、MIT&#xff08;美国麻省理工&#xff09; 总结&#xff1a;SplaTAM&#xff0c;一个新…

MyBatis 学习(三)之 MyBatis 全局配置文件

目录 1 MyBatis 全局配置文件 2 properties 元素 3 setting 设置 4 typeAlianses 别名处理器 5 typeHandler 类型处理器 6 objectFacotry 对象工厂&#xff08;了解&#xff09; 7 plugins 插件&#xff08;了解&#xff09; 8 environments 运行环境 9 databaseIdPro…

如何对酒店开展科学的定岗定编——以酒店健身房、娱乐房为例

近年来&#xff0c;随着旅游行业的快速发展&#xff0c;也带动了酒店业的兴盛。酒店的经营效益不仅受益于旅游业&#xff0c;同时也受制于旅游行业。由于旅游业存在明显的季节性差异&#xff0c;旅游旺季客流量多、淡季客流量少&#xff0c;造成人员忙闲不均的问题。酒店行业也…

怎么恢复删除的文件?6种有效的数据恢复方法汇总!

怎么才能恢复被删掉的数据啊&#xff1f;现在都是数字化时代了&#xff0c;我们的电脑里装了好多重要数据&#xff0c;一旦丢了&#xff0c;可是会给我们的工作和生活带来极大的麻烦啊。所以&#xff0c;学几招有效的电脑数据恢复方法是挺有必要的。下面&#xff0c;我就给大家…

C# 高阶语法 —— Winfrom链接SQL数据库的存储过程

存储过程在应用程序端的使用的优点 1 如果sql语句直接写在客户端&#xff0c;以一个字符串的形式体现的&#xff0c;提示不友好&#xff0c;会导致效率降低 2 sql语句写在客户端&#xff0c;可以利用sql注入进行攻击&#xff0c;为了安全性&#xff0c;可以把sql封装在…

出现 ‘vue‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件的解决方法(图文界面)

目录 前言1. 问题所示2. 原理分析3. 解决方法前言 由于Java转全栈,对此前端的细节点都比他人更加注意,所以此处记录更有用的信息!(小白都能看懂) 1. 问题所示 出现如下问题: F:\vue_project>vue -version vue 不是内部或外部命令,也不是可运行的程序 或批处理文件…

CUDA C:查看GPU设备信息

相关阅读 CUDA Chttps://blog.csdn.net/weixin_45791458/category_12530616.html?spm1001.2014.3001.5482 了解自己设备的性能是很有必要的&#xff0c;为此CUDA 运行时(runtime)API给用户也提供了一些查询设备信息的函数&#xff0c;下面的函数用于查看GPU设备的一切信息。 …

挑战30天学完Python:Day29 API开发

&#x1f389; 本系列为Python基础学习&#xff0c;原稿来源于 30-Days-Of-Python 英文项目&#xff0c;大奇主要是对其本地化翻译、逐条验证和补充&#xff0c;想通过30天完成正儿八经的系统化实践。此系列适合零基础同学&#xff0c;或仅了解Python一点知识&#xff0c;但又没…

如何在Node.js中使用定时器

在Node.js中使用定时器是一项常见且重要的任务&#xff0c;特别是在需要执行定时任务或者轮询操作的情况下。Node.js提供了多种方式来实现定时器功能&#xff0c;包括setTimeout、setInterval和setImmediate等方法。本篇博客将介绍如何在Node.js中使用这些定时器&#xff0c;并…

【STM32】STM32学习笔记-独立看门狗和窗口看门狗(47)

00. 目录 文章目录 00. 目录01. WDG概述02. 独立看门狗相关API2.1 IWDG_WriteAccessCmd2.2 IWDG_SetPrescaler2.3 IWDG_SetReload2.4 IWDG_ReloadCounter2.5 IWDG_Enable2.6 IWDG_GetFlagStatus2.7 RCC_GetFlagStatus 03. 独立看门狗接线图04. 独立看门狗程序示例105. 独立看门…