01 Hello world

原文转载自:CAD ObjectARX二次开发之HelloWorld手动创建 - 百年一梦 - 博客园

CAD ObjectARX二次开发之HelloWorld手动创建 

 


Top

一、新建类库【HelloWorld手动创建】项目

Top

二、导入Arx的相关库依赖

1、附件包含目录:即ObjectARX SDK的解压包的头文件目录

D:\Autodesk\Autodesk_ObjectARX\ObjectARX 2010\inc

D:\Autodesk\Autodesk_ObjectARX\ObjectARX 2010\inc-x64

2、附加库目录:即ObjectARX SDK的解压包的lib文件目录,根据需要导入64位或者32位

D:\Autodesk\Autodesk_ObjectARX\ObjectARX 2010\lib-x64

3、附加依赖项:开发需要的常用连接库,可根据需要自行添加。
rxapi.lib
acdb18.lib
acge18.lib
acad.lib
acedapi.lib

1、修改编译目标平台为X64

2、添加附加包含目录

3、添加附加库目录

4、添加附加依赖项

注意点击应用和保存,检查确认是否配置成功!

Top

三、编写代码

1、注释掉默认生成的类头文件中using namespace System或者直接删除头文件。

不处理则会报如下错误:

2、编写代码如下:

// 这是主 DLL 文件。

#include "stdafx.h"
#include "tchar.h"
#include <aced.h>
#include <rxregsvc.h>

//函数声明
void HelloWorld();

//注册命令,初始化应用
void initApp(){
	//命令注册
	//cmdGroupName:命令组名, cmdGlobalName:全局命令名, cmdLocalName:本地命令名, commandFlags:命令标记, FunctionAddr:命令执行函数, UIContext:UI
	acedRegCmds->addCommand(_T("HELLOWORLD_COMMANDS"), _T("Hello"),_T("HelloDemo"), ACRX_CMD_TRANSPARENT,HelloWorld);
}
//移除命令,卸载应用
void unloadApp(){
	acedRegCmds->removeGroup(_T("HELLOWORLD_COMMANDS"));
}
//命令执行函数
void HelloWorld(){
	acutPrintf(_T("\nHello World + Hello World"));
}
//外部函数,通过此函数接受CAD消息,进行初始化加载
extern "C" AcRx::AppRetCode acrxEntryPoint(AcRx::AppMsgCode msg,void* pkt)
{
	switch(msg)
	{

	case AcRx::kInitAppMsg://App插件初始化消息
		{
			initApp();
			break;
		}
	case AcRx::kUnloadAppMsg://App插件卸载消息
		{
			unloadApp();
			break;
		}
	default:
		break;
	}
	return AcRx::kRetOK;
}


3、在源文件目录下添加模板定义文件

LIBRARY	"Demo_HelloWorld1"
EXPORTS
acrxEntryPoint PRIVATE
acrxGetApiVersion PRIVATE
Top

四、编译测试

1、修改生成文件格式为arx, 编译

说明:CAD的arx文件本质就是DLL动态库文件

2、打开CAD加载运行

执行HeelloDemo命令,显示打印结果

第二篇文章

ARX开发的方式是,将自己的函数注册给库,指定调用命令就完成了。

CAD加载我们的程序后,用你事先指定的命令,就可以调用对应的函数了。

重点来了,在创建我们自己的函数之前,我们先学习模板里预留给我们的函数。

在acrxEntryPoint.cpp 77行左右,你应该能看到这个函数

	static void ADSKMyGroupMyCommand () {
		// Put your command code here
	}

这就是一个可以被注册为CAD指令的函数。

函数名其实是两部分组成的,前半段为ADSKMyGroup,后半段为MyCommand。

前半段的意义类似于名字空间,默认是你的RDS符号+MyGroup,实际上可以是任何合法的字符

后半段才是真正的函数名,是你想给函数取的名字。

比如你可以取一个函数名为 static void CloudTestInput(){ }

请注意,修辞是static,返回值是void,参数为空,都是固定的,不能变。

虽然现在函数内部是空的,没有关系,最后一步再来写函数内容,先看文件最下面,找到这一句

ACED_ARXCOMMAND_ENTRY_AUTO(CArxProject1App, ADSKMyGroup, MyCommand, MyCommandLocal, ACRX_CMD_MODAL, NULL)

这是将函数注册为CAD指令的方法。

一共有6个参数。

参数1:程序标识符,使用默认值

参数2:注册函数的前半段名字,也就是刚才说的名字空间

参数3:注册函数的后半段名字,真正意义的函数名

参数3:CAD指令。这是你创建的CAD指令,当在CAD中输入这条指令时就会调用对应的函数。

参数4:模式,暂时使用默认值。

参数5:默认NULL

生成程序,会得到一个后缀为ARX的文件,这就是我们的CAD插件。不过现在这个插件没有任何功能。

我们现在来写函数内容,让这个插件拥有接收用户输入的功能。

注意,ARX要求生成过程中0警告0错误,哪怕有一个警告也会阻止生成成功。

所以,拿出强迫症精神,做ARX开发,一个警告都不能有。

我们给刚才的函数内部添加如下内容:

	static void ADSKMyGroupMyCommand() {

		wchar_t temp[32];
		wmemset(temp, 0, 32);

		acutPrintf(_T("这是我的第一个ARX插件\n"));		//输出
		acedGetString(0,_T("请问你的名字是:"),temp);	//输入
		acutPrintf(_T("你好,%s\n"),temp);		//输出
	}

  

简介一下acedGetString函数,这是接受输入的函数,有很多重载方式,当前使用的方式有三个参数。

参数1:若为0,空格和回车都会使字符串输入结束,若非0,空格不会使字符串输入结束,需要回车才会结束。

参数2:输出字符串的部分

参数3,接收字符串的缓存

生成新的ARX吧,然后依照第三节的内容加载ARX并且执行这条指令。

指令是你自己创建的,本例中为 MyCommandLocal。

执行效果如下:

你可以依照上面的格式,自己在acrxEntryPoint.cpp文件的类中添加新的函数

然后添加一条新的注册指令。

就像这样

	static void BIMCloudHello() {

		wchar_t temp[32];
		wmemset(temp, 0, 32);

		acutPrintf(_T("这是我的第一个ARX插件\n"));		//输出
		acedGetString(0,_T("请问你的名字是:"),temp);	//输入
		acutPrintf(_T("你好,%s\n"),temp);			//输出
	}



ACED_ARXCOMMAND_ENTRY_AUTO(CArxProject1App, BIMCloud, Hello, myhello, ACRX_CMD_MODAL, NULL)

  

然后在CAD中执行myhello指令,就可以调用这个函数了。记得,新函数要添加在acrxEntryPoint文件的类当中,作为一个类成员函数。

你应该已经注意到,整个过程中没有添加任何头文件,

因为创建模板的时候,ARX向导已经帮我们添加好了,所以非常方便,直接就可以写业务逻辑了。

但是你用到Unicode字符的话,就需要自己添加

#include "tchar.h"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值