====== Работа с примитивами чертежа ======
Большинство моделей программного комплекса [[http://www.topomatic.ru|Топоматик Робур]] содержат в своем составе модель чертежа. Чертёж позволяет пользователю оперировать базовыми графическими объектами, наносить размеры, подписывать и оформлять другие модели программного комплекса. Более подробно можно ознакомится [[road:work_with_cmm:work_with_elements_drawing:start|здесь]].
Программно чертёж представляет из себя экземпляр класса [[developers:references:topomatic.dwg.drawing|Drawing]]. Этот класс содержит в себе все элементы чертежа, такие как слои, блоки, стили и позволяет осуществлять управление ими.
Основные элементы класса [[developers:references:topomatic.dwg.drawing|Drawing]] это:
* [[developers:references:topomatic.dwg.drawing.activespace|ActiveSpace]] - это основной [[developers:references:topomatic.dwg.dwgblock|блок]] чертежа, содержит примитивы чертежа и ссылки на другие блоки
* [[developers:references:topomatic.dwg.drawing.blocks|Blocks]] - таблица [[developers:references:topomatic.dwg.dwgblock|блоков]] чертежа, содержит основной блок и дополнительные блоки чертежа
* [[developers:references:topomatic.dwg.drawing.layers|Layers]] - таблица [[developers:references:topomatic.dwg.dwglayer|слоев]] чертежа, содержит список слоев чертежа
* [[developers:references:topomatic.dwg.drawing.linetypes|Linetypes]] - таблица [[developers:references:topomatic.dwg.dwglinetype|типов линий]], содержит описание типов линий, используемых на чертеже
Чертеж состоит из [[road:work_with_cmm:work_with_elements_drawing:types_primitives_drawing:start|примитивов]] чертежа. Это примитивные графические объекты, наследники от базового класса [[developers:references:topomatic.dwg.entities.dwgentity|DwgEntity]], такие как [[developers:references:topomatic.dwg.entities.dwgline|линия]], [[developers:references:topomatic.dwg.entities.dwgcircle|окружность]], [[developers:references:topomatic.dwg.entities.dwgarc|арка]], [[developers:references:topomatic.dwg.entities.dwgtext|текст]] и т.п.
Примитивы чертежа располагаются внутри [[developers:references:topomatic.dwg.dwgblock|блоков]] чертежа.
Для добавления примитивов внутрь [[[[developers:references:topomatic.dwg.dwgblock|блока]] можно использовать методы интерфейса [[developers:references:topomatic.dwg.ientityfactory|IEntityFactory]].
[[developers:references:topomatic.dwg.dwgblock|Блок]] чертежа может содержать внутри себя вставку других блоков чертежа, через специальный примитив [[developers:references:topomatic.dwg.entities.dwginsert|вставка блока]]
Каждый примитив чертежа лежит на отдельном [[developers:references:topomatic.dwg.dwglayer|слое]] чертежа. Слой чертежа позволяет управлять видимостью и рядом других свойств своих примитивов. Таблицу слоёв чертежа можно получить используя свойство [[developers:references:topomatic.dwg.drawing.layers|Layers]] экземпляра [[developers:references:topomatic.dwg.drawing|Drawing]].
Для отображения модели чертежа на видовом экране используется класс [[developers:references:topomatic.dwg.layer.drawinglayer|DrawingLayer]]. Получить текущий активный экземпляр слоя возможно через статический метод [[developers:references:topomatic.dwg.layer.drawinglayer.getdrawinglayer_cadview|DrawingLayer.GetDrawingLayer]].
Если необходимо нарисовать примитив на видовом экране, не помещая его в модель чертежа, то необходимо использовать методы класса [[developers:references:topomatic.dwg.paintentityeventargs|PaintEntityEventArgs]], например статический метод [[developers:references:topomatic.dwg.paintentityeventargs.paintentity_topomatic.dwg.entities.dwgentity_topomatic.cad.foundation.cadpen|PaintEntityeventArgs.Paint]]
Создайте и настройте новый [[developers:tutorial:module|модуль]] для подключения к программному комплексу [[http://www.topomatic.ru|Топоматик Робур]].
С помощью диалогового окна Менеджер ссылок добавьте ссылки на следующие библиотеки:
* [[developers:references:topomatic.cad.foundation|Topomatic.Cad.Foundation.dll]] - базовые математические типы и операции
* [[developers:references:topomatic.cad.view|Topomatic.Cad.View.dll]] - элемент управления для отображения слоёв моделей
* [[developers:references:topomatic.dwg|Topomatic.Dwg.dll]] - примитивы и модель чертежа
* [[developers:references:topomatic.dwg.layer|Topomatic.Dwg.Layer.dll]] - слой чертежа для видового экрана
В теле программного модуля объявите две команды, и декорируйте их атрибутом «cmd». Команда "draw_test_block" будет размещать на чертеже вставку блока, и создавать блок при его отсутствии. Команда "draw_test_linetype" разместит на чертеже полилинию, с заданным типом линии и создаст тип линии если это необходимо.
partial class Module : Topomatic.ApplicationPlatform.Plugins.PluginInitializator
{
//функция создает экземпляр редактора модели и возвращает его
[cmd("draw_test_block")]
private void DrawBlock()
{
//находим текущий слой чертежа
var cadView = CadView;
var layer = DrawingLayer.GetDrawingLayer(cadView);
if (layer != null)
{
//определяем имя нашего блока
const string BLOCK_NAME = "test_block";
var drawing = layer.Drawing;
//начинаем групповое изменение чертежа
drawing.BeginUpdate();
try
{
//находим блок с нужным именем
var block = drawing.Blocks[BLOCK_NAME];
if (block == null)
{
//если такого блока нет, создаем его
block = drawing.Blocks.Add(BLOCK_NAME);
//рисуем внутри блока круг
var circle = block.AddCircle(new Vector3D(0, 0, 0), 1.0);
circle.Color = CadColor.ByBlock;
//и квадрат
var line = block.AddPolyline(new Vector2D[] { new Vector2D(-1.0, -1.0), new Vector2D(-1.0, 1.0), new Vector2D(1.0, 1.0), new Vector2D(1.0, -1.0) });
line.Color = CadColor.ByBlock;
line.Closed = true;
}
Vector3D block_pos;
while (CadCursors.GetPoint(cadView, out block_pos, "Выберите положение блока"))
{
//вставляем блок в указанных точках чертежа
drawing.ActiveSpace.AddInsert(block_pos, new Vector3D(1.0), 0.0, BLOCK_NAME);
cadView.Unlock();
cadView.Invalidate();
}
}
finally
{
//заканчиваем групповое изменение чертежа
drawing.EndUpdate();
}
}
}
[cmd("draw_test_linetype")]
private void DrawLineType()
{
var cadView = CadView;
//находим текущий слой чертежа
var layer = DrawingLayer.GetDrawingLayer(cadView);
if (layer != null)
{
//определяем имя типа линии
const string LINETYPE_NAME = "test_linetype";
var drawing = layer.Drawing;
//начинаем групповое изменение чертежа
drawing.BeginUpdate();
try
{
//находим тип линии с нужным именем
var linetype = drawing.Linetypes[LINETYPE_NAME];
if (linetype == null)
{
//если такого типа линии нет, создаем его шаблон и добавляем в таблицу типов линий
var pattern = new LinetypePattern();
//шаблон линии состоит из штриха в 1 еденицу чертежа
pattern.Add().DashDotLength = 1;
//и промежутка в 0.5 едениц чертежа
pattern.Add().DashDotLength = -0.5;
//добавляем линию в таблицу линий
linetype = drawing.Linetypes.Add(LINETYPE_NAME, "Тестовый шаблон линии", pattern);
}
//создаем объект полилинии
var polyline = new DwgPolyline();
//вызываем функцию подготовки примитива
polyline.Prepare(drawing);
//назначаем тип линии
polyline.Linetype = linetype;
//создаем процедуру динамической отрисовки, для удобства ввода
DrawCursorEvent dynamic_draw = delegate (CadPen pen, Vector3D vertex)
{
if (polyline.Count > 0)
{
//отрисовываем примитив
PaintEntityEventArgs.PaintEntity(polyline, pen);
//рисуем линию от последней точки полилинии до текущей позиции курсорва
pen.DrawLine(polyline[polyline.Count - 1].Vertex, vertex.Pos);
}
};
//назначаем процедуру динамической отрисовки
cadView.DynamicDraw += dynamic_draw;
try
{
Vector3D pos;
while (CadCursors.GetPoint(cadView, out pos, "Укажите точку в линии"))
{
//добавлеям точку в полилинию
polyline.Add(new BugleVector2D(pos.Pos));
}
//добавляем полилинию на чертёж, если в ней есть точки
if (polyline.Count > 0)
drawing.ActiveSpace.Add(polyline);
}
finally
{
//убираем процедуру динамической отрисовки
cadView.DynamicDraw -= dynamic_draw;
}
}
finally
{
//заканчиваем групповое изменение чертежа
drawing.EndUpdate();
}
}
}
}
Теперь необходимо сформировать наш файл .plugin. Заполните его следующим образом.
{
"assemblies": {
"tutorial11": {
"assembly": "tutorial11.dll, tutorial11.ModulePluginHost"
}
},
"actions": {
"id_draw_test_block": {
"cmd": "draw_test_block",
"title": "Нарисовать блок на чертеже"
},
"id_draw_test_linetype": {
"cmd": "draw_test_linetype",
"title": "Нарисовать линию на чертеже"
}
},
"menubars": {
"rbproj": {
"items": [
{
"id": "test_menu",
"title": "Примеры"
}
]
},
"rbproj.test_menu": {
"items": [
"id_draw_test_block",
"id_draw_test_linetype"
]
}
}
}
Результатом запуска проекта будет появления в главном меню пункта «Примеры», с подпунктами, которые будут показаны и работать в соответствии с описанным выше алгоритмом.
{{ :developers:tutorial:drawing:drawing_result.png?direct&600 |}}
Исходный код примера, вы можете скачать используя эту ссылку
{{ :developers:tutorial:drawing:tutorial11.zip |Архив с кодом примера}}