Главная › Форум › Общие вопросы по продуктам четвертого поколения программного комплекса «Топоматик Robur» › Разное › Разработка
- В этой теме 8 ответов, 2 участника, последнее обновление 11 месяцев назад сделано Support Engineer.
-
АвторСообщения
-
13.12.2023 в 08:10 #6532Alexandr RumynatsevУчастник
В попытках освоения c#:
Пытаюсь через FindObject сделать кнопку для загрузки TLC из пользовательской библиотеке.
cmd[…]
public void …
{
var El = TypedObjectCollections.Current.FindObject(…) as ImElement;
}
Что ещё требуется дописать для корректной работы?14.12.2023 в 11:16 #6538Support EngineerУчастникЗдравствуйте!
Вам нужен только идентификатор вашей сборки в формате «CustomConstructedModelStorage:UID». Его можно получить из интерфейса ПО Топоматик Робур. ПКМ по сборке и копировать идентификатор. (см. прикреплённые скриншоты)
ImElement _element = TypedObjectCollections.Current.FindObject("CustomConstructedModelStorage:UID") as ImElement;
- Ответ изменён 11 месяцев, 2 недели назад пользователем Support Engineer.
Вложения:
Вы должны войти для просмотра вложений.14.12.2023 в 19:51 #6545Alexandr RumynatsevУчастникДело в другом.
- Ответ изменён 11 месяцев, 2 недели назад пользователем Alexandr Rumynatsev.
14.12.2023 в 19:53 #6547Alexandr RumynatsevУчастникЭто все я сделал и так, в рамках метода я понимаю все. Библиотека есть, tlc в ней есть, UID я написал.
Но когда делаю отладку и нажимаю в робур на команду, то ничего не происходит.14.12.2023 в 20:51 #6548Alexandr RumynatsevУчастникЯ имел ввиду, что ещё нужно чтобы вставить модельку на план
- Ответ изменён 11 месяцев, 2 недели назад пользователем Alexandr Rumynatsev.
15.12.2023 в 19:36 #6556Support 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.
16.12.2023 в 09:16 #6559Alexandr 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 такое не примет..16.12.2023 в 10:30 #6560Alexandr RumynatsevУчастникПоясню, выравнивание происходит уже в рамках TLC, т.е. мне требуется лиш корректно передать линейный объект для TLC
26.12.2023 в 15:00 #6567Support 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();
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.