事情的原油~
昨天晚上半夜12点半。
录制连接曲线NXOPEN代码又不会录制,自己在谷歌上面找的一段代码,抄下来用,还真的做出来了。不得不佩服人家出国找资料的能力,
抄代码也是一绝啊,总比一些人成天吵着百度搜不到资料,资料太少要厉害的多。
但是他只会抄,也不会改,曲线的颜色也不是他想要的。
自己不会改颜色,跟他唠了一会,我觉得蛮好玩的,龙哥这人挺有意思的,我们同姓算是本家兄弟,虽然不是很熟。
就写了个例子给他。也记录一下录NXOPEN代码,改代码,转换等问题。
这个例子很简单,但是却很好的运用各种类型的转换。很多人不会用NXOPEN绝对不是因为不会录代码而不会,
绝大部分应该都是录出来的代码太多,不会改代码,不会数据类型转换,不会和UFUN结合传参。
而卡在门外,只默默的用UFUN。
例子中的所有代码,在帮助文档里全部可以查的到出处。
- 版本
NX11+VS2013
- 例子
创建连接曲线,并设置颜色。
UFUN C + NXOPEN C++ 混合编程
- 演示
- 源代码
//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.找到连接曲线命令,录制一下它
录出来的代码如下,有一大堆,看着头疼,所以很多人不愿意用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艹一样适用,看懂原理就行了)
一大堆,看不懂也没关系,能看懂多少就看懂多少。有个认知就行了。
回到我们的例子当中来
凡是带UndoMarkId的全部是不要的
删完也就剩下这些了,还是有不少
格式都是固定的了,直接抄过去到项目里。
我们要改的就一个地方,就是传参的地方。就这两句
我们录制命令的时候,是直接选择的边,但是它把块都给录上了。变成了先找块,在找块的某一边。
下面我们开始修改代码,块对我们是不需要的,我们只要对话框选边,传参边的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>
下面关于各种类型的一些简单介绍,在我们的例子当中,录制出来的是生成连接曲线特征,想要设置颜色只能对曲线设置颜色,不能对特征设置颜色,所以我们还要提取出特征里的曲线。
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 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对象
NXOpen::Features::JoinCurves *joinCurves1是连接曲线特征类型
在Features类里
得到了Features::JoinCurves *joinCurves1类型后,我们还要去帮助里面翻这个类里的函数方法,
看有没有获得这个曲线特征(Feature)里样条曲线对象(Spline)的,这里可能会有人问为啥是Spline类型,
而不是line或者circle类型。
答案就是上面我们录制出来的代码就是Spline对象类型,说明它就是Spline。
不相信的话,还可以自己拿移刀去查看下。
下面去找获得连接曲线特征里的样条曲线对象方法
就是这个
其实我也不知道是这个,反正是挨个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;
这段代码也是录制出来的,只要把转换的那一句传参数改掉就行了,
重点是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()返回的也是个字符串对象的名字
没办法,英语不会,软肋,全程靠翻译。
方法2单段录制,跟上一种差不多。
就是先录连接曲线的代码,然后停掉,
在开始录制修改颜色的代码,录它类型转换,find对象的代码。
要的就是数据类型,和输入输出参数。
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日