望山居

真相本来是一体的,太大了,所以大家给他画了格子,结果把自己困了起来

导航

ObjectARX(CAD)_Step2_1

Adding Commands using the ObjectARX Wizardk

本章的目的是为了在我们通过 ObjectARX Wizard 构建的项目中,添加两个 CAD 命令

1. Object Wizard 生成的 acrxEntryPoint.cpp 文件分析

完整代码
//-----------------------------------------------------------------------------
//----- acrxEntryPoint.cpp
//-----------------------------------------------------------------------------
#include "StdAfx.h"
#include "resource.h"

//-----------------------------------------------------------------------------
#define szRDS _RXST("asdk")

//-----------------------------------------------------------------------------
//----- ObjectARX EntryPoint, AutoCAD 传递信息地主要入口
class CWizardInitionApp : public AcRxArxApp {

public:
	CWizardInitionApp () : AcRxArxApp () {}

	virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
		// TODO: Load dependencies here

		// You *must* call On_kInitAppMsg here
		AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
		
		// TODO: Add your initialization code here

		return (retCode) ;
	}

	virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
		// TODO: Add your code here

		// You *must* call On_kUnloadAppMsg here
		AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;

		// TODO: Unload dependencies here

		return (retCode) ;
	}

	virtual void RegisterServerComponents () {
	}
	
	// The ACED_ARXCOMMAND_ENTRY_AUTO macro can be applied to any static member 
	// function of the CWizardInitionApp class.
	// The function should take no arguments and return nothing.
	//
	// NOTE: ACED_ARXCOMMAND_ENTRY_AUTO has overloads where you can provide resourceid and
	// have arguments to define context and command mechanism.
	
	// ACED_ARXCOMMAND_ENTRY_AUTO(classname, group, globCmd, locCmd, cmdFlags, UIContext)
	// ACED_ARXCOMMAND_ENTRYBYID_AUTO(classname, group, globCmd, locCmdId, cmdFlags, UIContext)
	// only differs that it creates a localized name using a string in the resource file
	//   locCmdId - resource ID for localized command

	// Modal Command with localized name
	// ACED_ARXCOMMAND_ENTRY_AUTO(CWizardInitionApp, asdkMyGroup, MyCommand, MyCommandLocal, ACRX_CMD_MODAL)
	static void asdkMyGroupMyCommand () {
		// Put your command code here

	}

	// Modal Command with pickfirst selection
	// ACED_ARXCOMMAND_ENTRY_AUTO(CWizardInitionApp, asdkMyGroup, MyPickFirst, MyPickFirstLocal, ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET)
	static void asdkMyGroupMyPickFirst () {
		ads_name result ;
		int iRet =acedSSGet (ACRX_T("_I"), NULL, NULL, NULL, result) ;
		if ( iRet == RTNORM )
		{
			// There are selected entities
			// Put your command using pickfirst set code here
		}
		else
		{
			// There are no selected entities
			// Put your command code here
		}
	}

	// Application Session Command with localized name
	// ACED_ARXCOMMAND_ENTRY_AUTO(CWizardInitionApp, asdkMyGroup, MySessionCmd, MySessionCmdLocal, ACRX_CMD_MODAL | ACRX_CMD_SESSION)
	static void asdkMyGroupMySessionCmd () {
		// Put your command code here
	}

	// The ACED_ADSFUNCTION_ENTRY_AUTO / ACED_ADSCOMMAND_ENTRY_AUTO macros can be applied to any static member 
	// function of the CWizardInitionApp class.
	// The function may or may not take arguments and have to return RTNORM, RTERROR, RTCAN, RTFAIL, RTREJ to AutoCAD, but use
	// acedRetNil, acedRetT, acedRetVoid, acedRetInt, acedRetReal, acedRetStr, acedRetPoint, acedRetName, acedRetList, acedRetVal to return
	// a value to the Lisp interpreter.
	//
	// NOTE: ACED_ADSFUNCTION_ENTRY_AUTO / ACED_ADSCOMMAND_ENTRY_AUTO has overloads where you can provide resourceid.
	
	//- ACED_ADSFUNCTION_ENTRY_AUTO(classname, name, regFunc) - this example
	//- ACED_ADSSYMBOL_ENTRYBYID_AUTO(classname, name, nameId, regFunc) - only differs that it creates a localized name using a string in the resource file
	//- ACED_ADSCOMMAND_ENTRY_AUTO(classname, name, regFunc) - a Lisp command (prefix C:)
	//- ACED_ADSCOMMAND_ENTRYBYID_AUTO(classname, name, nameId, regFunc) - only differs that it creates a localized name using a string in the resource file

	// Lisp Function is similar to ARX Command but it creates a lisp 
	// callable function. Many return types are supported not just string
	// or integer.
	// ACED_ADSFUNCTION_ENTRY_AUTO(CWizardInitionApp, MyLispFunction, false)
	static int ads_MyLispFunction () {
		//struct resbuf *args =acedGetArgs () ;
		
		// Put your command code here

		//acutRelRb (args) ;
		
		// Return a value to the AutoCAD Lisp Interpreter
		// acedRetNil, acedRetT, acedRetVoid, acedRetInt, acedRetReal, acedRetStr, acedRetPoint, acedRetName, acedRetList, acedRetVal

		return (RTNORM) ;
	}
	
} ;

//-----------------------------------------------------------------------------
IMPLEMENT_ARX_ENTRYPOINT(CWizardInitionApp)

ACED_ARXCOMMAND_ENTRY_AUTO(CWizardInitionApp, asdkMyGroup, MyCommand, MyCommandLocal, ACRX_CMD_MODAL, NULL)
ACED_ARXCOMMAND_ENTRY_AUTO(CWizardInitionApp, asdkMyGroup, MyPickFirst, MyPickFirstLocal, ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET, NULL)
ACED_ARXCOMMAND_ENTRY_AUTO(CWizardInitionApp, asdkMyGroup, MySessionCmd, MySessionCmdLocal, ACRX_CMD_MODAL | ACRX_CMD_SESSION, NULL)
ACED_ADSSYMBOL_ENTRY_AUTO(CWizardInitionApp, MyLispFunction, false)

2. 在 acrxEntryPoint.cpp 中实现两个方法 myInput & mySelect

原始生成地代码有些目前我们不需要的部分, 我们通过一些简单的删改, 在代码中添加两个函数 AsdkStep02_myInput & AsdkStep02_mySelect

  • "MYINPUT" 命令用于演示 ObjectARX输入函数 的使用
    a. 要求用户输入一个整数值,限制这个值必须大于零;
    b. 要求用户输入一个真实值, 同时允许基于关键字的输入, 比如用户可以键入这三个值: (PI, A, B), 如果用户键入的是 <ENTER> 键, 则默认是输入 "C", "PI" 的值是一个双精度的 3.14, "A" 的值 是 10.0;
    c. 额外考虑, 如果用户在命令执行过程中, 使用 <ESC> 按键时的处理方法;
    d. 在 AutoCAD 命令提示符 处显示 整型变量 和 双精度变量 的值;
图示
  • "MYSELECT" 命令用于演示 ObjectARX实体选择函数 的使用
    a. 要求用户选择一个实体(entity)
    b. 如果成功选择实体, 在命令提示行显示所选择实体的对象ID, 这是 ads_name 数据类型的第一个元素;
图示
完整代码

//-----------------------------------------------------------------------------
//----- ObjectARX EntryPoint
class CStep02App : public AcRxArxApp {

public:
	CStep02App () : AcRxArxApp () {}

	virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
		AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
		// TODO: Add your initialization code here

		return (retCode) ;
	}

	virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
		AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;
		// TODO: Add your code here

		return (retCode) ;
	}

	virtual void RegisterServerComponents () 
	{
	}

	// ----- AsdkStep02._myInput command (do not rename)
    /*
    * MYINPUT 命令, 主要用于演示 ObjectARX 输入函数的使用
    */
	static void AsdkStep02_myInput(void)
	{
		// Add your code for command AsdkStep02._myInput here
		int stat, iValue ;
		double rValue ;
		TCHAR kWord [133] ;

		acedInitGet (RSG_NONEG | RSG_NOZERO, _T("")) ;

		if ( acedGetInt (_T("\nEnter an integer value: "), &iValue) != RTNORM )
			return ;

		rValue =12.0 ;
		acedInitGet (RSG_NOZERO, _T("PI A B C")) ;
		stat =acedGetReal (_T("\nEnter a real value [PI/A/B/C] <C>: "), &rValue) ;
		switch (stat) {
			case RTCAN: // User termination
				return ;
			case RTKWORD: // Got a keyword
				if ( acedGetInput (kWord) != RTNORM )
					return ;
				if ( !_tcscmp (_T("PI"), kWord) )
					rValue =3.14 ;
				else if ( !_tcscmp (_T("A"), kWord) )
					rValue =10 ;
				else if ( !_tcscmp (_T("B"), kWord) )
					rValue =11 ;
				else if ( !_tcscmp (_T("C"), kWord) )
					rValue =12 ;
				break ;
			case RTNONE:
				acutPrintf (_T("\nTake default rValue %lf"), rValue) ;
				break ;
			case RTNORM:
				break ;
			default:
				return ;
		}

		acutPrintf (_T("\nInteger : %d"), iValue) ;
		acutPrintf (_T("\nReal    : %lf"), rValue) ;
	}

	// ----- AsdkStep02._mySelect command (do not rename)
	static void AsdkStep02_mySelect(void)
	{
		// Add your code for command AsdkStep02._mySelect here
		ads_name en ;
		ads_point pt ;

		if ( acedEntSel (NULL, en, pt) != RTNORM )
			return ;

		acutPrintf (_T("\nYou selected entity ID: %ld"), en [0]) ;
	}
} ;

//-----------------------------------------------------------------------------
IMPLEMENT_ARX_ENTRYPOINT(CStep02App)

ACED_ARXCOMMAND_ENTRY_AUTO(CStep02App, AsdkStep02, _mySelect, mySelect, ACRX_CMD_TRANSPARENT, NULL)
ACED_ARXCOMMAND_ENTRY_AUTO(CStep02App, AsdkStep02, _myInput, myInput, ACRX_CMD_TRANSPARENT, NULL)

posted on 2022-09-27 20:56  穆道  阅读(122)  评论(0编辑  收藏  举报