/*
Copyright (c) 2024 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved.
*/
/*--------------------------------------------------------------------*\
Pro/TOOLKIT includes
\*--------------------------------------------------------------------*/
#include "ProToolkit.h"
#include "ProWindows.h"
#include "ProMdl.h"
#include "ProModelitem.h"
#include "ProDisplist.h"
#include "ProMenu.h"
#include "ProMessage.h"
#include "ProColor.h"
#include "ProUtil.h"
#include "ProArray.h"
#include "ProCurve.h"
/*--------------------------------------------------------------------*\
Pro/DEVELOP includes
\*--------------------------------------------------------------------*/
/*--------------------------------------------------------------------*\
C System includes
\*--------------------------------------------------------------------*/
/*--------------------------------------------------------------------*\
Application includes
\*--------------------------------------------------------------------*/
#include "TestError.h"
#include "UtilString.h"
#include "UtilMatrix.h"
#include "UtilMath.h"
#include "UtilMessage.h"
#include "UtilMenu.h"
#include "TestGraphics.h"
#include <ProTKRunTime.h>
/*--------------------------------------------------------------------*\
Macros
\*--------------------------------------------------------------------*/
#define GRAPHICS_COLOR 0 /* The color of the graphics */
#define TEXT_COLOR 1 /* The color of the text */
/*--------------------------------------------------------------------*\
Data types
\*--------------------------------------------------------------------*/
/*--------------------------------------------------------------------*\
Application global/external data
\*--------------------------------------------------------------------*/
/*---------------------------------------------------------------------*\
Functions declaration
\*---------------------------------------------------------------------*/
int ProTestEntityDrawMenu( void*, int );
int ProTestColorSet( void*, int );
int ProTestAssignColor( ProColor*, ProColortype );
int ProTestColormap( void*, int );
int ProTestGraphicsFreehandDraw( void* p_dummy, int int_dummy );
int ProTestRay (void*, int);
int ProTestCurveColor(void*, int);
int ProTestCurveLinestyle(void*, int);
/*===========================================================================*\
Function : user_entity_menu
Purpose : To set up the entity menu
\*===========================================================================*/
/*---------------------------------------------------------------------*\
Function: ProTestGraphics()
Purpose: Top-level function. Create and run TkGraph menu to test
ProGraphics functions.
Returns: 0 - success; -1 - error. Now ignored.
\*---------------------------------------------------------------------*/
int ProTestGraphics( void* p_dummy, int int_dummy )
{
ProError status;
int menu_id; /* The identifier of the created menu */
int action;
/*-----------------------------*\
Create new menu TkGraphics
\*-----------------------------*/
/* Load base menu from file */
status = ProMenuFileRegister( (char*)"TkGraphics", (char*)"tkgraph.mnu", &menu_id );
TEST_CALL_REPORT( "ProMenuFileRegister()", "ProTestGraphics()",
status, status != PRO_TK_NO_ERROR );
/* Define menu buttons */
status = ProMenubuttonActionSet((char*) "TkGraphics",(char*) "Draw",
(ProMenubuttonAction)ProTestEntityDrawMenu, NULL, 0 );
status = ProMenubuttonActionSet((char*) "TkGraphics",(char*) "Display List 2D",
(ProMenubuttonAction)ProTest2dDisplistMenu, NULL, 0 );
status = ProMenubuttonActionSet((char*) "TkGraphics",(char*) "Display List 3D",
(ProMenubuttonAction)ProTest3dDisplistMenu, NULL, 0 );
status = ProMenubuttonActionSet((char*) "TkGraphics",(char*) "Ray demo",
(ProMenubuttonAction)ProTestRay, NULL, 0 );
status = ProMenubuttonActionSet((char*) "TkGraphics",(char*) "Curve color",
(ProMenubuttonAction)ProTestCurveColor, NULL, 0 );
status = ProMenubuttonActionSet((char*) "TkGraphics",(char*) "Curve linestyle",
(ProMenubuttonAction)ProTestCurveLinestyle, NULL, 0 );
status = ProMenubuttonActionSet((char*) "TkGraphics",(char*) "Done",
(ProMenubuttonAction)ProMenuDelete, NULL, 0 );
status = ProMenubuttonActionSet((char*) "TkGraphics",(char*) "TkGraphics",
(ProMenubuttonAction)ProMenuDelete, NULL, 0 );
/*-----------------------*\
Run menu TkGraphics
\*-----------------------*/
status = ProMenuCreate( PROMENUTYPE_MAIN, (char*)"TkGraphics", &menu_id );
TEST_CALL_REPORT( "ProMenuCreate()", "ProTestGraphics()",
status, status != PRO_TK_NO_ERROR );
if( status == PRO_TK_NO_ERROR )
{
status = ProMenuProcess((char*) "TkGraphics", &action );
TEST_CALL_REPORT((char*) "ProMenuProcess()", "ProTestGraphics()",
status, status != PRO_TK_NO_ERROR );
}
return 0;
}
/*===========================================================================*\
Function : ProTestGrMenuDelete
Purpose : Deletes menus
\*===========================================================================*/
int ProTestGrMenuDelete (void *data, int dummy)
{
ProMenuDelete();
ProMenuDelete();
return (0);
}
/*---------------------------------------------------------------------*\
Function: ProTestEntityDrawMenu()
Purpose: On-button function. Set up the entity draw menu.
Returns: 0 - success; Now ignored.
\*---------------------------------------------------------------------*/
int ProTestEntityDrawMenu( void* p_dummy, int int_dummy )
{
ProError status;
int menu_id; /* The identifier of the created menu */
int action;
static ProColor old_color, drawing_color;
static ProColor old_text_color;
ProDrawMode old_mode;
int dummy;
static char *cmpnd_menu[] = {"Gr Draw","Gr Set",""};
int ProTestGraphicsMultiPolylinesDraw( void* p_dummy, int int_dummy );
/* Set the graphics mode to complement */
status = ProGraphicsModeSet( PRO_DRAW_SET_MODE, &old_mode );
TEST_CALL_REPORT( "ProGraphicsModeSet()", "ProTestEntityDrawMenu()",
status,
(status!=PRO_TK_NO_ERROR) && (status!=PRO_TK_NO_CHANGE) );
/* Set the color PRO_COLOR_DRAWING */
drawing_color.method = PRO_COLOR_METHOD_TYPE;
drawing_color.value.type = PRO_COLOR_DRAWING;
status = ProGraphicsColorModify( &drawing_color, &old_color );
TEST_CALL_REPORT( "ProGraphicsColorModify()", "ProTestEntityDrawMenu()",
status,
(status!=PRO_TK_NO_ERROR) && (status!=PRO_TK_NO_CHANGE) );
status = ProTextColorModify( &drawing_color, &old_text_color );
TEST_CALL_REPORT( "ProTextColorModify()", "ProTestEntityDrawMenu()",
status,
(status!=PRO_TK_NO_ERROR) && (status!=PRO_TK_NO_CHANGE) );
/*-----------------------------*\
Create new menu Gr Draw
\*-----------------------------*/
/* Load menu from file */
status = ProMenuFileRegister((char*) "Gr Draw",(char*) "tkgrdraw.mnu", &menu_id );
TEST_CALL_REPORT( "ProMenuFileRegister()", "ProTestEntityDrawMenu()",
status, status != PRO_TK_NO_ERROR );
/* Define menu buttons */
ProMenubuttonActionSet((char*) "Gr Draw",(char*) "Arc",
(ProMenubuttonAction)ProTestGraphicsArcDraw, NULL, 0 );
ProMenubuttonActionSet((char*) "Gr Draw",(char*) "Text",
(ProMenubuttonAction)ProTestGraphicsTextDisplay, NULL, 0 );
ProMenubuttonActionSet((char*) "Gr Draw",(char*) "Circle",
(ProMenubuttonAction)ProTestGraphicsCircleDraw, NULL, 0 );
ProMenubuttonActionSet((char*) "Gr Draw",(char*) "Line",
(ProMenubuttonAction)ProTestGraphicsLineDraw, NULL, 0 );
ProMenubuttonActionSet((char*) "Gr Draw",(char*) "PolyLine",
(ProMenubuttonAction)ProTestGraphicsPolylineDraw, NULL, 0 );
ProMenubuttonActionSet((char*) "Gr Draw",(char*) "MultiPolyLine",
(ProMenubuttonAction)ProTestGraphicsMultiPolylinesDraw, NULL, 0 );
ProMenubuttonActionSet((char*) "Gr Draw",(char*) "Box",
(ProMenubuttonAction)ProTestGraphicsPolygonDraw, NULL, 0 );
ProMenubuttonActionSet((char*) "Gr Draw",(char*) "Freehand",
(ProMenubuttonAction)ProTestGraphicsFreehandDraw, NULL, 0 );
ProMenubuttonActionSet((char*) "Gr Draw",(char*) "Gr Draw",
(ProMenubuttonAction)ProMenuHold, NULL, 0 );
status = ProMenuFileRegister((char*) "Gr Set",(char*) "tkgrset.mnu", &menu_id );
TEST_CALL_REPORT( "ProMenuFileRegister()", "ProTestEntityDrawMenu()",
status, status != PRO_TK_NO_ERROR );
ProMenubuttonActionSet((char*) "Gr Set",(char*) "Set Text",
(ProMenubuttonAction)ProTestText, NULL, 0 );
ProMenubuttonActionSet((char*) "Gr Set",(char*) "Set Line",
(ProMenubuttonAction)ProTestLineSetMenu, NULL, 0 );
ProMenubuttonActionSet((char*) "Gr Set",(char*) "Color Map",
(ProMenubuttonAction)ProTestColormap, NULL, 0 );
ProMenubuttonActionSet((char*) "Gr Set",(char*) "Color",
(ProMenubuttonAction)ProTestColorSet, NULL, GRAPHICS_COLOR );
ProMenubuttonActionSet((char*) "Gr Set",(char*) "Text Color",
(ProMenubuttonAction)ProTestColorSet, NULL, TEXT_COLOR );
ProMenubuttonActionSet((char*) "Gr Set",(char*) "Done",
(ProMenubuttonAction)ProTestGrMenuDelete, NULL, 0 );
ProMenubuttonActionSet((char*) "Gr Set",(char*) "Gr Set",
(ProMenubuttonAction)ProMenuHold, NULL, 0 );
/*----------------------*\
Run menu Gr Draw
\*----------------------*/
status = ProCompoundmenuCreate(cmpnd_menu, &menu_id);
TEST_CALL_REPORT("ProCompoundmenuCreate()",
"ProTestEntityDrawMenu()",
status , status != PRO_TK_NO_ERROR);
if( status == PRO_TK_NO_ERROR )
{
status = ProMenuProcess((char*) "Gr Draw", &action );
TEST_CALL_REPORT((char*) "ProMenuProcess()", "ProTestEntityDrawMenu()",
status, status != PRO_TK_NO_ERROR );
}
/* Restore old colors */
status = ProGraphicsColorModify( &old_color, NULL );
TEST_CALL_REPORT( "ProGraphicsColorModify()", "ProTestEntityDrawMenu()",
status,
(status!=PRO_TK_NO_ERROR) && (status!=PRO_TK_NO_CHANGE) );
status = ProTextColorModify( &old_text_color, NULL );
TEST_CALL_REPORT( "ProTextColorModify()", "ProTestEntityDrawMenu()",
status,
(status!=PRO_TK_NO_ERROR) && (status!=PRO_TK_NO_CHANGE) );
status = ProGraphicsModeSet( old_mode, (ProDrawMode *)&dummy );
TEST_CALL_REPORT( "ProGraphicsModeSet()", "ProTestEntityDrawMenu()",
status,
(status!=PRO_TK_NO_ERROR) && (status!=PRO_TK_NO_CHANGE) );
return PRO_TK_NO_ERROR;
}
/*===========================================================================*\
Function : user_entity_color
Purpose : To set up the color menu
\*===========================================================================*/
/*---------------------------------------------------------------------*\
Function: ProTestColorSet()
Purpose: On-button function. Run menu to select color, then set
selected color as current.
Returns: PRO_TK_NO_ERROR - success; Otherwise - error.
Now ignored.
\*---------------------------------------------------------------------*/
int ProTestColorSet(
void* p_dummy,
int type ) /* (In) TEXT_COLOR or GRAPHICS_COLOR */
{
ProError status;
int menu_id; /* The identifier of the created menu */
int action;
ProColor new_color ;
ProColor old_color;
/*-----------------------------*\
Create new menu Color
\*-----------------------------*/
/* Load base menu from file */
status = ProMenuFileRegister((char*) "Color",(char*) "tkgrcolor.mnu", &menu_id );
TEST_CALL_REPORT( "ProMenuFileRegister()", "ProTestColorSet()",
status, status != PRO_TK_NO_ERROR );
new_color.method = PRO_COLOR_METHOD_TYPE;
new_color.value.type = PRO_COLOR_DRAWING;
/* Define menu buttons */
ProMenubuttonActionSet((char*) "Color",(char*) "Letter",
(ProMenubuttonAction)ProTestAssignColor,
&new_color, PRO_COLOR_LETTER );
ProMenubuttonActionSet((char*) "Color",(char*) "Highlight",
(ProMenubuttonAction)ProTestAssignColor,
&new_color, PRO_COLOR_HIGHLITE );
ProMenubuttonActionSet((char*) "Color",(char*) "Drawing",
(ProMenubuttonAction)ProTestAssignColor,
&new_color, PRO_COLOR_DRAWING );
ProMenubuttonActionSet((char*) "Color",(char*) "Background",
(ProMenubuttonAction)ProTestAssignColor,
&new_color, PRO_COLOR_BACKGROUND );
ProMenubuttonActionSet((char*) "Color",(char*) "Half Tone",
(ProMenubuttonAction)ProTestAssignColor,
&new_color, PRO_COLOR_HALF_TONE );
ProMenubuttonActionSet((char*) "Color",(char*) "Edge Highlt",
(ProMenubuttonAction)ProTestAssignColor,
&new_color, PRO_COLOR_EDGE_HIGHLIGHT );
ProMenubuttonActionSet((char*) "Color",(char*) "Dimmed",
(ProMenubuttonAction)ProTestAssignColor,
&new_color, PRO_COLOR_DIMMED );
ProMenubuttonActionSet((char*) "Color",(char*) "Error",
(ProMenubuttonAction)ProTestAssignColor,
&new_color, PRO_COLOR_ERROR );
ProMenubuttonActionSet((char*) "Color",(char*) "Warning",
(ProMenubuttonAction)ProTestAssignColor,
&new_color, PRO_COLOR_WARNING );
ProMenubuttonActionSet((char*) "Color",(char*) "Color",
(ProMenubuttonAction)ProMenuDelete, NULL, 0 );
/*-------------------*\
Run menu Color
\*-------------------*/
status = ProMenuCreate( PROMENUTYPE_MAIN,(char*) "Color", &menu_id );
TEST_CALL_REPORT( "ProMenuCreate()", "ProTestColorSet()",
status, status != PRO_TK_NO_ERROR );
if( status == PRO_TK_NO_ERROR )
{
status = ProMenuProcess((char*) "Color", &action );
TEST_CALL_REPORT((char*) "ProMenuProcess()", "ProTestColorSet()",
status, status != PRO_TK_NO_ERROR );
}
/* Set selected color as current */
if( type == TEXT_COLOR )
{
status = ProTextColorModify( &new_color, &old_color );
TEST_CALL_REPORT( "ProTextColorModify()", "ProTestColorSet()",
status,
(status!=PRO_TK_NO_ERROR) && (status!=PRO_TK_NO_CHANGE) );
}
else
{
status = ProGraphicsColorModify( &new_color, &old_color );
TEST_CALL_REPORT( "ProGraphicsColorModify()", "ProTestColorSet()",
status,
(status!=PRO_TK_NO_ERROR) && (status!=PRO_TK_NO_CHANGE) );
}
return status;
}
/*===========================================================================*\
Function : user_assign_color
Purpose :
\*===========================================================================*/
/*---------------------------------------------------------------------*\
Function: ProTestAssignColor()
Purpose: On-button function. Run menu to select color, then set
selected color as current.
Returns: 0 - success; Now ignored.
\*---------------------------------------------------------------------*/
int ProTestAssignColor(
ProColor* p_color, /* (Out) Variable to assign color to */
ProColortype col_type) /* (In) Color to assign */
{
ProError status;
(*p_color).method = PRO_COLOR_METHOD_TYPE;
(*p_color).value.type = col_type;
status = ProMenuDelete();
TEST_CALL_REPORT( "ProMenuDelete()", "ProTestAssignColor()",
status, status!=PRO_TK_NO_ERROR );
return 0;
}
/*===========================================================================*\
Function : user__color
Purpose : ucolor.c
\*===========================================================================*/
/*---------------------------------------------------------------------*\
Function: ProTestColormap()
Purpose: On-button. Test of the color map functions
Returns: 0 - success; -1 - error. Now ignored.
\*---------------------------------------------------------------------*/
int ProTestColormap( void* p_dummy, int int_dummy )
{
ProError status;
int menu_id; /* The identifier of the created menu */
int action;
ProColortype c_type = PRO_COLOR_DRAWING;
ProColor color;
ProColormap color_map;
double range[ 2 ] = {0.0, 1.0};
char buffer[ PRO_LINE_SIZE ];
/* Load base menu from file */
status = ProMenuFileRegister((char*) "Color",(char*) "tkgrcolor.mnu", &menu_id );
TEST_CALL_REPORT( "ProMenuFileRegister()", "ProTestColormap()",
status, status != PRO_TK_NO_ERROR );
/* Define menu buttons */
ProMenubuttonActionSet((char*) "Color",(char*) "Letter",
(ProMenubuttonAction)ProTestAssignColor,
&color, PRO_COLOR_LETTER );
ProMenubuttonActionSet((char*) "Color",(char*) "Highlight",
(ProMenubuttonAction)ProTestAssignColor,
&color, PRO_COLOR_HIGHLITE );
ProMenubuttonActionSet((char*) "Color",(char*) "Drawing",
(ProMenubuttonAction)ProTestAssignColor,
&color, PRO_COLOR_DRAWING );
ProMenubuttonActionSet((char*) "Color",(char*) "Background",
(ProMenubuttonAction)ProTestAssignColor,
&color, PRO_COLOR_BACKGROUND );
ProMenubuttonActionSet((char*) "Color",(char*) "Half Tone",
(ProMenubuttonAction)ProTestAssignColor,
&color, PRO_COLOR_HALF_TONE );
ProMenubuttonActionSet((char*) "Color",(char*) "Edge Highlt",
(ProMenubuttonAction)ProTestAssignColor,
&color, PRO_COLOR_EDGE_HIGHLIGHT );
ProMenubuttonActionSet((char*) "Color",(char*) "Dimmed",
(ProMenubuttonAction)ProTestAssignColor,
&color, PRO_COLOR_DIMMED );
ProMenubuttonActionSet((char*) "Color",(char*) "Error",
(ProMenubuttonAction)ProTestAssignColor,
&color, PRO_COLOR_ERROR );
ProMenubuttonActionSet((char*) "Color",(char*) "Warning",
(ProMenubuttonAction)ProTestAssignColor,
&color, PRO_COLOR_WARNING );
ProMenubuttonActionSet((char*) "Color",(char*) "Color",
(ProMenubuttonAction)ProMenuDelete, NULL, 0 );
/*-------------------*\
Run menu Color
\*-------------------*/
status = ProMenuCreate( PROMENUTYPE_MAIN,(char*) "Color", &menu_id );
TEST_CALL_REPORT( "ProMenuCreate()", "ProTestColormap()",
status, status != PRO_TK_NO_ERROR );
if( status == PRO_TK_NO_ERROR )
{
status = ProMenuProcess((char*) "Color", &action );
TEST_CALL_REPORT((char*) "ProMenuProcess()", "ProTestColormap()",
status, status != PRO_TK_NO_ERROR );
}
/* First get the color values */
status = ProColormapGet( c_type, &color_map );
TEST_CALL_REPORT( "ProColormapGet()", "ProTestColormap()",
status, status != PRO_TK_NO_ERROR );
if( status != PRO_TK_NO_ERROR )
return -1;
ProTKSprintf( buffer, "Current color map: red %f gree %f blue %f",
color_map.red, color_map.green, color_map.blue );
ProUtilMsgPrint( "gen", "TEST %0s", buffer );
ProMessageClear();
TEST_CALL_REPORT( "ProMessageClear()", "ProTestOptionOrderedVerify()",
(ProError)0, 0 );
/* Ask the user for new values */
ProUtilMsgPrint( "gen", "TEST %0s", "Red Value: " );
if( !ProUtilDoubleGet( range, NULL, &(color_map.red) ) )
return -1;
ProUtilMsgPrint( "gen", "TEST %0s", "Green Value: " );
if( !ProUtilDoubleGet( range, NULL, &(color_map.green) ) )
return -1;
ProUtilMsgPrint( "gen", "TEST %0s", "Blue Value: " );
if( !ProUtilDoubleGet( range, NULL, &(color_map.blue) ) )
return -1;
/* Now set the color values */
status = ProColormapSet( c_type, &color_map );
TEST_CALL_REPORT( "ProColormapSet()", "ProTestColormap()",
status, status != PRO_TK_NO_ERROR );
return 0;
}
/*---------------------------------------------------------------------*\
Function: ProTestGraphicsArcDraw()
Purpose: On-button function. Test arc drawing.
Ask user to pick 3 points. Use this points to draw the arc.
Returns: 1 - success; 0 - error.
\*---------------------------------------------------------------------*/
int ProTestGraphicsArcDraw( void* p_dummy, int int_dummy )
{
ProError status;
ProMouseButton button;
ProPoint3d point1;
ProPoint3d point2;
ProPoint3d point3;
ProPoint3d center;
double radius;
/* Declare functions from UtilArcEndPoints.c */
int ProUtilArc3Points( double pnt1[3], double pnt2[3], double pnt3[3],
double* p_rad, double center[3] );
int ProUtilArcEndPoints( double, double, double, double, double, double,
double, double, double, double, double, double,
double end1[3], double end2[3] );
/*--------------------------*\
Pick 3 points by mouse
\*--------------------------*/
ProUtilMsgPrint( "gen", "TEST %0s", "Pick the first point" );
status = ProMousePickGet( PRO_LEFT_BUTTON, &button, point1 );
TEST_CALL_REPORT( "ProMousePickGet()", "ProTestGraphicsArcDraw()",
status, status != PRO_TK_NO_ERROR );
if( status != PRO_TK_NO_ERROR )
return 0;
ProUtilMsgPrint( "gen", "TEST %0s", "Pick the second point" );
status = ProMousePickGet( PRO_LEFT_BUTTON, &button, point2 );
TEST_CALL_REPORT( "ProMousePickGet()", "ProTestGraphicsArcDraw()",
status, status != PRO_TK_NO_ERROR );
if( status != PRO_TK_NO_ERROR )
return 0;
ProUtilMsgPrint( "gen", "TEST %0s", "Pick the third point" );
status = ProMousePickGet( PRO_LEFT_BUTTON, &button, point3 );
TEST_CALL_REPORT( "ProMousePickGet()", "ProTestGraphicsArcDraw()",
status, status != PRO_TK_NO_ERROR );
if( status != PRO_TK_NO_ERROR )
return 0;
/* Create an arc from 3 points */
ProUtilArc3Points( point1, point2, point3, &radius, center );
/* Arc is drawn CCW, from end1 to end2 */
ProUtilArcEndPoints( point1[0], point1[1], point1[2],
point2[0], point2[1], point2[2],
point3[0], point3[1], point3[2],
center[0], center[1], center[2],
point1, point2 );
/* Draw the arc */
status = ProGraphicsArcDraw( center, radius, point1, point2 );
TEST_CALL_REPORT( "ProGraphicsArcDraw()", "ProTestGraphicsArcDraw()",
status, status != PRO_TK_NO_ERROR );
return (status == PRO_TK_NO_ERROR) ? 1 : 0;
}
/*---------------------------------------------------------------------*\
Function: ProTestGraphicsCircleDraw()
Purpose: On-button function. Test circle drawing.
Ask user to pick 2 points. Use this points to draw
the circle.
Returns: 1 - success; 0 - error.
\*---------------------------------------------------------------------*/
int ProTestGraphicsCircleDraw( void* p_dummy, int int_dummy )
{
ProError status;
ProMouseButton button;
ProPoint3d point1;
ProPoint3d point2;
double radius;
ProMatrix view_matrix;
ProMatrix trf_matrix;
/* Obtain the view matrix */
status = ProViewMatrixGet( NULL, NULL, view_matrix );
TEST_CALL_REPORT( "ProViewMatrixGet()", "ProTestGraphicsCircleDraw()",
status, status != PRO_TK_NO_ERROR );
ProUtilMatrixInvert( view_matrix, trf_matrix );
/* Pick 2 points by mouse */
ProUtilMsgPrint( "gen", "TEST %0s", "Pick the first point" );
status = ProMousePickGet( PRO_LEFT_BUTTON, &button, point1 );
TEST_CALL_REPORT( "ProMousePickGet()", "ProTestGraphicsCircleDraw()",
status, status != PRO_TK_NO_ERROR );
if( status != PRO_TK_NO_ERROR )
return 0;
ProUtilMsgPrint( "gen", "TEST %0s", "Pick the second point" );
status = ProMousePickGet( PRO_LEFT_BUTTON, &button, point2 );
TEST_CALL_REPORT( "ProMousePickGet()", "ProTestGraphicsCircleDraw()",
status, status != PRO_TK_NO_ERROR );
if( status != PRO_TK_NO_ERROR )
return 0;
/* Transform points by matrix */
ProUtilPointTrans( trf_matrix, point1, point1 );
ProUtilPointTrans( trf_matrix, point2, point2 );
/* Calculate the radius */
radius = ProUtilPointsDist( point1, point2 );
/* Draw the circle */
ProGraphicsCircleDraw( point1, radius );
TEST_CALL_REPORT( "ProGraphicsCircleDraw()", "ProTestGraphicsCircleDraw()",
(ProError)0, 0 );
return 1;
}
/*---------------------------------------------------------------------*\
Function: ProTestGraphicsTextDisplay()
Purpose: On-button function. Test text displaying.
Ask user to pick the text location and enter the text to
display.
Returns: 1 - success; 0 - error.
\*---------------------------------------------------------------------*/
int ProTestGraphicsTextDisplay( void* p_dummy, int int_dummy )
{
ProError status;
ProMouseButton button;
ProPoint3d point1;
wchar_t w_string[ 80 ];
/* Pick the point by mouse */
ProUtilMsgPrint( "gen", "TEST %0s", "Pick the first point" );
status = ProMousePickGet( PRO_LEFT_BUTTON, &button, point1 );
TEST_CALL_REPORT( "ProMousePickGet()", "ProTestGraphicsTextDisplay()",
status, status != PRO_TK_NO_ERROR );
if( status != PRO_TK_NO_ERROR )
return 0;
/* Get a text to display */
ProUtilMsgPrint( "gen", "TEST %0s", "Enter the text: " );
status = ProMessageStringRead( 80, w_string );
TEST_CALL_REPORT( "ProMessageStringRead()", "ProTestGraphicsTextDisplay()",
status, status != PRO_TK_NO_ERROR );
if( status != PRO_TK_NO_ERROR )
return 0;
/* Display the text */
status = ProGraphicsTextDisplay( point1, w_string );
TEST_CALL_REPORT( "ProGraphicsTextDisplay()",
"ProTestGraphicsTextDisplay()",
status, status != PRO_TK_NO_ERROR );
return 1;
}
/*---------------------------------------------------------------------*\
Function: ProTestGraphicsLineDraw()
Purpose: On-button function. Test line drawing.
Returns: 1 - success; 0 - error.
\*---------------------------------------------------------------------*/
int ProTestGraphicsLineDraw( void* p_dummy, int int_dummy )
{
ProError status;
ProMouseButton button;
ProPoint3d point1;
ProPoint3d point2;
ProMatrix view_matrix;
ProMatrix trf_matrix;
/* Obtain the view matrix */
status = ProViewMatrixGet( NULL, NULL, view_matrix );
TEST_CALL_REPORT( "ProViewMatrixGet()", "ProTestGraphicsLineDraw()",
status, status != PRO_TK_NO_ERROR );
ProUtilMatrixInvert( view_matrix, trf_matrix );
/* Pick 2 points by mouse */
ProUtilMsgPrint( "gen", "TEST %0s", "Pick the first point" );
status = ProMousePickGet( PRO_LEFT_BUTTON, &button, point1 );
TEST_CALL_REPORT( "ProMousePickGet()", "ProTestGraphicsLineDraw()",
status, status != PRO_TK_NO_ERROR );
if( status != PRO_TK_NO_ERROR )
return 0;
ProUtilMsgPrint( "gen", "TEST %0s", "Pick the second point" );
status = ProMousePickGet( PRO_LEFT_BUTTON, &button, point2 );
TEST_CALL_REPORT( "ProMousePickGet()", "ProTestGraphicsLineDraw()",
status, status != PRO_TK_NO_ERROR );
if( status != PRO_TK_NO_ERROR )
return 0;
/* Transform points by matrix */
ProUtilPointTrans( trf_matrix, point1, point1 );
ProUtilPointTrans( trf_matrix, point2, point2 );
/* Draw the line */
ProGraphicsPenPosition( point1 );
TEST_CALL_REPORT( "ProGraphicsPenPosition()", "ProTestGraphicsLineDraw()",
(ProError)0, 0 );
ProGraphicsLineDraw( point2 );
TEST_CALL_REPORT( "ProGraphicsLineDraw()", "ProTestGraphicsLineDraw()",
(ProError)0, 0 );
return 1;
}
/*---------------------------------------------------------------------*\
Function: ProTestGraphicsPolylineDraw()
Purpose: On-button function. Test polyline drawing.
Returns: 1 - success; 0 - error.
\*---------------------------------------------------------------------*/
int ProTestGraphicsPolylineDraw( void* p_dummy, int int_dummy )
{
ProError status;
ProMouseButton button;
ProPoint3d point1;
ProPoint3d* p_point_arr;
int n_points;
int i;
ProMatrix view_matrix;
ProMatrix trf_matrix;
/* Obtain the view matrix */
status = ProViewMatrixGet( NULL, NULL, view_matrix );
TEST_CALL_REPORT( "ProViewMatrixGet()", "ProTestGraphicsPolylineDraw()",
status, status != PRO_TK_NO_ERROR );
ProUtilMatrixInvert( view_matrix, trf_matrix );
/* Init the points array */
status = ProArrayAlloc( 0, sizeof(ProPoint3d), 1, (ProArray*)&p_point_arr );
TEST_CALL_REPORT( "ProArrayAlloc()", "ProTestGraphicsPolylineDraw()",
status, status != PRO_TK_NO_ERROR );
if( status != PRO_TK_NO_ERROR )
return 0;
ProUtilMsgPrint( "gen", "TEST %0s", "Pick 'n+1' points" );
for( i=0; i<200; i++ )
{
/* Pick the next point by mouse */
status = ProMousePickGet( PRO_ANY_BUTTON, &button, point1 );
TEST_CALL_REPORT( "ProMousePickGet()", "ProTestGraphicsPolylineDraw()",
status, status != PRO_TK_NO_ERROR );
if( (status != PRO_TK_NO_ERROR) || (button != PRO_LEFT_BUTTON) )
break; /* Leave the loop */
/* Transform point by matrix */
ProUtilPointTrans( trf_matrix, point1, point1 );
/* Add the point to the array */
status = ProArrayObjectAdd( (ProArray*)&p_point_arr, PRO_VALUE_UNUSED, 1, point1 );
TEST_CALL_REPORT( "ProArrayObjectAdd()",
"ProTestGraphicsPolylineDraw()",
status, status != PRO_TK_NO_ERROR );
/* Draw the small circle to mark the point */
ProGraphicsCircleDraw( point1, 0.05 );
TEST_CALL_REPORT( "ProGraphicsCircleDraw()",
"ProTestGraphicsPolylineDraw()", (ProError)0, 0 );
}
/* Get the number of points */
status = ProArraySizeGet( p_point_arr, &n_points );
TEST_CALL_REPORT( "ProArraySizeGet()", "ProTestGraphicsPolylineDraw()",
status, status != PRO_TK_NO_ERROR );
if( n_points > 1 )
{
/* Draw a series of connected line segments */
ProGraphicsPolylineDraw( p_point_arr, n_points );
TEST_CALL_REPORT( "ProGraphicsPolylineDraw()",
"ProTestGraphicsPolylineDraw()", (ProError)0, 0 );
}
/* Free the pre-allocated array */
status = ProArrayFree( (ProArray*)&p_point_arr );
TEST_CALL_REPORT( "ProArrayFree()", "ProTestGraphicsPolylineDraw()",
status, status != PRO_TK_NO_ERROR );
return 1;
}
/*---------------------------------------------------------------------*\
Function: ProTestGraphicsPolygonDraw()
Purpose: On-button function. Test the polygon drawing.
Returns: 1 - success; 0 - error.
\*---------------------------------------------------------------------*/
int ProTestGraphicsPolygonDraw( void* p_dummy, int int_dummy )
{
ProError status;
ProMouseButton button;
ProOutline outline;
ProPoint3d points[ 4 ];
ProPoint3d start_point;
ProPoint2d rect[ 5 ];
int i;
/* Select rectangle by mouse */
status = ProMousePickGet( PRO_LEFT_BUTTON, &button, start_point );
TEST_CALL_REPORT( "ProMousePickGet()", "ProTestGraphicsPolygonDraw()",
status, status != PRO_TK_NO_ERROR );
status = ProMouseBoxInput( start_point, outline );
TEST_CALL_REPORT( "ProMouseBoxInput()", "ProTestGraphicsPolygonDraw()",
status, status != PRO_TK_NO_ERROR );
/* Init rectangle vertices */
ProUtilVectorCopy( outline[0], points[0] );
ProUtilVectorCopy( outline[1], points[2] );
ProUtilVectorCopy( points[0], points[1] );
ProUtilVectorCopy( points[2], points[3] );
points[1][1] = points[2][1];
points[3][1] = points[0][1];
/* Copy the array of 3d points to the array of 2d points */
rect[4][0] = points[0][0];
rect[4][1] = points[0][1];
for( i=0; i<4; i++ )
{
rect[i][0] = points[i][0];
rect[i][1] = points[i][1];
}
/* Draw the filled polygon */
status = ProGraphicsPolygonDraw( rect, 5, PRO_COLOR_ERROR );
TEST_CALL_REPORT( "ProGraphicsPolygonDraw()",
"ProTestGraphicsPolygonDraw()",
status, status != PRO_TK_NO_ERROR );
return 1;
}
int ProTestGraphicsFreehandDraw( void* p_dummy, int int_dummy )
{
ProError status;
ProMouseButton button;
ProPoint3d point;
ProMatrix view_matrix;
ProMatrix trf_matrix;
/* Obtain the view matrix */
status = ProViewMatrixGet( NULL, NULL, view_matrix );
TEST_CALL_REPORT( "ProViewMatrixGet()", "ProTestGraphicsFreehandDraw()",
status, status != PRO_TK_NO_ERROR );
ProUtilMatrixInvert( view_matrix, trf_matrix );
ProUtilMsgPrint( "gen", "TEST %0s", "Pick the point" );
status = ProMousePickGet( PRO_LEFT_BUTTON, &button, point );
TEST_CALL_REPORT( "ProMousePickGet()", "ProTestGraphicsFreehandDraw()",
status, status != PRO_TK_NO_ERROR );
if( status != PRO_TK_NO_ERROR )
return 0;
/* Transform points by matrix */
ProUtilPointTrans( trf_matrix, point, point );
ProGraphicsPenPosition( point );
TEST_CALL_REPORT( "ProGraphicsPenPosition()", "ProTestGraphicsFreehandDraw()",
(ProError)0, 0 );
button = PRO_NO_BUTTON;
while( button != PRO_LEFT_BUTTON )
{
status = ProMouseTrack( PRO_B_FALSE, &button, point );
TEST_CALL_REPORT( "ProMouseTrack()", "ProTestGraphicsFreehandDraw()",
status, status != PRO_TK_NO_ERROR );
/* Transform points by matrix */
ProUtilPointTrans( trf_matrix, point, point );
ProGraphicsLineDraw( point );
TEST_CALL_REPORT( "ProGraphicsLineDraw()", "ProTestGraphicsFreehandDraw()",
(ProError)0, 0 );
}
return 1;
}
/*---------------------------------------------------------------------*\
Function: ProTestGraphicsMultiPolylinesDraw()
Purpose: On-button function. Test multipolylines drawing.
Returns: 1 - success; 0 - error.
\*---------------------------------------------------------------------*/
int ProTestGraphicsMultiPolylinesDraw( void* p_dummy, int int_dummy )
{
ProError status;
ProMouseButton button;
ProPoint3d point1;
ProPoint3d* p_point_arr;
int* p_span_arr;
int n_points;
ProMatrix view_matrix;
ProMatrix trf_matrix;
int done = 1;
/* Obtain the view matrix */
status = ProViewMatrixGet( NULL, NULL, view_matrix );
TEST_CALL_REPORT( "ProViewMatrixGet()",
"ProTestGraphicsMultiPolylineDraw()",
status, status != PRO_TK_NO_ERROR );
ProUtilMatrixInvert( view_matrix, trf_matrix );
/* Init the points array */
status = ProArrayAlloc( 0, sizeof(ProPoint3d), 1, (ProArray*)&p_point_arr );
TEST_CALL_REPORT( "ProArrayAlloc()", "ProTestGraphicsMultiPolylineDraw()",
status, status != PRO_TK_NO_ERROR );
if( status != PRO_TK_NO_ERROR )
return 0;
/* Init the polylines size array */
status = ProArrayAlloc( 0, sizeof(int), 1, (ProArray*)&p_span_arr );
TEST_CALL_REPORT( "ProArrayAlloc()", "ProTestGraphicsMultiPolylineDraw()",
status, status != PRO_TK_NO_ERROR );
if( status != PRO_TK_NO_ERROR )
return 0;
while( done )
{
n_points = 0;
while( done )
{
button = PRO_NO_BUTTON;
/* Pick the next point by mouse */
status = ProMousePickGet( PRO_ANY_BUTTON, &button, point1 );
TEST_CALL_REPORT( "ProMousePickGet()",
"ProTestGraphicsMultiPolylineDraw()",
status, status != PRO_TK_NO_ERROR );
if( (status != PRO_TK_NO_ERROR) || (button != PRO_LEFT_BUTTON) )
break; /* Leave the loop */
/* Transform point by matrix */
ProUtilPointTrans( trf_matrix, point1, point1 );
/* Add the point to the array */
status = ProArrayObjectAdd( (ProArray*)&p_point_arr,
PRO_VALUE_UNUSED,
1, point1 );
TEST_CALL_REPORT( "ProArrayObjectAdd()",
"ProTestGraphicsMultiPolylineDraw()",
status, status != PRO_TK_NO_ERROR );
/* Draw the small circle to mark the point */
ProGraphicsCircleDraw( point1, 0.05 );
TEST_CALL_REPORT( "ProGraphicsCircleDraw()",
"ProTestGraphicsMultiPolylineDraw()", (ProError)0, 0 );
n_points++;
}
if( status != PRO_TK_NO_ERROR )
break; /* Leave the loop */
if( n_points > 0 )
{
/* Add the point counter to the array */
status = ProArrayObjectAdd( (ProArray*)&p_span_arr,
PRO_VALUE_UNUSED, 1, &n_points );
TEST_CALL_REPORT( "ProArrayObjectAdd()",
"ProTestGraphicsMultiPolylineDraw()",
status, status != PRO_TK_NO_ERROR );
}
if( button == PRO_RIGHT_BUTTON )
break; /* Leave the loop */
}
/* Get the number of points */
status = ProArraySizeGet( p_span_arr, &n_points );
TEST_CALL_REPORT( "ProArraySizeGet()",
"ProTestGraphicsMultiPolylineDraw()",
status, status != PRO_TK_NO_ERROR );
if( n_points > 1 )
{
/* Draw a series of connected line segments */
ProGraphicsMultiPolylinesDraw( p_point_arr, p_span_arr, n_points );
TEST_CALL_REPORT( "ProGraphicsMultiPolylinesDraw()",
"ProTestGraphicsMultiPolylineDraw()", (ProError)0, 0 );
}
/* Free the pre-allocated array */
status = ProArrayFree( (ProArray*)&p_point_arr );
TEST_CALL_REPORT( "ProArrayFree()", "ProTestGraphicsMultiPolylineDraw()",
status, status != PRO_TK_NO_ERROR );
/* Free the pre-allocated array */
status = ProArrayFree( (ProArray*)&p_span_arr );
TEST_CALL_REPORT( "ProArrayFree()", "ProTestGraphicsMultiPolylineDraw()",
status, status != PRO_TK_NO_ERROR );
return 1;
}
/*============================================================================*\
Function : ProTestCurveColor
Purpose : Test ProCurveColor functions
\*============================================================================*/
int ProTestCurveColor( void* p_dummy, int int_dummy )
{
ProError status;
ProMdl owner;
ProModelitem modelitem;
ProCurve curve;
ProSelection *p_sel;
int n_sel, opt = 0;
ProColortype old_color;
static ProUtilMenuButtons color_type[] = {
{"-Color", 0, TEST_CALL_PRO_MENU_DELETE},
{"Yellow", PRO_COLOR_LETTER, 0},
{"Red",PRO_COLOR_HIGHLITE, 0},
{"White", PRO_COLOR_DRAWING, 0},
{"Background", PRO_COLOR_BACKGROUND, 0},
{"Grey", PRO_COLOR_HALF_TONE , 0},
{"Blue", PRO_COLOR_EDGE_HIGHLIGHT,0},
{"Grey", PRO_COLOR_DIMMED, 0},
{"Magenta", PRO_COLOR_ERROR , 0},
{"Cyan", PRO_COLOR_WARNING , 0},
{"Green", PRO_COLOR_SHEETMETAL, 0},
{"Brown", PRO_COLOR_CURVE, 0},
{"MAX", PRO_COLOR_MAX, 0},
{"",0,0}
};
status = ProUtilMenuIntValueSelect(color_type, &opt);
TEST_CALL_REPORT ("ProUtilMenuIntValueSelect()", "ProTestCurveColor()",
status, status!= PRO_TK_NO_ERROR);
ProUtilMsgPrint("gen", "TEST %0s", "Select curve");
status = ProSelect ((char*)"curve", 1, NULL, NULL, NULL, NULL, &p_sel,
&n_sel);
if (status != PRO_TK_NO_ERROR || n_sel != 1)
return (0);
status = ProSelectionModelitemGet (p_sel[0], &modelitem);
TEST_CALL_REPORT ("ProSelectionModelitemGet()", "ProTestCurveColor()",
status, status != PRO_TK_NO_ERROR);
status = ProModelitemMdlGet (&modelitem, &owner);
TEST_CALL_REPORT ("ProModelitemMdlGet()", "ProTestCurveColor()",
status, status != PRO_TK_NO_ERROR);
status = ProCurveInit ((ProSolid)owner, modelitem.id, &curve);
TEST_CALL_REPORT ("ProCurveInit()", "ProTestCurveColor()",
status, status != PRO_TK_NO_ERROR);
status = ProCurvePersistentColorGet (curve, &old_color);
TEST_CALL_REPORT ("ProCurvePersistentColorGet()", "ProTestCurveColor()",
status, status != PRO_TK_NO_ERROR);
if(opt == old_color)
{
ProUtilMsgPrint("gen", "TEST %0s", "This color has been already set");
return(0);
}
status = ProCurvePersistentColorSet ((ProSolid)owner, curve, (ProColortype)opt);
TEST_CALL_REPORT ("ProCurvePersistentColorSet()", "ProTestCurveColor()",
status, status != PRO_TK_NO_ERROR);
return(0);
}
/*============================================================================*\
Function : ProTestCurveLinestyle
Purpose : Test ProCurveLinestyle functions
\*============================================================================*/
int ProTestCurveLinestyle (void* p_dummy, int int_dummy )
{
ProError status;
ProMdl owner;
ProModelitem modelitem;
ProCurve curve;
ProSelection *p_sel;
ProLinestyle old_style;
int n_sel, opt = 0;
static ProUtilMenuButtons style_type[] = {
{"-LineStyle", 0, TEST_CALL_PRO_MENU_DELETE},
{"Solid", PRO_LINESTYLE_SOLID, 0},
{"Dot", PRO_LINESTYLE_DOT, 0},
{"Centerline", PRO_LINESTYLE_CENTERLINE, 0},
{"Phantom", PRO_LINESTYLE_PHANTOM, 0},
{"", 0, 0}
};
status = ProUtilMenuIntValueSelect (style_type, &opt);
TEST_CALL_REPORT ("ProUtilMenuIntValueSelect()", "ProTestCurveLinestyle()",
status, status!= PRO_TK_NO_ERROR);
ProUtilMsgPrint("gen", "TEST %0s", "Select curve");
status = ProSelect ((char*)"curve", 1, NULL, NULL, NULL, NULL, &p_sel,
&n_sel);
if (status != PRO_TK_NO_ERROR || n_sel != 1)
return (0);
status = ProSelectionModelitemGet (p_sel[0], &modelitem);
TEST_CALL_REPORT ("ProSelectionModelitemGet()", "ProTestCurveLinestyle()",
status, status != PRO_TK_NO_ERROR);
status = ProModelitemMdlGet (&modelitem, &owner);
TEST_CALL_REPORT ("ProModelitemMdlGet()", "ProTestCurveLinestyle()",
status, status != PRO_TK_NO_ERROR);
status = ProCurveInit ((ProSolid)owner, modelitem.id, &curve);
TEST_CALL_REPORT ("ProCurveInit()", "ProTestCurveLinestyle()",
status, status != PRO_TK_NO_ERROR);
status = ProCurvePersistentLinestyleGet (curve, &old_style);
TEST_CALL_REPORT ("ProCurvePersistentLinestyleGet()", "ProTestCurveLinestyle()",
status, status != PRO_TK_NO_ERROR);
if(opt == old_style)
{
ProUtilMsgPrint("gen", "TEST %0s",
"This linestyle has been already set.");
return(0);
}
status = ProCurvePersistentLinestyleSet ((ProSolid)owner, curve, (ProLinestyle)opt);
TEST_CALL_REPORT ("ProCurvePersistentLinestyleSet()", "ProTestCurveLinestyle()",
status, status != PRO_TK_NO_ERROR);
return(0);
}