Разработка

Просмотр 9 сообщений - с 1 по 9 (из 9 всего)
  • Автор
    Сообщения
  • #6532
    Alexandr Rumynatsev
    Участник

    В попытках освоения c#:
    Пытаюсь через FindObject сделать кнопку для загрузки TLC из пользовательской библиотеке.
    cmd[…]
    public void …
    {
    var El = TypedObjectCollections.Current.FindObject(…) as ImElement;
    }
    Что ещё требуется дописать для корректной работы?

    #6538
    Support Engineer
    Участник

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

    • Ответ изменён 4 месяца, 2 недели назад пользователем Support Engineer.
    Вложения:
    Вы должны войти для просмотра вложений.
    #6545
    Alexandr Rumynatsev
    Участник

    Дело в другом.

    • Ответ изменён 4 месяца, 2 недели назад пользователем Alexandr Rumynatsev.
    #6547
    Alexandr Rumynatsev
    Участник

    Это все я сделал и так, в рамках метода я понимаю все. Библиотека есть, tlc в ней есть, UID я написал.
    Но когда делаю отладку и нажимаю в робур на команду, то ничего не происходит.

    #6548
    Alexandr Rumynatsev
    Участник

    Я имел ввиду, что ещё нужно чтобы вставить модельку на план

    • Ответ изменён 4 месяца, 2 недели назад пользователем Alexandr Rumynatsev.
    #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 месяца, 2 недели назад пользователем Support Engineer.
    #6559
    Alexandr Rumynatsev
    Участник

    Отлично! Огромное спасибо.
    Единственное, хотелось бы уточнить:

    var element = TypedObjectCollections.Current.FindObject("CustomConstructedModelStorage:...") as ImElement;
    var block = drawing.ActiveSpace;
    var entity = new DwgModel3DElement{Element = element, Position =  point};

    здесь мы используем DwgModel3DElement{Element = element, Position = point}, где position может быть только 3D вектор, но все мои tlc объекты подразумевают вставку по SmdxPolylin (таким образом у меня сборки алайнится по выбранному линейному объекты. И вот как такое устроить?
    Для стрктурной можно наверное использовать var strLine = SurfaceLayer.GetSurfaceLayer(cadView).SelectOneStructureLine, но опять же DwgModel3DElement в posittion такое не примет..

    #6560
    Alexandr Rumynatsev
    Участник

    Поясню, выравнивание происходит уже в рамках TLC, т.е. мне требуется лиш корректно передать линейный объект для TLC

    #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();
Просмотр 9 сообщений - с 1 по 9 (из 9 всего)
  • Для ответа в этой теме необходимо авторизоваться.