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

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

Вопросы по Lisp

Ответ
Поиск в этой теме
Непрочитано 24.01.2006, 07:51
Вопросы по Lisp
Krieger
 
инженер (КМ)
 
Красноярск
Регистрация: 30.10.2004
Сообщений: 3,757

Такой вопросик:
Как сделать набор элементов состоящих, допустим, только из линии?
Т.е. ssget, только выбирать функция должна только то что надо.
Просмотров: 29712
 
Непрочитано 21.07.2006, 14:40
#81
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,792
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Поковыряй с помощью этого
Пособие по расшифровке DXF регионов и солидов
И здесь обсуждали
http://www.autocad.ru/cgi-bin/f1/board.cgi?t=23596eY
VVA вне форума  
 
Непрочитано 21.07.2006, 14:41
#82
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


->kpblc
Это не мой случай, поэтому о масштабах думать не надо. Программа об этом думает на предыдущих этапах.
Всё верно, но ведь тела - это набор граней, а они вершинами, как и полилинии. (Всё ж только зашифровано, а это очень не удобно!)
Евгений А. вне форума  
 
Непрочитано 21.07.2006, 15:21
#83
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


->VVA
Отличные ссылки!!!

Большое спасибо, думаю то что надо. Обязательно что-нибудь сварганю. Только наверно попозже, когда закончу со своим проектом!
Евгений А. вне форума  
 
Непрочитано 22.07.2006, 01:36
#84
point111


 
Регистрация: 22.06.2005
Rostov-on-Don
Сообщений: 5


как контролировать ESC (или любую другую клавишу) во время выполнения LISP программы?

пример:
Код:
[Выделить все]
(defun test (/)
(setq name_temp_layer "000")

(lay_m);|создание и установк текущим временного слоя|;
(setq dist_m (getdist "укажите расстояние: "))

;|а вот если сейчас нажать ESC, то прога остановится, в чертеже останется временный слой, а его надо в любом случае убить, т.е. запустиь (exitproc_m)|;

(alert (rtos dist_m 2 5))
(exitproc_m) ;|возвращение на текущий слой, уничтожение временного слоя|;
)






;|создание и установк текущим временного слоя, определение параметров слоя|;
(defun lay_m (/)
  (setq curent_layer (getvar "clayer"))
  (setq curent_color (getvar "CECOLOR"))
  (command "_layer" "_make" name_temp_layer "")
  (setq color_temp_layer 50) ;|цвет временного слоя|;
  (command "_layer" "_color" color_temp_layer "")
  (setvar "CECOLOR" "256")
  (command)
) ;|defun lay|;


;|возвращение на текущий слой, уничтожение временного слоя|;
(defun exitproc_m (/)
  (setvar "clayer" curent_layer)
  (setvar "CECOLOR" curent_color)
  (command "_purge" "_la" name_temp_layer "_y" "_y")
  (gc)
) ;|exitproc|;
задача не относится к конкретному примеру, мне просто нужен корректный выход из любого места программы в любое время с зачисткой всех темпов, мне нужен прием обработки Esc (или любой другой клавиши) на все случаи жизни.

процедура зачиски меня не интересует, я её напишу, но вот перехват нажатия кнопок (с последующим вызовом определенной процедуры) я нигде не нашел.
point111 вне форума  
 
Непрочитано 24.07.2006, 07:43
#85
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 11,005


"На все случаи жизни" корректный выход по ESC не получится. При нажатии ESC в работу включается стандартная функция *error*. Обычно ее переопределяют. В общем случае именно здесь должно быть восстановление всех требуемых параметров. И соответствующая структура программы - не делать досрочного выхода через exit и quit в разных местах, а всегда делать единственный штатный выход с завершением всех логически требуемых действий.

В Lisp, в отличие от других систем программирования, функции типа Exit вываливают сразу из программы, а не в структуру более высокого уровня.

Самое лучшее - написать "низкоуровневые" функции для любого ввода (то есть момента, когда пользователь реально может прервать программу). А обработчики досрочных прерываний оставить на случаи, когда пользователь прерывает "зависшие" длительные действия.

Подробно обо всем этом см. книгу "САПР на базе AutoCAD - как это делается" - здесь цитировать нет времени.

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

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

Подобные функции сделаны и для выбора примитивов - чтобы проконтролировать осознанно ли отказался пользователь от указания объекта, или просто промахнулся. В таких случаях можно использовать анализ системной переменной ERRNO.

Кроме того, имеется замечательная функция vl-catch-all-error-p (и vl-catch-all-apply), позовляющая отлавливать любые ошибки (вплоть до деления на 0), не разрушая программу. Она же предотвращает неправильные движения "шаловливых ручек". Если заключить vl-catch-all-error-p в свою функцию-обертку, то можно и предотвращать ошибки, и получать о них внятные сообщения, и предусматривать правильный дальнейший ход программы.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 08.11.2006, 08:44
#86
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,757


Как сделать возможность выбора опций при указке точки (getpoint)\объекта (entsel)? Т.е. например:
(while (setq (getpoint "\nУкажите начальную точку [Delta] <Выход> :"))
--
);end while
Так вот если не нажал enter и не указал точку, но ввел ключевое слово, например delta, надо будет указать эту delta, после чего вернуться указке точки.

Что-то наподобие того о чем говорил ShaggyDoc в 62-м посте:
Цитата:
Примерный протокол работы:

СВАРНОЙ ШОВ: Катет 2 мм на бумаге. Вершина треугольника [Катет]<Выход>:
Направление первого угла:
Направление второго угла:
СВАРНОЙ ШОВ: Катет 2 мм на бумаге. Вершина треугольника
[Катет/Отмени]<Выход>:К
Катет шва, мм на бумаге <2.0>:3
СВАРНОЙ ШОВ: Катет 3 мм на бумаге. Вершина треугольника [Катет/Отмени]<Выход>:
Направление первого угла:
Направление второго угла:
СВАРНОЙ ШОВ: Катет 3 мм на бумаге. Вершина треугольника [Катет/Отмени]<Выход>:О

СВАРНОЙ ШОВ: Катет 3 мм на бумаге. Вершина треугольника [Катет]<Выход>:
|;
(while (setq pnt_vertex
(ru-get-point-or-exit
(strcat "СВАРНОЙ ШОВ: Катет "
(rtos (ru-conv-unit-to-millimeter-in-paper catet) 2 2)
" мм на бумаге. Вершина треугольника"
) ;_ end of strcat
(if solid
"Катет Отмени"
"Катет"
) ;_ end of if
) ;_ end of ru-get-point-or-exit
) ;_ end of setq
Но у него это все завернуто в ru-get-point-or-exit.
Krieger вне форума  
 
Непрочитано 08.11.2006, 08:47
#87
Кулик Алексей aka kpblc
Moderator

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


Комбинацию (initget) И (getpoint), наверное? Я не уверен, потому как не особо работал с такими задачами...
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 08.11.2006, 09:07
#88
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,757


Как их комбинировать? Вот в чем вопрос.
Ну напишу я перед getpoint (initget 0 "Delta") и getpoint все равно точку просит и ругается если это не точка, соответственно запомнить результат не могу.
Krieger вне форума  
 
Непрочитано 08.11.2006, 09:26
#89
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
(defun test (/ res)
  (initget 128 "Настройки наФиг _ O F")
  (setq res (getpoint "\nTest [Настройки/наФиг] <Выход> : "))
  (cond
    ((= (type res) 'str)
     (cond
       ((= (strcase res) "O")
        (princ "\nНастройки")
        )
       ((= (strcase res) "F")
        (princ "\nНас послали...")
        )
       ) ;_ end of cond
     )
    ((= (type res) 'list)
     (princ "\nА вот и точка...")
     )
    ) ;_ end of cond
  res
  ) ;_ end of defun
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 08.11.2006, 09:30
#90
nmr


 
Регистрация: 22.08.2006
Тартария
Сообщений: 85


to krieger



(while (not flag)
(initget "Line Scale" 128)
(setq t1 (getpoint "\nНачальная точка или[Line/Scale]: "))
(cond
((eq t1 "Scale") (setq brkscale (getreal "\nМасштаб символа разрыва= "))
(princ (strcat "\nМасштаб= " (rtos brkscale 2 0))))
((eq t1 "Line") (setq protobreakln (car (entsel))
protobreakln-elist (entget protobreakln)
t1 (cdr (assoc 10 protobreakln-elist))
t2 (cdr (assoc 11 protobreakln-elist))
flag t)
)
((eq (type t1) 'list) (setq flag t)
(setq t2 (getpoint t1 "\nКонечная точка-> ")))));end while
nmr вне форума  
 
Автор темы   Непрочитано 08.11.2006, 09:42
#91
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,757


Спасибо, все просто.
Krieger вне форума  
 
Автор темы   Непрочитано 10.05.2007, 07:21
#92
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,757


Еще вопросики:
1. После использования функции (entmod) изменяемый объект пропадает с экрана (но выделяется) и появляется только после регенерации (_regen). Регенерацию после каждого изменения объекта в больших чертежах делать накладно. Можно ли регенерировать отдельный объект? Пробывал функцию redraw - непомогло.
2. Почему не загружается VLX приложение функцией load, если не указать полный путь к файлу (однако путь прописан в путях поддержки)? Может есть какие аналоги - пробежаться по путям доступа и найти мое приложение?
3. Как сравнить два списка? Одинаковые - T, нет - nil.
4. Как определить вес линий назначенный слою.
Krieger вне форума  
 
Непрочитано 10.05.2007, 09:00
#93
Кулик Алексей aka kpblc
Moderator

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


1. Попробуй (entupd) либо (vla-update).
2. Может, (findfile)?
3.
Код:
[Выделить все]
(setq lst '(1 2 3 4 5. 6.56) lst2 '(1 2 3. 4. 5. 6.56) lst3 '(2 3))
_$ (= lst lst2)
nil
_$ (eq lst lst2)
nil
_$ (equal lst lst2)
T
_$ (equal lst lst3)
nil
4. Не очень понял вопрос, но попробуй так:
Код:
[Выделить все]
(defun get-lw (ent / res)
              ;|
*    Определяет вес линии объекта. Возвращает либо строку, либо значение
* веса линии, умноженное на 100. В случае ошибки возвращает nil
*    Параметры вызова:
*	ent	указатель на запрашиваемый объект: vla, ename либо строка.
		строка воспринимается как имя слоя.
|;
  (if (vl-catch-all-error-p
        (vl-catch-all-apply
          '(lambda ()
             (cond
               ((= (type ent) 'vla-object)
                (setq ent (vlax-vla-object->ename ent))
                )
               ((= (type ent) 'str)
                (setq ent (tblobjname "layer" ent))
                )
               ) ;_ end of cond
             (setq res (cond
                         ((= (cdr (assoc 0 (entget ent))) "LAYER")
                          (setq res (cdr (assoc 370 (entget ent))))
                          (cond
                            ((= res -3)
                             "Default"
                             )
                            ((= res -2) "ByBlock")
                            ((= res -1) "ByLayer")
                            (t res)
                            ) ;_ end of cond
                          )
                         ((cdr (assoc 370 (entget ent))))
                         (t "ByLayer")
                         ) ;_ end of cond
                   ) ;_ end of setq
             ) ;_ end of lambda
          ) ;_ end of vl-catch-all-apply
        ) ;_ end of vl-catch-all-error-p
    (setq res nil)
    ) ;_ end of if
  res
  ) ;_ end of defun
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 10.05.2007, 09:06
#94
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


1) После Entmod используй Entupd.
2) Поищи по форуму - что-то было. (по идее должно находить)
3) (equal список1 список2 погрешность)
4) AktiveX - свойство Lineweight, для DXF - группа 370
___________
ps: опоздал...
Евгений А. вне форума  
 
Непрочитано 13.05.2007, 17:31 Помогите в решении задачи:
#95
ForestX


 
Регистрация: 13.05.2007
Москва
Сообщений: 1


Очень надеюсь на вашу помощь в решении задачи:

С помощью представления cond или case определить функцию, которая возвращает в качестве значения столицу заданного аргумента государств.
Реализовать на Lisp300.

Заранее благодарен.

-----------------------------------------------------------

В Xlisp удалось реализовать таким образом:

Код:
[Выделить все]
		(defun stolica (strana)
           (case strana (Russia 'Moscow)
                               (Italy 'Rom))) 


Вывод:

(stolica 'Russia)

Необходимо переделать под Lisp300.
ForestX вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Вопросы по Lisp

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

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