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

ADN Club => Civil 3D API => Тема начата: Вильдар от 05-12-2018, 11:57:08

Название: Слетают настройки стиля, при копировании из другого чертежа
Отправлено: Вильдар от 05-12-2018, 11:57:08
Пока без примера и подробностей, может кто сталкивался.
Необычное поведением копирования стиля методом ExportTo.
Стиль: Трасса -> Стили меток -> Пикет -> Основной пикет.
Слетает настройка высоты текста в 0.

Название: Re: Слетают настройки стиля, при копировании из другого чертежа
Отправлено: Дмитрий Загорулькин от 05-12-2018, 12:14:35
А если вручную импортировать (https://knowledge.autodesk.com/support/civil-3d/learn-explore/caas/CloudHelp/cloudhelp/2019/ENU/Civil3D-UserGuide/files/GUID-AC22945C-CDF2-4BCD-A071-D0A4BFCE83BD-htm.html), не слетает?
Название: Re: Слетают настройки стиля, при копировании из другого чертежа
Отправлено: Вильдар от 05-12-2018, 12:30:48
Нет, не слетает.
Название: Re: Слетают настройки стиля, при копировании из другого чертежа
Отправлено: Дмитрий Загорулькин от 05-12-2018, 12:39:53
А это только с вашим определённым стилем или вообще с любым? Не пробовали на каком-нибудь стандартном шаблоне из поставки Civil 3D (например, _AutoCAD Civil 3D (Metric) NCS.dwt)?
Название: Re: Слетают настройки стиля, при копировании из другого чертежа
Отправлено: Вильдар от 05-12-2018, 12:57:03
Да, штатные стили тоже слетают.
(https://i.postimg.cc/CdtpjkD7/height0.jpg) (https://postimg.cc/CdtpjkD7)
Название: Re: Слетают настройки стиля, при копировании из другого чертежа
Отправлено: Дмитрий Загорулькин от 05-12-2018, 12:58:58
Файл-приёмник тоже чертеж по стандартному шаблону?
Название: Re: Слетают настройки стиля, при копировании из другого чертежа
Отправлено: Вильдар от 05-12-2018, 14:43:49
Нет.
Если по стандартному шаблону. То, все ок.
Странно.
Название: Re: Слетают настройки стиля, при копировании из другого чертежа
Отправлено: Дмитрий Загорулькин от 05-12-2018, 15:00:42
А в файле-приёмнике случайно не заблокированы настройки стиля текста для меток?
Название: Re: Слетают настройки стиля, при копировании из другого чертежа
Отправлено: Вильдар от 05-12-2018, 15:10:56
Это как?  :-[
Название: Re: Слетают настройки стиля, при копировании из другого чертежа
Отправлено: Дмитрий Загорулькин от 05-12-2018, 15:18:24
Это общие настройки для всех меток в чертеже. Можно, например, заблокировать изменение стиля и высоты текста для всех меток.
Название: Re: Слетают настройки стиля, при копировании из другого чертежа
Отправлено: Вильдар от 05-12-2018, 15:25:42
Там все разблокировано. И в шаблоне и в файле в который копирую стили.
Название: Re: Слетают настройки стиля, при копировании из другого чертежа
Отправлено: Вильдар от 05-12-2018, 15:29:08
Чтоб не совсем сухо было  ;D
Библиотечный код загрузки стилей.
Извините, вам запрещён просмотр содержимого спойлеров.

Использование:
Код - C# [Выбрать]
  1.    StyleManager.LoadStyles(db, new List<LoadStyle>
  2.    {
  3.        new LoadStyle("PIK_С пикетами", s => s.LabelSetStyles.AlignmentLabelSetStyles, s => labelSetId = s),
  4.        new LoadStyle("PIK_Трасса", s => s.AlignmentStyles, s => alignmentStyleId = s)
  5.    }, templateFile, StyleConflictResolverType.Override);
Название: Re: Слетают настройки стиля, при копировании из другого чертежа
Отправлено: Дмитрий Загорулькин от 05-12-2018, 15:47:21
Насколько я помню, строчки кода 28 и 29 надо поменять местами.
Название: Re: Слетают настройки стиля, при копировании из другого чертежа
Отправлено: Вильдар от 05-12-2018, 15:58:03
Да, точно. Везде CloseInput пишут после ReadDwgFile.
CloseInput  - освобождает хендлер файла. Как я теперь понял.  ???
Название: Re: Слетают настройки стиля, при копировании из другого чертежа
Отправлено: Дмитрий Загорулькин от 05-12-2018, 16:00:49
Я так понимаю, что если это исправить,  то всё равно основная проблема остаётся?
Название: Re: Слетают настройки стиля, при копировании из другого чертежа
Отправлено: Александр Ривилис от 05-12-2018, 16:04:02
А я бы заменил:
Код - C# [Выбрать]
  1. using (var dbTemplate = new Database(false, true))
на
Код - C# [Выбрать]
  1. using (var dbTemplate = new Database(false, false))
Название: Re: Слетают настройки стиля, при копировании из другого чертежа
Отправлено: Вильдар от 05-12-2018, 16:11:11
Я так понимаю, что если это исправить,  то всё равно основная проблема остаётся?
Да, это не повлияло.

А я бы заменил:
Интересно. Попробовал. Не заметно, что создается документ.
На поведение копирования стилей, не повлияло.
Название: Re: Слетают настройки стиля, при копировании из другого чертежа
Отправлено: Александр Ривилис от 05-12-2018, 16:37:54
Не заметно, что создается документ.
Он не создаётся. Используется текущий. Главное, что есть связь документа сбазой данных. Для некоторых операций это очень важно.
Название: Re: Слетают настройки стиля, при копировании из другого чертежа
Отправлено: Дмитрий Загорулькин от 05-12-2018, 19:55:23
Потестировал в самом упрощённом варианте - проблем нет.
Код:
Код - 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" использовать ваш чертёж. По результатам можно будет делать уже какие-то выводы.
Название: Re: Слетают настройки стиля, при копировании из другого чертежа
Отправлено: Вильдар от 05-12-2018, 20:09:36
Ого. Спасибо большое. Попробую.
Название: Re: Слетают настройки стиля, при копировании из другого чертежа
Отправлено: Вильдар от 05-12-2018, 20:20:40
В чертеж по штатному шаблону (даже по пустому автокадовскому), норм копирует стиль.
А в чертеж по нашему "пустому" шаблону - слетает высота.
Civil 2017. "Пустой" шаблон приложил. Может в нем что-то не так?
Название: Re: Слетают настройки стиля, при копировании из другого чертежа
Отправлено: Дмитрий Загорулькин от 06-12-2018, 10:52:22
Хм... Очень странное поведение.
Опыт №1:
Открываю первым мой чертёж Source, вторым создаю чертёж по вашему шаблону - высота текста не слетает.
Опыт №2
Создаю первым новый чертёж по стандартному шаблону, вторым создаю чертёж по вашему шаблону - высота текста слетает.
Опыт №3
Создаю новый чертёж по стандартному шаблону, сохраняю его на диске. Для чистоты эксперимента перезапускаю Civil и провожу опыт по сценарию опыта №1 - высота текста слетает!!! И вот это меня сильно озадачивает - я создавал чертёж Source именно так и с ним работает нормально!
Просто мистика какая-то!
В целом, да, подтверждаю - проблема с экспортом имеется.
Видео тестов:

Название: Re: Слетают настройки стиля, при копировании из другого чертежа
Отправлено: Дмитрий Загорулькин от 06-12-2018, 11:29:31
Оказывается, всё довольно логично!
Вот такой код будет экспортировать без потери высоты текста:
Код - 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.  
Название: Re: Слетают настройки стиля, при копировании из другого чертежа
Отправлено: Александр Ривилис от 06-12-2018, 11:31:34
Оказывается, всё довольно логично!
И в чем заключается логика? И зачем блокировать документ из которого ты копируешь?
Название: Re: Слетают настройки стиля, при копировании из другого чертежа
Отправлено: Дмитрий Загорулькин от 06-12-2018, 11:41:13
И в чем заключается логика?
В исходном чертеже в настройках стиля высота текста метки берётся "по умолчанию". А в целевом чертеже это значение по умолчанию кто-то выставил равным 0.0. Поэтому, помимо самих стилей, нужно ещё импортировать и настройки стиля метки "по умолчанию". В коде я это сделал только для высоты текста. Но по-хорошему и остальные параметры надо бы перетянуть.
И зачем блокировать документ из которого ты копируешь?
Думаю, что это действительно лишнее действие. Но надо проверять.
Название: Re: Слетают настройки стиля, при копировании из другого чертежа
Отправлено: Александр Ривилис от 06-12-2018, 11:44:22
В коде я это сделал только для высоты текста. Но по-хорошему и остальные параметры надо бы перетянуть.
Согласен.
Думаю, что это действительно лишнее действие. Но надо проверять.
По хорошему нужно блокировать файл-приёмник, а не файл источник.
Название: Re: Слетают настройки стиля, при копировании из другого чертежа
Отправлено: Вильдар от 06-12-2018, 12:56:26
Вау, круто. Буду копировать параметры чертежа.
Но, не уловвил, почему ему 0 так не нравиться.  ???
Название: Re: Слетают настройки стиля, при копировании из другого чертежа
Отправлено: Дмитрий Загорулькин от 06-12-2018, 13:24:38
Но, не уловвил, почему ему 0 так не нравиться.
В исходном чертеже высота текста берётся из настроек по умолчанию. То есть, там не значение, а ссылка на значение по умолчанию. А в целевом это значение 0.0. Вот оно и вставляется.
Картинка для пояснения - как это выглядит в исходном чертеже:

(https://i.postimg.cc/BLfZTZzM/20181206-labeltextsettings.png) (https://postimg.cc/BLfZTZzM)
Название: Re: Слетают настройки стиля, при копировании из другого чертежа
Отправлено: Вильдар от 06-12-2018, 14:19:14
А как понять, что там ссылка на дефолтное значение?
Если высота текста в стиле совпадает с дефолтной - это ссылка?
Или пока ручками никто не трогал - ссылка.  :)
Название: Re: Слетают настройки стиля, при копировании из другого чертежа
Отправлено: Вильдар от 06-12-2018, 14:23:11
Похоже, пока ручками не трогать.
А нет, это управляется в стиле:
(https://i.postimg.cc/KR2TWwXH/texth.jpg) (https://postimg.cc/KR2TWwXH)
Название: Re: Слетают настройки стиля, при копировании из другого чертежа
Отправлено: Дмитрий Загорулькин от 06-12-2018, 14:32:47
Да, у текста в стиле есть это свойство - переопределённость какой-то настройки по отношению к настройкам по умолчанию. Это свойство можно прочитать программно (пример для высоты текста):
LabelStyle.GetComponents(LabelStyleComponentType.Text) -> LabelStyleTextComponent.Text -> LabelStyleTextComponent.StyleText.Height => PropertyDouble.Overridden