Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
developers:tutorial:drawing [2019/02/03 12:04] vasya |
developers:tutorial:drawing [2022/03/15 19:17] (текущий) proxor |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | ====== Добавление примитивов ====== | + | ====== Работа с примитивами чертежа ====== |
- | Модель чертежа описана в пространстве имен [[developers:references:topomatic.dwg|Topomatic.Dwg]]. Она представляет собой реализацию хранилища объектов, каждый из которых является примитивом чертежа. Обеспечивает работу с слоями чертежа, типами линии и прочими элементами. | + | Большинство моделей программного комплекса [[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|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]]. | ||
+ | <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:tutorial:module|модуль]] для подключения к программному комплексу [[http://www.topomatic.ru|Топоматик Робур]]. | ||
Строка 13: | Строка 26: | ||
* [[developers:references:topomatic.cad.foundation|Topomatic.Cad.Foundation.dll]] - базовые математические типы и операции | * [[developers:references:topomatic.cad.foundation|Topomatic.Cad.Foundation.dll]] - базовые математические типы и операции | ||
- | * [[developers:references:topomatic.dwg|Topomatic.Dwg.dll]] - модель чертежа | ||
- | * [[developers:references:topomatic.dwg.layer|Topomatic.Dwg.Layer.dll]] - слой для отображения модели | ||
* [[developers:references:topomatic.cad.view|Topomatic.Cad.View.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]] - слой чертежа для видового экрана | ||
- | <note>Не забудьте поставить флаг «Копировать локально» в «False». Кроме того, необходимо добавить нужные пространства имен в секцию using. Visual Studio позволяет легко сделать это, нажав правой клавишей на имени класса и выбрав добавление директивы using.</note> | + | В теле программного модуля объявите две команды, и декорируйте их атрибутом «cmd». Команда "draw_test_block" будет размещать на чертеже вставку блока, и создавать блок при его отсутствии. Команда "draw_test_linetype" разместит на чертеже полилинию, с заданным типом линии и создаст тип линии если это необходимо. |
- | + | ||
- | Алгоритм получения модели чертежа для текущего окна следующий: | + | |
- | * Получаем текущий активный элемент управления [[developers:references:topomatic.cad.view.cadview|CadView]] | + | |
- | * Находим слой отображения модели чертежа [[developers:references:topomatic.dwg.layer.drawinglayer|DrawingLayer]] через статическую функцию [[developers:references:topomatic.dwg.layer.getdrawinglayer|GetDrawingLayer]] | + | |
- | * Получаем модель чертежа через свойство слоя [[developers:references:topomatic.dwg.layer.drawinglayer.drawing|Drawing]] | + | |
- | + | ||
- | Для удобства использования - оформим этот алгоритм как свойство нашего модуля: | + | |
<code csharp> | <code csharp> | ||
partial class Module : Topomatic.ApplicationPlatform.Plugins.PluginInitializator | partial class Module : Topomatic.ApplicationPlatform.Plugins.PluginInitializator | ||
- | { | + | { |
- | ... | + | //функция создает экземпляр редактора модели и возвращает его |
- | //свойство для получения модели чертежа | + | [cmd("draw_test_block")] |
- | public Drawing Drawing | + | private void DrawBlock() |
{ | { | ||
- | get | + | //находим текущий слой чертежа |
+ | var cadView = CadView; | ||
+ | var layer = DrawingLayer.GetDrawingLayer(cadView); | ||
+ | if (layer != null) | ||
{ | { | ||
- | //получаем текущий активный CadView | + | //определяем имя нашего блока |
- | var cadView = this.CadView; | + | const string BLOCK_NAME = "test_block"; |
- | if (cadView != null) | + | var drawing = layer.Drawing; |
+ | //начинаем групповое изменение чертежа | ||
+ | drawing.BeginUpdate(); | ||
+ | try | ||
{ | { | ||
- | //получаем текущий слой модели чертежа | + | //находим блок с нужным именем |
- | var layer = DrawingLayer.GetDrawingLayer(cadView); | + | var block = drawing.Blocks[BLOCK_NAME]; |
- | if (layer != null) | + | if (block == null) |
- | //возвращаем модель чертежа | + | { |
- | return layer.Drawing; | + | //если такого блока нет, создаем его |
+ | 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(); | ||
} | } | ||
- | return null; | ||
} | } | ||
+ | } | ||
+ | [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> | </code> | ||
+ | Результатом запуска проекта будет появления в главном меню пункта «Примеры», с подпунктами, которые будут показаны и работать в соответствии с описанным выше алгоритмом. | ||
+ | |||
+ | {{ :developers:tutorial:drawing:drawing_result.png?direct&600 |}} | ||
+ | |||
+ | <note>[[developers:tutorial:tutorialcode|Исходный код]] примера расположен в проекте **"tutorial11"**.</note> |