Lisp - неверный тип аргумента: numberp: nil - PullRequest
0 голосов
/ 23 июня 2018

Я пишу функцию, которая удаляет фоновую маску из всего текста, однако я получаю ошибку bad argument type: numberp: nil после выполнения кода:

(defun c:bgm ()
    (vl-load-com)
    (setq ss1 (ssget "X" '((0 . "MTEXT")(-4 . "<OR")(90 . 1)(90 . 3)(-4 . "OR>")))); selects all mtext with background mask on
    (setq sscount (sslength ss1))
    (repeat sscount
        (setq mtxtobj (entget (vlax-vla-object->ename (ssname ss1 counter))))
        (vla-put-backgroundfill mtxtobj :vlax-false)
        (entmod mtxtobj)
    )
)

Есть идеи, почему?

Ответы [ 2 ]

0 голосов
/ 24 июня 2018

Существует ряд проблем с вашим кодом:

  1. Если выражение ssget не получает выбор (т. Е. Если на чертеже нет объектов, которые соответствуюткритерий выбора), тогда ssget вернет nil, и, следовательно, функция sslength выдаст ошибку, если передано с нулевым аргументом.

    Чтобы избежать этого, протестируйте значение, возвращаемое функцией ssgetиспользуя оператор if, прежде чем продолжить работу с оставшимся кодом:

    (if (setq ss1 (ssget "_X" '((0 . "MTEXT") (-4 . "<OR") (90 . 1) (90 . 3) (-4 . "OR>"))))
        (progn
            (setq sscount (sslength ss1))
            ...
        )
    )
    
  2. Вы ссылаетесь на переменную counter в вашей функции ssname, которая не определена в области действияc:bgm функция:

    (ssname ss1 counter)
    

    Вместо этого это должно быть sscount, как определено ранее в вашем коде.

  3. Вы, кажется, запутались между именами сущностей иvla-objects:

    • ssname возвращает имя объекта, однако вы передаете его функции vlax-vla-object->ename, которая преобразует vla-объект в имя объекта.

    • Вы используете vla-put-backgroundfill fВы можете изменить свойство backgroundfill vla-объекта, однако вы передаете этой функции переменную, определенную значением, возвращаемым entget, который представляет собой список данных DXF, а не vla-объект.

    • Вы используете entmod для изменения данных DXF, назначенных переменной mtxtobj - это не требуется при изменении свойств ActiveX vla-объекта.


Учитывая вышесказанное, я бы предложил следующее решение:

(defun c:bgm ( / cnt obj sel )
    (if (setq sel (ssget "_X" '((0 . "MTEXT") (-4 . "<OR") (90 . 1) (90 . 3) (-4 . "OR>"))))
        (repeat (setq cnt (sslength sel))
            (setq cnt (1- cnt)
                  obj (vlax-ename->vla-object (ssname sel cnt))
            )
            (vla-put-backgroundfill obj :vlax-false)
        )
    )
    (princ)
)
(vl-load-com) (princ)
0 голосов
/ 23 июня 2018

Ошибка, вероятно, из-за:

(ssname ss1 counter)

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

(defun c:bgm (/ ss1 sscount)
  (vl-load-com)
  (if (setq ss1 (ssget "X" '((0 . "MTEXT") (-4 . "<OR") (90 . 1) (90 . 3) (-4 . "OR>"))))
    (repeat (setq sscount (sslength ss1))
      (setq sscount (1- sscount)
        mtxtobj (vlax-vla-object->ename (ssname ss1 sscount))
      )
      (vla-put-backgroundfill mtxtobj :vlax-false)
    )
  )
)
...