明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 8806|回复: 8

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

[复制链接]
发表于 2007-5-10 21:50:00 | 显示全部楼层 |阅读模式
大家好,我在此向各位请教一个问题:
假设有一个d:\a的文件夹,里面有上百个dwg文件,每个文件都有一个图框,而且这个图框是在布局里插入的外部参照,现在要将这些文件拷到别的机子上,但那些机子上没有外部参照的源文件,会造成显示不出的问题,于是我想将所有的dwg文件中的外部参照都绑定起来,但一个一个地操作又太慢,那么用vc作一个arx文件来完成这个任务应该是不成问题的吧,我就请教该如何写这个代码?我是一个objectarx的初学者,请大家给我详细耐心地指导,我将不胜感激,谢谢
发表于 2007-11-21 00:42:00 | 显示全部楼层
我也想知道。。。
发表于 2007-11-22 19:07:00 | 显示全部楼层
我从来不用布局,也很少用到外部参照,没有遇到楼主所说的问题。呵呵。。。
发表于 2009-4-23 10:35:00 | 显示全部楼层
又没人讨论啦?高手高手,你们在哪里啊?
发表于 2011-3-18 10:55:55 | 显示全部楼层
可以用图纸集,里面有电子传递,可以批量绑定。但是不能选择插入,所以绑后图层变态的多,不知怎么解决
发表于 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[i], 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);                //必须先关闭这个块表
                }
        }
}
发表于 2011-11-13 10:58:49 | 显示全部楼层
有没有人开发一个lisp啊,我也很想实现这个功能啊,以后说不定啥地方就用上了啊,求助
发表于 2011-11-15 00:24:09 | 显示全部楼层
romao 发表于 2011-11-12 12:04
这个问题我已解决,给你一段小代码

这个程序怎么用啊,大侠
发表于 2011-11-17 16:48:07 | 显示全部楼层
这个程序怎么用啊,大侠


这是 ObjectARX 程序代码,先花半年时间啃下ObjectARX吧,前提是还要精通 C++
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-29 02:46 , Processed in 0.200419 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表