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

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

особенность initget для 2005-го акада

Ответ
Поиск в этой теме
Непрочитано 12.09.2005, 16:11 #1
особенность initget для 2005-го акада
Apelsinov
 
Проектировщик ВК. LISP-любитель.
 
Москва
Регистрация: 15.12.2003
Сообщений: 1,202

Господа, то ли я что-то забыл, то ли это странность 2005-го акада, но вроде бы в 2002 это работало:
Код:
[Выделить все]
(progn
 (initget "Exit")
 (entsel "\n Select line or [Exit]:")
)
в A2005 если в ответ на запрос ввести e, то вернет "Exit"- это так и есть, но если выбрать пункт Exit из выпад. меню по правой кнопке, то оно возвращает nil, а тоже вроде должно "Exit".
Вопрос - это такая особенность A2005? и , если это так,то как добавить возможность выбора для выпад. меню?
Просмотров: 2881
 
Непрочитано 12.09.2005, 19:17
#2
vk

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


Больше на глюк похоже... у меня Ваш код работает как из файла, так и из консоли
Цитата:
_$ (initget "Exit")
nil
_$ (entsel "\n Select line or [Exit]:")
"Exit"
_$
vk вне форума  
 
Непрочитано 13.09.2005, 06:50
#3
ShaggyDoc

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


Эти "странности" - все-так глюки. Подобное наблюдалось во всех версиях безо всякой закономерности. 100 раз работае правильно, потом сбой, потом опять правильно. Особо надоедали сбои при русских ключевых словах.

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

Однако для entsel ключевые слова не применяю. Функция может вернуть nil и из-за того, что пользователь просто промахнулся при указании, и из-за пустого ввода.

Ввод обрабатывается низкоуровневой функцией

Код:
[Выделить все]
(defun _ru-get-entsel-no-error (message / ent)
  ;; (_ru-get-entsel-no-error "Выбери объект, но не промахнись!")
  (setvar "errno" 0)
  (while
    (and
      (not (setq ent (entsel (strcat "\n" message))) ;)
      ) ;_ end of not
      (equal 7 (getvar "errno"))
      ;;Ошибка указания при выборе
      ;; блокированный слой?
    ) ;_ end of and
     (setvar "errno" 0)
  ) ;_ end of while
  (cond
    ((equal (getvar "errno") 52)
     ;; пустой ответ
     nil
    )
    (t
     (list (car ent) (trans (cadr ent) 1 0))
    )
  ) ;_ end of cond
)

(defun _ru-get-ent-default (message       default_str   quoted_get_func
                            /             result        question
                            lst_params    key_str
                           )
  (if default_str
    (setq
      question (strcat "\n" message " <" default_str ">: ")
    ) ;_ end of setq
    (setq
      question (strcat "\n" message ": ")
    ) ;_ end of setq
  ) ;_ end of if
  (setq lst_params (list question))
  (while
    (vl-catch-all-error-p
      (progn
        (setq result (vl-catch-all-apply quoted_get_func lst_params))
      ) ;_ end of progn
    ) ;_ end of vl-Catch-All-Error-P
  ) ;_ end of while
  result
)
А в программах выбор примитива с опцией выхода по умолчанию выполняется вот этой функцией

Код:
[Выделить все]
(defun ru-get-entsel (message)
  ;; (ru-get-entsel "Выбери объект, но не промахнись!")
  ;; Применять при отсутствии требований к блокирове и типам
  ;; примитивов
  ;; Возвращает примитив и точку указания
  (_ru-get-ent-default message "Выход" '_ru-get-entsel-no-error)
)
Работает безошибочно. И отдельно - выбор примитивов допустимых типов
Код:
[Выделить все]
(defun ru-get-entsel-by-type
                             (message     msg_err_types
                              list_types  no_locked   /
                              ent         ent_type    bad_type
                              locked      do
                             )
                             ;|
Выбор примитива с воможностью задать допустимые типы и выбор на не блокированном слое
с возможностью выхода и с блокировкой ESC
Параметры:
message - сообщение
msg_err_types - сообщение о неверном типе если задан список типов, иначе ""
list_types - список допустимх типов или NIL
no_locked  - выбор на не блокированном слое -T, на любом -NIL
 (ru-get-entsel-by-type "Выбери отрезок или полилинию" "Это не ОТРЕЗОК и не ПОЛИЛИНИЯ" (list "LINE" "LWPOLYLINE") T)
 (ru-get-entsel-by-type "Выбери объект на неблокированном слое" "" nil  T)
 (ru-get-entsel-by-type "Выбери отрезок или полилинию - можно на блокированном" "Это не ОТРЕЗОК и не ПОЛИЛИНИЯ" (list "LINE" "LWPOLYLINE") nil)
Возвращает имя примитива и точку указания или nil при отказе
 |;

  (setq do t)
  (while do
    (setq bad_type t
          locked t
    ) ;_ end of setq
    (if (setq ent (ru-get-entsel message))
      (progn
        (setq ent_type (cdr (assoc 0 (entget (car ent)))))
        (if (and list_types
                 (not (member ent_type list_types))
            ) ;_ end of and
          (princ (strcat "\nОШИБКА: Указан объект типа '"
                         ent_type
                         "'. "
                         msg_err_types
                 ) ;_ end of strcat
          ) ;_ end of princ
          (setq bad_type nil)
        ) ;_ end of if
        (if (and no_locked
;; проверку на блокированность слоя можете заменить
;; на свою 
                 (ru-layer-is-lock (cdr (assoc 8 (entget (car ent)))))
            ) ;_ end of and
          (princ "\nОШИБКА: Объект на заблокированном слое!")
          (setq locked nil)
        ) ;_ end of if
        (setq do (or bad_type locked))
      ) ;_ end of progn
      (setq do nil)
    ) ;_ end of if
  ) ;_ end of while
  ent
)
ShaggyDoc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > особенность initget для 2005-го акада