📄 exam04b.cpp
字号:
#include <stdlib.h>
#include <string.h>
#include <rxobject.h>
#include <rxregsvc.h>
#include <aced.h>
#include <dbsymtb.h>
#include <adslib.h>
#include "acestext.h"
void printXdata();
void addXdata();
void printList(struct resbuf* pRb);
AcDbObject* selectObject(AcDb::OpenMode openMode);
void initApp();
void unloadApp();
extern "C"
AcRx::AppRetCode acrxEntryPoint(AcRx::AppMsgCode, void*);
void
printXdata()
{
AcDbObject *pObj;
if ((pObj = selectObject(AcDb::kForRead)) == NULL) {
return;
}
char appname[133];
if (acedGetString(NULL,
"\nEnter the desired Xdata application name: ",
appname) != RTNORM)
{
return;
}
struct resbuf *pRb;
pRb = pObj->xData(appname);
if (pRb != NULL) {
printList(pRb);
acutRelRb(pRb);
} else {
acutPrintf("\nNo xdata for this appname");
}
pObj->close();
}
void
addXdata()
{
AcDbObject* pObj = selectObject(AcDb::kForRead);
if (!pObj) {
acutPrintf("Error selecting object\n");
return;
}
char appName[132], resString[200];
appName[0] = resString[0] = '\0';
acedGetString(NULL, "Enter application name: ",
appName);
acedGetString(NULL, "Enter string to be added: ",
resString);
struct resbuf *pRb, *pTemp;
pRb = pObj->xData(appName);
if (pRb != NULL) {
for (pTemp = pRb; pTemp->rbnext != NULL;
pTemp = pTemp->rbnext)
{ ; }
} else {
acdbRegApp(appName);
pRb = acutNewRb(AcDb::kDxfRegAppName);
pTemp = pRb;
pTemp->resval.rstring
= (char*) malloc(strlen(appName) + 1);
strcpy(pTemp->resval.rstring, appName);
}
pTemp->rbnext = acutNewRb(AcDb::kDxfXdAsciiString);
pTemp = pTemp->rbnext;
pTemp->resval.rstring
= (char*) malloc(strlen(resString) + 1);
strcpy(pTemp->resval.rstring, resString);
pObj->upgradeOpen();
pObj->setXData(pRb);
pObj->close();
acutRelRb(pRb);
}
void
printList(struct resbuf* pRb)
{
int rt, i;
char buf[133];
for (i = 0;pRb != NULL;i++, pRb = pRb->rbnext) {
if (pRb->restype < 1010) {
rt = RTSTR;
} else if (pRb->restype < 1040) {
rt = RT3DPOINT;
} else if (pRb->restype < 1060) {
rt = RTREAL;
} else if (pRb->restype < 1071) {
rt = RTSHORT;
} else if (pRb->restype == 1071) {
rt = RTLONG;
} else {
rt = pRb->restype;
}
switch (rt) {
case RTSHORT:
if (pRb->restype == RTSHORT) {
acutPrintf(
"RTSHORT : %d\n", pRb->resval.rint);
} else {
acutPrintf("(%d . %d)\n", pRb->restype,
pRb->resval.rint);
};
break;
case RTREAL:
if (pRb->restype == RTREAL) {
acutPrintf("RTREAL : %0.3f\n",
pRb->resval.rreal);
} else {
acutPrintf("(%d . %0.3f)\n", pRb->restype,
pRb->resval.rreal);
};
break;
case RTSTR:
if (pRb->restype == RTSTR) {
acutPrintf("RTSTR : %s\n",
pRb->resval.rstring);
} else {
acutPrintf("(%d . \"%s\")\n", pRb->restype,
pRb->resval.rstring);
};
break;
case RT3DPOINT:
if (pRb->restype == RT3DPOINT) {
acutPrintf(
"RT3DPOINT : %0.3f, %0.3f, %0.3f\n",
pRb->resval.rpoint[X],
pRb->resval.rpoint[Y],
pRb->resval.rpoint[Z]);
} else {
acutPrintf("(%d %0.3f %0.3f %0.3f)\n",
pRb->restype,
pRb->resval.rpoint[X],
pRb->resval.rpoint[Y],
pRb->resval.rpoint[Z]);
}
break;
case RTLONG:
acutPrintf("RTLONG : %dl\n", pRb->resval.rlong);
break;
}
if ((i == 23) && (pRb->rbnext != NULL)) {
i = 0;
acedGetString(0,
"Press <ENTER> to continue...", buf);
}
}
}
AcDbObject*
selectObject(AcDb::OpenMode openMode)
{
int ss;
ads_name en;
ads_point pt;
ss = acedEntSel("\nSelect an Entity: ", en, pt);
AcDbObjectId eId;
if (ss!=RTNORM)
{
acutPrintf("Selection error, Return Code==%d\n",ss);
return NULL;
}
Acad::ErrorStatus retStat;
retStat = acdbGetObjectId(eId, en);
if (retStat != Acad::eOk)
{
acutPrintf("\nacdbGetObjectId failed");
acutPrintf("\nen==(%lx,%lx), retStat==%d\n",
en[0], en[1], eId);
return NULL;
}
AcDbObject* obj;
if ((retStat = acdbOpenObject(obj, eId, openMode))
!= Acad::eOk)
{
acutPrintf("acdbOpenEntity failed: ename:(%lx,%lx),"
" mode:%d retStat:%d", en[0], en[1],
openMode, retStat);
return NULL;
}
return obj;
}
void
initApp()
{
acedRegCmds->addCommand("EXAM04B",
"PRINTX", "PRINTX", ACRX_CMD_MODAL,
printXdata);
acedRegCmds->addCommand("EXAM04B",
"ADDXDATA", "ADDXDATA", ACRX_CMD_MODAL,
addXdata);
}
void
unloadApp()
{
acedRegCmds->removeGroup("EXAM04B");
}
AcRx::AppRetCode
acrxEntryPoint(AcRx::AppMsgCode msg, void* appId)
{
switch (msg) {
case AcRx::kInitAppMsg:
acrxDynamicLinker->unlockApplication(appId);
acrxDynamicLinker->registerAppMDIAware(appId);
initApp();
break;
case AcRx::kUnloadAppMsg:
unloadApp();
}
return AcRx::kRetOK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -