Сообщество программистов Autodesk в СНГ

ADN Club => Civil 3D API => Тема начата: Павел55 от 21-03-2019, 13:05:21

Название: Как сделать копию поверхности в текущем чертеже
Отправлено: Павел55 от 21-03-2019, 13:05:21
Существуют ли какие то стандартные методы копирования существующей поверхности в текущий чертеж? Или  может быть можно как то поместить поверхность в быстрые ссылки а потом оттуда достать?
Название: Re: Как сделать копию поверхности в текущем чертеже
Отправлено: Александр Ривилис от 21-03-2019, 13:07:41
Существуют ли какие то стандартные методы копирования существующей поверхности в текущий чертеж? Или  может быть можно как то поместить поверхность в быстрые ссылки а потом оттуда достать?
Приветствую на форуме!
В Civil 3D есть разные типы поверхностей. О каком типе поверхности идёт речь? Желательно с указанием класса примитива.
Название: Re: Как сделать копию поверхности в текущем чертеже
Отправлено: Павел55 от 21-03-2019, 13:08:46
tinSurface
Название: Re: Как сделать копию поверхности в текущем чертеже
Отправлено: Павел55 от 21-03-2019, 13:15:30
Не знаю что такое класс примитива. Суть задачи - есть чертеж с определенным набором поверхностей, любую выбранную поверхность необходимо скопировать n раз и потом производить какие то операции над клонами(поднять/опустить).
Название: Re: Как сделать копию поверхности в текущем чертеже
Отправлено: Александр Ривилис от 21-03-2019, 13:16:34
tinSurface
Могу предположить, что можно создать TinSurface методом Create, а затем использовать метод CopyFrom из старой в новую. Но не уверен.
Название: Re: Как сделать копию поверхности в текущем чертеже
Отправлено: Павел55 от 21-03-2019, 13:31:23
после создания поверхности (ObjectId surf = TinSurface.Create(db, "Поверхность-n");) у surf нет метода CopyFrom.
Название: Re: Как сделать копию поверхности в текущем чертеже
Отправлено: Павел55 от 21-03-2019, 13:35:03
похоже что придется изобретать костыль - извлекать из поверхности точки и каждый раз создавать поверхность добавляя в нее эту группу точек. Но если поверхность сложная - то она построится как попало.
Название: Re: Как сделать копию поверхности в текущем чертеже
Отправлено: Александр Ривилис от 21-03-2019, 13:39:02
у surf нет метода CopyFrom.
surf - это ObjectId. А тебе нужен TinSurface. Поэтому должно быть как-то так:
Код - C# [Выбрать]
  1. ObjectId surfOldId = ... // Это ObjectId оригинальной поверхности
  2. using (Transaction tr = Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction())
  3. {
  4.    TinSurface surfaceOld = surfOldId.GetObject(OpenMode.ForRead) as TinSurface;
  5.    ObjectId surfNewId = TinSurface.Create(db, "Поверхность-n");
  6.    TinSurface surfaceNew = surfNewId.GetObject(OpenMode.ForWrite) as TinSurface;
  7.    surfaceNew.CopyFrom(surfaceOld);
  8.    tr.Commit();
  9. }
Код не проверял.
Название: Re: Как сделать копию поверхности в текущем чертеже
Отправлено: Александр Ривилис от 21-03-2019, 13:43:20
Еще есть метод TinSurface.CreateByCropping Method (Database, String, ObjectId, Point2dCollection), который тоже можно попробовать использовать для создания копии поверхности.
Название: Re: Как сделать копию поверхности в текущем чертеже
Отправлено: Павел55 от 21-03-2019, 13:44:40
этот метод позволяет вставить поверхность только в другой чертеж, но не в тот, в котором исходная поверхность
Название: Re: Как сделать копию поверхности в текущем чертеже
Отправлено: Александр Ривилис от 21-03-2019, 13:51:30
этот метод позволяет вставить поверхность только в другой чертеж, но не в тот, в котором исходная поверхность
Ты уже пробовал со вставкой в текущий чертеж?
Название: Re: Как сделать копию поверхности в текущем чертеже
Отправлено: Павел55 от 21-03-2019, 13:56:15
Только в ручном режиме -  Средствами Civil 3D. А  еще так написано  в справочнике по Civil 3D api - http://docs.autodesk.com/CIV3D/2017/ENU/API_Reference_Guide/html/7154a7a8-6129-30ed-5708-ea4ada2b3e90.htm
Название: Re: Как сделать копию поверхности в текущем чертеже
Отправлено: Александр Ривилис от 21-03-2019, 13:58:48
Павел55,
Вариант с CopyFrom тоже не сработал?
Название: Re: Как сделать копию поверхности в текущем чертеже
Отправлено: Павел55 от 21-03-2019, 14:01:28
Сработал! Ура) Только почему то имя копии поверхности = имя исходной поверхности. Спасибо за советы!  Приду к вам еще, так быстро мне не отвечали ни на одном форуме!
Название: Re: Как сделать копию поверхности в текущем чертеже
Отправлено: Александр Ривилис от 21-03-2019, 14:06:09
Павел55,
Теперь тебе осталось убедиться, что изменения во второй поверхности не повлияют на первую поверхность. Что касается имени, но оно видимо сидит в самом примитиве TinSurface и CopyFrom копирует и его. Нужно поискать способ переименования. Сходу я такого в API не нашёл.
Название: Re: Как сделать копию поверхности в текущем чертеже
Отправлено: Павел55 от 21-03-2019, 14:14:22
Изменение высоты точек  и изменение стиля поверхности ни на что не повлияло.
Название: Re: Как сделать копию поверхности в текущем чертеже
Отправлено: Павел55 от 21-03-2019, 14:23:47
ObjectId surfNewId = TinSurface.Create(db, "Поверхность-n") в этом методе второй аргумент - stringSurfaceName, а за отображение в дереве поверхностей отвечает другое свойство -  DisplayName. Поэтому при использовании метода мы видим поверхности-копии с одинаковыми именами.
Название: Re: Как сделать копию поверхности в текущем чертеже
Отправлено: Александр Ривилис от 21-03-2019, 14:31:52
ObjectId surfNewId = TinSurface.Create(db, "Поверхность-n") в этом методе второй аргумент - stringSurfaceName, а за отображение в дереве поверхностей отвечает другое свойство -  DisplayName. Поэтому при использовании метода мы видим поверхности-копии с одинаковыми именами.
Ага. Т.е. достаточно поменять DisplayName, чтобы имена поверхностей отличались. Отлично.
Название: Re: Как сделать копию поверхности в текущем чертеже
Отправлено: Александр Ривилис от 21-03-2019, 14:32:21
Изменение высоты точек  и изменение стиля поверхности ни на что не повлияло.
Отлично.
Название: Re: Как сделать копию поверхности в текущем чертеже
Отправлено: Павел55 от 21-03-2019, 14:34:32
Ага, только у этого свойства set закрыт, a методов чтоб поменять имя  я пока не нашел.
Название: Re: Как сделать копию поверхности в текущем чертеже
Отправлено: Александр Ривилис от 21-03-2019, 14:46:19
Ага, только у этого свойства set закрыт, a методов чтоб поменять имя  я пока не нашел.
Я пока тоже. Есть свойство Name, которое можно менять. Но похоже это не то, что тебе нужно.
Название: Re: Как сделать копию поверхности в текущем чертеже
Отправлено: Дмитрий Загорулькин от 21-03-2019, 15:16:53
Существуют ли какие то стандартные методы копирования существующей поверхности в текущий чертеж?
Насколько я знаю, в API Civil 3D такого нет.
Или  может быть можно как то поместить поверхность в быстрые ссылки а потом оттуда достать?
API Civil 3D не умеет работать с быстрыми ссылками.
а затем использовать метод CopyFrom из старой в новую.
Как и в любом другом случае, использование продвинутых методов AutoCAD на сложных объектах Civil 3D может привести к неожиданным результатам...

Нужно ещё уточнить, что Вы понимаете под копией поверхности. Что она должна забрать из исходной? Например:
1. Только текущее состояние геометрии поверхности
2. Текущее состояние геометрии и настройки её отображения
3. Полная копия: геометрия + отображение + ссылки на источники данных, формирующие поверхность
4. <свой вариант>
Название: Re: Как сделать копию поверхности в текущем чертеже
Отправлено: Павел55 от 21-03-2019, 16:47:14
Важна только геометрия
Название: Re: Как сделать копию поверхности в текущем чертеже
Отправлено: Дмитрий Загорулькин от 21-03-2019, 16:55:06
Если так, то вполне нормальный вариант вот этот:
похоже что придется изобретать костыль - извлекать из поверхности точки и каждый раз создавать поверхность добавляя в нее эту группу точек. Но если поверхность сложная - то она построится как попало.
Я не вижу в этом варианте ничего костыльного.
Чтобы поверхность построилась не "как попало", помимо точек нужно обработать ещё ограничивающие контуры и треугольники. Задачка не сказать что простая, но решаемая.
Название: Re: Как сделать копию поверхности в текущем чертеже
Отправлено: Павел55 от 21-03-2019, 16:58:34
Уже решили эту задачу с посощью метода CopyFrom
Название: Re: Как сделать копию поверхности в текущем чертеже
Отправлено: Дмитрий Загорулькин от 21-03-2019, 17:26:37
Уже решили эту задачу с посощью метода CopyFrom
Я выше уже писал о том, что результат может получиться неожиданный. CopyFrom - это такой чёрный ящик, если мы говорим про его работу с объектами Civil. Работа его в таком режиме не документирована и вряд ли тестировалась вообще. Применение, получается - на свой страх и риск. Я бы не рискнул, учитывая, что есть вполне рабочий альтернативный вариант. По закону подлости, какой-нибудь неожиданный "косяк" может вылезти в самый неподходящий момент. Но, тут, как говорится, дело хозяйское: моё - предупредить, ваше - принять решение с учётом всех обстоятельств.
Как в итоге справились с DisplayName?
Название: Re: Как сделать копию поверхности в текущем чертеже
Отправлено: Павел55 от 21-03-2019, 17:29:37
Пока никак) конечно, если какой то косяк вылезет, то буду переделывать, но пока требуется решение так сказать "в лоб", а потом уже тестировать и оптимизировать.