Ejemplo n.º 1
0
/*************************************************************************
*
* 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 **)&current_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;
}
Ejemplo n.º 2
0
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;
}