工具类:EditEntityTool.cs
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AcDotNetTool;
namespace _03编辑图形
{
public static partial class EditEntityTool
{
public static void 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.ForRead);
Entity ent1 = (Entity)c1Id.GetObject(OpenMode.ForWrite);
ent1.ColorIndex = colorIndex;
trans.Commit();
}
}
public static void ChangeEntityColor(this Entity ent, short colorIndex)
{
if (ent.IsNewObject)
{
ent.ColorIndex = colorIndex;
}
else
{
ent.ObjectId.ChangeEntityColor(colorIndex);
}
}
public static void MoveEntity(this ObjectId entId, Point3d sourcePoint, Point3d targetPoint)
{
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)entId.GetObject(OpenMode.ForWrite);
Vector3d vector = sourcePoint.GetVectorTo(targetPoint);
Matrix3d mt = Matrix3d.Displacement(vector);
ent.TransformBy(mt);
trans.Commit();
}
}
public static void MoveEntity(this Entity ent, Point3d sourcePoint, Point3d targetPoint)
{
if (ent.IsNewObject)
{
Vector3d vector = sourcePoint.GetVectorTo(targetPoint);
Matrix3d mt = Matrix3d.Displacement(vector);
ent.TransformBy(mt);
}
else
{
ent.ObjectId.MoveEntity(sourcePoint, targetPoint);
}
}
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)entId.GetObject(OpenMode.ForWrite);
Vector3d vector = sourcePoint.GetVectorTo(targetPoint);
Matrix3d mt = Matrix3d.Displacement(vector);
entR = ent.GetTransformedCopy(mt);
trans.Commit();
}
return entR;
}
public static Entity CopyEntity(this Entity ent, Point3d sourcePoint, Point3d targetPoint)
{
Entity entR;
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)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)
{
if (ent.IsNewObject)
{
Matrix3d mt = Matrix3d.Rotation(degree.DegreeToAngle(), Vector3d.ZAxis, center);
ent.TransformBy(mt);
}
else
{
ent.ObjectId.RotateEntity(center, degree);
}
}
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);
entR = ent.GetTransformedCopy(mt);
if (isEraseSoruce)
{
ent.Erase();
}
trans.Commit();
}
return entR;
}
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;
}
public static void ScaleEntity(this ObjectId entId, Point3d basePoint, double facter)
{
Matrix3d mt = Matrix3d.Scaling(facter, basePoint);
using (Transaction trans = entId.Database.TransactionManager.StartTransaction())
{
Entity ent = (Entity)entId.GetObject(OpenMode.ForWrite);
ent.TransformBy(mt);
trans.Commit();
}
}
public static void ScaleEntity(this Entity ent, Point3d basePoint, double facter)
{
if (ent.IsNewObject == true)
{
Matrix3d mt = Matrix3d.Scaling(facter, basePoint);
ent.TransformBy(mt);
}
else
{
ent.ObjectId.ScaleEntity(basePoint, facter);
}
}
public static void EraseEntity(this ObjectId entId)
{
using (Transaction trans = entId.Database.TransactionManager.StartTransaction())
{
Entity ent = (Entity)entId.GetObject(OpenMode.ForWrite);
ent.Erase();
trans.Commit();
}
}
public static List<Entity> ArrayRectEntity(this ObjectId entId,int rowNum,int columnNum,double disRow,double disColumn)
{
List<Entity> entList = new List<Entity>();
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 ent = (Entity)entId.GetObject(OpenMode.ForWrite);
for (int i = 0; i < rowNum; i++)
{
for (int j = 0; j < columnNum; j++)
{
Matrix3d mt = Matrix3d.Displacement(new Vector3d(j * disColumn, i * disRow, 0));
Entity entA = ent.GetTransformedCopy(mt);
btr.AppendEntity(entA);
trans.AddNewlyCreatedDBObject(entA,true);
entList.Add(entA);
}
}
ent.Erase();
trans.Commit();
}
return entList;
}
public static List<Entity> ArrayRectEntity(this Entity entS, int rowNum, int columnNum, double disRow, double disColumn)
{
if (entS.IsNewObject == true)
{
List<Entity> entList = new List<Entity>();
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);
for (int i = 0; i < rowNum; i++)
{
for (int j = 0; j < columnNum; j++)
{
Matrix3d mt = Matrix3d.Displacement(new Vector3d(j * disColumn, i * disRow, 0));
Entity entA = entS.GetTransformedCopy(mt);
btr.AppendEntity(entA);
trans.AddNewlyCreatedDBObject(entA, true);
entList.Add(entA);
}
}
trans.Commit();
}
return entList;
}
else
{
return entS.ArrayRectEntity(rowNum, columnNum, disRow, disColumn);
}
}
public static List<Entity> ArrayPolarEntity(this ObjectId entId, int num, double degree,Point3d center)
{
List<Entity> entList = new List<Entity>();
using (Transaction trans = entId.Database.TransactionManager.StartTransaction())
{
BlockTable bt = (BlockTable)trans.GetObject(entId.Database.BlockTableId, OpenMode.ForRead);
BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
Entity ent = (Entity)entId.GetObject(OpenMode.ForWrite);
degree = degree > 360 ? 360 : degree;
degree = degree < -360 ? -360 : degree;
int divAngNum = num-1;
if (degree == 360 || degree == -360)
{
divAngNum = num;
}
for (int i = 0; i < num; i++)
{
Matrix3d mt = Matrix3d.Rotation((i * degree / divAngNum).DegreeToAngle(), Vector3d.ZAxis, center);
Entity entA = ent.GetTransformedCopy(mt);
btr.AppendEntity(entA);
trans.AddNewlyCreatedDBObject(entA, true);
entList.Add(entA);
}
ent.Erase();
trans.Commit();
}
return entList;
}
public static List<Entity> ArrayPolarEntity(this Entity ent, int num, double degree, Point3d center)
{
if (ent.IsNewObject == true)
{
List<Entity> entList = new List<Entity>();
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);
degree = degree > 360 ? 360 : degree;
degree = degree < -360 ? -360 : degree;
int divAngNum = num - 1;
if (degree == 360 || degree == -360)
{
divAngNum = num;
}
for (int i = 0; i < num; i++)
{
Matrix3d mt = Matrix3d.Rotation((i * degree / divAngNum).DegreeToAngle(), Vector3d.ZAxis, center);
Entity entA = ent.GetTransformedCopy(mt);
btr.AppendEntity(entA);
trans.AddNewlyCreatedDBObject(entA, true);
entList.Add(entA);
}
trans.Commit();
}
return entList;
}
else
{
return ent.ObjectId.ArrayPolarEntity(num, degree, center);
}
}
}
}
改变图形颜色
[CommandMethod("EditDemo")]
public void EditDemo()
{
Database db = HostApplicationServices.WorkingDatabase;
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);
db.AddEntityToModelSpace(c1);
c1.ChangeEntityColor(1);
c2.ChangeEntityColor(6);
db.AddEntityToModelSpace(c2);
}
移动图形
[CommandMethod("MoveDemo")]
public void MoveDemo()
{
Database db = HostApplicationServices.WorkingDatabase;
Circle c1 = new Circle(new Point3d(100, 100, 0), new Vector3d(0, 0, 1), 50);
Circle c2 = new Circle(new Point3d(100, 100, 0), new Vector3d(0, 0, 1), 50);
Circle c3 = new Circle(new Point3d(100, 100, 0), new Vector3d(0, 0, 1), 50);
Point3d p1 = new Point3d(100, 100, 0);
Point3d p2 = new Point3d(200, 300, 0);
db.AddEnityToModelSpace(c1,c2);
c2.MoveEntity(p1, p2);
c3.MoveEntity(p2, p1);
db.AddEnityToModelSpace(c3);
}
## 复制图形
```csharp
[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.AddEnityToModelSpace(c1,c2);
Circle c3 = (Circle)c1.CopyEntity(new Point3d(0, 0, 0), new Point3d(-100, 0, 0));
db.AddEnityToModelSpace(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.AddEnityToModelSpace(l1,l2,l3);
l2.RotateEntity(new Point3d(0, 0, 0), 60);
l3.RotateEntity(new Point3d(200, 500, 0), 90);
}
镜像图形
[CommandMethod("MirrorDemo1")]
public void MirrorDemo1()
{
Database db = HostApplicationServices.WorkingDatabase;
Circle c1 = new Circle(new Point3d(100, 100, 0), Vector3d.ZAxis, 50);
ObjectId cId = db.AddEnityToModelSpace(c1);
Entity Ent = cId.MirrorEntity(new Point3d(200, 100, 0), new Point3d(200, 300, 0), true);
db.AddEnityToModelSpace(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);
db.AddEnityToModelSpace(c2,ent2);
}
缩放图形
[CommandMethod("ScaleDemo")]
public void ScaleDemo()
{
Database db = HostApplicationServices.WorkingDatabase;
Circle c1 = new Circle(new Point3d(100, 100, 0), Vector3d.ZAxis, 50);
db.AddEnityToModelSpace(c1);
Circle c2 = new Circle(new Point3d(200, 100, 0), Vector3d.ZAxis, 50);
c2.ScaleEntity(new Point3d(200, 100, 0), 0.5);
db.AddEnityToModelSpace(c2);
Circle c3 = new Circle(new Point3d(300, 100, 0), Vector3d.ZAxis, 50);
db.AddEnityToModelSpace(c3);
c3.ScaleEntity(new Point3d(0, 0, 0), 2);
}
删除图形对象
[CommandMethod("EraseDemo")]
public void EraseDemo()
{
Database db = HostApplicationServices.WorkingDatabase;
Circle c1 = new Circle(new Point3d(100, 100, 0), Vector3d.ZAxis, 50);
Circle c2 = new Circle(new Point3d(200, 100, 0), Vector3d.ZAxis, 50);
db.AddEnityToModelSpace(c1, c2);
c2.ObjectId.EraseEntity();
}
矩形阵列图形
[CommandMethod("ArrayRectDemo1")]
public void ArrayRectDemo1()
{
Database db = HostApplicationServices.WorkingDatabase;
Circle c = new Circle(new Point3d(100, 100, 0), Vector3d.ZAxis, 10);
c.ArrayRectEntity(5, 6, -50, 50);
}
环形阵列图形
[CommandMethod("ArrayPolarDemo")]
public void ArrayPolarDemo()
{
Database db = HostApplicationServices.WorkingDatabase;
Line l = new Line(new Point3d(100, 100, 0), new Point3d(120, 120, 0));
l.ArrayPolarEntity(7, -270, new Point3d(110, 300, 0));
}