建立一個ObjectARX工程,名稱為Resbuf。
一、注冊一個新指令AddCircle1
(1)
---------------------
(2)代碼實作:
static void AAAMyGroupAddCircle1() {
// Put your command code here
//聲明ADS變量
ads_point ptCenter = { 0, 0, 0 };//圓心
ads_real radius = 10; //半徑
//調用acedCommand函數建立圓
acedCommandS(RTSTR, TEXT("Circle"),
RTPOINT, ptCenter,
RTREAL, radius,
RTNONE);
}
(3)注意:
ObjectARX已經将acedCommand函數更新為acedCommandS函數,使用該函數需要添加頭檔案”acedCmdNF.h”。
否則會報錯:
“MustSwitchTo_acedCommandC_or_acedCommandS”: 未聲明的辨別符
(4) acedCommandS函數:
與文法相容的acedCommand替換,用于“完整指令”,而不是部分指令。這個指令從它自己的私有指令行處理器開始,在“指令:”提示符初始化。這些指令以與acedCommand相同的方式執行,除了當提供的輸入全部被執行時,私有指令行處理器被删除,并且以前的指令行處理器與調用時沒有變化。模式和透明的“内置”指令可能不會被嵌套。
(5)效果
使用Ctrl+F2調出文本視窗,可看到包含了建立圓的AutoCAD指令提示語句
二、注冊一個新指令AddCircle2
(1)代碼的實作:
static void AAAMyGroupAddCircle2() {
// Put your command code here
struct resbuf *rb;//結果款沖區
int rc = RTNORM;//傳回值
//建立結果緩沖區連結清單
ads_point ptCenter = { 30,0,0 };
ads_real radius = 10;
rb = acutBuildList(RTSTR, TEXT("Circle"),
RTPOINT, ptCenter,
RTREAL, radius,
RTNONE);
//建立圓
if (rb != NULL)
{
rc = acedCmdS(rb);
}
//檢驗傳回值
if (rc != RTNORM)
{
acutPrintf(TEXT("\n建立圓失敗!"));
}
acutRelRb(rb);
//進行縮放
acedCommandS(RTSTR, TEXT("Zoom"), RTSTR, TEXT("E"), RTNONE);
}
(2)注意:
acedCmd()應該改為acedCmdS(),同樣它的頭檔案為”acedCmdNF.h”,
若使用acedCmd()函數,則會報錯:
error C2065: “MustSwitchTo_acedCmdC_or_acedCmdS”: 未聲明的辨別符
(3)acedCmd函數:
acedCmdS()函數等價于acedcommand(),但是以結果緩沖區清單的形式将值傳遞給AutoCAD。這在複雜的邏輯涉及到構造一個AutoCAD指令清單時非常有用。acutBuildList()函數對于構造指令清單非常有用。
acedCmdS()函數還有一個優點,即可以在運作時修改指令清單,而不是在編譯時修複。它的缺點是執行起來要稍微長一點。
下面的示例代碼片段導緻AutoCAD在目前的圖形螢幕(或viewport)上執行重繪。
struct resbuf *cmdlist;
cmdlist = acutBuildList(RTSTR, "redraw", 0);
if (cmdlist == NULL) {
acdbFail("Couldn't create list\n");
return BAD;
}
acedCmdS(cmdlist);
acutRelRb(cmdlist)
(4)acutBuildList( )函數
通過配置設定結果緩沖區,從單個資料項中建立一個連結清單的結果緩沖區清單,配置設定由acutBuildList()參數指定的值,并将緩沖區連結在一起。
(5)acutRelRb( )函數
釋放配置設定給指定的結果緩沖區的記憶體,到它的連結清單中跟随它的所有結果緩沖區,以及配置設定給這些結果緩沖區中的字元串值的任何記憶體。
acutRelRb()函數是acutNewRb()的補充,但是你的應用程式應該調用acutRelRb()來釋放由其他幾個ARX庫函數自動配置設定的記憶體,包括acutBuildList()
(6)效果
打開文本視窗檢視提示:
三、注冊一個新指令EntInfo,用于提示使用者選擇一個實體,在指令視窗顯示該實體的參數
(1)代碼的實作
static void AAAMyGroupEntInfo() {
// Put your command code here
//提示使用者選擇實體
ads_name entName;
ads_point pt;
if (acedEntSel(TEXT("\n選擇實體:"), entName, pt) != RTNORM)
return;
struct resbuf *rbEnt; //儲存實體資料的結果緩沖區
struct resbuf *rb; //用于周遊rbEnt的結果緩沖區
//從entName獲得儲存實體資料的結果緩沖區
rbEnt = acdbEntGet(entName);
rb = rbEnt;
while (rb != NULL)
{
switch (rb->restype)
{
case -1: //圖元名
acutPrintf(TEXT("\n圖元名:%x"), rb->resval.rstring);
break;
case 0:
acutPrintf(TEXT("\n圖元類型:%s"), rb->resval.rstring);
case 8:
acutPrintf(TEXT("\n圖層:%s"), rb->resval.rstring);
break;
case 10:
acutPrintf(TEXT("\n圓心:(%.2f,%.2f,%.2f)"),
rb->resval.rpoint[X],
rb->resval.rpoint[Y],
rb->resval.rpoint[Z]);
break;
case 40: //半徑
acutPrintf(TEXT("\n半徑:%.4f"), rb->resval.rreal);
break;
case 210: //圓所在平面的法向矢量
acutPrintf(TEXT("\n平面的法向矢量:(%.2f,%.2f,%.2f)"),
rb->resval.rpoint[X],
rb->resval.rpoint[Y],
rb->resval.rpoint[Z]);
break;
default:
break;
}
rb = rb->rbnext; //切換到下一個節點
}
if (rbEnt != NULL)
{
acutRelRb(rbEnt);
}
}
(2)acedEntSel()函數:
提示使用者通過指定一個點來選擇一個實體。
(3)acdbEntGet()函數:
從繪圖資料庫中檢索指定的實體,并将其定義資料作為結果緩沖器的連結清單傳回。
(4)效果
在AutoCAD中建立一個實體-圓,然後執行指令EntInfo
參考資料:
《AutoCAD ObjectARX(VC)開發基礎與執行個體教程》