在NX的二次开发中,我们经常需要选择实体和方向,如果每次手动选择,势必会影响调试的效率,那么有没有办法,让程序一启动就自动选择当前实体和方向呢,自然是有的。
经过我一番研究,因为可能有多个实体存在,所以如果加上一些限定条件,则可以实现自动选择准确的实体,如果实体只有一个,那么去掉选择条件也是可以的。
比如,我通过实体的面和特征数目同时成立的条件筛选实体。
直接上代码:
#include "NXOpen/Direction.hxx"
#include "NXOpen/DirectionCollection.hxx"
#if 1
//调试模式时,自动选择体和Z方向(Z方向可能选反)
const int nDstFaceCount = 41;
const int nDstFeatureCount = 5;
const double dZDir = 1.0; //取负值反向
Session *theSession = Session::GetSession();
Part *workPart(theSession->Parts()->Work());
BodyCollection *bcBodys = workPart->Bodies();
Body* pBody = nullptr;
//选择面数最多body
for (auto it = bcBodys->begin(); it != bcBodys->end(); ++it)
{
Body *pTmpBody = *it;
int nFaceCount = pTmpBody->GetFaces().size();
int nFeatureCount = pTmpBody->GetFeatures().size();
if (nFaceCount == nDstFaceCount && nFeatureCount == nDstFeatureCount)
{
pBody = pTmpBody;
break;
}
}
std::vector<TaggedObject*> vSelBody(1);
vSelBody[0] = pBody;
m_pBodySelect->AUTUMOONBLock_SetSelectedObjects(vSelBody);
tag_t tWCS;
UF_CSYS_ask_wcs(&tWCS);
UF_DISP_set_highlight(tWCS, 1);
Point3d origin1(0.0, 0.0, 330.0);
Vector3d vector1(0.0, 0.0, 1.0);
Direction *directionZ = workPart->Directions()->CreateDirection(origin1, vector1, SmartObject::UpdateOptionWithinModeling);
std::vector<TaggedObject*> vDirections(1);
vDirections[0] = directionZ;
m_pVector->AUTUMOONBLock_SetSelectedObjects(vDirections);
if (pBody)
{
//设置Core
m_Core->SetBodie(pBody);
m_Core->SetFroVec(AUTUMOONMathVector3d(0.0, 0.0, dZDir));
DoRec();
m_pFaceSelect->Focus();
}
#endif // _DEBUG
其中限定条件为面的数量和特征数量,根据实际情况修改即可。
部分不重要的代码的实现,因为项目原因无法公开,其实就是一些简单的宏定义展开而已。
欢迎交流与讨论。