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

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

повторное открытие текстового файла

Ответ
Поиск в этой теме
Непрочитано 29.11.2006, 18:04 #1
повторное открытие текстового файла
Mr_Eugene
 
инженер-проектировщик
 
Москва.Терна
Регистрация: 05.10.2006
Сообщений: 33

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

все работает при вызове из первого файла
если его закрыть и вызвать лисп в другом, то на команду (open) выдает nil

объяснтие, плиз, где не прав
[ATTACH]1164812639.rar[/ATTACH]
Просмотров: 4139
 
Непрочитано 29.11.2006, 19:29
#2
Alan

CAD
 
Регистрация: 28.08.2003
Киев
Сообщений: 1,834
<phrase 1=


> Mr_Eugene
Я не очень большой специалист в ЛИСПе, но мне кажется, что при описании открытия (и т.п.) файлов надо всё делать явно.
Т.е. файл должен быть описан с полным путём. ЯТД
Например, если он в рабочей директории:
Код:
[Выделить все]
 (setq dskrtowns (open (strcat (getvar "dwgprefix") "v-towns.txt") "r"))
   (setq dskrcoord (open (strcat (getvar "dwgprefix") "v-coordinates.txt") "r"))
__________________
По теории майский жук летать не может.
Но он этого не знает. И летает...
Alan вне форума  
 
Непрочитано 30.11.2006, 09:20
#3
CB

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


У меня все работает нормально, только не сразу нашел результат работы функции - высота создаваемого текста от 0.02 до 0.06 мм
CB вне форума  
 
Автор темы   Непрочитано 30.11.2006, 10:12
#4
Mr_Eugene

инженер-проектировщик
 
Регистрация: 05.10.2006
Москва.Терна
Сообщений: 33


>Alan

да дело не в путях доступа
если файл без пути - то ищется в папке "Мои документы", а потом по папкам Автокада
пробовал пути и полностью прописывать

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

вроде и дескриптор закрыл и переменную обнулил

ума не приложу [sm2100]
Mr_Eugene вне форума  
 
Непрочитано 30.11.2006, 12:16
#5
Alan

CAD
 
Регистрация: 28.08.2003
Киев
Сообщений: 1,834
<phrase 1=


Цитата:
Сообщение от Mr_Eugene
>Alan

да дело не в путях доступа
если файл без пути - то ищется в папке "Мои документы", а потом по папкам Автокада
пробовал пути и полностью прописывать
результат тот же - работает только при первом вызове в каждом сеансе
вроде и дескриптор закрыл и переменную обнулил

ума не приложу
Mr_Eugene, я же написал что я небольшой специалист по ЛИСП.
Но.. Дескриптор файла вещь несколько большая, чем переменная.
С ним надо акуратненько! Найти файлик, описать, открыть, закрыть и т.д.
Не хочется править Ваш текст. Поэтому вставил только необходимое. ЯТД
Попробуйте.
Код:
[Выделить все]
(defun c:f2t (/	       ii	teq	 teqc	  teqh	   dskrtowns
	      dskrcoord		ltowns	 lcoord	  lheight  lcolor
	      fflag    convert	llist	 coords	  koord
	     )
  (vl-load-com)
  (setq acad_application (vlax-get-acad-object))
			      ;читает указатель корневого объекта иерархии AutoCAd
  (setq active_document (vla-get-activedocument acad_application))
			      ;читает указатель открытого документа
  (setq model_space (vla-get-modelspace active_document))
			      ;читает указатель объекта ModelSpace (пространства модели) открытого документа
;;;   (setq adLayers (vla-get-Layers active_document))
;;;   ;читает указатель семейства Layers (Слои) открытого документа

  (vla-startundomark active_document)
  (setq	ltowns (list)


  ) ;_ конец setq
  (setq lcoord (list))
  (setq lheight (list))
  (setq lcolor (list))
  (setq llist (list))
;;;  вставил проверку - Alan
  (if (and (findfile "v-towns.txt") (findfile "v-coordinates.txt"))
    (progn
      (setq dskrtowns (open "v-towns.txt" "r"))
      (setq dskrcoord (open "v-coordinates.txt" "r"))
      (while (setq teq (read-line dskrtowns))
	(setq convert (atof teq))
	(if (/= convert 0)
	  (progn
	    (setq teqh teq)
	    (setq teq (read-line dskrtowns))
	    (setq teqc teq)
	  )		      ;progn
	  (progn
	    (setq lheight (vl-list* teqh lheight))
	    (setq lcolor (vl-list* teqc lcolor))
	    (setq ltowns (vl-list* teq ltowns))
	  ) ;_ конец progn
	)		      ;if
      )			      ;while
      (while (setq teq (read-line dskrcoord))
	(setq lcoord (vl-list* teq lcoord))
      )			      ;while
      (if (/= (/ (length lcoord) 3) (length ltowns))
	(princ "Длины списков не совпадают")
	(progn
	  (setq ii 0)
	  (while (setq teq (nth ii ltowns))
	    (setq llist (list))
	    (setq llist (vl-list* (atof (nth (* 3 ii) lcoord)) llist))
	    (setq
	      llist (vl-list* (atof (nth (1+ (* 3 ii)) lcoord)) llist)
	    ) ;_ конец setq
	    (setq
	      llist
	       (vl-list* (atof (nth (+ (* 3 ii) 2) lcoord)) llist)
	    ) ;_ конец setq
	    (setq llist	(list '(0 . "TEXT")
			      (cons 62 (atoi (nth ii lcolor)))
			      (append '(10) llist)
			      (cons 40 (atof (nth ii lheight)))
			      (cons 1 teq)
			) ;_ конец list
	    ) ;_ конец setq
	    (setq llist (vl-remove '(62 . 256) llist))
	    (entmake llist)
	    (setq ii (1+ ii))
	  ) ;_ конец while
	)		      ;progn
      )			      ;if
      (close dskrtowns)
      (close dskrcoord)
      (setq dskrtowns nil)
      (setq dskrcoord nil)
    ) ;_ конец progn
;;;    если файлов нет - печать - Alan
    (progn
      (if (findfile "v-towns.txt")
	nil
	(alert "Файл v-towns.txt не найден")
      ) ;_ конец if
      (if (findfile "v-towns.txt")
	nil
	(alert "Файл v-coordinates.txt не найден")
      ) ;_ конец if
    ) ;_ конец progn
  ) ;_ конец if
  (vla-endundomark active_document)
) ;_ конец defun
__________________
По теории майский жук летать не может.
Но он этого не знает. И летает...
Alan вне форума  
 
Автор темы   Непрочитано 30.11.2006, 12:58
#6
Mr_Eugene

инженер-проектировщик
 
Регистрация: 05.10.2006
Москва.Терна
Сообщений: 33


>Alan

большое спасибо за корректировку
но проблема осталась

после загрузки кода во второй и более файлы (в одном сеансе)
findfile проходит, а
(open "v-towns.txt" "r")
выдает nil
что соответственно приводит к ошибке
bad argument type: FILE nil
при обращении к дескрипотру (read-line dskrtowns)

на этом вся веселуха заканчивается
Mr_Eugene вне форума  
 
Непрочитано 30.11.2006, 13:16
#7
Кулик Алексей aka kpblc
Moderator

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


Я не тестировал код, просто поменял тот, который опубликовал Alan:
Код:
[Выделить все]
(defun c:f2t (/            acad_application          active_document
              model_space  file_handle  teq ;
              ii           teqc         teqh         dskrtowns    dskrcoord
              ltowns       lcoord       lheight      lcolor       fflag
              convert      llist        coords       koord
              )
  (vl-load-com)
  (setq model_space
         (vla-get-modelspace
           (setq active_document
                  (vla-get-activedocument
                    (setq acad_application
                           (vlax-get-acad-object)
                          ) ;_ end of setq
                    ) ;_ end of vla-get-activedocument
                 ) ;_ end of setq
           ) ;_ end of vla-get-modelspace
        ) ;_ end of setq
  (vla-startundomark active_document)
  (setq ltowns  (list)
        lcoord  (list)
        lheight (list)
        lcolor  (list)
        llist   (list)
        ) ;_ end of setq
  (cond
    ((and (findfile "v-towns.txt") (findfile "v-coordinates.txt"))
     (setq file_handle (open (findfile "v-towns.txt") "r"))
     (while (setq teq (read-line file_handle))
       (if (/= (setq convert (atof teq)) 0.)
         (setq teqh teq
               teq  (read-line file_handle)
               teqc teq
               ) ;_ end of setq
         (setq lheight (vl-list* teqh lheight)
               lcolor  (vl-list* teqc lcolor)
               ltowns  (vl-list* teq ltowns)
               ) ;_ end of setq
         ) ;_ end of if
       ) ;_ end of while
     (close file_handle)
     (setq file_handle (open (findfile "v-coordinates.txt") "r"))
     (while (setq teq (read-line dskrcoord))
       (setq lcoord (vl-list* teq lcoord))
       )  ;while
     (close file_handle)
     (if (/= (/ (length lcoord) 3) (length ltowns))
       (princ "Длины списков не совпадают")
       (progn
         (setq ii 0)
         (while (setq teq (nth ii ltowns))
           (setq llist (list))
           (setq llist (vl-list* (atof (nth (* 3 ii) lcoord)) llist))
           (setq
             llist (vl-list* (atof (nth (1+ (* 3 ii)) lcoord)) llist)
             ) ;_ end of setq
           (setq
             llist
              (vl-list* (atof (nth (+ (* 3 ii) 2) lcoord)) llist)
             ) ;_ end of setq
           (setq llist (list '(0 . "TEXT")
                             (cons 62 (atoi (nth ii lcolor)))
                             (append '(10) llist)
                             (cons 40 (atof (nth ii lheight)))
                             (cons 1 teq)
                             ) ;_ end of list
                 llist (vl-remove '(62 . 256) llist)
                 ) ;_ end of setq
           (entmake llist)
           (setq ii (1+ ii))
           ) ;_ end of while
         ) ;_ end of progn
       ) ;_ end of if
     )
    (t
     (if (not (findfile "v-towns.txt"))
       (alert "Не могу найти файл v-towns.txt")
       ) ;_ end of if
     (if (not (findfile "v-coordinates.txt"))
       (alert "Не могу найти файл v-coordinates.txt")
       ) ;_ end of if
     )
    ) ;_ end of cond
  (vla-endundomark active_document)
  (princ)
  ) ;_ end of defun
Я не сносил лишние определения локальных переменных. Так что код так, в качестве зацепки (ИМХО) можно использовать, не более.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 30.11.2006, 14:13
#8
Mr_Eugene

инженер-проектировщик
 
Регистрация: 05.10.2006
Москва.Терна
Сообщений: 33


УРРА! Заработала!
[sm155]
kpblc, большое спасибо!

загвоздка была в
(open "v-towns.txt" "r")

open через findfile
(open (findfile "v-towns.txt") "r"))
работает отлично

есчо раз огромные благодарности
Mr_Eugene вне форума  
 
Непрочитано 30.11.2006, 14:39
#9
Alan

CAD
 
Регистрация: 28.08.2003
Киев
Сообщений: 1,834
<phrase 1=


Цитата:
Сообщение от Mr_Eugene
УРРА! Заработала!
[img]sm/sm155.gif[/img]
kpblc, большое спасибо!

загвоздка была в
(open "v-towns.txt" "r")

open через findfile
(open (findfile "v-towns.txt") "r"))
работает отлично

есчо раз огромные благодарности
Mr_Eugene, на самом деле findfile нужен только для проверки нахождения/наличия файла.
Поэтому еще раз напоминаю - необходимо писать путь к месту файла! А не надеяться, что он будет найден.
Если начали писать на ЛИСПе или на чём-то другом, привыкайте к аккуратности.
kpblc молодец, но Ваш текст он не правил (как и я), а там еще много чего править надо. ЯТД
__________________
По теории майский жук летать не может.
Но он этого не знает. И летает...
Alan вне форума  
 
Непрочитано 30.11.2006, 14:50
#10
Кулик Алексей aka kpblc
Moderator

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


Alan, позволю себе немного поправить: (findfile) в случае нахождения файла возвращает его полный путь. А если не нашел - то nil.
---
Добавлено:
Я б хранил, наверное, данные по другой методике, больше напоминающей ini-файлы (либо вообще напрямую в ini закидывал). И обрабатывать проще, и файл один, и создавать его не проблема, и любую координату можно пропустить, впоследствии заменив, например, на 0. Но это уже в общем-то дело вкуса
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.11.2006, 15:17
#11
Alan

CAD
 
Регистрация: 28.08.2003
Киев
Сообщений: 1,834
<phrase 1=


kpblc, позволю себе немного поправить тебя.
findfile ищет только: в рабочем каталоге и по стандартным для системы Автокад путям, т.е. те что описаны в настройке.
Mr_Eugene, открывает новый файл и для него рабочий каталог будет тот, который описан в ярлыке Автокада, например,
"d:\Program Files\AutoCAD 2006\UserDataCache\".
Вот тут он и получает ошибку. Чтобы убрать ошибки надо чётко прописать путь и не мучиться.
Организация файловой системы пользователя (ИНИ-файлы, переменные...) это уже за областью данной проги.
kpblc, согласен?
__________________
По теории майский жук летать не может.
Но он этого не знает. И летает...
Alan вне форума  
 
Автор темы   Непрочитано 30.11.2006, 15:58
#12
Mr_Eugene

инженер-проектировщик
 
Регистрация: 05.10.2006
Москва.Терна
Сообщений: 33


>Alan

Спасибо еще раз!
Обязательно учту замечания
Mr_Eugene вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > повторное открытие текстового файла