using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
namespace AcadTest
{
public class TestExtents
{
[CommandMethod("TestExts")]
public void TestExtsCmd()
{
Document adoc = Application.DocumentManager.MdiActiveDocument;
Editor ed = adoc.Editor;
Database db = adoc.Database;
// Тестируем в цикле
while (true)
{
// Получаем первую точку границы
PromptPointResult extFirstPtRes = ed.GetPoint("\nFirst exts point: ");
if (extFirstPtRes.Status != PromptStatus.OK) break;
// Получаем вторую точку границы
PromptPointResult extSecondPtRes = ed.GetCorner("\nSecond exts point: ", extFirstPtRes.Value);
if (extSecondPtRes.Status != PromptStatus.OK) break;
// Создаем тестируемый объект
Extents3d exts = new Extents3d();
exts.AddPoint(extFirstPtRes.Value);
exts.AddPoint(extSecondPtRes.Value);
// Для наглядности, создаем пямоугольник по границе до изменений
CreateRectangle(db, exts.MinPoint, exts.MaxPoint);
// Запрашиваем конечную точку вектора, как начальную
// используем максимальную точку границы
Point3d vecStartPt = exts.MaxPoint;
PromptPointOptions vecEndPtOpt = new PromptPointOptions("\nEnd of vector: ");
vecEndPtOpt.UseBasePoint = true;
vecEndPtOpt.BasePoint = vecStartPt;
PromptPointResult vecEndPtRes = ed.GetPoint(vecEndPtOpt);
if (vecEndPtRes.Status != PromptStatus.OK) break;
// Вычисляем вектор
Vector3d vector = vecEndPtRes.Value - vecStartPt;
// Для наглядности, создаем отрезок вектора
CreateLine(db, vecStartPt, vector);
// Применяем метод ExpandBy
exts.ExpandBy(vector);
// Для наглядности, создаем прямоугольник по границе после изменений
CreateRectangle(db, exts.MinPoint, exts.MaxPoint);
}
}
/// <summary>
/// Метод создания отрезка
/// </summary>
/// <param name="db">База данных чертежа</param>
/// <param name="pt">Начальная точка отрезка</param>
/// <param name="vector">Вектор направления от начальной точки к конечной</param>
static void CreateLine(Database db, Point3d pt, Vector3d vector)
{
using (Transaction tr = db.TransactionManager.StartTransaction())
{
Line line = new Line(pt, pt + vector);
BlockTableRecord cSpace = tr.GetObject
(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
cSpace.AppendEntity(line);
tr.AddNewlyCreatedDBObject(line, true);
tr.Commit();
}
}
/// <summary>
/// Создание прямоугольника по двум точкам
/// </summary>
/// <param name="db">База данных чертежа</param>
/// <param name="pt1">Первая точка</param>
/// <param name="pt2">Вторая точка</param>
static void CreateRectangle(Database db, Point3d pt1, Point3d pt2)
{
using (Transaction tr = db.TransactionManager.StartTransaction())
{
Polyline pline = new Polyline(4);
pline.AddVertexAt(0, new Point2d(pt1.X, pt1.Y), 0.0, 0.0, 0.0);
pline.AddVertexAt(1, new Point2d(pt2.X, pt1.Y), 0.0, 0.0, 0.0);
pline.AddVertexAt(2, new Point2d(pt2.X, pt2.Y), 0.0, 0.0, 0.0);
pline.AddVertexAt(3, new Point2d(pt1.X, pt2.Y), 0.0, 0.0, 0.0);
pline.Closed = true;
BlockTableRecord cSpace = tr.GetObject
(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
cSpace.AppendEntity(pline);
tr.AddNewlyCreatedDBObject(pline, true);
tr.Commit();
}
}
}
}