本文主要是介绍Zoom Extents in .Net,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
原文:来自ADN
缩放模型空间到最合适屏幕,即Zoom E命令
public void SetViewportToExtents(Database db, ViewportTableRecord viewportTableRec)
{ //lets update the database extents first//true gives the best fit but will take timedb.UpdateExt(true);//get the screen aspect ratio to calculate the height and widthdouble scrRatio = (viewportTableRec.Width / viewportTableRec.Height);//prepare Matrix for DCS to WCS transformationMatrix3d matWCS2DCS = Matrix3d.PlaneToWorld(viewportTableRec.ViewDirection);//for DCS target point is the originmatWCS2DCS = Matrix3d.Displacement(viewportTableRec.Target-Point3d.Origin) * matWCS2DCS; //WCS Xaxis is twisted by twist anglematWCS2DCS = Matrix3d.Rotation(-viewportTableRec.ViewTwist,viewportTableRec.ViewDirection,viewportTableRec.Target) * matWCS2DCS;matWCS2DCS = matWCS2DCS.Inverse();//tranform the extents to the DCS defined by the viewdirExtents3d extents = new Extents3d(db.Extmin, db.Extmax);extents.TransformBy(matWCS2DCS);//width of the extents in current viewdouble width = (extents.MaxPoint.X - extents.MinPoint.X);//height of the extents in current viewdouble height = (extents.MaxPoint.Y - extents.MinPoint.Y);//get the view center pointPoint2d center = new Point2d((extents.MaxPoint.X + extents.MinPoint.X)*0.5, (extents.MaxPoint.Y + extents.MinPoint.Y)*0.5);//check if the width 'fits' in current window//if not then get the new height as per the viewports aspect ratioif (width > (height * scrRatio)) height = width / scrRatio;viewportTableRec.Height = height; viewportTableRec.Width = height * scrRatio;viewportTableRec.CenterPoint = center;
}
[CommandMethod("ModelZoomExtents")]
public void ModelZoomExtents()
{Document doc = Application.DocumentManager.MdiActiveDocument;Database db = doc.Database;Editor ed = doc.Editor;using (Transaction Tx = db.TransactionManager.StartTransaction()){ed.UpdateTiledViewportsInDatabase();ViewportTableRecord viewportTableRec = Tx.GetObject(ed.ActiveViewportId, OpenMode.ForWrite) as ViewportTableRecord;SetViewportToExtents(db, viewportTableRec);ed.UpdateTiledViewportsFromDatabase();Tx.Commit();}
}
[CommandMethod("PaperZoomExtents")]
static public void PaperZoomExtents()
{Document doc = Application.DocumentManager.MdiActiveDocument;Database db = doc.Database;Editor ed = doc.Editor;PromptEntityOptions peo = new PromptEntityOptions("\nSelect a viewport: ");peo.SetRejectMessage("\nMust be a viewport...");peo.AddAllowedClass(typeof(Viewport), true);PromptEntityResult per = ed.GetEntity(peo);if (per.Status != PromptStatus.OK) return;using (Transaction Tx = db.TransactionManager.StartTransaction()){Viewport vp = Tx.GetObject(per.ObjectId, OpenMode.ForWrite) as Viewport;db.UpdateExt(true);double scrRatio = (vp.Width / vp.Height);Matrix3d matWCS2DCS = Matrix3d.PlaneToWorld(vp.ViewDirection);matWCS2DCS = Matrix3d.Displacement(vp.ViewTarget-Point3d.Origin) * matWCS2DCS; matWCS2DCS = Matrix3d.Rotation(-vp.TwistAngle,vp.ViewDirection,vp.ViewTarget) * matWCS2DCS;matWCS2DCS = matWCS2DCS.Inverse();Extents3d extents = new Extents3d(db.Extmin, db.Extmax);extents.TransformBy(matWCS2DCS);double width = (extents.MaxPoint.X - extents.MinPoint.X);double height = (extents.MaxPoint.Y - extents.MinPoint.Y);Point2d center = new Point2d((extents.MaxPoint.X + extents.MinPoint.X)*0.5, (extents.MaxPoint.Y + extents.MinPoint.Y)*0.5);if (width > (height * scrRatio)) height = width / scrRatio;vp.ViewHeight = height;vp.ViewCenter = center;Tx.Commit();}
}
这篇关于Zoom Extents in .Net的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!