找回密码 注册 QQ登录
开思网工业级高精度在线3D打印服务

iCAx开思网

CAD/CAM/CAE/设计/模具 高清视频【积分说明】如何快速获得积分?快速3D打印 手板模型CNC加工服务在线3D打印服务,上传模型,自动报价
打印 上一主题 下一主题

CAA中利用CATNavigation3DViewer预览装配组件的问题

[复制链接]
11
发表于 2005-9-26 08:31:04 | 只看该作者
有没有哪位CAA高手能帮忙看看啊?谢谢!saeba兄最近还很忙呢吧。
12
发表于 2005-9-26 16:19:13 | 只看该作者
今天终于找时间看了一下,还没有解决所有问题,但是知道了为什么AttachTo会失败:
其实AttachTo并不是从第4个以后就都失败的,
如果你把
                                                cout <<" ERROR in the AttachTo method" << endl;
                                                return 6;
改成
                                                cout <<" ERROR in the AttachTo method" << endl;
                                                continue;
就会发现,对有些子product是成功的,为什么呢?
仔细看看成功的和失败的,发现,
虽然你的父product下面虽然有42个子product,但是其实有很多都是重复的指向同一个catpart
成功的AttachTo都是对不同的catpart,而失败的都是对已经AttachTo过的
因此,如果你把
CATPathElement* RootObjectPath=new CATPathElement(spLinkableOnShapeRep);
改成
CATPathElement* RootObjectPath=new CATPathElement(piProductOnProduct);
就一个也不会失败了,因为每个子product都是不同的

但是问题仍然没有解决,AttachTo虽然没有失败,但viewer上面并没有显示
原因我也不知道...
13
发表于 2005-9-26 17:57:51 | 只看该作者
非常感谢saeba!不好意思占用你的宝贵时间了,不知该说什么了,还是谢谢!
14
发表于 2005-9-26 18:16:27 | 只看该作者
实际上,我把spLinkableOnShapeRep类型改为CATISpecObject_var时,AttachTo也不失效了,但也是不显示,不知为什么?急啊!还请大家有时间再帮忙看看。有关代码如下:
        CATISpecObject_var spLinkableOnShapeRep = NULL_var;
        //CATILinkableObject_var spLinkableOnShapeRep = NULL_var;
        CATVisManager* pVisManager = CATVisManager::GetVisManager();
        if ( NULL == pVisManager )
        {
                cout <<" ERROR by retrieving the CATVisManager instance" << endl;               
                return 5;
        }

        list<IID> ListIVisu3d;
        IID * visu3d =new IID(IID_CATI3DGeoVisu );
        ListIVisu3d.fastadd(visu3d);
        CAT3DViewpoint * pVP = new CAT3DViewpoint();
       
        int NumOfInstanceParts=0;                       
        for (int i = 1;  i <= numberOfProducts; i++) //
        {               
                CATIProduct* piProductOnProduct = NULL;        
                if (SUCCEEDED((*pProductList)[i]->QueryInterface(IID_CATIProduct,(void**)&piProductOnProduct)))        
                {                           
                        if (SUCCEEDED(piProductOnProduct->QueryInterface(IID_CATISpecObject,(void**)&spLinkableOnShapeRep)))  
                        //if (SUCCEEDED(piProductOnProduct->GetShapeRep(spLinkableOnShapeRep)))
                        {
                                NumOfInstanceParts=NumOfInstanceParts+1;
                                cout<<"GetShapeRep Succeed!!"<<endl;                       
                                CATPathElement* RootObjectPath=new CATPathElement(spLinkableOnShapeRep); //piProductOnProductspLinkableOnShapeRep//piProductOnRoot  
                                ///------------------------------------------------------
                       
                                //list<IID> ListIVisu3d;
                                //IID visu3d = IID_CATI3DGeoVisu ;
                                //ListIVisu3d.fastadd(&visu3d);
                                //CAT3DViewpoint * pVP = new CAT3DViewpoint();                                
                                               
                                rc = pVisManager->AttachTo ( RootObjectPath, pVP, ListIVisu3d);                               

                                if ( FAILED(rc) )
                                {
                                        cout <<" ERROR in the AttachTo method" << endl;
                                        return 6;
                                }
                                CATI3DGeoVisu * pIVisuOnRoot =NULL ;   
                                rc = spLinkableOnShapeRep->QueryInterface(IID_CATI3DGeoVisu, (void **) & pIVisuOnRoot);
                                CAT3DRep * p3DRep=NULL;                                                                                                         
                                if ( SUCCEEDED(rc) )
                                {
                                  
                                   CATRep * pRep = pIVisuOnRoot->GiveRep();
                                   if ( NULL != pRep )
                                   {
                                          p3DRep = (CAT3DRep *) pRep;                         
                                         _pTheModelToDisplay=(CAT3DBagRep *)p3DRep;                                       
                                        _pTheModelToDisplay->AddChild(*pRep);
                                          CAT3DBoundingSphere pBe = p3DRep->GetBoundingElement();
                                          float radius = pBe.GetRadius();
                                          cout <<" The radius of the bounding box = " << radius << endl;
         
                                   }
                                        pIVisuOnRoot->Release();
                                        pIVisuOnRoot = NULL ;
                                }
                                else
                                {
                                        cout <<" ERROR to retrieve the CATI3DGeoVisu interface" << endl;               
                                        return 7;
                                }
                               
                                //pVisManager->DetachFrom(RootObjectPath, pVP);
                        }
                }
        }
        cout<<"发现零件实例数目:"<<NumOfInstanceParts<<endl;
if ( NULL != _p3DViewer)
        {
                _pTheModelToDisplay->SetShowMode (1,1);
                _p3DViewer->AddRep((CAT3DRep *) _pTheModelToDisplay);
               
                _p3DViewer->Draw();        _pTheModelToDisplay->SetShowMode (1,1);
                cout<<"_p3DViewer->Draw()!!"<<endl;
        }
.......
15
发表于 2005-9-26 19:24:00 | 只看该作者
不知道你的组件是不是装配好了的。如果是已经装配好的话,它的预览显示并不需要得到所有的子零件或者子Product,它的显示与零件的预览是类似的。怀疑你走入了误区~~
16
发表于 2005-9-26 20:03:29 | 只看该作者
你在循环里用了 rc = pVisManager->AttachTo ( RootObjectPath, pVP, ListIVisu3d);然后在循环外用了_p3DViewer->AddRep((CAT3DRep *) _pTheModelToDisplay); 这两个重复了. 试试删除AttachTo那句.
还有,AddRep是"Adds a representation 3D in the Main 3D Viewpoint", 那个Main 3D Viewpooint是通过CATViewer::GetMain3DViewpoint()得到的, 你用了new CAT3DViewpoint, 也许这也会产生问题.
17
发表于 2005-9-27 08:59:27 | 只看该作者
谢谢cms_nuaa、xyzhu !

xyzhu兄提供的思路试过了,可还是不行啊,不知问题到底在哪里?
组建是装配好 的,不知cms_nuaa说的直接显示如何实现,好象是一个不错的思路。我最初也曾想直接显示装配体:
if (SUCCEEDED(piProductOnRoot->GetShapeRep(spLinkableOnShapeRep)))  
        {
                cout<<"piProductOnRoot GetShapeRep Succeed!!"<<endl;
        }
        else
        {
                cout<<"piProductOnRoot GetShapeRep Failed!!"<<endl;

        }
但是好象不直接与零件相关的Product就不能得到GetShapeRep的结果。不知如何构造装配体的CAT3DRep *描述,以便用CAT3DViewer或CATNavigation3DViewer显示。请cms_nuaa指教!谢谢!!
18
发表于 2005-9-27 10:11:26 | 只看该作者
好消息,我想是解决了!

一个一个来,
首先,为什么return 6改成continue以后就没了显示,
今天仔细看了看,原来你在之后,作了document的remove:
rc = CATDocumentServices::Remove (*pDoc);
这样一来,整个product的信息全部从session中删除,自然也就没了显示
把这个remove注释掉,果然显示就出来了。
但是这时的显示,因为没有matrix信息,看起来就像只有一个part被显示了一样。

那么怎么显示实际的装配图呢?
有两个方法,
1。直接显示主product,这时根本就不用循环了
                                ...
                                CATPathElement* RootObjectPath=new CATPathElement(spRootProduct);
                               
                                        rc = pVisManager->AttachTo(RootObjectPath, pVP, ListIVisu3d, NULL, 0, 1);                               

                                        if ( FAILED(rc) )
                                        {
                                                cout <<" ERROR in the AttachTo method" << endl;
                                                return 6;
                                        }else{
                                                cout << "AttachTo OK." << endl;
                                        }

                                        CATI3DGeoVisu * pIVisuOnRoot =NULL ;   
                                        rc = spRootProduct->QueryInterface(IID_CATI3DGeoVisu, (void **) & pIVisuOnRoot);
                                        ...
就可以

2。如果你想控制其中的几个子product不显示或别的什么,
不必用piProductOnProduct->GetShapeRep(spLinkableOnShapeRep) (循环还是要的)
而是:
在循环中
                                ...
                                CATPathElement* RootObjectPath=new CATPathElement(piProductOnProduct);
                               
                                        rc = pVisManager->AttachTo(RootObjectPath, pVP, ListIVisu3d, NULL, 0, 1);                               

                                        if ( FAILED(rc) )
                                        {
                                                cout <<" ERROR in the AttachTo method" << endl;
                                                continue;
                                        }else{
                                                cout << "AttachTo OK." << endl;
                                        }

                                        CATI3DGeoVisu * pIVisuOnRoot =NULL ;   
                                        rc = piProductOnProduct->QueryInterface(IID_CATI3DGeoVisu, (void **) & pIVisuOnRoot);
                                ...

都会得到附图的结果

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
19
发表于 2005-9-27 10:14:35 | 只看该作者
>但是好象不直接与零件相关的Product就不能得到GetShapeRep的结果。不知如何构造装配体的CAT3DRep *描述,以便用CAT3DViewer或CATNavigation3DViewer显示

根本不必GetShapeRep,product直接就可以QI到CATI3DGeoVisu。
查查Object Browser就知道了
20
发表于 2005-9-27 11:26:20 | 只看该作者
非常感谢Saeba!我上午也发现这个问题了,其实好像还有更简单的方法:
spSpecObjectPart=piProductOnRoot;//零件用pSpecContainer->GetPart();
       
        //组件--------------------------------------------------------------
        if(spSpecObjectPart==NULL_var)
        {
                cout<<"spSpecObjectPart==NULL_var!"<<endl;
                return 5;
        }
        CATPathElement* RootObjectPath=new CATPathElement(spSpecObjectPart);
接下来就和零件显示一样了。
谢谢!祝顺利!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3D打印手板模型快速制作服务,在线报价下单!

QQ 咨询|手机版|联系我们|iCAx开思网  

GMT+8, 2024-12-23 11:21 , Processed in 0.026478 second(s), 9 queries , Gzip On, Redis On.

Powered by Discuz! X3.3

© 2002-2024 www.iCAx.org

快速回复 返回顶部 返回列表