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

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

wcmatch - ошибка

Ответ
Поиск в этой теме
Непрочитано 02.03.2005, 16:54 #1
wcmatch - ошибка
Torino
 
Штаб
Регистрация: 21.08.2003
Сообщений: 943

Код:
[Выделить все]
(defun startCommand (calling-reactor
		     startcommandInfo
		     /
		     thecommandstart
		    )
  (setq OldLayer (getvar "CLAYER"))
  (setq thecommandstart (nth 0 startcommandInfo))

  (cond
    ((wcmatch thecommandstart "DIM*")
     (setvar "clayer" "размеры")
    )
    ((wcmatch thecommandstart "*HATCH*")
     (setvar "clayer" "штриховка")
    )
  )
;;;  (if (wcmatch thecommandstart "DIM*")
;;;    (setvar "clayer" "размеры")
;;;  )


  (princ)
)
На строчке
Код:
[Выделить все]
((wcmatch thecommandstart "DIM*")
     (setvar "clayer" "размеры")
вываливается ошибка
Код:
[Выделить все]
; error: bad argument type: stringp nil
Однако в вышеприведенном коде (закоментированный фрагмент) все работало без ошибок.
Просмотров: 4483
 
Непрочитано 02.03.2005, 17:39
#2
kos

LISP-программист
 
Регистрация: 25.08.2003
Тутэйшы
Сообщений: 238


В сообщении об ошибке прописано, что текстовая строка - nil. Единственное место, где может появляться сей трабл - извлечение имени команды из списка параметров по nth. Посмотри (в отладчике) какой передается список параметров startCommandInfo и как из него извлекается имя команды.

Вдогонку: только что проверил у себя - все работает.
__________________
Там все есть для счастья - меня там только нет.
Так это значит, что я там - буду!
kos вне форума  
 
Автор темы   Непрочитано 02.03.2005, 17:46
#3
Torino


 
Регистрация: 21.08.2003
Штаб
Сообщений: 943
<phrase 1=


THECOMMANDSTART = "DIMLINEAR"

У меня было подозрение, что для функции wcmatch в качестве первого параметра можно передавать только string (в виде "ABCDEF").

Но тогда почему работал вариант
(if (wcmatch thecommandstart "DIM*")
(setvar "clayer" "размеры")
)

Не понимаю...
Torino вне форума  
 
Непрочитано 03.03.2005, 10:16
#4
Эдуард

строительство
 
Регистрация: 16.01.2004
Петербург
Сообщений: 165
<phrase 1=


Ты делаешь переменную
thecommandstart в функции startCommand локальной
и надеешься что она будет видима в функции endCommand ?

Разберись с областью видимости.
(а wcmatch здесь ни при чем)
Эдуард вне форума  
 
Автор темы   Непрочитано 03.03.2005, 11:37
#5
Torino


 
Регистрация: 21.08.2003
Штаб
Сообщений: 943
<phrase 1=


Идея как раз в "локальности" переменной thecommandstart.
Но не в этом дело.
Дело в том, что ошибка возникает в функции startCommand, хотя в watcher'e значение переменной thecommandstart (при запуске команды DIMALIGN) - DIMALIGN, но функция wcmatch, считает ее nil.
Torino вне форума  
 
Непрочитано 03.03.2005, 11:56
#6
Alaspher


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


Попробуй добавить в cond отладочную строку, примерно так:
Код:
[Выделить все]
...
  (cond
    ((/= (type thecommandstart) 'str) (print thecommandstart))
    ((wcmatch thecommandstart "DIM*")
     (setvar "clayer" "размеры")
    )
    ((wcmatch thecommandstart "*HATCH*")
     (setvar "clayer" "штриховка")
    )
  )
...
посмотри, что будет происходить. В принципе, можно эту строку и после отладки оставить (на непредвиденный случай), только print убрать.
Alaspher вне форума  
 
Непрочитано 03.03.2005, 12:59
#7
Эдуард

строительство
 
Регистрация: 16.01.2004
Петербург
Сообщений: 165
<phrase 1=


Цитата:
Идея как раз в "локальности" переменной thecommandstart.
Тогда не понял идеи. С глобальными работает как надо.

Цитата:
Дело в том, что ошибка возникает в функции startCommand
Тестировал - ошибка возникает в endcommand.
Поставь в редакторе "break on error" и убедись сам.
Эдуард вне форума  
 
Автор темы   Непрочитано 03.03.2005, 13:50
#8
Torino


 
Регистрация: 21.08.2003
Штаб
Сообщений: 943
<phrase 1=


Все разобрался!
"break on error" помог.

В функциях endCommand и cancelCommand должны быть строки вида (wcmatch thecommandend "DIM*") и (wcmatch thecommandcancel "DIM*") соответственно.
А я скопировал из первой функции в последующие, забыв изменить названия переменных.

Спасибо!
Torino вне форума  
 
Непрочитано 03.03.2005, 14:40
#9
Alaspher


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


Цитата:
Сообщение от Torino
... А я скопировал из первой функции в последующие, забыв изменить названия переменных.
По тому коду, который выложен в другой ветке, не видно ни потребности в раздельных функциях для штатного и нештатного завершения команды, ни в локальных переменных в них(ней). Разве что это только части более сложных функций...

В качестве рекомендации - не надо делать столь длинные и столь похожие имена аргументов и переменных - длинные переменные имеют смысл только если они глобальные, но и тогда - желательно, что-бы они различались больше, чем парой литер. А для глобальных имён (функции, глобальные переменные, словари...) стоит ввести свой префикс, например: Tor-startCommand...
Alaspher вне форума  
 
Автор темы   Непрочитано 03.03.2005, 15:39
#10
Torino


 
Регистрация: 21.08.2003
Штаб
Сообщений: 943
<phrase 1=


>>Alaspher
В последнем варианте я объединил эти две функции.
А за рекомендацию - спасибо
Torino вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > wcmatch - ошибка