vba中如何把acaddoc.lspployline变成多个顶点

温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
本文转载自啸百川
原文地址:&&&&原文作者:
转自:CSDN博客:
&ARX(AutoCAD Runtime eXtension实时运行扩展)作为继AutoLISP、ADS后的第三代开发工具,采用全新的面向对象编程技术。
&&&&&& 1985年6月推出的AutoCAD2.17版本使用AutoLISP作为AUTOCAD内嵌语言,与AUTOCAD绑定一起,向用户提供了用AutoLISP设计应用程序的二次开发环境。AutoLISP是种解释型语言,主要用来修改和扩充ACAD的命令及系统菜单、设计对话框驱动程序、实现对图形库的直接访问和修改。这是AUTOCAD提供的第一代开发环境。
&&&&&& 第二代开发环境是R11版本提供的ADS(AUTOCAD Development System)开发系统。该系统实际上向用户提供了用C语言编写应用程序的开发环境。ADS环境用C语言编写,除了可以使用标准C库函数外,还可以使用对AUTOCAD进行操作的ADS函数。ADS虽脱离了AUTOCAD环境,但其编写的程序不能单独运行,只能作为一组外部函数被AUTOLISP装入和调用,实际上就是在AUTOLISP之上包了一层,是AUTOLISP的客户。
如今,在AUTOCAD2000中不再支持ADS开发。ADS已完全被ARX所取代。
&&&&&& AUTOCAD第三代开发环境和工具包括ObjectARX、VBA、Visual LISP。
&&& 存储在AutoCAD数据库的对象(DBObject),包括可见几何实体对象和不可见的非几何对象等,以—组符号表和一个有名对象字典的结构形式组织而成,符号表和数据字典为容器对象(Container Object),包含了其他对象,其作用是组织和管理数据库对象。数据库主要包括有9个符号表和1个对象字典。
在AutoCAD数据库中的9个符号表,分别是:
1)块表(BlockTabLe)
2)尺寸标注样式表(DimStyleTable)
3)层表(LayerTable)
4)线型表(LinetypeTable)&&
5)应用程序注册表(RegAppTable)
6)文字样式表(TextStyleTable)
7)用户坐标系表(UCSTable)
8)视口表(ViewportTable)
9)视图表(ViewTable)
&&& 块表中存储实体的记录称为块表记录,即所有的实体均存储在块表记录中,通常的实体都存储在MODEL_SPACE块中;层表中的记录存储层的有关信息;尺寸标注样式表、层表、线型表和文字样式表等均用来存储相应的表记录。
&&& 有名对象字典是存储一般对象的容器,可用来存储任何数据库对象和子类,主要包括组(GROUP)和多线(MLINE)样式两个数据库字典。用户也可以创建一个新的“用户对象字典”,并存储于对象字典中。 在实际开发中,可以将应用程序的“扩展对象”存放在“用户对象字典”中,“扩展对象”的“扩展记录和数据”通过链表的形式存储在对象字典中,对于该类对象,不另外存储到块表。关于扩展对象,后面有详细说明。
数据库的创建及访问
数据库的初始化
&&&&&& 进入AUTOCAD环境,系统会自动生成一个缺省的数据库,库中包含9个符号表和一个有名对象字典。如,层表有一个0层记录;块表中有“MODEL_SPACE”(模型空间)和“PAPER_SPACE”(图纸空间)两条记录;线型表中有“CONTINUOUS”、“BY_LAYER”和“BY_BLOCK”记录;应用程序注册表中有“ACAD”记录;文字样式表中有“STANDARD”记录;有名对象字典中包含“GROUP字典”和“MLINE字典”,其中“MLINE字典”中有一条“STANDARD”字体样式记录。
基本实体的创建及访问
&&&&&& 图块是若干实体的集合,也是AUTOCAD数据库中的一种对象,通常分为不带属性的简单图块和带属性的复杂图块两种。作为一个整体来看待,以简化操作。
&&&&&& 用户自定义的图块分为“块”和“属性块”两种。块只包含图形信息,属性块还可以包含非图形信息,这些属性信息是块的组成部分之一。属性块必须先用ATTDEF定义属性,然后用BLOCK将其定义为图块的一部分。
简单块的定义
属性块的定义
&&&&&& 属性块是由构成图块的实体和附加信息(属性)组成。定义属性块主要包括块和属性的的定义,块的定义与不带属性块简单块一样,属性的定义主要是通过调用AcDbAtrributeDefinition实现。如下示例代码定义了圆度公差标注符号,其中圆度公差值定义为块的属性,在图块插入时输入,缺省值为0.3。
&&&&&& //1.定义块
&&&&&& OdDbBlockTableRecord *pBTableRec = new OdDbBlockTableRecord();
&&&&&& pBTableRec-&setName();
&&&&&& ….&& ..
&&&&&& OdDbBlockTable *pBTable = pDwgDB-&getBlockTable(pBTable,acdb:kForWrite);
&&&&&& OdDbObjectID
&&&&&& pBTable-&add(id,pBTableRec);
&&&&&& //2.生成组成块的实体:基本线、圆
&&&&&& //基本实体创建过程略
&&&&&& ……
&&&&&& //将实体附到块中
&&&&&& pBTableRec-&appendAcDbEntity(pLine,id);
&&&&&& pBTableRec-&appendAcDbEntity(pCirle,id);
&&&&&& ……
&&&&&& //3.定义块的属性
&&&&&& OdGePoint3d pt(8,1.5,0);
&&&&&& OdDbAtrributeDefinition *pAttDef = new OdDbAtrributeDefinition();
&&&&&& //设置块的属性值 略
&&&&&& pAttDef-&setPoint(pt);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //设置属性位置
&&&&&& pAttDef -&setPrompt(“请输入圆度公差:”);&&&&& //设置属性提示
&&&&&& pAttDef-&setTextString(0.3);&&&&&&&&&&&&&&&&&&&&&&&&&&&& //设置缺省值
&&&&&& pAttDef-&setXXX();
&&&&&& ……
&&&&&& //4。将属性定义加入到图块中
&&&&&& pBTableRec-&appendAcDbEntity(id,pAttDef);
&&&&&& ……
&&&&&& 创建属性实体函数原型:
&&&&&& OdDbAtrributeDefinition{&&&&& const OdDbPoint3d &position,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& const char* text,&&& const char* tag,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& const char* prompt,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& OdDbObjectID style
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& };
参数说明:
Position:&& 属性在WCS坐标系中的位置。
Text:&&&&&&& 属性的缺省值
Tag:&&&&&&&& 属性标签
Prompt:&&& 属性提示
Style:&&&&&& 文字样式ID
简单块的引用
&&&&&& pBlkRef-&setBlockTableRecord(blockid);//设置关联。
属性块的引用
&&&&&& 属性块的引用分成块引用和向插入的块中附加属性信息两步。
&&&&&& 与创建简单块引用一样,将一个属性块插入当前图形的块表记录中并未包含其属性。在块定义中的附加属性信息必须通过调用AcDbBlockReference类的成员函数appendAttribute才能加入到块引用中。块引用方法与前一致,先主要说说属性的插入方法。
&&&&&& 在插入属性时,必须检索出属性块定义的所有附加信息,然后将其附加于块引用的相应实体上,这需要遍历块的所有实体。
&&&&&& 过程如下:
1.得到块引用。
2.遍历块引用中的实体。
3.得到属性实体指针。
4.将属性对象附加给块引用。
对象字典的操作和使用
&&&&&&&&&&&&& 对象字典是一种通用的对象存储容器,它可以存储任何类型的对象,包括其他对象字典、数据库对象和应用程序创建的对象。与符号表相比,对象字典使用比较灵活,它可以实现符号表无法实现的一些特殊功能。
它由三个部分构成:
1.& 组字典(Group Dictionary)
2.& 多线样式字典(Mline Style Dictionary)
3.& 用户定义的对象字典。
前两者为ACAD缺省的数据库对象。用户定义的对象字典一般由应用程序创建。
&&&&&& 组字典
&&&&&&&&&&&&& 组是数据库对象的有序集合,是组字典的成员。从层次关系看,组是管理其所包含对象的容器,而组字典是管理组对象的容器。一个组实可以认为是一个选择集。当组中一个实体被删除时,该实体自动地从组中移出,当恢复被删除实体时,该实体又自动加入到组中。使用组的目的就是为了简化操作,容易实现对一批对象的颜色、层和线型属性的统一修改。
&&&&&& 组字典中包含若干个组。
&&&&&&&&&&&&& 组字典的操作大致步骤如下:
1.通过getGroupDictionary()获得组字典指针。
2.创建组对象new OdDbGroup,并加到组字典中。
3.将实体加入到组对象中。
4.设置各组的属性。
&&&&&&&&&&&&& 多线样式字典的操作及使用
&&&&&&&&&&&&&&&&&&&& 多线是指多条互相平行的直线,其中各条线的颜色、线型和间距等属性可不相同,多线的这些属性由多线样式定义。多线样式作为一个数据库对象存储在多线样式字典中。定义多线样式步骤如下:
&&&&&&&&&&&&&&&&&&&& 1.通过getMLineDictionary获得多线样式字典指针。
2.创建多线样式对象OdDbMLineStyle
3.利用OdDbDictionary成员函数setAt将多线样式对象加入到样式字典中。
3.设置多线样式的属性。如名称、元素属性、多线特性。
&&&&&&&&&&&&& 多线对象
&&&&&&&&&&&&&&&&&&&& 多线实体,是块表记录中的OdDbMline类对象。创建多线对象方法及过程与OdDbLine基本一样。
&&&&&& 用户对象字典操作及使用
&&&&&& 用户在应用程序中定义的字典为用户字典。用户对象字典的特别之处在于它可以包含任何类型的对象。如实体对象、自定义对象和数据对象等。
&&&&&&&&&&&&& 用户对象字典创建步骤:
&&&&&& 1通过getNamedObjectsDictionary得到对象字典指针。
&&&&&& 2定义新的用户对象字典加入到对象字典中。
&&&&&& 如:
&&&&&&&&&&&&& pNamedObj = getNamedObjectsDictionary();
&&&&&&&&&&&&& pDict = new OdDbDictionary();
&&&&&&&&&&&&& pNamedObj-&setAt(“USER_DICT”,pDict,dictID);
&&&&&& 3加入实体对象到用户字典中
&&&&&&&&&&&&& pDict-&setAt(ObjName,pObj,objID);
&&&&&& 通常加入到用户字典中的对象为ACAD的可见对象,该对象已存在于数据库的块表记录中。如果在程序中直接生成实体时,必须先将其加入到块表记录中,然后才能加入到用户字典中。
&&&&&& 扩展记录属于OdDbXRecord类的对象。可用来定义任何类型的数据。扩展记录的数据项采用结果缓冲区链表的形式定义。每项由数据类型(也就是组码)和值组成。
&&&&&& 扩展记录通常用来表示应用程序定义的特定数据。在ACAD中,应用程序可以定义扩展数据xdata和扩展记录。
&&&&&& 扩展记录的创建过程:
&&&&&&&&&&&&& 1.获得对象字典指针。
&&&&&&&&&&&&& 2.新建一个用户字典,并加入到对象字典中。
&&&&&&&&&&&&& 3.创建新的扩展记录,并加入到用户对象字典中。
&&&&&& 如:OdDbXRecord* pRec = new OdDbXRecord();
&&&&&& pDic-&setAt(“USER_DIC”,pRec,recID);
4.用ads_buildlist函数构造由扩展记录数据项组成的缓冲区链表
5.调用setFromRbChain将链表设置到扩展记录中。
示例如下:
//1。获得对象字典指针
OdDbDictionay* pNamedDict = NULL;
pDwgDb-&getNamedObjectsDictionary(pNamedDict,OdDb::kForWrite);
//2.新建一个用户对象字典,并加入到对象字典中。
OdDbDictionary* pDic = new OdDbDictionary();
OdDbObjectID dicID;
pNamedDict-&setAt(“USER_DIC”,pDic,dicID);
//3.创建扩展记录,并加入到用户对象字典中。
OdDbXRecord * pRec= new OdDbXRecord();
OdDbObjectID recID;
pDic-&setAt(“DIC_REC1”,pRec,recID);
//4。创建扩展数据缓冲区,并加入到扩展记录中。
Struct_resBuf* pHead= NULL;
//创建链表数据
//(数据类型,值)数据对形成链表
pHead= buildlist(OdDb::kDxfText,“图号:01-05”, 
&&&&&&&&&&&&&&&&&&&& OdDb::kDxfText,“材料:铸铁”,
&&&&&&&&&&&&&&&&&&&& OdDb::kDxfText,“数量:3件”,
&&&&&&&&&&&&&&&&&&&& OdDb::kDxfReal,,……&&&&&& ,
&&&&&&&&&&&&&&&&&&&& 0);
//将缓冲区存到扩展记录中。
pRec-&setFromRbChain(*pHead);
用户对象(Object)/实体(Entity)&&&&&&&&&&&&& 在ACAD数据库中,用户自定义对象为不可见的数据对象,从 OdDbObject类派生,新建的用户对象,不需作为块表记录加到块表中,通常只加到用户对象字典; 自定义实体为可见的几何对象,从OdDbEntity派生(该类实际上也是OdDbObject的子类),新建用户实体时,除加到用户对象字典外,还需加到块表中。&&&&&&&&&&&&& 在使用用户定义对象前,必须先调用类的虚接口rxInit()对用户类进行初始化.xInit()函数内部完成如下几项工作:1.&&&&&& 登记用户类2.&&&&&& 创建类描述符对象3.&&&&&& 将类描述符对象加入类字典(OdrxClassDictionary,专为存放用户类信息)。(在ObjectARX中,初始化时还调用了acarBuildClassHieranchy()函数将新类添加到ACAD系统的类层次结构中)。如:&&&&&&&& void ExCustObjsModule::initApp()&&&&&&&& {&&&&&&&&& ExCustObject::rxInit();&&&&&&&&& ExCustEntity::rxInit();&&&&&&&&& ExSphere::rxInit();&&& &&&&&&&& }&另外在定义用户对象/实体的头文件和实现文件中,分别利用如下两个宏,以协助xInit()函数完成用户类的登记及相关工作。&&&&&&&& //头文件ODDB_DECLARE_MEMBERS(ExCustObject);&&&&&&&& //定义文件ODRX_DXF_DEFINE_MEMBERS(ExCustObject,&&&&&&&&&&&&&&&&&&&&&&& OdDbObject,&&&&&&&&&&&&&&&&&&&&&&& DBOBJECT_CONSTR,&&&&&&&&&&&&&&&&&&&&&&& OdDb::vAC15,&&&&&&&&&&&&&&&&&&&&&&& OdDb::kMRelease0,&&&&&&&&&&&&&&&&&&&&&&& 0,&&&&&&&&&&&&&&&&&&&&&&& EXCUSTOBJECT,&&&&&&&&&&&&&&&&&&&&&&& ExCustObjs|Description: DWGdirect Run-time Extension Example)&在定义时,不论是定义用户对象还是定义用户实体,都必须重载如下四个虚接口:&&&&&&&& /**& Description:&& Reads the DWG data of this object. &&&&&&&&&& Arguments:&& pFiler (I) Filer object from which data are read.&&&&&&&&& Remarks:&&& Returns the filer status&&&&&&&&& This function is called by dwgIn() to allow the object to read its data.&&&&&&&& When overriding this function:&&&&&& 1) Call assertWriteEnabled(). &&&&&&&&&& 2) Call the parent class's dwgInFields(pFiler). &&&&&&&&& 3) If it returns eOK, otherwise return whatever the parent's dwgInFields(pFiler) returned. &&&&&&&&& 4) Call the OdDbDwgFiler(pFiler) methods to read each of the object's data items in the order they were written.&&&&&&&&& 5) Return pFiler-&filerStatus().&&&&&&&&&&&&&&& */&&& virtual OdResult dwgInFields( OdDbDwgFiler* pFiler);&&/**Description: Writes the DWG data of this object. &&&&&&&& Arguments: pFiler (I) Pointer to the filer to which data are written.&&& Remarks:&& Returns the filer status.&&& This function is called by dwgIn() to allow the object to write its data.&&& When overriding this function:&&&& 1) Call assertReadEnabled(). &&&&&&&& 2) Call the parent class's dwgOutFields(pFiler). &&& 3) If it returns eOK, otherwise return whatever the parent's dwgOutFields(pFiler) returned. &&& 4) Call the OdDbDwgFiler(pFiler) methods to write each of the object's data items in the order they were written.&&& 5) Return pFiler-&filerStatus(). */&&&&&& virtual OdResult dwgOutFields(OdDbDwgFiler* pFiler);&&virtual OdResult dxfInFields(OdDbDxfFiler* pFiler);virtual OdResult dxfOutFields(OdDbDxfFiler* pFiler);&另外,自定义对象和自定义实体根据实现不同的功能和需要,将重载不同的接口,:&&&&&&&&&&&&& 1.自定义对象:根据功能需要,可能需重载的函数&&&&&&&& /** Description:&&& Perform an *audit* operation on this object.&&& Arguments:&&& pAuditInfo (I) Pointer to an OdDbAuditInfo object.&&& Remarks: When overriding this function for a custom class, first call OdDbObject::audit(pAuditInfo)& to&&&&& validate the *audit* operation. */&& &&&&&& virtual void audit( OdDbAuditInfo* pAuditInfo);&&&&&& &&&&&&&& /**&& Description:&&& Called as the first operation as this object is being closed, for&&& *database* -resident objects only. &&&& Remarks:&& This function is notified just before the current open operation is to be closed, giving this&&&&&&&&&&& function the ability to cancel the close.&&&&&& Returns Od::eOk if and only if close() is to continue.**/virtual void subClose();&&&&&&&&& /**&& Description:&& Performs a deep *clone* of this object.&&&&&&&&&&& Arguments:&& ownerIdMap (I) Owner's ID map.&&&&&&&&&&&&&& Remarks:&& Returns a smart pointer to the newly created *clone*,and adds a record to the specified ID map.**/&&& virtual OdDbObjectPtr deepClone(OdDbIdMapping& ownerIdMap)&&&&&& &&&&&&&& /** Description: Performs a shallow *clone* of this object. &&&&&&&&&&&&& Arguments: ownerIdMap (I) Owner's ID map.&&&&&&&&&&&&&&&& Remarks: Returns a smart pointer to the newly created *clone*, and adds a record to the specified ID map.*/&&&&&& virtual OdDbObjectPtr wblockClone(OdDbIdMapping& ownerIdMap)virtual OdResult subErase(bool erasing);virtual void subHandOverTo( OdDbObject* newObject);virtual void subOpen( OdDb::OpenMode mode);virtual void subSwapIdWith(&& const OdDbObjectId& otherId, bool swapXdata&&&&&&& = false,&& bool swapExtDict = false);&&&&&&&&&&&&&& 2.自定义实体由于自定义实体,为可见对象,则必须重载如下接口://绘制自定义实体,用于实体的显示//模型空间的显示&&&&&& virtual bool worldDraw( OdGiWorldDraw* pWd)//视图关联的显示&&&&&& virtual void viewportDraw( OdGiViewportDraw* pVd)&&&&&&& //当自定义实体作为代理对象保存时,则需重载saveas()接口(该接口在DWGdirect中未实现):&&&&&& virtual void saveAs(OdGiWorldDraw* mode, OdDb::EntSaveAsType st);&&&&&&& /** Description: Returns the WCS geometric *extents* of this entity.&&& Arguments: extents (O) Receives the *extents*.&&& The *extents* are the WCS corner points of a box, aligned with the WCS axes, that encloses the 3D *extents* of this entity.&&& *///包含实体的长方体的顶点,也即实体所占的空间&virtual OdResult getGeomExtents(&&& OdGeExtents3d& extents)&&&&&&&& &&&&&&&& /*&&& Description:&& Applies the 3D transformation matrix to this entity.&&&&&&&& */&&&&&& virtual OdResult transformBy( const OdGeMatrix3d& xfm);&&&&&& &&&&&&&& /** Description:&& Creates a copy of this entity, and applies the supplied transformation&&& to the newly created copy.&&&&& */&virtual OdResult getTransformedCopy( const OdGeMatrix3d& xfm,&&&&&&&&&&&&&& OdDbEntityPtr& pCopy)&&&&&&&&& /** Description:&& Returns all grip points of this entity.&&&&&&&& */&virtual OdResult getGripPoints( OdGePoint3dArray& gripPoints )&&&&&&& /**&& Description:&& Moves the specified grip points of this entity&&& Remarks:&&& Each element in gripPoints has a corresponding entry in indices, which specifies&&&&&&& the index of& the grip point as returned by getGripPoints.&&&&&&&&&& */ &virtual OdResult moveGripPointsAt(&& const OdGePoint3dArray& gripPoints, &&&&&&&&&&&&&&&&&&&&&&&&&&&&&& const OdIntArray& indices );&&&&&&&&& /** Description:&& Explodes this entity into a set of simpler entities. &&&& Note:&& Entities resulting from the explosion are appended to the specified array.&&&&&&& The newly created entities are not *database* resident.&&&&&&& The default implementation of this function returns eNotApplicable. This f&& unction can be&&& overridden in custom classes. */&virtual OdResult explode(OdRxObjectPtrArray& entitySet)&//高亮显示,DWGdirect未实现.&virtual void highlight(const OdDbFullSubentPath& subId = OdDb::kNullSubent,const bool highlightAll = false)&virtual void unhighlight(const OdDbFullSubentPath& subId = kNullSubent,&&& const bool highlightAll = false)&根据需要,可能要重载的函数&/** Description: Returns all appropriate object snap points of this entity.&&& osnapMode will be one of the following: */ &virtual OdResult getOsnapPoints(&&& OdDb::OsnapMode osnapMode, &&& int gsSelectionMark, &&& const OdGePoint3d& pickPoint,&&& const OdGePoint3d& lastPoint, &&& const OdGeMatrix3d& viewXform, &&& const OdGeMatrix3d& ucs, &&& OdGePoint3dArray& snapPoints )&&/** Description:&&& Returns all stretch points of this entity. */&virtual OdResult getStretchPoints(&& OdGePoint3dArray& stretchPoints )&&/** Description:&& Moves the specified stretch points of this entity.&virtual OdResult moveStretchPointsAt( const OdGePoint3dArray& stretchPoints, &&& const OdIntArray& indices ); &&3.用户对象简单示例://声明自定义对象class EXCUSTOBJEXPORT ExCustObject : public OdDbObject{&&&&&&&& static const int lastKnownV&&&&&&&& UINT m_nCustVpublic:&// Macro to declare&ODDB_DECLARE_MEMBERS(ExCustObject);&ExCustObject();&virtual ~ExCustObject();&static int getVersion();&&// Methods to override&OdResult dwgInFields(OdDbDwgFiler* pFiler);&void dwgOutFields(OdDbDwgFiler* pFiler)&OdResult dxfInFields(OdDbDxfFiler* pFiler);&void dxfOutFields(OdDbDxfFiler* pFiler)};&&& //定义ODRX_DXF_DEFINE_MEMBERS(ExCustObject,&&&&&&&&&&&&&&&&&&&&&&& OdDbObject,&&&&&&&&&&&&&&&&&&&&&&& DBOBJECT_CONSTR,&&&&&&&&&&&&&&&&&&&&&&& OdDb::vAC15,&&&&&&&&&&&&&&&&&&&&&&& OdDb::kMRelease0,&&&&&&&&&&&&&&&&&&&&&&& 0,&&&&&&&&&&&&&&&&&&&&&&& EXCUSTOBJECT,&&&&&&&&&&&&&&&&&&&&&&& ExCustObjs|Description: DWGdirect Run-time Extension Example)&const int ExCustObject::lastKnownVersion = 2;//读OdResult ExCustObject::dwgInFields(OdDbDwgFiler* pFiler){&OdDbObject::dwgInFields(pFiler);&m_nCustValue = pFiler-&rdInt32();& return eOk;}//写void ExCustObject::dwgOutFields(OdDbDwgFiler* pFiler) const{&&&&&&&& OdDbObject::dwgOutFields(pFiler);&&&&&&&& pFiler-&wrInt32(m_nCustValue);}&&&4.用户实体简单示例://声明自定义实体class EXCUSTOBJEXPORT ExCustEntity : public OdDbCircle{&static const OdInt16 lastKnownV&OdInt16 m_nCpublic:&// Macro to declare&ODDB_DECLARE_MEMBERS(ExCustEntity);&&ExCustEntity();&virtual ~ExCustEntity();&&// Methods to override//读写&&&&& OdResult dwgInFields(OdDbDwgFiler* pFiler);&&&&&&&& void dwgOutFields(OdDbDwgFiler* pFiler)&&&&& OdResult dxfInFields(OdDbDxfFiler* pFiler);&&&&& void dxfOutFields(OdDbDxfFiler* pFiler)& //绘制&&&&&&&& bool worldDraw(OdGiWorldDraw * pWd)};&//定义ODRX_DXF_DEFINE_MEMBERS(ExCustEntity,&&&&&&&&&&&&&&&&&&&&&&& OdDbCircle,&&&&&&&&&&&&&&&&&&&&&&& DBOBJECT_CONSTR,&&&&&&&&&&&&&&&&&&&&&&& OdDb::vAC15,&&&&&&&&&&&&&&&&&&&&&&& OdDb::kMRelease0,&&&&&&&&&&&&&&&&&&&&&&& OdDbProxyEntity::kAllAllowedBits,&&&&&&&&&&&&&&&&&&&&&&& EXCUSTENTITY,&&&&&&&&&&&&&&&&&&&&&&& ExCustObjs|Description: DWGdirect Run-time Extension Example)&const OdInt16 ExCustEntity::lastKnownVersion = 1;&OdResult ExCustEntity::dwgInFields(OdDbDwgFiler* pFiler){&OdResult res = OdDbCircle::dwgInFields(pFiler);&if (res != eOk)&{&&&&}&&m_nCount = pFiler-&rdInt16();&return eOk;}&void ExCustEntity::dwgOutFields(OdDbDwgFiler* pFiler) const{&OdDbCircle::dwgOutFields(pFiler);&pFiler-&wrInt16(m_nCount);}&//绘制实体bool ExCustEntity::worldDraw(OdGiWorldDraw * pWd) const{&assertReadEnabled();&OdGePoint3d ptCenter(center());&OdGeVector3d vNormal(normal());&double dRadius = radius();&int nCount = m_nC&&OdDbHatchPtr pHatch = OdDbHatch::createObject();&// Set the hatch properties.&pHatch-&setPropertiesFrom(this);&pHatch-&setAssociative(false);&pHatch-&setPattern(OdDbHatch::kPreDefined, "ANGLE");&pHatch-&setHatchStyle(OdDbHatch::kNormal);&pHatch-&setNormal(vNormal);&pHatch-&setElevation(ptCenter.z);&EdgeArray edgeP&if (nCount & 1)&{&&& pWd-&geometry().circle(ptCenter, dRadius, vNormal);&&& OdGeCircArc2d *cirArc = new OdGeCircArc2d(OdGePoint2d(ptCenter.x, ptCenter.y), dRadius);&&& edgePtrs.append(cirArc);&&& pHatch-&appendLoop(OdDbHatch::kDefault, edgePtrs);&}&else&{&&& OdGeVector3d vDisp(radius(), 0., 0.);&&& double step = Oda2PI / nC&&& while (nCount--)&&& {&&&&& OdGePoint3d ptC(ptCenter + vDisp);&&&&& pWd-&geometry().circle(ptC, dRadius, vNormal);&&&&& vDisp.rotateBy(step, vNormal);&&&&& OdGeCircArc2d *cirArc = new OdGeCircArc2d(OdGePoint2d(ptC.x, ptC.y), dRadius);&&&&& edgePtrs.resize(0);&&&&& edgePtrs.append(cirArc);&&&&& pHatch-&appendLoop(OdDbHatch::kDefault, edgePtrs);&&& }&}&pHatch-&worldDraw(pWd);&}&&&&&&&&&&&&& &代理对象/实体(OdDbProxyObject/OdDbProxyEntity)&&&&&&&&&&&&& 代理对象/实体是AutoCad在内存中创建的,作为自定义对象/实体的一个代理数据容器。当AUTOCAD读取一个包含不可能实例化的用户自定义对象/实体的文件时(也就是定义用户对象/实体的二次开发模块未加载),ACAD就自动为自定义实体和对象创建代理对象/实体。但如果加载了可以实例化自定义对象的二次开发模块后,代理对象/实体就可恢复为自定义对象/实体。代理通常存在于系统的内存中,只是个中间过渡数据。&&&&&&&&&&&&& 可以将代理对象/实体看成一个包含用户对象的块包,就是对用户对象属性和数据的一个封装。写入文件时,如果二次开发模块未加载,代理包就自动进行串行化保存,通常情况下,写入的数据与读取的数据一致,不包含代理对象的数据,如果保存前后文件类型不同时(dwg\dxf),写入时将整个代理对象数据写到文件中。&代理实体显示&&&&&&&&&&&&& 如果二次开发模块未加载,ACAD就不能使用自定义实体的worldDraw()或viewportDraw()函数来显示代理实体,但可以利用自定义实体的图形元文件中的信息,这些信息包含实体最后一次保存文件时,继承于worldDraw()函数或saveAs()函数的数据。显示格式分:实体和边界框两种。&&&&&&&&&&&&&& 五种坐标系&&&&&& 1.世界坐标系(WCS)&&&&&&&&&&&&& 是其它坐标系的参照坐标系,其他坐标系都相对于它定义的(是种概念坐标系.)&2.用户坐标系(UCS)&&&&&&&&&&&&& 是一种工作坐标系,通常,ACAD内部存储或参数传递的点都是UCS坐标点.&3.实体坐标(ECS)&&&&&&&&&&&&& 为了减少存储空间,而设置的坐标系,在ACAD中,不能直接该坐标的点,必须先转换成UCS点.&4.显示坐标系(DCS).&5.图纸空间坐标系(PSDCS).&&&
视图、视口
&&&&&& 图形屏幕上用于显示图形的一个矩形区域称为视口,通常可以把整个图形屏幕作为一个视口,也可以将屏幕设置成多个视口。视口中的图形称为视图。利用视图管理技术,可以把当前视口中复杂的图形按不同的窗口大小设置,并以视图名为标识保存在数据库中。在需要时,显示指定视图以满足对图形编辑和浏览的需求。
&&&&&& 视图作为视图表OdDbViewTable中一条视图记录OdDbViewTableRecord保存在数据库中。把当前视口中指定窗口内的图形定义为一个新的视图操作过程如下:
&&&&&& 1.创建视图类对象OdDbViewTableRecord
&&&&&& 2.设置视图属性:名、中心点、高、宽
&&&&&& 3.获得视图表OdDbViewTable指针。并将视图记录加入其中。
&&&&&&&&&&&&&&&&&&&& 附加
&&&&&&&&&&&&&&&&&&&& 三维实体造型
&&&&&&&&&&&&&&&&&&&&&&&&&&& ACAD三维造型包括线框模型、表面模型和实体模型三种形式。ACADR14版本后,三维造型核心采用ACIS(Amercian Committee for Interoperable)平台来生成和编辑三维实体。
&&&&&&&&&&&&&&&&&&&& 基本三维实体生成方法
&&&&&&&&&&&&&&&&&&&&&&&&&&& 三维实体属于OdDb3dSolid类对象。对于一个具体的几何实体,即ACIS对象来说,OdDb3dSolid是个容器和接口,通过其接口可生成基本的三维实体及实体的布尔运算。
&&&&&& 基本三维实体指:长方体Box、平截头体Frustum、球体Sphere、圆环体Torus、锲体Wedge等。
1、& 长方体
&&&&&&&&&&&&& createBox()
&&&&&&&&&&&&& 参数:长、宽、高。生成长方体中心为WCS的原点。
2、& 平截头体(圆柱、圆锥、椭圆锥)
&&&&&&&&&&&&& createFrustum()
&&&&&&&&&&&&& 参数:高度、X半径、Y半径、顶端半径
&&&&&&&&&&&&& XY半径相同,顶端半径为0,则为圆锥体。
&&&&&&&&&&&&& XY半径不相等,顶端半径为0,则为椭圆锥。
&&&&&&&&&&&&& 顶端半径不为0,则为圆柱或椭圆柱。
&&&&&&&&&&&&& createSphere()
&&&&&&&&&&&&& 参数:球体半径。
4、& 圆环体
&&&&&&&&&&&&& createTorus()
&&&&&&&&&&&&& 质心在WCS原点,Z轴为中心轴。
&&&&&&&&&&&&& 参数:圆环半径和圆管半径。
&&&&&&&&&&&&& CreateWedge()
&&&&&&&&&&&&& 长宽高分别与XYZ轴平行。
&&&&&&&&&&&&& 参数:长、宽、高
&&&&&& 有上述函数可创建中心点在WCS原点的简单实体。要将实体在指定位置生成,则必须进行坐标变换。如,方向矢量:
&&&&&& OdGeVector3d X(1,0,0),Y(0,1,0),Z(0,0,1)
表示所定义的新坐标系统与原WCS坐标系统的XYZ轴平行。
三维变换矩阵是用OdDbMatrix3d类的成员函数:
OdDbMatrix3d& setCoordSystem{
Const OdDbPoint& origin,
Const OdDbVector3d& e0,
Const OdDbVector3d& e1,
Const OdDbVector3d& e2&&&&
&&&&&& Origin表示新坐标系统的原点。
&&&&&& e0\e1\e2表示XYZ坐标轴的方向矢量
(一个矩阵可看成一个新坐标系统的表示形式,由新的坐标原点和XYZ坐标轴方向矢量构成一个矩阵,也即一个新的坐标系统,根据新的坐标系统,就可推算出实体新的坐标值)
&&&&&& 变换
&&&&&& transformBy(const OdDbMatrix3d& xform)
&&&&&& 该函数功能是将生成的三维实体按三维几何变换矩阵变换。也就是将实体的控制点或特征点进行变换,其拓扑特性保持不变。
基于二维对象生成三维实体
&&&&&& 在二维对象的基础上,通常用拉伸(挤出)或旋转的方法生成三维实体。
拉伸或挤出
&&&&&& 是指在圆、椭圆或封闭多线段PloyLine等对象基础上,按拉伸或挤出高或指定路径生成三维实体。这种方法可以满足一些简单的实体造型:
1.&&&&&&&&&&&&& 给定高度拉伸或挤出
Const OdDbRegion* pRegion,
Double height,
Double taper
Region表示面域对象的指针;
&&&&&&&&&& 面域对象可以理解为由线条组成的一个封闭的区域。
Height高度
2.&&&&&&&&&&&&& 指定路径拉伸或挤出
&&&&&& extrudeAlongPath{
&&&&&& const OdDbRegion* pRegion,
&&&&&& const OdDbCurve* path
&&&&&& Path为&&& 挤出路径,必须是&&&&&& OdDbLine,OdDbArc,OdDbCircle,OdDbEllipse,OdDbSpline,OdDb2DployLine或非样条拟合的OdDb3dPloyLine对象。
&&&&&& 并、交、差。
&&&&&& 是指在圆、椭圆、封闭的二维多段线的基础上按指定轴旋转,从而生成三维实体。
&&&&&& Const OdDbRegion* pRegion,
&&&&&& Const OdGePoint3d& axisPoint,
&&&&&& Const OdGeVection3D& axisDir,
&&&&&& Double Angle
axisPoint轴上一点。
axisDir轴方向矢量。
Angle旋转角度。
拉伸实体生成过程如下:
&&&&&&&& (凸度值:在生成多段线对象时,该值为0,表示线与线以直线相连接;为1,表示与弧线连接)&&&&
&&&&&&&&&&&&&&& 1.确定三维坐标点数组。
&&&&&& 2.根据点,生成封闭的多段线,设置多线段法向矢量(0,0,1),通常于Z轴平行
&&&&&& 3.根据多线段对象获得封闭边界线指针数组
&&&&&& 4.根据封闭边界,生成面域对象。
&&&&&& 5.然后根据面域对象和高度,拉伸生成三维实体。
三维实体布尔运算
&&&&&& 以上通过拉伸和旋转只能生成简单的实体,对于复杂的实体必须通过布尔运算才能实现。
&&&&&& 1.并(UNION):求两个或两个以上实体的并集,即合并为一个实体&&&&&&&&&&&
&&&&&& 2.交(INTERSECTION):求两个或两个以上实体的交集,即生成实体的公共部分。
&&&&&& 3.差(SUBTRACT):将一个实体集从另一个实体集减去。
布尔运算原型:
BooleanOper{
&&&&&& OdDb::BooleanOperType operator,
&&&&&& OdDb3dSolid *pSolid
&&&&&& Operator 取值为OdDb::kBoolUnion,OdDb::kBoolIntersect,OdDb::kBoolSubtract,分别表示并、交、差运算。
&&&&&& pSolid为参加布尔运算的实体指针。
复杂零件的造型
&&&&&& 对于实体表面为空间曲面构成的零件,如斜齿轮的齿廓表面,对这类复杂的零件用简单的并、交和差运算方法来造型难以达到要求,在这种情况下,宜采用机械加工的方法来构造零件的实体模型。步骤如下:
&&&&&& 1.分别定义零件毛坯和加工刀具的OdDb3dSolid类对象。
&&&&&& 2.利用变换矩阵将刀具移至毛坯位置。
&&&&&& 3.调用booleanOper进行差运算,毛坯实体减去刀具实体,也就是除去被加工的部分
&&&&&& 4.循环重复差运算,直到完成全部加工。
示例:蜗杆齿轮造型
刀具的生成:
&&& OdDbPolyLine * poly = new OdDbPolyline();
&&& For(int I =0; i&5;i++)
&&&&&&&&&& //pt2d[]为各顶点的数组
&&&&&&&&&& Poly-&addVertexAt(I,pt2d[i],(i==3)?0.315:0,0,0)
&&&&&&&&&& //参数分别为顶点序号、坐标值、凸度值、起点和终点的宽度
&&&&&&&&&& //凸度值表示当前顶点与下一顶点的连接形式,0为直线连接,非0为圆&&&&&&&&&&&&&&&&&&&&&&& //弧连接,其值0.315为圆弧半径。
&&& Poly-&setNormal((0,0,1));//设置方向矢量
经如上过程形成封闭多段线,随后就可求出封闭边界构成的面域对象,旋转revolve()生成刀具实体。实现代码略。
毛坯的生成:
&&& 通过圆拉伸造型,生成圆柱体,过程略。
&&& 初始状态下,圆柱体的质心在WCS原点,Z轴为轴线,为便于运算,将其转换为以X轴为轴线,则方向适量设置为:
&&& OdDbVector3d x1(0,0,1),y1(0,1,0),z1(1,0,1)
绕X轴旋转,则方向矢量相应设置为:
&&& X1.set(1,0,0)
&&& Y1.set(0,cos(a),sin(a));
&&& Z1.set(0,-sin(a),cos(a))
a为旋转角度。
加工造型过程:
刀具的移动和圆柱体的旋转是通过变换矩阵实现,伪码例如:
&&&&&&&&&& OdDb3dMatrix mat,mat1;
&&&&&&&&&& Mat.setCoordSystem(pt,x,y)
&&&&&&&&&& Mat.setCoordSystem(pt1,x1,y1)
&&&&&&&&&& //使圆柱体饶X轴旋转
&&&&&&&&&& p3dSolid-&transformBy(mat);
&&&&&&&&&& //使刀具移到加工位置
&&&&&&&&&& p3dSolid1-&transformBy(mat1);
//减去加工刀具
p3dSolid-&booleanOper(OdDb::kBoolSubtract, p3dSolid1);
阅读(1603)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_094069',
blogTitle:'【引用】ObjectARX开发基本知识',
blogAbstract:'和大家分享这篇日志,我的看法是:
&原文地址:
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}}

我要回帖

更多关于 vba 列数字变成字母 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信