




已阅读5页,还剩40页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ObjectARX开发环境的创建与开发实例Hello World(VS2005+AutoCad2008+ObjectArx2008) 在一个做CAD二次开发的公司做Web开发,感觉可提升的空间很小。有必要研究一下公司的产品开发,以利发展。一、首先安装好vs05与cad2008安装cad的时候也没有什么特别,加载到虚拟光驱,安装过程中有个错误提示,不影响继续。二、安装ObjectArx2008直接打开解压缩到某个目录即可。比如C:ObjectARX 2008然后打开C:ObjectARX 2008utilsObjARXWiz目录,运行ArxWizards.msi这样在新建C+项目的时候会出现ObjectARX项目,如图三、包含文件工具-选项-项目和解决方案-VC+目录,如图所示:包含文件(添加图中前两个目录即可)库文件(添加图中前两个目录即可)四、新建ObjectARX项目,完成后添加MFC支持,如图所示:然后直接点finish打开acrxEntryPoint.cpp点击左上角的a按钮,然后新建一个命令。如图:只需要修改Internation Name与Localized Name为testcmd即可添加完成后,会在acrxEntryPoint.cpp中自动添加一句如下的代码:然后添加一句AfxMessageBox(_T(this is a test command.);五、加载与运行在项目中win32debug目录下,把ArxProject2.arx复制到桌面,注意先生成一下。打开cad08输入命令:ap打开加载对话框。找到.arx文件即可加载。如图:然后输入自己的命令testcmd就能运行了。如图:公司高手如云,希望能在CAD二次开发方面有些发展。转行也行,呵呵。凡事以大气象去面对,优秀是一种习惯。 CAD二次开发学习笔记一(画一条直接) ARX内部是不需要调用cad命令的。调用 ARX 函数或对象就可以象CAD一样绘制、编辑实体。在AutoCAD中画直接的命令是line0,01000,100通过ObjectARX画,新建一个命令cmd1代码如下:代码 /-ArxProject2.cmd1commandstaticvoidArxProject2cmd1(void)/AddyourcodeforcommandArxProject2._MyCommand1hereacutPrintf(_T(HelloWorld);/在内存上创建一个新的AcDbLine对象AcGePoint3dptStart(0,0,0);AcGePoint3dptEnd(10000,10000,0);AcDbLine*pLine=newAcDbLine(ptStart,ptEnd);/*基于AutoCAD内部的实现机制,必须在堆上创建对象。acdbHostApplicationServices()-workingDatabase()获得指向当前活动的图形数据库的指针。*/获得指向块表的指针AcDbBlockTable*pBlockTable;acdbHostApplicationServices()-workingDatabase()-getBlockTable(pBlockTable,AcDb:kForRead);/获得指向特定的块表记录(模型空间)的指针AcDbBlockTableRecord*pBlockTableRecord;pBlockTable-getAt(ACDB_MODEL_SPACE,pBlockTableRecord,AcDb:kForWrite);/将AcDbLine类的对象添加到块表记录中AcDbObjectIdlineId;pBlockTableRecord-appendAcDbEntity(lineId,pLine);/关闭图形数据库的各种对象pBlockTable-close();pBlockTableRecord-close();pLine-close();ap加载然后cmd1运行。凡事以大气象去面对,优秀是一种习惯。 CAD二次开发学习笔记二(创建一个对话框) 打开资源视图-右击-添加资源-Dialog双击对话框,弹出MFC类向导,输入类名FirstClass,确定,创建对话框类。FirstClass.h与FirstClass.cpp需要在FirstClass.h中包含#include Resource.h代码如下:大气象 #pragmaonce/FirstClass对话框#includeResource.h/这里包含资源头文件classFirstClass:publicCDialogDECLARE_DYNAMIC(FirstClass)public:FirstClass(CWnd*pParent=NULL);/标准构造函数virtualFirstClass();/对话框数据enumIDD=IDD_DIALOG1;protected:virtualvoidDoDataExchange(CDataExchange*pDX);/DDX/DDV支持DECLARE_MESSAGE_MAP();新建一个cad命令,在acrxEntryPoint.cpp添加如下代码:大气象 staticvoidArxProject2cmd2(void)/AddyourcodeforcommandArxProject2.cmd2here/*cad维护的有自己的资源空间,我们添加对话框的时候,使用的是自己的资源空间,这个相当于通知cad准备下可能要开新的资源空间。这两个混一块一般没问题,但是如果出问题,就非常难找了,所以一般在命令中直接调用对话框中时,都要加上。*/CAcModuleResourceOverridemyResources;FirstClassDlg;Dlg.DoModal();记得包含对话框头文件#include FirstClass.h然后ap加载cmd2运行凡事以大气象去面对,优秀是一种习惯。 CAD二次开发学习笔记三(封装添加实体到数据库函数) 学会查看ObjectARX帮助文档。AcGe开头图形计算。AcDb图形数据库。在acrxEntryPoint.cpp添加如下代码: 大气象 /将实体添加到数据库/cad中的实体最终都要添加到数据库中才能被显示(图纸其实是一个数据库格式的),所以它的作用就是添加实体到数据库中staticAcad:ErrorStatusAddToDb(AcDbEntity*ent,AcDbObjectId&objId)Acad:ErrorStatuses;AcDbBlockTable*pBlockTable;AcDbBlockTableRecord*pSpaceRecord;if(es=acdbHostApplicationServices()-workingDatabase()-getBlockTable(pBlockTable,AcDb:kForRead)!=Acad:eOk)returnes;if(es=pBlockTable-getAt(ACDB_MODEL_SPACE,pSpaceRecord,AcDb:kForWrite)!=Acad:eOk)returnes;if(es=pBlockTable-close()!=Acad:eOk)returnes;if(es=pSpaceRecord-appendAcDbEntity(objId,ent)!=Acad:eOk)returnes;returnpSpaceRecord-close();public:/-ArxProject2.cmd3command(donotrename)staticvoidArxProject2cmd3(void)/AddyourcodeforcommandArxProject2.cmd3hereAcGePoint3dptStart(0,0,0);AcDbCircle*pCircle=newAcDbCircle();pCircle-setCenter(ptStart);pCircle-setRadius(1000);/也可以这样定义圆/AcDbCircle*pCircle=newAcDbCircle(ptStart,AcGeVector3d(0,0,1),100);AcDbObjectIdcircleId;/调用画实体函数if(AddToDb(pCircle,circleId)!=Acad:eOk)/传入指针,传出idAfxMessageBox(_T(加入实体到数据库失败!);pCircle-close();凡事以大气象去面对,优秀是一种习惯。 CAD二次开发学习笔记四(得到选中的实体,修改实体,如等分线段) AcGeVector3d是点阵的集合,通过等分点的差集得到。新的点可以通过点与点阵相差得到。大气象 public:/-ArxProject2.partLinecommand(donotrename)staticvoidArxProject2partLine(void)/AddyourcodeforcommandArxProject2.partLinehereads_nameentName;ads_pointpt;acedEntSel(_T(n选择:),entName,pt);/得到选中的实体AcDbObjectIdObjId;/得到实体IDif(acdbGetObjectId(ObjId,entName)!=Acad:eOk)/如果没有选中的实体则返回acutPrintf(_T(nno);return;AcDbEntity*pEnt;/得到实体if(acdbOpenObject(pEnt,ObjId,AcDb:kForRead)=Acad:eOk)acutPrintf(_T(nok);AcDbLine*pLine=(AcDbLine*)pEnt;/强制转换AcGePoint3dptStart=pLine-startPoint();/得到起点AcGePoint3dptEnd=pLine-endPoint();pEnt-close();/根据点和线的方向生成点组,绘制线段intnPart=5;/五等分AcGeVector3dVect=(ptEnd-ptStart)/nPart;/矩阵,点与点的差集平分可得到for(intn=0;nerase();pEnt-close();/将实体添加到数据库/cad中的实体最终都要添加到数据库中才能被显示(图纸其实是一个数据库格式的),所以它的作用就是添加实体到数据库中staticAcad:ErrorStatusAddToDb(AcDbEntity*ent,AcDbObjectId&objId)Acad:ErrorStatuses;AcDbBlockTable*pBlockTable;AcDbBlockTableRecord*pSpaceRecord;if(es=acdbHostApplicationServices()-workingDatabase()-getBlockTable(pBlockTable,AcDb:kForRead)!=Acad:eOk)returnes;if(es=pBlockTable-getAt(ACDB_MODEL_SPACE,pSpaceRecord,AcDb:kForWrite)!=Acad:eOk)returnes;if(es=pBlockTable-close()!=Acad:eOk)returnes;if(es=pSpaceRecord-appendAcDbEntity(objId,ent)!=Acad:eOk)returnes;returnpSpaceRecord-close();private:/画线函数staticvoidMakeLine(AcGePoint3dptStart,AcGePoint3dptEnd,AcDbObjectIdlineId)AcDbLine*pLine=newAcDbLine(ptStart,ptEnd);if(AddToDb(pLine,lineId)!=Acad:eOk)/传入指针,传出idAfxMessageBox(_T(加入实体到数据库失败!);pLine-close();另外是几个CAD用法:1.移动命令的使用输入m然后选择线段,或者线段的端点,就出现移动的辅助线。2.ap可以加载也可以卸载,选中要卸载的。凡事以大气象去面对,优秀是一种习惯。 CAD二次开发学习笔记五(在ObjectARX中使用MFC) 要实现的功能是:执行ArxModal命令,弹出如图所示对话框选择点,则得到点坐标,选择角度则得到角度值。步骤一:新建基于MFC的ObjectArx项目,参考:/greatverve/archive/2010/05/31/ObjectARX-HelloWorld.html打开资源视图添加一个对话框ID修改为IDD_ARX_MODAL(右击资源视图中的对话框打开属性面板,可以修改ID)设计如图界面,ID如下:IDC_BUTTON_POINTIDC_BUTTON_ANGLEIDC_EDIT_XPTIDC_EDIT_YPTIDC_EDIT_ZPTIDC_EDIT_ANGLE选择两个Button把Owner Draw设置为True完成界面。步骤二:打开类视图,右击项目-添加类(这里不是右击对话框添加类)这张图有点小错误,这里Dialog ID:IDD_ARX_MODAL Class name:CArxDialog在类视图中右击CArxDialog类添加变量这样会在头文件中生成源文件中生成根据这个规律添加其他变量大气象 private:CAcUiPickButtonm_btnAngle;CAcUiPickButtonm_btnPoint;CAcUiNumericEditm_editXpt;CAcUiNumericEditm_editYpt;CAcUiNumericEditm_editZpt;CAcUiAngleEditm_editAngle;voidCArxDialog:DoDataExchange(CDataExchange*pDX)CAcUiDialog:DoDataExchange(pDX);DDX_Control(pDX,IDC_BUTTON_ANGLE,m_btnAngle);DDX_Control(pDX,IDC_BUTTON_POINT,m_btnPoint);DDX_Control(pDX,IDC_EDIT_XPT,m_editXpt);DDX_Control(pDX,IDC_EDIT_YPT,m_editYpt);DDX_Control(pDX,IDC_EDIT_ZPT,m_editZpt);DDX_Control(pDX,IDC_EDIT_ANGLE,m_editAngle);步骤三:为CArxDialog添加InitDialog消息响应。方法是打开类视图,右击-属性再添加OnClose()响应函数在头文件中添加几个变量public: CString m_strAngle; CString m_strZPt; CString m_strYPt; CString m_strXPt;在头文件中定义两函数 void DisplayPoint(); void DisplayAngle();分别为两个按钮添加单击事件,为四个编辑框添加失去焦点事件。步骤四:打开acrxEntryPoint.cpp添加#include “ArxDialog.h”运行结果如图源码如下acrxEntryPoint.cpp /(C)Copyright2002-2005byAutodesk,Inc./Permissiontouse,copy,modify,anddistributethissoftwarein/objectcodeformforanypurposeandwithoutfeeisherebygranted,/providedthattheabovecopyrightnoticeappearsinallcopiesand/thatboththatcopyrightnoticeandthelimitedwarrantyand/restrictedrightsnoticebelowappearinallsupporting/documentation./AUTODESKPROVIDESTHISPROGRAMASISANDWITHALLFAULTS./AUTODESKSPECIFICALLYDISCLAIMSANYIMPLIEDWARRANTYOF/MERCHANTABILITYORFITNESSFORAPARTICULARUSE.AUTODESK,INC./DOESNOTWARRANTTHATTHEOPERATIONOFTHEPROGRAMWILLBE/UNINTERRUPTEDORERRORFREE./Use,duplication,ordisclosurebytheU.S.Governmentissubjectto/restrictionssetforthinFAR52.227-19(CommercialComputer/Software-RestrictedRights)andDFAR252.227-7013(c)(1)(ii)/(RightsinTechnicalDataandComputerSoftware),asapplicable./-/-acrxEntryPoint.h/-#includeStdAfx.h#includeresource.h#includeArxDialog.h/-#defineszRDS_RXST()/-/-ObjectARXEntryPointclassCCADMFCApp:publicAcRxArxApppublic:CCADMFCApp():AcRxArxApp()virtualAcRx:AppRetCodeOn_kInitAppMsg(void*pkt)/TODO:Loaddependencieshere/You*must*callOn_kInitAppMsghereAcRx:AppRetCoderetCode=AcRxArxApp:On_kInitAppMsg(pkt);/TODO:Addyourinitializationcodeherereturn(retCode);virtualAcRx:AppRetCodeOn_kUnloadAppMsg(void*pkt)/TODO:Addyourcodehere/You*must*callOn_kUnloadAppMsghereAcRx:AppRetCoderetCode=AcRxArxApp:On_kUnloadAppMsg(pkt);/TODO:Unloaddependenciesherereturn(retCode);virtualvoidRegisterServerComponents()/-CADMFC.showDlgcommand(donotrename)staticvoidCADMFCshowDlg(void)/AddyourcodeforcommandCADMFC.showDlghere/防止资源冲突CAcModuleResourceOverrideresOverride;/显示ObjectARX的模态对话框CArxDialogtheDialog;theDialog.DoModal();/-IMPLEMENT_ARX_ENTRYPOINT(CCADMFCApp)ACED_ARXCOMMAND_ENTRY_AUTO(CCADMFCApp,CADMFC,showDlg,MyCommand1,ACRX_CMD_TRANSPARENT,NULL)ArxDialog.h /(C)Copyright2002-2005byAutodesk,Inc./Permissiontouse,copy,modify,anddistributethissoftwarein/objectcodeformforanypurposeandwithoutfeeisherebygranted,/providedthattheabovecopyrightnoticeappearsinallcopiesand/thatboththatcopyrightnoticeandthelimitedwarrantyand/restrictedrightsnoticebelowappearinallsupporting/documentation./AUTODESKPROVIDESTHISPROGRAMASISANDWITHALLFAULTS./AUTODESKSPECIFICALLYDISCLAIMSANYIMPLIEDWARRANTYOF/MERCHANTABILITYORFITNESSFORAPARTICULARUSE.AUTODESK,INC./DOESNOTWARRANTTHATTHEOPERATIONOFTHEPROGRAMWILLBE/UNINTERRUPTEDORERRORFREE./Use,duplication,ordisclosurebytheU.S.Governmentissubjectto/restrictionssetforthinFAR52.227-19(CommercialComputer/Software-RestrictedRights)andDFAR252.227-7013(c)(1)(ii)/(RightsinTechnicalDataandComputerSoftware),asapplicable./-/-ArxDialog.h:DeclarationoftheCArxDialog/-#pragmaonce/-#includeacui.h/-classCArxDialog:publicCAcUiDialogDECLARE_DYNAMIC(CArxDialog)public:CArxDialog(CWnd*pParent=NULL,HINSTANCEhInstance=NULL);enumIDD=IDD_ARX_MODAL;protected:virtualvoidDoDataExchange(CDataExchange*pDX);afx_msgLRESULTOnAcadKeepFocus(WPARAM,LPARAM);DECLARE_MESSAGE_MAP()private:CAcUiPickButtonm_btnAngle;CAcUiPickButtonm_btnPoint;CAcUiNumericEditm_editXpt;CAcUiNumericEditm_editYpt;CAcUiNumericEditm_editZpt;CAcUiAngleEditm_editAngle;public:virtualBOOLOnInitDialog();afx_msgvoidOnClose();public:CStringm_strAngle;CStringm_strZPt;CStringm_strYPt;CStringm_strXPt;voidDisplayPoint();voidDisplayAngle();afx_msgvoidOnBnClickedButtonPoint();afx_msgvoidOnBnClickedButtonAngle();afx_msgvoidOnEnKillfocusEditXpt();afx_msgvoidOnEnKillfocusEditYpt();afx_msgvoidOnEnKillfocusEditZpt();afx_msgvoidOnEnKillfocusEditAngle();ArxDialog.cpp /(C)Copyright2002-2005byAutodesk,Inc./Permissiontouse,copy,modify,anddistributethissoftwarein/objectcodeformforanypurposeandwithoutfeeisherebygranted,/providedthattheabovecopyrightnoticeappearsinallcopiesand/thatboththatcopyrightnoticeandthelimitedwarrantyand/restrictedrightsnoticebelowappearinallsupporting/documentation./AUTODESKPROVIDESTHISPROGRAMASISANDWITHALLFAULTS./AUTODESKSPECIFICALLYDISCLAIMSANYIMPLIEDWARRANTYOF/MERCHANTABILITYORFITNESSFORAPARTICULARUSE.AUTODESK,INC./DOESNOTWARRANTTHATTHEOPERATIONOFTHEPROGRAMWILLBE/UNINTERRUPTEDORERRORFREE./Use,duplication,ordisclosurebytheU.S.Governmentissubjectto/restrictionssetforthinFAR52.227-19(CommercialComputer/Software-RestrictedRights)andDFAR252.227-7013(c)(1)(ii)/(RightsinTechnicalDataandComputerSoftware),asapplicable./-/-ArxDialog.cpp:ImplementationofCArxDialog/-#includeStdAfx.h#includeresource.h#includeArxDialog.h/-IMPLEMENT_DYNAMIC(CArxDialog,CAcUiDialog)BEGIN_MESSAGE_MAP(CArxDialog,CAcUiDialog)ON_MESSAGE(WM_ACAD_KEEPFOCUS,OnAcadKeepFocus)ON_WM_CLOSE()ON_BN_CLICKED(IDC_BUTTON_POINT,&CArxDialog:OnBnClickedButtonPoint)ON_BN_CLICKED(IDC_BUTTON_ANGLE,&CArxDialog:OnBnClickedButtonAngle)ON_EN_KILLFOCUS(IDC_EDIT_XPT,&CArxDialog:OnEnKillfocusEditXpt)ON_EN_KILLFOCUS(IDC_EDIT_YPT,&CArxDialog:OnEnKillfocusEditYpt)ON_EN_KILLFOCUS(IDC_EDIT_ZPT,&CArxDialog:OnEnKillfocusEditZpt)ON_EN_KILLFOCUS(IDC_EDIT_ANGLE,&CArxDialog:OnEnKillfocusEditAngle)END_MESSAGE_MAP()/-CArxDialog:CArxDialog(CWnd*pParent/*=NULL*/,HINSTANCEhInstance/*=NULL*/):CAcUiDialog(CArxDialog:IDD,pParent,hInstance)/-voidCArxDialog:DoDataExchange(CDataExchange*pDX)CAcUiDialog:DoDataExchange(pDX);DDX_Control(pDX,IDC_BUTTON_ANGLE,m_btnAngle);DDX_Control(pDX,IDC_BUTTON_POINT,m_btnPoint);DDX_Control(pDX,IDC_EDIT_XPT,m_editXpt);DDX_Control(pDX,IDC_EDIT_YPT,m_editYpt);DDX_Control(pDX,IDC_EDIT_ZPT,m_editZpt);DDX_Control(pDX,IDC_EDIT_ANGLE,m_editAngle);/-/-Neededformodelessdialogstokeepfocus./-ReturnFALSEtonotkeepthefocus,returnTRUEtokeepthefocusLRESULTCArxDialog:OnAcadKeepFocus(WPARAM,LPARAM)return(TRUE);BOOLCArxDialog:OnInitDialog()CAcUiDialog:OnInitDialog();/TODO:在此添加额外的初始化/设置点的范围m_editXpt.SetRange(-100.0,100.0);m_editYpt.SetRange(-100.0,100.0);m_editZpt.SetRange(-100.0,100.0);/设置角度的输入范围m_editAngle.SetRange(0.0,90.0);/加载默认的位图m_btnPoint.AutoLoad();m_btnAngle.AutoLoad();/设置文本框的默认值m_strAngle=_T(0.0);m_strXPt=_T(0.0);m_strYPt=_T(0.0);m_strZPt=_T(0.0);/显示初始点的坐标和角度值DisplayPoint();DisplayAngle();returnTRUE;/returnTRUEunlessyousetthefocustoacontrol/异常:OCX属性页应返回FALSEvoidCArxDialog:DisplayPoint()/在对话框中显示点的坐标m
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 序数课件教学课件
- 《线条的艺术表现力》课件-2025-2026学年人美版初中美术九年级上册
- 巡察课件教学课件
- 输煤运行安全培训管理课件
- 输液泵的课件
- 创新型离婚财产分割与子女监护权协议范本
- 农业生产抵账协议范本
- 城市更新改造项目合同策划与社区和谐
- 旅游度假区承包经营合作协议范本
- 城市轨道交通工程:墙体拆除与地下空间开发合同
- 新闻编辑(修改版)马工程课件 第六章
- GB/T 2930.8-2017草种子检验规程水分测定
- 勘察设计工作大纲
- GB/T 17188-1997农业灌溉设备滴灌管技术规范和试验方法
- 关于国有集团公司采购管理办法【五篇】
- 2022年资阳市雁江区社区工作者招聘考试笔试试题及答案解析
- 2.2 第2课时 基本不等式的综合应用(课件)高一数学(人教A版2019必修第一册)
- 帮助卧床老年人使用便器排便课件
- 【高考英语精品专题】必修1 Unit 1 Life Choices-高考英语-一轮总复习备考方略课件PPT(新教材北师大版)
- 中国传媒大学-新媒体概论(刘行芳)-课件
- 医学放射卫生相关法律法规ppt培训课件
评论
0/150
提交评论