ObjectARX开发培训教程(实训讲义一)

可用的程序开发接口

ObjectARX COM Automation (VB, Java, Delphi, etc.) AutoLISP .NET 托管 API
AutoCAD自带的集成开发环境

Visual LISP Visual Basic, Applications Edition (VBA)
Time in seconds
ObjectARX .NET LISP
14
© 2005 Autodesk
在AutoCAD中存储数据
不同API方式的比较
数据容器存储性能比较
140000
Time in seconds
120000 100000 80000 60000 40000 20000 0 Xrecord Xdata ObjectARX .NET LISP VBA VB
22
© 2005 Autodesk
如何得到ObjectARX
SDK ( Software Development Kits)
免费下载
(SDK)
Autodesk 网站 / 检索 ObjectARX /adsk/servlet/item?siteID=123112&id=773180
26
© 2005 Autodesk
主要的库 - II
AcUi/AdUi MFC 扩展库 (adui17.lib acui17.lib) 自动化库(Automation) (axdb.lib oleaprot.lib) Internet 超链接库 (achapi17.lib) ADS 函数集 (acad.lib) 静态连接内存管理库 (rxheap.lib)
.ARX .DLL
.EXE AutoCAD
9
© 2005 Autodesk
客户端代码形式
慢
解释代码

代码脚本-AutoLISP
封装代码

预处理, 半解释代码-编译后的 Visual LISP
编译代码

编译器指令代码-ObjectARX
快
10
© 2005 Autodesk
AutoCAD API和集成开发环境
ObjectARX 培训
1
培训目标
培训内容主要是
ObjectARX基础知识 如何使用 ObjectARX 如何在以后的实际工作中独立的获取相关资源和帮助
不是
如何使用 C++ 对所有的ObjectARX API做完整的讲述
2
© 2005 Autodesk
培训形式
PPT介绍 实例讲解 上机练习 认证考试
.DLL .ARX
ObjectARX APIs API
.ARX .DLL
.EXE AutoCAD
25
© 2005 Autodesk
主要的库 - I
AcRx 对象和类管理库 (rxapi.lib) AcEd AutoCAD 编辑器工具库 (acedapi.lib) AcDb AutoCAD 数据库对象库 (acdb17.lib) AcGi AutoCAD 图形接口库 (acgiapi.lib) AcGe AutoCAD 几何库 (acge17.lib)
命令机制 II
移出命令和添加命令一样重要 命令名称可能冲突 命令属于不同的命令组(解决命令冲突的方法) 命令组必须是唯一的 Registered Developer Symbol (RDS)
/solution/partners/adn/symbols/index.htm
7
© 2005 Autodesk
客户端/服务器端交互
进程内

客户端/服务器端在同一进程
本地

客户端/服务器端在同一机器
远程

客户端/服务器端在同一网络
8
© 2005 Autodesk
嵌入架构
API被 可执行程序(宿主程序)执行 客户端通常为dll
.DLL .ARX
ObjectARX APIs API

按需加载


命令调用


Registry:通过注册表
从其他程序 Registry
按请求 代理检测
实时
acrxLoadModule 参见PolySamp
29
© 2005 Autodesk
加载 ObjectARX 程序 II
3. 5. 6. Operating System 1. LoadLibrary
编辑和扩展图形数据库 创建/编辑/删除对象 创建新的对象类型 编辑 AutoCAD 用户接口 命令 工具条/对话框 属性面板 设计中心 显示系统
监控/编辑 AutoCAD 标准的行为 事件通知 输入点获取
21
© 2005 Autodesk
开发环境
Windows Server 2003, Service Pack 1, Windows® XP Professional, Service Pack 1 or 2, or Windows 2000, Service Pack 4 Microsoft Visual C++® 2005 (Version 8.0) Pentium® IV or later 512 MB RAM 1024 x 768 VGA with True Color (minimum)
AutoCAD

一系列面向对象的C++库 一个框架 一个DLL插件模块 (.ARX) 不单单是个工具包 运行在AutoCAD进程中 可访问AutoCAD同一块内存空间 系统中包含特定的对象 自定义实体 反应器 ...
20
© 2005 Autodesk
ObjectARX能做什么?
27
© 2005 Autodesk
主要的库 - III
ASI - ACAD SQL 接口 (asiapi17.lib) ASE - ACAD SQL 环境 (aseapi17.lib) ISM 图象支持模块 (acismobj17.lib)
28
© 2005 Autodesk
加载 ObjectARX 程序 I

© 2005 Autodesk
API 包装
Client EXE, DLL, script, etc.
ATL templates
API 1
4 API
Application.exe
3 API
2
API
Static MFC Library
Win 32 API DLLs 1. 源代码 3. DLL 2. 静态库 4. EXE
Rxapi.lib
AutoCAD 1.
.ARX 2.
4.
2. _DllMainCRTStartup (C/C++ 运行库的入口函数) 3. CRT_INIT (初始化C/C++运行库和静态全局变量) 4. DllMain (see MSDN for info) 5. acrxGetApiVersion 6. acrxEntryPoint
用户加载

ARX & APPLOAD 命令 Drag & Drop 启动
acad.rx 文件 每行列出一个ARX名。AUTOCAD每次启动时都会在搜索路径下查找这个 文件,如果有,则顺序加载列表中的ARX程序 Registry (arxload) in acad.lsp 菜单设置
15
© 2005 Autodesk
在AutoCAD中存储数据
不同API方式的比较
数据容器存储性能比较
5000
Time in seconds
4000 3000 2000 1000 0 Xrecord Custom Object ObjectARX .NET VBA LISP
16
© 2005 Autodesk
API 比较结果
速度

ObjectARX, .NET, VBA ObjectARX , .NET (除了自定义实体)
功能

易用性

.NET , VBA
容易入门

.NET, VBA
17
© 2005 Autodesk
ObjectARX的优势
效率高 功能强 计算精度高 适用开发复杂的大型程序 调试方便
AutoCAD API 性能比较
100.00 90.00 80.00 70.00
S.0.58 API Performance
Seconds
60.00 50.00 40.00 30.00 20.00 10.00 0.00
Total Create 1000 2dPolylines Add XData to 1000 Entities Update 1000 Circles Create 1000 lines
ObjectARX
23
© 2005 Autodesk
ObjectARX SDK 内容
SDK包含: 库文件和头文件 开发文档 示例程序 实用工具
24
© 2005 Autodesk
.ARX = .DLL + 2 输出函数


acrxEntryPoint acrxGetApiVersion
18
© 2005 Autodesk
课程进度

API 概览 ObjectARX基本知识 用户交互和选择集 数据库操作 实体对象操作和事务 扩充数据 反应器 几何类的使用 用户界面 自定义对象
19
© 2005 Autodesk
什么是 ObjectARX?
合集下载

ObjectArx自定义实体入门

ObjectArx自定义实体入门

[资料] ObjectArx自定义实体入门(C++)及注意事项收藏本文介绍了构造自定义实体的步骤、必须继承的函数和必须注意的事项1.新建一个从AcDbEntity继承的类,如EntTest,必须添加的头文件: "stdarx.h","acadstrc.h", "geassign.h"。

2.在该类头文件的类声明中添加宏:ACRX_DECLARE_MEMBERS(EntTest);3.在该类的cpp文件中,类的前面添加宏:ACRX_DXF_DEFINE_MEMBERS(EntTest, AcDbEntity,AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent,0,平面实体,"autoCAD");//第5个参数为在CAD中该实体类的名称,MAKE_ACDBOPENOBJECT_FUNCTION(EntTest);4.从AcDbEntity类中重载几个必须的虚函数:virtual Adesk::Boolean worldDraw(AcGiWorldDraw* mode);virtual Acad::ErrorStatus dwgInFields(AcDbDwgFiler*);virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler*) const;virtual Acad::ErrorStatus getGripPoints(AcGePoint3dArray&gripPoints,AcDbIntArray&osnapModes,AcDbIntArray& geomIds) const;virtual Acad::ErrorStatus moveGripPointsAt(const AcDbIntArray& indices,const AcGeVector3d& offset);5.实现第4步中几个虚函数必须注意:在dwgInFields函数的开始处必须有:assertWriteEnabled();AcDbObject::dwgInFields(pFiler);if(pFiler->filerType()==AcDb::kWblockCloneFiler){AcDbHardPointerId Id;pFiler->readItem(&Id);}在dwgOutFields函数的开始处必须有:assertReadEnabled();AcDbObject::dwgOutFields(pFiler);if (pFiler->filerType()==AcDb::kWblockCloneFiler)pFiler->writeHardPointerId((AcDbHardPointerId)ownerId());上叙两个函数是用来写入写出自定义实体的成员变量的,以保证在拖动夹点的过程中这些变量是实时变化的(可以在worldDraw或moveGripPointsAt中改变这些值)。

ObjectARX 2006 实例教程

ObjectARX 2006 实例教程
-i-
ObjectARX2006 实例教程
3.2.3 SETLAYER 命令的算法............................................................................................21 3.2.4 SETLAYER 命令的代码............................................................................................22 3.3 测试 CREATE 和 SETLAYER 命令..........................................................................................24 实例 4.命名对象词典_Xrecords......................................................................................................25 本节目标 ....................................................................................................................................25 4.1 实现 ADDENTRY,LISTENTRIES 和 REMOVEENTRY 命令......................................................26 4.1.1 ADDENTRY 命令的算法.............................................

ObjectARX

ObjectARX

ObjectARX1. ObjectARX的介绍:ObjectARX是AutoDesk公司针对AutoCAD平台上的二次开发而推出的一个开发软件包,它提供了以C++为基础的面向对象的开发环境及应用程序接口,能真正快速的访问AutoCAD图形数据库。

与以往的AutuCAD 二次开发工具AutoLISP 和ADS不同,ObjectARX应用程序是一个DLL(动态链接库),共享AutoCAD的地址空间,对AutoCAD进行直接函数调用。

所以,使用ARX编程的函数的执行速度得以大大提高。

ARX 类库采用了标准的C++类库的封装形式,这也大大提高了程序员编程的可靠度和效率。

ObjectARX目前最新的版本是ObjectARX2002,它在原有Obj ectARX的基础上,特别增加了XML的支持。

XML是可扩展标记语言(eXtensible Markup Language)。

它是应用软件与Internet的接口。

通过支持XML,为Object ARX开发网络协作应用提供了有力的支持。

2. 开发环境的设置:运用ObjectARX进行二次开发,必须首先设置好ObjectARX的开发环境。

目前常用的开发环境是Microsoft Visual C++ 6.0。

同时,还需要安装ObjectARX SDK,ObjectARX SDK可以在AutoDesk公司的网站上免费下载。

不同的AutoCAD版本对应相应的ObjectARX SDK的版本,目前常用的是ObjectARX SDK for AutoCAD R14和ObjectARX SDK for AutoCAD2000i。

这两个开发工具在设置上略有不同,将进行对比介绍。

安装好VC++和ObjectARX后,就可以开始设置开发环境了。

1)设置INC和LIB文件寻找路径INC和LIB文件寻找路径为VC++的环境参数,设置一次即可,对以后的所有项目均有效。

选择Tools→Options …,出现Option对话框,选择Directories页,在Show Directories for中选择Include files,然后在Directo ries中加上ARX的INC目录路径c:\objectarx\inc(假定ARX的开发工具在c:\objec tarx\中)。

ObjectARX实训讲义二自定义实体ppt课件

ObjectARX实训讲义二自定义实体ppt课件

8
建立运行时类层次

rxInit (static) gpDesc (static variable) newAcRxClass acrxBuildClassHierarchy
9
类别判断函数

最基础的类AcRxObject提供了类型识别函数
virtual AcRxClass* isA() const; static AcRxClass* gpDesc; static AcRxClass* desc(); static CMyClass * cast(const AcRxObject* inPtr)
ObjectARX Trainer’Training
1
自定义实体的思路

什么是自定义实体

如何创建自定义实体

AcDbEntity虚函数的功能和使用

现场创建一个自定义实体 Tips and Tricks
2

•


自定义实体 操作自定义实体Smiley
什么是自定义实体
自定义一个图形对象、控制它图形显示,存储的数据,对 拖拽的响应,对捕捉的响应,平移、旋转等操作的响应
其它重要重载函数

设置自定义实体的捕捉函数

getOsnapPoints() transformBy()

对平移,复制,镜像等操作的响应函数


生成代理实体的图形形状函数

saveAs()
interSectWith()
16

相交函数


炸开函数
次常用重载函数

深度克隆
DeepClone wblockClone

ObjectArx开发培训教程

ObjectArx开发培训教程
ObjectARX Training
华中科技大学CAD中心 武汉天喻软件有限责任公司 2010年2月
ObjectARX应用的介绍
• ObjectARX是一个仅在AutoCAD上进行二 次开发的一套开发环境,通俗点讲就是一 系列的API • ObjectARX的应用举例:
– 扩展AutoCAD功能 – 为各种工程设计开发便利的工具
• • • • • •
AcDbDatabase构造函数的noDocument参数控制打开的数据库是否与当前文档关联,此参数用 于“多文档处理”中。 • 注意:在这种情况下,AcDbdatabase()的参数必须指定为false(当然,0或者Adesk::kFalse都可 以)。因为使用pDb->readDwgFile()函数时,pDb必须是一个完全空白的数据库,也就是说,哪 怕使用了AcDbDatabase(false);新建数据库后,只要对数据库进行了操作,就不能再使用 readDwgFile()函数,否则会导致严重的内存错误。 Object ARX TianyuSoft 15
• 三、自定义对象生成与编缉
– 双击修改/Jig/属性页
Object ARX TianyuSoft 8
培训安排-2
• 四、一些重要对象
– 字典/层/线型/字体样式
• 五、扩展数据 • 六、反应器 • 八、总结
Object ARX
TianyuSoft
9
所需基础
• • • • • • ACAD基本操作 C++ VC MFC(界面) COM(属性页等) STL(提高效率)
11
AutoCAD图形数据库结构
• AcDbDatabase数据库 • |------AcDb符号表 • | |------块表(AcDbBlockTable) • | |------尺寸标注样式表(AcDbDimStyleTable) • | |------层表(AcDbLayerTable) • | |------线型表(AcDbLinetypeTable) • | |------已注册应用程序表(AcDbRegAppTable) • | |------字体样式表(AcDbTextStyleTable) • | |------用户坐标系表(AcDbUCSTable) • | |------视口表(AcDbViewportTable) • | |------视图表(AcDbViewTable) • |-------命名对象词典 • 访问:AcDbDatabase::getSymbolTable

如何创建一个ObjectArx程序

如何创建一个ObjectArx程序

如何创建一个ObjectArx程序?本小节通过一个简单的实例来讲述ARX程序的创建过程,介绍编制Object ARX程序的一些基本步骤和原则,并初步了解ARX程序与AutoCAD进行通讯的方式。

如同学习其它计算机语言一样,我们首先来创建一个最简单的ARX程序—“Hello.ARX”,在AutoCAD 2002中加载并运行该程序,将会在命令行出现-“Hello, ObjectARX!”。

38.2.1 建立ARX程序的基本步骤由于ARX程序是一种可以共享AutoCAD地址空间并对AutoCAD进行直接调用的动态链接库,因此应该按照下列基本步骤建立ARX程序:(1) 创建自定义类来实现新的命令:用户可以从ARX类层次关系中的大多数类和符号表类中派生自己的类。

(2) 决定ARX程序应该响应的AutoCAD消息:AutoCAD通过向ARX程序发出一系列的消息指明在它内部发生的特殊事件,ARX程序必须对其中的某些消息作出反映,并触发相应的操作。

(3) 实现应用程序与AutoCAD通信的入口:AutoCAD通过函数acrxEntryPoint()来调用ARX程序,而不是象普通的C++程序那样使用main()函数。

函数acrxEntryPoint()中可以用switch语句处理AutoCAD的各种返回信息,根据不同信息执行不同的函数,并返回状态码。

如果针对特定的消息返回出错代码,则必须用case语句来处理。

最后,必须用AcRx::kRetOk 作为函数acrxEntryPoint()的最终返回值。

(4) 完成ARX程序的初始化:用户必须在acrxEntryPoint()函数的AcRx::kInitAppMsg 事件中或者该事件调用的函数(例如:initApp()函数)中,对程序中自定义的所有类进行初始化,然后调用acedRegCmds->addCommand()函数在AutoCAD命令堆栈中注册新命令。

(5) 实现卸载(Unload)功能:用户必须在acrxEntryPoint()函数的AcRx:: kUnloadAppMsg 事件中或者该事件调用的函数(例如:unloadApp()函数)中,调用acedRegCmds->removeGroup()函数将initApp()函数中注册的新命令组从AutoCAD命令堆栈中清除,调用deleteAcRxClass()函数清除程序中自定义的任何类,然后删除所有由应用程序添加到AutoCAD中的对象,并清除所有与AcDbObject、AcDbDatabase、AcRxDynamicLinker或AcEditor对象相关联的事件反应器。

objectarx培训


► ► ► ► ► ► ► ► ► ► ► ► ► ► ► ► ► ► ► ► ►
AcDbBlockTableRecordIterator *pIterator = NULL; pTableRecpTableRec->newIterator(pIterator); //遍歷快表找出選擇實體ID //遍歷快表找出選擇實體ID for (pIterator->start(); !pIterator->done(); pIterator->step()) (pIterator!pIteratorpIterator{ AcDbEntity *pEnt = NULL; if(Acad::eOk != pIterator->getEntity(pEnt,AcDb::kForWrite)) pIterator{ continue; } AcDbObjectId objId; objId = pEnt->objectId(); pEntif (objId == NULL) { continue; } objIdArray.append(objId); pEntpEnt->close(); } delete pIterator; pTableRecpTableRec->close();
3 實體
► 3.1實體類的層次 3.1實體類的層次
AcdbEntity類 AcdbEntity類 ► 3.3 AcdbPolyline 類 ► 3.4 得到實體,修改實體,添加實體 得到實體,修改實體,
► 3.2
►
3.1實體類的層次 3.1實體類的層次
3.2 AcdbEntity類 AcdbEntity類
AcdbCircle *pCircle = new AcdbCircle(); AcDbBlockTable *pBlockTable = NULL; Acad::ErrorStatus es = acdbHostApplicationServices()acdbHostApplicationServices()->workingDatabase() ->getSymbolTable(pBlockTable,AcDb::kForRead); if (es != Acad::eOk ||pBlockTable == NULL) { return false; } AcDbBlockTableRecord *pBlockTableRec = NULL; es = pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTablepBlockTableRec,AcDb::kForWrite); if (es != Acad::eOk || pBlockTableRec == NULL) { pBlockTablepBlockTable->close(); return false; } pBlockTablepBlockTable->close(); pBlockTableRec->appendAcDbEntity(pCircle pBlockTableRec->appendAcDbEntity(pCircle ); pBlockTableRecpBlockTableRec->close();

objectarx 开发人员手册

ObjectARX开发人员手册目录一、ObjectARX开发简介1.1 什么是ObjectARX?1.2 ObjectARX的应用领域1.3 ObjectARX的基本原理1.4 ObjectARX的发展历程二、ObjectARX环境搭建2.1 开发环境准备2.2 ObjectARX SDK安装2.3 开发工具选择2.4 环境配置及注意事项三、ObjectARX开发入门3.1 基本概念及术语3.2 ObjectARX编程框架3.3 第一个ObjectARX程序四、ObjectARX开发核心知识4.1 对象模型4.2 数据访问和修改4.3 事件处理4.4 自定义命令和操作4.5 交互式绘图五、ObjectARX开发高级技巧5.1 高效数据管理5.2 多线程编程5.3 性能优化5.4 构建扩展应用程序六、ObjectARX开发实例6.1 绘图应用实例6.2 数据处理应用实例6.3 CAD环境集成实例6.4 其他领域实例七、ObjectARX开发注意事项7.1 内存管理7.2 线程安全7.3 安全性考虑7.4 与AutoCAD版本兼容性7.5 其他注意事项八、ObjectARX开发资源8.1 冠方文档和教程8.2 开发社区和论坛8.3 第三方扩展库8.4 实用工具和示例九、ObjectARX开发未来展望9.1 行业发展趋势9.2 技术更新和发展9.3 ObjectARX的发展方向一、ObjectARX开发简介1.1 什么是ObjectARX?ObjectARX是AutoCAD的二次开发接口,简单来说,它是AutoCAD的扩展开发评台。

通过ObjectARX,开发者可以利用C++、C#、VB等语言编写自定义应用程序,扩展和定制AutoCAD的功能,实现各种与CAD相关的应用开发。

1.2 ObjectARX的应用领域ObjectARX广泛应用于工程设计、土木工程、建筑设计、机械设计等领域。

开发者可以利用ObjectARX开发CAD扩展功能、自定义命令、数据处理工具、智能绘图等应用,帮助用户提高工作效率,满足特定行业的需求。

最新ObjectARX(实训讲义二)自定义实体


© 2007 Autodesk
32
资源问题
• 什么是资源?

.rc文件中的内容, 包括 菜单, 对话框, 工具条, … AutoCAD有自己的资源 ARX程序中也有资源
• 为什么需要资源管理?

• 程序的默认资源从哪里加载?
© 2007 Autodesk
33
资源管理
• 管理资源的切换类 • CAcModuleResourceOverride
© 2007 Autodesk
9
类别判断函数
• 最基础的类AcRxObject提供了类型识别函数

virtual AcRxClass* isA() const; static AcRxClass* gpDesc; static AcRxClass* desc(); static CMyClass * cast(const AcRxObject* inPtr)
#define WM_ACAD_KEEPFOCUS 1) #endif onAcadKeepFocus
35
(WM_ACAD_MFC_BASE +

© 2007 Autodesk
AdUi和AcUi的介绍和使用
• 用来建立与AutoCAD界面风格一致的控件库 • CAdUi类可用于任何应用程序于任何Autodesk产品的交互 作用 • CAcUi类派生于CAdUi类,并专用于AutoCAD
• ACRX_DEFINE_MEMBERS
© 2007 Autodesk
11
图形显示函数
• worldDraw • viewportDraw • 调用关系如下
• if(!entity->worldDraw(pWd))

AUTODESK系列产品开发培训教程

第一篇 AutoCAD ObjectARX 开发教程n 本篇提要AutoCAD 是采用开放架构体系 的通用 CAD 平台,它提供一个可 扩展的编程框架,用户可以使用 API 进行定制开发。

ObjectARX 是以 C++语言为基础的面向对象 的开发环境和应用程序接口,也 是 AutoCAD 最为强大的定制开发 工具,本篇我们介绍 ObjectARX 的程序架构和使用方法,通过本 章的学习可以使用 ObjectARX 开发快速、高效、简洁的应用程序。

本章简介8第 1 章:AuotCAD 开发概览Ø AuotCAD 开发概述。

Ø AutoCAD 开发接口。

Ø ObjectARX 开发环境的配置。

Ø ObjectARX 的程序结构。

Ø ObjectARX 程序的开发过程。

1PDF 文件使用 "pdfFactory Pro" 试用版本创建 学习要点† † † † † 了解 AutoCAD 的开发概况。

了解 AutoCAD 开发接口。

了解 ObjectARX 程序的结构。

掌握 ObjectARX 开发环境的配置。

掌握使用 ObjectARX 向导和创建开发工程。

1.1.1AutoCAD 开发概述AutoCAD 是目前工程领域首选的 CAD 系统, 它采用的开放的架构体系, 在这种架构 体系下可以根据各行业用户的专业特点, 进一步开发各种专业的应用软件, 提供更加全面 而细致的解决方案,以满足各不同行业用户的设计需求。

AutoCAD 作为通用的图形平台提供一些 CAD 系统的基本功能,如造型、编辑、注释 等,但它不针对具体行业提供一些专业设计的功能,比如要绘制一个齿轮,就需要根据齿 轮的参数计算出绘制数据,然后调用 AutoCAD 的绘图命令绘出图形。

如果在绘制完成后 要更改齿轮的参数,则需要重新计算和绘制,这对用户来说是费时费力的,我们完全可以 将上述计算和绘图过程通过相应的程序来实现, 通过定制的命令自动完成计算和绘图过程。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档