Я начинаю заниматься программированием LISP (help) - Страница 9
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Я начинаю заниматься программированием LISP (help)

Я начинаю заниматься программированием LISP (help)

Ответ
Поиск в этой теме
Старый 19.02.2006, 20:00
Я начинаю заниматься программированием LISP (help)
mmax
 
Программист широкого профиля.
 
Челябинск
Регистрация: 08.09.2005
Сообщений: 722

Гопода, я начал этим заниматься совсем недавно, буквально в этом месяце. И у меня уже есть грандиозные планы например: чтобы автокад рисовал какие нибудь стандартные детали сам (болты, гайки шурупы итд)

И соответственно у меня начали появляться вопросы на которые г-н Полещук НН в своих произведениях не смог ответить в полном объеме, значит мне понадобится чья нибудь еще помощь.

У меня уже были вопросы которые я задал здесь и получил исчерпывающие ответы. Но если я на кждый вопрос буду создавать отдельный топик, то количество топиков будет = кол-ву вопросов, а вопросов миллион -- администраторы и модераторы данного ресурса наверное понимают о чем я. Да и такое кол-во ссылок не влезет мой..........

Вобщем я хотел бы все свои вопросы помещать в этот топик и надеюсь на поддержку знающих людей.

Всем заранее благодарен.
Просмотров: 80023
 
Старый 22.03.2006, 19:28
#161
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,202
<phrase 1=


Код:
[Выделить все]
(ssget '((0 . "INSERT")(8 . "имя блока")))
__________________
apel.fas
Apelsinov вне форума  
 
Старый 22.03.2006, 19:30
#162
favorite

инженер
 
Регистрация: 05.12.2005
Москва
Сообщений: 425


0. insert указывает на блок .
8 ."имя блока" а можно несколько имен указать?

Спасибо.
favorite вне форума  
 
Автор темы   Старый 22.03.2006, 22:31
#163
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Цитата:
Код:
label = "Радиус наружной окружности";
label = "Радиус внутренней окружности";

потом вдруг
Код:
label = "Диаметр отверстий";
и снова
Код:
label = "Расположение отверстий по радиусу";

эт придется мозги напрягать, чтоб радиус с диаметром нигде не попутать
Думаю здесь не надо мозги напрягать, радиусы фланца это одно.
А вот отверстия бывают в основном для болтов М10 М16...... итд, если запросить радиус то например у механика мозги больше закипят.
Хотя программа создавалась как раз для тупого ввода и при тупом вводе проще получить худобедный фланец оперируя радиусами, а так как болты измеряются в диаметрах то им и дан диаметр. Вобщем по этому вопросу можно целую тему открыть и долго дискутировать.

А по поводу ввода текста или нецелых чисел в поле "количество", то тут все сделано, недаром там есть функция ALERT с предупреждением.
Вчера перешел на 2006 и появились баги ведем отладку.
mmax вне форума  
 
Автор темы   Старый 22.03.2006, 23:45
#164
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Уважаемые господа, вам представилась возможность оценить мой первый шедевр «Фланец», а также пользователям Автокад 2006 все его баги.
Баги я исправлю, но есть вопросы вопросы и еще раз вопросы.

Проблемы автоповтора уже устранил, они скрывались в команде установки текущего слоя -- неверный синтаксис команды VL-CMDF хотя слой и устанавливается, но Автокад после установки слоя выкладывает кучу мата. -- Спасибо kpblcу
Включение выключение привязок походу здесь не страдает, потомучто программа была рассчитана на редактирование привязок в момент выбора точки вставки тк без привязок или возможности их редактирования указание точки будет затруднительным.

???????????????????????????????????????????
Осталась одна проблема
(getpoint)
CMDECHO страдает, что делать?
Как позволить пользователю нажать ESK безболезненно?
Если например он задал количество фланцев 100 и решил что это много и только в момент выбора точки вставки он может отказаться от продолжения программы.
???????????????????????????????????????????
mmax вне форума  
 
Старый 23.03.2006, 01:31
#165
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от mmax
Как позволить пользователю нажать ESK безболезненно?
Наверно все таки ESC...
В начале программы ставишь точку возврата. Можно через команду _.UNDO, а можно где то в начале, пока не было сделано изменений
Код:
[Выделить все]
(setq doc  (vla-get-activedocument (vlax-get-acad-object)))
......

           (vla-startundomark doc)      ; начало новой группы Undo
В конце программы соответственно
Код:
[Выделить все]
       (vla-endundomark doc)
Ну и где то (удобнее в начале, хотя по большому счету без разницы) определяешь обработчик ошибок что то вроде
Код:
[Выделить все]
  ;;--------------------------------------------------------------------------
  ;; Обработка ошибок
  (defun *error* (s)
    (princ (if (member s '("Function cancelled" "quit / exit abort" "*Прервано*" "завершить / выйти прервать"))
             "\nОтменено пользователем"
             (strcat "\nОднако, ошибка... " s " ERRNO=" (rtos (getvar "errno") 2 0))
           ) ;_  if
    ) ;_  princ
    (if (and dclnm (findfile dclnm))
      (vl-file-delete dclnm) ;_ удаление файла dcl
    )
    (if doc
      (progn
        (vla-endundomark doc)           ; завершим группу UNDO
        (vlax-release-object doc)
        (vl-cmdf "_.u")                 ; отмена сделанных изменений
      ) ;_  progn
    ) ;_  if
  ) ;_  defun
Здесь выложил немного замудреный обработчик - в программе динамически формируется файл диалога и плюс попытка правильно обработать сообщение об ошибке в русифицированных версиях. На самом деле чаще немного проще. Если в программе использовались какие то указатели на объекты - их тоже надо отрелизить в обработчике ошибок (если придется выводить напрямую в Ексель - он не простит зависших объектов )
Разумеется, *error* нужно так же локализовать. Кстати, ее можно переопределять по ходу программы любое число раз. Это даст возможность отследить какие то специфические ошибки.
vk вне форума  
 
Старый 23.03.2006, 08:25
#166
Кулик Алексей aka kpblc
Moderator

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


> mmax : Честно скажу, я не запускал на выполнение код. Есть вопрос: а почему бы не сделать цикл такого типа:
Код:
[Выделить все]
(while (setq point (getpoint "\nУкажите точку вставки <Выход> : "))
  ;; тра-ля-ля
  ) ;_ end of while
И волки сыты, и овцы целы. Т.е. пока идет указание точки, идет и работа. Как только point становится nil (неважно, почему - Esc нажали, правую кнопку, пробел - по фигу) выполняется выход из цикла. Если по Esc, то идет обработка ошибки. Любой другой случай - что там дальше после цикла.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Старый 23.03.2006, 08:49
#167
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Я, оно, канешна, дико извиняюсь , но мне непонятно - а для на хрена ваще параметы фланца вручную вводить? [sm2100] Фланцы, слава богу, стандартизированы, все размеры известны. Почему бы, как водится в приличных домах не ограничиться всего тремя вопросами: 1 - Номер ГОСТА - выбирается база данных из списка, 2 - Условное давление - выбирается группа наборов размеров и 3 - Условный проход - выбираются набор размеров. Весь выбор производиттся из падающих меню единственного диалогового окна. И никаких ошибок ввода данных! Apelsinov, Fatty, VK и примкнувший к ним kpblc задумчтво курят в сторонке :twisted:.
Да, главное забыл! Такая программа уже выкладывалась в Download. Я ее использовал - работает, как часы.
Лентяй вне форума  
 
Старый 23.03.2006, 09:33
#168
Кулик Алексей aka kpblc
Moderator

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


> Лентяй : Так и ссылочку покажи на download-е
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Старый 23.03.2006, 09:44
#169
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


>favorite №162
Цитата:
0. insert указывает на блок .
8 ."имя блока" а можно несколько имен указать?
8- имя слоя
2- имя блока

Можно использовать шаблоны, как в ф-ции wcmatch

Код:
[Выделить все]
(setq ss (ssget '((0 . "INSERT")(2 . "*блок*,*_c,TEST"))))
выберет блоки:
- все в имени которых есть блок (мойблок, блок1, и т.д.)
- все, заканчивающиеся на (krug_c, treug_c и т.д.)
- и в придачу к ним блок TEST
VVA вне форума  
 
Старый 23.03.2006, 09:54
#170
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Цитата:
Сообщение от kpblc
> Лентяй : Так и ссылочку покажи на download-е
Ишь ты какой, загребущий - как мед, так тебе и ложку подай! Ладно, держи наводку: ступай в Download, ищи там dwl119.zip и да обрящещь . А там - не токмо. что фланцы, но и ваще отрисовка корпусов сосудов, во как!
Лентяй вне форума  
 
Старый 23.03.2006, 10:07
#171
Кулик Алексей aka kpblc
Moderator

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


> Лентяй : я далек от таких проблем, мене оно не треба. Ссылка больше нужна mmax, так что от его имени (да и от моих юзеров) Тебе земной поклон (ох-охо-ох, теперь бы разогнуться ).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Старый 23.03.2006, 10:19
#172
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


> kpblc
Могу, если надо, помочь коленом под зад
Лентяй вне форума  
 
Старый 23.03.2006, 20:26
#173
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от Лентяй
Фланцы, слава богу, стандартизированы, все размеры известны.
Для стандартных, возможно, лучше блоки использовать. Нафиг их программно то рисовать? Другое дело, когда нестандартные...
vk вне форума  
 
Старый 23.03.2006, 21:15
#174
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Цитата:
Сообщение от vk
Для стандартных, возможно, лучше блоки использовать. Нафиг их программно то рисовать?
А не замодухаетесь ли вы, уважаемый, на каждый типоразмер блок ваять? Это ж, поди, по всем рядам давлений если, за пару тысяч может перескочить. А на такие подвиги, как всем известно, только мусье Danilin с его лошадиным терпением способен. Толи дело параметрический способ, как в указанной мной ссылке, или, если идти в ногу со временем, динамический блок!
Цитата:
Другое дело, когда нестандартные...
А вы скачайте указанный архив - там и нестандартные будут. Но! Только в рамках установленных правил.
Лентяй вне форума  
 
Автор темы   Старый 24.03.2006, 21:51
#175
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Цитата:
Сообщение от Лентяй
Я, оно, канешна, дико извиняюсь , но мне непонятно - а для на хрена ваще параметы фланца вручную вводить? [sm2100] Фланцы, слава богу, стандартизированы, все размеры известны.
Ну вопервых я начал еще только изучать LISP надо же мне чем нибудь заняться, Напримере этой программы я узнал где и как можно применять LAMBDA, крутить вертеть списки и извлекать из них нужные элементы итд итп.

Цитата:
Сообщение от Лентяй
Почему бы, как водится в приличных домах не ограничиться всего тремя вопросами: 1 - Номер ГОСТА - выбирается база данных из списка, 2 - Условное давление - выбирается группа наборов размеров и 3 - Условный проход - выбираются набор размеров.
Бывают не только стандартные фланцы есть еще смотровые лючки, не несущие никакой нагрузки, муфты валов, манжетные уплотнения, кольца с дырочками для различного применения и все стандартные .
Стандартов много, а две окружности по краям кружочки, -- одни для всех.

Если выбирать из ГОСТа то должна бвыть хорошая база данных, а здесь и двух страниц кода не наберется.
Да и вообще перед выбором фланца его предварительно надо расчитать руками и оформить расчеты на бумаге и на этой же бумаге в конце расчета указать "выбран фланец ГОСТ ххххх " и вроде только тогда приступают к черчению. Так почему бы просто не указать три радиуса да количество отверстий так более универсально будет.

Цитата:
Сообщение от Лентяй
И никаких ошибок ввода данных!
А у меня и нет ошибок ввода данных -- текст превращается в ноль.
Нецелые округляются до целых. А программ позволяет рисовать не только фланцы, но и наборы окружностей по заданному алгоритму.

Цитата:
Сообщение от Лентяй
Apelsinov, Fatty, VK и примкнувший к ним kpblc задумчтво курят в сторонке :twisted:.
.
Эти товарищи помогают мне осваивать LISP
Огромное им спасибо.
mmax вне форума  
 
Автор темы   Старый 24.03.2006, 21:54
#176
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Фланец готов полностью если не считать нажатие ЕSC во время указания точки.
И еще один БЭД не очень значительный.
Не буду приводить пока полностью всю программу суть проблемы можно извлечь отсюда:

Код:
[Выделить все]
(defun test (/ cpoint)

    (setq cpoint (getpoint "Укажите точку"))

(vl-cmdf "_circle" cpoint 19)
  
  )
(repeat 8  (test)) ; вместо 8 можно поставить любое число
Результат работы программы положительный вот только в Акаде 2006 в командной строке которая у курсора и в обычной строке при втором и теретьем вызове функции (test) функцией (repeat n (test)) выдается сообщение :

Код:
[Выделить все]
Can’ t  _reenter LISP ;это в обычной строке

Invalid point ; а это еще и в висячей у курсора
Укажите точку
В принципе, все то что предписывалось программе выполняется на 100% вот только Invalid point несколько портит картину своим присутствием. Как говорится результат получен да вот только осадок нехороший остался.
Почему вообще возникает такая проблема?
И почему точка получает инвалидность именно при втором и третьем запуске а при других запусках нет я пробовал (repeat 50 (test)) тоже только второй и третий раз.

Пробовал просто от балды

Код:
[Выделить все]
(defun test (/ cpoint)
  (setq testpoint (getpoint "testp"))
    (setq cpoint (getpoint "Укажите точку"))

(vl-cmdf "_circle" cpoint 19)
  
  )
(repeat 8  (test)) ; вместо 8 можно поставить любое число
здесь инвалидность давали только точке testpoint , а cpoint уже проходит без инвалидности.
Скажите как избавиться от инвалидности вообще.
mmax вне форума  
 
Старый 25.03.2006, 00:06
#177
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от mmax
вот только в Акаде 2006
......
точка получает инвалидность именно при втором и третьем запуске а при других запусках нет я пробовал (repeat 50 (test)) тоже только второй и третий раз.
Это происходит _только_ в 2006? Косяков вроде нет, в 2005 не ворчит...
В любом случае, в первую очередь поглядеть в дебагере (или же просто через (princ) вывести содержимое переменной cpoint в командную строку), в какой момент дурь лезет, убедиться что точка передается верно. Ну и наверняка стоит обратить внимание на функцию (initget).

PS 2006 не имею, потому посмотреть не смогу. Может там что то изменили в (getpoint) - это в хелп лезть надоть....
vk вне форума  
 
Автор темы   Старый 25.03.2006, 11:21
#178
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Цитата:
Сообщение от vk
PS 2006 не имею, потому посмотреть не смогу. Может там что то изменили в (getpoint) - это в хелп лезть надоть....
В обычной командной строке эта грязь выглядит не так противно. А в 2006 есть еще дубль командной строки котроый висит у курсора и передвигается вместе с ним. Так там еще какойто дорожный (!) знак перед Invalid point -- картина неприятная, и зачем она нужна если функция все равно выполняется правильно.

Забыл напомнить если запускать из редактора VisualLISP, то все проходит гладко, а если запустить с помошью (load) или через Tools==>Load App... тогда вылезает этот косяк,

И вообще я давно заметил, что если из редактора VisualLISP программы идут без косяков, то это не значит, что они будут работать нормально вне редактора -- при вызове другими средствами.
mmax вне форума  
 
Старый 25.03.2006, 12:03
#179
favorite

инженер
 
Регистрация: 05.12.2005
Москва
Сообщений: 425


Помогите. При изучении возникли вопросы .
Пробую программу написать для спецификации арматуры.

Как из файла прочесть нужную строку командой read-line
требуется прочесть 7 строку, но сразу команду read -line не повторяя.
Можно ли это сделать и как?
Тотже самый вопрос по Entsel у меня блок с аттрибутами требуется
вычленить к примеру 3 аттрибут, я делал так (entnext(entnext (entnext gggg))) Можно как-то иначе Entnext не повторяя? Причем предварительно записав предыдушие значения имен аттрибутов в локальные переменные.
Я организовал так:
Код:
[Выделить все]
(setq SPEC (ssget))
(setq Kolvo_ST (sslength SPEC))
(setq i 0)
					;(While (/= i (- Kolvo_ST 1))
(setq Imi1 (ssname SPEc i))
  
(setq POZ_1 (entnext Imi1));ÌÀññà èòîãî
(SEtq SPPOZ_1 (entget POZ_1))

(setq POZ_2 (entnext POZ_1));Ìàññà
(SEtq SPPOZ_2 (entget POZ_2))

(Setq POZ_3 (entnext POZ_2));Êîëè÷åñòâî
(SEtq SPPOZ_3 (entget POZ_3))

(Setq POZ_4 (entnext POZ_3));Äëèíà
(SEtq SPPOZ_4 (entget POZ_4))

(Setq POZ_5 (entnext POZ_4));Äèàìåòð
(SEtq SPPOZ_5 (entget POZ_5))

(Setq POZ_6 (entnext POZ_5));Ïîçèöèÿ
(SEtq SPPOZ_6 (entget POZ_6))
Может можно не так громоздко?
favorite вне форума  
 
Старый 25.03.2006, 12:37
#180
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


> mmax
Таки что же в таком случае дает вывод текущих значений в командную строку?
И еще, бормотание в командной строке можно придавить - системные переменные cmdecho и nomutt (последняя не документирована была)

> favorite
По первому - вопросу читать построчно, в цикле.
По второму - можно попробовать "угадать" хендл (5 группа DXF) и по нему выцепить. А можно и не угадать. Перебором надежнее. Ну и еще есть метод GetAttributes.
Записать в переменные можно так
Код:
[Выделить все]
(foreach i (vlax-safearray->list (vlax-variant-value (vla-getattributes (vlax-ename->vla-object (car (entsel))))))
  (princ "\n")
  (princ (vla-get-tagstring i))
  (princ " = ")
  (princ (vla-get-textstring i))
  (set (read (vla-get-tagstring i)) (vla-get-textstring i))
)
Разумеется, четыре лишних строки только для визуализации примера
Проверяем
Цитата:
RRR = 44
QQQ = 55
; 1 form loaded from #<editor "<Untitled-0> loading...">
_$ rrr
"44"
_$ qqq
"55"
_$
vk вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Я начинаю заниматься программированием LISP (help)