I have this:
[CommandMethod("ZoomCenter")] static public void ZoomCenter() { // Center the view at 5,5,0 Zoom(new Point3d(), new Point3d(), new Point3d(5, 5, 0), 1); }
and
using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.Geometry; static void Zoom(Point3d pMin, Point3d pMax, Point3d pCenter, double dFactor) { // Get the current document and database Document acDoc = Application.DocumentManager.MdiActiveDocument; Database acCurDb = acDoc.Database; int nCurVport = System.Convert.ToInt32(Application.GetSystemVariable("CVPORT")); // Get the extents of the current space no points // or only a center point is provided // Check to see if Model space is current if (acCurDb.TileMode == true) { if (pMin.Equals(new Point3d()) == true && pMax.Equals(new Point3d()) == true) { pMin = acCurDb.Extmin; pMax = acCurDb.Extmax; } } else { // Check to see if Paper space is current if (nCurVport == 1) { // Get the extents of Paper space if (pMin.Equals(new Point3d()) == true && pMax.Equals(new Point3d()) == true) { pMin = acCurDb.Pextmin; pMax = acCurDb.Pextmax; } } else { // Get the extents of Model space if (pMin.Equals(new Point3d()) == true && pMax.Equals(new Point3d()) == true) { pMin = acCurDb.Extmin; pMax = acCurDb.Extmax; } } } // Start a transaction using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction()) { // Get the current view using (ViewTableRecord acView = acDoc.Editor.GetCurrentView()) { Extents3d eExtents; // Translate WCS coordinates to DCS Matrix3d matWCS2DCS; matWCS2DCS = Matrix3d.PlaneToWorld(acView.ViewDirection); matWCS2DCS = Matrix3d.Displacement(acView.Target - Point3d.Origin) * matWCS2DCS; matWCS2DCS = Matrix3d.Rotation(-acView.ViewTwist, acView.ViewDirection, acView.Target) * matWCS2DCS; // If a center point is specified, define the min and max // point of the extents // for Center and Scale modes if (pCenter.DistanceTo(Point3d.Origin) != 0) { pMin = new Point3d(pCenter.X - (acView.Width / 2), pCenter.Y - (acView.Height / 2), 0); pMax = new Point3d((acView.Width / 2) + pCenter.X, (acView.Height / 2) + pCenter.Y, 0); } // Create an extents object using a line using (Line acLine = new Line(pMin, pMax)) { eExtents = new Extents3d(acLine.Bounds.Value.MinPoint, acLine.Bounds.Value.MaxPoint); } // Calculate the ratio between the width and height of the current view double dViewRatio; dViewRatio = (acView.Width / acView.Height); // Tranform the extents of the view matWCS2DCS = matWCS2DCS.Inverse(); eExtents.TransformBy(matWCS2DCS); double dWidth; double dHeight; Point2d pNewCentPt; // Check to see if a center point was provided (Center and Scale modes) if (pCenter.DistanceTo(Point3d.Origin) != 0) { dWidth = acView.Width; dHeight = acView.Height; if (dFactor == 0) { pCenter = pCenter.TransformBy(matWCS2DCS); } pNewCentPt = new Point2d(pCenter.X, pCenter.Y); } else // Working in Window, Extents and Limits mode { // Calculate the new width and height of the current view dWidth = eExtents.MaxPoint.X - eExtents.MinPoint.X; dHeight = eExtents.MaxPoint.Y - eExtents.MinPoint.Y; // Get the center of the view pNewCentPt = new Point2d(((eExtents.MaxPoint.X + eExtents.MinPoint.X) * 0.5), ((eExtents.MaxPoint.Y + eExtents.MinPoint.Y) * 0.5)); } // Check to see if the new width fits in current window if (dWidth > (dHeight * dViewRatio)) dHeight = dWidth / dViewRatio; // Resize and scale the view if (dFactor != 0) { acView.Height = dHeight * dFactor; acView.Width = dWidth * dFactor; } // Set the center of the view acView.CenterPoint = pNewCentPt; // Set the current view acDoc.Editor.SetCurrentView(acView); } // Commit the changes acTrans.Commit(); } }
Both code block are original from:
I´m using Civil 3D 2013 but I type the command "ZoomCenter", the center point of zoom isn´t in (5,5).
What´s the matter?
Thank you.
Solved! Go to Solution.
Solved by joantopo. Go to Solution.
Hi,
Is this behavior specific to a DWG file ? Does it work fine in any other DWG file ?
I didn't try to debug your code here to see what's happening, but in-general you would see many code snippet on Zoom functionality to test and see if something going wrong in your code vs the available code snippets.
Here is a link of code snippet in ADN AutoCAD DevBlog -
http://adndevblog.typepad.com/autocad/2012/07/implementing-zoom-commands-with-net.html
Does it help ?
Thanks,
Partha
Hi Partha.
I have the same trouble with this code block:
public static void ZoomToPoint( Autodesk.AutoCAD.Geometry.Point2d center, double scale) { Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; Database db = Application.DocumentManager.MdiActiveDocument.Database; //get the current view ViewTableRecord view = ed.GetCurrentView(); //start transaction using (Transaction trans = db.TransactionManager.StartTransaction()) { //get the entity' extends //configure the new current view view.Width = view.Width * scale; view.Height = view.Height * scale; view.CenterPoint = new Autodesk.AutoCAD.Geometry.Point2d(center.X, center.Y); //update the view ed.SetCurrentView(view); trans.Commit(); } }
default scale value is 1.
I don´t understand what happen.
I check center.X and center.Y in debugger and they are right but in drawing they aren´t the center.
Hi.
With imperial units drawing, it works well, but I´m using metric drawings.
I use SCP=Universal.
Solved, it´s not depend if drawing is imperial or metric.
This line is the solution:
"view.Target = new Autodesk.AutoCAD.Geometry.Point3d(0,0,0);" because my drawing uses other target.