|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Как создать набор из блоков двух типов? Помогите откорректировать программу.
Регистрация: 19.11.2014
Сообщений: 2,606
|
||
Просмотров: 6408
|
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
И все же с этим лиспом есть какая-то проблема. Поначалу он вроде бы работает, но после нескольких использований начинает появляться такая ошибка:
Выяснить в какой момент появляется ошибка - пока не удалось. "PRODUCT" - это значение атрибута "Формат" у двух строк-блоков из сокращенной спецификации справа (см. тестовый файл). Атрибут чисто технический, нужен для организации работы с этими блоками. Иногда функция вычисления массы выдает ошибку "NORMAL" - это тоже атрибут "Формат", но для блоков в обычной спецификации слева. Что не так с этим лиспом? Сам лисп в первом сообщении, я только заменил "СпецСтр" на "СпецСтр*". Тестовый файл во вложении. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,408
|
Ну, я бы вообще переделал (не вижу большого смысла в таких наборах переменных):
Код:
Чуть-чуть напутал со скобками и кодом. Выложил нормальный вариант.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. Последний раз редактировалось Кулик Алексей aka kpblc, 16.01.2020 в 16:54. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,408
|
Ну так заменить одну строку на несколько, делов-то:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Я в этом лиспе плохо соображаю, поэтому для меня это сложно. Спасибо
![]() ----- добавлено через ~20 мин. ----- Ну вот, поиспользовал немного этот код, но снова появляется ошибка из поста 5. По-моему она начинает проявляться после того, как я добавляю в чертеж еще один экземпляр блока СпецСтр или СпецСтрИзд, но не уверен. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,408
|
Ей там неоткуда появляться. Переименуй в моем коде команду (ну, например, в calc1) и вызывай по новому названию.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Цитата:
Сообщение при ошибке - неверная функция: "PRODUCT". Такое сообщение появляется, если последним в чертеж был добавлен блок СпецСтрИзд. У него в атрибут Формат я помещаю текст PRODUCT. Если же последним в чертеж добавлен блок СпецСтр, то при попытке подсчета суммарного веса выдается сообщение неверная функция: "NORMAL". Я программно в атрибут Формат блока СпецСтр помещаю текст NORMAL. Почему-то команда подсчета общего веса cs_calculate_weight считает текст в атрибуте Формат блоков СпецСтр и СпецСтрИзд именем функции и пытается эту функцию запустить. Не понимаю как это происходит. ----- добавлено через ~5 мин. ----- И, кстати, я пользуюсь еще лиспом, который нумерует строки спецификации, состоящие из блоков СпецСтр. Код:
|
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Это не мой код, я не понимаю как он работает.
В сообщении номер 5 я выкладывал файл. Но я не смог точно выяснить при каких условиях появляется ошибка. Некоторое время все работает, но вскоре перестает. Перезагрузка файла решает проблему. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,408
|
Сет, а кто тебе гарантирует, что порядок описания атрибутов именно такой, как ты предполагаешь?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Цитата:
Так порядок же определен самим блоком. Он заранее известен. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
да, порядок следования вставок атрибутов должен совпадать с порядком следования определений атрибутов в определении блока. Но лучше "подстелить соломки" и еще имя тэга проверять, имхо - главное, чтобы атрибут вообще был)
|
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Похоже ошибка начинает появляться сразу после того, как я добавляю в чертеж экземпляр блока "СпецСтр" или "СпецСтрИзд". Причем когда это делаю с помощью специального лиспа. Если просто добавить этот блок в чертеж прямо с палитры блоков - ошибка не возникает. А я добавляю с помощью вот такого набора команд.
Код:
Вот при использовании всего этого механизма и последующей попытке подсчитать сумму позиций по спецификации функцией cs_calculate_weight начинает появляться ошибка из поста 5. |
|||
![]() |
|
||||
САПР Регистрация: 29.09.2011
СПб
Сообщений: 283
|
Цитата:
__________________
На работе было скучно:shout: |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,408
|
Для начала - ты запускаешь приложение (которого, кроме как у тебя, ни у кого нет), и не факт, что ты дожидаешься окончания его работы.
Что это приложение делает - тайна великая и мраком покрытая. Особенно почему было невозможно всю задачу сделать на одном языке. И как-то ковырять три сотни строк кода, учитывая невозможность повторения ситуации, лично у меня желания нет.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Цитата:
Цитата:
|
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Не хотелось бы углубленно что-то сейчас изучать. Я редко делаю какие-то примочки для автокада. Вот когда-то был сделал программку для заполнения спецификаций, все хорошо работало. А тут захотел расширить функционал - добавил строку спецификаций для изделий - блок "СпецСтрИзд". Сама-то эта строчка нормально формируется, но вот с подсчетом суммы по всем строчкам возникла проблема.
|
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
ну там очень глубоко и не надо для начала - объявление переменных, циклы, массивы - а потом втянетесь..)) Вот как будет выглядеть возможный пример реализации на .Net функции подсчета общей массы аналогичный вашему коду в шапке темы:
Код:
насколько понятнее кода на лиспе?) чтобы вносить изменения, причем в значительно части заимствованный чужой код - это надо вникать достаточно глубоко в лисп, имхо. Иначе так и будет - "то хвост увязнет, то клюв..." |
|||
![]() |
|
||||
САПР Регистрация: 29.09.2011
СПб
Сообщений: 283
|
Открываешь чертеж с блоками, на которых вылезает ошибка, из него вызываешь _vlide, там в меню отладка метишь пункт "прервать на ошибке", открываешь lsp с функцией, вызывающей ошибку, загружаешь из код из редактора Ctrl+Alt+E, переключаешься в чертеж, вызываешь функцию, когда выбросит на ошибке, вызываешь окно поиска ошибок Ctrl+Shift+R, копируешь содержимое в журнал, копируешь из журнала сюда, продолжаешь обсуждать здесь причину возникновения ошибки.
----- добавлено через 58 сек. ----- На порядок понятнее лисп будет ![]()
__________________
На работе было скучно:shout: |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Привычнее конечно, но это ж нужно знать все эти классы автокада, их методы и свойства.
Цитата:
|
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Offtop:
Цитата:
частичные русскоязычные переводы - сайт Бушмана Андрея (на года не обращайте внимание - большая часть актуальна до сих пор), официальный сайт разработчиков. Нашли нужный пример, забили в поисковик по первой ссылке нужные названия классов и получили их описание - на английском, но разобраться можно. ----- добавлено через ~15 мин. ----- и крякозябры кириллические из редактора лиспа уберите - первый рецепт из поста №8 |
|||
![]() |
|
||||
САПР Регистрация: 29.09.2011
СПб
Сообщений: 283
|
Теперь правый клик по [2] и выбери перейти к месту вызова функции и где это выложи, и значение параметра функции.
Но вообще, ничего, что эта ошибка отличается от той, что в посте 5? ----- добавлено через ~3 мин. ----- По [2] в окне ошибок.
__________________
На работе было скучно:shout: |
|||
![]() |
|
||||
САПР Регистрация: 29.09.2011
СПб
Сообщений: 283
|
В определение функции cs_numeration в список локальных переменных type добавь:
004 (defun c:cs_add_specification (/ point file mode block сюда-добавь-type) 009 (setq type (read-line file)) Это из листинга в посте 19. Offtop: Наверное, ибо предположения с телефона. У тебя в этом виде 009 связывается переменная type (сейчас глобальная) с прочитанной строкой, а в момент [02] она выполняется. И у тебя строки в файле по разному в двух случаях формировались. [32] тоже выполни, и посмотри значение type
__________________
На работе было скучно:shout: Последний раз редактировалось ciril, 22.01.2020 в 23:46. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Цитата:
----- добавлено через ~1 мин. ----- Да нет, ошибка вроде такая же. Внешне так же выглядит и появляется в тот же момент. ----- добавлено через ~3 мин. ----- А это же другая функция - нумерация строк спецификации. Она, кстати, тоже перестает работать вместе с cs_calculate_weight с той же самой ошибкой. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Добавил эту переменную, при программном добавлении блока со строкой спецификации (cs_add_specification), выскочило вот такое сообщение.
|
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
в справку смотрите хоть иногда)
type |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Так, я сейчас перезапустил автокад. В cs_add_specification добавлена переменная type. Добавляю в чертеж блоки строк спецификации - функция суммирования работает без ошибок. Надо завтра посмотреть будет ли эта ошибка появляться снова.
Кстати, подскажите с одной вещью, если это не сложно. У меня весь этот набор функций по работе со строками спецификаций практически не защищен от возникающих ошибок. Например я в функции cs_add_specification открываю файл spec.txt: Код:
|
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Цитата:
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,408
|
ciril, type - зарезервированное слово.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616
|
Цитата:
файлов тоже не грех сделать...
__________________
Счастливо, Алексей! |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
То, что я использую переменную с таким именем (type) - может влиять на что-то?
----- добавлено через ~3 мин. ----- Цитата:
Код:
|
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Использование функции vl-catch-* (vl-catch-all-apply и т.д.).
Offtop: Вот видите, вы уже знаете - как обрабатывали бы ошибки в C# (аналогичные конструкции либо использование using, которая по сути упрощенная запись try... внутри себя). А лисп - вы даже не знаете, куда смотреть в справку, судя по вопросам. ----- добавлено через ~14 мин. ----- просто не используйте зарезервированные слова для имен переменных/функций - если можно обойтись без этого. В других языках на это сразу бы ругаться начал еще редактор среды разработки скорее всего, лисп "доверяет" программисту) |
|||
![]() |
|
||||
САПР Регистрация: 29.09.2011
СПб
Сообщений: 283
|
Поэтому можно только порадоваться за того, кто писал cs_numeration: зарезервированный символ использовал в качестве переменной и оставил в качестве глобальной.
Потому как, кроме здравого смысла и общих параметров среды ничего не может помешать написать вот так: Код:
__________________
На работе было скучно:shout: Последний раз редактировалось ciril, 23.01.2020 в 10:13. |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Цитата:
![]() |
|||
![]() |
|
||||
САПР Регистрация: 29.09.2011
СПб
Сообщений: 283
|
Цитата:
Если символ локальный, то в функции, в которой он локальный. А если глобальный - то во всем сеансе акада. Вы, чтобы на такие грабли не наступать, почитайте первые несколько глав Полещука.
__________________
На работе было скучно:shout: |
|||
![]() |
|
||||
Регистрация: 19.11.2014
Сообщений: 2,606
|
Цитата:
Код:
|
|||
![]() |
|
||||
САПР Регистрация: 29.09.2011
СПб
Сообщений: 283
|
Цитата:
Только прислушайтесь к совету Сергей812, не используйте без необходимости зарезервированные символы, они обычно синим, знаете ли, подсвечиваются ![]() И прочтение Полещук "AutoLISP и Visual Lisp в среде AutoCAD" 1.1-1.2 и 1.13 вам необходимо. ----- добавлено через ~25 мин. ----- Цитата:
Код:
__________________
На работе было скучно:shout: Последний раз редактировалось ciril, 23.01.2020 в 11:50. |
|||
![]() |
|
||||
САПР Регистрация: 29.09.2011
СПб
Сообщений: 283
|
Если бы у тебя type в каком-нибудь лиспе использовалось, а проверка сейчас была не (= type 'pickset), то искать ошибку можно было бы о-очень до-олго
![]()
__________________
На работе было скучно:shout: |
|||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Требуется написать программу для автоматической расстановки блоков по полилинии. | Mozgolom | Поиск исполнителей | 0 | 30.12.2019 15:50 |
Как создать одно 3д тело из двух цветов (или материалов)? | Loksana | AutoCAD | 5 | 26.01.2018 14:30 |
народ помогите создать линию проектируемой телефонной канализации | ОлегD | AutoCAD | 13 | 23.08.2011 19:30 |
Подсчет и сортировка блоков на текущем слое. Помогите отредактировать. | Kortes | Программирование | 17 | 26.03.2010 18:46 |
Как создать сопряжение двух швеллеров по косому срезу | BM60 | AutoCAD | 3 | 24.04.2009 14:56 |