找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1292|回复: 0

[分享] DCS vs. WCS (pt. 14) –Draw on PSDCS for all Paper Viewports

[复制链接]

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-5-28 22:01:32 来自手机 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 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());
    }
}

0.jpg


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.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-18 23:58 , Processed in 0.379821 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表