Ответы в темах
-
АвторСообщения
-
Support EngineerУчастник
Здравствуйте!
Сама подсказка указывает вам какой метод следует использовать для замены.Вместо: Alignment.Stationing.StationToString() Используйте: Alignment.Stationing.ToString() Вместо: Alignment.Stationing.StationToPk() Используйте: Alignment.Stationing.ToPk()
Для того чтобы у новых методов появились многочисленные варианты перегрузок, необходимо использовать статический класс StationingExtentions, который содержит методы расширения для Stationing. В начале файла добавите строку вручную:
using Topomatic.Cad.Foundation.Stationing;
Support EngineerУчастникЗдравствуйте! Не совсем понятна суть вопроса. Если вы имеете в виду точку пересечения двух отрезков, то найти её можно с помощью метода SectSegments() статического класса Topomatic.Cad.Foundation.CadLibrary:
public static bool SectSegments(Topomatic.Cad.Foundation.Vector2D a1, Topomatic.Cad.Foundation.Vector2D a2, Topomatic.Cad.Foundation.Vector2D b1, Topomatic.Cad.Foundation.Vector2D b2, out Topomatic.Cad.Foundation.Vector2D point)
или метода SectSegmentLine()
public static bool SectSegmentLine(Topomatic.Cad.Foundation.Vector2D a, Topomatic.Cad.Foundation.Vector2D b, Topomatic.Cad.Foundation.Line2D line, out Topomatic.Cad.Foundation.Vector2D point)
Так же можете рассмотреть методы нахождения пересечений полилиний. Метод расширения GetIntersections() статического класса Topomatic.Cad.Foundation.PolylineExtentions
public static System.Collections.Generic.IEnumerable<Topomatic.Cad.Foundation.Vector2D> GetIntersections(this Topomatic.Cad.Foundation.IPolyline3D polyline, Topomatic.Cad.Foundation.Vector2D a, Topomatic.Cad.Foundation.Vector2D b)
или метод SectLine()
public static System.Collections.Generic.List<Topomatic.Cad.Foundation.Vector2D> SectLine(this Topomatic.Cad.Foundation.IPolyline3D polyline, Topomatic.Cad.Foundation.Line2D line)
- Ответ изменён 6 месяцев, 1 неделя назад пользователем Support Engineer.
Support EngineerУчастникКак было описано выше, выноска содержит коллекцию вершин в относительных координатах. Вершину можно получить по индексу
DwgLeader leader = ...; // Выноска Polyline3D polyline = ...; // Полилиния var vector = leader[0]; // получение вершины по индексу var pos = leader.Position + vector; // координаты выноски в глобальных координатах double station, offset if (Topomatic.Cad.Foundation.PolylineExtentions.PosToStaOffset( polyline, pos, out station, out offset) && offset.Equals(0.0)) { // Значит вершина выноски лежит на полилинии }
или пройти по коллекции вершин с помощью цикла for или foreach
DwgLeader leader = ...; // Выноска Polyline3D polyline = ...; // Полилиния foreach (var vector in leader) { // vector - вершина выноски в относительных координатах var pos = leader.Position + vector; // координаты выноски в глобальных координатах double station, offset; if (Topomatic.Cad.Foundation.PolylineExtentions.PosToStaOffset( polyline, pos, out station, out offset) && offset.Equals(0.0)) { // Значит вершина выноски лежит на полилинии } }
Support EngineerУчастникЗдравствуйте!
Выноска DwgLeader хранит в себе коллекцию вершин (стрелок). Благодаря этому одной выноской можно указывать на разные объекты плана.
Вам следует указать положение текста с помощью свойства Position, как вы описали выше, а после добавить нужные вершины (стрелки) выноски с помощью метода DwgLeader.Add(Vector2D pt).
Важно! Вершина задаётся в относительных координатах. То есть положение вершины располагается относительно координат Position.- Ответ изменён 8 месяцев назад пользователем Support Engineer.
Support EngineerУчастникПредположим в вашей TLC сборке есть свойство «axis_curve» отвечающее за ось линейного объекта следующего вида:
(defproperty axis_curve nil "Ось" (v-property-typed "SmdxPolyline"))
Тогда назначить линейный объект для вставляемой сборки можно воспользовавшись кодом ниже (читайте комментарии к коду).
Важно помнить, что связь с исходным линейным объектом не сохраняется. По сути мы собираем координаты выбранного линейного объекта и передаём их SmdxManualPolyline, который не знает о существовании исходного объекта.// Проверка на наличие CadView var cadView = this.CadView; if (cadView == null) return; // Проверка на наличия Drawing var drawingLayer = DrawingLayer.GetDrawingLayer(cadView); if (drawingLayer == null) return; // Выбор линейного объекта var ss = cadView.SelectionSet; ss.Clear(); var res = cadView.SelectionSet.SelectOneObjectAtScreen( o => o is ILinearObject, out var obj, "Выберите линейный объект:"); if (res == GetPointResult.Cancel) return; ss.Clear(); // Получение полилинии из линейного объекта var poly = new Polyline3D(); ((ILinearObject) obj).GetPolyline(poly); // Определение точки вставки var insertPoint = poly[0].Vertex; // Определение обратной матрицы смещения // потому как координаты линейного объекта // в TLC сборке будут относительные var pivot = Matrix.CreateTranslation(insertPoint); var invert = Matrix.Invert(pivot); // Создание SmdxManualPolyline, // который будет передан в качестве линейного объекта в TLC var aggregate = ImAggregates.Create("SmdxManualPolyline"); aggregate.ApplayOverridedProperties(new ImProperty[] { // здесь вершины SmdxManualPolyline // будут заполнены вершинами выбранного линейного объекта new ImProperty("mverteces", null, ImAggregateExtentions.CreateSmdxManualPolyline(poly, invert)) }); // Определяем пространство в которое поместим наш примитив var drawing = drawingLayer.Drawing; var activeSpace = drawing.ActiveSpace; // Здесь следует указать идентификатор вашего элемента из библиотеки var uid = "CustomConstructedModelStorage:f0b39325-41f8-4981-b5e2-e30127b4e25e"; var element = TypedObjectCollections.Current.FindObject(uid) as ImElement; // Назначаем свойству отвечающему за ось линейного объекта // созданный ранее SmdxManualPolyline в качестве значения element.ApplayOverridedProperties(new[] { // если вашем TLC свойство имеет другие тег и имя, используйте свои new ImProperty("axis_curve", "Ось", aggregate) }); // вставка примитива с элементом, // у которого определена ось по выбранному линейному объекту var entity = new DwgModel3DElement { Element = element, Position = insertPoint}; activeSpace.Add(entity); // Выбираем вставленный примитив ss.Select(entity, true); // Обновляем план cadView.Unlock(); cadView.Invalidate();
Support EngineerУчастникМодель на план можно разместить с помощью класса DwgModel3DElement. Свойству Element примитива укажите полученный элемент библиотеки.
var cadView = this.CadView; if(cadView == null) return; var drawingLayer = DrawingLayer.GetDrawingLayer(cadView); if (drawingLayer == null) return; var drawing = drawingLayer.Drawing; var activeSpace = drawing.ActiveSpace; var element = TypedObjectCollections.Current.FindObject( "CustomConstructedModelStorage:UID") as ImElement; var entity = new DwgModel3DElement { Element = element }; activeSpace.Add(entity);
- Ответ изменён 11 месяцев, 2 недели назад пользователем Support Engineer.
Support EngineerУчастникЗдравствуйте!
Вам нужен только идентификатор вашей сборки в формате «CustomConstructedModelStorage:UID». Его можно получить из интерфейса ПО Топоматик Робур. ПКМ по сборке и копировать идентификатор. (см. прикреплённые скриншоты)
ImElement _element = TypedObjectCollections.Current.FindObject("CustomConstructedModelStorage:UID") as ImElement;
- Ответ изменён 11 месяцев, 2 недели назад пользователем Support Engineer.
Вложения:
Вы должны войти для просмотра вложений.Support EngineerУчастникЗдравствуйте, Максим!
Метод Assign() не приведёт к копированию координат полилинии в штриховку. Границы штриховки и контур полилинии имеют совсем разную структуру.Предположим, что у вас уже есть полилиния, как в вашем примере. Тогда добавить штриховку с координатами полилинии можно двумя способами. Примеры приведены на языке C#.
Вариант #1:
// Создаём границу штриховки и наполняем // её координатами имеющейся полилинии (dwgPolyline) PolylineBoundaryPath boundaryPath = new PolylineBoundaryPath(); foreach (var vertex in dwgPolyline) boundaryPath.Add(vertex); // Создаём штриховку, инициализируем свойство PatternName DwgHatch dwgHatch = new DwgHatch { PatternName = "SOLID" }; // В коллекцию границ штриховки добавляем границу // с координатами полилинии dwgHatch.BoundaryPath.Add(boundaryPath); // Добавляем штриховку в чертёж (Drawing) activeDrawing.ActiveSpace.Add(dwgHatch);
Вариант #2:
// Создаём список векторов (Vector2D) var points = new List<Vector2D>(); // Заполняем его координатами полилинии dwgPolyline.ConvertToPosArray(points); // Добавляем штриховку в чертёж минуя создание экземпляр штриховки activeDrawing.ActiveSpace.AddHatch(AcPatternType.PreDefined, "SOLID", points);
Support EngineerУчастникЗдравствуйте!
Для инициализации плагина необходимо добавить команду, которая возвращает экземпляр интерфейса IAlignmentPluginInitializator и зарегистрировать таск для этой команды.
Регистрация таска происходит в классе наследнике от PluginHostInitializator. Сам таск представляет собой строку, в формате <идентификатор_плагина>:<имя_команды>.
Сделать это можно следующим образом:Для удобства определим константу для идентификатора плагина.
static class PluginConsts { // Имя плагина сохраняемого в подобъекте, должно быть уникальным в пределах подобъекта public const string PluginID = "SimpleAlignmentPlugin"; } class ExampleModule : PluginInitializator, IAlignmentPluginInitializator, IAlignmentPluginLayersInitializator { [cmd("init_example_plugin")] private IAlignmentPluginInitializator GetThis() { return this; } //После подключения плагина, добавление слоёв должно происходить автоматически. //Пример метода добавления слоя плана. Для профиля и поперечников public void CreatePlanLayers(Alignment alignment, AlgCompoundLayer compoundLayer) { if (alignment.Plugins.Contains(PluginConsts.PluginID)) { if (compoundLayer[PluginLayer.Guid] == null) compoundLayer.Add(new PluginLayer()); } } }
Далее необходимо перекрыть метод Initialize у наследника PluginHostInitializator, в котором нужно зарегистрировать таск с именем в формате <идентификатор_плагина>:<имя_команды>.
Здесь нам потребуется значение атрибута cmd описанного выше.public sealed class ExamplePluginHost : PluginHostInitializator { protected override Type[] GetTypes() { return new Type[] { typeof(ExampleModule) }; } public override void Initialize(PluginFactory factory) { base.Initialize(factory); var taskName = PluginConsts.PluginID + ":init_example_plugin"; factory.RegisterTask(AlgCoreTools.TASK_PLUGIN, taskName); } }
Для наглядности прикрепляем пример плагина с таблицей смещений.
Вложения:
Вы должны войти для просмотра вложений. -
АвторСообщения