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

上传人:门**** 文档编号:240743752 上传时间:2024-05-04 格式:PPT 页数:164 大小:2.87MB
返回 下载 相关 举报
ObjectARX开发培训教程(实训讲义一)_第1页
第1页 / 共164页
ObjectARX开发培训教程(实训讲义一)_第2页
第2页 / 共164页
ObjectARX开发培训教程(实训讲义一)_第3页
第3页 / 共164页
点击查看更多>>
资源描述
1ObjectARX培训培训2005Autodesk2培训目标u培训内容主要是nObjectARX基础知识n如何使用ObjectARXn如何在以后的实际工作中独立的获取相关资源和帮助u不是n如何使用C+n对所有的ObjectARXAPI做完整的讲述2005Autodesk3培训形式uPPT介绍u实例讲解u上机练习u认证考试2005Autodesk4课程进度API概览概览ObjectARX基本知识用户交互和选择集数据库操作实体对象操作扩充数据反应器几何类的使用用户界面自定义对象2005Autodesk5API概览什么是什么是API?(ApplicationProgramInterface)应用程序留给对其调用的接口,客户端程序通过调用应用程序留给对其调用的接口,客户端程序通过调用API去执去执行应用程序的命令行应用程序的命令,访问其数据等等。,访问其数据等等。要求两方面内容:包含执行特定的服务的入口点正确调用服务执行API的代码可以包装为:源代码模块(.h/.cpp中C+)二进制静态库DLLEXE2005Autodesk6API概览uAPI一般情况API类型客户端/服务器端交互客户端代码uAutoCADAPI和集成开发环境(IDE)执行性能比较2005Autodesk7Application.exeAPI包装1.源代码2.静态库3.DLL4.EXEATL templatesAPI1Static MFC LibraryAPI2Win 32 API DLLsAPI3Client EXE,DLL,script,etc.API42005Autodesk8客户端/服务器端交互u进程内客户端/服务器端在同一进程u本地客户端/服务器端在同一机器u远程客户端/服务器端在同一网络2005Autodesk9.EXE.DLL.DLLAPIAutoCAD.ARX.ARXObjectARX APIs嵌入架构API被被可执行程序(宿主程序)执行可执行程序(宿主程序)执行客户端通常为客户端通常为dll2005Autodesk10客户端代码形式解释代码解释代码代码脚本-AutoLISP封装代码封装代码预处理,半解释代码-编译后的VisualLISP编译代码编译代码编译器指令代码-ObjectARX慢快2005Autodesk11AutoCADAPI和集成开发环境u可用的程序开发接口ObjectARXCOMAutomation(VB,Java,Delphi,etc.)AutoLISP.NET托管APIuAutoCAD自带的集成开发环境VisualLISPVisualBasic,ApplicationsEdition(VBA)2005Autodesk12AutoCADAPI执行过程AutoCADObjectARX APIaxdb.dllvl.arx VisualLISPCOMacvba.arxCOM VBA(进程内)COM 客户端(进程外).NETacdbmgd.dll acmgd.dll2005Autodesk13AutoCADAPI性能比较2005Autodesk14在AutoCAD中存储数据不同API方式的比较数据容器存储性能比较Timeinseconds2005Autodesk15在AutoCAD中存储数据不同API方式的比较数据容器存储性能比较Timeinseconds2005Autodesk16数据容器存储性能比较Timeinseconds在AutoCAD中存储数据不同API方式的比较2005Autodesk17API比较结果u速度速度ObjectARX,.NET,VBAu功能功能ObjectARX,.NET(除了自定义实体)u易用性易用性.NET,VBAu容易入门容易入门.NET,VBA2005Autodesk18ObjectARX的优势u效率高u功能强u计算精度高u适用开发复杂的大型程序u调试方便2005Autodesk19课程进度API概览ObjectARX基本知识用户交互和选择集数据库操作实体对象操作和事务扩充数据反应器几何类的使用用户界面自定义对象2005Autodesk20什么是ObjectARX?uAutoCAD运行扩展(AutoCADRuntimeeXtension)一系列面向对象的C+库一个框架一个DLL插件模块(.ARX)不单单是个工具包运行在AutoCAD进程中可访问AutoCAD同一块内存空间系统中包含特定的对象自定义实体反应器.2005Autodesk21ObjectARX能做什么?u编辑和扩展图形数据库编辑和扩展图形数据库创建/编辑/删除对象创建新的对象类型u编辑编辑AutoCAD用户接口用户接口命令工具条/对话框属性面板设计中心显示系统u监控监控/编辑编辑AutoCAD标准的行为标准的行为事件通知输入点获取2005Autodesk22开发环境uWindowsServer2003,ServicePack1,WindowsXPProfessional,ServicePack1or2,orWindows2000,ServicePack4uMicrosoftVisualC+2005(Version8.0)uPentiumIVorlater512MBRAM1024x768VGAwithTrueColor(minimum)2005Autodesk23ObjectARX如何得到ObjectARXu免费下载(SDK)Autodesk网站http:/ APIs2005Autodesk26主要的库-IuAcRx对象和类管理库(rxapi.lib)uAcEdAutoCAD编辑器工具库(acedapi.lib)uAcDbAutoCAD数据库对象库(acdb17.lib)uAcGiAutoCAD图形接口库(acgiapi.lib)uAcGeAutoCAD几何库(acge17.lib)2005Autodesk27主要的库-IIuAcUi/AdUiMFC扩展库(adui17.libacui17.lib)u自动化库(Automation)(axdb.liboleaprot.lib)uInternet超链接库(achapi17.lib)uADS函数集(acad.lib)u静态连接内存管理库(rxheap.lib)2005Autodesk28主要的库-IIIuASI-ACADSQL接口(asiapi17.lib)uASE-ACADSQL环境(aseapi17.lib)uISM图象支持模块(acismobj17.lib)2005Autodesk29加载ObjectARX程序Iu用户加载用户加载ARX&APPLOAD命令Drag&Dropu按需加载按需加载启动acad.rx文件每行列出一个ARX名。AUTOCAD每次启动时都会在搜索路径下查找这个文件,如果有,则顺序加载列表中的ARX程序Registry(arxload)inacad.lsp菜单设置命令调用Registry:通过注册表按请求从其他程序代理检测Registryu实时实时acrxLoadModule参见PolySamp2005Autodesk30加载ObjectARX程序II1.LoadLibrary2._DllMainCRTStartup(C/C+运行库的入口函数)3.CRT_INIT(初始化C/C+运行库和静态全局变量)4.DllMain(see MSDN for info)5.acrxGetApiVersion6.acrxEntryPoint.ARXAutoCADOperating System1.2.3.5.6.Rxapi.libCRT4.2005Autodesk31命令机制IAcEdCommandStackAutoCAD.ARX回调函数1.添加命令2.创建一个命令对象3.参数化对象4.用户调用命令5.查找命令对象6.调用回调函数AcEdCommand2,3.6.4.5.1.2005Autodesk32命令机制IIu移出命令和添加命令一样重要移出命令和添加命令一样重要u命令名称可能冲突命令名称可能冲突命令属于不同的命令组(解决命令冲突的方法)u命令组必须是唯一的命令组必须是唯一的RegisteredDeveloperSymbol(RDS)http:/ InterfaceUser Interface2005Autodesk37DWGDWG客户端程序客户端程序Autodesk:VoloViewVoloExplorerActrixViz&MaxDesignObjectDataDesignObjectDataDWGDWGDXFDXF识别自定义对象App1Partners:App2Corp.Dev.OtherObjectDBXObjectDBXaxdb.libacdb17.libacISMobj.libacge17.libachapi17.libacis.dll(s)acgiapi.libothers.ObjectEnablersObjectEnablersObjEnabler3.dbxObjEnabler2.dbxObjEnabler1.dbxObjEnablerN.dbx2005Autodesk38ObjectDBXObjectARX SDKacad.libacedapi.libacui17.libadui17.liboleaprot.libAcTc.libAcTcUI.libSharedacdb17.libacge17.libacgiapi.libaxdb.libachapi17.librxapi.libacismobj17.librxheap.librcexelib.objObjectARX&ObjectDBX2005Autodesk39ObjectDBX在AutoCAD下能做什么?u创建/编辑DWG/DXF文件内容(.ARX)u创建自定义对象(.DBX)u不能创建独立的程序2005Autodesk40ObjectARXSDK版本uObjectARX2008SDK和2007兼容,在2007上的ARX能在2008上运行,但2008上的ARX不能在以前的版本上运行uObjectARX2007SDKAutoCAD2007和以前版本二进制不兼容uObjectARX2006SDKAutoCAD2006uObjectARX2005SDKAutoCAD2005and2006uObjectARX2004SDK-AutoCAD2004,2005and20062005Autodesk41ObjectARX移植指南2005Autodesk42开发资源uSDKuSDKsampleuSDKarxlabsuObjectARX帮助uADN网站u网络检索2005Autodesk43SDKSampleuObjectARXSamples目录下目录下(按照功能类别组织按照功能类别组织)COMEDITORDATABASEENTITYGRAPHICSMISCSpecifically,pointoutPolySampandArxDbg2005Autodesk44SDKarxlabs2005Autodesk45ObjectARX帮助2005Autodesk46ADN网站http:/提问caseSolution(解决方案)WhitePaper(白皮书)2005Autodesk47ADN网站2005Autodesk48网站检索uGoogleuBaiduuCAD讨论BBS2005Autodesk49实用工具类uAutoCADFacetModeler(面建模器)aecmodeler50.libuAcBrAutoCAD边界表示法acbr17.libacgex17.lib&DLLsuObjectARX2008向导可从ADN网站获取最新版本ObjectARX2008utilsObjARXWizuTeefy将现有程序转换为使用Unicode字符集uARXDBGuDependencyWalker模块查看器C:Program FilesMicrosoft Visual Studio 8Common7Toolsbindepends.exe2005Autodesk50ARXDBG(ARXDebug)2005Autodesk51例1-1手动创建ARX程序u新建工程u配置工程环境u添加命令或操作函数u添加导出函数2005Autodesk52addCommand结合帮助讲解结合帮助讲解2005Autodesk53例1-2通过ObjectARX向导创建工程u根据向导配置工程u利用向导插件添加命令,方法2005Autodesk54练习11、手动创建第一个.ARX并编译测试2、通过ObjectARX向导创建工程要求:正确的创建工程自定义命令中输出字串2005Autodesk55课程进度API概览ObjectARX基本知识用户交互和选择集用户交互和选择集数据库操作实体对象操作扩充数据反应器几何类的使用用户界面自定义对象2005Autodesk56主要内容u何为用户交互u何为选择集u交互API一般参数u选择集APIuresbuf2005Autodesk57何为用户交互?AutoCAD的命令等待用户输入所需要的数据或参数AutoCAD根据参数返回相应的状态,输出相应的结果2005Autodesk58何为选择集图形实体集合2005Autodesk59交互API一般参数形如acedGetXXX()的全局函数u获取整数acedGetInt()u获取实数acedGetReal()u获取字串acedGetString()u获取角度acedGetAngle()u获取距离acedGetDis()u获取点acedGetPoint()u获取关键字acedGetKword()u输入初始化acedInitGet()2005Autodesk60例2-1用户交互APIuacedGetInt()函数暂停程序运行并提示用户输入一个整数。其定义如下:intacedGetInt(constACHAR*prompt,int*result);intnCountNode;intnReturn=acedGetInt(_T(n请输入多边形顶点数:),&nCountNode);if(nReturn=RTNORM)acedGetReal()与acedGetInt()的用法相似,略2005Autodesk61例2-2用户交互APIuacedGetString函数暂停程序运行并提示用户输入一个字串。其定义如下:intacedGetString(intcronly,constACHAR*prompt,ACHAR*result);Result:存储输入的字符串,result参数的内存大小要能够容纳输入的字符串。Cronly:用于说明字符串能否包含空格空格。下面是允许输入含空格字符串的代码:TCHARszInputStr100;acedGetString(1,_T(n请输入图块名称,允许输入空格:),szInputStr);下面是不能输入含空格字符串的代码:TCHARszInputStr100;acedGetString(0,_T(n请输入图块名称,按空格将终止字符串的输入:),szInputStr);2005Autodesk62例2-3用户输入APIads_pointpt1,pt2;acedGetPoint(NULL,_T(n请输入直线的第一点:),pt1);acedGetPoint(pt1,_T(n请输入直线的第二点:),pt2);uacedGetDist()函数暂停程序运行并提示用户输入距离。其定义如下:intacedGetDist(constads_pointpt,constACHAR*prompt,ads_real*result);ads_realfDist;acedGetDist(NULL,_T(n请输入距离:),&fDist);acedGetDist(pt,_T(n请输入距离:),&fDist);uacedGetPoint()函数暂停程序运行并提示用户输入一个点。其定义如下:intacedGetPoint(constads_pointpt,constACHAR*prompt,ads_pointresult);2005Autodesk63例2-4用户交互APIuacedGetAngle()等待用户输入一个角度,此角度是一个相对于系统变量ANGBASE当前值的角度。其定义如下:intacedGetAngle(constads_pointpt,constACHAR*prompt,ads_real*result);代码:ads_realangle;acedGetAngle(NULL,_T(n请输入角度值:),&angle);acedGetAngle(pt,_T(n请输入角度值:),&angle);/有橡皮筋线(假设pt为基点)uacedGetCorner()提示用户输入图形屏幕上所画的矩形框的对角点。代码:ads_pointpt2;acedGetCorner(pt,_T(n请输入另一个角点:),&pt2);2005Autodesk64用户交互APIacedInitGetacedInitGet()用于控制其后的一个acedGetXXX()函数的用户输入。其定义如下:intacedInitGet(intval,constACHAR*kwl);val设定输入数据的范围和方式,控制位的设置选项如表所示。设置的控制位组合只控制紧随其后的一个acedGetXXX()函数的输入,之后立即失效。位位位值位值代码代码说明说明位位01RSG_NONULL不允许空输入不允许空输入位位12RSG_NOZERO不允许输入不允许输入0位位24RSG_NONEG不允许输入负数不允许输入负数位位38RSG_NOLIM不检查图形边界不检查图形边界(即使即使LIMCHECK为为1)位位416未使用未使用位位532RSG_DASH用虚线表示橡皮筋线或矩形框用虚线表示橡皮筋线或矩形框位位664RSG_2D不考虑不考虑3D点的点的Z坐标坐标(只用于只用于acedGetDist()函数函数)位位7128RSG_OTHER允许任意输入允许任意输入(无论什么用户类型无论什么用户类型)位位8256RSG_DDISTFIRST使直接距离输入优先于任意输入使直接距离输入优先于任意输入位位9512RSG_TRACKUCS对于面域允许对于面域允许UCS追踪追踪位位101024RSG_NOORTHOZ在在Z坐标轴上,关闭极轴追踪坐标轴上,关闭极轴追踪/对象追踪对象追踪/正交模式正交模式2005Autodesk65用户交互APIacedInitGetuKwl:选项关键字列表n每个选项以空格分开n只能是字母,数字和下划线n可以随意设置简写,但不能矛盾例如RedBLueyellOWn没有简写,则必须输入整个关键字才能识别n关键字的全球化acedInitGet(RSG_NONULL,JaNEIN,N_YES,YNo);u用户输入完毕,用acedGetInput获得输入的字串 2005Autodesk66例2-5acedInitGetintnCountNode=3;acedInitGet(RSG_NONULL+RSG_NONEG+RSG_NOZERO,NULL);acedGetInt(_T(“n请输入多边形顶点数:”),&nCountNode);/不允许0和负数acedInitGet(RSG_NONULL+RSG_NONEG+RSG_NOZERO,NULL);acedGetInt(_T(n请输入多边形顶点数:),&nCountNode);/可以是任意整数控制输入数据2005Autodesk67例2-6acedInitGetacedInitGet(NULL,PropertyProperties_PropertyProperties);intrt=acedGetPoint(NULL,“指定修改点或特性(P):”,asDblArray(point);if(rt=RTNORM|rt=RTNONE)elseif(rt=RTKWORD)charkw256;rt1=acedGetInput(kw);assert(rt1=RTNORM);if(strcmp(kw,Property)=0|strcmp(kw,Properties)=0)returnsWaitForP_C_E_LA_LT_S_LW_T;elsereturnsEnd;设置输入关键字列表2005Autodesk68例2-7用户交互APIuacedGetKword()用于获得用户输入的关键字。其定义如下:intacedGetKword(constACHAR*prompt,ACHAR*result);acedGetKword()函数一般与acedInitGet()函数结合使用。关键字表由acedInitGet()函数建立的。TCHARszKword132;szKword0=_T(Y);szKword1=_T(0);/给szKword一个默认值YacedInitGet(0,_T(YesNo);intnReturn=acedGetKword(_T(是否查找下一个实体No/:),szKword);if(nReturn=RTNORM)if(_tcscmp(szKword,_T(Yes)=0)/else/2005Autodesk69选择集APIu实体选择实体选择nacedSSGet任何形式选择nacedEntSel选择单个实体(单选)nacedNEntSel选择单个实体或复杂实体的子实体nacedNEntSelP选择单个实体或复杂实体的子实体(常用)u选择辅助函数选择辅助函数nacedSSLength()获取选择集实体的个数nacedSSName()获取在选择集中的实体,表示实体位置的序号从0开始nacedSSFree()释放指定的选择集nacedSSDel()从选择集中删除指定的实体nacedSSAdd()创建新的选择集或把实体添加到一个已存在的选择集中。nacedSSDel()从选择集中删除指定的实体nacedSSMemb()判断一个实体是否已在选择集中 2005Autodesk70命令流程控制acedGetXXXacedGetXXX所需参数关键字Option1关键字Option2执行Option1的流程执行Option2的流程后续操作2005Autodesk71resbufu结果缓冲区resbuf是个结构体,用rbnext字段可以把多个结果缓冲区链接成一个单链表。structresbufstructresbuf*rbnext;/Allowsthemtobelinkedshortrestype;unionads_u_valresval;u可为选择集函数设置过滤条件uacutBuildList():创建resbufuacutRelRb():删除resbuf2005Autodesk72resbuf-restype2005Autodesk73例2-8resbuf构建resbuf,为acedCmd输入参数structresbuf*cmdbuf;cmdbuf=acutBuildList(RTSTR,_T(circle),RTPOINT,point,RTSTR,_T(100),RTNONE);acedCmd(cmdbuf);acutRelRb(cmdbuf);2005Autodesk74acedSSGetacedSSGet(constACHAR*str,constvoid*pt1,constvoid*pt2,conststructresbuf*filter,ads_namess);str:选择模式pt1:某些选择模式需要输入的点列pt2:某些选择模式需要输入的点列filter:选择条件过滤器ss:选择集2005Autodesk75acedSSGet选择模式参数str值说明NULL单点选择(指定pt1)或用户选择(pt1也是NULL)I指定PICKFIRST实体集C交叉(Crossing)选取模式CP交叉多边形(Crossing polygon)选取模式F栏(即开放多边形)(Fence(open polygon)选取模式L最后(Last)选取模式,选择最近生成的实体P之前(Previous)选取模式,选择上一个选择集W窗口(Window)选取模式WP窗口多边形(Window Polygon)选取模式X只用于过滤选取模式G组(Groups)选取模式:$自定义提示(Prompts supplied)选取模式:?回调函数(”Other”callbacks)选取模式:D允许复制实体(Duplicates allowed)选取模式:E选择靶框内的所有实体(Everything in aperture)选取模式:K关键字回调函数(Keyword callbacks)选取模式:N嵌套(Nested)选取模式:S单一对象(Single)选取模式.用户选取模式#非几何选取模式(all、last、previous)A所有(All)选取模式B框选(BOX)选取模式M多重(Multiple)选取模式2005Autodesk76acedSSGet过滤关系符和条件符2005Autodesk77例2-9选择集,默认选择ads_namessname;ads_nameent;longlen;longi=0;acedSSGet(NULL,NULL,NULL,NULL,ssname);/获取选择集if(RTNORM=acedSSLength(ssname,&len)/获取选择集的长度AcDbObjectIdobjId;for(i=0;ilen;i+)/遍历选择集acedSSName(ssname,i,ent);/获取实体名acdbGetObjectId(objId,ent);/获取实体ID/操作2005Autodesk78例2-10选择集Windows选择ads_pointpt1,pt2;ads_namessname;longlen;pt2X=pt2Y=10.0;pt2Z=0.0;acedSSGet(NULL,pt2,NULL,NULL,ssname);/选择从点(,0)到点(,10)窗口中的实体pt1X=pt1Y=pt1Z=0.0;acedSSGet(_T(W),pt1,pt2,NULL,ssname);/获取选择集的长度if(RTNORM=acedSSLength(ssname,&len)AcDbObjectIdobjId;for(longi=0;ilen;i+)/遍历选择集ads_nameent;acedSSName(ssname,i,ent);/获取实体名acdbGetObjectId(objId,ent);/获取实体ID/操作。2005Autodesk792-11选择集,过滤条件只选择红色的圆或者在层Layer1的直线条件过滤设置:rb1=acutBuildList(-4,_T(“OR”),-4,_T(”),-4,_T(”),-4,_T(“OR”),RTNONE);2005Autodesk80练习21、处理用户输入函数要求:通过获取点,输出点的坐标值2、处理选择集,要求:在创建过程中使用过滤条件,选择红色的直线2005Autodesk81课程进度API概览ObjectARX基本知识用户交互和选择集数据库操作数据库操作实体对象操作和事务扩充数据反应器几何类的使用用户界面自定义对象2005Autodesk82术语uAutoCAD会话是会话是AutoCAD程序的一个实例程序的一个实例u文档文档当前文档ObjectARX处理的文档(可能在后台)活动文档用户在UI看到的u图形文件图形文件u数据库数据库工作数据库当前图形,acdbCurDwg定义为:acdbHostApplicationServices()-workingDatabase()u对象(对象(AcDbObject)所有存放于数据库中的可操作目标u实体(实体(AcDbEntity)2005Autodesk83AutoCAD图形数据库uAutoCAD数据库是按一定结构组织的所有AutoCAD对象的集合n用于组织管理AutoCAD对象n是AutoCAD对象在内存中的表示uAutoCAD图形文件是对象数据库的永久状态n对象有唯一的标识n对象可以被别的对象引用n对象中可绑定数据,比如实体自身属性,对象的xdata2005Autodesk84AutoCAD图形数据库结构符号表和各种类型的符号表记录主要包括9种类型的符号表命名对象词典2005Autodesk85重要的对象u块表块表两个缺省的块表记录*MODEL_SPACE*PAPER_SPACE,*PAPER_SPACE0实体只有添加到上面的以上块表记录中才能在AutoCAD可见块表记录只能存放实体对象u命名对象词典命名对象词典AutoCAD新的符号表词典可以放任何对象(实体Entity除外)2005Autodesk86AcDbDatabase操作n获取AutoCAD当前活动的数据库对象nacdbHostApplicationServices()-workingDatabase();n访问其他打开的文档n创建一个数据库对象AcDbDatabase(boolbuildDefaultDrawing=true,boolnoDocument=false);n保存数据库在对图形数据做修改以及添加操作以后,结果仍然在内存中,需要调用AcDbDatabase:saveAs()函数保存在磁盘文件中,n打开一个新图形AcDbDatabase:readDwgFile2005Autodesk87例3-1获取当前数据库nacdbHostApplicationServices()-workingDatabase();n不能删除pCurrentDatabase!2005Autodesk88例3-2创建和保存数据库n新建数据库n写入实体n存盘2005Autodesk89对象标识u句柄句柄(AcDbHandle)DWG文件中的每一个实体都唯一的标识符u对象对象ID(AcDbObjectId)数据库中的实体对象都会在内存中对应一个唯一的对象ID对象ID也是与实体对象相关联的唯一的标识符u指针指针当一个对象被打开后,AutoCAD会返回指向AcDbEntity类型的指针2005Autodesk90ObjectDBX session句柄,对象ID,指针.dwgObjectClosedOpenAcDbObject1.2.4.5.1.对象从文件中读取对象从文件中读取Handle-ObjectID2.对象打开对象打开ObjectID-Pointer3.新对象添加打数据库中新对象添加打数据库中分配新的ObjectID&Handle4.对象关掉对象关掉指针无效5.对象保存到文件对象保存到文件句柄写入到文件NewAcDbObject3.2005Autodesk91对象AdDbObjectId和ads_nameuads_name是是ADS时代的遗留下来的时代的遗留下来的typedef_w64longads_name2;二维长整型数组第一个元素是AcDbObjectId第二个元素是实体所在的数据库,只读u相互转换相互转换acdbGetAdsName(adsName,objId);acdbGetObjectId(objId,adsName);2005Autodesk92交换实体标识IAcDbObject:handOverToReplacesanobjectinthedbwithanewoneObjectscannotberemovedfromthedbYoucanonlyflagthemaserasedOpenAcDbObjectNewAcDbObjectObjectDBX Sessionremovedadded2005Autodesk93ObjectDBX Session交换对象标识IIAcDbObject:swapIdWith(AcDbObjectIdotherId,Adesk:BooleanswapXdata=false,Adesk:BooleanswapExtDict=false);AcDbObjectAcDbObjectidid2005Autodesk94打开模式打开打开获取对象的访问权限Read同时可以有255ReadersWriteOpen/Close模型每次只有一个writerread/write相互排斥事务(Transaction)模型允许多个writersread/write不排斥Notify稍后介绍2005Autodesk95打开对象函数acdbOpenObjectAcad:ErrorStatusacdbOpenObject(AcDbEntity*&pEnt,AcDbObjectIdid,AcDb:OpenModemode);Acad:ErrorStatusacdbOpenObject(AcdbObject*&pObj,AcDbObjectIdid,AcDb:OpenModemode,boolopenErased=false);2005Autodesk96非事务状态下对象打开后需要及时关闭uAcad:ErrorStatus返回对象打开状态eWasOpenForReadeWasOpenForWriteeWasErasedeOku成功打开(Acad:eOk)则需要关闭,不成功不需要关闭。u流程控制加以防范,避免程序崩溃AcDbObject*pObj=NULL;es=acdbOpenObjectIf(Acad:eOk=es)Elseu事务状态下不需要pObj-pObj-2005Autodesk97例3-3打开对象1.选择对象2.打开对象3.访问颜色属性4.关闭对象Acad:ErrorStatuschangeColor(AcDbObjectIdentId,Adesk:UInt16newColor)AcDbEntity*pEntity;acdbOpenObject(pEntity,entId,AcDb:kForWrite);pEntity-setColorIndex(newColor);pEntity-close();returnAcad:eOk;2005Autodesk98符号表 n符号表是存储数据库对象的容器,用于组织和管理数据库对象n每种符号表都有确定类型的记录与之关联 n不能创建或者删除符号表,而只能增加或者修改符号表中记录n在开始新建一个图形时,AutoCAD会在数据库中自动创建以下9种类型的符号表:块表(AcDbBlockTable;BLOCK)层表(AcDbLayerTable;LAYER)字型表(AcDbTextStyleTable;STYLE)线型表(AcDbLinetypeTable;LTYPE)视表(AcDbViewTable;VIEW)UCS表(AcDbUCSTable;UCS)视区表(AcDbViewportTable;VPORT)注册的应用程序表(AcDbRegAppTable;)尺寸类型表(AcDbDimStyleTable;DIMSTYLE)2005Autodesk99ArxDbg!2005Autodesk100ArxDbg!2005Autodesk101符号表操作 遍历器 u符号表有三个主要的操作函数符号表有三个主要的操作函数:nhas()判断是否符号表记录已经存在ngetAt()获取符号表记录nadd()添加符号表记录u对于所有的符号表,操作是一样的。对于所有的符号表,操作是一样的。AcDbLayerTableRecord*pLayerTableRecord=NULL;if(pLayerTable-getAt(_T(“AUTODESK”),/Layer string pLayerTableRecord/Layer Table RecordAcDb:kForWrite /WirteMode Adesk:kFalse)=Acad:eOk)pLayerTableRecord-setIsOff(Adesk:kTrue);2005Autodesk102遍历符号表es=pCurDB-getSymbolTable(pLayerTable,AcDb:kForRead);AcDbLayerTableRecord*pLayerTableRecord=NULL;AcDbLayerTableIterator*tblIter=NULL;if(pLayerTable-newIterator(tblIter)=Acad:eOk)for(;!tblIter-done();tblIter-step()es=tblIter-getRecord(pLayerTableRecord,AcDb:kForRead);delete tblIter;/切记删除每个符号表都有对应的遍历器,可以使用newInterator()函数创建遍历器 2005Autodesk103例3-3遍历并操作符号表记录1.UI新建三个层,分别为layer1(颜色为蓝色),layer2,layer32.如果访问到layer1,返回其颜色3.修改layer2的层名为layer_new4.修改layer3的颜色为红色5.新建一个层记录,并添加到层表中2005Autodesk104练习31.用UI方式创建几个块表2.获取块表3.遍历块表记录,输出其名字2005Autodesk105课程进度API概览ObjectARX基本知识用户交互和选择集数据库操作实体对象操作和事务实体对象操作和事务扩充数据反应器几何类的使用用户界面自定义对象2005Autodesk106实体对象(AcDbEntity)u实体对象,具有图形表示的数据库对象n用户与AutoCAD交互的主要对象nAutoCAD二次开发者主要的操作对象2005Autodesk107实体的生成u实体新建u加入到数据库:存放于块表记录中nModelSpacenPaperSpacen普通块记录(块定义)2005Autodesk108appendAcDbEntityAcDbBlockTableRecord:appendAcDbEntity(AcDbObjectId&pOutputId,AcDbEntity*pEntity);AcDbBlockTableRecord:appendAcDbEntity(AcDbEntity*pEntity);2005Autodesk109块定义和块引用u块定义是blockTableRecord,块表记录u块引用是blockReference实体u块引用是块定义的一个实例uModal_Space和Paper_Space当前数据库,不能被引用其它数据库,可通过Insert或Wblock2005Autodesk110例4-1创建块定义,并添加块引用1.获得块表AcDbBlockTable2.创建直线和圆3.设置直线和圆的参数4.创建块定义AcDbBlockTableRecord5.将直线添加到块定义6.获得模型空间7.创建块引用AcDbBlockReference8.块引用和块定义关联setBlockTableRecord9.将块引用添加到模型空间2005Autodesk111运行时类型识别(RuntimeTypeIdentification)如何知道这是什么实体如何知道这是什么实体AcRxObject定义了以下函数定义了以下函数(包含在包含在rxobject.h)desc静态成员函数,返回指定类的类描述符对象的。cast 返回指定类型的对象,当对象不是要求的类(或者派生类)返回NULL。isA返回未知类对象的类描述符对象。isKindOf判断对象是否属于指定类或者派生类。2005Autodesk112运行时类型识别(RuntimeTypeIdentification)假定AcDbEntity*pEnt,判断实体是否正好是一条线段if(pEnt-isA()=AcDbLine:desc()要判断实体是否是线段或者线段的派生对象if(pEnt-isKindOf(AcDbLine:desc()AcDbLine*pLine=AcDbLine:cast(pEnt);2005Autodesk113对象属性nAcDbEntity共同属性n颜色n线型n线型比例n可见性n图层nAcDbEntity:setDatabaseDefaults()n实体自身属性u根据帮助查看合法的输入值u不合法的输入值,会返回相应的错误信息2005Autodesk114实体颜色0256的颜色索引值AcCmColor类AcDbEntity:colorIndex()AcDbEntity:setColorIndex(Adesk:UInt16color)颜色索引值代表的颜色1Red(红)2Yellow(黄)3Green(绿)4Cyan(青)5Blue(蓝)6Magenta(紫红)7White or Black(白或黑)索引值说明0表示随块(BYBLOCK),即实体颜色由它所在的图块表记录中的图库引用决定。256表示随层(BYLAYER),即实体颜色由它所在的层决定。257颜色未定,即实体的颜色没有被设置(0256),也没有被添加到数据库中从而采用了数据库的当前缺省颜色2005Autodesk115实体线型u线型表AcDbLineTypeTableu线型记录AcDbLineTypeTableRecordu实体对象被创建时,其线型被初始化为NULLuAcDbEntity:setLinetype()uAcDbEntity:linetype()类型说明CONTINUOUS缺省线型,在线型表中总有这一条记录,是数据库初始化时自动产生的。BYLAYER实体所在层的线型。BYBLOCK实体所属的图块定义的中的线型。2005Autodesk116实体图层u层表AcDbLayerTableu层表记录AcDbLayerTableRecordu实体对象被创建时,其层被初始化为NULLuAcDbEntity:setLayer()uAcDbEntity:layer()2005Autodesk117实体线型比例新创建的实体对象,其线型比例被初始化为一个非法的值AcDbEntity:setLinetypeScale()AcDbEntity:linetypeScale()2005Autodesk118实体可见性实体可见性标志实体是否处于隐藏状态实体可见性标志实体是否处于隐藏状态2005Autodesk119例4-2实体属性操作1.在UI中新建一个层,名为layerNew2.加载一个线型,dot3.打开一个圆4.将其层修改为layerNew5.线型修改为dot6.颜色修改为蓝色7.修改半径为原来的2倍8.移动圆心偏移(10,10,0)9.观看修改的结果2005Autodesk120复杂实体的操作u子实体遍历器AcDbObjectIteratorvertexIterator();2005Autodesk121例4-3复杂实体的操作遍历AcDb2dPolyline,并返回顶点信息2005Autodesk122事务(Transactions)两种模式两种模式Open/CloseacdbOpenObjectAcDbObject:close,AcDbObject:cancelTransactionAcDbTransactionManager:startTransactionAcTransaction:getObjectAcDbTransactionManager:end/abortTransaction不要混淆事务模式不要混淆事务模式e.g.getObject,thenclose2005Autodesk123嵌套AcTransactions1.客户端开始事务1,获得Obj1和Obj22.客户端开始事务2获得Obj2和Obj33.客户端提交事务2事务2的变化被提交4a.客户端提交事务1事务1的变化被提交4b.客户端放弃事务1事务1和事务2的变化将退回obj1obj2事务11obj1obj2obj1obj3obj2obj1obj2obj3obj2AcDbDatabaseobj2obj3事务2234obj1obj3obj2obj2obj32005Autodesk124例4-4事务1.启动一个事务12.连续打开圆1和圆2,修改它们的半径3.再启动一个事务24.连续打开圆3和圆4,修改它们的半径5.提交事务26.放弃事务12005Autodesk125对象间关系u所有关系(Ownership)u规定写入文件的对象(DWG/DXF)u数据库对象都有一个所有者u数据库是最终的所有者u双向的u指针引用(Pointerreference)u对象间任意引用u多个对象可以指向同一个对象u单向的u使用ArxDbg查看2005Autodesk126对象间关系2005Autodesk129练习41.例4_1创建块定义,并添加块引用2.例4_2实体类型和属性操作3.例4_3复杂实体的操作2005Autodesk130课程进度API概览ObjectARX基本知识用户交互和选择集数据库操作实体对象操作和事务扩充数据扩充数据反应器几何类的使用用户界面自定义对象2005Autodesk131主要内容u自定义数据uXdatau命名对象词典u扩展字典2005Autodesk132自定义的数据u自定义数据一般为非图形特征的数据u创建自定义对象(后续介绍)u不使用自定义对象(扩充数据)nXdata(eXtensiondata)nXrecords(eXtensionrecord)n在单独的对象上的扩充词典(ExtensionDictionary)n命名对象词典下的词典(NamedObjectDictionary)2005Autodesk133XdatauAutoCAD数据库的任何对象都可以灵活的附加一定数量的扩展数(Xdata),供开发者使用,u扩展数据的含义由开发者自行解释,AutoCAD只维护这些数据而不管其具体的含义。u扩展数据是链表组,每个组是链表系列,以一个名字开头以做标识。这个名字是应用程序名。u应用程序名通过acdbRegApp()进行注册,最长可达31个字符。u所附着的数据链表不能超过16KuDXF组码只能采用10001071之间的组码值u演示XdataTest2005Autodesk134应用程序名与Xdata2005Autodesk135Xdata相关函数acdbRegAppIntacdbRegApp(constACHAR*appname);uappName必须合法u不能和已经存在的RegApp名字重复u每个新名将产生一个新的AcDbRegApp记录u成功生成一个AcDbRegApp记录,则返回RTNORM失败,则返回RTERROR2005Autodesk136Xdata相关函数setXDataAcad:ErrorStatussetXData(constresbuf*xdata);u每个注册(regappname)链表以restype=1001分界。并且resval.rstring应该是合法字符uRegappName必须是AcDbRegAppTable中存在的u如果xdata中已经有该regappname组,则新的链表将覆盖之u可接受的restype是1000-1071u要清除xdata中某个regappname的所有内容,只需建立一个以此regappname开头的空链表即可2005Autodesk137例5-1创建Xdata并添加到实体1.调用acdbRegApp注册应用程序名称;2.创建结果缓存(structresbuf);3.向结果缓存中添加内容(注意:第一项内容为程序名称,字符类型);4.打开要附着XDATA的对象;5.调用setXData()附着数据;6.释放结果缓存;7.关闭对象.2005Autodesk138例5-2访问实体的Xdata1.获取实体所有xdata2.获取关心的某regAppName下的数据链表2005Autodesk139命名对象词典(NOD)NamedObjectDictionaryu没有类似XDATA的数据大小的限制u比较灵活u扩展记录(AcDbXRecord)u扩展实体记录就是一个Resbuf链表u该链表是一个数据组的列表,链表中每一节点都包含一个DXF组码及相关数据u扩展实体记录的DXF组码的范围是1369u其中的数据没
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 商业管理 > 营销创新


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!