/*
Copyright (c) 2019 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved.
*/
#ifndef lint
static char UtilTree_c [] = "@(#)UtilTree.c 1.2 11/26/96";
#endif
/*--------------------------------------------------------------------*\
Pro/Toolkit includes
\*--------------------------------------------------------------------*/
#include "ProToolkit.h"
#include "ProMdl.h"
#include "ProDisplist.h"
#include "ProFeatType.h"
#include "ProElement.h"
#include "ProElemId.h"
#include "ProElempath.h"
#include "ProDtmPln.h"
#include "ProUtil.h"
#include <string.h>
#include <stdio.h>
#include <ProTKRunTime.h>
#include <PTApplsUnicodeUtils.h>
/*--------------------------------------------------------------------*\
Pro/Develop includes
\*--------------------------------------------------------------------*/
/*--------------------------------------------------------------------*\
Application macros
\*--------------------------------------------------------------------*/
#include "UtilTree.h"
#include "TestError.h"
#include "UtilString.h"
#include "UtilCollect.h"
/*--------------------------------------------------------------------*\
Application data types
\*--------------------------------------------------------------------*/
extern ProError ProUtilIdToStr();
/*--------------------------------------------------------------------*\
Application global/external data
\*--------------------------------------------------------------------*/
typedef enum
{
PRO_ELEMTREE_PRINT_ALL = 1,
PRO_ELEMTREE_PRINT_BRANCHES = 2
} ProUtilElemtreePrintOpts;
typedef struct
{
ProUtilElemtreePrintOpts *options;
FILE *f;
int branches[2*PRO_ELEMTREE_MAX_LEVEL];
UtilTreeprintWindow window;
} UtilElemtreePrintdata;
static UtilGrWindowData win_data;
static ProError ProUtilElemValuePrint ( ProElement, ProBoolean, ProBoolean, UtilElemtreePrintdata, char*);
static ProError ProUtilValuePrint ( ProElement, UtilElemtreePrintdata, char*);
static ProError ProUtilValuePrintDeprecated ( ProValue, UtilElemtreePrintdata, char*);
static ProError ProUtilElemtreePPrint
(ProElement, ProElempath,ProUtilElemtreePrintOpts*,UtilTreeprintWindow*);
static ProError ProUtilElemtreeElemPrint ( ProElement, ProElement, ProElempath, UtilElemtreePrintdata*);
static ProError ProUtilElemPrint ( ProElement, ProBoolean, ProBoolean, ProBoolean, ProBoolean, UtilElemtreePrintdata, char*);
static ProError ProUtilElemIdPrint ( ProElement, ProBoolean, ProBoolean, UtilElemtreePrintdata, char*);
static ProError ProUtilDisp(char*, ProBool);
static ProError ProUtilElemtreeInGrWindow( ProElement, ProElempath, ProUtilElemtreePrintOpts*s, int*);
/*====================================================================*\
FUNCTION : ProUtilElementtreePrint
PURPOSE : Print an entire element tree
\*====================================================================*/
ProError ProUtilElementtreePrint (
ProElement elem_tree,
UtilTreeprintWindow window,
int *grwin_id )
{
ProError status = PRO_TK_NO_ERROR;
ProElempath path = (ProElempath)NULL;
char *p_env_win;
/* get empty path */
status = ProElempathAlloc ( &path );
TEST_CALL_REPORT("ProElempathAlloc()", "ProUtilElementtreePrint()",
status, (status != PRO_TK_NO_ERROR));
if ( status == PRO_TK_NO_ERROR )
{
switch (window)
{
case PRO_TEST_INFO_WINDOW:
status = ProUtilElemtreePPrint (elem_tree,path,NULL,&window);
break;
case PRO_TEST_GRAPHICS_WINDOW:
p_env_win = getenv("GRAPH_WINDOW");
if ((p_env_win == NULL) || (ProUtilStrcmp(p_env_win,
(char *)"yes")))
{
*grwin_id = -1;
break;
}
status = ProUtilElemtreeInGrWindow( elem_tree, path, NULL,
grwin_id);
break;
}
}
if ( path != (ProElempath)NULL )
{
status = ProElempathFree ( &path );
TEST_CALL_REPORT("ProElempathFree()", "ProUtilElementtreePrint",
status, status != PRO_TK_NO_ERROR);
}
return ( status );
}
/*====================================================================*\
FUNCTION : ProUtilElemtreePPrint
PURPOSE : Print an element tree
\*====================================================================*/
static ProError ProUtilElemtreePPrint (
ProElement elem_tree,
ProElempath elem_path,
ProUtilElemtreePrintOpts *options,
UtilTreeprintWindow *p_window)
{
UtilElemtreePrintdata data;
ProError status = PRO_TK_NO_ERROR;
char fname[PRO_NAME_SIZE];
wchar_t wfname[PRO_NAME_SIZE];
data.options = options;
ProTKSprintf (fname, "%s", "elemtree.inf");
data.f = PTApplsUnicodeFopen (fname, "w");
if ( data.f == (FILE *)NULL )
{
status = PRO_TK_GENERAL_ERROR;
}
else
{
ProTKFprintf(data.f, "Element tree\n============\n\n");
if (*p_window == PRO_TEST_GRAPHICS_WINDOW)
{
ProUtilDisp((char *)"Element tree", PRO_B_FALSE);
win_data.point[1] = win_data.point[1] - win_data.decrease;
ProUtilDisp((char *)"============", PRO_B_FALSE);
win_data.point[1] = win_data.point[1] - 2 * win_data.decrease;
}
}
memset(data.branches, 0, sizeof(data.branches));
data.window = *p_window;
if ( status == PRO_TK_NO_ERROR )
{
status = ProElemtreeElementVisit ( elem_tree, elem_path,
(ProElemtreeVisitFilter)NULL,
(ProElemtreeVisitAction)ProUtilElemtreeElemPrint,
(ProAppData)&data );
TEST_CALL_REPORT("ProElemtreeElementVisit()","ProUtilElemtreePPrint()",
status, (status != PRO_TK_NO_ERROR));
}
if ( (data.f != (FILE *)NULL)&&(*p_window == PRO_TEST_INFO_WINDOW))
{
fclose ( data.f );
ProInfoWindowDisplay(ProStringToWstring(wfname, fname), NULL, NULL);
}
return ( status );
}
/*====================================================================*\
FUNCTION : ProUtilElemtreeElemPrint
PURPOSE : Print the element tree
\*====================================================================*/
static ProError ProUtilElemtreeElemPrint (
ProElement elem_tree,
ProElement elem,
ProElempath elem_path,
UtilElemtreePrintdata *p_data)
{
int i, level = -1, n_elems = -1;
ProElemId id;
ProError status = PRO_TK_NO_ERROR;
char indent[2*PRO_ELEMTREE_MAX_LEVEL];
ProBoolean is_compound = PRO_B_FALSE, is_array = PRO_B_FALSE,
is_multi_val = PRO_B_FALSE, are_more_items = PRO_B_FALSE;
ProElement *children;
status = ProElementIdGet (elem, &id );
TEST_CALL_REPORT("ProElementIdGet()","ProUtilElemtreeElemPrint()",
status, (status != PRO_TK_NO_ERROR));
status = ProElementIsCompound (elem_tree, elem_path, &is_compound);
TEST_CALL_REPORT("ProElementIsCompound()","ProUtilElemtreeElemPrint()",
status, (status != PRO_TK_NO_ERROR));
if (status == PRO_TK_NO_ERROR)
{
status = ProElementIsArray (elem_tree, elem_path, &is_array);
TEST_CALL_REPORT("ProElementIsArray()",
"ProUtilElemtreeElemPrint()",
status, (status != PRO_TK_NO_ERROR));
}
if (status == PRO_TK_NO_ERROR)
{
status = ProElempathSizeGet ( elem_path, &level );
TEST_CALL_REPORT("ProElempathSizeGet()",
"ProUtilElemtreeElemPrint()",
status, (status != PRO_TK_NO_ERROR));
}
/*--------------------------------------------------------------------*\
Check to see if element is multivalued
\*--------------------------------------------------------------------*/
if (status == PRO_TK_NO_ERROR)
{
status = ProElementIsMultival(elem_tree,elem_path, &is_multi_val);
TEST_CALL_REPORT("ProElementIsMultival()","ProUtilElemtreeElemPrint()",
status, (status != PRO_TK_NO_ERROR));
}
/*--------------------------------------------------------------------*\
Set the indents properly
\*--------------------------------------------------------------------*/
if (status != PRO_TK_NO_ERROR)
return PRO_TK_BAD_INPUTS;
if (is_compound || is_array)
{
status = ProArrayAlloc(0,sizeof(ProElement),1,(ProArray*) &children);
TEST_CALL_REPORT("ProArrayAlloc()","ProUtilElemtreeElemPrint()",
status, (status != PRO_TK_NO_ERROR));
if (status == PRO_TK_NO_ERROR)
{
if (is_compound)
{
status = ProElementChildrenGet(elem_tree, elem_path, &children);
TEST_CALL_REPORT("ProElementChildrenGet()",
"ProUtilElemtreeElemPrint()",
status, (status != PRO_TK_NO_ERROR));
if (status == PRO_TK_NO_ERROR)
{
status = ProArraySizeGet((ProArray) children, &n_elems);
TEST_CALL_REPORT("ProArraySizeGet()",
"ProUtilElemtreeElemPrint()",
status, (status != PRO_TK_NO_ERROR));
}
}
else
{
status = ProElementArrayGet(elem_tree, elem_path, &children);
TEST_CALL_REPORT("ProElementArrayGet()",
"ProUtilElemtreeElemPrint()",
status, (status != PRO_TK_NO_ERROR));
status = ProElementArrayCount(elem_tree, elem_path, &n_elems);
TEST_CALL_REPORT("ProElementArrayCount()",
"ProUtilElemtreeElemPrint()",
status, (status != PRO_TK_NO_ERROR));
}
if (level > 0)
(p_data->branches[level-1])--;
if (n_elems > 0)
{
p_data->branches[level] = n_elems;
}
}
status = ProArrayFree((ProArray*) &children);
TEST_CALL_REPORT("ProArrayFree()","ProUtilElemtreeElemPrint()",
status, (status != PRO_TK_NO_ERROR));
}
else
{
if (level == -1 )
return PRO_TK_BAD_INPUTS;
if (level > 0)
(p_data->branches[level-1])--;
}
indent[0] = '\0';
if ( level > 0 )
{
for ( i = 0; i < (level-1); i++ )
{
if ( p_data->branches[i] > 0 )
{
ProUtilstrcat (indent, " | " );
}
else
ProUtilstrcat (indent, " " );
}
ProUtilstrcat(indent," |---");
}
for (i = 0; i < 20; i++)
{
if ( p_data->branches[i] > 0 )
{
are_more_items = PRO_B_TRUE;
break;
}
}
if ( status == PRO_TK_NO_ERROR )
{
status = ProUtilElemPrint ( elem, is_compound, is_array, is_multi_val,
are_more_items, *p_data, indent );
if (status != PRO_TK_NO_ERROR)
{
ProTKFprintf(p_data->f, "\n");
ProTKFprintf(stderr, "Element id %d is bad valued \n", id);
}
}
return ( PRO_TK_NO_ERROR );
}
/*====================================================================*\
FUNCTION : ProUtilElemPrint
PURPOSE : Print a single element
\*====================================================================*/
static ProError ProUtilElemPrint (
ProElement elem,
ProBoolean is_compound,
ProBoolean is_array,
ProBoolean is_multi_val,
ProBoolean are_more_items,
UtilElemtreePrintdata data,
char *indent)
{
ProError status = PRO_TK_NO_ERROR;
status = ProUtilElemIdPrint ( elem,is_compound,is_array,data, indent);
if ( status == PRO_TK_NO_ERROR && !is_compound && !is_array)
{
status = ProUtilElemValuePrint ( elem, is_multi_val,
are_more_items, data, indent);
}
else
{
ProTKFprintf ( data.f, "\n");
if (data.window == PRO_TEST_GRAPHICS_WINDOW)
{
win_data.point[1] = win_data.point[1] - win_data.decrease;
win_data.point[0] = 0;
}
}
return ( status );
}
/*====================================================================*\
FUNCTION : ProUtilElemIdPrint
PURPOSE : Print the element name ( or id if it is not in the str table)
\*====================================================================*/
static ProError ProUtilElemIdPrint (
ProElement elem,
ProBoolean is_compound,
ProBoolean is_array,
UtilElemtreePrintdata data,
char *indent)
{
ProElemId elem_id;
ProError status = PRO_TK_NO_ERROR;
char elem_name[40], s[100];
status = ProElementIdGet ( elem, &elem_id );
TEST_CALL_REPORT("ProElementIdGet()","ProUtilElemtreePPrint()",
status, (status != PRO_TK_NO_ERROR));
if (status == PRO_TK_NO_ERROR)
{
status = ProUtilIdToStr(elem_id, elem_name);
}
if (status == PRO_TK_NO_ERROR)
{
ProTKSprintf ( s, "%s%s ", indent, elem_name);
ProTKFprintf ( data.f, s);
if (data.window == PRO_TEST_GRAPHICS_WINDOW)
{
ProUtilDisp(s, PRO_B_TRUE);
}
}
else if ( status == PRO_TK_E_NOT_FOUND )
{
ProTKSprintf(s, "%sElem Id: %3d ", indent, elem_id );
ProTKFprintf ( data.f, s);
if (data.window == PRO_TEST_GRAPHICS_WINDOW)
{
ProUtilDisp(s, PRO_B_TRUE);
}
status = PRO_TK_NO_ERROR;
}
if ( status == PRO_TK_NO_ERROR && is_compound )
{
ProTKSprintf ( s, " (COMPOUND) ");
ProTKFprintf ( data.f, s);
if (data.window == PRO_TEST_GRAPHICS_WINDOW)
{
ProUtilDisp(s, PRO_B_TRUE);
}
}
if ( status == PRO_TK_NO_ERROR && is_array )
{
ProTKSprintf ( s, " (ARRAY) ");
ProTKFprintf ( data.f, s);
if (data.window == PRO_TEST_GRAPHICS_WINDOW)
{
ProUtilDisp(s, PRO_B_TRUE);
}
}
return ( status );
}
/*====================================================================*\
FUNCTION : ProUtilElemValuePrint
PURPOSE : Print the value of an element
\*====================================================================*/
static ProError ProUtilElemValuePrint (
ProElement elem,
ProBoolean is_multi_val,
ProBoolean are_more_items,
UtilElemtreePrintdata data,
char *indent)
{
ProValue value = (ProValue)NULL;
ProError status = PRO_TK_NO_ERROR;
char s[100], *chp = indent;
if ( is_multi_val == PRO_B_FALSE)
{
status = ProUtilValuePrint ( elem, data, NULL);
}
else /* the case of multipule values is deprecated; check the documentation of specific feature trees */
{
ProValue *p_value = (ProValue*)NULL;
int i, n_vals, ind_len;
status = ProArrayAlloc(0, sizeof(ProValue), 1, (ProArray*)&p_value);
TEST_CALL_REPORT("ProArrayAlloc()","ProUtilElemValuePrint()",
status, (status != PRO_TK_NO_ERROR));
if (status == PRO_TK_NO_ERROR)
{
status = ProElementValuesGet(elem, &p_value);
TEST_CALL_REPORT("ProElementValuesGet()","ProUtilElemValuePrint()",
status, (status != PRO_TK_NO_ERROR));
}
if (status == PRO_TK_NO_ERROR)
{
status = ProArraySizeGet((ProArray)p_value, &n_vals);
TEST_CALL_REPORT("ProArraySizeGet()", "ProUtilElemValuePrint()",
status, (status != PRO_TK_NO_ERROR));
ind_len = strlen(indent);
if (are_more_items == PRO_B_TRUE)
{
*(chp+=ind_len) = '\0';
for (i = 0; i < 3; i++)
*(--chp) = ' ';
}
else
{
for (i = 0; i < ind_len; i++)
*(chp++) = ' ';
*(chp) = '\0';
}
for (i = 0 ; i < n_vals; i++)
{
status = ProUtilValuePrintDeprecated (p_value[i], data,
i == 0 ? (char*)NULL : indent );
}
if( n_vals == 0 )
ProTKFprintf ( data.f, "\n" );
}
if (p_value != NULL)
{
status = ProArrayFree((ProArray*)&p_value);
TEST_CALL_REPORT("ProArrayFree()","ProUtilElemValuePrint()",
status, (status != PRO_TK_NO_ERROR));
}
}
return ( status );
}
/*====================================================================*\
FUNCTION : ProUtilValuePrintDeprecated
PURPOSE : Print out an elements value
\*====================================================================*/
static ProError ProUtilValuePrintDeprecated (
ProValue value,
UtilElemtreePrintdata data,
char *indent)
{
ProValueData value_data;
ProError status = PRO_TK_NO_ERROR;
char temp[100], temp2[100], li[2*PRO_ELEMTREE_MAX_LEVEL];
ProModelitem mdl_item;
ProAsmcomppath path;
double *d;
int k;
li[0] = '\0';
if (indent != (char*) NULL)
{
ProUtilstrcat(li, (const char *)indent);
ProUtilstrcat(li," ");
}
status = ProValueDataGet (value, &value_data);
TEST_CALL_REPORT("ProValueDataGet()","ProUtilValuePrintDeprecated()",
status, (status != PRO_TK_NO_ERROR));
if ( status == PRO_TK_NO_ERROR )
{
switch ( value_data.type )
{
case PRO_VALUE_TYPE_TRANSFORM:
if ( value_data.v.t == NULL )
{
ProTKSprintf (temp, "%sVALUE (TRANSFORM)", li );
break;
}
ProTKSprintf (temp, "%sVALUE (TRANSFORM)", li );
d = (double*)value_data.v.t;
for (k=0; k<4; k++)
ProTKPrintf("%8.5f %8.5f %8.5f %8.5f\n", d[k*4],
d[k*4+1], d[k*4+2], d[k*4+3]);
break;
case PRO_VALUE_TYPE_INT:
ProTKSprintf (temp, "%sVALUE (INT) = %d",li,value_data.v.i );
break;
case PRO_VALUE_TYPE_DOUBLE:
ProTKSprintf (temp, "%sVALUE (DOUBLE) = %f",li,value_data.v.d );
break;
case PRO_VALUE_TYPE_STRING:
if ( value_data.v.s == NULL )
{
ProTKSprintf (temp, "%sVALUE (STRING) = ",li);
break;
}
ProTKSprintf (temp, "%sVALUE (STRING) = %s",li,value_data.v.s );
break;
case PRO_VALUE_TYPE_WSTRING:
if ( value_data.v.w == NULL )
{
ProTKSprintf (temp, "%sVALUE (WSTRING) = ",li);
break;
}
ProTKSprintf (temp, "%sVALUE (WSTRING) = %s",li,
ProWstringToString(temp2, value_data.v.w) );
break;
case PRO_VALUE_TYPE_SELECTION:
if ( value_data.v.r == NULL )
{
ProTKSprintf (temp, "%sVALUE (SELECTION) = ", li);
break;
}
status = ProSelectionModelitemGet(value_data.v.r, &mdl_item);
TEST_CALL_REPORT("ProSelectionModelitemGet()",
"ProUtilValuePrintDeprecated()", status, status != PRO_TK_NO_ERROR);
status = ProSelectionAsmcomppathGet(value_data.v.r, &path);
TEST_CALL_REPORT("ProSelectionAsmcomppathGet()",
"ProUtilValuePrintDeprecated()", status, status != PRO_TK_NO_ERROR);
ProTKSprintf (temp, "%sVALUE (SELECTION) Id = %d Type = %d Owner = %x",
li, mdl_item.id, mdl_item.type, mdl_item.owner);
if (path.table_num>0)
{
ProUtilstrcat(temp, " Path = ");
for(k=0; k<path.table_num; k++)
ProTKSprintf(temp+strlen(temp), " %d", path.comp_id_table[k]);
ProTKSprintf(temp+strlen(temp), " Owner %x", path.owner);
}
ProTKPrintf("%s\n", temp);
ProTKSprintf (temp, "%sVALUE (SELECTION) id = %d", li,
mdl_item.id);
break;
case PRO_VALUE_TYPE_POINTER:
/* For QCR files */
if (value_data.v.p != NULL)
ProTKSprintf(temp, "%sPOINTER = **", li);
else
ProTKSprintf (temp, "%sPOINTER = %x",li,
value_data.v.p );
ProTKPrintf("%x\n",value_data.v.p);
break;
}
ProTKFprintf (data.f, temp );
ProTKFprintf (data.f, "\n");
if(data.window == PRO_TEST_GRAPHICS_WINDOW)
{
ProUtilDisp(temp, PRO_B_FALSE);
win_data.point[1] = win_data.point[1] - win_data.decrease;
win_data.point[0] = 0;
}
}
return ( status );
}
/*====================================================================*\
FUNCTION : ProUtilValuePrint
PURPOSE : Print out an elements value
\*====================================================================*/
static ProError ProUtilValuePrint (
ProElement element,
UtilElemtreePrintdata data,
char *indent)
{
ProValueDataType value_type;
ProError status = PRO_TK_NO_ERROR;
char temp[100], temp2[100], li[2*PRO_ELEMTREE_MAX_LEVEL];
ProModelitem mdl_item;
ProAsmcomppath path;
double *d;
int k;
li[0] = '\0';
if (indent != (char*) NULL)
{
ProUtilstrcat(li, (const char *)indent);
ProUtilstrcat(li," ");
}
status = ProElementValuetypeGet (element, &value_type);
TEST_CALL_REPORT("ProElementValuetypeGet()","ProUtilValuePrint()",
status, (status != PRO_TK_NO_ERROR && status != PRO_TK_EMPTY));
if ( status == PRO_TK_NO_ERROR )
{
switch ( value_type )
{
case PRO_VALUE_TYPE_TRANSFORM:
{
ProMatrix value;
status = ProElementTransformGet(element, NULL, value);
if ( status != PRO_TK_NO_ERROR )
{
ProTKSprintf (temp, "%sVALUE (TRANSFORM)", li );
break;
}
ProTKSprintf (temp, "%sVALUE (TRANSFORM)", li );
d = (double*)value;
for (k=0; k<4; k++)
ProTKPrintf("%8.5f %8.5f %8.5f %8.5f\n", d[k*4],
d[k*4+1], d[k*4+2], d[k*4+3]);
break;
}
case PRO_VALUE_TYPE_INT:
{
int value;
status = ProElementIntegerGet(element, NULL, &value);
ProTKSprintf (temp, "%sVALUE (INT) = %d",li,value );
break;
}
case PRO_VALUE_TYPE_DOUBLE:
{
double value;
status = ProElementDoubleGet(element, NULL, &value);
ProTKSprintf (temp, "%sVALUE (DOUBLE) = %f",li,value );
break;
}
case PRO_VALUE_TYPE_STRING:
{
char *value;
status = ProElementStringGet(element, NULL, &value);
if ( value == NULL )
{
ProTKSprintf (temp, "%sVALUE (STRING) = ",li);
break;
}
ProTKSprintf (temp, "%sVALUE (STRING) = %s",li,value );
status = ProStringFree( value );
break;
}
case PRO_VALUE_TYPE_WSTRING:
{
wchar_t *value;
status = ProElementWstringGet(element, NULL, &value);
if ( value == NULL )
{
ProTKSprintf (temp, "%sVALUE (WSTRING) = ",li);
break;
}
ProTKSprintf (temp, "%sVALUE (WSTRING) = %s",li,
ProWstringToString(temp2, value) );
status = ProWstringFree( value );
break;
}
case PRO_VALUE_TYPE_SELECTION:
{
ProReference value;
ProSelection sel;
status = ProElementReferenceGet(element, NULL, &value);
if ( value == NULL )
{
ProTKSprintf (temp, "%sVALUE (SELECTION) = ", li);
break;
}
status = ProReferenceToSelection(value, &sel);
status = ProSelectionModelitemGet(sel, &mdl_item);
TEST_CALL_REPORT("ProSelectionModelitemGet()",
"ProUtilValuePrint()", status, status != PRO_TK_NO_ERROR);
status = ProSelectionAsmcomppathGet(sel, &path);
TEST_CALL_REPORT("ProSelectionAsmcomppathGet()",
"ProUtilValuePrint()", status, status != PRO_TK_NO_ERROR);
ProTKSprintf (temp, "%sVALUE (SELECTION) Id = %d Type = %d Owner = %x",
li, mdl_item.id, mdl_item.type, mdl_item.owner);
if (path.table_num>0)
{
ProUtilstrcat(temp, " Path = ");
for(k=0; k<path.table_num; k++)
ProTKSprintf(temp+strlen(temp), " %d", path.comp_id_table[k]);
ProTKSprintf(temp+strlen(temp), " Owner %x", path.owner);
}
ProTKPrintf("%s\n", temp);
ProTKSprintf (temp, "%sVALUE (SELECTION) id = %d", li,
mdl_item.id);
status = ProReferenceFree( value );
break;
}
case PRO_VALUE_TYPE_POINTER:
{
ProAppData value;
status = ProElementSpecialvalueGet(element, NULL, &value);
/* For QCR files */
if (value != NULL)
ProTKSprintf(temp, "%sPOINTER = **", li);
else
ProTKSprintf (temp, "%sPOINTER = %x",li,
value );
ProTKPrintf("%x\n",value);
break;
}
}
ProTKFprintf (data.f, temp );
ProTKFprintf (data.f, "\n");
if(data.window == PRO_TEST_GRAPHICS_WINDOW)
{
ProUtilDisp(temp, PRO_B_FALSE);
win_data.point[1] = win_data.point[1] - win_data.decrease;
win_data.point[0] = 0;
}
}
return ( status );
}
/*====================================================================*\
FUNCTION : ProUtilDisp
PURPOSE : Display a feature tree in an information window
\*====================================================================*/
static ProError ProUtilDisp(char *text, ProBool move_carret)
{
ProError err;
wchar_t w_str[150];
ProTextAttribute attribute, new_attribute;
double char_length;
err = ProTextAttributesCurrentGet(&attribute);
TEST_CALL_REPORT("ProTextAttributesCurrentGet","ProUtilDisp",
err, err!=PRO_TK_NO_ERROR);
new_attribute = attribute;
new_attribute.height = 15;
new_attribute.width_factor = 0.75;
#if 0
err = ProTextHeightCurrentSet(new_attribute.height);
TEST_CALL_REPORT("ProTextHeightCurrentSet","ProUtilDisp",
err, err!=PRO_TK_NO_ERROR);
err = ProTextWidthFactorCurrentSet(new_attribute.width_factor);
TEST_CALL_REPORT("ProTextWidthFactorCurrentSet","ProUtilDisp",
err, err!=PRO_TK_NO_ERROR);
#endif
ProStringToWstring(w_str, text);
err = ProGraphicsTextDisplay(win_data.point, w_str);
TEST_CALL_REPORT("ProGraphicsTextDisplay","ProUtilDisp",
err, err!=PRO_TK_NO_ERROR);
#if 0
err = ProTextHeightCurrentSet(attribute.height);
TEST_CALL_REPORT("ProTextHeightCurrentSet","ProUtilDisp",
err, err!=PRO_TK_NO_ERROR);
err = ProTextWidthFactorCurrentSet(attribute.width_factor);
TEST_CALL_REPORT("ProTextWidthFactorCurrentSet","ProUtilDisp",
err, err!=PRO_TK_NO_ERROR);
#endif
if (move_carret == PRO_B_TRUE)
{
char_length = new_attribute.height * new_attribute.width_factor;
win_data.point[0] += 2 * char_length * (double)strlen(text);
}
return err;
}
/*====================================================================*\
FUNCTION : ProUtilElemtreeInGrWindow
PURPOSE :
\*====================================================================*/
static ProError ProUtilElemtreeInGrWindow(
ProElement elem_tree,
ProElempath elem_path,
ProUtilElemtreePrintOpts *options,
int *p_win_id)
{
ProError err = PRO_TK_NO_ERROR;
#ifndef PT_PRODUCTS_BUILD
ProMdlName obj_name;
ProType obj_type = PRO_PART;
ProSolid tree_obj;
int cur_id, newwin_id;
ProMatrix transform;
UtilTreeprintWindow window = PRO_TEST_GRAPHICS_WINDOW;
ProStringToWstring(obj_name, (char *)"feature_tree");
err = ProSolidMdlnameCreate(obj_name, (ProMdlfileType)obj_type, &tree_obj);
TEST_CALL_REPORT("ProSolidMdlnameCreate()", "ProUtilElemtreeInGrWindow",
err, err != PRO_TK_NO_ERROR);
if (err != PRO_TK_NO_ERROR)
{
err = ProMdlnameInit(obj_name, (ProMdlfileType)obj_type, (ProMdl *)&tree_obj);
TEST_CALL_REPORT("ProMdlnameInit()", "ProUtilElemtreeInGrWindow",
err, err != PRO_TK_NO_ERROR);
}
if (err != PRO_TK_NO_ERROR)
{
err = ProMdlnameRetrieve(obj_name, (ProMdlfileType)obj_type, (ProMdl *)&tree_obj);
TEST_CALL_REPORT("ProMdlnameRetrieve()", "ProUtilElemtreeInGrWindow",
err, err != PRO_TK_NO_ERROR);
}
err = ProWindowCurrentGet(&cur_id);
TEST_CALL_REPORT("ProWindowCurrentGet()", "ProUtilElemtreeInGrWindow",
err, err != PRO_TK_NO_ERROR);
err = ProObjectwindowMdlnameCreate(obj_name, obj_type, &newwin_id);
TEST_CALL_REPORT("ProObjectwindowMdlnameCreate()", "ProUtilElemtreeInGrWindow",
err, err != PRO_TK_NO_ERROR);
err = ProWindowCurrentSet(newwin_id);
TEST_CALL_REPORT("ProWindowCurrentSet()", "ProUtilElemtreeInGrWindow",
err, err != PRO_TK_NO_ERROR);
err = ProSolidDisplay(tree_obj);
TEST_CALL_REPORT("ProSolidDisplay()", "ProUtilElemtreeInGrWindow",
err, err != PRO_TK_NO_ERROR);
err = ProViewMatrixGet((ProMdl) tree_obj, NULL, transform);
TEST_CALL_REPORT("ProViewMatrixGet", "ProUtilElemtreeInGrWindow", err,
err != PRO_TK_NO_ERROR);
err = ProDisplist2dDelete(5);
TEST_CALL_REPORT("ProDisplist2dDelete()", "ProUtilElemtreeInGrWindow",
err, err != PRO_TK_NO_ERROR);
win_data.point[0] = 0.0;
win_data.point[1] = 800;
win_data.decrease = 35;
err = ProDisplist2dCreate(5, transform,
(ProDisplistCallback)ProUtilElemtreePPrint,
(void *)elem_tree, (void *)elem_path, (void *)options, (void *)&window);
TEST_CALL_REPORT("ProDisplist3dCreate", "ProUtilElemtreeInGrWindow", err,
err != PRO_TK_NO_ERROR);
err = ProWindowRefresh( newwin_id );
TEST_CALL_REPORT("ProWindowRefresh()", "ProUtilElemtreeInGrWindow",
err, err != PRO_TK_NO_ERROR);
err = ProDisplist2dDisplay(5, transform);
TEST_CALL_REPORT("ProDisplist2dDisplay()", "ProUtilElemtreeInGrWindow",
err, err != PRO_TK_NO_ERROR);
err = ProWindowCurrentSet(cur_id);
TEST_CALL_REPORT("ProWindowCurrentSet()", "ProUtilElemtreeInGrWindow",
err, err != PRO_TK_NO_ERROR);
if(p_win_id != NULL)
*p_win_id = newwin_id;
#endif
return err;
}
/*====================================================================*\
FUNCTION : ProUtilShowTreeInInfo()
PURPOSE : show tree
\*====================================================================*/
ProError ProUtilShowTreeInInfo(
ProElement elem_tree )
{
return (ProUtilElementtreePrint(elem_tree,PRO_TEST_INFO_WINDOW,NULL));
}
/*====================================================================*\
FUNCTION : ProUtilElemWithSelectionFilter()
PURPOSE : Finf Elements with selection data
\*====================================================================*/
ProError ProUtilElemWithSelectionFilter(
ProElement elem_tree,
ProElement elem,
ProElempath elempath)
{
ProError err;
ProBoolean is_comp, is_multi, has_sel = PRO_B_FALSE;
ProValue value, *p_values;
ProValueData val_data;
int i, n_val = -1;
ProReference *p_references, p_reference;
err = ProElementIsArray(elem, NULL, &is_comp);
TEST_CALL_REPORT("ProElementIsArray()",
"ProUtilElemWithSelectionFilter()", err, err != PRO_TK_NO_ERROR);
if (is_comp == PRO_B_FALSE)
{
err = ProElementIsCompound(elem, NULL, &is_comp);
TEST_CALL_REPORT("ProElementIsCompound()",
"ProUtilElemWithSelectionFilter()", err, err != PRO_TK_NO_ERROR);
}
if (is_comp == PRO_B_TRUE)
return (PRO_TK_CONTINUE);
err = ProElementIsMultival(elem, NULL, &is_multi);
TEST_CALL_REPORT("ProElementIsMultival()",
"ProUtilElemWithSelectionFilter()", err, err != PRO_TK_NO_ERROR);
if (is_multi)
{
err = ProElementReferencesGet(elem, NULL, &p_references);
TEST_CALL_REPORT("ProElementReferencesGet()",
"ProUtilElemWithSelectionFilter()", err, err != PRO_TK_NO_ERROR);
if(err == PRO_TK_NO_ERROR)
{
err = ProArraySizeGet((ProArray)p_references, &n_val);
TEST_CALL_REPORT("ProArraySizeGet()",
"ProUtilElemWithSelectionFilter()", err, err != PRO_TK_NO_ERROR);
if(n_val > 0)
{
has_sel = PRO_B_TRUE;
ProReferencearrayFree((ProArray*)&p_references);
TEST_CALL_REPORT("ProReferencearrayFree()",
"ProUtilElemWithSelectionFilter()",
err, err != PRO_TK_NO_ERROR);
}
}
}
else
{
err = ProElementReferenceGet(elem, NULL, &p_reference);
TEST_CALL_REPORT("ProElementReferenceGet()",
"ProUtilElemWithSelectionFilter()", err, err != PRO_TK_NO_ERROR);
if ( err == PRO_TK_NO_ERROR )
has_sel = PRO_B_TRUE;
}
return (has_sel == PRO_B_TRUE ? PRO_TK_NO_ERROR : PRO_TK_CONTINUE);
}
/*====================================================================*\
FUNCTION : ProUtilSelectionChangeAsmcomppath
PURPOSE : Move selection from part and subassembly refs to the root
assembly level
\*====================================================================*/
ProError ProUtilSelectionChangeAsmcomppath(
ProSelection old_sel,
ProSelection *p_new_sel,
ProAppData p_asmcomppath)
{
ProAsmcomppath *p_fpath = ((ProAsmcomppath *)p_asmcomppath);
ProAsmcomppath ref_path, path;
ProModelitem modelitem;
ProMdl mdl;
ProError err;
int i;
/* Model and feature must be on the one branch from the root assy
Model path must be less that feature path */
err = ProSelectionAsmcomppathGet(old_sel, &ref_path);
TEST_CALL_REPORT("ProSelectionAsmcomppathGet()",
"ProUtilSelectionChangeAsmcomppath()", err, err != PRO_TK_NO_ERROR);
if (ref_path.table_num >= p_fpath->table_num)
return (PRO_TK_E_NOT_FOUND);
err = ProSelectionModelitemGet(old_sel, &modelitem);
TEST_CALL_REPORT("ProSelectionModelitemGet()",
"ProUtilSelectionChangeAsmcomppath()", err, err != PRO_TK_NO_ERROR);
if (ref_path.table_num == 0)
ref_path.owner = (ProSolid)modelitem.owner;
for (i=0; i< p_fpath->table_num - ref_path.table_num; i++)
{
err = ProAsmcomppathInit(p_fpath->owner, p_fpath->comp_id_table, i+1,
&path);
TEST_CALL_REPORT("ProAsmcomppathInit()",
"ProUtilSelectionChangeAsmcomppath()", err, err != PRO_TK_NO_ERROR);
err = ProAsmcomppathMdlGet(&path, &mdl);
TEST_CALL_REPORT("ProAsmcomppathMdlGet()",
"ProUtilSelectionChangeAsmcomppath()", err, err != PRO_TK_NO_ERROR);
/* Owner found on same branch as feature */
if (mdl == (ProMdl)ref_path.owner)
break;
}
if (i >= p_fpath->table_num - ref_path.table_num)
return (PRO_TK_E_NOT_FOUND);
/* build new ref path */
memcpy(path.comp_id_table + i + 1, ref_path.comp_id_table,
(ref_path.table_num+1) * sizeof(path.comp_id_table[0]));
path.table_num = i + 1 + ref_path.table_num;
err = ProSelectionAlloc(&path, &modelitem, p_new_sel);
TEST_CALL_REPORT("ProSelectionAlloc()",
"ProUtilSelectionChangeAsmcomppath()", err, err != PRO_TK_NO_ERROR);
return (PRO_TK_NO_ERROR);
}
/*====================================================================*\
FUNCTION : ProUtilOriginalGeomSelection
PURPOSE : Changes selection to 'internal' surfaces to original geometry
\*====================================================================*/
ProError ProUtilOriginalGeomSelection(
ProSelection old_sel,
ProSelection *p_new_sel,
ProAppData dummy)
{
ProError err, er1;
ProElempath path;
ProModelitem modelitem;
ProFeature feature;
ProFeattype feat_type;
ProBoolean replace = PRO_B_FALSE, is_vis;
int i;
ProElempathItem constr_type[3];
ProElempathItem constr_ref[3];
ProElement elem_tree, elem;
ProReference ref;
ProSelection sel;
int type;
constr_type[0].type = PRO_ELEM_PATH_ITEM_TYPE_ID;
constr_type[0].path_item.elem_id = PRO_E_DTMPLN_CONSTRAINTS;
constr_type[1].type = PRO_ELEM_PATH_ITEM_TYPE_INDEX;
constr_type[1].path_item.elem_id = 0;
constr_type[2].type = PRO_ELEM_PATH_ITEM_TYPE_ID;
constr_type[2].path_item.elem_id = PRO_E_DTMPLN_CONSTR_TYPE;
constr_ref[0].type = PRO_ELEM_PATH_ITEM_TYPE_ID;
constr_ref[0].path_item.elem_id = PRO_E_DTMPLN_CONSTRAINTS;
constr_ref[1].type = PRO_ELEM_PATH_ITEM_TYPE_INDEX;
constr_ref[1].path_item.elem_id = 0;
constr_ref[2].type = PRO_ELEM_PATH_ITEM_TYPE_ID;
constr_ref[2].path_item.elem_id = PRO_E_DTMPLN_CONSTR_REF;
if (old_sel != NULL)
{
err = ProSelectionModelitemGet(old_sel, &modelitem);
TEST_CALL_REPORT("ProSelectionModelitemGet()",
"ProUtilOriginalGeomSelection()", err, err != PRO_TK_NO_ERROR);
/* Do any wotk only if selection is surface on internal datum plane */
if (modelitem.type != PRO_SURFACE)
return (PRO_TK_E_NOT_FOUND);
err = ProGeomitemFeatureGet((ProGeomitem*)&modelitem, &feature);
TEST_CALL_REPORT("ProGeomitemFeatureGet()",
"ProUtilOriginalGeomSelection()", err, err != PRO_TK_NO_ERROR);
err = ProFeatureVisibilityGet(&feature, &is_vis);
TEST_CALL_REPORT("ProFeatureVisibilityGet()",
"ProUtilOriginalGeomSelection()", err, err != PRO_TK_NO_ERROR);
if (err != PRO_TK_NO_ERROR || is_vis != PRO_B_FALSE)
return (PRO_TK_E_NOT_FOUND);
err = ProFeatureTypeGet(&feature, &feat_type);
TEST_CALL_REPORT("ProFeatureTypeGet()",
"ProUtilOriginalGeomSelection()", err, err != PRO_TK_NO_ERROR);
if (err != PRO_TK_NO_ERROR || feat_type != PRO_FEAT_DATUM)
return (PRO_TK_E_NOT_FOUND);
/* internal datum plane found - create elemtree and check constraints*/
for (i=0; i<2; i++)
{
err = ProElempathAlloc(&path);
TEST_CALL_REPORT("ProElempathAlloc()",
"ProUtilOriginalGeomSelection()", err, err != PRO_TK_NO_ERROR);
constr_type[1].path_item.elem_index = i;
err = ProElempathDataSet(path, constr_type, 3);
TEST_CALL_REPORT("ProElempathDataSet()",
"ProUtilOriginalGeomSelection()", err, err != PRO_TK_NO_ERROR);
err = ProFeatureElemtreeExtract (&feature, NULL,
PRO_FEAT_EXTRACT_NO_OPTS, &elem_tree );
if (err != PRO_TK_NO_ERROR)
continue;
err = ProElemtreeElementGet(elem_tree, path, &elem);
if (err != PRO_TK_NO_ERROR)
continue;
err = ProElementIntegerGet(elem, NULL, &type);
if (err != PRO_TK_NO_ERROR)
continue;
/* this printout is left for compatibility with existing tests */
TEST_CALL_REPORT("ProFeatureElemValueGet()",
"ProUtilOriginalGeomSelection()", err, err != PRO_TK_NO_ERROR);
er1 = ProElempathFree(&path);
TEST_CALL_REPORT("ProElempathFree()",
"ProUtilOriginalGeomSelection()", er1, er1 != PRO_TK_NO_ERROR);
if (err != PRO_TK_NO_ERROR)
continue;
/* this printout is left for compatibility with existing tests */
TEST_CALL_REPORT("ProValueDataGet()",
"ProUtilOriginalGeomSelection()", err, err != PRO_TK_NO_ERROR);
if (type != PRO_DTMPLN_THRU)
continue;
err = ProElempathAlloc(&path);
TEST_CALL_REPORT("ProElempathAlloc()",
"ProUtilOriginalGeomSelection()", err, err != PRO_TK_NO_ERROR);
constr_ref[1].path_item.elem_index = i;
err = ProElempathDataSet(path, constr_ref, 3);
TEST_CALL_REPORT("ProElempathDataSet()",
"ProUtilOriginalGeomSelection()", err, err != PRO_TK_NO_ERROR);
err = ProFeatureElemtreeExtract (&feature, NULL,
PRO_FEAT_EXTRACT_NO_OPTS, &elem_tree );
if (err != PRO_TK_NO_ERROR)
continue;
err = ProElemtreeElementGet(elem_tree, path, &elem);
if (err != PRO_TK_NO_ERROR)
continue;
err = ProElementReferenceGet(elem, NULL, &ref);
if (err != PRO_TK_NO_ERROR)
continue;
err = ProReferenceToSelection(ref, &sel);
if (err != PRO_TK_NO_ERROR)
continue;
/* this printout is left for compatibility with existing tests */
TEST_CALL_REPORT("ProFeatureElemValueGet()",
"ProUtilOriginalGeomSelection()", err, err != PRO_TK_NO_ERROR);
er1 = ProElempathFree(&path);
TEST_CALL_REPORT("ProElempathFree()",
"ProUtilOriginalGeomSelection()", er1, er1 != PRO_TK_NO_ERROR);
if (err != PRO_TK_NO_ERROR)
continue;
/* this printout is left for compatibility with existing tests */
TEST_CALL_REPORT("ProValueDataGet()",
"ProUtilOriginalGeomSelection()", err, err != PRO_TK_NO_ERROR);
/* Original Selection found. Replace old one */
err = ProSelectionCopy(sel, p_new_sel);
TEST_CALL_REPORT("ProSelectionCopy()",
"ProUtilOriginalGeomSelection()", err, err != PRO_TK_NO_ERROR);
replace = PRO_B_TRUE;
break;
}
}
return (replace == PRO_B_TRUE ? PRO_TK_NO_ERROR : PRO_TK_E_NOT_FOUND);
}
/*====================================================================*\
FUNCTION : ProUtilValueReplaceSelection
PURPOSE : Replace selection in value
\*====================================================================*/
/*
ProError ProUtilValueReplaceSelection(
ProValue *p_value,
ProUtilChahgeSelection user_func,
ProAppData appdata)
{
ProSelection new_sel;
ProValueData val_data,new_data;
ProError err;
err = ProValueDataGet(*p_value, &val_data);
TEST_CALL_REPORT("ProValueDataGet()",
"ProUtilValueReplaceSelection()", err, err != PRO_TK_NO_ERROR);
if (err != PRO_TK_NO_ERROR || val_data.type != PRO_VALUE_TYPE_SELECTION)
return (PRO_TK_E_NOT_FOUND);
err = user_func(val_data.v.r, &new_sel, appdata);
if (err != PRO_TK_NO_ERROR)
return err;
// Original Selection found. Replace old one
err = ProValueFree(*p_value);
TEST_CALL_REPORT("ProValueFree()",
"ProUtilValueReplaceSelection()", err, 0);
err = ProValueAlloc(p_value);
TEST_CALL_REPORT("ProValueAlloc()",
"ProUtilValueReplaceSelection()", err, err != PRO_TK_NO_ERROR);
new_data.type = PRO_VALUE_TYPE_SELECTION;
new_data.type = PRO_VALUE_TYPE_SELECTION;
new_data.v.r = new_sel;
err = ProValueDataSet(*p_value, &new_data);
TEST_CALL_REPORT("ProValueDataSet()",
"ProUtilValueReplaceSelection()", err, err != PRO_TK_NO_ERROR);
return (err);
}
*/
/*====================================================================*\
FUNCTION : ProUtilElemtreeReplaceSelection
PURPOSE : Replace selection for elemtree
\*====================================================================*/
ProError ProUtilElemtreeReplaceSelection(
ProElement elem_tree,
ProUtilChahgeSelection user_func,
ProAppData appdata)
{
ProError err;
ElemtreeElement *p_elems;
int i, j, n_elems, n_val;
ProValue value, *p_values;
ProBoolean replace, is_multi;
err = ProUtilCollectElemtreeElements(elem_tree, NULL, &p_elems);
if (err != PRO_TK_NO_ERROR)
return (err);
err = ProArraySizeGet((ProArray)p_elems, &n_elems);
TEST_CALL_REPORT("ProArraySizeGet()",
"ProUtilElemtreeReplaceSelection()", err, err != PRO_TK_NO_ERROR);
for(i=0; i<n_elems; i++)
{
if (ProUtilElemWithSelectionFilter(elem_tree, p_elems[i].p_element,
p_elems[i].p_elempath) != PRO_TK_NO_ERROR)
continue;
err = ProElementIsMultival(p_elems[i].p_element, NULL, &is_multi);
TEST_CALL_REPORT("ProElementIsMultival()",
"ProUtilElemtreeReplaceSelection()",
err, err != PRO_TK_NO_ERROR);
replace =PRO_B_FALSE;
if (is_multi)
{
ProReference* p_references;
ProElementReferencesGet(p_elems[i].p_element, NULL, &p_references);
TEST_CALL_REPORT("ProElementReferencesGet()",
"ProUtilElemtreeReplaceSelection()",
err, err != PRO_TK_NO_ERROR);
err = ProArraySizeGet((ProArray)p_references, &n_val);
TEST_CALL_REPORT("ProArraySizeGet()",
"ProUtilElemtreeReplaceSelection()",
err, err != PRO_TK_NO_ERROR);
for (j=0; j<n_val; j++)
{
ProSelection old_sel, new_sel;
err = ProReferenceToSelection(p_references[j], &old_sel);
TEST_CALL_REPORT("ProReferenceToSelection()",
"ProUtilElemtreeReplaceSelection()",
err, err != PRO_TK_NO_ERROR);
err = user_func(old_sel, &new_sel, appdata);
if (err == PRO_TK_NO_ERROR)
{
replace = PRO_B_TRUE;
err = ProSelectionToReference(new_sel, &p_references[j]);
TEST_CALL_REPORT("ProSelectionToReference()",
"ProUtilElemtreeReplaceSelection()",
err, err != PRO_TK_NO_ERROR);
}
}
if (replace == PRO_B_TRUE)
{
ProElementReferencesSet(p_elems[i].p_element, p_references);
TEST_CALL_REPORT("ProElementReferencesSet()",
"ProUtilElemtreeReplaceSelection()",
err, err != PRO_TK_NO_ERROR);
}
ProReferencearrayFree((ProArray*)&p_references);
TEST_CALL_REPORT("ProReferencearrayFree()",
"ProUtilElemtreeReplaceSelection()",
err, err != PRO_TK_NO_ERROR);
}
else
{
ProReference p_reference;
ProSelection old_sel2, new_sel2;
ProElementReferenceGet(p_elems[i].p_element, NULL, &p_reference);
TEST_CALL_REPORT("ProElementReferenceGet()",
"ProUtilElemtreeReplaceSelection()",
err, err != PRO_TK_NO_ERROR);
err = ProReferenceToSelection(p_reference, &old_sel2);
TEST_CALL_REPORT("ProReferenceToSelection()",
"ProUtilElemtreeReplaceSelection()",
err, err != PRO_TK_NO_ERROR);
err = user_func(old_sel2, &new_sel2, appdata);
if (err == PRO_TK_NO_ERROR)
{
replace = PRO_B_TRUE;
err = ProSelectionToReference(new_sel2, &p_reference);
TEST_CALL_REPORT("ProSelectionToReference()",
"ProUtilElemtreeReplaceSelection()",
err, err != PRO_TK_NO_ERROR);
ProElementReferenceSet(p_elems[i].p_element, p_reference);
TEST_CALL_REPORT("ProElementReferenceSet()",
"ProUtilElemtreeReplaceSelection()",
err, err != PRO_TK_NO_ERROR);
}
}
}
err = ProUtilElemtreeElementArrayFree(&p_elems);
return (err);
}
/*=============================================================*\
Function: ProUtilElemtreeCreate
Purpose: Create element tree by the ElemTreeData structure
Return : PRO_TK_NO_ERROR if successfull,
\*=============================================================*/
ProError ProUtilElemtreeCreate(
ElemTreeData *elemarr, /* In : The array of ElemTreeData */
int n_elem, /* In : number of ElemTreeData in elemarr */
ProElement base_tree, /* In : the base tree */
ProElement *elem_tree) /* Out : element tree */
{
ProElement elem_level[10], elem;
ProValue value;
int i, type;
ProError err;
ProValueDataType data_type;
ProSelection sel_1;
ProReference ref_1;
if (base_tree!=NULL)
elem_level[0] = base_tree;
for (i=0; i<n_elem; i++)
{
err = ProElementAlloc((ProElemId)elemarr[i].elem_id, &elem);
TEST_CALL_REPORT("ProElementAlloc()",
"ProUtilElemtreeCreate()", err, err != PRO_TK_NO_ERROR);
if (err != PRO_TK_NO_ERROR)
return (err);
if (elemarr[i].data.type != -1)
{
/*----------------------------------------------------------*\
Add Element value
\*----------------------------------------------------------*/
type = elemarr[i].data.type;
switch(type)
{
case PRO_VALUE_TYPE_INT :
{
ProElementIntegerSet(elem, elemarr[i].data.v.i);
break;
}
case PRO_VALUE_TYPE_DOUBLE :
{
ProElementDoubleSet(elem, elemarr[i].data.v.d);
break;
}
case PRO_VALUE_TYPE_POINTER :
{
ProElementSpecialvalueSet(elem, (ProAppData*)elemarr[i].data.v.p);
break;
}
case PRO_VALUE_TYPE_STRING :
{
ProElementStringSet(elem, (char*)elemarr[i].data.v.s);
break;
}
case PRO_VALUE_TYPE_WSTRING :
{
ProElementWstringSet(elem, (wchar_t*)elemarr[i].data.v.w);
break;
}
case PRO_VALUE_TYPE_SELECTION :
{
ProSelectionToReference(elemarr[i].data.v.r, &ref_1);
ProElementReferenceSet(elem, ref_1);
break;
}
case PRO_VALUE_TYPE_TRANSFORM :
{
ProElementTransformSet(elem, (double (*)[4])elemarr[i].data.v.t);
break;
}
case PRO_VALUE_TYPE_BOOLEAN :
{
ProElementBooleanSet(elem, elemarr[i].data.v.b);
break;
}
}
}
/*----------------------------------------------------------*\
Add Element to the tree
\*----------------------------------------------------------*/
if (elemarr[i].level!=0)
{
err = ProElemtreeElementAdd(elem_level[elemarr[i].level-1], NULL,
elem);
TEST_CALL_REPORT("ProElemtreeElementAdd()",
"ProUtilElemtreeCreate()", err, err != PRO_TK_NO_ERROR);
}
elem_level[elemarr[i].level] = elem;
}
elem_tree[0] = elem_level[0];
return (PRO_TK_NO_ERROR);
}
/*=============================================================*\
Function: ProUtilElemtreeElementGet
Purpose: Find Element by array of elempathitems
\*=============================================================*/
ProError ProUtilElemtreeElementGet(
ProElement elem_tree,
ProElempathItem *elempath_data,
int path_size,
ProElement *p_element)
{
ProElempath path;
ProError err, status;
err = ProElempathAlloc(&path);
TEST_CALL_REPORT("ProElempathAlloc()",
"ProUtilElemtreeElementGet()", err, err != PRO_TK_NO_ERROR);
err = ProElempathDataSet(path, elempath_data, path_size);
TEST_CALL_REPORT("ProElempathDataSet()",
"ProUtilElemtreeElementGet()", err, err != PRO_TK_NO_ERROR);
err = ProElemtreeElementGet(elem_tree, path, p_element);
TEST_CALL_REPORT("ProElemtreeElementGet()",
"ProUtilElemtreeElementGet()", err, err != PRO_TK_NO_ERROR &&
err != PRO_TK_E_NOT_FOUND);
status = ProElempathFree(&path);
TEST_CALL_REPORT("ProElempathFree()",
"ProUtilElemtreeElementGet()", status, status != PRO_TK_NO_ERROR);
return(err);
}
/*====================================================================*\
FUNCTION : ProUtilFeatErrsPrint
PURPOSE : Prints feature errors
\*====================================================================*/
ProError ProUtilFeatErrsPrint(ProErrorlist *errs)
{
int i;
for (i=0; i<errs->error_number; i++)
{
ProTKPrintf("Error %d: Error ID %d, Type %d, Error %d\n",
i+1,errs->error_list[i].err_item_id,
errs->error_list[i].err_item_type,
errs->error_list[i].error);
}
return(PRO_TK_NO_ERROR);
}
/*====================================================================*\
FUNCTION : ProUtilElementValueSet()
PURPOSE : Replace an element value by new one
\*====================================================================*/
ProError ProUtilElementValueSet(
ProElement element,
ProValueData *value_data)
{
ProError err;
ProValue value;
ProError status;
ProValueDataType value_type;
ProReference ref;
switch(value_data->type)
{
case PRO_VALUE_TYPE_INT :
status = ProElementIntegerSet( element, value_data->v.i);
TEST_CALL_REPORT("ProElementIntegerSet", "ProUtilElementValueSet",
status, status != PRO_TK_NO_ERROR );
break;
case PRO_VALUE_TYPE_DOUBLE:
status = ProElementDoubleSet( element, value_data->v.d);
TEST_CALL_REPORT("ProElementDoubleSet", "ProUtilElementValueSet",
status, status != PRO_TK_NO_ERROR );
break;
case PRO_VALUE_TYPE_POINTER:
status = ProElementSpecialvalueSet( element, value_data->v.p);
TEST_CALL_REPORT("ProElementSpecialvalueSet", "ProUtilElementValueSet",
status, status != PRO_TK_NO_ERROR );
break;
case PRO_VALUE_TYPE_STRING:
status = ProElementStringSet( element, value_data->v.s);
TEST_CALL_REPORT("ProElementStringSet", "ProUtilElementValueSet",
status, status != PRO_TK_NO_ERROR );
break;
case PRO_VALUE_TYPE_WSTRING:
status = ProElementWstringSet( element, value_data->v.w);
TEST_CALL_REPORT("ProElementWstringSet", "ProUtilElementValueSet",
status, status != PRO_TK_NO_ERROR );
break;
case PRO_VALUE_TYPE_SELECTION:
ProSelectionToReference(value_data->v.r, &ref);
status = ProElementReferenceSet( element, ref);
TEST_CALL_REPORT("ProElementReferenceSet", "ProUtilElementValueSet",
status, status != PRO_TK_NO_ERROR );
break;
case PRO_VALUE_TYPE_TRANSFORM:
status = ProElementTransformSet( element, (double (*)[4])(value_data->v.t));
TEST_CALL_REPORT("ProElementTransformSet", "ProUtilElementValueSet",
status, status != PRO_TK_NO_ERROR );
break;
case PRO_VALUE_TYPE_BOOLEAN:
status = ProElementBooleanSet( element, value_data->v.b);
TEST_CALL_REPORT("ProElementBooleanSet", "ProUtilElementValueSet",
status, status != PRO_TK_NO_ERROR );
break;
}
return(PRO_TK_NO_ERROR);
}
ProError ProUtilElementFeatTypeGet(ProFeature *feat, ProElemId *name_id)
{
ProError status;
UtilElemData elem_data;
ProElempathItem feat_elem_path [] =
{
{ PRO_ELEM_PATH_ITEM_TYPE_ID, PRO_E_FEATURE_TYPE}
};
status = ProUtilElementFeatDataGet(*feat, feat_elem_path, 1, &elem_data);
if(PRO_TK_NO_ERROR == status)
*name_id = elem_data.val.i;
return status;
}
/*===============================================================*\
FUNCTION : ProUtilElementFeatDataGet
PURPOSE : Fill the element data from the element path of a feature
\*===============================================================*/
ProError ProUtilElementFeatDataGet(ProFeature feature,
ProElempathItem ref_path_items[], int num_path_ele,
UtilElemData *elem_data)
{
ProError status,err;
ProElement created_elemtree;
ProAsmcomppath *p_comp_path = NULL;
status = ProFeatureElemtreeExtract (&feature, p_comp_path,
PRO_FEAT_EXTRACT_NO_OPTS, &created_elemtree);
if(status != PRO_TK_NO_ERROR)
return status;
status = ProUtilElementTreeDataGet(created_elemtree, ref_path_items, num_path_ele,
elem_data);
ProElementFree(&created_elemtree);
return status;
}
/*===============================================================*\
FUNCTION : ProUtilElementTreeDataGet
PURPOSE : Fill the element data from the element tree
\*===============================================================*/
ProError ProUtilElementTreeDataGet(ProElement created_elemtree,
ProElempathItem ref_path_items[], int num_path_ele,
UtilElemData *elem_data)
{
ProError status;
ProElement element = NULL;
ProElempath path;
ProValue p_value;
ProValueDataType value_type = PRO_VALUE_TYPE_INT;
ProElemId elem_id;
status = ProElempathAlloc(&path);
status = ProElempathDataSet(path, ref_path_items, num_path_ele);
status = ProElemtreeElementGet (created_elemtree, path, &element);
status = ProElementIdGet( element, &elem_id);
status = ProElementValuetypeGet ( element, &value_type );
if(status != PRO_TK_NO_ERROR)
return PRO_TK_NO_ERROR;
status = ProUtilElementValueGet(element, elem_data);
status = ProElempathFree (&path);
return status;
}
/*===============================================================*\
FUNCTION : ProUtilElementValueGet
PURPOSE : Get the element value from the element
\*===============================================================*/
ProError ProUtilElementValueGet(ProElement element, UtilElemData *elem_data)
{
ProError status;
ProValueDataType value_type = PRO_VALUE_TYPE_INT;
ProElemId elem_id;
ProReference ref;
status = ProElementIdGet( element, &elem_id);
if ( elem_id == PRO_E_FEATURE_TREE || elem_id < 1)
return PRO_TK_NO_ERROR;
status = ProElementValuetypeGet ( element, &value_type );
if(status != PRO_TK_NO_ERROR)
return PRO_TK_NO_ERROR;
if ( ( elem_id == PRO_E_STD_CURVE_COLLECTION_APPL ) ||
( elem_id == PRO_E_STD_SURF_COLLECTION_APPL ) )
{
elem_data->type = ELEM_VALUE_TYPE_COLLECTION;
}
else
elem_data->type = (UtilElemType)value_type;
switch(elem_data->type)
{
case ELEM_VALUE_TYPE_INT :
status = ProElementIntegerGet( element,
( ProElementIntegerOptions) NULL, &(elem_data->val.i));
TEST_CALL_REPORT("ProElementIntegerGet", "ProUtilElementValueGet",
status, status != PRO_TK_NO_ERROR );
break;
case ELEM_VALUE_TYPE_DOUBLE:
status = ProElementDoubleGet( element,
( ProElementDoubleOptions) NULL, &(elem_data->val.d));
TEST_CALL_REPORT("ProElementDoubleGet", "ProUtilElementValueGet",
status, status != PRO_TK_NO_ERROR );
break;
case ELEM_VALUE_TYPE_POINTER:
status = ProElementSpecialvalueGet( element,
( ProElementSpecialOptions) NULL, &(elem_data->val.p));
TEST_CALL_REPORT("ProElementDoubleGet", "ProUtilElementValueGet",
status, status != PRO_TK_NO_ERROR );
break;
case ELEM_VALUE_TYPE_STRING:
status = ProElementStringGet( element,
( ProElementStringOptions) NULL, &(elem_data->val.s));
TEST_CALL_REPORT("ProElementDoubleGet", "ProUtilElementValueGet",
status, status != PRO_TK_NO_ERROR );
break;
case ELEM_VALUE_TYPE_WSTRING:
status = ProElementWstringGet( element,
( ProElementWstringOptions) NULL, &(elem_data->val.w));
TEST_CALL_REPORT("ProElementWstringGet", "ProUtilElementValueGet",
status, status != PRO_TK_NO_ERROR );
break;
case ELEM_VALUE_TYPE_SELECTION:
status = ProElementReferenceGet( element,
(ProElementReferenceOptions) NULL, &ref);
TEST_CALL_REPORT("ProElementReferenceGet", "ProUtilElementValueGet",
status, status != PRO_TK_NO_ERROR );
status = ProReferenceToSelection(ref, &(elem_data->val.r));
break;
case ELEM_VALUE_TYPE_TRANSFORM:
status = ProElementTransformGet( element,
(ProElementTransformOptions) NULL, (double (*)[4])(elem_data->val.t));
TEST_CALL_REPORT("ProElementTransformGet", "ProUtilElementValueGet",
status, status != PRO_TK_NO_ERROR );
break;
case ELEM_VALUE_TYPE_BOOLEAN:
status = ProElementBooleanGet( element,
(ProElementBooleanOptions) NULL, &(elem_data->val.b));
TEST_CALL_REPORT("ProElementBooleanGet", "ProUtilElementValueGet",
status, status != PRO_TK_NO_ERROR );
break;
case ELEM_VALUE_TYPE_COLLECTION:
status = ProElementCollectionGet( element,
(ProCollectionGetOptions) NULL, &(elem_data->val.collection));
TEST_CALL_REPORT("ProElementCollectionGet", "ProUtilElementValueGet",
status, status != PRO_TK_NO_ERROR );
break;
default:
printf("NOT SUPPORTED FOR OTHER TYPE ..");
}
return status;
}
/*===============================================================*\
FUNCTION : ProUtilElemtreeElementAdd
PURPOSE : Add the element in the element tree
Incase of integer, double and boolean pass the value,
In other cases, pass the pointer.
\*===============================================================*/
ProError ProUtilElemtreeElementAdd( ProElement parent_element, ProElemId child_id_name,
UtilElemType elem_type, ProAppData app_data)
{
ProError status = PRO_TK_NO_ERROR;
ProReference ref;
double *dbl_val;
int *int_val; /* integer */
ProBoolean *bool_val; /* boolean */
ProElement child_element;
status = ProElementAlloc ( child_id_name, &child_element);
switch(elem_type)
{
case ELEM_VALUE_TYPE_INT :
int_val = (int *)app_data;
status = ProElementIntegerSet( child_element, *int_val);
TEST_CALL_REPORT("ProElementIntegerSet", "ProUtilElemtreeElementAdd",
status, status != PRO_TK_NO_ERROR );
break;
case ELEM_VALUE_TYPE_DOUBLE:
dbl_val = (double *)(app_data);
status = ProElementDoubleSet( child_element, *dbl_val);
TEST_CALL_REPORT("ProElementDoubleSet", "ProUtilElemtreeElementAdd",
status, status != PRO_TK_NO_ERROR );
break;
case ELEM_VALUE_TYPE_POINTER:
status = ProElementSpecialvalueSet( child_element, (void *)(app_data));
TEST_CALL_REPORT("ProElementSpecialvalueSet", "ProUtilElemtreeElementAdd",
status, status != PRO_TK_NO_ERROR );
break;
case ELEM_VALUE_TYPE_STRING:
status = ProElementStringSet( child_element, (char *)(app_data));
TEST_CALL_REPORT("ProElementStringSet", "ProUtilElemtreeElementAdd",
status, status != PRO_TK_NO_ERROR );
break;
case ELEM_VALUE_TYPE_WSTRING:
status = ProElementWstringSet( child_element, (wchar_t *)(app_data));
TEST_CALL_REPORT("ProElementWstringSet", "ProUtilElemtreeElementAdd",
status, status != PRO_TK_NO_ERROR );
break;
case ELEM_VALUE_TYPE_SELECTION:
status = ProSelectionToReference((ProSelection)(app_data), &ref);
status = ProElementReferenceSet( child_element, ref);
TEST_CALL_REPORT("ProSelectionToReference", "ProUtilElemtreeElementAdd",
status, status != PRO_TK_NO_ERROR );
break;
case ELEM_VALUE_TYPE_TRANSFORM:
status = ProElementTransformSet( child_element, (double (*)[4])((app_data)));
TEST_CALL_REPORT("ProElementTransformSet", "ProUtilElemtreeElementAdd",
status, status != PRO_TK_NO_ERROR );
break;
case ELEM_VALUE_TYPE_BOOLEAN:
bool_val = (ProBoolean *)(app_data);
status = ProElementBooleanSet( child_element, *bool_val);
TEST_CALL_REPORT("ProElementBooleanSet", "ProUtilElemtreeElementAdd",
status, status != PRO_TK_NO_ERROR );
break;
case ELEM_VALUE_TYPE_COLLECTION:
status = ProElementCollectionSet( child_element, (ProCollection)(app_data));
TEST_CALL_REPORT("ProElementCollectionSet", "ProUtilElemtreeElementAdd",
status, status != PRO_TK_NO_ERROR );
break;
default:
status = PRO_TK_GENERAL_ERROR;
printf("NOT SUPPORTED FOR OTHER TYPE ..");
break;
}
if(PRO_TK_NO_ERROR != status)
return status;
status = ProElemtreeElementAdd ( parent_element, NULL, child_element );
return status;
}
ProError ProUtilSketchFeatureReset(ProFeature* feat, ProSection *section)
{
ProError status;
ProElement elem_tree, elem;
ProElempath elem_path;
ProFeatureCreateOptions *opts = 0;
ProErrorlist err_list;
ProElempathItem sketch_path_item[] = {
{PRO_ELEM_PATH_ITEM_TYPE_ID, PRO_E_STD_SECTION},
{PRO_ELEM_PATH_ITEM_TYPE_ID, PRO_E_SKETCHER}
};
status = ProFeatureElemtreeExtract (feat, NULL,
PRO_FEAT_EXTRACT_NO_OPTS, &elem_tree );
status = ProElempathAlloc(&elem_path);
status = ProElempathDataSet(elem_path, sketch_path_item, 2);
status = ProElemtreeElementGet(elem_tree, elem_path, &elem);
status = ProElementSpecialvalueSet(elem, (ProAppData)*section);
status = ProElemtreeElementAdd(elem_tree, elem_path, elem);
status = ProArrayAlloc(1,sizeof(ProFeatureCreateOptions),
1, (ProArray*)&opts);
opts[0]= PRO_FEAT_CR_NO_OPTS;
status = ProFeatureWithoptionsRedefine(NULL, feat, elem_tree,
opts, PRO_REGEN_NO_FLAGS, &err_list);
TEST_CALL_REPORT("ProFeatureWithoptionsRedefine", "ProUtilSketchFeatureReset",
status, status != PRO_TK_NO_ERROR );
status = ProArrayFree((ProArray*)&opts);
return status;
}
/*===============================================================*\
FUNCTION : ProUtilElementValueDataFree
PURPOSE : Get the element value from the element
\*===============================================================*/
ProError ProUtilElementValueDataFree(UtilElemData *elem_data)
{
ProError status = PRO_TK_NO_ERROR;
switch(elem_data->type)
{
case ELEM_VALUE_TYPE_STRING:
status = ProStringFree( elem_data->val.s);
TEST_CALL_REPORT("ProStringFree", "ProUtilElementValueDataFree",
status, status != PRO_TK_NO_ERROR );
break;
case ELEM_VALUE_TYPE_WSTRING:
ProWstringFree (elem_data->val.w);
TEST_CALL_REPORT("ProWstringFree", "ProUtilElementValueDataFree",
status, status != PRO_TK_NO_ERROR );
break;
case ELEM_VALUE_TYPE_SELECTION:
status = ProSelectionFree (&(elem_data->val.r));
TEST_CALL_REPORT("ProSelectionFree", "ProUtilElementValueDataFree",
status, status != PRO_TK_NO_ERROR );
break;
case ELEM_VALUE_TYPE_COLLECTION:
status = ProCollectionFree ( &(elem_data->val.collection));
TEST_CALL_REPORT("ProCollectionFree", "ProUtilElementValueDataFree",
status, status != PRO_TK_NO_ERROR );
break;
default:
ProTKPrintf("Not Applicable");
/* Not applicable for other types */
}
return status;
}