просто в WorldDraw рисуешь что хочешьДа ладно, как так? Вообще, что хочешь?
У меня не вышло так. :(Пробовал?
В методе WorldDraw из первого поста (DrawJig, строка 116), можно рисовать линии, окружности и пр. вызывая методы draw.Geometry.WorldLine, draw.Geometry.Circle и др.
Пробовал?Дочертить линию или окружность получалось, но вот не вышло отслеживать точку. Возможно, я неправильно понимаю концепцию.
Возможно, я неправильно понимаю концепцию.Похоже что так. В методе WorldDraw происходит только отрисовка. Т.е. в этом методе ты (используя значение pp2) должен модифицировать вставку блока (изменить его динамический параметр или параметры, как ты делаешь в строках 52...74 твоего кода, корректность которых я не проверял) и вызывать для него метод draw.Geometry.Draw(). Не уверен, что это будет нормально работать для динамического блока, но можешь попробовать.
В методе WorldDraw происходит только отрисовка. Т.е. в этом методе ты (используя значение pp2) должен модифицировать вставку блока (изменить его динамический параметр или параметры, как ты делаешь в строках 52...74 твоего кода, корректность которых я не проверял) и вызывать для него метод draw.Geometry.Draw(). Не уверен, что это будет нормально работать для динамического блока, но можешь попробовать.Спасибо большое! Вроде как, работает нормально. По крайней мере ничего ненормального я не заметил.
Прятать исходную вставку блока-стрелки я бы не стал.Почему?
Для определения угла поворота можно воспользоваться не AcquirePoint, а AcquireAngle, чтобы было больше похоже на то, как это делает AutoCAD при вставке блока.Спасибо. Обязательно попробую.
Почему?Мне так кажется. Это не имеет отношения к программированию. Просто я бы так сделал. Кстати, это бы позволило бы еще добавить и динамически размеры (длину и угол поворота). Впрочем это твоё дело.
Выглядит нормально. Прятать исходную вставку блока-стрелки я бы не сталА у меня почему-то и не вышло ее спрятать.
Кстати, это бы позволило бы еще добавить и динамически размеры (длину и угол поворотаУвидеть бы подобное в действии, не очень понятно, каким образом..
Увидеть бы подобное в действии, не очень понятно, каким образом..У меня своего примера нет. Посмотри вот этот: http://spiderinnet1.typepad.com/blog/2012/03/autocad-net-entityjig-dynamic-dimension-and-line-jig.html
А у меня почему-то и не вышло ее спрятать.Ну и не надо.
У меня своего примера нет. Посмотри вот этот: http://spiderinnet1.typepad.com/blog/2012/03/autocad-net-entityjig-dynamic-dimension-and-line-jig.htmlСпасибо. Разберусь.
Ну и не надо.Хотелось бы. ) Думаю, со временем пойму.
Хотелось бы. ) Думаю, со временем пойму.Ну если приведёшь код, то будет понятно в чем проблема. Скорее всего скрываешь не тот блок.
Просто в некоторых случаях (на определенных блоках) смотрится совсем не очень.
Ну если приведёшь код, то будет понятно в чем проблема. Скорее всего скрываешь не тот блок.Я уже привел (#12). :)
Добавляю подкорректированный, как я считаю, код, который позволяет манипулировать блоком, как в посте #8:
Спойлер
Я уже привел (#12). :)И где же ты там прячешь блок? Я уже не говорю, что у тебя там есть куча странностей, типа ненужных blockRef.Dispose();
И где же ты там прячешь блок?Так я же и говорю, что ничего не вышло. :-\
Я уже не говорю, что у тебя там есть куча странностей, типа ненужных blockRef.Dispose();Работал с примером из поста #1 данной темы. Там был Dispose(), вот я и оставил. Полного понимания работы каждой строчки нет, отсюда и странности.
Так я же и говорю, что ничего не вышло. :-\Для то, чтобы скрыть вставленный в базу примитив необходимо использовать свойство Visible (устанавливать его в false).
Для то, чтобы скрыть вставленный в базу примитив необходимо использовать свойство Visible (устанавливать его в false).Сделано. В первой транзакции после первого Jig (перед добавлением нового DBOObject) добавил false, а потом во втором Jig в WorldDraw добавил true и все так, как надо. Спасибо!
А есть ли способ заставить работать ОРТО режим при ввод в коде опубликованном в этом посте ?Дело в том, что у меня построение происходит по 2м точкам, поэтому орто и не работает (как мне кажется). Вот если использовать совет Александра Ривилиса:
Добавление UserInputControls.GovernedByOrthoMode в методе MyBlockJig2.Sampler() к нужному результату не приводят
Для определения угла поворота можно воспользоваться не AcquirePoint, а AcquireAngle, чтобы было больше похоже на то, как это делает AutoCAD при вставке блока.То, думаю, будет работать. Пока сам не пробовал, потому что все эти вопросы затевались для другого блока, а этот - просто что-то первое простое, что пришло в голову.
Насколько я помню орто возможно только тогда, когда задана базовая точка, т.е.
Я видел эту и эту ссылкиBoxa.Shu, извини, что-то ссылки твои не открываются, не мог бы ты подкорректировать?
я сильно сомневаюсь что evthisrel менял код метода MyBlockJig2.Sampler под новый блок и у него в видео из 22 сообщения видно, что сообщение не выводитсяДа, ты прав. Сообщение не выводится. И я не разобрался, почему.
сообщения объявленное в jigOpts.Message не выводятся (я сильно сомневаюсь что evthisrel менял код метода MyBlockJig2.Sampler под новый блок и у него в видео из 22 сообщения видно, что сообщение не выводится):А должно было выводится? Откуда prompts.AcquirePoint() знать о существовании jigOpts ???
Откуда prompts.AcquirePoint() знать о существовании jigOptsТак, разобрался. Перегрузки этого метода я и не посмотрел... все заработало. Спасибо.
А должно было выводится? Откуда prompts.AcquirePoint() знать о существовании jigOptsСпасибо!
Насколько я помню орто возможно только тогда, когда задана базовая точкаПолучается, нет, достаточно только того, что Boxa.Shu дописал (точнее, я не задавал базовую точку, а просто дописал опцию, и все работает с орто):
Подозреваю, что проблема в самом блоке.С блоком, однозначно, все в порядке (он создан при помощи параметров и операций - там не может быть таких приколов).
Подозреваю, что проблема в самом блоке.нет, он очень простой, там нечему ломаться.
Как при использовании DrawJig, при вводе точки или дистанции включить динамический ввод?Наверное нужно вводить с базовой точкой.
Наверное нужно вводить с базовой точкой.И с базовой точкой и со значением по умолчанию... не получается.
Максим Маркевич, спасибо за упоминание отрицательного значения! слона то я и не заметил.Да не за что. Было в кайф поразбираться. :)
Решение: блок менять не нужно, код менять не нужно (AcquireDistance вполне справляется) просто добавить условие в метод WorldDraw, что производить присвоение значения, только при положительном вводном.
Спасибо за помощь. Чувствовал, что загвоздка очевидная и простая, но нащупать самостоятельно не смог.
Кстати, в составе ObjectARX SDK есть пример samples\dotNet\EllipseJig, который использует динамические размеры.Вот за это спасибо. Очень ценный пример.
Кстати, я пробовал в твоем коде просто втупую добавить модуль в присвоении значения динамическому параметру, но мне не помогло.Проблема кажется не только в отрицательных, но и в нулевых значениях.
Спасибо, понял. Я думал, есть более простой путь...А как ты себе представлял более простой путь? Как программа сама догадается сколько и каких размеров ты хотел бы добавить и как они связаны с тем что у тебя рисуется в этот момент времени? Кстати, аналогичный способ используется и в Custom Entity (и в Overrule) для работы с "ручками".
Проблема кажется не только в отрицательных, но и в нулевых значениях.Угу, вот кусок кода =о)
А как ты себе представлял более простой путь?В процессе вытягивания, при включенном орто режиме, возле курсора появляется окошко со значением, вот и думал можно ли как то до него достучаться и передать значение... видимо нельзя и нужно делать самому.
Проблема кажется не только в отрицательных, но и в нулевых значениях.Поэтому я люблю полярные параметры, чаще всего, они удобней в обращении в автокаде, и так уж сложилось, что менее требовательны к коду, который ими манипулирует.
В процессе вытягивания, при включенном орто режиме, возле курсора появляется окошко со значением, вот и думал можно ли как то до него достучаться и передать значение... видимо нельзя и нужно делать самому.Я примерно также это все представлял(до сегодняшнего дня), пока не посмотрел samples\dotNet\EllipseJig. :)
То что я вижу - это полная ерунда:не ерунда =) , а нагромождение хлама и кусков чужого кода, только для экспериментов и для того что бы разобраться.
блок с атрибутамиhttp://adn-cis.org/forum/index.php?topic=7251.msg22060#msg22060 (http://adn-cis.org/forum/index.php?topic=7251.msg22060#msg22060) там в простыне в районе 75 строки...
Boxa.Shu, Максим Маркевич, я не увидел в ваших кодах обработку двух очень интересных моментов:Насчет немировой системы, лично я еще не дошел до осознания того, зачем это нужно.
- немировая система координат
- блок с атрибутами
Еще руки не дошли или сознательно не делали?
И можно будет заканчивать эту тему, вроде бы тут будет разобрано все, что касается DrowJig, все в одном месте =о)Вот разберешься с динамическими размерами и можно будет заканчивать (я внимательно наблюдаю, очень интересно). ;) Когда у меня доберутся руки до них и что-то будет не понятно, я новую тему создам. :D
но вот введенное значение пока не понимает... требуется еще подсказкаДумаю что тебе следует поиграться с OnDimensionValueChanged - в этом методе получать новое значение Dimension и менять величину Distance2.
Думаю что тебе следует поиграться с OnDimensionValueChanged - в этом методе получать новое значение Dimension и менять величину Distance2.Видимо я что то делаю не так, т.к. данное событие у меня не срабатывает, хотя и понятно как оно должно работать (в аргументе должен возвращаться индекс измененного размера и его значение, дальше беру значение и присваиваю его переменной и в Sampler-е обрабатываю это изменение...)
Решил использовать только DrawJig, так как не вижу смысла использовать то (EntytyJig), у чего меньше возможностей (опять же, если я правильно все понял).Каждый инструмент хорош для своих целей. Я для вставки-перемещения-поворота блока использую EntityJig. Думаю, что и в Вашем случае его будет достаточно. Для одного объекта это гораздо удобнее - меньше кода писать.
Для одного объекта это гораздо удобнее - меньше кода писать.После того количества кода,просмотренного на просторах интернета, для себя сделал вывод, что это далеко не так, кода приблизительно одинаково.
Для одного объекта это гораздо удобнее - меньше кода писать.И динамические размеры работают.
Так зачем же тогда его использовать?Фактор обучения. С EntityJig работал и разбирался, было интересно. С DrawJig, до этой темы не сталкивался, пока интересно. Буду ли применять в работе, вероятно буду, там где это уместно.
При каждом изменении создается новый объект в памяти, наделяется нужными свойствами, отображается и уничтожается. Я почему и спросил про атрибуты - попробуйте блок с атрибутами прогнать через такой Jig и удивитесь. Потому что для BlockReference создать атрибуты можно только тогда, когда он добавлен в базу данных. А тут объект создается в памяти только.Посмотри, пожалуйста, видео из ответа #49. Или я что-то не так понимаю, или с атрибутами в DrawJig никаких проблем!
Здесь при каждом изменении переоткрывается объект на запись.И что? Что в этом страшного? Поясните, если не сложно.
И самое главное. В ваших примерах никак не используются отличительные возможности DrawJig в сравнении с EntityJig.Что значит, обрабатывать несколько объектов? Когда это может быть надо? Можно доходчивый пример?
В ваших примерах никак не используются отличительные возможности DrawJig в сравнении с EntityJig. Вы не добавляете собственной графики, вам не надо обрабатывать несколько объектов. Так зачем же тогда его использовать? Это забивание гвоздей ну не микроскопом, конечно, но здоровенным таким кузнечным молотомСамое страшное - это отсутствие возможности. Вот я использую DrawJig и, если вдруг захочу, то добавлю линии построения или любую другую графику, а вот человек, который использует EntityJig, не сможет (отсутствие возможности) ;)
Посмотри, пожалуйста, видео из ответа #49Я же привел в сообщении код, который не сможет обрабатывать атрибуты блока. В видео явно по-другому сделано.
с атрибутами в DrawJig никаких проблем!Проблем нет, но нужен другой подход.
И что? Что в этом страшного? Поясните, если не сложно.Ну, как минимум, производительность падает.
Что значит, обрабатывать несколько объектов? Когда это может быть надо? Можно доходчивый пример?Гуглится без проблем, например:
Самое страшное - это отсутствие возможности. Вот я использую DrawJig и, если вдруг захочу, то добавлю линии построения или любую другую графику, а вот человек, который использует EntityJig, не сможет (отсутствие возможности)Ну, дело хозяйское. Гвозди кувалдой тоже можно забивать, но мне удобнее молотком ;)
Я же привел в сообщении код, который не сможет обрабатывать атрибуты блока. В видео явно по-другому сделано.Ну так ты привел код, в котором не обработал атрибуты в WorldDraw, откуда они там появятся? Их необходимо обрабатывать именно в WorldDraw, применительно к объекту, который создается в памяти.
Ну, как минимум, производительность падает.Я считаю, что если не видно разницы в производительности невооруженным глазом, то ее и вовсе нет. )) Или просто я не делал ничего сложного!
Гуглится без проблем, например:Да умею немножко гуглить. Я пишу на c# для своих инженерных целей (думал о конкретной задаче). Хотя вторая ссылка очень прикольная, я побаловался вдоволь.
Ну, дело хозяйское. Гвозди кувалдой тоже можно забивать, но мне удобнее молоткомЯ за многофункциональную кувалду. ;)
По результатам доложусь.Присоединяюсь к ожидающим, попробовал код от Boxa.Shu, было бы здорово, если бы работало.
Присоединяюсь к ожидающим, попробовал код от Boxa.Shu, было бы здорово, если бы работало.В ObjectARX точно работает, а в чем тут "засада" понять не могу. Если уж динамические размеры воспринимаются, то почему не обрабатываются - ума не приложу. И что интересно нигде на просторах интернет не вижу упоминания использования этих методов в .NET
В ObjectARX точно работаетПопойзже посмотрю код (на линейку надо детей вести), посмотрел у себя - в Net DrawJig-OnDimensionValueChanged точно работает.
Попойзже посмотрю код (на линейку надо детей вести), посмотрел у себя - в Net DrawJig-OnDimensionValueChanged точно работает.Было бы здорово.
Дмитрий Загорулькин все правильно пишет, с кодом и памятью нужно быть аккуратнее и не мусорить. Я со многими его замечаниями согласен, но в данном случае, для меня, это обучающий момент, использовать этот код в продакшине я не собираюсь (Огромное количество копи-паста, как минимум говорит о том что код плохой, а уж про утечки и прочее можно и не вспоминать)Я понимаю это. Я знаю, кто такой Загорулькин (учусь по его урокам, очень круто он все понимает, бесконечно ему признателен). Но просто хотелось бы более конкретно понимать вещи типа "Здесь при каждом изменении переоткрывается объект на запись.". Ну, по мне, пусть он хоть миллион раз переоткрывается. Я хочу понимать такие вещи в цифрах или на примерах. Ну а как еще учиться, если не спрашивать и не просить пояснить?
На всякий случай еще раз - нужно вставить дин. блок и установить параметр через "динамический" размер?угу, все так.
На всякий случай еще раз - нужно вставить дин. блок и установить параметр через "динамический" размер?Тут ключевые слова "через "динамический" размер", а динамический ли это блок или что-то другое (например, длина стороны квадрата) - это в данном случае непринципиально. Ну и принципиально то, что это должен быть DrawJig, а не EntityJig - для него проблем нет.
Стоп. Ты отлаживаешь в AutoCAD 2014, а я в 2016. В 2014 нужно выключить режим FIBERWORLD (NEXTFIBERWORLD в 0 и перезапустить AutoCAD): http://adn-cis.org/tochki-ostanova-v-polzovatelskoj-forme-ne-obrabatyivayutsya-pri-otladke.htmlОНО! Правда править пришлось в реестре, но заработало. Блин, как у Вас это получается!?
Правда править пришлось в реестре, но заработало.Зачем в реестре? У тебя еще и какой-то хитрый AutoCAD, которому нельзя в командной строке задать NEXTFIBERWORLD значение 0, или он потом не перезапускается? ;)
Блин, как у Вас это получается!?Угадывать из-за чего у тебя не работает? ;) Это называется "Интуиция". :D
что меняется только переменная pt2, но не меняется свойство блока, а когда доходит очередь до него, то pt2 уже снова помененно "по курсору".Я так понял принцип работы, что нужно отловить изменение, поменять свойство блока, и завершить работу... т.е. внутри события менять св-ва блока и завершать jig... а потому, что там вне события не совсем важно...
Но вообще-то это не то, чего следовало ожидать. Интересно посмотреть что будет при двух динамических размерах - в ObjectARX это возможно.Я не пробовал, но без реактора думаю будет сложновато, в реакторе то номер размера выдается...
Интересно посмотреть что будет при двух динамических размерах - в ObjectARX это возможно.У меня в "исходной" программе у "Net-кустома" три дин. размера от одной точки (размеры до двух соседних "стоек" и сколько отодвинул от начальной точки) - работают себе (но там я правда меняю его только в "конце") - все работают, "табом" переключаются, вводятся значения и пр.
У меня в "исходной" программе у "Net-кустома" три дин. размера от одной точки (размеры до двух соседних "стоек" и сколько отодвинул от начальной точки) - работают себе (но там я правда меняю его только в "конце") - все работают, "табом" переключаются, вводятся значения и пр.Как ты определяешь какой динамический размер к чему относится если OnDimensionValueChanged не вызывается? Или всё-таки если размеров > 1, то он вызвается?
а вот эта строчка что значит dddCollection[0].ApplicationData = 1;?Каждому из динамических размеров можно добавить свои данные. Это может быть что угодно. В том числе и номер размера.
Это же ты показываешь GripOverrule... который (и не только он) вызывает единый для всех DrawJig
Я думаю он вызывается - просто отладчик врет.Нет. Дело даже не в отладчике. В таком контексте он не вызывается и ничего не делает. Проверил с двумя динамическими размерами - этот метод тоже не вызывается.
Я добавил в OnDimensionValueChanged в выложенном кодеУ меня нет, если добавить в код Boxa.Shu. Ты используешь AcquirePoint, в коде у Boxa.Shu - AcquireDistance. Возможно проблема в этом... Очень возможно... Ведь в GripOverrule используется именно указание точки, а не расстояние.Код - F# [Выбрать]и увидел соотв. сообщение когда ввел значение - то есть работает он.
System.Windows.Forms.MessageBox.Show("Я работаю")|>ignore
AcquireDistance. Возможно проблема в этом...Видимо да...
А если запрашивается расстояние, то совершенно логично, что размер может быть только один. Мне вот интересно, как Autodesk'овцы выкрутятся с этим вопросом. :)AcquireDistance. Возможно проблема в этом...Видимо да...
Это был ответ от ADN? А с какой целью так сделано не пояснили?Это мой ответ. От ADN пока ничего.
А с какой целью так сделано не пояснили?А это ты про что? Я не понял.
Вот и не понятно зачем кастрировать эту обёрткуУмышленно никто ничего не кастрировал. Просто для полноценной реализации этой обертки потребовались еще значительные усилия (время и деньги) - эта обертка не делается автоматически. Видимо решили, что на это не стоит тратить силы...
Я без претензий, просто буду знать, что если захочется динимических размеров, то пользуйся EntityJig.Ты что пропустил всё мое общение с Димой и вот этот пример: http://adn-cis.org/forum/index.php?topic=7251.msg22179#msg22179 ???
Видимо решили, что на это не стоит тратить силы.Понятно, спасибо за разъяснения и за код (http://adn-cis.org/forum/index.php?topic=7251.msg22179#msg22179) сходу не понял в чем различия, а скомпилировав... событие работает, буду разбираться. Соответственно вопросов про применимость больше не возникает. Буду учиться.
сходу не понял в чем различияРазличие в том, что используется AcquirePoint, а не AcquireDistance.
Различие в том, что используется AcquirePoint, а не AcquireDistance.В ADN DevHelp решили, что это неправильное поведение (т.е. вроде должно работать с обеими методами) и отправили запрос в DevTeam.
Я сделал тестовый пример с двумя динамическими размерами. Может быть будет интересно.Все-таки OnDimensionValueChanged же не срабатывает! Именно для этих целей и был прописан UpdateDimensions? Если да, то почему тогда оставили OnDimensionValueChanged, он ведь реально не делает ничего.. :(
Все-таки OnDimensionValueChanged же не срабатывает!Как же не срабатывает, когда он срабатывает. Иначе фиксация размеров не происходила бы...
Как же не срабатывает, когда он срабатывает.Извините, что-то я тупанул. Он срабатывает каждый раз после ввода значения динамического размера.
А не могли бы Вы пояснить физический смысл UpdateDimensions?При изменении положения/размеров объекта необходимо изменить положение и значение динамического размера. Эта функция приводит динамические размеры в соотвествие.
И еще, я не могу понять, как задавать динамический угол, используя AlignedDimension?Это когда я смогу добраться до PC. Только вроде тип размера ты выбрал не правильно. Он угол не измеряет.
Это когда я смогу добраться до PC. Только вроде тип размера ты выбрал не правильно. Он угол не измеряет.Ааа, я что-то прикинул, что этот всемогущий размер _dim, относится к одному классу, а нет.
При изменении положения/размеров объекта необходимо изменить положение и значение динамического размера. Эта функция приводит динамические размеры в соотвествие.Я просто сделал несколько иначе, в WorldDraw запихнул, и вот думаю, ерунды наделал и случайно работает или и так сойдет. :D
Я просто сделал несколько иначе, в WorldDraw запихнул, и вот думаю, ерунды наделал и случайно работает или и так сойдет.Исправляй.
Сравни реализацию своего DragMe и моего. Обрати внимание, что мой зациклен.А я и не знал, что те две строчки могут означать зацикленность, точнее не подумал о них.
А я и не знал, что те две строчки могут означать зацикленность, точнее не подумал о них.while как-бы подразумевает цикл...
while как-бы подразумевает цикл...Это понятно, но в целом, в тех строках много непонятного. Косяк по невнимательности, в общем:
Утро вечера мудренее - завтра найдёшь.Спасибо, конечно, за напутствия, но вышло, что вечер вечера мудренее :)
Пойдём от обратного. Мой код в твоём AutoCAD 2017 с русской локализацией работает?Точно, как я не додумался Ваш код проверить. Буду дома только к ночи, сразу отпишусь.
Честно говоря по твоему видео я не понял что происходит - слишком уж ты быстро на клавиши нажимаешь.Я психованный записывал просто (после проведенных часов разборок с кодом, когда разобрался, я ощутил счастье, а потом.. установил пакет английский, и код перестал работать - расстроился очень я) :). А происходит то, что ничего не вводится в динамический размер. В смысле, окошко не реагирует на нажатие клавиш (цифр).
Вроде переключение на другой размер происходит по нажатию любой клавиши или мне показалось?Показалось, переключение через Tab, переключение работает. )
Александр Ривилис, Ваш код исправно работает в двух пакетах. Мой - только в русском.Так я и догадывался. Доберусь до компа - проверю. Благо у меня установлены обе версии. Но сначала английская, потом сразу русская, а обновления уже потом устанавливались на обе версии.
Всё-таки не до конца понял.Вообще ничего ты не понял судя по тому, что пишешь дальше. Причем тут цвет к JIG?
Entity позднее появилось?Позднее чего???
В 2018 версии и DrawJig и EntityJig - всё есть? Ничего не исчезнет?Единственный вопрос на который я могу дать четкий ответ: "Всё есть. Ничего не исчезло".
потому что не могу скрыть модальное окно и передать фокус в AutoCAD. Как это сделать?Ну дык вы же и не скрываете окно-то! Где вызов метода Hide()?