using System;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.EditorInput;
#pragma warning disable 0618
[assembly: CommandClass(typeof(Rivilis.SelPolylineSegment))]
namespace Rivilis
{
public class SelPolylineSegment
{
[CommandMethod("SelPolySeg")]
public void SelPolySeg()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
if (doc == null)
return;
Editor ed = doc.Editor;
Database db = doc.Database;
// Просим пользователя выбрать сегмент полилинии
PromptEntityOptions prOpt =
new PromptEntityOptions("\nУкажите сегмент полилинии: ");
prOpt.SetRejectMessage("Это не полилиния!");
prOpt.AddAllowedClass(typeof(Polyline), true);
PromptEntityResult prRes = ed.GetEntity(prOpt);
if (prRes.Status != PromptStatus.OK)
return;
// Получаем точку указания в МСК (WCS)
Matrix3d ucs2wcs = ed.CurrentUserCoordinateSystem;
Point3d pWcs = prRes.PickedPoint.TransformBy(ucs2wcs);
// Получаем вектор взгляда в МСК (WCS)
Vector3d viewDir =
((Point3d)(Application.GetSystemVariable("VIEWDIR")))
.TransformBy(ucs2wcs).GetAsVector().Negate();
using (Polyline pline = prRes.ObjectId.Open(OpenMode.ForRead) as Polyline)
{
// Находим точку на полилинии ближайшую к указанной
// с учетом направления взгляда
Point3d pOnPline = pline.GetClosestPointTo(pWcs, viewDir, false);
// Получаем параметр полилинии в полученной точке на полилинии
double param = pline.GetParameterAtPoint(pOnPline);
// Номер сегмент полилинии определяется её параметром
int iSeg = (int) param + 1; // Нумеруем сегменты от 1
// Подсвечиваем сегмент полилинии
HighlightPolyline(pline, iSeg);
}
}
public void HighlightPolyline(Polyline pline, int segment)
{
FullSubentityPath path =
new FullSubentityPath(
new ObjectId[] { pline.Id },
new SubentityId(SubentityType.Edge, new IntPtr(segment))
);
// Подсвечиваем сегмент
pline.Highlight(path, true);
}
}
}