Zoom Extents in .Net

来源:互联网 发布:淘宝hd官网下载 编辑:程序博客网 时间:2024/06/09 23:20

原文:来自ADN

缩放模型空间到最合适屏幕,即Zoom E命令

public void SetViewportToExtents(Database db, ViewportTableRecord viewportTableRec) {     //lets update the database extents first    //true gives the best fit but will take time    db.UpdateExt(true);    //get the screen aspect ratio to calculate the height and width    double scrRatio = (viewportTableRec.Width / viewportTableRec.Height);    //prepare Matrix for DCS to WCS transformation    Matrix3d matWCS2DCS = Matrix3d.PlaneToWorld(viewportTableRec.ViewDirection);        //for DCS target point is the origin    matWCS2DCS = Matrix3d.Displacement(viewportTableRec.Target-Point3d.Origin) * matWCS2DCS;         //WCS Xaxis is twisted by twist angle    matWCS2DCS = Matrix3d.Rotation(-viewportTableRec.ViewTwist,                                    viewportTableRec.ViewDirection,                                    viewportTableRec.Target)                                     * matWCS2DCS;            matWCS2DCS = matWCS2DCS.Inverse();    //tranform the extents to the DCS defined by the viewdir    Extents3d extents = new Extents3d(db.Extmin, db.Extmax);    extents.TransformBy(matWCS2DCS);    //width of the extents in current view    double width = (extents.MaxPoint.X - extents.MinPoint.X);    //height of the extents in current view    double height = (extents.MaxPoint.Y - extents.MinPoint.Y);    //get the view center point    Point2d 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 ratio    if (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();    }}



原创粉丝点击