- UID
- 658062
- 积分
- 2147
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2008-10-22
- 最后登录
- 1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本帖最后由 csharp 于 2014-5-29 08:04 编辑
http://spiderinnet1.typepad.com/blog/2014/05/autocad-net-matrix-transformations-dcs-vs-wcs-pt-14-draw-on-psdcs-for-all-paper-viewports.html
We presented various ways before to draw a rectangle with the view size regardless of Model space or Layout (Viewport or Space) in WCS or UCS, in a plan view or isometric, twisted or not. Usages of both Viewport and ViewportTableRecord were demonstrated. We also used the combination type ViewTableRecord, the handy method Editor.GetCurrentView(), and pretty the same logic and code to fulfill the same task.
A bit earlier, we created a rectangle onto the Paper Space (PSDCS) from a Viewport (Model Space) in the same Layout, with the Layout Viewport size. Previously, we transformed an entity picked in a Layout Viewport from the WCS/UCS of the Layout Viewport to the current Layout Paper Space (PSDCS or PDCS). We also transformed something on the Paper back to a picked Viewport in the same Layout.
We created an EntityJig, which can jig an entity such as Circle on DCS of both Layout Viewports and Paper Space. We also created rectangles on DCS of both Layout Viewports regardless of count and Paper Space. This time, let’s draw rectangles in the viewport size always on the PSDCS of the current Layout regardless in a Viewport Model Space or in the Layout Paper Space itself.
[CommandMethod("DrawOnDCS14", CommandFlags.NoTileMode)]
public static void DrawOnDCS14_Method()
{
Database db = MgdAcApplication.DocumentManager.MdiActiveDocument.Database;
Editor ed = MgdAcApplication.DocumentManager.MdiActiveDocument.Editor;
try
{
using (Transaction tr = db.TransactionManager.StartTransaction())
{
using (Layout layout = tr.GetObject(LayoutManager.Current.GetLayoutId(LayoutManager.Current.CurrentLayout), OpenMode.ForRead) as Layout)
{
foreach (ObjectId id in layout.GetViewports())
{
Viewport vp = tr.GetObject(id, OpenMode.ForRead) as Viewport;
Vector3d viewDirection = vp.ViewDirection;
Point2d viewCenter = vp.ViewCenter;
Point3d viewTarget = vp.ViewTarget;
double viewTwist = vp.TwistAngle;
double viewHeight = vp.ViewHeight;
double viewWidth = vp.ViewHeight * vp.Width / vp.Height;
//Make it a bit smaller
viewHeight *= 0.9;
viewWidth *= 0.9;
Matrix3d matDcsToPSDcs = Matrix3d.Displacement(vp.CenterPoint - (new Point3d(vp.ViewCenter.X, vp.ViewCenter.Y, 0)))
.PreMultiplyBy(Matrix3d.Scaling(vp.Height / vp.ViewHeight, vp.CenterPoint));
Point2d topLeft = viewCenter + new Vector2d(-viewWidth / 2, viewHeight / 2);
Point2d topRight = viewCenter + new Vector2d(viewWidth / 2, viewHeight / 2);
Point2d bottomLeft = viewCenter + new Vector2d(-viewWidth / 2, -viewHeight / 2);
Point2d bottomRight = viewCenter + new Vector2d(viewWidth / 2, -viewHeight / 2);
BlockTableRecord btr = (BlockTableRecord)tr.GetObject(SymbolUtilityServices.GetBlockPaperSpaceId(db), OpenMode.ForWrite);
using (Polyline pl = new Polyline())
{
pl.SetDatabaseDefaults();
pl.ColorIndex = 2;
pl.Closed = true;
pl.AddVertexAt(0, topLeft, 0, 0, 0);
pl.AddVertexAt(1, topRight, 0, 0, 0);
pl.AddVertexAt(2, bottomRight, 0, 0, 0);
pl.AddVertexAt(3, bottomLeft, 0, 0, 0);
pl.TransformBy(matDcsToPSDcs);
btr.AppendEntity(pl);
tr.AddNewlyCreatedDBObject(pl, true);
}
}
}
tr.Commit();
}
}
catch (System.Exception ex)
{
ed.WriteMessage(ex.ToString());
}
}
As can be seen, we tried the command in the Layout Paper Space itself and got the yellow rectangles properly drawn on the PSDCS this time for each Viewport including the Layout Paper itself. If we tried it in any Viewport Model Space of the Layout, we would have gotten the same result. Please give it a try and you will not miss it. Please note again though the rectangles here look almost the same as those as shown last time, they are all on the PSDCS this time instead of on DCS individually for each Layout Viewport but on PSDCS for the Paper itself last time.
|
|