/* Copyright (c) 2024 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved. */ /*---------------------- Pro/Toolkit Includes ------------------------*/ #include "ProToolkit.h" #include "ProFeature.h" #include "ProElemId.h" #include "ProExtrude.h" #include "ProModFeat.h" #include "ProStdSection.h" #include "ProElement.h" #include "ProElempath.h" #include "ProFeatType.h" #include "ProFeatForm.h" #include "ProSelection.h" #include "ProSection.h" #include "ProModelitem.h" #include "ProSelbuffer.h" #include "ProCollect.h" #include "ProSrfcollection.h" #include "ProCrvcollection.h" #include "ProDraft.h" #include "ProDirection.h" static ProFileName message_file; #define C_LOG(a) ProTKPrintf ("Status for %s is = %d\n", a, status ); \ ERROR_CHECK( a, "UgOADraftCreate.c", status ); #define C_PRINT(a) ProTKPrintf ( "%s\n", a); /*===============================================================*\ FUNCTION : UserOADraftCreate() PURPOSE : Function for OA creation of Draft features. \*===============================================================*/ ProError UserOADraftCreate() { ProErrorlist errors; ProMdl model; ProSelection model_sel; ProFeature feature; ProFeatureCreateOptions *opts = 0; ProElempath path; ProElempathItem path_items[2]; ProSection section; ProAsmcomppath comp_path; ProAsmcomppath *p_comp_path = NULL; ProCollection srf_collection = NULL; ProCollection crv_collection = NULL; ProModelitem model_item; ProReference reference, direction_ref = NULL; ProSelection direction_ref_sel = NULL; ProName wide_string; ProSelection * selbuff_sels; int selbuff_sels_size, selbuff_count; ProElement pro_e_feature_tree; ProElement pro_e_feature_type; ProElement pro_e_std_feature_name; ProElement pro_e_draft_tweak_or_intersec; ProElement pro_e_draft_extend; ProElement pro_e_draft_split; ProElement pro_e_std_surf_collection_appl; ProElement pro_e_direction_compound; ProElement pro_e_direction_reference; ProElement pro_e_direction_flip; ProElement pro_e_std_section; ProElement pro_e_std_sec_method; ProElement pro_e_std_sec_select; ProElement pro_e_std_curve_collection_appl; ProElement pro_e_surf_chain_cmpnd; ProElement pro_e_surf_chain_method; ProElement pro_e_surf_chain_ref_surfs; ProElement pro_e_surf_chain_surf; ProElement pro_e_std_sec_setup_plane; ProElement pro_e_std_sec_plane_view_dir; ProElement pro_e_std_sec_plane_orient_dir; ProElement pro_e_draft_constant_or_variable; ProElement pro_e_draft_include_tangent; ProElement pro_e_draft_side_1; ProElement pro_e_draft_neutral_object_type_1; ProElement pro_e_draft_dependent_1; ProElement pro_e_draft_angle_1; ProElement pro_e_draft_angles; ProElement pro_e_draft_side_2; ProElement pro_e_draft_neutral_object_type_2; ProElement pro_e_draft_dependent_2; ProElement pro_e_draft_angle_2; ProStringToWstring ( message_file, "msg_ugfeatcreat.txt" ); status = ProMdlCurrentGet (&model); if ( status != PRO_TK_NO_ERROR ) return ( status ); /*---------------------------------------------------------------*\ Processing the contents of the selection buffer + Allows only 3 entries in the selection buffer as follows - One selection, One curve collection & one surface collection + The 3 entries can be in any order, the code is capable of extracting the right-ones to get assigned appropriately i.e. selection for draft direction, surface collection for draft surface and curve collection for draft hinge elements in the final elemenet tree \*---------------------------------------------------------------*/ status = ProSelbufferSelectionsGet( &selbuff_sels ); C_LOG( " ProSelbufferSelectionsGet " ); if ( status != PRO_TK_NO_ERROR ) return status; status = ProArraySizeGet ( selbuff_sels, &selbuff_sels_size ); C_LOG (" ProArraySizeGet") ProTKPrintf ( "Selections in selbuff = %d\n", selbuff_sels_size ); /*---------------------------------------------------------------*\ allowing exactly 3 entities in the selection buffer \*---------------------------------------------------------------*/ if ( selbuff_sels_size != 3 ) { status = ProMessageDisplay(message_file, "USER Invalid selection buffer context:"); C_LOG (" ProMessageDisplay") return PRO_TK_BAD_CONTEXT; } for ( selbuff_count = 0; selbuff_count < selbuff_sels_size; selbuff_count++ ) { ProCollection collection; ProCollectionType coll_type; ProTKPrintf ( "Count in selbuff = %d\n", selbuff_count ); status = ProSelectionCollectionGet ( selbuff_sels[selbuff_count], &collection ); C_LOG (" ProSelectionCollectionGet") /*---------------------------------------------------------------*\ Processing selection for draft direction \*---------------------------------------------------------------*/ if ( status != PRO_TK_NO_ERROR ) { if ( direction_ref_sel != NULL ) { /*---------------------------------------------------------------*\ Only one selection allowed for this context \*---------------------------------------------------------------*/ status = ProMessageDisplay(message_file, "USER Invalid selection buffer context:"); C_LOG (" ProMessageDisplay") return PRO_TK_BAD_CONTEXT; } /*---------------------------------------------------------------*\ Extracting the selection in the selection buffer - draft direction \*---------------------------------------------------------------*/ status = ProSelectionCopy ( selbuff_sels[selbuff_count], &direction_ref_sel ); C_LOG (" ProSelectionCopy") /*---------------------------------------------------------------*\ Converting to ProReference as required by the elemtree \*---------------------------------------------------------------*/ status = ProSelectionToReference ( direction_ref_sel, &direction_ref ); C_LOG (" ProSelectionToReference") } else { /*---------------------------------------------------------------*\ Checking for collection types \*---------------------------------------------------------------*/ status = ProCollectionTypeGet ( collection, &coll_type ); C_LOG (" ProCollectionTypeGet") if ( coll_type == PRO_COLLECTION_SRFCOLL ) { if ( srf_collection != NULL ) { status = ProMessageDisplay(message_file, "USER Invalid selection buffer context:"); C_LOG (" ProMessageDisplay") return PRO_TK_BAD_CONTEXT; } /*---------------------------------------------------------------*\ Surface collection for draft surface \*---------------------------------------------------------------*/ status = ProSrfcollectionCopy ( collection, &srf_collection ); C_LOG (" ProSrfcollectionCopy") if ( status != PRO_TK_NO_ERROR ) return status; } else { if ( crv_collection != NULL ) { status = ProMessageDisplay(message_file, "USER Invalid selection buffer context:"); C_LOG (" ProMessageDisplay") return PRO_TK_BAD_CONTEXT; } /*---------------------------------------------------------------*\ Curve collection for draft hinge \*---------------------------------------------------------------*/ status = ProCrvcollectionCopy ( collection, &crv_collection ); C_LOG (" ProCrvcollectionCopy") if ( status != PRO_TK_NO_ERROR ) return status; } /*---------------------------------------------------------------*\ Freeing the temporary copy of collection \*---------------------------------------------------------------*/ status = ProCollectionFree ( &collection ); C_LOG (" ProCollectionFree") } } /*---------------------------------------------------------------*\ Confirming for the required contents processed \*---------------------------------------------------------------*/ if ( ( direction_ref_sel == NULL ) || ( srf_collection == NULL ) || ( crv_collection == NULL ) ) { status = ProMessageDisplay(message_file, "USER Invalid selection buffer context:"); C_LOG (" ProMessageDisplay") return PRO_TK_BAD_CONTEXT; } /*---------------------------------------------------------------*\ Populating root element PRO_E_FEATURE_TREE \*---------------------------------------------------------------*/ C_PRINT( " *** Processing Element PRO_E_FEATURE_TREE *** " ); status = ProElementAlloc ( PRO_E_FEATURE_TREE, &pro_e_feature_tree ); C_LOG( " ProElementAlloc " ); /*---------------------------------------------------------------*\ Populating element PRO_E_FEATURE_TYPE \*---------------------------------------------------------------*/ C_PRINT( " *** Processing Element PRO_E_FEATURE_TYPE *** " ); status = ProElementAlloc ( PRO_E_FEATURE_TYPE, &pro_e_feature_type ); C_LOG( " ProElementAlloc " ); status = ProElementIntegerSet ( pro_e_feature_type, PRO_FEAT_DRAFT ); C_LOG( " ProElementIntegerSet" ); status = ProElemtreeElementAdd ( pro_e_feature_tree, NULL, pro_e_feature_type ); C_LOG( " ProElemtreeElementAdd" ); /*---------------------------------------------------------------*\ Populating element PRO_E_DRAFT_EXTEND \*---------------------------------------------------------------*/ C_PRINT( " *** Processing Element PRO_E_DRAFT_EXTEND *** " ); status = ProElementAlloc ( PRO_E_DRAFT_EXTEND, &pro_e_draft_extend ); C_LOG( " ProElementAlloc " ); status = ProElementIntegerSet ( pro_e_draft_extend, PRO_DRAFT_UI_NO_EXTEND ); C_LOG( " ProElementIntegerSet" ); status = ProElemtreeElementAdd ( pro_e_feature_tree, NULL, pro_e_draft_extend ); C_LOG( " ProElemtreeElementAdd" ); /*---------------------------------------------------------------*\ Populating element PRO_E_DRAFT_SPLIT \*---------------------------------------------------------------*/ C_PRINT( " *** Processing Element PRO_E_DRAFT_SPLIT *** " ); status = ProElementAlloc ( PRO_E_DRAFT_SPLIT, &pro_e_draft_split ); C_LOG( " ProElementAlloc " ); status = ProElementIntegerSet ( pro_e_draft_split, PRO_DRAFT_UI_SPLIT_NONE ); C_LOG( " ProElementIntegerSet" ); status = ProElemtreeElementAdd ( pro_e_feature_tree, NULL, pro_e_draft_split ); C_LOG( " ProElemtreeElementAdd" ); /*---------------------------------------------------------------*\ Populating element PRO_E_STD_SURF_COLLECTION_APPL \*---------------------------------------------------------------*/ C_PRINT( " *** Processing Element PRO_E_STD_SURF_COLLECTION_APPL *** " ); status = ProElementAlloc ( PRO_E_STD_SURF_COLLECTION_APPL, &pro_e_std_surf_collection_appl ); C_LOG( " ProElementAlloc " ); /*---------------------------------------------------------------*\ Assigning the surface collection \*---------------------------------------------------------------*/ status = ProElementCollectionSet( pro_e_std_surf_collection_appl, srf_collection ); C_LOG( " ProElementCollectionSet " ); status = ProElemtreeElementAdd ( pro_e_feature_tree, NULL, pro_e_std_surf_collection_appl ); C_LOG( " ProElemtreeElementAdd" ); /*---------------------------------------------------------------*\ Populating element PRO_E_DIRECTION_COMPOUND \*---------------------------------------------------------------*/ C_PRINT( " *** Processing Element PRO_E_DIRECTION_COMPOUND *** " ); status = ProElementAlloc ( PRO_E_DIRECTION_COMPOUND, &pro_e_direction_compound ); C_LOG( " ProElementAlloc " ); status = ProElemtreeElementAdd ( pro_e_feature_tree, NULL, pro_e_direction_compound ); C_LOG( " ProElemtreeElementAdd" ); /*---------------------------------------------------------------*\ Populating element PRO_E_DIRECTION_REFERENCE \*---------------------------------------------------------------*/ C_PRINT( " *** Processing Element PRO_E_DIRECTION_REFERENCE *** " ); status = ProElementAlloc ( PRO_E_DIRECTION_REFERENCE, &pro_e_direction_reference ); C_LOG( " ProElementAlloc " ); /* Assigning the direction reference */ status = ProElementReferenceSet( pro_e_direction_reference, direction_ref ); C_LOG( " ProElementReferenceSet " ); status = ProElemtreeElementAdd ( pro_e_direction_compound, NULL, pro_e_direction_reference ); C_LOG( " ProElemtreeElementAdd" ); /*---------------------------------------------------------------*\ Populating element PRO_E_DIRECTION_FLIP \*---------------------------------------------------------------*/ C_PRINT( " *** Processing Element PRO_E_DIRECTION_FLIP *** " ); status = ProElementAlloc ( PRO_E_DIRECTION_FLIP, &pro_e_direction_flip ); C_LOG( " ProElementAlloc " ); status = ProElementIntegerSet ( pro_e_direction_flip, PRO_DIRECTION_FLIP_ALONG ); /* ProDirectionFlipOption :: ProDirection.h */ C_LOG( " ProElementIntegerSet" ); status = ProElemtreeElementAdd ( pro_e_direction_compound, NULL, pro_e_direction_flip ); C_LOG( " ProElemtreeElementAdd" ); /*---------------------------------------------------------------*\ Populating element PRO_E_DRAFT_CONSTANT_OR_VARIABLE \*---------------------------------------------------------------*/ C_PRINT( " *** Processing Element PRO_E_DRAFT_CONSTANT_OR_VARIABLE *** " ); status = ProElementAlloc ( PRO_E_DRAFT_CONSTANT_OR_VARIABLE, &pro_e_draft_constant_or_variable ); C_LOG( " ProElementAlloc " ); status = ProElementIntegerSet ( pro_e_draft_constant_or_variable, PRO_DRAFT_UI_CONSTANT ); /* 1 */ C_LOG( " ProElementIntegerSet" ); status = ProElemtreeElementAdd ( pro_e_feature_tree, NULL, pro_e_draft_constant_or_variable ); C_LOG( " ProElemtreeElementAdd" ); /*---------------------------------------------------------------*\ Populating element PRO_E_DRAFT_INCLUDE_TANGENT \*---------------------------------------------------------------*/ C_PRINT( " *** Processing Element PRO_E_DRAFT_INCLUDE_TANGENT *** " ); status = ProElementAlloc ( PRO_E_DRAFT_INCLUDE_TANGENT, &pro_e_draft_include_tangent ); C_LOG( " ProElementAlloc " ); status = ProElementIntegerSet ( pro_e_draft_include_tangent, PRO_DRAFT_UI_INC_TANG ); C_LOG( " ProElementIntegerSet" ); status = ProElemtreeElementAdd ( pro_e_feature_tree, NULL, pro_e_draft_include_tangent ); C_LOG( " ProElemtreeElementAdd" ); /*---------------------------------------------------------------*\ Populating element PRO_E_DRAFT_SIDE_1 \*---------------------------------------------------------------*/ C_PRINT( " *** Processing Element PRO_E_DRAFT_SIDE_1 *** " ); status = ProElementAlloc ( PRO_E_DRAFT_SIDE_1, &pro_e_draft_side_1 ); C_LOG( " ProElementAlloc " ); status = ProElemtreeElementAdd ( pro_e_feature_tree, NULL, pro_e_draft_side_1 ); C_LOG( " ProElemtreeElementAdd" ); /*---------------------------------------------------------------*\ Populating element PRO_E_DRAFT_NEUTRAL_OBJECT_TYPE_1 \*---------------------------------------------------------------*/ C_PRINT( " *** Processing Element PRO_E_DRAFT_NEUTRAL_OBJECT_TYPE_1 *** " ); status = ProElementAlloc ( PRO_E_DRAFT_NEUTRAL_OBJECT_TYPE_1, &pro_e_draft_neutral_object_type_1 ); C_LOG( " ProElementAlloc " ); status = ProElementIntegerSet ( pro_e_draft_neutral_object_type_1, PRO_DRAFT_UI_CURVE ); C_LOG( " ProElementIntegerSet" ); status = ProElemtreeElementAdd ( pro_e_draft_side_1, NULL, pro_e_draft_neutral_object_type_1 ); C_LOG( " ProElemtreeElementAdd" ); /*---------------------------------------------------------------*\ Populating element PRO_E_STD_CURVE_COLLECTION_APPL \*---------------------------------------------------------------*/ C_PRINT( " *** Processing Element PRO_E_STD_CURVE_COLLECTION_APPL *** " ); status = ProElementAlloc ( PRO_E_STD_CURVE_COLLECTION_APPL, &pro_e_std_curve_collection_appl ); C_LOG( " ProElementAlloc " ); /*---------------------------------------------------------------*\ Assigning the curve collection \*---------------------------------------------------------------*/ status = ProElementCollectionSet( pro_e_std_curve_collection_appl, crv_collection ); C_LOG( " ProElementCollectionSet " ); status = ProElemtreeElementAdd ( pro_e_draft_side_1, NULL, pro_e_std_curve_collection_appl ); C_LOG( " ProElemtreeElementAdd" ); /*---------------------------------------------------------------*\ Populating element PRO_E_DRAFT_DEPENDENT_1 \*---------------------------------------------------------------*/ C_PRINT( " *** Processing Element PRO_E_DRAFT_DEPENDENT_1 *** " ); status = ProElementAlloc ( PRO_E_DRAFT_DEPENDENT_1, &pro_e_draft_dependent_1 ); C_LOG( " ProElementAlloc " ); status = ProElementIntegerSet ( pro_e_draft_dependent_1, PRO_DRAFT_UI_INDEPENDENT ); C_LOG( " ProElementIntegerSet" ); status = ProElemtreeElementAdd ( pro_e_draft_side_1, NULL, pro_e_draft_dependent_1 ); C_LOG( " ProElemtreeElementAdd" ); /*---------------------------------------------------------------*\ Populating element PRO_E_DRAFT_ANGLE_1 \*---------------------------------------------------------------*/ C_PRINT( " *** Processing Element PRO_E_DRAFT_ANGLE_1 *** " ); status = ProElementAlloc ( PRO_E_DRAFT_ANGLE_1, &pro_e_draft_angle_1 ); C_LOG( " ProElementAlloc " ); status = ProElementDoubleSet ( pro_e_draft_angle_1, 10.000000 ); C_LOG( " ProElementDoubleSet" ); status = ProElemtreeElementAdd ( pro_e_draft_side_1, NULL, pro_e_draft_angle_1 ); C_LOG( " ProElemtreeElementAdd" ); /*---------------------------------------------------------------*\ Writing the elemtree in XML format \*---------------------------------------------------------------*/ status = ProElemtreeWrite ( pro_e_feature_tree, PRO_ELEMTREE_XML, L"draft_tree.out" ); C_LOG( " ProElemtreeWrite" ); /*---------------------------------------------------------------*\ Creating feature in the current model. \*---------------------------------------------------------------*/ status = ProMdlToModelitem( model, &model_item ); status = ProSelectionAlloc (p_comp_path, &model_item, &model_sel); status = ProArrayAlloc(1,sizeof(ProFeatureCreateOptions), 1, (ProArray*)&opts); opts[0]= PRO_FEAT_CR_DEFINE_MISS_ELEMS; status = ProFeatureWithoptionsCreate (model_sel, pro_e_feature_tree, opts, PRO_REGEN_NO_FLAGS, &feature, &errors); C_LOG (" ProFeatureWithoptionsCreate"); status = ProArrayFree((ProArray*)&opts); /*---------------------------------------------------------------*\ Freeing allocated memory. \*---------------------------------------------------------------*/ status = ProSelectionFree (&model_sel ); C_LOG (" ProSelectionFree"); status = ProElementFree (&pro_e_feature_tree ); C_LOG (" ProElementFree"); return (status); } #undef C_LOG #undef C_PRINT