/*
Copyright (c) 2019 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved.
*/
#include "ProToolkit.h"
#include "ProRelSet.h"
#include "ProModelitem.h"
#include "ProSelection.h"
#include "ProMessage.h"
#include "ProUtil.h"
#include "ProSolid.h"
#include "UtilString.h"
#include "TestError.h"
#define RELSFILE "rels.txt"
#define MSGFILE "msg_ugutils.txt"
/*--------------------------------------------------------------------------*\
FUNCTION : UserRelsEdit()
PURPOSE : Top Level of this example : initializes data, gets the relsets,
invokes the edition function.
\*--------------------------------------------------------------------------*/
ProError UserRelsEdit()
{
int status, status2;
int n_sel;
int xar_size;
ProSelection * p_sel_arr;
ProModelitem mdlitem;
ProRelset relset;
ProWstring * rels_xar;
ProWstring * rels_xar2;
ProPath wrels_file;
ProFileName wmsgfile;
ProSolid solid;
ProStringToWstring(wmsgfile, MSGFILE);
/*--------------------------------------------------------------------------*\
Ask for selecting an item that contains relations to edit
\*--------------------------------------------------------------------------*/
status = ProSelect("part,asm,datum,feature,edge",
1, NULL,NULL,NULL,NULL, &p_sel_arr, &n_sel);
ERROR_CHECK("UserRelsEdit","ProSelect",status);
if (status != PRO_TK_NO_ERROR) return (status);
/*--------------------------------------------------------------------------*\
Extract the relations out of the selected modelitem
\*--------------------------------------------------------------------------*/
status = ProSelectionModelitemGet(*p_sel_arr, &mdlitem);
ERROR_CHECK("UserRelsEdit","ProSelectionModelitemGet",status);
if (status != PRO_TK_NO_ERROR) return (status);
status = ProModelitemToRelset(&mdlitem, &relset);
ERROR_CHECK("UserRelsEdit","ProModelitemToRelset",status);
if (status != PRO_TK_NO_ERROR)
{
/* If the selection doesn't contain relations, notify and quit */
status2 = ProMessageDisplay (wmsgfile,
"USER Selected item does not contain any relation");
ERROR_CHECK("UserRelsEdit","ProMessageDisplay",status2);
if (status2 != PRO_TK_NO_ERROR) return (status2);
return (status);
}
status = ProArrayAlloc (0, sizeof(ProWstring), 1, (ProArray*)&rels_xar);
ERROR_CHECK("UserRelsEdit","ProArrayAlloc", status);
if (status != PRO_TK_NO_ERROR) return status;
status = ProRelsetRelationsGet(&relset, &rels_xar);
ERROR_CHECK("UserRelsEdit","ProRelsetRelationsGet",status);
if (status != PRO_TK_NO_ERROR) return status;
/*--------------------------------------------------------------------------*\
Write the relations to a file, edit that file, and reload the new relations
\*--------------------------------------------------------------------------*/
ProStringToWstring(wrels_file, RELSFILE);
status = ProUtilWstringArrayToFile(rels_xar, wrels_file);
ERROR_CHECK("UserRelsEdit","ProUtilWstringArrayToFile",status);
if (status != PRO_TK_NO_ERROR) return (status);
status = ProFileEdit(wrels_file);
ERROR_CHECK("UserRelsEdit","ProFileEdut",status);
if (status != PRO_TK_NO_ERROR) return (status);
status = ProArrayAlloc(0, sizeof(ProWstring), 1, (ProArray*)&rels_xar2);
ERROR_CHECK("UserRelsEdit","ProArrayAlloc",status);
if (status != PRO_TK_NO_ERROR) return (status);
status = ProUtilFileToWstringArray(wrels_file, &rels_xar2);
ERROR_CHECK("UserRelsEdit","ProUtilFileToWstringArray",status);
if (status != PRO_TK_NO_ERROR) return (status);
status = ProArraySizeGet(rels_xar2, &xar_size);
ERROR_CHECK("UserRelsEdit","ProArraySizeGet",status);
if (status != PRO_TK_NO_ERROR) return (status);
status = ProRelsetRelationsSet(&relset, rels_xar2, xar_size);
ERROR_CHECK("UserRelsEdit","ProRelsetRelationsSet",status);
if (status != PRO_TK_NO_ERROR) return (status);
/*--------------------------------------------------------------------------*\
Try to regenerate the relations set. If it fails, restore the
initial relations and regenerate again
\*--------------------------------------------------------------------------*/
status = ProRelsetRegenerate(&relset);
ERROR_CHECK("UserRelsEdit","ProRelsetRegenerate",status);
if (status != PRO_TK_NO_ERROR)
{
status2 = ProMessageDisplay(wmsgfile,
"USER New relations are not valid. Replacing with old ones.");
ERROR_CHECK("UserRelsEdit","ProMessageDisplay",status2);
if (status2 != PRO_TK_NO_ERROR) return (status2);
status2 = ProRelsetRelationsSet(&relset, rels_xar, xar_size);
ERROR_CHECK("UserRelsEdit","ProRelsetRelationsSet",status2);
if (status2 != PRO_TK_NO_ERROR) return (status2);
status2 = ProRelsetRegenerate(&relset);
ERROR_CHECK("UserRelsEdit","ProRelsetRegenerate",status2);
if (status2 != PRO_TK_NO_ERROR) return (status2);
return (status);
}
/*--------------------------------------------------------------------------*\
Regenerate and repaint the solid so we can see the changes
\*--------------------------------------------------------------------------*/
status = ProMdlCurrentGet((ProMdl*)&solid);
ERROR_CHECK("UserRelsEdit","ProMdlCurrentGet",status);
if (status != PRO_TK_NO_ERROR) return (status);
status = ProSolidRegenerate(solid, PRO_B_TRUE);
ERROR_CHECK("UserRelsEdit","ProSolidRegenerate",status);
if (status != PRO_TK_NO_ERROR) return (status);
status = ProWindowRepaint(PRO_VALUE_UNUSED);
ERROR_CHECK("UserRelsEdit","ProWindowRepaint",status);
if (status != PRO_TK_NO_ERROR) return (status);
/*--------------------------------------------------------------------------*\
Deallocate the memory used by the temporary arrays
\*--------------------------------------------------------------------------*/
status = ProArrayFree((ProArray *)&rels_xar);
ERROR_CHECK("UserRelsEdit","ProArrayFree",status);
if (status != PRO_TK_NO_ERROR) return (status);
status = ProArrayFree((ProArray *)&rels_xar2);
ERROR_CHECK("UserRelsEdit","ProArrayFree",status);
if (status != PRO_TK_NO_ERROR) return (status);
status = ProMessageDisplay(wmsgfile, "USER Relations replaced successfully.");
ERROR_CHECK("UserRelsEdit","ProMessageDisplay",status);
if (status != PRO_TK_NO_ERROR) return (status);
return (PRO_TK_NO_ERROR);
}