Подмена видов профилей

Автор Тема: Подмена видов профилей  (Прочитано 8116 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Подмена видов профилей
« : 03-04-2019, 13:32:06 »
Необходимо сделать подмену всех видов профилей.

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

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

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

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

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


Оффлайн Алексей Терно

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Re: Подмена видов профилей
« Ответ #1 : 03-04-2019, 13:38:22 »
А трассу зачем удалять, если можно виды профилей из нее удалить?

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Подмена видов профилей
« Ответ #2 : 03-04-2019, 13:48:22 »
Подскажите, я в правильном направлении мыслю?
Да кто же его знает... Мне, например, совершенно непонятна задача.
Необходимо сделать подмену всех видов профилей.

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

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

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Подмена видов профилей
« Ответ #3 : 03-04-2019, 14:59:23 »
Да смысл все тот же. Пытаюсь решить все туже проблему.
Поменялась проектируемая поверхность.
А вид профиля как на зло все по старой земле строится.
Видимо где-то закеширована поверхность старая на виде профиля и все.

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

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


 
 

Отмечено как Решение Алексей (IdeaSoft) 05-04-2019, 09:45:17

Оффлайн Алексей Терно

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Re: Подмена видов профилей
« Ответ #4 : 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)

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Подмена видов профилей
« Ответ #5 : 03-04-2019, 15:11:43 »
Ты можешь создать новый профиль по поверхности
Да это хорошая идея, тогда я должен получить этот профиль из вида.

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

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

и потом подменить на новый.

Оффлайн Алексей Терно

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Re: Подмена видов профилей
« Ответ #6 : 03-04-2019, 15:20:46 »
Код - C# [Выбрать]
  1. Alignment.GetProfileIds()

Оффлайн Алексей Терно

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Re: Подмена видов профилей
« Ответ #7 : 03-04-2019, 15:22:33 »
и потом подменить на новый.
Старый профиль тебе нужно удалить и создать новый. "Подменить" профиль ты не сможешь - это будут два разных объекта с разными ObjectId.

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Подмена видов профилей
« Ответ #8 : 03-04-2019, 15:43:35 »
Alignment.GetProfileIds()
Т.е. на сколько я понял объект вида профиля тут не при чем.
Все идет через объект трассы (Alignment)
Получается, что если я в трассе удалю объект профиля и создам новый,
то на виде профиля автоматически обновиться линия земли.
Я правильно понял? Если да, то это как раз то что мнем нужно.
 

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Подмена видов профилей
« Ответ #9 : 03-04-2019, 16:32:39 »
CreateFromSurface(string profileName, CivilDocument document, string alignmentName, string surfaceName, string layerName, string styleName, string labelSetName)
Вот тут вот только не понятно как получить имя стиля метки (последний аргумент функции CreateFromSurface)

Оффлайн Алексей Терно

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Re: Подмена видов профилей
« Ответ #10 : 03-04-2019, 16:49:20 »
Вот тут вот только не понятно как получить имя стиля метки (последний аргумент функции CreateFromSurface)
Самый простой вариант - это взять эти параметры из существующего профиля, который будет удаляться.

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Подмена видов профилей
« Ответ #11 : 03-04-2019, 16:52:15 »
Самый простой вариант - это взять эти параметры из существующего профиля, который будет удаляться
Так я не могу найти это свойство у профиля которое отвечает за имя стиля метки

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Подмена видов профилей
« Ответ #12 : 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.???);

                           

Оффлайн Алексей Терно

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Re: Подмена видов профилей
« Ответ #13 : 03-04-2019, 17:03:37 »
Да - эти метки надо по-другому получать:
Код - C# [Выбрать]
  1. civ_doc.Styles.LabelSetStyles.ProfileLabelSetStyles

Оффлайн Алексей Терно

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Re: Подмена видов профилей
« Ответ #14 : 03-04-2019, 17:04:40 »
Получается, что если я в трассе удалю объект профиля и создам новый,
то на виде профиля автоматически обновиться линия земли.
Я правильно понял?
По идее так и должно быть.

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Подмена видов профилей
« Ответ #15 : 03-04-2019, 17:38:46 »
А элементы коллекции ProfileLabelSetStyleCollection какого типа данных?


Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Подмена видов профилей
« Ответ #16 : 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);

Оффлайн Алексей Терно

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Re: Подмена видов профилей
« Ответ #17 : 03-04-2019, 18:00:49 »
Я сейчас не у компа и не могу посмотреть, но скорее всего это ProfileLabelSet
В принципе, ты все правильно написал. Если тебе нужен конкретный набор меток, то просто по этой коллекции делаешь цикл и проверяешь имя каждого набора в чертеже и находишь тот, который нужен.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Подмена видов профилей
« Ответ #18 : 03-04-2019, 18:27:53 »
Есть же перегрузка этого метода, которая требует не строки-имена, а ObjectId. И можно будет передать сразу idSetLS, не открывая для получения его имени.
Вообще, очень странно, что перегрузка со строками не помечена как Obsolete.

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Подмена видов профилей
« Ответ #19 : 03-04-2019, 19:08:57 »
Если тебе нужен конкретный набор меток, то просто по этой коллекции делаешь цикл и проверяешь имя каждого набора в чертеже и находишь тот, который нужен.
Ну я вообщем так и сделал. Только пока не могу понять какую метку и коллекции взять. Если беру первую метод возвращает ошибку

Оффлайн Алексей Терно

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Re: Подмена видов профилей
« Ответ #20 : 03-04-2019, 21:22:19 »
Если беру первую метод возвращает ошибку
Что за ошибка?

Оффлайн Алексей Терно

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Re: Подмена видов профилей
« Ответ #21 : 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. }

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Подмена видов профилей
« Ответ #22 : 04-04-2019, 09:59:18 »
Что за ошибка?
Пишет что профиль с таким именем уже существует.

The profile name already exists, Please use a nother one
Это что же получается, что в последнем аргументе я должен использовать что-то новое?

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Подмена видов профилей
« Ответ #23 : 04-04-2019, 10:58:20 »
Это что же получается, что в последнем аргументе я должен использовать что-то новое?
В первом. Да, новое и уникальное.

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Подмена видов профилей
« Ответ #24 : 04-04-2019, 11:04:28 »
В первом. Да, новое и уникальное.
Я правильно понял?
Значит я не могу взять имя того профиля (первый аргумент) подменяю
Я должен придумывать каждый раз новое уникальное имя профилю?

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Подмена видов профилей
« Ответ #25 : 04-04-2019, 11:25:21 »
Да, всё верно.

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Подмена видов профилей
« Ответ #26 : 04-04-2019, 13:38:19 »
Ура!
Спасибо все огромно все получилось!!!

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Подмена видов профилей
« Ответ #27 : 05-04-2019, 09:47:35 »
В этой теме отметил решение где написано про функцию Profile.CreateFromSurface
Именно эта функция помогла решить проблему.

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Подмена видов профилей
« Ответ #28 : 05-04-2019, 16:14:15 »
И можно будет передать сразу idSetLS
А членом какого класса является поле idSetLS?
Ой что-то я затупил idSetLS это моя переменная.