/*
Copyright (c) 2019 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved.
*/
#include <ProToolkit.h>
#include <ProAsmcomp.h>
#include <ProMessage.h>
#include <ProSolid.h>
#include <ProArray.h>
#include <ProPopupmenu.h>
#include <ProMenuBar.h>
#include <ProSelection.h>
#include <PTApplsUnicodeUtils.h>
#include <ProModelitem.h>
#include <ProUtil.h>
#include <UtilFiles.h>
#include <TestError.h>
#include <ProSelbuffer.h>
#include <UtilString.h>
#define MSGFIL L##"msg_ugasmcomp.txt"
/*-----------------------------------------------------------------*\
Prototypes
\*-----------------------------------------------------------------*/
ProError UserAsmcompConstraintsHighlight (ProAsmcomp* asmcomp);
ProError UserOpenComponent (ProSolid* solid);
void UserConstraintTypeToString (ProAsmcompConstrType type,
char* type_string);
ProError UgSelectAsmIntent(ProAssembly asm_model, ProSolid comp_model, ProType constr_type, ProAsmcompconstraint** constraints);
/*=====================================================================*\
FUNCTION: UserAssembleByDatums
PURPOSE: Assemble a component by aligning named datums.
\*=====================================================================*/
ProError UserAssembleByDatums (ProAssembly asm_model, ProSolid comp_model)
{
ProError status;
ProName asm_datums [3];
ProName comp_datums [3];
ProMatrix identity_matrix = {{ 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}};
ProAsmcomp asmcomp;
ProAsmcompconstraint* constraints;
ProAsmcompconstraint constraint;
int i;
ProBoolean interact_flag = PRO_B_FALSE;
ProModelitem asm_datum, comp_datum;
ProSelection asm_sel, comp_sel;
ProAsmcomppath comp_path;
ProIdTable c_id_table;
c_id_table [0] = -1;
/*-----------------------------------------------------------------*\
Set up the arrays of datum names
\*-----------------------------------------------------------------*/
ProStringToWstring (asm_datums [0], "ASM_D_FRONT");
ProStringToWstring (asm_datums [1], "ASM_D_TOP");
ProStringToWstring (asm_datums [2], "ASM_D_RIGHT");
ProStringToWstring (comp_datums [0], "COMP_D_FRONT");
ProStringToWstring (comp_datums [1], "COMP_D_TOP");
ProStringToWstring (comp_datums [2], "COMP_D_RIGHT");
/*-----------------------------------------------------------------*\
Package the component initially
\*-----------------------------------------------------------------*/
ProAsmcompAssemble (asm_model, comp_model, identity_matrix, &asmcomp);
/*-----------------------------------------------------------------*\
Prepare the constraints array
\*-----------------------------------------------------------------*/
ProArrayAlloc (0, sizeof (ProAsmcompconstraint), 1, (ProArray*)&constraints);
for (i = 0; i < 3; i++)
{
/*-----------------------------------------------------------------*\
Find the assembly datum
\*-----------------------------------------------------------------*/
status = ProModelitemByNameInit (asm_model, PRO_SURFACE, asm_datums [i], &asm_datum);
if (status != PRO_TK_NO_ERROR)
{
interact_flag = PRO_B_TRUE;
continue;
}
ProTKPrintf ("Item type = %d, PRO_SURFACE = %d\n", asm_datum.type, PRO_SURFACE);
fflush (stdout);
/*-----------------------------------------------------------------*\
Find the component datum
\*-----------------------------------------------------------------*/
status = ProModelitemByNameInit (comp_model, PRO_SURFACE, comp_datums [i], &comp_datum);
if (status != PRO_TK_NO_ERROR)
{
interact_flag = PRO_B_TRUE;
continue;
}
ProTKPrintf ("Item type = %d, PRO_SURFACE = %d\n", comp_datum.type, PRO_SURFACE);
fflush (stdout);
/*-----------------------------------------------------------------*\
For the assembly reference, initialize a component path.
This is necessary even if the reference geometry is in the assembly.
\*-----------------------------------------------------------------*/
status = ProAsmcomppathInit (asm_model, c_id_table, 0, &comp_path);
ERROR_CHECK ("ProAsmcomppathInit()", "UserAssembleByDatums", status);
/*-----------------------------------------------------------------*\
Allocate the references
\*-----------------------------------------------------------------*/
status = ProSelectionAlloc (&comp_path, &asm_datum, &asm_sel);
status = ProSelectionAlloc (NULL, &comp_datum, &comp_sel);
/*-----------------------------------------------------------------*\
Allocate and fill the constraint.
\*-----------------------------------------------------------------*/
status = ProAsmcompconstraintAlloc (&constraint);
status = ProAsmcompconstraintTypeSet (constraint, PRO_ASM_ALIGN);
status = ProAsmcompconstraintAsmreferenceSet (constraint, asm_sel, PRO_DATUM_SIDE_YELLOW);
status = ProAsmcompconstraintCompreferenceSet (constraint, comp_sel, PRO_DATUM_SIDE_YELLOW);
status = ProArrayObjectAdd ((ProArray*)&constraints, -1, 1, &constraint);
}
/*-----------------------------------------------------------------*\
Set the assembly component constraints and regenerate the assembly.
\*-----------------------------------------------------------------*/
status = ProAsmcompConstraintsSet (NULL, &asmcomp, constraints);
ERROR_CHECK ("ProAsmcompConstraintsSet()", "UserAssembleByDatums", status);
ProSolidRegenerate (asmcomp.owner, PRO_REGEN_ALLOW_CONFIRM);
/*-----------------------------------------------------------------*\
If any of the expect datums was not found, prompt the user to constrain
the new component.
\*-----------------------------------------------------------------*/
if (interact_flag)
{
ProMessageDisplay (MSGFIL,
"USER Unable to locate all standard datum references. New component is packaged.");
ProAsmcompConstrRedefUI (&asmcomp);
}
return (PRO_TK_NO_ERROR);
}
/*=====================================================================*\
FUNCTION: UserAssemble
PURPOSE: Menu action to assemble a component
\*=====================================================================*/
ProError UserAssemble ()
{
ProAssembly top_level_asm;
ProSolid comp_model;
ProError status;
ProMdlCurrentGet ((ProMdl*)&top_level_asm);
status = UserOpenComponent (&comp_model);
if (status != PRO_TK_NO_ERROR)
return status;
UserAssembleByDatums (top_level_asm, comp_model);
ProWindowRepaint (-1);
ProTreetoolRefresh (top_level_asm);
return PRO_TK_NO_ERROR;
}
/*=====================================================================*\
FUNCTION: UgAssembleByIntent
PURPOSE: Set constraints after assembling a component using intents
\*=====================================================================*/
ProError UgAssembleByIntent (ProAssembly asm_model, ProSolid comp_model)
{
ProError status;
ProMatrix identity_matrix = {{ 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}};
ProAsmcomp asmcomp;
ProAsmcompconstraint* constraints;
ProAsmcompconstraint constraint;
/*-----------------------------------------------------------------*\
Package the component initially
\*-----------------------------------------------------------------*/
status = ProAsmcompAssemble (asm_model, comp_model,
identity_matrix, &asmcomp);
/*-----------------------------------------------------------------*\
Prepare the constraints array
\*-----------------------------------------------------------------*/
status = ProArrayAlloc (0, sizeof (ProAsmcompconstraint), 1,
(ProArray*)&constraints);
/*-----------------------------------------------------------------*\
Set PRO_LOG_PNT constraint in assembly
\*-----------------------------------------------------------------*/
status = UgSelectAsmIntent(asm_model, comp_model, PRO_LOG_PNT,
&constraints);
/*-----------------------------------------------------------------*\
Set PRO_LOG_PLANE constraint in assembly
\*-----------------------------------------------------------------*/
status = UgSelectAsmIntent(asm_model, comp_model, PRO_LOG_PLANE,
&constraints);
/*-----------------------------------------------------------------*\
Set the assembly component constraints and regenerate the assembly.
\*-----------------------------------------------------------------*/
status = ProAsmcompConstraintsSet (NULL, &asmcomp, constraints);
if(status == PRO_TK_NO_ERROR)
ProMessageDisplay (MSGFIL,"Component assembled successfully");
else
return status;
ProSolidRegenerate(asmcomp.owner, PRO_REGEN_ALLOW_CONFIRM);
return (PRO_TK_NO_ERROR);
}
/*=====================================================================*\
FUNCTION: UgSelectAsmIntent
PURPOSE: Assemble a component using intent point and intent plane
\*=====================================================================*/
ProError UgSelectAsmIntent(ProAssembly asm_model, ProSolid comp_model,
ProType constr_type,
ProAsmcompconstraint** constraints)
{
ProError status;
ProAsmcompconstraint constraint;
int i, n_sels;
int asm_point,asm_plane,comp_point,comp_plane;
int constr_point,constr_plane;
ProModelitem asm_datum, comp_datum;
ProSelection asm_sel, comp_sel;
ProAsmcomppath comp_path;
ProSelection* sels = NULL, *sels2 = NULL;
ProMdlName selmdl_name, compmdl_name;
char c_selmdl_name[PRO_MDLNAME_SIZE], c_compmdl_name[PRO_MDLNAME_SIZE];
ProModelitem p_asmintent, p_compintent;
/*-----------------------------------------------------------------*\
Get the intent datum point for the component
\*-----------------------------------------------------------------*/
while (1)
{
/*-----------------------------------------------------------------*\
Find the component intent
\*-----------------------------------------------------------------*/
if(constr_type == PRO_LOG_PNT )
ProMessageDisplay (MSGFIL,"Select the intent point in component");
else if(constr_type == PRO_LOG_PLANE)
ProMessageDisplay (MSGFIL,"Select the intent plane in component");
status = ProSelect ("membfeat", 1, NULL, NULL, NULL, NULL, &sels, &n_sels);
if ((status != PRO_TK_NO_ERROR) || (n_sels < 1))
return status;
status = ProSelectionModelitemGet (sels[0], &comp_datum);
if ((status != PRO_TK_NO_ERROR) || (comp_datum.type != PRO_FEATURE))
return status;
status = ProMdlMdlnameGet(comp_datum.owner, selmdl_name);
ProWstringToString (c_selmdl_name, selmdl_name);
status = ProMdlMdlnameGet(comp_model, compmdl_name);
ProWstringToString (c_compmdl_name, compmdl_name);
if(strcmp(c_compmdl_name,c_selmdl_name) != 0)
continue;
status = ProModelitemInit(comp_datum.owner,(comp_datum.id+1),constr_type,
&p_compintent);
if (status == PRO_TK_NO_ERROR)
break;
}
while(1)
{
/*-----------------------------------------------------------------*\
Find the assembly intent
\*-----------------------------------------------------------------*/
if(constr_type == PRO_LOG_PNT )
ProMessageDisplay (MSGFIL,"Select the intent point in assembly");
else if(constr_type == PRO_LOG_PLANE)
ProMessageDisplay (MSGFIL,"Select the intent plane in assembly");
status = ProSelect ("membfeat", 1, NULL, NULL, NULL, NULL, &sels2,
&n_sels);
if ((status != PRO_TK_NO_ERROR) || (n_sels < 1))
return status;
status = ProSelectionModelitemGet (sels2[0], &asm_datum);
if ((status != PRO_TK_NO_ERROR)|| (asm_datum.type != PRO_FEATURE))
return status;
status = ProSelectionAsmcomppathGet(sels2[0], &comp_path);
if (status != PRO_TK_NO_ERROR)
continue;
status = ProModelitemInit(asm_datum.owner,(asm_datum.id+1),constr_type,
&p_asmintent);
if (status == PRO_TK_NO_ERROR)
break;
}
/*-----------------------------------------------------------------*\
Allocate the references
\*-----------------------------------------------------------------*/
status = ProSelectionAlloc (&comp_path, &p_asmintent, &asm_sel);
status = ProSelectionAlloc (NULL, &p_compintent, &comp_sel);
/*-----------------------------------------------------------------*\
Allocate and fill the constraint.
\*-----------------------------------------------------------------*/
status = ProAsmcompconstraintAlloc (&constraint);
if(constr_type == PRO_LOG_PNT)
ProAsmcompconstraintTypeSet (constraint, PRO_ASM_ALIGN);
else if(constr_type == PRO_LOG_PLANE)
ProAsmcompconstraintTypeSet (constraint, PRO_ASM_ORIENT);
status = ProAsmcompconstraintAsmreferenceSet (constraint, asm_sel,
PRO_DATUM_SIDE_YELLOW);
status = ProAsmcompconstraintCompreferenceSet (constraint, comp_sel,
PRO_DATUM_SIDE_YELLOW);
status = ProArrayObjectAdd ((ProArray*)constraints, -1, 1, &constraint);
return PRO_TK_NO_ERROR;
}
/*=====================================================================*\
FUNCTION: UgAssembleIntent
PURPOSE: Menu action to assemble a component using intent feature
\*=====================================================================*/
ProError UgAssembleIntent ()
{
ProAssembly top_level_asm = NULL;
ProSolid comp_model = NULL;
ProError status;
status = ProMdlCurrentGet ((ProMdl*)&top_level_asm);
if((status != PRO_TK_NO_ERROR) || (top_level_asm == NULL))
{
ProMessageDisplay (MSGFIL, "Failed to open the assembly");
return status;
}
status = UserOpenComponent (&comp_model);
if ((status != PRO_TK_NO_ERROR) || comp_model == NULL )
{
ProMessageDisplay (MSGFIL, "Failed to open the component");
return status;
}
if(top_level_asm && comp_model)
status = UgAssembleByIntent (top_level_asm, comp_model);
ProWindowRepaint (-1);
ProTreetoolRefresh (top_level_asm);
return PRO_TK_NO_ERROR;
}
/*=====================================================================*\
FUNCTION: UserOpenComponent
PURPOSE: Prompt the user to select a component.
\*=====================================================================*/
ProError UserOpenComponent (ProSolid* solid)
{
ProSolid comp;
ProError err, er1;
int version, win_id,sel_n, Oldwin_id;
ProCharLine line, str;
ProLine buff;
ProPath *path_arr, sel_path, def_path, cur_path;
ProName *path_lab_arr;
ProMdlName w_name;
ProMdlExtension w_type;
ProType type;
ProMessageDisplay(MSGFIL, "USER Choose new component to assemble:");
/*-----------------------------------------------------------------*\
Prompt the user to select the file.
\*-----------------------------------------------------------------*/
ProStringToWstring(buff, "*.prt,*.asm");
ProStringToWstring(def_path, ".");
err = ProArrayAlloc(0, sizeof(ProPath), 1, (ProArray*)&path_arr);
err = ProArrayAlloc(0, sizeof(ProPath), 1, (ProArray*)&path_lab_arr);
err = ProFileMdlnameOpen(NULL, buff, path_arr, path_lab_arr, def_path, NULL,
sel_path);
if (err == PRO_TK_NO_ERROR)
{
/*-----------------------------------------------------------------*\
Parse the filename to locate the component model.
\*-----------------------------------------------------------------*/
err = ProFileMdlnameParse(sel_path, def_path, w_name, w_type, &version);
ProUtilWstrcpy(sel_path, def_path);
err = ProPathMdlnameCreate(NULL, w_name, w_type, PRO_VALUE_UNUSED, def_path);
ProWstringToString(str, def_path);
if( ProUtilConfirmNameType(str, line, &type) != PRO_TK_BAD_INPUTS)
{
/*-----------------------------------------------------------------*\
Load the component model.
\*-----------------------------------------------------------------*/
err = ProDirectoryCurrentGet(cur_path);
err = ProDirectoryChange(sel_path);
err = ProMdlnameRetrieve(w_name, (ProMdlfileType)type, (ProMdl*)&comp);
er1 = ProDirectoryChange(cur_path);
if (err != PRO_TK_NO_ERROR)
{
ProMessageDisplay (MSGFIL, "USER Failed to retrieve %0s", str);
}
}
}
/*------------------------------------------------------------------*\
Free allocated memory
\*--------------------------------------------------------------------*/
er1 = ProArrayFree((ProArray*)&path_arr);
er1 = ProArrayFree((ProArray*)&path_lab_arr);
if (err != PRO_TK_NO_ERROR)
return (PRO_TK_BAD_CONTEXT);
*solid = comp;
return PRO_TK_NO_ERROR;
}
/*=====================================================================*\
FUNCTION: UserAsmcompConstraintsHighlight
PURPOSE: Highlights and labels a component's constraints
\*=====================================================================*/
ProError UserAsmcompConstraintsHighlight (ProAsmcomp* asmcomp)
{
ProError status, aref_status, cref_status;
ProSelection comp_constr, asm_constr;
ProDatumside dtmside;
ProAsmcompconstraint* constr_array;
int size, i, i_count;
double offset;
char offset_str [20];
ProLine entry;
char type_str [20];
ProAsmcompConstrType type;
/*-----------------------------------------------------------------*\
Get the constraints for the component.
\*-----------------------------------------------------------------*/
status = ProAsmcompConstraintsGet (asmcomp, &constr_array);
if (status != PRO_TK_NO_ERROR)
return PRO_TK_E_NOT_FOUND;
ProArraySizeGet (constr_array, &size);
for (i = 0; i < size; i++)
{
/*-----------------------------------------------------------------*\
Highlight the assembly reference geometry
\*----------------------------------------------------------------*/
aref_status = ProAsmcompconstraintAsmreferenceGet (constr_array [i], &asm_constr, &dtmside);
if (aref_status == PRO_TK_NO_ERROR)
{
ProSelectionHighlight (asm_constr, PRO_COLOR_ERROR);
}
/*-----------------------------------------------------------------*\
Highlight the component reference geometry
\*-----------------------------------------------------------------*/
cref_status = ProAsmcompconstraintCompreferenceGet (constr_array [i], &comp_constr, &dtmside);
if (cref_status == PRO_TK_NO_ERROR)
{
ProSelectionHighlight (comp_constr, PRO_COLOR_WARNING);
}
/*-----------------------------------------------------------------*\
Prepare and display the message text.
\*----------------------------------------------------------------*/
status = ProAsmcompconstraintOffsetGet (constr_array [i], &offset);
if (status == PRO_TK_NO_ERROR)
{
ProTKSprintf (offset_str, " offset = %6.3lf", offset);
}
else
strcpy (offset_str, "");
status = ProAsmcompconstraintTypeGet (constr_array [i], &type);
UserConstraintTypeToString (type, type_str);
i_count = i + 1;
ProMessageDisplay (MSGFIL, "USER Showing constraint %0d of %1d %2s%3s. Hit <CR> to continue.",
&i_count, &size, type_str, offset_str);
ProMessageStringRead (1, entry);
/*-----------------------------------------------------------------*\
Clean up the UI for the next constraint
\*-----------------------------------------------------------------*/
if (aref_status == PRO_TK_NO_ERROR)
{
ProSelectionUnhighlight (asm_constr);
}
if (cref_status == PRO_TK_NO_ERROR)
{
ProSelectionUnhighlight (comp_constr);
}
}
ProArrayFree ((ProArray*)&constr_array);
return PRO_TK_NO_ERROR;
}
/*=====================================================================*\
FUNCTION: UserAsmcompConstraintsInfo
PURPOSE: Menu action for constraint information gathering
\*=====================================================================*/
ProError UserAsmcompConstraintsInfo ()
{
ProError status;
ProSelection* component_arr;
int size;
ProAsmcomp cfeat;
ProMessageDisplay (MSGFIL, "USER Select an assembly component:");
status = ProSelect ("membfeat", 1, NULL, NULL, NULL, NULL, &component_arr, &size);
if (status != PRO_TK_NO_ERROR)
return status;
ProSelectionModelitemGet (component_arr [0], (ProModelitem*)&cfeat);
ProSelectionUnhighlight (component_arr [0]);
ProWindowRepaint (-1);
UserAsmcompConstraintsHighlight (&cfeat);
return PRO_TK_NO_ERROR;
}
/*=====================================================================*\
FUNCTION: UserConstraintTypeToString
PURPOSE: Utility: convert the constraint type to a string for printing
\*=====================================================================*/
void UserConstraintTypeToString (ProAsmcompConstrType type,
char* type_string)
{
switch (type)
{
case PRO_ASM_MATE:
strcpy (type_string, "(Mate)");
break;
case PRO_ASM_MATE_OFF:
strcpy (type_string, "(Mate Offset)");
break;
case PRO_ASM_ALIGN:
strcpy (type_string, "(Align)");
break;
case PRO_ASM_ALIGN_OFF:
strcpy (type_string, "(Align Offset)");
break;
case PRO_ASM_INSERT:
strcpy (type_string, "(Insert)");
break;
case PRO_ASM_ORIENT:
strcpy (type_string, "(Orient)");
break;
case PRO_ASM_CSYS:
strcpy (type_string, "(Csys)");
break;
case PRO_ASM_TANGENT:
strcpy (type_string, "(Tangent)");
break;
case PRO_ASM_PNT_ON_SRF:
strcpy (type_string, "(Point on Surf)");
break;
case PRO_ASM_EDGE_ON_SRF:
strcpy (type_string, "(Edge on Surf)");
break;
case PRO_ASM_DEF_PLACEMENT:
strcpy (type_string, "(Default)");
break;
case PRO_ASM_SUBSTITUTE:
strcpy (type_string, "(Substitute)");
break;
case PRO_ASM_PNT_ON_LINE:
strcpy (type_string, "(Point on Line)");
break;
case PRO_ASM_FIX:
strcpy (type_string, "(Fix)");
break;
case PRO_ASM_AUTO:
strcpy (type_string, "(Auto)");
break;
default:
strcpy (type_string, "(Unrecognized Type)");
break;
}
}
/*=====================================================================*\
FUNCTION: UserAsmcompConstraintsHighlight_OA
PURPOSE: Object/Action style command for highlight assembly component
constraints
\*=====================================================================*/
int UserAsmcompConstraintsHighlight_OA()
{
ProError status;
ProSelection* sels;
ProAsmcomp asmcomp;
/*-----------------------------------------------------------------*\
Extract the current selected objects from the selection buffer.
Because the access functions check the type and number, we
assume that the correctly selected object (a component feature, or
part/assembly within the parent assembly) are available.
\*-----------------------------------------------------------------*/
status = ProSelbufferSelectionsGet (&sels);
status = ProSelectionModelitemGet (sels[0], &asmcomp);
/*-----------------------------------------------------------------*\
If its a selected part or assembly, contstruct the feature handle
using the parent assembly and the component id from the component
path.
\*-----------------------------------------------------------------*/
if (asmcomp.type == PRO_PART || asmcomp.type == PRO_ASSEMBLY)
{
ProAsmcomppath path;
ProMdl asmcomp_owner;
status = ProSelectionAsmcomppathGet (sels [0], &path);
asmcomp.type = PRO_FEATURE;
asmcomp.id = path.comp_id_table [path.table_num - 1];
path.table_num --;
status = ProAsmcomppathMdlGet (&path, &asmcomp.owner);
}
/*-----------------------------------------------------------------*\
Call the existing function for highlighting constraints.
\*-----------------------------------------------------------------*/
UserAsmcompConstraintsHighlight (&asmcomp);
ProSelectionarrayFree (sels);
return PRO_TK_NO_ERROR;
}
#define OA 1 /* Standard OA in the menu system, typically gray out
the button when not usable*/
#define PM 2 /* OA in a popup menu, typically remove the button when
not usable */
/*=====================================================================*\
FUNCTION: UserAsmcompConstraintsHighlight_TestLow
PURPOSE: Test function for access for constraint highlighting
\*=====================================================================*/
uiCmdAccessState UserAsmcompConstraintsHighlight_TestLow (ProSelection* sels,
int mode)
{
uiCmdAccessState access_result;
ProBoolean should_free = PRO_B_FALSE;
ProError status;
int size;
/*-----------------------------------------------------------------*\
Set the default return if the button is unusable.
\*-----------------------------------------------------------------*/
if (mode == OA)
access_result = ACCESS_UNAVAILABLE;
else
access_result = ACCESS_REMOVE;
/*-----------------------------------------------------------------*\
If called without selections, extract the current selections from
the buffer.
\*-----------------------------------------------------------------*/
if (sels == NULL)
{
status = ProSelbufferSelectionsGet (&sels);
if (status != PRO_TK_NO_ERROR)
return access_result;
if (sels == NULL)
return access_result;
should_free = PRO_B_TRUE;
}
/*-----------------------------------------------------------------*\
This command allows only one selection.
\*-----------------------------------------------------------------*/
status = ProArraySizeGet (sels, &size);
if (status != PRO_TK_NO_ERROR)
return access_result;
if (size == 1)
{
ProAsmcomp asmcomp;
status = ProSelectionModelitemGet (sels [0], &asmcomp);
/*-----------------------------------------------------------------*\
If the selected type is feature, its feature type must be component.
\*-----------------------------------------------------------------*/
if (asmcomp.type == PRO_FEATURE)
{
ProFeattype ftype;
status = ProFeatureTypeGet (&asmcomp, &ftype);
if (ftype == PRO_FEAT_COMPONENT)
{
access_result = ACCESS_AVAILABLE;
}
}
/*-----------------------------------------------------------------*\
If the selected type is part or assembly, it must have a parrent
assembly to use to construct the component feature handle.
\*-----------------------------------------------------------------*/
if (asmcomp.type == PRO_PART || asmcomp.type == PRO_ASSEMBLY)
{
ProAsmcomppath path;
status = ProSelectionAsmcomppathGet (sels [0], &path);
if (path.table_num > 0)
{
access_result = ACCESS_AVAILABLE;
}
}
}
if (should_free)
ProSelectionarrayFree (sels);
return access_result;
}
/*=====================================================================*\
FUNCTION: UserAsmcompConstraintsHighlight_TestMdlTree
PURPOSE: Test function for access for constraint highlighting from model
tree RMB popup menu.
\*=====================================================================*/
uiCmdAccessState UserAsmcompConstraintsHighlight_TestMdlTree(uiCmdAccessMode mode)
{
return UserAsmcompConstraintsHighlight_TestLow (NULL, PM);
}
/*=====================================================================*\
FUNCTION: UserAsmcompConstraintsHighlight_TestPM
PURPOSE: Test function for access for constraint highlighting from
graphics window RMB popup menu.
\*=====================================================================*/
uiCmdAccessState UserAsmcompConstraintsHighlight_TestPM(uiCmdCmdId id,
ProAppData data,
ProSelection* sels)
{
return UserAsmcompConstraintsHighlight_TestLow (sels, PM);
}
#undef OA
#undef PM