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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Программирование в AutoLISP, разбор ошибок.

Программирование в AutoLISP, разбор ошибок.

Ответ
Поиск в этой теме
Непрочитано 25.05.2009, 11:12 #1
Программирование в AutoLISP, разбор ошибок.
Scorpio_1986
 
инженер-проектировщик
 
Регистрация: 13.05.2009
Сообщений: 24

Я решил создать Lisp которая могла бы создать изображение окна при этом разрезать стену:
Код:
[Выделить все]
 ; Создание окна  (defun dtr (a) (* pi (/ a 180.0)) )  (defun sozdrazmer () (setq sp (getpoint "\nТочка вставки: ")) (setq ep (getpoint "\nШирина окна: "sp)) (setq tp (getpoint "\nШирина стены: "sp)) (setq sh (distance sp ep)) (setq tol (distance sp tp)) (setq raspl (angle sp ep)) (setq raspl90 (+ raspl (dtr 90))) (setq raspl180 (+ raspl (dtr 180))) (setq aspl90 (- raspl (dtr 90))) )  (defun sozdsten () (command "_lweight" "0.4" "_color" "7" "_pline" sp (setq p (polar sp raspl90 120)) (setq p (polar p raspl180 60)) (setq tp (polar p raspl90 (- tol 120))) "" "_pline" (setq p (polar sp raspl sh)) (setq p (polar p raspl90 120)) (setq p (polar p raspl 60)) (polar p raspl90 (- tol 120)) "" ) )  (defun sozdrazrez () (command "_trim" (setq p (polar sp raspl90 60)) (polar p raspl sh) "" "_F" (setq p (polar (polar sp aspl90 1) raspl (/ sh 2))) (polar p raspl90 (+ tol 2)) "" "" ) )  (defun sozdokno () (command "_lweight" "0.2" "_color" "5" "_pline" sp (polar sp raspl sh) "" "_pline" (setq p (polar sp raspl90 60)) (polar p raspl sh) "" "_pline" (setq p (polar sp raspl90 120)) (polar p raspl sh) "" "_pline" tp (polar tp raspl (+ sh 120)) "" "_lweight" "ПоСлою" "_color" "ПоСлою" ) )  (defun C:okno () (sozdrazmer) (sozdsten) (sozdrazrez) (sozdokno) )
В результате в моем компе Lisp работает корректно, а в других компах не работает.В чем моя ошибка. Это мой первый Lisp поэтому поподробнее пожалуйста, очень уж хочется разобраться
Просмотров: 2901
 
Непрочитано 25.05.2009, 11:41
#2
Кулик Алексей aka kpblc
Moderator

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


Во-первых, код:
Код:
[Выделить все]
          ; Создание окна
(defun dtr (a) (* pi (/ a 180.0)))
(defun sozdrazmer ()
  (setq sp (getpoint "\nТочка вставки: "))
  (setq ep (getpoint "\nШирина окна: " sp))
  (setq tp (getpoint "\nШирина стены: " sp))
  (setq sh (distance sp ep))
  (setq tol (distance sp tp))
  (setq raspl (angle sp ep))
  (setq raspl90 (+ raspl (dtr 90)))
  (setq raspl180 (+ raspl (dtr 180)))
  (setq aspl90 (- raspl (dtr 90)))
  ) ;_ end of defun

(defun sozdsten ()
  (command "_lweight"
           "0.4"
           "_color"
           "7"
           "_pline"
           sp
           (setq p (polar sp raspl90 120))
           (setq p (polar p raspl180 60))
           (setq tp (polar p raspl90 (- tol 120)))
           ""
           "_pline"
           (setq p (polar sp raspl sh))
           (setq p (polar p raspl90 120))
           (setq p (polar p raspl 60))
           (polar p raspl90 (- tol 120))
           ""
           ) ;_ end of command
  ) ;_ end of defun

(defun sozdrazrez ()
  (command "_trim"
           (setq p (polar sp raspl90 60))
           (polar p raspl sh)
           ""
           "_F"
           (setq p (polar (polar sp aspl90 1) raspl (/ sh 2)))
           (polar p raspl90 (+ tol 2))
           ""
           ""
           ) ;_ end of command
  ) ;_ end of defun

(defun sozdokno ()
  (command "_lweight"
           "0.2"
           "_color"
           "5"
           "_pline"
           sp
           (polar sp raspl sh)
           ""
           "_pline"
           (setq p (polar sp raspl90 60))
           (polar p raspl sh)
           ""
           "_pline"
           (setq p (polar sp raspl90 120))
           (polar p raspl sh)
           ""
           "_pline"
           tp
           (polar tp raspl (+ sh 120))
           ""
           "_lweight"
           "ПоСлою"
           "_color"
           "ПоСлою"
           ) ;_ end of command
  ) ;_ end of defun

(defun c:okno ()
  (sozdrazmer)
  (sozdsten)
  (sozdrazrez)
  (sozdokno)
  ) ;_ end of defun
Во-вторых, перед отрисовкой ставь osmode в 0, потом возвращай обратно.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 25.05.2009, 11:51
#3
Scorpio_1986

инженер-проектировщик
 
Регистрация: 13.05.2009
Сообщений: 24


Спасибо! Все работает!
Scorpio_1986 вне форума  
 
Непрочитано 09.06.2009, 23:14
#4
Botanik

Инженер-конструктор
 
Регистрация: 19.03.2008
Сообщений: 108


Дабы не создавать новую тему (да и название у этой соответствующее), решил задать вопрос знающим людям здесь.
Передомною лежит книга Полещука - учусь и параллельно практикуюсь. Так вот. под себя решил написать пилотный лиспик (мой "хелло ворлд").

Код:
[Выделить все]
(vl-load-com)
      (defun c:55 nil
    (setq lay1 (getvar "clayer"))
    (setvar "clayer" "1SERV")
      (vl-cmdf "._dimlinear")
      (setvar "clayer" lay1)
      (princ)
      )
По моему мнению, програмка должна размерную линию (пока только "dimlinear") отрисовывать только в слое*"1SERV". Если текущий слой отличный от*"1SERV", то берется промежуточная переменная, к которой присваивается название текущего слоя, дабы после простановки размера вернуть текущий слой на место.
Как вы поняли, лисп не пашет Вернее пашет, но не совсем так. Размеры отрисовываются в текущем слое (не*"1SERV"), но зато переменная [lay1]принимает значение*"clayer".
Где я не прав?

ПС: звездочек в коде не должно быть, их движок форума автоматом впихивает - не знаю как избавиться.
__________________
Железобетон - он и в Африке железобетон.
И только в Москве - это силесопитон.
Botanik вне форума  
 
Непрочитано 09.06.2009, 23:26
#5
Кулик Алексей aka kpblc
Moderator

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


  1. Где нормальное объявление функции?
  2. Что за nil там?
  3. Почему выдается только команда _.dimlinear и не ожидается окончание ее выполнения?
  4. Где обработчик ошибок?
Как вариант (пишу насухую, AutoCAD сейчас не запустить):
Код:
[Выделить все]
(vl-load-com)
(defun c:55( / *error* lay1)
(defun *error*(msg)
(if lay1 (setvar "clayer" lay1))
(princ msg)
(princ)
)
(setq lay1 (getvar "clayer"))
(command "_.-layer" "_s" "1SERV" "")
(command "_.dimlinear")
(while (/= (getvar "cmdactive") 0)
(command pause))
(setvar "clayer" lay1)
)
Вроде так...
P.S. Посмотри тему "Научите лиспу на примере" - там многое разбиралось.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 10.06.2009, 00:41
#6
Botanik

Инженер-конструктор
 
Регистрация: 19.03.2008
Сообщений: 108


Цитата:
1. Где нормальное объявление функции?
2. Что за nil там?
Насколько мне известно, nil (в данном случае) позволяет нам сразу же перейти к перечислению выражений, минуя (в данном случае необязательный - я ошибался) ввод <аргументов> и /<рабочих символов>.
Раньше у меня все работало с nil - но тогда в моих функциях не было переменных.

Цитата:
3. Почему выдается только команда _.dimlinear и не ожидается окончание ее выполнения?
Ожидание окончания выполнения. Речь идет об этом выражении?
(while (/= (getvar "cmdactive") 0)
(command pause))


Цитата:
4. Где обработчик ошибок?
Процитирую ShaggyDoс (http://forum.dwg.ru/showpost.php?p=2...postcount=82)*
Цитата:
На первом этапе важен контроль ввода, обработка ситуаций нажатия ESC, пустого ввода. Да еще и надо предотвращение ошибок делать. Это можно оставить на усовершенствование, но забывать нельзя.
(думаю я понял его так, как он и хотел, чтобы его поняли)
До совершенствования мне оочень далеко, тут азы постичь хотя бы. Поэтому обработчик ошибок и подобные им "лакомства" оставляю на десерт.

Чисто из спортивного интереса скажите, почему
(command "_.-layer" "_s" "1SERV" "")
а не
(setvar "clayer" "1SERV")
Подозреваю ,что это очередная "защита от ошибок"; если слоя*"1SERV" не будет существовать, то прога попросит выбрать другой слой. Так?
__________________
Железобетон - он и в Африке железобетон.
И только в Москве - это силесопитон.

Последний раз редактировалось Botanik, 10.06.2009 в 00:57.
Botanik вне форума  
 
Непрочитано 10.06.2009, 02:46
#7
Кулик Алексей aka kpblc
Moderator

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


Botanik, при определении функции (можно считать) обязательно указание скобок после имени. Неважно - есть там параметры и локальные переменные или нет.
Цитата:
Речь идет об этом выражении?
(while (/= (getvar "cmdactive") 0)
(command pause))
Да.
Цитата:
Поэтому обработчик ошибок и подобные им "лакомства" оставляю на десерт.
Обработчик ошибок не сложен для понимания, а самодисциплины прибавляет
Цитата:
Чисто из спортивного интереса скажите, почему
(command "_.-layer" "_s" "1SERV" "")
а не
(setvar "clayer" "1SERV")
Подозреваю ,что это очередная "защита от ошибок"
Ага, защита
Цитата:
если слоя*"1SERV" не будет существовать, то прога попросит выбрать другой слой. Так?
Не совсем. В таком случае программа создаст слой с настройками по умолчанию. По крайней мере так планировалось.
У меня все еще машина весьма неустойчива, и AutoCAD запустить я не в силах.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 19.06.2009, 13:56
#8
Gostushev

проектирование КМ, КМД
 
Регистрация: 02.05.2005
Сообщений: 25


Привет пытливым умам!
Нужна ваша помощь!!!
Есть проблема - при выполнении проектов в Автокаде необходимо чтобы некоторые данные автоматически прописывались в таблицах, пояснениях, ссылках и т.д. Я вижу это так - есть какой то файл с базой, где разным переменным присвоена какая то информация, далее эта информация автоматически меняется во всем файле, если мы откорректировали базу. Например - у нас есть эл. кабель ВВГнг длиной 100м, мне нужно, чтобы за числом "100м" было что то закреплено и при изменении "чего-то" информация поменялась бы во всех таблицах. Просто скажем типов кабелей может быть 10 из которых 5 имеют длину 100м. Использовать Exel для этих целей - считаю нерационально, файл просто не откроется, да и вставыши в виде многочисленных окошек будут выглядеть ужасно. Нужна какая то надстройка - что то типа СПДС. Может по жизни есть какое то решение?
Gostushev вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Программирование в AutoLISP, разбор ошибок.



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программирование AutoLisp msv_mnv Прочее. Программное обеспечение 2 11.12.2007 15:00