Изменение имени внешней ссылки - сбрасываются состояния слоя ссылки?

Автор Тема: Изменение имени внешней ссылки - сбрасываются состояния слоя ссылки?  (Прочитано 11241 раз)

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

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

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

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Подскажите пожалуйста
если в dwg изменить имя внешней ссылки, то в диспетчере слоёв слетают состояния у этой внешней ссылки: включен и заморожен становятся включенными если были выключены. Если вручную изменить имя внешней ссылки - то в диспетчере слоёв состояния остаются без изменений.

Код - C# [Выбрать]
  1. [CommandMethod("testsavelay")]
  2.         public void testsavelay()
  3.         {
  4.             try
  5.             {                
  6.                 string mainfullpath = @"c:\Temp\testdwg\layone.dwg";
  7.                 Database tempDb;
  8.                 tempDb = new Database(false, true);
  9.                 tempDb.ReadDwgFile(mainfullpath, FileShare.ReadWrite, false, "");
  10.                 using (var Tx = tempDb.TransactionManager.StartTransaction())
  11.                 {
  12.                     XrefGraph xg = tempDb.GetHostDwgXrefGraph(false);
  13.                     GraphNode root = xg.RootNode;
  14.                     for (int o = 0; o < root.NumOut; o++)
  15.                     {
  16.                         XrefGraphNode node = root.Out(o) as XrefGraphNode;
  17.                         var blockId = node.BlockTableRecordId;
  18.                         var btr = (BlockTableRecord)Tx.GetObject(blockId, OpenMode.ForRead);
  19.                         if (!node.IsNested)
  20.                         {
  21.                             btr.UpgradeOpen();                            
  22.                             btr.Name = "НовоеИмя";
  23.                         }
  24.                     }
  25.                     Tx.Commit();
  26.                 }
  27.                 tempDb.SaveAs(mainfullpath, DwgVersion.AC1024);
  28.                 tempDb.CloseInput(true);
  29.             }
  30.             catch (SystemException ex)
  31.             {
  32.                 Editor ed = acadapp.DocumentManager.MdiActiveDocument.Editor;
  33.                 ed.WriteMessage(ex.Message);
  34.             }
  35.         }
  36.  
После выполнения команды  все слои оказываются включенными, а был один выключен :(

Как изменить имя внешней ссылки чтобы в диспетчере слоёв остались установленные состояния для слоя этой внешней ссылки?
« Последнее редактирование: 28-01-2015, 16:51:11 от Александр Ривилис »

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

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

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Посмотрел внимательнее на это дело. Оказалось, что создаётся новый слой (у него другая метка) и при этом теряются все настройки слоя - не только видимость, но и "замороженность", и цвет, и т.д.
Решил отправить запрос в ADN DevHelp.
P.S.: Оказывается эта тема уже поднималась: http://www.theswamp.org/index.php?topic=43474.0
Записал видео: https://screencast.autodesk.com/main/details/1cd049ed-96cb-4467-ba9b-eec9d016a414
« Последнее редактирование: 28-01-2015, 13:34:25 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
:(
т.е. в качестве временного решения теоретически надо  определить слой, как то запомнить состояния слоя, затем изменить имя ссылки и потом этому новому слою присвоить сохранённые значения?

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
А временное изменение VISRETAIN не поможет? Ну так, в качестве предположения...
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

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

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

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

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

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
В ADN Devhelp подтвердили такое странное поведение и отправили в Eng Team. Ждём.
По их просьбе проверил с P/Invoke ObjectARX - результат тотже.
« Последнее редактирование: 30-01-2015, 17:27:30 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Ну и на всякий случай проверил в чистом ObjectARX:
Код - C++ [Выбрать]
  1.   static void MyGroupMyCommand () {
  2.     // Put your command code here
  3.     AcString mainfullpath = _T("c:\\Temp\\testdwg\\layone.dwg");
  4.     AcDbDatabase *tempDb = new AcDbDatabase(false, true);
  5.     if (tempDb->readDwgFile(mainfullpath) != Acad::eOk) {
  6.       delete tempDb;
  7.       return;
  8.     }
  9.     tempDb->closeInput();
  10.     AcDbXrefGraph xg;
  11.     Acad::ErrorStatus es;
  12.     if ((es = acdbGetHostDwgXrefGraph(tempDb,xg)) == Acad::eOk)
  13.     {
  14.       int n = xg.numNodes();
  15.       for (int i = 0; i < n; i++) {
  16.         AcDbXrefGraphNode *cur = dynamic_cast<AcDbXrefGraphNode *>(xg.node(i));
  17.         if (cur->isNested()) continue;
  18.         AcDbObjectId btrId = cur->btrId();
  19.         AcDbBlockTableRecordPointer btr(btrId,AcDb::kForRead);
  20.         if (btr.openStatus() == Acad::eOk) {
  21.           if (btr->upgradeOpen() == Acad::eOk) {
  22.             btr->setName(_T("NewXrefName"));
  23.           }
  24.         }
  25.       }
  26.     }
  27.     tempDb->saveAs(mainfullpath+_T("_1.dwg"));
  28.     delete tempDb;
  29.   }
Результат тотже. Значит или мы что-то не учитываем, или это баг.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

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

Отмечено как Решение Doublefish 25-02-2015, 16:25:47

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

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Код - C# [Выбрать]
  1. [CommandMethod ("testsavelay")]
  2.         public static void testsavelay ()
  3.         {
  4.             try
  5.             {
  6.                 string mainfullpath = @"c:\Temp\testdwg\layone.dwg";
  7.                 Database tempDb; tempDb = new Database (false, true); tempDb.ReadDwgFile (mainfullpath, FileShare.ReadWrite, false, "");
  8.                 tempDb.CloseInput (true);
  9.                 using (var Tx = tempDb.TransactionManager.StartTransaction ())
  10.                 {
  11.                     string newName = "NewName";
  12.                     LayerTable lt = Tx.GetObject (tempDb.LayerTableId, OpenMode.ForRead) as LayerTable;
  13.                     XrefGraph xg = tempDb.GetHostDwgXrefGraph (false); GraphNode root = xg.RootNode;
  14.                     for (int o = 0; o <root.NumOut; o ++)
  15.                     {
  16.                         XrefGraphNode node = root.Out (o) as XrefGraphNode;
  17.                         var blockId = node.BlockTableRecordId;
  18.                         var btr = (BlockTableRecord) Tx.GetObject (blockId, OpenMode.ForRead);
  19.                         if (! node.IsNested)
  20.                         {
  21.                             foreach (ObjectId ltrId in lt)
  22.                             {
  23.                                 LayerTableRecord ltr = Tx.GetObject (ltrId, OpenMode.ForRead) as LayerTableRecord;
  24.                                 if (ltr.Name.StartsWith (btr.Name))
  25.                                 {
  26.                                     ltr.UpgradeOpen ();
  27.                                     ltr.Name = ltr.Name.Replace (btr.Name, newName);
  28.                                 }
  29.                             }
  30.                             btr.UpgradeOpen ();
  31.                             btr.Name = newName;
  32.                         }
  33.                     }
  34.                     Tx.Commit ();
  35.                 }
  36.                 tempDb.SaveAs (mainfullpath, DwgVersion.Current);
  37.                 tempDb.CloseInput(true);
  38.             }
  39.             catch (SystemException ex)
  40.             {
  41.                 Editor ed = acadapp.DocumentManager.MdiActiveDocument.Editor;
  42.                 ed.WriteMessage (ex.Message);
  43.             }
  44.         }
  45.  
Augusto Goncalves

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

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

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

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
В данном примере это сработало.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
В данном примере это сработало.
Думаю нужно подумать над строкой:
Код - C# [Выбрать]
  1. ltr.Name = ltr.Name.Replace (btr.Name, newName);
Если в имени слоя будет встречаться имя внешней ссылки больше одного раза, то все они заменятся на новое имя. Думаю, что это не то, чего ты добиваешься.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
P.S.: Не проверял, но так наверное должно быть правильно:
Код - C# [Выбрать]
  1. ltr.Name = newName + ltr.Name.Substring(btr.Name.Length);
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение