马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
Zoom Extents in .Net
Issue
Do you have any .Net sample code that illustrates how to perform a zoom extents in model space and ** space from .Net?
Solution
The two following C# samples illustrate how to do zoom extents for both model and ** space using pure .Net AutoCAD API:
- 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("**ZoomExtents")]
- static public void **ZoomExtents()
- {
- 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();
- }
- }
|