\chapter{Исполнитель Чертежник}

\section{Введение}

\subsection{Общие сведения}

Исполнитель \emph{Чертежник} предназначен для построения рисунков, чертежей, графиков и т.~д. на бесконечном во все стороны листе, ниже этот лист называется  \emph{чертежным \mbox{листом}}. На чертежном листе  задана прямоугольная система координат, единицу измерения в этой системе координат будем называть \emph{единицей Чертежника} (сокращенно – е.~ч.).

Чертежник имеет перо, которое может подниматься, опускаться и перемещаться при выполнении команд КУМИР-программы (см. \ref{drawcommands}). При перемещении опущенного пера за ним остается след --- отрезок от старого положения пера до нового.

	Пользователь может видеть ограниченную часть листа через прямоугольное \emph{окно \mbox{Чертежника}}. Пользователь может задать форму окна (<<альбомная>> или <<книжная>>, см.~ниже), какую часть листа показывать и в каком масштабе.

\subsection{Состояния Чертежника}
\label{drawstates}

Поведение Чертежника описывается состоянием его пера:
\begin{itemize}
\item координатами (во внутренней системе координат чертежа)
\item режимом (поднято --- режим перемещения без рисования или опущено --- режим перемещения с рисованием)
\item цветом чернил
\end{itemize}
Школьник может работать с чертежным  листом (очистить, сохранить, загрузить и т.~п.) с помощью меню <<Чертеж>> на окне Чертежника, и управлять режимом работы самого окна с помощью меню <<Вид>> и кнопок на окне Чертежника. 

\subsection{Алгоритмы Чертежника}
\label{drawcommands}

Исполнитель Чертежник может выполнять следующие шесть команд (для каждой команды указан алгоритм языка КуМир).

\begin{itemize}
\item \textbf{алг} поднять перо

Переводит чертежника в режим перемещения без рисования.

\item \textbf{алг} опустить перо

Переводит чертежника в режим перемещения с рисованием.

\emph{Замечание.} Поднять (опустить) перо --- сокращение от полной формы <<сделать так, чтобы перо оказалось поднятым (опущенным)>>. Если перо, например, поднято, то после выполнения команды \textsf{поднять перо}, оно просто останется поднятым.

\item \textbf{алг} сместиться на вектор (\textbf{вещ} dX, \textbf{вещ} dY)

Перемещает перо на dX вправо и dY вверх.

\item \textbf{алг} сместиться в точку (\textbf{вещ} x, \textbf{вещ} y)

Перемещает перо в точку с координатами (x,y).

\item \textbf{алг} установить цвет (\textbf{лит} наименование цвета)
\label{drawsetcolor}

Устанавливает цвет чернил. Допускается 9 цветов: ''черный'', ''белый'', ''красный'', \mbox{''оранжевый''}, ''желтый'', ''зеленый'', ''голубой'', ''синий'', ''фиолетовый''. Подробнее об использовании цветов в Чертежнике см. \ref{drawcolors}.

\item \textbf{алг} надпись (\textbf{вещ} ширина\_знакоместа, \textbf{лит} текст)

Каждый символ рисуется шрифтом \texttt{Courier New}. Позиция пера в момент начала рисования рассматривается как начальная точка базовой линии рисования.  После окончания рисования перо должно оказаться на базовой линии рисования в правом конце \emph{промежутка, отделяющего} нарисованный символ \emph{от следующего символа}. При этом перо находится в том же режиме, что и перед выполнением команды.

Значение \textsf{ширина\_знакоместа} задается в единицах чертежника. В соответствии со стандартом шрифта \texttt{Courier New}, параметр \textsf{ширина\_знакоместа} полностью определяет все размеры всех символов, а также ширину расстояния между символами в слове.
\end{itemize}

\subsection{Как Чертежник работает с цветами}
\label{drawcolors}

\subsubsection{Общие принципы работы с цветом}

	В каждый момент работы Чертежника определен используемый \emph{цвет чернил}. Чертежник рисует линии именно этим цветом. При загрузке Кумира устанавливается черный цвет. 	Пользователь может установить цвет специальной командой. Узнать из программы цвет чернил (как и другие элементы состояния пера Чертежника, см. \ref{drawstates}) из программы нельзя. При рисовании на одном и том же месте разными цветами будет виден последний цвет. 

\subsubsection{Какие цвета использует Чертежник}

	Чертежник умееет рисовать девятью цветами. Эти цвета: \mbox{''черный''}, ''белый'', ''красный'', ''оранжевый'', ''желтый'', ''зеленый'', ''голубой'', ''синий'', ''фиолетовый''. Никаких других цветов, кроме девяти указанных, в Чертежнике нет,  никаких смешиваний цветов сделать нельзя.

\subsubsection{Интерфейс изменения цвета в Чертежнике}

	Изменение цвета производится командой \textsf{установить цвет} (см. выше \ref{drawsetcolor}).
У каждого цвета ровно одно допустимое наименование, записываемое строчными русскими буквами:  \mbox{''черный''}, ''белый'', ''красный'', ''оранжевый'', ''желтый'', ''зеленый'', ''голубой'', ''синий'', ''фиолетовый''. Цвета пишутся в кавычках --- как литерные константы. Использование заглавных букв не допускается (как и при написании ключевых слов).

	Школьник может задать аргумент команды \textsf{установить цвет} не только константой, но и произвольным текстовым выражением. При этом контроль допустимости цвета происходит на этапе выполнения.


\subsection{Кумир-программы, использующие Чертежник}

В начале КУМИР-программы должна быть строка \textsf{использовать Чертежник}.

При выполнении команды \textsf{использовать Чертежник} чертежный лист  приводится к \emph{\mbox{начальному} состоянию} --- пустому листу. Кроме того,  окно Чертежника становится видимым, в нем изображается фрагмент  пустого листа, соответствующий текущим настройкам окна.  Если нужно, изображаются оси координат и сетка. Если пользователь желает вернуться к настройкам окна по умолчанию, он может сделать это вручную с помощью пункта \mbox{<<Восстановить>>} меню <<Вид>>.

\section{Окно Чертежника}

\subsection{Общие сведения}

Окно исполнителя чертежник в правом углу поля имеет две стандартные кнопки имеет \textbf{\_}~и~\textbf{X} со стандартной семантикой.

Окно создается в момент старта Кумира, но является невидимым.  Окно становится видимым в следующих случаях:
\begin{itemize}
\item Пользователь нажал на кнопку <<Показать окно чертежника>> на панели инструментов или воспользовался соответствующим пунктом в подменю <<Чертежник>>
\item При выполнении строки программы \textsf{использовать Чертежник}
\end{itemize}

Окно имеет стандартные размеры, зависящие от размеров экрана (см.~ниже). Окно может иметь одну из двух стандартных форм, они называются ниже ГОР и ВЕРТ. ГОР --- <<альбомная форма>>, ВЕРТ --- <<книжная>>. Пользователь может менять форму окна с помощью меню <<Чертеж>> окна Чертежника (см.~ниже). Размеры окна для каждой формы однозначно привязаны к размерам экрана. С помощью стандартных оконных средств (например, мыши) их менять нельзя.

\subsection{Структура окна}
Большую часть окна занимает рабочее поле, в котором изображается выбранный фрагмент листа рисования.

Над рабочим полем расположено раскрывающееся меню <<Чертеж>> (слева), правее него расположено раскрывающееся меню <<Вид>> и четыре кнопки, дублирующие некоторые функции меню <<Вид>> (см.~ниже). Меню <<Чертеж>> работает с содержимым листа рисования; меню <<Вид>> определяет режим просмотра выбранного фрагмента листа.

При запуске системы Кумир в качестве участка просмотра устанавливается  прямоугольник в горизонтальном положении шириной  7 единиц (от -3.5 до 3.5).  Высота участка просмотра в единицах чертежника однозначно определяется указанной шириной и уже известными пропорциями рабочего поля (см.~выше).  Если перевести окно из горизонтального формата в вертикальный или наоборот, то положение центра окна на чертеже не изменится, а ширина станет равной около 3 единиц.

\subsection{Просмотр листа рисования}

	В окне Чертежника виден прямоугольный участок листа рисования. Его размеры в пикселях зависят от размера экрана и выбранной формы окна (ГОР или ВЕРТ).  Установка видимого фрагмента чертежа при запуске системы Кумир описана выше.

В дальнейшем размер участка просмотра и его положение на листе устанавливаются с помощью команд меню <<Вид>> на окне Чертежника, кнопок на окне и манипуляций мышкой.

\subsection{Сетка}
\label{drawsetka}

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

Подчеркнем, что параметры сетки задаются в условных единицах чертежника, т.е. сетка как бы «вморожена» в лист чертежа. Чертеж мысленно разлиновывается сеткой с указанными параметрами, а в окне показывается указанная часть чертежа (вместе с сеткой) и в указанном масштабе.

\emph{Примечание.} Если сетка становится слишком мелкой, то чертеж <<замазывается>>, а процесс рисования --- тормозится. Такое может произойти:
\begin{itemize}
\item при изменении параметров сетки (пункт <<Сетка>> меню <<Вид>>)
\item при изменении масштаба изображения (меню <<Вид>>, колесико мыши)
\end{itemize}

Чтобы избежать описанных выше явлений, Кумир отслеживает последствия запрашиваемых пользователем <<опасных>> действий. Если сетка становится слишком мелкой (расстояние между линиями менее трех пикселей), то сетка не рисуется и кнопка <<Сетка>> на панели  окна чертежника (крайняя справа) становится красной.

\subsection{Оси координат}

Оси координат (если они попадают участок просмотра), показываются синими линиями. Оси координат всегда проходят через точку $(0,0)$.

\subsection{Показ координат точки}

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

\subsection[Меню ''Чертеж'']{Меню «Чертеж»}

Меню содержит следующие пункты:
\begin{center}
\begin{tabular}{||p{3cm}|p{12.5cm}||}
\hline
\hline
Очистить &
Стирает с листа все нарисованные линии и надписи\\
Сохранить &
Сохранить чертеж в .ps файл\\
Загрузить &
Загрузить чертеж из .ps файла (поддерживаются только файлы, сохраненные чертежником)\\
Печать в файл &
Печатает в PDF-файл область просмотра чертежа (то, что видно в рабочем окне)\\
\hline
\hline
\end{tabular}
\end{center}

\subsection[Меню ''Вид'']{Меню «Вид»}

\subsubsection{Общие сведения}

Меню <<Вид>> управляет показом чертежа в рабочем поле окна Чертежника. Оно содержит такие пункты:
\begin{itemize}
\item Крупнее 
\item Мельче
\item Весь чертеж
\item Восстановить 
\item Сдвиги 
\item Сетка
\item Информация
\end{itemize}

\subsubsection{Управление масштабом}

Управление масштабом показа выполняется с помощью пунктов \emph{Крупнее, Мельче, Весь чертеж, Восстановить}. Кроме того, масштаб изображения можно менять мышью (см.~\ref{drawmouse}).

Команды \emph{Крупнее} и \emph{Мельче} изменяют масштаб изображения (размер участка просмотра) в $\sqrt{2} \approx 1.4$ раз. Центр участка просмотра на листе рисования при этом не меняется.

Команда \emph{Весь чертеж} выбирает в качестве область показа минимальную прямоугольную область нужной формы, в которой полностью помещается весь нарисованный чертеж. Масштаб изображения выбирается так, чтобы весь этот прямоугольник помещался в рабочем поле (с учетом небольших отступов со всех сторон). 

Команда \emph{Восстановить} восстанавливает параметры области просмотра, принятые по умолчанию (см.~\ref{drawsetka}).

\subsubsection{Управление сеткой}

По команде \emph{Сетка} возникает форма с двумя кнопками (<<Показывать сетку>> и <<Сетка квадратная>>) и двумя редактируемыми полями (<<Шаг X>> и <<Шаг Y>>). При этом, если выбрано <<Сетка квадратная>>, то изменение шага по одному из направлений сетки синхронно меняет шаг по другому направлению.

\subsubsection{Выдача информации}
По команде \emph{Информация} выводится табличка с информацией об области показа и состоянии пера.

\subsubsection{Сдвиги}

По команде \emph{Сдвиги} выпадает меню четырех направлений сдвигов. Кроме того, в этом меню есть текст,  объясняющий, как двигать чертеж мышью и рекомендующий так и поступать.

\subsection{Инструментальные кнопки}

Справа от меню <<Вид>> расположены 4 кнопки, соответствующие командам \emph{Крупнее, Мельче, Полный чертеж, Сетка} меню <<Вид>>.

\subsection{Использование мыши}
\label{drawmouse}

Для управления масштабом изображения можно использовать колесико мыши, а для управлением положением видимой области на листе --- <<таскать лист>> в окне мышью при нажатой левой кнопке. Интерфейс этого --- стандартный.
