<?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 How to sync viewports from model space in AutoCAD 2020? in ObjectARX Forum</title>
    <link>https://forums.autodesk.com/t5/objectarx-forum/how-to-sync-viewports-from-model-space-in-autocad-2020/m-p/10285301#M3395</link>
    <description>&lt;P&gt;&lt;SPAN&gt;Greetings Community of experts, I am trying to synchronize the movement and zoom in two windows of AutoCAD models, that is, in two different planes open .dwg divided into two windows one active and the other inactive synchronize the zoom (scroll + or -) or the movement (PAN) from the active window to the inactive one (In model with two open planes in AutoCAD M3D -&amp;gt; SYSWINDOWS :: tile Vertical), I was researching and I found this code that does what I want but only with one plane, the problem is that I can not make it work in VS2019 c ++, I get an error in the lines with "WinCallBack" indicating that BOOL cannot become a constant, I appreciate your help in advance.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;include&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-string"&gt;"StdAfx.h"&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;include&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-string"&gt;"resource.h"&lt;/SPAN&gt;&lt;/SPAN&gt;

&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;pragma&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-keyword"&gt;warning&lt;/SPAN&gt;( disable : 4278 )&lt;/SPAN&gt;

&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;include&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-string"&gt;&amp;lt;windows.h&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;include&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-string"&gt;&amp;lt;stdio.h&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;include&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-string"&gt;"acedCmdNF.h"&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;include&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-string"&gt;"AcMyEditorReactor.h"&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;include&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-string"&gt;"AcMyInputContextReactor.h"&lt;/SPAN&gt;&lt;/SPAN&gt;

&lt;SPAN class="hljs-comment"&gt;// Viewchanged notification is not received during a pan or zoom using mouse wheel.&lt;/SPAN&gt;
&lt;SPAN class="hljs-comment"&gt;// So identify those using WM messages.&lt;/SPAN&gt;
&lt;SPAN class="hljs-function"&gt;BOOL &lt;SPAN class="hljs-title"&gt;WinCallBack&lt;/SPAN&gt;&lt;SPAN class="hljs-params"&gt;(MSG *pMsg)&lt;/SPAN&gt;
&lt;/SPAN&gt;{
   &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;( pMsg-&amp;gt;message == WM_VSCROLL      ||
       pMsg-&amp;gt;message == WM_HSCROLL      ||
       pMsg-&amp;gt;message == WM_MOUSEWHEEL   ||
       pMsg-&amp;gt;message == WM_MBUTTONUP)
   {
       &lt;SPAN class="hljs-comment"&gt;// Sync the modelspace viewports&lt;/SPAN&gt;
       acDocManager-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;sendStringToExecute&lt;/SPAN&gt;(acDocManager-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;mdiActiveDocument&lt;/SPAN&gt;(), &lt;SPAN class="hljs-built_in"&gt;ACRX_T&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"SyncVTR "&lt;/SPAN&gt;), &lt;SPAN class="hljs-literal"&gt;false&lt;/SPAN&gt;, &lt;SPAN class="hljs-literal"&gt;true&lt;/SPAN&gt;, &lt;SPAN class="hljs-literal"&gt;false&lt;/SPAN&gt;);
   }
   &lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; FALSE;
}

&lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;class&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;CMyTest1App&lt;/SPAN&gt; :&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;public&lt;/SPAN&gt; AcRxArxApp
{
&lt;SPAN class="hljs-keyword"&gt;private&lt;/SPAN&gt;:
   AcMyEditorReactor *pEditorReactor;
   AcMyInputContextReactor *pInputContextReactor;

&lt;SPAN class="hljs-keyword"&gt;public&lt;/SPAN&gt;:

   &lt;SPAN class="hljs-built_in"&gt;CMyTest1App&lt;/SPAN&gt; () : &lt;SPAN class="hljs-built_in"&gt;AcRxArxApp&lt;/SPAN&gt; ()
   {
   }

   &lt;SPAN class="hljs-function"&gt;&lt;SPAN class="hljs-keyword"&gt;virtual&lt;/SPAN&gt; AcRx::AppRetCode &lt;SPAN class="hljs-title"&gt;On_kInitAppMsg&lt;/SPAN&gt; &lt;SPAN class="hljs-params"&gt;(&lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt; *pkt)&lt;/SPAN&gt;
   &lt;/SPAN&gt;{
       AcRx::AppRetCode retCode =AcRxArxApp::&lt;SPAN class="hljs-built_in"&gt;On_kInitAppMsg&lt;/SPAN&gt; (pkt) ;

       &lt;SPAN class="hljs-comment"&gt;// Editor reactor to receive to ViewChanged notification&lt;/SPAN&gt;
       pEditorReactor = &lt;SPAN class="hljs-keyword"&gt;new&lt;/SPAN&gt; &lt;SPAN class="hljs-built_in"&gt;AcMyEditorReactor&lt;/SPAN&gt;(&lt;SPAN class="hljs-literal"&gt;true&lt;/SPAN&gt;);

       &lt;SPAN class="hljs-comment"&gt;// InputContext reactor to receive quiescent state change notification&lt;/SPAN&gt;
       pInputContextReactor = &lt;SPAN class="hljs-keyword"&gt;new&lt;/SPAN&gt; &lt;SPAN class="hljs-built_in"&gt;AcMyInputContextReactor&lt;/SPAN&gt;();

       &lt;SPAN class="hljs-comment"&gt;// Viewchanged notification is not received during a pan or zoom using mouse wheel.&lt;/SPAN&gt;
       &lt;SPAN class="hljs-comment"&gt;// So identify those using WM messages.&lt;/SPAN&gt;
       &lt;SPAN class="hljs-built_in"&gt;acedRegisterFilterWinMsg&lt;/SPAN&gt;(WinCallBack);

       &lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; (retCode);
   }

   &lt;SPAN class="hljs-function"&gt;&lt;SPAN class="hljs-keyword"&gt;virtual&lt;/SPAN&gt; AcRx::AppRetCode &lt;SPAN class="hljs-title"&gt;On_kUnloadAppMsg&lt;/SPAN&gt; &lt;SPAN class="hljs-params"&gt;(&lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt; *pkt)&lt;/SPAN&gt;
   &lt;/SPAN&gt;{
       AcRx::AppRetCode retCode =AcRxArxApp::&lt;SPAN class="hljs-built_in"&gt;On_kUnloadAppMsg&lt;/SPAN&gt; (pkt) ;

       &lt;SPAN class="hljs-comment"&gt;// cleanup&lt;/SPAN&gt;
       &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(pEditorReactor)
       {
           &lt;SPAN class="hljs-keyword"&gt;delete&lt;/SPAN&gt; pEditorReactor;
           pEditorReactor = &lt;SPAN class="hljs-literal"&gt;NULL&lt;/SPAN&gt;;
       }

       &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(pInputContextReactor)
       {
           &lt;SPAN class="hljs-keyword"&gt;delete&lt;/SPAN&gt; pInputContextReactor;
           pInputContextReactor = &lt;SPAN class="hljs-literal"&gt;NULL&lt;/SPAN&gt;;
       }

       &lt;SPAN class="hljs-built_in"&gt;acedRemoveFilterWinMsg&lt;/SPAN&gt;(WinCallBack);

       &lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; (retCode);
   }

   &lt;SPAN class="hljs-function"&gt;&lt;SPAN class="hljs-keyword"&gt;virtual&lt;/SPAN&gt; AcRx::AppRetCode &lt;SPAN class="hljs-title"&gt;On_kLoadDwgMsg&lt;/SPAN&gt; &lt;SPAN class="hljs-params"&gt;(&lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt; *pkt)&lt;/SPAN&gt;
   &lt;/SPAN&gt;{
       AcRx::AppRetCode retCode =AcRxArxApp::&lt;SPAN class="hljs-built_in"&gt;On_kLoadDwgMsg&lt;/SPAN&gt; (pkt) ;
       &lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; (retCode) ;
   }
   
   &lt;SPAN class="hljs-function"&gt;&lt;SPAN class="hljs-keyword"&gt;virtual&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;RegisterServerComponents&lt;/SPAN&gt; &lt;SPAN class="hljs-params"&gt;()&lt;/SPAN&gt;
   &lt;/SPAN&gt;{
   }

   &lt;SPAN class="hljs-comment"&gt;// Command to sync the model space viewport parameters&lt;/SPAN&gt;
   &lt;SPAN class="hljs-function"&gt;&lt;SPAN class="hljs-keyword"&gt;static&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;AdskMyTestSyncVTR&lt;/SPAN&gt;&lt;SPAN class="hljs-params"&gt;()&lt;/SPAN&gt;
   &lt;/SPAN&gt;{
       &lt;SPAN class="hljs-comment"&gt;// Get the VTR updated&lt;/SPAN&gt;
       &lt;SPAN class="hljs-built_in"&gt;acedVports2VportTableRecords&lt;/SPAN&gt;();

       &lt;SPAN class="hljs-comment"&gt;// We will update the other VTR only if view parameters change&lt;/SPAN&gt;
       Adesk::Boolean updateNeeded = Adesk::kFalse;

       Acad::ErrorStatus es;
       AcDbDatabase *pDb = &lt;SPAN class="hljs-built_in"&gt;acdbHostApplicationServices&lt;/SPAN&gt;()-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;workingDatabase&lt;/SPAN&gt;();

       AcApDocument *pDoc = acDocManager-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;document&lt;/SPAN&gt;(pDb);
       &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;( pDoc == &lt;SPAN class="hljs-literal"&gt;NULL&lt;/SPAN&gt; )
           &lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt;;
       es = acDocManager-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;lockDocument&lt;/SPAN&gt;(pDoc);

       &lt;SPAN class="hljs-comment"&gt;// This code at present can only deal with 2 Modelspace viewports split vertically in half&lt;/SPAN&gt;
       &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(pDb-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;tilemode&lt;/SPAN&gt;() == Adesk::kFalse)
       {
           &lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;struct&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;resbuf&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;rb&lt;/SPAN&gt;;&lt;/SPAN&gt;
           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;ads_getvar&lt;/SPAN&gt;(_T(&lt;SPAN class="hljs-string"&gt;"cvport"&lt;/SPAN&gt;), &amp;amp;rb) != RTNORM)
           {
               &lt;SPAN class="hljs-built_in"&gt;acutPrintf&lt;/SPAN&gt;(_T(&lt;SPAN class="hljs-string"&gt;"\nError using ads_getvar().\n"&lt;/SPAN&gt;));
               &lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt;;
           }

           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(rb.resval.rint == &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;)
           {
               &lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt;; &lt;SPAN class="hljs-comment"&gt;// Can only work with model space viewports.&lt;/SPAN&gt;
           }
       }

       AcDbViewportTable *pVT = &lt;SPAN class="hljs-literal"&gt;NULL&lt;/SPAN&gt;;
       pDb-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;getViewportTable&lt;/SPAN&gt;(pVT,AcDb::kForRead);
   
       &lt;SPAN class="hljs-comment"&gt;// Identify the left and right modelspace viewports&lt;/SPAN&gt;
       AcDbViewportTableRecord *pLeftVTR = &lt;SPAN class="hljs-literal"&gt;NULL&lt;/SPAN&gt;;
       AcDbViewportTableRecord *pRightVTR = &lt;SPAN class="hljs-literal"&gt;NULL&lt;/SPAN&gt;;

       AcDbViewportTableIterator *pIter = &lt;SPAN class="hljs-literal"&gt;NULL&lt;/SPAN&gt;;
       es = pVT-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;newIterator&lt;/SPAN&gt;(pIter);
       &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(es == Acad::eOk)
       {
           &lt;SPAN class="hljs-keyword"&gt;for&lt;/SPAN&gt; (;!pIter-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;done&lt;/SPAN&gt;();pIter-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;step&lt;/SPAN&gt;())
           {
               AcDbViewportTableRecord *pVTR = &lt;SPAN class="hljs-literal"&gt;NULL&lt;/SPAN&gt;;
               es = pIter-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;getRecord&lt;/SPAN&gt;(pVTR, AcDb::kForRead);
               &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(es == Acad::eOk)
               {
                   AcGePoint2d ll = pVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;lowerLeftCorner&lt;/SPAN&gt;();
                   AcGePoint2d ur = pVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;upperRightCorner&lt;/SPAN&gt;();

                   &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(ll.&lt;SPAN class="hljs-built_in"&gt;isEqualTo&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;AcGePoint2d&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;)))
                   {&lt;SPAN class="hljs-comment"&gt;// Left modelspace viewport&lt;/SPAN&gt;
                       pLeftVTR = pVTR;
                   }
                   &lt;SPAN class="hljs-keyword"&gt;else&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(ur.&lt;SPAN class="hljs-built_in"&gt;isEqualTo&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;AcGePoint2d&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;1.0&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;1.0&lt;/SPAN&gt;)))
                   {&lt;SPAN class="hljs-comment"&gt;// Right modelspace viewport&lt;/SPAN&gt;
                       pRightVTR = pVTR;
                   }
                   &lt;SPAN class="hljs-keyword"&gt;else&lt;/SPAN&gt;
                       pVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;close&lt;/SPAN&gt;();
               }
           }

           &lt;SPAN class="hljs-comment"&gt;// If for some reason, we did not have two modelspace viewports,&lt;/SPAN&gt;
           &lt;SPAN class="hljs-comment"&gt;// lets stop here.&lt;/SPAN&gt;
           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(pLeftVTR == &lt;SPAN class="hljs-literal"&gt;NULL&lt;/SPAN&gt;)
           {
               &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(pRightVTR != &lt;SPAN class="hljs-literal"&gt;NULL&lt;/SPAN&gt;)
                   pRightVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;close&lt;/SPAN&gt;();
               &lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt;;
           }
           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(pRightVTR == &lt;SPAN class="hljs-literal"&gt;NULL&lt;/SPAN&gt;)
           {
               &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(pLeftVTR != &lt;SPAN class="hljs-literal"&gt;NULL&lt;/SPAN&gt;)
                   pLeftVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;close&lt;/SPAN&gt;();
               &lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt;;
           }

           &lt;SPAN class="hljs-comment"&gt;// Ensure that the two viewports are split vertically in half.&lt;/SPAN&gt;
           &lt;SPAN class="hljs-comment"&gt;// If not, the view parameters when applied from one to another&lt;/SPAN&gt;
           &lt;SPAN class="hljs-comment"&gt;// may not apply directly using this code.&lt;/SPAN&gt;
           &lt;SPAN class="hljs-comment"&gt;// If the viewports were resized manually, set them right.&lt;/SPAN&gt;
           AcGePoint2d ll1 = pLeftVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;lowerLeftCorner&lt;/SPAN&gt;();
           AcGePoint2d ur1 = pLeftVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;upperRightCorner&lt;/SPAN&gt;();

           AcGePoint2d ll2 = pRightVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;lowerLeftCorner&lt;/SPAN&gt;();
           AcGePoint2d ur2 = pRightVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;upperRightCorner&lt;/SPAN&gt;();

           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(ll1.&lt;SPAN class="hljs-built_in"&gt;isEqualTo&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;AcGePoint2d&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;0.0&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;0.0&lt;/SPAN&gt;)) == &lt;SPAN class="hljs-literal"&gt;false&lt;/SPAN&gt;)
           {
               &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(! pLeftVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;isWriteEnabled&lt;/SPAN&gt;())
                   pLeftVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;upgradeOpen&lt;/SPAN&gt;();

               pLeftVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;setLowerLeftCorner&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;AcGePoint2d&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;0.0&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;0.0&lt;/SPAN&gt;));
           }

           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(ur1.&lt;SPAN class="hljs-built_in"&gt;isEqualTo&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;AcGePoint2d&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;0.5&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;1.0&lt;/SPAN&gt;)) == &lt;SPAN class="hljs-literal"&gt;false&lt;/SPAN&gt;)
           {
               &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(! pLeftVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;isWriteEnabled&lt;/SPAN&gt;())
                   pLeftVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;upgradeOpen&lt;/SPAN&gt;();

               pLeftVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;setUpperRightCorner&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;AcGePoint2d&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;0.5&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;1.0&lt;/SPAN&gt;));
           }

           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(ll2.&lt;SPAN class="hljs-built_in"&gt;isEqualTo&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;AcGePoint2d&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;0.5&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;0.0&lt;/SPAN&gt;)) == &lt;SPAN class="hljs-literal"&gt;false&lt;/SPAN&gt;)
           {
               &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(! pRightVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;isWriteEnabled&lt;/SPAN&gt;())
                   pRightVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;upgradeOpen&lt;/SPAN&gt;();

               pRightVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;setLowerLeftCorner&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;AcGePoint2d&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;0.5&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;0.0&lt;/SPAN&gt;));
           }

           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(ur2.&lt;SPAN class="hljs-built_in"&gt;isEqualTo&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;AcGePoint2d&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;1.0&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;1.0&lt;/SPAN&gt;)) == &lt;SPAN class="hljs-literal"&gt;false&lt;/SPAN&gt;)
           {
               &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(! pRightVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;isWriteEnabled&lt;/SPAN&gt;())
                   pRightVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;upgradeOpen&lt;/SPAN&gt;();

               pRightVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;setUpperRightCorner&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;AcGePoint2d&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;1.0&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;1.0&lt;/SPAN&gt;));
           }

           &lt;SPAN class="hljs-comment"&gt;// Get the active model space viewport&lt;/SPAN&gt;
           &lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;struct&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;resbuf&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;res&lt;/SPAN&gt;;&lt;/SPAN&gt;
           &lt;SPAN class="hljs-built_in"&gt;acedGetVar&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;L"CVPORT"&lt;/SPAN&gt;, &amp;amp;res);
           &lt;SPAN class="hljs-keyword"&gt;short&lt;/SPAN&gt; vpnumber = res.resval.rint;

           &lt;SPAN class="hljs-comment"&gt;// Identify the model space viewports  from/to which settings will be copied&lt;/SPAN&gt;
           &lt;SPAN class="hljs-comment"&gt;// The active modelspace viewport is the viewport from which settings will be copied&lt;/SPAN&gt;
           AcDbViewportTableRecord *pFromVTR = &lt;SPAN class="hljs-literal"&gt;NULL&lt;/SPAN&gt;;
           AcDbViewportTableRecord *pToVTR = &lt;SPAN class="hljs-literal"&gt;NULL&lt;/SPAN&gt;;

           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(pLeftVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;number&lt;/SPAN&gt;() == vpnumber)
           {
               pFromVTR = pLeftVTR;
               pToVTR = pRightVTR;
           }
           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(pRightVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;number&lt;/SPAN&gt;() == vpnumber)
           {
               pFromVTR = pRightVTR;
               pToVTR = pLeftVTR;
           }

           &lt;SPAN class="hljs-comment"&gt;// Sorry, we did not identify the active viewport&lt;/SPAN&gt;
           &lt;SPAN class="hljs-comment"&gt;// from which settings need to be copied.&lt;/SPAN&gt;
           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(pFromVTR == &lt;SPAN class="hljs-literal"&gt;NULL&lt;/SPAN&gt; || pToVTR == &lt;SPAN class="hljs-literal"&gt;NULL&lt;/SPAN&gt;)
               &lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt;;

           &lt;SPAN class="hljs-comment"&gt;// Copy the VTR settings from one modelspace viewport to another&lt;/SPAN&gt;
           &lt;SPAN class="hljs-comment"&gt;// only if they are different. We will use a tolerance to ensure&lt;/SPAN&gt;
           &lt;SPAN class="hljs-comment"&gt;// very small differences do not get us in a soup. I meant loop :)&lt;/SPAN&gt;

           AcGeTol newTol;
           newTol.&lt;SPAN class="hljs-built_in"&gt;setEqualPoint&lt;/SPAN&gt; (&lt;SPAN class="hljs-number"&gt;0.00001&lt;/SPAN&gt;);
           newTol.&lt;SPAN class="hljs-built_in"&gt;setEqualVector&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;0.00001&lt;/SPAN&gt;);

           &lt;SPAN class="hljs-comment"&gt;// ViewDirection&lt;/SPAN&gt;
           AcGeVector3d fromViewDir = pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;viewDirection&lt;/SPAN&gt;();
           AcGeVector3d toViewDir = pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;viewDirection&lt;/SPAN&gt;();
           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;viewDirection&lt;/SPAN&gt;().&lt;SPAN class="hljs-built_in"&gt;isEqualTo&lt;/SPAN&gt;(pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;viewDirection&lt;/SPAN&gt;(), newTol) == &lt;SPAN class="hljs-literal"&gt;false&lt;/SPAN&gt;)
           {
               &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(! pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;isWriteEnabled&lt;/SPAN&gt;())
                   pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;upgradeOpen&lt;/SPAN&gt;();

               pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;setViewDirection&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;viewDirection&lt;/SPAN&gt;());
               updateNeeded = Adesk::kTrue;
           }

           &lt;SPAN class="hljs-comment"&gt;// ViewTwist&lt;/SPAN&gt;
           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;abs&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;viewTwist&lt;/SPAN&gt;() - pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;viewTwist&lt;/SPAN&gt;()) &amp;gt; &lt;SPAN class="hljs-number"&gt;0.01&lt;/SPAN&gt;)
           {
               &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(! pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;isWriteEnabled&lt;/SPAN&gt;())
                   pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;upgradeOpen&lt;/SPAN&gt;();

               pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;setViewTwist&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;viewTwist&lt;/SPAN&gt;());
               updateNeeded = Adesk::kTrue;
           }

           &lt;SPAN class="hljs-comment"&gt;// Target&lt;/SPAN&gt;
           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;target&lt;/SPAN&gt;().&lt;SPAN class="hljs-built_in"&gt;isEqualTo&lt;/SPAN&gt;(pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;target&lt;/SPAN&gt;(), newTol) == &lt;SPAN class="hljs-literal"&gt;false&lt;/SPAN&gt;)
           {
               &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(! pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;isWriteEnabled&lt;/SPAN&gt;())
                   pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;upgradeOpen&lt;/SPAN&gt;();

               pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;setTarget&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;target&lt;/SPAN&gt;());
               updateNeeded = Adesk::kTrue;
           }

           &lt;SPAN class="hljs-comment"&gt;// BackClipEnabled&lt;/SPAN&gt;
           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;backClipEnabled&lt;/SPAN&gt;() != pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;backClipEnabled&lt;/SPAN&gt;())
           {
               &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(! pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;isWriteEnabled&lt;/SPAN&gt;())
                   pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;upgradeOpen&lt;/SPAN&gt;();
               pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;setBackClipEnabled&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;backClipEnabled&lt;/SPAN&gt;());
               updateNeeded = Adesk::kTrue;
           }

           &lt;SPAN class="hljs-comment"&gt;// BackClipDistance&lt;/SPAN&gt;
           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;abs&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;backClipDistance&lt;/SPAN&gt;() - pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;backClipDistance&lt;/SPAN&gt;()) &amp;gt; &lt;SPAN class="hljs-number"&gt;0.01&lt;/SPAN&gt;)
           {
               &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(! pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;isWriteEnabled&lt;/SPAN&gt;())
                   pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;upgradeOpen&lt;/SPAN&gt;();

               pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;setBackClipDistance&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;backClipDistance&lt;/SPAN&gt;());
               updateNeeded = Adesk::kTrue;
           }

           &lt;SPAN class="hljs-comment"&gt;// FrontClipEnabled&lt;/SPAN&gt;
           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;frontClipEnabled&lt;/SPAN&gt;() != pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;frontClipEnabled&lt;/SPAN&gt;())
           {
               &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(! pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;isWriteEnabled&lt;/SPAN&gt;())
                   pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;upgradeOpen&lt;/SPAN&gt;();
               pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;setFrontClipEnabled&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;frontClipEnabled&lt;/SPAN&gt;());
               updateNeeded = Adesk::kTrue;
           }

           &lt;SPAN class="hljs-comment"&gt;// FrontClipDistance&lt;/SPAN&gt;
           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;abs&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;frontClipDistance&lt;/SPAN&gt;() - pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;frontClipDistance&lt;/SPAN&gt;()) &amp;gt; &lt;SPAN class="hljs-number"&gt;0.01&lt;/SPAN&gt;)
           {
               &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(! pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;isWriteEnabled&lt;/SPAN&gt;())
                   pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;upgradeOpen&lt;/SPAN&gt;();

               pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;setFrontClipDistance&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;frontClipDistance&lt;/SPAN&gt;());
               updateNeeded = Adesk::kTrue;
           }

           &lt;SPAN class="hljs-comment"&gt;// Elevation&lt;/SPAN&gt;
           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;abs&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;elevation&lt;/SPAN&gt;() - pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;elevation&lt;/SPAN&gt;()) &amp;gt; &lt;SPAN class="hljs-number"&gt;0.01&lt;/SPAN&gt;)
           {
               &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(! pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;isWriteEnabled&lt;/SPAN&gt;())
                   pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;upgradeOpen&lt;/SPAN&gt;();

               pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;setElevation&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;elevation&lt;/SPAN&gt;());
               updateNeeded = Adesk::kTrue;
           }

           &lt;SPAN class="hljs-comment"&gt;// centerPoint&lt;/SPAN&gt;
           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;centerPoint&lt;/SPAN&gt;().&lt;SPAN class="hljs-built_in"&gt;isEqualTo&lt;/SPAN&gt;(pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;centerPoint&lt;/SPAN&gt;(), newTol) == &lt;SPAN class="hljs-literal"&gt;false&lt;/SPAN&gt;)
           {
               &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(! pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;isWriteEnabled&lt;/SPAN&gt;())
                   pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;upgradeOpen&lt;/SPAN&gt;();

               pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;setCenterPoint&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;centerPoint&lt;/SPAN&gt;());
               updateNeeded = Adesk::kTrue;
           }

           &lt;SPAN class="hljs-comment"&gt;// Height&lt;/SPAN&gt;
           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;abs&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;height&lt;/SPAN&gt;() - pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;height&lt;/SPAN&gt;()) &amp;gt; &lt;SPAN class="hljs-number"&gt;0.01&lt;/SPAN&gt;)
           {
               &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(! pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;isWriteEnabled&lt;/SPAN&gt;())
                   pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;upgradeOpen&lt;/SPAN&gt;();

               pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;setHeight&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;height&lt;/SPAN&gt;());
               updateNeeded = Adesk::kTrue;
           }

           &lt;SPAN class="hljs-comment"&gt;// Width&lt;/SPAN&gt;
           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;abs&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;width&lt;/SPAN&gt;() - pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;width&lt;/SPAN&gt;()) &amp;gt; &lt;SPAN class="hljs-number"&gt;0.01&lt;/SPAN&gt;)
           {
               &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(! pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;isWriteEnabled&lt;/SPAN&gt;())
                   pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;upgradeOpen&lt;/SPAN&gt;();

               pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;setWidth&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;width&lt;/SPAN&gt;());
               updateNeeded = Adesk::kTrue;
           }

           &lt;SPAN class="hljs-comment"&gt;// Done with the VTR&lt;/SPAN&gt;
           pLeftVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;close&lt;/SPAN&gt;();
           pRightVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;close&lt;/SPAN&gt;();

           &lt;SPAN class="hljs-keyword"&gt;delete&lt;/SPAN&gt; pIter;
       }
       es = pVT-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;close&lt;/SPAN&gt;();

       es = acDocManager-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;unlockDocument&lt;/SPAN&gt;(pDoc);

       &lt;SPAN class="hljs-comment"&gt;// Update the Vports if we did change any of the VTR parameters&lt;/SPAN&gt;
       &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(updateNeeded)
       {
           &lt;SPAN class="hljs-built_in"&gt;acedVportTableRecords2Vports&lt;/SPAN&gt;();
       }
   }
};

&lt;SPAN class="hljs-comment"&gt;//-----------------------------------------------------------------------------&lt;/SPAN&gt;
&lt;SPAN class="hljs-built_in"&gt;IMPLEMENT_ARX_ENTRYPOINT&lt;/SPAN&gt;(CMyTest1App)

&lt;SPAN class="hljs-built_in"&gt;ACED_ARXCOMMAND_ENTRY_AUTO&lt;/SPAN&gt;(CMyTest1App, AdskMyTest, SyncVTR, SyncVTR, ACRX_CMD_MODAL, &lt;SPAN class="hljs-literal"&gt;NULL&lt;/SPAN&gt;)&lt;/PRE&gt;</description>
    <pubDate>Sun, 02 May 2021 16:21:43 GMT</pubDate>
    <dc:creator>BriamR</dc:creator>
    <dc:date>2021-05-02T16:21:43Z</dc:date>
    <item>
      <title>How to sync viewports from model space in AutoCAD 2020?</title>
      <link>https://forums.autodesk.com/t5/objectarx-forum/how-to-sync-viewports-from-model-space-in-autocad-2020/m-p/10285301#M3395</link>
      <description>&lt;P&gt;&lt;SPAN&gt;Greetings Community of experts, I am trying to synchronize the movement and zoom in two windows of AutoCAD models, that is, in two different planes open .dwg divided into two windows one active and the other inactive synchronize the zoom (scroll + or -) or the movement (PAN) from the active window to the inactive one (In model with two open planes in AutoCAD M3D -&amp;gt; SYSWINDOWS :: tile Vertical), I was researching and I found this code that does what I want but only with one plane, the problem is that I can not make it work in VS2019 c ++, I get an error in the lines with "WinCallBack" indicating that BOOL cannot become a constant, I appreciate your help in advance.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;include&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-string"&gt;"StdAfx.h"&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;include&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-string"&gt;"resource.h"&lt;/SPAN&gt;&lt;/SPAN&gt;

&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;pragma&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-keyword"&gt;warning&lt;/SPAN&gt;( disable : 4278 )&lt;/SPAN&gt;

&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;include&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-string"&gt;&amp;lt;windows.h&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;include&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-string"&gt;&amp;lt;stdio.h&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;include&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-string"&gt;"acedCmdNF.h"&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;include&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-string"&gt;"AcMyEditorReactor.h"&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;include&lt;/SPAN&gt; &lt;SPAN class="hljs-meta-string"&gt;"AcMyInputContextReactor.h"&lt;/SPAN&gt;&lt;/SPAN&gt;

&lt;SPAN class="hljs-comment"&gt;// Viewchanged notification is not received during a pan or zoom using mouse wheel.&lt;/SPAN&gt;
&lt;SPAN class="hljs-comment"&gt;// So identify those using WM messages.&lt;/SPAN&gt;
&lt;SPAN class="hljs-function"&gt;BOOL &lt;SPAN class="hljs-title"&gt;WinCallBack&lt;/SPAN&gt;&lt;SPAN class="hljs-params"&gt;(MSG *pMsg)&lt;/SPAN&gt;
&lt;/SPAN&gt;{
   &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;( pMsg-&amp;gt;message == WM_VSCROLL      ||
       pMsg-&amp;gt;message == WM_HSCROLL      ||
       pMsg-&amp;gt;message == WM_MOUSEWHEEL   ||
       pMsg-&amp;gt;message == WM_MBUTTONUP)
   {
       &lt;SPAN class="hljs-comment"&gt;// Sync the modelspace viewports&lt;/SPAN&gt;
       acDocManager-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;sendStringToExecute&lt;/SPAN&gt;(acDocManager-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;mdiActiveDocument&lt;/SPAN&gt;(), &lt;SPAN class="hljs-built_in"&gt;ACRX_T&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"SyncVTR "&lt;/SPAN&gt;), &lt;SPAN class="hljs-literal"&gt;false&lt;/SPAN&gt;, &lt;SPAN class="hljs-literal"&gt;true&lt;/SPAN&gt;, &lt;SPAN class="hljs-literal"&gt;false&lt;/SPAN&gt;);
   }
   &lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; FALSE;
}

&lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;class&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;CMyTest1App&lt;/SPAN&gt; :&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;public&lt;/SPAN&gt; AcRxArxApp
{
&lt;SPAN class="hljs-keyword"&gt;private&lt;/SPAN&gt;:
   AcMyEditorReactor *pEditorReactor;
   AcMyInputContextReactor *pInputContextReactor;

&lt;SPAN class="hljs-keyword"&gt;public&lt;/SPAN&gt;:

   &lt;SPAN class="hljs-built_in"&gt;CMyTest1App&lt;/SPAN&gt; () : &lt;SPAN class="hljs-built_in"&gt;AcRxArxApp&lt;/SPAN&gt; ()
   {
   }

   &lt;SPAN class="hljs-function"&gt;&lt;SPAN class="hljs-keyword"&gt;virtual&lt;/SPAN&gt; AcRx::AppRetCode &lt;SPAN class="hljs-title"&gt;On_kInitAppMsg&lt;/SPAN&gt; &lt;SPAN class="hljs-params"&gt;(&lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt; *pkt)&lt;/SPAN&gt;
   &lt;/SPAN&gt;{
       AcRx::AppRetCode retCode =AcRxArxApp::&lt;SPAN class="hljs-built_in"&gt;On_kInitAppMsg&lt;/SPAN&gt; (pkt) ;

       &lt;SPAN class="hljs-comment"&gt;// Editor reactor to receive to ViewChanged notification&lt;/SPAN&gt;
       pEditorReactor = &lt;SPAN class="hljs-keyword"&gt;new&lt;/SPAN&gt; &lt;SPAN class="hljs-built_in"&gt;AcMyEditorReactor&lt;/SPAN&gt;(&lt;SPAN class="hljs-literal"&gt;true&lt;/SPAN&gt;);

       &lt;SPAN class="hljs-comment"&gt;// InputContext reactor to receive quiescent state change notification&lt;/SPAN&gt;
       pInputContextReactor = &lt;SPAN class="hljs-keyword"&gt;new&lt;/SPAN&gt; &lt;SPAN class="hljs-built_in"&gt;AcMyInputContextReactor&lt;/SPAN&gt;();

       &lt;SPAN class="hljs-comment"&gt;// Viewchanged notification is not received during a pan or zoom using mouse wheel.&lt;/SPAN&gt;
       &lt;SPAN class="hljs-comment"&gt;// So identify those using WM messages.&lt;/SPAN&gt;
       &lt;SPAN class="hljs-built_in"&gt;acedRegisterFilterWinMsg&lt;/SPAN&gt;(WinCallBack);

       &lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; (retCode);
   }

   &lt;SPAN class="hljs-function"&gt;&lt;SPAN class="hljs-keyword"&gt;virtual&lt;/SPAN&gt; AcRx::AppRetCode &lt;SPAN class="hljs-title"&gt;On_kUnloadAppMsg&lt;/SPAN&gt; &lt;SPAN class="hljs-params"&gt;(&lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt; *pkt)&lt;/SPAN&gt;
   &lt;/SPAN&gt;{
       AcRx::AppRetCode retCode =AcRxArxApp::&lt;SPAN class="hljs-built_in"&gt;On_kUnloadAppMsg&lt;/SPAN&gt; (pkt) ;

       &lt;SPAN class="hljs-comment"&gt;// cleanup&lt;/SPAN&gt;
       &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(pEditorReactor)
       {
           &lt;SPAN class="hljs-keyword"&gt;delete&lt;/SPAN&gt; pEditorReactor;
           pEditorReactor = &lt;SPAN class="hljs-literal"&gt;NULL&lt;/SPAN&gt;;
       }

       &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(pInputContextReactor)
       {
           &lt;SPAN class="hljs-keyword"&gt;delete&lt;/SPAN&gt; pInputContextReactor;
           pInputContextReactor = &lt;SPAN class="hljs-literal"&gt;NULL&lt;/SPAN&gt;;
       }

       &lt;SPAN class="hljs-built_in"&gt;acedRemoveFilterWinMsg&lt;/SPAN&gt;(WinCallBack);

       &lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; (retCode);
   }

   &lt;SPAN class="hljs-function"&gt;&lt;SPAN class="hljs-keyword"&gt;virtual&lt;/SPAN&gt; AcRx::AppRetCode &lt;SPAN class="hljs-title"&gt;On_kLoadDwgMsg&lt;/SPAN&gt; &lt;SPAN class="hljs-params"&gt;(&lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt; *pkt)&lt;/SPAN&gt;
   &lt;/SPAN&gt;{
       AcRx::AppRetCode retCode =AcRxArxApp::&lt;SPAN class="hljs-built_in"&gt;On_kLoadDwgMsg&lt;/SPAN&gt; (pkt) ;
       &lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; (retCode) ;
   }
   
   &lt;SPAN class="hljs-function"&gt;&lt;SPAN class="hljs-keyword"&gt;virtual&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;RegisterServerComponents&lt;/SPAN&gt; &lt;SPAN class="hljs-params"&gt;()&lt;/SPAN&gt;
   &lt;/SPAN&gt;{
   }

   &lt;SPAN class="hljs-comment"&gt;// Command to sync the model space viewport parameters&lt;/SPAN&gt;
   &lt;SPAN class="hljs-function"&gt;&lt;SPAN class="hljs-keyword"&gt;static&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;void&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;AdskMyTestSyncVTR&lt;/SPAN&gt;&lt;SPAN class="hljs-params"&gt;()&lt;/SPAN&gt;
   &lt;/SPAN&gt;{
       &lt;SPAN class="hljs-comment"&gt;// Get the VTR updated&lt;/SPAN&gt;
       &lt;SPAN class="hljs-built_in"&gt;acedVports2VportTableRecords&lt;/SPAN&gt;();

       &lt;SPAN class="hljs-comment"&gt;// We will update the other VTR only if view parameters change&lt;/SPAN&gt;
       Adesk::Boolean updateNeeded = Adesk::kFalse;

       Acad::ErrorStatus es;
       AcDbDatabase *pDb = &lt;SPAN class="hljs-built_in"&gt;acdbHostApplicationServices&lt;/SPAN&gt;()-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;workingDatabase&lt;/SPAN&gt;();

       AcApDocument *pDoc = acDocManager-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;document&lt;/SPAN&gt;(pDb);
       &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;( pDoc == &lt;SPAN class="hljs-literal"&gt;NULL&lt;/SPAN&gt; )
           &lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt;;
       es = acDocManager-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;lockDocument&lt;/SPAN&gt;(pDoc);

       &lt;SPAN class="hljs-comment"&gt;// This code at present can only deal with 2 Modelspace viewports split vertically in half&lt;/SPAN&gt;
       &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(pDb-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;tilemode&lt;/SPAN&gt;() == Adesk::kFalse)
       {
           &lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;struct&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;resbuf&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;rb&lt;/SPAN&gt;;&lt;/SPAN&gt;
           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;ads_getvar&lt;/SPAN&gt;(_T(&lt;SPAN class="hljs-string"&gt;"cvport"&lt;/SPAN&gt;), &amp;amp;rb) != RTNORM)
           {
               &lt;SPAN class="hljs-built_in"&gt;acutPrintf&lt;/SPAN&gt;(_T(&lt;SPAN class="hljs-string"&gt;"\nError using ads_getvar().\n"&lt;/SPAN&gt;));
               &lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt;;
           }

           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(rb.resval.rint == &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;)
           {
               &lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt;; &lt;SPAN class="hljs-comment"&gt;// Can only work with model space viewports.&lt;/SPAN&gt;
           }
       }

       AcDbViewportTable *pVT = &lt;SPAN class="hljs-literal"&gt;NULL&lt;/SPAN&gt;;
       pDb-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;getViewportTable&lt;/SPAN&gt;(pVT,AcDb::kForRead);
   
       &lt;SPAN class="hljs-comment"&gt;// Identify the left and right modelspace viewports&lt;/SPAN&gt;
       AcDbViewportTableRecord *pLeftVTR = &lt;SPAN class="hljs-literal"&gt;NULL&lt;/SPAN&gt;;
       AcDbViewportTableRecord *pRightVTR = &lt;SPAN class="hljs-literal"&gt;NULL&lt;/SPAN&gt;;

       AcDbViewportTableIterator *pIter = &lt;SPAN class="hljs-literal"&gt;NULL&lt;/SPAN&gt;;
       es = pVT-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;newIterator&lt;/SPAN&gt;(pIter);
       &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(es == Acad::eOk)
       {
           &lt;SPAN class="hljs-keyword"&gt;for&lt;/SPAN&gt; (;!pIter-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;done&lt;/SPAN&gt;();pIter-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;step&lt;/SPAN&gt;())
           {
               AcDbViewportTableRecord *pVTR = &lt;SPAN class="hljs-literal"&gt;NULL&lt;/SPAN&gt;;
               es = pIter-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;getRecord&lt;/SPAN&gt;(pVTR, AcDb::kForRead);
               &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(es == Acad::eOk)
               {
                   AcGePoint2d ll = pVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;lowerLeftCorner&lt;/SPAN&gt;();
                   AcGePoint2d ur = pVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;upperRightCorner&lt;/SPAN&gt;();

                   &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(ll.&lt;SPAN class="hljs-built_in"&gt;isEqualTo&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;AcGePoint2d&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;)))
                   {&lt;SPAN class="hljs-comment"&gt;// Left modelspace viewport&lt;/SPAN&gt;
                       pLeftVTR = pVTR;
                   }
                   &lt;SPAN class="hljs-keyword"&gt;else&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(ur.&lt;SPAN class="hljs-built_in"&gt;isEqualTo&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;AcGePoint2d&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;1.0&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;1.0&lt;/SPAN&gt;)))
                   {&lt;SPAN class="hljs-comment"&gt;// Right modelspace viewport&lt;/SPAN&gt;
                       pRightVTR = pVTR;
                   }
                   &lt;SPAN class="hljs-keyword"&gt;else&lt;/SPAN&gt;
                       pVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;close&lt;/SPAN&gt;();
               }
           }

           &lt;SPAN class="hljs-comment"&gt;// If for some reason, we did not have two modelspace viewports,&lt;/SPAN&gt;
           &lt;SPAN class="hljs-comment"&gt;// lets stop here.&lt;/SPAN&gt;
           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(pLeftVTR == &lt;SPAN class="hljs-literal"&gt;NULL&lt;/SPAN&gt;)
           {
               &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(pRightVTR != &lt;SPAN class="hljs-literal"&gt;NULL&lt;/SPAN&gt;)
                   pRightVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;close&lt;/SPAN&gt;();
               &lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt;;
           }
           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(pRightVTR == &lt;SPAN class="hljs-literal"&gt;NULL&lt;/SPAN&gt;)
           {
               &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(pLeftVTR != &lt;SPAN class="hljs-literal"&gt;NULL&lt;/SPAN&gt;)
                   pLeftVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;close&lt;/SPAN&gt;();
               &lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt;;
           }

           &lt;SPAN class="hljs-comment"&gt;// Ensure that the two viewports are split vertically in half.&lt;/SPAN&gt;
           &lt;SPAN class="hljs-comment"&gt;// If not, the view parameters when applied from one to another&lt;/SPAN&gt;
           &lt;SPAN class="hljs-comment"&gt;// may not apply directly using this code.&lt;/SPAN&gt;
           &lt;SPAN class="hljs-comment"&gt;// If the viewports were resized manually, set them right.&lt;/SPAN&gt;
           AcGePoint2d ll1 = pLeftVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;lowerLeftCorner&lt;/SPAN&gt;();
           AcGePoint2d ur1 = pLeftVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;upperRightCorner&lt;/SPAN&gt;();

           AcGePoint2d ll2 = pRightVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;lowerLeftCorner&lt;/SPAN&gt;();
           AcGePoint2d ur2 = pRightVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;upperRightCorner&lt;/SPAN&gt;();

           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(ll1.&lt;SPAN class="hljs-built_in"&gt;isEqualTo&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;AcGePoint2d&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;0.0&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;0.0&lt;/SPAN&gt;)) == &lt;SPAN class="hljs-literal"&gt;false&lt;/SPAN&gt;)
           {
               &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(! pLeftVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;isWriteEnabled&lt;/SPAN&gt;())
                   pLeftVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;upgradeOpen&lt;/SPAN&gt;();

               pLeftVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;setLowerLeftCorner&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;AcGePoint2d&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;0.0&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;0.0&lt;/SPAN&gt;));
           }

           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(ur1.&lt;SPAN class="hljs-built_in"&gt;isEqualTo&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;AcGePoint2d&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;0.5&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;1.0&lt;/SPAN&gt;)) == &lt;SPAN class="hljs-literal"&gt;false&lt;/SPAN&gt;)
           {
               &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(! pLeftVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;isWriteEnabled&lt;/SPAN&gt;())
                   pLeftVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;upgradeOpen&lt;/SPAN&gt;();

               pLeftVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;setUpperRightCorner&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;AcGePoint2d&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;0.5&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;1.0&lt;/SPAN&gt;));
           }

           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(ll2.&lt;SPAN class="hljs-built_in"&gt;isEqualTo&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;AcGePoint2d&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;0.5&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;0.0&lt;/SPAN&gt;)) == &lt;SPAN class="hljs-literal"&gt;false&lt;/SPAN&gt;)
           {
               &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(! pRightVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;isWriteEnabled&lt;/SPAN&gt;())
                   pRightVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;upgradeOpen&lt;/SPAN&gt;();

               pRightVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;setLowerLeftCorner&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;AcGePoint2d&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;0.5&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;0.0&lt;/SPAN&gt;));
           }

           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(ur2.&lt;SPAN class="hljs-built_in"&gt;isEqualTo&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;AcGePoint2d&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;1.0&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;1.0&lt;/SPAN&gt;)) == &lt;SPAN class="hljs-literal"&gt;false&lt;/SPAN&gt;)
           {
               &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(! pRightVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;isWriteEnabled&lt;/SPAN&gt;())
                   pRightVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;upgradeOpen&lt;/SPAN&gt;();

               pRightVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;setUpperRightCorner&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;AcGePoint2d&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;1.0&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;1.0&lt;/SPAN&gt;));
           }

           &lt;SPAN class="hljs-comment"&gt;// Get the active model space viewport&lt;/SPAN&gt;
           &lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;struct&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;resbuf&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;res&lt;/SPAN&gt;;&lt;/SPAN&gt;
           &lt;SPAN class="hljs-built_in"&gt;acedGetVar&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;L"CVPORT"&lt;/SPAN&gt;, &amp;amp;res);
           &lt;SPAN class="hljs-keyword"&gt;short&lt;/SPAN&gt; vpnumber = res.resval.rint;

           &lt;SPAN class="hljs-comment"&gt;// Identify the model space viewports  from/to which settings will be copied&lt;/SPAN&gt;
           &lt;SPAN class="hljs-comment"&gt;// The active modelspace viewport is the viewport from which settings will be copied&lt;/SPAN&gt;
           AcDbViewportTableRecord *pFromVTR = &lt;SPAN class="hljs-literal"&gt;NULL&lt;/SPAN&gt;;
           AcDbViewportTableRecord *pToVTR = &lt;SPAN class="hljs-literal"&gt;NULL&lt;/SPAN&gt;;

           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(pLeftVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;number&lt;/SPAN&gt;() == vpnumber)
           {
               pFromVTR = pLeftVTR;
               pToVTR = pRightVTR;
           }
           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(pRightVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;number&lt;/SPAN&gt;() == vpnumber)
           {
               pFromVTR = pRightVTR;
               pToVTR = pLeftVTR;
           }

           &lt;SPAN class="hljs-comment"&gt;// Sorry, we did not identify the active viewport&lt;/SPAN&gt;
           &lt;SPAN class="hljs-comment"&gt;// from which settings need to be copied.&lt;/SPAN&gt;
           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(pFromVTR == &lt;SPAN class="hljs-literal"&gt;NULL&lt;/SPAN&gt; || pToVTR == &lt;SPAN class="hljs-literal"&gt;NULL&lt;/SPAN&gt;)
               &lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt;;

           &lt;SPAN class="hljs-comment"&gt;// Copy the VTR settings from one modelspace viewport to another&lt;/SPAN&gt;
           &lt;SPAN class="hljs-comment"&gt;// only if they are different. We will use a tolerance to ensure&lt;/SPAN&gt;
           &lt;SPAN class="hljs-comment"&gt;// very small differences do not get us in a soup. I meant loop :)&lt;/SPAN&gt;

           AcGeTol newTol;
           newTol.&lt;SPAN class="hljs-built_in"&gt;setEqualPoint&lt;/SPAN&gt; (&lt;SPAN class="hljs-number"&gt;0.00001&lt;/SPAN&gt;);
           newTol.&lt;SPAN class="hljs-built_in"&gt;setEqualVector&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;0.00001&lt;/SPAN&gt;);

           &lt;SPAN class="hljs-comment"&gt;// ViewDirection&lt;/SPAN&gt;
           AcGeVector3d fromViewDir = pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;viewDirection&lt;/SPAN&gt;();
           AcGeVector3d toViewDir = pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;viewDirection&lt;/SPAN&gt;();
           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;viewDirection&lt;/SPAN&gt;().&lt;SPAN class="hljs-built_in"&gt;isEqualTo&lt;/SPAN&gt;(pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;viewDirection&lt;/SPAN&gt;(), newTol) == &lt;SPAN class="hljs-literal"&gt;false&lt;/SPAN&gt;)
           {
               &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(! pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;isWriteEnabled&lt;/SPAN&gt;())
                   pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;upgradeOpen&lt;/SPAN&gt;();

               pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;setViewDirection&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;viewDirection&lt;/SPAN&gt;());
               updateNeeded = Adesk::kTrue;
           }

           &lt;SPAN class="hljs-comment"&gt;// ViewTwist&lt;/SPAN&gt;
           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;abs&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;viewTwist&lt;/SPAN&gt;() - pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;viewTwist&lt;/SPAN&gt;()) &amp;gt; &lt;SPAN class="hljs-number"&gt;0.01&lt;/SPAN&gt;)
           {
               &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(! pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;isWriteEnabled&lt;/SPAN&gt;())
                   pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;upgradeOpen&lt;/SPAN&gt;();

               pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;setViewTwist&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;viewTwist&lt;/SPAN&gt;());
               updateNeeded = Adesk::kTrue;
           }

           &lt;SPAN class="hljs-comment"&gt;// Target&lt;/SPAN&gt;
           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;target&lt;/SPAN&gt;().&lt;SPAN class="hljs-built_in"&gt;isEqualTo&lt;/SPAN&gt;(pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;target&lt;/SPAN&gt;(), newTol) == &lt;SPAN class="hljs-literal"&gt;false&lt;/SPAN&gt;)
           {
               &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(! pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;isWriteEnabled&lt;/SPAN&gt;())
                   pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;upgradeOpen&lt;/SPAN&gt;();

               pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;setTarget&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;target&lt;/SPAN&gt;());
               updateNeeded = Adesk::kTrue;
           }

           &lt;SPAN class="hljs-comment"&gt;// BackClipEnabled&lt;/SPAN&gt;
           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;backClipEnabled&lt;/SPAN&gt;() != pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;backClipEnabled&lt;/SPAN&gt;())
           {
               &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(! pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;isWriteEnabled&lt;/SPAN&gt;())
                   pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;upgradeOpen&lt;/SPAN&gt;();
               pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;setBackClipEnabled&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;backClipEnabled&lt;/SPAN&gt;());
               updateNeeded = Adesk::kTrue;
           }

           &lt;SPAN class="hljs-comment"&gt;// BackClipDistance&lt;/SPAN&gt;
           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;abs&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;backClipDistance&lt;/SPAN&gt;() - pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;backClipDistance&lt;/SPAN&gt;()) &amp;gt; &lt;SPAN class="hljs-number"&gt;0.01&lt;/SPAN&gt;)
           {
               &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(! pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;isWriteEnabled&lt;/SPAN&gt;())
                   pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;upgradeOpen&lt;/SPAN&gt;();

               pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;setBackClipDistance&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;backClipDistance&lt;/SPAN&gt;());
               updateNeeded = Adesk::kTrue;
           }

           &lt;SPAN class="hljs-comment"&gt;// FrontClipEnabled&lt;/SPAN&gt;
           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;frontClipEnabled&lt;/SPAN&gt;() != pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;frontClipEnabled&lt;/SPAN&gt;())
           {
               &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(! pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;isWriteEnabled&lt;/SPAN&gt;())
                   pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;upgradeOpen&lt;/SPAN&gt;();
               pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;setFrontClipEnabled&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;frontClipEnabled&lt;/SPAN&gt;());
               updateNeeded = Adesk::kTrue;
           }

           &lt;SPAN class="hljs-comment"&gt;// FrontClipDistance&lt;/SPAN&gt;
           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;abs&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;frontClipDistance&lt;/SPAN&gt;() - pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;frontClipDistance&lt;/SPAN&gt;()) &amp;gt; &lt;SPAN class="hljs-number"&gt;0.01&lt;/SPAN&gt;)
           {
               &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(! pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;isWriteEnabled&lt;/SPAN&gt;())
                   pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;upgradeOpen&lt;/SPAN&gt;();

               pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;setFrontClipDistance&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;frontClipDistance&lt;/SPAN&gt;());
               updateNeeded = Adesk::kTrue;
           }

           &lt;SPAN class="hljs-comment"&gt;// Elevation&lt;/SPAN&gt;
           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;abs&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;elevation&lt;/SPAN&gt;() - pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;elevation&lt;/SPAN&gt;()) &amp;gt; &lt;SPAN class="hljs-number"&gt;0.01&lt;/SPAN&gt;)
           {
               &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(! pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;isWriteEnabled&lt;/SPAN&gt;())
                   pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;upgradeOpen&lt;/SPAN&gt;();

               pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;setElevation&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;elevation&lt;/SPAN&gt;());
               updateNeeded = Adesk::kTrue;
           }

           &lt;SPAN class="hljs-comment"&gt;// centerPoint&lt;/SPAN&gt;
           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;centerPoint&lt;/SPAN&gt;().&lt;SPAN class="hljs-built_in"&gt;isEqualTo&lt;/SPAN&gt;(pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;centerPoint&lt;/SPAN&gt;(), newTol) == &lt;SPAN class="hljs-literal"&gt;false&lt;/SPAN&gt;)
           {
               &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(! pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;isWriteEnabled&lt;/SPAN&gt;())
                   pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;upgradeOpen&lt;/SPAN&gt;();

               pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;setCenterPoint&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;centerPoint&lt;/SPAN&gt;());
               updateNeeded = Adesk::kTrue;
           }

           &lt;SPAN class="hljs-comment"&gt;// Height&lt;/SPAN&gt;
           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;abs&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;height&lt;/SPAN&gt;() - pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;height&lt;/SPAN&gt;()) &amp;gt; &lt;SPAN class="hljs-number"&gt;0.01&lt;/SPAN&gt;)
           {
               &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(! pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;isWriteEnabled&lt;/SPAN&gt;())
                   pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;upgradeOpen&lt;/SPAN&gt;();

               pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;setHeight&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;height&lt;/SPAN&gt;());
               updateNeeded = Adesk::kTrue;
           }

           &lt;SPAN class="hljs-comment"&gt;// Width&lt;/SPAN&gt;
           &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;abs&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;width&lt;/SPAN&gt;() - pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;width&lt;/SPAN&gt;()) &amp;gt; &lt;SPAN class="hljs-number"&gt;0.01&lt;/SPAN&gt;)
           {
               &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(! pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;isWriteEnabled&lt;/SPAN&gt;())
                   pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;upgradeOpen&lt;/SPAN&gt;();

               pToVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;setWidth&lt;/SPAN&gt;(pFromVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;width&lt;/SPAN&gt;());
               updateNeeded = Adesk::kTrue;
           }

           &lt;SPAN class="hljs-comment"&gt;// Done with the VTR&lt;/SPAN&gt;
           pLeftVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;close&lt;/SPAN&gt;();
           pRightVTR-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;close&lt;/SPAN&gt;();

           &lt;SPAN class="hljs-keyword"&gt;delete&lt;/SPAN&gt; pIter;
       }
       es = pVT-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;close&lt;/SPAN&gt;();

       es = acDocManager-&amp;gt;&lt;SPAN class="hljs-built_in"&gt;unlockDocument&lt;/SPAN&gt;(pDoc);

       &lt;SPAN class="hljs-comment"&gt;// Update the Vports if we did change any of the VTR parameters&lt;/SPAN&gt;
       &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt;(updateNeeded)
       {
           &lt;SPAN class="hljs-built_in"&gt;acedVportTableRecords2Vports&lt;/SPAN&gt;();
       }
   }
};

&lt;SPAN class="hljs-comment"&gt;//-----------------------------------------------------------------------------&lt;/SPAN&gt;
&lt;SPAN class="hljs-built_in"&gt;IMPLEMENT_ARX_ENTRYPOINT&lt;/SPAN&gt;(CMyTest1App)

&lt;SPAN class="hljs-built_in"&gt;ACED_ARXCOMMAND_ENTRY_AUTO&lt;/SPAN&gt;(CMyTest1App, AdskMyTest, SyncVTR, SyncVTR, ACRX_CMD_MODAL, &lt;SPAN class="hljs-literal"&gt;NULL&lt;/SPAN&gt;)&lt;/PRE&gt;</description>
      <pubDate>Sun, 02 May 2021 16:21:43 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/objectarx-forum/how-to-sync-viewports-from-model-space-in-autocad-2020/m-p/10285301#M3395</guid>
      <dc:creator>BriamR</dc:creator>
      <dc:date>2021-05-02T16:21:43Z</dc:date>
    </item>
  </channel>
</rss>

