ObjectArx开发培训教程课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《ObjectArx开发培训教程课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ObjectArx 开发 培训 教程 课件
- 资源描述:
-
1、ObjectARX Training华中科技大学CAD中心武汉天喻软件有限责任公司2010年2月Object ARX1ObjectARX应用的介绍 ObjectARX是一个仅在AutoCAD上进行二次开发的一套开发环境,通俗点讲就是一系列的API ObjectARX的应用举例:扩展AutoCAD功能 为各种工程设计开发便利的工具Object ARX2ObjectARX概述 ARXAutoCAD Runtime eXtension DBX DataBase eXtension ARX=.DLL+2 exported functions acrxEntryPoint&acrxGetApiVersi
2、on AutoCAD.EXEARX AppsARX AppsObjectARX APIsObject ARX3ObjectARX开发特点 不同的ACAD版本用不同的开发包及开发环境 ACAD2000ACAD2002:VC+6.0 ACAD2004ACAD2006:VS.NET 2002 ACAD2007ACAD2009:VS.NET 2005 ACAD2010 :VS.NET 2008 ACAD2007开始字符串采用UNICODE编码 ARX之间不能连续依赖 A.arx依赖B.arx,B.arx依赖C.dbx,则A.arx不能加载 与ACAD已有功能地位一致Object ARX4ObjectA
3、RX类库构成 AcRx:用于帮定一个应用程序以及运行类的注册和识别。AcEd:用于注册自定义命令和AutoCAD事件通告。AcDb:AutoCAD图形数据库。AcGi:用于AutoCAD 的图形类。AcGe:用于AutoCAD 的线型和几何对象通用类。ADS:AutoCAD 的早期版本C语言函数库。Object ARX5ObjectARX类结构 类图classmap.dwg 位置:ObjectARX 2006classmapObject ARX6用ObjectARX能做些什么?访问、编辑和扩展AutoCAD图形数据库 和AutoCAD系统相互通信 使用MFC创建用户接口 支持多文档应用 创建自
4、定义类和自定义实体 可以开发复杂的应用 和其他开发环境进行协作Object ARX7培训安排-1 一、基础 AUTOCAD数据库结构及操作,ads_name-句柄-ID及转换,aced常用函数,WCS/UCS及转换,菜单/工具条/对话框制作 二、自定义对象 显示/存储/夹点/移动/拷贝/范围/list/捕捉点/炸开/相交点/sub事件 三、自定义对象生成与编缉 双击修改/Jig/属性页Object ARX8培训安排-2 四、一些重要对象 字典/层/线型/字体样式 五、扩展数据 六、反应器 八、总结Object ARX9所需基础 ACAD基本操作 C+VC MFC(界面)COM(属性页等)STL
5、(提高效率)Object ARX10AutoCAD图形数据库概述 AutoCAD图形实际上是一系列存放在一个AcDbDatabase类型的对象中的AcDb对象。一个dwg就是一个数据库 具备数据库的基本组织结构。包括九个符号表和一个命名对象词典Object ARX11AutoCAD图形数据库结构AcDbDatabase数据库|-AcDb符号表|-块表(AcDbBlockTable)|-尺寸标注样式表(AcDbDimStyleTable)|-层表(AcDbLayerTable)|-线型表(AcDbLinetypeTable)|-已注册应用程序表(AcDbRegAppTable)|-字体样式表(A
6、cDbTextStyleTable)|-用户坐标系表(AcDbUCSTable)|-视口表(AcDbViewportTable)|-视图表(AcDbViewTable)|-命名对象词典访问:AcDbDatabase:getSymbolTableObject ARX12向数据库中添加实体Acad:ErrorStatus addEntityToModelSpace(AcDbEntity*pEnt,AcDbObjectId&EntId)Acad:ErrorStatus eRet;AcDbDatabase*pDb=acdbHostApplicationServices()-workingDatabas
7、e();AcDbBlockTable*pBlockTable;eRet=pDb-getBlockTable(pBlockTable,AcDb:kForRead);if(eRet!=Acad:eOk)return eRet;AcDbBlockTableRecord*pBlockTableRecord;eRet=pBlockTable-getAt(ACDB_MODEL_SPACE,pBlockTableRecord,AcDb:kForWrite);if(eRet!=Acad:eOk)pBlockTable-close();return eRet;pBlockTable-close();eRet=p
8、BlockTableRecord-appendAcDbEntity(EntId,pEnt);if(eRet!=Acad:eOk)pBlockTableRecord-close();return eRet;pBlockTableRecord-close();return Acad:eOk;Object ARX13怎样遍历AutoCAD图形数据库?void FindObjectId(AcDbObjectId&objId)AcDbDatabase*pDb=acdbHostApplicationServices()-workingDatabase();AcDbBlockTable*pBlockTabl
9、e;pDb-getBlockTable(pBlockTable,AcDb:kForRead);AcDbBlockTableRecord*pBlockTableRecord;pBlockTable-getAt(ACDB_MODEL_SPACE,pBlockTableRecord,AcDb:kForRead);pBlockTable-close();AcDbBlockTableRecordIterator*pIter;pBlockTableRecord-newIterator(pIter);/Create an iteratorfor(pIter-start();!pIter-done();pIt
10、er-step().AcDbEntity*pEntity;if(pIter-getEntity(pEntity,AcDb:kForRead)!=Acad:eOk)continue;If(pEntity-isKindOf(AcDbCircle:desc()objId=pEntity-ObjectId();pBlockTableRecord-close();Object ARX14怎样创建和使用已有的AutoCAD图形数据库?要使用AcDbDatabase数据库,与使用其它数据库一样,首先要声明一个数据库对象。AcDbDatabase类的声明,调用类的构造函数:AcDbDatabase:AcDbD
11、atabase(bool buildDefaultDrawing=true,bool noDocument=false);其中,buildDefaultDrawing参数控制是否创建一个包括所有默认数据记录的数据库。该参数的默认值为该参数的默认值为true,这样在AcDbDatabase数据库创建时,将在新建的数据库中包含一个AutoCAD图形数据库必须包含的基本数据要素,这些要素包括九个符号表及其初始记录(比如0层、STANDARD文字样式等),命名对象词典(组词典和多线样式词典)以及必要的系统变量设置。这样就可以向新建的数据库中添加各种实体和对象。如:AcDbDatabase*pDb=ne
12、w AcDbDatabase(true);若指定该参数为若指定该参数为false,AutoCAD将创建一个完全空的AcDbDatabase数据库。这样的AcDbDatabase数据库不能直接向其中添加实体或对象,需读入一个图形文件来拓展该图形数据库,然后再逐步添加或修改数据库中的实体或对象。读入图形数据库使用函数:AcadErrorStatus AcDbDatabase:readDwgFile(const char*fileName);若要使用已有的图形,比如“test.dwg”文件,则使用下列代码:AcDbDatabase*pDb=new AcDbDatabase(false);pDb-re
13、adDwgFile(“test.dwg”);AcDbDatabase构造函数的noDocument参数控制打开的数据库是否与当前文档关联,此参数用于“多文档处理”中。注意:在这种情况下,AcDbdatabase()的参数必须指定为false(当然,0或者Adesk:kFalse都可以)。因为使用pDb-readDwgFile()函数时,pDb必须是一个完全空白的数据库,也就是说,哪怕使用了AcDbDatabase(false);新建数据库后,只要对数据库进行了操作,就不能再使用readDwgFile()函数,否则会导致严重的内存错误。Object ARX15数据库对象AcDbObject概述
14、每一个数据库对象具有以下三种表示方法:句柄AcDbHandle 对象idAcDbObjectId 指针AcDbObect*Object ARX16三者之间的相互关系 注意:Handle不变,ObjectId变化Object ARX17之间相互关系和转换1.AcDbHandle-AcDbObjectIdAcDbDatabase:getAcDbObjectId(&AcDbObjectId,FALSE,AcDbHandle);2.AcDbObjectId-AcDbHandleAcDbHandle =AcDbObjectId:handle();3.AcDbObjectId-AcDbObject*acd
15、bOpenObject(AcDbObject*&,AcDbObjectId,AcDb:OpenMode);4.AcDbObject*-AcDbHandle AcDbHandle =AcDbObject:getAcDbHandle();5.ads_name 和 AcDbObjcetId一个ads_name 是 一个包含两个long型元素的数组这个数组的第一个元素就是AcDbObjcetId6.ads_name 和 AcDbObjcetId相互转换acdbGetAdsName(ads_name,objId);acdbGetObjectId(objId,ads_name);Object ARX18怎
16、样访问数据库对象?打开对象的方法:acdbOpenObject()该函数为模板函数,能打开任意对象acdbOpenAcDbObject()acdbOpenAcDbEntity()打开对象的模式:AcDb:kForRead/只读AcDb:kForWrite/可写AcDb:kForNotify/通知升级和降级访问:AcDbObject:upgradeOpen();/升级为写AcDbObject:downgradeOpen();/降级为读删除对象AcDbObject:erase()Object ARX19用事务方式访问 事务 AcTransaction*AcTransactionManager:st
17、artTransaction AcTransactionManager:endTransaction()AcTransactionManager:abortTransaction(),virtual Acad:ErrorStatus getObject(AcDbObject*&obj,AcDbObjectId objectId,AcDb:OpenMode mode,bool openErasedObject=false)Object ARX20对象访问限制 如果一个对象被写打开,则在关闭前不能再被读打开或写打开 如果一个对象被读打开,则在关闭前不能再被写打开,但可被读打开(一个对象最多可同时被
18、打开128次)Object ARX21对象类型识别desc():a static member function that returns the class descriptor object of a particular(known)class.cast():a static member function that returns an object of the specified type,or NULL if the object is not of the required class(or a derived class).isKindOf():returns whether
19、 an object belongs to the specified class(or a derived class).isA():returns the class descriptor object of an object whose class is unknown.AcRxClass例如:AcDbEntity*curEntity=somehowGetAndOpenAnEntity();if(curEntity-isKindOf(AcDbEllipse:desc()If(curEntity-isA()=AcDbEllipse:desc()AcDbLine*pLine =AcDbLi
20、ne:cast(curEntity)Object ARX22AutoCAD里的交互AcEd 全局函数 String,number acquisitionacedGetInt used to get an integer valueacedGetReal used to get a real valueacedGetString used to get a stringacedGetDist used to get the distance between two points Point,angle acquisitionacedGetAngle used to get a angle val
21、ueacedGetPoint used to pick a pointacedGetCorner Entity selection acedEntSel used to select a single entityacedNEntSel used to select a single,nested entityacedNEntSelP used to select a single,nested entityacedSSGet used to select multiple entities Others acedGetKword used to get a key wordacedInitG
22、et used to initialize acedGetXXXX functionsacedGetFileD used to retrieve file selection from a file dialogObject ARX23向ACAD发送命令 acedCommand:立即执行 acedCommand(RTSTR,zoom,RTSTR,e,0);sendStringToExecute:作为下一个命令执行CString strCmd;strCmd.Format(_HNBMReservedAreaModified%d%d,(long)ReservedAreaHandle,nType);a
23、cDocManager-sendStringToExecute(acDocManager-curDocument(),strCmd,false,true,false);共同点:都不能执行有用户交互的命令Object ARX24WCS,UCS,OCS(ECS)规则:数据库中对象保存的点坐标是WCS坐标(建议);而一些acedXX函数(如acedGetPoint,acedEntSel等)、list命令一般是UCS坐标。WCS与UCS相互转换/UCS坐标系fromrb.restype=RTSHORT;fromrb.resval.rint=1;/WCS坐标系torb.restype=RTSHORT;t
24、orb.resval.rint=0;acedTrans(pt_ucs,&fromrb,&torb,FALSE,resultPt);acdbUcs2Wcs acdbWcs2Ucs AcDbEntity:getEcsObject ARX25UCS常用函数及类函数:Acad:ErrorStatus acedGetCurrentUCS(AcGeMatrix3d&mat);(以下函数和类可看作符号表的操作模式)函数:Acad:ErrorStatus getSymbolTable(AcDbUCSTable*&pTable,AcDb:OpenMode mode);类:AcDbUCSTable 类:AcDbU
25、CSTableRecord Object ARX26ARX应用向导 应用向导:ObjectARX 2006的在ObjectARX 2006utilsObjARXWiz目录下。功能:与MFC应用向导类似 产生工程 产生特定类及函数Object ARX27ARX,DBX加载/卸载 加载 ap(appload)arx 其它方式(lisp文件,注册表等)卸载 ap arxObject ARX28ARX软件结构 加载:On_kInitAppMsg 卸载:On_kUnloadAppMsg 命令映射(arx2006或以上):static void INTECAD_INTESelect(void)ACED_A
展开阅读全文