Message 1 of 6
Not applicable
08-09-2012
03:31 PM
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report
Hi, I'm trying to create a function that creates a ucs, defines a named view and algins to the current view based on a blockreference (in this case it will be the last selected entity). So far everythings working except I can't get the view to rotate or "twist" properly? Can you have a look to see where I'm going wrong. Here's the full code, the polyline that's created should frame the view.
[CommandMethod("VM")]
public static void NamedView()
{
// Test Values for Named View
string viewname = "100 m";
double width = 420;
double height = 297;
double angle = 0;
Document doc = Application.DocumentManager.MdiActiveDocument;
Editor ed = doc.Editor;
Database db = doc.Database;
using (Transaction tr = db.TransactionManager.StartTransaction())
{
BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
BlockTableRecord ms = (BlockTableRecord)tr.GetObject(
bt[BlockTableRecord.ModelSpace],
OpenMode.ForWrite);
// Catch last entity (MVF Block) and align UCS
ObjectId ent = Autodesk.AutoCAD.Internal.Utils.EntLast();
if (ent.ObjectClass.DxfName == "INSERT")
{
BlockReference blk = (BlockReference)tr.GetObject(ent, OpenMode.ForRead);
ed.CurrentUserCoordinateSystem = blk.BlockTransform;
angle = blk.Rotation;
}
else
{
ed.WriteMessage("Last entity was not a block reference");
return;
}
// Get Current coordinate system
CoordinateSystem3d cs = ed.CurrentUserCoordinateSystem.CoordinateSystem3d;
Point3d ucsOrigin = cs.Origin; // Used later for View Origin creation
//==================================================================
// Create New User UCS
//==================================================================
UcsTable ut = (UcsTable)tr.GetObject(db.UcsTableId, OpenMode.ForRead);
UcsTableRecord utr;
if (ut.Has(viewname))
{
utr = (UcsTableRecord)tr.GetObject(
ut[viewname], OpenMode.ForWrite);
}
else
{
utr = new UcsTableRecord();
utr.Name = viewname;
ut.UpgradeOpen();
ut.Add(utr);
tr.AddNewlyCreatedDBObject(utr, true);
}
utr.Origin = ucsOrigin;
utr.XAxis = cs.Xaxis;
utr.YAxis = cs.Yaxis;
ViewportTableRecord vptr = tr.GetObject(doc.Editor.ActiveViewportId,
OpenMode.ForWrite) as ViewportTableRecord;
vptr.IconAtOrigin = true;
vptr.IconEnabled = true;
vptr.SetUcs(utr.ObjectId);
doc.Editor.UpdateTiledViewportsFromDatabase();
//==================================================================
// Create View
//==================================================================
ViewTable vt = (ViewTable)tr.GetObject(db.ViewTableId, OpenMode.ForRead);
ViewTableRecord vtr;
// Check if View Name exit's
if (vt.Has(viewname))
{
vtr = (ViewTableRecord)tr.GetObject(vt[viewname], OpenMode.ForWrite);
}
else
{
vtr = new ViewTableRecord();
vtr.Name = viewname;
vt.UpgradeOpen();
ObjectId vtId = vt.Add(vtr);
tr.AddNewlyCreatedDBObject(vtr, true);
}
// Calculate center point if view
double centerX = width / 2;
double centerY = height / 2;
Point2d ctr = new Point2d(centerX, centerY);
//Convert to ucs origin to Point2d
Point2d viewOrigin = new Point2d(ucsOrigin.X, ucsOrigin.Y);
//Create a rotation Matrix for X and Y Axis
Matrix2d mat = Matrix2d.Rotation(angle, Point2d.Origin);
Matrix2d mat2d = new Matrix2d();
mat2d = Matrix2d.AlignCoordinateSystem(
Point2d.Origin,
Vector2d.XAxis,
Vector2d.YAxis,
viewOrigin,
new Vector2d(1, 0).TransformBy(mat),
new Vector2d(0, 1).TransformBy(mat)
);
Point2d viewCenter = ctr.TransformBy(mat2d);
vtr.ViewTwist = -angle;
vtr.IsPaperspaceView = false;
vtr.CenterPoint = viewCenter;
vtr.SetUcs(utr.ObjectId);
vtr.Height = height;
vtr.Width = width;
// Set new view to current
ed.SetCurrentView(vtr);
//==================================================================
// Create Polyline test geometry
//==================================================================
// Defined bouding box to new View
Point2d pt1 = new Point2d(0, 0);
Point2d pt2 = new Point2d(width, 0);
Point2d pt3 = new Point2d(width, height);
Point2d pt4 = new Point2d(0, height);
Point2d[] pts = { pt1, pt2, pt3, pt4 };
// Define Polyline Vertices
Polyline pl = new Polyline(4);
int max = pts.GetUpperBound(0);
for (int i = 0; i <= max; i++)
{
int j = (i == max ? 0 : i + 1);
pl.AddVertexAt(i, pts.TransformBy(mat2d), 0, 0, 0);
}
pl.Closed = true;
// Add the boundary to modelspace
ObjectId id = ms.AppendEntity(pl);
tr.AddNewlyCreatedDBObject(pl, true);
tr.Commit();
}
}
[CommandMethod("VM")]
public static void NamedView()
{
// Test Values for Named View
string viewname = "100 m";
double width = 420;
double height = 297;
double angle = 0;
Document doc = Application.DocumentManager.MdiActiveDocument;
Editor ed = doc.Editor;
Database db = doc.Database;
using (Transaction tr = db.TransactionManager.StartTransaction())
{
BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
BlockTableRecord ms = (BlockTableRecord)tr.GetObject(
bt[BlockTableRecord.ModelSpace],
OpenMode.ForWrite);
// Catch last entity (MVF Block) and align UCS
ObjectId ent = Autodesk.AutoCAD.Internal.Utils.EntLast();
if (ent.ObjectClass.DxfName == "INSERT")
{
BlockReference blk = (BlockReference)tr.GetObject(ent, OpenMode.ForRead);
ed.CurrentUserCoordinateSystem = blk.BlockTransform;
angle = blk.Rotation;
}
else
{
ed.WriteMessage("Last entity was not a block reference");
return;
}
// Get Current coordinate system
CoordinateSystem3d cs = ed.CurrentUserCoordinateSystem.CoordinateSystem3d;
Point3d ucsOrigin = cs.Origin; // Used later for View Origin creation
//==================================================================
// Create New User UCS
//==================================================================
UcsTable ut = (UcsTable)tr.GetObject(db.UcsTableId, OpenMode.ForRead);
UcsTableRecord utr;
if (ut.Has(viewname))
{
utr = (UcsTableRecord)tr.GetObject(
ut[viewname], OpenMode.ForWrite);
}
else
{
utr = new UcsTableRecord();
utr.Name = viewname;
ut.UpgradeOpen();
ut.Add(utr);
tr.AddNewlyCreatedDBObject(utr, true);
}
utr.Origin = ucsOrigin;
utr.XAxis = cs.Xaxis;
utr.YAxis = cs.Yaxis;
ViewportTableRecord vptr = tr.GetObject(doc.Editor.ActiveViewportId,
OpenMode.ForWrite) as ViewportTableRecord;
vptr.IconAtOrigin = true;
vptr.IconEnabled = true;
vptr.SetUcs(utr.ObjectId);
doc.Editor.UpdateTiledViewportsFromDatabase();
//==================================================================
// Create View
//==================================================================
ViewTable vt = (ViewTable)tr.GetObject(db.ViewTableId, OpenMode.ForRead);
ViewTableRecord vtr;
// Check if View Name exit's
if (vt.Has(viewname))
{
vtr = (ViewTableRecord)tr.GetObject(vt[viewname], OpenMode.ForWrite);
}
else
{
vtr = new ViewTableRecord();
vtr.Name = viewname;
vt.UpgradeOpen();
ObjectId vtId = vt.Add(vtr);
tr.AddNewlyCreatedDBObject(vtr, true);
}
// Calculate center point if view
double centerX = width / 2;
double centerY = height / 2;
Point2d ctr = new Point2d(centerX, centerY);
//Convert to ucs origin to Point2d
Point2d viewOrigin = new Point2d(ucsOrigin.X, ucsOrigin.Y);
//Create a rotation Matrix for X and Y Axis
Matrix2d mat = Matrix2d.Rotation(angle, Point2d.Origin);
Matrix2d mat2d = new Matrix2d();
mat2d = Matrix2d.AlignCoordinateSystem(
Point2d.Origin,
Vector2d.XAxis,
Vector2d.YAxis,
viewOrigin,
new Vector2d(1, 0).TransformBy(mat),
new Vector2d(0, 1).TransformBy(mat)
);
Point2d viewCenter = ctr.TransformBy(mat2d);
vtr.ViewTwist = -angle;
vtr.IsPaperspaceView = false;
vtr.CenterPoint = viewCenter;
vtr.SetUcs(utr.ObjectId);
vtr.Height = height;
vtr.Width = width;
// Set new view to current
ed.SetCurrentView(vtr);
//==================================================================
// Create Polyline test geometry
//==================================================================
// Defined bouding box to new View
Point2d pt1 = new Point2d(0, 0);
Point2d pt2 = new Point2d(width, 0);
Point2d pt3 = new Point2d(width, height);
Point2d pt4 = new Point2d(0, height);
Point2d[] pts = { pt1, pt2, pt3, pt4 };
// Define Polyline Vertices
Polyline pl = new Polyline(4);
int max = pts.GetUpperBound(0);
for (int i = 0; i <= max; i++)
{
int j = (i == max ? 0 : i + 1);
pl.AddVertexAt(i, pts.TransformBy(mat2d), 0, 0, 0);
}
pl.Closed = true;
// Add the boundary to modelspace
ObjectId id = ms.AppendEntity(pl);
tr.AddNewlyCreatedDBObject(pl, true);
tr.Commit();
}
}
Solved! Go to Solution.