Ошибка неверный тип аргумента 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 с лишним лет, как навояла дисер на тему автоматизации ТП и станочных приспособ (думала, что тема уплывала окончательно, но надо перевернуть страницу и благополучно забыть), а воз и ныне там…

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

Перейти к содержимому раздела

Форумы CADUser

Информационный портал для профессионалов в области САПР

Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.

Дерево сообщений Активные темы Темы без ответов

Страницы 1

Чтобы отправить ответ, вы должны войти или зарегистрироваться

#1 27 апреля 2008г. 14:35:20

  • Aspirine
  • Восстановленный участник
  • На форуме с 20 марта 2008г.
  • Сообщений: 13
  • Спасибо: 0

Тема: Нужна помощь с AutoLISP

Здравствуйте!
Задали написать программу на автолиспе чтобы запрашивала у пользователя размеры того что будет строить. Я не знаю каким образом это осоуществить. вроде с функциями типа commnad и setq разобрался, а как спросить пользователя у размерах, и каким образом недопкстить задание им слишком больших или слишком малых размеров?
Зарание спасибо.

#2 Ответ от Н.Н.Полещук 27 апреля 2008г. 14:43:37

  • Н.Н.Полещук
  • Восстановленный участник
  • На форуме с 19 марта 2004г.
  • Сообщений: 358
  • Спасибо: 0

Re: Нужна помощь с AutoLISP

> Aspirine
См. функции getreal, getint, initget, getpoint

#3 Ответ от Aspirine 27 апреля 2008г. 14:56:09

  • Aspirine
  • Восстановленный участник
  • На форуме с 20 марта 2008г.
  • Сообщений: 13
  • Спасибо: 0

Re: Нужна помощь с AutoLISP

Спасибо. А не подскажите какую-нибудь литературу в которой описаны эти функции?

#4 Ответ от Aspirine 28 апреля 2008г. 11:24:58

  • Aspirine
  • Восстановленный участник
  • На форуме с 20 марта 2008г.
  • Сообщений: 13
  • Спасибо: 0

Re: Нужна помощь с AutoLISP

В общем немного разобрался. Вот только проблема небольшая. Вот код:

(command "_cylinder" "0,0,0" "3" "6")
(setq c1 (ssget "l"))
(command "_cylinder" "0,0,0" "1.25" "8")
(setq c2 (ssget "l"))
(command "_cone" "0,0,8" "1.25" "радиус" "0.5" "0.2")
(setq k1 (ssget "l"))
(command "_zoom" "гр" "")
(command "_.union" c2 k1 "")
;(setq c1 (entlast))

При попытке загрузки в автокад, выдаёт:
«; ошибка: неверная строка режима ssget»
Синтаксис проверил, вроде всё норма.
В чем проблема?
P.S. Цункцию ssget пытаюсь использовать для дальнейшего использования команд _union и _substract. Если возможно подругому подскажите плиз. Спасибо.

#5 Ответ от Александр Ривилис 28 апреля 2008г. 13:30:12

  • Александр Ривилис
  • Александр Ривилис
  • Активный участник
  • Откуда: Украина / Киев
  • На форуме с 15 апреля 2005г.
  • Сообщений: 8,661
  • Спасибо: 158

Re: Нужна помощь с AutoLISP

#6 Ответ от Aspirine 28 апреля 2008г. 14:14:40

  • Aspirine
  • Восстановленный участник
  • На форуме с 20 марта 2008г.
  • Сообщений: 13
  • Спасибо: 0

Re: Нужна помощь с AutoLISP

Спасибо. Действительно помогло…
Можно ещё вопрос. Мне нужно организовать чтобы пользователь имел возможность сам вводить размеры детали из определённой зоны значений.
Написал пока вот что:

(setq hd 10)
  (setq parametr1 (getreal (strcat "nВведите высоту детали <" (rtos hd) ">: ")))
  (setq hd (if parametr1 parametr1 hd))
(setq rc1 3)
  (setq parametr2 (getreal (strcat "nВведите радиус большого цилиндра <" (rtos rb) ">: ")))
  (setq rc1 (if parametr2 parametr2 rc1))
(setq rb1 6)
  (setq parametr3 (getreal (strcat "nВведите высоту большого цилиндра <" (rtos rs) ">: ")))
     (while (> parametr3 hd)
     (setq parametr3 (getreal (strcat "nВведите высоту большого цилиндра <" (rtos rs) ">: ")))
     )
  (setq rb1 (if parametr3 parametr3 rb1))

При загрузке а AutoCAD, он даёт ввести первое значение, а потом вылетает обратно в редактор автолиспа и в консоли Автолиспа следующая ошибка:
«ошибка: неверный тип аргумента: numberp: nil»
Никак не могу понять в чём проблема.

#7 Ответ от Victor 28 апреля 2008г. 14:38:09

  • Victor
  • Восстановленный участник
  • На форуме с 26 марта 2007г.
  • Сообщений: 270
  • Спасибо: 0

Re: Нужна помощь с AutoLISP

Что такое rb?

#8 Ответ от Atol 28 апреля 2008г. 14:39:00

  • Atol
  • Активный участник
  • На форуме с 21 февраля 2006г.
  • Сообщений: 1,365
  • Спасибо: 3

Re: Нужна помощь с AutoLISP

В редакторе Автолиспа есть возможность проставлять метки остановки (наставь до и после функций) и просмотра текущего значения переменных (а то и целых выражений) для контроля и поиска ошибок

#9 Ответ от Aspirine 28 апреля 2008г. 15:08:25

  • Aspirine
  • Восстановленный участник
  • На форуме с 20 марта 2008г.
  • Сообщений: 13
  • Спасибо: 0

Re: Нужна помощь с AutoLISP

rb- это переменная которая должна по идеи соответствовать высоте большого цилиндра.

#10 Ответ от Aspirine 28 апреля 2008г. 15:19:39

  • Aspirine
  • Восстановленный участник
  • На форуме с 20 марта 2008г.
  • Сообщений: 13
  • Спасибо: 0

Re: Нужна помощь с AutoLISP

Увидел… Да, это не внимательность и моя лень, копировал и набивал разное.
Исправил.
Но это не решило проблему…

#11 Ответ от Aspirine 28 апреля 2008г. 16:35:26

  • Aspirine
  • Восстановленный участник
  • На форуме с 20 марта 2008г.
  • Сообщений: 13
  • Спасибо: 0

Re: Нужна помощь с AutoLISP

Разобрался, спасибо. Дело было в неправильно ориентированных переменных.
Но возник ещё вопрос:
Мне нужно в координатах начальной точки тела указать две координаты и одну переменную, котороя может измениться исходя из желанию конеченого пользователя.
Например:

(command "_cylinder" "0,0,S3" rc1 rb1 "")

где rc1,rb1, S3 — переменые. Автокад при загрузке в него говорит что так координаты точек
«0,0,S3» задавать нельзя. Как пуступить в этой ситуации?

#12 Ответ от Александр Ривилис 28 апреля 2008г. 16:49:24

  • Александр Ривилис
  • Александр Ривилис
  • Активный участник
  • Откуда: Украина / Киев
  • На форуме с 15 апреля 2005г.
  • Сообщений: 8,661
  • Спасибо: 158

Re: Нужна помощь с AutoLISP

(command "_cylinder" (list 0 0 S3) rc1 rb1 "")

#13 Ответ от Aspirine 28 апреля 2008г. 18:18:56

  • Aspirine
  • Восстановленный участник
  • На форуме с 20 марта 2008г.
  • Сообщений: 13
  • Спасибо: 0

Re: Нужна помощь с AutoLISP

помогло, спасибо. А команда List- она создаёт список, да?

#14 Ответ от Александр Ривилис 28 апреля 2008г. 18:41:36

  • Александр Ривилис
  • Александр Ривилис
  • Активный участник
  • Откуда: Украина / Киев
  • На форуме с 15 апреля 2005г.
  • Сообщений: 8,661
  • Спасибо: 158

Re: Нужна помощь с AutoLISP

> Александр Ривилис
Функция (а не команда) (list …) создает список. Учи мат.часть (т.е. язык программирования AutoLisp/VisualLisp).

Сообщения 14

Тему читают: 1 гость

Страницы 1

Чтобы отправить ответ, вы должны войти или зарегистрироваться

3 / 3 / 1

Регистрация: 21.10.2015

Сообщений: 92

1

08.11.2015, 21:43. Показов 10255. Ответов 21


Студворк — интернет-сервис помощи студентам

Здравствуйте! Необходимо реализовать вывод и ввод в файлы. Программа чертит заданную по условию фигуру и проверяет попадает ли точка в заштрихованную область. Пользователь может выбрать вводить ли ему точку самому (с клавиатуры), либо ввести точку из файла (где я и застряла). Точка введённая пользователем с клавиатуры должна быть записана в файл (тут тоже не лучше). В общем не получается у меня с файлами работать(



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

08.11.2015, 21:43

Ответы с готовыми решениями:

Работа с файлом
Добрый вечер.
Нужна помощь с задачкой.
Переписать содержимое исходного файла в другой текстовый…

Программа в AUTOLISP
Здравствуйте,не могли бы вы мне помочь вот с таким заданием для AutoLisp

Пятнадцать трапеций,…

Программа в AutoLISP
Известна длинна окружности. Найти площадь круга, ограниченного этой окружностью.

Запуск AutoLISP
Как запустить AutoLISP в AutoCad&quot;e. Я выбираю Сервис=Приложения=… и в открывшемся окне на диске…

21

597 / 917 / 149

Регистрация: 10.08.2015

Сообщений: 4,806

08.11.2015, 21:53

2

В чем проблема-то?



0



3 / 3 / 1

Регистрация: 21.10.2015

Сообщений: 92

08.11.2015, 21:58

 [ТС]

3

Не видит файл. (чтение)



0



597 / 917 / 149

Регистрация: 10.08.2015

Сообщений: 4,806

08.11.2015, 22:04

4

Цитата
Сообщение от Virviglaz
Посмотреть сообщение

Не видит файл

Так покажи, автокад курсы экстрасенсов не проходил, он работает только в каталогах, описанных в путях поддержки, либо при указании абсолютного пути



0



3 / 3 / 1

Регистрация: 21.10.2015

Сообщений: 92

08.11.2015, 22:13

 [ТС]

5

Посмотрите для начала мой код. Вы тоже сейчас занимаетесь экстрасенсорикой. Там два варианта вывода из файла. Я бы хотела получить какою-нибудь помощь или пояснение по данному вопросу.



0



vlisp

597 / 917 / 149

Регистрация: 10.08.2015

Сообщений: 4,806

08.11.2015, 23:17

6

я не вижу ничего криминального в увиденном в части чтения из файла, по идее должно работать. Ну разве что можно попробовать такой вариант, что он выдаст:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
(defun FileToList (strfrom / f fk aa a )
  (setq f (findfile strfrom))
  (if (null f)
    (alert "Файл не найден")
    (progn
      (setq fk (open strfrom "r")
            aa (list)
            a  (read-line fk)
      )
      (while a
        (setq aa (append aa (list a)))
        (setq a (read-line fk))
      )
      (close fk)
    )
  )
  aa
)



1



3 / 3 / 1

Регистрация: 21.10.2015

Сообщений: 92

09.11.2015, 00:32

 [ТС]

7

ошибка: неверный тип аргумента



0



597 / 917 / 149

Регистрация: 10.08.2015

Сообщений: 4,806

09.11.2015, 01:08

8

Цитата
Сообщение от Virviglaz
Посмотреть сообщение

ошибка: неверный тип аргумента

Это не вся строка, сложно было скопировать полностью? Как вызываете функцию FileToList?



0



3 / 3 / 1

Регистрация: 21.10.2015

Сообщений: 92

09.11.2015, 01:27

 [ТС]

9

Я вызываю весь написанный мною код с самого начала. Вызов делаю через командную строку AutoCAD.
; ошибка: неверный тип аргумента: numberp: nil
и если вызвать вашу функцию отдельно таким же образом:
; ошибка: слишком мало аргументов



0



597 / 917 / 149

Регистрация: 10.08.2015

Сообщений: 4,806

09.11.2015, 01:56

10

Цитата
Сообщение от Virviglaz
Посмотреть сообщение

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

эта ошибка означает что в оператор подставляется неинициализированная переменная

Цитата
Сообщение от Virviglaz
Посмотреть сообщение

; ошибка: слишком мало аргументов

тут вообще все понятно… забыли подставить один или несколько аргументов… нужно быть внимательнее и пользоваться инструментами форматирования кода



0



3 / 3 / 1

Регистрация: 21.10.2015

Сообщений: 92

09.11.2015, 02:14

 [ТС]

11

Цитата
Сообщение от vlisp
Посмотреть сообщение

эта ошибка означает что в оператор подставляется неинициализированная переменная

осталось только понять в каком именно месте. т.к ваша функция верна. в предыдущих вариантах чтения из файла такой ошибки не наблюдалось.



0



597 / 917 / 149

Регистрация: 10.08.2015

Сообщений: 4,806

09.11.2015, 02:20

12

Если файл пустой, то функция вернет nil, иначе список строк, который все равно еще нужно преобразовывать в список чисел и уже из него брать число для подстановки… используйте средства отладки vlide для отлова ошибок



0



3 / 3 / 1

Регистрация: 21.10.2015

Сообщений: 92

09.11.2015, 02:40

 [ТС]

13

А вот такой вопрос, пожалуй его следовало задать сразу: мне не сильно понятен сам код . Если в первом случае фигурирует полный путь к файлу и его наименование, что является для меня привычным, то здесь я ничего такого не вижу.



0



597 / 917 / 149

Регистрация: 10.08.2015

Сообщений: 4,806

09.11.2015, 08:36

14

Цитата
Сообщение от Virviglaz
Посмотреть сообщение

Если в первом случае фигурирует полный путь к файлу и его наименование, что является для меня привычным, то здесь я ничего такого не вижу.

настройка путей поддержки избавляет от необходимости использовать абсолютные пути



0



Lambdik

1048 / 942 / 107

Регистрация: 04.11.2012

Сообщений: 972

Записей в блоге: 3

09.11.2015, 23:11

15

Virviglaz Ну как, получается? Слишком много букв лишних в этой теме.

Важно понимать, что для записи в файл используется два разных механизма, не зависящих друг от друга.
Один механизм, это работа с файлом. А второй, работа с потоком данных.
Ведь можно открыть файл и тут же закрыть его, ничего с ним не делая, не так ли?

Запись в файл сделаем пошагово.

Lisp
1
2
3
4
5
;;; Для начала немного прелюдии.
;; узнать местонахождения файла открытого рисунка
(setq address (getvar "dwgprefix"))
;; создать путь к целевому файлу
(setq file-path (getfiled "Выбрать/Создать файл для записи" address "txt" 1))
Lisp
1
2
3
4
5
6
7
;;; А теперь работаем с файлом.
;; открыть файл на дозапись
(setq descriptor (open file-path "a"))
;; записать координату [используем поток данных]
(prin1 '(5.2 8.1 0.0) descriptor)
;; закрыть файл
(close descriptor)
Lisp
1
2
3
4
5
6
;; можем повторить, только теперь учтём перенос строки
(setq descriptor (open file-path "a"))
;; следующая координата
(print '(4.6 2.9 0.0) descriptor)
;; закрыли
(close descriptor)

Считывание из файла.

Lisp
1
2
3
4
5
6
7
8
;; открыть файл на чтение
(setq descriptor (open file-path "r"))
;; считать строку
(read-line descriptor)
;; считать следующую строку, если её там нет - вернёт nil
(read-line descriptor)
;; закрыть файл
(close descriptor)

Здесь полезная информация.



2



3 / 3 / 1

Регистрация: 21.10.2015

Сообщений: 92

10.11.2015, 04:13

 [ТС]

16

Цитата
Сообщение от Lambdik
Посмотреть сообщение

Ну как, получается?

Пока нет. Большое спасибо за ссылку. Итак,из файла мы считываем строку, которая содержит координаты точки. В дальнейшем, чтобы их использовать мы должны как-то преобразовать строку в список. Из идей только эта: разбить саму строку на подстроки, которые и объединить в список. (Надо/не надо; Верно/ не верно???)
P.S. Ранее хотелось сделать так, чтобы считывалось по одной точке из файла за каждый вызов функции. Ну а то что программа вообще увидела файл будем считать успехом.



0



Lambdik

1048 / 942 / 107

Регистрация: 04.11.2012

Сообщений: 972

Записей в блоге: 3

10.11.2015, 10:34

17

Цитата
Сообщение от Virviglaz
Посмотреть сообщение

мы должны как-то преобразовать строку в список. Из идей только эта: разбить саму строку на подстроки, которые и объединить в список.

Функция read читает из строки до первого пробела.

Lisp
1
2
3
(setq coordinate "(5.2 8.1 0.0)")
;; скобки там уже есть, потому просто читаем
(read coordinate)

Функции для работы со строками.



2



Virviglaz

3 / 3 / 1

Регистрация: 21.10.2015

Сообщений: 92

16.11.2015, 06:00

 [ТС]

18

Lambdik, вы не совсем поняли мой последний вопрос, но для начала я покажу что у меня вообще получилось

Lisp
1
2
3
4
5
6
7
8
(setq p1 (getpoint "Введите координaты любой точки через запятую:"))
    )
;;запись в файл координат, введённых пользователем с клавиатуры
 (progn
(setq FILE (open "d:\user.txt" "a"))
(prin1 p1   FILE)
(close FILE)
 )

Если с записью всё хорошо, то с выводом будет хуже:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
(setq answer (getstring "n Ввести точку вручную или из файла? <В/Ф>"));ветвление на различные способы ввода
  (if (or (= answer "Ф")(= answer "ф"))
   (progn 
(setq FILE (open "d:\points.txt"  "r"))
(setq p2 (read-line FILE))
(setq p1 (list))
 
(while (/= p2 nil)
(setq p1 (append p1 (list p2))) ;;попытка что-то сделать с полученной строкой
(setq p2 (read-line FILE))
  )
(close FILE)

Программа видит и читает файл. Загвоздка в условии. Это задача на определение вхождения точки в заштрихованную область. В моём случае областью является круг с центром в начале координат (радиус = 2). В круге есть вертикально расположенный прямоугольник (высота = 2, ширина = 1). Я писала проверку для точки введённой с клавиатуры. Выглядит она так:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
(setq x (car p1)) ;; разбиваем нашу точку на отдельные координаты, чтобы подставить в уравнение
  (setq y (cadr p1))
  (setq Rad 4)
  (setq r (+ (expt x 2) (expt y 2)))
    (
     if (and (<= r  Rad) (or (<= x 0) (>= x 1))) ;;уравнение окружности с центром в нач. коорд. + учёт прямоугольн.
      (progn
    (command "_.Color" "61")
    
      (SetVar "PDMODE" 34)
      (SetVar "PDSIZE" 0)
      (command "_.Point" p1 )
    
      (command "_.Text" p1  "0.1" "0" "Попал")
      )
      (progn
       (command "_.Color" "61");; всякая красота для оповещения пользователя
       (SetVar "PDMODE" 34)
       (SetVar "PDSIZE" 0)
      (command "_.Point" p1 )
       (command "_.Text" p1  "0.1" "0" "Не попал")))

Для точки введённой с клавиатуры проверка работает. Как быть с точкой которую мы считали (строку по сути дела)? Ведь для проверки необходимо как-то преобразовать строку в список. Вот на этом я и застряла. Может надо в принципе переписать как-то код?



0



Lambdik

1048 / 942 / 107

Регистрация: 04.11.2012

Сообщений: 972

Записей в блоге: 3

16.11.2015, 22:50

19

Virviglaz Очень рад что стараетесь учить, это я одобряю. Могу помочь с типами данных.
Преобразуем строку в список:

Lisp
1
2
3
4
(setq string "123.0 45.0 0.0")
(read (strcat "(" string ")"))
 
=> (123.0 45.0 0.0)

То есть если в файле записаны координаты без скобок, а просто числа. То считываем из файла, сцепляем со скобками и применяем read. Всё просто.
А на счёт попадания в область, так это уже геометрия.

Добавлено через 8 часов 36 минут
И ещё, функция command принимает аргументы как списочного, так и строкового типа. Чтобы не делать лишних преобразований.

Lisp
1
2
3
(command "_.line" "0,0,0" "5,7,0" "")
 
(command "_.line" '(0.0 0.0 0.0) '(5.0 -7.0 0.0) "")



1



Virviglaz

3 / 3 / 1

Регистрация: 21.10.2015

Сообщений: 92

18.11.2015, 00:52

 [ТС]

20

Я сдаюсь

Lisp
1
2
3
(setq FILE (open "d:\points.txt"  "r"))
(setq p2 (read-line FILE))
(setq p1(read(strcat "(" p2 ")")))

; ошибка: неверный тип аргумента: numberp: nil
и ещё много много много разных вариантов и команд.



0



Понравилась статья? Поделить с друзьями:
  • Ошибка неверный токен миника 1102
  • Ошибка неверный тип аргумента lselsetp nil как исправить
  • Ошибка неверный тип файла доп инфо
  • Ошибка неверный тип аргумента lentityp nil
  • Ошибка неверный тип структуры количества количество для расчета