事情的原油~

昨天晚上半夜12点半。

录制连接曲线NXOPEN代码又不会录制,自己在谷歌上面找的一段代码,抄下来用,还真的做出来了。不得不佩服人家出国找资料的能力,

抄代码也是一绝啊,总比一些人成天吵着百度搜不到资料,资料太少要厉害的多。

但是他只会抄,也不会改,曲线的颜色也不是他想要的。

自己不会改颜色,跟他唠了一会,我觉得蛮好玩的,龙哥这人挺有意思的,我们同姓算是本家兄弟,虽然不是很熟。

就写了个例子给他。也记录一下录NXOPEN代码,改代码,转换等问题。

这个例子很简单,但是却很好的运用各种类型的转换。很多人不会用NXOPEN绝对不是因为不会录代码而不会,

绝大部分应该都是录出来的代码太多,不会改代码,不会数据类型转换,不会和UFUN结合传参。

而卡在门外,只默默的用UFUN。

例子中的所有代码,在帮助文档里全部可以查的到出处。

 

  • 版本

NX11+VS2013

 

  • 例子

创建连接曲线,并设置颜色。

UFUN C + NXOPEN C++ 混合编程

 

  • 演示

NX二次开发-一个简单的连接曲线例子剖析学会如何使用NXOPEN做二次开发_#include

 

  • 源代码



//Demo

// 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>

//头文件
#include <uf.h>
#include <uf_ui.h>
#include <uf_modl.h>
#include <uf_obj.h>
#include <uf_disp.h>
#include <uf_curve.h>

#include <NXOpen/Edge.hxx>
#include <NXOpen/EdgeTangentRule.hxx>
#include <NXOpen/Features_Block.hxx>
#include <NXOpen/Features_FeatureCollection.hxx>
#include <NXOpen/ScRuleFactory.hxx>
#include <NXOpen/NXObjectManager.hxx>
#include <NXOpen/Features_JoinCurves.hxx>
#include <NXOpen/Features_JoinCurvesBuilder.hxx>
#include <NXOpen/Preferences_ObjectPreferences.hxx>
#include <NXOpen/Preferences_PartObject.hxx>
#include <NXOpen/Preferences_PartPreferences.hxx>
#include <NXOpen/Spline.hxx>
#include <NXOpen/DisplayManager.hxx>
#include <NXOpen/DisplayModification.hxx>
#include <NXOpen/DisplayableObject.hxx>

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

using namespace NXOpen;
using std::string;
using std::exception;
using std::stringstream;
using std::endl;
using std::cout;
using std::cerr;


//------------------------------------------------------------------------------
// 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:
Part *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()->Work();
displayPart = theSession->Parts()->Display();

}

//------------------------------------------------------------------------------
// 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);
}



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_solid_type, UF_all_subtype, UF_UI_SEL_FEATURE_ANY_EDGE }//定义选择边类型
};
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;
}
}


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

// TODO: add your code here

UF_initialize();

L10:

//打开单对象选择对话框
char sCue[] = "请选择实体的边";
char sTitle[] = "选择边";
int iScope = UF_UI_SEL_SCOPE_WORK_PART;
int iResponse = 0;
tag_t tObject = NULL_TAG;
double adCursor[3];
tag_t tView = NULL_TAG;
UF_UI_select_with_single_dialog(sCue, sTitle, iScope, init_proc, NULL, &iResponse, &tObject, adCursor, &tView);
if (iResponse == UF_UI_OK || iResponse == UF_UI_OBJECT_SELECTED || iResponse == UF_UI_OBJECT_SELECTED_BY_NAME)
{
//取消高亮
UF_DISP_set_highlight(tObject, 0);

//创建连接曲线
NXOpen::Features::Feature *nullNXOpen_Features_Feature(NULL);
NXOpen::Features::JoinCurvesBuilder *joinCurvesBuilder1;
joinCurvesBuilder1 = workPart->Features()->CreateJoinCurvesBuilder(nullNXOpen_Features_Feature);
joinCurvesBuilder1->SetDistanceTolerance(0.001);//设定距离公差
joinCurvesBuilder1->SetAngleTolerance(0.050000000000000003); //设定角度公差
//返回收集要连接的输入曲线的部分
joinCurvesBuilder1->Section()->SetDistanceTolerance(0.001);
joinCurvesBuilder1->Section()->SetChainingTolerance(0.00095);
joinCurvesBuilder1->Section()->SetAngleTolerance(0.050000000000000003);
joinCurvesBuilder1->Section()->SetAllowedEntityTypes(NXOpen::Section::AllowTypesOnlyCurves);
//传入选择的边tag
NXOpen::Edge *edge1(dynamic_cast<NXOpen::Edge *>(NXOpen::NXObjectManager::Get(tObject)));//此处修改边的tag
NXOpen::Edge *nullNXOpen_Edge(NULL);
NXOpen::EdgeTangentRule *edgeTangentRule1;
edgeTangentRule1 = workPart->ScRuleFactory()->CreateRuleEdgeTangent(edge1, nullNXOpen_Edge, true, 0.050000000000000003, false, false);
joinCurvesBuilder1->Section()->AllowSelfIntersection(true);
std::vector<NXOpen::SelectionIntentRule *> rules1(1);
rules1[0] = edgeTangentRule1;
NXOpen::NXObject *nullNXOpen_NXObject(NULL);
NXOpen::Point3d helpPoint1(0, 0, 0);
joinCurvesBuilder1->Section()->AddToSection(rules1, edge1, nullNXOpen_NXObject, nullNXOpen_NXObject, helpPoint1, NXOpen::Section::ModeCreate, false);
NXOpen::NXObject *nXObject1;
nXObject1 = joinCurvesBuilder1->Commit();//生成连接曲线特征

//将joinCurvesBuilder1生成的NXObject对象转换成Features::JoinCurves连接曲线对象(它是特征类型,并不是曲线类型),怎么转换的,录制得出来的(方式1)
NXOpen::Features::JoinCurves *joinCurves1(dynamic_cast<NXOpen::Features::JoinCurves *>(nXObject1));

////另外一种录制出来的转换方式(方式2)
//NXOpen::Features::JoinCurves *joinCurves1(dynamic_cast<NXOpen::Features::JoinCurves *>(workPart->Features()->FindObject(nXObject1->JournalIdentifier())));

//返回连接曲线特征创建的曲线对象(NXOPEN方式)
std::vector< NXOpen::NXObject *>spline = joinCurves1->GetEntities();

//提取连接曲线特征里的曲线对象(UFUN方式)
int num_curves = 0;
tag_t *feature_curves = NULL_TAG;
UF_CURVE_ask_feature_curves(joinCurves1->Tag(), &num_curves, &feature_curves);

//输出类型
int type, subtype = 0;
UF_OBJ_ask_type_and_subtype(spline[0]->Tag(), &type, &subtype);

//获得首选项-对象-样条的颜色(这一步有点多此一举了,首选项是什么颜色,创建出来的样条就应该是什么颜色,不需要第二次在设置曲线颜色的,这里只是例子需要)
int color_num = workPart->Preferences()->ObjectPreferences()->GetColor(Preferences::PartObject::ObjectTypeSpline);

////设置曲线颜色(UFUN)
//UF_OBJ_set_color(spline[0]->Tag(), color_num);

//设置曲线颜色(NXOPEN)
NXOpen::DisplayModification *displayModification1;
displayModification1 = theSession->DisplayManager()->NewDisplayModification();
displayModification1->SetApplyToAllFaces(true);
displayModification1->SetApplyToOwningParts(false);
displayModification1->SetNewColor(186);//颜色号码
std::vector<NXOpen::DisplayableObject *> objects1(1);
//转换
NXOpen::Spline *spline1(dynamic_cast<NXOpen::Spline *>(joinCurves1->FindObject(spline[0]->JournalIdentifier())));
objects1[0] = spline1;
displayModification1->Apply(objects1);
delete displayModification1;

//释放
UF_free(feature_curves);

goto L10;//跳转回去重新选
}



UF_terminate();

}

//------------------------------------------------------------------------------
// Entry point(s) for unmanaged internal NXOpen C/C++ programs
//------------------------------------------------------------------------------
// Explicit Execution
extern "C" DllExport void ufusr( char *parm, int *returnCode, int rlen )
{
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.");
}
}


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


阿飞
2021年8月29日


 

  • 内容主线

录制连接曲线→数据类型转换→对曲线设置颜色

 

  • 步骤剖析

挑重点的写,怎么搭建环境,怎么加头文件,怎么用UFUN函数,怎么录NXOPEN代码,不在文章写的范围。

1.录制连接曲线命令



//创建连接曲线
NXOpen::Features::Feature *nullNXOpen_Features_Feature(NULL);
NXOpen::Features::JoinCurvesBuilder *joinCurvesBuilder1;
joinCurvesBuilder1 = workPart->Features()->CreateJoinCurvesBuilder(nullNXOpen_Features_Feature);
joinCurvesBuilder1->SetDistanceTolerance(0.001);//设定距离公差
joinCurvesBuilder1->SetAngleTolerance(0.050000000000000003); //设定角度公差
//返回收集要连接的输入曲线的部分
joinCurvesBuilder1->Section()->SetDistanceTolerance(0.001);
joinCurvesBuilder1->Section()->SetChainingTolerance(0.00095);
joinCurvesBuilder1->Section()->SetAngleTolerance(0.050000000000000003);
joinCurvesBuilder1->Section()->SetAllowedEntityTypes(NXOpen::Section::AllowTypesOnlyCurves);
//传入选择的边tag
NXOpen::Edge *edge1(dynamic_cast<NXOpen::Edge *>(NXOpen::NXObjectManager::Get(tObject)));//此处修改边的tag
NXOpen::Edge *nullNXOpen_Edge(NULL);
NXOpen::EdgeTangentRule *edgeTangentRule1;
edgeTangentRule1 = workPart->ScRuleFactory()->CreateRuleEdgeTangent(edge1, nullNXOpen_Edge, true, 0.050000000000000003, false, false);
joinCurvesBuilder1->Section()->AllowSelfIntersection(true);
std::vector<NXOpen::SelectionIntentRule *> rules1(1);
rules1[0] = edgeTangentRule1;
NXOpen::NXObject *nullNXOpen_NXObject(NULL);
NXOpen::Point3d helpPoint1(0, 0, 0);
joinCurvesBuilder1->Section()->AddToSection(rules1, edge1, nullNXOpen_NXObject, nullNXOpen_NXObject, helpPoint1, NXOpen::Section::ModeCreate, false);
NXOpen::NXObject *nXObject1;
nXObject1 = joinCurvesBuilder1->Commit();//生成连接曲线特征


说说上面这段代码是怎么来的

1.找到连接曲线命令,录制一下它

NX二次开发-一个简单的连接曲线例子剖析学会如何使用NXOPEN做二次开发_#include_02

NX二次开发-一个简单的连接曲线例子剖析学会如何使用NXOPEN做二次开发_#include_03

录出来的代码如下,有一大堆,看着头疼,所以很多人不愿意用NXOPEN,没有UFUN简洁



// NX 11.0.2.7
// Journal created by Administrator on Sun Aug 29 13:23:58 2021 中国标准时间

//
#include <uf_defs.h>
#include <NXOpen/NXException.hxx>
#include <NXOpen/Session.hxx>
#include <NXOpen/Builder.hxx>
#include <NXOpen/Edge.hxx>
#include <NXOpen/EdgeTangentRule.hxx>
#include <NXOpen/Features_Block.hxx>
#include <NXOpen/Features_FeatureCollection.hxx>
#include <NXOpen/Features_JoinCurvesBuilder.hxx>
#include <NXOpen/GeometricUtilities_CurveOptions.hxx>
#include <NXOpen/NXObject.hxx>
#include <NXOpen/Part.hxx>
#include <NXOpen/PartCollection.hxx>
#include <NXOpen/ScRuleFactory.hxx>
#include <NXOpen/Section.hxx>
#include <NXOpen/SelectionIntentRule.hxx>
#include <NXOpen/Session.hxx>
using namespace NXOpen;

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

extern "C" DllExport void ufusr(char *param, int *retCode, int paramLen)
{
NXOpen::Session *theSession = NXOpen::Session::GetSession();
NXOpen::Part *workPart(theSession->Parts()->Work());
NXOpen::Part *displayPart(theSession->Parts()->Display());
// ----------------------------------------------
// Menu: 插入(S)->派生曲线(U)->连结(J)...
// ----------------------------------------------
NXOpen::Session::UndoMarkId markId1;
markId1 = theSession->SetUndoMark(NXOpen::Session::MarkVisibilityVisible, NXString("\345\274\200\345\247\213", NXString::UTF8));

NXOpen::Features::Feature *nullNXOpen_Features_Feature(NULL);
NXOpen::Features::JoinCurvesBuilder *joinCurvesBuilder1;
joinCurvesBuilder1 = workPart->Features()->CreateJoinCurvesBuilder(nullNXOpen_Features_Feature);

joinCurvesBuilder1->SetDistanceTolerance(0.001);

joinCurvesBuilder1->SetAngleTolerance(0.050000000000000003);

theSession->SetUndoMarkName(markId1, NXString("\350\277\236\347\273\223\346\233\262\347\272\277 \345\257\271\350\257\235\346\241\206", NXString::UTF8));

joinCurvesBuilder1->Section()->SetDistanceTolerance(0.001);

joinCurvesBuilder1->Section()->SetChainingTolerance(0.00095);

joinCurvesBuilder1->Section()->SetAngleTolerance(0.050000000000000003);

joinCurvesBuilder1->Section()->SetAllowedEntityTypes(NXOpen::Section::AllowTypesOnlyCurves);

NXOpen::Session::UndoMarkId markId2;
markId2 = theSession->SetUndoMark(NXOpen::Session::MarkVisibilityInvisible, "section mark");

NXOpen::Session::UndoMarkId markId3;
markId3 = theSession->SetUndoMark(NXOpen::Session::MarkVisibilityInvisible, NULL);

NXOpen::Features::Block *block1(dynamic_cast<NXOpen::Features::Block *>(workPart->Features()->FindObject("BLOCK(1)")));
NXOpen::Edge *edge1(dynamic_cast<NXOpen::Edge *>(block1->FindObject("EDGE * 1 * 3 {(0,0,100)(0,50,100)(0,100,100) BLOCK(1)}")));
NXOpen::Edge *nullNXOpen_Edge(NULL);
NXOpen::EdgeTangentRule *edgeTangentRule1;
edgeTangentRule1 = workPart->ScRuleFactory()->CreateRuleEdgeTangent(edge1, nullNXOpen_Edge, true, 0.050000000000000003, false, false);

joinCurvesBuilder1->Section()->AllowSelfIntersection(true);

std::vector<NXOpen::SelectionIntentRule *> rules1(1);
rules1[0] = edgeTangentRule1;
NXOpen::NXObject *nullNXOpen_NXObject(NULL);
NXOpen::Point3d helpPoint1(0.0, 47.283993560949256, 100.0);
joinCurvesBuilder1->Section()->AddToSection(rules1, edge1, nullNXOpen_NXObject, nullNXOpen_NXObject, helpPoint1, NXOpen::Section::ModeCreate, false);

theSession->DeleteUndoMark(markId3, NULL);

theSession->DeleteUndoMark(markId2, NULL);

NXOpen::Session::UndoMarkId markId4;
markId4 = theSession->SetUndoMark(NXOpen::Session::MarkVisibilityInvisible, NXString("\350\277\236\347\273\223\346\233\262\347\272\277", NXString::UTF8));

theSession->DeleteUndoMark(markId4, NULL);

NXOpen::Session::UndoMarkId markId5;
markId5 = theSession->SetUndoMark(NXOpen::Session::MarkVisibilityInvisible, NXString("\350\277\236\347\273\223\346\233\262\347\272\277", NXString::UTF8));

NXOpen::NXObject *nXObject1;
nXObject1 = joinCurvesBuilder1->Commit();

theSession->DeleteUndoMark(markId5, NULL);

theSession->SetUndoMarkName(markId1, NXString("\350\277\236\347\273\223\346\233\262\347\272\277", NXString::UTF8));

joinCurvesBuilder1->Destroy();

// ----------------------------------------------
// Menu: 工具(T)->操作记录(J)->停止录制(S)
// ----------------------------------------------
}


下面说哪些代码是要的,哪些是不要的

先看官方文档的介绍(C井的,对C艹一样适用,看懂原理就行了)​

NX二次开发-一个简单的连接曲线例子剖析学会如何使用NXOPEN做二次开发_d3_04

NX二次开发-一个简单的连接曲线例子剖析学会如何使用NXOPEN做二次开发_ide_05

NX二次开发-一个简单的连接曲线例子剖析学会如何使用NXOPEN做二次开发_c++_06

NX二次开发-一个简单的连接曲线例子剖析学会如何使用NXOPEN做二次开发_c++_07

NX二次开发-一个简单的连接曲线例子剖析学会如何使用NXOPEN做二次开发_ide_08

NX二次开发-一个简单的连接曲线例子剖析学会如何使用NXOPEN做二次开发_#include_09

NX二次开发-一个简单的连接曲线例子剖析学会如何使用NXOPEN做二次开发_d3_10

NX二次开发-一个简单的连接曲线例子剖析学会如何使用NXOPEN做二次开发_对象类型_11

NX二次开发-一个简单的连接曲线例子剖析学会如何使用NXOPEN做二次开发_#include_12

NX二次开发-一个简单的连接曲线例子剖析学会如何使用NXOPEN做二次开发_c++_13

NX二次开发-一个简单的连接曲线例子剖析学会如何使用NXOPEN做二次开发_d3_14

NX二次开发-一个简单的连接曲线例子剖析学会如何使用NXOPEN做二次开发_c++_15

NX二次开发-一个简单的连接曲线例子剖析学会如何使用NXOPEN做二次开发_c++_16

NX二次开发-一个简单的连接曲线例子剖析学会如何使用NXOPEN做二次开发_#include_17

NX二次开发-一个简单的连接曲线例子剖析学会如何使用NXOPEN做二次开发_#include_18

NX二次开发-一个简单的连接曲线例子剖析学会如何使用NXOPEN做二次开发_c++_19

NX二次开发-一个简单的连接曲线例子剖析学会如何使用NXOPEN做二次开发_c++_20

NX二次开发-一个简单的连接曲线例子剖析学会如何使用NXOPEN做二次开发_c++_21

 一大堆,看不懂也没关系,能看懂多少就看懂多少。有个认知就行了。

回到我们的例子当中来

凡是带UndoMarkId的全部是不要的

NX二次开发-一个简单的连接曲线例子剖析学会如何使用NXOPEN做二次开发_d3_22

 删完也就剩下这些了,还是有不少

NX二次开发-一个简单的连接曲线例子剖析学会如何使用NXOPEN做二次开发_d3_23

 格式都是固定的了,直接抄过去到项目里。

我们要改的就一个地方,就是传参的地方。就这两句

NX二次开发-一个简单的连接曲线例子剖析学会如何使用NXOPEN做二次开发_ide_24

我们录制命令的时候,是直接选择的边,但是它把块都给录上了。变成了先找块,在找块的某一边。

下面我们开始修改代码,块对我们是不需要的,我们只要对话框选边,传参边的tag就行了。



NXOpen::Edge *edge1(dynamic_cast<NXOpen::Edge *>(NXOpen::NXObjectManager::Get(tObject)));//此处修改边的tag


就这一句,就可以转换。tObject为边的tag,意思是将UFUN的边tag转换成NXOPEN的Edge类型(边),在NX二次开发中,不同的对象,都有自己不同的类型。这就涉及到了类型转换的问题。

转换传什么参数。它要什么,你传什么就行了,上面录制的时候,不是都已经看到了,FindObject里面要的是EDGE对象类型,那你就把你的UFUN边的tag给进去。

中间转换用NXOPEN的这个方法,注意要加头文件 #include <NXOpen/NXObjectManager.hxx>

NX二次开发-一个简单的连接曲线例子剖析学会如何使用NXOPEN做二次开发_对象类型_25

 下面关于各种类型的一些简单介绍,在我们的例子当中,录制出来的是生成连接曲线特征,想要设置颜色只能对曲线设置颜色,不能对特征设置颜色,所以我们还要提取出特征里的曲线。

NX二次开发-一个简单的连接曲线例子剖析学会如何使用NXOPEN做二次开发_ide_26

 2.类型转换,将连接曲线特征对象转换成曲线对象



//将joinCurvesBuilder1生成的NXObject对象转换成Features::JoinCurves连接曲线对象(它是特征类型,并不是曲线类型),怎么转换的,录制得出来的(方式1)
NXOpen::Features::JoinCurves *joinCurves1(dynamic_cast<NXOpen::Features::JoinCurves *>(nXObject1));

////另外一种录制出来的转换方式(方式2)
//NXOpen::Features::JoinCurves *joinCurves1(dynamic_cast<NXOpen::Features::JoinCurves *>(workPart->Features()->FindObject(nXObject1->JournalIdentifier())));

//返回连接曲线特征创建的曲线对象(NXOPEN方式)
std::vector< NXOpen::NXObject *>spline = joinCurves1->GetEntities();

//提取连接曲线特征里的曲线对象(UFUN方式)
int num_curves = 0;
tag_t *feature_curves = NULL_TAG;
UF_CURVE_ask_feature_curves(joinCurves1->Tag(), &num_curves, &feature_curves);

//输出类型
int type, subtype = 0;
UF_OBJ_ask_type_and_subtype(spline[0]->Tag(), &type, &subtype);


上面这段NXOPEN转换代码是怎么来的,将做详细介绍,UFUN的那段就不介绍了,现成的API翻帮助就行了。

怎么转换的,我也不知道,反正不知道,那就继续录制呗。

方法1连续录制

NX二次开发-一个简单的连接曲线例子剖析学会如何使用NXOPEN做二次开发_ide_27

录制出来的代码如下,你会发现又是一大堆,实质我们需要的就两段



// NX 11.0.2.7
// Journal created by Administrator on Sun Aug 29 13:54:41 2021 中国标准时间

//
#include <uf_defs.h>
#include <NXOpen/NXException.hxx>
#include <NXOpen/Session.hxx>
#include <NXOpen/Builder.hxx>
#include <NXOpen/DisplayManager.hxx>
#include <NXOpen/DisplayModification.hxx>
#include <NXOpen/DisplayableObject.hxx>
#include <NXOpen/Edge.hxx>
#include <NXOpen/EdgeTangentRule.hxx>
#include <NXOpen/Features_Block.hxx>
#include <NXOpen/Features_FeatureCollection.hxx>
#include <NXOpen/Features_JoinCurves.hxx>
#include <NXOpen/Features_JoinCurvesBuilder.hxx>
#include <NXOpen/GeometricUtilities_CurveOptions.hxx>
#include <NXOpen/NXObject.hxx>
#include <NXOpen/Part.hxx>
#include <NXOpen/PartCollection.hxx>
#include <NXOpen/ScRuleFactory.hxx>
#include <NXOpen/Section.hxx>
#include <NXOpen/SelectionIntentRule.hxx>
#include <NXOpen/Session.hxx>
#include <NXOpen/Spline.hxx>
#include <NXOpen/Update.hxx>
using namespace NXOpen;

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

extern "C" DllExport void ufusr(char *param, int *retCode, int paramLen)
{
NXOpen::Session *theSession = NXOpen::Session::GetSession();
NXOpen::Part *workPart(theSession->Parts()->Work());
NXOpen::Part *displayPart(theSession->Parts()->Display());
// ----------------------------------------------
// Menu: 插入(S)->派生曲线(U)->连结(J)...
// ----------------------------------------------
NXOpen::Session::UndoMarkId markId1;
markId1 = theSession->SetUndoMark(NXOpen::Session::MarkVisibilityVisible, NXString("\345\274\200\345\247\213", NXString::UTF8));

NXOpen::Features::Feature *nullNXOpen_Features_Feature(NULL);
NXOpen::Features::JoinCurvesBuilder *joinCurvesBuilder1;
joinCurvesBuilder1 = workPart->Features()->CreateJoinCurvesBuilder(nullNXOpen_Features_Feature);

joinCurvesBuilder1->SetDistanceTolerance(0.001);

joinCurvesBuilder1->SetAngleTolerance(0.050000000000000003);

theSession->SetUndoMarkName(markId1, NXString("\350\277\236\347\273\223\346\233\262\347\272\277 \345\257\271\350\257\235\346\241\206", NXString::UTF8));

joinCurvesBuilder1->Section()->SetDistanceTolerance(0.001);

joinCurvesBuilder1->Section()->SetChainingTolerance(0.00095);

joinCurvesBuilder1->Section()->SetAngleTolerance(0.050000000000000003);

joinCurvesBuilder1->Section()->SetAllowedEntityTypes(NXOpen::Section::AllowTypesOnlyCurves);

NXOpen::Session::UndoMarkId markId2;
markId2 = theSession->SetUndoMark(NXOpen::Session::MarkVisibilityInvisible, "section mark");

NXOpen::Session::UndoMarkId markId3;
markId3 = theSession->SetUndoMark(NXOpen::Session::MarkVisibilityInvisible, NULL);

NXOpen::Features::Block *block1(dynamic_cast<NXOpen::Features::Block *>(workPart->Features()->FindObject("BLOCK(1)")));
NXOpen::Edge *edge1(dynamic_cast<NXOpen::Edge *>(block1->FindObject("EDGE * 1 * 2 {(100,0,100)(50,0,100)(0,0,100) BLOCK(1)}")));
NXOpen::Edge *nullNXOpen_Edge(NULL);
NXOpen::EdgeTangentRule *edgeTangentRule1;
edgeTangentRule1 = workPart->ScRuleFactory()->CreateRuleEdgeTangent(edge1, nullNXOpen_Edge, true, 0.050000000000000003, false, false);

joinCurvesBuilder1->Section()->AllowSelfIntersection(true);

std::vector<NXOpen::SelectionIntentRule *> rules1(1);
rules1[0] = edgeTangentRule1;
NXOpen::NXObject *nullNXOpen_NXObject(NULL);
NXOpen::Point3d helpPoint1(57.771598781542366, 0.0, 100.0);
joinCurvesBuilder1->Section()->AddToSection(rules1, edge1, nullNXOpen_NXObject, nullNXOpen_NXObject, helpPoint1, NXOpen::Section::ModeCreate, false);

theSession->DeleteUndoMark(markId3, NULL);

theSession->DeleteUndoMark(markId2, NULL);

NXOpen::Session::UndoMarkId markId4;
markId4 = theSession->SetUndoMark(NXOpen::Session::MarkVisibilityInvisible, NXString("\350\277\236\347\273\223\346\233\262\347\272\277", NXString::UTF8));

theSession->DeleteUndoMark(markId4, NULL);

NXOpen::Session::UndoMarkId markId5;
markId5 = theSession->SetUndoMark(NXOpen::Session::MarkVisibilityInvisible, NXString("\350\277\236\347\273\223\346\233\262\347\272\277", NXString::UTF8));

NXOpen::NXObject *nXObject1;
nXObject1 = joinCurvesBuilder1->Commit();

theSession->DeleteUndoMark(markId5, NULL);

theSession->SetUndoMarkName(markId1, NXString("\350\277\236\347\273\223\346\233\262\347\272\277", NXString::UTF8));

joinCurvesBuilder1->Destroy();

// ----------------------------------------------
// Menu: 编辑(E)->对象显示(J)...
// ----------------------------------------------
// ----------------------------------------------
// Dialog Begin 颜色
// ----------------------------------------------
NXOpen::Session::UndoMarkId markId6;
markId6 = theSession->SetUndoMark(NXOpen::Session::MarkVisibilityVisible, "Edit Object Display");

NXOpen::DisplayModification *displayModification1;
displayModification1 = theSession->DisplayManager()->NewDisplayModification();

displayModification1->SetApplyToAllFaces(true);

displayModification1->SetApplyToOwningParts(false);

displayModification1->SetNewColor(186);

std::vector<NXOpen::DisplayableObject *> objects1(1);
NXOpen::Features::JoinCurves *joinCurves1(dynamic_cast<NXOpen::Features::JoinCurves *>(nXObject1));
NXOpen::Spline *spline1(dynamic_cast<NXOpen::Spline *>(joinCurves1->FindObject("CURVE 1")));
objects1[0] = spline1;
displayModification1->Apply(objects1);

int nErrs1;
nErrs1 = theSession->UpdateManager()->DoUpdate(markId6);

delete displayModification1;
// ----------------------------------------------
// Menu: 工具(T)->操作记录(J)->停止录制(S)
// ----------------------------------------------
}


就这两段,转换方法,录制给带出来了,我们只要改里面传的参数就行了



NXOpen::Features::JoinCurves *joinCurves1(dynamic_cast<NXOpen::Features::JoinCurves *>(nXObject1));
NXOpen::Spline *spline1(dynamic_cast<NXOpen::Spline *>(joinCurves1->FindObject("CURVE 1")));


我们发现nXObject1实际就是上面我们一开始录制连接曲线最后

        NXOpen::NXObject *nXObject1;

        nXObject1 = joinCurvesBuilder1->Commit();//生成连接曲线特征

生成的那个对象。这里它是个曲线特征对象,你可以拿UF_OBJ_ask_type_and_subtype去打印下它的类型



int type, subtype = 0;
UF_OBJ_ask_type_and_subtype(nXObject1->Tag(), &type, &subtype);


是#define UF_feature_type                         205类型

这段就是说把nXObject1转换成NXOpen::Features::JoinCurves *joinCurves1对象类型。因为上面JoinCurvesBuilder->Commit返回的是NXObject对象

NX二次开发-一个简单的连接曲线例子剖析学会如何使用NXOPEN做二次开发_c++_28

NXOpen::Features::JoinCurves *joinCurves1是连接曲线特征类型
在Features类里


NX二次开发-一个简单的连接曲线例子剖析学会如何使用NXOPEN做二次开发_对象类型_29

NX二次开发-一个简单的连接曲线例子剖析学会如何使用NXOPEN做二次开发_对象类型_30

 得到了Features::JoinCurves *joinCurves1类型后,我们还要去帮助里面翻这个类里的函数方法,

看有没有获得这个曲线特征(Feature)里样条曲线对象(Spline)的,这里可能会有人问为啥是Spline类型,

而不是line或者circle类型。

答案就是上面我们录制出来的代码就是Spline对象类型,说明它就是Spline。

不相信的话,还可以自己拿移刀去查看下。

NX二次开发-一个简单的连接曲线例子剖析学会如何使用NXOPEN做二次开发_c++_31

 NX二次开发-一个简单的连接曲线例子剖析学会如何使用NXOPEN做二次开发_#include_32

 下面去找获得连接曲线特征里的样条曲线对象方法

NX二次开发-一个简单的连接曲线例子剖析学会如何使用NXOPEN做二次开发_c++_33

 就是这个

NX二次开发-一个简单的连接曲线例子剖析学会如何使用NXOPEN做二次开发_#include_34

 其实我也不知道是这个,反正是挨个get去测试的,打印输出,刚好到它这里,输出的就是spline类型

下面直接拿它返回的NXObject去用UFUN设置颜色就行了



//将joinCurvesBuilder1生成的NXObject对象转换成Features::JoinCurves连接曲线对象(它是特征类型,并不是曲线类型),怎么转换的,录制得出来的(方式1)
NXOpen::Features::JoinCurves *joinCurves1(dynamic_cast<NXOpen::Features::JoinCurves *>(nXObject1));

//返回连接曲线特征创建的曲线对象(NXOPEN方式)
std::vector< NXOpen::NXObject *>spline = joinCurves1->GetEntities();

//输出类型
int type, subtype = 0;
UF_OBJ_ask_type_and_subtype(spline[0]->Tag(), &type, &subtype);

////设置曲线颜色(UFUN)
//UF_OBJ_set_color(spline[0]->Tag(), color_num);


如果不想用UFUN去设置颜色,想用NXOPEN设置颜色也可以的。



//设置曲线颜色(NXOPEN)
NXOpen::DisplayModification *displayModification1;
displayModification1 = theSession->DisplayManager()->NewDisplayModification();
displayModification1->SetApplyToAllFaces(true);
displayModification1->SetApplyToOwningParts(false);
displayModification1->SetNewColor(186);//颜色号码
std::vector<NXOpen::DisplayableObject *> objects1(1);
//转换
NXOpen::Spline *spline1(dynamic_cast<NXOpen::Spline *>(joinCurves1->FindObject(spline[0]->JournalIdentifier())));
objects1[0] = spline1;
displayModification1->Apply(objects1);
delete displayModification1;


这段代码也是录制出来的,只要把转换的那一句传参数改掉就行了,

NX二次开发-一个简单的连接曲线例子剖析学会如何使用NXOPEN做二次开发_c++_35

 重点是NXOpen::Spline *spline1(dynamic_cast<NXOpen::Spline *>(joinCurves1->FindObject("CURVE 1")));这句

里面传入的是CURVE对象类型

我们上面std::vector< NXOpen::NXObject *>spline = joinCurves1->GetEntities();返回的就是curve对象类型

spline是归属于curve的,line,arc等都是属于curve类型的。

我们拿这个参数值去传入进去



NXOpen::Spline *spline1(dynamic_cast<NXOpen::Spline *>(joinCurves1->FindObject(spline[0]->JournalIdentifier())));


至于为什么->JournalIdentifier()这样写,也是出自帮助的。

我们看上面joinCurves1->FindObject("")括号里写的是曲线对象的名字,直接find就是找到了,拿过来用。

而->JournalIdentifier()返回的也是个字符串对象的名字

NX二次开发-一个简单的连接曲线例子剖析学会如何使用NXOPEN做二次开发_c++_36

 NX二次开发-一个简单的连接曲线例子剖析学会如何使用NXOPEN做二次开发_c++_37

 没办法,英语不会,软肋,全程靠翻译。

 

方法2单段录制,跟上一种差不多。

就是先录连接曲线的代码,然后停掉,

在开始录制修改颜色的代码,录它类型转换,find对象的代码。

要的就是数据类型,和输入输出参数。

NX二次开发-一个简单的连接曲线例子剖析学会如何使用NXOPEN做二次开发_ide_38



NXOpen::Features::JoinCurves *joinCurves1(dynamic_cast<NXOpen::Features::JoinCurves *>(workPart->Features()->FindObject("JOIN_CURVE(54)")));


这句和上面那句是等价的,用哪个都可以的。

 更改传参方式,也是直接nXObject1->JournalIdentifier得到字符串的名字传入进去



////另外一种录制出来的转换方式(方式2)
//NXOpen::Features::JoinCurves *joinCurves1(dynamic_cast<NXOpen::Features::JoinCurves *>(workPart->Features()->FindObject(nXObject1->JournalIdentifier())));


 讲到这里这个例子也就结束了,

用NXOPEN的要点就是

1.会录代码

2.会删除没用不需要的代码

3.数据类型转换,更改传参的值,就跟你自己封装的函数,输入的参数是int还是double数据类型一回事,录出来的代码要啥对象类型,你就传啥

不知道怎么强制转换,没关系,那就去录代码。

 

几种转换方式

1.遇到FindObject的就传入用->JournalIdentifier()

2.遇到NXOPEN转UFUN的就直接->tag

3.遇到UFUN转NXOPEN的就直接NXOpen::NXObjectManager::Get(tag)


阿飞

2021年8月29日