Инструменты пользователя

Инструменты сайта


developers:tutorial:sfcselection

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
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>​
developers/tutorial/sfcselection.1647366814.txt.gz · Последние изменения: 2022/03/15 17:53 — proxor