Spline (отрисовка из файла)
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Spline (отрисовка из файла)

Spline (отрисовка из файла)

Ответ
Поиск в этой теме
Непрочитано 15.09.2007, 16:34 #1
Spline (отрисовка из файла)
lokus
 
Электромонтаж-проект
 
Москва
Регистрация: 29.06.2007
Сообщений: 24

нужно нарисовать кривулю по данным из файла, вот такой код не работает:
(command "spline" (cdr(ASSOC 11(ENTGET(ENTLAST))))
(while (> 50 n)
(cons (setq n(+ n 0.01))(list(abs(read(read-line ff)))
))))

видимо проблема в том что WHILE не возвращает промежуточные значения вычеслинные в цикле, я пробовал CONS запихнуть в PRINT, но результат тот же....
Подскажите пожалуйста как програмно передавать сплайну вычисленные знач., просто заковырялся уже с этой затеей, заранее спасибо за помощь.
__________________
Нимиц должен лежать на дне
Просмотров: 3624
 
Непрочитано 15.09.2007, 17:59
#2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404


А полностью задачу и образец файла, из которого выполняется чтение данных?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 15.09.2007, 18:56
#3
lokus

Электромонтаж-проект
 
Регистрация: 29.06.2007
Москва
Сообщений: 24


файл тхт, содержит одну колонку значений, которые суть коодината Y, через равные промежутки по Х вычисляются точки для отрисовки

Нужно отрисовать SPLINE по данным из этого файла, но что-то через WHILE это не крутится

ПРИМЕР тхт:
2.5
3.4
2.3
4.3
и т.д.

Извините что не могу выслать сам файл, он далеко... я кое что посмотрел на форуме по этой теме, разбираюсь... а сейчас мучаюсь вот каким вопросом, корректно ли так передавать значения (1 2.5 0) как я делал в функцию SPLINE или автоматом его не отрисовать
__________________
Нимиц должен лежать на дне
lokus вне форума  
 
Непрочитано 15.09.2007, 22:15
#4
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404


Код:
[Выделить все]
(defun test (file-name
             /
             *error*
             file_handle
             str
             coord
             counter
             _osmode
             _cmdecho
             _nomutt
             )
  (defun *error* (msg)
    (mapcar 'setvar
            (list "cmdecho" "nomutt" "osmode")
            (list _cmdecho _nomutt _osmode)
            ) ;_ end of mapcar
    (vl-catch-all-apply '(lambda () (close file_handle)))
    (princ msg)
    (princ)
    ) ;_ end of defun

  (if (findfile file-name)
    (progn
      (setq file_handle
                        (open file-name "r")
            counter     -0.01
            _cmdecho    (getvar "cmdecho")
            _nomutt     (getvar "nomutt")
            _osmode     (getvar "osmode")
            ) ;_ end of setq
      (while (setq str (read-line file_handle))
        (setq coord (append coord (list (atof str))))
        ) ;_ end of while
      (close file_handle)
      (mapcar 'setvar
              '("cmdecho" "nomutt" "osmode")
              '(0 1 0)
              ) ;_ end of mapcar
      (command "_.spline")
      (apply
        'command
        (mapcar '(lambda (x) (list (setq counter (+ counter 0.01)) x 0.)) coord)
        ) ;_ end of apply
      (while (/= (logand (getvar "cmdactive") 31) 0)
        (command "")
        ) ;_ end of while
      (mapcar 'setvar
              (list "cmdecho" "nomutt" "osmode")
              (list _cmdecho _nomutt _osmode)
              ) ;_ end of mapcar
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun
Тут нет меток начала и конца отмены.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 16.09.2007, 08:16
#5
lokus

Электромонтаж-проект
 
Регистрация: 29.06.2007
Москва
Сообщений: 24


Спасибо Алексей!

Мощно, но малопоятно я буду разбираться и иногда здавать вопросы... просто и не думал что так сложно закрутить цикл для SPLINE.

Спасибо за мастер класс!
__________________
Нимиц должен лежать на дне
lokus вне форума  
 
Непрочитано 16.09.2007, 12:58
#6
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404


"Мощно" было бы, если б я делал через ActiveX (руки, правду говоря, чесались). А так-то в коде ничего сверхъестественного нет: сначала открывается файл, из него считываются все значения, файл закрывается. Потом назначаются системные переменные: osmode - отключаем привязки; cmdecho и nomutt - чтоб в ком.строке была тишина. Потом дается команда _.spline и подсовывается тут же сформированный список 3Д-точек(хотя можно было бы и 2Д, наверное, обойтись). Следом конструкцией
Код:
[Выделить все]
      (while (/= (logand (getvar "cmdactive") 31) 0)
        (command "")
        ) ;_ end of while
завершается выполнение текущей команды нажатием <enter>. И восстанавливаются системные переменные. Все, в общем-то.
P.S. Перед последней скобкой забыл поставить (princ), чтоб и выход был тихим...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 16.09.2007, 15:58
#7
lokus

Электромонтаж-проект
 
Регистрация: 29.06.2007
Москва
Сообщений: 24


Спасибо Алексей, за код и разъяснения, я понимаю что мой код предельно крив, но можно ли из WHILE передавать значения вычесленные в цикле в SPLINE
__________________
Нимиц должен лежать на дне
lokus вне форума  
 
Непрочитано 16.09.2007, 19:16
#8
Arkady

AutoCad Development and Support
 
Регистрация: 21.08.2003
Israel
Сообщений: 183
Отправить сообщение для Arkady с помощью Skype™


Передавать значения в цикле конечно можно.
Нужно их только правильно сформировать.
1.Считаем n как координату X (если я правильно понял):
Код:
[Выделить все]
 (setq n (+ n 0.01))
2.Зачитываем Y из файла:
Код:
[Выделить все]
 (setq y (abs (read (read-line ff))))
3.Формируем точку:
Код:
[Выделить все]
(setq po (list n y))
4.Передаем точку в команду:
Код:
Код:
[Выделить все]
(setq n 0)
(while (> 50 n) 
  (setq n (+ n 0.01))
  (setq y (abs (read (read-line ff))))
  (setq po (list n y))
  (command po)
)
Arkady вне форума  
 
Непрочитано 16.09.2007, 21:47
#9
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404


А если в файле не 5 000 записей, а больше или меньше? Тогда как быть?
P.S. Объявлять дополнительные переменные необязательно, можно и без них обойтись.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 16.09.2007, 22:12
#10
lokus

Электромонтаж-проект
 
Регистрация: 29.06.2007
Москва
Сообщений: 24


Спасибо Алексей,

я плакаль...
__________________
Нимиц должен лежать на дне
lokus вне форума  
 
Непрочитано 16.09.2007, 23:32
#11
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404


Цитата:
Сообщение от lokus
я плакаль...
:?:
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 17.09.2007, 09:59
#12
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


Вариант с рекурсией...
Код:
[Выделить все]
(defun test (filename / file rec)
  (defun rec (n lst)
    (if	lst
      (cons (list n (abs (read lst)))
	    (rec (+ 0.01 n) (read-line ff))
      ) ;_ end of cons
    ) ;_ end of if
  ) ;_ end of defun
  (if (findfile filename)
    (progn
      (setq ff (open filename "r"))
      (apply 'command
	     (append (list "_spline"
			   (if (entlast)
			     (cdr (assoc 11 (entget (entlast))))
			     (getpoint "Первая точка: ")
			   ) ;_ end of if
		     ) ;_ end of list
		     (rec 1. (read-line ff))
		     (list "" "" "")
	     ) ;_ end of append
      ) ;_ end of apply
      (close ff)
    ) ;_ end of progn 
    (princ "Файл не найден")
  ) ;_ end of if 
  (princ)
) ;_ end of defun
CB вне форума  
 
Автор темы   Непрочитано 17.09.2007, 10:19
#13
lokus

Электромонтаж-проект
 
Регистрация: 29.06.2007
Москва
Сообщений: 24


Спасибо Алексей и Arkady,

из такого простого вопроса, как мне казалось, благодаря Вашим ответам узнал много нового.., но вот еще один чисто теоретический вопрос:
мой изначальный код (пусть и не работающий) не выглядет ли более лисповским чем код Алексея... я часто ловлю себя на мысли (м.б. не правильной) что лисповские скрипты (работающие) часто выглядят как структура С кода, объявление переменных, множество промежуточных выражений, прототипы функций (LAMBDA), но нету одной функции которая длинная и все в ней, есть лисповский DEFUN который скрывает структуру С...
Вопрос может быть не корректным, заранее прошу прощения, С изучаю параллельно ЛИСП, но когда я что-то делаю для АКАд у меня получается какая то каша (я её называю лисповской ), а вот в чужих скриптах особенно от Профи я вижу мощные и неизвестные мне ходы и отсутствие каши...какойто С
Вопрос чисто дискуссионный и м.б. не корректный, но очень интересен взгляд специалистов на такую постановку вопроса .
__________________
Нимиц должен лежать на дне
lokus вне форума  
 
Автор темы   Непрочитано 17.09.2007, 14:16
#14
lokus

Электромонтаж-проект
 
Регистрация: 29.06.2007
Москва
Сообщений: 24


Еще один теоретический вопрос, есть ли возможность передачи данных из внешнего оборудования в акад посредством LISP, ну или СОМ функций для лисп...

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

Интересует именно возможность Акад работать с внешними данными, и если такая возможность есть только в ARX, то нельзя ли где то посмотреть пример...самое простое что приходит в голову: кручу колесо мышки->меняю координаты точки в сплайне. Очень буду рад разъяснениям на этот счет.
__________________
Нимиц должен лежать на дне
lokus вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Spline (отрисовка из файла)