/*==========================================*\
FUNCTION: UserZoomAtSelPoint
PURPOSE: Zooms window in by factor of 2 at selected point on a solid
model.
\*===========================================*/
ProError UserZoomAtSelPoint()
{
ProError status;
ProSelection *p_sel;
int n_sel;
ProAsmcomppath comp_path;
ProPoint3d p3d;
ProMatrix matrix, zoom_matrix;
ProPoint3d t_point;
ProFileName msgfile;
ProModelitem item;
ProMdl top_model;
ProPoint3d scrpnt;
int i, j, k;
int window;
double scale;
/*-------------------------------------*\
The Pro/ENGINEER "virtual window". Used to calculate the amount
of pan needed to center the zoomed window on the chosen point.
\*--------------------------------------*/
double window_outline [2][3] = {{0.0, 0.0, 0.0}, {1000.0, 843.75, 0.0}};
ProStringToWstring (msgfile, "HelpMessage.txt");
/*----------------------------------------*\
Prompt the user to select the center of the zoom
\*------------------------------------------*/
ProMessageDisplay (msgfile, "USER Select a location on a solid model for zoom ");
status = ProSelect ("prt_or_asm", 1, NULL, NULL, NULL, NULL, &p_sel, &n_sel);
if (status != PRO_TK_NO_ERROR)
return (status);
/*-------------------------------------------*\
Get the selected point
\*-------------------------------------------*/
ProSelectionPoint3dGet (p_sel[0], p3d);
/*-------------------------------------------*\
Get the assembly component path for the selected component
\*-------------------------------------------*/
status = ProSelectionAsmcomppathGet (p_sel[0], &comp_path);
if (status == PRO_TK_NO_ERROR && comp_path.owner != NULL)
{
top_model = comp_path.owner;
/*--------------------------------------------*\
Get the coordinate transformation matrix for the component to
the assembly
\*-----------------------------------------------*/
ProAsmcomppathTrfGet (&comp_path, PRO_B_TRUE, matrix);
/*---------------------------------------------*\
Transform the selected point into the coordinate system of the
top level assembly
\*-------------------------------------------------*/
status = ProPntTrfEval(p3d, matrix, t_point);
}
else
{
/*---------------------------------------------------*\
If the selection is the top level component prepare the needed
parameters for zooming
\*--------------------------------------------------*/
ProSelectionModelitemGet (p_sel[0], &item);
top_model = item.owner;
memcpy (t_point, p3d, sizeof (ProPoint3d));
}
/*------------------------------------------------*\
Get the view transformation matrix (from the current window)
\*-------------------------------------------------*/
ProViewMatrixGet (top_model, NULL, matrix);
/*---------------------------------------------------*\
Transform the solid model point to screen coordinates
\*-------------------------------------*/
ProPntTrfEval (t_point, matrix, scrpnt);
/*---------------------------------------------------*\
Get the window pan-zoom transformation matrix
\*-----------------------------------------------*/
ProWindowCurrentMatrixGet (matrix);
/*-----------------------------------------------*\
Zoom in on the created point
\*-------------------------------------------------*/
for (j=0; j<4; j++)
{
for (k=0; k<4; k++)
zoom_matrix [j][k] = 0.0;
}
/*----------------------------------------------*\
Double the existing window scale
\*------------------------------------------------*/
scale = 2.0 * matrix [0][0];
for (j=0; j<3; j++)
{
zoom_matrix [j][j] = scale;
zoom_matrix [3][j] =
(window_outline [1][j] - window_outline [0][j])/2.0 -
scrpnt[j]*scale;
}
zoom_matrix [3][3] = 1.0;
ProMdlWindowGet (top_model, &window);
status = ProWindowPanZoomMatrixSet (window, zoom_matrix);
/*-----------------------------------------------*\
Repaint the window
\*-------------------------------------------------*/
ProWindowRepaint (window);
//加亮此元件
ProSelectionHighlight(p_sel[0],PRO_COLOR_SELECTED);
return (status);
}
转载于:https://www.cnblogs.com/samyangvs05/archive/2010/04/19/1715718.html