Kean专题(18)—对象模型
一、创建非矩形的视口December 14, 2009
Creating non-rectangular paperspace viewports in AutoCAD using .NET
Thanks to Philippe Leefsma, from DevTech in Europe, for the ObjectARX code that inspired this post.
In AutoCAD it’s possible to create non-rectangular viewports in paperspace using a variety of closed curve objects: circles, polylines (2D, 3D and lightweight), ellipses, regions, splines and faces. In this post we’re going to see some code that creates four new viewports in the paperspace of the active drawing using a subset of these objects: an Ellipse, a Circle, a closed Spline and a closed Polyline.
Here’s the C# code:
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
namespace ViewportCreation
{
public class Commands
{
static public void CreateNonRectangularViewports()
{
Document doc =
Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
// We're accessing drawing objects, so we need a transaction
Transaction tr = db.TransactionManager.StartTransaction();
using (tr)
{
// Get the primary paperspace from the block table
BlockTable bt =
(BlockTable)tr.GetObject(
db.BlockTableId,
OpenMode.ForRead
);
BlockTableRecord ps =
(BlockTableRecord)tr.GetObject(
bt,
OpenMode.ForWrite
);
// Create a variety of objects for our clip boundaries
DBObjectCollection objs = new DBObjectCollection();
// An ellipse...
Ellipse el =
new Ellipse(
new Point3d(3.5, 4.7, 0),
Vector3d.ZAxis,
new Vector3d(1.4, 0.03, 0),
0.35, 0, 0
);
objs.Add(el);
// A circle...
Circle cir =
new Circle(
new Point3d(3.4, 1.9, 0),
Vector3d.ZAxis,
0.9
);
objs.Add(cir);
// A closed polyline...
Polyline pl =
new Polyline(6);
pl.AddVertexAt(0, new Point2d(4.92, 5.29), 0, 0, 0);
pl.AddVertexAt(1, new Point2d(5.16, 6.02), 0, 0, 0);
pl.AddVertexAt(2, new Point2d(6.12, 6.49), 0, 0, 0);
pl.AddVertexAt(3, new Point2d(7.29, 6.26), -0.27, 0, 0);
pl.AddVertexAt(4, new Point2d(8.11, 5.53), -0.47, 0, 0);
pl.AddVertexAt(5, new Point2d(7.75, 5.41), 0, 0, 0);
pl.Closed = true;
objs.Add(pl);
// A closed spline...
Point3dCollection pts =
new Point3dCollection(
new Point3d[] {
new Point3d (5.5, 2.06, 0),
new Point3d (5.26, 2.62, 0),
new Point3d (5.66, 4.16, 0),
new Point3d (8.56, 4.21, 0),
new Point3d (7.2, 0.86, 0),
new Point3d (6.44, 2.85, 0),
new Point3d (5.62, 1.8, 0),
new Point3d (5.5, 2.06, 0)
}
);
Spline sp = new Spline(pts, 2, 0.5);
objs.Add(sp);
// Add each to the paperspace blocktablerecord
// and create/add an associated viewport object
foreach (DBObject obj in objs)
{
Entity ent = obj as Entity;
if (ent != null)
{
// Add our boundary to paperspace and the
// transaction
ObjectId id = ps.AppendEntity(ent);
tr.AddNewlyCreatedDBObject(obj, true);
// Create our viewport, adding that also
Viewport vp = new Viewport();
ps.AppendEntity(vp);
tr.AddNewlyCreatedDBObject(vp, true);
// Set the boundary entity and turn the
// viewport/clipping on
vp.NonRectClipEntityId = id;
vp.NonRectClipOn = true;
vp.On = true;
}
}
tr.Commit();
}
// Let's take a look at the results in paperspace
db.TileMode = false;
}
}
}Here’s what happens when we draw some geometry in modelspace:
And then call the NRVPS command to create our non-rectangular viewports
页:
[1]