Существует ряд проблем с вашим кодом:
Если выражение 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))
...
)
)
Вы ссылаетесь на переменную counter
в вашей функции ssname
, которая не определена в области действияc:bgm
функция:
(ssname ss1 counter)
Вместо этого это должно быть sscount
, как определено ранее в вашем коде.
Вы, кажется, запутались между именами сущностей и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)