Comunidad
Saludos Desarrolladores, estoy tratando de encontrar la manera de hacer funcionar este código que me compartieron en el link https://adndevblog.typepad.com/autocad/2014/07/synchronizing-model-space-viewports.html el cual muestra un proyecto ejemplo pero que no logro funcione, llevo el tema en esta publicacion https://forums.autodesk.com/t5/autocad-map-3d-forum/sincronizar-desplazamiento-y-zoom-de-dos-ventana... , no se mucho sobre programacion en VS2019, me podrían indicar como hacer funcionar esta aplicación en M3D, agradezco de antemano su ayuda.
// Comando para sincronizar los parámetros de la ventana gráfica del espacio modelo
estática vacío AdskMyTestSyncVTR ()
{
// Actualiza el VTR
acedVports2VportTableRecords ();
// Actualizaremos el otro VTR solo si
// ver cambio de parámetros
Adesk :: Boolean updateNeeded = Adesk :: kFalse;
Acad :: ErrorStatus es;
AcDbDatabase * pDb
= acdbHostApplicationServices () -> workingDatabase ();
AcApDocument * pDoc = acDocManager-> documento (pDb);
si (pDoc == NULL)
volver ;
es = acDocManager-> lockDocument (pDoc);
// Este código en la actualidad solo puede tratar con 2 espacios de modelos
// las ventanas gráficas se dividen verticalmente por la mitad
if (pDb-> tilemode () == Adesk :: kFalse)
{
struct resbuf rb;
if (ads_getvar (_T ( "cvport" ), & rb)! = RTNORM)
{
acutPrintf (_T ( "\\ nError usando ads_getvar (). \\ n" ));
volver ;
}
si (rb.resval.rint == 1)
{
// Solo puede funcionar con ventanas gráficas del espacio modelo.
volver ;
}
}
AcDbViewportTable * pVT = NULL;
pDb-> getViewportTable (pVT, AcDb :: kForRead);
// Identificar las ventanas gráficas del espacio modelo izquierdo y derecho
AcDbViewportTableRecord * pLeftVTR = NULL;
AcDbViewportTableRecord * pRightVTR = NULL;
AcDbViewportTableIterator * pIter = NULL;
es = pVT-> newIterator (pIter);
si (es == Acad :: eOk)
{
para (;! pIter-> done (); pIter-> step ())
{
AcDbViewportTableRecord * pVTR = NULL;
es = pIter-> getRecord (pVTR, AcDb :: kForRead);
si (es == Acad :: eOk)
{
AcGePoint2d ll = pVTR-> lowerLeftCorner ();
AcGePoint2d ur = pVTR-> upperRightCorner ();
si (ll.isEqualTo (AcGePoint2d (0, 0)))
{ // Ventana del espacio modelo izquierdo
pLeftVTR = pVTR;
}
else if (ur.isEqualTo (AcGePoint2d (1.0, 1.0)))
{ // Ventana del espacio modelo derecho
pRightVTR = pVTR;
}
demás
pVTR-> cerrar ();
}
}
// Si por alguna razón no tuviéramos
// dos ventanas gráficas del espacio modelo, detengámonos aquí.
si (pLeftVTR == NULL)
{
si (pRightVTR! = NULL)
pRightVTR-> close ();
volver ;
}
si (pRightVTR == NULL)
{
if (pLeftVTR! = NULL)
pLeftVTR-> close ();
volver ;
}
// Asegúrate de que las dos ventanas gráficas estén divididas
// verticalmente por la mitad.
// Si no, los parámetros de la vista cuando se aplican
// de uno a otro no puede aplicarse directamente
// usando este código.
// Si las ventanas gráficas se redimensionaron manualmente,
// los arreglaremos correctamente.
AcGePoint2d ll1 = pLeftVTR-> lowerLeftCorner ();
AcGePoint2d ur1 = pLeftVTR-> upperRightCorner ();
AcGePoint2d ll2 = pRightVTR-> lowerLeftCorner ();
AcGePoint2d ur2 = pRightVTR-> upperRightCorner ();
si (ll1.isEqualTo (AcGePoint2d (0.0, 0.0)) == falso )
{
si (! pLeftVTR-> isWriteEnabled ())
pLeftVTR-> upgradeOpen ();
pLeftVTR-> setLowerLeftCorner
(AcGePoint2d (0.0, 0.0));
}
si (ur1.isEqualTo (AcGePoint2d (0.5, 1.0)) == falso )
{
si (! pLeftVTR-> isWriteEnabled ())
pLeftVTR-> upgradeOpen ();
pLeftVTR-> setUpperRightCorner
(AcGePoint2d (0,5, 1,0));
}
si (ll2.isEqualTo (AcGePoint2d (0.5, 0.0)) == falso )
{
si (! pRightVTR-> isWriteEnabled ())
pRightVTR-> upgradeOpen ();
pRightVTR-> setLowerLeftCorner
(AcGePoint2d (0.5, 0.0));
}
si (ur2.isEqualTo (AcGePoint2d (1.0, 1.0)) == falso )
{
si (! pRightVTR-> isWriteEnabled ())
pRightVTR-> upgradeOpen ();
pRightVTR-> setUpperRightCorner
(AcGePoint2d (1.0, 1.0));
}
// Obtener la ventana gráfica del espacio modelo activo
estructura resbuf res;
acedGetVar (L "CVPORT" , & res);
vpnumber corto = res.resval.rint;
// Identificar las ventanas gráficas del espacio modelo desde / hacia las que
// se copiarán las configuraciones.
// La ventana gráfica del espacio modelo activo es la ventana gráfica
// de donde se copiarán las configuraciones
AcDbViewportTableRecord * pFromVTR = NULL;
AcDbViewportTableRecord * pToVTR = NULL;
if (pLeftVTR-> number () == vpnumber)
{
pFromVTR = pLeftVTR;
pToVTR = pRightVTR;
}
if (pRightVTR-> number () == vpnumber)
{
pFromVTR = pRightVTR;
pToVTR = pLeftVTR;
}
// Lo sentimos, no identificamos la ventana gráfica activa
// desde el que se deben copiar las configuraciones.
si (pFromVTR == NULL || pToVTR == NULL)
volver ;
// Copie la configuración de la videograbadora de una ventana gráfica del espacio modelo
// a otro solo si son diferentes. Usaremos
// una tolerancia para asegurar que las diferencias muy pequeñas no
// nos metemos en una sopa. Quise decir bucle 🙂
AcGeTol newTol;
newTol.setEqualPoint (0.00001);
newTol.setEqualVector (0.00001);
// ViewDirection
AcGeVector3d fromViewDir = pFromVTR-> viewDirection ();
AcGeVector3d toViewDir = pToVTR-> viewDirection ();
if (pFromVTR-> viewDirection (). isEqualTo (
pToVTR-> viewDirection (), newTol) == falso )
{
si (! pToVTR-> isWriteEnabled ())
pToVTR-> upgradeOpen ();
pToVTR-> setViewDirection (
pFromVTR-> viewDirection ());
updateNeeded = Adesk :: kTrue;
}
// ViewTwist
si (abs (pFromVTR-> viewTwist ()
- pToVTR-> viewTwist ())> 0.01)
{
si (! pToVTR-> isWriteEnabled ())
pToVTR-> upgradeOpen ();
pToVTR-> setViewTwist (pFromVTR-> viewTwist ());
updateNeeded = Adesk :: kTrue;
}
// Objetivo
if (pFromVTR-> target (). isEqualTo (
pToVTR-> target (), newTol) == falso )
{
si (! pToVTR-> isWriteEnabled ())
pToVTR-> upgradeOpen ();
pToVTR-> setTarget (pFromVTR-> target ());
updateNeeded = Adesk :: kTrue;
}
// BackClipEnabled
si (pFromVTR-> backClipEnabled ()
! = pToVTR-> backClipEnabled ())
{
si (! pToVTR-> isWriteEnabled ())
pToVTR-> upgradeOpen ();
pToVTR-> setBackClipEnabled (
pFromVTR-> backClipEnabled ());
updateNeeded = Adesk :: kTrue;
}
// BackClipDistance
if (abs (pFromVTR-> backClipDistance ()
- pToVTR-> backClipDistance ())> 0.01)
{
si (! pToVTR-> isWriteEnabled ())
pToVTR-> upgradeOpen ();
pToVTR-> setBackClipDistance (
pFromVTR-> backClipDistance ());
updateNeeded = Adesk :: kTrue;
}
// FrontClipEnabled
si (pFromVTR-> frontClipEnabled ()
! = pToVTR-> frontClipEnabled ())
{
si (! pToVTR-> isWriteEnabled ())
pToVTR-> upgradeOpen ();
pToVTR-> setFrontClipEnabled (
pFromVTR-> frontClipEnabled ());
updateNeeded = Adesk :: kTrue;
}
// FrontClipDistance
if (abs (pFromVTR-> frontClipDistance ()
- pToVTR-> frontClipDistance ())> 0.01)
{
si (! pToVTR-> isWriteEnabled ())
pToVTR-> upgradeOpen ();
pToVTR-> setFrontClipDistance (
pFromVTR-> frontClipDistance ());
updateNeeded = Adesk :: kTrue;
}
// Elevación
if (abs (pFromVTR-> elevación ()
- pToVTR-> elevación ())> 0.01)
{
si (! pToVTR-> isWriteEnabled ())
pToVTR-> upgradeOpen ();
pToVTR-> setElevation (pFromVTR-> elevación ());
updateNeeded = Adesk :: kTrue;
}
// punto central
if (pFromVTR-> centerPoint (). isEqualTo (
pToVTR-> centerPoint (), newTol) == falso )
{
si (! pToVTR-> isWriteEnabled ())
pToVTR-> upgradeOpen ();
pToVTR-> setCenterPoint (pFromVTR-> centerPoint ());
updateNeeded = Adesk :: kTrue;
}
// Altura
if (abs (pFromVTR-> altura () - pToVTR-> altura ())> 0.01)
{
si (! pToVTR-> isWriteEnabled ())
pToVTR-> upgradeOpen ();
pToVTR-> setHeight (pFromVTR-> height ());
updateNeeded = Adesk :: kTrue;
}
// Ancho
if (abs (pFromVTR-> ancho () - pToVTR-> ancho ())> 0.01)
{
si (! pToVTR-> isWriteEnabled ())
pToVTR-> upgradeOpen ();
pToVTR-> setWidth (pFromVTR-> width ());
updateNeeded = Adesk :: kTrue;
}
// Hecho con la videograbadora
pLeftVTR-> close ();
pRightVTR-> close ();
eliminar pIter;
}
es = pVT-> cerrar ();
es = acDocManager-> unlockDocument (pDoc);
// Actualiza los Vports si cambiamos alguno de
// los parámetros del VTR
if (updateNeeded)
{
acedVportTableRecords2Vports ();
}
}
// La notificación de Viewchanged no se recibe durante
// una panorámica o zoom con la rueda del ratón.
// Identifique a los que usan mensajes WM.
BOOL WinCallBack (MSG * pMsg)
{
if (pMsg-> mensaje == WM_VSCROLL ||
pMsg-> mensaje == WM_HSCROLL ||
pMsg-> mensaje == WM_MOUSEWHEEL ||
pMsg-> mensaje == WM_MBUTTONUP)
{
// Sincronizar las ventanas gráficas del espacio modelo
acDocManager-> sendStringToExecute (
acDocManager-> mdiActiveDocument (),
ACRX_T ( "SyncVTR" ),
falso , verdadero , falso );
}
return FALSE;
}
// Configuración de reactores y filtro de mensajes
virtual AcRx :: AppRetCode On_kInitAppMsg ( void * pkt)
{
AcRx :: AppRetCode retCode
= AcRxArxApp :: On_kInitAppMsg (paquete);
// Reactor del editor para recibir la notificación de ViewChanged
pEditorReactor = new AcMyEditorReactor ( verdadero );
// Reactor InputContext para recibir estado inactivo
// notificación de cambio
pInputContextReactor = nuevo AcMyInputContextReactor ();
// La notificación de vista modificada no se recibe durante una
// Panorámica o zoom con la rueda del ratón.
// Identifique a los que usan mensajes WM.
acedRegisterFilterWinMsg (WinCallBack);
return (código_et);
}
// Limpieza de los reactores y filtro de mensajes
virtual AcRx :: AppRetCode On_kUnloadAppMsg ( void * pkt)
{
AcRx :: AppRetCode retCode
= AcRxArxApp :: On_kUnloadAppMsg (paquete);
// limpiar
si (pEditorReactor)
{
eliminar pEditorReactor;
pEditorReactor = NULL;
}
si (pInputContextReactor)
{
eliminar pInputContextReactor;
pInputContextReactor = NULL;
}
acedRemoveFilterWinMsg (WinCallBack);
return (código_et);
}
// Se reemplazó el método beginQuiescentState para iniciar una sincronización
anular AcMyInputContextReactor :: beginQuiescentState ()
{
// Ver si la vista ha cambiado
si (_viewChanged)
{
// Sincronizar la vista una vez
_viewChanged = falso ;
// Enviar un comando para sincronizar las ventanas gráficas del espacio modelo
acDocManager-> sendStringToExecute (
acDocManager-> mdiActiveDocument (),
ACRX_T ( "SyncVTR" ),
falso , verdadero , falso );
}
}
// Método viewChanged anulado para saber si la vista cambió
anular AcMyEditorReactor :: viewChanged ()
{
// Ver notificación de cambio se recibe varias veces
// y solo queremos sincronizar los parámetros de la vista cuando
// AutoCAD alcanza un estado inactivo la próxima vez.
// Así que solo flaggin para sincronizar
// InputContextReactor :: beginQuiescentState controlador de eventos.
AcMyInputContextReactor :: _ viewChanged = true ;
}
¿No encontraste lo que buscabas? Pregúntale a la comunidad o comparte tus conocimientos.