Добавить геометрию в файл на диске

Автор Тема: Добавить геометрию в файл на диске  (Прочитано 11057 раз)

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

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
здравствуйте

Каким способом можно добавить геометрию в файл на диске не открывая его? Нужно врисовать в файл геометрию, хватаю ошибку eWrongDatabase при попытке добавления геометрии в файл. При этом базу я передаю в метод в явном виде, она принадлежит чертежу на диске который я редактирую.
Мой код
Код - C# [Выбрать]
  1. public class SketchMaker
  2.     {
  3.         [CommandMethod("isomaker")]
  4.         public static void MakeIsometricDrawings()
  5.         {
  6.             try
  7.             {
  8.                 var path = @"D:\Developer\iso\";
  9.                 DirectoryInfo d = new DirectoryInfo(path);
  10.                 FileInfo[] Files = d.GetFiles("*.dwg");
  11.                 foreach (FileInfo file in Files)
  12.                 {
  13.                     var fileName = Path.GetFileName(file.FullName);
  14.                     string dwgFlpath = path + fileName;
  15.                     using (Database db = new Database(false, true))
  16.                     {
  17.                         db.ReadDwgFile(dwgFlpath, FileOpenMode.OpenForReadAndAllShare, false, null);                  
  18.                      
  19.                    
  20.                                          
  21.                         TitleCreator titleCreator = new TitleCreator();
  22.                         titleCreator.GetScetchExtents(db);                      
  23.                         db.SaveAs(dwgFlpath, DwgVersion.Current);
  24.                     }
  25.                 }
  26.                 Application.ShowAlertDialog("All files processed");
  27.             }
  28.             catch (System.Exception ex)
  29.             {
  30.                 Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(ex.ToString());
  31.             }
  32.         }
  33.     }


Метод добавления
Код - C# [Выбрать]
  1. public class TitleCreator
  2.     {
  3.        
  4.         public void GetScetchExtents(Database db)
  5.         {
  6.             Transaction tr = db.TransactionManager.StartTransaction();
  7.             BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
  8.             BlockTableRecord btr = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
  9.             using (tr)
  10.             {
  11.                 var max = new Point2d(db.Extmax.X, db.Extmax.Y);
  12.                 var min = new Point2d(db.Extmin.X, db.Extmax.Y);
  13.                    
  14.                    
  15.                  
  16.  
  17.  
  18.                 Polyline frame1 = new Polyline(4);
  19.                 frame1.SetDatabaseDefaults();
  20.                 frame1.AddVertexAt(0, min, 0, 0, 0);
  21.                 frame1.AddVertexAt(0, new Point2d(min.X, max.Y), 0, 0, 0);
  22.                 frame1.AddVertexAt(0, max, 0, 0, 0);
  23.                 frame1.AddVertexAt(0, new Point2d(max.X, min.Y), 0, 0, 0);
  24.                 frame1.Closed = true;
  25.                 frame1.LineWeight = LineWeight.LineWeight060;
  26.                 frame1.Layer = "0";
  27.  
  28.                 btr.AppendEntity(frame1);
  29.                 tr.AddNewlyCreatedDBObject(frame1, true);
  30.                
  31.  
  32.                 tr.Commit();
  33.             }
  34.  
  35.  
  36.         }
  37.  
  38.  
  39.     }

Отмечено как Решение Александр Ривилис 22-05-2021, 15:48:04

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Re: Добавить геометрию в файл на диске
« Ответ #1 : 21-05-2021, 11:29:31 »
вы забыли передать БД в frame1.SetDatabaseDefaults()

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Добавить геометрию в файл на диске
« Ответ #2 : 21-05-2021, 12:04:23 »
Atomohod,
Очень странная манера сначала создавать транзакцию, затем пару раз её использовать и только после этого  делать using (tr). Если исключение возникнет до  using (tr), то транзакция не закроется, что приведёт к куче проблем.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Добавить геометрию в файл на диске
« Ответ #3 : 21-05-2021, 12:07:21 »
И почему везде  frame1.AddVertexAt(0, ...) ???
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Добавить геометрию в файл на диске
« Ответ #4 : 21-05-2021, 14:50:43 »
frame1.AddVertexAt(0, ...)
Про индекс  - согласен, недосмотрел. Но это ведь не вызовет ошибку базы?

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Добавить геометрию в файл на диске
« Ответ #5 : 21-05-2021, 15:01:04 »
вы забыли передать БД в frame1.SetDatabaseDefaults()
SetDatabaseDefaults(db) частично решило проблему, но теперь ошибка на строке frame1.Layer = "0";

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Re: Добавить геометрию в файл на диске
« Ответ #6 : 21-05-2021, 15:21:20 »
Нет слоя 0? Чудеса. Попробуйте присваивать слой по его Id, а не по имени.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Добавить геометрию в файл на диске
« Ответ #7 : 21-05-2021, 21:30:38 »
вы забыли передать БД в frame1.SetDatabaseDefaults()
SetDatabaseDefaults(db) частично решило проблему, но теперь ошибка на строке frame1.Layer = "0";
Код - C# [Выбрать]
  1. frame1.LayerId = SymbolUtilityServices.GetLayerZeroId(db);
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Добавить геометрию в файл на диске
« Ответ #8 : 22-05-2021, 15:35:17 »
    frame1.LayerId = SymbolUtilityServices.GetLayerZeroId(db);
Супер, я не знал про спецметод для нулевого слоя. Спасибо

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Добавить геометрию в файл на диске
« Ответ #9 : 22-05-2021, 20:32:25 »
Вылезла другая проблема, тоже из-за базы чертежа. eWrongContext на строчку выравнивания атрибута 
Код - C# [Выбрать]
  1. using (AttributeDefinition drawingNo2 = new AttributeDefinition())
  2.                 {
  3.                     drawingNo2.SetDatabaseDefaults(db);
  4.                     drawingNo2.Verifiable = true;
  5.                     drawingNo2.Prompt = "U Drawing Number";
  6.                     drawingNo2.Tag = "UDrawingNumber";
  7.                     drawingNo2.TextString = decNumber;
  8.                     drawingNo2.WidthFactor = 0.7;
  9.                     drawingNo2.Height = 8;
  10.                     drawingNo2.Rotation = Math.PI;
  11.                     drawingNo2.Justify = AttachmentPoint.BottomCenter;
  12.                     drawingNo2.Position = new Point3d(container.KeyPoint1.X + 35, container.KeyPoint1.Y - 1, 0);
  13.                     drawingNo2.AlignmentPoint = new Point3d(container.KeyPoint1.X + 35, container.KeyPoint1.Y, 0);
  14.                    drawingNo2.AdjustAlignment(db);
  15.                     drawingNo2.LayerId = titleLayer;
  16.  
  17.                     btr.AppendEntity(drawingNo2);
  18.                     collection.Add(drawingNo2.ObjectId);
  19.                 }
Перегрузки эnого метода для работы без параметра или по Objectid нет, как тогда указать нужную базу?



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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Добавить геометрию в файл на диске
« Ответ #10 : 22-05-2021, 21:26:14 »
Одни вопрос - одна тема!
eWrongContext на строчку выравнивания атрибута 
Что-то мне подсказывает, что ты перепутал название исключения. Такого исключения нет.
« Последнее редактирование: 22-05-2021, 23:06:20 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Добавить геометрию в файл на диске
« Ответ #11 : 22-05-2021, 23:07:53 »
Код - C# [Выбрать]
  1. Database prevWorkingDb = HostApplicationServices.WorkingDatabase;
  2. HostApplicationServices.WorkingDatabase = db;
  3. drawingNo2.AdjustAlignment(db);
  4. HostApplicationServices.WorkingDatabase = prevWorkingDb;
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Добавить геометрию в файл на диске
« Ответ #12 : 22-05-2021, 23:54:57 »
Кстати, вполне возможно, что если строку:
Код - C# [Выбрать]
  1. btr.AppendEntity(drawingNo2);
перенести выше, после:
Код - C# [Выбрать]
  1. drawingNo2.SetDatabaseDefaults(db);
то и в этом случае код бы нормально работал.
 
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Добавить геометрию в файл на диске
« Ответ #13 : 23-05-2021, 01:38:09 »
Что-то мне подсказывает, что ты перепутал название исключения. Такого исключения нет.
Вы правы,
Autodesk.AutoCAD.Runtime.Exception: eInvalidContext
   at Autodesk.AutoCAD.DatabaseServices.DBText.AdjustAlignment(Database alternateDatabaseToUse)

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Добавить геометрию в файл на диске
« Ответ #14 : 23-05-2021, 01:39:42 »
то и в этом случае код бы нормально работал.
 
Попробовал, не спасает
Код - C# [Выбрать]
  1.  using (AttributeDefinition drawingNo = new AttributeDefinition())
  2.                 {
  3.                     drawingNo.SetDatabaseDefaults(db);
  4.                     btr.AppendEntity(drawingNo);
  5.                     drawingNo.Verifiable = true;
  6.                     drawingNo.Prompt = "Drawing Number";
  7.                     drawingNo.Tag = "DrawingNumber";
  8.                     drawingNo.TextString = decNumber;
  9.                     drawingNo.WidthFactor = 1;
  10.                     drawingNo.Height = 8;
  11.                     drawingNo.Justify = AttachmentPoint.BottomCenter;
  12.                     drawingNo.Position = new Point3d(-60, 0.5, 0);
  13.                     drawingNo.AlignmentPoint = new Point3d(-60, 0.5, 0);
  14.                     drawingNo.AdjustAlignment(db);
  15.                     drawingNo.LayerId = titleLayer;
  16.  
  17.                     collection.Add(drawingNo.ObjectId);
  18.                 }

А подмена рабочей базы помогла. Спасибо.