zoukankan      html  css  js  c++  java
  • [AutoCAD二次开发][2017]Autocad2017 ObjectARX 开发 环境配置和踩到的坑

    碎碎念

    不得不说autocad二次开发的相关资料真的少,大多数还很旧。图书馆里VBA的一本最近出版时间是2006,AutoLisp的2013(还是个十二五规划教材),ObjectARX的书是2014年出的,结果开发的是autocad2010,还配套VS2008,里面的内容也是......惨不忍睹......

    不过女朋友设计院的插件在AutoCAD2017上一用就崩也不是个办法(说实话用上2017就再也不想回2011了),只好自己找AutoCAD 2017的官方资料开搞。

    首先是技术选型问题,就查找到的资料而言二次开发有三个流派,AutoLisp,VBA(ActiveX), Cpp/C#(.Net + ObjectARX)。AutoLisp不了解,目前主要是解决问题(实现那一用就崩的插件里的一个小功能,功能下文再详细叙述),暂时不打算从头开始撸Lisp。ActiveX的提供(据说)很少,VBA我也不是很熟,作为次要选择。那么首先就先试试ObjectARX的水。

    正文

    AutoCAD 2017 的官方开发文档地址:

    http://help.autodesk.com/view/ACD/2017/CHS/?home=homepage_dev

    此外在Develop Center有学习资料。网址

    http://usa.autodesk.com/adsk/servlet/index?id=1911627&siteID=123112

     

    首先要下载ObjectArx2017的库。另外ARX集成到VS2015开发环境的Wizard不包含在库的安装包中,需要另外单独下载。

    ObjectARX2017库下载地址(需要Submit个人信息):

    http://usa.autodesk.com/adsk/servlet/item?siteID=123112&id=785550

    Wizard下载地址:

    http://images.autodesk.com/adsk/files/ObjectARXWizards-2017.zip

    首先安装ObjectARX库,它让你指定一个解压路径,解压完成后并不会有可执行文件进行进一步安装。这里面的文件根据32位和64位分别用于提供给VS2015来include和link。

    其次安装Wizard。装完Wizard之后Visual C++就会出现Autodesk开发的模板。

    安装Wizard这里有个坑: 如果直接双击安装,随后VS里工程创建时不会成功的。根据我的排查,得到的安装成功的必要条件为:

    1. VS2015必须安装了MFC组件

    2. Wizard必须主动以管理员身份安装,方法为已Admin身份启动一个cmd,再由这个cmd去启动Wizard的MSI安装包。(我第一次安装时UAC已设置到最低,msi安装时应该默认已经给了admin的权限,此处非常奇怪)

     

    如果选择不安装Wizard,自己手动创建一个win32 dll项目,也是可以的,主要可以参考”ObjectARX 2017 Trainning”里的CHM文档,按步骤配置可以走通。

    要点如下:

    1. 创建的项目是Win32 Dll 项目。

    2. 修改项目属性中的C/C++子项,Additional Include Directories里添加ObjectARX根目录下的inc/文件夹和inc-win32/(若采用64位编译则是inc-x64/)文件夹。

    3. C/C++子项中的Code Generation项里的Runtime Library改为Multi-threaded Dll

    4. C/C++中的Preprocessor中把_DEBUG宏去掉。(其实文档里这步已经让我考虑转VBA)

    5. 链接器(Linker)中添加附加依赖目录和附加依赖项。此处文档有坑: 附加依赖项是

    rxapi.lib; acdb21.lib; acge21.lib; acad.lib; ac1st21.lib; accore.lib;

    文档中的文件名是错误的(不存在的)。

    得到的配置截图(64位)如下:

     

     

     

     

    至此再敲教程的代码就可以正常运行了。

    我的示例代码为:

    // objectArxHelloWorld.cpp : 定义 DLL 应用程序的导出函数。
    //
    
    #include "stdafx.h"
    #include "tchar.h"
    #include <aced.h>
    #include <rxregsvc.h>
    
    
    void initApp();
    void unloadApp();
    
    void helloWorld();
    
    void initApp()
    {
        // register a command with the AutoCAD command mechanism
        acedRegCmds->addCommand(_T("HELLOWORLD_COMMANDS"),
            _T("Hello"),
            _T("Bonjour"),
            ACRX_CMD_TRANSPARENT,
            helloWorld);
    }
    
    void unloadApp()
    {
        acedRegCmds->removeGroup(_T("HELLOWORLD_COMMANDS"));
    
    }
    
    void helloWorld()
    {
        acutPrintf(_T("
    萌萌哒!"));
    }
    
    extern "C" AcRx::AppRetCode
    acrxEntryPoint(AcRx::AppMsgCode msg, void* pkt)
    {
        switch (msg)
        {
    
        case AcRx::kInitAppMsg:
            acrxDynamicLinker->unlockApplication(pkt);
            acrxRegisterAppMDIAware(pkt);
            initApp();
            break;
        case AcRx::kUnloadAppMsg:
            unloadApp();
            break;
        default:
            break;
    
        }
    
        return AcRx::kRetOK;
    
    }
  • 相关阅读:
    ORACLE通过netca配置监听遇到 TNS04415错误
    图说计算机编程简史
    关于在VS2008以下版本的MFC程序使用VS 2008 FeaturePack出现内存泄露的理解
    对话框的OnPaint函数的两种写法的区别
    Hibernate 3.6.0 Beta1
    Hibernate 3.6.0 Beta1
    Maven 与 Checkstyle
    NetBeans 时事通讯(刊号 # 110 Jul 21, 2010)
    NetBeans 时事通讯(刊号 # 111 Jul 28, 2010)
    教育哲学的碰撞
  • 原文地址:https://www.cnblogs.com/aweffr/p/7510544.html
Copyright © 2011-2022 走看看