Копирование измененных свойств стиля "Standart" в новую базу.

Автор Тема: Копирование измененных свойств стиля "Standart" в новую базу.  (Прочитано 10839 раз)

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

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

Оффлайн pavka_97Автор темы

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
Например измененные свойства текстового стиля "Standart" при клонировании (db.WblockCloneObjects(ids,id, acIdMap, DuplicateRecordCloning.Ignore, false)) в новую базу (Database acDbNewDoc = new Database(true, true)) меняются на стандартные свойства стиля "Standart" новой базы. А есть ли способ быстрее, чем получать каждое измененное свойство стиля "Standart" и назначать его в новой базе?

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

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

Оффлайн pavka_97Автор темы

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
Поэтому и не копируются
Замена на другие варианты DuplicateRecordCloning не помогает.

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

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

Оффлайн pavka_97Автор темы

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
Копируется все. Измененный шрифт в стиле "Standart" - "Arial".В новой базе в стиле "Standart" -  шрифт "txt". Нужно чтобы было -"Arial".

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

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

Оффлайн pavka_97Автор темы

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
Off-Topic: показать
Попробую. Чуть позже.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Проверил:
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD.Geometry;
  5. using Autodesk.AutoCAD.Runtime;
  6. using System;
  7.  
  8. // This line is not mandatory, but improves loading performances
  9. [assembly: CommandClass(typeof(CopyStandartStyle.MyCommands))]
  10.  
  11. namespace CopyStandartStyle
  12. {
  13.   public class MyCommands
  14.   {
  15.     [CommandMethod("CopyStandard")]
  16.     public void CopyStandardHandler()
  17.     {
  18.       Document doc = Application.DocumentManager.MdiActiveDocument;
  19.       if (doc == null) return;
  20.       Editor ed = doc.Editor;
  21.       Database db = doc.Database;
  22.       ObjectId idStandard = SymbolUtilityServices.GetTextStyleStandardId(db);
  23.       using (Database newDb = new Database(true, true))
  24.       {
  25.         IdMapping maps = new IdMapping();
  26.         db.WblockCloneObjects(new ObjectIdCollection() { idStandard }, newDb.TextStyleTableId, maps,
  27.                               DuplicateRecordCloning.Replace, false);
  28.         db.SaveAs(@"C:\Temp\DupStandard.dwg",DwgVersion.Newest);
  29.       }
  30.     }
  31.   }
  32. }

Всё нормально копируется:


Так что ищи ошибки у себя.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн pavka_97Автор темы

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
Ваш код и у меня работает. Но это полная копия активного файла. Я же копирую фрагменты активного файла в новую базу и сохраняю эту новую базу под своим именем. И так стандартный измененный шрифт не меняется в новой базе на "Arial".

Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;нем.
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD.Geometry;
  5. using Autodesk.AutoCAD.Runtime;
  6. using System;
  7.  
  8. // This line is not mandatory, but improves loading performances
  9. [assembly: CommandClass(typeof(CopyStandartStyle.MyCommands))]
  10.  
  11. namespace CopyStandartStyle
  12. {
  13.     public class MyCommands
  14.     {
  15.         [CommandMethod("CopyStandard")]
  16.         public void CopyStandardHandler()
  17.         {
  18.             Document doc = Application.DocumentManager.MdiActiveDocument;
  19.             if (doc == null) return;
  20.             Editor ed = doc.Editor;
  21.             Database db = doc.Database;
  22.             ObjectId idStandard = SymbolUtilityServices.GetTextStyleStandardId(db);
  23.  
  24.  
  25.            
  26.  
  27.             using (Database newDb = new Database(true, true))
  28.             {
  29.                 //Database dbOrig = HostApplicationServices.WorkingDatabase;
  30.                 //HostApplicationServices.WorkingDatabase = newDb;
  31.                 //HostApplicationServices.WorkingDatabase = dbOrig;
  32.  
  33.                 //using (
  34.                     IdMapping maps = new IdMapping()
  35.                    // )
  36.                                         ;
  37.                 {
  38.                     db.WblockCloneObjects(new ObjectIdCollection() { idStandard }, newDb.TextStyleTableId, maps,
  39.                                           DuplicateRecordCloning.Replace, false);
  40.                 }
  41.  
  42.                 // HostApplicationServices.WorkingDatabase = dbOrig;
  43.  
  44.                 newDb.SaveAs(@"C:\DupStandard.dwg", DwgVersion.Newest);
  45.             }
  46.         }
  47.     }
  48. }
  49.  

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

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

Оффлайн pavka_97Автор темы

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
 
чем твой код отличается от моего

У меня сохраняется новая база
newDb.SaveAs(@"C:\DupStandard.dwg", DwgVersion.Newest);

Вы сохраняете активный файл, под другим именем
db.SaveAs(@"C:\Temp\DupStandard.dwg",DwgVersion.Newest);


у меня не полая копия, а копия только стиля Standard
В вашем варианте: если взять например не пустой файл, а с примитивами , то он скопируется со всем содержимым.

Либо я совсем не понимаю как работает WblockCloneObjects.

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

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

Отмечено как Решение pavka_97 08-02-2021, 16:34:19

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Попробуй такой вариант:
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD.Geometry;
  5. using Autodesk.AutoCAD.GraphicsInterface;
  6. using Autodesk.AutoCAD.Runtime;
  7. using System;
  8.  
  9. // This line is not mandatory, but improves loading performances
  10. [assembly: CommandClass(typeof(CopyStandartStyle.MyCommands))]
  11.  
  12. namespace CopyStandartStyle
  13. {
  14.   public class MyCommands
  15.   {
  16.     [CommandMethod("CopyStandard")]
  17.     public void CopyStandardHandler()
  18.     {
  19.       Document doc = Application.DocumentManager.MdiActiveDocument;
  20.       if (doc == null) return;
  21.       Editor ed = doc.Editor;
  22.       Database db = doc.Database;
  23.       ObjectId idStandardCur = SymbolUtilityServices.GetTextStyleStandardId(db);
  24.       using (TextStyle ts = new TextStyle())
  25.       {
  26.         ts.FromTextStyleTableRecord(idStandardCur);
  27.         using (Database newDb = new Database(true, true))
  28.         {
  29.           IdMapping maps = new IdMapping();
  30.           newDb.WblockCloneObjects(new ObjectIdCollection() { idStandardCur }, newDb.TextStyleTableId, maps,
  31.                                 DuplicateRecordCloning.Replace, false);
  32.           ObjectId idStandardNew = SymbolUtilityServices.GetTextStyleStandardId(newDb);
  33.           ts.ToTextStyleTableRecord(idStandardNew);
  34.           newDb.SaveAs(@"C:\Temp\DupStandard.dwg", DwgVersion.Newest);
  35.         }
  36.       }
  37.     }
  38.   }
  39. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн pavka_97Автор темы

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
В 21м автокаде работает. В 13м  нет методов From/ToTextStyleTableRecord.

Оффлайн pavka_97Автор темы

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
Вот так работает в 13м.

Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD.Geometry;
  5. using Autodesk.AutoCAD.GraphicsInterface;
  6. using Autodesk.AutoCAD.Runtime;
  7. using System;
  8.  
  9. // This line is not mandatory, but improves loading performances
  10. [assembly: CommandClass(typeof(CopyStandartStyle.MyCommands))]
  11.  
  12. namespace CopyStandartStyle
  13. {
  14.     public class MyCommands
  15.     {
  16.         [CommandMethod("CopyStandard")]
  17.         public void CopyStandardHandler()
  18.         {
  19.             Document doc = Application.DocumentManager.MdiActiveDocument;
  20.             if (doc == null) return;
  21.             Editor ed = doc.Editor;
  22.             Database db = doc.Database;
  23.             ObjectId idStandardCur = SymbolUtilityServices.GetTextStyleStandardId(db);
  24.  
  25.  
  26.             using (TextStyleTableRecord textStyleTableRecordCur = (TextStyleTableRecord)idStandardCur.Open(OpenMode.ForRead))
  27.             {
  28.  
  29.  
  30.                 FontDescriptor fd = textStyleTableRecordCur.Font;
  31.  
  32.  
  33.                 //using (TextStyle ts = new TextStyle())
  34.                 {
  35.                     //ts.FromTextStyleTableRecord(idStandardCur);
  36.                     using (Database newDb = new Database(true, true))
  37.                     {
  38.                         IdMapping maps = new IdMapping();
  39.                         newDb.WblockCloneObjects(new ObjectIdCollection() { idStandardCur }, newDb.TextStyleTableId, maps,
  40.                                               DuplicateRecordCloning.Replace, false);
  41.                         ObjectId idStandardNew = SymbolUtilityServices.GetTextStyleStandardId(newDb);
  42.                         // ts.ToTextStyleTableRecord(idStandardNew);
  43.                         using (TextStyleTableRecord textStyleTableRecord = (TextStyleTableRecord)idStandardNew.Open(OpenMode.ForWrite))
  44.                         {
  45.  
  46.                             textStyleTableRecord.Font = fd;
  47.                         }
  48.  
  49.                         newDb.SaveAs(@"C:\DupStandard.dwg", DwgVersion.Newest);
  50.                     }
  51.                 }
  52.             }
  53.         }
  54.     }
  55. }
  56.  

Но я как раз этого не очень хотел