| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP. Как определить ошибочные поля (####) в AutoCAD?

LISP. Как определить ошибочные поля (####) в AutoCAD?

Ответ
Поиск в этой теме
Непрочитано 19.08.2015, 13:41 #1
LISP. Как определить ошибочные поля (####) в AutoCAD?
skkkk
 
AutoCAD_2008->2011
 
Московская область
Регистрация: 20.03.2008
Сообщений: 2,270

Возник вопрос:
Цитата:
Сообщение от skkkk Посмотреть сообщение
Подскажите, пожалуйста, если кто знает, как можно проверить, не просматривая весь чертеж на наличие "решеток", все ли поля "целы"? То есть, не удалили ли случайно объекты, на которые они ссылаются? Как-то, на мой взгляд, не продуман Автодеском этот момент. Можно было бы и предупреждение добавить при удалении таких объектов.
Пробовал поиск в чертеже по символу "#" с отключенной галочкой "Подстановочные знаки" - ищет решетки, только если преобразовать поле в текст. Полагаю, нужно будет писать программу для маркировки "осиротевших" полей, но может, есть штатный функционал, о котором я не знаю?
Поскольку штатный функционал такого не позволяет, решено продолжить обсуждение здесь. Код писать не прошу - сам с усам, - прошу заинтересованных и знающих лиц дать оценку алгоритма и внести свои мысли и предложения на этот счет. (Удивляюсь, как до сих пор никого этот вопрос не озадачил, даже на англоязычных форумах ничего не смог найти - может, плохо искал?)

Думаю, алгоритм должен быть примерно таким.
1. Сканируем весь чертеж на предмет объектов с полем. Тут думаю, можно воспользоваться частями уже имеющихся в сети программ, которые преобразовывают поле в текст, например, от VVA. Далее обрабатываем каждый объект по очереди.
2. Получаем текстовое представление объекта. Это самый вроде, простой вариант, но не самый правильный, на мой взгляд, поскольку решетки там могут быть и сами как таковые. Более правильным мне кажется извлекать из кода поля ID объекта и проверять наличие этого объекта на чертеже. ID, конечно меняется от сеанса к сеансу, но, насколько я знаю, в течение сеанса он постоянен, и нам этого достаточно.
3. В зависимости от реализации п. 2, собираем все объекты с порушенными полями, и маркируем их.

Какие есть мысли, уважаемые форумчане?

Добавлено:

Решение в #20
Как всегда, спасибо Алексею. Не успел я начать писать код, как он уже предоставил решение.

Вариант с диалоговым окном выбора нужных вкладок (модели или листа) в #26. Выбрать несколько листов можно, если зажать при выборе Ctrl или Shift. Спасибо VVA.

Последний раз редактировалось skkkk, 08.04.2016 в 11:07.
Просмотров: 10778
 
Непрочитано 19.08.2015, 13:58
#2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 36,668


Объект есть поле, если его FieldCode не совпадает с TextString. Разбивать не надо - лишнее.
По ID необязательно удастся найти объект, я бы на него ставку не делал: вполне возможна ситуация, когда ObjectID равен, к примеру, 185, а хранимое в поле значение - нечто типа "8565989456".
Маркировка - как угодно. Я бы, наверное, создавал отдельное описание блока, который помещал бы в центр текста, содержащего ошибочное поле (понятно, что слой отдельный и непечатаемый).
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 19.08.2015, 14:24
#3
skkkk

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,270


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Объект есть поле, если его FieldCode не совпадает с TextString
У мультивыноски, например, нет свойства FieldCode. Найти в ней поле можно например, с помощью кода, предложенного kp+.
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Разбивать не надо - лишнее.
Так я и не хотел разбивать поля, я хочу воспользоваться кусками кода, которые лишь "собирают" их. (Коды пока не анализировал, но думаю, решение по сбору полей в них быть должно).
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
По ID необязательно удастся найти объект
Я вот тоже сомневаюсь, но думаю, стоит попробовать. Правда в х32 и х64 версиях принципы формирования ID различны, но было решение (от Александра Ривилиса, функция называется get-objectid-x86-x64), вроде, оно снимало эту проблему. В общем, нужно пробовать.

Последний раз редактировалось skkkk, 26.11.2015 в 16:12.
skkkk вне форума  
 
Непрочитано 19.08.2015, 14:27
#4
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 36,668


У выноски (и мультивыноски, кстати, тоже) надо получать объект аннотации и парсить уже его )
Цитата:
Сообщение от skkkk Посмотреть сообщение
Правда в х32 и х64 версиях принципы формирования ID различны
Они еще и от версии зависят: http://autolisp.ru/2014/09/16/objectid_x32x64_cad2015/
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 19.08.2015, 15:02
#5
skkkk

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,270


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
У выноски (и мультивыноски, кстати, тоже) надо получать объект аннотации и парсить уже его
А как это сделать? Взрывать выноску (ее копию)? Или через entget как-то можно получить объект аннотации из выноски? Код из ссылки, кстати, возвращает некорректный код поля. Не пойму, сразу так было и я невнимательно поглядел или стало теперь, вроде вначале были цифры ID, теперь они "глотаются" - выдается что-то типа
Код:
[Выделить все]
(2 . "\\AcObjProp Object(%<\\_ObjIdx 0>%).Layer \\f \"%tc1\"")
Можешь проверить, у тебя тоже так? К тому же он получает только один объект-поле, а если их в выноске больше, как их найти?
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Они еще и от версии зависят
Ну раз уж ты и это уже знаешь, что еще тогда по-твоему может помешать получить объект по его ID? Ну да ладно - не советуешь, значит не буду копать этот "айди"...

Тогда другой вопрос. Вот получил я программно код поля, но поскольку по нему невозможно понять, цело ли оно, нужно анализировать строку, которую оно формирует. Как программно же получить значение этого кода поля, вычислить его? Чтобы потом анализировать эту строку. Хотелось бы все же отсеять решетки как таковые, а помечать объекты только с решетками в полях.
skkkk вне форума  
 
Непрочитано 19.08.2015, 15:10
#6
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 36,668


Если объект - обычная выноска, то vla-get-annotation возвратит указатель на ее аннотацию. Для мультивыноски сработает и vla-get-textstring (если contenttype = 2, насколько я помню).
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 19.08.2015, 15:12
#7
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 36,668


Цитата:
Сообщение от skkkk Посмотреть сообщение
Вот получил я программно код поля, но поскольку по нему невозможно понять, цело ли оно, нужно анализировать строку, которую оно формирует. Как программно же получить значение этого кода поля, вычислить его?
Зачем? Может, проще будет так?
Код:
[Выделить все]
 (setq ent (vlax-ename->vla-object (car (entsel))))
(if (/= (vla-fieldcode ent) (vla-get-textstring ent))
  ;; Обьект - поле. Анализировать и обрабатывать
  )
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 19.08.2015, 15:52
#8
skkkk

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,270


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Для мультивыноски сработает и vla-get-textstring
Да, но он вернет не указатель на аннотацию, а строку, в которой нет ни малейшего намека на присутствие поля.

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Зачем? Может, проще будет так?
Стоп, я что-то не понял. FieldCode вернет код поля со всеми потрохами, по-моему, они в принципе не могут быть равными с текстовой строкой, в которую это поле вычисляется. А, понял: если поля нет, то вернется строка, хотя лучше бы (логичнее) вернулось бы nil - я так думаю, но не суть.
Да, так проще. И даже, думаю, что при обработке текста я так и сделаю, но как быть с мультивыносками? Неужели взрывать? Почему, интересно, FieldCode не прикрутили к выноске? Забыли?
И как быть с блоками лучше всего? Анализировать подобным образом каждый текстовый объект блока с полем по тому же принципу? Полагаю, такая обработка чертежа займет уйму времени и ресурсов, но другого варианта я не вижу. Разве только взорвать все блоки, собрать координаты нужных текстов и вернуть блоки обратно... Оно конечно, проще в написании на первый взгляд, но уж больно как-то топорно, да и времени на обработку, полагаю, будет занимать еще больше.
skkkk вне форума  
 
Непрочитано 19.08.2015, 16:10
#9
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 36,668


Что за "текстовые объекты блока"? Атрибуты, что ли? Так их можно получить совсем просто.
Сорри, но сегодня времени нет и не будет совсем на проработку кода. Предоставь файл, который хочешь обработать - я попробую что-нибудь нарисовать.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 19.08.2015, 19:15
#10
art_rrc


 
Регистрация: 28.01.2013
Минск
Сообщений: 378


Не сильно знаком со спецификой чертежей смежников (сам я конструктор), но мне кажется, что символ "#" нигде не используется и появиться может в чертеже только как нерабочая ссылка на поле. Так почему бы и не искать просто среди объектов у которых есть текстовые элементы символы решетки? Если нашли, обвели красной рамкой, нет - идем дальше. И никакой чехарды с ObjectID. Алгоритм не очень то оптимальный, но при современных мощностях компьютера, время выполнения скорей всего будет все равно ничтожно малым (нужно тестировать конечно) + эта программа явно не для очень частого использования, а для контроля, скажем, перед печатью.
art_rrc вне форума  
 
Автор темы   Непрочитано 21.08.2015, 20:01
#11
skkkk

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,270


Цитата:
Сообщение от art_rrc Посмотреть сообщение
но мне кажется, что символ "#" нигде не используется и появиться может в чертеже только как нерабочая ссылка на поле
Я и сам его ни разу не использовал, и не видел в чужих чертежах, поэтому не могу не согласиться, что есть в этом некий здравый смысл. Но исключать подобный вариант тоже нельзя, хотя ничего и страшного, если программа пометит еще какую-либо решетку "зазря", поставит лишнюю метку - думаю, никто не надорвется, особенно мой четырехъядерный друг.
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Что за "текстовые объекты блока"? Атрибуты, что ли?
Атрибуты - да, но не только. И тексты, и мтексты попадаются. Не знаю, может, это не совсем правильно, но когда мне нужно, чтобы какие-то графы, например, основной надписи, были одинаковы для всех листов, я вместо атрибута использую текст.
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Предоставь файл
Не вопрос. Удалил оттуда все ненужное (и секретное ), внешние ссылки тоже не стал прикладывать, а то заказчик заругает, если увидит, но для понимания картины должно хватить. Удалил также и кое-что нужное, так что поля уже некоторые послетали.
Поля там присутствуют в:
1. Атрибутах блоков. (и однострочных и многострочных)
2. В тексте внутри блока (знаю, что не туда поставил, просто для примера). Блок рамки был давным-давно найден тут на форуме. Где и чье, к сожалению, не помню.
3. В текстах, в основном, мульти. Однострочниками почти не пользуемся.
4. В мультивыносках. Выносками обычными не пользуемся.
5. В таблицах. Полагаю тут будет самая сложная обработка, и думаю, обойтись без нее. Таблиц не так много и можно быстро пробежать по ним глазами.
(проще было написать во всех текстовых объектах, вроде все перечислил )
Затеяли мы это все с целью более удобного внесения изменений, которых сто пудов будет вагон, однако, как только файлы пошли "по рукам", я об этом уже тыщу раз пожалел. Да и сам пару раз случайно нужные вещи посносил. Может и зря, предпочел этот способ старому доброму "файнду" (_find). Таких проектов с полсотни (это один из самых маленьких), и многие типовые, нужно просто в текстах-источниках (сверху, в рамке) поменять номер дома, с 33 на 25, например. Поиском такое провернуть было бы затруднительней. Он может поменять бог весть что еще, а по одному анализировать что-то не радует...
Вложения
Тип файла: dwg
DWG 2010
Для поиска порушенных полей.dwg (2.57 Мб, 1753 просмотров)
skkkk вне форума  
 
Непрочитано 24.08.2015, 12:47
#12
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 36,668


Проверяй. Нарисовано "по-быстрому".
Вложения
Тип файла: lsp CheckFields.LSP (8.2 Кб, 30 просмотров)
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 24.08.2015, 17:37
#13
skkkk

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,270


Спасибо огромное, Алексей, проверил, я так понял, ты обрабатывал только тексты - всё с ними пучком: находит, метит. Хотя вроде по коду происходить бы должна и обработка блоков (судя по (vlax-for blk_def (vla-get-blocks adoc)...), но "битые" поля в текстах блоков не находит.
В планах есть доработать функцию, чтоб обрабатывала все поля, заодно хочу добавить реактор на удаление объектов источников. Ты не возражаешь, если я подвергну безжалостной препарации твой код? Поскольку наглеть и злоупотреблять твоей добротой совершенно не хочется.
Почти уверен, что вопросы у меня еще возникнут. Только вот меня смущает, что не совсем все же это все по теме текущего топика, может, лучше в теме "подготовка подосновы"? До жути не люблю плодить темы, всегда цепляюсь за малейшую ниточку, за хотя бы отдаленную связь вопроса с той или иной темой, может, зря. Как считаешь?
skkkk вне форума  
 
Непрочитано 24.08.2015, 17:44
#14
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 36,668


Черт, я про атрибуты забыл... Да и таблицы тоже не проработал. Сегодня не уверен, что смогу "добить" - скорее всего, завтра днем.
Код открыт - делай что угодно. Только потом предоставь результат
Реактор не советую: тормоза при удалении любого объекта практически гарантированы. Ну или придется вешать дополнительный реактор на команды _.field, _.text, _.dtext, _.tableedit, _attedit и т.п. Оно надо?
Тему вечером отделю, если не забуду ))) Тут уже до дому пора выдвигаться через пару-тройку минут

----- добавлено через ~3 мин. -----
Тему отделил.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.08.2015, 00:51
#15
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 36,668


Тээкс, получилась забавная штуковина Я совсем забыл про особенности таблиц. Немного подправленный вариант - во вложении. Теоретически обрабатывает блоки с атрибутами, таблицы, мультивыноски. Проверяй работу.
Вложения
Тип файла: lsp CheckFields.LSP (14.6 Кб, 37 просмотров)
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 25.08.2015, 00:53
#16
skkkk

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,270


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Сегодня не уверен, что смогу "добить" - скорее всего, завтра днем.
Offtop: Не хочешь ты мне дать мозгом пораскинуть . Видимо, я откопал, как говорят в среде типичных программистов, вкусный таск)) Не, я конечно, не против, тем более, что сейчас "высокий" сезон у меня, времени в обрез. В жись с тобой не разочтусь, боюсь просто. Тем более были уже попытки - так тебя ж не поймать. То в Питере был, тебя хотел выдернуть, так ты с семьей куда-то помню уехал, в Москве ты когда бываешь, это вообще - человек-неуловимка
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Только потом предоставь результат
Это само собой - даже не обсуждается.
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Черт, я про атрибуты забыл... Да и таблицы тоже не проработал. Сегодня не уверен, что смогу "добить" - скорее всего, завтра днем.
Осмелюсь напомнить, что сейчас очень для меня важны также мультивыноски, даже больше, чем таблицы...

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Реактор не советую: тормоза при удалении любого объекта практически гарантированы.
Есть же словарь полей, так? Если из этого словаря выдернуть информацию об ID всех объектов-источников и при удалении объекта просто сверить его номер с этим списком, думаешь, долго будет? Вроде, подобные операции (обращение к базе рисунка) не едят много ресурсов? Да и реактор можно отключать, когда точно знаешь, что он не нужен. Поверь, намного большие тормозов в работе я словил из-за случайного удаления нужных объектов, которые, кажутся ненужными. Просто, допустим, хочу я проверить перед удалением кучки объектов: а можно ли? - включаю реактор. Так можно и без реактора даже обойтись, если с ним все же будут тормоза. Мучает предчувствие, что есть еще какой-то более правильный способ, но мозг уже не соображает.

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Тему отделил.
Дай Бог тебе здоровья!
skkkk вне форума  
 
Непрочитано 25.08.2015, 01:26
#17
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 36,668


В #15 я положил подправленный вариант. Насчет словаря полей не думал - наверное, можно попытаться поиграться с ним, но я не уверен в рентабельности такого решения. Придется использовать ename-представления и копаться в DXF-кодах. Мне лениво
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 25.08.2015, 02:18
#18
skkkk

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,270


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
В #15 я положил подправленный вариант
Аха, спасибо, Алексей, потестировал, результат во вложении. Мультивыноски - полет нормальный, таблицы - тоже, а вот атрибуты и тексты в блоках не задело почему-то. Код анализировать сил уже нет. Да и не так пока это важно. Ты не представляешь, как, и главное, как вовремя, ты меня выручил! К четвергу сдавать. Сейчас я быстренько все файлы проверю.!!! Правда, вынужден заметить, что не очень наглядно такие блоки показывают ситуацию. Вот сам посмотри. Почему тебе не понравилась простая рамка по границам примитива? Но это уж я сдюжу легко.


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Придется использовать ename-представления и копаться в DXF-кодах.
Копаться - мое второе имя. Главное, сначала лопату от дерьма всякого очистить. Развивать программку имею большое желание. Мечтаю протолкнуть ее в BG-TOOLS. Надеюсь, дойдут руки...
Вложения
Тип файла: dwg
DWG 2010
С найденными порушенными полями.dwg (2.13 Мб, 1528 просмотров)
skkkk вне форума  
 
Непрочитано 25.08.2015, 09:13
#19
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 36,668


Я обнаружил, что перед запуском программы надо вручную обновить все поля (программное изменение FIELDEVAL и последующая принудительная - программная же - регенерация чертежа ситуацию не изменяет). Возможно, надо было заняться поиском: на форуме, кажется, поднималась тема по программному обновлению полей, но в час ночи у меня уже силенок на это не было.
Поэтому можно попробовать вручную установить FIELDEVAL в 31, выполнить _.regenall и потом уже запускать CheckFields.
P.S. ФАйл гляну, но чуть позже: сейчас работенки накидали, надо разгрести.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.08.2015, 10:20
2 | #20
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 36,668


Очередная пересборка
Вложения
Тип файла: lsp CheckFields.LSP (15.3 Кб, 101 просмотров)
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP. Как определить ошибочные поля (####) в AutoCAD?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
AutoCAD 2008, Функция "Последние Файлы" никак не хочет работать Fredyk AutoCAD 4 05.07.2012 08:35
Свежие книги по AutoCAD. Какая лучше? Marsikus Поиск литературы, чертежей, моделей и прочих материалов 10 28.01.2012 16:55
Правило формирование записей в реестре об установленных обновлениях для AutoCAD и его вертикальных решений. hwd Программирование 8 30.09.2010 15:07
Где в реестре хранится информация о том, что в системе когда-то был установлен AutoCAD? Archeo AutoCAD 12 14.10.2009 15:24
Что нового в AutoCAD 2005 ilka_t AutoCAD 40 19.05.2004 16:48