Могу предположить, что это можно сделать с помощью DrawableOverruleСобственно говоря ты прав. Насколько это будет нагружать AutoCAD ты сможешь проверить только экспериментально.
Остался вопрос - размер в процентах от экранаВысота видового экрана в единицах чертежа:
Но такой значок я лично не представляю как можно нарисовать. Это как реализовано?Скорее всего это просто символ шрифта, как пример посмотри Segoe UI Symbol там под номером U+26A0 похожий значок
вариант как на скрине в топике (для параметризации) сделан явно без использования Drawable Overrule, так как там окошко с кнопкой и контекстным меню.Ну это и сделано не с помощью AutoCAD .NET API, а с помощью ObjectARX. Хотя возможно при помощи GripsOverrule это можно сделать. Надо ли только такие сложности?
Скорее всего это просто символ шрифта, как пример посмотри Segoe UI Symbol там под номером U+26A0 похожий значокВозможно, хотя я бы был осторожнее со шрифтами, которых может просто не быть на PC.
Надо ли только такие сложности?Нет конечно) Просто хотелось понять как они это реализовали
Единственное, что мне не нравится в варианте с Drawable Overrule - то, что если я буду размер "значка" делать в зависимости от размера экрана (в процентах), то он будет перерисовываться после вызова Regen.Ты имеешь в виду, что он будет перерисовывать только после вызова Regen? Чтобы этого избежать придётся потрудится и обрабатывать все изменения размера экрана (высоты экрана в единицах чертежа), а это несколько различных событий, и выполнять обновление своих примитивов, т.е. делать самостоятельно их регенерацию.
В методе WorldDraw не создаются примитивы. Вот мой пробник с поясняющим комментарием:
Единственное, что мне не нравится в варианте с Drawable Overrule - то, что если я буду размер "значка" делать в зависимости от размера экрана (в процентах), то он будет перерисовываться после вызова Regen.Насколько я помню, в Civil 3D значок предупреждения динамически размеры не изменяет, тоже только после регенерации.
А тут получается только наипростейшая фигура, у которой я не могу поменять ни цвет, ни толщину, не могу создать заливку.Глянь wd.SubEntityTraits - там всё это можно задать.
Насколько я помню, в Civil 3D значок предупреждения динамически размеры не изменяет, тоже только после регенерацииЯ это и написал ))
Я конечно не пробовал, но по опыту работы в Civil почти на 100% уверен, что это так
1. wd.SubEntityTraits.FillType не восстанавливается исходное состояние, как это сделано для wd.SubEntityTraits.Color.Спасибо, учту. Но это вряд-ли является причиной
2. в методе ShowIcon() нет проверки на то, что MpProductsDrawableOverrule уже было ранее включеноДа, ты прав! Не предусмотрел. Но тоже не критично. Выскакивает ошибка
Но это вряд-ли является причинойЯ так подозреваю, что причина с большой вероятностью может быть в других участках кода.
можно эту геометрию предусмотреть так, чтобы она была только в модели и не показывалась на листахВроде как, для обработки отображения с учётом вариаций на видовых экранах листов, нужно переопределять метод ViewportDraw.
и не выходила на печать?Единственный вариант, который приходит в голову - отслеживать события запуска-завершения команды печати. Перед выводом на печать, как правило, выполняется регенерация и метод перерисовки, соответственно, вызывается. Поэтому, в методе перерисовки достаточно будет проверить, что в настоящий момент выполняется команда печати, и не рисовать дополнительную геометрию. Но эту идею надо проверять, сам не пробовал.
и не выходила на печать?Цвет меняешь.... может на слой Defpoints перевести маркер?
Единственный вариант, который приходит в голову - отслеживать события запуска-завершения команды печати.Думаю, что это должно быть лучше: Context.IsPlotGeneration
http://adn-cis.org/kak-opredelit,-chto-myi-naxodimsya-v-kontekste-pechati.html и статья естьТочно. Я даже забыл, что переводил эту статью.
У некоторых пользователей при включенном режиме (при активном DrawableOverrule) при сохранении документа происходит фаталПри сохранении или при закрытии документа или при завершении AutoCAD?
try-catch как то не очень нравиться.Ставь try/catch - дешевле будет. Исключение может возникнуть и по другим причинам, а не только потому что растягивают объект. Вообще же при Jig обычно участвуют не сами объекты, а их клоны, т.е. их свойство ObjectId == ObjectId.Null
Ставь try/catch - дешевле будет. Исключение может возникнуть и по другим причинам, а не только потому что растягивают объект. Вообще же при Jig обычно участвуют не сами объекты, а их клоны, т.е. их свойство ObjectId == ObjectId.NullСпасибо. понял почему падало. Я убрал фильтрацию по объектам ModPlus (if (ent.IsModPlusProduct()) и рисовал значок для всех объектов, а при растягивании, при включенном динамическом вводе, создаются временные размеры, у которых запрос свойства GeometricExtents и вызывает ошибку. и да, у них ObjectId == ObjectId.Null .
var pt = extents.MaxPoint.TransformBy(ucs.Inverse());Я знаю об этом варианте поворота, но пока ничего не придумал. Брать EndPoint не вариант, т.к. я и обычный блок могу повернуть в "такое состояние"
не очень хорошее решение, так как может получаться вот так:
И вот это не оченьПока что не вижу причин, чтобы переживать в этом месте )
points.Add(new Gem.Point3d(pt.X + (offset + 00) * scale, pt.Y + (offset + 00) * scale, plane.PointOnPlane.Z));
наверное стоит задавать векторами, в соответствии с направлением линии на конце которой строится иконка...
Пока что не вижу причин, чтобы переживать в этом месте )Причина может быть в том, что поддерживать такой код сложно - он трудночитаемый. И ещё, если нужно будет внести какие-то правки, то это придётся делать одновременно в нескольких строчках. Есть риск, что где-то забудешь изменить.