objectARX说明函数
- 格式:doc
- 大小:395.00 KB
- 文档页数:63
objectartx 钩子函数钩子函数,也称为钩子回调函数、钩子操作函数,是一种在特定事件或函数执行前、后执行的特殊函数,用于修改或扩展原始函数的功能或数据。
在面向对象编程中,钩子函数通常与模板方法模式、观察者模式、责任链模式等设计模式结合使用,使得程序具有更高的扩展性和灵活性。
钩子函数分类根据钩子函数的执行时机,可将钩子函数分为:预处理钩子、后处理钩子和命令钩子。
预处理钩子:在函数执行前执行,用于修改或验证参数、检查状态等,例如:BeforeSave、BeforeInsert、BeforeUpdate、BeforeDelete等。
命令钩子:用于执行特定的命令或任务,例如:OnDraw、OnKeyPress、OnMouseMove、OnMouseClick等。
钩子函数广泛应用于各种软件和系统中,如操作系统、IDE、数据库管理系统、游戏引擎、Web框架等。
操作系统中的钩子函数通常用于拦截和处理一些系统级操作,如键盘钩子、鼠标钩子、窗口钩子等,可以用于实现热键、游戏辅助、屏幕录制等功能。
IDE中的钩子函数通常用于扩展和定制IDE功能,如代码补全、调试器、协作编辑等,可以用于实现自动化测试、代码审查、代码生成等功能。
数据库管理系统中的钩子函数通常用于控制和修改数据库操作,如表级触发器、行级触发器、存储过程等,可以用于实现数据同步、数据备份、数据加密等功能。
Web框架中的钩子函数通常用于扩展和定制Web应用程序,如前置中间件、后置中间件、过滤器等,可以用于实现认证授权、请求转发、缓存控制等功能。
以下是一个在Web框架中使用钩子函数实现认证授权的例子:```pythonfrom functools import wrapsfrom flask import request, abortdef requires_auth(f):@wraps(f)def decorated(*args, **kwargs):auth = request.authorizationif not auth or not check_credentials(ername, auth.password): abort(401)return f(*args, **kwargs)return decorated@app.route('/protected')@requires_authdef protected_view():return 'This is a protected view.'```钩子函数的定义在“@requires_auth”装饰器中,它接受一个函数作为参数,并返回一个新的函数“decorated”,用于检查认证信息。
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 入门第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编程?也许其主要原因是要求灵活性和扩充功能。
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。
一、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 中打开与关闭对象 (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()函数就是如此。
第⼆章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通信的全局函数。
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折线不封闭, 无法形成正确的区域。