Форум НПФ

Форум НПФ "ТОПОМАТИК" (http://www.topomatic.ru/forum/index.php)
-   Вопросы и ответы (http://www.topomatic.ru/forum/forumdisplay.php?f=68)
-   -   Изменить семантику точки (http://www.topomatic.ru/forum/showthread.php?t=7918)

ZaharovMaxim 03-02-2020 21:33

Изменить семантику точки
 
Здравствуйте.
Можно программно поменять свойства точки?
Вот пример кода
Код:
Dim rp As Topomatic.Cad.Foundation.Vector3D Dim boopos As Boolean = Hints.CadCursors.GetPoint(CadView, rp, Укажите точку: ") Dim SurvPoint As SurfacePoint = New SurfacePoint(rp) Dim NPointt As Integer = New Topomatic.Sfc.PointEditor(surface).Add(SurvPoint) Dim CogoPoint As Topomatic.Sfc.Layer.Wrappers.SurfacePointWrapper = New Wrappers.SurfacePointWrapper(surfaceLayer, NPointt) '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\ 'меняем код точки на Пункт государственной геодезической сети (1000) Dim code As New KeyValuePair(Of Integer, Surface)(1000, surface) CogoPoint.ObjectCode = code 'получаем семантику Dim semantic_obj As Topomatic.Smt.SemanticDataSet = CogoPoint.Semantic Dim col As ICollection(Of Integer) = semantic_obj.Keys Dim obj As Double = 123.12 Dim bool As Boolean = semantic_obj.TryGetValue(8, obj)

Я бы хотел изменить поле Отметка центра
Спасибо

Василий Гончаров 03-03-2020 11:31

Добрый день!
Да, это возможно. Вы можете менять семантические значения как по целочисленному ключу, так и по тэгу, если он задан. Конкретно для поля "отметка центра" в семантике условного знака задан тэг "CENTER". Вы можете воспользоваться следующим кодом:
Код:
Dim surface as Topomatic.Sfc.Surface = ...; Try surface.BeginUpdate(); 'Создаём редактор для добавления точек поверхности Dim editor as Topomatic.Sfc.PointEditor = new Topomatic.Sfc.PointEditor(surface) 'Запрашиваем положение точки Dim rp As Topomatic.Cad.Foundation.Vector3D Dim has_point As Boolean = Hints.CadCursors.GetPoint(CadView, rp, "Укажите точку: ") If has_point Then Dim point As Topomatic.Sfc.SurfacePoint = new Topomatic.Sfc.SurfacePoint(rp) 'Добавили точку в поверхность и получили её индекс в списке точек Dim point_index As Int = editor.Add(point) 'Получили расширенную информацию о точке Dim information As Topomatic.Sfc.SurfacePointExtensiveInformation = surface.Points.GetExtensiveInformation(index); 'Назначили изыскательский код information.ExplorationCode = "1000"; 'Назначили код объекта information.Code = 1000; 'Обновили условный знак объекта surface.RefreshPointSign(index); 'Обновили слой объекта surface.RefreshPointLayer(index); 'Указали поле "отметка центра" используя его семантический код information.Semantic["CENTER"] = 123.12; End If Finally surface.EndUpdate(); End Try

ZaharovMaxim 03-03-2020 22:13

Спасибо, получилось.

VSP 01-12-2021 9:33

Здравствуйте! При запуске на питоне:
surface.RefreshPointLayer(index)
AttributeError: 'Surface' object has no attribute 'RefreshPointLayer'
Хотя surface is Topomatic.Sfc.Surface object. К какому классу относится метод RefreshPointLayer?

Василий Гончаров 01-12-2021 12:16

Добрый день!

Метод RefreshPointLayer объявлен в пространстве имён Topomatic.Sfc.Layer, и реализован как метод расширения у статического класса SurfaceExtentions. При разработке на VisualBasic средства разработки допускают использование методов расширения, как методы классов и поэтому вызов surface.RefreshPointLayer является допустимым. В случае разработки на python вам потребуется вызывать этот метод напрямую, в виде SurfaceExtentions.RefreshPointLayer(surface, index). Более подробно https://ironpython.net/documentatio...tension-methods.

VSP 05-14-2021 2:41

Добрый день! Подскажите, пожалуйста, как создать выноску (leader) с заданными параметрами (расположением и текстом)? (на python)

Василий Гончаров 05-17-2021 18:13

Добрый день!

Для того чтобы создать выноску, Вам необходимо получить объект чертежа Drawing на котором Вы создаёте выноску. В простейшем случае, если у Вас есть экземпляр видового экрана CadView. Код будет выглядеть примерно так:
Код:
from Topomatic.Dwg.Layer import DrawingLayer from Topomatic.Dwg.Entities import DwgLeader cad_view = ... drawing = DrawingLayer.GetDrawingLayer(cadview) drawing.BeginUpdate() try: #создаём выноску text = DwgLeader() #заполняем основные свойства примитива по умолчанию text.Prepare(drawing) #назначаем текст text.Content = "Выноска" #размер шрифта text.Height = 1.0 #положение текста выноски text.Position = Vector2D(10, 10) #положение стрел выноски (может быть несколько) text.Add(Vector2D(0, 0)) text.Add(Vector2D(0, 5)) finally: drawing.EndUpdate()

VSP 05-18-2021 9:45

Спасибо! Получилось.
Как получить точку, лежащую на линии?
Пользователь выбрал полилинию.
Получаем координаты точки клика из cadview.LastPoint.
Затем уточняем координаты.
Похоже на PolylineExtentions.GetNearestPoint. Как применить в этом случае?

Василий Гончаров 05-18-2021 16:38

Добрый день!

Для того, чтобы уточнить координаты на полилинии, вы можете использовать метод расширение PosToStaOffset и StaOffsetToPos. Они позволяют спроецировать точку на полилинию, и получить её координаты в системе координат "расстояние от начала линии, смещение" и преобразовать эти координаты в точку. Например:

Код:
CadView cadView = ... IPolyline3D polyine = ... position = cadView.LastPoint #особенности работы с ref и out параметрами в IronPython #более подробно https://ironpython.net/documentation/dotnet/dotnet.html#ref-and-out-parameters s = clr.Reference[double]() o = clr.Reference[double]() if (PolylineExtentions.PosToStaOffset(polyline, position, s, o)): #нас интересует только расстояние от начала, чтобы получить точку на линии выбираем в качестве смещения 0 polyline_position = PolylineExtentions.StaOffsetToPos(polyline, s.Value, 0.0)

VSP 07-02-2021 12:27

Здравствуйте!
Подскажите, пожалуйста, как изменить свойства выноски (DwgLeader).
Надо изменить выравнивание текста Слева, Справа, По центру


Часовой пояс GMT +3, время: 7:49.

vBulletin v3.0.7 , Copyright ©2000-2021, Jelsoft Enterprises Ltd.
Copyright © 2003-2021, НПФ "ТОПОМАТИК".