Форум программистов, компьютерный форум, киберфорум
Наши страницы
AutoLISP
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
Surb
0 / 0 / 1
Регистрация: 06.01.2013
Сообщений: 51
1

Autolisp, построение семейства фигур

06.11.2015, 01:09. Просмотров 1203. Ответов 4
Метки нет (Все метки)

Никак не могу отладить код готовой программы, то, что должно получится приложил.
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
(defun ID ()
  (setq P1 (getpoint "\n Нач. точка:"))
  (setq L (getdist P1 "\n Нач. длина:"))
)
 
(defun QUADR (L A / P2 P3 P4)
  (setq P2 (polar P1 A L))
  (setq(polar P2 (+ А (/ PI 2)) L))
  (setq P4 (polar PЗ (+ A PI) L))
  (command "_line" P1 P2 P3 P4 "Замкнуть")
)
 
(defun c:kN ()
  (setq В 0.0)
  (ID)
  (QUADR L В)
  (while (<= В (* 2 PI))
   (QUADR L В)
   (setq В (+ В (* PI 0.1)))
   (setq L (* L 0.9))
)
)
И ещё, что не так в этом куске? Я уже не в силах понять что-то в этом autolisp'e, то запускается, то нет, до этого цеплялась одна точка к построенному из другой "программы", после изменения имен переменных стало писать ; ошибка: неверный тип аргумента: 2D/3D-точка: nil
Кликните здесь для просмотра всего текста
Lisp
1
2
3
4
5
6
7
8
9
(defun c:QUADR ()
  (setq p1 (getpoint "\n Нач. точка:"))
;;;(setq A (getangle P1 "\n Угол:"))
  (setq l (getdist "\n Нач. длина:"))
  (setq p2 (polar p1 0.0 l))
  (setq p3 (polar p2 (/ PI 2) l))
  (setq p4 (polar pЗ PI l))
  (command "_line" p1 p2 p3 p4 "Замкнуть")
)
0
Миниатюры
Autolisp, построение семейства фигур  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.11.2015, 01:09
Ответы с готовыми решениями:

Программа на AutoLisp: построение треугольников
В среде Автокада средствами Автолиспа построить множество пересекающихся...

Построение соприкасающихся окружностей в Autolisp
Помогите пожалуйста с заданием: Построение параметрических чертежей в среде...

Программа AutoLisp: построение неправильных невыпуклых пятиугольников
Решил пойти дальше по задачам и встал на вот этом: В среде Автокада...

Запуск AutoLISP
Как запустить AutoLISP в AutoCad&quot;e. Я выбираю Сервис=Приложения=... и в...

Программа в AUTOLISP
Здравствуйте,не могли бы вы мне помочь вот с таким заданием для AutoLisp ...

4
Lambdik
1038 / 932 / 106
Регистрация: 04.11.2012
Сообщений: 968
Записей в блоге: 3
06.11.2015, 11:23 2
Лучший ответ Сообщение было отмечено _sg как решение

Решение

Цитата Сообщение от Surb Посмотреть сообщение
Никак не могу отладить код готовой программы
Пишите свой код.
Цитата Сообщение от Surb Посмотреть сообщение
до этого цеплялась одна точка к построенному из другой "программы"
Нужно отключать привязку, тогда не будет цеплять.
Lisp
1
2
(setq osmode (getvar "OSMODE"))
(setvar "OSMODE" 0)
Не забудьте потом включить её обратно.
Lisp
1
(setvar "OSMODE" osmode)

Не по теме:

Нет времени писать за Вас, работа.

2
vlisp
501 / 475 / 111
Регистрация: 10.08.2015
Сообщений: 1,674
Завершенные тесты: 1
07.11.2015, 02:13 3
Лучший ответ Сообщение было отмечено Surb как решение

Решение

Ох уж эта старая школа... ничему полезному она не научит
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
(defun QUADRO (P1 A L / P2 P3 P4)
  (setq P2 (polar P1 A L)
        P3 (polar P2 (+ A (/ PI 2)) L)
        P4 (polar P3 (+ A PI) L)
  )
 
  (command "_.PLINE" P1 P2 P3 P4 "_C")
)
 
(defun c:kN (/ *error* osm cmd AN BP LQ)
 
  (defun *error* (msg)
    (if osm
      (setvar 'osmode osm)
    )
    (if cmd
      (setvar 'cmdecho cmd)
    )
    (if msg
      (princ msg)
    )
    (princ)
  )
 
  (if (or (null (setq BP (getpoint   "\nБазовая точка:")))
          (not  (setq LQ (getdist BP "\nДлина основного квадрата:")))
      )
 
    (prompt "\nНеверные исходные данные!")
 
    (progn
      (setq AN  0.0
            osm (getvar 'osmode)
            cmd (getvar 'cmdecho)
      )
      (setvar 'cmdecho 0)
      (setvar 'osmode 0)
 
      (while (<= AN (* 2 PI))
        (QUADRO BP AN LQ)
        (setq AN (+ AN (* PI 0.1)))
        (setq LQ (* LQ 0.9))
      )
    )
  )
  (*error* nil)
)
3
Surb
0 / 0 / 1
Регистрация: 06.01.2013
Сообщений: 51
07.11.2015, 22:17  [ТС] 4
За код спасибо, вот теперь бы разобраться в нем до конца, начиная от _.pline, почему она с точкой?
Но основной вопрос возникает по этой самой привязке, osmode. cmdecho связанно просто с выводом "последствий" команд в консоли acada, насколько я это понял, но всей логики присвоения и использования их я тут не совсем понимаю, не могли бы вы доступно объяснить её?
В osm и cmd мы передаем значения которые были в osmode и cmdecho, затем их мы обнуляем, а в функции *error* если эти самые значения не 0, мы присваиваем обратно, если они с самого начала были 0, мы ничего не делам, а msg выводит ошибку, если она есть, как-то так это все выходит?
Если да, то вопрос остается лишь в самой этой привязке, в её смысле и необходимости.
0
vlisp
501 / 475 / 111
Регистрация: 10.08.2015
Сообщений: 1,674
Завершенные тесты: 1
08.11.2015, 01:32 5
Есть три способа рисования объектов в автокаде с помощью лиспа:

- Командный - самый медленный и геморройный, используется как правило для издевательств над студентами и инженерами предпенсионного возраста... но иногда без него не обойтись, да и кода требует меньше. Основной тип данных - примитив. Является классикой жанра;

- Программистский - распространен в среде профессиональных программистов и использует функции entmake и entmakex. Основной тип данных - примитив;

- Объектный - используется ленивыми программистами и в случае работы с неактивными документами. Основной тип данных - vla-object;

- Смешанный - наиболее универсальный и рекомендуемый метод. Основная часть кода пишется с помощью стандартных функций autolisp, со вставками командного кода и ActiveX, когда без этого не обойтись. Основной тип данных - примитив.

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

Команды вызванные из лиспа ведут себя так же, как и вызванные вне лиспа, то есть учитываются текущие объектные привязки и другие настройки черчения. Это приводит к тому, что в результате получается искаженный рисунок. Чтобы этого избежать приходится манипулировать системной переменной osmode. Часто ее обнуляют в начале программы, забывая восстановить. Это приводит к тому, что, во-первых, в программе приходится вручную указывать как минимум объектную привязку при выборе точки, угла, расстояния, а по завершении программы настройки приходится возвращать опять же вручную.

Обнуление cmdecho здорово экономит время рисования, однако и тут часто поступают неверно, просто включая вывод в консоль. Это не верно из концептуальных соображений, так как программа должна всегда восстанавливать системные настройки, а не устанавливать их, как ей заблагорассудится.

Ну и наконец *error* в реальных приложениях никогда не используется в чистом виде. Вместо нее используются функции инициализации и финализации приложения, которые переопределяют временно *error* и восстанавливают ее по завершении работы. Это позволяет значительно уменьшить количество кода и унифицировать процесс работы в приложений.

зы В коде отсутствует маркировка меток undo. Это сделано сознательно, так как в данном случае проще просто удалить результат, а сделать метки командным способом нормально не получится, для этого нужно использовать ActiveX, что сводит к нулю целесообразность командного метода. В реальных приложениях метки undo обязательны при любом способе рисования. Так как вызов enmake и объектных методов не является командой, то каждый раз нажимая кнопку отмены, вы отменяете одну лишнюю команду. А если какое-нибудь приложение настроит механизм отмены неправильно, то можно влегкую потерять несколько часов работы, так как будут отменены ВСЕ предыдущие команды.
1
08.11.2015, 01:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.11.2015, 01:32

Программа в AutoLISP
Известна длинна окружности. Найти площадь круга, ограниченного этой окружностью.

AutoLISP работа с файлом
Здравствуйте! Необходимо реализовать вывод и ввод в файлы. Программа чертит...

Autolisp. Построении дуги
Пробовал сам, искал, но не выходит. Только начал изучать и тут уже такое...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru