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

Вернуться   Форум 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" "")


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

Почему не работает, ведь по образцу делаю????
Просмотров: 9503
 
Непрочитано 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,202
<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,291


Цитата:
Сообщение от Дмитрий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 вне форума  
 
Непрочитано 09.07.2004, 19:37
#21
Дмитрий2


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


ОК
Вот как это выглядит, не понимаю почему двойные слэши (определил подбором), но это работает как планировалось:

(command "saveas" "dxf" "16" (strcat (VL-REGISTRY-READ "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders" "Desktop") "\\ris\\" (rtos Высота 2 0) "x" (rtos Ширина 2 0) "x" (rtos Глубина 2 0) ".dxf"))


Теперь дальше:
(и в правду говорят - лень двигатель прогресса)

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

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

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

Сохранили.

А можно ли сделать, чтобы эти 3 числа вводить одной строкой и желательно командной
например написать .бат типа:
C:\Program Files\AutoCAD 2004\acad.exe <сомманда> <число_1> <число_2> <число_3>

Это вообще возможно???
 
 
Непрочитано 09.07.2004, 20:29
#22
vk

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


Про слэши. Дело в том, что обратный слэш в строках Лиспа - часть служебных символов, таких как \n, \t, \r, \" и конечно \\ Вот потому слэши и оказались двойными.

Теперь по
Цитата:
А можно ли сделать, чтобы эти 3 числа вводить одной строкой и желательно командной
например написать .бат типа:
C:\Program Files\AutoCAD 2004\acad.exe <сомманда> <число_1> <число_2> <число_3>
Если честно, то нифига не понятно что должно получится, хотя, сделать наверняка можно. Напиши подробно "сценарий" желаемого.
vk вне форума  
 
Непрочитано 09.07.2004, 22:03
#23
Дмитрий2


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


ПОДРОБНОСТИ
Предположим начало файля лисп такое:
(defun C:hkaf ( )
(setq Высота ( getreal "Высота шкафа ="))
(setq Ширина ( getreal "Ширина шкафа="))
(setq Глубина ( getreal "Глубина шкафа="))

А заканчивается:
(command "saveas" "dxf" "16" "hkaf_1.dxf")

Как это работает:
1) открыть автокад
2) команда hkaf
3) число Высота
4) число Ширина
5) число Глубина
6) закрыть автокад (хотя это я уже автоматизировал :)) )

Как хочу:
написать .bat файл с содержанием:
C:\Program Files\AutoCAD 2004\acad.exe <комманда> <число_1> <число_2> <число_3>
C:\Program Files\AutoCAD 2004\acad.exe <комманда> <число_1> <число_2> <число_3>
C:\Program Files\AutoCAD 2004\acad.exe <комманда> <число_1> <число_2> <число_3>
и т.д.

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

Согласен, много лишних движений - зато какой умный вид...

Только вот Пуск>Выполнить уже не понимает "Program Files" (пробел в команде)
Но можно запускать из каталога AutoCAD 2004, только вот как это сделать


VK, огромное тебе спасибо за помощь...
 
 
Непрочитано 09.07.2004, 22:42
#24
vk

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


Мдааааа.... Вопросы сооовсем не простые.

Значит, идея №1 такая: запрашивать длину, ширину, высоту не по отдельности через getreal, а всем скопом, через getpoint и полученный список раскидывать на составляющие.
Как это передать через .bat не проверял - только мысля.....

Идея №2 : пусть программа сама читает данные в любом количестве из .bat файла (или любого другого текстового или даже Экселевского, если уж сильно замудряться). И не надо дверью хлопать, то биш, АКАД перезапускать. Остается придумать, как ентот .bat найти. Ведь запуск может быть сделан в принципе из любого места. С отдельным файлом данных, место которого определено, нет проблем.

Попутно следует сделать обработку всевозможных ошибок и накладок (данные не того типа или отсутствие таковых, файл уже существует и т.д. и т.п.)

Цитата:
Пуск>Выполнить уже не понимает "Program Files" (пробел в команде)
А строку то в кавычки взять наверно надо....
vk вне форума  
 
Непрочитано 09.07.2004, 22:58
#25
vk

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


Впрочем, есть еще идея №3. Исходные данные наверняка не с потолка в .bat падают и не ручками туда пишутся....
Ворд? Эксель? Что то другое с VBA?
Если так - то можно вызывать АКАД и рулить им непосредственно оттуда в невидимом режиме (работает быстрее). Без батников ))
vk вне форума  
 
Непрочитано 09.07.2004, 23:24
#26
Дмитрий2


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


Вопрос в том как запустить acad.exe с ключем, чтобы сразу после открытия запускалась команда с параметрами.

А "дверью хлопать", это может и неверно, но зато не надо думать что созданы слои, стили
(если слой есть - то не создавать).

А вопрос о быстродействии пока не стоит.

Идея №1 универсальна, можно и "как сейчас" пользоваться и "в полуавтоматическом режиме".
 
 
Непрочитано 09.07.2004, 23:59
#27
vk

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


Цитата:
не надо думать что созданы слои, стили
(если слой есть - то не создавать).
Конечно, не надо думать Для того и придумали шаблоны (Template), чтоб не думать. Чтоб все что нужно, там уже было сразу при создании нового файла.
Ключем /t можно задать шаблон.

Что касается запуска... Можно указать ключ /b - вызов скрипта после старта АКАДа. В скрипт соответственно прописать вызов команды и параметры. Не забыть обеспечить автозагрузку программы.
Кажись, сформировать такой .scr файл можно непосредственно из .bat файла, но я в этом не силен.

Можно, конечно, сделать автозапуск програмы при старте АКАДа, но возьмет ли она параметры непосредственно из батника....? Вряд ли. Скорей всего, будет ждать ввода с клавы.
Или как то иммитировать из .bat клавиатурный ввод. Впрочем, тут уже просматриваются проблемы "нормальной" работы (можно обойти, изменив профиль ключем /p).
vk вне форума  
 
Непрочитано 10.07.2004, 11:46
#28
Дмитрий2


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


Вот нашел в инете и вобщем переделал под свою задачу:

При открытии AutoCAD автоматически создает новый чертеж Drawing1.dwg. Чтобы отменить это, проделайте следующее:
1. В корневом каталоге AutoCAD создайте текстовый файл с названием close.scr. Добавьте в него строку _close _y.
2. Добавьте в конец строки вызова программы текст /b close. Например, "C:\Program Files\AutoCAD 2002\acad.exe" /b close

Но только осталась одна зацепка: после сохранения закрывается командой "close",
а какой командой в *.scr автоматически создать новый чертеж Drawing1.dwg
А главное, как и где она вводится???
 
 
Непрочитано 10.07.2004, 12:27
#29
vk

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


Давайте для начала разберемся, что такое *.scr или говоря иначе, скрипт. Это текстовый файл, для управления АКАДом, который содержит совершенно тот же самый текст, который набирался бы на клавиатуре, если бы команды вводились с клавиатуры, а не мышкой с экрана. Другими словами, откройте Блокнот и сделайте вид что работаете в АКАДе (понимаю, что сложно). В результате должен получиться файл, куда записано все что Вы набираете во время работы на клаве. Мышку не трогать!!!! :evil: При запуске в ключе /b укажите этот скрипт - и он выполнится при старте АКАДа.

Кстати, этот файл не обязательно должен быть в корневом каталоге. Если его размещение не попадает в пути поиска файлов поддержки, то необходимо указать путь и имя.
Цитата:
а какой командой в *.scr автоматически создать новый чертеж Drawing1.dwg
Команда соответственно та же что и в АКАДе _.new (чтоб не путаться, на репетиции - отключите вывод диалоговых окон, временно установив FILEDIA = 0, тока потом верните обратно.)
Цитата:
А главное, как и где она вводится???
Как вводится эта (и не только) команда, подробно описано в хелпе. Притом для создания скрипта необходимо изучить именно клавиатурный ввод команд и опций, без какого либо мышководства
vk вне форума  
 
Непрочитано 10.07.2004, 14:19
#30
Дмитрий2


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


МММдаааа...
1) Откройте автокад (автоматически создается новый чертеж Drawing1.dwg, (должен по умолчанию))
2) закройте Drawing1.dwg (не автокад.)
3) введите с клавиатуры команду "_.new" или "quit".

Получилось?

У меня нет :((
 
 
Непрочитано 10.07.2004, 15:12
#31
vk

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


Ммммдаааа.....
Цитата:
автоматически создается новый чертеж Drawing1.dwg, (должен по умолчанию)
Совсем не факт. Все зависит от настроек, которые сделаны по умолчанию. Может и окно Startup Dialog открыться, а может и ничего.....
Цитата:
2) закройте Drawing1.dwg (не автокад.)
3) введите с клавиатуры команду "_.new" или "quit".
Пункт 2 следует исключить и все получится.
vk вне форума  
 
Непрочитано 14.07.2004, 21:12
#32
Дмитрий2


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


Подскажите пожалуйста
создаю 2 слоя в Lisp

(command "_.layer" "new" "Основная" "_lw" "0.7" "Основная" "")
(command "_.layer" "new" "Размеры" "_c" "5" "Размеры" "")

и рисую ими
Почему слой "Основная" - рисует как заложено толщиной 0.7.
а слой "Размеры" НЕ синего цвета (хотя квадратик цвета - синий),
что не так в создании слоя строке.
 
 
Непрочитано 14.07.2004, 21:57
#33
vk

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


Раз квадратик синий - значит цвет слою назначен синий. А вот цвет примитивов, которые на этом слое... он точно "ПоСлою" ("ByLayer" - по-аглицки, или 256 - по DXF-кодам)?
vk вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Помогите новичку