Ошибка неверный тип аргумента stringp nil в автокаде

#1 24 июля 2015г. 16:35:04

  • Blackjek
  • Участник
  • На форуме с 24 июля 2015г.
  • Сообщений: 2
  • Спасибо: 0

Тема: Ошибка: неверный тип аргумента: stringp nil

Добрый день коллеги.
Моим товарищем было написан лисп:
(defun c:11 (/  xyfill osm ocmd spt ept cla)

 
  ;;—————————————————————————
  ;; функция заливки прямоугольника, определенного точками 1pt и 2pt в текущей ПСК,
  ;; блоками с именем bname на максимальном расстоянии maxdist
  (defun xyfill (1pt 2pt maxdist bname / n_meas nx ny dx dy sx sy ix iy)

    (defun n_meas (1p 2p d / n) ;_ возвращает количество точек деления по координате
      (max (fix (if (not (zerop (- (abs (- 2p 1p)) (* (fix (setq n (/ (abs (- 2p 1p)) d))) d))))
                  (1+ n)
                  n
                ) ;_  if
           ) ;_  fix
           1 ;_ минимум одна точка деления
      ) ;_  max
  ) ;_  defun n_meas

        (setq dimlf1 (getvar «DIMLFAC»));; установка масштаба блока «Оросители»
    (setq mashbloka1 (/ 1.0 dimlf1))
    (setq nx (n_meas (car 1pt) (car 2pt) maxdist))
    (setq ny (n_meas (cadr 1pt) (cadr 2pt) maxdist))
    (setq dx (/ (- (car 2pt) (car 1pt)) nx)) ;_ шаг по X
    (setq dy (/ (- (cadr 2pt) (cadr 1pt)) ny)) ;_ шаг по Y
    (princ (list «рядов по X=» nx «, по Y=» ny «, шаг X=» dx «, шаг Y=» dy));;писанина
    (setq sx (+ (car 1pt) (* dx 0.5)))
    (setq sy (+ (cadr 1pt) (* dy 0.5)))
    (setq ix sx)
    (repeat nx
      (setq iy sy)
      (repeat ny
        (vl-cmdf «_.insert» bname (list ix iy) mashbloka1 mashbloka1 0)
        (setq iy (+ iy dy))
      ) ;_  repeat
      (setq ix (+ ix dx))
    ) ;_  repeat
  ) ;_  defun xyfill
  ;;—————————————————————————

  ;; собственно программа

;; Установка слоёв
(setq ocmd1 (getvar «cmdecho»))
  (setvar «cmdecho» 0)
   (if (setq layget (tblsearch «LAYER» «Оросители»)) ; проверка на наличие слоя
    (cond                               ; если есть, то проверка его состояния
      ((= (logand 1 (cdr (assoc 70 layget))) 1)
       (alert «Слой «Оросители», заморожен!nnДальнейшая работа, увы, невозможна…»)
       (exit)
      )
      ((= (logand 4 (cdr (assoc 70 layget))) 4)
       (alert «Слой «Оросители» заблокирован!nnДальнейшая работа, увы, невозможна…»)
       (exit)
      )
      ((minusp (cdr (assoc 62 layget)))
       (alert «Внимание!!!nnСлой «Оросители», на котором будет отрисован объект, невидим!»)
      )
    ) ;_  cond
    (vl-cmdf «_.layer» «_n» «Оросители» «_c» 20 «Оросители» «») ; создание слоя, если такого нет
  ) ;_  if
(setvar «cmdecho» ocmd1)
  ;;конец функции установки слоев

    (vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
  (setq cla (getvar «CLAYER»))
  (setq ocmd (getvar «cmdecho»))
  (setq osm (getvar «osmode»))
  (setq bname1 «Ороситель») ;; Имя блока
  (princ (strcat «nЗаливка прямоугольника блоками » bname1 «.»))
  (initget 1)
  (setq spt (getpoint «nОдин угол >»))
  (initget 1)
  (setq ept (getpoint «nДругой угол >»))
  (princ «nМинуточку…..n»)
  (setvar «CLAYER» «Оросители»)
  (setvar «cmdecho» 0)
  (setvar «osmode» 0)
  (xyfill spt ept (/ (atof(getenv «min-dist»)) (getvar «dimlfac»)) bname1)  ;_ указать минимальную дистанцию и имя блока заливки
  (setvar «cmdecho» ocmd)
  (setvar «CLAYER» cla)
  (setvar «osmode» osm)
  (vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
  (princ «nГотово smile«)
  (princ (strcat «nШаг между оросителями составляет : » (getenv «min-dist») «мм»))
  (princ)
) ;_  defun

(vl-load-com)

;;;**********************************************************************************************************
(defun min-dist-orosit (/ i)
;; (min-dist-orosit)
(or (getenv «min-dist») (setenv «min-dist» «4000»))
(initget «» 6)
(if (setq i
           (getdist
            (strcat «n Укажите минимальную дистанцию между блоками [» (getenv «min-dist») «]»)
           ) ;_  getint
     ) ;_  setq
  (setenv «min-dist» (rtos i 2 3))
) ;_  if
(atof (getenv «min-dist»))
) ;_  defun

Смысл данной программы заключается:
1. Создается слой
2. равномерное распределение блока «ороситель» по всей площади помещения с указанием шаг оросителя.

В старых версиях программы все работало  — а  для в автокаде 2012 не работает, выдает ошибку:
Ошибка: неверный тип аргумента: stringp nil.
Помогите и разъясните , чтоб понять в чем ошибка и куда смотреть?
Спасибо.

#2 Ответ от Alan 26 июля 2015г. 14:31:56

  • Alan
  • Активный участник
  • Откуда: Украина / Киев
  • На форуме с 2 апреля 2002г.
  • Сообщений: 1,345
  • Спасибо: 15

Re: Ошибка: неверный тип аргумента: stringp nil

Про (getenv «min-dist») я отвечал на соседнем форуме

#3 Ответ от Blackjek 27 июля 2015г. 08:46:23

  • Blackjek
  • Участник
  • На форуме с 24 июля 2015г.
  • Сообщений: 2
  • Спасибо: 0

Re: Ошибка: неверный тип аргумента: stringp nil

Спасибо за совет  — «Там была определена переменная среды min-dist, а в новом нет — (getenv «min-dist») — nil

Задайте её и будет вам счастье…»

а Вы можете, чайнику подсказать что и где править?

Спасибо

#4 Ответ от kpblc 27 июля 2015г. 09:05:14

  • kpblc
  • kpblc
  • Активный участник
  • Откуда: С.-Петербург
  • На форуме с 29 ноября 2004г.
  • Сообщений: 8,348
  • Спасибо: 23

Re: Ошибка: неверный тип аргумента: stringp nil

Сначала запусти функцию min-dist-orosit

#5 Ответ от Alan 27 июля 2015г. 12:06:56

  • Alan
  • Активный участник
  • Откуда: Украина / Киев
  • На форуме с 2 апреля 2002г.
  • Сообщений: 1,345
  • Спасибо: 15

Re: Ошибка: неверный тип аргумента: stringp nil

Дмитрий Беляков пишет:

а Вы можете, чайнику подсказать что и где править?

Ну или добавь вызов  функции min-dist-orosit в начало своего текста

(defun c:11 (/ xyfill osm ocmd spt ept cla) 
;;; вызов функции задания  дистанции между блоками
(min-dist-orosit) 
..............

тогда при вызове команды 11, функция min-dist-orosit будет отрабатывать автоматически.
Как мне кажется в этом тексте есть еще достаточно подводных камней типа ошибок.
Совет.
Если хочешь изучать работу ЛИСПа, открывай тексты в редакторе ВизуалЛиспа и запускай пошаговую отладку

#6 Ответ от Alan 6 августа 2015г. 14:47:20 (изменено: Alan aka Александр Назаров, 6 августа 2015г. 14:47:51)

  • Alan
  • Активный участник
  • Откуда: Украина / Киев
  • На форуме с 2 апреля 2002г.
  • Сообщений: 1,345
  • Спасибо: 15

Re: Ошибка: неверный тип аргумента: stringp nil

убрал дубль

Hello i have been trying to run this lisp and after selecting all of my objects it shows the error: bad argument type: stringp nil

Im trying to pick two blocks and a line and write the blocks name into attributes of another block and write the line’s length into another attribute, here is the code (i dont know much about lisp, i just took the code from the forum and try to modified it):

(vl-load-com)

(defun c:lenB (/ atts i obj el1 el2 pl blk)

(while (and

(setq el1 (car (entsel «nSelect first element: «)))
(or (= «INSERT» (cdr (assoc 0 (entget el1))))
(prompt «nWrong select, need block.»))

(setq el2 (car (entsel «nSelect second element: «)))
(or (= «INSERT» (cdr (assoc 0 (entget el2))))
(prompt «nWrong select, need block.»))

(setq pl (car (entsel «nSelect line to measure <exit>: «)))
(or (wcmatch (cdr (assoc 0 (entget pl))) «ARC,CIRCLE,ELLIPSE,HATCH,*POLYLINE,REGION,SPLINE»)
(prompt «nWrong selection, need ARC,CIRCLE,ELLIPSE,HATCH,*POLYLINE,REGION,SPLINE.»))

(setq blk (car (entsel «nSelect block to rewrite: «)))
(or (= «INSERT» (cdr (assoc 0 (entget blk))))
(prompt «nWrong select, need block.»))
(setq obj (vlax-ename->vla-object blk))
(setq atts (vlax-invoke obj «GetAttributes»))

)
(foreach att atts

(cond ((= (vla-get-tagstring att) «E2»)
(vla-put-textstring att (strcat
«%<\AcObjProp Object(%<\_ObjId «
(LM:objectid (vlax-ename->vla-object el2))
«>%).EffectiveName f «%tc1″>%» ))
(vl-cmdf «_.updatefield» (vlax-vla-object->ename att) «»))

((= (vla-get-tagstring att) «E1»)
(vla-put-textstring att (strcat
«%<\AcObjProp Object(%<\_ObjId «
(LM:objectid (vlax-ename->vla-object el1))
«>%).EffectiveName f «%tc1″>%» ))
(vl-cmdf «_.updatefield» (vlax-vla-object->ename att) «»))

((= (vla-get-tagstring att) «LEN»)
(vla-put-textstring att (strcat
«%<\AcObjProp Object(%<\_ObjId «
(LM:objectid (vlax-ename->vla-object pl))
«>%).Length \f «» «%lu2%pr1%ct8[1.000000000000000E-00]» «»>%» ))
(vl-cmdf «_.updatefield» (vlax-vla-object->ename att) «»)))))
(princ)
)

(defun LM:objectid ( obj )
(eval
(list ‘defun ‘LM:objectid ‘( obj )
(if (wcmatch (getenv «PROCESSOR_ARCHITECTURE») «*64*»)
(if (vlax-method-applicable-p (vla-get-utility (LM:acdoc)) ‘getobjectidstring)
(list ‘vla-getobjectidstring (vla-get-utility (LM:acdoc)) ‘obj ‘:vlax-false)
‘(LM:ename->objectid (vlax-vla-object->ename obj))
)
‘(itoa (vla-get-objectid obj))
)
)
)
(LM:objectid obj)
)

;; Entity Name to ObjectID — Lee Mac
;; Returns the 32-bit or 64-bit ObjectID for a supplied entity name

(defun LM:ename->objectid ( ent )
(LM:hex->decstr
(setq ent (vl-string-right-trim «>» (vl-prin1-to-string ent))
ent (substr ent (+ (vl-string-position 58 ent) 3))
)
)
)

;; Hex to Decimal String — Lee Mac
;; Returns the decimal representation of a supplied hexadecimal string

(defun LM:hex->decstr ( hex / foo bar )
(defun foo ( lst rtn )
(if lst
(foo (cdr lst) (bar (- (car lst) (if (< 57 (car lst)) 55 48)) rtn))
(apply ‘strcat (mapcar ‘itoa (reverse rtn)))
)
)
(defun bar ( int lst )
(if lst
(if (or (< 0 (setq int (+ (* 16 (car lst)) int))) (cdr lst))
(cons (rem int 10) (bar (/ int 10) (cdr lst)))
)
(bar int ‘(0))
)
)
(foo (vl-string->list (strcase hex)) nil)
)

;; Active Document — Lee Mac
;; Returns the VLA Active Document Object

(defun LM:acdoc nil
(eval (list ‘defun ‘LM:acdoc ‘nil (vla-get-activedocument (vlax-get-acad-object))))
(LM:acdoc)
)


Добро пожаловать!

Войдите или зарегистрируйтесь сейчас!

Войти

Страница 5 из 18


  1. Alexandr-GR

    Форумчанин

    а если их создать? по-моему где то встречал программку для этих целей…
    посмотрел у Map3d тоже присутствует формат mrSid(*.sid) для вставки изображений

    #81


  2. Robkiy

    Форумчанин

    Регистрация:
    15 июн 2012
    Сообщения:
    613
    Симпатии:
    84
    Адрес:

    Краснодар

    в глобал мапер открыл — и о чудо все файлы как то открываються именно на своих местах (как для меня великая загадка)
    Остался вопрос как всё это чудо в автокад затянуть (если это возможно в обще) , если же нет то как перебить формат всему этому набору растров ?

    #82


  3. Alexandr-GR

    Форумчанин

    Файл —> Экспорт растра —> выбор необходимого формата

    #83


  4. anton253

    Форумчанин

    Регистрация:
    15 фев 2011
    Сообщения:
    501
    Симпатии:
    302

    Файл-экспорт растра- выбираете нужный формат для экспорта и ставите галочку «создать файл привязки». Полученный файл привязки указываете через лисп Disney’я.
    Часто бывает полезно разбить растр на части. Для этого там же в настройках экспорта есть настройка сетки (указываете количество столбцов и строк).

    #84


  5. Robkiy

    Форумчанин

    Регистрация:
    15 июн 2012
    Сообщения:
    613
    Симпатии:
    84
    Адрес:

    Краснодар

    огромное спасибо — буду пробывать

    #85


  6. Илюха

    Форумчанин

    Регистрация:
    23 ноя 2010
    Сообщения:
    49
    Симпатии:
    1

    При подгрузке растра выдает ошибку (ошибка: неверный тип аргумента: stringp nil)
    Текст таб файла:
    !Table
    !Version 300
    !Charset Neutral

    Definition Table
    File «62-2-239-120-А.tif»
    Type «RASTER»
    (2240000.000000, 480000.000000) (0, 0) Label «Pt 1»,
    (2241000.000000, 480000.000000) (4000, 0) Label «Pt 2»,
    (2241000.000000, 479000.000000) (4000, 4000) Label «Pt 3»,
    (2240000.000000, 479000.000000) (0, 4000) Label «Pt 4»
    CoordSys NonEarth Units «m» Bounds (2240000.000000, 479000.000000) (2241000.000000, 480000.000000)
    Units «m»

    Вложения:

    #86


  7. anton253

    Форумчанин

    Регистрация:
    15 фев 2011
    Сообщения:
    501
    Симпатии:
    302

    У меня несколько предположений:
    1. Текущий слой на замке. Решается отключением блокировки.
    2. Расширение самого растра не тиф, а бмп. Решается заменой расширения в файле привязки.
    3. Имя растра отличается, например вместо 62-2-239-120-А имя 62-2-239-120-а. Решается групповым переименованием в Тотал Командере.
    Если файл не большой, то выкладывайте сам растр.

    #87


  8. BearDyugin

    Форумчанин

    Регистрация:
    30 ноя 2007
    Сообщения:
    2.704
    Симпатии:
    2.444
    Адрес:

    Сибирь

    Илюха, надо всю связку, выложи и сам растр.

    #88


  9. Илюха

    Форумчанин

    Регистрация:
    23 ноя 2010
    Сообщения:
    49
    Симпатии:
    1

    Выкладываю файлы

    Вложения:

    • RASTR.rar
      Размер файла:
      9,4 МБ
      Просмотров:
      42

    #89


  10. kipjd

    Регистрация:
    6 фев 2013
    Сообщения:
    4
    Симпатии:
    0

    При попытке вставить растры получил такое:
    Команда: (Geo_load_image T) ; ошибка: Ошибка Automation. Недопустимый ключ
    Версия 2.1. Акад 2012
    При этом, если запускать команду и выбирать/загружать растр по одному, все вставляется, а если кучей, то нет :(

    #90


  11. BearDyugin

    Форумчанин

    Регистрация:
    30 ноя 2007
    Сообщения:
    2.704
    Симпатии:
    2.444
    Адрес:

    Сибирь

    В файле лишние пробелы(в каждой строчкой перед Label, должен быть «один», а их там «два»), удали один, или скопируй ранее выложенное тобой содержимое файла tab на форуме(движок форума удаляет более одного пробела подряд), то всё заработает. ::wink24.gif::

    #91


  12. kipjd

    Регистрация:
    6 фев 2013
    Сообщения:
    4
    Симпатии:
    0

    Проблема оказалась в том, что в названии файлов присутствовали «запятые» — удалил их и пакетная вставка заработала… хотя странно — по одиночке вставлялось, а кучей нет..

    #92


  13. Dashiva

    Форумчанин

    Регистрация:
    27 фев 2012
    Сообщения:
    29
    Симпатии:
    1
    Адрес:

    Москва

    Сейчас опять столкнулся с той же проблемой при создании привязки растра в TAB:
    пишет:
    ; ошибка: неверный тип аргумента: streamp nil
    Долго вспомнилал, что когда-то решил эту проблему и вспомнил)
    Вы были правы, Disney, там проблем в прописанной директории к растру. Подрядчик прислал файл Dwg с растрами в одной папке. А директория прописанная осталась старая с его компа, типа Z:/растры/топо/растр1.tiff
    В итоге проблема решается обновлением директории, чтобы она совпадала с фактическим расположением файла на моём компьютере. Тогда всё работает.

    #93


  14. Xoce

    Регистрация:
    15 мар 2013
    Сообщения:
    2
    Симпатии:
    0


  15. Qvinto

    Форумчанин

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

    #95


  16. TOPOGRAFF

    Форумчанин

    Регистрация:
    16 июн 2008
    Сообщения:
    35
    Симпатии:
    0
    Адрес:

    Москва

    Disney, подскажите пожалуйста, — корректно ли работает Ваша программа с AutoCad 2008 SP1 (англ. версия)? Вроде бы программа устанавливается, но команды в командной строке не срабатывают. Может быть проблема в каких-либо настройках?

    #96


  17. Игорь Арчибисов

    Форумчанин

    Регистрация:
    20 июн 2013
    Сообщения:
    46
    Симпатии:
    5

    Доброго времени суток !Сложилась такая ситуация — при вставке растрового изображения выбираю папку где оно расположено, а Автокад выдает фатальную ошибку.С чем это может быть связано и как это исправить ? Спасибо

    12121.JPG

    54453.JPG

    #97


  18. aliveng

    Регистрация:
    19 окт 2013
    Сообщения:
    1
    Симпатии:
    0

    Подскажите, пожалуйста в чем у меня проблема с подгрузкой. Использую команду (Geo_load_image «One») после выбора растра с привязкой tab (см. вложение) ACad виснит (не отвечает). И так более двух часов… и т.д…. может я мало жду? :) Версию программы использую 2.1.

    Вложения:

    • 493.rar
      Размер файла:
      1,2 МБ
      Просмотров:
      9

    #98


  19. Serhio163

    Форумчанин

    Регистрация:
    26 окт 2013
    Сообщения:
    16
    Симпатии:
    38
    Адрес:

    Самара

    Всем доброго времени суток. Имеется привязанный растр (*.tif+*.tab). Можно как-нить использовать tab, чтобы растр лег туда, куда он и привязан? Если делать через вставка-вхождение растрового изображения , то нужно либо указывать координаты точки вставки либо посредством указания на экране, либо непосредственно ввод с клавиатуры. Получается, что файл привязки tab не используется…
    Решение: программа в 18 посте

    Здравствуйте. Отлично работает штука! :) я так понял, что она преобразовывает в СК95, если геопривязка в WGS… а возможно реализовать преобразование в МСК по известным параметрам перехода?

    #99


  20. X-Y-H

    Команда форума
    Форумчанин

    Регистрация:
    18 май 2007
    Сообщения:
    21.480
    Симпатии:
    6.873
    Адрес:

    Россия

    Приложение в автозагрузке, какой командой вызвать не понимаю. Make находит. Автокад 2013

    #100

Страница 5 из 18

Поделиться этой страницей

Когда Вы начнёте писать свои программы, то неизбежно столкнетесь с необходимостью решения проблем, которые в программировании носят название отладка программы.

Давайте рассмотрим некоторые технические приемы, которые помогут нам при создании новых программ на языке AutoLISP. К таким приемам относятся:

  • Проверка фрагментов кода в окне «КонсольVisual LISP».
  • Отслеживание парных кавычек.
  • Поиск парных скобок в процессе и после написания кода.
  • Использование окна «Контрольное значение»

Проверка фрагментов кода в окне «КонсольVisual LISP».

Вы можете проверить, насколько правильно вы понимаете синтаксис функции.

Давайте для примера рассмотрим функцию getpoint. Функция  getpoint  помогает нам задать координаты точки при помощи мыши. Давайте поищем эту функцию в справочной системе. Система выдаст следующую информацию. См. Рис. 1.

Отладка программы

Рис. 1. «Окно справка»

 Мы видим, что функция getpoint  имеет два аргумента.

Первый, из которых pt – это координаты точки.

А второй msg — текст, который будет показан пользователю.

При чем оба аргумента не являются обязательными. Это следует из того, что они заключены в квадратные скобки ( [pt] [msg] )

Давайте откроем окно «КонсольVisual LISP» щелкнув по одноименной кнопке. См. Рис. 2.

Отладка программы

Рис. 2.     Добавляем  (getpoint)

Введем функцию (getpoint) без аргументов и нажмем <Enter>.

Активным станем AutoCAD, где надо указать любую точку.

После указания точки, AutoCAD снова вернет нас в редактор Visual LISP.

В консоли появятся координаты указанной точки. См. Рис. 3.

Отладка программы

Рис. 3. Координаты указанной точки.

Теперь давайте попробуем использовать аргументы. Введем функцию с первым аргументом (getpoint pt) и нажмем <Enter>. См. Рис. 4.

Отладка программы

Рис. 4.  Ошибка:  не верный тип аргумента

Консоль выдаст нам сообщение об ошибке: неверный тип аргумента: point: nil.

Очевидно, переменная pt не содержит в себе значения. (значение nil означает, что аргумент не имеет значения). Давайте это проверим. Наберем в следующей строке pt и нажмем <Enter>. См. Рис. 5.

Отладка программы

Рис. 5.    Проверка значения переменной pt.

Консоль подтвердит наши предположения.

Давайте подставим, вместо pt координаты точки начало координат (getpoint (0 0 0)) и нажмем <Enter>. См. Рис. 6.

Отладка программы

Рис. 6.     Ошибка: неверная функция.

Консоль выдает сообщения об ошибке: неверная функция : 0. Скорее всего, координаты в скобках Visual LISP принял за функцию с именем 0 (вспоминаем, что после открывающийся скобки всегда следует имя функции). Как объяснить Visual LISP, что это не функция, а список координат? Для этого есть, два способа:

1)      После открывающийся скобки добавить функцию list(list 0 0 0)

2)      Или перед открывающийся скобкой поставить апостроф: (0 0 0)

Давайте снова напишем функцию, но уже с апострофом (getpoint (0 0 0)) и нажимаем <Enter>. См. Рис. 7.

Отладка программы

Рис. 7.    Добавляем (getpoint (0 0 0)).

Функция сделает активным AutoCAD и мы увидим, что указатель мыши как будто привязан ниточкой к началу координат. См. Рис. 8.

Отладка программы

Рис. 8.   Точка задается относительно другой точки.

И теперь мы можем задать точку, относительно другой точки, координаты которой являются первым аргументом функции getpoint. Щелкните в любом месте, и консоль вернет координаты выбранной точки. См. Рис. 9.

Отладка программы

Рис. 9. Координаты указанной точки.

Давайте теперь разберемся со вторым аргументом. Напомню, что это msg — текст, который будет показан пользователю. Поскольку это текст (string), то писать его нужно в кавычках. Давайте добавим к нашей функции надпись: “Проверка”. См. Рис. 10.

Отладка программы

Рис.. 10.    Добавляем (getpoint(0 0 0) «Проверка»)

Нажимаем <Enter>. И видим, что наша надпись появилась в командной строке. См. Рис. 11.

Отладка программы

Рис. 11. Надпись в командной строке.

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

Давайте посмотрим пример применения этой функции в программе my_otr, которую я приводил в уроке: Построение отрезков в AutoCAD.

Открываем эту программу, выделяем вторую и третью строки и нажимаем на кнопку «Загрузить выделенный фрагмент». См. Рис. 12.

Отладка программы

Рис. 12. Загрузка выделенного фрагмента.

Далее на просьбу в командной строке, выбираем первую точку (координаты этой точки при помощи функции присвоения setq запоминают в переменной р1). Появится следующая просьба. Вторую точку мы уже выбираем, ориентируясь на первую.

После указания второй точки в окне консоли появятся координаты выбранных точек. См. Рис. 13.

Отладка программы

Рис. 13.     Координаты выбранных точек.

Таким образом, мы проверили, как у нас работает выделенный фрагмент программы.

Я думаю, что после такова исследования, мы уже имеем четкое представление о том, как работает эта функция.

Отслеживание парных кавычек.

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

В 2000 году с появлением Visual LISP этот процесс стал значительно более простым.

Давайте начнем с простого и рассмотрим двойные кавычки. В Visual LISP применяется кодирование цветом, поэтому любая строка, заключенная в кавычки, на экране пурпурная. Кодирование цветом применяется в процессе ввода, поэтому после того, как вы поставили открывающиеся кавычки, остальная часть файла становится пурпурной до тех пор, пока вы не введете закрывающиеся кавычки. См. Рис. 14.

Отладка программы

Рис. 14.    Не закрытые кавычки.

Ставим в нужном месте закрывающиеся кавычки, и пурпурным сделается только текст, заключенный в кавычки с двух сторон. См. Рис. 15.

Отладка программы

Рис. 15.   Кавычки с двух сторон.

Стоит отметить, что в программах AutoLISP нужно всегда использовать кавычки вида “ ” (кавычки « » — не воспринимаются)

Поиск парных скобок в процессе и после написания кода.

С парными скобками все немного сложнее. Но в редакторе Visual LISP есть инструменты, которые помогают нам избежать лишних или недостающих скобок.

Прыгающий курсор.

Как только, в процессе написания кода новой программы, вы ставите закрывающую скобку, ваш курсор перескакивает к соответствующей ей открывающей. Если курсор не перескакивает, значит, вы поставили слишком много закрывающихся скобок (нет открывающийся скобки, к которой курсор мог бы переместиться). Если программа короткая, следить за перемещением курсора не сложно. В длинных программах следить за курсором сложнее, потому что в некоторых случаях открывающая скобка может находиться в не видимой области текущего окна.

Двойной щелчок возле скобок.

В редакторе Visual LISP проблема отслеживания перемещений курсора решена при помощи подсветки (выделения). Поместите курсор непосредственно перед  открывающейся скобкой или после закрывающейся и щелкните дважды левой кнопкой мыши. Все содержимое скобок станет подсвеченным. Теперь вы видите, где находится парная скобка. См. Рис. 16.

Отладка программы

Рис. 16.   Выделение содержимого скобок.

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

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

Типы переменных.

В программах AutoLISP используются два типа переменных:

1) Системные переменные, которые описаны в AutoCAD (Пример: osmode).

2) Программные переменные, которые описаны и именованы вами.

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

Когда вы добавляете  в свою программу новую переменную, то по умолчанию она глобальная. Для того, чтобы она стала локальной ее нужно добавить в список временных переменных функции defun. См. Рис. 17.

Отладка программы

Рис. 17.    Список временных переменных.

Окно «Контрольное значение»

Для проверки значения переменных удобнее всего использовать окно «Контрольное значение». Для того, чтобы добавить переменную в это окно, поместите курсор на имени переменной р1 и нажмите на кнопку «Добавить контрольное значение». См. Рис. 18.

Отладка программы

Рис. 18. Добавление переменных в окно «Контрольное значение».

Появится окно «Добавление контрольных значений», в котором нажимаем кнопку «ОК».

Наша переменная появится в окне «Контрольное значение». См. Рис. 19.

Отладка программы

Рис. 19. Окно «Контрольное значение».

Чтобы окно «Добавление контрольных значений» не появлялось, а переменные сразу попадали в окно «Контрольное значение», переменную нужно выделить.

Давайте добавим в это окно и другие переменные.

Когда окно «Контрольное значение» открыто, можно добавлять переменные через кнопку «Добавить контрольное значение» расположенную в этом окне. См. Рис. 20.

Отладка программы

Рис. 20.   Кнопка  «Добавить контрольное значение».

Теперь для того, чтобы увидеть значения переменных, после того как программа прекратила работать, нам необходимо все переменные сделать глобальными. Для этого их нужно убрать из списка временных переменных функции defun.

Затем загрузить нашу программу, нажав на кнопку «Загрузить активное окно редактора». См. Рис. 21.

Отладка программы

Рис. 21.   Загрузка программы.

Далее переходим в AutoCAD, нажав на кнопку «Активизация AutoCAD».

Набираем в командной строке mp_kub. См. Рис. 22.

Отладка программы

Рис. 22.  Вводим в командной строке mp_kub

Нажимаем <Enter> и на просьбу, указать базовую точку, указываем любую точку в рабочем окне AutoCAD.

Наша программа, которая должна была нарисовать куб. Этого не сделала.

Давайте вернемся в редактор Visual LISP и посмотрим в окно «Контрольное значение». См. Рис. 23.

Отладка программы

Рис. 23. Окно «Контрольное значение»

Мы видим, что переменные р1 и р2 имеют значения, а все остальные переменные нет. Очевидно, что ошибка произошла при расчете переменной р3. Находим эту строчку в программе и видим, что координаты точки р3 рассчитываются относительно самой себя. А должны были рассчитываться относительно точки р2.

Давайте, исправим ошибку, и снова загрузим нашу программу.

Перейдем в AutoCAD, набираем в командной строке mp_kub и нажмем <Enter>.

Указываем базовую точку, и наша программа нарисует куб. См. Рис. 24.

Отладка программы

Рис. 24. Программа нарисовала куб.

Ура заработала!!!

Давайте снова  вернемся в редактор Visual LISP и посмотрим в окно «Контрольное значение». См. Рис. 25.

Отладка программы

Рис. 25.   Все переменные имеют значение.

Мы видим, что все наши переменные имеют значения.

После того, как программа отлажена:

  1. Нужно вернуть все локальные переменные в список временных переменных функции defun.
  2. Сохранить свою LISP-программу.
  3. Закрыть редактор Visual LISP и AutoCAD, чтобы очистить все значения переменных. Этот шаг очень важен. Возможно, что некоторые переменные всё еще сохраняют присвоенные им значения.

Теперь давайте снова запустим  AutoCAD и редактор Visual LISP. Откроем окно «Контрольное значение». Если переменные исчезли, то добавьте их снова. См. Рис. 26.

Отладка программы

Рис. 26.   Все переменные не имеют значений.

Мы видим, что все переменные не имеют значений.

Теперь давайте рассмотрим, как отслеживать значения переменных во время выполнения программы.

Для этого нам необходимо в программе поставить точки останова – места, в которых во время выполнения программа будет останавливаться.

Для этого помещаем курсор в то место программы, где мы хотели бы установить точку останова и нажимаем на кнопку «Точка останова вкл/выкл». См. Рис. 27.

Отладка программы

Рис. 27.   Точка останова.

Точка останова выделится красным.

Давайте добавим еще пару точек останова, загрузим программу и перейдем в AutoCAD. См. Рис. 28.

Отладка программы

Рис. 28.    Добавляем точки останова и загружаем программу.

Набираем в командной строке mp_kub. Нажимаем <Enter> и на просьбу, указать базовую точку, указываем любую точку в рабочем окне AutoCAD.

AutoCAD вернет нас в редактор Visual LISP, и мы увидим, что наша программа остановилась в первой точки останова. См. Рис. 29.

Отладка программы

Рис. 29.   Первая точка останова.

Обратим внимания на окно «Контрольное значение». В данной точки останова переменная р1 уже имеет текущее значение. Для продолжения программы нажимаем на кнопку «Продолжить». См. Рис. 30.

Отладка программы

Рис. 30.   Следующая точка останова.

Наша программа остановиться в следующей точке останова. В этой точке уже пять переменных будут иметь свои текущие значения.

Снова нажимаем на кнопку «Продолжить». См. Рис. 31.

Отладка программы

Рис. 31.   Последняя точка останова.

Программа остановиться в последней точке останова. В этой точке уже все переменные имеют свои текущие значения.

Для того чтобы завершить выполнение программы, снова нажимаем на кнопку «Продолжить».

В конце программы мы снова окажемся в  AutoCAD, где будет нарисован куб. См. Рис. 32.

Отладка программы

Рис. 32.    Программа нарисовала куб.

Теперь давайте вернемся в редактор Visual LISP и посмотрим в окно «Контрольное значение». См. Рис. 33.

Отладка программы

Рис. 33.     Все переменные не имеют значений.

По окончании программы все переменные снова не имеют значений.

Таким образом, используя точки останова и окно «Контрольное значение», можно отслеживать значения переменных в любой точке во время выполнения программы.

Чтобы удалить все точки останова по окончании работы с ними, нажмите клавиши <Shift>+<Ctrl>+<F9>.

И так в этом уроке мы рассмотрели основные приемы отладки программы AutoLISP.

К этим приемам относятся:

  • Проверка фрагментов кода в окне «Консоль Visual LISP».
  • Отслеживание парных кавычек.
  • Поиск парных скобок в процессе и после написания кода.
  • Использование окна «Контрольное значение»

Искренне надеюсь, что отладка программ AutoLISP стала для Вас теперь легкой, занимательной головоломкой.

Пишите в комментариях:

Была ли для Вас полезной информация, данная в этом уроке?

Какие способы отладки используете Вы?

На какие вопросы программирования, Вы хотели бы, увидит ответы в следующих уроках?

Я с удовольствием отвечу на ваши комментарии.

Если вы хотите получать новости с моего сайта. Оформляйте подписку.

До новых встреч.

 «Автор: Михаил Орлов»

Google

Также на эту тему Вы можете почитать:

СООБЩЕНИЯ ОБ ОШИБКАХ

Ниже приведен список сообщений об ошибках, которые вы время от
времени увидите, когда вы пишете или выводите функции AutoLISPа. Если
функция «ERROR» определена не пользователем («ERROR» связана с nil),
ошибка является стандартной акцией , тогда эти сообщения выводятся
на экран дисплея в виде:

       error: message
       ошибка:сообщение

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

Функции, отклоняемые AutoCADом

Аргументы проходящих в AutoCAD функций недействительны ( таких,
как функции GETVAR «NOSUCH» или SETVAR с только читаемыми
системными переменными), или функция, переходящая сама в себя,
недействительна в текущем контексте.

       bad argument type

Функция снабжена некорректным типом аргумента.( Например, вы не
можете взять STRLEN как целое.)

       bad association list

Список , объявленный функцией ASSOC, не состоит из «(нужная кла-
виша ) списков.

       bad entmod list

Аргумент, проходящий в функцию ENTMOD,имеет неподходящий вход
списка данных (так же , как возвращаемый функцией ENTGET).

       bad formal argument list

Когда вычислена эта функция, AutoLISP удалит список недействите-
льных формальных аргументов. Возможно, что функция вовсе не является
функцией , а в некоторой степени , список данных.

       bad function

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

       bad list

Неподходяще организован список, которым снабжена функция. Это мо-
жет случиться , если действительное число начинает десятичная точка;
в таком случае вы должны использовать введение 0.

       Bad node ( плохой участок памяти node)

Недействителен пункт , встречаемый функцией TYPE.

       bad node type in list

Недействителен пункт , встречаемый функцией FOREACH.

       bad point argument

Недостаточно определена точка ( список двух действительных чисел)
проходящая в функцию , ожидающую точку. Будьте внимательны, не начинайте
действительное число с десятичной точки; в таком случае, вы должны ис-
пользовать введение 0.

        bad point value

То же самое ,что выше.

        bool arg1 15

Первый аргумент функции BOOLE (Булева функция) должно быть це-
лое мажду 0 и 15.

       can't evaluate expression

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

       console break

Пользователь ввел CTRL C , в то время , когда функция обрабаты-
валась.

       divide by zero

Деление на нуль не разрешается.

       extra right paren

Встретились одни или более лишние правые скобки.

       file not open

Описатель файла для операции ввода-вывода (I/O) не такой , как
у доступного файла.

       Function cancelled ( снимаемая функция)

Пользователь нажал CTRL C в ответ на подсказку.

       function undefined for argument

Аргумента, обозначенного в функциях LOG или SQRT,нет в диапазоне.

       function undefined for real

Аргумент функции вместо целого числа обозначен действительным.
Например, (LSH val 1.2)

       improper argument

Аргумент в GCD отрицательное число или ноль.

       incorrect number of arguments to a function

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

        insufficient node space

Недостаточен участок памяти node , для того чтобы вместить потреб-
ные действия. См. главу 6.

       insufficient string space

Недостаточен участок памяти heap , чтобы вместить строку текста.
См. главу 6.

       invalid argument

Неправильный тип аргумента или аргумент вне диапазона.

       invalid character

Выражение содержит неверный знак.

       invalid dotted pair

Точечные пары-это списки, содержащие два элемента, разде-
ленные конструкцией «space-period-space». Вы можете получить это сооб-
щение об ошибке , если вы начинаете действительное число с десятичной
точки; в таком случае вы должны использовать введение 0.

       LISPSTACK overflow (переполнение стека )

Стек AutoLISPа переполнен. Это происходит из-за чрезмерного
повторения функции или очень больших списков аргументов функции. Попы-
тайтесь увеличить среду LISPSTACK для переменных.

       misplaced dot

Это может иметь место , если действительное число начинает деся-
тичная точка; в таком случае вы должны использовать введение 0 .

       null function

Была сделана попытка вычислить функцию , которая имеет нулевой
определитель.

       quit exit abort

Это результат вызова функций QUIT или EXIT. Эти функции сейчас
не используются в AutoLISPе.

       too few argyments

Слишком мало аргументов объявлено во встроенной функции

       too many arguments

Слишком много аргументов объявлено во встроенной функции.

       unexpected signal nnn

[ Назад ]
[ Оглавление ]

Понравилась статья? Поделить с друзьями:
  • Ошибка неверный сертификат vipnet csp
  • Ошибка неверный регистрационный номер swat 4
  • Ошибка неверный размер тома veracrypt
  • Ошибка неверный пароль к папке
  • Ошибка неверный пароль для wifi