下载

0下载券

加入VIP
  • 专属下载券
  • 上传内容扩展
  • 资料优先审核
  • 免费资料无限下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 论文-106-VC++嵌入AutoCAD实现图形编辑功能

论文-106-VC++嵌入AutoCAD实现图形编辑功能.doc

论文-106-VC++嵌入AutoCAD实现图形编辑功能

徐君娜
2017-10-16 0人阅读 举报 0 0 0 暂无简介

简介:本文档为《论文-106-VC++嵌入AutoCAD实现图形编辑功能doc》,可适用于人文社科领域

论文VC嵌入AutoCAD实现图形编辑功能VC嵌入AutoCAD实现图形编辑功能目录一、引言二、研究意义及设计目标三、需要解决的问题(一)嵌入方式:(二)ObjectARX需要完成的任务:四、系统知识与操作步骤(一)AutoCAD数据库知识(二)创建一个ARX应用程序的操作步骤、创建一个用于执行新命令的自定义类、AutoCAD的执行入口、调用一个ARX应用程序、卸载一个ARX应用程序、ARX应用程序的生成方法、编译和链接、加载和运行五、具体实现技术(一)程序流程(二)详细步骤(三)结果测试与分析(四)结论六、小结致谢参考文献附录一、消息描述附录二、环境设置附录三、程序代码附录四、外文翻译专家评阅书量化评分标准论文评定表过程检查情况记录VC嵌入AutoCAD实现图形编辑功能AutoCAD是作为一个通用绘图系统而设计的但每一行业和专业都有自己的行业和专业标准许多专业也有自己的技术规格和企业标准每个设计工程师和绘图员更有自己独特的工作方式因而AutoCAD不可能满足每个用户的具体要求。于是通过系统提供的开放式体系结构AutoCAD允许用户和第三方软件开发商根据各自的需求来改进和扩充AutoCAD的许多功能使得AutoCAD的应用更加符合用户需要。本文将运用ObjectARX对AutoCAD进行二次开发实现对AutoCAD的图形编辑功能。ObjectARX、AutoCAD、图形编辑AutoCAD作为CAD行业的旗舰产品已经在各行各业中广泛使用AutoCAD是美国Autodesk公司的产品具有悠久而独特的历史。AutoCAD首次发行是在年这次发行开创了绘图和设计领域的一个新纪元。该软件被几次更新换代如今已经发展到了AutoCAD,当今比较流行的是AutoCAD、AutoCAD、AutoCAD。AutoCAD深受世界各地数以千万计的用户青睐其丰富的绘图功能强大的编辑功能和良好的用户界面受到了广大工程设计人员的普遍欢迎。AutoCAD得到广泛应用的原因除功能强易学易用外更主要的是他具有开放的体系结构允许用户和开发者在几乎所有方面对其进行扩充和修改能最大限度的满足用户的特殊要求。为了利用AutoCAD迸行二次开发以便实现各种工程项目的设计工作和具体的零件加工等Autodesk公司为用户提供了四种对AutoCAD进行二次开发的工具:AutoLisp、ADSObjectARX和VBA其中AutoLisp是伴随AutoCAD发展的一种解释型编程言ADS是一种C语言开发工具它作为一组AutoLisp外部函数由AutoLisp解释器装入、解释并请求AutoCAD运行而ObjectARX是Autodesk公司从AutoCADRc版开始提供的一种面向对象的新的编程环境包含了一系列的类库和头文件使用ObjectARX开发的程序编译后实际上是一种Windows动态链接库(DLL)这种DLL程序与AutoCAD的核心结合得更为紧密运行速度和稳定性都比ADS程序有较大的提高。这篇论文研究的就是怎样使用ObjectARX进行AutoCAD的二次开发。AutoCAD提供面向对象的软件接口以VC为开发语言支持MFC编程。从而可以结合VC软件开发优势与AutoCAD的图形处理优势使得AutoCAD的应用更加灵活多样。通过VC能够对AutoCAD的所有事务进行完整的、先进的、面向对象的设计与开发并且开发的应用程序速度更快、集成度更高、稳定性更强。通过VC还可以按需要加载应用程序通过使用VC对AutoCAD进行应用开发还可以在同一水平上与Windows系统集成并与其它Windows应用程序实现交互操作。ObjectARX是基于AutoCAD的新一代功能强大的二次开发工具它提供了以MicsoftVisualC为基础的面向对象的开发机制。与AutoLisp和ADS程序相比ARX应用程序更加高效、更加稳定、更能充分地利用AntoCAD开发的体系结构。因此功能强大的ObjectARX成为AutoCAD用户首选的二次开发工具之一。AutoCAD是作为一个通用绘图系统而设计的但每一行业和专业都有自己的行业和专业标准许多专业也有自己的技术规格和企业标准每个设计工程师和绘图员更有自己独特的工作方式比如在机械绘图中零件上的一些细小结构在视图上常由于图形过小而表达不清或标注尺寸有困难需将过小的图形放大。但在用AutoCAD绘制机械零件时用“ZOOM’命令仅可以放大显示所有这些结构不方便整体观看并且不便于局部的放大输出。要和手工绘图一样图纸上应有这一微小结构的局部放大图单单用AutoCAD操作就比较繁琐了。因而AutoCAD不可能满足每个用户的具体要求。于是通过系统提供的开放式体系结构AutoCAD允许用户和第三方软件开发商根据各自的需求来改进和扩充AutoCAD的许多功能使得AutoCAD的应用更加符合用户需要。本文将运用ObjectARX对AutoCAD进行二次开发实现对AutoCAD的图形编辑功能。根据AutoCAD的强大图形处理功能将编译好的ARX动态链接库装载到AutoCAD中使之成为AutoCAD的一个扩充的内部命令用时只需拾起该命令输入参数即可实现各种特定的特殊功能操作非常简便。(一)嵌入方式:实现ObjectARX嵌入AutoCAD首先要解决嵌入的方式本文采用的是用VC通过ObjectARX编写一个ARX动态链接库通过AutoCAD的Tool>LoadApplication菜单项将编译好的ARX动态链接库装载到AutoCAD中使之成为AutoCAD的一个扩充的内部命令即初步实现了VC通过ObjectARX对AutoCAD的嵌入。用时只需调用该命令输入相应的参数即可实现相应的扩展功能操作非常简便。(二)ObjectARX需要完成的任务:、访问AutoCAD数据库一个AutoCAD图形是保存在数据库中对象的集合ObjectARX提供给用户应用程序访问这些数据库结构的方法另外用户可以为指定的应用程序创建数据库。、与AutoCAD编辑器交互作用ObjectARX提供了可以与AutoCAD编辑器交互作用的类和成员函数用户可以注册AutoCAD命令这些命令将与内置命令一样。用户的应用程序可以接收和响应发生在AutoCAD中的各种事件的通知。、创建自定义类用户可以在ObjectARX层次下以ObjectARX类为基础创建自己的自定义类。另外当创建自定义类时用户也可以利用ObjectARX扩展的图形库。、建立复杂的应用程序ObjectARX支持复杂应用程序的开发它提供了如下特征:,通知,事务处理,深度克隆,引用编辑,协议扩展,协议对象支持。(一)AutoCAD数据库知识一个AutoCAD图形是储存于一个数据库中对象的集合。一些基本的数据库对象是实体、符号表和字典。在数据库中的每个对象均有一个句柄这个句柄对于特定图形的上下文之间是唯一的识别标志。在二个AutoCAD图形中实体是一种特别的数据库对象它具有图形表示例如直线圆、文本、三维实体、面域、样条曲线和椭圆。用户可以在屏幕上看见一个实体并可以操作它。符号表和字典是用来保存数据库对象的容器两个容器对象映射一个数据库对象的一个符号名(一个文本字符串)。一个AutoCAD数据库包括一个固定的符号表集每个符号表均包含一个特定的符号表记录类的实例。用户不能向数据库添加一个新的符号表。符号表实例是层表(AcDbLayerTable)和块表(AcDbBlockTable),层表中包含有层表记录块表中包含有块表记录。所有的AutoCAD实体均为块表记录所有。图表示了AutoCAD数据库的关键组件。字典提供了一个储存对象的更一般的容器。一个字典可以包含任意AcDbObject或它的子类。当创建一个新图形时AutoCAD数据库会创建一个名为命名对象字典的字典。命名对象字典可以看作与数据库相关联的所有字典的主“内容表”。用户可以在命名对象字典中创建新的字典并向它们添加新的数据库。图AutoCAD的关键组件ID:通过对象ID用户可以获得一个实际数据库对象的指针这样用户就可以对对象执行操作。用户可以通过下面的方法获得对象ID:,创建一个对象并将它添加到数据库中。数据库会赋予对象一个对象ID并且返回给用户。,使用数据库协议来获得数据库创建时自动创建的对象的ID(例如固定数目的符号表和命名对象字典)。,使用指定类的协议来获得对象ID。一般的类例如符号表和字典定义了属于其他对象的对象这些类提供了获得主对象的对象ID的函数。,使用一个遍历器来遍历一组对象。AcDb库提供了一些遍历器来浏览不同类型的容器对象(AcDbDictionaryIterator和AcDbObjectIterator)。,查询一个选择集。当选择了一个对象后用户可以询问选择集来获得所选择对象的实体名列表然后将这些实体名转换成对象ID。(二)创建一个ARX应用程序的操作步骤、创建一个用于执行新命令的自定义类通过AcEd命令注册新的AutoCAD命令的机制。通过注册自定义的命令可以把自定义的命令加入到命令集中。可以通过宏acedRegCmds{)实现这一功能。可以使用函数AcEdCommandStack::addCommand()来增加白己的命令使用函数AcEdCommandStacL::moveGroup()将整个组移走也可以使用函数AcEdCommandStack:removeCmd()每次只移走一条命令。实现注册新命令的代码如下:voidinitApp(){acedRegCmds>addCommand("LongtrandCommands","LONGTRANS","Longtrans",ACRXCMDMODAL,refEditApiExample)}自定义类可以从大多数OjbectARX继承类(hierarchy)和符号表类中派生出来。、AutoCAD的执行入口ObjectARX嵌入AutoCAD的程序中没有main()函数应用程序与AutoCAD的接口是通过acrxEntryPointt()函数来实现的。在这个函数中应用程序可以定义自己的命令和类同时在这个函数中要完成应用程序的初始化。acrxEntryPoint()函数的功能不仅仅是作为AutoCAD和ARX通讯的入口而且通过它向AutoCAD返回状态码从而使应用程序能够向AutoCAD系统发送消息。acrxEntryPoint()函数的语法如下:extern"C"AcRx::AppRetCodeacrxEntryPoint(AcRx::AppMsgCodemsg,void*pkt){switch(msg){caseAcRx::kInitAppMsg:…breakcaseAcRx::kUnloadAppMsg:unloadApp()breakdefault:break}returnAcRx::kRetOK}参数含义:msg:代表从ARX核心向应用程序发送的消息。pkt:持有数据包的值。AppRetCode:返回AutoCAD的状态码。在acrxEntryPoint()函数的定义中,使用的是条件分支语句switch,来完成对AutoCAD传来的消息的解码并根据消息完成相应的功能最后返回一个整型的状态值。如果用户需要对一个给定的消息返回错误信息则必须由一个case语句来完成。、调用一个ARX应用程序在AutoCAD中允许通过以下的方式调用一个ARX应用程序:在初始化模块文件acadrx中指定应用程序。在另一个ARX应用程序中通过AcRxDynamicLinker::loadModule()函数发出调用请求。使用在AutoCAD程序loadapparx中定义的APPLDAD对话框用户可以在命令行中键入"appload"命令或在AutoCAD菜单中选中Tools>LoadApplication菜单项将出现“"LoadUnloadApplications”对话框。用户可以选择想要加载的文件然后单击Load按钮加载文件。使用ARX中的函数acedarxload()。在AutoCAD命令行中键入“arx”命令使用load选项。本设计运用的是第三种方法。、卸载一个ARX应用程序用户可以用如下的方法卸载ARX程序:在另一个ARX程序中使用函数AcRxDynamicLinker::unloadModule()发出卸载请求。使用AutoCAD中所带的文件loadapparx定义的APPLOAD对话框来卸载ARX程序。用与加载相同的方法打开"LoadUnloadApplications"对话框在"LoadedApplications”列表框中选中要卸载的应用程序然后单击Unload按钮即可完成该程序的卸载。使用AutoLISP的函数arxunload()。使用ARX或ADS中的函数adsarxload()。在AutoCAD命令行中键入"arx"命令使用unload选项。本文运用的是第二种方法。、ARX应用程序的生成方法由于ARX应用程序是个动态链接库因此要正确生成程序模块必须有一个相应的模块定义文件。在该文件中必须定义AutoCAD调用的入口函数名下面是本文用到的模块定义:文件内容:LIBRARYLONGTRANSDESCRIPTION'LONGTRANSapplication'EXPORTSacrxEntryPointPRIVATEacrxGetApiVersionPRIVATE在模块定义文件的LIBRARY段定义动态链接库的库名该库名应与ARX应用程序名相同不区分大小写。在EXPORTS段定义输出函数名acrxEntryPoint()、和acrxGetApiVersion(),第一个为AutoCAD调用ARX应用程序的人口函数名后一个是在rxapilib库中生成的函数。对于不同的ARX应用程序模块定义文件只需修改第一行"LIBRARY"后的库名和第二行中的说明文字其余内容可以照写。、编译和链接ARX的C源程序需要经过编译和链接才能在AutoCAD环境运行对于MicrosoftVisualC的环境设置见附录二。、加载和运行由第部可生成一个longtransarx文件启动AutoCAD通过Tools>Application菜单项加载longtransarx在命令行下键入命令Longtrans通过输入相应参数即可开始进行对AutoCAD图形的简单编辑。(一)程序流程图列出了本程序的流程图:图程序流程图(二)详细步骤应用程序第一个命令longtrangs的功能是读取dwg文件从AutoCAD的数据库中选取line对象然后改变它们的颜色最后存盘。实现命令longtrans的具体步骤为:通过acedGetFiledD从用户那里得到一个图形(dwg)文件:structresbuf*rbrb=acutNewRb(RTSTR)intstat=acedGetFileD("Pickadrawing",,"dwg",,rb)通过readDwgFile()打开该文件:pDb=newAcDbDatabase(Adesk::kFalse)pDb>readDwgFile(fname)通过getSymbolTable和getAt得到块表和模型空间记录:AcDbBlockTable*pBlockTablepDb>getSymbolTable(pBlockTable,AcDb::kForRead)AcDbBlockTableRecord*pOtherMsBtrpBlockTable>getAt(ACDBMODELSPACE,pOtherMsBtr,AcDb::kForRead)通过newIterator创建一个遍历器然后创建一个对象ID数组通过for循环来进行具体的遍历操作:AcDbBlockTableRecordIterator*pIterpOtherMsBtr>newIterator(pIter)AcDbObjectIdArrayobjIdArray创建一个对象ID数组具体的遍历操作for(pIter>start()!pIter>done()pIter>step()){AcDbEntity*pEntitypIter>getEntity(pEntity,AcDb::kForRead)获得实体……}根据找到的对象进行相应的判断获得需要的数据库及其模型空间的对象ID:AcDbBlockTable*pThisBlockTableacdbHostApplicationServices()>workingDatabase()>getSymbolTable(pThisBlockTable,AcDb::kForRead)AcDbBlockTableRecord*pThisMsBtrpThisBlockTable>getAt(ACDBMODELSPACE,pThisMsBtr,AcDb::kForWrite)pThisBlockTable>close()AcDbObjectIdid=pThisMsBtr>objectId()pThisMsBtr>close()创建长事物处理从外部数据库检查所有实体修改相应实体信息:AcDbIdMappingerrorMapacapLongTransactionManagerPtr()>checkOut(transId,objIdArray,id,errorMap)获得事物的指针和工作集遍历器对工作集实体进行遍历改变实体信息:AcDbLongTransWorkSetIterator*pWorkSetIterpLongTrans>newWorkSetIterator(pWorkSetIter)for(pWorkSetIter>start()!pWorkSetIter>done()pWorkSetIter>step()){……}将实体放回数据库保存原数据库关闭并删除数据库:acapLongTransactionManagerPtr()>checkIn(transId,errorMap)pDb>saveAs(fname)deletepDbpDb=acadfree(fname)应用程序第二个命令creat的功能是创建传送带模型然后通过对象的移动来模拟传送带传送物品的过程。实现命令creat的具体步骤为:、输入参数:输入创建传送带模型所需的参数包括传送轮的半径大小两传送轮之间的距离即圆心距所传送小圆物体的半径大小对每个参数都要进行验证比如半径必须大于圆心距要保证两个传送轮不会相碰具体代码如下:acedGetReal("n请输入轮子的半径:",radius)if(radius<=){acutPrintf("n错误:半径不能小于!")return}acedGetReal("n请输入圆心距:",distance)if(distance<*radius){acutPrintf("n错误:圆心距不能小于倍半径!")return}acedGetReal("n请输入被传送物体的半径:",radius)if(radius<=){acutPrintf("n错误:半径不能小于!")return}、创建模型:生成两条线段来模拟传送带生成两个原来模拟传送轮生成一个小圆来模拟被传送的物体各实体的参数部分由用户输入部分由程序给出具体代码如下:acedCommand(RTSTR,"line",RTPOINT,p,RTPOINT,p,RTSTR,"",RTNONE)acedCommand(RTSTR,"line",RTPOINT,p,RTPOINT,p,RTSTR,"",RTNONE)acedCommand(RTSTR,"circle",RTSTR,",",RTREAL,radius,RTNONE)acedCommand(RTSTR,"circle",RTPOINT,p,RTREAL,radius,RTNONE)acedCommand(RTSTR,"circle",RTPOINT,p,RTREAL,radius,RTNONE)其中p代表从动轮圆心p,pp,p代表线段与传送轮的切点,p代表小物体的圆心。、选择实体:利用adsentsel选取小圆来获取对象选择对象后用对象指针指向对象返回对象参数程序判断所选对象是否为圆对象若不是则命令返回若是则继续通过对象返回的圆心和半径判断是否为小圆对象不是则返回是则继续执行具体代码如下:if(adsentsel("n选择小圆物体开始运动:",en,pt)!=RTNORM){adsprintf("没有选择对象n")return}AcDbObjectIdeldacdbGetObjectId(eld,en)AcDbEntity*pEntacdbOpenObject(pEnt,eld,AcDb::kForWrite)pEnt>highlight(kSubent)if(strcmp(pEnt>isA()>name(),"AcDbRectang")==){pCircle=AcDbCircle::cast(pEnt)if(p=pCircle>circleradius=pCircle>radius()){…}、移动对象:通过for循环不断改变小圆的圆心来模拟传送的过程在每个循环中加入一些空循环来延长移动的时间让用户可以看清楚移动的过程具体代码如下:for(i=i<distancei){for(i=i<i)pX=pXpCircle>setCenter(p)}pX=pCircle>setCenter(p)(三)结果测试与分析测试过程如下:、测试命令longtrans:先在AutoCAD中画一些图形,保存为dwg格式通过AutoCAD的菜单项加载longtransarx文件在命令行输入新定义的命令longtrans,弹出选择文件对话框,选取dwg文件如果选择有误则在命令行显示提示信息:“Youmustpickadrawingfile!”并退出若图形中无直线对象图形,则在命令行显示:Youmustpickadrawingfilethatcontainsline然后命令返回若图形中有直线对象图形,则此时在命令行显示:Enteranintegertochangethecoloroflineto:输入要改变的直线希望的颜色代码(比如)图中直线颜色变为所代表的颜色然后自动存盘若改变程序代码中的对象名,则该命令还可以实现对其他如圆形,矩形等实体对象的大小,颜色,位置的改变,这里不一一列举。、测试命令creat加载longtransarx后在命令行输入creat命令行显示:“请输入轮子的半径”此时若输入小于等于的数命令行将显示:“错误:半径不能小于!”输入作为轮子的半径命令行显示:“请输入请输入圆心距”此时若输入的数小于倍半径命令行将显示:“错误:圆心距不能小于倍半径!”输入作为圆心距命令行显示:“请输入被传送物体的半径:”此时若输入小于等于的数命令行将显示:“错误:半径不能小于!”输入作为传送物体的半径此时在AutoCAD屏幕中将生成如图所示的图形:图传送带模型在开始的时候由于我把生成直线的代码写成:acedCommand(RTSTR,"line",RTPOINT,p,RTPOINT,p,RTNONE)而使整个图形一片混乱后来我跟踪AutoCAD的执行过程发现当上面的代码执行时将生成一条线段然而直线生成后该命令并没有完全结束有一条虚线从p点引出等待着下一点的输入而此时输入的却是命令代码“circle”经AutoCAD判断命令无效从而“circle”后面的参数圆心将作为上面线段的下一端点而生成一条新的线段这样就背离了程序要达到的目的。后将代码改为acedCommand(RTSTR,"line",RTPOINT,p,RTPOINT,p,RTSTR,"",RTNONE)加了一个:“RTSTR,”””这样完全实现了上述命令的结束从而下一条命令可以正常执行。在生成圆和与它相切的线段时我先创建了圆但是在创建线段时线段的起点总是从圆心处引出无法实现相切在AutoCAD界面上直接作图也是如此出现这种状况的具体原因我没找到估计是我对AutoCAD的了解不够。后来我把生成的顺序颠倒过来即先生成线段后生成圆这样就不会出现上述情况程序得以顺利执行。命令行显示:“选择小圆物体开始运动”用光标选取小圆对象若没有选取任何对象则在命令行:“显示没有选择对象!”若选取了其他的对象则命令返回选取了小圆对象则小圆将开始沿着线段代表的传送带移动移动圆心距长度后小圆回到初始位置停止。(四)结论经过测试VC通过ObjectARX嵌入AutoCAD时可以创建各种对象如实体对象等还可以通过获取对象ID实现对直线、圆形、矩形等对象的大小,颜色位置等消息参数的改变。由于VC灵活多变功能多样它嵌入AutoCAD可以使AutoCAD对图形的处理功能更加强大更能满足各专业用户的具体需要。当然程序所实现的只不过是最基本的功能很多功能由于我现在所掌握的的知识太少而无法实现我本来想通过改变坐标系原点位置和坐标尺度改变对象的相对参数来模拟ZOOM命令但由于没有找到相关资料而没有进行下去不知可不可以实现。另外我想实现图形的局部放大输出由于时间关系我没有做玩现提出算法与大体步骤如下:,使用acedEntSel、acedGetReal和acedGetPoint这个函数分别由用户选择需要放大的区域S、输人放大比例系数X以及输入要移动到的位置点P。,选择复制对象用函数acedSSGet选择当前文档中的所有对象到选择集X中然后用函数intersectWith对选择集X进行过滤找出所有与区域S相交的对象。同时进行复制并加到选择集X中那么X中全部为与区域S相交的对象。,剪切剪切去选择集X中位于区域S外面的部分这一步主要是采用函数acedCommand引用AutoCAD中的Trim命令来完成。,移动对象并放大最后使用transformBy函数移动选择集X到用户指定的位置并同时放大对象。通过这几个月的学习我从一个AutoCAD的门外汉到达了运用ObjectARX对AutoCAD进行简单二次开发的水平。经过这个毕业课题的训练使我掌握了AutoCAD的基础知识和运用ObjectARX对AutoCAD进行简单二次开发的基本方法全面的提高了我的自学能力。在整个学习过程中我认真的翻阅了很多有关AutoCAD二次开发方面的书籍在Inter网上也查了不少有关的内容系统的学习了AutoCAD的使用方法以及运用ObjectARX对AutoCAD进行二次开发的相关技术掌握了AutoCAD软件接口的功能和使用方法进一步学习了利用VC进行的程序设计当然我所做的研究还只是很浅在今后的工作学习中还需要进一步的认真学习。郭朝勇AutoCAD定制与开发清华大学出版社年姜思敏、曹默、胡春江AutoCAD开发工具人民邮电出版社年陈杉用ObjectARX开发AutoCAD应用程序,人民邮电出版社年宋延杭ObjectARX实用指南AutoCAD二次开发,人民邮电出版社年CharlesMcAuleyProgrammingAutoCADUsingObjectARX机械工业出版社年AutoCAD发送给ObjectARX应用程序的消息:消息描述KinitAppMsg当应用程序被装载时为了打开AutoCAD与应用程序之间的通信而发送KUnloadAppMsg当ObjectARX应用程序被卸载时(当用户卸载应用程序或当AutoCAD本身中断时)为关闭文件和执行清除操作而发送KLoadDwgMsg当图形被打开时被发送使ADS函数库可以为需要它的应用程序的函数所使用消息仅在应用程序己经使用adsdefun()注册了一个AutoLISP函数时发送KPreQuitMsg当AutoCAD退出时发送但在开始卸载所有ARX应用程序之前KUnloadDwgMsg当用户退出一个绘图对话许从内存卸载ADS函数库时发送KInvSubrMsg为激活使用adsdefun()注册的函数而发送kEndMsg仅当END名被输入并且那儿有需要被保存的变化时(当dbmod!=)发送。对于NEW或OPEN命令不发送KendMsg而发送KSaveMsg和KLoadDwgMsg,对于END,如果dbmod=kQuitMsg被发送而不发送kEndMsgKQuitMsg当因为QUIT命令被输入而使AutoCAD退出图形(没有保存而退出)时发送。KQuitMsg也可以在使用END命令时被收到。如上所述如果END被传递并且dbmod=则KQuitMsg被发送KSaveMsg当因为SAVE,SAVEASNEW或OPEN命令被输入而使AutoCAD正在保存图形时被发送。消息仅在应用程序已经使用adsdefun()注册了一个AutoLISP函数时发送KCfgMsg当AutoCAD从配置程序返回时发送并仅用于显示驱动发生改变时KdependencyMsg当ARX应用程序已经注册了一个AcRxService对象并且当与操作相关的记数从变为时发送KnoDependencyMsg当ARX应用程序已经注册了一个AcRxService对象并且当与操作相关的记数从变为时发送KoleUnlnadAppMsg该消息仅被具有ActiveX(OLE)Automation的应用程序响应发送该消息用来决定应用但序是否卸载(也就是说它的ActiveX对象或接口没有被其它应用程序所参考〕MicrosoftVisualC的环境设置:在"Projectname"编辑框中输入想要的工程名本例输入"longtrans”。在"Location"编辑框中确定工程存放的位置单击OK按钮打开"WinDynamicLinkLibraryStepof"对话框。选择“AnemptyDLLproject”选项。单击finish按钮然后在出现的“NewProjectInformation"对话框中单击OK按钮。选择Project>Settings菜单项打开"ProjectSettings"对话框。在"SettingsFor”列表框中选择“AllConfigurations"选项。单击"CC”子页。在“Category”列表框中选择"CodeGeneration"。在"Useruntimelibrary"列表框中选择"MultithreadedDLL"。单击"Link"子页进行连接器设置。确保"Category'组合框被设置成"General"。在对话框左边的"SettingFor"下拉框中选择"WinDebug"选项。在"Outputfilename”编辑框中用户应看到类似于"Debugl<myProject>dll"形式的内容把扩展名从dll改为arx。由于AutoCAD缺省认为arx文件为ObiectARX应用程序所以使用此扩展名在对话框左边的“SettingsFor”下拉框中选择"WinRelease"选项。在"Outputfilename"编辑框中用户应看到类似于"Releasek<myProject>d"形式的内容把扩展名从dll改为arx。在对话框的左边在"SettingsFor"下拉框中选择"AllConfigurations"选项。在"Objectlibrarymodules"编辑框中输入如下的库文件名:"rxapilibacrxlibacutillibacedapilibacadlibacgeIlibacdbllib",中间用空格隔开其中rxapilib,acrxllib,acutiib和acedapilib是一个最基本的ARX应用程序所必须的ObjectARX库在本程序中还要用到acadlibacgelib,acdbllib复杂的ARX应用程序可以调用其他的ObjetcARX库。在VisualC莱单中选择FileNew菜单项,选择"CSourceFile"选项然后输入longtrans作为文件名生成longtranscpp文件即可输入程序代码在VisualC莱单中选择FileNew菜单项,选择"Textfile"选项然后输入longtransdef作为文件名生成longtransdef文件即可输入模块定义代码for(pIter>start()!pIter>done()pIter>step()){……AcDbEntity*pEntityvoidrefEditApiExample()pIter>getEntity(pEntity,AcDb::kForRead){获得实体AcDbObjectIdtransIdAcDbDatabase*pDb将直线对象ID添加到数组中char*fnameif(pEntity>isKindOf(AcDbLine::desc))structresbuf*rb{从用户那里得到一个图形(dwg)文件objIdArrayappend(pEntity>objectId())rb=acutNewRb(RTSTR)}intstat=acedGetFileD("PleasePickapEntity>close()关闭实体drawing!",,"dwg",,rb)}如果用户选择有误则显示提示信息并退deletepIter出pOtherMsBtr>close()if((stat!=RTNORM)||(rb==))若无直线对象则释放文件名显示提示信{息acutPrintf("nYoumustpickadrawingfile")if(objIdArrayisEmpty())return{}acadfree(fname)将文件名转换成字符串acutPrintf(“nYoumustpickadrawingfilefname=(charthatcontainsline”)*)acadmalloc(strlen(rb>resvalrstring))returnstrcpy(fname,rb>resvalrstring)}acutRelRb(rb)获得当前数据库及其模型空间的对象ID打开dwg文件AcDbBlockTable*pThisBlockTablepDb=newAcDbDatabase(Adesk::kFalse)acdbHostApplicationServices()>workingDatabapDb>readDwgFile(fname)se()得到块表和模型空间记录>getSymbolTable(pThisBlockTable,AcDb::kForAcDbBlockTable*pBlockTableRead)AcDbBlockTableRecord*pThisMsBtrpDb>getSymbolTable(pBlockTable,AcDb::kForpThisBlockTable>getAt(ACDBMODELSPARead)CE,pThisMsBtr,AcDbBlockTableRecord*pOtherMsBtrAcDb::kForWrite)pThisBlockTable>close()pBlockTable>getAt(ACDBMODELSPACE,pAcDbObjectIdid=pThisMsBtr>objectId()OtherMsBtr,pThisMsBtr>close()AcDb::kForRead)创建长事物处理将从外部数据库检查所有pBlockTable>close()实体创建一个遍历器AcDbIdMappingerrorMapAcDbBlockTableRecordIterator*pIteracapLongTransactionManagerPtr()>checkOut(trpOtherMsBtr>newIterator(pIter)ansId,AcDbObjectIdArrayobjIdArray创建一个对objIdArray,id,errorMap)象ID数组修改实体的颜色具体的遍历操作intcolorIndexnsId,errorMap)acedGetInt("nEnteranintegertochangethe保存原数据库colorofcirclesto:",pDb>saveAs(fname)colorIndex)关闭并删除数据库AcDbObject*pObjdeletepDb如果打开对象成功pDb=if(acdbOpenObject(pObj,transId,AcDb::kForReaacadfree(fname)释放文件名d)==Acad::eOk)}{voidcreat()创建二轮传送带模型获得事物的指针{AcDbLongTransaction*pLongTrans=doubleradiusAcDbLongTransaction::cast(pObj)doubledistanceif(pLongTrans!=)doubleradius{inti获得工作集遍历器adsnameenAcDbLongTransWorkSetIteratorAcDbCircle*pCircle*pWorkSetIteradspointpt,p,p,p,p,ppLongTrans>newWorkSetIterator(pWorkSeAcGePointdptIter)acedGetReal("n请输入轮子的半对工作集中实体进行遍历改变实径:",radius)体颜色if(radius<=)for(pWorkSetIter>start()!pWorkSetIter>done(){pWorkSetIter>step())acutPrintf("n错误:半径不能小于!"){returnAcDbEntity*pEntity}acdbOpenAcDbEntity(pEntity,pWorkSetIter>objacedGetReal("n请输入圆心ectId(),距:",distance)AcDb::kForWrite)if(distance<=)pEntity>setColorIndex(colorIndex){pEntity>close()acutPrintf("n错误:圆心距不能小于!")}returndeletepWorkSetIter}}if(distance<*radius)pObj>close(){}acutPrintf("n错误:圆心距不能小于倍半径!")暂时让用户能看见这种变化returncharstr}acedGetString(,"nNotethenewcolorandacedGetReal("n请输入被传送物体的半radiusPressreturntoback",径:",radius)str)if(radius<=){将实体放回原数据库acutPrintf("n错误:半径不能小于!")acapLongTransactionManagerPtr()>checkIn(trareturn}for(i=i<distancei){pX=pX=pX=distancefor(i=i<i)pY=pX=pX=pX=pXpY=pY=radiuspCircle>setCenter(p)pY=pY=radius}pZ=pZ=pZ=pZ=pZ=pZ=pX=pCircle>setCenter(p)pX=pY=radius}}传送带用两条直线表示}acedCommand(RTSTR,"line",RTPOINT,p,RTPOINT,p,RTSTR,"",RTNONE)acedCommand(RTSTR,"line",RTPOINT,p,RTPOINT,p,RTSTR,"",RTNONE)两个轮子用两个圆表示acedCommand(RTSTR,"circle",RTSTR,",",RTREAL,radius,RTNONE)acedCommand(RTSTR,"circle",RTPOINT,p,RTREAL,radius,RTNONE)小圆表示物体acedCommand(RTSTR,"circle",RTPOINT,p,RTREAL,radius,RTNONE)if(adsentsel("n选择小圆物体开始运动:",en,pt)!=RTNORM){adsprintf("没有选择对象n")return}AcDbObjectIdeldacdbGetObjectId(eld,en)AcDbEntity*pEntacdbOpenObject(pEnt,eld,AcDb::kForWrite)pEnt>highlight(kSubent)if(strcmp(pEnt>isA()>name(),"AcDbRectang")==){pCircle=AcDbCircle::cast(pEnt)if(p=pCircle>circleradius=pCircle>radius()){ObjectARXLibrariesObjectARXexposesthekernelofAutoCADintheformoflibrariesAcDbandAcEdlibrariesformtheheartofObjectARXalongwiththeotherimportantlibrariesAcDbprovidesthedirectinterfacesthatallowaccesstotheAutoCADdatabaseThislibraryenablesthedevelopmentofcustomobjectsandentities,suchaslines,circles,andarcs,aswellastheprotocolextensionthatcanextendthebehaviorssupportedbytheAutoCADsetofexistingobjectsandentitiesAutoCADdatabaseobjectsincludebothgeometricalobjectssuchaspolylines,circles,andarcs,aswellastheprotocolextensionthatcanextendthebehaviorssupportedbytheAutoCADsetofexistingobjectsandentitiesAutoCADdatabaseincludesnongeometricalobjects,suchassymboltablesanddictionaries,aswellasthegeometricalobjectsmentionedpreviouslyAcGiprovidestheinterfacetorendergraphicstothedisplayinvariousmodes(wireframe,shaded,boundingbox,etc)ofthoseAutoCADorapplicationdefinedobjectswhichhavegraphicalrepresentationAcEdprovidescoreinterfacestotheAutoCADdrawingeditorInadditionAcEdlibraryprovidesclassesfordefiningandregisteringnewAutoCADcommandsthatoperateinthesamemannerasbuiltinAutoCADcommandsAcEdalsoprovidesforanapplicationtomonitorspecificeditoreventssuchasstarting,ending,orcancelingofacommand,enablinganapplicationtohavespecificinterapplicationrelationshipsAcGeprovidestheinterfacetoautilitylibraryforcommonlinearalgebraandothergeometriccomponentsofAutoCADAcRxprovidessystemlevelclassesfordynamiclinklibrary(DLL)initializationandlinkingandforruntimeclassregistrationandidentification译文:ObjectARX库ObjectARX以库的形式揭示AutoCAD的核心。AcDb类库连同另一个重要的AcEd类库一起形成ObjectARX的核心。AcDb提供允许对AutoCAD数据库的通路直接访问的接口。该AutoCAD数据库不但为如线型圆和弧这样的图形对象保存所有信息使这些图形对象组成一个AutoCAD图形而且为非图形对象保存所有信息AutoCAD数据库对象包括图形对象,像是线型圆和弧,并能扩充被AutoCAD。AutoCAD数据库还包括非图形对象,像是先前提到的符号表和字典对象。AcGi为那些AutoCAD的各种不同的模态(电线格式,暗影等)的展览图形提供了图形接口或申请定义的有图解式的实体。AcEd库提供了用于定义和注册新的AutoCAD命令的类这些新的AutoCAD命令与AutoCAD内置命令操作方式一样。通过此类也可产生一个检测特定的用户事件,如开始终止或删除一个指令这些特别事件发生时通知应用程序。AcGe为通常的线代数学和AutoCAD的其他几何学的成份接口提供了一个通用库。AcRx为动态链接库(DLL)初始化及链接提供了系统级别的类这些类也可以用于实时类注册和识别。VCintotheAutoCADtorealizesthefunctionofeditinggraphAbstractsTheAutoCADistobeusedasaningeneralpaintingsystemtobedesigned,buteachprofessionwithprofessionallhaveownprofessionwithprofessionstandard,manyprofessionsalsohavetechniquespecificationwiththebusinessenterprisestandard,eachengineerhasthespecialworkinoneselfmethodwithillustratormore,asaresult,theAutoCADisimpossibletosatisfytheconcreterequestofeachcustomerHencepasstheopentypesystemconstructionthatsystemprovide,theAutoCADadmissioncustomerdevelopsthecompanywiththesquaresoftwareinthethirdaccordingtoeachfromofneedtoimprovewithenlargetheAutoCADallowmultifunction,makeAutoCADapplicationmetthecustomerdemandmoreThistextwillmakeuseoftheObjectARXtoproceedtotheAutoCADtodeveloptwotimes,realizingtoeditthefunctiontotheAutoCADsketchKeyWordsObjectARX、AutoCAD、SketchEdit

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

评分:

/37

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利