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

ADN Club => Civil 3D API => Тема начата: Алексей (IdeaSoft) от 03-04-2019, 13:32:06

Название: Подмена видов профилей
Отправлено: Алексей (IdeaSoft) от 03-04-2019, 13:32:06
Необходимо сделать подмену всех видов профилей.

Хочу сделать команду разработав алгоритм на AutoCAD API

Краткое описание задачки:
Есть исходная трасса. По этой трассе генерировать
новый вид профиля, а старый удалить

Последовательность алгоритма примерно такая:

1) На основе исходной трассы получить копию трассы
    (или создать новую трассу с теми же вводными параметрами что и в исходной)
2) Далее создать вид профиля по новой трассе
3) Удалить исходную трассу и вместе с ней удалится и связанный с ней вид профиля.

Подскажите, я в правильном направлении мыслю?

Название: Re: Подмена видов профилей
Отправлено: Алексей Терно от 03-04-2019, 13:38:22
А трассу зачем удалять, если можно виды профилей из нее удалить?
Название: Re: Подмена видов профилей
Отправлено: Дмитрий Загорулькин от 03-04-2019, 13:48:22
Подскажите, я в правильном направлении мыслю?
Да кто же его знает... Мне, например, совершенно непонятна задача.
Необходимо сделать подмену всех видов профилей.

Хочу сделать команду разработав алгоритм на AutoCAD API

Краткое описание задачки:
Есть исходная трасса. По этой трассе генерировать
новый вид профиля, а старый удалить
Смысл манипуляции? В итоге получится тот же самый вид профиля, который и был.
В любом случае, с помощью AutoCAD API такое точно не сделать - непонятен смысл его упоминания.
Off-Topic: показать
Алексей, ну ёлки-палки! Ну далеко не первый же раз тему создаёшь! Ну хоть бы раз нормально сформулировал вопрос! Каждый раз какие-то шарады...
Название: Re: Подмена видов профилей
Отправлено: Алексей (IdeaSoft) от 03-04-2019, 14:59:23
Да смысл все тот же. Пытаюсь решить все туже проблему.
Поменялась проектируемая поверхность.
А вид профиля как на зло все по старой земле строится.
Видимо где-то закеширована поверхность старая на виде профиля и все.

Старая поверхность уже физически с диска удалена.
На ее место подгрузил через быстрые ссылки новую поверхность,
а профили все равно по старой земле считают.
Это боль проектировщиков. Нужно переделывать все профили.

Что делать ума не приложу.


 
 
Название: Re: Подмена видов профилей
Отправлено: Алексей Терно от 03-04-2019, 15:05:45
Удалять трассу или вид профиля не обязательно. Ты можешь создать новый профиль по поверхности:
Код - C# [Выбрать]
  1. ObjectId Profile.CreateFromSurface(string profileName, CivilDocument document, string alignmentName, string surfaceName, string layerName, string styleName, string labelSetName)
Название: Re: Подмена видов профилей
Отправлено: Алексей (IdeaSoft) от 03-04-2019, 15:11:43
Ты можешь создать новый профиль по поверхности
Да это хорошая идея, тогда я должен получить этот профиль из вида.

Вот так вроде это сделать?

Код - C# [Выбрать]
  1. ProfileView.GetProfile(...);

и потом подменить на новый.
Название: Re: Подмена видов профилей
Отправлено: Алексей Терно от 03-04-2019, 15:20:46
Код - C# [Выбрать]
  1. Alignment.GetProfileIds()
Название: Re: Подмена видов профилей
Отправлено: Алексей Терно от 03-04-2019, 15:22:33
и потом подменить на новый.
Старый профиль тебе нужно удалить и создать новый. "Подменить" профиль ты не сможешь - это будут два разных объекта с разными ObjectId.
Название: Re: Подмена видов профилей
Отправлено: Алексей (IdeaSoft) от 03-04-2019, 15:43:35
Alignment.GetProfileIds()
Т.е. на сколько я понял объект вида профиля тут не при чем.
Все идет через объект трассы (Alignment)
Получается, что если я в трассе удалю объект профиля и создам новый,
то на виде профиля автоматически обновиться линия земли.
Я правильно понял? Если да, то это как раз то что мнем нужно.
 
Название: Re: Подмена видов профилей
Отправлено: Алексей (IdeaSoft) от 03-04-2019, 16:32:39
CreateFromSurface(string profileName, CivilDocument document, string alignmentName, string surfaceName, string layerName, string styleName, string labelSetName)
Вот тут вот только не понятно как получить имя стиля метки (последний аргумент функции CreateFromSurface)
Название: Re: Подмена видов профилей
Отправлено: Алексей Терно от 03-04-2019, 16:49:20
Вот тут вот только не понятно как получить имя стиля метки (последний аргумент функции CreateFromSurface)
Самый простой вариант - это взять эти параметры из существующего профиля, который будет удаляться.
Название: Re: Подмена видов профилей
Отправлено: Алексей (IdeaSoft) от 03-04-2019, 16:52:15
Самый простой вариант - это взять эти параметры из существующего профиля, который будет удаляться
Так я не могу найти это свойство у профиля которое отвечает за имя стиля метки
Название: Re: Подмена видов профилей
Отправлено: Алексей (IdeaSoft) от 03-04-2019, 16:57:49
Делаю так:
// trs - объект трассы
// pr - объект профиля
// civ_doc - объект Документа Civil
// sur - объект поверхности

Код - C# [Выбрать]
  1. foreach (ObjectId idpr in trs.GetProfileIds())
  2.    Profile.CreateFromSurface(pr.Name, civ_doc, trs.Name, sur.Name, pr.Layer, pr.StyleName, pr.???);

                           
Название: Re: Подмена видов профилей
Отправлено: Алексей Терно от 03-04-2019, 17:03:37
Да - эти метки надо по-другому получать:
Код - C# [Выбрать]
  1. civ_doc.Styles.LabelSetStyles.ProfileLabelSetStyles
Название: Re: Подмена видов профилей
Отправлено: Алексей Терно от 03-04-2019, 17:04:40
Получается, что если я в трассе удалю объект профиля и создам новый,
то на виде профиля автоматически обновиться линия земли.
Я правильно понял?
По идее так и должно быть.
Название: Re: Подмена видов профилей
Отправлено: Алексей (IdeaSoft) от 03-04-2019, 17:38:46
А элементы коллекции ProfileLabelSetStyleCollection какого типа данных?

Название: Re: Подмена видов профилей
Отправлено: Алексей (IdeaSoft) от 03-04-2019, 17:47:52
Как-то так у меня получается

Код - C# [Выбрать]
  1.   CIV_DBS.Styles.ProfileLabelSetStyleCollection coll  = civ_doc.Styles.LabelSetStyles.ProfileLabelSetStyles;
  2.                                 CAD_DBS.ObjectId idSetLS = coll[0];
  3.                                 CIV_DBS.Styles.StyleBase lab = (CIV_DBS.Styles.StyleBase)tr.GetObject(idSetLS, CAD_DBS.OpenMode.ForRead);
  4.                                 string SetName = lab.Name;
  5.                                
  6.  
  7.                                 Profile.CreateFromSurface(pr.Name, civ_doc, trs.Name, sur.Name, pr.Layer, pr.StyleName, SetName);
Название: Re: Подмена видов профилей
Отправлено: Алексей Терно от 03-04-2019, 18:00:49
Я сейчас не у компа и не могу посмотреть, но скорее всего это ProfileLabelSet
В принципе, ты все правильно написал. Если тебе нужен конкретный набор меток, то просто по этой коллекции делаешь цикл и проверяешь имя каждого набора в чертеже и находишь тот, который нужен.
Название: Re: Подмена видов профилей
Отправлено: Дмитрий Загорулькин от 03-04-2019, 18:27:53
Есть же перегрузка этого метода, которая требует не строки-имена, а ObjectId. И можно будет передать сразу idSetLS, не открывая для получения его имени.
Вообще, очень странно, что перегрузка со строками не помечена как Obsolete.
Название: Re: Подмена видов профилей
Отправлено: Алексей (IdeaSoft) от 03-04-2019, 19:08:57
Если тебе нужен конкретный набор меток, то просто по этой коллекции делаешь цикл и проверяешь имя каждого набора в чертеже и находишь тот, который нужен.
Ну я вообщем так и сделал. Только пока не могу понять какую метку и коллекции взять. Если беру первую метод возвращает ошибку
Название: Re: Подмена видов профилей
Отправлено: Алексей Терно от 03-04-2019, 21:22:19
Если беру первую метод возвращает ошибку
Что за ошибка?
Название: Re: Подмена видов профилей
Отправлено: Алексей Терно от 04-04-2019, 06:30:58
В общем виде получение набора меток профиля будет выглядеть так:
Код - C# [Выбрать]
  1. string ssname = "Полный набор меток";
  2. ObjectId labelsid = civildoc.Styles.LabelSetStyles.ProfileLabelSetStyles[0];
  3.  
  4. foreach (ObjectId id in civildoc.Styles.LabelSetStyles.ProfileLabelSetStyles)
  5. {
  6.     Db.Styles.ProfileLabelSetStyle ss = (Db.Styles.ProfileLabelSetStyle)trans.GetObject(id, OpenMode.ForRead);
  7.  
  8.     if (ss.Name == ssname)
  9.     {
  10.         labelsid = ss.Id;
  11.         break;
  12.     }
  13. }
Название: Re: Подмена видов профилей
Отправлено: Алексей (IdeaSoft) от 04-04-2019, 09:59:18
Что за ошибка?
Пишет что профиль с таким именем уже существует.

The profile name already exists, Please use a nother one
Это что же получается, что в последнем аргументе я должен использовать что-то новое?
Название: Re: Подмена видов профилей
Отправлено: Дмитрий Загорулькин от 04-04-2019, 10:58:20
Это что же получается, что в последнем аргументе я должен использовать что-то новое?
В первом. Да, новое и уникальное.
Название: Re: Подмена видов профилей
Отправлено: Алексей (IdeaSoft) от 04-04-2019, 11:04:28
В первом. Да, новое и уникальное.
Я правильно понял?
Значит я не могу взять имя того профиля (первый аргумент) подменяю
Я должен придумывать каждый раз новое уникальное имя профилю?
Название: Re: Подмена видов профилей
Отправлено: Дмитрий Загорулькин от 04-04-2019, 11:25:21
Да, всё верно.
Название: Re: Подмена видов профилей
Отправлено: Алексей (IdeaSoft) от 04-04-2019, 13:38:19
Ура!
Спасибо все огромно все получилось!!!
Название: Re: Подмена видов профилей
Отправлено: Алексей (IdeaSoft) от 05-04-2019, 09:47:35
В этой теме отметил решение где написано про функцию Profile.CreateFromSurface
Именно эта функция помогла решить проблему.
Название: Re: Подмена видов профилей
Отправлено: Алексей (IdeaSoft) от 05-04-2019, 16:14:15
И можно будет передать сразу idSetLS
А членом какого класса является поле idSetLS?
Ой что-то я затупил idSetLS это моя переменная.