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

I am writing a function that removes background mask from all mtext, however, I am getting a bad argument type: numberp: nil error after running the code:

(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)
    )
)

Any ideas why?

asked Jun 23, 2018 at 12:13

Kevin Chiha's user avatar

There are a number of issues with your code:

  1. If the ssget expression does not obtain a selection (i.e. if there are no objects present in the drawing which fulfil the selection criteria), then ssget will return nil, and consequently the sslength function will error when supplied with a null argument.

    To avoid this, test the value returned by the ssget function using an if statement before proceeding with the remaining code:

    (if (setq ss1 (ssget "_X" '((0 . "MTEXT") (-4 . "<OR") (90 . 1) (90 . 3) (-4 . "OR>"))))
        (progn
            (setq sscount (sslength ss1))
            ...
        )
    )
    
  2. You reference the variable counter in your ssname function, which is not defined in the scope of the c:bgm function:

    (ssname ss1 counter)
    

    This should instead be sscount as defined earlier in your code.

  3. You seem to be confused between entity names and vla-objects:

    • ssname returns an entity name, however, you are passing this to the vlax-vla-object->ename function, which converts a vla-object to an entity name.

    • You are using the vla-put-backgroundfill function to change the backgroundfill property of a vla-object, however, you are passing this function the variable defined by the value returned by entget, which is a DXF data list, not a vla-object.

    • You are using entmod to modify the DXF data assigned to the variable mtxtobj — this is not required when changing ActiveX properties of a vla-object.


Taking the above into consideration, I would suggest the following solution:

(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)

answered Jun 24, 2018 at 10:11

Lee Mac's user avatar

Lee MacLee Mac

15.5k6 gold badges32 silver badges80 bronze badges

1

The error is probably due to:

(ssname ss1 counter)

where counter is nil.
You should use sscount instead. You also have to decrement the sscount value to iterate through the selection set.

(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)
    )
  )
)

answered Jun 23, 2018 at 17:41

gileCAD's user avatar

gileCADgileCAD

2,2701 gold badge10 silver badges10 bronze badges

1

From the thread «stringp nil error» at the next link:

http://discussion.autodesk.com/thread.jspa?messageID=5404144

«Re: stringp nil error
The VLIDE can really help you here.

Open your code in the editor, and load it from within the editor. Then go to
the Debug menu, and make sure the Break On Error option is selected. Now
execute your code, either from AutoCAD’s command prompt, or the Visual LISP
Console window.

When the error occurs, the VLIDE should pop up. And you can use the button
that looks like a red dot with parens around it and an arrow pointing into
it (Last break). This will highlight the statement where the error occurs.
You will find on of your variables is set to nil, instead of some value (a
string) your code expects.

While in break mode you can use Inspect to see what variables or even
statements evaluate to. To take the debugging a step further, set a break
point (F9) somewhere above the problem statement and execute the function
again. When the code reaches the break point, the VLIDE will become active
and you can step thru each statement using F8. Inspect what is happening
with your code.

That ought to help you find the source of the issue.


R. Robert Bell»

HTH,

Constantin

a écrit dans le message de news:
5407425@discussion.autodesk.com…
using visual lisp editor can i find my error that is causing this message
from autocad: bad argument type: numberp: nil?

8 минут назад, newborn сказал:

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

Однозначно, блоком. Т.к., потом этот чертеж может редактироваться. Работать с кучей отрезков, имеющих фиксированное взаимное положение, — это ад.

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

12 минут назад, newborn сказал:

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

Фишка в том, что написание лиспа — это автоматизация, но это решение универсальное для АС и NC, поэтому к переходу отношения не имеет. 

А предлагаемая мной выше тема с СПДС как раз может покрыть именно  это требование.

Кстати, там красиво решена и задача  оформления  форматок чертежа.

добавлено через 2 минуты

3 минуты назад, lidia.antipina.ru сказал:

Прошло 20 с лишним лет, как навояла дисер на тему автоматизации ТП и станочных приспособ (думала, что тема уплывала окончательно, но надо перевернуть страницу и благополучно забыть), а воз и ныне там…

Ну, чисто с т.з. академического интереса или обучающего процесса — почему бы и нет?)))

Я пишу функцию, которая удаляет фоновую маску из всего mtext, однако после запуска кода я получаю ошибку 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 ответа

Лучший ответ

Есть несколько проблем с вашим кодом:

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

    Чтобы избежать этого, проверьте значение, возвращаемое функцией 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-объектами:

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

    • Вы используете функцию vla-put-backgroundfill для изменения свойства backgroundfill vla-объекта, однако вы передаете этой функции переменную, определенную значением, возвращаемым {{X4} }, который является списком данных 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)


2

Lee Mac
24 Июн 2018 в 10:11

Вероятно, ошибка связана с:

(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)
    )
  )
)


2

gileCAD
24 Июн 2018 в 11:49

am using lisp routine ARC-PARK in 2011 and getting this error. Have seen older posts with same error, but not code savvy. None specifically addressing this lisp.

any help would be greatly appreciated.

;Tip1815: ARC-PARK.LSP PARKING ON AN ARC ©2002, Ron Engberg

;; This routine allows the user to place parking stalls along an arc.

;;

;; Written by Ron Engberg 12-2000

;; Radians to degrees

(defun RTD ® (* (/ R pi) 180))

;; Degrees to Radians

(defun DTR ® (/ (* 2 pi) 360))

(defun

C:ARC-PARK (/ ENT ARC-PT1 STALL-W STALL-L ARC-SIDE ARC-DIR

STALL-COUNT ARC_LIST ARC-CPT ARC-DIAM S-ANG E-ANG

ARC-CIRC DELTA ARC-LENGTH STALL-ANGLE-IN STALL-ANGLE-OUT

ARC-BASE ARC-ROT-ANGLE

)

;; Screen echo off

(setvar «cmdecho» 0)

;; Set to World UCS

(command «ucs» «w»)

;; Parking stall information

(setq ENT (entsel «nSelect ARC: «))

(initget 1)

(setq ARC-PT1 (getpoint «nStarting End of ARC: «))

(initget 7)

(setq STALL-W (getreal «nStall Width: «))

(initget 7)

(setq STALL-L (getreal «nStall Length: «))

(setq ARC-SIDE (getstring «nInside or Outside : «))

(setq

ARC-DIR

(getstring «nClockwise or Counter Clockwise : «)

) ;_ end of setq

(initget 7)

(setq STALL-COUNT (getint «nNumber of Stalls: «))

;; Arc information

(setq ARC_LIST (entget (car ENT)))

(setq ARC-CPT (cdr (assoc 10 ARC_LIST))) ;center point

(setq ARC-DIAM (* (cdr (assoc 40 ARC_LIST)) 2)) ;arc diameter

(if (or (= ARC-SIDE «I») (= ARC-SIDE «i»))

(setq ARC-DIAM (- ARC-DIAM (* 2 STALL-L)))

) ;_ end of if

(setq

S-ANG

(cdr (assoc 50 ARC_LIST)) ;start angle

E-ANG

(cdr (assoc 51 ARC_LIST)) ;end angle

ARC-CIRC

(* pi ARC-DIAM) ;arc circumference

;arc length

) ; end arc info

;; Test for delta angle

(if (> S_ANG E_ANG)

(setq DELTA (+ (- 6.2831853 S-ANG) E-ANG))

(setq DELTA (abs (- S-ANG E-ANG)))

) ; end if

(setq ARC-LENGTH (* (cdr (assoc 40 ARC_LIST)) DELTA))

;; Angle for starter line

(setq

STALL-ANGLE-IN

(angle ARC-PT1 ARC-CPT) ;stalls inside arc

STALL-ANGLE-OUT

(angle ARC-CPT ARC-PT1) ;stalls outside arc

) ; end set group

;; Rotation info

(setq

ARC-BASE

(/ ARC-CIRC 360.0000) ;length per degree

ARC-ROT-ANGLE

(/ STALL-W ARC-BASE) ;degrees per stall

) ; end set group

;; Test for inside or outside

(if (or (= ARC-SIDE «I») (= ARC-SIDE «i»)) ;case sensitive ?

(command «line» ARC-PT1 (polar ARC-PT1 STALL-ANGLE-IN STALL-L) «»)

;if inside

(command «line» ARC-PT1 (polar ARC-PT1 STALL-ANGLE-OUT STALL-L) «»)

;else, outside

) ;end if

;; Test for clockwise or counter clockwise

(if (or (= ARC-DIR «CCW») (= ARC-DIR «ccw»)) ;case sensitive ?

(progn

(repeat STALL-COUNT

(command «array» «l» «» «P» ARC-CPT «2» ARC-ROT-ANGLE «Y»)

) ;_ end of repeat

) ; if ccw

(progn

(repeat STALL-COUNT

(command

«array»

«l»

«»

«P»

ARC-CPT

«2»

(- ARC-ROT-ANGLE (* 2 ARC-ROT-ANGLE))

«Y»

) ;_ end of command

) ;_ end of repeat

) ; else cw

) ; end if

;; Reset UCS

(command «ucs» «p»)

(princ)

;; Screen echo on

(setvar «cmdecho» 1)

) ;_ end of defun

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