一、概述
最近学习曲线命令,前几天看到,在NX二次开发群里有人推了一篇关于写求取封闭曲线面积的文章。之前我已经写过一篇博客了,今天讲这些函数进行封装到自己的NX二次开发库中,方便今后调用,由于自身不是计算机科本出身,基础较差,先基本的封装一下,最后有时间,或者学到新的方法再次封装,目前自己的函数运行基本没什么问题。半年前自己还是不会安装VS软件的人,利用打游戏时间学习,现在已经可以开发出简单的NX小插件了(下图显示的是包含界面的,还有好多练习的功能没有放),废话不说了进入正题。
上一篇已经实现了该功能,本次采用另一种方法思路进行编写。
二、功能解析
1、NX二次开发批量判断相连曲线是否封闭
2、批量获得相连曲线是否封闭及其相连曲线的tag值
三、代码解析
自己封装的函数如下:GetLinkOrTangencyEdge2()
/***************************************************************************************************
**Function: GetLinkOrTangencyEdge2 批量获取相连曲线是否封闭及TAG值
**input: vecLinkOrTangencyEdge2 存放相连曲线的tag值;vecEdge对象选择器选中对象的tag值
**output: vector<int> 判断各相连曲线是否封闭:1,封闭;0,不封闭
****************************************************************************************************/
vector<int> GetLinkOrTangencyEdge2(vector<vector<tag_t>>& vecLinkOrTangencyEdge2, vector<tag_t> vecEdge2)
{
std::vector<CurveData> allCurveVec;
for (int k = 0; k < vecEdge2.size(); k++)
{
//这里是基于NX的获取曲线端点的方法,其他环境下相应更换
CurveData data = UserUFBaseFun::getVerOfCurve(vecEdge2[k]);
allCurveVec.push_back(data);
}
//查找相连曲线的tag
vector<int> CurveIsClose;
std::vector<tag_t> currentCurveTag;
std::vector<bool> used(allCurveVec.size(), false);
for (size_t i = 0; i < allCurveVec.size(); ++i)
{
if (used[i]) continue; // 跳过已经处理过的线段
std::vector<CurveData> currentCurve;
currentCurve.push_back(allCurveVec[i]);
currentCurveTag.push_back(currentCurve.back().curve_tag);//得到相连曲线的tag值
used[i] = true;
bool curveClosed = false;
while (!curveClosed)
{
curveClosed = true;
for (size_t j = 0; j < allCurveVec.size(); ++j)
{
。。。。。。。
}
}
vecLinkOrTangencyEdge2.push_back(currentCurveTag);
currentCurveTag.clear();
// 检查闭环是否完整(起点等于终点)
if (currentCurve.size()>2 && UserUFBaseFun::IsSamePoint(currentCurve.back().end, currentCurve.front().start))
{
CurveIsClose.push_back(1);
}
else if (currentCurve.size() == 1 && UF_MODL_ask_curve_closed(currentCurve.back().curve_tag) == 1)
{
CurveIsClose.push_back(1);
}
else
{
CurveIsClose.push_back(0);
}
}
return CurveIsClose;
}
int NXopenC_Ask_CloseCurveArea::update_cb(NXOpen::BlockStyler::UIBlock* block)
{
try
{
if(block == selection0)
{
//---------Enter your code here-----------
std::vector<NXOpen::TaggedObject*> Object = selection0->GetSelectedObjects();
vector<tag_t> curveTag;
for (int i = 0; i < (int)Object.size(); i++)
{
curveTag.push_back(Object[i]->Tag());
}
vector<vector<tag_t>> vecLinkOrTangencyEdge;
vector<int> CurveIsClose = UserUFBaseFun::GetLinkOrTangencyEdge2(vecLinkOrTangencyEdge, curveTag);
for (int j = 0; j < (int)vecLinkOrTangencyEdge.size(); j++)
{
for (int m = 0; m < (int)vecLinkOrTangencyEdge[j].size(); m++)
{
char msg[256];
sprintf(msg, "%d", (vecLinkOrTangencyEdge[j])[m]);
UserUFBaseFun::PrintMessage(msg, false);
}
if (CurveIsClose[j] == 1)
{
UserUFBaseFun::PrintMessage("曲线围成的图形封闭");
}
else
{
UserUFBaseFun::PrintMessage("曲线围成的图形不封闭");
}
UserUFBaseFun::PrintMessage("\n");
}
}
}
catch(exception& ex)
{
//---- Enter your exception handling code here -----
NXopenC_Ask_CloseCurveArea::theUI->NXMessageBox()->Show("Block Styler", NXOpen::NXMessageBox::DialogTypeError, ex.what());
}
return 0;
}