/*
Copyright (c) 2019 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved.
*/
/*
This code creates display object on selected surface or curve.
To create display object on surface click on:
TkPart/TkAsm->DisplayObj->Surface
Select surface
To create display object on curve click on:
TkPart/TkAsm->DisplayObj->Curve
Select Curve
(it will create display object along selected curve and will streach it
normal to curve plane by the distance which will be half of curve length).
Currently display object API (from ProDispObject.h file) are supported in DLL
mode only. So this file is used to build pt_examples.dll only.
This code supports only two display objects at a time (one on surface and
one on curve).
*/
#include "ProToolkit.h"
#include "ProMdl.h"
#include "ProMenu.h"
#include "ProUtil.h"
#include "ProColor.h"
#include "ProGraphic.h"
#include "ProDispObject.h"
#include "ProArray.h"
#include "ProAsmcomp.h"
#include "ProCsys.h"
#include "ProTKRunTime.h"
#include "ProUIMessage.h"
#include "TestError.h"
#include "UtilString.h"
ProDispObject surfDisp_obj = NULL;
ProDispObject curveDisp_obj = NULL;
int *dispobj_keylist1 = NULL, *dispobj_keylist2 = NULL;
int ProDispObjectSelectEntitySet( ProLinestyle*, ProLinestyle );
// Purpose: On-button function. Defines DispObject menu buttons.
int ProTestDispObjectSetMenu( )
{
ProError status;
int menu_id;
int action;
int selectionType;
ProUIMessageButton* buttons;
ProUIMessageButton result;
/* Load base menu from file */
status = ProMenuFileRegister((char*) "DispObject",(char*) "tkdispobject.mnu", &menu_id );
TEST_CALL_REPORT( "ProMenuFileRegister()", "ProTestEntityDrawMenu()",
status, status != PRO_TK_NO_ERROR );
/* Define menu buttons */
ProMenubuttonActionSet((char*) "DispObject",(char*) "Surface",
(ProMenubuttonAction)ProDispObjectSelectEntitySet, &selectionType, PRO_SURFACE );
ProMenubuttonActionSet((char*) "DispObject",(char*) "Curve",
(ProMenubuttonAction)ProDispObjectSelectEntitySet, &selectionType, PRO_CURVE );
ProMenubuttonActionSet((char*) "DispObject",(char*)"DispObject",
(ProMenubuttonAction)ProMenuDelete, NULL, 0 );
status = ProMenuCreate( PROMENUTYPE_MAIN,(char*) "DispObject", &menu_id );
TEST_CALL_REPORT( "ProMenuCreate()", "ProTestEntityDrawMenu()",
status, status != PRO_TK_NO_ERROR );
if( status == PRO_TK_NO_ERROR )
{
status = ProMenuProcess((char*) "DispObject", &action );
TEST_CALL_REPORT( "ProMenuProcess()", "ProTestEntityDrawMenu()",
status, status != PRO_TK_NO_ERROR );
}
return 0;
}
// Creates display object on selected curve
ProError PTTestDispObjectCurve()
{
ProError status = PRO_TK_NO_ERROR;
ProMdl model = NULL;
ProMatrix transform = {{ 1.0, 0.0, 0.0, 0.0},
{ 0.0, 1.0, 0.0, 0.0},
{ 0.0, 0.0, 1.0, 0.0},
{ 0.0, 0.0, 0.0, 1.0}};
float normal[3] = { 0.0, 0.0, 1.0};
int *strip_size;
ProTriVertex **strip_arr = NULL;
ProTriVertex *strip = NULL;
ProSelection *p_sel;
int i = -1, n_sel = -1, count_pnt = -1, j, offsetVal = 1;
ProMdl owner;
ProModelitem modelitem;
ProCurve curve;
Pro3dPnt *p_points;
ProSurfaceAppearanceProps surf_appear;
ProTriVertex tempTriVertex;
float x_offset = 0.0, y_offset = 0.0, z_offset = 0.0;
double curveLen = 0.0, tolerance = 0.0;
ProMdlType topMdlType;
ProAsmcomppath pCompPath;
int *cIdTablel, feat_id = 117;
ProBoolean isCompPath = PRO_B_FALSE;
ProModelitem sAsmComp;
int disobj_winId;
ProUIMessageButton* buttons;
ProUIMessageButton result = PRO_UI_MESSAGE_NO;
if(curveDisp_obj != NULL) // If Display object exist then ask user to keep it or replace witn new one
{
ProArrayAlloc (2, sizeof (ProUIMessageButton), 1, (ProArray*)&buttons);
buttons[0] = PRO_UI_MESSAGE_YES;
buttons[1] = PRO_UI_MESSAGE_NO;
status = ProUIMessageDialogDisplay (PROUIMESSAGE_QUESTION, L"Delete existing curve display object",
L"Code creates only one curve display object at a time. Do you want to delete existing curve display object?",
buttons, buttons[1], &result);
TEST_CALL_REPORT ("ProUIMessageDialogDisplay", "PTTestDispObjectCurve()",
status, status!=PRO_TK_NO_ERROR );
status = ProArrayFree( (ProArray *)&buttons);
TEST_CALL_REPORT("ProArrayFree", "PTTestDispObjectCurve()",
status, status!=PRO_TK_NO_ERROR );
if(result == PRO_UI_MESSAGE_NO)
return (PRO_TK_NO_ERROR);
}
//Select curve to created display object
status = ProSelect ((char*)"curve", 1, NULL, NULL, NULL, NULL, &p_sel,
&n_sel);
TEST_CALL_REPORT ("ProSelect", "PTTestDispObjectCurve()",
status, status!=PRO_TK_NO_ERROR );
if(status != PRO_TK_NO_ERROR || n_sel <1)
return status;
status = ProSelectionModelitemGet (p_sel[0], &modelitem);
TEST_CALL_REPORT ("ProSelectionModelitemGet", "PTTestDispObjectCurve()",
status, status!=PRO_TK_NO_ERROR );
status = ProModelitemMdlGet (&modelitem, &owner);
TEST_CALL_REPORT ("ProModelitemMdlGet", "PTTestDispObjectCurve()",
status, status!=PRO_TK_NO_ERROR );
status = ProCurveInit ((ProSolid)owner, modelitem.id, &curve);
TEST_CALL_REPORT ("ProCurveInit", "PTTestDispObjectCurve()",
status, status!=PRO_TK_NO_ERROR );
status = ProCurveLengthEval(curve, &curveLen);
TEST_CALL_REPORT("ProCurveLengthEval", "PTTestDispObjectCurve()",
status, status!=PRO_TK_NO_ERROR );
offsetVal = curveLen/2;
// If curve length is small (less than 10), then maximum distance between
// the tessellation is reduced otherwise it will be 1.0
if (offsetVal < 5)
tolerance = offsetVal/10.0;
else
tolerance = 1.0;
status = ProCurveTessellationGet (curve, tolerance, &p_points, &count_pnt);
TEST_CALL_REPORT ("ProCurveTessellationGet", "PTTestDispObjectCurve()",
status, status!=PRO_TK_NO_ERROR );
// Memory allocation for strip arrays
status = ProArrayAlloc( 1, sizeof(ProTriVertex *), 1, (ProArray *)&strip_arr);
TEST_CALL_REPORT("ProArrayAlloc", "PTTestDispObjectCurve()",
status, status!=PRO_TK_NO_ERROR );
// Memory allocation for first strip array
status = ProArrayAlloc( 0, sizeof(ProTriVertex), 1, (ProArray *)&(strip_arr[0]));
TEST_CALL_REPORT("ProArrayAlloc", "PTTestDispObjectCurve()",
status, status!=PRO_TK_NO_ERROR );
// Memory allocation for strip size
status = ProArrayAlloc( 1, sizeof(int), 1, (ProArray *)&strip_size);
TEST_CALL_REPORT("ProArrayAlloc", "PTTestDispObjectCurve()",
status, status!=PRO_TK_NO_ERROR );
// checking for curve plane
if(count_pnt < 3)
{
if(p_points[0][2] == p_points[1][2])
z_offset = offsetVal;
else if(p_points[0][1] == p_points[1][1])
y_offset = offsetVal;
else if(p_points[0][0] == p_points[1][0])
x_offset = offsetVal;
else
z_offset = offsetVal;
}
else if(count_pnt>=3)
{
// Checking Z coord of 3 points (of 1st, middle and last point on curve)
if((p_points[0][2] == p_points[count_pnt/2][2]) && (p_points[0][2] == p_points[count_pnt-1][2]))
z_offset = offsetVal;
// Checking z coord of Y points (of 1st, middle and last point on curve)
else if((p_points[0][1] == p_points[count_pnt/2][1]) && (p_points[0][1] == p_points[count_pnt-1][1]))
y_offset = offsetVal;
// Checking X coord of 3 points (of 1st, middle and last point on curve)
else if((p_points[0][0] == p_points[count_pnt/2][0]) && (p_points[0][0] == p_points[count_pnt-1][0]))
x_offset = offsetVal;
else
z_offset = offsetVal;
}
for (i = 0; i <count_pnt; i++ )
{
tempTriVertex.pnt[0] = p_points[i][0];
tempTriVertex.pnt[1] = p_points[i][1];
tempTriVertex.pnt[2] = p_points[i][2];
tempTriVertex.norm[0] = 0.0;
tempTriVertex.norm[1] = 0.0;
tempTriVertex.norm[2] = 1.0;
// Adding curve point for dispobj
status = ProArrayObjectAdd ((ProArray*)&(strip_arr[0]), PRO_VALUE_UNUSED, 1, &tempTriVertex);
TEST_CALL_REPORT("ProArrayObjectAdd", "PTTestDispObjectCurve()",
status, status!=PRO_TK_NO_ERROR );
// Following code is taking offset curve points at offsetVal distance which is
// in normal direction to curve plane
tempTriVertex.pnt[0] = p_points[i][0] + x_offset;
tempTriVertex.pnt[1] = p_points[i][1] + y_offset;
tempTriVertex.pnt[2] = p_points[i][2] + z_offset;
// Adding offset curve point for dispobj
status = ProArrayObjectAdd ((ProArray*)&(strip_arr[0]), PRO_VALUE_UNUSED, 1, &tempTriVertex);
TEST_CALL_REPORT("ProArrayObjectAdd", "PTTestDispObjectCurve()",
status, status!=PRO_TK_NO_ERROR );
}
strip_size[0] = count_pnt*2;
status = ProMdlCurrentGet(&model);
TEST_CALL_REPORT("ProMdlCurrentGet", "PTTestDispObjectCurve()",
status, status!=PRO_TK_NO_ERROR );
disobj_winId = 0;
status = ProMdlWindowGet(model, &disobj_winId);
TEST_CALL_REPORT("ProMdlWindowGet", "PTTestDispObjectCurve()",
status, status!=PRO_TK_NO_ERROR );
if(result == PRO_UI_MESSAGE_YES) // Delete existing display object
{
status = ProDispObjectDetach( disobj_winId, dispobj_keylist1);
TEST_CALL_REPORT("ProDispObjectDetach", "PTTestDispObjectCurve()",
status, status!=PRO_TK_NO_ERROR );
status = ProDispObjectDelete( &curveDisp_obj );
TEST_CALL_REPORT("ProDispObjectDelete", "PTTestDispObjectCurve()",
status, status!=PRO_TK_NO_ERROR );
status = ProArrayFree( (ProArray *)&dispobj_keylist1);
TEST_CALL_REPORT("ProArrayFree", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
curveDisp_obj = NULL;
}
status = ProDispObjectCreate(L"test_curvedisp_obj", PRO_DISP_OBJECT_TWO_SIDED,
1, strip_size, strip_arr, &curveDisp_obj);
TEST_CALL_REPORT("ProDispObjectCreate", "PTTestDispObjectCurve()",
status, status!=PRO_TK_NO_ERROR );
// Setting appearance porperties for display object
surf_appear.ambient = 0.5;
surf_appear.shininess = 0.2;
surf_appear.highlite = 0.1;
surf_appear.color_rgb[0] = 0.0;
surf_appear.color_rgb[1] = 0.0;
surf_appear.color_rgb[2] = 1.0;
surf_appear.transparency = 0.3;
surf_appear.diffuse = 0.80;
surf_appear.highlight_color[0] = 0.10;
surf_appear.highlight_color[1] = 0.20;
surf_appear.highlight_color[2] = 0.60;
surf_appear.reflection = 0.000000;
status = ProMdlTypeGet(model, &topMdlType);
TEST_CALL_REPORT("ProMdlTypeGet", "PTTestDispObjectCurve()",
status, status!=PRO_TK_NO_ERROR );
// For top model assembly, checking for selected entities component path
if(topMdlType == PRO_MDL_ASSEMBLY)
{
status = ProSelectionAsmcomppathGet(p_sel[0], &pCompPath);
TEST_CALL_REPORT("ProSelectionAsmcomppathGet", "PTTestDispObjectCurve()",
status, status!=PRO_TK_NO_ERROR );
if (pCompPath.table_num> 0)
{
int arrayCount;
sAsmComp.type = PRO_FEATURE;
sAsmComp.id = pCompPath.comp_id_table[pCompPath.table_num-1];
sAsmComp.owner = owner;
status = ProArrayAlloc (0, sizeof (int), 1, (ProArray*)&cIdTablel);
TEST_CALL_REPORT("ProArrayAlloc", "PTTestDispObjectCurve()",
status, status!=PRO_TK_NO_ERROR );
for(arrayCount = 0; arrayCount < pCompPath.table_num; arrayCount++)
{
status = ProArrayObjectAdd ((ProArray*)&cIdTablel,
PRO_VALUE_UNUSED, 1, &pCompPath.comp_id_table[arrayCount]);
TEST_CALL_REPORT("ProArrayObjectAdd", "PTTestDispObjectCurve()",
status, status!=PRO_TK_NO_ERROR );
}
isCompPath = PRO_B_TRUE;
}
else
isCompPath = PRO_B_FALSE;
}
if(status == PRO_TK_NO_ERROR)
{
// Attach display object
status = ProDispObjectAttach((int)disobj_winId, curveDisp_obj, (isCompPath == PRO_B_TRUE?cIdTablel:NULL), feat_id, transform);
TEST_CALL_REPORT("ProDispObjectAttach", "PTTestDispObjectCurve()",
status, status!=PRO_TK_NO_ERROR );
surf_appear.color_rgb[0] = 0.0;
surf_appear.color_rgb[1] = 0.0;
surf_appear.color_rgb[2] = 1.0;
status = ProArrayAlloc( 0, sizeof(int), 1, (ProArray *)&dispobj_keylist1);
TEST_CALL_REPORT("ProArrayAlloc", "PTTestDispObjectCurve()",
status, status!=PRO_TK_NO_ERROR );
if(isCompPath == PRO_B_TRUE)
{
int arrayCount = -1, ii = -1;
status = ProArraySizeGet (cIdTablel, &arrayCount);
TEST_CALL_REPORT ("ProArraySizeGet()", "PTTestDispObjectCurve()",
status, status!=PRO_TK_NO_ERROR );
for(ii = 0; ii < arrayCount; ii++)
{
status = ProArrayObjectAdd ((ProArray*)&dispobj_keylist1,
PRO_VALUE_UNUSED, 1, &cIdTablel[ii]);
TEST_CALL_REPORT("ProArrayObjectAdd", "PTTestDispObjectCurve()",
status, status!=PRO_TK_NO_ERROR );
}
}
status = ProArrayObjectAdd ((ProArray*)&dispobj_keylist1,
PRO_VALUE_UNUSED, 1, &feat_id);
TEST_CALL_REPORT("ProArrayObjectAdd", "PTTestDispObjectCurve()",
status, status!=PRO_TK_NO_ERROR );
// Set appearance properties to display object
status = ProDispObjectSetSurfaceAppearanceProps( (int)disobj_winId, dispobj_keylist1,surf_appear);
TEST_CALL_REPORT("ProDispObjectSetSurfaceAppearanceProps", "PTTestDispObjectCurve()",
status, status!=PRO_TK_NO_ERROR );
}
/* Call repaint */
status = ProWindowRepaint( disobj_winId );
TEST_CALL_REPORT("ProWindowRepaint", "PTTestDispObjectCurve()",
status, status!=PRO_TK_NO_ERROR );
status = ProArrayFree( (ProArray *)&(strip_arr[0]));
TEST_CALL_REPORT("ProArrayFree", "PTTestDispObjectCurve()",
status, status!=PRO_TK_NO_ERROR );
status = ProArrayFree( (ProArray *)&strip_arr);
TEST_CALL_REPORT("ProArrayFree", "PTTestDispObjectCurve()",
status, status!=PRO_TK_NO_ERROR );
status = ProArrayFree( (ProArray *)&strip_size);
TEST_CALL_REPORT("ProArrayFree", "PTTestDispObjectCurve()",
status, status!=PRO_TK_NO_ERROR );
if(isCompPath == PRO_B_TRUE)
{
status = ProArrayFree( (ProArray *)&cIdTablel);
TEST_CALL_REPORT("ProArrayFree", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
}
return status;
}
// Function to create display object on selected surface
ProError PTTestDispObjectSurf()
{
ProError status = PRO_TK_NO_ERROR;
ProMdl model = NULL;
ProMatrix transform = {{ 1.0, 0.0, 0.0, 0.0},
{ 0.0, 1.0, 0.0, 0.0},
{ 0.0, 0.0, 1.0, 0.0},
{ 0.0, 0.0, 0.0, 1.0}};
float spiralSurfPtsRem, normal[3] = { 0.0, 0.0, 1.0};
int *strip_size, spiralSurfPts, reminderVal, facetCount;
ProTriVertex **strip_arr = NULL;
ProSurfaceAppearanceProps surf_appear;
ProMatrix CompMatrix;
ProSelection *p_sel;
int i = -1, n_sel = -1, j;
ProMdl owner;
ProModelitem modelitem;
ProCurve curve;
Pro3dPnt *p_points;
ProSurface pSurface;
ProTessellation surfTessellation;
Pro3dPnt* surfVertices;
ProVector* surfNormals;
ProSurfaceTessellationInput inputData;
ProTriVertex tempTriVertex;
ProTriangle* pFacets;
ProMdlType topMdlType;
ProAsmcomppath pCompPath;
int *cIdTablel;
ProBoolean isCompPath = PRO_B_FALSE;
ProModelitem sAsmComp;
ProCsys csys;
ProGeomitemdata* pCsysDataPtr;
int disobj_winId;
ProUIMessageButton* buttons2;
int feat_id = 118;
ProUIMessageButton result = PRO_UI_MESSAGE_NO;
if(surfDisp_obj != NULL) // If Display object exist then ask user to keep it or replace witn new one
{
ProArrayAlloc (2, sizeof (ProUIMessageButton), 1, (ProArray*)&buttons2);
buttons2[0] = PRO_UI_MESSAGE_YES;
buttons2[1] = PRO_UI_MESSAGE_NO;
status = ProUIMessageDialogDisplay (PROUIMESSAGE_QUESTION, L"Delete existing surface display object",
L"Code creates only one surface display object at a time. Do you want to delete existing surface display object?",
buttons2, buttons2[1], &result);
TEST_CALL_REPORT ("ProUIMessageDialogDisplay", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR);
status = ProArrayFree( (ProArray *)&buttons2);
TEST_CALL_REPORT("ProArrayFree", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
if(result == PRO_UI_MESSAGE_NO)
return (PRO_TK_NO_ERROR);
}
//Select surface to created display object
status = ProSelect ((char*)"surface", 1, NULL, NULL, NULL, NULL, &p_sel,
&n_sel);
TEST_CALL_REPORT ("ProSelect", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
if(status != PRO_TK_NO_ERROR || n_sel <1)
return status;
status = ProSelectionModelitemGet (p_sel[0], &modelitem);
TEST_CALL_REPORT ("ProSelectionModelitemGet", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
status = ProModelitemMdlGet (&modelitem, &owner);
TEST_CALL_REPORT ("ProModelitemMdlGet", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
if(modelitem.type == PRO_SURFACE )
{
status = ProSurfaceInit((ProSolid)owner, modelitem.id, &pSurface);
TEST_CALL_REPORT ("ProSurfaceInit", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
status = ProSurfacetessellationinputAlloc (&inputData);
TEST_CALL_REPORT("ProSurfacetessellationinputAlloc", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
status = ProSurfacetessellationinputChordheightSet (inputData, PRO_SRFTESS_CHORD_HT_DEFAULT);
TEST_CALL_REPORT("ProSurfacetessellationinputChordheightSet", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
status = ProSurfacetessellationinputAnglecontrolSet (inputData, 1);
TEST_CALL_REPORT("ProSurfacetessellationinputAnglecontrolSet", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
status = ProSurfacetessellationinputStepsizeSet (inputData, 1);
TEST_CALL_REPORT("ProSurfacetessellationinputStepsizeSet", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
status = ProSurfacetessellationinputUvprojectionSet(inputData, PRO_SRFTESS_DEFAULT_PROJECTION, NULL);
TEST_CALL_REPORT("ProSurfacetessellationinputUvprojectionSet", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
// Getting surface tessellation data
status = ProSurfaceTessellationGet(pSurface, inputData, &surfTessellation);
TEST_CALL_REPORT ("ProSurfaceTessellationGet", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
status = ProTessellationVerticesGet(surfTessellation, &surfVertices);
TEST_CALL_REPORT ("ProTessellationVerticesGet", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
status = ProTessellationNormalsGet(surfTessellation, &surfNormals);
TEST_CALL_REPORT ("ProTessellationNormalsGet", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
// Getting facets from surface tessellation
status = ProTessellationFacetsGet(surfTessellation, &pFacets);
TEST_CALL_REPORT ("ProTessellationNormalsGet", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
status = ProArraySizeGet (pFacets, &facetCount);
TEST_CALL_REPORT ("ProArraySizeGet()", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
}
else
return PRO_TK_BAD_INPUTS;
status = ProArrayAlloc( facetCount, sizeof(ProTriVertex *), 1, (ProArray *)&strip_arr);
TEST_CALL_REPORT("ProArrayAlloc", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
// Each facet is added as a seperate strip so, number of strip arrays (ie strips)
// is equal to number of facets
for (i = 0; i < facetCount; i++)
{
status = ProArrayAlloc( 0, sizeof(ProTriVertex), 1, (ProArray *)&(strip_arr[i]));
TEST_CALL_REPORT("ProArrayAlloc", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
}
status = ProArrayAlloc( facetCount, sizeof(int), 1, (ProArray *)&strip_size);
TEST_CALL_REPORT("ProArrayAlloc", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
for (i = 0; i <facetCount; i++ )
{
strip_size[i] = 3;
for (j = 0; j <3; j++)
{
tempTriVertex.pnt[0] = surfVertices[ pFacets[i][j]][0];
tempTriVertex.pnt[1] = surfVertices[ pFacets[i][j]][1];
tempTriVertex.pnt[2] = surfVertices[ pFacets[i][j]][2];
tempTriVertex.norm[0] = surfNormals[ pFacets[i][j]][0];
tempTriVertex.norm[1] = surfNormals[ pFacets[i][j]][1];
tempTriVertex.norm[2] = surfNormals[ pFacets[i][j]][2];
status = ProArrayObjectAdd ((ProArray*)&(strip_arr[i]), PRO_VALUE_UNUSED, 1, &tempTriVertex);
TEST_CALL_REPORT("ProArrayObjectAdd", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
}
}
status = ProMdlCurrentGet(&model);
TEST_CALL_REPORT("ProMdlCurrentGet", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
if(status != PRO_TK_NO_ERROR)
return status;
disobj_winId = 0;
status = ProMdlWindowGet(model, &disobj_winId);
TEST_CALL_REPORT("ProMdlWindowGet", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
if(result == PRO_UI_MESSAGE_YES) // Deletes existing display object
{
status = ProDispObjectDetach( disobj_winId, dispobj_keylist2);
TEST_CALL_REPORT("ProDispObjectDetach", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
status = ProDispObjectDelete( &surfDisp_obj );
TEST_CALL_REPORT("ProDispObjectDelete", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
status = ProArrayFree( (ProArray *)&dispobj_keylist2);
TEST_CALL_REPORT("ProArrayFree", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
surfDisp_obj = NULL;
}
// Creates new display object
status = ProDispObjectCreate(L"test_disp_obj", PRO_DISP_OBJECT_TWO_SIDED, facetCount, strip_size,
strip_arr, &surfDisp_obj);
TEST_CALL_REPORT("ProDispObjectCreate", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
// setting appearance porperties for display object
surf_appear.ambient = 0.5;
surf_appear.shininess = 0.2;
surf_appear.highlite = 0.1;
surf_appear.color_rgb[0] = 0.0;
surf_appear.color_rgb[1] = 0.0;
surf_appear.color_rgb[2] = 1.0;
surf_appear.transparency = 0.5;
surf_appear.diffuse = 0.80;
surf_appear.highlight_color[0] = 0.10;
surf_appear.highlight_color[1] = 0.20;
surf_appear.highlight_color[2] = 0.60;
surf_appear.reflection = 0.000000;
if(status == PRO_TK_NO_ERROR)
{
status = ProMdlTypeGet(model, &topMdlType);
TEST_CALL_REPORT("ProMdlTypeGet", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
if(topMdlType == PRO_MDL_ASSEMBLY)
{
// Getting component path
status = ProSelectionAsmcomppathGet(p_sel[0], &pCompPath);
TEST_CALL_REPORT("ProSelectionAsmcomppathGet", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
if (pCompPath.table_num> 0)
{
int arrayCount;
sAsmComp.type = PRO_FEATURE;
sAsmComp.id = pCompPath.comp_id_table[pCompPath.table_num-1];
sAsmComp.owner = owner;
status = ProArrayAlloc (0, sizeof (int), 1, (ProArray*)&cIdTablel);
TEST_CALL_REPORT("ProArrayAlloc", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
// Getting component ID table
for(arrayCount = 0; arrayCount < pCompPath.table_num; arrayCount++)
{
status = ProArrayObjectAdd ((ProArray*)&cIdTablel,
PRO_VALUE_UNUSED, 1, &pCompPath.comp_id_table[arrayCount]);
TEST_CALL_REPORT("ProArrayObjectAdd", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
}
isCompPath = PRO_B_TRUE;
}
else
isCompPath = PRO_B_FALSE;
}
// Attaching display object
status = ProDispObjectAttach((int)disobj_winId, surfDisp_obj, (isCompPath == PRO_B_TRUE?cIdTablel:NULL), feat_id, transform);
TEST_CALL_REPORT("ProDispObjectAttach", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
surf_appear.color_rgb[0] = 0.0;
surf_appear.color_rgb[1] = 0.0;
surf_appear.color_rgb[2] = 1.0;
status = ProArrayAlloc( 0, sizeof(int), 1, (ProArray *)&dispobj_keylist2);
TEST_CALL_REPORT("ProArrayAlloc", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
if(isCompPath == PRO_B_TRUE)
{
int arrayCount = -1, ii = -1;
status = ProArraySizeGet (cIdTablel, &arrayCount);
TEST_CALL_REPORT ("ProArraySizeGet()", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
for(ii = 0; ii < arrayCount; ii++)
{
status = ProArrayObjectAdd ((ProArray*)&dispobj_keylist2,
PRO_VALUE_UNUSED, 1, &cIdTablel[ii]);
TEST_CALL_REPORT("ProArrayObjectAdd", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
}
}
status = ProArrayObjectAdd ((ProArray*)&dispobj_keylist2,
PRO_VALUE_UNUSED, 1, &feat_id);
TEST_CALL_REPORT("ProArrayObjectAdd", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
// Setting appearance properties on display object
status = ProDispObjectSetSurfaceAppearanceProps( (int)disobj_winId, dispobj_keylist2, surf_appear);
TEST_CALL_REPORT("ProDispObjectSetSurfaceAppearanceProps", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
}
// Call repaint
status = ProWindowRepaint( disobj_winId);
TEST_CALL_REPORT("ProWindowRepaint", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
for(i =0; i < facetCount; i++)
{
for (j= 0; j<3; j++)
{
status = ProArrayFree( (ProArray *)&(strip_arr[i]));
TEST_CALL_REPORT("ProArrayFree", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
}
}
status = ProArrayFree( (ProArray *)&strip_arr);
TEST_CALL_REPORT("ProArrayFree", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
status = ProArrayFree( (ProArray *)&strip_size);
TEST_CALL_REPORT("ProArrayFree", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
if(modelitem.type == PRO_SURFACE)
{
status = ProArrayFree( (ProArray *)&surfVertices);
TEST_CALL_REPORT("ProArrayFree", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
status = ProArrayFree( (ProArray *)&surfNormals);
TEST_CALL_REPORT("ProArrayFree", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
}
if(isCompPath == PRO_B_TRUE)
{
status = ProArrayFree( (ProArray *)&cIdTablel);
TEST_CALL_REPORT("ProArrayFree", "PTTestDispObjectSurf()",
status, status!=PRO_TK_NO_ERROR );
}
return PRO_TK_NO_ERROR;
}
// Creates display object on selected curve/surface
int ProDispObjectSelectEntitySet( ProType* p_disobjSelEntity, ProType disobjSelEntity )
{
ProError status;
// Create display object along selected curve
if(disobjSelEntity == PRO_CURVE)
{
status = PTTestDispObjectCurve();
TEST_CALL_REPORT("PTTestDispObjectCurve", "ProDispObjectSelectEntitySet()",
status, status!=PRO_TK_NO_ERROR );
return 0;
}
// Create display object on selected surface
else if(disobjSelEntity == PRO_SURFACE)
{
status = PTTestDispObjectSurf();
TEST_CALL_REPORT("PTTestDispObjectSurf", "ProDispObjectSelectEntitySet()",
status, status!=PRO_TK_NO_ERROR );
return 0;
}
status = ProMenuDelete();
TEST_CALL_REPORT( "ProMenuDelete()", "ProDispObjectSelectEntitySet()",
status, status!=PRO_TK_NO_ERROR );
return 0;
}