Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: art_rrc от 25-10-2015, 01:05:24

Название: Странное поведение динамического блока при использовании Jig
Отправлено: art_rrc от 25-10-2015, 01:05:24
Доброго времени суток!
Пытаюсь приручить инструмент Jig. Но на данный момент результат просто обескураживает. Задача такая: "При вставке дин. блока нужно повлиять на его дин. параметры". В качестве параметра для теста я выбрал "Угол1". Но при выполнении, существенно меняется геометрия всего блока, не связанная с параметром Угол1. А атрибуты вообще не отображаются, а после вставки остаются на месте. Подскажите, как побороть? Явно я где-то что-то недообновляю и т.п. Или в Jig, при вызове SetDynProp также нужно использовать транзакцию каким-то образом?
Что касается конкретных вопросов, то вот например 1 из целой кучи:
В какой системе координат высчитывается получаемая в Jig точка(dresPoint.value)? Это координаты x,y,z относительно мировой системы, или же они считаются как-то с привязкой к переданному в класс примитиву?
Код - vb.net [Выбрать]
  1. Dim dresPoint As PromptPointResult = jPrompts.AcquirePoint(jigOpts)
Код:
Извините, вам запрещён просмотр содержимого спойлеров.
Спасибо. :)
Название: Re: Странное поведение динамического блока при использовании Jig
Отправлено: Александр Пекшев aka Modis от 25-10-2015, 01:34:42
Ну вообще-то у тебя должно быть две Jig:
1 - для вставки блока в чертеж (на курсоре висит блок в его первоначальном виде)
2 - для изменения дин.параметра
Название: Re: Странное поведение динамического блока при использовании Jig
Отправлено: art_rrc от 25-10-2015, 01:48:16
1 - для вставки блока в чертеж (на курсоре висит блок в его первоначальном виде)
Зачем? Так же не красиво.
Основная концепция придумана и реализована достаточно давно. На данном этапе, цель перевести все на .net + прикрутить всяко-разные красивости типа jigs, pointmonitor т.д. + Сделать это легкоустанавливаемым для использования. Что-то не надо было над адаптацией по пол часа колдовать каждый раз.
Видео YouTube:
Извините, вам запрещён просмотр содержимого спойлеров.

ps Видео записано существенно позже реализации.
Название: Re: Странное поведение динамического блока при использовании Jig
Отправлено: Александр Пекшев aka Modis от 25-10-2015, 01:55:00
Зачем? Так же не красиво
Что значит "Зачем"? О_о
Чтобы изменять динамический параметр блока этот блок ДОЛЖЕН БЫТЬ! Его нужно сначала вставить в чертеж
В видео, которое ты приложил, указывается ДВЕ точки - первая для вставки блока. Просто там не используется Jig при этом, поэтому блока и не видно
Название: Re: Странное поведение динамического блока при использовании Jig
Отправлено: art_rrc от 25-10-2015, 02:04:16
Чтобы изменять динамический параметр блока этот блок ДОЛЖЕН БЫТЬ! Его нужно сначала вставить в чертеж
Т.е. обязательно нужно его сначала добавить например в ModelSpace?
Вот же создается вхождение блока:
Код - vb.net [Выбрать]
  1. Dim bdId As ObjectId = bt("123")
  2. Dim pt As New Point3d(0, 0, 0)
  3. Dim br As New BlockReference(pt, bdId)
В оригинальной программе я планировал pt - получать как результат запроса к пользователю, а уже указание второй точки и размещение полки указывать с помощью Jigs. Просто для тестов порезал функционал немного для экономии времени. Мне кажется, что так достаточно логично.
Вот фрагмент из рабочего файла без Jigs. Просто полный повтор функционала VBA (как на видео).
Извините, вам запрещён просмотр содержимого спойлеров.

Так вот теперь пытаюсь 2ю точку получать используя Jig, для первой считаю что не нужно. Но тут вопрос ведь гораздо коварнее.. Что вообще теоритически так влияет на геометрию блока из Gifки (пост №1), ведь я на нее влияю только с помощью Sub SetDynProp, корорая отрезки вообще не трогает.
Название: Re: Странное поведение динамического блока при использовании Jig
Отправлено: Александр Пекшев aka Modis от 25-10-2015, 02:18:05
Вот же создается вхождение блока:
Просмотрел. Каюсь - мой косяк и неоправданный наезд  :)
Видимо 2 часа ночи на меня плохо действуют  ;D
Что вообще теоритически так влияет на геометрию блока из Gifки
Теоретически (как и практически) - неправильно написанный код для Jig. Инфа 100% - сам с таким сталкивался. Но лично я не могу проверить, ибо VB.Net...
Название: Re: Странное поведение динамического блока при использовании Jig
Отправлено: Александр Пекшев aka Modis от 25-10-2015, 02:26:25
Что-то до меня только сейчас дошло - а зачем вот это:
Код - vb.net [Выбрать]
  1. 'Угол между двумя Point3d (От оси X)
  2.     Public Shared Function AngleFromXAxis3d(StartPoint As Point3d, EndPoint As Point3d) As Double
  3.         Dim pt1 As Point2d = New Point2d(StartPoint.X, StartPoint.Y)
  4.         Dim pt2 As Point2d = New Point2d(EndPoint.X, EndPoint.Y)
  5.         AngleFromXAxis3d = pt1.GetVectorTo(pt2).Angle
  6.     End Function
? ? ? ?  :o
Тебе для расположения полки нужна ТОЧКА, а ни какой не угол! Причем тут вообще угол?
Название: Re: Странное поведение динамического блока при использовании Jig
Отправлено: art_rrc от 25-10-2015, 02:28:36
Теоретически (как и практически) - неправильно написанный код для Jig.
Видимо 2 часа ночи на меня плохо действуют 
В принципе 2 часа ночи они общие для всех. Утро вечера мудренее, утром может и сам найду в чем дело. Или может кто-то подскажет где копнуть.. ;)
Название: Re: Странное поведение динамического блока при использовании Jig
Отправлено: art_rrc от 25-10-2015, 02:32:09
Тебе для расположения полки нужна ТОЧКА, а ни какой не угол! Причем тут вообще угол?
Мне нужно расстояние и угол. Я решил для начала обойтись только углом.
Вот это настройка расположения блока при указании 2х точек вручную:
Извините, вам запрещён просмотр содержимого спойлеров.
Название: Re: Странное поведение динамического блока при использовании Jig
Отправлено: Александр Пекшев aka Modis от 25-10-2015, 02:51:10
Ну вообще-то я был прав с самого начала  ;D
Т.к. тебе нужно менять дин.параметры вхождения блока, то он должен быть уже вставлен в чертеж!
Если твой код немножко совсем изменить, то задание угла будет работать как надо:
Код - vb.net [Выбрать]
  1. Dim pt As New Point3d(0, 0, 0)
  2. Dim br As New BlockReference(pt, bdId)
  3. Dim ms As BlockTableRecord = DirectCast(tr.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite), BlockTableRecord)
  4. ms.AppendEntity(br)
  5. tr.AddNewlyCreatedDBObject(br, True)
  6. Dim entJig As New BlockJig(br)
  7. pr = ed.Drag(entJig)
  8. If pr.Status = PromptStatus.OK Then
  9.     'Dim ms As BlockTableRecord = DirectCast(tr.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite), BlockTableRecord)
  10.     'ms.AppendEntity(entJig.GetEntity())
  11.     'tr.AddNewlyCreatedDBObject(entJig.GetEntity(), True)
  12.     Dim bd As BlockTableRecord = DirectCast(tr.GetObject(bdId, OpenMode.ForRead), BlockTableRecord)
Насчет атрибута ничего не скажу - не смотрел. Но думаю, причина "где-то рядом"
Название: Re: Странное поведение динамического блока при использовании Jig
Отправлено: art_rrc от 25-10-2015, 03:05:57
Огромное спасибо! Все работает! У меня просто нет слов. Большое спасибо за поддержку. Самому докопаться до ответов, которые я получаю здесь, было бы титанически сложно. Вы для меня просто герои!
Насчет атрибута ничего не скажу - не смотрел. Но думаю, причина "где-то рядом"
Да, действительно рядом, в соседней теме http://adn-cis.org/forum/index.php?topic=3128.0  :) Там после вставки, еще отдельно атрибуты добавлять нужно, но это вопрос уже решенный.  :)
Ну, теперь думаю со спокойной совестью можно и поспать, в уже завтра домучить этот Jig, который сам меня целый день мучал.. :D
Название: Re: Странное поведение динамического блока при использовании Jig
Отправлено: Александр Ривилис от 25-10-2015, 03:56:01
Т.к. тебе нужно менять дин.параметры вхождения блока, то он должен быть уже вставлен в чертеж!
Здесь тебя это не удивляет и ты не считаешь это багом?! :)
Название: Re: Странное поведение динамического блока при использовании Jig
Отправлено: Александр Ривилис от 25-10-2015, 11:04:46
art_rrc
Очень рекомендую для записи записи видео использовать https://screencast.autodesk.com/ (сама "грабалка" здесь: http://www.autodesk.com/screencast-download/), а вставлять видео на форум как у меня указано в подписи. Преимуществ масса. В том числе и то что видно какие клавиши/кнопки мыши нажимаются.
Название: Re: Странное поведение динамического блока при использовании Jig
Отправлено: art_rrc от 25-10-2015, 14:42:55
Очень рекомендую для записи записи видео использовать https://screencast.autodesk.com/
Спасибо, я учту. Видео в этой теме не записывалось, а просто было под рукой и я решил скинуть ссылку. Попробую след. раз скринкастом воспользоваться. Хотя в последнее время я вообще в основном использую не видео, а GIF. Просто, лаконично, но вполне информативно.
Название: Re: Странное поведение динамического блока при использовании Jig
Отправлено: Александр Ривилис от 25-10-2015, 15:50:12
Хотя в последнее время я вообще в основном использую не видео, а GIF. Просто, лаконично, но вполне информативно.
Недостаточно информативно, если не видно какая кнопка мыши нажата или какой текст введён. Кроме того нельзя остановить воспроизведение, что тоже существенный минус. Ну и в ADN DevHelp только такое видео.
Название: Re: Странное поведение динамического блока при использовании Jig
Отправлено: art_rrc от 25-10-2015, 16:25:19
Преимуществ масса. В том числе и то что видно какие клавиши/кнопки мыши нажимаются.
Раз-раз, раз-два-три.. проверка связи:

Извините, вам запрещён просмотр содержимого спойлеров.
(Видео ScreenCast)

ps Благодарю всех за помощь в создании (особенно Александра Ривилиса и Modis'а). Благодаря вам у меня уже есть кое-какие предварительные результаты, которые очень вдохновляют на продолжение и реализацию задуманного.
Название: Re: Странное поведение динамического блока при использовании Jig
Отправлено: Александр Ривилис от 26-10-2015, 18:46:41
ps Ох чую... что компетентные люди каааак дадут по ушам! За тот офтоп который мы развели.
Пока не буду "давать по ушам". Оффтоп отделил и перенес в раздел Организация проектирования (http://adn-cis.org/forum/index.php?board=37.0) в тему: Информация об армировании в выносках (динамических блоках) (http://adn-cis.org/forum/index.php?topic=3142.0)
Название: Re: Странное поведение динамического блока при использовании Jig
Отправлено: art_rrc от 06-11-2015, 17:48:15
Всем привет. Продолжаю свою локальную битву с entityjig  :) На сей раз вопрос по поводу выравнивания атрибутов. Проблема в том, что по неведомым мне причинам атрибуты в блоке ведут себя "как хотят".
Но основной вопрос такой: При использовании в JIG операции "отражение", атрибуты не зеркалятся, либо зеркалятся, но криво. Как победить?
Подробнее в видео:


К сожалению, сейчас уезжаю на несколько часов. В проекте образовалась знатная мусорка, и нет времени привести все в порядок, поэтому его не прикрепляю, но основные фрагменты вот, наковырял:
Извините, вам запрещён просмотр содержимого спойлеров.
Название: Re: Странное поведение динамического блока при использовании Jig
Отправлено: Александр Ривилис от 06-11-2015, 19:21:17
Как минимум не хватает ar.AdjustAlignment(db) для выравнивания атрибутов.
Что касается "тормозов", то ты в методе Update меняешь динамические свойства. Это происходит очень часто. Генерируются новые анонимные BlockTableRecord для каждого единичного передвижения мыши. Тут ты ничего с производительностью не сделаешь. IMHO
Название: Re: Странное поведение динамического блока при использовании Jig
Отправлено: art_rrc от 06-11-2015, 21:31:14
Как минимум не хватает ar.AdjustAlignment(db) для выравнивания атрибутов.
Спасибо, буду разбираться/пробовать/экспериментировать.
Что касается "тормозов", то ты в методе Update меняешь динамические свойства. Это происходит очень часто. Генерируются новые анонимные BlockTableRecord для каждого единичного передвижения мыши. Тут ты ничего с производительностью не сделаешь. IMHO
Вот это я примерно и рассчитывал услышать. Теперь вы мне подтвердили и можно кое-что придумать. Хотя пока вариант 1, нужно просто поиграть с величиной 0.001 в строке:
Код - vb.net [Выбрать]
  1. If (mActualPoint.DistanceTo(dresPoint.Value)) < 0.001 Then
И найти оптимальный баланс между красотой и производительностью. Спасибо!
Название: Re: Странное поведение динамического блока при использовании Jig
Отправлено: Александр Ривилис от 07-11-2015, 00:44:31
Хотя пока вариант 1, нужно просто поиграть с величиной 0.001 в строке:
Код - vb.net: [Выделить]

    If (mActualPoint.DistanceTo(dresPoint.Value)) < 0.001 Then

И найти оптимальный баланс между красотой и производительностью. Спасибо!
Есть и другой вариант - временной интервал между выполнением в Update изменения параметров блока (например, не чаще чем 1/4 секунды). А можно объединить оба варианта.