Тема: Ошибка: неверный тип аргумента: 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 "Слой \"Оросители\", заморожен!\n\nДальнейшая работа, увы, невозможна...")
       (exit)
      )
      ((= (logand 4 (cdr (assoc 70 layget))) 4)
       (alert "Слой \"Оросители\" заблокирован!\n\nДальнейшая работа, увы, невозможна...")
       (exit)
      )
      ((minusp (cdr (assoc 62 layget)))
       (alert "Внимание!!!\n\nСлой \"Оросители\", на котором будет отрисован объект, невидим!")
      )
    ) ;_  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.
Помогите и разъясните , чтоб понять в чем ошибка и куда смотреть?
Спасибо.

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

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

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

Спасибо за совет  - "Там была определена переменная среды min-dist, а в новом нет - (getenv "min-dist") - nil
Задайте её и будет вам счастье..."
а Вы можете, чайнику подсказать что и где править?
Спасибо

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

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

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

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

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

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

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

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

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

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

убрал дубль