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

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

Помогите новичку

Ответ
Поиск в этой теме
Непрочитано 16.05.2004, 20:37 #1
Помогите новичку
Дмитрий2
 
Сообщений: n/a

Помогите новичку, пытаюсь разобраться с Lisp.
Цель: вводиш 3 числа (высота, ширина, глубина) - получаеш 3 прямоугольника (Вид сверху, сбоку и фаз)
Вроде просто и начинаю делаю так:

(defun C:vid ( )

(setvar "blipmode" 0)
(command "vpoint" "0,0,1")

(setq Высота ( getreal "Высота ="))
(setq Ширина ( getreal "Ширина ="))
(setq Глубина ( getreal "Глубина ="))

(setvar "cmdecho" 0)
(setvar "Shadedge" 1)
(command "grid" "off")
(command "color" "White")

(command "pline" "11,0" "11,11" "0,11" "0,Высота-19" "11,(- Высота 19)" "11,(- Высота 8)" "(- Ширина 19),(- Высота 8)" "(- Ширина 19),(- Высота 19)" "(- Ширина 8),(- Высота 19)" "(- Ширина 8),11" "(- Ширина 19),11" "(- Ширина 19),0" "")


Здась не простой прямоугольник, но идея та же...

Почему не работает, ведь по образцу делаю????
Просмотров: 9033
 
Непрочитано 16.05.2004, 21:19
#2
vk

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


Конечно не будет работать...
И где только берутся "образцы" для таких "творений"
Цитата:
(command "pline" "11,0" "11,11" "0,11" "0,Высота-19" "11,(- Высота 19)" "11,(- Высота 8)" ....
:shock: :shock: :shock: :shock: :shock:
Значит так, давай по порядку. Чтоб не путаться в дальнейшем, сначала завязывай с вот этим
Цитата:
"11,0" "11,11" "0,11"
Хотя такого рода запись в принципе и рабочая, тем не менее, оперировать при вычислениях такими аргументами можно разве что в целях самобичевания. Координаты коррекно прдставляются в виде списков
Код:
[Выделить все]
'(11 0) '(11 11) '(0 11)
Далее
Цитата:
"0,Высота-19"
есть строковая константа, где из высоты нууу никак не будет вычтено 19. В Лиспе для этой цели существует функция вычитания, но записывается она (как и все остальные) несколько иначе. В итоге получится
Код:
[Выделить все]
(0 (- Высота 19))
примерно как в следующих выражениях. Только кавычки не ставь. Еще момент: удобнее сначала вычислить точки - вершины прямоугольников, а убедившись в том что они вычислены правильно - вызывать команду "_.pline". Именно так, с подчерком и точкой!

PS В целях сохранности мозгов выкинь подальше "образец" откуда срисовывал сей шедевр и найди нормальный учебник. Хотя бы хелп АКАДовый.
vk вне форума  
 
Непрочитано 17.05.2004, 18:02
#3


 
Сообщений: n/a


Спасибо за помощь, но я до сих пор не догоняю...

Вот переделал, а он доходит до (0 (- Высота 19)) и выводит это число... почему? а главное почему не рисует?

(defun C:vid ( )

(setvar "blipmode" 0)
(command "vpoint" "0,0,1")

(setq Высота ( getreal "Высота шкафа ="))
(setq Ширина ( getreal "Ширина шкафа="))
(setq Глубина ( getreal "Глубина шкафа="))

(setvar "cmdecho" 0)
(setvar "Shadedge" 1)
(command "grid" "off")
(command "color" "White")

(command "pline" '(11 0) '(11 11) '(0 11) '(0 (- Высота 19)) '(11 (- Высота 19)) '(11 (- Высота 8) "")


) ; end function
 
 
Непрочитано 17.05.2004, 18:54
#4
Apelsinov

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


>Дмитрий2
Замените '(0 (- Высота 19)) на
(cons 0 (- Высота 19))
Apelsinov вне форума  
 
Непрочитано 17.05.2004, 19:05
#5
vk

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


Наверно, логичнее на (list 0 (- Высота 19))
Cons делает в этом случае точечную пару, хотя, не принципиально.
vk вне форума  
 
Непрочитано 17.05.2004, 19:15
#6
Дмитрий2


 
Сообщений: n/a


А если так:

(defun C:vid ( )

(setvar "blipmode" 0)
(command "vpoint" "0,0,1")

(setq Высота ( getreal "Высота шкафа ="))
(setq Ширина ( getreal "Ширина шкафа="))
(setq Глубина ( getreal "Глубина шкафа="))

(setvar "cmdecho" 0)
(setvar "Shadedge" 1)
(command "grid" "off")
(command "color" "White")

(command "pline" '(11 0) '(11 11) '(0 11) (cons 0 (- Высота 19)) (cons 11 (- Высота 19)) (cons 11 (- Высота 8)) "")

) ; end function


То получается (после 3-х первых точек, их он рисует)

Unknown command "HKAF". Press F1 for help.
nil


Н
 
 
Непрочитано 17.05.2004, 19:59
#7
Дмитрий2


 
Сообщений: n/a


Спасибо, так все работает:

(command "pline" '(11 0) '(11 11) '(0 11) (list 0 (- Высота 19)) (list 11 (- Высота 19)) (list 11 (- Высота 8)) (list (- Ширина 19) (- Высота 8)) (list (- Ширина 19) (- Высота 19)) (list (- Ширина 8) (- Высота 19)) (list (- Ширина 8) 11) (list (- Ширина 19) 11) (list (- Ширина 19) 0) "close")

А еще подскажите, как выглядят в Lisp команды:
1) circle 161,1320 2.1
2) ucs n 1248,0,0

Всем огромное спасибо за помощь
 
 
Непрочитано 17.05.2004, 20:53
#8
vk

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


Как выглядят команды... Почти (!) любая команда АКАД может быть вызвана из Лиспа при помощи (command ...). Самый простой способ записи - написать то же самое, как будто пишешь в командной строке. При этом вместо Enter'а используется пустая строка - "". Точки в команду нужно передавать как списки координат. Опции - как строковые. Дистанции, радиусы и т.п. - как целые или вещественные. Графические примитивы - куча вариантов... как примитив, как примитив с точкой, как набор. Пользовательский ввод - pause. Подробнее смотри в учебниках.

Код:
[Выделить все]
(command "_.circle" '(161 1320) 2.1)
или, если центр и радиус вычислены где то в другом месте
Код:
[Выделить все]
(setq coordx 161)
........................
(setq cen (list coordx 1320))
.........................
(setq dia 4.2)
.......................
(setq rad (/ dia 2.0))
........................
(command "_.circle" cen dia)
vk вне форума  
 
Непрочитано 30.05.2004, 17:04 Еще вопросы
#9
Дмитрий2


 
Сообщений: n/a


Еще несколько вопросов по Lisp:
1) Возможно ли в Lisp "вводить" данные не в командной строке, а как-нибудь через окошки (если Lisp такое позволяет)?
2) На экран выводиться число 31,456000000, а надо 31,45 - как отсечь тысячные?
3) Существует ли звуковой сигнал типа "sound"?
4) Можно ли замедлить рисование (выполнение программы), не паузами, а равномерно? (через строчку (command "delay" "1000") - не предлогать)
5) Можно ли программой создавать каталоги и сохранять в них созданные данные?

Спасибо за подсказки.
 
 
Непрочитано 30.05.2004, 17:34
#10
vk

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


1) Да, с использованием диалога (DCL), однако, это далеко не всегда оправдано.
2) Погляди на функцию (rtos ....)
3) Кажись тока древняя пишалка (chr 7)
4) Что значит "не паузами, а равномерно"?
5) ДА.
vk вне форума  
 
Непрочитано 30.05.2004, 19:01
#11
Дмитрий2


 
Сообщений: n/a


По (3), я не понял как заставить пискнуть в программе, как это пишется?
По (4), есть 2000 линий, на моей машине рисуется за ~2 сек, в институте за ~40 сек и выглядет очень умно :), как можно замедлить ход на быстрых машинах?
А еще, подскажите, существует ли команда СТИРЕТЬ ВСЕ (включая слои и типы линий)?
 
 
Непрочитано 30.05.2004, 20:00
#12
vk

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


3) (vlr-beep-reaction)
4) Все таки наверно придется использовать (command "_.delay" "1000"), только надо поточнее определиться, куда ее впихивать... И параметр поменьше, например 1 или 10. Если конечно это действительно нужно. Вариант - сделать свою функцию без command, но на основе while.

"СТИРЕТЬ ВСЕ" - _.erase _all и потом несколько раз _.purge
vk вне форума  
 
Непрочитано 15.06.2004, 12:22 Re: Еще вопросы
#13
Pilot

Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,267


Цитата:
Сообщение от Дмитрий2
4) Можно ли замедлить рисование (выполнение программы), не паузами, а равномерно? (через строчку (command "delay" "1000") - не предлогать)
Можно обратиться к системному таймеру например так:
(atoi (menucmd "M=$(edtime,$(getvar,date),MSEC)"))
и отрабатывать каждый следующий шаг отрисовки только спустя нужное количество миллисекунд.
Pilot вне форума  
 
Непрочитано 08.07.2004, 21:36
#14
Дмитрий2


 
Сообщений: n/a


Появились еще вопросы, подскажите кто знает...

Начало:
(setq Высота ( getreal "Высота шкафа ="))
(setq Ширина ( getreal "Ширина шкафа="))
(setq Глубина ( getreal "Глубина шкафа="))


После всех нарисовок надо сохранить:

(command "saveas" "dxf" "16" "00000.dxf")

У меня не получается заменить "00000.dxf" на "ВысотахШиринахГлубина.dxf" (естественно должны быть цифры)
получается довольно сложно и не работает :(((

И еще как написать путь сохранения этого файла,
если требуется сохранять в папку например "ris" которая расположена на рабочем столе?
(на одном компе, несколько рабочих столов и должен сохранять в текущую)
 
 
Непрочитано 08.07.2004, 23:13
#15
vk

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


Цитата:
У меня не получается заменить "00000.dxf" на "ВысотахШиринахГлубина.dxf" (естественно должны быть цифры)
Примерно так
Код:
[Выделить все]
(strcat (rtos Высота 2 0) "x" (rtos Ширина 2 0)  "x" (rtos Глубина 2 0) ".dxf")
Путь сохранения в папку рабочего стола конечно не лучший (что будет при удалении профиля?)... Можно, конечно, попробовать выковырять его из реестра. Где то видел такой пример, сходу не найду....
vk вне форума  
 
Непрочитано 08.07.2004, 23:25
#16
vk

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


Кажется так.... Функция вроде бы должна вернуть путь к текущему десктопу
Код:
[Выделить все]
 (VL-REGISTRY-READ "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders\\Desktop")
Но почему то не возвращает....
vk вне форума  
 
Непрочитано 09.07.2004, 00:30
#17
vk

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


Ну конечно.... правильно так
Код:
[Выделить все]
(VL-REGISTRY-READ "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders" "Desktop")
vk вне форума  
 
Непрочитано 09.07.2004, 01:10
#18
BigBrother

Design & programming :)
 
Регистрация: 14.02.2004
Новосибирск
Сообщений: 172
<phrase 1= Отправить сообщение для BigBrother с помощью Skype™


Цитата:
Сообщение от vk
Ну конечно.... правильно так
Код:
[Выделить все]
(VL-REGISTRY-READ "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders" "Desktop")
Если использовать DosLib, то в ней есть хорошая функция ...
(dos_specialdir item)
BigBrother вне форума  
 
Непрочитано 09.07.2004, 10:33
#19
Дмитрий2


 
Сообщений: n/a


А как все таки выглядит строка полностью
(command "saveas" "dxf" "16" "00000.dxf")
+
(strcat (rtos Высота 2 0) "x" (rtos Ширина 2 0) "x" (rtos Глубина 2 0) ".dxf")
+
(VL-REGISTRY-READ "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders" "Desktop")
+
в папку "ris"

А то мысль есть, но мне ее явно не хватает...

или если это сложно, как сохранить в папку С:\ris\ (я потом ярлык папки вытащу на стол)
 
 
Непрочитано 09.07.2004, 14:55
#20
vk

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


Не, не сложно.... Исходные данные у тебя уже есть, осталось функцией strcat объединить эти строки и получить строку с именем файла (полным, с путем).
Попробуй сам для начала ;-)
vk вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Помогите новичку

Размещение рекламы