а подсветить как сегмент этот как делает ctrl + выбор?А подсветить вот так:
а как получить координату точки выбора?Editor.GetEntity возвращает выбранный примитив и координату точки выбора (в ПСК)
и как каким методом мне соотнести эту точку с сегментом? как достать координаты сегмента?Посмотреть методы и свойства класса Polyline и найти подходящие.
GetSelection я так понял нет?GetSelection возвращает набор - координаты там нет.
но не могу понять что значит valueДля этой цели есть документация - читай её.
Я читал везде это гарантия каким то параметром. Где то написано что то вроде азотной параметр индекса вершины, если дословно. И что же это..Жуть и полный бред. Это какой из переводчиков так переводит?
Жуть и полный бред.так подскажете что значит этот параметр?
и вот этот метод: GetParameterAtPointЕсли ты не знаком с параметрическими кривыми (вообще, а не только в AutoCAD), то в двух словах я тебе это не объясню - ищи в интернете. В данном случае для полилиний параметр является целым числом в каждой из вершин полилиний. Например, параметр 1.0 - это вторая вершина, а 1.5 это середина третьего сегмента.
что за магический параметр он возвращает?
По поводу подсветки: я так понял она подсветится при нажатии лишь. а при наведении? чтоб как при зажатом ctrl можно так?Ну так просто это сделать у тебя не получится. Тебе еще очень долго придётся изучать PointMonitor и Overruling.
так я ж не против)Ты до сих пор не объяснил что тебе нужно. Как же я могу тебе сказать, что тебе делать? В названии темы стоит - "как выбрать сегмент полилинии". На этот вопрос ответ уже давно дан.
хотите сказать пока проще зажать ctrl?
Так вот вопрос: зачем вот здесь так усложнено получение координаты? или я чего то опять не понимаю?Видимо ты совершенно не понимаешь что такое ПСК (UCS). Кроме того ты видимо ничего не знаешь о внутренней системе координат ОСК (ECS) полилинии, в которой нужно передавать точку в метод OnSegmentAt. Изучай.
http://www.acadnetwork.com/index.php?topic=203.0
наверное.. но ведь работает..Работает если выполняются два условия:
ну я могу сказать что не припомню случаев когда они у меня не выполняются)Ты программы пишешь только для себя?
стесняюсь сказать что нет)А я вот не стесняюсь сказать, что нужно учитывать все возможные варианты. Даже если пишешь для себя, то и в этом случае тебе может достаться чужой чертеж, в котором ПСК != МСК.
ps: дада я пошел изучать)
в этом примере кстати в методе OnSegmentAt последний параметр используется 0.С этим параметром очень интересно. В ObjectARX в методе AcDbPolyline::onSegAt этот параметр передаётся по ссылке:
что же он все таки значит?
If pt2d is on the polyline's segment, then param is set to the location of the point on the segment. param will be in the parametric form of the segment typeВ .NET Polyline.OnSegmentAt - это обертка для AcDbPolyline::onSegAt. Но она похоже какая-то неправильная, так как она должна была бы быть такой:
Тут еще в скобочках как это понимать?... типа сегмента (другими словами линейного или дугового).
Для альтернатив проще?Там тоже это следует учитывать.
Попробовал сделать как в примере. Повертел системы координат по всем осям и так и сяк и довертел до того состояния, когда код из примера по ссылке, что я кидал, не работает.Там тоже не всё чисто в коде. В частности, там вообще не учитывается условие 2.
с переводом я справился. Как параметр связан с типом сегмента?Тут еще в скобочках как это понимать?... типа сегмента (другими словами линейного или дугового).
Как параметр связан с типом сегмента?Для дуги и для линейного сегмента параметры считаются по разному. Не вижу смысла углубляться в эту сторону.
а как узнать OCS полилинии?У Entity (базового класса для Polyline) есть свойство Entity.Ecs - вот им и можно воспользоваться для получения матрицы OCS (или ECS).
мне же к ней нужно точку привестиТут в каждом слове перл:
*убрал чтоб не ругались*Поздно. Всё уже записано! :-)
как же просто а я мучаюсь с нормалями всякимиС вероятностью 99% тебе для решения этой задачи не нужна OCS(ECS)
спасибо большое!
я пытаюсь добить метод onsegmentatЯ уже высказал своё мнение по этому поводу.
Я вот упрощенный метод здесь не очень понимаю. Из текущей в текущую преобразовывают?
http://spiderinnet1.typepad.com/blog/2013/05/autocad-net-transform-picked-point-from-current-ucs-to-wcs.html
А какие аналоги? Я что то не приметил подобных методов(Тестируй:
Готовый код?(Ну как минимум будет возможность изучить, разобраться в логике работы, протестировать.
Моя логика хотя бы была верна в следующем:Всё в точности до наоборот. Читаем документацию. pline.Ecs вернёт матрицу преобразования из ECS в WCS. Т.е. тебе нужна обратная матрица: pline.Ecs.Invert(). Ну и кроме того тебе понадобится еще одно преобразование - UCS в WCS, так как точку ты получаешь от пользователя в UCS. И еще передаваемая точка в метод onsegmentat должна быть в точности на полилинии, а Editor.GetEntity возвращает точку не на полилинии, а рядом в пределах размера pickbox. Поэтому в моём коде и используется нахождение точки на полилинии, ближайшей к указанной (метод GetClosestPointTo).
Чтоб получить точку в ECS:
Point3d ptEcs = ptWcs.TransformBy(pline.Ecs);
И эту точку уже передавать в метод onsegmentat? Точнее ее х и у
все таки не всегда корректно работаетЧей вариант? Если мой - выкладывай чертеж в котором появляется ошибка. А еще лучше еще и добавь видео (как это делать - у меня в подписи).
покрутил начало координат порисовал в разных плоскостях эти полилинии. и в какой то момент он не понимает что где
это рационально?Это нормально для данного случая.
все таки не всегда корректно работаетНу вот ты и нарвался на баг в AutoCAD .NET API, с чем тебя и поздравляю. Нужно будет отправить в ADN DevHelp.
Кстати, проверять на равенство плавающие числа (double) не следует.это вы к тому что машинный ноль не всегда 0?
pl.SetStartWidthAt(n, 0.0);это принципиально или просто для наглядности?
это вы к тому что машинный ноль не всегда 0?Ты сравниваешь на равенство ширину сегмента полилинии и width на равенство. Так делать не следует.
а про viewDir: я думал вы использовали именно этот метод чтоб он корректно работал при различно повернутых UCS? или как?Нет. Не путай ПСК и направление взгляда - это разные вещи.
это принципиально или просто для наглядности?Для наглядности.
И по поводу upgradeipen. Зачем он тут вообще если в любом случае нужно будет взять на запись?В данном случае это неважно. Но я в большинстве случаев предпочитаю открывать на запись на минимально короткое время.
Тогда какую роль играет это направление? Какая разница между этими методамиПришлось использовать метод, который не учитывает направление. Но боюсь, что возможны варианты, когда это не будет работать, т.е. будет выбираться не тот сегмент полилинии, т.к. в качестве ближайшей точки будет выбрана не та, которая нам нужна.
Ну вот ты и нарвался на баг в AutoCAD .NET API, с чем тебя и поздравляю. Нужно будет отправить в ADN DevHelp.Похоже в этот раз я не прав и это не баг. Баг в другом - в вычислении направления взгляда.
int n = (int)(pl.GetParameterAtPoint(pW) + 1e-10);
if (pl.GetStartWidthAt(n) > 1e-10)написал вот так
НЕАКТУАЛЕН! ПРОТЕСТИРУЮ ИСПРАВЛЮНичего не понял. Ты про какой вариант пишешь?
Ну да если в других плоскостях то тоже неправильно работает.
а предыдущий вроде бы лучше в пространстве работал. но зато в более простых плоских чертежах со смещенным началом координат шалит.
т.к. у меня обычно плоские и простые так что оставлю последний вариант.
вот эта строчка не очень понятна. вы не доверяете точности метода?При преобразовании плавающего к целому отбрасываются дробная часть. Поэтому (int)0.99999999999 будет равно 0, а не 1
Цитата: Александр Ривилис от 16-10-2018, 21:46:23
int n = (int)(pl.GetParameterAtPoint(pW) + 1e-10);
написал вот такСогласен.
Код - C# [Выбрать]
if (Math.Abs(pl.GetStartWidthAt(n) - width) > 1e-5)
так если ширина уже какая то установлена то он ее не обнуляет а меняет на актуальную.
При преобразовании плавающего к целому отбрасываются дробная часть. Поэтому (int)0.99999999999 будет равно 0, а не 1это я знаю
1. С такой точностью ты не выберешь конец сегмента.При преобразовании плавающего к целому отбрасываются дробная часть. Поэтому (int)0.99999999999 будет равно 0, а не 1это я знаю
но может мы на конец желаемого сегмента нажали.. и получилось 0.9999999999 а программа выберет следующий.. неприятно
ну а как может получиться 0,99999999 при нажатии на начало второго сегмента тогда?Да. А к чему этот вопрос? Это утверждение противоречит чему-то, что я писал?
скорее будет 1,000000001?
я к тому что это прибавление 1е-10 , по моему, не играет ролиНе нравится - не прибавляй.