iCAx开思工具箱

标题: 请教交互式工程图元的拷贝问题 [打印本页]

作者: zcsq    时间: 2005-9-14 16:19
标题: 请教交互式工程图元的拷贝问题
想把工程图中一个SHEET的内容拷到另一个SHEET里,现通过spcurrenView=spcurrentSheet->GetCurrentView();
然后把spcurrentView拷贝到spNewSheet.实现过程如下.

此程序可实现自己画的工程图的拷贝及图框的拷贝。但对于由CATIA的3维图直接生成的2维工程图却不能拷贝,编译可通过,但运行出错“检测到空指针”,请教各位高手,如何入手解决呢?
问题可能是处在,交互产生的工程图,和PART文档之间的连接问题。对否?

请各位指点,多谢了!:)


   ListOfVarBaseUnknown newListToCopy;
    ListOfVarBaseUnknown listFromCopy;

    CATIView_var spView=spSheet1->GetCurrentView();
   CATISpecObject_var spViewToPaste(spView);   
  listFromCopy.Append(spViewToPaste);

   result = piCutAndPastableOnSourceCont -> BoundaryExtract (newListToCopy,      &listFromCopy,NULL);
         if (NULL != result)
           {
                    cout<<"........."<<endl;
            }
                       
    else
    {
        cout << "BoundaryExtract failed" << endl << flush;
        piCutAndPastableOnSourceCont -> Release();
                piCutAndPastableOnTargetCont -> Release();
        return 10;
    }

  VarBaseUnknown pExtractedList;
  pExtractedList = piCutAndPastableOnSourceCont -> Extract (newListToCopy, NULL);
  piCutAndPastableOnSourceCont -> Release();
  piCutAndPastableOnSourceCont = NULL;
  CATICutAndPastable *piCutAndPastableOnExtractedList = NULL;
    rc = pExtractedList -> QueryInterface(IID_CATICutAndPastable,
                                                  (void**) &piCutAndPastableOnExtractedList);
    if (FAILED(rc))
        {
        cout << "ERROR in QueryInterface on CATICutAndPastable on Target Container" << endl ;      
                       return 3;
        }
    if(piCutAndPastableOnExtractedList)cout<<"piCutAndPastableOnExtractedList!=0"<<endl;
    ListOfVarBaseUnknown extractedListToCopy;

    result = NULL;
    result = piCutAndPastableOnExtractedList -> BoundaryExtract (extractedListToCopy,
                                                                 NULL,
                                                                 NULL);
        if (NULL != result)
        {
                cout << "BoundaryExtract from Clipboard succeeded" << endl << flush;
                cout << "Number of objects extractedListToCopy= " << extractedListToCopy.Size() << endl;
        }
    else
    {
        cout << "BoundaryExtract failed" << endl << flush;
       piCutAndPastableOnTargetCont -> Release();
        return 10;
    }

        piCutAndPastableOnExtractedList -> Release();
        piCutAndPastableOnExtractedList = NULL;

        if(piCutAndPastableOnTargetCont!=NULL)cout<<"piCutAndPastableOnTargetCont!=0"<<endl;
        else cout<<"piCutAndPastableOnTargetCont==0"<<endl;

        cout << "Number of objects extractedListToCopy= " << extractedListToCopy.Size() << endl;
    ListOfVarBaseUnknown listPastedObjects ;
        listPastedObjects= piCutAndPastableOnTargetCont -> Paste (extractedListToCopy,NULL,NULL)
作者: zcsq    时间: 2005-9-16 09:12
几位高手帮我看看呀,多谢了!
作者: hick    时间: 2005-9-16 09:26
没做过,具体问题不太清楚

可以给点建议,加上粘贴方式 CATFormat *pFormat  试试

呵呵,不保证
作者: zcsq    时间: 2005-9-16 14:10
谢谢,hick!试试看!
acoka,saeba兄,帮我看看呀,指点一二!多谢!
作者: saeba    时间: 2005-9-16 17:00
试了一下,“由CATIA的3维图直接生成的2维工程图”也可以的。
试试下面的source吧

CATBoolean TSTSampleCmd::ActionTwo( void *data ){

  HRESULT hr = S_OK;
  CATBaseUnknown *pUnk = _Indication2->GetElementValue();
  if (!pUnk) hr = E_FAIL;

        cout << "LateType: " << pUnk->GetImpl()->IsA() << endl;

        CATISheet_var        spSheet2(pUnk);

        CATISheet_var        spSheet1(_spObject1);        //_spObject1is set by last selection

        if (!spSheet1)
                cout << "Sheet1 is NULL" << endl;
        CATIView_var        spSrcView = spSheet1->GetCurrentView();
        CATIView_var        spTarView = spSheet2->GetMainView();

        if (!spSrcView)
                cout << "spSrcView is NULL" << endl;

        CATICutAndPastable_var        spSrcCCP(CATISpecObject_var(spSheet1)->GetFeatContainer());
        CATICutAndPastable_var        spTarCCP(CATISpecObject_var(spSheet2)->GetFeatContainer());

        CATLISTP(CATFormat)        listFmt = spSrcCCP->ListPasteFormats();

        int        cFmt = listFmt.Size();
        for (int i = 1; i <= cFmt; i++){
                cout << listFmt[i]->Name() << endl;
        }

        IdFormat MyFmy = "CATDrwCont";

        const CATFormat* pFmt = CATFormat::GetRegisteredFormat(MyFmy);


   ListOfVarBaseUnknown newListToCopy;
    ListOfVarBaseUnknown listFromCopy;

  listFromCopy.Append(spSrcView);

   hr = spSrcCCP -> BoundaryExtract (newListToCopy,      &listFromCopy,pFmt);
        if (NULL != hr)
        {
                cout<<"........."<<endl;
        }
        else
        {
                cout << "BoundaryExtract1 failed" << endl << flush;
                return FALSE;
        }

        ListOfVarBaseUnknown extractedListToCopy;
        CATICutAndPastable_var spSrcCCPExt = spSrcCCP -> Extract (newListToCopy, pFmt);

        int        r = 0;
    if (!!spSrcCCPExt)
                r = spSrcCCPExt->BoundaryExtract(extractedListToCopy, NULL,pFmt);

    if (0 != r)
    {
        cout << "BoundaryExtract from Clipboard succeeded" << endl << flush;
        cout << "Number of objects extractedListToCopy= " << extractedListToCopy.Size() << endl;
    }
    else
    {
        cout << "BoundaryExtract2 failed" << endl << flush;
        return FALSE;
    }

        cout << CATIAlias_var(extractedListToCopy[1])->GetAlias() << endl;
        cout << CATIAlias_var(extractedListToCopy[2])->GetAlias() << endl;

    ListOfVarBaseUnknown listPastedObjects ;
        ListOfVarBaseUnknown listTargetObjects ;

        listTargetObjects.Append(spSheet2);

    listPastedObjects= spTarCCP -> Paste (extractedListToCopy, &listTargetObjects,pFmt);

        cout << listPastedObjects.Size() <<endl;

        CATISpecObject_var(spSheet2)->Update();

}

在我这里是可以的。
作者: zcsq    时间: 2005-9-17 09:22
saeba兄,非常感谢!真佩服!
先收下,好好研究!成功后和大家分享我的体会!




欢迎光临 iCAx开思工具箱 (https://t.icax.org/) Powered by Discuz! X3.3