Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
developers:tutorial:drawing [2019/03/31 09:48] vasya |
developers:tutorial:drawing [2022/03/15 19:17] (текущий) proxor |
||
---|---|---|---|
Строка 11: | Строка 11: | ||
* [[developers:references:topomatic.dwg.drawing.linetypes|Linetypes]] - таблица [[developers:references:topomatic.dwg.dwglinetype|типов линий]], содержит описание типов линий, используемых на чертеже | * [[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]]. | ||
+ | <note>[[developers:references:topomatic.dwg.dwgblock|Блок]] чертежа может содержать внутри себя вставку других блоков чертежа, через специальный примитив [[developers:references:topomatic.dwg.entities.dwginsert|вставка блока]]</note> | ||
+ | Каждый примитив чертежа лежит на отдельном [[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]]. | ||
+ | <note>Если необходимо нарисовать примитив на видовом экране, не помещая его в модель чертежа, то необходимо использовать методы класса [[developers:references:topomatic.dwg.paintentityeventargs|PaintEntityEventArgs]], например статический метод [[developers:references:topomatic.dwg.paintentityeventargs.paintentity_topomatic.dwg.entities.dwgentity_topomatic.cad.foundation.cadpen|PaintEntityeventArgs.Paint]]</note> | ||
+ | Создайте и настройте новый [[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" разместит на чертеже полилинию, с заданным типом линии и создаст тип линии если это необходимо. | ||
+ | <code csharp> | ||
+ | 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(); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | Теперь необходимо сформировать наш файл .plugin. Заполните его следующим образом. | ||
+ | <code javascript> | ||
+ | { | ||
+ | "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" | ||
+ | ] | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | Результатом запуска проекта будет появления в главном меню пункта «Примеры», с подпунктами, которые будут показаны и работать в соответствии с описанным выше алгоритмом. | ||
+ | |||
+ | {{ :developers:tutorial:drawing:drawing_result.png?direct&600 |}} | ||
+ | |||
+ | <note>[[developers:tutorial:tutorialcode|Исходный код]] примера расположен в проекте **"tutorial11"**.</note> |