用ObjectARX 编制圆弧编辑器程序:创建命令ArcEditor,执行该命令后提示“Select an ARC:”。 若用户选取一圆弧,则出现如下对话框并显示圆弧的初始参数。用户可在对话框中编辑圆弧实体参数,其中颜色用AutoCAD标准颜色对话框编辑,按确定按钮退出时应能根据用户输入的数据作图;如果用户选取其它类型实体则提示“not an ARC”。
需要设计的对话框如下:
实现的代码如下(Command.cpp):
//
// ObjectARX defined commands
#include "StdAfx.h"
#include "StdArx.h"
#include "ArcEditorDlg.h"
const double PI=3.14159265;//定义π常量
// This is command 'ARCEDITOR'
void xxxxArcEditor()
{
// TODO: Implement the command
AcGePoint3d pt;//用于SetCenter函数
CArcEditorDlg dlg;
AcDbEntity *pEnt;
AcDbObjectId EntId;
ads_name Ent;
ads_point adspt;
acedEntSel("\nSelect An Arc:",Ent,adspt);//选择单个圆弧实体
acdbGetObjectId(EntId,Ent);//获取实体ID
acdbOpenObject(pEnt,EntId,AcDb::kForWrite);//打开实体对象,获取实体指针
if (strcmp(pEnt->isA()->name(),"AcDbArc")==0)
{
AcDbArc *pArc;
pArc=(AcDbArc *)pEnt;
dlg.m_ArcCenterX=pArc->center().x;//读取圆弧实体的X坐标
dlg.m_ArcCenterY=pArc->center().y;//读取圆弧实体的Y坐标
dlg.m_ArcRadius=pArc->radius();//读取圆弧实体的半径
dlg.m_ArcStartAngle=(pArc->startAngle())*180.0/PI;//读取圆弧实体的起始角度
dlg.m_ArcEndAngle=(pArc->endAngle())*180.0/PI;//读取圆弧实体的终止角度
if (dlg.DoModal()==IDOK)//按下OK按钮后,对数据进行修改
{
pt.x=dlg.m_ArcCenterX;
pt.y=dlg.m_ArcCenterY;
pArc->setCenter(pt);//设置圆弧的圆心坐标
pArc->setRadius(dlg.m_ArcRadius);//设置圆心半径
pArc->setStartAngle((dlg.m_ArcStartAngle)*PI/180.0);//设置圆弧起始角度
pArc->setEndAngle((dlg.m_ArcEndAngle)*PI/180.0);//设置圆弧终止角度
pArc->setColorIndex(dlg.m_Color);//设置颜色
}
}
else//如果选择的不是圆弧实体,给出提示
{
acutPrintf("\nnot an Arc!");
}
pEnt->close();//关闭指针
}
Dlg.cpp的实现代码如下:
// ArcEditorDlg.cpp : implementation file
//
#include "StdAfx.h"
#include "resource.h"
#include "ArcEditorDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/
// CArcEditorDlg dialog
CArcEditorDlg::CArcEditorDlg(CWnd* pParent /*=NULL*/)
: CDialog(CArcEditorDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CArcEditorDlg)
m_ArcCenterX = 0.0;
m_ArcCenterY = 0.0;
m_ArcEndAngle = 0.0;
m_ArcRadius = 0.0;
m_ArcStartAngle = 0.0;
//}}AFX_DATA_INIT
}
void CArcEditorDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CArcEditorDlg)
DDX_Text(pDX, IDC_ArcCenterX, m_ArcCenterX);
DDX_Text(pDX, IDC_ArcCenterY, m_ArcCenterY);
DDX_Text(pDX, IDC_ArcEndAngle, m_ArcEndAngle);
DDX_Text(pDX, IDC_ArcRadius, m_ArcRadius);
DDX_Text(pDX, IDC_ArcStartAngle, m_ArcStartAngle);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CArcEditorDlg, CDialog)
//{{AFX_MSG_MAP(CArcEditorDlg)
ON_BN_CLICKED(IDC_Color, OnColor)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/
// CArcEditorDlg message handlers
void CArcEditorDlg::OnColor()
{
// TODO: Add your control notification handler code here
acedSetColorDialog(m_Color,Adesk::kTrue,0);
}