Слетают настройки стиля, при копировании из другого чертежа

Автор Тема: Слетают настройки стиля, при копировании из другого чертежа  (Прочитано 14066 раз)

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

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
А я бы заменил:
Код - C# [Выбрать]
  1. using (var dbTemplate = new Database(false, true))
на
Код - C# [Выбрать]
  1. using (var dbTemplate = new Database(false, false))
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Я так понимаю, что если это исправить,  то всё равно основная проблема остаётся?
Да, это не повлияло.

А я бы заменил:
Интересно. Попробовал. Не заметно, что создается документ.
На поведение копирования стилей, не повлияло.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Не заметно, что создается документ.
Он не создаётся. Используется текущий. Главное, что есть связь документа сбазой данных. Для некоторых операций это очень важно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Потестировал в самом упрощённом варианте - проблем нет.
Код:
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.Runtime;
  4. using Autodesk.Civil;
  5. using Autodesk.Civil.ApplicationServices;
  6. using Autodesk.Civil.DatabaseServices.Styles;
  7. using System.Collections.Generic;
  8.  
  9. namespace C3d2018Test
  10. {
  11.     public class Class1
  12.     {
  13.         [CommandMethod("ExportStyleTest", CommandFlags.Session)]
  14.         public void ExportStyle()
  15.         {
  16.             List<Document> docs = new List<Document>();
  17.             foreach (Document adoc in Application.DocumentManager)
  18.             {
  19.                 docs.Add(adoc);
  20.             }
  21.  
  22.             if (docs.Count < 2) return;
  23.  
  24.             Document firstDoc = docs[0];
  25.             Database firstDb = firstDoc.Database;            
  26.  
  27.             CivilDocument cdoc = CivilDocument.GetCivilDocument(firstDb);
  28.             ObjectId labelStyleId = cdoc.Styles.LabelStyles.AlignmentLabelStyles.MajorStationLabelStyles["Parallel with Tick"];
  29.             using (firstDoc.LockDocument())
  30.             using (Transaction tr = firstDb.TransactionManager.StartTransaction())
  31.             {
  32.                 StyleBase labelStyle = tr.GetObject(labelStyleId, OpenMode.ForRead) as StyleBase;
  33.                 labelStyle.ExportTo(docs[1].Database, StyleConflictResolverType.Override);
  34.                 tr.Commit();
  35.             }
  36.         }
  37.     }
  38. }
  39.  
Чертежи на которых тестировал прикладываю, версия чертежей - Civil 3D 2018.
Первым открываю чертёж "Source", вторым - "ToImport". Создаваемый по умолчанию "Чертёж 1" закрываю, т.е. на начало теста у меня только 2 открытых чертежа.
Загружаю код, запускаю команду EXPORTSTYLETEST. В чертеж "ToImport" импортируется стиль меток основного пикета трассы "Parallel with Tick", которого там изначально не было. Высота текста метки соответствует настройкам из чертежа "Source".
Предлагаю проверить как будет работать этот код, только вместо чертежа "ToImport" использовать ваш чертёж. По результатам можно будет делать уже какие-то выводы.

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Ого. Спасибо большое. Попробую.

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
В чертеж по штатному шаблону (даже по пустому автокадовскому), норм копирует стиль.
А в чертеж по нашему "пустому" шаблону - слетает высота.
Civil 2017. "Пустой" шаблон приложил. Может в нем что-то не так?

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Хм... Очень странное поведение.
Опыт №1:
Открываю первым мой чертёж Source, вторым создаю чертёж по вашему шаблону - высота текста не слетает.
Опыт №2
Создаю первым новый чертёж по стандартному шаблону, вторым создаю чертёж по вашему шаблону - высота текста слетает.
Опыт №3
Создаю новый чертёж по стандартному шаблону, сохраняю его на диске. Для чистоты эксперимента перезапускаю Civil и провожу опыт по сценарию опыта №1 - высота текста слетает!!! И вот это меня сильно озадачивает - я создавал чертёж Source именно так и с ним работает нормально!
Просто мистика какая-то!
В целом, да, подтверждаю - проблема с экспортом имеется.
Видео тестов:

« Последнее редактирование: 06-12-2018, 11:43:34 от Дмитрий Загорулькин »

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Оказывается, всё довольно логично!
Вот такой код будет экспортировать без потери высоты текста:
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.Runtime;
  4. using Autodesk.Civil;
  5. using Autodesk.Civil.ApplicationServices;
  6. using Autodesk.Civil.DatabaseServices.Styles;
  7. using System.Collections.Generic;
  8.  
  9. namespace C3d2018Test
  10. {
  11.     public class TestExportStyle
  12.     {
  13.         [CommandMethod("ExportStyleTest", CommandFlags.Session)]
  14.         public void ExportStyle()
  15.         {
  16.             List<Document> docs = new List<Document>();
  17.             foreach (Document adoc in Application.DocumentManager)
  18.             {
  19.                 docs.Add(adoc);
  20.             }
  21.  
  22.             if (docs.Count < 2) return;
  23.  
  24.             Document firstDoc = docs[0];
  25.             Database firstDb = firstDoc.Database;
  26.  
  27.             CivilDocument firstCdoc = CivilDocument.GetCivilDocument(firstDb);
  28.             double txtHeight = firstCdoc.Styles.LabelStyles.DefaultLabelStyle.Components.TextHeight.Value;
  29.  
  30.             Document secondDoc = docs[1];
  31.             Database secondDb = secondDoc.Database;
  32.  
  33.             using (secondDoc.LockDocument())
  34.             {
  35.                 CivilDocument secondCdoc = CivilDocument.GetCivilDocument(secondDb);
  36.                 secondCdoc.Styles.LabelStyles.DefaultLabelStyle.Components.TextHeight.Value = txtHeight;
  37.             }
  38.  
  39.             ObjectId labelStyleId = firstCdoc.Styles.LabelStyles.AlignmentLabelStyles.MajorStationLabelStyles["Parallel with Tick"];
  40.             using (firstDoc.LockDocument())
  41.             using (Transaction tr = firstDb.TransactionManager.StartTransaction())
  42.             {
  43.                 StyleBase labelStyle = tr.GetObject(labelStyleId, OpenMode.ForRead) as StyleBase;
  44.                 labelStyle.ExportTo(docs[1].Database, StyleConflictResolverType.Override);
  45.                 tr.Commit();
  46.             }
  47.         }
  48.     }
  49. }
  50.  

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Оказывается, всё довольно логично!
И в чем заключается логика? И зачем блокировать документ из которого ты копируешь?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
И в чем заключается логика?
В исходном чертеже в настройках стиля высота текста метки берётся "по умолчанию". А в целевом чертеже это значение по умолчанию кто-то выставил равным 0.0. Поэтому, помимо самих стилей, нужно ещё импортировать и настройки стиля метки "по умолчанию". В коде я это сделал только для высоты текста. Но по-хорошему и остальные параметры надо бы перетянуть.
И зачем блокировать документ из которого ты копируешь?
Думаю, что это действительно лишнее действие. Но надо проверять.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
В коде я это сделал только для высоты текста. Но по-хорошему и остальные параметры надо бы перетянуть.
Согласен.
Думаю, что это действительно лишнее действие. Но надо проверять.
По хорошему нужно блокировать файл-приёмник, а не файл источник.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Вау, круто. Буду копировать параметры чертежа.
Но, не уловвил, почему ему 0 так не нравиться.  ???

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Но, не уловвил, почему ему 0 так не нравиться.
В исходном чертеже высота текста берётся из настроек по умолчанию. То есть, там не значение, а ссылка на значение по умолчанию. А в целевом это значение 0.0. Вот оно и вставляется.
Картинка для пояснения - как это выглядит в исходном чертеже:



Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
А как понять, что там ссылка на дефолтное значение?
Если высота текста в стиле совпадает с дефолтной - это ссылка?
Или пока ручками никто не трогал - ссылка.  :)

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Похоже, пока ручками не трогать.
А нет, это управляется в стиле: