Некорректные значения системных переменных 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" после того как примитивы были добавлены в базу чертежа.
Вот код, который может прояснить ситуацию:
- Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
- // Тест - 1
- using (Database db1 = new Database(true, false))
- {
- ed.WriteMessage("\nТест - 1");
- using (Transaction tr = db1.TransactionManager.StartTransaction())
- {
- BlockTableRecord btr = tr.GetObject
- (
- db1.CurrentSpaceId,
- OpenMode.ForWrite
- ) as BlockTableRecord;
- Circle c = new Circle(Point3d.Origin, Vector3d.ZAxis, 10.0);
- btr.AppendEntity(c);
- tr.AddNewlyCreatedDBObject(c, true);
- tr.Commit();
- }
- db1.SaveAs(@"C:\Temp\Test1.dwg", DwgVersion.Newest);
- ed.WriteMessage("\nExtMin : {0}", db1.Extmin);
- ed.WriteMessage("\nExtMax : {0}", db1.Extmax);
- ed.WriteMessage("\nСохранен Test1.dwg");
- }
- // Тест-2
- using (Database db2 = new Database(true, false))
- {
- ed.WriteMessage("\nТест - 2");
- using (Transaction tr = db2.TransactionManager.StartTransaction())
- {
- BlockTableRecord btr = tr.GetObject
- (
- db2.CurrentSpaceId,
- OpenMode.ForWrite
- ) as BlockTableRecord;
- Circle c = new Circle(Point3d.Origin, Vector3d.ZAxis, 10.0);
- btr.AppendEntity(c);
- tr.AddNewlyCreatedDBObject(c, true);
- tr.Commit();
- }
- db2.UpdateExt(true);
- db2.SaveAs(@"C:\Temp\Test2.dwg", DwgVersion.Newest);
- ed.WriteMessage("\nExtMin : {0}", db2.Extmin);
- ed.WriteMessage("\nExtMax : {0}", db2.Extmax);
- ed.WriteMessage("\nСохранен Test2.dwg");
- }
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
Отредактировано 06.06.2013 в 01:00:50