實例:NX二次開發抽取平面以及標準柱面中心線

一、概述

????????最近體驗許多外掛,包括胡波外掛、星空外掛及模圣等都有抽取面的中心線,由于剛剛學習,我嘗試看看能不能做出來,本博客代碼沒有封裝函數,代碼有待改進,但基本可以實現相應的功能。

二、案例實現的功能

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 environmentMyClass::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 hereL10:// TODO: add your code hereint 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 instanceMyClass *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.pswp.cn/news/710642.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/710642.shtml
英文地址,請注明出處:http://en.pswp.cn/news/710642.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【web APIs】3、(學習筆記)有案例!

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、概念其他事件頁面加載事件元素滾動事件頁面尺寸事件 元素尺寸與位置 二、案例舉例電梯導航 前言 掌握阻止事件冒泡的方法理解事件委托的實現原理 一、概念…

SpringCloud Alibaba(保姆級入門及操作)

第一章 微服務概念 1.0 科普一些術語 科普一下項目開發過程中常出現的術語,方便后續內容的理解。 **服務器:**分軟件與硬件,軟件:類型tomcat這種跑項目的程序, 硬件:用來部署項目的電腦(一般性能比個人電腦好) **服務:**操作系統上術語:一個程序,開發中術語:一個…

數學建模【分類模型】

一、分類模型簡介 本篇將介紹分類模型。對于二分類模型&#xff0c;我們將介紹邏輯回歸&#xff08;logistic regression&#xff09;和Fisher線性判別分析兩種分類算法&#xff1b;對于多分類模型&#xff0c;我們將簡單介紹SPSS中的多分類線性判別分析和多分類邏輯回歸。 分…

Java面試題之并發

并發 1.并發編程的優缺點&#xff1f;2.并發編程三要素&#xff1f;3.什么叫指令重排&#xff1f;4.如何避免指令重排&#xff1f;5.并發&#xff1f;并行&#xff1f;串行&#xff1f;6.線程和進程的概念和區別&#xff1f;7.什么是上下文切換&#xff1f;8.守護線程和用戶線程…

<網絡安全>《60 概念講解<第七課 網絡模型OSI對應協議>》

1 OSI模型 OSI模型&#xff08;Open Systems Interconnection Model&#xff09;是一個由國際標準化組織&#xff08;ISO&#xff09;提出的概念模型&#xff0c;用于描述和標準化電信或計算系統的通信功能&#xff0c;以實現不同通信系統之間的互操作性。該模型將通信系統劃分…

【k8s管理--Helm包管理器】

1、Helm的概念 Kubernetes包管器 Helm是查找、分享和使用軟件構件Kubernetes的最優方式。 Helm管理名為chart的Kubernetes包的工具。Helm可以做以下的事情&#xff1a; 從頭開始創建新的chat將chart打包成歸檔tgz)文件與存儲chat的倉庫進行交互在現有的Kubernetes集群中安裝和…

【Android】View 的滑動

View 的滑動是 Android 實現自定義控件的基礎&#xff0c;同時在開發中我們也難免會遇到 View 的滑動處理。其實不管是哪種滑動方式&#xff0c;其基本思想都是類似的&#xff1a;當點擊事件傳到 View 時&#xff0c;系統記下觸摸點的坐標&#xff0c;手指移動時系統記下移動后…

【AI+應用】怎么快速制作一個類chatGPT套殼網站

最近有人問我&#xff0c; 看了我之前寫的一篇文章 [人工智能] AI浪潮下Sora對于普通人的機會 &#xff0c; 怎么做一個類chatGPT的套殼網站&#xff0c;是從0開始做么。 對于普通人來說&#xff0c;萬事不懂先AI&#xff0c; AI找不到答案搜索google或百度。對于程序員來說…

C# 獲取類型 Type.GetType()

背景 C#是強類型語言&#xff0c;任何對象都有Type&#xff0c;有時候需要使用Type來進行反射、序列化、篩選等&#xff0c;獲取Type有Type.GetType, typeof()&#xff0c;object.GetType() 等方法&#xff0c;本文重點介紹Type.GetType()。 系統類型/本程序集內的類型 對于系…

有哪些視頻媒體?邀請視頻媒體報道活動的好處

傳媒如春雨&#xff0c;潤物細無聲&#xff0c;大家好&#xff0c;我是51媒體網胡老師。 視頻媒體在當今的媒體生態中占據了重要的地位。以下是一些主要的視頻媒體類型&#xff1a; 電視臺&#xff1a;如中央電視臺、各省級衛視臺、地方電視臺等&#xff0c;他們擁有專業的視…

學習linux從0到初級工程師-3

一、LNMP 1.1 搭建LNMP LNMP&#xff1a;LinuxNginxMysqlPHP LNMP優勢&#xff1a; 1.web服務器一種&#xff0c;Nginx處理靜態文件、索引文件&#xff0c;自動索引的效率非常高&#xff1b; 2.作為代理服務器,Nginx可以實現無緩存的反向代理加速&#xff0c;提高網站運行…

探索Redis 6.0的新特性

Redis&#xff08;Remote Dictionary Server&#xff09;是一個開源的內存中數據結構存儲系統&#xff0c;通常被用作緩存、消息隊列和實時數據處理等場景。它的簡單性、高性能以及豐富的數據結構支持使其成為了眾多開發者和企業的首選。在Redis 6.0版本中&#xff0c;引入了一…

Vue3報錯Promise executor functions should not be async.

解決方法 加注釋。。。// eslint-disable-next-line no-async-promise-executor // eslint-disable-next-line no-async-promise-executor new Promise<boolean>(async (resolve, reject) > {... }),

Ubuntu綁定USB接口到固定端口

綁定端口 打開終端&#xff0c;輸入以下命令查看USB端口信息&#xff1a; udevadm info -a -n /dev/ttyUSB0執行后&#xff0c;可以看到部分輸出如下: 找到第一個&#xff0c;a-b:c格式的KERNELS&#xff0c;記住這個值&#xff0c;后面會用到。 linlin-B660M-D2H-DDR4:~$ u…

【深藍學院】移動機器人運動規劃--第7章 集群機器人運動規劃--筆記

文章目錄 0. Contents1. Multi-Agent Path Finding (MAPF)1.1 HCA*1.2 Single-Agent A*1.3 ID1.4 M*1.5 Conflict-Based Search(CBS)1.6 ECBS1.6.1 heuristics1.6.2 Focal Search 2. Velocity Obstacle (VO&#xff0c;速度障礙物)2.1 VO2.2. RVO2.3 ORCA 3. Flocking model&am…

【每日前端面經】2023-02-29

題目來源: 牛客 如何理解前端這個崗位 簡單地說就是設計師做好網頁效果圖&#xff0c;前端將效果圖轉化成頁面&#xff0c;之后交給后端程序員&#xff0c;中間的這段工作就是前端 瀏覽器如何渲染HTML 將載入的HTML文件解析成DOM樹&#xff0c;并且將各個標記標識解析成DOM…

SQL的窗口函數

SQL的窗口函數 文章目錄 SQL的窗口函數1. 介紹2. 聚合函數0.數據準備1. AVG2. COUNT3. MAX4. MIN5. 標準差6. SUM 3. 排序函數1. CUME_DIST2. RANK, DENSE_RANK, ROW_NUMBER3. PERCENT_RANK4. NTILE 4. 值函數(偏移函數)1. FIRST_VALUE2. LAST_VALUE3. LAG4. LEAD5. NTH_VALUE …

ChatGPT4.0 的優勢、升級 4.0 為什么這么難以及如何進行升級?

前言 “ChatGPT4.0一個月多少人民幣&#xff1f;” ”chatgpt4賬號“ ”chatgpt4 價格“ “chatgpt4多少錢” 最近發現很多小伙伴很想知道關于ChatGPT4.0的事情&#xff0c;于是寫了這篇帖子&#xff0c;幫大家分析一下。 一、ChatGPT4.0 的優勢 &#xff08;PS&#xff1a;…

LINUX基礎培訓二十七之shell標準輸入、輸出、錯誤

一、Shell 輸入/輸出重定向 大多數 UNIX 系統命令從你的終端接受輸入并將所產生的輸出發送回??到您的終端。一個命令通常從一個叫標準輸入的地方讀取輸入&#xff0c;默認情況下&#xff0c;這恰好是你的終端。同樣&#xff0c;一個命令通常將其輸出寫入到標準輸出&#xff…

【樹莓派系統配置+python3.8+環境配置踩坑點匯總】raspberrypi

最近又開始搞樹莓派的深度學習模型。很多windows端的環境需要在樹莓派上重新部署&#xff0c;中間出現了非常多的問題。主要以各種庫的下載安裝為主要。 首先&#xff0c;第一個問題&#xff1a; 樹莓派系統燒錄之后&#xff0c;默認apt一般需要升級看&#xff0c;而默認下載…