
[[DataExport_com]]
#### DataExport

:cmdcommand: DataExport

include::../../_elements/commandsummary.adoc[]


Команда экспорта параметров графических примитивов в внешний файл [.filepath]#CSV#. Команда применяет к всем примитивам
текущего чертежа фильтр типа примитивов, передавая на дальнейшую обработку только примитивы определенного
типа. Далее применяется фильтр свойств примитивов, оставляя только примитивы имеющие требуемве свойства.
Над прошедшими фильтрацию примитивами выполняется скрипт экспорта записывая требуемые параметры во внешний
файл +
При запуске подсказка командной строки принимает вид:
[graphviz, generated/cmdprompt_dataexport, svg]
----
digraph g {
node [shape=plaintext,height=.1];    
node0 [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
                <TR>
                    <TD>Configure export</TD>
                    <TD PORT="f0" BGCOLOR="gray">
                        <TABLE CELLPADDING="0" BORDER="0" CELLSPACING="0">
                            <TR>
                                <TD><FONT COLOR="red"><U>p</U></FONT>aram,</TD>
                            </TR>
                        </TABLE>
                    </TD>
                    <TD>run</TD>                               
                    <TD PORT="f1" BGCOLOR="gray">
                        <TABLE CELLPADDING="0" BORDER="0" CELLSPACING="0">
						    <TR>
							    <TD><FONT COLOR="red"><U>f</U></FONT>ile dialog</TD>
						    </TR>
                        </TABLE>                    
                    </TD>
                    
                    <TD> or enter file name (empty for default): &gt; (1)</TD>
                </TR>
            </TABLE>>]
node1 [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
                <TR>
                    <TD PORT="f0" BGCOLOR="gray">&lt;&lt;&lt;</TD>
                    <TD>Set</TD>
                    <TD PORT="f1" BGCOLOR="gray">
                        <TABLE CELLPADDING="0" BORDER="0" CELLSPACING="0">
                            <TR>
                                <TD><FONT COLOR="red"><U>e</U></FONT>ntities</TD>
                            </TR>
                        </TABLE>                    
                    </TD>
                    <TD>/</TD>
                    <TD PORT="f2" BGCOLOR="gray">
                        <TABLE CELLPADDING="0" BORDER="0" CELLSPACING="0">
                            <TR>
                                <TD><FONT COLOR="red"><U>p</U></FONT>roperties</TD>
                            </TR>
                        </TABLE>                    
                    </TD>
                    <TD>filter or export</TD>
                    <TD PORT="f3" BGCOLOR="gray">
                        <TABLE CELLPADDING="0" BORDER="0" CELLSPACING="0">
                            <TR>
                                <TD><FONT COLOR="red"><U>s</U></FONT>cript</TD>
                            </TR>
                        </TABLE>                    
                    </TD>
                </TR>
            </TABLE>>]
node2 [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
                           <TR>
                               <TD PORT="f0" BGCOLOR="gray">&lt;&lt;&lt;</TD>
                               <TD PORT="f1">Enter new entities filter: &gt; (2)</TD>
                            </TR>
              </TABLE>>]
node3 [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
                           <TR>
                               <TD PORT="f0" BGCOLOR="gray">&lt;&lt;&lt;</TD>
                               <TD PORT="f1">Enter new properties filter: &gt; (3)</TD>
                            </TR>
              </TABLE>>]
node4 [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
                           <TR>
                               <TD PORT="f0" BGCOLOR="gray">&lt;&lt;&lt;</TD>
                               <TD PORT="f1">Enter new export script: &gt; (4)</TD>
                            </TR>
              </TABLE>>]
node5 [label = "File select dialog (5)" shape=record];
"node0":f0 -> "node1"
"node0":f1 -> "node5":f0
"node1":f1 -> "node2":f1
"node1":f2 -> "node3":f1
"node1":f3 -> "node4":f1
}
----

Что позволяет выполнить в командной строке следующие действия:


.1. Задать имя файла с экспортируемыми значениями
Ожидание ввода имени файла или пустой строки. Можно ввести имя файла, введенное значение будет использовано
в дальнейшем как файл по умолчанию. Пустой ввод не изменяет текущее значение файла по умолчанию. После ввода
значения экспорт будет выполнен и команда завершится

.2. Задать фильтр примитивов
Ожидание ввода значения фильтра примитивов по типу. см. <<enttypefilter_lng>>

.3. Задать фильтр свойств примитивов
Ожидание ввода значения фильтра примитивов по параметрам. см. <<entpropfilter_lng>>

.4. Задать скрипт экспорта
Ожидание ввода скрипта выполняющего экспорт. см. <<exporter_lng>>

.5. Задать имя файла в диалоговом режиме
Откроет диалог выбора файла, можно выбрать любой файл csv. Выбор файла сделает его файлом
по умолчанию и также как (1) выполнит экспорт и завершит команду

Также все это можно сделать с помощью инспектора объектов, который при выполнении команды имеет вид:

.Опции команды DataExport
image::cmd_params_dataexport.png[width=25%,pdfwidth=25%]

[[enttypefilter_lng]]
##### Формат фильтра по типам примитивов
Данный фильтр позволяет включить в набор или исключить из набора для экспорта определенные типы примитивов.
Включать\исключать примитивы можно как по имени, так и по маске. изначально в набор для обработки не включены
никакие примитивы. Для добавления тип примитива должен быть добавлен и не должен быть исключен. Фильтр
задается в текстовом виде и в общем случае выглядит так:
[source]
----
Оператор(Операнд)[;Оператор(Операнд)]
----
Операторы могут разделяться точкой с запятой, запятой, пробелом, переводом строки. Доступны следующие
операторы:
[cols=">4a,<6"]
|======================================================
|
[source]
----
IncludeEntityMask('Mask*')
----|Включить типы примитивов по маске
|
[source]
----
IncludeEntityName('Name')
----|Включить тип примитивов по имени
|
[source]
----
ExcludeEntityMask('Mask*')
----|Исключить типы примитивов по маске
|
[source]
----
ExcludeEntityMask('Name')
----|Исключить тип примитивов по имени
|======================================================
Все операторы в качестве операнда принимают строковой параметр заключенный в апострофы. +
###### Примеры фильтров примитивов: +
Включить в экспорт примитивы [.ent]#Cable# и [.ent]#Device#:
[source]
----
IncludeEntityName('Cable');
IncludeEntityName('Device')
----
Включить в экспорт все типы примитивов:
[source]
----
IncludeEntityMask('*')
----
Включить в экспорт примитивы [.ent]#PolyLine# и [.ent]#Line#:
[source]
----
IncludeEntityName('*Line') ExcludeEntityName('3DPolyLine')
----
[[entpropfilter_lng]]
##### Формат фильтра по свойствам примитивов
Данный фильтр применяется последовательно к каждому примитиву прошедшему фильтрацию по типу. Фильтр
задается в текстовом виде и в общем случае выглядит так:
[source]
----
Оператор(Операнд[,Операнд])[;Оператор(Операнд[,Операнд])]
----
Операторы могут разделяться точкой с запятой, запятой, пробелом, переводом строки. Доступны следующие
операторы:
[cols=">4a,<6"]
|======================================================
|
[source]
----
IncludeIfMask(Операнд,'Маска*')
----|Включить примитив в результат если операнд соответствует маске
|
[source]
----
IncludeIfSame(Условие)
----| Включить примитив в результат в случае выполнения условия
|======================================================
Условный операторы пока доступен только один:
[cols=">4a,<6"]
|======================================================
|
[source]
----
SameMask(Операнд1,'Маска')
----| Условие считается выполненным если текстовое значение операнда1 соответствует маске
|
[source]
----
Or(Условие1,Условие2)
----| Объединение условий 1 и 2 по закону ИЛИ
|======================================================
Доступные типы операндов:
[cols=">4a,<6"]
|======================================================
|
[source]
----
'Строка'
----| Строковой параметр - любой текст заключенный в апострофы
|
[source]
----
%%('ИмяПараметра')
----| Возвращает значение параметра текущего примитива в виде строки
|======================================================
Имена параметров для разных примитивов могут отличатся, в общем случае это параметры
доступные в инспекторе объектов для данного типа примитивов, в случае отсутствия у примитива данного параметра
возвращается пустая строка. Примерный перечень доступных параметров смотри в
https://github.com/zamtmn/zcad/blob/master/cad_source/zcad/gui/odjectinspector/uzcoiregistermultiproperties.pas +
###### Примеры фильтров по свойствам примитивов: +
Включить в результат только примитивы типа кабель, или примитивы с параметром 'Name' удовлетворяющим маске
'CABLE_*' (это  блоки\устройства, т.к. только у них есть имя)
[source]
----
IncludeIfSame(
              Or(SameMask(%%('Name'),'CABLE_*'),
              SameMask(%%('EntityName'),'Cable'))
             )
----
Включить в результат только примитивы с параметром 'Name' удовлетворяющим маске 'EL_CABLE_*' (это
блоки\устройства, т.к. только у них есть имя)
[source]
----
IncludeIfMask(%%('Name'),'EL_CABLE_*')
----
[[exporter_lng]]
##### Формат скрипта экспорта
Данный скрипт применяется последовательно к каждому примитиву прошедшему фильтрацию предыдущими двумя. Скрипт
задается в текстовом виде и в общем случае выглядит так:
[source]
----
Оператор(Операнд[,Операнд])[;Оператор(Операнд[,Операнд])]
----
Операторы могут разделяться точкой с запятой, запятой, пробелом, переводом строки. Доступны следующие
операторы:
[cols=">4a,<6"]
|======================================================
|
[source]
----
Export(Операнд1[,Операнд2, ...])
----| записать строку операндов c разделителями в новую строку файла csv
|
[source]
----
DoIf(Условие,Оператор)
----|Выполнить оператор в случае выполнения условия
|======================================================

Условный операторы пока доступен только один:
[cols=">4a,<6"]
|======================================================
|
[source]
----
SameMask(Операнд1,'Маска')
----| Условие считается выполненным если текстовое значение операнда1 соответствует маске
|======================================================

Доступные типы операндов:
[cols=">4a,<6"]
|======================================================
|
[source]
----
'Строка'
----| Строковой параметр - любой текст заключенный в апострофы
|
[source]
----
%%('ИмяПараметра')
----| Возвращает значение параметра текущего примитива в виде строки
|
[source]
----
@@('ИмяПеременной')
----| Возвращает значение переменной текущего примитива в виде строки
|======================================================
Имена переменных могут быть любыми, в случае отсутствия у примитива данной переменной возвращается значение
`'!!ERR(ИмяПеременной)!!'`. Имена параметров для разных примитивов могут отличатся, в общем случае это параметры
доступные в инспекторе объектов для данного типа примитивов, в случае отсутствия у примитива данного параметра
возвращается пустая строка. Примерный перечень доступных параметров смотри в
https://github.com/zamtmn/zcad/blob/master/cad_source/zcad/gui/odjectinspector/uzcoiregistermultiproperties.pas

###### Примеры скриптов экспорта: +
Если текущий примитив устройство, записываем в csv строку 'Device','NMO_Name',Значение переменной NMO_Name,'Position',Значение переменной Position
[source]
----
DoIf(
     SameMask(%%('EntityName'),'Device'),
     Export(%%('EntityName'),'NMO_Name',@@('NMO_Name'),'Position',@@('Position'))
     )
----
Если текущий примитив устройство, записываем в csv строку 'Device','NMO_Name',Значение переменной NMO_Name,'Power',Значение переменной Power
[source]
----
DoIf(
     SameMask(%%('EntityName'),'Device'),
     Export(%%('EntityName'),'NMO_Name',@@('NMO_Name'),'Power',@@('Power'))
     )
----
Если текущий примитив кабель, записываем в csv строку 'Cable','NMO_Name',Значение переменной NMO_Name,'AmountD',Значение переменной AmountD
[source]
----
DoIf(
     SameMask(%%('EntityName'),'Cable'),
     Export(%%('EntityName'),'NMO_Name',@@('NMO_Name'),'AmountD',@@('AmountD'))
     )
----
Если текущий примитив кабель, записываем в csv строку 'Cable','NMO_Name',Значение переменной NMO_Name,'CABLE_Segment',Значение переменной CABLE_Segment
[source]
----
DoIf(SameMask(%%('EntityName'),'Cable'),
     Export(%%('EntityName'),
            'NMO_Name',@@('NMO_Name'),
            'CABLE_Segment',@@('CABLE_Segment'))
     )
----
include::commandsummaryfree.adoc[]