发新话题
打印

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

本主题被作者加入到个人文集中

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

给ACAD增加个命令,修改外部DWG文件,给所有LINE加扩展数据的完整的ARX代码...
  #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;
}

TOP

强,虽然看着头晕!

TOP

发新话题