天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 140|回复: 0

ObjectARX2015 + vs2012创建圆弧

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
[code]1. 说明

        与上一节创建圆的函数相对应,本节将要实现用
                 法1:  “圆心、半径、圆弧所在的平面、起点角度和终点角度”、
                  法2:  位于 XOY 平面上的圆弧 “圆心、半径、起点角度和终点角度”、
                 法3: 弧上三点法、“起点、中间点、终点”
                 法4: 圆心三点法、“起点、圆心、终点”
                 法5: 两点一角 “起点、圆心、圆弧角度”
        五种方法来创建圆弧。
2. 思路
        在 ObjectARX 中, AcDbArc 类被用来表示圆弧,该类有三个构造函数:
        第二个构造函数接受最多的参数,因此首先对该函数进行封装,其他几个函数均以封装后的函数为基础。
//中心点、半径、起始角度、终止角度
AcDbArc(
const AcGePoint3d& center,
double radius,
double startAngle,
double endAngle);

//中心点、平面向量、半径、起始角度、终止角度
AcDbArc(
const AcGePoint3d& center,
const AcGeVector3d& normal,
double radius,
double startAngle,
double endAngle);

AcDbArc();

//第二个构造函数接受最多的参数,因此首先对该函数进行封装,
//其他几个函数均以封装后的函数为基础。

3. 步骤

(1)在CGeometryOper类中:增加一个新的函数 Pt2dTo3d

AcGePoint3d Pt2dTo3d(AcGePoint2d pt);

//或
//AcGePoint3d Pt2dTo3d(AcGePoint2d pt, double z = 0);
//二维点转三维点
AcGePoint3d CGeometryOper::Pt2dTo3d(AcGePoint2d pt)
{
    AcGePoint3d ptTemp(pt.x, pt.y, 0);
    return ptTemp;
}

//或
//(二维点转三维点)
AcGePoint3d CGeometryOper::Pt2dTo3d(AcGePoint2d pt, double z = 0)
{
    return AcGePoint3d(pt.x, pt.y, z);
}
(2)在CCreateEnt类中:添加一个函数 CreateArc,用于向模型空间添加一个圆弧

法1:中心点、平面向量、半径、起始角度、终止角度

    static         AcDbObjectId CreateArc(AcGePoint3d ptCenter, AcGeVector3d vec,
        double radius, double startAngle, double endAngle);                 //创建圆弧(中心点、平面向量、半径、起始角度、终止角度)
AcDbObjectId CCreateEnt::CreateArc(AcGePoint3d ptCenter, AcGeVector3d vec,
double radius, double startAngle, double endAngle)
{
    AcDbArc *pArc = new AcDbArc(ptCenter, vec, radius, startAngle, endAngle);
    AcDbObjectId arcId;
    arcId = CCreateEnt::PostToModelSpace(pArc);

    return arcId;
}
法2:添加一个创建位于 XOY 平面上的圆弧的函数

//中心点、半径、起始角度、终止角度

//中心点、半径、起始角度、终止角度
AcDbObjectId CreateArc(AcGePoint2d ptCenter, double radius, double startAngle, double endAngle);
//创建圆弧:添加一个创建位于 XOY 平面上的圆弧的函数中心点、半径、起始角度、终止角度
AcDbObjectId CCreateEnt::CreateArc(AcGePoint2d ptCenter, double radius, double startAngle, double endAngle)
{
    CGeometryOper m_geometryOper;
    AcGeVector3d vec(0, 0, 1);
    return CCreateEnt::CreateArc(m_geometryOper.Pt2dTo3d(ptCenter), vec, radius, startAngle, endAngle);
}
法3: 三点法创建圆弧
AcDbObjectId CreateArc(AcGePoint2d ptStart, AcGePoint2d ptOnArc,
AcGePoint2d ptEnd);
AcDbObjectId CCreateEnt::CreateArc(AcGePoint2d ptStart, AcGePoint2d ptOnArc,
AcGePoint2d ptEnd)
{
    // 使用几何类获得圆心、半径
    AcGeCircArc2d geArc(ptStart, ptOnArc, ptEnd);
    AcGePoint2d ptCenter = geArc.center();
    double radius = geArc.radius();

    // 计算起始和终止角度
    //AcGeVector2d 类用来表示一个二维空间中的矢量, 其成员函数 angle 返回该矢量和 X 轴
    //正半轴的角度(用弧度来表示)。
    AcGeVector2d vecStart(ptStart.x - ptCenter.x, ptStart.y - ptCenter.y);
    AcGeVector2d vecEnd(ptEnd.x - ptCenter.x, ptEnd.y - ptCenter.y);
    double startAngle = vecStart.angle();
    double endAngle = vecEnd.angle();
    return CCreateEnt::CreateArc(ptCenter, radius, startAngle, endAngle);
}

法4:起点、圆心、终点

        这个函数的名称不再是 CreateArc ,而是 CreateArcSCE ,这是因为该函数的参数列表、
返回值都与三点法的函数相同,无法实现函数的重载,就只能重新定义一个新的函数名称。
AcDbObjectId CreateArcSCE(AcGePoint2d ptStart, AcGePoint2d ptCenter,
AcGePoint2d ptEnd)
AcDbObjectId CCreateEnt::CreateArcSCE(AcGePoint2d ptStart, AcGePoint2d ptCenter,
AcGePoint2d ptEnd)
{
    // 计算半径
    double radius = ptCenter.distanceTo(ptStart);
    // 计算起、终点角度
    AcGeVector2d vecStart(ptStart.x - ptCenter.x, ptStart.y - ptCenter.y);
    AcGeVector2d vecEnd(ptEnd.x - ptCenter.x, ptEnd.y - ptCenter.y);
    double startAngle = vecStart.angle();
    double endAngle = vecEnd.angle();
    // 创建圆弧
    return CCreateEnt::CreateArc(ptCenter, radius, startAngle, endAngle);
}
法5:起点、圆心、圆弧角度

AcDbObjectId CreateArc(AcGePoint2d ptStart, AcGePoint2d ptCenter,
double angle)
AcDbObjectId CCreateEnt::CreateArc(AcGePoint2d ptStart, AcGePoint2d ptCenter,
double angle)
{
    // 计算半径
    double radius = ptCenter.distanceTo(ptStart);
    // 计算起、终点角度
    AcGeVector2d vecStart(ptStart.x - ptCenter.x, ptStart.y - ptCenter.y);
    double startAngle = vecStart.angle();
    double endAngle = startAngle + angle;
    // 创建圆弧
    return CCreateEnt::CreateArc(ptCenter, radius, startAngle, endAngle);
}
(3)在CGeometryOper类中:增加一个新的函数 PI,用来计算常量π的值

#include <math.h>
double CGeometryOper::PI()
{
return 4 * atan(1.0);
}
// atan 是一个 C 语言的库函数,用来计算反正切函数的值
(4)在acrxEntryPoint.cpp中添加#include "GeometryOper.h"头文件后添加注册命令

ACED_ARXCOMMAND_ENTRY_AUTO(CArxConfigApp, MidasMyGroup, MyDrawArc, MyDrawArc, ACRX_CMD_MODAL, NULL) //画圆弧
    //当前项目中注册一个命令 AddArc
    static void MidasMyGroupMyDrawArc()
    {
        //中心点、平面向量、半径、起始角度、终止角度
        CGeometryOper m_geometryOper;
        AcGePoint3d ptCenter(0, 0, 0);
        AcGeVector3d vec(0, 0, 1);
        double radius = 10;
        double startAngle = 0;
        double endAngle = m_geometryOper.PI();
        AcDbObjectId circleId;
        circleId = CCreateEnt::CreateArc(ptCenter, vec, radius, startAngle, endAngle);
        CModifyEnt m_modifyEnt;
        m_modifyEnt.ChangeColor(circleId, 1);
    }

原文链接:https://blog.csdn.net/qq_42981953/article/details/121802593[/code]

 

 

 

 

ObjectARX2015 + vs2012创建圆弧
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-1 11:47 , Processed in 0.141537 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表