原创辛苦,转载请注明!
编写一ObjectARX命令EllipseTest,实现由用户交互方式生成椭圆的功能。生成方式有命令方式和ARX方式两种供用户选择。用户交互输入的参数有:椭圆中心点、长轴长度、短轴长度和生成方式(命令方式[com]/ARX方式[arx])。
椭圆在ObjectARX中的实体类是AcDbEllipse(头文件dbelipse.h),详细信息请参阅ObjectARXReference。
EllipseTest.cpp如下:
//
// ObjectARX defined commands
#include "StdAfx.h"
#include "StdArx.h"
const double PI=3.14159265;
// This is command 'ELLIPSETEST'
void CreateEllipse(
AcGePoint3d center,//椭圆圆心
double longR,//椭圆长轴
double shortR,//椭圆短轴
char *layer)//图层名
{
AcGeVector3d v1(0,0,1);//椭圆所在平面的法向量
AcGeVector3d v_long(longR,0,0);//表示长轴的向量
if (longR/shortR<1.0)
{
AfxMessageBox("长轴短于短轴!请重新输入!");
return;
}
//设置椭圆的绘制方式,函数的参数如下:
//中心,法向量,长轴向量,短长轴之比,起始角度,终止角度
AcDbEllipse *pEllipse=new AcDbEllipse(center,v1,v_long,shortR/longR,
0.0,2*PI);
//获取图形块表指针
AcDbBlockTable *pBlockTable;
acdbHostApplicationServices()->workingDatabase()->getSymbolTable
(pBlockTable,AcDb::kForRead);
//获取图形块表记录指针
AcDbBlockTableRecord *pBlockTableRecord;
pBlockTable->getAt(ACDB_MODEL_SPACE,
pBlockTableRecord,AcDb::kForWrite);
//关闭图形块表指针
pBlockTable->close();
//将图形对象写入块表记录指针
AcDbObjectId EllipseID;
pBlockTableRecord->appendAcDbEntity(EllipseID,pEllipse);
//关闭块表记录指针
pBlockTableRecord->close();
//设置图层
pEllipse->setLayer(layer);
//关闭椭圆对象
pEllipse->close();
return;
}
void xxxEllipseTest()
{
// TODO: Implement the command
AcGePoint3d center;
ads_point EllipseCenter;
double longR=100;
double shortR=50;
int color;
char ans;
ads_point point_long,point_short;//用来存储长短轴端点坐标
acedGetString(0,"请输入您想要实现的方式(首字母)?<Command/Arx>:",&ans);
switch(ans)
{
case 'C':
case 'c':
{
//输入椭圆中心点的坐标
acedGetPoint(NULL,"请输入椭圆中心点:",EllipseCenter);
//输入长轴坐标
acedGetReal("请输入长轴:",&longR);
//设置长轴端点坐标,默认长轴为X方向
point_long[0]=longR+EllipseCenter[0];
point_long[1]=EllipseCenter[1];
point_long[2]=EllipseCenter[2];
//输入短轴坐标
acedGetReal("请输入短轴:",&shortR);
//设置短轴坐标,默认短轴为Y方向
point_short[0]=EllipseCenter[0];
point_short[1]=shortR+EllipseCenter[1];
point_short[2]=EllipseCenter[2];
//用Command方式实现椭圆
acedCommand(RTSTR,"ellipse",RTSTR,"c",
RT3DPOINT,EllipseCenter,
RT3DPOINT,point_long,
RT3DPOINT,point_short,
RTNONE);
}
break;
case 'A':
case 'a':
{
acedGetPoint(NULL,"请输入椭圆中心点:",EllipseCenter);
acedGetReal("请输入长轴:",&longR);
acedGetReal("请输入短轴:",&shortR);
//将椭圆中心存入到一个AcGePoint3d中,以免调用函数时出错
center[0]=EllipseCenter[X];
center[1]=EllipseCenter[Y];
center[2]=EllipseCenter[Z];
//下面的函数的第一个参数必须为AcGePoint3d
CreateEllipse(center,longR,shortR,"0");//
}
break;
default:
acutPrintf("输入错误!请重新输入您的选择(A、a、C、c)!");
break;
}
}