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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как связать несколько "Defun" функций в одну?

Как связать несколько "Defun" функций в одну?

Ответ
Поиск в этой теме
Непрочитано 02.07.2008, 11:39 #1
Как связать несколько "Defun" функций в одну?
BARS_1985
 
construktor
 
moscow
Регистрация: 26.09.2007
Сообщений: 24

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

Например есть функция создания слоев

(defun C:lay ()

(command "_cmdecho" 0)

(command "_layer" "_Make" "3" "_Color" "140" "" "")
...
)

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

(defun C:l1 ()

(command "_cmdecho" 0
"_osmode" 0 "")

(command "_layer" "_Set" "3" "")

(setq
nab1 (ssget)
sle1 (sslength nab1)
i -1
vir 5
polv (/ vir 2.0)
ot 10
a90 (* 90 (/ pi 180))
) ;setq

(while (< i sle1)
(setq i (+ i 1)
nam1 (ssname nab1 i)
har (entget nam1)
kn (cdr (assoc 10 har))
kk (cdr (assoc 11 har))
an1 (angle kn kk)
an2 (+ an1 pi)
dist1 (distance kn kk)
pold (/ dist1 2.0)
c1 (polar kn an1 pold)
ln1 (polar c1 (+ an1 a90) 5)
ln2 (polar c1 (+ an2 a90) 5)
)
(command "_circle" c1 polv)
(command "_trim" (ssget "_X" '((0 . "CIRCLE"))) "" "ë" ln1 ln2 "" "")
);while

(command "_cmdecho" 1
"_osmode" 4415 "")
); defun


Они естественно в разных файлах. С помощью "command" функция по какой-то причине не вызывается.
Нужно что то вроде:

(defun c:fun1 ()
(command "lay")
(if (= q 1) (command "l1") (command "l2")) ; q - любая переменная, l2 - функция подобная l1, но делает три отрезка из одного.
Просмотров: 2821
 
Непрочитано 02.07.2008, 12:04
#2
Кулик Алексей aka kpblc
Moderator

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


А эти файлы загружены?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 02.07.2008, 12:07
#3
BARS_1985

construktor
 
Регистрация: 26.09.2007
moscow
Сообщений: 24


да, автоматически загружаются, и если напрямую писать в командной строке автокада, то все работают.
BARS_1985 вне форума  
 
Непрочитано 02.07.2008, 12:08
#4
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Если у вас функция определена в виде C:XXX, то в программе эта функция вызывается так
(С:XXX)
CMDECHO и OSMODE не команды, а системные переменные AutoCAD'а.
Profan вне форума  
 
Автор темы   Непрочитано 02.07.2008, 12:23
#5
BARS_1985

construktor
 
Регистрация: 26.09.2007
moscow
Сообщений: 24


"CMDECHO и OSMODE не команды, а системные переменные AutoCAD'а."
Да, но их я меняю именно через command... =)
Работает же.

Что то не так все же...

(defun C:fun1 ()
(command "C:lay")
(command "Clita")
)

C:lay Неизвестная команда "C:LAY". Для вызова справки нажмите F1.
Команда: Clita Неизвестная команда "C:PLITA". Для вызова справки нажмите F1.
Команда: nil

Вот сам лисп

(defun C:fun1 ()
(command "C:lay")
(command "Clita")
)

Последний раз редактировалось BARS_1985, 02.07.2008 в 12:28.
BARS_1985 вне форума  
 
Непрочитано 02.07.2008, 12:49
#6
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Чтобы вызывать пользовательские функции через command/vl-cmdf, их надо специальным образом объявлять. Примерно так:

Код:
[Выделить все]
(defun l1 () (print "Function L1") (princ))
(defun l2 () (print "Function L2") (princ))
(defun c:fun1 ()
 (if (= 'usubr (type l1)) ;_ проверка наличия функции
  (print "Function l1 already loaded.")
  (load "/path1/name1.lsp" (print "File name1.lsp not found...")) ;_ попытка загрузки
 )
 (if (= 'usubr (type l2))
  (print "Function l2 already loaded.")
  (load "/path2/name2.lsp" (print "File name2.lsp not found..."))
 )
 (if (= 'usubr (type l1))
  (progn (vlax-remove-cmd "l1") ;_ удаление объявления, если было ранее
         (vlax-add-cmd 'l1 "l1" "l1" acrx_cmd_modal) ;_ объявление функции
         (vl-cmdf "l1") ;_ тест функции
  )
  (print "Function l1 isn't defined.")
 )
 (if (= 'usubr (type l1))
  (progn (vlax-remove-cmd "l2")
         (vlax-add-cmd 'l2 "l2" "l2" acrx_cmd_modal)
         (vl-cmdf "l2")
  )
  (print "Function l1 isn't defined.")
 )
 (princ)
)
Alaspher вне форума  
 
Непрочитано 02.07.2008, 13:02
#7
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Вместо
Код:
[Выделить все]
 
(defun C:fun1 ()
(command "C:lay")
(command "C:lita")
)
надо, IMHO, записать:
Код:
[Выделить все]
 
(defun C:fun1 ()
(C:lay)
(C:lita)
)
Системные переменные изменяются с помощью функции (setvar).
Profan вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как связать несколько "Defun" функций в одну?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как распечатать несколько файлов за один раз. Lenich AutoCAD 35 27.06.2012 10:53
Мониторы LCD CRT Разное 94 17.06.2008 10:51
Как обнулить одну координату для всех примитивов? Miha AutoCAD 4 19.02.2004 09:11