autoCAD二次开发 4.正多边形与collection区分

正多边形与collection区分

autocad中正多边形

本质

在AutoCAD底层,所有的多边形(不管正不正)本质上都是 闭合的 Polyline(多段线)。AutoCAD自带的 POLYGON 命令,底层也是通过计算顶点坐标后生成 Polyline 来实现的。

参数

csharp 复制代码
 // 1. 定义正多边形参数
            int sides = 6;                 // 边数
            Point3d center = new Point3d(0, 0, 0); // 中心点
            double radius = 10.0;          // 半径
            bool isInscribed = true;       // true: 内接于圆, false: 外切于圆

顶点坐标计算(内接为例)

csharp 复制代码
 double partAngle = Math.PI * 2 / 6;
 Point2dCollection points = new Point2dCollection();
//获取六边形的每一个顶点坐标
for(int i=0; i<6;  i++)
{
	// CAD中原生多边形默认第一个点在正上方(90度),所以起始角度设为 π/2
   double currentAngle = partAngle*i + Math.PI/2;
   double x = cMain.Center.X + radius*Math.Cos(currentAngle);
   double y = cMain.Center.Y + radius.*Math.Sin(currentAngle);
   Point2d interPoint = new Point2d(x, y);
   points.Add(interPoint);
}

画内接正多边形

csharp 复制代码
using (Polyline pol = new Polyline())
{ 

		//获取所有顶点坐标
    for(int i=0; i<points.Count; i++)
    {
    		//将坐标按顺序加入多段线
       pol.AddVertexAt(i, points[i],0,0,0);
    }
    //闭合多段线
    pol.Closed = true;
    btr.AppendEntity(pol);
    trans.AddNewlyCreatedDBObject(pol, true);
}

点的转换

二维转三维

csharp 复制代码
Point2d pt2d = new Point2d(10.5, 20.3);

// 提取 X 和 Y,Z 轴设为 0
Point3d pt3d = new Point3d(pt2d.X, pt2d.Y, 0.0);

三维转二维

csharp 复制代码
Point3d pt3d = new Point3d(10, 20, 5);

// 提取 X 和 Y,Z 轴舍去
Point2d pt2d = new Point2d(pt3d.X, pt3d.Y); 

ObjectIdCollection 和 DBObjectCollection区别

核心区别在于"装的是对象的身份证,还是对象本体"

  • ObjectIdCollection(身份证集合):里面装的是一堆身份证号码(ObjectId 结构体)。它非常轻量,只记录对象在数据库中的唯一标识。
  • DBObjectCollection(本体集合):里面装的是活生生的人(DBObject 对象实例)。它包含了对象在内存中的全部数据(如圆的圆心、半径、颜色等)。
特性 ObjectIdCollection DBObjectCollection
存储内容 ObjectId (结构体,轻量级指针) DBObject (类,完整的内存对象)
内存占用 极小 (仅占用几个字节/ID) 较大 (包含对象所有属性和底层 C++ 包装)
事务依赖 无。事务结束后,ID依然有效,可以跨事务使用。 强依赖。事务结束后,DBObject 会被关闭/释放,继续访问会报错。
访问数据 需要通过事务再次 GetObject() 才能读取数据。 可以直接调用 circle.Radius 等属性,无需再次打开。
安全性 非常安全,是 AutoCAD 官方推荐的标准做法。 危险,容易因为事务管理不当导致程序崩溃或数据损坏。
使用频率 极高(99%的场景) 极低(仅在某些特殊的底层 API 回调或临时计算时使用)
相关推荐
休息一下接着来1 小时前
C++ 固定容量环形队列实现
c++·算法
Victory_20251 小时前
c#定时器顺序控制写法
开发语言·c#·c#顺序控制+定时器
im_AMBER2 小时前
手撕hot100之矩阵!看完这篇就AC~
javascript·数据结构·线性代数·算法·leetcode·矩阵
笨笨饿2 小时前
#79_NOP()嵌入式C语言中内联汇编宏的抽象封装模式研究
linux·c语言·网络·驱动开发·算法·硬件工程·个人开发
风萧萧19993 小时前
问答样例如何在RAG问答中使用?
算法
七夜zippoe3 小时前
DolphinDB分区策略:HASH分区与COMPO分区
算法·哈希算法·hash·dolphindb·compo
沪漂阿龙4 小时前
程序员面试技术爆款文:2026大厂算法通关手册——从零基础到LeetCode刷穿,这一篇就够了
算法·leetcode·面试
rit84324994 小时前
基于博弈论的小区分簇算法MATLAB实现
开发语言·算法·matlab
华清远见成都中心4 小时前
C 语言内存管理深度解析:malloc/free 与嵌入式堆栈分配策略
java·c语言·算法