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

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

Чтение координат из файла

Ответ
Поиск в этой теме
Непрочитано 07.07.2010, 13:43
Чтение координат из файла
Zaghim
 
Регистрация: 01.07.2010
Сообщений: 521

Вопрос такой. Можно ли, имея файл, в котором содержатся списки, описывающие полностью примитив (координаты тип линии и тд), брать из него всю эту инфу и отрисовывать это в автокаде?
Просмотров: 10345
 
Непрочитано 08.07.2010, 11:01
#21
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


Zaghim,
Цитата:
В командной строке данный код не сработал
почему не сработал, он написал:
Цитата:
<Objektname: 7ffff76b420>
, т.е. объект создал с указанными значениями. 0-тип примитива (облегченная полилиния, 10-точки там всякие -это DXF-коды , стр.844-860 вышеуказанной книги)
alex8888 вне форума  
 
Непрочитано 08.07.2010, 11:25
#22
Кулик Алексей aka kpblc
Moderator

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


В ком.строке код может не сработать - он просто слишком длинный. Его можно попробовать запустить из-под vlide, например - тогда все будет ок. Ну или в lsp-файл загнать и потом этот файл загрузить.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 08.07.2010, 12:24
#23
Zaghim


 
Регистрация: 01.07.2010
Сообщений: 521


Ладно, с этим я более-менее разобрался. DXF слишком муторно я думаю...лучше передать такую строку, как писал выше, из которой я сам выцеплю то, что нужно. Пока что всем спасибо за помощь!!!
Zaghim вне форума  
 
Непрочитано 08.07.2010, 13:23
#24
Кулик Алексей aka kpblc
Moderator

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


Zaghim, я говорил не о DXF, а о том, "как с подобного примитива собирать координаты" - тебе же это интересно. Вот распиши, как и какие координаты для указанного примитива будут критичными (только не забудь в 3D чертеж повертеть).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 08.07.2010, 15:51
#25
Zaghim


 
Регистрация: 01.07.2010
Сообщений: 521


Не совсем так...мне интересно что бы был файл, в котором определенным образом будет занесена инфа, что нужно разместить на чертеже. Исходными данными на чертеже будут 4 точки (начало-конец и 2 промежуточные). Имея список, я знаю, что он начальной точки например должен провести линию, затем вставить блок, потом опять линию и тд...вот такая задумка.
Zaghim вне форума  
 
Непрочитано 08.07.2010, 15:58
#26
Кулик Алексей aka kpblc
Moderator

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


Ну, раз принципиально не хочется использовать dfx-вариант, придумывай свой формат данных.
P.S. Я тоже когда-то думал, что каждая задача требует индвидуального решения...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 08.07.2010, 17:07
#27
Zaghim


 
Регистрация: 01.07.2010
Сообщений: 521


Ну а как же вариант, который прислал alex8888. Там же свои данные, которые потом заносятся в переменные и следуя им рисуется двутавр.
Zaghim вне форума  
 
Непрочитано 08.07.2010, 17:55 В продолжение темы хранения данных в файле и их извлечения оттуда.
#28
Sad Dog

Ищу работу
 
Регистрация: 12.06.2010
Сообщений: 35


Идея, думаю, не нова. На авторство не претендую.
Смеяться можно.

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

Представте себе такой lisp-файл:
Код:
[Выделить все]
; Файл Article0.lsp
(list
  (cons "title" "Изделие 0"); атрибут: название дружественное к пользователю.
  (cons "type" "single"); атрибут: определяет, что файл вставляется целиком, как блок.
  (cons "src" "OffTheSelf\\Article0.dwg"); атрибут: относительный путь к файлу-носителю.
);
Файл содержит информацию о блоке из состава некоторой гипотетической коллекции под общим названием Articles.
Видно, что блок содержится в дочернем каталоге OffTheSelf некоторого корневого каталога базы.
Носителем блока является файл Article0.dwg.
При вставке такого файла примитивы из его пространства модели и формируют описание блока.
Описание получит имя Article0, совпадающее с именем dwg-файла.

А вот другой lisp-файл описания из той же коллекции:
Код:
[Выделить все]
; Файл Article1.lsp
(list
  (cons "name" "art1"); базовая часть имени блока.
  (cons "title" "Изделие 1"); название дружественное к пользователю.
  (cons "type" "select"); выбор по имени из коллекции описаний блоков, хранящихся в файле-носителе.
  (cons "src" "OffTheSelf\\Article1.dwg"); атрибут: относительный путь к файлу-носителю.
  ; Далее идут параметры блока.
  ; Они запрашиваются у пользователя и используются для определения полного имени блока.
  ; Если список параметров отсутствует, то окно запроса не выводится.
  (list
    "params"
    (list; первый параметр:
      "height"
      (cons "title" "Высота"); название, которое увидит пользователь при запросе параметра.
      (cons "type" "string"); тип параметра: в данном случае строковый, но может быть так же целочисленный или действительный.
      (list "enum" "20 см" "40 см"); выбор данного параметра возможен только из указанного перечисления.
    )
    (list; второй параметр:
      "width"
      (cons "title" "Ширина")
      (cons "type" "string")
      (list "enum" "50 см" "70 см")
    )
  );
);
Блок, соответствующий приведенному описанию, содержится в файле Article1.dwg в дочернем
каталоге OffTheSelf корневого каталога базы. Особенность заключается в том, что в Article1.dwg содержатся
описания нескольких блоков с именами, начинающимися на art1. Полное имя формируется приложением
путем конкатенации базового имени со строковым представленим параметров после запроса их у пользователя.

Вот ещё один вариант описания блока из той же коллекции:
Код:
[Выделить все]
; Файл Article2.lsp
(list
  (cons "name" "art2"); базовая часть имени блока.
  (cons "title" "Изделие 2"); название дружественное к пользователю.
  (cons "type" "create"); блок создается програмно ("на лету")
  (cons "src" "OnTheFly\\Article2.lsp"); относительный путь к файлу-носителю.
  ; Далее идут параметры блока.
  ; Они запрашиваются у пользователя, передаются в функцию создания блока, а так же используются для формирования полного имени создаваемого блока.
  (list
    "params"
    (list; первый параметр:
      "length"
      (cons "title" "Длина основания"); название, которое увидит пользователь при запросе параметра.
      (cons "type" "int"); тип параметра.
      (list "range" 200.0 400.0); выбор данного параметра возможен только из указанного диапазона, включая границы.
    )
    (list; второй параметр:
      "width"
      (cons "title" "Ширина основания")
      (cons "type" "string")
      (list "enum" "Скромная" "Средняя" "Огромная")
    )
    (list; третий параметр:
      "thickness"
      (cons "title" "Толщина стали")
      (cons "type" "real")
      (list "enum" 1.0 1.5 2.0)
    )
  );
);
Логическим носителем блока с базовым именем art2 является файл Article2.lsp (файл с кодом)
из каталога OnTheFly корневого каталога базы. Ожидается, что в Article2.lsp содержится
определение функции с именем article2. При вызове этой функции ей передаются три аргумента
с соответствующми значениями парметров. Функция создает описание блока и назначает ему имя,
используя конкатенацию базового имени и строковых представлений выбранных парметров.

Ну и напоследок:
Код:
[Выделить все]
; Файл Article3.lsp
(list
  (cons "title" "Изделие 3"); название дружественное к пользователю.
  (cons "type" "edit"); описание блока редактируется с последующим переименованием.
  (cons "src" "HalfFinished\\Article3.dwg"); относительный путь к файлу-носителю.
  (cons "escort" "HalfFinished\\Article3.lsp"); относительный путь к файлу сопровождения, содержащему функцию редактирования и переименования.
  ; Далее идут параметры блока.
  ; Они запрашиваются у пользователя, передаются в функцию редактировния блока,
  ; а так же используются для формирования полного имени при переименовании блока.
  (list
    "params"
    (list; первый параметр:
      "param"
      (cons "title" "Наличие отверстия")
      (cons "type" "string")
      (list "range" "Есть" "Нет")
    )
  );
);
Блоком является файл Article3.dwg из дочернего каталога HalfFinished корневого каталога базы.
Функция редактирования содержится в файле сопровождения Article3.lsp и называется article3.
При вызове в функцию передается один аргумент с соответствующм значением парметра, указанного пользователем.
Функция редактирует описание блока Article3 переименовывает его, используя конкатенациюя базового имени
и строкового представления парметра.

Представленный набор из четырех файлов (реально их могут быть сотни) объединяется в единое целое
пятым головным файлом:
Код:
[Выделить все]
; ArticlesMain.lsp
; Головной файл базы Articles.
(list
  "Articles"
  (include "Article0.lsp")
  (include "Article1.lsp")
  (include "Article2.lsp")
  (include "Article3.lsp")
);
Ключевая идея заключается в том, чтобы хранить информацию в виде, непосредственно воспринимаемом интерпретатором LISP.
Так, чтобы загружать её штатной функцией LOAD и получать сразу в виде списка, а не преобразуя строки в список,
как чаще всего предлагается. Я назвал бы это внутренне присущей для языка LISP техникой разметки данных -
Lisp Intrinsic Markup Technique (LIMT).
Таким образом, LIMT-документ представляет собой текстовый файл, содержащий код на языке AutoLISP,
при загрузке которого формируется список. В составе кода, формирующего список, может присутствовать
вызов функции include, позволяющей включать в состав документа другие LIMT-документы.
LIMT-документы могут иметь расширение .lsp или любое другое (например .limt).
LIMT-документы, при желании, могут быть скомпилированы и иметь расширение .fas
Круглые скобочки (), list и cons - вот и весь арсенал.

Для поддержки этой техники достаточно написать две крошечных функции (одна из них вложена в другую):
Код:
[Выделить все]
; LimtEngine.lsp
(defun get-limt-document (full_path; полный путь к limt-документу.
              /
              include
              )
  ; Локальное определение функции:
  (defun include (private_path / ) (load (strcat (vl-filename-directory full_path) "\\" (vl-string-trim " \\/" private_path))));
  ;
  (load full_path)
); end defun.
Функция include используется в коде, формирующем список, для вставки данных из другого LIMT-файла.
В качестве аргумента она получает строку с [относительным путём и] именем включаемого файла.
Возвращает список, сформированный кодом из указанного файла и кодом возможных вложенных через
рекурсивный вызов include файлов.

Функция get-limt-document формирует список из набора взаимосвязанных LIMT-документов.
В качестве аргумента получает строку с полным путем к каталогу и именем головного документа.
Все относительные пути, указанные в вызовах (в т.ч. вложенных) include отсчитываются от каталога головного документа.
Функция возвращает окончательный список, сформированный на основе всей иерархии LIMT-файлов.

В прилагаемом архиве содержатся все выше упоминавшиеся файлы. Прочитайте там коротенький ReadMe.txt
и попробуйте сами.
Вложения
Тип файла: rar Limt.rar (5.9 Кб, 59 просмотров)

Последний раз редактировалось Sad Dog, 08.07.2010 в 18:56.
Sad Dog вне форума  
 
Непрочитано 08.07.2010, 18:02
#29
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от Sad Dog Посмотреть сообщение
и маленький пример в студию!
Вот простой пример:
Код:
[Выделить все]
(defun cdx-GetInterfaceObject (str / obj)
  (if (vl-catch-all-error-p (setq obj (vl-catch-all-apply 'vla-GetInterfaceObject (list (vlax-get-acad-object) str)))) nil obj)
)

(defun cdx-FileSystem()
	(cdx-GetInterfaceObject "Scripting.FileSystemObject")
)

(defun cdx-ReadTextFile (strFile / strFullName objScr objFile Result)
 (if (setq strFullName(findfile strFile))
  (progn
	(setq
		objScr (cdx-FileSystem)
		objFile(vlax-invoke-method objScr 'OpenTextFile strFullName 1 nil -2)
		Result(vlax-invoke objFile 'ReadAll)
	)
	(vlax-invoke objFile 'Close)
	(mapcar 'vlax-release-object (list objFile objScr))
  )
 )
  Result
)
(defun cdl-string->list (s p / i)
  (cond
	((setq i (vl-string-search p s))
		(cons (substr s 1 i) (cdl-string->list (substr s (+ (strlen p) i 1)) p))
	)
	(T (list s))
  )
)

(defun cdl-csv->list (strFile)
  (if (findfile strFile)
	(mapcar
		'(lambda(x)(cdl-string->list x ","))
		(cdl-string->list (cdx-ReadTextFile strFile) "\r\n")
	)
  )
)
Набираете все, например в Excel, экпортируете в csv, преобразовываете в список... а дальше чего душенька пожелает
gomer вне форума  
 
Непрочитано 08.07.2010, 18:45
#30
Sad Dog

Ищу работу
 
Регистрация: 12.06.2010
Сообщений: 35


Непонял только, почему нельзя было использовать стандартную (open...) из AutoLISP? Чем Scripting.FileSystemObject лучше?
Sad Dog вне форума  
 
Непрочитано 08.07.2010, 23:48
#31
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от Sad Dog Посмотреть сообщение
почему нельзя было использовать стандартную (open...) из AutoLISP? Чем Scripting.FileSystemObject лучше?
В таком случае не избежать цикла while и поcтрочного read-line и кстати он имхо быстрее...

Последний раз редактировалось gomer, 08.07.2010 в 23:57.
gomer вне форума  
 
Автор темы   Непрочитано 09.07.2010, 12:11
#32
Zaghim


 
Регистрация: 01.07.2010
Сообщений: 521


gomer, я вижуал лисп вообще не знаю, только автолисп и то плохо)))
Отсюда вопрос по программе. Где загружается нужное имя файла? Дальше я так понимаю все что внутри читается построчно, убираются запятые и формируется список типа (а1 а2 а3 ... ан)? А в какие переменные они заносятся... или мы их можем брать командой nth? А если число переменных будет различаться... ну например из одного списка нужно вставить 2 линии и два блока, а из другого 5 линий и 4 блока...

Пишет, что очень много аргументов, как ей пользоваться?

Последний раз редактировалось Zaghim, 09.07.2010 в 13:17.
Zaghim вне форума  
 
Непрочитано 09.07.2010, 15:37
#33
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


>Zaghim: алгоритм такой:
есть файл csv? его название передается в cdl-csv->list в качестве аргумента...
cdl-csv->list читает файл с помощью cdx-ReadTextFile причем сразу, так что на выходе строка по типу мтекст (строка разделяется запятыми и "\r\n" по определению... построчного чтения нет
дальше все это дело дробится на список, так что получается:
((а1 а2 а3 ... ан)
(b1 b2 b3 ... bн)
........
)
Остальные вопросы, читай последнюю фразу
А лучше пример подгони... а то ведь не понятно, что ты хочешь...
gomer вне форума  
 
Автор темы   Непрочитано 12.07.2010, 09:44
#34
Zaghim


 
Регистрация: 01.07.2010
Сообщений: 521


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

(дистанция1, имяблока1, дистанция2, имя блока2, дистанция3, ответвление1, дистанция4, имяблока1, ответвление2, дистанция5)

а так должно быть в файле...
(100, блок1, 150, блок2, 70, отв1, 100, блок1, отв2, 80)

Фишка в том, что файл будет только с одной такой строкой, т.е. что бы отрисовать все на этих 4 точках нужно описать в одной строке, а вот элементов может быть разное количество...был пример про чтение, писал алекс, там все круто, но строки все одного типа, а тут всегда разные (кол-во блоков различно, больше или меньше расстояний и тд). И каждый элемент, получается, нужно брать из этого списка и анализировать, т.е. если я вижу, что число иду и рисую линии с отступом от первой точки по направлению к другой, если блок, иду на вставку блока от последней точки.... типа так

Последний раз редактировалось Zaghim, 12.07.2010 в 10:16.
Zaghim вне форума  
 
Непрочитано 12.07.2010, 09:49
#35
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


gomer, в какой переменной или где получается сформированный список? Сама функция прошла успешно (написали nil в конце)
Потом из этого списка выбирать с помощью nth?

Про Scripting.FileSystemObject где-нибудь по русски прочитать можно? Где ни поищу - все английский.

Последний раз редактировалось alex8888, 12.07.2010 в 09:55.
alex8888 вне форума  
 
Автор темы   Непрочитано 12.07.2010, 16:50
#36
Zaghim


 
Регистрация: 01.07.2010
Сообщений: 521


alex8888, как ты ее запустил?)
Zaghim вне форума  
 
Непрочитано 12.07.2010, 17:20
#37
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


Вот так:
(cdx-GetInterfaceObject "g:/drawing/file1.csv")
Прописываешь путь к файлу, вместо \ надо \\ ставить или одну /. Я так назвал свой файл file1.
alex8888 вне форума  
 
Непрочитано 13.07.2010, 00:27
#38
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Ребяты ну вы хоть код посмотрите
Код:
[Выделить все]
  (setq lst (cdl-csv->list "g:/drawing/file1.csv"))
в принципе должен получиться в результате должен список типа
'((100 блок1 150, блок2 70 отв1 100 блок1)
(100 блок1 150, блок2 70 отв1)
;;; ..............
(100 блок1 150, блок2 70 отв1 100 блок1 отв2 80))
Вот так вот...

И вообще есть замечательные фуннции cаr и cdr подходят для обработки любых спиков

с Scripting.FileSystemObject у меня проблем не было, так как читаю на английском свободно
Описание можно найти в справочной системе MSDN

Последний раз редактировалось gomer, 13.07.2010 в 18:11. Причина: убрал лишнюю проверку на наличие файла...
gomer вне форума  
 
Непрочитано 13.07.2010, 10:07
#39
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


gomer, а что, я не правильно вызываю?
Цитата:
(cdx-GetInterfaceObject "g:/drawing/file1.csv")
И все-таки не понял где полученный список. В lst? Надо поискать еще раз. Только не ругайся
alex8888 вне форума  
 
Непрочитано 13.07.2010, 18:07
#40
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Тааак, спокойнооо...
cdx-GetInterfaceObject вызывает сом-сервер и возвращает его в виде vla-объекта (например Excel, Word, Scripting.FileSystemObject) и тд
Аргумент - строка, его индетифицирующая...
"g:/drawing/file1.csv" определяет файл на дисе g в папке drawing с именем file1 и расширением csv и уж ни как не объект Scripting.FileSystemObject естественно (cdx-GetInterfaceObject "g:/drawing/file1.csv") возвратит nil

в данном случае правильно (см. выше):
(cdx-GetInterfaceObject "Scripting.FileSystemObject")
этот объект нужен для работы с файлом ( открытия, чтения и тд)
и наконец список возвращается функцией cdl-csv->list (см. выше еще раз...)
gomer вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Чтение координат из файла



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Импорт координат точек из файла съемки тахеометра Trimble M3 в AutoCAD Red Nova Программирование 33 17.05.2011 16:46
структурированный список Holon Программирование 22 11.09.2007 14:09
Помощь по Лире Серега М Лира / Лира-САПР 52 28.05.2007 02:47
чтение данных из файла Александер Программирование 6 08.09.2005 10:24