最近更新于 2024-08-08 22:56
环境
AutoCAD 机械版 2025
ObjectARX 2025
VS 2022
环境配置参考:https://blog.iyatt.com/?p=16480
自定义类使用方法参考:https://blog.iyatt.com/?p=16635
实现
无实时预览
Test.hpp
#pragma once
class Test
{
public:
static void init();
static void unload();
private:
/**
* @brief 绘制直线
* @param linePt1 起始点
* @param linePt2 终点
*/
static void drawLine(const AcGePoint3d linePt1, const AcGePoint3d linePt2);
static void test();
private:
static bool mFirstPt;
};
Test.cpp
#include "StdAfx.h"
#include "Test.hpp"
void Test::init()
{
acedRegCmds->addCommand(L"IYATTyxTest", L"yxTest", L"yxTest", ACRX_CMD_MODAL, Test::test);
}
void Test::unload()
{
acedRegCmds->removeGroup(L"IYATTyxTest");
}
bool Test::mFirstPt = true; // 定义首次绘制标志
void Test::drawLine(const AcGePoint3d linePt1, const AcGePoint3d linePt2)
{
// 一般绘图流程参考这个函数的内容
// 获取当前工作数据库的块表,打开模式为只读
AcDbBlockTable* pBlockTable = nullptr;
acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable, AcDb::kForRead);
// 从块表中获取 ACDB_MODEL_SPACE 块表记录(模型空间,创建和编辑图形对象的主要工作区域),打开模式为写入
AcDbBlockTableRecord* pBlockTableRecord = nullptr;
pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
// 创建一个直线对象。绘制其它图形,换这里就行,其它图形的类名也是 AcDb 开头,比如圆 AcDbCircle
AcDbLine* pLine = new AcDbLine(linePt1, linePt2);
// 将直线对象添加到块表记录中
pBlockTableRecord->appendAcDbEntity(pLine);
// 关闭块表记录、块表和图形对象
pBlockTableRecord->close();
pBlockTable->close();
pLine->close();
}
void Test::test()
{
ads_point pt; // 接受设定的坐标点
AcGePoint3d linePt1, linePt2; // 绘制直线的端点
int counter = 0; // 绘制点计数
ACHAR prompt[32] = { 0 }; // 存储提示语
while (true)
{
++counter; // 增加计数
wsprintf(
prompt,
L"%d %s\n",
counter,
mFirstPt ? L"指定起点" : L"指定下一点或按回车键结束:"
); // 生成提示语
int ret = acedGetPoint(nullptr, prompt, pt);
if (ret == RTNORM)
{
if (mFirstPt) // 设置起点
{
mFirstPt = false;
//linePt1 = AcGePoint3d(pt[0], pt[1], pt[2]); // 方法一:逐个取数组元素
linePt1 = asPnt3d(pt); // 方法二:内置方法转换。还有一种写法,可以看 asPnt3d 函数的定义,先强制类型转换再解引用
}
else
{
linePt2 = asPnt3d(pt);
Test::drawLine(linePt1, linePt2);
linePt1 = linePt2; // 更新起点
}
}
else if (ret == RTCAN || ret == RTNONE) // 取消或没有输入点
{
mFirstPt = true;
break;
}
else
{
acutPrintf(L"非法点,命令取消。\n");
return;
}
}
}
ObjectARX 2025(C++)实现直线绘制命令 Line