您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > AUTOCAD二次开发笔记(ObjectARX)---全部
ObjectARX开发环境的创建与开发实例HelloWorld(VS2005+AutoCad2008+ObjectArx2008)在一个做CAD二次开发的公司做Web开发,感觉可提升的空间很小。有必要研究一下公司的产品开发,以利发展。一、首先安装好vs05与cad2008安装cad的时候也没有什么特别,加载到虚拟光驱,安装过程中有个错误提示,不影响继续。二、安装ObjectArx2008直接打开解压缩到某个目录即可。比如C:\ObjectARX2008然后打开C:\ObjectARX2008\utils\ObjARXWiz目录,运行ArxWizards.msi这样在新建C++项目的时候会出现ObjectARX项目,如图三、包含文件工具-选项-项目和解决方案-VC++目录,如图所示:包含文件(添加图中前两个目录即可)库文件(添加图中前两个目录即可)四、新建ObjectARX项目,完成后添加MFC支持,如图所示:然后直接点finish打开acrxEntryPoint.cpp点击左上角的a按钮,然后新建一个命令。如图:只需要修改InternationName与LocalizedName为testcmd即可添加完成后,会在acrxEntryPoint.cpp中自动添加一句如下的代码:然后添加一句AfxMessageBox(_T(thisisatestcommand.));五、加载与运行在项目中win32\debug目录下,把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中包含#includeResource.h代码如下:大气象#pragmaonce//FirstClass对话框#includeResource.h//这里包含资源头文件classFirstClass:publicCDialog{DECLARE_DYNAMIC(FirstClass)public:FirstClass(CWnd*pParent=NULL);//标准构造函数virtual~FirstClass();//对话框数据enum{IDD=IDD_DIALOG1};protected:virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDV支持DECLARE_MESSAGE_MAP()};新建一个cad命令,在acrxEntryPoint.cpp添加如下代码:大气象staticvoidArxProject2cmd2(void){//AddyourcodeforcommandArxProject2.cmd2here/*cad维护的有自己的资源空间,我们添加对话框的时候,使用的是自己的资源空间,这个相当于通知cad准备下可能要开新的资源空间。这两个混一块一般没问题,但是如果出问题,就非常难找了,所以一般在命令中直接调用对话框中时,都要加上。*/CAcModuleResourceOverridemyResources;FirstClassDlg;Dlg.DoModal();}记得包含对话框头文件#includeFirstClass.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;nnPart;n++){AcDbObjectIdObjIdNew;MakeLine(ptStart+n*Vect,ptStart+(n+1)*Vect,ObjIdNew);//等分线段的方法}//将选中的线段删除,if(acdbOpenObject(pEnt,ObjId,AcDb::kForWrite)==Acad::eOk){pEnt-erase();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))!
本文标题:AUTOCAD二次开发笔记(ObjectARX)---全部
链接地址:https://www.777doc.com/doc-7871274 .html