Тема: Ошибка: неверный тип аргумента: 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Готово ")
(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.
Помогите и разъясните , чтоб понять в чем ошибка и куда смотреть?
Спасибо.