ObjectARX(培训讲义一)
ObjectArx自定义实体入门

[资料] ObjectArx自定义实体入门(C++)及注意事项收藏本文介绍了构造自定义实体的步骤、必须继承的函数和必须注意的事项1.新建一个从AcDbEntity继承的类,如EntTest,必须添加的头文件: "stdarx.h","acadstrc.h", "geassign.h"。
2.在该类头文件的类声明中添加宏:ACRX_DECLARE_MEMBERS(EntTest);3.在该类的cpp文件中,类的前面添加宏:ACRX_DXF_DEFINE_MEMBERS(EntTest, AcDbEntity,AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent,0,平面实体,"autoCAD");//第5个参数为在CAD中该实体类的名称,MAKE_ACDBOPENOBJECT_FUNCTION(EntTest);4.从AcDbEntity类中重载几个必须的虚函数:virtual Adesk::Boolean worldDraw(AcGiWorldDraw* mode);virtual Acad::ErrorStatus dwgInFields(AcDbDwgFiler*);virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler*) const;virtual Acad::ErrorStatus getGripPoints(AcGePoint3dArray&gripPoints,AcDbIntArray&osnapModes,AcDbIntArray& geomIds) const;virtual Acad::ErrorStatus moveGripPointsAt(const AcDbIntArray& indices,const AcGeVector3d& offset);5.实现第4步中几个虚函数必须注意:在dwgInFields函数的开始处必须有:assertWriteEnabled();AcDbObject::dwgInFields(pFiler);if(pFiler->filerType()==AcDb::kWblockCloneFiler){AcDbHardPointerId Id;pFiler->readItem(&Id);}在dwgOutFields函数的开始处必须有:assertReadEnabled();AcDbObject::dwgOutFields(pFiler);if (pFiler->filerType()==AcDb::kWblockCloneFiler)pFiler->writeHardPointerId((AcDbHardPointerId)ownerId());上叙两个函数是用来写入写出自定义实体的成员变量的,以保证在拖动夹点的过程中这些变量是实时变化的(可以在worldDraw或moveGripPointsAt中改变这些值)。
ObjectARX 2006 实例教程

ObjectARX2006 实例教程
3.2.3 SETLAYER 命令的算法............................................................................................21 3.2.4 SETLAYER 命令的代码............................................................................................22 3.3 测试 CREATE 和 SETLAYER 命令..........................................................................................24 实例 4.命名对象词典_Xrecords......................................................................................................25 本节目标 ....................................................................................................................................25 4.1 实现 ADDENTRY,LISTENTRIES 和 REMOVEENTRY 命令......................................................26 4.1.1 ADDENTRY 命令的算法.............................................
ObjectARX

ObjectARX1. ObjectARX的介绍:ObjectARX是AutoDesk公司针对AutoCAD平台上的二次开发而推出的一个开发软件包,它提供了以C++为基础的面向对象的开发环境及应用程序接口,能真正快速的访问AutoCAD图形数据库。
与以往的AutuCAD 二次开发工具AutoLISP 和ADS不同,ObjectARX应用程序是一个DLL(动态链接库),共享AutoCAD的地址空间,对AutoCAD进行直接函数调用。
所以,使用ARX编程的函数的执行速度得以大大提高。
ARX 类库采用了标准的C++类库的封装形式,这也大大提高了程序员编程的可靠度和效率。
ObjectARX目前最新的版本是ObjectARX2002,它在原有Obj ectARX的基础上,特别增加了XML的支持。
XML是可扩展标记语言(eXtensible Markup Language)。
它是应用软件与Internet的接口。
通过支持XML,为Object ARX开发网络协作应用提供了有力的支持。
2. 开发环境的设置:运用ObjectARX进行二次开发,必须首先设置好ObjectARX的开发环境。
目前常用的开发环境是Microsoft Visual C++ 6.0。
同时,还需要安装ObjectARX SDK,ObjectARX SDK可以在AutoDesk公司的网站上免费下载。
不同的AutoCAD版本对应相应的ObjectARX SDK的版本,目前常用的是ObjectARX SDK for AutoCAD R14和ObjectARX SDK for AutoCAD2000i。
这两个开发工具在设置上略有不同,将进行对比介绍。
安装好VC++和ObjectARX后,就可以开始设置开发环境了。
1)设置INC和LIB文件寻找路径INC和LIB文件寻找路径为VC++的环境参数,设置一次即可,对以后的所有项目均有效。
选择Tools→Options …,出现Option对话框,选择Directories页,在Show Directories for中选择Include files,然后在Directo ries中加上ARX的INC目录路径c:\objectarx\inc(假定ARX的开发工具在c:\objec tarx\中)。
objectARX说明函数

ARX函数选择指定图层上的所有实体Acad::ErrorStatus selectEntityInLayer(const char* nLayerName,AcDbObjectIdArray& nIDs) {Acad::ErrorStatus es = Acad::eOk;ads_name ents;struct resbuf *rb;rb=acutNewRb(AcDb::kDxfLayerName);rb->restype=8;rb->resval.rstring=(char*)nLayerName;rb->rbnext=NULL;acedSSGet("X",NULL,NULL,rb,ents);long entNums=0;acedSSLength(ents,&entNums);if (entNums == 0)es = Acad::eInvalidInput;else{for (long a = 0; a < entNums ; a ++){AcDbObjectId objId;ads_name ent;acedSSName(ents,a,ent);acdbGetObjectId(objId, ent);nIDs.append(objId);}}acedSSFree(ents);acutRelRb(rb);return es;}设置当前层Acad::ErrorStatus SetCurLayer(const char* lpLayerName, AcDbDatabase* pDb/* = NULL */) {AcDbDatabase* pCurDb = pDb;if (pCurDb == NULL)pCurDb = acdbHostApplicationServices()->workingDatabase();AcDbLayerTableRecordPointer spRecord(lpLayerName, pCurDb, AcDb::kForRead); Acad::ErrorStatus es = spRecord.openStatus();if (es == Acad::eOk){es = pCurDb->setClayer(spRecord->objectId());}return es;}生成新组//生成新组(sGroupName)//追加数组中所有实体到该组中//组名字, Id数组int createGroup(CString sGroupName,const AcDbObjectIdArray *idArr){AcDbGroup *pGroup = new AcDbGroup((LPSTR)(LPCTSTR)sGroupName); AcDbObjectId groupObjectId;AcDbDictionary *pGroupDict = NULL;acdbHostApplicationServices()->workingDatabase()->getGroupDictionary(pGroupDict, AcDb::kForWrite);pGroupDict->setAt(sGroupName, pGroup, groupObjectId);pGroupDict->close();pGroup->close();acdbOpenObject(pGroup, groupObjectId, AcDb::kForWrite);for (int i = 0; i < idArr->length(); i++){groupObjectId = idArr->at(i);pGroup->append(groupObjectId);}pGroup->close();return TRUE;}建立文本格式表函数AcDbObjectId CreateNewTextStyle(){AcDbTextStyleTable *pTextStyleTable;AcDbTextStyleTableRecord *pTextStyleTableRcdAcDbObjectId textId;acdbHostApplicationServices()->workingDatabase()->getSymbolTable (pTextStyleTable,AcDb::kForWrite);if (!pTextStyleTable->has(StyleName){AcDbTextStyleTableRecord *pTSTblRcd= new AcDbTextStyleTableRecord; pTSTblRcd->setName(StyleName);pTSTblRcd->setFileName(fontName);pTSTblRcd->setBigFontFileName(bigfontName);pTSTblRcd->setTextSize(textSize);pTSTblRcd->setXScale(xScale);pTSTblRcd->setObliquingAngle(obliqueAngle);pTSTblRcd->setPriorSize(trPercent);pTextStyleTable->add(textId,pTextStyleTableRcd);pTSTblRcd->close();}pTextStyleTable->close();return textId;}区域在区域内// Function name : RgnInRgn// Descrīption : is Region1 in Region2?// Return type : bool// Argument : const AcDbRegion* pRegion1// Argument : const AcDbRegion* pRegion2bool RgnInRgn(const AcDbRegion* pRegion1,const AcDbRegion* pRegion2) {if (pRegion1==NULL||pRegion2==NULL) return false;AcDbObjectPointer< AcDbRegion > spRegion1;AcDbObjectPointer< AcDbRegion > spRegion2;if (spRegion1.create()!=Acad::eOk){acdbFail("\n内存不足");return false;}if (spRegion2.create()!=Acad::eOk){acdbFail("\n内存不足");return false;}if ((spRegion1->copyFrom(pRegion1)!= Acad::eOk)||(spRegion2->copyFrom(pRegion2)!= Acad::eOk)){acdbFail("\n无法复制对象");return false;}bool bResult=false;if(spRegion1->booleanOper(AcDb::kBoolIntersect, spRegion2.object()) == Acad::eOk) {if ((spRegion2->isNull()==Adesk::kTrue)&&(spRegion1->isNull()!=Adesk::kTrue)){ double area1,area0;spRegion1->getArea(area1);pRegion1->getArea(area0);if ((area0 - area1) < AcGeContext::gTol.equalPoint())bResult=true;}}return bResult;}组旋转void CMyDatabase::rotationGroup(CString strGroupName ,CReiPoint ptRotation,double rotationAngle){AcGePoint3d pt;AcDbDictionary *pGroupDict;acdbCurDwg()->getGroupDictionary(pGroupDict,AcDb::kForWrite);AcDbObjectId groupId;AcDbGroup *pGroup;pt.x=ptRotation.x;pt.y=ptRotation.y;pt.z=ptRotation.z;if(pGroupDict->getAt(strGroupName,groupId)==Acad::eOk)acdbOpenObject(pGroup,groupId,AcDb::kForWrite);else{pGroupDict->close();return;}pGroupDict->close();AcDbGroupIterator* pIter=pGroup->newIterator();AcDbEntity* pEnt;AcDbObjectId objId;pIter=pGroup->newIterator();for(;!pIter->done();pIter->next()){ōbjId=pIter->objectId();acdbOpenAcDbEntity(pEnt,objId,AcDb::kForWrite);rotationEntity(pEnt,pt,rotationAngle);pEnt->close();}delete pIter;pGroup->close();}点在区域内功能:判断点pt 是否在区域ptArr 内实现:根据射线法求交点个数,偶数-区域外,奇数-区域内变量:pt 指定点ptArr 判断区域返回:在区域TRUE 不在FALSEcode: BOOL BaseHandle::PointIsInPolygon(AcGePoint3d pt, AcGePoint3dArray ptArr) {int ptNum,i,interNum;AcGePoint3d ptA,ptB;ads_point pt0,pt1,pt2,ptIns,ptX;interNum = 0;pt0[X] = 0.0;pt0[Y] = 0.0;pt0[Z] = 0.0;ptX[X] = pt.x;ptX[Y] = pt.y;ptX[Z] = pt.z;ptNum = ptArr.length();for (i = 0;i < ptNum - 1;i++){ptA = ptArr.at(i);ptB = ptArr.at(i + 1);pt1[X] = ptA.x;pt1[Y] = ptA.y;pt1[Z] = 0.0;pt2[X] = ptB.x;pt2[Y] = ptB.y;pt2[Z] = 0.0;if (acdbInters(ptX,pt0,pt1,pt2,1,ptIns) == RTNORM){interNum++;}}if (interNum % 2 == 0){return false;}else{return true;}2008-05-29 13:58/****************************************************************** 函数名: setView功能: 设置视图(相当于Zoom Window命令)输入参数: Pt1 -- 视图左上角点Pt2 -- 视图右下角点ex_ratio -- 扩展比率,一般为1.0输出参数:返回值: void其它:*****************************************************************/void setView(AcGePoint2d Pt1, AcGePoint2d Pt2, double ex_ratio){AcGePoint2d CenterPt;//若X坐标或Y坐标重合,判为意外,不进行SetView操作if ((fabs(Pt1.x-Pt2.x)<1e-6)||(fabs(Pt1.y-Pt2.y)<1e-6))return;//确保两个坐标点分别为左上角和右下角if (Pt1.x>Pt2.x) {double tmp;tmp = Pt1.x;Pt1.x = Pt2.x;Pt2.x = tmp;}if (Pt2.y>Pt1.y) {double tmp;tmp = Pt1.y;Pt1.y = Pt2.y;Pt2.y = tmp;}//获取当前DwgView的尺寸CRect CADrect;acedGetAcadDwgView()->GetClientRect(&CADrect);double width,height,ratio;ratio = (double)(CADrect.right-CADrect.left)/(double)(CADrect.bottom-CADrect.top);if (fabs(ratio)<1e-6)return;if ((Pt2.x-Pt1.x)/(Pt1.y-Pt2.y) > ratio) {width = Pt2.x-Pt1.x;height = width/ratio;}else{height = Pt1.y-Pt2.y;width = height * ratio;}//设置当前视图中心点CenterPt.x = (Pt1.x+Pt2.x)/2;CenterPt.y = (Pt1.y+Pt2.y)/2;//改变当前视图AcDbViewTableRecord pVwRec;pVwRec.setCenterPoint(CenterPt);pVwRec.setWidth(width * ex_ratio);pVwRec.setHeight(height * ex_ratio);acedSetCurrentView( &pVwRec, NULL );}/////////////////////////////////////////////////////////////// // 函数名: oxaGetVar// 函数功能:// 处理过程:// 备注:// 作者: user// 时间: 2004年6月16日// 返回值: int// 参数说明: const CString strSym,// AcGePoint3d &vOut/////////////////////////////////////////////////////////////// int oxaGetVar(const CString strSym, AcGePoint3d &vOut ){resbuf rbVar ;int iRt=acedGetVar(strSym, &rbVar) ;if (iRt!=RTNORM){return iRt;}//oxaPrint(&rbVar);if (rbVar.restype==RTPOINT){vOut.x=rbVar.resval.rpoint[0];vOut.y=rbVar.resval.rpoint[1];}if (rbVar.restype==RT3DPOINT){vOut.x=rbVar.resval.rpoint[0];vOut.y=rbVar.resval.rpoint[1];vOut.z=rbVar.resval.rpoint[2];}return RTNORM;}///////////////////////////////////////////////////////////////////////////////// //# DOC.BEGIN//# 函数名称:oxaGetVar//# 函数编号:OXA//# 函数声明://# 函数参数:const CString strSym,// int &vOut//# 返回值:int//# 函数分类://# 函数功能:获取系统变量,封装acedGetVar()//# 注意事项://# 涉及的全局变量://# 调用的OXARX函数://# 函数算法://# ACAD版本:R14 R15 R16//# 配合函数://# 类似函数://# 替换函数://# 现存缺陷://# 示例程序://# 测试要求://# 历史记录:2003年11月10日, zjw ,完成////# DOC.END//////////////////////////////////////////////////////////////////////////int oxaGetVar(const CString strSym, int &vOut ){resbuf rbVar;int iRt=acedGetVar(strSym, &rbVar) ;if (iRt!=RTNORM){return iRt;}if (rbVar.restype==RTLONG){vOut=rbVar.resval.rlong;}if (rbVar.restype==RTSHORT){vOut=rbVar.resval.rint;}return RTNORM;}///////////////////////////////////////////////////////////////////////////////// //# DOC.BEGIN//# 函数名称:oxaGetVar//# 函数编号:OXA//# 函数声明://# 函数参数:const CString strSym,// double &vOut//# 返回值:int//# 函数分类://# 函数功能:获取系统变量,封装acedGetVar()//# 注意事项://# 涉及的全局变量://# 调用的OXARX函数://# 函数算法://# ACAD版本:R14 R15 R16//# 配合函数://# 类似函数://# 替换函数://# 现存缺陷://# 示例程序://# 测试要求://# 历史记录:2003年11月24日, zjw ,完成////# DOC.ENDint oxaGetVar(const CString strSym, double &vOut ){resbuf rbVar;int iRt=acedGetVar(strSym, &rbVar) ;if (iRt!=RTNORM){return iRt;}if (rbVar.restype==RTREAL){vOut=rbVar.resval.rreal;}return RTNORM;}///////////////////////////////////////////////////////////////////////////////// //# DOC.BEGIN//# 函数名称:oxaGetVar//# 函数编号:OXA//# 函数声明://# 函数参数:const CString strSym,// CString &vOut//# 返回值:int//# 函数分类://# 函数功能:获取系统变量,封装acedGetVar()//# 注意事项://# 涉及的全局变量://# 调用的OXARX函数://# 函数算法://# ACAD版本:R14 R15 R16//# 配合函数://# 类似函数://# 替换函数://# 现存缺陷://# 示例程序://# 测试要求://# 历史记录:2003年11月24日, zjw ,完成////# DOC.ENDint oxaGetVar(const CString strSym, CString &vOut ){resbuf rbVar;int iRt=acedGetVar(strSym, &rbVar) ;if (iRt!=RTNORM){return iRt;}if (rbVar.restype==RTSTR){vOut=rbVar.resval.rstring;}return RTNORM;}// 函数名: SetCurTextStyle// 描述: 设置当前TextStyle// 返回: Acad::ErrorStatus// 参数: const char* lpStyleName// 参数: AcDbDatabase* pDb/* = NULL */Acad::ErrorStatus SetCurTextStyle(const char* lpStyleName, AcDbDatabase* pDb/* = NULL */) {AcDbDatabase* pCurDb = pDb;if (pCurDb == NULL)pCurDb = acdbHostApplicationServices()->workingDatabase();AcDbTextStyleTableRecordPointer spRecord(lpStyleName, pCurDb, AcDb::kForRead); Acad::ErrorStatus es = spRecord.openStatus();if (es == Acad::eOk){es = pCurDb->setTextstyle(spRecord->objectId());}return es;}// Function name : SetCurLayer// Descrīption: 设置当前层// Return type : Acad::ErrorStatus// Argument : const char* lpLayerName// Argument : AcDbDatabase* pDb/* = NULL */Acad::ErrorStatus SetCurLayer(const char* lpLayerName, AcDbDatabase* pDb/* = NULL */) {AcDbDatabase* pCurDb = pDb;if (pCurDb == NULL)pCurDb = acdbHostApplicationServices()->workingDatabase();AcDbLayerTableRecordPointer spRecord(lpLayerName, pCurDb, AcDb::kForRead); Acad::ErrorStatus es = spRecord.openStatus();if (es == Acad::eOk){es = pCurDb->setClayer(spRecord->objectId());}return es;}//获取属性块中所有属性的字符串值,并且存于链表中CODE:void FEGroups::iterateDictionary(){//obtain the GROUP dictionary by looking up "ACAD_GROUP" in the named object dictionary ///* AcDbDictionary *pNamedobj;acdbHostApplicationServices()->workingDatabase()->getNamedObjectsDictionary(pNamedobj, AcDb::kForRead);// Get a pointer to the ASDK_DICT dictionary.//AcDbDictionary *pDict;pNamedobj->getAt("ACAD_GROUP", (AcDbObject*&)pDict, AcDb::kForRead);pNamedobj->close();*/// Get a pointer to the ACAD_GROUP dictionary AcDbDictionary *pDict;acdbHostApplicationServices()->workingDatabase() ->getGroupDictionary(pDict, AcDb::kForRead);// Get an iterator for the ASDK_DICT dictionary.//AcDbDictionaryIterator* pDictIter = pDict->newIterator(); AcDbGroup *pGroup;char* name;for (; !pDictIter->done(); pDictIter->next()) {// Get the current record, open it for read, and// print its name.//pDictIter->getObject((AcDbObject*&)pGroup,AcDb::kForRead);pGroup->getName(name);pGroup->close();acutPrintf("\nintval is: %s", name);}delete pDictIter;pDict->close();}//检测AutoCAD是否已经运行CODE:void Autocadtest(){// TODO: Add your control notification handler code here IAcadApplication m_autocad;IAcadDocuments m_acaddocs;IAcadDocument m_acaddoc;IAcadModelSpace m_acadmodel;LPDISPATCH pDisp;LPUNKNOWN pUnk;CLSID clsid;BeginWaitCursor();::CLSIDFromProgID(L"AutoCAD.Application",&clsid);if(::GetActiveObject(clsid,NULL,&pUnk)==S_OK){VERIFY(pUnk->QueryInterface(IID_IDispatch,(void**) &pDisp)==S_OK);m_autocad.AttachDispatch(pDisp);pUnk->Release();}else{if(!m_autocad.CreateDispatch("AutoCAD.Application")){AfxMessageBox("Autocad program not found\n");exit(1);}}m_autocad.SetVisible(true);m_acaddocs.AttachDispatch(m_autocad.GetDocuments(),true);m_acaddoc.AttachDispatch(m_acaddocs.Add(vtMissing),true);m_acadmodel.AttachDispatch(m_acaddoc.GetModelSpace(),true);m_acadmodel.AddCircle(pVal,100);m_acadmodel.ReleaseDispatch();m_acaddoc.ReleaseDispatch();m_acaddocs.ReleaseDispatch();m_autocad.ReleaseDispatch();}//计算多边形的形心坐标BOOL GetPolyCentroid(AcDbPolyline * pPline, ads_point CenPt){unsigned int i, iCount = 0;AcDbVoidPtrArray curveSegments, regions;AcGePoint3d LinePt0, LinePt1;AcGePoint3d origin;AcGeVector3d xAxis, yAxis;double perimeter, area, prodInertia;double momInertia[2], prinMoments[2], radiiGyration[2];AcGePoint2d centroid;AcGeVector2d prinAxes[2];AcGePoint2d extentsLow, extentsHigh;if (pPline->isClosed() != Adesk::kTrue) {ads_printf("\n折线不封闭, 无法形成正确的区域。
ObjectARX 入门

ObjectARX 入门第1章ObjectARX 入门1.1 引言本章将全面介绍在设计和实现基于AutoCAD 2000的应用程序时对开发者十分有用的技术。
就计算机技术而言,Autodesk(AutoCAD的开发者)是一家老牌公司,从80年代初AutoCADR1.0发布以来,到现在发生了许许多多的变化。
就易用性和API功能性来讲,AutoCAD2000显然是目前最好的版本。
DOS的时代已经过去,AutoCAD现在已经只适用于Win32平台(Windows 95/98和Windows NT)。
AutoCAD现在是一个面向对象的CAD应用软件,它具有令人难以置信的强大功能,它能向用户和开发者提供各种应用程序的开发方式选择。
本书将向读者介绍各种定制和开发AutoCAD应用程序的方法,介绍Visual C++、微软的基础类库(MFC)、动态链接库(DLL)以及动态链接库的AutoCAD版本—ARX。
还要创建一些应用程序,并介绍它们的原理。
最后,将向读者介绍如何对AutoCAD应用程序使用调试器。
1.2 如何选择Visual LISP、VBA或ObjectARX 2000进行AutoCAD编程AutoCAD很早就是一种开放体系结构的应用程序,是一种通用的CAD应用软件,用户和开发者可以利用各种方法定制AutoCAD以满足他们各自的需要。
改变AutoCAD的工作方式可以分为两大类,即定制和编程。
很多AutoCAD用户通过创建新的宏代码、新的工具条或者用DIESEL(可直接解释求值的字符串表达式语言)来编制状态栏、创建智能菜单和菜单组来定制AutoCAD的菜单。
他们也可以创建一些预置了各种层、文字样式、尺寸样式、线型等的样图来使操作简化和更有效率。
以上的每一种都是定制的例子。
有许多人则在定制AutoCAD和学习如何进行AutoCAD编程之间徘徊(我曾经就是这样的)。
那么,为什么要进行AutoCAD编程?也许其主要原因是要求灵活性和扩充功能。
如何创建一个ObjectArx程序

如何创建一个ObjectArx程序?本小节通过一个简单的实例来讲述ARX程序的创建过程,介绍编制Object ARX程序的一些基本步骤和原则,并初步了解ARX程序与AutoCAD进行通讯的方式。
如同学习其它计算机语言一样,我们首先来创建一个最简单的ARX程序—“Hello.ARX”,在AutoCAD 2002中加载并运行该程序,将会在命令行出现-“Hello, ObjectARX!”。
38.2.1 建立ARX程序的基本步骤由于ARX程序是一种可以共享AutoCAD地址空间并对AutoCAD进行直接调用的动态链接库,因此应该按照下列基本步骤建立ARX程序:(1) 创建自定义类来实现新的命令:用户可以从ARX类层次关系中的大多数类和符号表类中派生自己的类。
(2) 决定ARX程序应该响应的AutoCAD消息:AutoCAD通过向ARX程序发出一系列的消息指明在它内部发生的特殊事件,ARX程序必须对其中的某些消息作出反映,并触发相应的操作。
(3) 实现应用程序与AutoCAD通信的入口:AutoCAD通过函数acrxEntryPoint()来调用ARX程序,而不是象普通的C++程序那样使用main()函数。
函数acrxEntryPoint()中可以用switch语句处理AutoCAD的各种返回信息,根据不同信息执行不同的函数,并返回状态码。
如果针对特定的消息返回出错代码,则必须用case语句来处理。
最后,必须用AcRx::kRetOk 作为函数acrxEntryPoint()的最终返回值。
(4) 完成ARX程序的初始化:用户必须在acrxEntryPoint()函数的AcRx::kInitAppMsg 事件中或者该事件调用的函数(例如:initApp()函数)中,对程序中自定义的所有类进行初始化,然后调用acedRegCmds->addCommand()函数在AutoCAD命令堆栈中注册新命令。
(5) 实现卸载(Unload)功能:用户必须在acrxEntryPoint()函数的AcRx:: kUnloadAppMsg 事件中或者该事件调用的函数(例如:unloadApp()函数)中,调用acedRegCmds->removeGroup()函数将initApp()函数中注册的新命令组从AutoCAD命令堆栈中清除,调用deleteAcRxClass()函数清除程序中自定义的任何类,然后删除所有由应用程序添加到AutoCAD中的对象,并清除所有与AcDbObject、AcDbDatabase、AcRxDynamicLinker或AcEditor对象相关联的事件反应器。
基于ObjectARX的渲染功能的设计与实现(软件工程课程设计)
《基于ObjectARX的渲染功能的设计与实现》软件工程课程设计目录第一章引言 (5)第一节什么是墓石设计系统 (5)第二节什么是墓石渲染 (6)第三节本文主要内容 (7)第二章系统总体设计 (8)第一节系统功能模块图和需求分析 (8)第二节开发工具(Object ARX)介绍 (11)第三节 AutoCAD数据库介绍 (11)第四节 Render API库结构解析 (12)第三章系统详细设计 (18)第一节三类文本库的设计 (18)第二节数据库(access)设计 (20)第三节各功能模块详细设计 (20)第四章系统运行结果演示 (26)结束语和感想 (31)致谢语 (32)参考文献 (33)第一章引言第一节什么是墓石设计系统墓石指的用石头建成的陵墓。
要建成漂亮的陵墓,不仅要在石材加工厂里把粗糙、不规则的石头磨成方圆有形的石种,还要在设计室里费尽心思地进行造型设计,后一种工作就叫做墓石设计。
在墓石行业发展的初期,设计者采用手工制图,主要依赖的工具是纸和笔,画过的局部造型往往没有可重用性,因此设计过程中存在许多重复劳动。
随着计算机技术的发展,石材设计行业引进了计算机辅助设计( Computer Aided Design,简称CAD )技术,从此进入了无纸化设计时代。
计算机辅助设计( Computer Aided Design,简称CAD )技术,是指设计人员(或用户〕在产品或工程设计过程中借助于CAD系统(硬件、软件)的帮助来完成设计任务,并达到提高设计质量和缩短设计周期的目的的技术。
而在所有的CAD软件系统中,由美国Autodesk公司开发的AutoCAD是目前国内外最广泛使用的计算机辅助绘图和设计软件包。
本文所进行的二次开发也正是以AutoCAD为平台的。
在墓石设计中,固然包含着需要由人来完成的创造性的工作,但是同时也包含了很多重复性的工作,如大量的计算、绘图等工作。
在CAD技术出现以前,工程设计的全过程都是由人来完成的.而计算机具有运算速度快、存储数据多、精确度高、有记忆和逻辑判断的能力、可处理图形等特点,这些重复性的工作可以由计算机更快、更好地去完成,这就是把CAD技术应用在墓石设计领域的意义所在。
objectarx 开发人员手册
ObjectARX开发人员手册目录一、ObjectARX开发简介1.1 什么是ObjectARX?1.2 ObjectARX的应用领域1.3 ObjectARX的基本原理1.4 ObjectARX的发展历程二、ObjectARX环境搭建2.1 开发环境准备2.2 ObjectARX SDK安装2.3 开发工具选择2.4 环境配置及注意事项三、ObjectARX开发入门3.1 基本概念及术语3.2 ObjectARX编程框架3.3 第一个ObjectARX程序四、ObjectARX开发核心知识4.1 对象模型4.2 数据访问和修改4.3 事件处理4.4 自定义命令和操作4.5 交互式绘图五、ObjectARX开发高级技巧5.1 高效数据管理5.2 多线程编程5.3 性能优化5.4 构建扩展应用程序六、ObjectARX开发实例6.1 绘图应用实例6.2 数据处理应用实例6.3 CAD环境集成实例6.4 其他领域实例七、ObjectARX开发注意事项7.1 内存管理7.2 线程安全7.3 安全性考虑7.4 与AutoCAD版本兼容性7.5 其他注意事项八、ObjectARX开发资源8.1 冠方文档和教程8.2 开发社区和论坛8.3 第三方扩展库8.4 实用工具和示例九、ObjectARX开发未来展望9.1 行业发展趋势9.2 技术更新和发展9.3 ObjectARX的发展方向一、ObjectARX开发简介1.1 什么是ObjectARX?ObjectARX是AutoCAD的二次开发接口,简单来说,它是AutoCAD的扩展开发评台。
通过ObjectARX,开发者可以利用C++、C#、VB等语言编写自定义应用程序,扩展和定制AutoCAD的功能,实现各种与CAD相关的应用开发。
1.2 ObjectARX的应用领域ObjectARX广泛应用于工程设计、土木工程、建筑设计、机械设计等领域。
开发者可以利用ObjectARX开发CAD扩展功能、自定义命令、数据处理工具、智能绘图等应用,帮助用户提高工作效率,满足特定行业的需求。
(完整版)ObjectARX学习笔记
一、CAD 版本和VC++的版本对应 (1)二、ObjectARX 实体创建 (1)三、创建直线实例 (1)五、修改图形对象的属性 (2)1、打开图形数据库的对象 (2)2、修改直线颜色实例 (3)六、用类组织函数 (4)七、提高CreateLine 函数的可重用性 (8)八、升级Visual Studio 试用版到正式版 (12)九、创建圆 (13)十、创建圆弧(“三点法”,“起点、圆心、终点法”,“起点、圆心、圆弧角度法”) (18)//添加计算常量的值的函数 (20)十一、创建多段线 (23)十二、创建正多边形 (25)一、CAD 版本和VC++的版本对应AutoCADVisual Studio2000——2002 VC6.02004——2006 VC7.0(2002)2007——2009 VC8.0(VC2005)2010——1012 VC20082013——2014 VC2010二、ObjectARX 实体创建1、注册一条直线命令2、在命令函数中添加创建直线对象函数(AcDbLine 类)AcGePoint3d ptStart();AcGePoint3d ptEnd();AcDbLine *pLine=new AcDbLine(ptStart,ptEnd);3 在命令函数中添加获得指向块表的指针相关代码AcDbBlockeTable *pBlockTable;acdbHostApplicationServices()->WorkingDataBase()->getBlockTable(pBlockTable,AcDb::kForRead);4、在命令函数中添加获得指向特定块表记录的指针的相关代码AcDbBlockTableRecord *pBlockTableRecord;pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord,AcDb::kForWrite);5、在命令函数中添加向块表记录中附加实体代码AcDbObjectId lineId;pBlockTabelRecord->appendAcDbEntity(lineId,pLine);6、在命令函数中添加关闭图形数据库各种对象的代码pBlockTable->close();pBlockTableRecord->close();pLine->close();三、创建直线实例Comme定义的执行结Acad::ErrorStatusnt [M1]: 一个在结构Acad 中表示函数的果四、五、修改图形对象的属性1、打开图形数据库的对象acdbOpenAcDbEntity(AcDbEntity *&pEnt,AcDbObjectIdErrorStatus枚举#include "StdAfx.h"lineId=CreatLine(); //修改直线颜色ChangeColor(lineId,1); }Comment [M3]: 这些函数都是放在acrxEntryPoint.cpp 文件中 Comment [M4]: 包含六、用类组织函数1、新建 ObjectARX 项目 CreatEnt2、新建两个 C++类 CreatEnt 和 ModifyEnt下头文件同用这个类保存创建实体的函数头文件#pragma once #include "StdAfx.h"CCreatEnt::~CCreatEnt(void){}AcDbObjectId CCreatEnt::CreatLine(){//在内存上创建一个新的AcDbLine对象AcGePoint3d ptStart(0,0,0);AcGePoint3d ptEnd(100,100,0);AcDbLine *pLine=new AcDbLine(ptStart,ptEnd);//获得指向块表的指针AcDbBlockTable *pBlockTable;acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable,AcDb::kForRead);//获得指向特定块表记录的指针AcDbBlockTableRecord *pBlockTableRecord;pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord,AcDb::kForWrite);//将对象添加到块表记录中AcDbObjectId lineId;pBlockTableRecord->appendAcDbEntity(lineId,pLine);//关闭图形数据库的各种对象pBlockTable->close();pBlockTableRecord->close();pLine->close();return lineId;}头文件#pragma once#include "StdAfx.h"class CModifyEnt{public:CModifyEnt(void);~CModifyEnt(void);static Acad::ErrorStatus ChangeColor(AcDbObjectId entId,Adesk::UInt16 colorIndex); };源文件#include "StdAfx.h"#include "ModifyEnt.h"CModifyEnt::CModifyEnt(void){}CModifyEnt::~CModifyEnt(void){}Acad::ErrorStatus CModifyEnt::ChangeColor(AcDbObjectId entId, Adesk::UInt16 colorIndex) {AcDbEntity *pEntity;//打开图形数据库中的对象acdbOpenObject(pEntity,entId,AcDb::kForWrite);//修改实体颜色pEntity->setColorIndex(colorIndex);//关闭实体对象pEntity->close();return Acad::eOk;}AcrxEntryPoint.cpp// (C) Copyright 2002-2007 by Autodesk, Inc.//// Permission to use, copy, modify, and distribute this software in// object code form for any purpose and without fee is hereby granted,// provided that the above copyright notice appears in all copies and// that both that copyright notice and the limited warranty and// restricted rights notice below appear in all supporting// documentation.//// AUTODESK PROVIDES THIS PROGRAM "AS IS" AND WITH ALL FAULTS.// AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF// MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE. AUTODESK, INC.// DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE// UNINTERRUPTED OR ERROR FREE.//// Use, duplication, or disclosure by the U.S. Government is subject to// restrictions set forth in FAR 52.227-19 (Commercial Computer// Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii)// (Rights in Technical Data and Computer Software), as applicable.////-----------------------------------------------------------------------------// ----- acrxEntryPoint.cpp//-----------------------------------------------------------------------------#include "StdAfx.h"#include "resource.h"//修改直线颜色CModifyEnt::ChangeColor(lineId,1);}} ;Comment [M6]://-----------------------------------------------------------------------------IMPLEMENT_ARX_ENTRYPOINT(CCreatEntsApp)ACED_ARXCOMMAND_ENTRY_AUTO(CCreatEntsApp, mshlCreatEnts, ChangeColor, ChangeColor,ACRX_CMD_TRANSPARENT, NULL)七、提高CreateLine 函数的可重用性添加类CCreateEnt于是,CCreateEnt 类现在包含了两个静态成员函数:头文件#pragma once// 要包含 StdAfx#include "StdAfx.h"class CCreateLine{public:CCreateLine(void);~CCreateLine(void);};static AcDbObjectId PostToModelSpace(AcDbEntity *pEnt);static AcDbObjectId CreateL(AcGePoint3d ptStart,AcGePoint3d ptEnd);AcDbLine *pLine=new AcDbLine(ptStart,ptEnd);//AcDbObjectId lineId;lineId= CCreateLine::PostToModelSpace(pLine);return lineId;}AcDbObjectId CCreateLine::PostToModelSpace(AcDbEntity *pEnt){AcDbBlockTable *pBlockTable;acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable,AcDb::kForRead);AcDbBlockTableRecord *pBlockTableRecord;pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord,AcDb::kForWrite);AcDbObjectId entId;pBlockTableRecord->appendAcDbEntity(entId,pEnt);pBlockTable->close();pBlockTableRecord->close();pEnt->close();return entId;}acrxEntryPoint.cpp// (C) Copyright 2002-2007 by Autodesk, Inc.//// Permission to use, copy, modify, and distribute this software in// object code form for any purpose and without fee is hereby granted,// provided that the above copyright notice appears in all copies and// that both that copyright notice and the limited warranty and// restricted rights notice below appear in all supporting// documentation.//// AUTODESK PROVIDES THIS PROGRAM "AS IS" AND WITH ALL FAULTS.// AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF// MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE. AUTODESK, INC.// DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE// UNINTERRUPTED OR ERROR FREE.//// Use, duplication, or disclosure by the U.S. Government is subject to// restrictions set forth in FAR 52.227-19 (Commercial Computer// Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii)// (Rights in Technical Data and Computer Software), as applicable.////-----------------------------------------------------------------------------// - mshlfengzhuanglei.AddLine command (do not rename)static void mshlfengzhuangleiAddLine(void){// Add your code for command mshlfengzhuanglei.AddLine hereAcGePoint3d ptStart(0,0,0);AcGePoint3d ptEnd(100,100,0);AcDbObjectId lineId;lineId=CCreateLine::CreateL(ptStart,ptEnd);}} ;//----------------------------------------------------------------------------- IMPLEMENT_ARX_ENTRYPOINT(CArxProject1App)ACED_ARXCOMMAND_ENTRY_AUTO(CArxProject1App, mshlfengzhuanglei, AddLine, AddLine, ACRX_CMD_MODAL, NULL)2013/11/27八、升级Visual Studio 试用版到正式版VS2008 注册方法:非常简单,在开始>设置>控制面版>添加或删除程序>卸载2008(名字不太记得了)>出现卸载界面>点击Next>输入上面CD-key ->出现成功画面即可完美将试用版升级成为正式版。
AUTOCAD二次开发笔记(ObjectARX)---全部
AUTOCAD二次开发笔记(ObjectARX)---全部编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望(AUTOCAD二次开发笔记(ObjectARX)---全部)的内容能够给您的工作和学习带来便利。
同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。
本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为AUTOCAD二次开发笔记(ObjectARX)---全部的全部内容。
ObjectARX开发环境的创建与开发实例Hello World(VS2005+AutoCad2008+ObjectArx2008)在一个做CAD二次开发的公司做Web开发,感觉可提升的空间很小。
有必要研究一下公司的产品开发,以利发展。
一、首先安装好vs05与cad2008安装cad的时候也没有什么特别,加载到虚拟光驱,安装过程中有个错误提示,不影响继续。
二、安装ObjectArx2008直接打开解压缩到某个目录即可。
比如C:\ObjectARX 2008然后打开C:\ObjectARX 2008\utils\ObjARXWiz目录,运行ArxWizards.msi这样在新建C++项目的时候会出现ObjectARX项目,如图三、包含文件工具—〉选项—>项目和解决方案-〉VC++目录,如图所示:包含文件(添加图中前两个目录即可)库文件(添加图中前两个目录即可)四、新建ObjectARX项目,完成后添加MFC支持,如图所示:然后直接点finish打开acrxEntryPoint.cpp点击左上角的a>按钮,然后新建一个命令。
如图:只需要修改Internation Name与Localized Name为testcmd即可添加完成后,会在acrxEntryPoint。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
7
© 2005 Autodesk
客户端/服务器端交互
进程内
客户端/服务器端在同一进程
本地
客户端/服务器端在同一机器
远程
客户端/服务器端在同一网络
8
© 2005 Autodesk
嵌入架构
API被 可执行程序(宿主程序)执行 客户端通常为dll
.DLL .ARX
ObjectARX APIs API
3
© 2005 Autodesk
课程进度
API 概览 ObjectARX基本知识 用户交互和选择集 数据库操作 实体对象操作 扩充数据 反应器 几何类的使用 用户界面 自定义对象
4
© 2005 Autodesk
API 概览
什么是 API? (Application Program Interface) 应用程序留给对其调用的接口,客户端程序通过调用 API 去执 行应用程序的命令 ,访问其数据等等。
Rxapi.lib
AutoCAD 1.
.ARX 2.
4.
2. _DllMainCRTStartup (C/C++ 运行库的入口函数) 3. CRT_INIT (初始化C/C++运行库和静态全局变量) 4. DllMain (see MSDN for info) 5. acrxGetApiVersion 6. acrxEntryPoint
要求两方面内容: 包含执行特定的服务的入口点 正确调用服务 执行API的代码可以包装为: 源代码模块 (.h/.cpp 中C++) 二进制
静态库 DLL EXE
5
© 2005 Autodesk
API 概览
API 一般情况 API类型 客户端/服务器端交互 客户端代码 AutoCAD API和集成开发环境 (IDE) 执行 性能比较
Time in seconds
ObjectARX .NET LISP
14
© 2005 Autodesk
在AutoCAD中存储数据
不同API方式的比较
数据容器存储性能比较
140000
Time in seconds
120000 100000 80000 60000 40000 20000 0 Xrecord Xdata ObjectARX .NET LISP VBA VB
32
© 2005 Autodesk
与AutoCAD关系
Display drv Plotter drv Input drv Input acquisition PlotHDI AutoCAD
2D graphics cache (WHIP!)
HEIDI
3D graphics cache
ObjectDBX
ObjectARX 培训
1
培训目标
培训内容主要是
ObjectARX基础知识 如何使用 ObjectARX 如何在以后的实际工作中独立的获取相关资源和帮助
不是
如何使用 C++ 对所有的ObjectARX API做完整的讲述
2
© 2005 Autodesk
培训形式
PPT介绍 实例讲解 上机练习 认证考试
11
© 2005 Autodesk
AutoCAD API执行过程
.NET VisualLISP COM VBA (进程内) COM 客户端 (进程外)
acdbmgd.dll acmgd.dll
vl.arx
acvba.arx
axdb.dll
ObjectARX API
COM
AutoCAD
12
© 2005 Autodesk
22
© 2005 Autodesk
如何得到ObjectARX
SDK ( Software Development Kits)
免费下载
(SDK)
Autodesk 网站 / 检索 ObjectARX /adsk/servlet/item?siteID=123112&id=773180
18
© 2005 Autodesk
课程进度
API 概览 ObjectARX基本知识 用户交互和选择集 数据库操作 实体对象操作和事务 扩充数据 反应器 几何类的使用 用户界面 自定义对象
19
© 2005 Autodesk
什么是 ObjectARX?
运行扩展 (AutoCAD Runtime eXtension)
按需加载
命令调用
Registry:通过注册表
从其他程序 Registry
按请求 代理检测
实时
acrxLoadModule 参见PolySamp
29
© 2005 Autodesk
加载 ObjectARX 程序 II
3. 5. 6. Operating System 1. LoadLibrary
.DLL .ARX
ObjectARX APIs API
.ARX .DLL
.EXE AutoCAD
25
© 2005 Autodesk
主要的库 - I
AcRx 对象和类管理库 (rxapi.lib) AcEd AutoCAD 编辑器工具库 (acedapi.lib) AcDb AutoCAD 数据库对象库 (acdb17.lib) AcGi AutoCAD 图形接口库 (acgiapi.lib) AcGe AutoCAD 几何库 (acge17.lib)
COM (VB)
COM (VBA)
LISP
Create 1000 Circles
ObjectARX
Cre
Cre
Upd
AutoCAD's APIs
Add
Cre
Tota
13
© 2005 Autodesk
在AutoCAD中存储数据
不同API方式的比较
数据容器存储性能比较
400 350 300 250 200 150 100 50 0 Xrecord Custom Object Xdata
AutoCAD API 性能比较
100.00 90.00 80.00 70.00
S.0.58 API Performance
Seconds
60.00 50.00 40.00 30.00 20.00 10.00 0.00
Total Create 1000 2dPolylines Add XData to 1000 Entities Update 1000 Circles Create 1000 lines
可用的程序开发接口
ObjectARX COM Automation (VB, Java, Delphi, etc.) AutoLISP .NET 托管 API
AutoCAD自带的集成开发环境
Visual LISP Visual Basic, Applications Edition (VBA)
dwg ObjectARX SDK (free, /objectarx) RealDWG - ObjectDBX ADF (licensed, /adc) Plot DDK (licensed, /adn-devhelp) HEIDI DDK (licensed, /heidi) WinTab DDK (free, )
.ARX .DLL
.EXE AutoCAD
9
© 2005 Autodesk
客户端代码形式
慢
解释代码
代码脚本-AutoLISP
封装代码
预处理, 半解释代码-编译后的 Visual LISP
编译代码
编译器指令代码-ObjectARX
快
10
© 2005 Autodesk
AutoCAD API和集成开发环境
26
© 2005 Autodesk
主要的库 - II
AcUi/AdUi MFC 扩展库 (adui17.lib acui17.lib) 自动化库(Automation) (axdb.lib oleaprot.lib) Internet 超链接库 (achapi17.lib) ADS 函数集 (acad.lib) 静态连接内存管理库 (rxheap.lib)
编辑和扩展图形数据库 创建/编辑/删除对象 创建新的对象类型 编辑 AutoCAD 用户接口 命令 工具条/对话框 属性面板 设计中心 显示系统
监控/编辑 AutoCAD 标准的行为 事件通知 输入点获取
21
© 2005 Autodesk
开发环境
Windows Server 2003, Service Pack 1, Windows® XP Professional, Service Pack 1 or 2, or Windows 2000, Service Pack 4 Microsoft Visual C++® 2005 (Version 8.0) Pentium® IV or later 512 MB RAM 1024 x 768 VGA with True Color (minimum)
15
© 2005 Autodesk
在AutoCAD中存储数据
不同API方式的比较
数据容器存储性能比较
5000
Time in seconds
4000 3000 2000 1000 0 Xrecord Custom Object ObjectARX .NET VBA LISP