找回密码 注册 QQ登录
一站式解决方案

iCAx开思网

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

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

[复制链接]
跳转到指定楼层
1
发表于 2005-9-21 14:47:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多同行朋友,交流,分享,学习。

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

x
CAA中利用CATNavigation3DViewer可以预览零件模型。想用它来显示装配组件,已经由piProductOnRoot获得了各个零件的CATIProduct_var piProductOnProduct,然后调用piProductOnProduct->GetShapeRep(spLinkableOnShapeRep),再由spLinkableOnShapeRep获得了各个零件实例的CAT3DRep * p3DRep;然后调用_p3DViewer->AddRep( p3DRep);各个零件的p3DRep加入后,最后调用_p3DViewer->Draw();但是却得不到正确的显示结果,不知为什么?而由CAT3DBoundingSphere pBe = p3DRep->GetBoundingElement();获得的CAT3DBoundingSphere 是正确的,可以看到各个零件的CAT3DBoundingSphere半径。请高手指点!!谢谢!!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 赞一下!赞一下!
2
发表于 2005-9-21 14:51:10 | 只看该作者
还望acoka、saeba、xyzhu等CAA高手给予指点!不胜感激!!
3
发表于 2005-9-21 16:29:32 | 只看该作者
建议先看一下我的帖子‘提问的技巧’
然后请告诉大家,“得不到正确的显示结果”到底是得到了什么结果?

不仅仅是针对chengongcumt,而是对所有提问的网友们,我想说;

除非有人正好经历过和你一样的问题,才能猜出你大概弄错了什么。
大凡这种问题,90%是你的code哪里出了错,但是如果你不给人家看而是让人家猜,
恐怕除非有大奖,没有人会有兴趣参加。
所以,请贴出你的code,尽量详细,最好能给出直接可用的workspace,因为出于CAA的复杂性,
为了check你的问题,别人不得不从头做很多东西,没有特殊的原因,很少会有人愿意浪费这个时间。
在这里回答问题的网友,我想很多不仅仅是因为热爱技术,而是为了解闷儿,如果你的问题只能使人更闷,
结果可想而知。
4
发表于 2005-9-22 09:32:27 | 只看该作者
谢谢saeba指导!获益匪浅!下面是CODE,请指导!
int ViewTestCmd:isPlayCatiaModel(CATUnicodeString DocumentName)
{         
        if (NULL!= _pTheModelToDisplay)//_pTheModelToDisplayOld
        {       
                _p3DViewer->RemoveRep (_pTheModelToDisplay);       
                //        _p3DViewer在"ViewTestCmd.h"中定义过CATNavigation3DViewer* _p3DViewer;
        }

        HRESULT rc;
        CATUnicodeString oName ;
        cout <<"Importing an existing CATProduct under the root product"<<endl;
        //1.打开文档
        CATDocument *pDoc= NULL;  
        rc = CATDocumentServices::Open(DocumentName,pDoc);        ///DocumentName为要显示的装配文档
        if ( FAILED(rc) || (NULL==pDoc) )
        {
                cout <<"opening a CATProduct document failed"<<endl;
                return 1;
        }               
        // 2.获取根产品:
        CATIDocRoots *piDocRootsOnDoc = NULL;
        rc = pDoc->QueryInterface(IID_CATIDocRoots,(void**) &piDocRootsOnDoc);
        if ( FAILED(rc) )
        {
                cout <<"access to the root product failed"<<endl;
                return 2;
        }
  
        CATListValCATBaseUnknown_var *pRootProducts=piDocRootsOnDoc->GiveDocRoots();
        CATIProduct_var spRootProduct = NULL_var;
        if (NULL != pRootProducts)
        {
                if (pRootProducts->Size())
                {  
                        spRootProduct = (*pRootProducts)[1];
                        delete pRootProducts;
                        pRootProducts = NULL;
                }
        }
        else
        {
                cout<<"NULL != pRootProducts"<<endl;
        }
        piDocRootsOnDoc->Release();
        piDocRootsOnDoc        =NULL;

        if (NULL_var == spRootProduct)
        {
                cout << " ERROR: No root product !!  " << endl << flush;
                return 3;
        }       
        CATIProduct_var piProductOnRoot = NULL_var;

        rc = spRootProduct->QueryInterface(IID_CATIProduct,
                                                                           (void**) &piProductOnRoot);
        if ( FAILED(rc) )
        {
                cout<< "QueryInterface IID_CATIProduct failed !"<<endl;
                return 4;
        }
        else
        {
                ////最终得到了piProductOnRoot
                piProductOnRoot->GetPrdInstanceName(oName);
                cout<<"pCurrentProduct InstanceName:"<<oName.ConvertToChar()<<endl;
        }
       
        CATListValCATBaseUnknown_var* pProductList = piProductOnRoot->GetAllChildren();
        int numberOfProducts = pProductList->Size();
        cout<<"pProductList->Size():"<<numberOfProducts<<endl;
       
        //3.获取形状描述
        CATILinkableObject_var spLinkableOnShapeRep = NULL_var;

        if (SUCCEEDED(piProductOnRoot->GetShapeRep(spLinkableOnShapeRep)))  
        {
                cout<<"piProductOnRoot GetShapeRep Succeed!!"<<endl;
        }
        else
        {
                cout<<"piProductOnRoot GetShapeRep Failed!!"<<endl;

        }

        CATVisManager* pVisManager = CATVisManager::GetVisManager();
        if ( NULL == pVisManager )
        {
                cout <<" ERROR by retrieving the CATVisManager instance" << endl;               
                return 5;
        }
       
        for (int i = 1;  i <= numberOfProducts; i++)
        {               
                CATIProduct* piProductOnProduct = NULL;        
                if (SUCCEEDED((*pProductList)[i]->QueryInterface(IID_CATIProduct,(void**)&piProductOnProduct)))        
                {                           
                        if (SUCCEEDED(piProductOnProduct->GetShapeRep(spLinkableOnShapeRep)))  
                        {
                               
                                cout<<"GetShapeRep Succeed!!"<<endl;
                                CATPathElement* RootObjectPath=new CATPathElement(spLinkableOnShapeRep);
                               
                                ///------------------------------------------------------
                                list<IID> ListIVisu3d;
                                IID visu3d = IID_CATI3DGeoVisu ;
                                ListIVisu3d.fastadd(&visu3d);
                                CAT3DViewpoint * pVP = new CAT3DViewpoint();   
                                ///将上面四行代码放至FOR循环前面,则可显示装配中的两个零件,
                                //但加入两个零件后AttachTo方法失效
                                               
                                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);
                                if ( SUCCEEDED(rc) )
                                {
                                  
                                   CATRep * pRep = pIVisuOnRoot->GiveRep();
                                   if ( NULL != pRep )
                                   {
                                          CAT3DRep * p3DRep = (CAT3DRep *) pRep;                         
                                         _pTheModelToDisplay=(CAT3DBagRep *)p3DRep;
                                          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;
                                }
                                if ( (NULL != _p3DViewer)  && ( NULL != _pTheModelToDisplay))   
                                {                                       
                                        _p3DViewer->AddRep((CAT3DRep*)_pTheModelToDisplay);                                                                                               
                                }
                        }
                }
        }
               
        ///4.显示模型
   

    if ( NULL != _p3DViewer)
        {
                _p3DViewer->Draw();       
                cout<<"_p3DViewer->Draw()!!"<<endl;
        }
                //pVisuManager->DetachFrom(_pRootObjectPath, pVP);

                //CATDlgNotify * pPromptBox = new CATDlgNotify((CATApplicationFrame::GetApplicationFrame())->GetMainWindow(), "Right", CATDlgNfyInformation);  
                //pPromptBox->SetTitle(pOccurringError->GetNLSSource());
                //pPromptBox->SetText("All have been down,ok!!!");  
                //pPromptBox->SetVisibility(CATDlgShow);       
       
        else
        {
                cout<<"(NULL == _p3DViewer)  Failed!!"<<endl;
                return 8;
        }
        rc = CATDocumentServices::Remove (*pDoc);
        if ( FAILED(rc) )
        {
                cout <<"Deleting the *pDoc failed"<<endl;
                return 9;
        }
        return 0;
}
5
发表于 2005-9-22 11:48:19 | 只看该作者
以下是程序的WORKSPACE文档,请指导!谢谢!!
6
发表于 2005-9-22 11:54:15 | 只看该作者
--------------------------------------------------------------------------------
以下是程序的WORKSPACE文档,请指导!谢谢!!
7
发表于 2005-9-22 11:55:45 | 只看该作者
--------------------------------------------------------------------------------
以下是程序的WORKSPACE文档,请指导!谢谢!!
8
发表于 2005-9-22 11:56:32 | 只看该作者
--------------------------------------------------------------------------------
以下是程序的WORKSPACE文档,请指导!谢谢!!
9
发表于 2005-9-22 12:06:00 | 只看该作者
Very good! You are doing a perfect example!
Could you also tell me the structre of your main product (tree view)?
Anyway, I will look at your code next week.
I have to prepare a training this week, thank you for your understanding.
10
发表于 2005-9-22 15:02:50 | 只看该作者
由于要显示的Product的产品树较大,我将要预览显示的装配文件也发上去吧,其实随便用一个装配文件都可以。谢谢saeba!!祝一切顺利!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

GMT+8, 2024-12-23 02:01 , Processed in 0.033702 second(s), 10 queries , Gzip On, Redis On.

Powered by Discuz! X3.3

© 2002-2024 www.iCAx.org

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