
### Интерфейс пользователя
#### Общий обзор

Интерфейс программы по умолчанию представлен на скриншоте:

[[zcad_ui]]
.Внешний вид окна программы
image::zcad_ui.png[width=50%,pdfwidth=50%]

Можно выделить следующие основные элементы:


.1. Окно отображения
Тут производится отображение и редактирование графической информации.

Навигация по чертежу осуществляется мышкой. Масштабировать чертеж можно вращая колесо мыши, если при этом нажать и удерживать клавишу kbd:[Shift] коэффициент масштабирования будет меньше и точки временных привязок не будут сброшены. Панарамировать чертеж можно двигая мышь с нажатой средней кнопкой. Если при панарамировании удерживать клавишу kbd:[Ctrl], будет осуществляться вращение камеры. Также для навигации доступны некоторые сочетания клавиш !!NEEDLINK!!

Редактирование чертежа также производится курсором мыши, при этом его форма зависит от ожидаемого действия: `перекрестие` - указание точки на чертеже, `прямоугольник` - выбор графического примитива. Комбинация прямоугольника и перекрестия - можно как выбрать примитив, так и указать точку на чертеже.

Программа позволяет выбирать примитивы несколькими способами:

.. кликнув прямоугольником по примитиву - примитив будет добавлен к текущему набору выбора

.. рамкой выбора - при клике по пустой области чертежа начинает чертиться прямоугольная рамка выбора, при следующем клике построение рамки будет закончено. Рамка начерченная слева на прово называется `прямой` и рисуется сплошными линиями с синей заливкой, справа на лево - называется `обратной` и рисуется пунктирными линиями с зеленой заливкой. По завершению процедуры будут выбраны все примитивы полностью попавшие в прямую рамку или хотя бы частично попавшие в обратную рамку. При черчении рамки чертеж можно масштабировать и панарамировать, если начальная точка при этом выйдет за границы экрана, рамка будет подрезана по экрану. Данное поведение можно изменить нажав и удерживая клавишу `control` перед указанием второй точки рамки. О наличии и отсутствии подрезки можно судить по диагональным линиям рисуемой рамки.

.Варианты рамок выбора
image::zcad_ui_selectframes.png[width=75%,pdfwidth=75%]

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

На рис. <<zcad_ui>> в инспекторе отображаются настройки программы. Если в области отображения выделить несколько примитивов, инспектор примет примерно следующий вид:

.Свойства выделенных примитивов
image::zcad_ui_objectinspector.png[width=25%,pdfwidth=25%]

Имена свойств доступных только для чтения отображаются серым цветом. Если выделенные примитивы имеют различные значения одноименных свойств, данные значения отображаются как "Разный".  Если данные значения фактически отличаются, но из за настроек отображения !!NEEDLINK!! (округления) выглядят одинаково, данные значения помечаются знаком "≈".

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

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

[plantuml, generated/object_inspector_structure, svg]
----
!include styles/defaulttree-style.iuml
legend
Инспектор
|_ Обрабатывать_примитивы
|_ Обработка_переменных
|_ Связанные переменные
  |_ Переменные связанных примитивов
|_ Переменные
  |_ Свои переменные
|_ Расширения
  |_ Свойства расширений примитивов
|_ Общие
  |_ Основные свойства примитивов
|_ Геометрия
  |_ Геометрические свойства примитивов
|_ Разное
  |_ Не геометрические свойства примитивов
|_ Суммарно
  |_ FILTER
    |_ Свойства_для_фильтрации
  |_ Просуммированные свойства
end legend
----

.. `Обрабатывать примитивы` - тут можно выбрать тип примитивов свойства которых отображаются в инспекторе, а нажатием кнопок `[*]` или `[-]` оставить только примитивы данного типа в текущем выборе или исключить их из текущего выбора

.. `Обработка переменных` - Управляет способом оотображения набора переменных примитива (см. <<extdrVariables>> и <<centralization>>) . `Выбранный примитив` - только переменные выбранных примитивов; `Связанные примитивы` - только переменные связанных примитивов; `Все примитивы` - обрабатываются переменные и примитивов из текущего выбора и связанных с ними примитивов, все переменные отображаются на одной вкладке; `Все примитивы раздельно` - обрабатываются переменные и примитивов из текущего выбора и связанных с ними примитивов, переменные отображаются на разных вкладках;

.. `Связанные переменные` - на этом уровне структуры будут отображены переменные связанных примитивов, при с значением Process Обработка_переменных=`Все примитивы раздельно`

.. `Переменные` - на этом уровне структуры будут отображены все доступные в соответствии с значением Process variables переменные. При отображении переменных свзанных примитивов возможна цветовая раскраска значений !!NEEDLINK!!

.. `Общие` - тут перечислены общие свойства примитивов: слой, цвет, вес и т.п.

.. `Расширения` - если к выделенным примитивам добавлены расширения, их свойства отображаются здесь.

.. `Геометрия` - различные геометрические свойства: точки вставки, координаты, длины и т.п.

.. `Суммарно` - некоторые свойства допускающие суммирование, например при выборе нескольких отрезков тут будет их суммарная длина. Здесь же в ветке `FILTER` будут некоторые свойства допускающие фильтрацию, например можно кнопкой `[*]` оставить в текущем выборе только примитивы лежащие на определенном слое.


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

.4. Командная строка
Тут можно ввести имя команды, тем самым запустив ее, либо ввести координату точки на запрос уже выполняемой команды.

Поле ввода имеет подсказку меняющуюся по текущей ситуации. Когда программа ожидает ввода команды подсказка имеет вид `Команда>` и `>` когда ожидается координата. Также некоторые команды имеют контекстную подсказку, в которой можно выбрать мышью опции команды

Перечень доступных команд приведен в <<command_list>> команда может быть введена как просто по имени, так с операндом. Операнд указывается в скобках после имени команды. Например ввод `Load` вызовет диалог открытия файла чертежа и последующую его загрузку. Ввод `Load(D:\file.dxf)` сразу вызовет загрузку файла `D:\file.dxf`. Парсинг операндов выполняется силами команды, поэтому синтаксис в разных командах отличается.

Координаты можно вводить как 2D, так и 3D, при этом 2D будут переведены в 3D подстановкой 0 в качестве координаты Z. Также можно вводить как абсолютные, так и относительные (относительно последней указанной точки) значения. Относительные координаты задаются указанием знака `@` перед координатой X. Если включен режим трассировки !!NEEDLINK!! и имеется привязка к оси трассировки, можно указать точку введя расстояние от точки трассировки, отложенное по оси трассировки.


Например если в открытом чертеже на запрос `Команда>` ввести `Line`, затем `10,30`, затем `@1,2` будет построена линия с координатами (10,30)-(11,32)

Командная строка может быть отключена. !!NEEDLINK!! В режиме с выключенной командной строкой становятся доступны буквенные сочетания клавиш - с включенной нажатия букв обрабатываются командной строкой


.5. Статусная строка.
Здесь отображаются координаты курсора и прогрессбары долгих процессов. Также есть быстрый доступ к кнопкам переключения различных режимов работы программы !!NEEDLINK!!

.6. Панели инструментов
Здесь сгруппированы иконки различных команд для их быстрого запуска. !!NEEDLINK!!

.7. Палитры
Могут отображаться в древовидном виде и в виде списка иконок. К каждому листу дерева или иконке списка может быть привязана произвольная команда, запускаемая при клике по элементу. Как правило это команды вставки устройств или блоков. Древовидные палитры дополнительно оснащены полем фильтра для быстрого нахождения элементов !!NEEDLINK!!

.8. Навигаторы
Навигаторы служат для быстрой навигации по чертежу, нахождению на нем тех или иных элементов. Представляют из себя настраиваимую древовидную структуру отображения данных. На данный момент в программе доступны навигаторы устройств, кабелей, стояков и примитивов !!NEEDLINK!!

[[anchordocking]]
#### AnchorDocking
ZCAD в своей работе использует библиотеку `AnchorDocking` !!NEEDLINK!! данная библиотека позволяет склеить (пристыковывать) различные окна в одно. На <<zcad_ui>> 1,2,3,7,8 являются отдельными окнами склеенными в одно окно. Пустое окно программы выглядит следующим образом:

.Пустое окно программы
image::zcad_empty_ui.png[width=50%,pdfwidth=50%]

По периметру окна расположены области для пристыковки панелей инструментов, в центре область пристыковки окон.

##### Панели инструментов

Включить панель инструментов можно командой `ShowToolBar` передав ей в качестве операнда имя панели инструментов (или в меню `Вид/Показать окно/Панели инструментов`). Например включаем панель `View`, по умолчанию она отображается в непристыкованном состоянии:

.Панель инструментов
image::zcad_empty_ui_with_toolbar.png[width=25%,pdfwidth=25%]

Для пристыковки панели начинаем ее перетаскивать за свободное место (не за заголовок!), при этом будет подсвечиваться предпологаемое новое место расположения панели. При подведении мышки к краю окна будет подсвечена область вдоль края, при отпускании кнопки мыши панель инструментов будет пристыкована
.Стыковка панели инструментов
[cols="1,a,a", hrows=1]
|====
|Действие |Процесс |Результат

|Стыковка панели инструментов|image::zcad_empty_ui_drag_toolbar.png[]|image::zcad_empty_ui_docked_toolbar.png[]
|====


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

##### Окна

Включить окно программы можно командой `Show` передав ей в качестве операнда имя окна (или в меню `Вид/Показать окно`). Например включаем окно `ObjectInspector`, по умолчанию окно отображается в неприствкованном состоянии:

.Не пристыкованное окно инспектора объектов
image::zcad_empty_ui_with_objectinspector.png[width=25%,pdfwidth=25%]

Не пристыкованные окна программы имеют два заголовка - стандартный и нестандартный. За стандартный окна можно только перемещать, за нестандартный - перемещать и пристыковывать. Стыковка окон осуществляется перетаскиванием окна на желаемое место стыковки, при этом область стыковки будет подсвечена.

.Варианты стыковки окон программы
[cols="1,a,a", hrows=1]
|====
|Действие |Процесс |Результат

|Стыковка первого окна|image::zcad_empty_ui_try_dock_oi.png[]|image::zcad_empty_ui_dock_oi.png[]
|Стыковка следующего окна справа от первого|image::zcad_empty_ui_try_dock_second.png[]|image::zcad_empty_ui_dock_second.png[]
|Стыковка следующего окна поверх второго|image::zcad_empty_ui_try_dock_third.png[]|image::zcad_empty_ui_dock_third.png[]
|====

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

В заголовке пристыкованных окон появляется дополнительная кнопка минимизации, которая позволяет свернуть окно в тонкий заголовок и разворачивать его при наведении мыши

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

Сохранить раскладку окон и тулбаров можно командой `SaveLayout` или в меню `настройка\Сохранить разбивку окон по умолчанию`

#### Навигаторы

Отдельно стоит рассмотреть элемент интерфейса - навигаторы. Навигатор представляет из себя полностью настраиваемую
древовидную структуру отображающую определенные свойства определенных примитивов чертежа. Каждая строка в
структуре навигатора - отдельный примитив. На данный момент доступны навигаторы устройств, кабелей и стояков

.Навигатор устройств
image::zcad_ui_navigator.png[width=25%,pdfwidth=25%]

Настройка навигатора производится следующим образом:

.Органы управления навигатора
image::zcad_ui_navigator_prepare.png[width=25%,pdfwidth=25%]

[[treeprop_lng]]
.1. Кнопка настройки ветвлений древовидной структуры
Вызывает редактор описания ветвлений древовидной структуры навигатора, либо открывает меню действий с навигатором при нажатии
на стрелку

.2. Кнопка главной функции
Включает-выключает использование в навигаторе "Главной функции" (Централизация)

.3. Кнопка редактора фильтра примитивов по типу
Вызывает редактор скрипта фильтрации по типу примитивов см.<<enttypefilter_lng>>

.4. Кнопка редактора фильтра примитивов по свойствам
Вызывает редактор скрипта фильтрации по свойствам примитивов см.<<entpropfilter_lng>>

.5. Кнопка редактора скрипта настройки отображения дерева
Вызывает редактор скрипта настройки отображения дерева. Ветвление дерева зависит от (<<treeprop_lng>>),
в данном скрипте настраивается например количество столбцов и их заполнение. Данный скрипт выполняется
при создании навигатора, при изменении скрипта выполняется пересоздание навигатора для применения изменений
В общем случае скрипт выглядит так:
[source]
----
Оператор(Операнд[,Операнд,Операнд ...])
----
Доступные типы операндов:
[cols=">4a,<6"]
|======================================================
|
[source]
----
'Строка'
----|Строковой параметр - любой текст заключенный в апострофы
|
[source]
----
Целое положительное число
----|
|======================================================
Операторы могут разделяться точкой с запятой, запятой, пробелом, переводом строки. Доступны следующие
операторы:
[cols=">4a,<6"]
|======================================================
|
[source]
----
SetColumnsCount(Операнд1,Операнд2)
----|Задает количество столбцов в навигаторе, должна присутствовать 1 раз в начале скрипта +
`Операнд1` - Целое положительное число. Количество столбцов в навигаторе +
`Операнд2` - Целое положительное число. Номер столбца чья ширина будет рассчитываться автоматически (нумерация с 0) +
|
[source]
----
SetColumnParams(Операнд1,Операнд2,Операнд3,Операнд4,Операнд5)
----|Задает параметры столбцов, должна присутствовать для каждого столбца +
`Операнд1` - Целое положительное число. Номер столбца для которого задатются параметры (нумерация с 0) +
`Операнд2` - Строка. Название столбца +
`Операнд3` - Строка. Содержимое столбца +
`Операнд4` - Строка. Имя переменной в которой сохраняется ширина столбца (в файле `rtl\savedvar.pas`) между сессиями работы. Если
переменной пока нет нет, она будет создана с начальным значением 50 +
`Операнд5` - Целое положительное число. Пока не используется
|======================================================
Примеры скриптов экспорта: +
Два столбца Tree и Comment, содержимое переменной NMO_Name примитива в первом и статичная надпись 'Тут что то тоже надо сделать' во втором +
[source]
----
SetColumnsCount(2,0);
SetColumnParams(0,'Tree','@@[NMO_Name]','tmpGUIParamSave_NavDev_C0',1);
SetColumnParams(1,'Comment','Тут что то тоже надо сделать','tmpGUIParamSave_NavDev_C1',1)
----
Три столбца Tree Elevation и Text, с содержимым переменных RiserName, Elevation и Text примитивов +
[source]
----
SetColumnsCount(3,0);
SetColumnParams(0,'Tree','@@[RiserName]','tmpGUIParamSave_NavRis_C0',1);
SetColumnParams(1,'Elevation','@@[Elevation]','tmpGUIParamSave_NavRis_C1',1);
SetColumnParams(2,'Text','@@[Text]','tmpGUIParamSave_NavRis_C2',1)
----

.6. Кнопка обновления
Вызывает перестроение дерева в навигаторе. Обычно при изменениях на чертеже навигаторы обновляются
автоматически, но могут быть ситуации когда требуется в ручную вызвать обновление навигатора

.7. Кнопки управления ветвлением
Количество и название кнопок зависит от (<<treeprop_lng>>) нажатое или отжатое состояние показывает
включен или нет данный узел в текущий момент. Узлы можно включать\выключать.

.8. Сохранение текущих настроек навигатора в файл
Открывает окно выбора файла

.9. Загрузка настроек навигатора из файл
Открывает окно выбора файла

.10. Подменю выбора вариантов настроек навигатора
Подменю выбора заранее подготовленных вариантов настроек навигатора. Для того чтобы вариант появился в данном подменю
настройку необходимо сохранить в папку $(ZCADPath)/configs

.11. Быстрый фильтр содержимого навигатора
Поле ввода для быстрой фильтрации содержимого инспектора по тексту. 5Допускает применение символов ? и *
