Всем привет. Задача вроде тривиальная, но не тут-то было ))
В общем - хочу одним выбором объединить два действия - выбрать полилинию и выбрать сегмент полилинии.
Мои предположения: используем PromptEntityResult и получаем выбранный примитив (полилинию) и точку PickedPoint. По точке определяем сегмент.
Т.к. метода получить сегмент по точке нет, то делаем итерацию по вершинам, получаем сегмент в вершине, проверяем его тип (в моем случае нужна Дуга) и проверяем, что PickedPoint принадлежит сегменту. Ну или рядом. У Kean Walmsley нашел похожую тему и попытался ее "прикрутить" к своим нуждам. Прикладываю один из вариантов моих попыток:
try
{
var doc = AcApp.DocumentManager.MdiActiveDocument;
var db = doc.Database;
var ed = doc.Editor;
while (true)
{
var peo = new PromptEntityOptions("\nВыберите дуговой сегмент полилинии: ")
{
AllowNone = false,
AllowObjectOnLockedLayer = true
};
peo.SetRejectMessage("\nНеверный выбор");
peo.AddAllowedClass(typeof(Polyline), true);
var per = ed.GetEntity(peo);
if (per.Status != PromptStatus.OK) return;
var plineId = per.ObjectId;
var pickedPt = per.PickedPoint;
using (doc.LockDocument())
{
using (var tr = db.TransactionManager.StartTransaction())
{
var dbObj = tr.GetObject(plineId, OpenMode.ForRead);
if (dbObj is Polyline)
{
var pline = dbObj as Polyline;
for (var i = 0; i < pline.NumberOfVertices; i++)
{
var segType = pline.GetSegmentType(i);
if (segType == SegmentType.Arc)
{
Curve3d segment = pline.GetArcSegmentAt(i);
var p = segment.GetClosestPointTo(pickedPt).Point;
if (segment.IsOn(p))
{
pline.UpgradeOpen();
//.......остальной неважный код
break;
}
}
}
}
tr.Commit();
}
}
}
}
catch (System.Exception exception)
{
MpExWin.Show(exception);
}
Логично, что код должен работать, но он не работает. Я пробовал различные вариации, в том числе из Tolerance.Global.EqualPoint. Но либо код вообще не работает, либо работает когда курсор в момент выбора находится на соседнем сегменте