Адаптация кода LISP - проблемы и решения

Обсуждаем программирование для BricsCad на LISP

Адаптация кода LISP - проблемы и решения

Сообщение Canon » Чт ноя 01, 2007 12:59 pm

Как показывет опыт и заявления разработчика, приложения LISP, разработанные для AutoCAD, работают либо сразу, либо С НЕЗНАЧИТЕЛЬНЫМИ ПЕРЕДЕЛКАМИ. Как правило, эти переделки сводятся к приведению LISP-кода к состоянию, рекомендуемому Автодеском, т.е. удаленю всякого рода недокументированных фишек.

НО!
Опять таки, как показала практика, некоторые из этих вопросов можно решить и противоположным путем - "положительным" влиянием на разработчиков. Посему предлагаю в этой теме обсуждать возникающие проблемы - есть шанс решить их централизованно.

Первый шаг уже сделан - в ближайшей версии добавлена обработка ^C в конструкции (command)
Canon
Site Admin
 
Сообщений: 419
Зарегистрирован: Вт май 17, 2005 9:30 am

Сообщение kpblc » Пн июн 09, 2008 6:45 pm

Обнаружено несколько "багов", связанных с vla-функциями. Например, не работает метод (vla-addhatch); не всегда корректно обрабатывается (vl-remove-if) и (vl-remove-if-not). Насчет ключевого слова "function" ничего сказать не могу - не пробовал в последнее время.
---
Добавлено: выполнение (grread) иногда "подвешивало" BricsCAD (количество отрисовываемых объектов превышало сотню). Это помимо http://sabit.com.ua/phorum/viewtopic.php?t=703
Обращение ко мне - на "ты".
Ник читать как крыс, то есть крыса, только мужского рода :)
Аватар пользователя
kpblc
эксперт
 
Сообщений: 117
Зарегистрирован: Пт ноя 03, 2006 1:08 pm
Откуда: С.-Петербург

Сообщение psw » Пт дек 19, 2008 1:34 pm

С ключевым cловом "function" возникли проблемы в версии 9. Это слово работало в 8.2.11, но перестало работать в версии 9

Пример:
Код: выделить все
(defun STD-STRJOIN (lst _delim)
  (if (stringp lst)
    lst
    (substr (apply (function strcat)       ; force strings
      (mapcar (function (lambda (s) (strcat _delim s))) lst))
      (1+ (strlen _delim)))
) )


Вызов
Код: выделить все
(std-strjoin '("1" "2" "3") ",")


дает "1,2,3" в версии 8, но ошибку в версии 9
; ----- LISP Error : Call Stack -----
; [0]...STD-STRJOIN <<--
;
; error : no function definition <FUNCTION> at [EVAL]
psw

 
Сообщений: 14
Зарегистрирован: Чт янв 01, 1970 3:00 am

Сообщение Dimic » Пт май 15, 2009 10:10 am

не работают vla-get-TextString и vla-get-Layer
Dimic

 
Сообщений: 14
Зарегистрирован: Чт янв 01, 1970 3:00 am

Сообщение Eugeny » Вс май 17, 2009 7:10 pm

2 Dimic

не работают vla-get-TextString и vla-get-Layer


А в каком именно случае не работает? Какое сообщение в ком. строке выдает? Не помешало бы тестовый пример кода привести, демонстрирующий ошибку.
Во всяком случае в тестовых вариантах:

Код: выделить все
(setq vla_obj (vlax-ename->vla-object (entlast)))
(vla-get-Layer vla_obj)


и

Код: выделить все
(setq vla_obj (vlax-ename->vla-object (entlast)))
(vla-get-TextString vla_obj)


все работает без проблем. В первом случае возвращает слой последнего созданного объекта, во втором - строку текста (если последний объект - текст).
Eugeny
Moderator
 
Сообщений: 413
Зарегистрирован: Сб май 14, 2005 10:51 pm

Сообщение Dimic » Пн май 18, 2009 8:43 am

Да, приведенный код отработал без проблем, сейчас буду разбираться.
Dimic

 
Сообщений: 14
Зарегистрирован: Чт янв 01, 1970 3:00 am

Сообщение kpblc » Ср май 20, 2009 2:53 pm

Код: выделить все
(defun get-property (obj property)
                    ;|
*    Функция получения значения свойства объекта
*    Параметры вызова:
   obj   указатель на объект
        property получаемое свойство
*    Возвращает nil, если свойство недоступно
|;
  (if (setq
        obj (cond ((= (type obj) 'ename) (vlax-ename->vla-object obj))
                  ((= (type obj) 'vla-object))
                  ) ;_ end of cond
        ) ;_ end of setq
    (if (vlax-property-available-p obj property)
      (vlax-get-property obj property)
      ) ;_ end of if
    ) ;_ end of if
  ) ;_ end of defun

Примеры вызова:
Код: выделить все
(get-property (car (entsel)) 'color)
(get-property (car (entsel)) "color")

В AutoCAD'e сработало...
Обращение ко мне - на "ты".
Ник читать как крыс, то есть крыса, только мужского рода :)
Аватар пользователя
kpblc
эксперт
 
Сообщений: 117
Зарегистрирован: Пт ноя 03, 2006 1:08 pm
Откуда: С.-Петербург

Re: Адаптация кода LISP - проблемы и решения

Сообщение ur_naz » Сб июн 19, 2010 12:49 pm

Обнаружено странное поведение методов vla-GetXXX :?

Код: выделить все
(defun c:test4 ( / Utl Try Opt )
  (vl-load-com)
  (setq Utl (vla-get-Utility (vla-get-ActiveDocument (vlax-get-acad-object))))
  (vla-InitializeUserInput Utl (+ 2 128) "Новое Последнее Случайное")
  (setq Try (vl-catch-all-apply 'vla-GetInteger (list Utl "\nУкажите число [Новое/Последнее/Случайное] <Выход>: ")))
  (if (vl-catch-all-error-p Try)
    (cond ((setq Opt (member (vla-getInput Utl) '("Новое" "Последнее" "Случайное"))) (car Opt)))
    Try
  )
)

В примере выше:
При нажатии [esc] или [enter] функция должна возвращать nil однако запрос повторяется, а меню команд пропадает :( при выборе любой из опций
Несмотря на это при вводе числа все работает нормально :!:
Проверено на 10.4.7
Аватар пользователя
ur_naz

 
Сообщений: 37
Зарегистрирован: Сб май 22, 2010 11:23 am


Вернуться в Программирование на LISP

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron