使用ObjectARX在AutoCAD2002中画圆

30 篇文章 2 订阅
24 篇文章 2 订阅

     AutoCAD中有三种方法可以画圆:“圆心、半径”法画圆、“两点”法画圆、“三点”法画圆。下面采用这三种方法,使用ObjectARX在AutoCAD2002中画圆。

1)使用ObjectARX向导创建一个项目,名称为CreateEnt4,勾选使用“Use MFC”。如下图所示:



图(1)勾选“Use MFC”

2)选择【Insert/New Class】菜单项,系统会弹出如图2.8所示的对话框。输入CCreateEnt作为新类的名称,单击【OK】按钮创建新类。使用同样的方法,创建一个名为CmodifyEnt的类。如下图所示:


图(2)添加一个类CCreateEnt,类CmodifyEnt也是一样。

3)在CCreateEnt 和CModifyEnt 类的头文件中,分别添加包含头文件的语句:
         #include "StdArx.h"
     然后在StdArx.h 文件中,添加下面的包含语句:
               #include "dbents.h"

      如图(3)、图(4)所示:


图(3)在CreateEnt.h中添加对StdArx.h的引用,同理,在ModifyEnt.h中也要添加对StdArx.h的引用


图(4)在StdArx.h中添加对dbents.h的引用

4)2)在CCreateEnt 类中,添加一个新的函数CreateCircle,该函数直接封装AcDbCircle类的构造函数,其声明和实现分别为:

//声明部分在CreateEnt.h文件中

static AcDbObjectId CreateCircle(AcGePoint3d ptCenter,
		AcGeVector3d vec,double radius);

//实现部分在CreateEnt.cpp文件中

//添加一个圆
AcDbObjectId CCreateEnt::CreateCircle(AcGePoint3d ptCenter, AcGeVector3d vec,double radius)
{
	AcDbCircle *pCircle=new AcDbCircle(ptCenter,vec,radius);
	//将实体添加到图形数据库中
	AcDbObjectId circleId;
	circleId=CCreateEnt::PostToModelSpace(pCircle);
	return circleId;
}
5)在CCreateEnt 类中,再添加一个新的函数CreateCircle(这就使用了函数重载的概念),用于创建位于XOY 平面上的圆(一般创建的二维图形都是在XOY 平面上),其声明和实现分别为:
//声明部分

static AcDbObjectId CreateCircle(AcGePoint3d ptCenter,double radius);

//实现部分

AcDbObjectId CCreateEnt::CreateCircle(AcGePoint3d ptCenter,double radius)
{
	AcGeVector3d vec(0,0,1);
	return CCreateEnt::CreateCircle(ptCenter,vec,radius);
}

     代码相当简单,区别就在于输入了一个代表XOY 平面的法向矢量。

6)在项目中添加一个新类CCalculation,用于封装计算的相关函数。添加两个重载静态函数MiddlePoint,用于计算两点连线的中点:

//计算直线的中点
AcGePoint2d CCalculation::MiddlePoint(AcGePoint2d pt1,AcGePoint2d pt2)
{
	AcGePoint2d pt;
	pt[X]=(pt1[X]+pt2[X])/2; //X、Y都要大写
	pt[Y]=(pt1[Y]+pt2[Y])/2;

	//创建圆
	return pt;
}
AcGePoint3d CCalculation::MiddlePoint(AcGePoint3d pt1,AcGePoint3d pt2)
{
	AcGePoint3d pt;
	pt[X]=(pt1[X]+pt2[X])/2;
	pt[Y]=(pt1[Y]+pt2[Y])/2;
	pt[Z]=(pt1[Z]+pt2[Z])/2;
	return pt;
}

7)在CCreateEnt 类中,添加一个两点法创建圆的函数:

//用两点画圆
AcDbObjectId CCreateEnt::CreateCircle(AcGePoint2d pt1,AcGePoint2d pt2)
{
	//计算圆心和半径
	AcGePoint2d pt=CCalculation::MiddlePoint(pt1,pt2);
	AcGePoint3d ptCenter(pt[X],pt[Y],0);//圆心
	double radius=pt1.distanceTo(pt2)/2;
	//创建圆
	return CCreateEnt::CreateCircle(ptCenter,radius);
}

         上面的代码中,调用CCalculation::MiddlePoint 函数来获得两点连线的中点,也就是圆心;
AcGePoint2d::distanceTo 函数用于计算两点之间的距离。

8)使用几何类来实现三点法画圆的函数。在ObjectARX 中提供了一个以AcGe 开头的类库(一般称为几何类),用来完成一些计算工作,关于几何类会在详细介绍,这里使用了AcGeCircArc3d 类来完整需要的工作。这里需要引入两个头文件:#include "gearc3d.h" 和 #include "gearc2d.h"

//三点画圆
AcDbObjectId CCreateEnt::CreateCircle(AcGePoint2d pt1,AcGePoint2d pt2, AcGePoint2d pt3)
{
	//使用几何类
	AcGeCircArc2d geArc(pt1,pt2,pt3);
	AcGePoint3d ptCenter(geArc.center().x,geArc.center().y,0);
	return CCreateEnt::CreateCircle(ptCenter,geArc.radius());
}
AcGeCircArc2d 类能够创建一个几何类的圆弧对象,该对象仅用来计算,不能在图形窗口中显示。AcGeCircArc2d 类有四个构造函数,其中一个构造函数可以根据三个点创建圆弧,这里正是使用该函数创建了几何类的圆弧

构建几何类的圆弧之后,就可以查询该对象的圆心、所在平面、半径等特性,将这些参数传递到创建圆的函数中,就可以实现三点法创建圆。

9)在项目中注册一个新命令AddCircle,对几个创建圆的函数进行测试,该命令的实现函数为:

// This is command 'ADDCIRCLE'
void WhCHAP2ADDCIRCLE()
{
	// TODO: Implement the command
	//"圆心、半径"方法画圆
	AcGePoint3d ptCenter(100,100,0);
	CCreateEnt::CreateCircle(ptCenter,20);

	//两点法画圆
	AcGePoint2d pt1(70,100);
	AcGePoint2d pt2(130,100);
	CCreateEnt::CreateCircle(pt1,pt2);

	//三点法画圆
	pt1.set(60,100);
	pt2.set(140,100);
	AcGePoint2d pt3(100,60);
	CCreateEnt::CreateCircle(pt1,pt2,pt3); 
}

    注意:在CreateEnt.h要引用两个头文件:#include "gearc3d.h" 和 #include "gearc2d.h",在XXXCommand.cpp要引用如下5个头文件:


图(5)在在XXXCommand.cpp要引用5个头文件

10)编译并运行该程序,在AutoCAD 2002 中运行AddCircle命令,就能得到如图(6)所示的效果:


图(8)三种画圆的效果

附录:

//CreateEnt.h

#include "StdArx.h"
#include "gearc2d.h"
#include "gearc3d.h"

class CCreateEnt  
{
public:
	CCreateEnt();
	virtual ~CCreateEnt();

	static AcDbObjectId PostToModelSpace(AcDbEntity* pEnt);
	static AcDbObjectId CreateCircle(AcGePoint3d ptCenter,
		AcGeVector3d vec,double radius);
	static AcDbObjectId CreateCircle(AcGePoint3d ptCenter,double radius);
	static AcDbObjectId CreateCircle(AcGePoint2d pt1,AcGePoint2d pt2);
	static AcDbObjectId CreateCircle(AcGePoint2d pt1,AcGePoint2d pt2,
		AcGePoint2d pt3);

};

//CreateEnt.cpp

#include "stdafx.h"
#include "resource.h"
#include "CreateEnt.h"
#include "Calculation.h"
#include "gearc2d.h"
#include "gearc3d.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//
// Construction/Destruction
//

CCreateEnt::CCreateEnt()
{

}

CCreateEnt::~CCreateEnt()
{

}
//将实体添加到图形数据库的模型空间
AcDbObjectId CCreateEnt::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;
}
//添加一个圆
AcDbObjectId CCreateEnt::CreateCircle(AcGePoint3d ptCenter, AcGeVector3d vec,double radius)
{
	AcDbCircle *pCircle=new AcDbCircle(ptCenter,vec,radius);
	//将实体添加到图形数据库中
	AcDbObjectId circleId;
	circleId=CCreateEnt::PostToModelSpace(pCircle);
	return circleId;
}
AcDbObjectId CCreateEnt::CreateCircle(AcGePoint3d ptCenter,double radius)
{
	AcGeVector3d vec(0,0,1);
	return CCreateEnt::CreateCircle(ptCenter,vec,radius);
}
//用两点法画圆
AcDbObjectId CCreateEnt::CreateCircle(AcGePoint2d pt1,AcGePoint2d pt2)
{
	//计算圆心和半径
	AcGePoint2d pt=CCalculation::MiddlePoint(pt1,pt2);
	AcGePoint3d ptCenter(pt[X],pt[Y],0);//圆心
	double radius=pt1.distanceTo(pt2)/2; //半径等于pt1、pt2两点距离的一半
	//创建圆
	return CCreateEnt::CreateCircle(ptCenter,radius);
}
//用三点法画圆
AcDbObjectId CCreateEnt::CreateCircle(AcGePoint2d pt1,AcGePoint2d pt2, AcGePoint2d pt3)
{
	//使用几何类
	AcGeCircArc2d geArc(pt1,pt2,pt3);
	AcGePoint3d ptCenter(geArc.center().x,geArc.center().y,0);
	return CCreateEnt::CreateCircle(ptCenter,geArc.radius());
}


  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ObjectARX是一个开发工具包,用于创建定制的AutoCAD应用程序。它是由Autodesk开发的,用于扩展和增强AutoCAD的功能。ObjectARX允许开发人员使用C++、.NET和其他编程语言创建插件、宏和其他扩展,以满足用户的特定需求。 ObjectARX for AutoCAD 2020是最新版本的ObjectARX,专门为AutoCAD 2020版本定制开发的。它提供了与AutoCAD的最新功能和改进的兼容性,使开发人员能够开发高度集成、高度定制的AutoCAD应用程序。 使用ObjectARX for AutoCAD 2020,开发人员可以利用AutoCAD的强大功能,如二维和三维绘图、设计和建模工具,来创建个性化的工作流程和定制工具。他们可以访问和操纵AutoCAD的对象模型,如图层、块、实体等,以及访问图形数据库的数据。 ObjectARX for AutoCAD 2020还包括了对最新的AutoCAD功能的支持,如新的DWG文件格式、图形视觉化和呈现功能、云存储和协作能力等。开发人员可以充分利用这些功能,为用户提供更强大、更高效的定制工具和功能。 总而言之,ObjectARX for AutoCAD 2020是一个强大的开发工具包,可以帮助开发人员创建定制的AutoCAD应用程序,满足用户的特定需求,并利用AutoCAD最新的功能和改进,提供更强大、更高效的定制工具和功能。 ### 回答2: ObjectARX for AutoCAD 2020是一种用于AutoCAD 2020的开发工具包,它允许开发者通过自定义的方式扩展和定制AutoCAD的功能。 ObjectARX是Autodesk提供的强大的应用程序编程接口(API),允许开发者使用C++语言编写插件和应用程序,以访问和操纵AutoCAD的对象、实体和命令。 ObjectARX for AutoCAD 2020提供了许多功能和功能,使开发者能够创建各种各样的自定义解决方案。一些常见的应用包括自定义命令、自定义实体、自定义图形界面等。通过使用ObjectARX,开发者可以通过添加新的命令和功能来满足特定的工作流程需求,提高生产效率。 该开发工具包还提供了许多用于操作和管理AutoCAD图形对象的类和函数,例如创建和编辑实体、块、层等。借助这些工具,开发者可以轻松地与AutoCAD的图形数据进行交互,实现自定义的二维和三维图形操作。 ObjectARX for AutoCAD 2020还支持与其他Autodesk产品的集成,例如Autodesk Revit和Navisworks等。这意味着开发者可以在不同的Autodesk应用程序之间共享数据和功能,实现更加灵活和高效的工作流程。 总的来说,ObjectARX for AutoCAD 2020是一个强大的开发工具包,使开发者能够创建和定制各种自定义解决方案,满足特定的工作流程需求,并提高AutoCAD的生产效率。 ### 回答3: ObjectARX for AutoCAD 2020(AutoCAD 2020 的 ObjectARX)是一种开发框架,用于自定义和扩展 AutoCAD 2020 的功能。ObjectARX 允许开发者使用 C++ 编程语言创建自己的 AutoCAD 插件,以满足特定的设计需求。 使用 ObjectARX,开发者可以利用 AutoCAD 2020 的各种功能和特性来创建定制化的工具和功能,例如自定义命令、菜单、工具栏等。它还允许开发者与 AutoCAD 2020 的各个对象进行交互,包括图形实体、图层、块定义、属性等。通过 ObjectARX 可以轻松地访问和修改 AutoCAD 的图形数据。 ObjectARX for AutoCAD 2020 提供了丰富的 API(应用程序编程接口),开发者可以使用这些 API 来操纵图形数据、执行各种操作和实现自定义功能。同时,ObjectARX 还提供了强大的调试工具,方便开发者进行代码的调试和错误修复。 使用 ObjectARX,开发者可以开发出适用于各种特殊需求的 AutoCAD 插件,如自动化绘图、批量处理、数据导出等。这些插件能够大大提高工作效率,并且根据项目需求进行定制,满足不同用户的不同要求。 总之,ObjectARX for AutoCAD 2020 是一个强大的开发框架,用于自定义和扩展 AutoCAD 2020 的功能。它提供了丰富的 API 和调试工具,可以帮助开发者创建出适应特定需求的定制化工具和功能,提高工作效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值