1. Открываю файл, в котором в BTR лежат блоки (динамические и простые). Вставок в чертеж нет.Причина в этом.
Посмотри эту статью: https://adndevblog.typepad.com/autocad/2012/08/how-to-use-acdbsetreferenced.htmlпопробовал. всё прошло с результатом Acad::eOk. Вот только проблемка :), на этапе dwgFileOpened (или в новых версиях - endDwgOpen) у меня в BTR лежат 4 анонимных блока (а не 58 начальных), которые и без этого танца отображаются. Так что вариант наверно имеет право на существование, но он абсолютно бесполезен :)
Вставок в чертеж нет.Вот прям даже не знаю что сказать:
Может понапрягать автодеск?Понапрягать можно. Но (!!!) ты дожен всё для них подготовить:
Если в двух словах, задумался о "защите" :) собственных блоков.Если хочешь защитить свои блоки, разбей все блоки. Т.к. насколько помню, анонимные блоки легко переделать в обычные и использовать.
Ну и вопрос, это я накосячил или это ОЖИДАЕМОЕ ПОВЕДЕНИЕ по удалению не используемых по мнению (блин, прям искуственный интеллект какой-то. удалил то не все блоки) автокада блоков?Конечно ты накосячил. Но чтоб понять в чем именно нужно детально смотреть чертеж и код.
Я тут немного подумал и склоняюсь к мысли, что динамические блоки (тут сложно найти тонкую грань между динамическими и статическими блоками - свойство/метод isDynamicBlock не показатель) не могут быть анонимными.чего это? именно на анонимных блоках и построена вся работа с динамическими блоками, если верить логике автодеска. когда динамический блок вставляется, ему дается имя как и у родительской BTR. Дальше, любое изменение динамики приводит к рождению анонимного блока, который описывает текущее положение динамики, но ссылается на родительский. В итоге, если блок подергать 10 раз, мы получаем 10 анонимных блоков, каждый из которых описывает какое-то изменение динамики (это то и позволяет делать откат Ctrl+Z). После переоткрытия чертежа все анонимные блоки, которые не используются просто вычищаются. Странно, не удобно, но реализовано именно так. В свете всего этого становится понятно, зачем придумали функцию acdbSetReferenced (вот только работает она странноватенько).
Если хочешь защитить свои блоки, разбей все блоки. Т.к. насколько помню, анонимные блоки легко переделать в обычные и использовать.Да я ж и не спорю, поэтому и написал в первом посте слово защита в кавычках. Задача скорей не защитить, а сделать не удобным использование БЕЗ arx-ины, за которую нужно платить деньги :).
Конечно ты накосячил. Но чтоб понять в чем именно нужно детально смотреть чертеж и код.С этим никаких проблем нет, вот код функции
Понапрягать можно. Но (!!!) ты дожен всё для них подготовитьсейчас слегка занят, да и главное понять, во что тыкать носом. в общем обязательно все подготовлю, но не на этой неделе.
сейчас слегка занят, да и главное понять, во что тыкать носом.Предположение, почему остались 4 блока:
Задача скорей не защитить, а сделать не удобным использование БЕЗ arx-ины, за которую нужно платить деньги :).Обычные блоки, если оставляешь, особо не защитишь, удобство использования сильно не поменяется.
Предположение, почему остались 4 блока:Согласен. В этом чертеже 4 динамических и 54 статических. Вставок в чертеж, перекрестных ссылок и т.д. и т.п. нет вообще. Метод обработки блоков командой одинаковый. Открывать и пересохранять можно пока не устанет рука, но их по-прежнему будет 4. Да, в этом файле все 4 оказались динамическими. Можно было б предположить, что удаляется статика и удаляется всегда. А вот и нет. Еще один файл блоков (эт я так их все сам в свободный доступ выложу :) :) :) ) во вложениях. С ним вообще всё проходит шикарно. Внутри 33 блока. Все 33 замечательно видны в бд чертежа в виде анонимных после переоткрытия файла, и все 33 замечательно восстанавливают свои имена даже при работе с текущим чертежом (а в предыдущем файле всё ок только если его не открывать физически в автокаде).
1. Все анонимные блоки автокад удаляет при открытии, если они не нужны. Т.е. они не имеют вставок и на них никто не ссылается.
2. У тебя в чертеже 4 динамических блока.
Динамические блоки можно в статические перевести.Стандартными средствами автокада? Научишь? :)
Стандартными средствами автокада? Научишь?Я тебе ссылку на лисп скинул, который это делает. Поэтому твой вопрос, про "научить стандартными средствами автокада" мне не понятен.
С ним вообще всё проходит шикарно. Внутри 33 блока. Все 33 замечательно видны в бд чертежа в виде анонимных после переоткрытия файлаВторой файл у тебя отличается от первого - внутрь динамических блоков вставлены обычные.
Кстати, что по коду? Есть ошибки? Может я чего не заметил.Похоже ты переименовываешь все BlockTableRecord?
Т.е. пространства модели, листов, и внешние ссылки тоже?С пространством модели и листа все нормально. Они начинаются с звездочки. А вот на внешние ссылки нужно посмотреть внимательнее.
а сделать не удобным использование БЕЗ arx-ины, за которую нужно платить деньгиА не проще написать плагин без которого блоки просто не юзабельны?
Не уверен, что это как-то поможет, но кто же это переименовывает блоки при итерировании по таблице блоков? Может всё-таки сначала получишь коллекцию AcDbObjectId для блоков, которые собираешься переименовывать, а потом будешь их переименовывать.попробовал, результат тот же. а вообще странно получается - динамика остается всегда (видать из-за ссылок внутри бд на всякие там ручки, динамические операции), а статика ни к чему не привязанная удаляется всегда после прохода через dwgFileOpened, и не спасает даже функция acdbSetReferenced.
Похоже ты переименовываешь все BlockTableRecord?не, ни пространства модели/листа, ни огрызки от копирования, ни другие анонимные блоки я не трогаю. короче, пропускается всё, что начинается на * или содержит $ в своем имени.
Т.е. пространства модели, листов, и внешние ссылки тоже?
А не проще написать плагин без которого блоки просто не юзабельны?и встроить dwg-шник(и) внутрь ресурсов arx-ины? если нет, то как раз о таком плагине и идет речь. ну а встраивать в ресурсы смысла нет - блоки постоянно пополняются. сейчас уже где-то полторы тысячи. год назад было штук 800.
Я тебе ссылку на лисп скинул, который это делает. Поэтому твой вопрос, про "научить стандартными средствами автокада" мне не понятен.да, тут я слегка натупил, мыслями был в анонимных блоках. ну и мысли были о том, что стандартными средствами автокада ни превратить блок в анонимный, ни вернуть ему нормальное имя в принципе не возможно. а превратить динамику в статику - не проблема.
Второй файл у тебя отличается от первого - внутрь динамических блоков вставлены обычные.да, согласен, пропустил.
2. имя *U, которое дается в процессе setName НЕ ЯВЛЯЕТСЯ УНИКАЛЬНЫМ и может произвольным образом поменяться на другое, так что лучше пользоваться handleНу это как раз понятно. Оно генерируется (аналогично AcDbObjectId) при открытии файла.