ARX中如何insert一个图(zt)

转载 2004年10月10日 12:04:00
在实践中常常要将外部的图形文件source.dwg中插入到另外一个图形中或者当前图形中.以插入到当前图形dest.dwg为例.
    为了将一个source.dwg插入dest.dwg中,首先要找到source.dwg这个文件. 我们可以使用各种基本的技术和相应的规则从你的机器上或PDM数据库中检索到你要插入的source.dwg, 返回来一个字符窜sFileName代表整个文件及其路径.
    然后创建一个空的数据库pNewDb读入source.dwg.
AcDbDatabase *pNewDb =new AcDbDatabase(Adesk::kFalse);
//在这里一定要用Adesk::kFalse
acDocManager->lockDocument(acDocManager->curDocument()) ;//如果确定你不需要LockDocument, 这一行可以不要

es=pNewDb->readDwgFile(sFileName , _SH_DENYNO,false);
if (es!=Acad::eOk)
{
    acutPrintf("/nThe file %s cannot be opend",sFileName);
    return;
}

    这样,source.dwg以经用pNewDb来表示了. 我们用pDb来表示当前数据库
AcDbDatabase *pDb;
pDb =acdbHostApplicationServices ()->workingDatabase () ;

    现在,我们用Insert来插入数据库. Insert有两种用法,一种是直接insert, source.dwg中的图元实体被分散地插入pDb中
pDb->insert( AcGeMatrix3d::kIdentity, pNewDb );//这里假定不对source.dwg做比例和转角的变换. 如果我们在这里结束程序,我们能看到source.dwg已经被插入,但不是一个图块.

    另外一种插入法是要求插入后source.dwg成为一个图块,图块的attribute也要从source.dwg中得到.这种方法要做大量的工作.首先运行insert()

CString pBlockName=”TestBlock”;
AcDbObjectId blockId;
if((es=pDb->insert(blockId, pBlockName,pNewDb, true))==Acad::eOk)
{
    acutPrintf("/ninsert ok/n");
}
else
{
AfxMessageBox("Insert failed");
delete pNewDb;
return;
}

//这里blcokId是insert运行后产生的,它代表的是一个块表记录AcDbBlockRecord的ID. pBlockName是记录名,要在insert运行前设定其值.
    如果我们在这里结束程序,我们看不到任何东西,因为source并没有真正被插入.我们还要做一些事,首先是创建一个AcDbBlockReference, 并将它指向blockId所代表的AcDbBlockRecord, 然后将这个AcDbBlockReference加入pDb所代表的图形数据库中.
AcDbBlockReference *pBlkRef = new AcDbBlockReference;
pBlkRef->setBlockTableRecord(blockId);//指向blockId;
pBlkRef->setPosition(Pt);//设定位置
pBlkRef->setRotation(Angle);//设定转角
pBlkRef->setScaleFactors( XrefScale);//设定放大比例

AcDbBlockTable *pBlockTable;
pDb->getSymbolTable(pBlockTable, AcDb::kForRead);

AcDbBlockTableRecord *pBlockTableRecord;
pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
pBlockTable->close();
AcDbObjectId newEntId;
pBlockTableRecord->appendAcDbEntity(newEntId, pBlkRef);
pBlockTableRecord->close();

    如果我们在这里结束程序,我们将看到当前图形中source.dwg已经被作为图块插入.但是图块中没有source.dwg所定义的Attibute. 因此我们还要做工作.后面的事情就简单了.

AcDbBlockTableRecord *pBlockDef;
acdbOpenObject(pBlockDef, blockId, AcDb::kForRead);

AcDbBlockTableRecordIterator *pIterator;
pBlockDef->newIterator(pIterator);
AcGePoint3d basePoint;
AcDbEntity *pEnt;
AcDbAttributeDefinition *pAttdef;
for (pIterator->start(); !pIterator->done();
        pIterator->step())//将source.dwg中所有的Attibute进行遍历
{
        pIterator->getEntity(pEnt, AcDb::kForRead);
        pAttdef = AcDbAttributeDefinition::cast(pEnt);
        if (pAttdef != NULL && !pAttdef->isConstant()) {
            AcDbAttribute *pAtt = new AcDbAttribute();
            pAtt->setPropertiesFrom(pAttdef);
            pAtt->setInvisible(pAttdef->isInvisible());
            basePoint = pAttdef->position();
            basePoint += pBlkRef->position().asVector();
            pAtt->setPosition(basePoint);
            pAtt->setHeight(pAttdef->height());
            pAtt->setRotation(pAttdef->rotation());
            pAtt->setTag("Tag");
            pAtt->setFieldLength(25);
            char *pStr = pAttdef->tag();
            pAtt->setTag(pStr);
           acutDelString(pStr);
            pAtt->setFieldLength(pAttdef->fieldLength());
            pAtt->setTextString("-");

            AcDbObjectId attId;

            pBlkRef->appendAttribute(attId, pAtt);
            pAtt->close();
        }
        pEnt->close(); // use pEnt... pAttdef might be NULL
    }
delete pIterator;

OBJECTARX编程中如何改变DWG中文字内容

OBJECTARX编程中如何改变DWG中文字内容 转 由于要将DWG文件中N多的文字进行翻译, 想到了先将所有的文字全部导出到一文本文件中(已实现,代码如下) //导出DWG文件中的...
  • fengxiaochenduanduan
  • fengxiaochenduanduan
  • 2013年07月21日 22:25
  • 1531

ObjectARX学习笔记(二十七)---如何拷贝将一个AcDbDatabase拷贝到另一张dwg里面

Acad::ErrorStatus insert( const AcGeMatrix3d& xform, AcDbDatabase* pDb, bool preserveS...
  • jangdong
  • jangdong
  • 2014年10月23日 10:19
  • 1613

获取ARX实体的DXF信息

两种方法,一种是在程序中,一种是在CAD中:
  • chunyexiyu
  • chunyexiyu
  • 2014年08月07日 16:53
  • 1035

ARX创建块遭遇图形数据库问题

AcDbObjectId CArrowsBlock::AddBlock(const CString& strBlkName ,const AcDbObjectId& objId, AcDbPolyli...
  • zsq597695
  • zsq597695
  • 2012年07月27日 09:54
  • 784

ARX开发环境与ARX加载的秘密[转]

回想曾经开始学做ARX的日子,帮助文档不详尽,例子太少,苦不堪言啊。所以今天兴致好,发个贴子,让走过弯路的朋友们少走弯路,也算为这个注册N久的坛子尽点力。希望与大家多交流,共同提高。 回到正题,首...
  • sTeVes
  • sTeVes
  • 2014年04月03日 16:17
  • 2907

ObjextARX 删除图层实体

/* 函数名称: DrawMcLine 功能描述: 删除实体 返回类型: 无 参数意义: 无 修改记录: */ bool McAcad::eraseEntity(int soft...
  • rentao8000
  • rentao8000
  • 2016年09月09日 10:30
  • 357

ObjectARX切换图纸空间的方法

问题:我的图纸空间可能有很多个,怎么根据图纸空间的名称切换到想要的图纸空间? 方法:使用setCurrentLayout方法,原型如下: virtual Acad::ErrorStatus setCu...
  • barbarahan
  • barbarahan
  • 2010年05月20日 14:55
  • 2523

ObjectARX学习笔记(三十五)----外部参照相关的操作

Acad::ErrorStatus acdbResolveCurrentXRefs(AcDbDatabase* pHostDb, bool useThreadEngine = true, bo...
  • jangdong
  • jangdong
  • 2015年02月04日 17:39
  • 1300

ObjectARX学习笔记(二十五)---如何在两个dwg里面拷贝字体样式表AcGiTextStyle ,AcDbTextStyleTableRecord

//两个dwg拷贝字体信息 bool CopyTextStyleIdInfo(AcDbDatabase *pFromDataSrc/*in*/,AcDbDatabase *pToDataDes/*in...
  • jangdong
  • jangdong
  • 2014年09月28日 09:48
  • 1774

ARX 简单程序(不错的例子)

////////////////////创建窗体图层"Window_Layer"/////////////////AcDbObjectIdcreateWindowsLayer(){//打开层表,打开方...
  • sw283632534
  • sw283632534
  • 2010年03月21日 16:30
  • 1463
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ARX中如何insert一个图(zt)
举报原因:
原因补充:

(最多只允许输入30个字)