Форум программистов, компьютерный форум, киберфорум
Наши страницы
AutoLISP
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.85/20: Рейтинг темы: голосов - 20, средняя оценка - 4.85
Virviglaz
3 / 3 / 1
Регистрация: 21.10.2015
Сообщений: 92
1

AutoLISP работа с файлом

08.11.2015, 21:43. Просмотров 4006. Ответов 21
Метки нет (Все метки)

Здравствуйте! Необходимо реализовать вывод и ввод в файлы. Программа чертит заданную по условию фигуру и проверяет попадает ли точка в заштрихованную область. Пользователь может выбрать вводить ли ему точку самому (с клавиатуры), либо ввести точку из файла (где я и застряла). Точка введённая пользователем с клавиатуры должна быть записана в файл (тут тоже не лучше). В общем не получается у меня с файлами работать(
0
Вложения
Тип файла: txt tmp.txt (2.0 Кб, 23 просмотров)
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.11.2015, 21:43
Ответы с готовыми решениями:

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

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

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

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

AutoLisp - Не вводятся координаты
Помогите разобраться, после того как базовая точка задается, появляется следующая команда "Введите...

21
vlisp
665 / 609 / 119
Регистрация: 10.08.2015
Сообщений: 2,534
Завершенные тесты: 1
08.11.2015, 21:53 2
В чем проблема-то?
0
Virviglaz
3 / 3 / 1
Регистрация: 21.10.2015
Сообщений: 92
08.11.2015, 21:58  [ТС] 3
Не видит файл. (чтение)
0
vlisp
665 / 609 / 119
Регистрация: 10.08.2015
Сообщений: 2,534
Завершенные тесты: 1
08.11.2015, 22:04 4
Цитата Сообщение от Virviglaz Посмотреть сообщение
Не видит файл
Так покажи, автокад курсы экстрасенсов не проходил, он работает только в каталогах, описанных в путях поддержки, либо при указании абсолютного пути
0
08.11.2015, 22:04
Virviglaz
3 / 3 / 1
Регистрация: 21.10.2015
Сообщений: 92
08.11.2015, 22:13  [ТС] 5
Посмотрите для начала мой код. Вы тоже сейчас занимаетесь экстрасенсорикой. Там два варианта вывода из файла. Я бы хотела получить какою-нибудь помощь или пояснение по данному вопросу.
0
vlisp
665 / 609 / 119
Регистрация: 10.08.2015
Сообщений: 2,534
Завершенные тесты: 1
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
Virviglaz
3 / 3 / 1
Регистрация: 21.10.2015
Сообщений: 92
09.11.2015, 00:32  [ТС] 7
ошибка: неверный тип аргумента
0
vlisp
665 / 609 / 119
Регистрация: 10.08.2015
Сообщений: 2,534
Завершенные тесты: 1
09.11.2015, 01:08 8
Цитата Сообщение от Virviglaz Посмотреть сообщение
ошибка: неверный тип аргумента
Это не вся строка, сложно было скопировать полностью? Как вызываете функцию FileToList?
0
Virviglaz
3 / 3 / 1
Регистрация: 21.10.2015
Сообщений: 92
09.11.2015, 01:27  [ТС] 9
Я вызываю весь написанный мною код с самого начала. Вызов делаю через командную строку AutoCAD.
; ошибка: неверный тип аргумента: numberp: nil
и если вызвать вашу функцию отдельно таким же образом:
; ошибка: слишком мало аргументов
0
vlisp
665 / 609 / 119
Регистрация: 10.08.2015
Сообщений: 2,534
Завершенные тесты: 1
09.11.2015, 01:56 10
Цитата Сообщение от Virviglaz Посмотреть сообщение
; ошибка: неверный тип аргумента: numberp: nil
эта ошибка означает что в оператор подставляется неинициализированная переменная

Цитата Сообщение от Virviglaz Посмотреть сообщение
; ошибка: слишком мало аргументов
тут вообще все понятно... забыли подставить один или несколько аргументов... нужно быть внимательнее и пользоваться инструментами форматирования кода
0
Virviglaz
3 / 3 / 1
Регистрация: 21.10.2015
Сообщений: 92
09.11.2015, 02:14  [ТС] 11
Цитата Сообщение от vlisp Посмотреть сообщение
эта ошибка означает что в оператор подставляется неинициализированная переменная
осталось только понять в каком именно месте. т.к ваша функция верна. в предыдущих вариантах чтения из файла такой ошибки не наблюдалось.
0
vlisp
665 / 609 / 119
Регистрация: 10.08.2015
Сообщений: 2,534
Завершенные тесты: 1
09.11.2015, 02:20 12
Если файл пустой, то функция вернет nil, иначе список строк, который все равно еще нужно преобразовывать в список чисел и уже из него брать число для подстановки... используйте средства отладки vlide для отлова ошибок
0
Virviglaz
3 / 3 / 1
Регистрация: 21.10.2015
Сообщений: 92
09.11.2015, 02:40  [ТС] 13
А вот такой вопрос, пожалуй его следовало задать сразу: мне не сильно понятен сам код . Если в первом случае фигурирует полный путь к файлу и его наименование, что является для меня привычным, то здесь я ничего такого не вижу.
0
vlisp
665 / 609 / 119
Регистрация: 10.08.2015
Сообщений: 2,534
Завершенные тесты: 1
09.11.2015, 08:36 14
Цитата Сообщение от Virviglaz Посмотреть сообщение
Если в первом случае фигурирует полный путь к файлу и его наименование, что является для меня привычным, то здесь я ничего такого не вижу.
настройка путей поддержки избавляет от необходимости использовать абсолютные пути
0
Lambdik
1044 / 938 / 107
Регистрация: 04.11.2012
Сообщений: 971
Записей в блоге: 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
Virviglaz
3 / 3 / 1
Регистрация: 21.10.2015
Сообщений: 92
10.11.2015, 04:13  [ТС] 16
Цитата Сообщение от Lambdik Посмотреть сообщение
Ну как, получается?
Пока нет. Большое спасибо за ссылку. Итак,из файла мы считываем строку, которая содержит координаты точки. В дальнейшем, чтобы их использовать мы должны как-то преобразовать строку в список. Из идей только эта: разбить саму строку на подстроки, которые и объединить в список. (Надо/не надо; Верно/ не верно???)
P.S. Ранее хотелось сделать так, чтобы считывалось по одной точке из файла за каждый вызов функции. Ну а то что программа вообще увидела файл будем считать успехом.
0
Lambdik
1044 / 938 / 107
Регистрация: 04.11.2012
Сообщений: 971
Записей в блоге: 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
1044 / 938 / 107
Регистрация: 04.11.2012
Сообщений: 971
Записей в блоге: 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
18.11.2015, 00:52
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.11.2015, 00:52

Рисование кругов AutoLisp
помогите пожалуйста сделать задание (Autocad через лисп ) Нарисовать несколько графических...

Способ изучения autolisp
Привет. Посоветуйте пожалуйста, как бы мне к зверю(авто лисп) этому найти подход? Прошу...

Программа-калькулятор AUTOLISP
Пожалуйста,помогите!Срочно нужна программа-калькулятор на AUTOLISP в среде AUTOCAD выполняющая...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.