前言
本文章中会使用到用ObjectArx向导创建的项目、模态对话框、Autocad中自定义的选项卡都可以在我的主页文章中找到对应的案例。此篇文章承接下面这篇文章,在下面这篇文章的基础上做了一个获取模态对话框中编辑框内容来创建一条直线 。
实现点击AutoCad2020自定义选项卡弹出模态对话框(Dialog)https://mp.csdn.net/mp_blog/creation/editor/141357183
一、指定模态对话框控件对象对应的变量
1.打开类试图 如下
注:如果没有这个类试图这个窗口 请在VisualStudio菜单栏的“视图”菜单中寻找
2.右击需要添加变量的模态对话框>>类向导
随后点击 应用>>确定
二、添加重写模态对话框的相关事件
1.重写模态对话框的OnInitDialog事件,为编辑框添加默认值
2.重写模态对话框的确认、取消按钮的点击事件
添加了按钮的重写事件后,暂时不管先进行直线工具类的与将实体添加到数据库的工具类编写
三、创建工具类
1.创建直线与将实体对象添加到数据库的工具类
右击解决方案>>添加>>类
2.给文件添加代码
LineUtil.h代码如下:
#pragma once
#include"acdb.h"
class LineUtil
{
public:
//两点创建直线
AcDbObjectId CreateLine(AcGePoint3d SPt, AcGePoint3d EPt);
};
DataBaseUtil.h代码如下:
#pragma once
#include "acdb.h"
class DataBaseUtil
{
public:
AcDbObjectId AddEntityToModelSpace(AcDbEntity* pEntity);
};
LineUtil.cpp代码如下:
#include "stdafx.h"
#include "LineUtil.h"
#include "DataBaseUtil.h"
AcDbObjectId LineUtil::CreateLine(AcGePoint3d SPt, AcGePoint3d EPt) {
AcDbLine *pLine = new AcDbLine(SPt, EPt);
DataBaseUtil database;
return database.AddEntityToModelSpace(pLine);
}
DataBaseUtil.cpp代码如下:
#include "stdafx.h"
#include "DataBaseUtil.h"
AcDbObjectId DataBaseUtil::AddEntityToModelSpace(AcDbEntity* pEntity) {
AcDbBlockTable* pBT1;
acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBT1, AcDb::kForRead);
AcDbBlockTableRecord* pBT1Rcd;
pBT1->getAt(ACDB_MODEL_SPACE, pBT1Rcd, AcDb::kForWrite);
AcDbObjectId lineId;
pBT1Rcd->appendAcDbEntity(lineId, pEntity);
pBT1->close();
pBT1Rcd->close();
pEntity->close();
return lineId;
}
注:可以不写工具类直接把这一堆代码都写到确认按钮的点击事件中去
四、按钮的点击事件添加代码
1.修改确认按钮的点击事件(OnBnClickedOk)
//确认按钮点击事件
void CTestLineDialog::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
OnOK();
CString getStr;
//获取Dialog编辑框的内容
//直线起始点X的坐标
m_SPtX.GetWindowTextW(getStr);
double sPtX = _wtof(getStr);
//直线起始点Y的坐标
m_SPtY.GetWindowTextW(getStr);
double sPtY = _wtof(getStr);
//直线起始点Z的坐标
m_SPtZ.GetWindowTextW(getStr);
double sPtZ = _wtof(getStr);
//直线终点X的坐标
m_EPtX.GetWindowTextW(getStr);
double ePtX = _wtof(getStr);
//直线终点Y的坐标
m_EPtY.GetWindowTextW(getStr);
double ePtY = _wtof(getStr);
//直线终点Z的坐标
m_EPtZ.GetWindowTextW(getStr);
double ePtZ = _wtof(getStr);
//起点
AcGePoint3d SPt(sPtX,sPtY,sPtZ);
//终点
AcGePoint3d EPt(ePtX, ePtY, ePtZ);
LineUtil line;
AcDbObjectId lineId = line.CreateLine(SPt,EPt);
if (lineId != NULL) {
AfxMessageBox(L"创建直线成功!");
}
}
2.1.修改取消按钮的点击事件(OnBnClickedCancel)
//取消按钮点击事件
void CTestLineDialog::OnBnClickedCancel()
{
// TODO: 在此添加控件通知处理程序代码
OnCancel();
}