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

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

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

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

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

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

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

Добавлено:

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

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

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

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


Объект есть поле, если его FieldCode не совпадает с TextString. Разбивать не надо - лишнее.
По ID необязательно удастся найти объект, я бы на него ставку не делал: вполне возможна ситуация, когда ObjectID равен, к примеру, 185, а хранимое в поле значение - нечто типа "8565989456".
Маркировка - как угодно. Я бы, наверное, создавал отдельное описание блока, который помещал бы в центр текста, содержащего ошибочное поле (понятно, что слой отдельный и непечатаемый).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 19.08.2015, 14:24
#3
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


Цитата:
Сообщение от Кулик Алексей 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
С.-Петербург
Сообщений: 39,844


У выноски (и мультивыноски, кстати, тоже) надо получать объект аннотации и парсить уже его )
Цитата:
Сообщение от skkkk Посмотреть сообщение
Правда в х32 и х64 версиях принципы формирования ID различны
Они еще и от версии зависят: http://autolisp.ru/2014/09/16/objectid_x32x64_cad2015/
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 19.08.2015, 15:02
#5
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


Цитата:
Сообщение от Кулик Алексей 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
С.-Петербург
Сообщений: 39,844


Если объект - обычная выноска, то vla-get-annotation возвратит указатель на ее аннотацию. Для мультивыноски сработает и vla-get-textstring (если contenttype = 2, насколько я помню).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 19.08.2015, 15:12
#7
Кулик Алексей aka kpblc
Moderator

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


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


 
Регистрация: 20.03.2008
Сообщений: 2,653


Цитата:
Сообщение от Кулик Алексей 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
С.-Петербург
Сообщений: 39,844


Что за "текстовые объекты блока"? Атрибуты, что ли? Так их можно получить совсем просто.
Сорри, но сегодня времени нет и не будет совсем на проработку кода. Предоставь файл, который хочешь обработать - я попробую что-нибудь нарисовать.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 19.08.2015, 19:15
#10
art_rrc


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


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


 
Регистрация: 20.03.2008
Сообщений: 2,653


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

Последний раз редактировалось skkkk, 20.10.2020 в 14:32.
skkkk вне форума  
 
Непрочитано 24.08.2015, 12:47
#12
Кулик Алексей aka kpblc
Moderator

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


Проверяй. Нарисовано "по-быстрому".
Вложения
Тип файла: lsp CheckFields.LSP (8.2 Кб, 39 просмотров)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 24.08.2015, 17:37
#13
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


Спасибо огромное, Алексей, проверил, я так понял, ты обрабатывал только тексты - всё с ними пучком: находит, метит. Хотя вроде по коду происходить бы должна и обработка блоков (судя по (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
С.-Петербург
Сообщений: 39,844


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

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

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


Тээкс, получилась забавная штуковина Я совсем забыл про особенности таблиц. Немного подправленный вариант - во вложении. Теоретически обрабатывает блоки с атрибутами, таблицы, мультивыноски. Проверяй работу.
Вложения
Тип файла: lsp CheckFields.LSP (14.6 Кб, 45 просмотров)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 25.08.2015, 00:53
#16
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


Цитата:
Сообщение от Кулик Алексей 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
С.-Петербург
Сообщений: 39,844


В #15 я положил подправленный вариант. Насчет словаря полей не думал - наверное, можно попытаться поиграться с ним, но я не уверен в рентабельности такого решения. Придется использовать ename-представления и копаться в DXF-кодах. Мне лениво
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 25.08.2015, 02:18
#18
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


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


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

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


Я обнаружил, что перед запуском программы надо вручную обновить все поля (программное изменение FIELDEVAL и последующая принудительная - программная же - регенерация чертежа ситуацию не изменяет). Возможно, надо было заняться поиском: на форуме, кажется, поднималась тема по программному обновлению полей, но в час ночи у меня уже силенок на это не было.
Поэтому можно попробовать вручную установить FIELDEVAL в 31, выполнить _.regenall и потом уже запускать CheckFields.
P.S. ФАйл гляну, но чуть позже: сейчас работенки накидали, надо разгрести.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.08.2015, 10:20
2 | #20
Кулик Алексей aka kpblc
Moderator

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


Очередная пересборка
Вложения
Тип файла: lsp CheckFields.LSP (15.3 Кб, 137 просмотров)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 25.08.2015, 15:24
#21
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


По всем пяти пунктам из #11 - полет отличный. Уже проверил с два десятка файлов - с полсотни где-то незамеченных решеток были обнаружены. Бумаги сэкономилось просто уйма. Как всегда, спасибо, Алексей.
skkkk вне форума  
 
Непрочитано 25.11.2015, 12:17
#22
ArchPavel

кончающий инженер-гидротехник
 
Регистрация: 17.12.2012
Сообщений: 67


Применил скрипт из #20 к своему файлу.
В файле в таблице сведены ТЭП по квартире - в ячейке простые суммы из полей (по принципу "=FIELD+FIELD+FIELD". Каждое поле - одна полилиния. Для эксперимента одна полилиния на чертеже была удалена. В таблице сумма уменьшилась, но не стала отображаться как решетка (из-за чего и полез в Форум). Исчезновение полилинии видно только когда заходишь в ячейку и видишь всю цепочку полей-участников - на месте пропавшей полилинии красуется решетка. Но, как и говорил выше, сумма не становится решеткой, число уменьшается но остается числом.
Скрипт не смог отловить эту пропажу.

Вопрос сдвоенный - есть ли возможность заставить Автокад отображать сумму решеткой, если один из членов расчета - решетка? И возможно ли в скрипте учесть эту специфику ячеек таблиц?
ArchPavel вне форума  
 
Непрочитано 26.11.2015, 12:29
#23
shartal


 
Регистрация: 12.08.2009
Сообщений: 447


Корректно отлавливает поля во всех типах объектов только код из поста 20. Но он проверяет все листы. Это очень не удобно. В файле есть несколько листов, часть из них еще не входит в подшивку, а штамп с полями уже стоит (заполняется сам при добавлении листа в подшивку). Можно добавить версию, которая ищет поля только в текущем пространстве?
shartal вне форума  
 
Автор темы   Непрочитано 26.11.2015, 16:04
#24
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


Цитата:
Сообщение от ArchPavel Посмотреть сообщение
Исчезновение полилинии видно только когда заходишь в ячейку и видишь всю цепочку полей-участников - на месте пропавшей полилинии красуется решетка. Но, как и говорил выше, сумма не становится решеткой, число уменьшается но остается числом.
Сам не так давно столкнулся с подобным нюансом. Заметил что цифры в некоторых полях какие-то неадекватные. Подтверждаю, что если конечное поле состоит из суммы полей и содержимое одного из слагаемых отображается в формуле конечного поля в виде решеток, то это слагаемое принимается за нуль и сумма считается без его учета. И пользователь (а хуже, когда некто проверяющий этого пользователя, а еще хуже, когда госпожа Физика) видит на чертеже вместо ошибки (####) эту неправильную с его точки зрения, но правильную с точки зрения AutoCAD'а цифру и очень удивляется.
Как это исправить - пока ума не приложу. Можно ли программно докопаться до слагаемых этого поля?
skkkk вне форума  
 
Непрочитано 26.11.2015, 17:04
#25
Кулик Алексей aka kpblc
Moderator

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


Теоретически можно: получаешь FieldCode, парсишь его на предмет ObjectId (которые, насколько я помню, потребуется преобразовывать), по ним получаешь указатели на объекты - и собираешь с них соответствующую информацию.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 27.11.2015, 09:25
1 | #26
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от shartal Посмотреть сообщение
Корректно отлавливает поля во всех типах объектов только код из поста 20. Но он проверяет все листы.
Добавил диалог выбора листов
Вложения
Тип файла: lsp CheckFields 0.0.4.LSP (28.5 Кб, 72 просмотров)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 27.11.2015, 15:04
#27
Эдуард

строительство
 
Регистрация: 16.01.2004
Петербург
Сообщений: 165
<phrase 1=


Решил все таки покопаться в словаре как было предложено выше. Вроде получается проще. У поля битого объекта изменены коды 94,95,96
Код:
[Выделить все]
 
(defun bad_field ()
  (vl-remove-if-not
    '(lambda (x)
       (and
	 (= (car x) 330)
	 (= (cdr (assoc 0 (entget (cdr x)))) "FIELD")
	 (= (cdr (assoc 1 (entget (cdr x)))) "AcObjProp")
	 (> (cdr (assoc 96 (entget (cdr x)))) 0)
       )
     )

    (dictsearch (namedobjdict) "ACAD_FIELDLIST")

  )
)
Эдуард вне форума  
 
Непрочитано 02.12.2015, 09:53
#28
ArchPavel

кончающий инженер-гидротехник
 
Регистрация: 17.12.2012
Сообщений: 67


Скажите кто знает, может хотя бы в 2015-2016 версиях этот глюк с таблицами исправили?
ArchPavel вне форума  
 
Непрочитано 02.12.2015, 10:12
#29
Кулик Алексей aka kpblc
Moderator

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


Какой "этот"?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 02.12.2015, 10:29
#30
ArchPavel

кончающий инженер-гидротехник
 
Регистрация: 17.12.2012
Сообщений: 67


Вопрос в #22
ArchPavel вне форума  
 
Непрочитано 02.12.2015, 11:16
#31
Кулик Алексей aka kpblc
Moderator

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


Ну тогда меняй код скрипта так, как тебе надо. Вопрос не к штатному функционалу AutoCAD
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 02.12.2015, 13:54
#32
ArchPavel

кончающий инженер-гидротехник
 
Регистрация: 17.12.2012
Сообщений: 67


то есть в 15/16 версиях сумма полей "правильных" и "решетчатых" все также пишется числом, не решеткой? Не понимаю логики Autodesk
ArchPavel вне форума  
 
Непрочитано 02.12.2015, 14:44
#33
Кулик Алексей aka kpblc
Moderator

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


AutoCAD 2015: при наличии в формуле ошибочного поля результат выводится как ####. Только что специально проверил.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 02.12.2015, 14:53
#34
ArchPavel

кончающий инженер-гидротехник
 
Регистрация: 17.12.2012
Сообщений: 67


Спасибо большое
ArchPavel вне форума  
 
Непрочитано 02.12.2015, 15:14
#35
kacugu

начинающий инженер-гидротехник
 
Регистрация: 18.04.2010
Санкт-Петербург
Сообщений: 893


Autocad 2015 rus sp2. Тоже самое, что и в #22.
Вложения
Тип файла: dwg
DWG 2013
Field in table.dwg (36.6 Кб, 439 просмотров)

Последний раз редактировалось kacugu, 02.12.2015 в 15:30. Причина: добавил файл
kacugu вне форума  
 
Непрочитано 02.12.2015, 15:16
#36
ArchPavel

кончающий инженер-гидротехник
 
Регистрация: 17.12.2012
Сообщений: 67


Вот жеж засада (
ArchPavel вне форума  
 
Непрочитано 02.12.2015, 16:04
#37
kacugu

начинающий инженер-гидротехник
 
Регистрация: 18.04.2010
Санкт-Петербург
Сообщений: 893


А проверка таблиц на наличие #### не планируете добавить?
kacugu вне форума  
 
Непрочитано 02.12.2015, 16:10
#38
Кулик Алексей aka kpblc
Moderator

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


Кому вопрос адресован?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 02.12.2015, 16:17
#39
kacugu

начинающий инженер-гидротехник
 
Регистрация: 18.04.2010
Санкт-Петербург
Сообщений: 893


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Кому вопрос адресован?
Скорее мысль в слух
kacugu вне форума  
 
Непрочитано 07.04.2016, 15:01
#40
shartal


 
Регистрация: 12.08.2009
Сообщений: 447


Подскажите господа, чтобы такое добавить в код, чтобы проверял решетки только в модели?
shartal вне форума  
 
Автор темы   Непрочитано 07.04.2016, 15:21
#41
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


shartal, а как насчет #26? Не пойдет?
skkkk вне форума  
 
Непрочитано 07.04.2016, 18:14
#42
shartal


 
Регистрация: 12.08.2009
Сообщений: 447


Хотелось бы добавить это в сценарий, всплывающее окно очень мешает.
shartal вне форума  
 
Непрочитано 10.04.2016, 12:42
1 | #43
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от shartal Посмотреть сообщение
всплывающее окно очень мешает.
Замени в коде из #26 строчку
Код:
[Выделить все]
(foreach layout (_dwgru-get-user-dcl "Выберите листы" (cons "Model" (mapcar 'vla-get-name (cdr(dwgru-layouts-list)))) t)
на
Код:
[Выделить все]
(foreach layout (list "Model")
Не проверял, нет технической возможности, но должно работать
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 16.11.2017, 20:15
#44
allar8


 
Регистрация: 12.03.2013
Сообщений: 650


checkfield
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Очередная пересборка
Вложения
CheckFields.LSP (15.3 Кб, 67 просмотров)
Потрясающе!
allar8 вне форума  
 
Непрочитано 27.02.2018, 13:42
#45
Barmaley Bubusikin


 
Регистрация: 05.06.2014
Сообщений: 77


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
AutoCAD 2015: при наличии в формуле ошибочного поля результат выводится как ####
Автокад 2016. Как заставить искать в поле с формулой вида "ошибочное поле"*"что-то еще". (пример во вложении)
Вложения
Тип файла: dwg
DWG 2013
Поля с ошибками.dwg (48.9 Кб, 11 просмотров)
Barmaley Bubusikin вне форума  
 
Непрочитано 09.08.2019, 15:14
#46
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Задался подобный вопросом поиска "битых" полей...
Оказалось, что с точки зрения .NET не сказать что просто, но довольно много инструментов.
Не надо перебирать объекты в чертеже, можно разом получить список всех полей и быстренько найти их родителей и у каждого поля есть статус FieldEvaluationStatus в котором видно есть ли ошибки при пересчете поля.

Цитата:
Сообщение от Barmaley Bubusikin Посмотреть сообщение
Автокад 2016. Как заставить искать в поле с формулой вида "ошибочное поле"*"что-то еще". (пример во вложении)
В Вашем файле из 34 полей, сломано 22 =(
Boxa вне форума  
Ответ
Вернуться   Форум 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