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

ADN Club => Civil 3D API => Тема начата: Вильдар от 19-04-2019, 15:00:54

Название: Стили копируются из шаблона, только, один раз за сеанс работы в Civil
Отправлено: Вильдар от 19-04-2019, 15:00:54
Странная особенность обнаружилась сегодня.
Копирую стили из файла шаблона, таким методом:
Код - C# [Выбрать]
  1. styleBase.ExportTo(dbTarget, mode);
Но, срабатывает только первый раз! Нужно перезапускать Civil, чтобы скопировать еще раз.
Никто не сталкивался?

Civil 2019
Название: Re: Стили копируются из шаблона, только, один раз за сеанс работы в Civil
Отправлено: Дмитрий Загорулькин от 19-04-2019, 15:04:42
Что-то непонятно. Только один раз этот метод отрабатывает? Или один раз цикл переноса стилей?
Название: Re: Стили копируются из шаблона, только, один раз за сеанс работы в Civil
Отправлено: Вильдар от 19-04-2019, 15:11:36
Мне из шаблона нужно скопировать эти стили:
Код - C# [Выбрать]
  1. PipeStyles),
  2. StructureStyles),
  3. PipeRuleSetStyles),
  4. StructureRuleSetStyles),
  5. ProfileViewStyles),
  6. ProfileViewBandSetStyles),
  7. LabelStyles.PipeLabelStyles.PlanProfileLabelStyles)
  8. LabelStyles.PipeLabelStyles.CrossSectionLabelStyles
  9. LabelStyles.StructureLabelStyles.LabelStyles),
Шаблон открываю через:
Код - C# [Выбрать]
  1. dbTemplate.ReadDwgFile
Потом экпортирую все эти стили в рабочую базу.

И вот, эта команда, по копированию стилей из шаблона, срабатывает только один раз за сеанс.  :o
Т.е. при первом запуске команды в сеансе - все норм копируется. А, потом - нет.
Название: Re: Стили копируются из шаблона, только, один раз за сеанс работы в Civil
Отправлено: Дмитрий Загорулькин от 19-04-2019, 15:24:59
Может быть тут какая-то тонкость в работе с базой данных? Не закрытая осталась, или ещё что-нибудь подобное...
Название: Re: Стили копируются из шаблона, только, один раз за сеанс работы в Civil
Отправлено: Andant от 14-05-2019, 10:00:23
Я использовал статический метод StyleBase с тремя параметрами:
Код - C# [Выбрать]
  1. public static void ExportTo(
  2.         ObjectIdCollection styleIds,
  3.         Database destinationDatabase,
  4.         StyleConflictResolverType conflictResolution
  5. )
  6.  
Все работает нормально.
Название: Re: Стили копируются из шаблона, только, один раз за сеанс работы в Civil
Отправлено: Вильдар от 14-05-2019, 11:17:05
Не, так ничего не копируется.
Похоже, что ошибка копирования кого-то одного стиля, приводит к откату копирования всех.
Но, эти ошибки не отлавливаются почему-то.  :-[
Название: Re: Стили копируются из шаблона, только, один раз за сеанс работы в Civil
Отправлено: Александр Ривилис от 14-05-2019, 11:27:22
Похоже, что ошибка копирования кого-то одного стиля, приводит к откату копирования всех.
Ну а если попробовать копировать по-одному стилю за раз? Само собой, что он не должен быть открыт.
Название: Re: Стили копируются из шаблона, только, один раз за сеанс работы в Civil
Отправлено: Вильдар от 14-05-2019, 11:42:40
Да, копирую по одному. Статический метод копирования кучи стилей не заметил.
Вот кусочек:
Код - C# [Выбрать]
  1. FindLoadedStyles(loadedStyles, rootTemplate, rootTarget);
  2. foreach (var style in loadedStyles.Where(w => !w.TemplateStyleId.IsNull))
  3. {
  4.    var styleBase = (StyleBase)style.TemplateStyleId.GetObject(OpenMode.ForRead);
  5.    styleBase.ExportTo(dbTarget, mode);
  6. }
  7. t.Commit();

Типа, первый раз копируются стили, но какой-то стиль косячит, и последующие попытки копирований стилей вообще перестают работать напрочь.  :o

Нужно вычислить виновный стиль.  8)
Название: Re: Стили копируются из шаблона, только, один раз за сеанс работы в Civil
Отправлено: Александр Ривилис от 14-05-2019, 11:46:16
Ну неплохо бы проверить, что в dbTarget еще нет одноимённого стиля и что после операции экспорта новый стиль появляется.
Название: Re: Стили копируются из шаблона, только, один раз за сеанс работы в Civil
Отправлено: Andant от 14-05-2019, 12:12:02
И чему равно значение параметра mode (StyleConflictResolverType) ?
Название: Re: Стили копируются из шаблона, только, один раз за сеанс работы в Civil
Отправлено: Александр Ривилис от 14-05-2019, 12:16:37
Вильдар,
Кстати, а дочерние стили ты копируешь?
Глянь пример: https://adndevblog.typepad.com/infrastructure/2013/02/resolving-style-conflicts-in-exporting-styles-using-net-api.html
Название: Re: Стили копируются из шаблона, только, один раз за сеанс работы в Civil
Отправлено: Вильдар от 14-05-2019, 12:32:07
И чему равно значение параметра mode (StyleConflictResolverType) ?
Override.
С Ignore - лучше копируется. Куча стилей копируется первый раз, дальше глохнет. По-одному стилю - копируется всегда.
Нас Override интересует.
Кстати, а дочерние стили ты копируешь?
Дочерние стили есть у конкретных классов стилей. Например LabelStyle (как в примере). Я не знаю, что, все классы проверять?
Попробую проверить. Их не так много, которые мы копируем.
Название: Re: Стили копируются из шаблона, только, один раз за сеанс работы в Civil
Отправлено: Александр Ривилис от 14-05-2019, 12:39:44
Дочерние стили есть у конкретных классов стилей. Например LabelStyle (как в примере). Я не знаю, что, все классы проверять?
Я думал, что для для полноты копирования тебе нужно скопировать и дочерние. Но если дочерние стили тебе не нужны, то можешь моё замечание проигнорировать.
По-одному стилю - копируется всегда.
Ну и копируй их по одному. А чтобы не было транзакции можешь использовать статический метод ExportTo, передавая по одному ObjectId.
Название: Re: Стили копируются из шаблона, только, один раз за сеанс работы в Civil
Отправлено: Вильдар от 14-05-2019, 13:04:06
Ну и копируй их по одному.
Так работает, только при Ignore режиме.
При Override - только первый раз за сеанс.
Название: Re: Стили копируются из шаблона, только, один раз за сеанс работы в Civil
Отправлено: Александр Ривилис от 14-05-2019, 13:13:12
При Override - только первый раз за сеанс.
При этом ничего не открыто в транзакции? Это могут быть и стили и еще что-то, на что эти стили могут ссылаться.
Если в режиме Ignore всё нормально копируется, то нужно задуматься над предварительным переименованием стилей в dbTarget (если это возможно).