找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 609|回复: 1

修改外部DWG文件,给所有LINE加扩展数据的完整的ARX代码 by XDSoft

[复制链接]

已领礼包: 444个

财富等级: 日进斗金

发表于 2002-1-24 18:35:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
给ACAD增加个命令,修改外部DWG文件,给所有LINE加扩展数据的完整的ARX代码
#include <aced.h>
#include <acestext.h>      // acadErrorStatusText
#include <adslib.h>

#include <dbents.h>        // AcDbCircle
#include <dbsymtb.h>

#include <geassign.h>      // asDblArray

/*
* Register an application for xData
*
* In :
*    AcDbDatabase* pDb      : Database
*  const char* pAppName  : application name
*  Adesk::Boolean exclude :
*      If exclude == Adesk::kTrue, then xData associated with
*      this AcDbRegAppTableRecord will not be saved when the
*      drawing is saved as a release 12 (R12) drawing.  
*      If exclude == Adesk::kFalse, the data will be saved
*      during a saveAsR12 operation.
*/
Acad::ErrorStatus
registerApp(AcDbDatabase* pDb, const char * pAppName,Adesk::Boolean exclude =

Adesk::kFalse)
{
    AcDbRegAppTable* pAppTable;
    Acad::ErrorStatus es;

    // get the RegAppTable
    if((es = pDb->getRegAppTable(pAppTable,AcDb::kForWrite)) != Acad::eOk)
     return es;

    // if RegAppTable has application already - fine
    if(pAppTable->has(pAppName))
    {
     pAppTable->close();
     return Acad::eOk;
    }

    AcDbRegAppTableRecord* pAppTableRecord = new AcDbRegAppTableRecord();
    pAppTableRecord->setExcludeFromSaveAsR12(exclude);
    pAppTableRecord->setName(pAppName);

    if((es = pAppTable->add(pAppTableRecord)) != Acad::eOk)
    {
     delete pAppTableRecord;
     pAppTable->close();
     return es;
    }
    pAppTableRecord->close();
    pAppTable->close();
    return es;
}

/*
* Add to all lines in model space a point as xData
*/
Acad::ErrorStatus
addXDataToAllLines(AcDbDatabase* pDb,const char *pAppName)   
{
    AcDbBlockTable *pBlockTable;
    AcDbBlockTableRecord *pModelSpace;
    Acad::ErrorStatus es;

    if((es = pDb->getBlockTable(pBlockTable,AcDb::kForRead)) != Acad::eOk)
     return es;

    if((es = pBlockTable->getAt(ACDB_MODEL_SPACE,pModelSpace,AcDb::kForRead))
!=
Acad::eOk)
    {
     pBlockTable->close();
     return es;
    }
    pBlockTable->close();

    AcDbBlockTableRecordIterator *pIter;
    if((es = pModelSpace->newIterator(pIter)) != Acad::eOk)
    {
     pModelSpace->close();
     return es;
    }

    AcDbEntity* pEnt;
    AcDbLine* pLine;
    for(;!pIter->done();pIter->step())
    {
     if(pIter->getEntity(pEnt,AcDb::kForRead) != Acad::eOk)
        continue;
     pLine = AcDbLine::cast(pEnt);
     if(pLine)
     {
        struct resbuf* xdata;
        AcGePoint3d pntToAttach = pLine->startPoint();
        xdata =
ads_buildlist(1001,pAppName,1011,asDblArray(pntToAttach),0);
        pLine->upgradeOpen();
        if((es = pLine->setXData(xdata)) != Acad::eOk)
        {
         ads_printf("\nsetXData failed : es =
%s",acadErrorStatusText(es));
        }
        ads_relrb(xdata);
     }
     pEnt->close();
    }
    delete pIter;
    return Acad::eOk;
}

void addXDataToExternalDb()
{
    Acad::ErrorStatus es;
    char* filename = "c:\\temp\\test.dwg";
    char* appName = "AcDcApp";

    AcDbDatabase *pDb = new AcDbDatabase(Adesk::kFalse);

    if((es = pDb->readDwgFile(filename)) != Acad::eOk)
    {
     ads_printf("\nreadDwgFile failed for %s : es =
%s",filename,acadErrorStatusText(es));
     return;
    }

    if((es = registerApp(pDb,appName)) != Acad::eOk)
     ads_printf("\nregisterApp failed : es = %s",acadErrorStatusText(es));
    addXDataToAllLines(pDb,appName);

    pDb->saveAs("c:\\temp\\test2.dwg");
    delete pDb;
}

void initApp()
{
    acedRegCmds->addCommand("TEST",
              "addx",
              "addx",
              ACRX_CMD_MODAL,
              &addXDataToExternalDb);
}

void unloadApp()
{
    acedRegCmds->removeGroup( "TEST" );
}

extern "C" AcRx::AppRetCode acrxEntryPoint( AcRx::AppMsgCode msg, void* p )
{
    switch (msg) {
    case AcRx::kInitAppMsg:
     acrxUnlockApplication( p );
     initApp();
     break;
    case AcRx::kUnloadAppMsg:
     unloadApp();
     break;
    default:
     break;
    }
    return AcRx::kRetOK;
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 1261个

财富等级: 财源广进

发表于 2005-11-26 01:41:07 | 显示全部楼层
能写个使用说明吗?刚学习,不太懂
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-5-29 06:37 , Processed in 0.337081 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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