huangbinlq 发表于 2007-5-10 21:50:00

如何批量地将多个文件中的外部参照全部绑定

<font face="宋体" size="2">大家好,我在此向各位请教一个问题:<br/>假设有一个d:\a的文件夹,里面有上百个dwg文件,每个文件都有一个图框,而且这个图框是在布局里插入的外部参照,现在要将这些文件拷到别的机子上,但那些机子上没有外部参照的源文件,会造成显示不出的问题,于是我想将所有的dwg文件中的外部参照都绑定起来,但一个一个地操作又太慢,那么用vc作一个arx文件来完成这个任务应该是不成问题的吧,我就请教该如何写这个代码?我是一个objectarx的初学者,请大家给我详细耐心地指导,我将不胜感激,谢谢</font>

Timnis 发表于 2007-11-21 00:42:00

我也想知道。。。

zhang007 发表于 2007-11-22 19:07:00

我从来不用布局,也很少用到外部参照,没有遇到楼主所说的问题。呵呵。。。

dshilunls 发表于 2009-4-23 10:35:00

又没人讨论啦?高手高手,你们在哪里啊?

xiaowenfox 发表于 2011-3-18 10:55:55

可以用图纸集,里面有电子传递,可以批量绑定。但是不能选择插入,所以绑后图层变态的多,不知怎么解决

romao 发表于 2011-11-12 12:04:55

这个问题我已解决,给你一段小代码


void BindXref2()
{
        AcDbDatabase *pDb = acdbHostApplicationServices()->workingDatabase();
       BindXref2(pDb);
}
void BindXref2(AcDbDatabase *pDb)
{
        Acad::ErrorStatus es;
        AcDbObjectIdArray objIdArr;               

    AcDbBlockTable *pBlockTable;
        AcDbBlockTableRecord * pBlockTableRecord;
    es = pDb->getSymbolTable(pBlockTable, AcDb::kForRead);
        if (es != Acad::eOk) return;

        AcDbBlockTableIterator *pBlockTableIterator;
    es = pBlockTable->newIterator(pBlockTableIterator);
        if (es != Acad::eOk) {
                pBlockTable->close();
                return;
        }
        pBlockTable->close();
        //遍历一个图块表中所有图块
    for (; !pBlockTableIterator->done();       
                pBlockTableIterator->step(true,true))                //skipDeleted = true
        {
      es = pBlockTableIterator->getRecord (pBlockTableRecord, AcDb::kForRead);
                if (es != Acad::eOk) continue;
                if(pBlockTableRecord->isFromExternalReference() == Adesk::kTrue)
                {
                        objIdArr.append(pBlockTableRecord->objectId( ));        //记录外部参照
                }
                pBlockTableRecord->close();
        }//---for
    delete pBlockTableIterator;

        if (objIdArr.length() > 0){
                Do_BindXref2(pDb, objIdArr);   
        }
}


//===================================================================================
void Do_BindXref2(AcDbDatabase *pDb, AcDbObjectIdArray& objIdArr)
{
        if (objIdArr.length()==0) {
                return;
        }
        Acad::ErrorStatus es;

        long i;
        for(i=0; i<objIdArr.length(); i++)
        {
                //打开这个外部参照图块物体
                AcDbObject *pObj;
                AcDbBlockTableRecord *pBlkRcd;
                es = acdbOpenObject(pObj, objIdArr, AcDb::kForWrite);
                if (es != Acad::eOk) {
                        continue;
                }
                pBlkRcd = AcDbBlockTableRecord::cast(pObj);
                if (pBlkRcd == NULL) {
                        pObj->close();
                        continue;
                }
                TCHAR *Blkname;
                es = pBlkRcd->getName(Blkname);
                pObj->close();
                //开始替换外部参照
                es = acedXrefReload(Blkname,true,pDb);                                //必须先Reload,否则pDb为非当前显式打开文档时不成功或崩溃
                if(es == Acad::eOk){
                        es = acedXrefBind(Blkname,false,true,pDb);                //必须先关闭这个块表
                }
        }
}

shalei021647 发表于 2011-11-13 10:58:49

有没有人开发一个lisp啊,我也很想实现这个功能啊,以后说不定啥地方就用上了啊,求助

shalei021647 发表于 2011-11-15 00:24:09

romao 发表于 2011-11-12 12:04 static/image/common/back.gif
这个问题我已解决,给你一段小代码




这个程序怎么用啊,大侠

romao 发表于 2011-11-17 16:48:07

这个程序怎么用啊,大侠

这是 ObjectARX 程序代码,先花半年时间啃下ObjectARX吧,前提是还要精通 C++
页: [1]
查看完整版本: 如何批量地将多个文件中的外部参照全部绑定