ObjectARX 2025(C++)实现直线绘制命令 Line

最近更新于 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;
        }
    }
}

file

ObjectARX 2025(C++)实现直线绘制命令 Line
Scroll to top