objectarx视频教程培训PPT

简介 相关

截图

objectarx视频教程培训PPT
objectarx视频教程培训PPT

简介

这是一个关于objectarx视频教程培训PPT(部分ppt内容已做更新升级),主要介绍了ObjectARX应用、ObjectARX概述、ObjectARX开发特点、ObjectARX类库构成等内容。培训是给新员工或现有员工传授其完成本职工作所必需的正确思维认知、基本知识和技能的过程。是一种有组织的知识传递、技能传递、标准传递、信息传递、管理训诫行为。其中以技能传递为主,侧重上岗前进行。为了达到统一的科学技术规范、标准化作业,通过目标规划设定知识和信息传递、技能熟练演练、作业达成评测、结果交流公告等现代信息化的流程,让员工通过一定的教育训练技术手段,达到预期的水平,提高目标。目前国内培训以技能传递为主,时间在侧重上岗前。

objectarx视频教程培训PPT是由红软PPT免费下载网推荐的一款培训教程PPT类型的PowerPoint.

ObjectARX TrainingXAU红软基地
华中科技大学CAD中心XAU红软基地
武汉天喻软件有限责任公司XAU红软基地
2010年2月XAU红软基地
ObjectARX应用的介绍XAU红软基地
ObjectARX是一个仅在AutoCAD上进行二次开发的一套开发环境,通俗点讲就是一系列的APIXAU红软基地
ObjectARX的应用举例:XAU红软基地
扩展AutoCAD功能XAU红软基地
为各种工程设计开发便利的工具XAU红软基地
ObjectARX概述XAU红软基地
ARX——AutoCAD Runtime eXtensionXAU红软基地
DBX ——DataBase eXtensionXAU红软基地
ARX = .DLL + 2 exported functionsXAU红软基地
{ acrxEntryPoint & acrxGetApiVersion }XAU红软基地
ObjectARX开发特点XAU红软基地
不同的ACAD版本用不同的开发包及开发环境XAU红软基地
ACAD2000~ACAD2002 : VC++ 6.0XAU红软基地
ACAD2004~ACAD2006 : VS.NET 2002XAU红软基地
ACAD2007~ACAD2009 : VS.NET 2005XAU红软基地
ACAD2010~       :  VS.NET 2008XAU红软基地
ACAD2007开始字符串采用UNICODE编码XAU红软基地
ARX之间不能连续依赖XAU红软基地
A.arx依赖B.arx, B.arx依赖C.dbx,则A.arx不能加载XAU红软基地
与ACAD已有功能地位一致XAU红软基地
ObjectARX类库构成XAU红软基地
AcRx:用于帮定一个应用程序以及运行类的注册和识别。XAU红软基地
AcEd:用于注册自定义命令和AutoCAD事件通告。XAU红软基地
AcDb:AutoCAD图形数据库。XAU红软基地
AcGi: 用于AutoCAD 的图形类。XAU红软基地
AcGe:用于AutoCAD 的线型和几何对象通用类。XAU红软基地
ADS: AutoCAD 的早期版本C语言函数库。XAU红软基地
ObjectARX类结构XAU红软基地
类图classmap.dwgXAU红软基地
位置:\ObjectARX 2006\classmapXAU红软基地
用ObjectARX能做些什么?XAU红软基地
访问、编辑和扩展AutoCAD图形数据库XAU红软基地
和AutoCAD系统相互通信XAU红软基地
使用MFC创建用户接口XAU红软基地
支持多文档应用XAU红软基地
创建自定义类和自定义实体XAU红软基地
可以开发复杂的应用XAU红软基地
和其他开发环境进行协作XAU红软基地
培训安排-1XAU红软基地
一、基础XAU红软基地
AUTOCAD数据库结构及操作,ads_name-句柄-ID及转换,aced常用函数,WCS/UCS及转换,菜单/工具条/对话框制作XAU红软基地
二、自定义对象XAU红软基地
显示/存储/夹点/移动/拷贝/范围/list/捕捉点/炸开/相交点/sub事件XAU红软基地
三、自定义对象生成与编缉XAU红软基地
双击修改/Jig/属性页XAU红软基地
培训安排-2XAU红软基地
四、一些重要对象XAU红软基地
字典/层/线型/字体样式XAU红软基地
五、扩展数据XAU红软基地
六、反应器XAU红软基地
八、总结XAU红软基地
所需基础XAU红软基地
ACAD基本操作XAU红软基地
C++XAU红软基地
VCXAU红软基地
MFC(界面)XAU红软基地
COM(属性页等)XAU红软基地
STL(提高效率)XAU红软基地
AutoCAD图形数据库概述XAU红软基地
AutoCAD图形实际上是一系列存放在一个AcDbDatabase类型的对象中的AcDb对象。XAU红软基地
一个dwg就是一个数据库XAU红软基地
具备数据库的基本组织结构。XAU红软基地
包括九个符号表和一个命名对象词典XAU红软基地
AutoCAD图形数据库结构XAU红软基地
AcDbDatabase数据库XAU红软基地
       |------AcDb符号表XAU红软基地
       |        |------块表(AcDbBlockTable)XAU红软基地
       |        |------尺寸标注样式表(AcDbDimStyleTable)XAU红软基地
       |        |------层表(AcDbLayerTable)XAU红软基地
       |        |------线型表(AcDbLinetypeTable)XAU红软基地
       |        |------已注册应用程序表(AcDbRegAppTable)XAU红软基地
       |        |------字体样式表(AcDbTextStyleTable)XAU红软基地
       |        |------用户坐标系表(AcDbUCSTable)XAU红软基地
       |        |------视口表(AcDbViewportTable)XAU红软基地
       |        |------视图表(AcDbViewTable)XAU红软基地
       |-------命名对象词典XAU红软基地
访问:AcDbDatabase::getSymbolTableXAU红软基地
向数据库中添加实体 XAU红软基地
Acad::ErrorStatus addEntityToModelSpace(AcDbEntity * pEnt, AcDbObjectId & EntId)XAU红软基地
{XAU红软基地
 Acad::ErrorStatus eRet;XAU红软基地
AcDbDatabase * pDb = acdbHostApplicationServices()->workingDatabase();XAU红软基地
 AcDbBlockTable *pBlockTable;XAU红软基地
 eRet = pDb->getBlockTable(pBlockTable, AcDb::kForRead);XAU红软基地
 if ( eRet != Acad::eOk)XAU红软基地
 {XAU红软基地
  return eRet;XAU红软基地
 }XAU红软基地
 AcDbBlockTableRecord *pBlockTableRecord;XAU红软基地
 eRet = pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);XAU红软基地
 if ( eRet != Acad::eOk)XAU红软基地
 {XAU红软基地
  pBlockTable->close();XAU红软基地
  return eRet;XAU红软基地
 }XAU红软基地
 pBlockTable->close();XAU红软基地
 eRet = pBlockTableRecord->appendAcDbEntity(EntId, pEnt);XAU红软基地
 if ( eRet != Acad::eOk)XAU红软基地
 {XAU红软基地
  pBlockTableRecord->close();XAU红软基地
  return eRet;XAU红软基地
 }XAU红软基地
 pBlockTableRecord->close();XAU红软基地
 return Acad::eOk;XAU红软基地
}XAU红软基地
怎样遍历AutoCAD图形数据库?XAU红软基地
void FindObjectId(AcDbObjectId & objId)XAU红软基地
{XAU红软基地
AcDbDatabase * pDb = acdbHostApplicationServices()->workingDatabase();XAU红软基地
 AcDbBlockTable *pBlockTable;XAU红软基地
 pDb->getBlockTable(pBlockTable, AcDb::kForRead);XAU红软基地
 AcDbBlockTableRecord *pBlockTableRecord;XAU红软基地
 pBlockTable->getAt(ACDB_MODEL_SPACE,  pBlockTableRecord, AcDb:: kForRead);XAU红软基地
 pBlockTable->close();XAU红软基地
 AcDbBlockTableRecordIterator *pIter;XAU红软基地
  pBlockTableRecord- >newIterator(pIter); // Create an iteratorXAU红软基地
 for (pIter->start(); !pIter->done(); pIter->step())XAU红软基地
            {XAU红软基地
               ….........XAU红软基地
               AcDbEntity *pEntity;XAU红软基地
     if (pIter->getEntity(pEntity, AcDb::kForRead) != Acad::eOk)   continue;XAU红软基地
               If(pEntity->isKindOf(AcDbCircle::desc())   objId = pEntity->ObjectId();XAU红软基地
           }XAU红软基地
 pBlockTableRecord- >close();XAU红软基地
}XAU红软基地
怎样创建和使用已有的AutoCAD图形数据库?XAU红软基地
要使用AcDbDatabase数据库,与使用其它数据库一样,首先要声明一个数据库对象。AcDbDatabase类的声明,调用类的构造函数:XAU红软基地
AcDbDatabase ::AcDbDatabase(bool buildDefaultDrawing = true, bool noDocument = false);XAU红软基地
其中,buildDefaultDrawing参数控制是否创建一个包括所有默认数据记录的数据库。XAU红软基地
该参数的默认值为true,这样在AcDbDatabase数据库创建时,将在新建的数据库中包含一个AutoCAD图形数据库必须包含的基本数据要素,这些要素包括九个符号表及其初始记录(比如0层、STANDARD文字样式等),命名对象词典(组词典和多线样式词典)以及必要的系统变量设置。这样就可以向新建的数据库中添加各种实体和对象。如:AcDbDatabase *pDb= new AcDbDatabase(true);XAU红软基地
若指定该参数为false,AutoCAD将创建一个完全空的AcDbDatabase数据库。这样的AcDbDatabase数据库不能直接向其中添加实体或对象,需读入一个图形文件来拓展该图形数据库,然后再逐步添加或修改数据库中的实体或对象。XAU红软基地
读入图形数据库使用函数:AcadErrorStatus AcDbDatabase::readDwgFile(const char* fileName );XAU红软基地
若要使用已有的图形,比如“test.dwg”文件,则使用下列代码:XAU红软基地
AcDbDatabase *pDb= new AcDbDatabase(false);XAU红软基地
pDb->readDwgFile(“test.dwg”);XAU红软基地
AcDbDatabase构造函数的noDocument参数控制打开的数据库是否与当前文档关联,此参数用于“多文档处理”中。XAU红软基地
注意:在这种情况下,AcDbdatabase()的参数必须指定为false(当然,0或者Adesk::kFalse都可以)。因为使用pDb->readDwgFile()函数时,pDb必须是一个完全空白的数据库,也就是说,哪怕使用了AcDbDatabase(false);新建数据库后,只要对数据库进行了操作,就不能再使用readDwgFile()函数,否则会导致严重的内存错误。XAU红软基地
数据库对象AcDbObject概述XAU红软基地
每一个数据库对象具有以下三种表示方法:XAU红软基地
句柄 ——  AcDbHandleXAU红软基地
对象id ——  AcDbObjectIdXAU红软基地
指针 ——  AcDbObect *XAU红软基地
三者之间的相互关系XAU红软基地
之间相互关系和转换XAU红软基地
1. AcDbHandle -> AcDbObjectIdXAU红软基地
AcDbDatabase ::getAcDbObjectId(&AcDbObjectId ,FALSE, AcDbHandle );XAU红软基地
2. AcDbObjectId -> AcDbHandleXAU红软基地
AcDbHandle  = AcDbObjectId::handle ();XAU红软基地
3.AcDbObjectId -> AcDbObject *XAU红软基地
acdbOpenObject(AcDbObject *&,AcDbObjectId,AcDb::OpenMode);XAU红软基地
4.AcDbObject * -> AcDbHandle XAU红软基地
AcDbHandle  = AcDbObject::getAcDbHandle();XAU红软基地
5.ads_name 和 AcDbObjcetIdXAU红软基地
一个ads_name 是 一个包含两个long型元素的数组XAU红软基地
这个数组的第一个元素就是AcDbObjcetIdXAU红软基地
6. ads_name 和 AcDbObjcetId相互转换XAU红软基地
acdbGetAdsName(ads_name, objId);XAU红软基地
acdbGetObjectId(objId, ads_name);XAU红软基地
怎样访问数据库对象?XAU红软基地
打开对象的方法:XAU红软基地
acdbOpenObject() 该函数为模板函数,能打开任意对象XAU红软基地
acdbOpenAcDbObject()XAU红软基地
acdbOpenAcDbEntity()XAU红软基地
打开对象的模式:XAU红软基地
AcDb::kForRead //只读XAU红软基地
AcDb::kForWrite //可写XAU红软基地
AcDb::kForNotify //通知XAU红软基地
升级和降级访问:XAU红软基地
AcDbObject::upgradeOpen();  //升级为写XAU红软基地
AcDbObject::downgradeOpen(); //降级为读XAU红软基地
删除对象XAU红软基地
AcDbObject::erase()XAU红软基地
用事务方式访问XAU红软基地
事务XAU红软基地
AcTransaction * AcTransactionManager::startTransaction XAU红软基地
AcTransactionManager::endTransaction() XAU红软基地
AcTransactionManager::abortTransaction(),XAU红软基地
virtual Acad::ErrorStatus getObject(AcDbObject*& obj, AcDbObjectId objectId, AcDb::OpenMode mode, bool openErasedObject = false)XAU红软基地
对象访问限制XAU红软基地
如果一个对象被写打开,则在关闭前不能再被读打开或写打开XAU红软基地
如果一个对象被读打开,则在关闭前不能再被写打开,但可被读打开(一个对象最多可同时被打开128次)XAU红软基地
对象类型识别 XAU红软基地
desc():XAU红软基地
a static member function that returns the class descriptor object of a particular (known) class.XAU红软基地
cast():XAU红软基地
 a static member function that returns an object of the specified type, or NULL if the object is not of the required class (or a derived class). XAU红软基地
isKindOf():XAU红软基地
returns whether an object belongs to the specified class (or a derived class). XAU红软基地
isA():XAU红软基地
 returns the class descriptor object of an object whose class is unknown.XAU红软基地
AcRxClassXAU红软基地
例如:XAU红软基地
AcDbEntity* curEntity = somehowGetAndOpenAnEntity();XAU红软基地
if (curEntity->isKindOf(AcDbEllipse::desc())) { }XAU红软基地
If(curEntity->isA() == AcDbEllipse::desc()){ } XAU红软基地
AcDbLine * pLine  = AcDbLine ::cast(curEntity )XAU红软基地
AutoCAD里的交互XAU红软基地
AcEd 全局函数XAU红软基地
String, number acquisitionXAU红软基地
 acedGetInt        used to get an integer value acedGetReal       used to get a real value acedGetString     used to get a string acedGetDist       used to get the distance between two pointsXAU红软基地
Point, angle acquisitionXAU红软基地
 acedGetAngle      used to get a angle value acedGetPoint      used to pick a point acedGetCornerXAU红软基地
Entity selectionXAU红软基地
acedEntSel       used to select a single entity acedNEntSel      used to select a single, nested entity acedNEntSelP     used to select a single, nested entity acedSSGet        used to select multiple entitiesXAU红软基地
OthersXAU红软基地
acedGetKword      used to get a key word acedInitGet       used to initialize acedGetXXXX functions acedGetFileD      used to retrieve file selection from a file dialogXAU红软基地
向ACAD发送命令XAU红软基地
acedCommand:立即执行XAU红软基地
acedCommand(RTSTR, "zoom", RTSTR, "e", 0);XAU红软基地
sendStringToExecute:作为下一个命令执行XAU红软基地
 CString strCmd;XAU红软基地
 strCmd.Format("_HNBMReservedAreaModified %d %d ", (long)ReservedAreaHandle, nType);XAU红软基地
 acDocManager->sendStringToExecute(acDocManager->curDocument(), strCmd, false, true, false);XAU红软基地
共同点:都不能执行有用户交互的命令XAU红软基地
WCS,UCS,OCS(ECS)XAU红软基地
规则:数据库中对象保存的点坐标是WCS坐标(建议);而一些acedXX函数(如acedGetPoint,acedEntSel等)、list命令一般是UCS坐标。XAU红软基地
WCS与UCS相互转换XAU红软基地
 //UCS坐标系XAU红软基地
 fromrb.restype = RTSHORT;XAU红软基地
 fromrb.resval.rint = 1;XAU红软基地
 //WCS坐标系XAU红软基地
 torb.restype = RTSHORT;XAU红软基地
 torb.resval.rint = 0;XAU红软基地
 acedTrans(pt_ucs,&fromrb,&torb,FALSE,resultPt);XAU红软基地
acdbUcs2Wcs XAU红软基地
acdbWcs2Ucs XAU红软基地
AcDbEntity::getEcsXAU红软基地
UCS常用函数及类XAU红软基地
函数:Acad::ErrorStatus acedGetCurrentUCS(AcGeMatrix3d& mat);XAU红软基地
(以下函数和类可看作符号表的操作模式)XAU红软基地
函数:Acad::ErrorStatus getSymbolTable(AcDbUCSTable*& pTable,AcDb::OpenMode mode);XAU红软基地
类:AcDbUCSTableXAU红软基地
类:AcDbUCSTableRecordXAU红软基地
ARX应用向导XAU红软基地
应用向导:ObjectARX 2006的在\ObjectARX 2006\utils\ObjARXWiz目录下。XAU红软基地
功能:与MFC应用向导类似XAU红软基地
产生工程XAU红软基地
产生特定类及函数XAU红软基地
ARX,DBX加载/卸载XAU红软基地
加载XAU红软基地
ap(appload)XAU红软基地
arxXAU红软基地
其它方式(lisp文件,注册表等)XAU红软基地
卸载XAU红软基地
apXAU红软基地
arxXAU红软基地
ARX软件结构XAU红软基地
加载:On_kInitAppMsgXAU红软基地
卸载:On_kUnloadAppMsgXAU红软基地
命令映射(arx2006或以上):XAU红软基地
 static void INTECAD_INTESelect(void)XAU红软基地
 {XAU红软基地
 }XAU红软基地
ACED_ARXCOMMAND_ENTRY_AUTO(CINTECADApp, INTECAD, _INTESelect, INTESelect, ACRX_CMD_TRANSPARENT, NULL)XAU红软基地
ARX & MFCXAU红软基地
ObjectARX 完全支持MFC。XAU红软基地
两个MFC基类 AdUi and AcUi。XAU红软基地
注意:在调用资源时加上这句话 CAcModuleResourceOverride resOverride;XAU红软基地
对话框XAU红软基地
资源转换,多个ARX时可能需要XAU红软基地
CAcModuleResourceOverride resOverride;XAU红软基地
XAU红软基地
AfxSetResourceHandle (_hdllInstance) ;XAU红软基地
AfxSetResourceHandle (acedGetAcadResourceInstance ()) ;XAU红软基地
菜单与工具条XAU红软基地
通过菜单文件XAU红软基地
COM方式添加XAU红软基地
例1:基本操作XAU红软基地
建立应用程序XAU红软基地
建立命令XAU红软基地
实现功能:选中一实体,然后输出其信息XAU红软基地
例2:重复产生同半径的圆XAU红软基地
对话框输入半径XAU红软基地
用鼠标指定圆心XAU红软基地
数据库结构查看工具XAU红软基地
ARXDBG工具的使用XAU红软基地
位置:\ObjectARX 2006\samples\database\ARXDBGXAU红软基地
文档:ArxDbg.docXAU红软基地
本节结束XAU红软基地
下节将介绍自定义实体的内容XAU红软基地
自定义对象类XAU红软基地
一般从 AcDbObject 或AcDbEntity派生XAU红软基地
AcDbObject:不须显示,如字典对象XAU红软基地
AcDbEntity:可显示/操作的实体XAU红软基地
从其他(如AcDbLine等实体类)派生:根据需要XAU红软基地
自定义类可继续从另一个自定义继承,从而继承体系成树状结构XAU红软基地
编写时遵守一定的规则XAU红软基地
放在DBX工程中XAU红软基地
自定义类特点XAU红软基地
头文件XAU红软基地
ACRX_DECLARE_MEMBERSXAU红软基地
ACDB_REGISTER_OBJECT_ENTRY_AUTOXAU红软基地
版本XAU红软基地
CPP文件XAU红软基地
ACRX_DXF_DEFINE_MEMBERSXAU红软基地
AcDbProxyEntity::kNoOperationXAU红软基地
assertReadEnabled ()与assertWriteEnabled () ;XAU红软基地
读写控制XAU红软基地
显示刷新XAU红软基地
UNO/REDOXAU红软基地
DBX加载/卸载XAU红软基地
在ARX中调用XAU红软基地
acrxLoadModule/acrxUnloadModuleXAU红软基地
ARX在使用DBX的LIB库时,可能会出现诸如:acrxGetApiVersion找不到或ARX加载失败的问题.解决方法:XAU红软基地
在ARX和DBX工程中都增加def文件,文件内容如下:XAU红软基地
EXPORTSXAU红软基地
 acrxEntryPoint  PRIVATEXAU红软基地
 acrxGetApiVersion PRIVATEXAU红软基地
自定义对象-读入/写出XAU红软基地
作用XAU红软基地
文件(DWG,DXF)读写XAU红软基地
UNDO/REDOXAU红软基地
CLONEXAU红软基地
函数XAU红软基地
virtual Acad::ErrorStatus dwgInFields(AcDbDwgFiler* filer);XAU红软基地
virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler* filer) const;XAU红软基地
virtual Acad::ErrorStatus dxfInFields(AcDbDxfFiler* filer);XAU红软基地
virtual Acad::ErrorStatus dxfOutFields(AcDbDxfFiler* filer) const;XAU红软基地
AcDbDwgFilerXAU红软基地
类中常用函数XAU红软基地
 virtual Acad::ErrorStatus   readInt32(Adesk::Int32*) XAU红软基地
    virtual Acad::ErrorStatus   writeInt32(Adesk::Int32)XAU红软基地
 virtual Acad::ErrorStatus   readString(char**) XAU红软基地
virtual Acad::ErrorStatus   writeString(const char*)XAU红软基地
 virtual Acad::ErrorStatus   readPoint3d(AcGePoint3d*)XAU红软基地
    virtual Acad::ErrorStatus   writePoint3d(const AcGePoint3d&)XAU红软基地
 virtual Acad::ErrorStatus   readAcDbHandle(AcDbHandle*)XAU红软基地
    virtual Acad::ErrorStatus   writeAcDbHandle(const AcDbHandle&)XAU红软基地
 virtual Acad::ErrorStatus   readBytes(void *, Adesk::UInt32)XAU红软基地
    virtual Acad::ErrorStatus   writeBytes(const void *, Adesk::UInt32)XAU红软基地
读字符串XAU红软基地
 char *str=NULL;XAU红软基地
 pFiler->readString(&str);XAU红软基地
 m_strPanelType=str;XAU红软基地
 acutDelString(str);XAU红软基地
自定义对象-显示XAU红软基地
函数:XAU红软基地
virtual Adesk::Boolean worldDraw( AcGiWorldDraw* mode);XAU红软基地
virtual void viewportDraw(AcGiViewportDraw* mode);XAU红软基地
区别XAU红软基地
worldDraw函数用来生成跟视图无关的几何图形,它只生成一组几何图形,其他的因为视图的变化而导致的几何图形变化都由AutoCAD来自动调整,举个例子,你生成一个立方体,这个立方体从不同的角度看所看到的外形是不一样的,但是worldDraw只生成一个角度的几何图形,其他的都由AutoCAD来自动的调整了。XAU红软基地
viewportDraw则不同,它可以根据不同的视图生成不同的几何图形,当你的视图改变的时候,它自动将几何图形调整到正确的状态。有时候这两个函数需要配合使用,例如,如果你画圆,那就可以用worldDraw,因为无论你怎么变换视图圆还是圆。但是如果你生成一些表示立体的几何图形有时候就需要借助于viewportDraw了,因为对于立体图形来说不同的视图看到的是不一样的。 举个例子来说明其区别就是worldDraw画出来的立体图形,你改变了角度(也算viewport改变)后看到的有可能就不是立体图形了,但是你用viewportDraw画出来的就不会出现这样的问题。XAU红软基地
AcGiWorldDraw与AcGiViewportDrawXAU红软基地
类似,但AcGiViewportDraw有视口相关的矩阵和方向函数XAU红软基地
通过geometry得到绘图类AcGiWorldGeometry 的对象XAU红软基地
通过subEntityTraits得到环境设置类AcGiSubEntityTraits 对象XAU红软基地
AcGiWorldGeometry与AcGiGeometryXAU红软基地
circleXAU红软基地
circularArcXAU红软基地
Polyline(多段线)XAU红软基地
polygonXAU红软基地
textXAU红软基地
pline(多义线,类似于AcDbPolyline)XAU红软基地
AcGiSubEntityTraitsXAU红软基地
常用函数XAU红软基地
 virtual void setColor(const Adesk::UInt16 color) = 0;XAU红软基地
 virtual void setTrueColor(const AcCmEntityColor& color) = 0;XAU红软基地
 virtual void setLayer(const AcDbObjectId layerId) = 0;XAU红软基地
 virtual void setLineType(const AcDbObjectId linetypeId) = 0;XAU红软基地
virtual void setFillType(const AcGiFillType) = 0;XAU红软基地
virtual void setLineWeight(const AcDb::LineWeight lw) = 0;XAU红软基地
virtual void setLineTypeScale(double dScale = 1.0) = 0;XAU红软基地
注意XAU红软基地
一个自定义对象的不同部分可分属不同层XAU红软基地
是否填充只针对circle,polygon等封闭图形XAU红软基地
例1 自定义实体-读写/显示XAU红软基地
生成一等边三角形的自定义实体XAU红软基地
中心XAU红软基地
外接圆半径XAU红软基地
方位角XAU红软基地
自定义对象-夹点XAU红软基地
virtual Acad::ErrorStatus getGripPoints(AcGePoint3dArray& gripPoints, AcDbIntArray& osnapModes, AcDbIntArray& geomIds) const;XAU红软基地
virtual Acad::ErrorStatus moveGripPointsAt( const AcDbIntArray& indices, const AcGeVector3d& offset);XAU红软基地
自定义对象-移动XAU红软基地
virtual Acad::ErrorStatus transformBy( const AcGeMatrix3d& xform);XAU红软基地
自定义对象-拷贝XAU红软基地
virtual Acad::ErrorStatus deepClone(AcDbObject* pOwnerObject, AcDbObject*& pClonedObject, AcDbIdMapping& idMap, Adesk::Boolean isPrimary = true) const;XAU红软基地
virtual Acad::ErrorStatus wblockClone(AcRxObject* pOwnerObject, AcDbObject*& pClonedObject, AcDbIdMapping& idMap, Adesk::Boolean isPrimary = true) const;XAU红软基地
自定义对象-炸开XAU红软基地
virtual Acad::ErrorStatus explode(AcDbVoidPtrArray& entitySet) const;XAU红软基地
自定义对象-捕捉点XAU红软基地
virtual Acad::ErrorStatus getOsnapPoints( AcDb::OsnapMode osnapMode, int gsSelectionMark, const AcGePoint3d& pickPoint, const AcGePoint3d& lastPoint, const AcGeMatrix3d& viewXform, AcGePoint3dArray& snapPoints, AcDbIntArray& geomIds) const;XAU红软基地
自定义对象-范围XAU红软基地
 virtual Acad::ErrorStatus getGeomExtents(AcDbExtents& extents) const;XAU红软基地
自定义对象-listXAU红软基地
作用:调试检查用.XAU红软基地
virtual void list() const;XAU红软基地
自定义对象-相交点XAU红软基地
virtual Acad::ErrorStatus intersectWith(const AcDbEntity* pEnt,AcDb::Intersect intType,AcGePoint3dArray& points,int thisGsMarker = 0,int otherGsMarker = 0) const;XAU红软基地
自定义对象- sub事件XAU红软基地
 virtual Acad::ErrorStatus subErase(Adesk::Boolean erasing);XAU红软基地
 virtual Acad::ErrorStatus subOpen(AcDb::OpenMode mode);XAU红软基地
 virtual Acad::ErrorStatus subClose();XAU红软基地
理解拖动夹点与平移实体的工作方式XAU红软基地
在拖动夹点时,ACAD调用自定义对象重载的moveGripPointsAt函数。但这时你要注意:此时的this指针指向的自定义对象A并非数据库中待修改的对象B,A只是ACAD复制的一个用于操作的临时对象,它的所有持久性(即保存到文件中的)参数与B相同,非持久性参数保持构造函数时的值。A并没有被加入到数据库中,所以在moveGripPointsAt不能通过database()函数获取数据库指针;A中的参数没有累积性,即在moveGripPointsAt中更改了一个类成员变量m的值,下一次调用moveGripPointsAt时,m的值与B中m值相同,而不是修改过的值。XAU红软基地
transformBy与moveGripPointsAt类似。XAU红软基地
本节结束XAU红软基地
下节将介绍自定义对象生成与编缉XAU红软基地
双击修改XAU红软基地
动态生成(Jig)XAU红软基地
属性页XAU红软基地
实体的双击修改XAU红软基地
在ARX工程中:从AcDbDoubleClickEdit派生并重载函数:XAU红软基地
 virtual void startEdit(AcDbEntity *pEnt, AcGePoint3d pt); XAU红软基地
 virtual void finishEdit(void);XAU红软基地
在On_kInitAppMsg中:XAU红软基地
if(!acrxDynamicLinker->loadModule(/*MSG0*/"ACDBLCLKEDITPE.ARX",Adesk::kFalse)) XAU红软基地
 {XAU红软基地
    AfxMessageBox("'ACDBLCLKEDITPE.ARX' Load Failed");XAU红软基地
 }XAU红软基地
 // Initialize Double Click EditingXAU红软基地
 AcDbDoubleClickEdit::rxInit();XAU红软基地
 acrxBuildClassHierarchy();XAU红软基地
 TYTriangleDoubleClickEdit *pTriangleDoubleClickEdit=new TYTriangleDoubleClickEdit;XAU红软基地
 TYTriangle::desc()->addX(AcDbDoubleClickEdit::desc(),pTriangleDoubleClickEdit);XAU红软基地
实体的双击修改XAU红软基地
On_kUnloadAppMsg函数中:XAU红软基地
TYTriangle::desc()->delX(AcDbDoubleClickEdit::desc());XAU红软基地
startEdit函数XAU红软基地
文档加锁XAU红软基地
设置资源XAU红软基地
显示对话框XAU红软基地
修改实体XAU红软基地
文档解锁XAU红软基地
例1:自定义实体的双击修改XAU红软基地
可改:XAU红软基地
外接圆半径XAU红软基地
填充XAU红软基地
动态创建XAU红软基地
AcEdJigXAU红软基地
 virtual DragStatus sampler () ;XAU红软基地
 virtual Adesk::Boolean update () ;XAU红软基地
 virtual AcDbEntity *entity () const ;XAU红软基地
DragStatus drag();XAU红软基地
AcEdJIg中的用户输入函数XAU红软基地
 DragStatus acquireString(char *str);XAU红软基地
    DragStatus acquireAngle(double &ang);XAU红软基地
    DragStatus acquireAngle(double &ang, const AcGePoint3d& basePnt);XAU红软基地
    DragStatus acquireDist(double &dist);XAU红软基地
    DragStatus acquireDist(double &dist, const AcGePoint3d& basePnt);XAU红软基地
    DragStatus acquirePoint(AcGePoint3d&);XAU红软基地
    DragStatus acquirePoint(AcGePoint3d&, const AcGePoint3d&basePnt);XAU红软基地
注意:不能使用acedXXX函数XAU红软基地
AcEdJig:其它函数XAU红软基地
const char* keywordList();XAU红软基地
void  setKeywordList(const char*);XAU红软基地
const char* dispPrompt();XAU红软基地
void setDispPrompt(const char*, ...);XAU红软基地
AcEdJig::CursorType specialCursorType();XAU红软基地
void  setSpecialCursorType(CursorType);XAU红软基地
AcEdJig::UserInputControls userInputControls();XAU红软基地
void setUserInputControls(AcEdJig::UserInputControls);XAU红软基地
例2:动态生成自定义实体XAU红软基地
用向导生成或手工书写XAU红软基地
向导生成的AcEdJig派生类有错:XAU红软基地
头文件中除去ACRX_DECLARE_MEMBERSXAU红软基地
CPP文件中除去ACRX_CONS_DEFINE_MEMBERSXAU红软基地
练习XAU红软基地
自定义实体XAU红软基地
具有N条边的多边形XAU红软基地
画出多边形及外接圆XAU红软基地
可输入边数N和外接圆半径XAU红软基地
动态创建XAU红软基地
在创建过程中显示图形XAU红软基地
在创建过程中显示并可修改尺寸(选作)XAU红软基地
双击修改XAU红软基地
属性页XAU红软基地
优点:XAU红软基地
可批量修改多个实体的属性XAU红软基地
操作步骤少XAU红软基地
与ACAD的已有操作更加一致XAU红软基地
缺点:XAU红软基地
实现有点复杂XAU红软基地
用户操作习惯问题XAU红软基地
生成工程XAU红软基地
标准ATL工程XAU红软基地
生成ATL类XAU红软基地
派生XAU红软基地
接口XAU红软基地
IDLXAU红软基地
DBX中实体类中:XAU红软基地
头文件: XAU红软基地
static bool   s_bHasClsid;XAU红软基地
static CLSID  s_clsid;XAU红软基地
实现:XAU红软基地
initCLSID()XAU红软基地
getClassIDXAU红软基地
属性名称及分组XAU红软基地
GetDisplayNameXAU红软基地
GetCategoryNameXAU红软基地
ShowPropertyXAU红软基地
预定义值XAU红软基地
GetPredefinedStringsXAU红软基地
GetPredefinedValueXAU红软基地
显示对话框XAU红软基地
MapPropertyToPageXAU红软基地
IOPMPropertyDialogXAU红软基地
字典XAU红软基地
字典内可保存多个从AcDbObject派生的对象XAU红软基地
可用于保存全局变量,选项设置XAU红软基地
AcDbDictionary *pNameDict;XAU红软基地
 AcDbDictionary *pNameList;XAU红软基地
 pDb->getNamedObjectsDictionary(pNameDict,AcDb::kForWrite);XAU红软基地
 if (pNameDict->getAt("TYSOFTHNBMCAD_DICT",(AcDbObject*&)pNameList, AcDb::kForWrite) == Acad::eKeyNotFound)XAU红软基地
 {XAU红软基地
  pNameList = new AcDbDictionary;XAU红软基地
  AcDbObjectId DictId;XAU红软基地
  pNameDict->setAt("TYSOFTHNBMCAD_DICT", pNameList, DictId);XAU红软基地
}XAU红软基地
 pNameDict->close();XAU红软基地
 ///打开或创建控制信息对象XAU红软基地
 AcDbObjectId objId;XAU红软基地
 HNBMDictItem *pDictItem;XAU红软基地
 if((pNameList->getAt("TYSOFTHNBMCAD_DICT_ITEM", objId))XAU红软基地
  == Acad::eKeyNotFound)XAU红软基地
 {XAU红软基地
  pDictItem = new HNBMDictItem;XAU红软基地
  Acad::ErrorStatus err=pNameList->setAt("TYSOFTHNBMCAD_DICT_ITEM", pDictItem, objId);XAU红软基地
  if(err!=Acad::eOk)XAU红软基地
  {XAU红软基地
   acutPrintf("\nerror in set archinfo!");XAU红软基地
   delete pDictItem;XAU红软基地
   pNameList->close();XAU红软基地
   return;XAU红软基地
  }XAU红软基地
  pDictItem->close();XAU红软基地
 } XAU红软基地
 pNameList->close();XAU红软基地
AcDbDictionary *pNameDict;XAU红软基地
 AcDbDictionary *pNameList;XAU红软基地
 pDb->getNamedObjectsDictionary(pNameDict,AcDb::kForRead);XAU红软基地
if (pNameDict->getAt("TYSOFTHNBMCAD_DICT",(AcDbObject*&)pNameList, XAU红软基地
  AcDb::kForRead) == Acad::eKeyNotFound)XAU红软基地
 {XAU红软基地
  pNameDict->close();XAU红软基地
  return NULL;XAU红软基地
 }XAU红软基地
 pNameDict->close();XAU红软基地
AcDbObjectId objId;XAU红软基地
 HNBMDictItem *pDictItem;XAU红软基地
 if((pNameList->getAt("TYSOFTHNBMCAD_DICT_ITEM", objId))== Acad::eKeyNotFound)XAU红软基地
 {XAU红软基地
  pNameList->close();XAU红软基地
  return NULL;XAU红软基地
 } XAU红软基地
 pNameList->close();XAU红软基地
if (acdbOpenObject((AcDbObject*&)pDictItem, objId,AcDb::kForRead) == Acad::eOk)XAU红软基地
 {XAU红软基地
  return pDictItem;XAU红软基地
 }XAU红软基地
XAU红软基地
 AcDbLayerTable *pLayerTable;XAU红软基地
 es=pDB->getSymbolTable(pLayerTable, AcDb::kForWrite);XAU红软基地
 if(es!=Acad::eOk)XAU红软基地
 {XAU红软基地
  pLinetypeTable->close();XAU红软基地
  return;XAU红软基地
 }XAU红软基地
 if(!pLayerTable->has("木作线(RoomLine)"))XAU红软基地
 {XAU红软基地
  pLayerTableRecord =new AcDbLayerTableRecord;XAU红软基地
  pLayerTableRecord->setName("木作线(RoomLine)");XAU红软基地
  pLayerTableRecord->setIsFrozen(false);XAU红软基地
  pLayerTableRecord->setIsOff(false);XAU红软基地
  pLayerTableRecord->setIsLocked(false);XAU红软基地
  pLayerTableRecord->setVPDFLT(false);XAU红软基地
color.setColorIndex(3);XAU红软基地
  pLayerTableRecord->setColor(color);XAU红软基地
pLinetypeTable->getAt("Continuous", LinetypeId);XAU红软基地
  pLayerTableRecord->setLinetypeObjectId(LinetypeId);XAU红软基地
  pLayerTableRecord->setLineWeight(AcDb::kLnWtByLwDefault);XAU红软基地
pLayerTable->add(pLayerTableRecord);XAU红软基地
  pLayerTableRecord->close();XAU红软基地
 }XAU红软基地
               pLayerTable->close();XAU红软基地
线型XAU红软基地
 pDB->loadLineTypeFile("DASHED", "acad.lin");//虚线XAU红软基地
 pDB->loadLineTypeFile(“CENTER”, “acad.lin”);//中心线XAU红软基地
AcDbLinetypeTable *pLinetypeTable=NULL;XAU红软基地
 Acad::ErrorStatus es=pDB->getSymbolTable(pLinetypeTable, AcDb::kForRead);XAU红软基地
 if(es!=Acad::eOk)XAU红软基地
  return;XAU红软基地
 AcDbLayerTable *pLayerTable;XAU红软基地
 es=pDB->getSymbolTable(pLayerTable, AcDb::kForRead);XAU红软基地
 if(es!=Acad::eOk)XAU红软基地
 {XAU红软基地
  pLinetypeTable->close();XAU红软基地
  return;XAU红软基地
 }XAU红软基地
        AcDbObjectId LinetypeId;XAU红软基地
 pLinetypeTable->getAt("CENTER", LinetypeId);XAU红软基地
        pLineTypeTable->close();XAU红软基地
文字样式XAU红软基地
 AcDbTextStyleTable *pTextStyleTable=NULL;XAU红软基地
 Acad::ErrorStatus es=pDB->getSymbolTable(pTextStyleTable, AcDb::kForWrite);XAU红软基地
 if(es==Acad::eOk)XAU红软基地
 {XAU红软基地
  if(!pTextStyleTable->has("宋体-35"))XAU红软基地
  {XAU红软基地
   AcDbTextStyleTableRecord *pTextStyleTableRecord=new AcDbTextStyleTableRecord;XAU红软基地
   pTextStyleTableRecord->setName("宋体-35");XAU红软基地
   pTextStyleTableRecord->setFont("宋体", FALSE, FALSE, GB2312_CHARSET, DEFAULT_PITCH|FF_ROMAN);XAU红软基地
   pTextStyleTableRecord->setTextSize(3.5);XAU红软基地
   pTextStyleTableRecord->setXScale(0.8);XAU红软基地
   pTextStyleTable->add(pTextStyleTableRecord);XAU红软基地
   pTextStyleTableRecord->close();XAU红软基地
  }XAU红软基地
if(!pTextStyleTable->has("HZ-35"))XAU红软基地
  {XAU红软基地
   AcDbTextStyleTableRecord *pTextStyleTableRecord=new AcDbTextStyleTableRecord;XAU红软基地
   pTextStyleTableRecord->setName("HZ-35");XAU红软基地
   pTextStyleTableRecord->setFileName("txt.shx");XAU红软基地
   pTextStyleTableRecord->setBigFontFileName("hztxt.shx");XAU红软基地
   pTextStyleTableRecord->setTextSize(3.5);XAU红软基地
   pTextStyleTableRecord->setXScale(0.8);XAU红软基地
   Acad::ErrorStatus es=pTextStyleTable->add(pTextStyleTableRecord);XAU红软基地
   pTextStyleTableRecord->close();XAU红软基地
  }XAU红软基地
  pTextStyleTable->close();XAU红软基地
 }XAU红软基地
扩展数据XAU红软基地
XData 容量受限制,只能存储<=16KXAU红软基地
AcDbObject::xData ()XAU红软基地
AcDbObject::setXData()XAU红软基地
(entget( car ( entsel))' ("*") )XAU红软基地
封装类:AcXdLocalVarXAU红软基地
XRecord 容量不受限制XAU红软基地
本质上没有区别,存贮的都是resbuf结构的链表XAU红软基地
如果对象是自定义实体,存储非图形数据也可以作为该实体对象的属性存储起来XAU红软基地
XDATA举例XAU红软基地
(-3 ("INTECAD_HUST_CAD_CENTER" (1000 . XAU红软基地
"BILLITEM") (1002 . "{") (1000 . "index") (1070 . 1) (1000 . "code") (1000 . XAU红软基地
"C5A") (1000 . "name") (1000 . "E5A") (1000 . "quantity") (1000 . "G5A") (1000 XAU红软基地
. "lineblock") (1005 . "0") (1000 . "circle") (1005 . "21B") (1002 . "}") (1000 XAU红软基地
. "OBJECT") (1002 . "{") (1000 . "OBJECTID") (1000 . "BILLITEM") (1002 . "}"))))XAU红软基地
为一链表,表头为RegAppName,每一节点为一resbuf的结构,此结构为联合数据结构,可存字符串,整数等类型XAU红软基地
 struct  resbuf  *pRb, *pTemp;XAU红软基地
 pRb = pObj->xData("architech_3d_code";);XAU红软基地
 if (pRb != NULL) XAU红软基地
 {XAU红软基地
  // If xdata is present, then walk to the end of the list.XAU红软基地
  for (pTemp = pRb; pTemp->rbnext != NULL; pTemp = pTemp->rbnext)XAU红软基地
   ;XAU红软基地
 } XAU红软基地
 else XAU红软基地
 {XAU红软基地
  //以调用过acdbRegApp(“architech_3d_code”);XAU红软基地
  pRb = acutNewRb(AcDb::kDxfRegAppName);XAU红软基地
  pTemp = pRb;XAU红软基地
  pTemp->resval.rstring = (TCHAR*) new TCHAR[GetArchitechCodeName().GetLength() + 1];XAU红软基地
  _tcscpy(pTemp->resval.rstring, GetArchitechCodeName());XAU红软基地
 }XAU红软基地
// Add user-specified std::TSTDSTRING to the xdata.XAU红软基地
 pTemp->rbnext = acutNewRb(AcDb::kDxfXdAsciiString);XAU红软基地
 pTemp = pTemp->rbnext;XAU红软基地
 pTemp->resval.rstring =  (TCHAR*) new TCHAR[_tcslen(resString) + 1];XAU红软基地
 _tcscpy(pTemp->resval.rstring, resString);XAU红软基地
// The following code shows the use of upgradeOpen() to change the entity from read to write.XAU红软基地
 pObj->upgradeOpen();XAU红软基地
 pObj->setXData(pRb);XAU红软基地
 acutRelRb(pRb);XAU红软基地
XRecord创建XAU红软基地
创建对象的扩展字典XAU红软基地
AcDbObject::createExtensionDictionary();XAU红软基地
AcDbObjectId AcDbObject::extensionDictionary(); XAU红软基地
生成AcDbXrecord并加入字典XAU红软基地
AcDbXrecord *pXrec = new AcDbXrecord XAU红软基地
acdbOpenObject(pDict, dictObjId, AcDb::kForWrite); XAU红软基地
pDict->setAt("ASDK_XREC1", pXrec, xrecObjId); XAU红软基地
用链表填充AcDbXrecordXAU红软基地
pXrec->setFromRbChain(*head);XAU红软基地
反应器XAU红软基地
非持久性(transient Reactor)XAU红软基地
数据库反应器:AcDbDatabaseReactor XAU红软基地
文档反应器:AcApDocManagerReactor XAU红软基地
其它XAU红软基地
持久性(persistent Reactor)XAU红软基地
数据库中的对象之间XAU红软基地
区别:是否能保存到数据库中XAU红软基地
持久反应器-建立XAU红软基地
TYTriangle *pTriangle=new TYTriangle;XAU红软基地
AcDbObjectId TriangleId;XAU红软基地
AppendEntityToDb(pTriangle, NULL, &TriangleId);XAU红软基地
pTriangle->close();XAU红软基地
AcDbLine *pL=new AcDbLine(AcGePoint3d(0, 50, 0), AcGePoint3d(100, 50, 0));XAU红软基地
AppendEntityToDb(pL);XAU红软基地
pL->addPersistentReactor(TriangleId);XAU红软基地
pL->close();XAU红软基地
持久反应器-事件处理XAU红软基地
void TYTriangle::modified        (const AcDbObject* dbObj)XAU红软基地
{XAU红软基地
 if(dbObj->isKindOf(AcDbLine::desc()))XAU红软基地
 {XAU红软基地
  AcDbLine *pLine=AcDbLine::cast(dbObj);XAU红软基地
  AcGeVector3d dir=pLine->startPoint()-pLine->endPoint();XAU红软基地
  double dblAngle=AcGeVector3d::kXAxis.angleTo(dir, AcGeVector3d::kZAxis);XAU红软基地
Adesk::Boolean kWritable;XAU红软基地
  Acad::ErrorStatus es=upgradeFromNotify(kWritable);XAU红软基地
  if(es==Acad::eOk)XAU红软基地
  {XAU红软基地
   if(isWriteEnabled())XAU红软基地
   {XAU红软基地
    SetStartAngle(dblAngle);XAU红软基地
   }XAU红软基地
downgradeToNotify(kWritable);XAU红软基地
  }XAU红软基地
 }XAU红软基地
}XAU红软基地
AutoCAD二次开发特点总结XAU红软基地
ObjectARX:面向对象,功能强大,事实上的工业标准(类似者:ZRX,CRX)XAU红软基地
学习材料丰富,代码多,开发人员多,交流方便,入门容易XAU红软基地
市场需求大XAU红软基地
进入门槛低XAU红软基地
是用于学习和练习C++和CAD开发的不错选择XAU红软基地
~完~XAU红软基地
谢谢各位!XAU红软基地

展开

同类推荐

热门PPT

相关PPT