Support Engineer

Ответы в темах

Просмотр 7 сообщений - с 1 по 7 (из 7 всего)
  • Автор
    Сообщения
  • в ответ на: Точки привязки выноски DwgLeader() #6743
    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))
        {
            // Значит вершина выноски лежит на полилинии
        }
    }
    
    в ответ на: Точки привязки выноски DwgLeader() #6698
    Support Engineer
    Участник

    Здравствуйте!
    Выноска DwgLeader хранит в себе коллекцию вершин (стрелок). Благодаря этому одной выноской можно указывать на разные объекты плана.
    Вам следует указать положение текста с помощью свойства Position, как вы описали выше, а после добавить нужные вершины (стрелки) выноски с помощью метода DwgLeader.Add(Vector2D pt).
    Важно! Вершина задаётся в относительных координатах. То есть положение вершины располагается относительно координат Position.

    • Ответ изменён 1 месяц, 1 неделя назад пользователем Support Engineer.
    в ответ на: Разработка #6567
    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();
    в ответ на: Разработка #6556
    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.
    в ответ на: Разработка #6538
    Support Engineer
    Участник

    Здравствуйте!
    Вам нужен только идентификатор вашей сборки в формате «CustomConstructedModelStorage:UID». Его можно получить из интерфейса ПО Топоматик Робур. ПКМ по сборке и копировать идентификатор. (см. прикреплённые скриншоты)
    ImElement _element = TypedObjectCollections.Current.FindObject("CustomConstructedModelStorage:UID") as ImElement;

    • Ответ изменён 4 месяца, 4 недели назад пользователем Support Engineer.
    Вложения:
    Вы должны войти для просмотра вложений.
    в ответ на: Штриховка #6251
    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);
            }
        }
    

    Для наглядности прикрепляем пример плагина с таблицей смещений.

    Вложения:
    Вы должны войти для просмотра вложений.
Просмотр 7 сообщений - с 1 по 7 (из 7 всего)