Создание слоев на основе txt-файла

Иногда встречаются ситуации, в которых необходимо быстро и абсолютно точно создать несколько десятков / сотен / тысяч слоев с заданными заранее установками. Настройки хранятся в файле txt либо csv, разделитель полей - символ табуляции или ";".
Если первый символ строки ";", то строка исключается из обработки (комментарий).
Пример содержимого файла:

1
ИмяСлоя 1 1 1 2 hidden By Default None 1 0
1
2
Последовательность данных: Имя|Исключен|Исключен|Исключен|Цвет|Тип линии|Вес линии|Исключен|Печатается|
Остальные столбцы исключаются

Логическое поле "Печатается" может содержать 0 (переводится как false, т.е. непечатаемое); любое другое значение переводится как true.
Цвет слоя может быть только числовым от 1 до 255.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
(defun c:create-layer-by-file (/              *error*        _kpblc-conv-string-to-list    file
                               handle         adoc           str            lst            layer
                               answer
                               )

                              ;|
*   Функция создания слоев в текущем файле по файлу-описанию.
*   Файл описания должен быть в формате csv или txt, кодировка Windows
* (никаких UTF)
*   В качестве разделителя столбцов допускается применение знаков
* табуляции или символа ";"
*   Если первым символов в файле описания используется символ ";",
* то строка исключается из обработки и рассматривается как комментарий
*   Структура столбцов определена изначально и для ее модификации потребуется
* менять код.
*    Столбцы (для удобства восприятия показаны вертикально, после ; указаны
* возможные варианты данных
<ИмяСлоя>          ; Имя создаваемого слоя. Должно отвечать требованиям AutoCAD
; создания слоев. Строка, обрамления символами " (двойные
; кавычки) не выполнять
<Разделитель>
<Исключен>        ; Любые данные. Если поставить подряд 2 символа разделителя,
; то ничего страшного не будет
<Разделитель>
<Исключен>        ; То же
<Разделитель>
<Исключен>        ; То же
<Разделитель>
<Цвет>            ; Цвет слоя. Целое число из диапазона 1..255
<Разделитель>
<Тип линии>        ; Тип линии слоя. Если не указано, принимается Непрерывный
; (Continuous). Если тип линии не загружен, применяется
; Непрерывный (Continuous). Не учитывает варианты локализации
<Разделитель>
<Вес линии>        ; Вес линии слоя. Допускается применение строки с символами
; def (т.е. "по умолчанию") либо чисел. 0,25 мм -> указывать
; 25
<Разделитель>
<Исключен>
<Разделитель>
<Печатается>      ; Число. "0" -> слой не печатается. Любое другое значение -
; слой печатается. При пропущенном значении приравнивается
; к "0".
Остальные столбцы исключаются из обработки
*    Вариант вызова:
create-layer-by-file
|;


  (defun _kpblc-conv-string-to-list (string separator / i)
                                    ;|
*    Функция разбора строки. Возвращает список либо точечную пару.
*    Параметры вызова:
*  string    разбираемая строка
*  separator  символ, используемый в качестве разделителя частей
*    Примеры вызова:
(_kpblc-conv-string-to-list "1;2;3;4;5;6" ";")  ;'(1 2 3 4 5 6)
(_kpblc-conv-string-to-list "1;2" ";")    ;'(1 2)
*    За основу взяты уроки Евгения Елпанова по рекурсиям
|;

    (cond
      ((= string "") nil)
      ((setq i (vl-string-search separator string))
       (cons (substr string 1 i)
             (_kpblc-conv-string-to-list
               (substr string (+ (strlen separator) 1 i))
               separator
               ) ;_ end of _kpblc-conv-string-to-list
             ) ;_ end of cons
       )
      (t (list string))
      ) ;_ end of cond
    ) ;_ end of defun

  (defun *error* (msg)
    ;; Локальный обработчик ошибок
    (vl-catch-all-apply
      (function
        (lambda ()
          (close handle)
          ) ;_ end of lambda
        ) ;_ end of function
      ) ;_ end of vl-catch-all-apply
    (if adoc
      (vla-endundomark adoc)
      ) ;_ end of if
    (princ msg)
    (princ)
    ) ;_ end of defun

  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-startundomark
  (if (and (setq file (getfiled "Файл txt или csv с описанием слоев" "" "" 2))
           (wcmatch (strcase (vl-filename-extension file)) "*CSV,*TXT")
           ) ;_ end of and
    (progn
      (setq answer ((lambda ()
                      (initget "Да Нет Yes No _ Y N Y N")
                      (cond
                        ((getkword
                           "\nПри наличии слоя выполнять его настройку по стандарту [Да/Нет] <Да> : "
                           ) ;_ end of getkword
                         )
                        (t "Y")
                        ) ;_ end of cond
                      ) ;_ end of LAMBDA
                    )
            handle (open file "r")
            ) ;_ end of setq
      (while (setq str (read-line handle))
        (setq lst (cons str lst))
        ) ;_ end of while
      (close handle)
      (setq lst
             (mapcar
               (function
                 (lambda (x)
                   (list
                     (cons "name" (nth 0 x))
                     (cons "color" (read (nth 4 x)))
                     (cons "linetype"
                           (cond ((nth 5 x))
                                 (t "Continuous")
                                 ) ;_ end of cond
                           ) ;_ end of cons
                     (cons "lineweight"
                           (cond
                             ((wcmatch (strcase (nth 6 x)) "*DEFA*")
                              aclnwtbylwdefault
                              )
                             (t (read (nth 6 x)))
                             ) ;_ end of cond
                           ) ;_ end of cons
                     (cons "plottable"
                           (if (or (not (nth 8 x))
                                   (= (nth 8 x) "0")
                                   ) ;_ end of Or
                             :vlax-false
                             :vlax-true
                             ) ;_ end of if
                           ) ;_ end of cons
                     ) ;_ end of list
                   ) ;_ end of lambda
                 ) ;_ end of function
               (mapcar
                 (function
                   (lambda (x)
                     (apply
                       (function append)
                       (mapcar
                         (function (lambda (a) (_kpblc-conv-string-to-list a ";"))
                                   ) ;_ end of function
                         x
                         ) ;_ end of mapcar
                       ) ;_ end of apply
                     ) ;_ end of lambda
                   ) ;_ end of function
                 (mapcar
                   (function
                     (lambda (x)
                       (_kpblc-conv-string-to-list x "\t")
                       ) ;_ end of lambda
                     ) ;_ end of function
                   (vl-remove-if
                     (function
                       (lambda (x)
                         (wcmatch x ";*")
                         ) ;_ end of lambda
                       ) ;_ end of function
                     (reverse lst)
                     ) ;_ end of vl-remove-if
                   ) ;_ end of mapcar
                 ) ;_ end of mapcar
               ) ;_ end of mapcar
            ) ;_ end of setq
      (foreach item lst
        (if (= (type
                 (setq layer
                        (vl-catch-all-apply
                          (function
                            (lambda ()
                              (vla-item
                                (vla-get-layers adoc)
                                (cdr (assoc "name" item))
                                ) ;_ end of vla-item
                              ) ;_ end of lambda
                            ) ;_ end of function
                          ) ;_ end of vl-catch-all-apply
                       ) ;_ end of setq
                 ) ;_ end of type
               'vla-object
               ) ;_ end of =
          (if (= answer "Y")
            (foreach prop (cdr item)
              (vl-catch-all-apply
                (function
                  (lambda ()
                    (vlax-put-property layer (car prop) (cdr prop))
                    ) ;_ end of lambda
                  ) ;_ end of function
                ) ;_ end of vl-catch-all-apply
              ) ;_ end of foreach
            ) ;_ end of if
          (vl-catch-all-apply
            (function
              (lambda ()
                (setq layer (vla-add (vla-get-layers adoc)
                                     (cdr (assoc "name" item))
                                     ) ;_ end of vla-add
                      ) ;_ end of setq
                (foreach prop (cdr item)
                  (vl-catch-all-apply
                    (function
                      (lambda ()
                        (vlax-put-property layer (car prop) (cdr prop))
                        ) ;_ end of lambda
                      ) ;_ end of function
                    ) ;_ end of vl-catch-all-apply
                  ) ;_ end of foreach
                ) ;_ end of lambda
              ) ;_ end of function
            ) ;_ end of vl-catch-all-apply
          ) ;_ end of if
        ) ;_ end of foreach
      ) ;_ end of progn
    ;; Выводим сообщение об ошибке в ком.строку, если вообще был выбран файл
    (if file
      (princ (strcat "\nУ выбранного файла недопустимое расширение"))
      ) ;_ end of if
    ) ;_ end of if
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun

lsp-файл
Образец файла для создания слоев:

1
2
3
4
5
Слой1;;;;12;Continuous;25;;1
Слой2;;;;10;Continuous;25;;0
Слой3;;;;14;Continuous;25;;1
Слой4;;;;25;Continuous;25;;0
Слой5;;;;16;Continuous;25;;0

Размещено в Новости · Метки:



Комментарии

Есть 7 коммент. к “Создание слоев на основе txt-файла”
  1. Александр пишет:

    Эх, вот если бы к этому прикрутить функцию загрузки типа линии, то был бы шедевр!!!

  2. Можно, конечно... На caduser'e взять готовую программку и ее подключить. Но не сейчас.

  3. Александр пишет:

    Саму функцию (твою, кстати) найти не проблема, вопрос с подключением, не совсем я уверен в своих силах. Так что если будет свободное время и ты не найдешь лучшего способа его потратить, то моя благодарность не будет иметь границ (в разумных пределах).

  4. Александр пишет:

    Хотя вроде получилось, и даже работает, и даже так как надо!
    Еще раз спасибо за код!

  5. Да не за что (особенно учитывая, что я ничего не делал ;))

Поделитесь своим мнением


Я не робот.