Нет доступа к только что созданному файлу dwg

Автор Тема: Нет доступа к только что созданному файлу dwg  (Прочитано 5313 раз)

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

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

  • ADN OPEN
  • Сообщений: 24
  • Карма: 1
Всем привет. Суть кода. 1 Беру сборку из Advance Steel, 2 превращаю её в блок, потом 3 хочу вставить этот блок в новый файл. Вот с последним проблема - System.AccessViolationException
Несколько раз переписывал код, ошибка наверняка совсем глупая, просто уже "глаз замылился", не могу понять в чём дело.
Код - C# [Выбрать]
  1. [CommandMethodAttribute("TEST_GROUP", "TTNELTOBLOCK", "TTNELTOBLOCK", CommandFlags.Modal | CommandFlags.UsePickSet | CommandFlags.Redraw)]
  2.         public void ElementsToBlock()
  3.         {
  4.             //Select one AS element and get Assembly elements as ACAD ObjectId
  5.             DocumentManager.LockCurrentDocument();
  6.             Autodesk.AdvanceSteel.CADAccess.Transaction asTrans = Autodesk.AdvanceSteel.CADAccess.TransactionManager.StartTransaction();
  7.  
  8.             IEnumerable<Autodesk.AdvanceSteel.CADLink.Database.ObjectId> connectedASobjIDs;//Vault for set of AS elements
  9.             Autodesk.AdvanceSteel.CADLink.Database.ObjectId selectedASid = UserInteraction.SelectObject();//AS selection
  10.             List<Autodesk.AutoCAD.DatabaseServices.ObjectId> acadObjIds = new List<Autodesk.AutoCAD.DatabaseServices.ObjectId>();//ACAD Id list
  11.  
  12.             if (DatabaseManager.Open(selectedASid) is AtomicElement selectedASatomicEl)
  13.             {
  14.                 selectedASatomicEl.GetConnectedObjects(out connectedASobjIDs, AtomicElement.eAssemblyLocation.kInShop);
  15.                 foreach (Autodesk.AdvanceSteel.CADLink.Database.ObjectId objASid in connectedASobjIDs)
  16.                 {
  17.                     if (DatabaseManager.Open(objASid) is FilerObject filObj)
  18.                     {
  19.                         Autodesk.AdvanceSteel.CADLink.Database.ObjectId reprId = DatabaseManager.GetReprId(filObj);
  20.                         Autodesk.AutoCAD.DatabaseServices.ObjectId acadObjId =
  21.                             new Autodesk.AutoCAD.DatabaseServices.ObjectId(reprId.AsOldId());
  22.                         acadObjIds.Add(acadObjId);
  23.                     }
  24.                 }
  25.             }
  26.             asTrans.Commit();
  27.             DocumentManager.UnlockCurrentDocument();
  28.  
  29.             //Create ACAD block from Assembly Elements
  30.             Autodesk.AutoCAD.ApplicationServices.Document acadDoc =
  31.                 Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  32.             Database db = acadDoc.Database;
  33.  
  34.             ObjectIdCollection ids = new ObjectIdCollection();
  35.             using (Autodesk.AutoCAD.DatabaseServices.Transaction acadTrans = db.TransactionManager.StartTransaction())
  36.             {
  37.                 BlockTable bt = acadTrans.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
  38.                 BlockTableRecord modelSpace = acadTrans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
  39.  
  40.                 BlockTableRecord blockDef = new BlockTableRecord();
  41.                 blockDef.Name = "A1";
  42.                 bt.UpgradeOpen();
  43.                 ObjectId blockDefId = bt.Add(blockDef);
  44.                 acadTrans.AddNewlyCreatedDBObject(blockDef, true);
  45.  
  46.                 foreach (ObjectId objectId in acadObjIds)
  47.                 {
  48.                     Entity entity = acadTrans.GetObject(objectId, OpenMode.ForRead) as Entity;
  49.                     Entity entityCopy = entity.Clone() as Entity;
  50.                     blockDef.AppendEntity(entityCopy);
  51.                     acadTrans.AddNewlyCreatedDBObject(entityCopy, true);
  52.                 }
  53.  
  54.                 //Copy block
  55.                 if (bt.Has("A1"))
  56.                 {
  57.                     ids.Add(bt["A1"]);
  58.                 }
  59.                 acadTrans.Commit();
  60.             }
  61.  
  62.             //Get path
  63.             string folderPath = acadDoc.Database.Filename.Replace(".dwg", "") + "\\Assemblies";
  64.             string filePath = folderPath + "\\A1.dwg";
  65.  
  66.             //Create folder
  67.             if (!System.IO.Directory.Exists(folderPath))
  68.             {
  69.                 Directory.CreateDirectory(folderPath);// Create folder
  70.             }
  71.             DirectoryInfo folderInfo = new DirectoryInfo(folderPath);
  72.             folderInfo.Attributes &= ~FileAttributes.ReadOnly; // Remove read-only attribute
  73.  
  74.             //Check file exsisting
  75.             if (System.IO.File.Exists(filePath))
  76.             {
  77.                 System.IO.File.Delete(filePath);
  78.             }
  79.  
  80.             //Create new DB and transaction
  81.             using (var newDb = new Database(false, true))
  82.             {
  83.                 newDb.SaveAs(filePath, false, DwgVersion.Current, newDb.SecurityParameters); //Вот тут ошибка
  84.                 //newDb.SaveAs(filePath, DwgVersion.Current);  
  85.                 //newDb.ReadDwgFile(templatePath, FileOpenMode.OpenForReadAndAllShare, true, null);
  86.  
  87.                 using (Autodesk.AutoCAD.DatabaseServices.Transaction newAcadTrans =
  88.                     newDb.TransactionManager.StartTransaction())
  89.                 {
  90.                     IdMapping iMap = new IdMapping();
  91.                     BlockTableRecord modelSpace = newAcadTrans.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(db), OpenMode.ForWrite) as BlockTableRecord;
  92.                     newDb.WblockCloneObjects(ids, newDb.BlockTableId, iMap, DuplicateRecordCloning.Ignore, false);
  93.  
  94.                     BlockTable bt = newAcadTrans.GetObject(newDb.BlockTableId, OpenMode.ForRead) as BlockTable;
  95.                     BlockTableRecord blockDef = newAcadTrans.GetObject(bt["A1"], OpenMode.ForRead) as BlockTableRecord;
  96.                     BlockReference blockRef =
  97.                             new BlockReference(new Autodesk.AutoCAD.Geometry.Point3d(0, 0, 0), blockDef.ObjectId);
  98.                     newAcadTrans.AddNewlyCreatedDBObject(blockRef, true);
  99.                     newAcadTrans.Commit();
  100.                 }
  101.                 newDb.Save();  
  102.             }
  103.         }

Оффлайн alz

  • ADN OPEN
  • **
  • Сообщений: 97
  • Карма: 11
Строку  using (Database newDb = new Database(false, true)) замени на using (Database newDb = new Database(true, true)) вроде убрало исключение, но newDb.Save();  так же выдает исключение, так что я бы советовал
newDb.SaveAs(filePath, DwgVersion.Current); переместить на ее место
« Последнее редактирование: 23-05-2023, 20:28:20 от alz »