Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
developers:tutorial:sfcselection [2022/03/15 17:53] proxor [Выделение структурных линий] |
developers:tutorial:sfcselection [2022/04/09 18:55] (текущий) proxor [Выделение горизонталей] |
||
---|---|---|---|
Строка 152: | Строка 152: | ||
{{ :developers:tutorial:surfaceelementsselect:tutselstrline.png?nolink&600 |}} | {{ :developers:tutorial:surfaceelementsselect:tutselstrline.png?nolink&600 |}} | ||
===== Выделение горизонталей ===== | ===== Выделение горизонталей ===== | ||
+ | По умолчанию, в программном комплексе [[http://topomatic.ru|Топоматик Робур]], выделение горизонталей отключено. Чтобы включить выделение горизонталей нужно изменить значение статического свойства ''SurfaceLayer.SurfaceSelectionSet.IsHorizontalSelectable'' на ''true''. Взаимодействовать с объектами горизонталей напрямую нельзя, но горизонтали реализуют интерфейс [[developers:references:topomatic.cad.foundation.ilinearobject|ILinearObject]], поэтому мы можем получить [[developers:references:topomatic.cad.foundation.polyline3d|трёхмерную полилинию]] описывающую положение горизонтали, воспользовавшись методом [[developers:references:topomatic.cad.foundation.ilinearobject.getpolyline_topomatic.cad.foundation.ipolyline3d|GetPolyline()]]. Для получения площади [[developers:references:topomatic.cad.foundation.polyline3d|трёхмерной полилинии]] воспользуемся методом расширения [[developers:references:topomatic.cad.foundation.polylineextentions.getarea2d_topomatic.cad.foundation.ipolyline3d|PolylineExtentions.GetArea2D(IPolyline3D)]] | ||
- | /// | + | В теле программного модуля объявите команду, и декорируйте её атрибутом «cmd». Команда "get_horizontal_line_area" предложит пользователю выбрать замкнутую горизонталь и определит её площадь. |
+ | |||
+ | <code csharp> | ||
+ | ... | ||
+ | [cmd("get_horizontal_line_area")] | ||
+ | private void GetHorizontalLineArea() | ||
+ | { | ||
+ | //Находим активный SurfaceLayer | ||
+ | var cadview = CadView; | ||
+ | var actSfcLayer = SurfaceLayer.GetSurfaceLayer(cadview); | ||
+ | if (actSfcLayer == null) return; | ||
+ | |||
+ | //Включаем возможность выбор горизонталей | ||
+ | var initSelectState = SurfaceLayer.SurfaceSelectionSet.IsHorizontalSelectable; | ||
+ | SurfaceLayer.SurfaceSelectionSet.IsHorizontalSelectable = true; | ||
+ | |||
+ | //Получаем указатель на текущий набор объектов | ||
+ | var ss = actSfcLayer.SelectionSet; | ||
+ | |||
+ | //Получаем указатель на слой горизонталей | ||
+ | var layer = actSfcLayer.Surface.Style.HorizontalsStyle.GetLayer(); | ||
+ | |||
+ | //Выбираем горизонталь на плане | ||
+ | var linear_object = ss.PickOneObjectAtScreen(obj => | ||
+ | { | ||
+ | if (obj is SurfaceObjectWrapper layered_object) | ||
+ | { | ||
+ | return layered_object.LayerID == layer.ObjectID; | ||
+ | } | ||
+ | return false; | ||
+ | }, "Выберите замкнутую горизонталь") as ILinearObject; | ||
+ | |||
+ | //Восстанавливаем состояние флага возможности выбора горизонталей | ||
+ | SurfaceLayer.SurfaceSelectionSet.IsHorizontalSelectable = initSelectState; | ||
+ | if (linear_object == null) return; | ||
+ | |||
+ | //Извлекаем полилинию из горизонтали и получаем её площадь | ||
+ | var poly = new Polyline3D(); | ||
+ | linear_object.GetPolyline(poly); | ||
+ | |||
+ | //Проверяем замкнута ли горизонталь | ||
+ | var startVec = poly[0]; | ||
+ | var endVec = poly[poly.Count - 1]; | ||
+ | if (startVec.EqualEps(endVec)) | ||
+ | { | ||
+ | var area = poly.GetArea2D(); | ||
+ | MessageDlg.Show($"Площадь горизонтали: {area}"); | ||
+ | } | ||
+ | else MessageDlg.Show($"Горизонталь не замкнута."); | ||
+ | } | ||
+ | ... | ||
+ | </code> | ||
+ | |||
+ | {{ :developers:tutorial:surfaceelementsselect:tutselhorizontal.png?nolink&600 |}} | ||
+ | |||
+ | |||
+ | |||
+ | Теперь необходимо сформировать наш файл .plugin. Заполните его следующим образом. | ||
+ | |||
+ | <code javascript> | ||
+ | { | ||
+ | "assemblies": { | ||
+ | "TutorialSelectSurfaceElements": { | ||
+ | "assembly": "TutorialSelectSurfaceElements.dll, TutorialSelectSurfaceElements.ModulePluginHost" | ||
+ | } | ||
+ | }, | ||
+ | |||
+ | "actions": { | ||
+ | "id_calculate_average_elevation": { | ||
+ | "cmd": "calculate_average_elevation", | ||
+ | "title": "Рассчитать среднюю отметку" | ||
+ | }, | ||
+ | "id_define_steepest_grade": { | ||
+ | "cmd": "define_steepest_grade", | ||
+ | "title": "Рассчитать наибольший уклон" | ||
+ | }, | ||
+ | "id_get_horizontal_line_area": { | ||
+ | "cmd": "get_horizontal_line_area", | ||
+ | "title": "Получить площадь горизонтали" | ||
+ | } | ||
+ | }, | ||
+ | |||
+ | "menubars": { | ||
+ | "rbproj": { | ||
+ | "items": [ | ||
+ | { | ||
+ | "id": "tutorial_menu", | ||
+ | "title": "Tutorial", | ||
+ | "items": [ | ||
+ | "id_calculate_average_elevation", | ||
+ | "id_define_steepest_grade", | ||
+ | "id_get_horizontal_line_area" | ||
+ | ] | ||
+ | } | ||
+ | ] | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | Результатом запуска проекта будет появление в главном меню пункта «Tutorial», с подпунктами, которые будут работать в соответствии с описанными выше алгоритмами. | ||
+ | |||
+ | <note>[[developers:tutorial:tutorialcode|Исходный код]] примера расположен в проекте **"TutorialSelectSurfaceElements"**.</note> |