コード例 #1
0
GdkRectangle *world_to_real_rect (WorldRectangle *rcWorld, GdkRectangle *rcReal)
  {
  rcReal->x = world_to_real_x (rcWorld->xWorld) ;
  rcReal->y = world_to_real_y (rcWorld->yWorld) ;
  rcReal->width = world_to_real_cx (rcWorld->cxWorld) ;
  rcReal->height = world_to_real_cy (rcWorld->cyWorld) ;

  return rcReal ;
  }
コード例 #2
0
static void draw (QCADDesignObject *obj, GdkDrawable *dst, GdkFunction rop, GdkRectangle *rcClip)
  {
  int Nix, Nix1 ;
  GdkGC *gc = NULL ;
  GdkRectangle rcReal ;
  GdkPoint ptSrc, ptDst ;
  QCADRectangleElectrode *rc_electrode = QCAD_RECTANGLE_ELECTRODE (obj) ;
  GdkColor *clr = NULL ;

  world_to_real_rect (&(obj->bounding_box), &rcReal) ;

  if (!RECT_INTERSECT_RECT (rcReal.x, rcReal.y, rcReal.width, rcReal.height, rcClip->x, rcClip->y, rcClip->width, rcClip->height))
    return ;

  clr = obj->bSelected ? clr_idx_to_clr_struct (RED) : &(obj->clr) ;
  gc = gdk_gc_new (dst) ;
  gdk_gc_set_foreground (gc, clr) ;
  gdk_gc_set_background (gc, clr) ;
  gdk_gc_set_function (gc, rop) ;
  gdk_gc_set_clip_rectangle (gc, rcClip) ;

  ptSrc.x = world_to_real_x (rc_electrode->precompute_params.pt[0].xWorld) ;
  ptSrc.y = world_to_real_y (rc_electrode->precompute_params.pt[0].yWorld) ;
  ptDst.x = world_to_real_x (rc_electrode->precompute_params.pt[1].xWorld) ;
  ptDst.y = world_to_real_y (rc_electrode->precompute_params.pt[1].yWorld) ;
  gdk_draw_line (dst, gc, ptSrc.x, ptSrc.y, ptDst.x, ptDst.y) ;
  ptSrc = ptDst ;
  ptDst.x = world_to_real_x (rc_electrode->precompute_params.pt[2].xWorld) ;
  ptDst.y = world_to_real_y (rc_electrode->precompute_params.pt[2].yWorld) ;
  gdk_draw_line (dst, gc, ptSrc.x, ptSrc.y, ptDst.x, ptDst.y) ;
  ptSrc = ptDst ;
  ptDst.x = world_to_real_x (rc_electrode->precompute_params.pt[3].xWorld) ;
  ptDst.y = world_to_real_y (rc_electrode->precompute_params.pt[3].yWorld) ;
  gdk_draw_line (dst, gc, ptSrc.x, ptSrc.y, ptDst.x, ptDst.y) ;
  ptSrc = ptDst ;
  ptDst.x = world_to_real_x (rc_electrode->precompute_params.pt[0].xWorld) ;
  ptDst.y = world_to_real_y (rc_electrode->precompute_params.pt[0].yWorld) ;
  gdk_draw_line (dst, gc, ptSrc.x, ptSrc.y, ptDst.x, ptDst.y) ;

  for (Nix = 0 ; Nix < rc_electrode->n_x_divisions ; Nix++)
    for (Nix1 = 0 ; Nix1 < rc_electrode->n_y_divisions ; Nix1++)
      {
      ptSrc.x = world_to_real_x (exp_array_index_2d (rc_electrode->precompute_params.pts, WorldPoint, Nix1, Nix).xWorld) ;
      ptSrc.y = world_to_real_y (exp_array_index_2d (rc_electrode->precompute_params.pts, WorldPoint, Nix1, Nix).yWorld) ;
      if (PT_IN_RECT (ptSrc.x, ptSrc.y, rcClip->x, rcClip->y, rcClip->width, rcClip->height))
        gdk_draw_point (dst, gc, ptSrc.x, ptSrc.y) ;
      }

  g_object_unref (gc) ;
  }
コード例 #3
0
static void draw (QCADDesignObject *obj, GdkDrawable *dst, GdkFunction rop)
  {
  GdkGC *gc = NULL ;
  GdkRectangle rcReal ;
  QCADRuler *ruler = QCAD_RULER (obj) ;
  double
    dCurrentGrad = 0 ;
  int iPowerOfTen = 0 ;
  int idx = -1 ;
  gboolean bVertical = (QCAD_RULER_ORIENTATION_EAST == ruler->orientation || QCAD_RULER_ORIENTATION_WEST == ruler->orientation) ;
  QCADLabel *lblGrad = NULL ;

  world_to_real_rect (&(ruler->ruler_bounding_box), &rcReal) ;

  gc = gdk_gc_new (dst) ;
  gdk_gc_set_function (gc, rop) ;
  gdk_gc_set_foreground (gc, &(obj->clr)) ;

  // Graduation lines should be at least MIN_GRADATION_DISTANCE_PIXELS pixels apart
  iPowerOfTen =
    (int)ceil (log10 (bVertical
      ? real_to_world_cy (MIN_GRADATION_DISTANCE_PIXELS)
      : real_to_world_cx (MIN_GRADATION_DISTANCE_PIXELS))) ;

  ruler->icLabelsVisible = 0 ;

  if (bVertical)
    {
    int xBeg = 0, xEnd = 0, xMid = 0, yReal = 0.0 ;
    double xBegWorld, xEndWorld, xMidWorld, yWorld ;

    if (QCAD_RULER_ORIENTATION_WEST == ruler->orientation)
      {
      xBeg = world_to_real_x (xBegWorld = ruler->ruler_bounding_box.xWorld),
      xEnd = world_to_real_x (xEndWorld = ruler->ruler_bounding_box.xWorld + ruler->ruler_bounding_box.cxWorld) ;
      }
    else
      {
      xBeg = world_to_real_x (xBegWorld = ruler->ruler_bounding_box.xWorld + ruler->ruler_bounding_box.cxWorld),
      xEnd = world_to_real_x (xEndWorld = ruler->ruler_bounding_box.xWorld) ;
      }
    xMid = world_to_real_x (xMidWorld = ruler->ruler_bounding_box.xWorld + ruler->ruler_bounding_box.cxWorld / 2.0) ;

    for (dCurrentGrad = 0 ; dCurrentGrad < ruler->ruler_bounding_box.cyWorld ; dCurrentGrad += pow (10, iPowerOfTen))
      {
      idx++ ;
      idx %= 10 ;
      yReal = world_to_real_y (yWorld = ruler->ruler_bounding_box.yWorld + dCurrentGrad) ;
      gdk_draw_line (dst, gc, xBeg, yReal, (0 == idx ? xEnd : xMid), yReal) ;

      if (0 == idx)
        {
        lblGrad = get_label_from_array (ruler->labels, (ruler->icLabelsVisible)++, dCurrentGrad, &(obj->clr)) ;
        qcad_label_shrinkwrap (lblGrad) ;
        qcad_design_object_move_to (QCAD_DESIGN_OBJECT (lblGrad), xEndWorld, yWorld) ;
        qcad_design_object_draw (QCAD_DESIGN_OBJECT (lblGrad), dst, rop) ;
        }
      }
    gdk_draw_line (dst, gc, xBeg, rcReal.y, xBeg, rcReal.y + rcReal.height) ;

    lblGrad = get_label_from_array (ruler->labels, (ruler->icLabelsVisible)++, ruler->ruler_bounding_box.cyWorld, &(obj->clr)) ;
    qcad_label_shrinkwrap (lblGrad) ;
    qcad_design_object_move_to (QCAD_DESIGN_OBJECT (lblGrad), xBegWorld, ruler->ruler_bounding_box.yWorld + ruler->ruler_bounding_box.cyWorld) ;
    qcad_design_object_draw (QCAD_DESIGN_OBJECT (lblGrad), dst, rop) ;
    }
  else
    {
    int yBeg = 0, yEnd = 0, yMid = 0, xReal = 0.0 ;
    double yBegWorld, yEndWorld, yMidWorld, xWorld ;

    if (QCAD_RULER_ORIENTATION_NORTH == ruler->orientation)
      {
      yBeg = world_to_real_y (yBegWorld = ruler->ruler_bounding_box.yWorld),
      yEnd = world_to_real_y (yEndWorld = ruler->ruler_bounding_box.yWorld + ruler->ruler_bounding_box.cyWorld) ;
      }
    else
      {
      yBeg = world_to_real_y (yBegWorld = ruler->ruler_bounding_box.yWorld + ruler->ruler_bounding_box.cyWorld),
      yEnd = world_to_real_y (yEndWorld = ruler->ruler_bounding_box.yWorld) ;
      }
    yMid = world_to_real_y (yMidWorld = ruler->ruler_bounding_box.yWorld + ruler->ruler_bounding_box.cyWorld / 2.0) ;

    for (dCurrentGrad = 0 ; dCurrentGrad < ruler->ruler_bounding_box.cxWorld ; dCurrentGrad += pow (10, iPowerOfTen))
      {
      idx++ ;
      idx %= 10 ;
      xReal = world_to_real_x (xWorld = ruler->ruler_bounding_box.xWorld + dCurrentGrad) ;
      gdk_draw_line (dst, gc, xReal, yBeg, xReal, (0 == idx ? yEnd : yMid)) ;

      if (0 == idx)
        {
        lblGrad = get_label_from_array (ruler->labels, (ruler->icLabelsVisible)++, dCurrentGrad, &(obj->clr)) ;
        qcad_label_shrinkwrap (lblGrad) ;
        qcad_design_object_move_to (QCAD_DESIGN_OBJECT (lblGrad), xWorld, yEndWorld) ;
        qcad_design_object_draw (QCAD_DESIGN_OBJECT (lblGrad), dst, rop) ;
        }
      }
    gdk_draw_line (dst, gc, rcReal.x, yBeg, rcReal.x + rcReal.width, yBeg) ;

    lblGrad = get_label_from_array (ruler->labels, (ruler->icLabelsVisible)++, ruler->ruler_bounding_box.cxWorld, &(obj->clr)) ;
    qcad_label_shrinkwrap (lblGrad) ;
    qcad_design_object_move_to (QCAD_DESIGN_OBJECT (lblGrad), ruler->ruler_bounding_box.xWorld + ruler->ruler_bounding_box.cxWorld, yBegWorld) ;
    qcad_design_object_draw (QCAD_DESIGN_OBJECT (lblGrad), dst, rop) ;
    }

  g_object_unref (gc) ;
  }