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

24/05/2013

Некорректные значения системных переменных EXTMIN / EXTMAX в чертеже

AutoCAD подразумевает такие значения по-умолчанию для EXTMIN и EXTMAX: (1.0E+20, 1.0E+20, 1.0E+20) и (-1.0E+20,-1.0E+20,-1.0E+20) как разработчики заложили в программу. Это порядка 1/10 длины Вселенной. :-)

Возможно появление чертежей, в которых эти значения останутся неизменными, несмотря на то, что в них уже добавлены примитивы. Одна из возможных причин этого – не был метод "Database.UpdateExt" после того как примитивы были добавлены в базу чертежа.

Вот код, который может прояснить ситуацию:

Код - C#: [Выделить]
  1. Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  2. // Тест - 1
  3. using (Database db1 = new Database(true, false))
  4. {
  5.     ed.WriteMessage("\nТест - 1");
  6.  
  7.     using (Transaction tr = db1.TransactionManager.StartTransaction())
  8.     {
  9.         BlockTableRecord btr = tr.GetObject
  10.                                     (
  11.                                         db1.CurrentSpaceId,
  12.                                         OpenMode.ForWrite
  13.                                     ) as BlockTableRecord;
  14.  
  15.         Circle c = new Circle(Point3d.Origin, Vector3d.ZAxis, 10.0);
  16.         btr.AppendEntity(c);
  17.         tr.AddNewlyCreatedDBObject(c, true);
  18.         tr.Commit();
  19.     }
  20.  
  21.     db1.SaveAs(@"C:\Temp\Test1.dwg", DwgVersion.Newest);
  22.     ed.WriteMessage("\nExtMin : {0}", db1.Extmin);
  23.     ed.WriteMessage("\nExtMax : {0}", db1.Extmax);
  24.     ed.WriteMessage("\nСохранен Test1.dwg");
  25. }
  26.  
  27. // Тест-2
  28. using (Database db2 = new Database(true, false))
  29. {
  30.     ed.WriteMessage("\nТест - 2");
  31.     using (Transaction tr = db2.TransactionManager.StartTransaction())
  32.     {
  33.         BlockTableRecord btr = tr.GetObject
  34.                                     (
  35.                                         db2.CurrentSpaceId,
  36.                                         OpenMode.ForWrite
  37.                                     ) as BlockTableRecord;
  38.  
  39.         Circle c = new Circle(Point3d.Origin, Vector3d.ZAxis, 10.0);
  40.         btr.AppendEntity(c);
  41.         tr.AddNewlyCreatedDBObject(c, true);
  42.         tr.Commit();
  43.     }
  44.  
  45.     db2.UpdateExt(true);
  46.  
  47.     db2.SaveAs(@"C:\Temp\Test2.dwg", DwgVersion.Newest);
  48.     ed.WriteMessage("\nExtMin : {0}", db2.Extmin);
  49.     ed.WriteMessage("\nExtMax : {0}", db2.Extmax);
  50.     ed.WriteMessage("\nСохранен Test2.dwg");
  51.  
  52. }

Test1.dwg имеет границы протяженностью 1e+20 даже несмотря на то, что в базе чертежа есть примитив. Причина этого то, что метод “UpdateExt” не был вызван перед сохранением чертежа.

Test2.dwg имеет правильные границы после того как примитив добавлен в базу, так как метод “UpdateExt” был вызван перед сохранением чертежа.

В ObjectARX аналогичный метод AcDbDatabase::updateExt().

 

Источник: http://adndevblog.typepad.com/autocad/2012/08/incorrect-extmin-extmax-values-for-a-drawing.html

Общение: http://adn-cis.org/forum/index.php?topic=43.0

Опубликовано 24.05.2013
Отредактировано 06.06.2013 в 01:00:50