<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Transform object from Modelspace to Paperspace by Viewport in .NET Forum</title>
    <link>https://forums.autodesk.com/t5/net-forum/transform-object-from-modelspace-to-paperspace-by-viewport/m-p/12651735#M4976</link>
    <description>&lt;P&gt;You can do this in a much more simpler way:&lt;/P&gt;
&lt;LI-CODE lang="csharp"&gt;private static void TransformToPaperSpace(Transaction tr, Viewport viewport, ObjectId id)
{
    var ids = new ObjectIdCollection { id };
    var mapping = new IdMapping();
    viewport.Database.DeepCloneObjects(ids, viewport.OwnerId, mapping, false);
    var entity = (Entity)tr.GetObject(mapping[id].Value, OpenMode.ForWrite);
    entity.TransformBy(viewport.DCS2PSDCS() * viewport.WCS2DCS());
}&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Testing command:&lt;/P&gt;
&lt;LI-CODE lang="csharp"&gt;[CommandMethod("TEST", CommandFlags.NoTileMode)]
public static void Test()
{
    var doc = Application.DocumentManager.MdiActiveDocument;
    var db = doc.Database;
    var ed = doc.Editor;

    var peo = new PromptEntityOptions("\nSelect viewport: ");
    peo.SetRejectMessage("\nSelected object is not a viewport.");
    peo.AddAllowedClass(typeof(Viewport), true);
    var per = ed.GetEntity(peo);
    if (per.Status != PromptStatus.OK) return;

    using (var tr = db.TransactionManager.StartTransaction())
    {
        var viewport = (Viewport)tr.GetObject(per.ObjectId, OpenMode.ForRead);

        peo.Message = "\nSelect polyline: ";
        peo.SetRejectMessage("\nSelected object is not a polyline.");
        peo.RemoveAllowedClass(typeof(Viewport));
        peo.AddAllowedClass(typeof(Polyline), true);
        ed.SwitchToModelSpace();
        Application.SetSystemVariable("CVPORT", viewport.Number);
        per = ed.GetEntity(peo);
        if (per.Status != PromptStatus.OK) return;
        var plineId = per.ObjectId;
        ed.SwitchToPaperSpace();

        TransformToPaperSpace(tr, viewport, plineId);

        tr.Commit();
    }
}&lt;/LI-CODE&gt;</description>
    <pubDate>Tue, 19 Mar 2024 19:43:24 GMT</pubDate>
    <dc:creator>_gile</dc:creator>
    <dc:date>2024-03-19T19:43:24Z</dc:date>
    <item>
      <title>Transform object from Modelspace to Paperspace by Viewport</title>
      <link>https://forums.autodesk.com/t5/net-forum/transform-object-from-modelspace-to-paperspace-by-viewport/m-p/12648981#M4971</link>
      <description>&lt;P&gt;I once found these transformations somewhere on the internet:&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="general"&gt;    public static class ucssen
    {
        public static Matrix3d DCS2WCS(this Viewport vp) =&amp;gt;
        Matrix3d.Rotation(-vp.TwistAngle, vp.ViewDirection, vp.ViewTarget) *
        Matrix3d.Displacement(vp.ViewTarget.GetAsVector()) *
        Matrix3d.PlaneToWorld(vp.ViewDirection);

        public static Matrix3d DCS2WCS2(this Viewport vp) =&amp;gt;
        Matrix3d.Rotation(vp.TwistAngle, vp.ViewDirection, vp.ViewTarget) *
        Matrix3d.Displacement(vp.ViewTarget.GetAsVector()) *
        Matrix3d.PlaneToWorld(vp.ViewDirection);

        public static Matrix3d WCS2DCS(this Viewport vp) =&amp;gt;
            Matrix3d.WorldToPlane(vp.ViewDirection) *
            Matrix3d.Displacement(vp.ViewTarget.GetAsVector().Negate()) *
            Matrix3d.Rotation(vp.TwistAngle, vp.ViewDirection, vp.ViewTarget);

        public static Matrix3d DCS2PSDCS(this Viewport vp) =&amp;gt;
            Matrix3d.Scaling(vp.CustomScale, vp.CenterPoint) *
            Matrix3d.Displacement(vp.ViewCenter.Convert3d().GetVectorTo(vp.CenterPoint));

        public static Matrix3d PSDCS2DCS(this Viewport vp) =&amp;gt;
            Matrix3d.Displacement(vp.CenterPoint.GetVectorTo(vp.ViewCenter.Convert3d())) *
            Matrix3d.Scaling(1.0 / vp.CustomScale, vp.CenterPoint);

        public static Point3d Convert3d(this Point2d pt) =&amp;gt;
            new Point3d(pt.X, pt.Y, 0.0);
    }&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Which I was using for transforming objects through viewports (so from modelspace to paperspace, and vise versa, like the 'chspace'-command), by:&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="general"&gt;Matrix3d ViewportToModel = deVp.DCS2WCS() * deVp.PSDCS2DCS();
Matrix3d ModelToViewport = deVp.DCS2PSDCS() * deVp.DCS2WCS2(); &lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;However, seems the one ModelToViewport doesn't always work correctly (while lots of times it does). There's some not-logical (to me) displacement I can't explain.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Anyone knows what could be going wrong here?&lt;/P&gt;</description>
      <pubDate>Mon, 18 Mar 2024 19:46:25 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/net-forum/transform-object-from-modelspace-to-paperspace-by-viewport/m-p/12648981#M4971</guid>
      <dc:creator>stefanveurink68AXD</dc:creator>
      <dc:date>2024-03-18T19:46:25Z</dc:date>
    </item>
    <item>
      <title>Re: Transform object from Modelspace to Paperspace by Viewport</title>
      <link>https://forums.autodesk.com/t5/net-forum/transform-object-from-modelspace-to-paperspace-by-viewport/m-p/12649180#M4972</link>
      <description>&lt;P&gt;Hi,&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;HR /&gt;&lt;a href="https://forums.autodesk.com/t5/user/viewprofilepage/user-id/6508502"&gt;@stefanveurink68AXD&lt;/a&gt;&amp;nbsp;wrote:&lt;BR /&gt;
&lt;P&gt;I once found these transformations somewhere on the internet:&amp;nbsp;&lt;/P&gt;
&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;They seems to come from this &lt;A href="https://github.com/gileCAD/GeometryExtensions/blob/master/GeometryExtensions/ViewportExtension.cs" target="_blank" rel="noopener"&gt;GeometryExtension library&lt;/A&gt; (which does not contain any DCS2WCS2 method).&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Anyway,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="general"&gt;Matrix3d ModelToViewport = deVp.DCS2PSDCS() * deVp.DCS2WCS2();&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Should be:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="csharp"&gt;Matrix3d ModelToViewport = deVp.DCS2PSDCS() * deVp.WCS2DCS();&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 19 Mar 2024 06:18:38 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/net-forum/transform-object-from-modelspace-to-paperspace-by-viewport/m-p/12649180#M4972</guid>
      <dc:creator>_gile</dc:creator>
      <dc:date>2024-03-19T06:18:38Z</dc:date>
    </item>
    <item>
      <title>Re: Transform object from Modelspace to Paperspace by Viewport</title>
      <link>https://forums.autodesk.com/t5/net-forum/transform-object-from-modelspace-to-paperspace-by-viewport/m-p/12651569#M4973</link>
      <description>&lt;P&gt;Well, I've got this code, and it isn't working correctly in all cases. See the added file. in this right viewport it's working, in the left one the displacement isn't correct. Neither with your Matrix3d.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Any idea what could be the problem? Cause I can't figure it out and trust me I tried it a lot.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="general"&gt;        private void transformeneditPL(Polyline pl, Viewport vp) 
        {
            Document doc = Autodesk.AutoCAD.ApplicationServices.Core.Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;

            using (DocumentLock docLock = doc.LockDocument())
            {
                using (Transaction tr = db.TransactionManager.StartTransaction())
                {
                    Viewport deVp = (Viewport)tr.GetObject(vp.ObjectId, OpenMode.ForRead);

                    Matrix3d VPnaarModel = deVp.DCS2WCS() * deVp.PSDCS2DCS();

                    Matrix3d MODELnaarVP = deVp.DCS2PSDCS() * deVp.DCS2WCS(); // * deVp.WCS2DCS();//

                    //1 maak een kopie
                    Polyline nieuwePL = new Polyline(); 
                    nieuwePL.Layer = pl.Layer; 

                    //2 transform de polyline en plaats hem
                    if (MnaarPisTruePnaarMisFalse) //dan dus modelspace naar paperspace
                    {
                        for (int i = 0; i &amp;lt; pl.NumberOfVertices; i++)
                        {
                            Point3d nieuwpunt = new Point3d(pl.GetPoint2dAt(i).X, pl.GetPoint2dAt(i).Y, 0);
                            Point3d nieuwpunttransformed = nieuwpunt.TransformBy(MODELnaarVP);
                            Point2d nieuwpunt2d = new Point2d(nieuwpunttransformed.X, nieuwpunttransformed.Y);

                            nieuwePL.AddVertexAt(nieuwePL.NumberOfVertices, nieuwpunt2d, pl.GetBulgeAt(i), pl.GetStartWidthAt(i) * vp.CustomScale, pl.GetEndWidthAt(i) * vp.CustomScale); //bulge startwidth etc gaat denk ik naar segment niet naar vertex. 
                        }


                        BlockTableRecord btvp = (BlockTableRecord)tr.GetObject(vp.BlockId, OpenMode.ForWrite);
                        Layout layvp = (Layout)tr.GetObject(btvp.LayoutId, OpenMode.ForRead);

   
                        LayoutManager lm = LayoutManager.Current;
                        lm.CurrentLayout = layvp.LayoutName;
                        
                        btvp.AppendEntity(nieuwePL);
                        tr.AddNewlyCreatedDBObject(nieuwePL, true);
                        tr.Commit();
                       
                    }
                }
            }
        }&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 19 Mar 2024 18:14:11 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/net-forum/transform-object-from-modelspace-to-paperspace-by-viewport/m-p/12651569#M4973</guid>
      <dc:creator>stefanveurink68AXD</dc:creator>
      <dc:date>2024-03-19T18:14:11Z</dc:date>
    </item>
    <item>
      <title>Re: Transform object from Modelspace to Paperspace by Viewport</title>
      <link>https://forums.autodesk.com/t5/net-forum/transform-object-from-modelspace-to-paperspace-by-viewport/m-p/12651623#M4974</link>
      <description>&lt;P&gt;Hi,&lt;/P&gt;
&lt;P&gt;This matrix multiplication is not correct.&lt;/P&gt;
&lt;LI-CODE lang="general"&gt;Matrix3d MODELnaarVP = deVp.DCS2PSDCS() * deVp.DCS2WCS();&lt;/LI-CODE&gt;
&lt;P&gt;It should be:&lt;/P&gt;
&lt;LI-CODE lang="csharp"&gt;Matrix3d MODELnaarVP = deVp.DCS2PSDCS() * deVp.WCS2DCS();&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 19 Mar 2024 18:38:25 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/net-forum/transform-object-from-modelspace-to-paperspace-by-viewport/m-p/12651623#M4974</guid>
      <dc:creator>_gile</dc:creator>
      <dc:date>2024-03-19T18:38:25Z</dc:date>
    </item>
    <item>
      <title>Re: Transform object from Modelspace to Paperspace by Viewport</title>
      <link>https://forums.autodesk.com/t5/net-forum/transform-object-from-modelspace-to-paperspace-by-viewport/m-p/12651722#M4975</link>
      <description>&lt;P&gt;Wow. Seems I need a little holiday. Thanks.&lt;/P&gt;</description>
      <pubDate>Tue, 19 Mar 2024 19:36:16 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/net-forum/transform-object-from-modelspace-to-paperspace-by-viewport/m-p/12651722#M4975</guid>
      <dc:creator>stefanveurink68AXD</dc:creator>
      <dc:date>2024-03-19T19:36:16Z</dc:date>
    </item>
    <item>
      <title>Re: Transform object from Modelspace to Paperspace by Viewport</title>
      <link>https://forums.autodesk.com/t5/net-forum/transform-object-from-modelspace-to-paperspace-by-viewport/m-p/12651735#M4976</link>
      <description>&lt;P&gt;You can do this in a much more simpler way:&lt;/P&gt;
&lt;LI-CODE lang="csharp"&gt;private static void TransformToPaperSpace(Transaction tr, Viewport viewport, ObjectId id)
{
    var ids = new ObjectIdCollection { id };
    var mapping = new IdMapping();
    viewport.Database.DeepCloneObjects(ids, viewport.OwnerId, mapping, false);
    var entity = (Entity)tr.GetObject(mapping[id].Value, OpenMode.ForWrite);
    entity.TransformBy(viewport.DCS2PSDCS() * viewport.WCS2DCS());
}&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Testing command:&lt;/P&gt;
&lt;LI-CODE lang="csharp"&gt;[CommandMethod("TEST", CommandFlags.NoTileMode)]
public static void Test()
{
    var doc = Application.DocumentManager.MdiActiveDocument;
    var db = doc.Database;
    var ed = doc.Editor;

    var peo = new PromptEntityOptions("\nSelect viewport: ");
    peo.SetRejectMessage("\nSelected object is not a viewport.");
    peo.AddAllowedClass(typeof(Viewport), true);
    var per = ed.GetEntity(peo);
    if (per.Status != PromptStatus.OK) return;

    using (var tr = db.TransactionManager.StartTransaction())
    {
        var viewport = (Viewport)tr.GetObject(per.ObjectId, OpenMode.ForRead);

        peo.Message = "\nSelect polyline: ";
        peo.SetRejectMessage("\nSelected object is not a polyline.");
        peo.RemoveAllowedClass(typeof(Viewport));
        peo.AddAllowedClass(typeof(Polyline), true);
        ed.SwitchToModelSpace();
        Application.SetSystemVariable("CVPORT", viewport.Number);
        per = ed.GetEntity(peo);
        if (per.Status != PromptStatus.OK) return;
        var plineId = per.ObjectId;
        ed.SwitchToPaperSpace();

        TransformToPaperSpace(tr, viewport, plineId);

        tr.Commit();
    }
}&lt;/LI-CODE&gt;</description>
      <pubDate>Tue, 19 Mar 2024 19:43:24 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/net-forum/transform-object-from-modelspace-to-paperspace-by-viewport/m-p/12651735#M4976</guid>
      <dc:creator>_gile</dc:creator>
      <dc:date>2024-03-19T19:43:24Z</dc:date>
    </item>
  </channel>
</rss>

