zoukankan      html  css  js  c++  java
  • 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);
  • 相关阅读:
    响应报文
    IntelliJ IDEA 使用Git怎样记住密码和忘记密码的方法
    vue基础——命名路由
    vue基础——路由懒加载
    vue hash模式下如何使用a标签的锚点定位
    vue项目中修改第三方库的组件样式的方法
    CSS3实现水波纹效果
    日期对象Date的计算
    兼容性查询工具
    根据.svg文件借助IconMoon生成字体图标及应用的方法
  • 原文地址:https://www.cnblogs.com/HelloQLQ/p/12899560.html
Copyright © 2011-2022 走看看