Ошибка при открытии файла

Автор Тема: Ошибка при открытии файла  (Прочитано 884 раз)

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

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

  • ADN OPEN
  • Сообщений: 15
  • Карма: 0
Привет форумчанам.
Обыскал весь интернет, изнасиловал CatGPT (или он меня...) но так и не пойму в чем проблема и как решить.

Я хочу написать команду которая при запуске должна открывать определенный файл dwg (некий шаблон), выполнять в нем некоторые действия и предлагать пользователю сохранить его под новым именем. При этом запуск команды осуществляется из некого другого открытого документа.
Мой код открывает нужный файл-шаблон, но дальне при попытке что-то сделать выскакивает ошибка "Autodesk.AutoCAD.Runtime.Exception: eLockViolation". Я так понимаю, что только что открытый файл не становится текущим, и как это исправить я не разберусь.

Код моего скрипта:
Код - C [Выбрать]
  1. namespace SLDBuilder_2
  2. {
  3.     public class RunSLDbuilder : IExtensionApplication
  4.     {
  5.         [CommandMethod("sldbuilder")]
  6.         public void RunSLD()
  7.         {
  8.             Document currentDoc = Application.DocumentManager.MdiActiveDocument;
  9.             Database currentDataBase = currentDoc.Database;
  10.             Editor currentEditor = currentDoc.Editor;
  11.             currentEditor.WriteMessage("\nSLD Builder started...");
  12.  
  13.             string dwgFilePath = @"C:\Users\11177\Documents\SLDBuilder_2\_test\SLD_template_EN.dwg";
  14.             string dwgFileName = Path.GetFileName(dwgFilePath);
  15.             Document dwgDoc = Application.DocumentManager.Open(dwgFilePath, false);
  16.             Application.DocumentManager.MdiActiveDocument = dwgDoc; // Эту строчку советует добавить Copilot, но это ничего не меняет.
  17.  
  18.             Database newDatabase = dwgDoc.Database;
  19.             Editor newEditor = dwgDoc.Editor;
  20.             using (Transaction tr = newDatabase.TransactionManager.StartTransaction())
  21.                 {
  22.                     BlockTable blockTable = (BlockTable)tr.GetObject(newDatabase.BlockTableId, OpenMode.ForRead);
  23.                     BlockTableRecord modelSpace = (BlockTableRecord)tr.GetObject(blockTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
  24.  
  25.                     Line line = new Line();
  26.                     line.StartPoint = new Point3d(-100, -100, 0);
  27.                     line.EndPoint = new Point3d(100, 100, 0);
  28.                     line.ColorIndex = 7;
  29.  
  30.                     ObjectId objectIdLine = modelSpace.AppendEntity(line);
  31.                     tr.AddNewlyCreatedDBObject(line, true);
  32.  
  33.                     tr.Commit();
  34.                 }
  35.         }
  36.  
  37.         public void Initialize()
  38.         {
  39.             Editor editor = Application.DocumentManager.MdiActiveDocument.Editor;
  40.             editor.WriteMessage("\nSLD Builder loaded...");
  41.         }
  42.  
  43.         public void Terminate()
  44.         {
  45.  
  46.         }
  47.     }
  48. }
  49.  

Отмечено как Решение Derie1 23-04-2025, 15:52:25

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 843
  • Карма: 170
    • Мои плагины к Автокаду
Re: Ошибка при открытии файла
« Ответ #1 : 23-04-2025, 15:39:45 »
Раз вы документы открываете, а не просто базу данных чертежа, то команда должна быть помечена как CommandFlags.Session.
И далее, прежде чем что-то менять документ надо заблокировать doc.LockDocument.

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

  • ADN OPEN
  • Сообщений: 15
  • Карма: 0
Re: Ошибка при открытии файла
« Ответ #2 : 23-04-2025, 15:53:21 »
Раз вы документы открываете, а не просто базу данных чертежа, то команда должна быть помечена как CommandFlags.Session.
И далее, прежде чем что-то менять документ надо заблокировать doc.LockDocument.
Это помогло. Спасибо. И дополнительное спасибо за быстрый ответ  :)