/* Copyright (c) 2024 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved. */ /*---------------------- Pro/Toolkit Includes ------------------------*/ #include <ProToolkit.h> #include <ProCollect.h> #include <ProParameter.h> #include <ProParamval.h> #include <ProGeomitem.h> /*---------------------- Application Includes ------------------------*/ #include <TestError.h> #include <ProCrvcollection.h> /*---------------------- Function Prototypes -------------------------*/ ProError UserCurveLength(); ProError UserCrvcollectionFilter (ProSelection cur_sel, ProAppData app_data); /*---------------------- Static variables -------------------------*/ static int crv_entry_count; /*============================================================================*\ Function: UserCurveLength() Purpose: Compute Area of the Surface Collection \*============================================================================*/ ProError UserCurveLength() { int sel_count; ProError status; ProCharName name; ProModelitem model_item; ProFileName msgfile; ProName w_name; ProCollection collection; ProSelection * regen_sels; int n_regen_sels; double total_length = 0; ProSelection * coll_sels; int coll_sels_size; ProCollectioninstrType coll_flags[6] = { PRO_CURVCOLL_ONE_BY_ONE, PRO_CURVCOLL_TAN_CHAIN, PRO_CURVCOLL_CURVE_CHAIN, PRO_CURVCOLL_BNDRY_CHAIN, PRO_CURVCOLL_SURF_CHAIN, PRO_CURVCOLL_LOG_EDGE }; crv_entry_count++; /*----------------------------------------------------------------------------*\ Prompt user for Curve Collection \*----------------------------------------------------------------------------*/ ProStringToWstring(msgfile,"msg_uggeom.txt"); status = ProMessageDisplay(msgfile,"USER Collect Curves to find total length:"); ERROR_CHECK("UserCurveLength","ProMessageDisplay",status); status = ProCrvcollectionAlloc ( &collection ); ERROR_CHECK( "UserCurveLength", "ProCrvcollectionAlloc", status ); /*----------------------------------------------------------------------------*\ Interactive Curve Collection \*----------------------------------------------------------------------------*/ status = ProCurvesCollect ( (ProChaincollUIControl *)coll_flags, 6, ( ProCrvcollFilter ) UserCrvcollectionFilter, ( ProAppData ) NULL, &collection, &coll_sels, &coll_sels_size ); ERROR_CHECK( "UserCurveLength", "ProCurvesCollect", status ); /*----------------------------------------------------------------------------*\ Regenerating the returned collection to get the list of constituent curves \*----------------------------------------------------------------------------*/ status = ProCrvcollectionRegenerate ( collection, ®en_sels, &n_regen_sels ); ERROR_CHECK( "UserCurveLength", "ProCrvcollectionRegenerate", status ); if ( ( status != PRO_TK_NO_ERROR ) || ( n_regen_sels <= 0 ) ) return PRO_TK_GENERAL_ERROR; /*----------------------------------------------------------------------------*\ Evaluating the overall length from edge collection \*----------------------------------------------------------------------------*/ for ( sel_count = 0; sel_count < n_regen_sels; sel_count++ ) { ProEdge edge; double length; status = ProSelectionModelitemGet ( regen_sels[sel_count], &model_item ); ERROR_CHECK( "UserCurveLength", "ProSelectionModelitemGet", status ); status = ProGeomitemToEdge ( &model_item, &edge ); ERROR_CHECK( "UserCurveLength", "ProGeomitemToEdge", status ); /*----------------------------------------------------------------------------*\ Evaluating the length of individual curve \*----------------------------------------------------------------------------*/ status = ProEdgeLengthEval ( edge, &length ); ERROR_CHECK( "UserCurveLength", "ProSurfaceAreaEval", status ); total_length = total_length + length; } status = ProMessageDisplay(msgfile,"USER Total Curve Length is %0f", &total_length); ERROR_CHECK( "UserCurveLength", "ProMessageDisplay", status ); /*----------------------------------------------------------------------------*\ Freeing Memory \*----------------------------------------------------------------------------*/ status = ProCollectionFree ( &collection ); ERROR_CHECK( "UserCurveLength", "ProCollectionFree", status ); status = ProSelectionarrayFree ( regen_sels ); ERROR_CHECK( "UserCurveLength", "ProSelectionarrayFree", status ); status = ProSelectionarrayFree ( coll_sels ); ERROR_CHECK( "UserCurveLength", "ProSelectionarrayFree", status ); ProMessageClear(); return(status); } /*============================================================================*\ Function: UserCrvcollectionFilter() Purpose: Filter function for curve collection. Filters only PRO_EDGE type of selections \*============================================================================*/ ProError UserCrvcollectionFilter (ProSelection cur_sel, ProAppData app_data) { ProError status; ProModelitem model_item; status = ProSelectionModelitemGet ( cur_sel, &model_item ); ERROR_CHECK( "UserCrvcollectionFilter", "ProSelectionModelitemGet", status ); if ( model_item.type == PRO_EDGE ) return PRO_TK_NO_ERROR; else return PRO_TK_GENERAL_ERROR; }