To extract information from a tree model, you can use the EntryList function to create a list of top-level entries in the model and then loop through the list, extracting information about each node. For each node, determine its activity type using the TraceActivity enumerated datatype, and then use the appropriate TraceTree object to extract information.
The following simple example extracts information from an existing trace tree model and stores it in a structure:
TraceTreeNode ltctn_list[], ltctn_node long ll_index, ll_limit string ls_line str_node lstr_node ltct_treemodel.EntryList(ltctn_list) ll_limit = UpperBound(ltctn_list) FOR ll_index = 1 to ll_limit ltctn_node = ltctn_list[ll_index] of_dumpnode(ltctn_node, lstr_node) // insert code to handle display of // the information in the structure here … NEXT
The of_dumpnode function takes a TraceTreeNode object and a structure as arguments and populates the structure with information about each node. The following code shows part of the function:
string ls_exit, ls_label, ls_routinename long ll_node_cnt TraceTreeNode ltctn_list[] errorreturn l_err astr_node.Children = FALSE astr_node.Label = '' IF NOT isvalid(atctn_node) THEN RETURN CHOOSE CASE atctn_node.ActivityType CASE ActRoutine! TraceTreeRoutine ltctrt_routin ltctrt_routine = atctn_node IF ltctrt_routine.Classname = '' THEN & ls_routinename = ltctrt_routine.ClassName + "." END IF ls_routinename += ltctrt_routine.Name ltctrt_routine.GetChildrenList(ltctn_list) ll_node_cnt = UpperBound(ltctn_list) ls_label = "Execute " + ls_routinename + ' :' + & space(ii_offset) + String(l_timescale * & (ltctrt_routine.ExitTimerValue - & ltctrt_routine.EnterTimerValue), '0.000000') astr_node.Children = (ll_node_cnt > 0) astr_node.Label = ls_label astr_node.Time = ltctrt_routine.EnterTimerValue RETURN CASE ActLine! TraceTreeLine tctln_treeLine tctln_treeLine = atctn_node ls_label = LINEPREFIX + & String(tctln_treeLine.LineNumber ) astr_node.time = tctln_treeLine.Timervalue ... // CASE statements omitted ... CASE ELSE ls_label = "INVALID NODE" END CHOOSE astr_node.label = ls_label RETURN