《ObjectArx开发培训教程》_第1页
《ObjectArx开发培训教程》_第2页
《ObjectArx开发培训教程》_第3页
《ObjectArx开发培训教程》_第4页
《ObjectArx开发培训教程》_第5页
已阅读5页,还剩83页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ObjectARX Training,华中科技大学CAD中心 武汉天喻软件有限责任公司 2010年2月,Object ARX,T i a n y u S o f t,2,ObjectARX应用的介绍,ObjectARX是一个仅在AutoCAD上进行二次开发的一套开发环境,通俗点讲就是一系列的API ObjectARX的应用举例: 扩展AutoCAD功能 为各种工程设计开发便利的工具,Object ARX,T i a n y u S o f t,3,ObjectARX概述,ARXAutoCAD Runtime eXtension DBX DataBase eXtension ARX = .DLL + 2 exported functions acrxEntryPoint & acrxGetApiVersion ,AutoCAD.EXE,ARX Apps,ARX Apps,ObjectARX APIs,Object ARX,T i a n y u S o f t,4,ObjectARX开发特点,不同的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 ARX,T i a n y u S o f t,5,ObjectARX类库构成,AcRx:用于帮定一个应用程序以及运行类的注册和识别。 AcEd:用于注册自定义命令和AutoCAD事件通告。 AcDb:AutoCAD图形数据库。 AcGi: 用于AutoCAD 的图形类。 AcGe:用于AutoCAD 的线型和几何对象通用类。 ADS: AutoCAD 的早期版本C语言函数库。,Object ARX,T i a n y u S o f t,6,ObjectARX类结构,类图classmap.dwg 位置:ObjectARX 2006classmap,Object ARX,T i a n y u S o f t,7,用ObjectARX能做些什么?,访问、编辑和扩展AutoCAD图形数据库 和AutoCAD系统相互通信 使用MFC创建用户接口 支持多文档应用 创建自定义类和自定义实体 可以开发复杂的应用 和其他开发环境进行协作,Object ARX,T i a n y u S o f t,8,培训安排-1,一、基础 AUTOCAD数据库结构及操作,ads_name-句柄-ID及转换,aced常用函数,WCS/UCS及转换,菜单/工具条/对话框制作 二、自定义对象 显示/存储/夹点/移动/拷贝/范围/list/捕捉点/炸开/相交点/sub事件 三、自定义对象生成与编缉 双击修改/Jig/属性页,Object ARX,T i a n y u S o f t,9,培训安排-2,四、一些重要对象 字典/层/线型/字体样式 五、扩展数据 六、反应器 八、总结,Object ARX,T i a n y u S o f t,10,所需基础,ACAD基本操作 C+ VC MFC(界面) COM(属性页等) STL(提高效率),Object ARX,T i a n y u S o f t,11,AutoCAD图形数据库概述,AutoCAD图形实际上是一系列存放在一个AcDbDatabase类型的对象中的AcDb对象。 一个dwg就是一个数据库 具备数据库的基本组织结构。 包括九个符号表和一个命名对象词典,Object ARX,T i a n y u S o f t,12,AutoCAD图形数据库结构,AcDbDatabase数据库 |-AcDb符号表 | |-块表(AcDbBlockTable) | |-尺寸标注样式表(AcDbDimStyleTable) | |-层表(AcDbLayerTable) | |-线型表(AcDbLinetypeTable) | |-已注册应用程序表(AcDbRegAppTable) | |-字体样式表(AcDbTextStyleTable) | |-用户坐标系表(AcDbUCSTable) | |-视口表(AcDbViewportTable) | |-视图表(AcDbViewTable) |-命名对象词典 访问:AcDbDatabase:getSymbolTable,Object ARX,T i a n y u S o f t,13,向数据库中添加实体,Acad:ErrorStatus addEntityToModelSpace(AcDbEntity * pEnt, AcDbObjectId ,Object ARX,T i a n y u S o f t,14,怎样遍历AutoCAD图形数据库?,void FindObjectId(AcDbObjectId ,Object ARX,T i a n y u S o f t,15,怎样创建和使用已有的AutoCAD图形数据库?,要使用AcDbDatabase数据库,与使用其它数据库一样,首先要声明一个数据库对象。AcDbDatabase类的声明,调用类的构造函数: AcDbDatabase :AcDbDatabase(bool buildDefaultDrawing = true, bool noDocument = false); 其中,buildDefaultDrawing参数控制是否创建一个包括所有默认数据记录的数据库。 该参数的默认值为true,这样在AcDbDatabase数据库创建时,将在新建的数据库中包含一个AutoCAD图形数据库必须包含的基本数据要素,这些要素包括九个符号表及其初始记录(比如0层、STANDARD文字样式等),命名对象词典(组词典和多线样式词典)以及必要的系统变量设置。这样就可以向新建的数据库中添加各种实体和对象。如:AcDbDatabase *pDb= new AcDbDatabase(true); 若指定该参数为false,AutoCAD将创建一个完全空的AcDbDatabase数据库。这样的AcDbDatabase数据库不能直接向其中添加实体或对象,需读入一个图形文件来拓展该图形数据库,然后再逐步添加或修改数据库中的实体或对象。 读入图形数据库使用函数:AcadErrorStatus AcDbDatabase:readDwgFile(const char* fileName ); 若要使用已有的图形,比如“test.dwg”文件,则使用下列代码: AcDbDatabase *pDb= new AcDbDatabase(false); pDb-readDwgFile(“test.dwg”); AcDbDatabase构造函数的noDocument参数控制打开的数据库是否与当前文档关联,此参数用于“多文档处理”中。 注意:在这种情况下,AcDbdatabase()的参数必须指定为false(当然,0或者Adesk:kFalse都可以)。因为使用pDb-readDwgFile()函数时,pDb必须是一个完全空白的数据库,也就是说,哪怕使用了AcDbDatabase(false);新建数据库后,只要对数据库进行了操作,就不能再使用readDwgFile()函数,否则会导致严重的内存错误。,Object ARX,T i a n y u S o f t,16,数据库对象AcDbObject概述,每一个数据库对象具有以下三种表示方法: 句柄 AcDbHandle 对象id AcDbObjectId 指针 AcDbObect *,Object ARX,T i a n y u S o f t,17,三者之间的相互关系,注意: Handle不变 ,ObjectId变化,Object ARX,T i a n y u S o f t,18,之间相互关系和转换,1. AcDbHandle - AcDbObjectId AcDbDatabase :getAcDbObjectId(,Object ARX,T i a n y u S o f t,19,怎样访问数据库对象?,打开对象的方法: acdbOpenObject() 该函数为模板函数,能打开任意对象 acdbOpenAcDbObject() acdbOpenAcDbEntity() 打开对象的模式: AcDb:kForRead /只读 AcDb:kForWrite /可写 AcDb:kForNotify /通知 升级和降级访问: AcDbObject:upgradeOpen(); /升级为写 AcDbObject:downgradeOpen(); /降级为读 删除对象 AcDbObject:erase(),Object ARX,T i a n y u S o f t,20,用事务方式访问,事务 AcTransaction * AcTransactionManager:startTransaction AcTransactionManager:endTransaction() AcTransactionManager:abortTransaction(), virtual Acad:ErrorStatus getObject(AcDbObject*& obj, AcDbObjectId objectId, AcDb:OpenMode mode, bool openErasedObject = false),Object ARX,T i a n y u S o f t,21,对象访问限制,如果一个对象被写打开,则在关闭前不能再被读打开或写打开 如果一个对象被读打开,则在关闭前不能再被写打开,但可被读打开(一个对象最多可同时被打开128次),Object ARX,T i a n y u S o f t,22,对象类型识别,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 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 = AcDbLine :cast(curEntity ),Object ARX,T i a n y u S o f t,23,AutoCAD里的交互,AcEd 全局函数 String, number acquisition acedGetInt used to get an integer value acedGetReal used to get a real value acedGetString used to get a string acedGetDist used to get the distance between two points Point, angle acquisition acedGetAngle used to get a angle value acedGetPoint used to pick a point acedGetCorner Entity selection acedEntSel used to select a single entity acedNEntSel used to select a single, nested entity acedNEntSelP used to select a single, nested entity acedSSGet used to select multiple entities Others acedGetKword used to get a key word acedInitGet used to initialize acedGetXXXX functions acedGetFileD used to retrieve file selection from a file dialog,Object ARX,T i a n y u S o f t,24,向ACAD发送命令,acedCommand:立即执行 acedCommand(RTSTR, “zoom“, RTSTR, “e“, 0); sendStringToExecute:作为下一个命令执行 CString strCmd; strCmd.Format(“_HNBMReservedAreaModified %d %d “, (long)ReservedAreaHandle, nType); acDocManager-sendStringToExecute(acDocManager-curDocument(), strCmd, false, true, false); 共同点:都不能执行有用户交互的命令,Object ARX,T i a n y u S o f t,25,WCS,UCS,OCS(ECS),规则:数据库中对象保存的点坐标是WCS坐标(建议);而一些acedXX函数(如acedGetPoint,acedEntSel等)、list命令一般是UCS坐标。 WCS与UCS相互转换 /UCS坐标系 fromrb.restype = RTSHORT; fromrb.resval.rint = 1; /WCS坐标系 torb.restype = RTSHORT; torb.resval.rint = 0; acedTrans(pt_ucs, acdbUcs2Wcs acdbWcs2Ucs AcDbEntity:getEcs,Object ARX,T i a n y u S o f t,26,UCS常用函数及类,函数:Acad:ErrorStatus acedGetCurrentUCS(AcGeMatrix3d 类:AcDbUCSTable 类:AcDbUCSTableRecord,Object ARX,T i a n y u S o f t,27,ARX应用向导,应用向导:ObjectARX 2006的在ObjectARX 2006utilsObjARXWiz目录下。 功能:与MFC应用向导类似 产生工程 产生特定类及函数,Object ARX,T i a n y u S o f t,28,ARX,DBX加载/卸载,加载 ap(appload) arx 其它方式(lisp文件,注册表等) 卸载 ap arx,Object ARX,T i a n y u S o f t,29,ARX软件结构,加载:On_kInitAppMsg 卸载:On_kUnloadAppMsg 命令映射(arx2006或以上): static void INTECAD_INTESelect(void) ACED_ARXCOMMAND_ENTRY_AUTO(CINTECADApp, INTECAD, _INTESelect, INTESelect, ACRX_CMD_TRANSPARENT, NULL),Object ARX,T i a n y u S o f t,30,ARX & MFC,ObjectARX 完全支持MFC。 两个MFC基类 AdUi and AcUi。 注意:在调用资源时加上这句话 CAcModuleResourceOverride resOverride;,Object ARX,T i a n y u S o f t,31,对话框,资源转换,多个ARX时可能需要 CAcModuleResourceOverride resOverride; 或 AfxSetResourceHandle (_hdllInstance) ; AfxSetResourceHandle (acedGetAcadResourceInstance () ;,Object ARX,T i a n y u S o f t,32,菜单与工具条,通过菜单文件 COM方式添加,Object ARX,T i a n y u S o f t,33,例1:基本操作,建立应用程序 建立命令 实现功能:选中一实体,然后输出其信息,Object ARX,T i a n y u S o f t,34,例2:重复产生同半径的圆,对话框输入半径 用鼠标指定圆心,Object ARX,T i a n y u S o f t,35,数据库结构查看工具,ARXDBG工具的使用 位置:ObjectARX 2006samplesdatabaseARXDBG 文档:ArxDbg.doc,Object ARX,T i a n y u S o f t,36,本节结束,下节将介绍自定义实体的内容,Object ARX,T i a n y u S o f t,37,自定义对象类,一般从 AcDbObject 或AcDbEntity派生 AcDbObject:不须显示,如字典对象 AcDbEntity:可显示/操作的实体 从其他(如AcDbLine等实体类)派生:根据需要 自定义类可继续从另一个自定义继承,从而继承体系成树状结构 编写时遵守一定的规则 放在DBX工程中,Object ARX,T i a n y u S o f t,38,自定义类特点,头文件 ACRX_DECLARE_MEMBERS ACDB_REGISTER_OBJECT_ENTRY_AUTO 版本 CPP文件 ACRX_DXF_DEFINE_MEMBERS AcDbProxyEntity:kNoOperation assertReadEnabled ()与assertWriteEnabled () ; 读写控制 显示刷新 UNO/REDO,Object ARX,T i a n y u S o f t,39,DBX加载/卸载,在ARX中调用 acrxLoadModule/acrxUnloadModule ARX在使用DBX的LIB库时,可能会出现诸如:acrxGetApiVersion找不到或ARX加载失败的问题.解决方法: 在ARX和DBX工程中都增加def文件,文件内容如下: EXPORTS acrxEntryPoint PRIVATE acrxGetApiVersion PRIVATE,Object ARX,T i a n y u S o f t,40,自定义对象-读入/写出,作用 文件(DWG,DXF)读写 UNDO/REDO CLONE 函数 virtual Acad:ErrorStatus dwgInFields(AcDbDwgFiler* filer); virtual Acad:ErrorStatus dwgOutFields(AcDbDwgFiler* filer) const; virtual Acad:ErrorStatus dxfInFields(AcDbDxfFiler* filer); virtual Acad:ErrorStatus dxfOutFields(AcDbDxfFiler* filer) const;,Object ARX,T i a n y u S o f t,41,AcDbDwgFiler,类中常用函数 virtual Acad:ErrorStatus readInt32(Adesk:Int32*) virtual Acad:ErrorStatus writeInt32(Adesk:Int32) virtual Acad:ErrorStatus readString(char*) virtual Acad:ErrorStatus writeString(const char*) virtual Acad:ErrorStatus readPoint3d(AcGePoint3d*) virtual Acad:ErrorStatus writePoint3d(const AcGePoint3d,Object ARX,T i a n y u S o f t,42,自定义对象-显示,函数: virtual Adesk:Boolean worldDraw( AcGiWorldDraw* mode); virtual void viewportDraw(AcGiViewportDraw* mode); 区别 worldDraw函数用来生成跟视图无关的几何图形,它只生成一组几何图形,其他的因为视图的变化而导致的几何图形变化都由AutoCAD来自动调整,举个例子,你生成一个立方体,这个立方体从不同的角度看所看到的外形是不一样的,但是worldDraw只生成一个角度的几何图形,其他的都由AutoCAD来自动的调整了。 viewportDraw则不同,它可以根据不同的视图生成不同的几何图形,当你的视图改变的时候,它自动将几何图形调整到正确的状态。有时候这两个函数需要配合使用,例如,如果你画圆,那就可以用worldDraw,因为无论你怎么变换视图圆还是圆。但是如果你生成一些表示立体的几何图形有时候就需要借助于viewportDraw了,因为对于立体图形来说不同的视图看到的是不一样的。 举个例子来说明其区别就是worldDraw画出来的立体图形,你改变了角度(也算viewport改变)后看到的有可能就不是立体图形了,但是你用viewportDraw画出来的就不会出现这样的问题。,Object ARX,T i a n y u S o f t,43,AcGiWorldDraw与AcGiViewportDraw,类似,但AcGiViewportDraw有视口相关的矩阵和方向函数 通过geometry得到绘图类AcGiWorldGeometry 的对象 通过subEntityTraits得到环境设置类AcGiSubEntityTraits 对象,Object ARX,T i a n y u S o f t,44,AcGiWorldGeometry与AcGiGeometry,circle circularArc Polyline(多段线) polygon text pline(多义线,类似于AcDbPolyline),Object ARX,T i a n y u S o f t,45,AcGiSubEntityTraits,常用函数 virtual void setColor(const Adesk:UInt16 color) = 0; virtual void setTrueColor(const AcCmEntityColor 注意 一个自定义对象的不同部分可分属不同层 是否填充只针对circle,polygon等封闭图形,Object ARX,T i a n y u S o f t,46,例1 自定义实体-读写/显示,生成一等边三角形的自定义实体 中心 外接圆半径 方位角,Object ARX,T i a n y u S o f t,47,自定义对象-夹点,virtual Acad:ErrorStatus getGripPoints(AcGePoint3dArray,Object ARX,T i a n y u S o f t,48,自定义对象-移动,virtual Acad:ErrorStatus transformBy( const AcGeMatrix3d,Object ARX,T i a n y u S o f t,49,自定义对象-拷贝,virtual Acad:ErrorStatus deepClone(AcDbObject* pOwnerObject, AcDbObject*,Object ARX,T i a n y u S o f t,50,自定义对象-炸开,virtual Acad:ErrorStatus explode(AcDbVoidPtrArray,Object ARX,T i a n y u S o f t,51,自定义对象-捕捉点,virtual Acad:ErrorStatus getOsnapPoints( AcDb:OsnapMode osnapMode, int gsSelectionMark, const AcGePoint3d,Object ARX,T i a n y u S o f t,52,自定义对象-范围,virtual Acad:ErrorStatus getGeomExtents(AcDbExtents,Object ARX,T i a n y u S o f t,53,自定义对象-list,作用:调试检查用. virtual void list() const;,Object ARX,T i a n y u S o f t,54,自定义对象-相交点,virtual Acad:ErrorStatus intersectWith(const AcDbEntity* pEnt,AcDb:Intersect intType,AcGePoint3dArray,Object ARX,T i a n y u S o f t,55,自定义对象- sub事件,virtual Acad:ErrorStatus subErase(Adesk:Boolean erasing); virtual Acad:ErrorStatus subOpen(AcDb:OpenMode mode); virtual Acad:ErrorStatus subClose();,Object ARX,T i a n y u S o f t,56,理解拖动夹点与平移实体的工作方式,在拖动夹点时,ACAD调用自定义对象重载的moveGripPointsAt函数。但这时你要注意:此时的this指针指向的自定义对象A并非数据库中待修改的对象B,A只是ACAD复制的一个用于操作的临时对象,它的所有持久性(即保存到文件中的)参数与B相同,非持久性参数保持构造函数时的值。A并没有被加入到数据库中,所以在moveGripPointsAt不能通过database()函数获取数据库指针;A中的参数没有累积性,即在moveGripPointsAt中更改了一个类成员变量m的值,下一次调用moveGripPointsAt时,m的值与B中m值相同,而不是修改过的值。 transformBy与moveGripPointsAt类似。,Object ARX,T i a n y u S o f t,57,本节结束,下节将介绍自定义对象生成与编缉 双击修改 动态生成(Jig) 属性页,Object ARX,T i a n y u S o f t,58,实体的双击修改,在ARX工程中:从AcDbDoubleClickEdit派生并重载函数: virtual void startEdit(AcDbEntity *pEnt, AcGePoint3d pt); virtual void finishEdit(void); 在On_kInitAppMsg中: if(!acrxDynamicLinker-loadModule(/*MSG0*/“ACDBLCLKEDITPE.ARX“,Adesk:kFalse) AfxMessageBox(“ACDBLCLKEDITPE.ARX Load Failed“); / Initialize Double Click Editing AcDbDoubleClickEdit:rxInit(); acrxBuildClassHierarchy(); TYTriangleDoubleClickEdit *pTriangleDoubleClickEdit=new TYTriangleDoubleClickEdit; TYTriangle:desc()-addX(AcDbDoubleClickEdit:desc(),pTriangleDoubleClickEdit);,Object ARX,T i a n y u S o f t,59,实体的双击修改,On_kUnloadAppMsg函数中: TYTriangle:desc()-delX(AcDbDoubleClickEdit:desc(); startEdit函数 文档加锁 设置资源 显示对话框 修改实体 文档解锁,Object ARX,T i a n y u S o f t,60,例1:自定义实体的双击修改,可改: 外接圆半径 填充,Object ARX,T i a n y u S o f t,61,动态创建,AcEdJig virtual DragStatus sampler () ; virtual Adesk:Boolean update () ; virtual AcDbEntity *entity () const ; DragStatus drag();,Object ARX,T i a n y u S o f t,62,Object ARX,T i a n y u S o f t,63,AcEdJIg中的用户输入函数,DragStatus acquireString(char *str); DragStatus acquireAngle(double 注意:不能使用acedXXX函数,Object ARX,T i a n y u S o f t,64,AcEdJig:其它函数,const char* keywordList(); void setKeywordList(const char*); const char* dispPrompt(); void setDispPrompt(const char*, .); AcEdJig:CursorType specialCursorType(); void setSpecialCursorType(CursorType); AcEdJig:UserInputControls userInputControls(); void setUserInputControls(AcEdJig:UserInputControls);,Object ARX,T i a n y u S o f t,65,例2:动态生成自定义实体,用向导生成或手工书写 向导生成的AcEdJig派生类有错: 头文件中除去ACRX_DECLARE_MEMBERS CPP文件中除去ACRX_CONS_DEFINE_MEMBERS,Object ARX,T i a n y u S o f t,66,练习,自定义实体 具有N条边的多边形 画出多边形及外接圆 可输入边数N和外接圆半径 动态创建 在创建过程中显示图形 在创建过程中显示并可修改尺寸(选作) 双击修改,Object ARX,T i a n y u S o f t,67,属性页,优点: 可批量修改多个实体的属性 操作步骤少 与ACAD的已有操作更加一致 缺点: 实现有点复杂 用户操作习惯问题,Object ARX,T i a n y u S o f t,68,生成工程,标准ATL工程,Object ARX,T i a n y u S o f t,69,生成ATL类,派生 接口 IDL DBX中实体类中: 头文件: static bool s_bHasClsid; static CLSID s_clsid; 实现: initCLSID() getClassID,Object ARX,T i a n y u S o f t,70,属性名称及分组,GetDisplayName GetCategoryName ShowProperty,Object ARX,T i a n y u S o f t,71,预定义值,GetPredefinedStrings GetPredefinedValue,Object ARX,T i a n y u S o f t,72,显示对话框,MapPropertyToPage IOPMPropertyDialog,Object ARX,T i a n y u S o f t,73,字典,字典内可保存多个从AcDbObject派生的对象 可用于保存全局变量,选项设置,Object ARX,T i a n y u S o f t,74,AcDbDictionary *pNameDict; AcDbDictionary *pNameList; pDb-getNamedObjectsDictionary(pNameDict,AcDb:kForWrite); if (pNameDict-getAt(“TYSOFTHNBMCAD_DICT“,(AcDbObject*,Object ARX,T i a n y u S o f t,75,AcDbDictionary *pNameDict; AcDbDictionary *pNameList; pDb-getNamedObjectsDictionary(pNameDict,AcDb:kForRead); if (pNameDict-getAt(“TYSOFTHNBMCAD_DICT“,(AcDbObject* ,Object ARX,T i a n y u S o f t,76,层,AcDbLayerTable *pLayerTable; es=pDB-getSymbolTable(pLayerTable, AcDb:kForWrite); if(es!=Acad:eOk) pLinetypeTable-close(); return; if(!pLayerTable-has(“木作线(RoomLine)“) pLayerTableRecord =new AcDbLayerTableRecord; pLayerTableRecord-setName(“木作线(RoomLine)“); pLayerTableRecord-setIsFrozen(false); pLayerTableRecord-setIsOff(false); pLayerTableRecord-setIsLocked(false); pLayerTableRecord-setVPDFLT(false); color.setColorIndex(3); pLayerTableRecord-setColor(color); pLinetypeTable-getAt(“Continuous“, LinetypeId); pLayerTableRecord-setLinetypeObjectId(LinetypeId); pLayerTableRecord-setLineWeight(AcDb:kLnWtByLwDefault); pLayerTable-add(pLayerTableRecord); pLayerTableRecord-close(); pLayerTable-close();,Object ARX,T i a n y u S o f t,77,线型,pDB-loadLineTypeFile(“DASHED“, “acad.lin“);/虚线 pDB-loadLineTypeFile(“CENTER”, “acad.lin”);/中心线 AcDbLinetypeTable *pLinetypeTable=NULL; Acad:ErrorStatus es=pDB-getSymbolTable(pLinetypeTable, AcDb:kForRead); if(es!=Acad:eOk) return; AcDbLayerTable *pLayerTable; es=pDB-getSymbolTable(pLayerTable, AcDb:kForRead); if(es!=Acad:eOk) pLinetypeTable-close(); return; AcDbObjectId LinetypeId; pLinetypeTable-getAt(“CENTER“, LinetypeId); pLineTypeTable-close();,Object ARX,T i a n y u S o f t,78,文字样式,AcDbTextStyleTable *pTextStyleTable=NULL; Acad:ErrorStatus es=pDB-getSymbolTable(pTextStyleTable, AcDb:kForWrite); if(es=Acad:eOk) if(!pTextStyleTable-has(“宋体-35“) AcDbTextStyleTableRecord *pTextStyleTableRecord=new AcDbTextStyleTableRecord; pTextStyleTableRecord-setName(“宋体-35“); pTextStyleTableRecord-setFont(“宋体“, FALSE, FALSE, GB2312_CHARSET, DEFAULT_PITCH|FF_ROMAN); pTextStyleTableRecord-setTextSize(3.5); pTextStyleTableRecord-setXScale(0.8); pTextStyleTable-add(pTextStyleTableRecord); pTextStyleTableRecord-close(); if(!pTextStyleTable-has(“HZ-35“) AcDbTextStyleTableRecord *pTextStyleTableRecord=new AcDbTextStyleTableRecord; pTextStyleTableRecord-setName(“HZ-35“); pTextStyleTableRecord-setFileName(“txt.shx“); pTextStyleTableRecord-setBigFontFileName(“hztxt.shx“); pTextStyleTableRecord-setTextSize(3.5); pTextStyleTableRecord-setXScale(0.8); Acad:ErrorStatus es=pTextStyleTable-add(pTextStyleTableRecord); pTextStyleTableRecord-close(); pTextStyleTable-close(); ,Object ARX,T i a n y u S o f t,79,扩展数据,XData 容量受限制,只能存储=16K AcDbObject:xData () AcDbObject:setXData() (entget( car ( entsel) (“*“) ) 封装类:AcXdLocalVar XRecord 容量不受限制 本质上没有区别,存贮的都是resbuf结构的链表 如果对象是自定义实体,存储非图形数据也可以作为该实体对象的属性存储起来,Object ARX,T i a n y u S o f t,80,XDATA举例,(-3 (“INTECAD_HUST_CAD_CENTER“ (1000 . “BILLITEM“) (1002 . “) (1000 . “index“) (1070 . 1) (1000 . “code“) (1000 . “C5A“) (1000 . “name“) (1000 . “E5A“) (1000 . “quantity“) (1000 . “G5A“) (1000 . “lineblock“) (1005 . “0“) (1000 . “circle“) (1005 . “21B“) (1002 . “) (1000 . “OBJECT“) (1002 . “) (1000 . “OBJECTID“) (1000 . “BILLITEM“) (1002 . “),Object ARX,T i a n y u S o f t,81,struct resbuf *pRb, *pTemp; pRb = pObj-xData(“architech_3d_code“;); if (pRb != NULL) / If xdata is present, then walk to the end of the list. for (pTemp = pRb; pTemp-rbnext != NULL; pTemp = pTemp-rbnext) ; else /以调用过acdbRegApp(“architech_3d_code”);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论