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

ADN Club => AutoCAD .NET API => Тема начата: Doublefish от 28-01-2015, 10:50:59

Название: Изменение имени внешней ссылки - сбрасываются состояния слоя ссылки?
Отправлено: Doublefish от 28-01-2015, 10:50:59
Подскажите пожалуйста
если в 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.  
После выполнения команды  все слои оказываются включенными, а был один выключен :(

Как изменить имя внешней ссылки чтобы в диспетчере слоёв остались установленные состояния для слоя этой внешней ссылки?
Название: Re: Изменение имени внешней ссылки - сбрасываются состояния слоя сслыки?
Отправлено: Александр Ривилис от 28-01-2015, 12:42:45
Поведение действительно странное. Думаю что единственная возможность обойти его - это перед изменением имени сохранять состояния слоёв, а затем восстанавливать их.
Название: Re: Изменение имени внешней ссылки - сбрасываются состояния слоя сслыки?
Отправлено: Александр Ривилис от 28-01-2015, 13:01:49
Посмотрел внимательнее на это дело. Оказалось, что создаётся новый слой (у него другая метка) и при этом теряются все настройки слоя - не только видимость, но и "замороженность", и цвет, и т.д.
Решил отправить запрос в ADN DevHelp.
P.S.: Оказывается эта тема уже поднималась: http://www.theswamp.org/index.php?topic=43474.0
Записал видео: https://screencast.autodesk.com/main/details/1cd049ed-96cb-4467-ba9b-eec9d016a414
Название: Re: Изменение имени внешней ссылки - сбрасываются состояния слоя сслыки?
Отправлено: Doublefish от 28-01-2015, 14:28:04
:(
т.е. в качестве временного решения теоретически надо  определить слой, как то запомнить состояния слоя, затем изменить имя ссылки и потом этому новому слою присвоить сохранённые значения?
Название: Re: Изменение имени внешней ссылки - сбрасываются состояния слоя сслыки?
Отправлено: Алексей Кулик от 28-01-2015, 14:35:26
А временное изменение VISRETAIN не поможет? Ну так, в качестве предположения...
Название: Re: Изменение имени внешней ссылки - сбрасываются состояния слоя сслыки?
Отправлено: Александр Ривилис от 28-01-2015, 14:42:48
т.е. в качестве временного решения теоретически надо  определить слой, как то запомнить состояния слоя, затем изменить имя ссылки и потом этому новому слою присвоить сохранённые значения?
Где-то так. Но давай дождёмся ответа от ADN DevHelp - запрос я уже отправил.
Название: Re: Изменение имени внешней ссылки - сбрасываются состояния слоя сслыки?
Отправлено: Александр Ривилис от 28-01-2015, 16:35:00
А временное изменение VISRETAIN не поможет? Ну так, в качестве предположения...
Попробовал - не помогло. :(
Название: Re: Изменение имени внешней ссылки - сбрасываются состояния слоя ссылки?
Отправлено: Александр Ривилис от 30-01-2015, 16:26:56
В ADN Devhelp подтвердили такое странное поведение и отправили в Eng Team. Ждём.
По их просьбе проверил с P/Invoke ObjectARX - результат тотже.
Название: Re: Изменение имени внешней ссылки - сбрасываются состояния слоя ссылки?
Отправлено: Александр Ривилис от 30-01-2015, 18:16:01
Ну и на всякий случай проверил в чистом 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.   }
Результат тотже. Значит или мы что-то не учитываем, или это баг.
Название: Re: Изменение имени внешней ссылки - сбрасываются состояния слоя ссылки?
Отправлено: Александр Ривилис от 02-02-2015, 20:30:25
В Eng Team тоже подтвердили такое странное поведение и будут исправлять. Пока я не получил от них информации о возможности обойти эту проблему.
Название: Re: Изменение имени внешней ссылки - сбрасываются состояния слоя ссылки?
Отправлено: Doublefish от 25-02-2015, 08:36:45
Код - 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
Название: Re: Изменение имени внешней ссылки - сбрасываются состояния слоя ссылки?
Отправлено: Александр Ривилис от 25-02-2015, 12:11:05
Интересный трюк - предварительное переименование зависимых слоёв. Если ты проверил и работает, то отметь сообщение как Решение.
Название: Re: Изменение имени внешней ссылки - сбрасываются состояния слоя ссылки?
Отправлено: Doublefish от 25-02-2015, 16:26:21
В данном примере это сработало.
Название: Re: Изменение имени внешней ссылки - сбрасываются состояния слоя ссылки?
Отправлено: Александр Ривилис от 25-02-2015, 16:31:07
В данном примере это сработало.
Думаю нужно подумать над строкой:
Код - C# [Выбрать]
  1. ltr.Name = ltr.Name.Replace (btr.Name, newName);
Если в имени слоя будет встречаться имя внешней ссылки больше одного раза, то все они заменятся на новое имя. Думаю, что это не то, чего ты добиваешься.
Название: Re: Изменение имени внешней ссылки - сбрасываются состояния слоя ссылки?
Отправлено: Александр Ривилис от 25-02-2015, 16:49:34
P.S.: Не проверял, но так наверное должно быть правильно:
Код - C# [Выбрать]
  1. ltr.Name = newName + ltr.Name.Substring(btr.Name.Length);