/************************************************************************* * * Name: int trace_flow_cb() * * Type int * * Type Parameter IOGF Description * * Description: * Callback from flow. **************************************************************************/ static int trace_flow_cb( FlowCtx *ctx, flow_tEvent event) { WGre *gre; vldh_t_node source, dest; void *vobject; double ll_x, ll_y, ur_x, ur_y, width; int subwindow_nr; int sts; flow_GetCtxUserData( ctx, (void **)&gre); gre->search_rectangle_delete(); if ( event->any.type == flow_eEventType_CreateCon) { if ( flow_GetNodeGroup( event->con_create.source_object) == flow_eNodeGroup_Trace) return 1; flow_GetUserData( event->con_create.source_object, (void **) &source); if ( event->con_create.dest_object) { if ( flow_GetNodeGroup( event->con_create.dest_object) == flow_eNodeGroup_Trace) return 1; flow_GetUserData( event->con_create.dest_object, (void **) &dest); } else dest = 0; (gre->gre_con_created) (gre, event->con_create.x, event->con_create.y, source, event->con_create.source_conpoint, dest, event->con_create.dest_conpoint, 0, &sts); } switch ( event->event) { case flow_eEvent_Init: break; case flow_eEvent_MB2DoubleClick: switch ( event->object.object_type) { case flow_eObjectType_Node: if ( flow_GetNodeGroup( event->object.object) == flow_eNodeGroup_Trace) { flow_DeleteNodeCons( event->object.object); flow_DeleteNode( event->object.object); } break; default: ; } break; case flow_eEvent_MB1PressCtrl: { vldh_t_node vnode; vldh_t_con vcon; double pos_x, pos_y; double *x_arr, *y_arr; int i, num; /* Object moved */ switch ( event->object.object_type) { case flow_eObjectType_Node: if ( flow_GetNodeGroup( event->object.object) == flow_eNodeGroup_Trace) break; flow_GetUserData( event->object.object, (void **) &vnode); flow_GetNodePosition( event->object.object, &pos_x, &pos_y); vnode->ln.x = pos_x; vnode->ln.y = pos_y; vldh_nodemodified( vnode); (gre->gre_node_moved) (gre); break; case flow_eObjectType_Con: if ( flow_GetConGroup( event->object.object) == flow_eConGroup_Trace) break; flow_GetUserData( event->object.object, (void **) &vcon); flow_GetConPosition( event->object.object, &x_arr, &y_arr, &num); for ( i = 0; i < num; i++) { vcon->lc.point[i].x = x_arr[i]; vcon->lc.point[i].y = y_arr[i]; } vcon->lc.point_count = num; vldh_conmodified( vcon); break; default: ; } break; } case flow_eEvent_MB1DoubleClick: /* Open attribute editor */ switch ( event->object.object_type) { case flow_eObjectType_Node: if ( flow_GetNodeGroup( event->object.object) == flow_eNodeGroup_Trace) break; gre->popupmenu_mode = GRE_POPUPMENUMODE_OBJECT; flow_GetUserData( event->object.object, &vobject); (gre->gre_attribute) (gre, (vldh_t_node) vobject); break; default: ; } break; case flow_eEvent_MB1DoubleClickShift: /* Open subwindow */ switch ( event->object.object_type) { case flow_eObjectType_Node: if ( flow_GetNodeGroup( event->object.object) == flow_eNodeGroup_Trace) break; gre->popupmenu_mode = GRE_POPUPMENUMODE_OBJECT; flow_MeasureNode( event->object.object, &ll_x,&ll_y,&ur_x,&ur_y); width = ur_x - ll_x; if ( event->object.x > ( ll_x + width / 2 )) subwindow_nr = 1; else subwindow_nr = 2; flow_GetUserData( event->object.object, &vobject); (gre->gre_subwindow) ( gre, (vldh_t_node)vobject, subwindow_nr); break; default: ; } break; case flow_eEvent_MB3Press: { /* Popup menu */ int x_pix, y_pix; vldh_t_node current_node; flow_tObject *select_list; int select_cnt; if ( event->object.object_type != flow_eObjectType_Node) break; if ( flow_GetNodeGroup( event->object.object) == flow_eNodeGroup_Trace) break; flow_PositionToPixel( gre->flow_ctx, event->object.x, event->object.y, &x_pix, &y_pix); gre->get_popup_position( &x_pix, &y_pix); current_node = 0; /* If there is no selected object, select current object */ if ( gre->popupmenu_mode == GRE_POPUPMENUMODE_OBJECT) { flow_GetSelectList( ctx, &select_list, &select_cnt); if ( !select_cnt) { if ( event->object.object_type == flow_eObjectType_Node) /* Get the current object */ flow_GetUserData( event->object.object, (void **)¤t_node); } } (gre->gre_popupmenu) (gre, x_pix, y_pix, gre->popupmenu_mode, current_node); break; } case flow_eEvent_MB1ClickCtrl: { char help_title[32]; vldh_t_node node; vldh_t_con con; int size, sts; if ( event->object.object_type == flow_eObjectType_Node) { if ( flow_GetNodeGroup( event->object.object) == flow_eNodeGroup_Trace) break; flow_GetUserData( event->object.object, (void **)&node); sts = ldh_ObjidToName( (node->hn.wind)->hw.ldhses, cdh_ClassIdToObjid( node->ln.cid), ldh_eName_Object, help_title, sizeof( help_title), &size); WFoe::error_msg(sts); if ( EVEN(sts)) return 1; (gre->gre_help) ( gre, help_title); } if ( event->object.object_type == flow_eObjectType_Con) { if ( flow_GetConGroup( event->object.object) == flow_eConGroup_Trace) break; flow_GetUserData( event->object.object, (void **)&con); sts = ldh_ObjidToName( (gre->wind)->hw.ldhses, cdh_ClassIdToObjid( con->lc.cid), ldh_eName_Object, help_title, sizeof( help_title), &size); WFoe::error_msg(sts); if ( EVEN(sts)) return 1; (gre->gre_help) ( gre, help_title); } break; } case flow_eEvent_MB1DoubleClickShiftCtrl: { trace_changevalue( gre, event->object.object); break; } default: ; } return 1; }
int goec_con_draw( WGre *gre, vldh_t_con con, int create_flag, vldh_t_node node ) { int sts; flow_tConClass con_class; int i, num; double *x_arr, *y_arr; double x[10], y[10]; vldh_t_node tmp_node_pointer; unsigned long tmp_point; pwr_tObjid tmp_node_did; if ( con->lc.drawtype == GOEN_CONSYSREF || con->lc.drawtype == GOEN_CONUSERREF) /* This is a fix for backward compatibility */ sts = gre->get_conclass( 0, (con->hc.wind)->hw.ldhses, con->lc.object_type, &con_class); else sts = gre->get_conclass( con->lc.cid, (con->hc.wind)->hw.ldhses, con->lc.object_type, &con_class); /* For grafcet-connectins source and destination class has to be right*/ if ( (con->lc.cid == pwr_cClass_TransDiv && con->hc.dest_node->ln.cid == pwr_cClass_trans) || (con->lc.cid == pwr_cClass_TransConv && con->hc.source_node->ln.cid == pwr_cClass_trans) || (con->lc.cid == pwr_cClass_StepDiv && con->hc.source_node->ln.cid == pwr_cClass_trans) || (con->lc.cid == pwr_cClass_StepConv && con->hc.dest_node->ln.cid == pwr_cClass_trans)) { /* Shift */ tmp_node_pointer = con->hc.source_node; tmp_point = con->lc.source_point; tmp_node_did = con->lc.source_oid; con->hc.source_node = con->hc.dest_node; con->lc.source_point = con->lc.dest_point; con->lc.source_oid = con->lc.dest_oid; con->hc.dest_node = tmp_node_pointer; con->lc.dest_point = tmp_point; con->lc.dest_oid = tmp_node_did; } if ( create_flag != GRE_CON_NONROUTE) { flow_CreateCon( gre->flow_ctx, con->hc.name, con_class, con->hc.source_node->hn.node_id, con->hc.dest_node->hn.node_id, con->lc.source_point, con->lc.dest_point, con, &con->hc.con_id, 0, NULL, NULL, &sts); if ( EVEN(sts)) { printf( "** Corrupt connection deleted: source %s, destination %s\n", con->hc.source_node->hn.name, con->hc.dest_node->hn.name); vldh_con_delete( con); return sts; } flow_GetConPosition( con->hc.con_id, &x_arr, &y_arr, &num); for ( i = 0; i < num; i++) { con->lc.point[i].x = x_arr[i]; con->lc.point[i].y = y_arr[i]; } con->lc.point_count = num; } else { // In V2.7 max point was 10, in flow it is 8... if ( con->lc.point_count > 8) con->lc.point_count = 8; for ( i = 0; i < (int)con->lc.point_count; i++) { x[i] = con->lc.point[i].x; y[i] = con->lc.point[i].y; } flow_CreateCon( gre->flow_ctx, con->hc.name, con_class, con->hc.source_node->hn.node_id, con->hc.dest_node->hn.node_id, con->lc.source_point, con->lc.dest_point, con, &con->hc.con_id, con->lc.point_count, x, y, &sts); if ( EVEN(sts)) { printf( "** Corrupt connection deleted: source %s, destination %s\n", con->hc.source_node->hn.name, con->hc.dest_node->hn.name); vldh_con_delete( con); return sts; } } return GRE__SUCCESS; }