Ответы в темах
-
АвторСообщения
-
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.- Ответ изменён 1 месяц, 1 неделя назад пользователем 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);
- Ответ изменён 4 месяца, 3 недели назад пользователем Support Engineer.
Support EngineerУчастникЗдравствуйте!
Вам нужен только идентификатор вашей сборки в формате «CustomConstructedModelStorage:UID». Его можно получить из интерфейса ПО Топоматик Робур. ПКМ по сборке и копировать идентификатор. (см. прикреплённые скриншоты)
ImElement _element = TypedObjectCollections.Current.FindObject("CustomConstructedModelStorage:UID") as ImElement;
- Ответ изменён 4 месяца, 4 недели назад пользователем 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); } }
Для наглядности прикрепляем пример плагина с таблицей смещений.
Вложения:
Вы должны войти для просмотра вложений. -
АвторСообщения