现在的位置: 首页 > 综合 > 正文

给ACAD增加个命令,修改外部DWG文件,给所有LINE加扩展数据的完整的ARX代码…

2012年10月07日 ⁄ 综合 ⁄ 共 2944字 ⁄ 字号 评论关闭
#include

#include // acadErrorStatusText

#include

 

#include // AcDbCircle

#include

 

#include // 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;

}

 

抱歉!评论已关闭.