ObjectARX学习笔记 2-acdb类杂记
ObjectARX学习笔记 9-AutoCAD的数据库和实体结构

ObjectARX AutoCAD的数据库和实体结构一、符号表一副CAD图形就是一个包含有多个表的数据库,它规定了9个符号表(见下表),用户不能再增加新的符号表符号表名符号表功能AcDbViewTable(视图表)适用于 AcDbViewTableRecord 类,表示在数据库中存储的视图。
视图与CAD的"VIEW"命令相关联AcDbViewportTable(视口表)适用于 AcDbViewportTableRecord 类,表示在CAD中当前系统变量TILEMODE的值为1时的视口设置。
视口配置由CAD的 VPORTS 命令创建。
不要和 MVIEW 命令混淆,当系统变量 TILEMODE 的值为0是,该命令创建视口实体。
AcDbLinetypeTable(线性表)适用于 AcDbLinetypeTableRecord 类,表示图形数据库中的线性。
AcDbLayerTable(层表)适用于AcDbLayerTableRecord类,表示图层。
AcDbTextStyleTable(文字样式表)适用于 AcDbTextStyleTable 类,表示文字样式。
AcDbUCSTable(用户坐标系表)适用于 AcDbUCSTableRecord 类,表示图形数据库中的存储的用户坐标系。
AcDbRegAppTable(应用程序名注册表)适用于 AcDbRegAppTableRecord 类,表示为图形数据库中对象的扩展实体数据而注册的应用程序名。
AcDbDimStyleTable(尺寸标注样式表)适用于 AcDbDimStyleTableRecord 类,表示图形数据库中的尺寸标注样式。
AcDbBlockTable(块表)适用于 AcDbDimStyleTableRecord 类,表示图形数据库中定义的块。
此表含有两个非常重要的记录:模型空间和图纸空间。
所有的实体(可见对象)均防御块表AcDbBlockTable中。
ObjectARX开发教程(转)——第2课:AutoCAD数据库

ObjectARX开发教程(转)——第2课:AutoCAD数据库第2课:AutoCAD数据库介绍AutoCAD数据库的结构每个AutoCAD图形代表⼀个存储在⼏种对象中的数据库结构。
打开⼯程图时,AutoCAD会⾃⼰创建⼀个有组织的⾼效数据库。
该数据库包含⽤于创建基本⼯程图的最少数据。
最少的数据量由诸如图层,线型,⽂本样式等对象表⽰。
这样,您将获得第0层,标准字体,连续样式等。
在AutoCAD 2000版中,您可以与MDI环境同时使⽤多个图形。
此功能提供了极⼤的灵活性,但在处理多个图纸时也有些⿇烦。
在本课程中,我们将不讨论MDI⽅⾯,但是ObjectARX应⽤程序可能会要求它。
数据如何存储数据库维护需要绘图的每种对象。
这些对象存储在容器(容器)中,这些容器是为管理相同类型的对象⽽创建的特殊对象。
这样,我们就可以使⽤适当的存储⽅法和过程来存储实体,类,版式等。
存储在数据库中的每个对象都接收⼀个称为ObjectId的标识符。
该标识符在同⼀AutoCAD会话中是唯⼀的,并且在每个对象的整个⽣命周期内有效。
ObjectId由其数据库⽣成,因此您不必关⼼它是如何创建的。
在ObjectARX内部,我们有3种基本类型的对象:实体:图形对象(直线,圆弧,⽂本等);容器(隔间):⽤于存储和管理对象集(图层表,轮廓表等)的特殊对象;对象集:⾮图形对象(组,布局等)。
创建对象要使⽤ObjectARX创建对象,我们有⼀些基于对象类型和要存储对象的公式(⼤多数情况下,我们需要将对象存储在⾃⼰的隔间中)。
基本上,您将执⾏以下操作:将指针包含在要创建的对象中,并将其称为new运算符;使⽤此指针,调⽤对象的适当⽅法以更改其属性;获取指向您要在其中创建对象的数据库的指针(通常是当前数据库);打开⼀个存储数据的容器;通过其指针精确调⽤对象存储⽅法;获取对象的标识符(ObjectId)(由容器⾃动⽣成);完成所有对象集(包括隔离专区和刚刚创建的对象)的关闭过程。
ObjectARX实训讲义二自定义实体ppt课件

8
建立运行时类层次
rxInit (static) gpDesc (static variable) newAcRxClass acrxBuildClassHierarchy
9
类别判断函数
最基础的类AcRxObject提供了类型识别函数
virtual AcRxClass* isA() const; static AcRxClass* gpDesc; static AcRxClass* desc(); static CMyClass * cast(const AcRxObject* inPtr)
ObjectARX Trainer’Training
1
自定义实体的思路
什么是自定义实体
如何创建自定义实体
AcDbEntity虚函数的功能和使用
现场创建一个自定义实体 Tips and Tricks
2
•
自定义实体 操作自定义实体Smiley
什么是自定义实体
自定义一个图形对象、控制它图形显示,存储的数据,对 拖拽的响应,对捕捉的响应,平移、旋转等操作的响应
其它重要重载函数
设置自定义实体的捕捉函数
getOsnapPoints() transformBy()
对平移,复制,镜像等操作的响应函数
生成代理实体的图形形状函数
saveAs()
interSectWith()
16
相交函数
炸开函数
次常用重载函数
深度克隆
DeepClone wblockClone
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开发笔记2

刷新显示屏幕问题 (2)自定义实体时添加variable时相关问题 (2)用acdbOpenAcDbEntity打开实体后一定要关闭 (2)WCS到UCS的坐标转换 (2)选择过程中判断用户右键操作 (2)如何实现自定义实体Undo? (3)关于动态拖动的讨论 (3)刷新显示屏幕问题有时在程序中修改了实体,比如删除了实体,但在屏幕上没有及时地刷新,这时执行屏幕选取实体函数acedSSGet(),仍然能够选中原来的实体,明明它们已经删除了,这时怎么办呢,考虑用acedCommand(RTSTR, "REGEN", RTNONE);虽然也可以,但它会重新生成整个图形数据库,如果数据量很大,那么重生成的速度会很慢,这样就不可能在程序的一段循环语句中修改每一个实体后都对数据库重生成,那程序运行的时间大部分都花在刷新数据库上了,显然这不合理.解决方法:// 刷新显示屏幕actrTransactionManager->flushGraphics();acedUpdateDisplay();自定义实体时添加variable时相关问题问:用ObjectARX2007的Add Member Variable Wizard时出现页面错误怎么办?答:用vs2005自身的class view中的add variable就可以了。
用acdbOpenAcDbEntity打开实体后一定要关闭用acdbOpenAcDbEntity打开实体,不管是只读还是编辑方式,操作后都要关闭实体,否则再次打开时只能以只读方式打开。
WCS到UCS的坐标转换mbp为当前坐标(ads_point mbp),可以以下方法转换为wcs坐标。
struct resbuf wcs, ucs;wcs.restype = RTSHORT;wcs.resval.rint = 0;ucs.restype = RTSHORT;ucs.resval.rint = 1;acedTrans(mbp,&ucs,&wcs,0,mbp);选择过程中判断用户右键操作观察Acad2002的命令:mledit,这个命令运行后,用户需要选择操作对象,可是这个命令的选择功能有点特殊: 可以判断用户点了右键(等同直接按回车),,如果点了右键(或按回车),程序会退出.现在有个程序,也要选择一个对象,并且也想实现用户按回车(点击右键)后直接退出,我用的是acedEntSel函数,可是这些函数(包含acedNEntSelP..等.)都只能返回RENORM(正确选中),RTEROR(没有选中),用户按回车(点击右键)也是返回RTERROR请教下这里有没有解决的办法.int rc=acedEntSel("\nChoose a entity:",ent,pt);switch(rc){case RTCAN:acutPrintf("\nUser canceled.");break;case RTERROR:acutPrintf("\nNothing selected.");break;}如何实现自定义实体Undo?undo和redo实际上是调用了自定义实体的dwgInFields和dwgOutFields,你必须重载这个函数。
objectARX常用代码2

objectARX常⽤代码2设置当前的layer和textstyle// Function name : SetCurTextStyle// Description : 设置当前TextStyle// Return type : Acad::ErrorStatus// Argument : const char* lpStyleName// Argument : 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// Description : 设置当前层// 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;}//功能描述:选择指定图层上的所有实体!// ************************************************************************// 函数名称:selectEntityInLayer// 函数类型:Acad::ErrorStatus// 返回值: 正常:Acad::eOk// 功能描述:选择指定图层上的所有实体!// 函数作者:Darcy// 创建⽇期:200X-XX-XX// 参数列表:// 变量名:nLayerName 变量类型:const char* 变量说明:(输⼊)图层名// 变量名:nIDs 变量类型:AcDbObjectIdArray& 变量说明:(输出)图层中实体的对象标识符集合// ************************************************************************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;}另⼀种实现//************************************************************************//函数名称:selectEntityInLayer//函数类型:Acad::ErrorStatus//返回值://功能描述:选择指定层上的实体,得到其对象属性标识符!//函数作者:Darcy//创建⽇期:200X-XX-XX//参数列表://变量名:nLayerName 变量类型:CString 变量说明://变量名:nIDs 变量类型:AcDbObjectIdArray& 变量说明://变量名:nModelSpace 变量类型:bool 变量说明://************************************************************************Acad::ErrorStatus selectEntityInLayer(CString nLayerName,AcDbObjectIdArray& nIDs,bool nModelSpace){Acad::ErrorStatus es=Acad::eOk;AcDbBlockTable* pBlockTable=NULL;AcDbBlockTableRecord* pSpaceRecord=NULL;if (acdbHostApplicationServices()->workingDatabase()==NULL)return Acad::eNoDatabase;if ((es = acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable, AcDb::kForRead))==Acad::eOk) {char entryName[13];if (nModelSpace)strcpy(entryName,ACDB_MODEL_SPACE);elsestrcpy(entryName,ACDB_PAPER_SPACE);//Get the Model or Paper Space record and open it for read:if ((es = pBlockTable->getAt((const char*)entryName, pSpaceRecord, AcDb::kForRead))==Acad::eOk){AcDbBlockTableRecordIterator* pIter;if (pSpaceRecord->newIterator(pIter)==Acad::eOk){for (pIter->start();!pIter->done();pIter->step()){char *name=NULL;AcDbEntity* pEntity;if (pIter->getEntity(pEntity,AcDb::kForRead)==Acad::eOk){name=pEntity->layer();if (pareNoCase(name)==0)nIDs.append(pEntity->objectId());pEntity->close();acutDelString(name);}}delete pIter;}pSpaceRecord->close();}pBlockTable->close();}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;}另⼀个Acad::ErrorStatus CDrawFunction::createGroup(CString groupname,AcDbObjectIdArray IdArray){Acad::ErrorStatus es=Acad::eOk;AcDbDictionary *pGroupDict=NULL;AcDbGroup *pGroup=NULL;if((es=acdbHostApplicationServices()->workingDatabase()->getGroupDictionary(pGroupDict,AcDb::kForWrite))!=Acad::eOk){return es;}AcDbObjectId groupId;es=pGroupDict->getAt(groupname,groupId);if(es==Acad::eInvalidKey){acutPrintf("\n输⼊的词典名⽆效!");pGroupDict->close();return es;}else if(es==Acad::eKeyNotFound){pGroup=new AcDbGroup("GroupDiscription");if((es=pGroupDict->setAt(groupname,pGroup,groupId))!=Acad::eOk){pGroup->close();pGroupDict->close();return es;}}else if(es==Acad::eOk ){if((es=acdbOpenObject(pGroup,groupId,AcDb::kForWrite))!=Acad::eOk){pGroupDict->close();return es;}}for(int i=0;i pGroup->append(IdArray[i]);pGroup->setSelectable(FALSE);pGroupDict->close();pGroup->close();return es;}旋转整个groupvoid 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()){objId=pIter->objectId();acdbOpenAcDbEntity(pEnt,objId,AcDb::kForWrite);rotationEntity(pEnt,pt,rotationAngle);pEnt->close();}delete pIter;pGroup->close();}新建⼀个图层//==========================================================功能:新建⼀个图层参数:LayerName -- 图层名,LayerColor -- 颜⾊名返回:图层ID//==========================================================AcDbObjectId CreateNewLayer(CString LayerName, AcCmColor LayerColor){// 获得当前图形数据库的符号表AcDbLayerTable *pLayerTable;acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pLayerTable,AcDb::kForWrite);// ⽣成新的图层表记录AcDbLayerTableRecord *pLayerTableRecord = new AcDbLayerTableRecord;pLayerTableRecord->setName(LayerName); // 设置图层名pLayerTableRecord->setColor(LayerColor); // 设置图层颜⾊AcDbObjectId layerId;pLayerTable->add(layerId,pLayerTableRecord);// 关闭图层表和图层表记录pLayerTable->close();pLayerTableRecord->close();return layerId;}//==========================================================功能:在指定图层上新建⼀条直线参数:见注释返回:直线ID//========================================================== AcDbObjectId CreateLine( double x1,double y1,double z1, // 起点坐标double x2,double y2,double z2, // 终点坐标AcDbObjectId layer) // 直线所在图层{AcGePoint3d StartPt(x1,y1,z1); // 起点AcGePoint3d EndPt(x2,y2,z2); // 终点AcDbLine *pLine = new AcDbLine(StartPt,EndPt);// 获得当前图形数据库的符号表AcDbBlockTable *pBlockTable;acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlockTable, AcDb::kForRead);// 获得符号表中的模型空间块表记录指针,⽤于添加对象AcDbBlockTableRecord *pBlockTableRecord;pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord,AcDb::kForWrite); pBlockTable->close();// 将直线添加到模型空间块表记录中AcDbObjectId lineId;pLine->setLayer(layer,Adesk::kTrue); // 设置直线所在图层pBlockTableRecord->appendAcDbEntity(lineId,pLine);// 关闭块表记录指针和直线指针pBlockTableRecord->close();pLine->close();// 返回直线ID号return lineId;}不太常⽤的啊已知⼀段弧的起点和终点以及其凸度,求其圆⼼int getCenter(ads_point startPoint,ads_point endPoint,double bulge,ads_point& center){if (bulge==0.0){ads_point_set(startPoint,center);return 0;}ads_point startPt,endPt;if (bulge<0.0){ads_point_set(endPoint,startPt);ads_point_set(startPoint,endPt);bulge=bulge*(-1.0);}else{ads_point_set(startPoint,startPt);ads_point_set(endPoint,endPt);}double distStartToEnd,distX,distY,radius;distStartToEnd=ads_distance(startPt,endPt);distX=distStartToEnd/2.0;distY=bulge*distX;radius=((distX*distX)+(distY*distY))/(2.0*distY);double tmpAng;ads_point tmpPt;tmpAng=ads_angle(startPt,endPt);ads_polar(startPt,tmpAng,distX,tmpPt);ads_polar(tmpPt,(tmpAng+(_PI/2.0)),(radius-distY),center);return 1;};create hatch的AcDbObjectId CreateHatch(AcDbObjectId dbOId,char cLayer[],char cPattern[] = "SOLID",int nColor = 256,double dAngle = 0.0,double dScale = 1.0,AcDbDatabase * pDbDatab = acdbHostApplicationServices()->workingDatabase()){AcCmColor CmC;AcDbObjectId DbOId;AcDbObjectIdArray DbOIdA(0, 2);AcDbBlockTable * pDbBT;AcDbBlockTableRecord * pDbBTR;AcGeVector3d normal(0.0, 0.0, 1.0);DbOIdA.append(dbOId);AcDbHatch* pDbHat = new AcDbHatch();pDbHat->setDatabaseDefaults();pDbHat->setAssociative(Adesk::kTrue); // BUG: doesn't do squat! have to set the reactor yourself to get associativity!pDbHat->appendLoop(AcDbHatch::kExternal, DbOIdA);pDbHat->setPatternScale(dScale);pDbHat->setPatternAngle(dAngle);pDbHat->setPattern(AcDbHatch::kPreDefined, cPattern);pDbHat->setNormal(normal);pDbHat->evaluateHatch(); // crucial call or nothing gets displayed!pDbDatab->getSymbolTable(pDbBT, AcDb::kForRead);pDbBT->getAt(ACDB_MODEL_SPACE, pDbBTR, AcDb::kForWrite);pDbBTR->appendAcDbEntity(DbOId, pDbHat);pDbHat->setLayer(cLayer);CmC.setColorIndex(nColor);((AcDbEntity *)pDbHat)->setColor(CmC);pDbBT->close();pDbBTR->close();pDbHat->close();return DbOId;}前阵困扰我的问题解决了,现在共享给⼤家://************************************************************************//函数名称:getPointAtDistInGeCurve//函数类型:Acad::ErrorStatus//返回值://功能描述:返回曲线上距起点某距离值处的点。
(完整版)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 ->出现成功画面即可完美将试用版升级成为正式版。
objectarx开发笔记4
objectarx开发笔记4在ObjectARX 中打开与关闭对象 (2)一个创建面域的小程序 (2)加工具条按钮的方法 (3)如何创建经过任意实体的选择集 (8)建立新选择集,以及将一个实体添加到一个存在的选择集中 (8)根据objectid获取ads_name (9)在ObjectARX 中打开与关闭对象对arxreference章节的个人理解,如有误解原文之意,请多多指正!Opening and Closing ObjectARX Objects本部分代码样例说明了打开与关闭对象的协议。
应用此协议之前,你必须确保你所操作的对象是数据库驻留对象。
此协议能够确保对象在访问时是内存中的实体(physically),而不需访问时其可以存储在硬盘上。
当你准备修改某个数据库驻留对象时,你首先需要将其打开,代码如下所示:acdbOpenObject(pObject, objId, AcDb::kForWrite);此函数有一个Mode parameter可以指出打开对象的方式是for read, write, or notify;仅当对象以AcDb::kForWrite方式打开时,你才可以修改此对象,否则只可以查询对象属性。
当完成修改或查询时,你必须显式的将其关闭,代码如下所示:pObject->close();如下代码样例改变一个实体(AcDbEntity)的颜色,如下所示:Acad::ErrorStatuschangeColor(AcDbObjectId entId, Adesk::UInt16 newColor) {AcDbEntity *pEntity;acdbOpenObject(pEntity, entId,AcDb::kForWrite);pEntity->setColorIndex(newColor);pEntity->close();return Acad::eOk;}新的对象实例被以写的方式打开时,一些函数可以在打开对象时一并获取对象标识符(object ID),例如AcDbBlockTable::getAt()函数就是如此。
Object学习总结
1.在AuToCAD上点一点,加载一个.dwg文件到块参照中。
ads_point pt;if(acedGetPoint(0, _T(“\n请输入插入点<退出ESC>:”), pt) == RTNORM){MmCreateBlockReference(_T(“c:\\gypdxt.dwg”), asPnt3d(pt));}2.在AuToCAD上点一个点,加载一个.dwg文件到块定义中,返回该块的IDAcDbObjectID idRecd = MmLoadBlock(_T(“c:\\gypdxt.dwg”));If(idRecd.isValid){}3.将块定义、图形添加到块参照中,返回该对象的IDAddToCurrentSpace(指针对象)AcDbObjectId id = AddToCurrentSpace(指针对象)4.同类对象之间的赋值,函数-clone()AcDbBlockReference*pRef=(AcDbBlockReference*)Jig.GetBlkR ef()->clone();1.在AuToCAD上点击一个实体,获取该实体的IDAds_point adspt;Ads_name entname;AcDbObjectId entId;If(acedEntSel(_T(“\n请选择实体或<退出ESC>:”), entname, adspt) != RTNORM)Return;acdbGetObjectId(entId, entname);2.实体的指针与实体的ID之间的相互转换AcDbLine* ptLine = new AcDbLine();AcDbObjectId ptId;ptId = AddToCurrentSpace(ptLine); //通过指针获取IDAcDbObjectPointer<实体类> pt(实体ID, AcDb::kForWrite);If(pt.openStatus() == Acad::eOk){Pt.实体类函数//通过ID获取指针}3.AcDbObjectPointer<AcDbEntity> pt(实体ID, AcDb::kForWrite);对实体数据的修改(set….) 用AcDb::kForWrite;对实体数据的获取(get….) 用AcDb::kForRead;4.封装的MmAdsEntMmAdsEnt entName;MmAdsRBList rbBlk = acutBuildList(RTDXFO, _T(“INSERT”),0);If(MmSelectEntity(_T(“请选择图块<退出>:”),entName,rbBlk) ==RTNORM)实体的删除1.通过实体的ID删除实体1)AcDbObjectPointer<AcDbEntity> pt(实体ID, AcDb::kForWrite);If(pt.openStatus() == Acad::eOk){Pt->erase();}2)AcDbEntity* pE;acdbOpenObject(pE ,实体ID, AcDb::kForWrite, false);实体属性的修改1.通过实体的ID获取实体的数据库类AcDbEntity* pEn;acdbOpenObject(pEn, 实体ID, AcDb::读写属性,false);pEn->实体属性函数;指针用完记得关闭pEn->close();AuToCAD界面上的1.在界面上输入一个值,传回程序If(acedGetReal(_T(“\n请输入一个数<提示>:”), &变量) ==RTNORM) { }2.在界面中对多个或单个实体的操作MmAdsEnt ent; ----获取单一实体类MmAdsRBList rb = acutBuildList(RTDXFO, _T(“INSERT”), 0); -筛选选择的实体_T(“INSERT”) 你要选择的实体If(MmSelectEntity(_T(“\n…..”), ent, rb) == RTNORM){ }ObjectARX常用实体类1.AcDbVoidPtrArray 将实体拆分成N个单独部分,判断该实体与其他实体的连接情况2.AcDbExtents 在实体的周围空间中创建一个长方体3.MmAdsEntSet 封装类,获取实体的集合4.MmAdsRBList 实体链表封装类5.AcDbPolyline 多线段实体类6.AcGeScale3d 3D空间矢量,对实体的x、y、z操作7.AcDbXline AutoCAD中的XLINE实体类型ObjectARX小常识总结1.两点之间距离的判断AcGePoint3d pt1,pt2;Pt1.distanceTo(pt2);距离为零的判断:if(EQUAL_ZERO(Pt1.distanceTo(pt2))){}2.将块参照添加到块表空间AcDbBlockReference*pRef=(AcDbBlockReference*)Jig.GetBlkRef()->clon e();if(pRef!=NULL){AddToCurrentSpace(pRef);}3.有些函数将传入的参数作为返回值1) MmAdsEnt entName;MmAdsRBListrbBlk=acutBuildList(RTDXF0,_T("INSERT"),0);if(MmSelectEntity(_T(""),entName,rbBlk)!=RTNORM)return;entName.GetObjectId;2) AcDbPolyline pEntpl;AcGePoint3d ptStart,ptEnd;pEntpl.getStartPoint(ptStart);pEntpl.getEndPoint(ptEnd);4.发送指令到AuToCAD的ObjectARX函数acedPostCommend(_T(“命令名”));5.MmGeBSPoint与AcGePoint3d的相互转换AcGePoint3d pt;MmGeBSPoint mpt = _PT(pt);6.AcDbEntity与AcDbObject可以相互转换AcDbObject Id;AcDbEntity* pEn = (AcDbEntity*)Id;反之 Id = pEn->id();7.AcDbVoidPtrArray类创建对象后要记得释放AcDbVoidPtrArray ptr;ReleaseAcDbPtrArray(ptr);8.MmAdsEntSetssEnt选择集兼容类MmAdsRBListrb=acutBuildList(RTDXF0,_T("INSERT"),0);if(MmSelectEntities(_T("\n。
第二章ObjectARX类库简介
第⼆章ObjectARX类库简介ObjectARX环境包含下列⼏组类和函数:AcRx ⽤于绑定应⽤程序及运⾏时类的注册和标识的类。
AutoCAD Registration Extension;AcEd 注册本地AutoCAD命令和AutoACD事件通知的类。
AutoCAD Envent Directory;AcDb AutoCAD数据库类。
AutoCAD DataBase ;AcGi 显⽰AutoACD实体的图形类。
AutoCAD Graph Interface;AcGe 公⽤线性数学和⼏何学对象应⽤类。
AutoCAD Geometry Entity;AcRx库提供了⼀些系统级类,⽤于DLL的初始化和链接及运⾏时类的注册和标识。
该库的基类是AcRxObject,它提供如下功能:对象运⾏时类标识和继承分析、运⾏时向既有类添加新协议、对象⽐较测试、对象复制。
运⾏时类型标识是AcRxObject的每个⼦类都有⼀个相关的类描述者对象(AcRxClass类型),⽤于运⾏时类型的标识。
最常⽤函数:AcRxObject::isA(); ⽤于类识别,被识别的类必须能够测试其类型。
AcRxObject::isKindOf(); 也是⽤于类识别,但这⾥的类能够被测试其类型,或者测试其派⽣类的类型。
AcRxObject::desc(); 返回类名。
AcRxObject::cast(); 试图将⼀个基类转换成更⾼级的类。
如果转换成功,基类对象的指针将是转换后类型的指针。
该库也可以对应⽤程序进⾏加锁或解锁。
使⽤函数::acrxUnlockApplication()可以使应⽤程序不可卸载。
AcEd库提供定义和注册新的AutoCAD命令的类,新命令的操作性能与AutoCAD内部命令是完全⼀样的。
我们定义的新命令被当作本地命令是因为它们与AutoACD内部命令具有相同的内部结构(AcEdCommandStack)。
AcEd库还提供编辑器反应器和⼀套与AutoCAD通信的全局函数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
AcDbArc类AcDbArc类表示AutoCAD中的弧实体。
继承自AcDbCurve包含文件dbents.h参见AcDbObject, AcDbEntity, AcGePoint3d, AcGeVector3d成员AcDbArc建构器和析构器AcDbArc::~AcDbArc 函数~AcDbArc();析构器。
AcDbArc::AcDbArc 函数AcDbArc(const AcGePoint3d& center,double radius,double startAngle,double endAngle);center输入弧的中点radius输入弧的半径startAngle输入弧的开始角endAngle输入弧的终止角个建构器使用传递的值创建一个弧。
center必须在WCS坐标中。
弧使用(0,0,1)作为法向矢量和0.0作为厚度初始化。
--------------------------------------------------------------------------------AcDbArc(const AcGePoint3d& center,const AcGeVector3d& normal,double radius,double startAngle,double endAngle);center输入弧的中点normal输入包含弧的平面的法向矢量radius输入弧的半径startAngle输入弧的开始角endAngle输入弧的终止角这个建构器使用传递的值创建一个弧。
center必须在WCS坐标中。
弧使用0.0作为厚度初始化。
--------------------------------------------------------------------------------AcDbArc();默认建构器。
初始化将法向矢量初始化为(0,0,1),中点初始化为(0,0,0),半径、开始角、终止角初始化为0.0。
在第一次关闭弧之间,半径需要改变为一个非零值。
中点和法向矢量必须在WCS坐标中。
AcDbArc编辑函数AcDbArc::setCenter 函数Acad::ErrorStatussetCenter(const AcGePoint3d& center);center输入弧的中点此函数设置center为弧的中心。
Center必须在WCS坐标中。
中点值对应于DXF群组码10的WCS值。
如果成功返回Acad::eOk,如果传递的数据非法则返回Acad::eInvalidInput。
AcDbArc::setEndAngle 函数Acad::ErrorStatussetEndAngle(double endAngle);endAngle输入弧的终止角(弧度)此函数设置endAngle为弧的终止角。
endAngle必须为弧度。
角度相对于弧的OCS的X轴,如视线沿Z轴指向原点则正角度方向为逆时针。
OCS的X轴使用弧的法向矢量、WCS的Z轴,以及任意的轴运算法则确定。
如果角度为负值,则弧仍以逆时针绘出,但从相反的方向度量。
例如,4.7124弧度(270度)的弧与-1.5708弧度(-90度)相等。
终止角对应DXF群组码51。
如果成功返回Acad::eOk,如果传递的数据非法则返回Acad::eInvalidInput。
AcDbArc::setNormal 函数Acad::ErrorStatussetNormal(const AcGeVector3d& normal);normal输入弧的法向矢量此函数设置normal指向包含弧的平面的法向矢量。
normal必须在WCS坐标中且必须为非零长度。
法向矢量值对应DXF群组码210。
如果成功返回Acad::eOk,如果传递的数据非法则返回Acad::eInvalidInput。
AcDbArc::setRadius 函数Acad::ErrorStatussetRadius(double radius);radius输入弧的半径此函数设置radius为弧的半径。
Radius必须大于0。
半径值对应DXF群组码40。
如果成功返回Acad::eOk,如果传递的数据非法则返回Acad::eInvalidInput。
AcDbArc::setStartAngle 函数Acad::ErrorStatussetStartAngle(double startAngle);startAngle输入弧的开始角(弧度)此函数设置startAngle为弧的终止角。
startAngle必须为弧度。
角度相对于弧的OCS的X轴,如视线沿Z轴指向原点则正角度方向为逆时针。
OCS 的X轴使用弧的法向矢量、WCS的Z轴,以及任意的轴运算法则确定。
如果角度为负值,则弧仍以逆时针绘出,但从相反的方向度量。
例如,4.7124弧度(270度)的弧与-1.5708弧度(-90度)相等。
开始角对应DXF群组码50。
如果成功返回Acad::eOk,如果传递的数据非法则返回Acad::eInvalidInput。
AcDbArc::setThickness 函数Acad::ErrorStatussetThickness(double thickness);thickness输入弧的厚度此函数设置thickness 为弧的厚度。
厚度是弧沿它法向矢量方向(有些称为拉伸方向)的标注。
厚度值对应DXF群组码39。
如果成功返回Acad::eOk,如果传递的数据非法则返回Acad::eInvalidInput。
AcDbArc杂项函数AcDbArc::getClassID 函数virtual Acad::ErrorStatusgetClassID(CLSID* pClsid) const;pClsid未说明Description to come。
AcDbArc::getTransformedCopy 函数DBCURVE_METHODS Acad::ErrorStatusgetTransformedCopy(const AcGeMatrix3d& xform,AcDbEntity*& ent) const;xform未说明ent未说明Description to come。
AcDbArc查询函数AcDbArc::center 函数AcGePoint3dcenter() const;此函数返回弧在WCS坐标中的中点。
中点值对应于DXF群组码10的WCS值。
AcDbArc::endAngle 函数doubleendAngle() const;此函数返回弧的终止角的弧度。
角度相对于弧的OCS的X轴,如视线沿Z轴指向原点则正角度方向为逆时针。
OCS的X轴使用弧的法向矢量、WCS的Z轴,以及任意的轴运算法则确定。
终止角对应DXF群组码51。
AcDbArc::normal 函数AcGeVector3dnormal() const;此函数在WCS坐标中返回弧的单位法向矢量。
normal必须在WCS坐标中且必须为非零长度。
法向矢量值对应DXF群组码210。
AcDbArc::radius 函数doubleradius() const;此函数返回弧的半径。
半径值对应DXF群组码40。
AcDbArc::startAngle 函数doublestartAngle() const;此函数以弧度返回弧的终止角。
角度相对于弧的OCS的X轴,如视线沿Z轴指向原点则正角度方向为逆时针。
OCS的X轴使用弧的法向矢量、WCS的Z轴,以及任意的轴运算法则确定。
开始角对应DXF群组码50。
AcDbArc::thickness 函数doublethickness() const;此函数返回弧的厚度。
厚度是弧沿它法向矢量方向(有些称为拉伸方向)的标注。
厚度值对应DXF群组码39。
AcDbFilter类此类定义了一个“查询”。
这提供了AcDbCompositeFilteredBlockIterator的关键字,与AcDbCompositeFilteredBlockIterator相关的索引通过indexClass()方法取得。
AcDbSpatialFilter::indexClass()方法将返回AcDbSpatialIndex::desc()。
需要提供它们自己的索引方式的应用程序需要提供以下三个类的版本:AcDbIndexAcDbFilterAcDbFilteredBlockIterator继承自AcDbObject包含文件dbfilter.h参见AcDbIndexFilterManager, AcDbIndex成员AcDbFilter建构器和析构器AcDbFilter::~AcDbFilter 函数virtual~AcDbFilter();析构器。
AcDbFilter::AcDbFilter 函数AcDbFilter();默认建构器。
AcDbFilter函数AcDbFilter::indexClass 函数virtual AcRxClass *indexClass() const;此函数用于AcDbCompositeFilteredBlockIterator的init()方法中。
例如,如果过滤在裁剪的xref的图形的重生以建立索引遍历器定义过程中过滤生效,则此函数于内部使用。
返回此过滤器的AcDbIndex的类描述符。
AcDbRasterImage类AcDbRasterImage实体(或“图像实体”)与AcDbRasterImageDef对象(或“图像定义对象”)一起使用,以处理AutoCAD中的光栅图像。
这两个类之间的关系就象一个AutoCAD块定义对象和一个块插入实体之间的关系。
以下的OMT图表示了图像对象模型的结构。
AutoCAD图像对象模型图像实体是一个可绘的、可选择的AutoCAD实体,以一个特定点和方向将一个光栅图像放置在模型或图纸空间中。
图像实体链接至一个图像定义对象,并将显示和绘出图像的需要的图像处理操作的请求送至这个对象。
因为图像定义对象管理所有图像信息,所有图像实体相对较小。
除了图像位置和方向外,它还包括一个裁剪区域、图像淡出、对比度和亮度参数以其他的典型的AcDbEntity属性如层和颜色。
两个或更多的图像实体可被链接至一个图像定义实体。
因为每个图像实体都有自己的裁剪区域,所以这是一个在图形中不同的位置显示一个光栅图像的不同区域的有效的方法。
AcDbRasterImage实体有时必须在两个坐标系统之间转换:AcDbEntities的3D模型坐标和AcDbRasterImageDef的2D像素坐标。
为了这个目的,图像实体包含一个在3D世界坐标中指定的平面边界矩形,描述了它在空间中的原始图形的边界。