Рисуем снежинку по кривой Коха в Autocad .NET API C#

Сегодня напишем простенький плагин для Autocad, который при вводе команды Snowflake будет автоматически рисовать снежинку из полилиний.

Конечно же, подразумевается, что вы умеете работать с Visual Studio и знакомы с программой Autocad.

При создании я использовал версию Autocad 2017 и Visual Studio 2017. Для успешной работы необходимо добавить в среду разработки ссылки на такие библиотеки как AcCoreMgd, AcDbMgd, AcMgd. О том, как добавить и где скачать эти библиотеки можно узнать в сети Интернет.

Итак, для построения снежинки будем использовать кривую Коха (можете о ней почитать в интернете). Сама снежинка будет иметь бесконечный периметр, но все же ограничена конечной областью плоскости. Для ее создания используем равносторонний треугольник, разделив каждую из его сторон на три части и по каждой из трех центральных третей построим по равностороннему треугольнику меньших размеров. Таким образом, повторяя это построение бесконечное множество раз, получим фрактальный объект, называемый кривой Коха.

Рабочий код:

using Autodesk.AutoCAD.Runtime;
using AcadApp = Autodesk.AutoCAD.ApplicationServices.Core.Application;
using AcadTransMgr = Autodesk.AutoCAD.DatabaseServices.TransactionManager;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.EditorInput;

namespace KochSnowflake
{
public class Class1
{
const int color1 = 3;
const int color2 = 5;

[CommandMethod("Snowflake")]
public void Snowflake()
{
Document doc = AcadApp.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor editor = doc.Editor;
AcadTransMgr transMgr = db.TransactionManager;

Point2d point1 = new Point2d(2000, 2000);
Point2d point2 = new Point2d(5000, 2000);
Point2d point3 = new Point2d(3500, 4000);

using (Transaction baseTransaction = transMgr.StartTransaction())
{
BlockTable BlockTable;
BlockTable = baseTransaction.GetObject(db.BlockTableId,
OpenMode.ForRead) as BlockTable;

BlockTableRecord blockTableRecord;
blockTableRecord = baseTransaction.GetObject(BlockTable[BlockTableRecord.ModelSpace],
OpenMode.ForWrite) as BlockTableRecord;

DrawLine(baseTransaction, blockTableRecord, point1, point2, 3);
DrawLine(baseTransaction, blockTableRecord, point2, point3, 3);
DrawLine(baseTransaction, blockTableRecord, point3, point1, 3);

Fractal(baseTransaction, blockTableRecord, point1, point2, point3, 5);
Fractal(baseTransaction, blockTableRecord, point2, point3, point1, 5);
Fractal(baseTransaction, blockTableRecord, point3, point1, point2, 5);

// Находим синии полилинии
TypedValue[] filterlist = new TypedValue[2] {
new TypedValue((int)DxfCode.Start, "LWPOLYLINE"),
new TypedValue((int)DxfCode.Color, 5)
};
SelectionFilter filter = new SelectionFilter(filterlist);
PromptSelectionResult selResult = editor.SelectAll(filter);

if (selResult.Status != PromptStatus.OK)
{
return;
}

ObjectId[] objectIds = selResult.Value.GetObjectIds();

foreach (var ObjectId in objectIds)
{
Polyline polyline = ObjectId.GetObject(OpenMode.ForRead) as Polyline;

// Удаляем полилинии
polyline.Erase();
}

baseTransaction.Commit();
}
}

private void DrawLine(Transaction transaction, BlockTableRecord blockTableRecord, Point2d point1, Point2d point2, int color)
{
using (Polyline triangle = new Polyline())
{
triangle.AddVertexAt(0, point1, 0, 0, 0);
triangle.AddVertexAt(1, point2, 0, 0, 0);

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Добавить комментарий

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: