using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
using System;
using System.Collections.Generic;
// This line is not mandatory, but improves loading performances
[assembly: CommandClass(typeof(Rivilis.TestIntersect))]
namespace Rivilis
{
public class TestIntersect
{
[CommandMethod("GetIntSegs")]
public void GetIntSegsHandler()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
if (doc == null) return;
Editor ed = doc.Editor;
PromptEntityOptions prEntOpt =
new PromptEntityOptions("\nВыберите основную линию, пересечение с которой мы ищем: ");
prEntOpt.SetRejectMessage("Это не линия");
prEntOpt.AddAllowedClass(typeof(Curve), false);
PromptEntityResult prEntRes = ed.GetEntity(prEntOpt);
ObjectIdCollection ids = new ObjectIdCollection();
if (prEntRes.Status != PromptStatus.OK)
return;
ids.Add(prEntRes.ObjectId);
prEntOpt.Message =
"Выберите очередную линию для пересечения (ENTER - завершение)";
while (true)
{
prEntRes = ed.GetEntity(prEntOpt);
if (prEntRes.Status != PromptStatus.OK)
break;
ids.Add(prEntRes.ObjectId);
}
if (ids.Count == 1) {
ed.WriteMessage("\nНичего не выбрано!");
return;
}
Point3dCollection pts = new Point3dCollection();
using (Transaction tr = doc.TransactionManager.StartTransaction())
{
Curve mainCurve = (Curve)tr.GetObject(ids[0], OpenMode.ForRead);
pts.Add(mainCurve.StartPoint); pts.Add(mainCurve.EndPoint);
for (int i = 1; i < ids.Count; i++) {
Curve secondCurve = (Curve)tr.GetObject(ids[i], OpenMode.ForRead);
mainCurve.IntersectWith(secondCurve, Intersect.OnBothOperands, pts, IntPtr.Zero, IntPtr.Zero);
}
// Итак мы получили все точки (крайние и точки пересечений)
// Сортируем их по координате X
Point3d[] ptsa = new Point3d[pts.Count]; pts.CopyTo(ptsa, 0);
List<Point3d> ptsl = new List<Point3d>(ptsa);
ptsl.Sort((p1, p2) =>
{
if (p1.X < p2.X) return -1;
else if (p1.X > p2.X) return 1;
return 0;
});
for (int i = 0; i < ptsl.Count - 1; i++)
{
ed.WriteMessage($"\nНачало = {ptsl[i].X} Конец = {ptsl[i + 1].X} Длина по X = {ptsl[i + 1].X - ptsl[i].X}");
}
tr.Commit();
}
}
}
}