Avisos
Debido a tareas programadas de mantenimiento, la Comunidad de Autodesk estará inaccesible desde las 10:00PM PDT del 16 de octubre durante aproximadamente 1 hora. Agradecemos vuestra paciencia durante este tiempo.
Comunidad
AutoCAD - Todos los productos - Español
Bienvenido/a al foro de los productos de la familia AutoCAD de Autodesk! Comparte tu conocimiento, haz preguntas y explora los temas populares de AutoCAD.
cancelar
Mostrando los resultados de 
Mostrar  solo  | Buscar en lugar de 
Quiere decir: 

Sincronización de las ventanas gráficas del espacio modelo en AutoCAD MAP3D

0 RESPUESTAS 0
Responder
Mensaje 1 de 1
BriamR
325 Vistas, 0 Respuestas

Sincronización de las ventanas gráficas del espacio modelo en AutoCAD MAP3D

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 ;
 }

 

Etiquetas (2)
0 RESPUESTAS 0

¿No encontraste lo que buscabas? Pregúntale a la comunidad o comparte tus conocimientos.

Publicar en los foros  

Autodesk Design & Make Report

New events in the Spanish Community