天天看點

ObjectARX(VC++)-ADSRX和使用者互動-acedCommand函數和結果緩沖區“MustSwitchTo_acedCommandC_or_acedCommandS”: 未聲明的辨別符

建立一個ObjectARX工程,名稱為Resbuf。

一、注冊一個新指令AddCircle1

(1)

ObjectARX(VC++)-ADSRX和使用者互動-acedCommand函數和結果緩沖區“MustSwitchTo_acedCommandC_or_acedCommandS”: 未聲明的辨別符

---------------------

ObjectARX(VC++)-ADSRX和使用者互動-acedCommand函數和結果緩沖區“MustSwitchTo_acedCommandC_or_acedCommandS”: 未聲明的辨別符

 (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)效果

ObjectARX(VC++)-ADSRX和使用者互動-acedCommand函數和結果緩沖區“MustSwitchTo_acedCommandC_or_acedCommandS”: 未聲明的辨別符

使用Ctrl+F2調出文本視窗,可看到包含了建立圓的AutoCAD指令提示語句 

ObjectARX(VC++)-ADSRX和使用者互動-acedCommand函數和結果緩沖區“MustSwitchTo_acedCommandC_or_acedCommandS”: 未聲明的辨別符

二、注冊一個新指令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)效果

ObjectARX(VC++)-ADSRX和使用者互動-acedCommand函數和結果緩沖區“MustSwitchTo_acedCommandC_or_acedCommandS”: 未聲明的辨別符

打開文本視窗檢視提示:

ObjectARX(VC++)-ADSRX和使用者互動-acedCommand函數和結果緩沖區“MustSwitchTo_acedCommandC_or_acedCommandS”: 未聲明的辨別符

 三、注冊一個新指令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

ObjectARX(VC++)-ADSRX和使用者互動-acedCommand函數和結果緩沖區“MustSwitchTo_acedCommandC_or_acedCommandS”: 未聲明的辨別符
ObjectARX(VC++)-ADSRX和使用者互動-acedCommand函數和結果緩沖區“MustSwitchTo_acedCommandC_or_acedCommandS”: 未聲明的辨別符

參考資料:

 《AutoCAD ObjectARX(VC)開發基礎與執行個體教程》