Re: Как из файла выбрать данные с координатами, соединить их линиями и повторить это для всей папки?

Вот пример с данными.
Предположения.
В 1-м файле описан 1 участок, судя по mid (за исключением NB-смежники).Все данные записываются в словарь примитива в виде SC="0000040" как (("SC" "0000040") ...)
Надергать нужное не составит труда. Надо указать какие поля и в каком порядке расположить.
Написаны 2 команды IP- рисует участки OD- выводит объектные данные

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;Функция вызывает окно выбора папки
;;;
;;;Аргументы — нет
;;;Возвращаемое значение — путь к папке вида:
;;;disc:\\dir1\\....\\dirN
;;;
;;;Вызов (BrowseFolder)
;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun BrowseFolder ( / ShlObj Folder FldObj OutVal)
  (vl-load-com)
  (setq
    ShlObj (vla-getInterfaceObject
       (vlax-get-acad-object)
       "Shell.Application"
     )
    Folder (vlax-invoke-method ShlObj 'BrowseForFolder 0 "Укажите каталог с файлами *.in4" 0)
  )
  (vlax-release-object ShlObj)
  (if Folder
    (progn
      (setq
  FldObj (vlax-get-property Folder 'Self)
  OutVal (vlax-get-property FldObj 'Path)
      )
      (vlax-release-object Folder)
      (vlax-release-object FldObj)
      OutVal
    )
  )
)
;|
* Ф-ция str-str-lst
* Сервисная ф-ция извлечения из строки данных, разделенных
* каким либо символом или строкой символов
* Возвращает список строк
* Аргументы [Type]:
  str - строка для разбора [STRING]
  pat - разделитель [STRING]
*  Пример запуска
  (setq str "мы;изучаем;рекурсии" pat ";")
  (setq str "мы — изучаем — рекурсии" pat " — ")
  (str-str-lst str pat)
* Читать подробнее https://www.caduser.ru/forum/topic25197.html
|;
(defun str-str-lst (str pat / i)
  (cond ((= str "") nil)
        ((setq i (vl-string-search pat str))
         (cons (substr str 1 i)
               (str-str-lst (substr str (+ (strlen pat) 1 i)) pat)
         ) ;_  cons
        )
        (t (list str))
  ) ;_  cond
) ;_  defun
(defun c:ip
                   (/ dir_path files_list item string_list file_handle string str_list count rd_list buf_list)
  (vl-load-com)
  (setvar "EXTNAMES" 1)
  (if (not *kpblc-activedoc*)
    (setq *kpblc-activedoc* (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of if
  (vla-startundomark *kpblc-activedoc*)
  (if
    (setq dir_path (BrowseFolder))
     (if (and (setq files_list (z-files-in-directory dir_path "*.in4" nil))
              (> (length files_list) 0)
              ) ;_ end of and
       (progn
         (foreach item files_list
           (setq file_handle
                             (open item "r")
                 string_list nil
            rd_list nil
            buf_list nil
                 ) ;_ end of setq
           (while (setq string (read-line file_handle))
             (setq str_list nil)
             (cond ((= (substr string 1 1) "#") nil)
               ((/= (substr string 1 2) "N=") ;_даннне типа AD=
            (setq buf_list (append buf_list (list string)))
            )
           ((and (= (substr string 1 2) "N=")
              (vl-string-search "X=" string)
                      (vl-string-search "Y=" string)
              )
            (setq str_list (append str_list (list string)))
            (while (and
                 (setq string (read-line file_handle))
                 (= (substr string 1 2) "N=")
                 (vl-string-search "X=" string)
                 (vl-string-search "Y=" string)
                 )
              (setq str_list (append str_list (list string)))
              )
            (setq string_list (append string_list (list str_list))
              rd_list (append rd_list (list buf_list))
              buf_list (list string)
              )
            )
           )
             ) ;_ end of while
       (close file_handle)
           ;; Теперь для данного файла получен список строк с координатами
           ;; точек
           ;; Надо в первую очередь создать слой. Имя слоя = имени файла (без
           ;; пути и
           ;; расширения)
       (if (snvalid (vl-filename-base item))
         (progn
               (vla-add (vla-get-layers *kpblc-activedoc*) (vl-filename-base item))
           (vla-put-activelayer
             *kpblc-activedoc*
             (vla-item (vla-get-layers *kpblc-activedoc*)
                       (vl-filename-base item)
                       ) ;_ end of vla-item
             ) ;_ end of vla-put-ActiveLayer
           )
         );_if
(setq rd_list    
(mapcar
  '(lambda (r1)
     (mapcar
       '(lambda    (s)
      (mapcar '(lambda (s1) (vl-string-trim " " s1))
          (str-str-lst (vl-string-translate "\"," "  " s) "=")
      )
    )
       r1
     )
   )
  rd_list
))
;(setq RR rd_list SS string_list)
(setq buf_list (vl-remove-if 'null (mapcar '(lambda (r1 s1)(if (assoc "NB" r1) nil (list r1 s1))) rd_list string_list)))
(setq str_list (list(cadar buf_list)))
(setq buf_list (list(apply 'append (mapcar '(lambda (s)(car s)) buf_list))))
(setq count 0)
(foreach item rd_list
  (if (assoc "NB" item)
    (progn
    (setq buf_list (append buf_list (list item))
      str_list (append str_list (list (nth count string_list)))
      )
    )
    )
  (setq count (1+ count))
  )
(mapcar '(lambda (s rd)    
           (command "_.pline")
           (foreach str_item s
             (command
               (list
                 (atof
                   (substr
                     (substr str_item (+ 3 (vl-string-search "Y=" str_item)))
                     1
                     (vl-string-search
                       ","
                       (substr str_item (+ 3 (vl-string-search "Y=" str_item)))
                       ) ;_ end of VL-STRING-SEARCH
                     ) ;_ end of substr
                   ) ;_ end of atof
                 (atof
                   (substr
                     (substr str_item (+ 3 (vl-string-search "X=" str_item)))
                     1
                     (vl-string-search
                       ","
                       (substr str_item (+ 3 (vl-string-search "X=" str_item)))
                       ) ;_ end of VL-STRING-SEARCH
                     ) ;_ end of substr
                   ) ;_ end of atof
                 ) ;_ end of list
               ) ;_ end of command
             ) ;_ end of foreach
           (command "_close")
       (vlax-ldata-put (entlast) "TEST" rd)
       )
    str_list
    buf_list
    )
           ) ;_ end of foreach
         ) ;_ end of progn
       ) ;_ end of if
     ) ;_ end of if
  (vla-endundomark *kpblc-activedoc*)
  ) ;_ end of defun
(defun C:OD ( / rd el )
  (if (and
    (setq el (car(entsel "\nВыберите объект")))
        (setq rd (vlax-ldata-get el "TEST"))
    )
    (progn
      (princ "\n============== Объектные данные =================\n")
      (mapcar '(lambda (s)(terpri)(princ (car s))(princ "=")(princ (cadr s))) rd)
      (princ "\n============== Конец Объектные данные =================")
      (textscr)
      )
    (alert "Нет данных")
    )
  (princ)
  )
(princ "\nНаберите IP - вставка данных *.in4 \n         OD - просмотр объектных данных")
;|=======================================================================================
*    функция z-files-in-directory возвращает список файлов находящаяся в заданной
* директории
*    Автор : Зуенко Виталий (ZZZ)
*  Параметры:
*    directory  путь к папке например "D:\\Мои документы\\ZEF\\Lisp"
*    pattern    шаблон например "*.lsp" или список '("*.dwg" "*.dxf")
*    nested    искать в вложенных папках: t (да) или nil (нет)
* Пример вызова:
(z-files-in-directory "D:\\Мои документы\\ZEF\\Lisp" "*.lsp" t)
(z-files-in-directory "D:\\Мои документы\\ZEF\\Lisp" '("*.lsp" "*.fas") t)
=======================================================================================|;
(defun z-files-in-directory (directory pattern nested /)
  (if (not (listp pattern))
    (setq pattern (list pattern))
    ) ;_ if
  (if nested
    (apply
      'append
      (append
        (mapcar '(lambda (_pattern)
                   (mapcar '(lambda (f) (strcat directory "\\" f))
                           (vl-directory-files directory _pattern 1)
                           ) ;_ list
                   ) ;_ lambda
                pattern
                ) ;_ mapcar
        (mapcar
          '(lambda (d)
             (z-files-in-directory
               (strcat directory "\\" d)
               pattern
               nested
               ) ;_ z-files-in-directory
             ) ;_ lambda
          (vl-remove
            "."
            (vl-remove ".."
                       (vl-directory-files directory nil -1)
                       ) ;_ end of vl-remove
            ) ;_ vl-remove
          ) ;_ mapcar
        ) ;_ append
      ) ;_ append
    (apply
      'append
      (mapcar '(lambda (_pattern)
                 (mapcar '(lambda (f) (strcat directory "\\" f))
                         (vl-directory-files directory _pattern 1)
                         ) ;_ list
                 ) ;_ lambda
              pattern
              ) ;_ mapcar
      ) ;_ apply
    ) ;_ if
  ) ;_ defun

Re: Как из файла выбрать данные с координатами, соединить их линиями и повторить это для всей папки?

Похоже, работает...
жаль только, что контур рисуется в 3-х экземплярах и объектные данные не отображаются в окне Свойств... для их просмотра надо вводить OD в командную строку. А, из 27 колонок данных "нарисовались" только 2. Что значит "легко надергать"? Структура данных в разных работах, обычно, не совсем совпадает. Это значит, каждый раз придется .lsp корректировать?
А, запрос по данным как можно сделать?

Re: Как из файла выбрать данные с координатами, соединить их линиями и повторить это для всей папки?

> Ольга_@@@ (2006-05-23 19:44:26)
1.

жаль только, что контур рисуется в 3-х экземплярах

Не в 3-х. А контур и смежники. Опять же вопрос ТЗ. Никто ничего не озвучил по какому принципу чего рисовать.
2.

из 27 колонок данных "нарисовались" только 2

Вот это не понял. Рисуется контур, все данные в словаре.
3.

объектные данные не отображаются в окне Свойств

Это совсем другой уровень. Здесь нужен ObjectARX. И это будеь тянуть на коммерческий продукт.
Вот пример с одним контуром
Чтобы каждый раз не таскать кучу лиспов я разделил их

;======================= Сервисные ф-ции ================================
;;;Функция вызывает окно выбора папки
;;;Аргументы — нет
;;;Возвращаемое значение — путь к папке вида:
;;;disc:\\dir1\\....\\dirN
;;;Вызов (BrowseFolder)
(defun BrowseFolder ( / ShlObj Folder FldObj OutVal)
  (vl-load-com)
  (setq  ShlObj (vla-getInterfaceObject
          (vlax-get-acad-object)
       "Shell.Application")
    Folder (vlax-invoke-method ShlObj 'BrowseForFolder 0 "Укажите каталог с файлами *.in4" 0))
  (vlax-release-object ShlObj)
  (if Folder
    (progn (setq
  FldObj (vlax-get-property Folder 'Self)
  OutVal (vlax-get-property FldObj 'Path))
      (vlax-release-object Folder)
      (vlax-release-object FldObj)
      OutVal)))
;|
* Ф-ция str-str-lst
* Сервисная ф-ция извлечения из строки данных, разделенных
* каким либо символом или строкой символов
* Возвращает список строк
* Аргументы [Type]:
  str - строка для разбора [STRING]
  pat - разделитель [STRING]
* Читать подробнее https://www.caduser.ru/forum/topic25197.html
|;
(defun str-str-lst (str pat / i)
  (cond ((= str "") nil)
        ((setq i (vl-string-search pat str))
         (cons (substr str 1 i)
               (str-str-lst (substr str (+ (strlen pat) 1 i)) pat)
         ))
        (t (list str))))
;|=======================================================================================
*    функция z-files-in-directory возвращает список файлов находящаяся в заданной
* директории
*    Автор : Зуенко Виталий (ZZZ)
*  Параметры:
*    directory  путь к папке например "D:\\Мои документы\\ZEF\\Lisp"
*    pattern    шаблон например "*.lsp" или список '("*.dwg" "*.dxf")
*    nested    искать в вложенных папках: t (да) или nil (нет)
* Пример вызова:
(z-files-in-directory "D:\\Мои документы\\ZEF\\Lisp" "*.lsp" t)
(z-files-in-directory "D:\\Мои документы\\ZEF\\Lisp" '("*.lsp" "*.fas") t)
=======================================================================================|;
(defun z-files-in-directory (directory pattern nested /)
  (if (not (listp pattern))
    (setq pattern (list pattern)))
  (if nested
    (apply 'append
      (append
        (mapcar '(lambda (_pattern)
                   (mapcar '(lambda (f) (strcat directory "\\" f))
                           (vl-directory-files directory _pattern 1)))
                pattern
                ) ;_ mapcar
        (mapcar
          '(lambda (d)
             (z-files-in-directory
               (strcat directory "\\" d)
               pattern
               nested
               )) ;_ lambda
          (vl-remove
            "."
            (vl-remove ".."
                       (vl-directory-files directory nil -1)
                       ) ;_ end of vl-remove
            ))));_ append
    (apply
      'append
      (mapcar '(lambda (_pattern)
                 (mapcar '(lambda (f) (strcat directory "\\" f))
                         (vl-directory-files directory _pattern 1)
                         ) ;_ list
                 ) ;_ lambda
              pattern
              )))) ;_ defun
;======================= КОНЕЦ Сервисные ф-ции ================================
;======================= КОМАНДЫ ==============================================
(defun c:ip (/ dir_path files_list item string_list
         file_handle string str_list count rd_list buf_list)
  (vl-load-com)
  (setvar "EXTNAMES" 1)
  (if (not *kpblc-activedoc*)
    (setq *kpblc-activedoc* (vla-get-activedocument (vlax-get-acad-object))))
  (vla-startundomark *kpblc-activedoc*)
  (if (setq dir_path (BrowseFolder))
     (if (and (setq files_list (z-files-in-directory dir_path "*.in4" nil))
              (> (length files_list) 0)) ;_ end of and
       (progn
         (foreach item files_list
           (setq file_handle (open item "r")
                 string_list nil
            rd_list nil
            buf_list nil
                 ) ;_ end of setq
           (while (setq string (read-line file_handle))
             (setq str_list nil)
             (cond ((= (substr string 1 1) "#") nil)
               ((/= (substr string 1 2) "N=") ;_даннне типа AD=
            (setq buf_list (append buf_list (list string))))
           ((and (= (substr string 1 2) "N=")
              (vl-string-search "X=" string)
                      (vl-string-search "Y=" string))
            (setq str_list (append str_list (list string)))
            (while (and
                 (setq string (read-line file_handle))
                 (= (substr string 1 2) "N=")
                 (vl-string-search "X=" string)
                 (vl-string-search "Y=" string))
              (setq str_list (append str_list (list string))))
            (setq string_list (append string_list (list str_list))
              rd_list (append rd_list (list buf_list))
              buf_list (list string))))) ;_ end of while
       (close file_handle)
           ;; Теперь для данного файла получен список строк с координатами
           ;; точек
           ;; Надо в первую очередь создать слой. Имя слоя = имени файла (без
           ;; пути и
           ;; расширения)
       (if (snvalid (vl-filename-base item))
         (progn
               (vla-add (vla-get-layers *kpblc-activedoc*) (vl-filename-base item))
           (vla-put-activelayer
             *kpblc-activedoc*
             (vla-item (vla-get-layers *kpblc-activedoc*)
                       (vl-filename-base item)
                       ))))
(setq rd_list    
(mapcar
  '(lambda (r1)
     (mapcar
       '(lambda    (s)
      (mapcar '(lambda (s1) (vl-string-trim " " s1))
          (str-str-lst (vl-string-translate "\"," "  " s) "=")
      ))
       r1
     ))
  rd_list))
(setq buf_list (vl-remove-if 'null (mapcar '(lambda (r1 s1)(if (assoc "NB" r1) nil (list r1 s1))) rd_list string_list))
      str_list (list(cadar buf_list))
      buf_list (list(apply 'append (mapcar '(lambda (s)(car s)) buf_list))))
;;; Не читаем NB    
;;;(setq count 0)
;;;(foreach item rd_list
;;;  (if (assoc "NB" item)
;;;    (progn
;;;    (setq buf_list (append buf_list (list item))
;;;      str_list (append str_list (list (nth count string_list)))
;;;      )
;;;    )
;;;    )
;;;  (setq count (1+ count))
;;;  )
(mapcar '(lambda (s rd)    
           (command "_.pline")
           (foreach str_item s
             (command (list
        (atof
                   (substr
                     (substr str_item (+ 3 (vl-string-search "Y=" str_item)))
                     1
                     (vl-string-search
                       ","
                       (substr str_item (+ 3 (vl-string-search "Y=" str_item)))
                       )))
                 (atof
                   (substr
                     (substr str_item (+ 3 (vl-string-search "X=" str_item)))
                     1
                     (vl-string-search
                       ","
                       (substr str_item (+ 3 (vl-string-search "X=" str_item)))
                       )))
                 )) ;_ end of command
             ) ;_ end of foreach
           (command "_close")
       (vlax-ldata-put (entlast) "TEST" rd))
    str_list
    buf_list
    ))))
     ) ;_ end of if
  (vla-endundomark *kpblc-activedoc*)
  ) ;_ end of defun
(defun C:OD ( / rd el )
  (if (and
    (setq el (car(entsel "\nВыберите объект")))
        (setq rd (vlax-ldata-get el "TEST"))
    )
    (progn
      (princ "\n============== Объектные данные =================\n")
      (mapcar '(lambda (s)(terpri)(princ (car s))(princ "=")(princ (cadr s))) rd)
      (princ "\n============== Конец Объектные данные =================")
      (textscr)
      )
    (alert "Нет данных")
    )
  (princ)
  )
(princ "\nНаберите IP - вставка данных *.in4 \n         OD - просмотр объектных данных")

Re: Как из файла выбрать данные с координатами, соединить их линиями и повторить это для всей папки?

Что значит "легко надергать"? Структура данных в разных работах, обычно, не совсем совпадает. Это значит, каждый раз придется .lsp корректировать?

;|
*   Ф-ция получет данные из словаря
   rd - сисок словаря
   pat - список кодов пример ("SZ" "AB" "PB" "SC" "AD" "NM" "TX" "PF" "AU" "KZ" "CM" "KF" "PP" "PZ" "CV" "TD")
  получить rd можно выполнив лисп
    (setq el (car(entsel "\nВыберите объект")))
        (setq rd (vlax-ldata-get el "TEST"))
|;
(defun getod ( rd pat / str)
(apply
  'strcat
  (mapcar
    '(lambda (s) (strcat s ","))
    (mapcar '(lambda (s)
           (if (setq str (cadr (assoc (vl-string-trim " " s) rd)))
         str
         ""
           )
         )
        pat
    )))
  )
(defun C:GetOD ( / str od rd el pt1 pt2)
  (setq str (strcase (getstring "\nВведите коды данных через ,: ")))
    (if (and
    (setq el (car(entsel "\nВыберите объект")))
        (setq rd (vlax-ldata-get el "TEST"))
    )
    (progn
      (setq str (str-str-lst str ","))
      (setq od (getod rd str))
      )
    (alert "Нет данных")
    )
  (if (and od
       (setq pt1 (getpoint "\nУкажите первый угол MTEXT <выход>: "))
       )
    (progn
      (initget 1)
      (setq pt2 (getcorner pt1 "\nУкажите второй угол MTEXT: "))
      ;;;Высота 2    
      (command "_-mtext" pt1 "_H" 2 pt2 od "")
      (princ "\nДанные\n")(princ od)
      )
    )
  )

На запрос Введите коды данных через , вводишь название нужных тебе полей, например
SZ,AB,PB,SC,AD,NM,TX
или пример кнопки

^C^CGETOD;SZ,AB,PB,SC,AD,NM,TX,PF,AU,KZ,CM,KF,PP,PZ;

А, запрос по данным как можно сделать?

как выше или программно

    (if (and
    (setq el (car(entsel "\nВыберите объект")))
        (setq rd (vlax-ldata-get el "TEST"))
    )
    (progn
      (setq od (getod rd '("SZ" "AB" "PB" "SC" "AD" "NM")))
      ))

где "SZ" "AB" нужные тебе поля

Re: Как из файла выбрать данные с координатами, соединить их линиями и повторить это для всей папки?

Спасибо VVA, kpblc и ZZZ!
Уже собирался писать аналогичную программу по разбору in4-файлов на ObjectARX, но предварительно воспользовался поиском по форуму. Так что вы сэкономили мне время! :)