# 0. 引言
学习了如何创建图形后,需要分析如何对图形进一步操作,如:颜色改变、移动、复制、旋转、镜像、删除等,这些都是一些基本操作。
还是同样的配方,我们将这些操作都封装成一个一个的方法,以后需要的时候调用即可!
# 1. 封装
这里需要说明的是,对图形操作如改变颜色、移动、复制等这些操作需要分为图形是否已经添加到图形数据库中,也就是图形是不是新创建的。
用代码说话,看代码就明白了:
## (1)改变颜色
如果图形已经在图形数据库中:
我们传入图形对象的ObjectId就行了,因为图形已经在图形数据库中了,后面的一个参数colorIndex是颜色索引,用来传入颜色
颜色编辑完整代码:
///
/// 改变图形颜色
///
/// 图形的ObjectId
/// 颜色索引
/// 图形的ObjectId 图形已经添加图形数据库
public static ObjectId ChangeEntityColor(this ObjectId c1Id, short colorIndex)
{
// 图形数据库
Database db = HostApplicationServices.WorkingDatabase;
// 开启事务处理
using (Transaction trans = db.TransactionManager.StartTransaction())
{
// 打开块表
BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
// 打开块表记录
BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
// 获取图形对象
Entity ent1 = (Entity)c1Id.GetObject(OpenMode.ForWrite);
// 设置颜色
ent1.ColorIndex = colorIndex;
trans.Commit();
}
return c1Id;
}
如果图形没有添加到图形数据库中:
与上面不同的是这时候我们直接传入图形对象作为参数
此外我们需要判断图形是不是新建对象,完整代码:
///
/// 改变图形颜色 图形没有添加到图形数据库
///
/// 图形对象
/// 颜色索引
///
public static void ChangeEntityColor(this Entity ent, short colorIndex)
{
// 判断图形的IsNewlyObject
if (ent.IsNewObject)
{
ent.ColorIndex = colorIndex;
}
// 不是新图形就调用上面的方法
else
{
ent.ObjectId.ChangeEntityColor(colorIndex);
}
}
如果说图形是新建对象,那么对齐颜色进行赋值就行了,如果不是,调用上面函数即可!
测试代码:
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Runtime;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AcDoNetTools;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Colors;
namespace _03_EntityEdit
{
public class ColorExam
{
[CommandMethod("EditDemo")]
public void EditDemo()
{
Database db = HostApplicationServices.WorkingDatabase;
//db.AddCircleModeSpace(new Point3d(100, 100, 0), 50);
Circle c1 = new Circle(new Point3d(100, 100, 0), new Vector3d(0, 0, 1), 50);
Circle c2 = new Circle(new Point3d(200, 100, 0), new Vector3d(0, 0, 1), 50);
c1.ColorIndex = 1;
c2.Color = Color.FromRgb(23, 156, 255);
db.AddEntityToModeSpace(c1, c2);
}
}
}
## (2) 复制图形
和上面同样的配方,我就不再细讲!注释已经很详细了
图形已经添加到图形数据库:
///
/// 复制图形 图形已经加入到图形数据库中
///
/// 图形对象的ObjectId
/// 参考原点
/// 参考目标点
public static Entity CopyEntity(this ObjectId entId, Point3d sourcePoint, Point3d targetPoint)
{
// 声明一个图形对象
Entity entR;
// 当前图形数据库
Database db = HostApplicationServices.WorkingDatabase;
using (Transaction trans = db.TransactionManager.StartTransaction())
{
// 打开块表
BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
// 打开块表记录
BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead);
// Entity ent = (Entity)trans.GetObject(entId, OpenMode.ForWrite);
// 打开图形
Entity ent = (Entity)entId.GetObject(OpenMode.ForWrite);
// 计算变换矩阵
Vector3d vectoc = sourcePoint.GetVectorTo(targetPoint);
Matrix3d mt = Matrix3d.Displacement(vectoc);
entR = ent.GetTransformedCopy(mt);
// 提交事务处理
trans.Commit();
}
return entR;
}
图形没有添加到图形数据库中:
///
/// 复制图形 图形没有加到图形数据库中
///
/// 图形对象
/// 参考原点
/// 参考目标点
public static Entity CopyEntity(this Entity ent, Point3d sourcePoint, Point3d targetPoint)
{
//声明一个图形对象
Entity entR;
// 判断图形对象的IsNewlyObject属性
if (ent.IsNewObject)
{
// 计算变换矩阵
Vector3d vector = sourcePoint.GetVectorTo(targetPoint);
Matrix3d mt = Matrix3d.Displacement(vector);
entR = ent.GetTransformedCopy(mt);
}
else
{
entR = ent.ObjectId.CopyEntity(sourcePoint, targetPoint);
}
return entR;
}
图形已经添加到图形数据库:
///
/// 旋转图形 图形在数据库中
///
/// 图形对象
/// 旋转中心
/// 旋转角度
public static void RotateEntity(this ObjectId entId, Point3d center, double degree)
{
// 当前图形数据库
Database db = HostApplicationServices.WorkingDatabase;
using (Transaction trans = db.TransactionManager.StartTransaction())
{
// 打开块表
BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
// 打开块表记录
BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead);
//Entity ent = (Entity)trans.GetObject(entId, OpenMode.ForWrite);
// 打开图形
Entity ent = (Entity)entId.GetObject(OpenMode.ForWrite);
// 计算变换矩阵
Matrix3d mt = Matrix3d.Rotation(degree.DegreeToAngle(), Vector3d.ZAxis, center);
ent.TransformBy(mt);
// 提交事务处理
trans.Commit();
}
}
图形没有添加到图形数据库中:
///
/// 旋转图形 图形不在数据库中
///
/// 图形对象
/// 旋转中心
/// 旋转角度
public static void RotateEntity(this Entity ent, Point3d center, double degree)
{
// 判断图形对象的IsNewlyObject属性
if (ent.IsNewObject)
{
// 计算变换矩阵
Matrix3d mt = Matrix3d.Rotation(degree.DegreeToAngle(), Vector3d.ZAxis, center);
ent.TransformBy(mt);
}
else
{
ent.ObjectId.RotateEntity(center, degree);
}
}
旋转和复制的测试代码:
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AcDoNetTools; // 我们之前自己封装的那个dll
namespace _03_EntityEdit
{
public class CopyExam
{
// 复制图形
[CommandMethod("CopyDemo")]
public void CopyDemo()
{
Database db = HostApplicationServices.WorkingDatabase;
Circle c1 = new Circle(new Point3d(100, 100, 0), Vector3d.ZAxis, 100);
Circle c2 = (Circle)c1.CopyEntity(new Point3d(100, 100, 0), new Point3d(100, 200, 0));
db.AddEntityToModeSpace(c1);
Circle c3 = (Circle)c1.CopyEntity(new Point3d(0, 0, 0), new Point3d(-100, 0, 0));
db.AddEntityToModeSpace(c3);
}
// 旋转图形
[CommandMethod("RotateDemo")]
public void RotateDemo()
{
Database db = HostApplicationServices.WorkingDatabase;
Line l1 = new Line(new Point3d(100, 100, 0), new Point3d(300, 100, 0));
Line l2 = new Line(new Point3d(100, 100, 0), new Point3d(300, 100, 0));
Line l3 = new Line(new Point3d(100, 100, 0), new Point3d(300, 100, 0));
l1.RotateEntity(new Point3d(100, 100, 0), 30);
db.AddEntityToModeSpace(l1, l2, l3);
l2.RotateEntity(new Point3d(0, 0, 0), 60);
l3.RotateEntity(new Point3d(200, 500, 0), 90);
}
}
}
using AcDoNetTools; 是我们之前(https://blog.csdn.net/yzk1062913581/article/details/105050928)自己封装的那个dll,就是那一堆堆的添加图形的东西和一些基本操作方法的封装,在引用里面添加进行即可!
还有几个操作就贴了,内容颇多,代码自己去下载,下面会给出链接,大同小异!
完整代码下载地址:
https://gitee.com/yuzhaokai/cad_secondary_development_code.git
原文请关注公众号:数据智能笔记