- UID
- 42
- 积分
- 2687
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2002-1-9
- 最后登录
- 1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
给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;
} |
|