wblockCloneObjects 寫塊克隆的使用


寫塊克隆可以把當前數據庫的實體寫入到另一個dwg文件中去。用法根deepclone類似,不過deepclone只能復制到同一數據庫中,而寫塊克隆是在不同數據庫中進行復制的。

寫塊克隆也算是深度克隆,能把所克隆的實體帶有的圖層、標注樣式、多線樣式、文字樣式、表格樣式、引線樣式都克隆過去。但是呢,我試過,如果實體的樣式是standard樣式,實體被克隆到新文件里去,就無法覆蓋新文件里的standard樣式了,我根據不同的樣式采取了不同的方法來完成讓standard樣式也能被克隆過去。

首先簡單的是Mleaderstyle、MLStyle和TableStyle,它們三個采取的是更改standard樣式的名稱,然后如果原實體有使用到standard樣式就能被克隆過去了。這三個的樣式都是通過字典來獲取的。例如:

  

//表格樣式
pDataBase->getTableStyleDictionary(newDict, AcDb::kForWrite);
bool flag=newDict->setName(L"Standard", L"oldStandard");
//多重引線樣式
 pDataBase->getMLeaderStyleDictionary(newDict, AcDb::kForWrite);
bool flag = newDict->setName(L"Standard", L"oldStandard");   
//多線樣式
 pDataBase->getMLStyleDictionary(newDict, AcDb::kForWrite);
bool flag = newDict->setName(L"Standard", L"oldStandard"); 

稍微復雜點的,文字樣式,需要打開原數據庫和新數據庫的standard文字樣式塊記錄,然后把原塊記錄的值賦值給新塊記錄。大概是這樣:

if (pNewRec!=NULL)
                {
                    ACHAR * pTypeface = NULL;
                    Adesk::Boolean bold;
                    Adesk::Boolean italic;
                    Charset  charset;
                    Autodesk::AutoCAD::PAL::FontUtils::FontPitch  pitchAndFamily;
                    Autodesk::AutoCAD::PAL::FontUtils::FontFamily fontFamily;
                    ACHAR *na, *na1, *bigFontN;
                    txtRec->getName(na);

                    txtRec->fileName(na1);
                    txtRec->bigFontFileName(bigFontN);
                    Adesk::UInt8 flagB = txtRec->flagBits();
                    setSymbolName(pNewRec, na);
                    es = pNewRec->setFileName(na1);
                    es = pNewRec->setBigFontFileName(bigFontN);
                    pNewRec->setFlagBits(flagB);
                    pNewRec->setIsVertical(txtRec->isVertical());
                    pNewRec->setIsShapeFile(txtRec->isShapeFile());

                    es = txtRec->font(pTypeface, bold, italic, charset, pitchAndFamily, fontFamily);
                    //es = pTextStyle->font(pTypeface, bold, italic, charset, pitchAndFamily, fontFamily);
                    if (es == Acad::eOk)
                        pNewRec->setFont(pTypeface, bold, italic, charset, pitchAndFamily, fontFamily);
                    
                    es = pNewRec->setTextSize(txtRec->textSize());
                    if (styleId != stdId&&styleId != anoId)
                    {                        
                        es = pNewRec->setXScale(txtRec->xScale());
                    }
                    es = pNewRec->setObliquingAngle(txtRec->obliquingAngle());

                }
View Code

在做克隆standard標注樣式的時候,又不能像克隆文字樣式那樣簡單的直接賦值操作,否在新數據庫在保存的時候,會彈出警告,雖然樣式復制過去了,但是會出現替代樣式。這里我采用的辦法是,先在新數據庫里建一個標注樣式來替代新數據庫里的standard樣式作為當前樣式,這是為了能刪除standard樣式,因為當前標注樣式是不能被刪除的。然后如果原數據庫所選實體使用到了standard樣式就能被克隆過去了。

最后就是寫塊克隆的操作了。

AcDbDatabase* pTempDb = new AcDbDatabase();

        pTempDb->setLtscale(acdbHostApplicationServices()->workingDatabase()->ltscale());
        pTempDb->setLineWeightDisplay(acdbHostApplicationServices()->workingDatabase()->lineWeightDisplay());
        pTempDb->setFillmode(acdbHostApplicationServices()->workingDatabase()->fillmode());
        
        AcDbIdMapping idMap;
        es = idMap.setDestDb(pTempDb);
        //省略了各種standard樣式的克隆
        pTempDb->getSymbolTable(pBT1, AcDb::kForRead);
        pBT1->getAt(ACDB_MODEL_SPACE, modelSpaceId);
        
        es=pBT1->close();

        es = pTempDb->wblockCloneObjects(ids, modelSpaceId, idMap, AcDb::kDrcIgnore);

        if (es != ErrorStatus::eOk) {
            delete pTempDb;
            pTempDb=NULL;
            return false;
        }
        es = pTempDb->saveAs(path);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM