Auto CAD二次开发——镜像图形对象
学如逆水行舟,不进则退。 愿自己不忘初心,坚持积累。感谢大家的支持。本篇博客主要是学习镜像图形对象。
目录
1、基础知识储备
2、核心代码以及封装函数调用
2.1 镜像图形对象函数封装
2.2 镜像图形对象函数调用
2.3 镜像图形对象运行结果
1、基础知识储备
在 CAD 官方的镜像图形命令中,存在是否删除源对象的选项。在我们自主编写代码时需注意:无论是否删除源对象,都不影响获取新生成的镜像实体(Entity entR)。具体来说,若选择删除源对象,只需将原对象的实体引用清空即可;若不删除源对象,则直接保留新生成的镜像实体引用。这里需要明确的是,不能写成 “不删除源对象时返回新复制的实体,删除时却返回原实体” 的逻辑。
2、核心代码以及封装函数调用
2.1 镜像图形对象函数封装
/// <summary>/// 镜像图形/// </summary>/// <param name="entId">图形对象的ObjectId</param>/// <param name="point1">第一个镜像点</param>/// <param name="point2">第二个镜像点</param>/// <param name="isEraseSoruce">是否删除原图</param>/// <returns>返回新的图形对象,没有加入图形数据库</returns>public static Entity MirrorEntity(this ObjectId entId, Point3d point1, Point3d point2, bool isEraseSoruce){//声明一个图形对象,用于返回Entity entR;//计算镜像的变换矩阵Matrix3d mt = Matrix3d.Mirroring(new Line3d(point1, point2));//打开事务处理using (Transaction trans = entId.Database.TransactionManager.StartTransaction()){//打开原对象Entity ent = (Entity)trans.GetObject(entId, OpenMode.ForWrite);//这里得到的图形的IsNewlyObject = trueentR = ent.GetTransformedCopy(mt);//判断是否删除对象if (isEraseSoruce){ent.Erase();}trans.Commit();}return entR;}/// <summary>/// 镜像图形/// </summary>/// <param name="entId">图形对象</param>/// <param name="point1">第一个镜像点</param>/// <param name="point2">第二个镜像点</param>/// <param name="isEraseSoruce">是否删除原图</param>/// <returns>返回新的图形对象,没有加入图形数据库</returns>public static Entity MirrorEntity(this Entity ent, Point3d point1, Point3d point2, bool isEraseSoruce){//声明一个图形对象,用于返回Entity entR;if (ent.IsNewObject == true){//计算镜像的变换矩阵Matrix3d mt = Matrix3d.Mirroring(new Line3d(point1, point2));entR = ent.GetTransformedCopy(mt);}else{entR = ent.ObjectId.MirrorEntity(point1, point2, isEraseSoruce);}return entR;}
2.2 镜像图形对象函数调用
//镜像函数对象[CommandMethod("MirrorEntity")]public void MirrorDemo1(){Database db = HostApplicationServices.WorkingDatabase;Circle c1 = new Circle(new Point3d(100, 100, 0), Vector3d.ZAxis, 50);ObjectId cId = db.AddEntityToModelSpace(c1);Entity Ent = cId.MirrorEntity(new Point3d(200, 100, 0), new Point3d(200, 300, 0), true);db.AddEntityToModelSpace(Ent);Circle c2 = new Circle(new Point3d(100, 200, 0), Vector3d.ZAxis, 50);Entity ent2 = c2.MirrorEntity(new Point3d(200, 100, 0), new Point3d(200, 300, 0), true);//Entity ent3 = c2.MirrorEntity(new Point3d(200, 100, 0), new Point3d(200, 300, 0), false);db.AddEntityToModelSpace(c2, ent2);}
2.3 镜像图形对象运行结果

注意:在镜像图形对象是需要注意,如果没有加载到图形数据库着设置bool isEraseSoruce失效,在实际的操作中一般都会加载到图形数据库,不然如何选中对象实现镜像,这里只是为了保证创建流程的完整性。
