Анонимные блоки

Автор Тема: Анонимные блоки  (Прочитано 8491 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Lemieux

  • ADN OPEN
  • ****
  • Сообщений: 384
  • Карма: 21
Re: Анонимные блоки
« Ответ #15 : 26-02-2021, 11:43:49 »
а сделать не удобным использование БЕЗ arx-ины, за которую нужно платить деньги
А не проще написать плагин без которого блоки просто не юзабельны?

Оффлайн Николай ГорловАвтор темы

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
Re: Анонимные блоки
« Ответ #16 : 26-02-2021, 12:16:46 »
Не уверен, что это как-то поможет, но кто же это переименовывает блоки при итерировании по таблице блоков? Может всё-таки сначала получишь коллекцию AcDbObjectId для блоков, которые собираешься переименовывать, а потом будешь их переименовывать.
попробовал, результат тот же. а вообще странно получается - динамика остается всегда (видать из-за ссылок внутри бд на всякие там ручки, динамические операции), а статика ни к чему не привязанная удаляется всегда после прохода через dwgFileOpened, и не спасает даже функция acdbSetReferenced.
но если не проходить через dwgFileOpened, а восстанавливать имена открыв файл через readDwgFile, то все блоки (и статика, и динамика) восстанавливаются замечательно, чего мне в принципе хватит.
остался правда один файл, в которым с каждым закрыл/восстановил блоков становится меньше :) даже при использовании readDwgFile. причем удаляется как статика так и динамика с завидным постоянством. вот с ним сейчас и разбираюсь, что там откуда растет и на кого ссылается.

Похоже ты переименовываешь все BlockTableRecord?
Т.е. пространства модели, листов, и внешние ссылки тоже?
не, ни пространства модели/листа, ни огрызки от копирования, ни другие анонимные блоки я не трогаю. короче, пропускается всё, что начинается на * или содержит $ в своем имени.

внешних ссылок или чего-то другого в файле нет и быть не может. это файл мой, который я (ну, не совсем я - сотрудники) наполняю блоками оборудования, и отдаю пользователям. через arx-ину формируется окно списка оборудования с картинками, которые появляются при клацанье на строку списка и происходит вставка блока в указанную точку по двойному щелчку. вот как-то так выглядит само окно


вот задача первая - сделать так, чтоб файлы блоков было бессмысленно утаскивать на компьютер без этой arx-ины при условии, что человек не знает словосочитания "анонимные блоки".
ну а вторая задача - мои блоки вставленные в чертеж должны перестать копироваться/редактироваться/взрываться/переноситься/обладать динамическими свойствами при условии, что arx-ина говорит об окончании подписки, либо, если arx-ины вообще нет в загруженных приложениях - вместо блоков идет строка текста. в случае возобновления подписки блоки опять обретают нормальные имена и все свойства автокадовских блоков.

первая задача - практически решна, по крайней мере основной смысл понятен, осталось доработать напильником :), со второй - проблем практически нет (верней есть одна, но я о ней еще не думал). на момент закрытия чертежа (при условии, что файл редактировался и сохранялся) все мои блоки, вставленные в чертеж становятся анонимными, затем на них навешивается кастомный объект на основе AcDbEntity. Та же беда происходит при окончании подписки. При открытии файла в акаде в реакторе dwgFileOpened происходит обратный процесс и на выходе пользователь видит нормальные блоки, опять же при условии существования подписки. Если подписка кончилась, но он види красивую картинку, которую нельзя ни перенести, ни скопировать, ни расчленить. Но с чертежом дальше можно продолжать работать. Что он нарисовал сам я блокировать не имею права, да и желания как-то тоже пакостить нет. Вот в целом вся задумка выглядит так.

А не проще написать плагин без которого блоки просто не юзабельны?
и встроить dwg-шник(и) внутрь ресурсов arx-ины? если нет, то как раз о таком плагине и идет речь. ну а встраивать в ресурсы смысла нет - блоки постоянно пополняются. сейчас уже где-то полторы тысячи. год назад было штук 800.

Я тебе ссылку на лисп скинул, который это делает. Поэтому твой вопрос, про "научить стандартными средствами автокада" мне не понятен.
да, тут я слегка натупил, мыслями был в анонимных блоках. ну и мысли были о том, что стандартными средствами автокада ни превратить блок в анонимный, ни вернуть ему нормальное имя в принципе не возможно. а превратить динамику в статику - не проблема.

Второй файл у тебя отличается от первого -  внутрь динамических блоков вставлены обычные.
да, согласен, пропустил.

Оффлайн Николай ГорловАвтор темы

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
Re: Анонимные блоки
« Ответ #17 : 02-03-2021, 11:20:16 »
Вроде как поборол :). Теперь можно подытожить:
1. функция acdbSetReferenced обязательно нужна после переимнования блока (если нет вставок блока в чертеж или каких-то связей с бд чертежа). это проще, чем варганить завязку на кастомный объект, который по сути будет делать то же, что уже написанная функция.
2. имя *U, которое дается в процессе setName НЕ ЯВЛЯЕТСЯ УНИКАЛЬНЫМ и может произвольным образом поменяться на другое, так что лучше пользоваться handle

на картинке в двух столбиках отображены имя, хендл и *U имя при создании ананимного блока (первый столбец) и при обратном преобразовании (второй столбец)
ну и в подсвеченных ячейках видно, как имя данное при создании чудесным образом поменялось при повторном переименовании блоков (особенно порадовало последнее имя блока :) )
3. чертеж ни в коем случае нельзя открывать и сохранять в автокаде визуально (при открытии теряется доступ к элементам BTR, а сохранение делает эту потерю постоянной), только через readDwgFile.

Ну вот в принципе и все подводные камни, через которые я прошел. Ах да, еще... при использовании handle абсолютно не важно происходит переименование в одном цикле при переборе всех BTR или первый цикл на получение имен/id BTR а вторым пробегом замена имени. Если пользоваться именами, то лучше работать в два пробега, хз почему, но на одном из файлов были проблемы.

По поводу запроса в автодеск... Сформировалось у меня 2 вопроса:
1. почему acdbSetReferenced не защищает анонимный статический блок от автоочистки, происходящей в dwgFileOpened
2. почему анонимные блоки самопроизвольно меняют имена (вот правда не выяснял в каком случае: в случае вызова readDwgFile или в случае изменения имен других блоков, к которым они не имеют никакого отношения и просто находятся рядышком в таблице блоков).
Вот только предчувствую я, что ответы мне не понравятся ))), да и сами ответы мне уже и не важны. Так что не буду мучать ни себя ни окружающих ))).

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Анонимные блоки
« Ответ #18 : 02-03-2021, 17:19:18 »
2. имя *U, которое дается в процессе setName НЕ ЯВЛЯЕТСЯ УНИКАЛЬНЫМ и может произвольным образом поменяться на другое, так что лучше пользоваться handle
Ну это как раз понятно. Оно генерируется (аналогично AcDbObjectId) при открытии файла.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение