小新 发表于 2014-4-7 19:26:05

如何找到实体的某个特定的面用于自动装配?

本帖最后由 小新 于 2014-4-7 19:51 编辑

我做自动化装配,通过代码定义好其约束关系。但是在具体实现过程中,不知道如何找到定义约束关系的某个实体上的特定的面。如图我想将图上箭头所指的面用于建立约束,但是不知道在代码中如何找到这个面。此外我是想用NX Open C++实现,而不是用UFun函数实现。

admin 发表于 2014-4-8 11:20:06

录制JA , 看看

要么就是通过几何判断了,遍历所有的面,找出比如面的法相是什么,面的类型,面的一些参数什么的 最终确定是你选择的那个面

或者直接找tag

小新 发表于 2014-4-8 15:21:21

admin 发表于 2014-4-8 11:20
录制JA , 看看

要么就是通过几何判断了,遍历所有的面,找出比如面的法相是什么,面的类型,面的一些参数 ...
我录制JA后,出现代码Face *face1(dynamic_cast<Face *>(block1->FindObject("FACE 4 {(250,100,50) BLOCK(1)}")));,如何直接用这个代码,确实可行。但是关键是,我总不可能,每要查找一个面就录制一个JA吧。我见到用UFun做的话,直接在Ug里,给这个面命名下,然后通过函数UF_OBJ_cylce_by_name,第一参数就是刚刚命名的名字。但是我想问问在NX Open C++是否有类似的做法

admin 发表于 2014-4-8 19:59:47

小新 发表于 2014-4-8 07:21
我录制JA后,出现代码Face *face1(dynamic_cast(block1->FindObject("FACE 4 {(250,100,50) BLOCK(1)}"))) ...

对的 最简单的方法就是用UFUN的 UF_OBJ_cylce_by_name 函数

NXOpen C++ 没有类似的这个功能

开发时候基本是 ufun + NXopen C++
单独的 NXOpen C++ 你可能实现所有的要求

两个要结合用

璀璨の樱之雨 发表于 2014-4-8 21:01:01

楼主说的有道理,顶一个

小新 发表于 2014-4-8 21:55:15

admin 发表于 2014-4-8 19:59
对的 最简单的方法就是用UFUN的 UF_OBJ_cylce_by_name 函数

NXOpen C++ 没有类似的这个功能


你好,我发现在Face类型继承了一个Name()方法,其函数说明的是:Returns the custom name of the object。我就想这个custom name 是否可能是我在UG给那个特定面命名的那个名字。如果用这个方法返回的custom name 和命名的名字相比较,如果是一致,那么我就从把这个面给保存下来,就算找到了。我按照这个思路用下面的代码验证这个思路。

<P>Session *theSession = Session::GetSession();
Part *workPart(theSession->Parts()->Work());
Part *displayPart(theSession->Parts()->Display());
BodyCollection *bc=workPart->Bodies();
BodyCollection::iterator it = bc->begin();//因为只有一个体,所以第一位置元素赋值给下面的body
Body *body = (*it);
std::vector<Face*> faces = body->GetFaces();
for(unsigned int j=0;j<faces.size();j++)
{

      if ((faces->Name().getText())=="FACE1")
      {</P>
<P>             UI *faceui = UI::GetUI();
            faceui->NXMessageBox()->Show("已经找到面",NXMessageBox::DialogTypeInformation,"已经找到特定的面");
      }
    else
       {
         UI *faceui = UI::GetUI();
         faceui->NXMessageBox()->Show("未找到面",NXMessageBox::DialogTypeInformation,faces->Name().getText());
       }
}</P>
上述代码能够通过编译。在实际运行中出现了上面图所示的两种结果。从图中看到程序判断,(faces->Name().getText())=="FACE1"结果都为假,所以弹出了6个(6个面)“未找到面”的对话框,由于我估计将对话框内容为Name()返回的custom name。但是有一个对话框中内容就是“FACE1”,其余都是空白。既然有一个是“FACE1”为什么不显示“已经找到面”对话框咧?求指教




小新 发表于 2014-4-8 22:22:41

本帖最后由 小新 于 2014-4-9 10:35 编辑

小新 发表于 2014-4-8 21:55
你好,我发现在Face类型继承了一个Name()方法,其函数说明的是:Returns the custom name of the objec ...
问题已经解决,按照上述思路是可行的。子所以出现上述问题是因为我在if语句判断时候没有处理好,应该用下面代码;
通过上述代码确实找到了特定的面了。
Session *theSession = Session::GetSession();
        Part *workPart(theSession->Parts()->Work());
        Part *displayPart(theSession->Parts()->Display());

        BodyCollection *bc=workPart->Bodies();
        BodyCollection::iterator it = bc->begin();//因为只有一个体,所以第一位置元素赋值给下面的body
        Body *body = (*it);
        std::vector<Face*> faces = body->GetFaces();
        for(unsigned int j=0;j<faces.size();j++)
        {
                const char *c1="FACE1";
                const char *c2=faces->Name().GetText();
                if (!strcmp(c2,c1))
                {
                        UI *faceui = UI::GetUI();
                        faceui->NXMessageBox()->Show("已经找到面",NXMessageBox::DialogTypeInformation,"已经找到特定的面");
                       
                }
                else
                {
                        UI *faceui = UI::GetUI();
                        faceui->NXMessageBox()->Show("未找到面",NXMessageBox::DialogTypeInformation,faces->Name().getText());
                       
                }


        }


页: [1]
查看完整版本: 如何找到实体的某个特定的面用于自动装配?