You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

161 lines
4.4 KiB

  1. /*****************************************************************/
  2. /* Routines de tracage des pistes ( Toutes, 1 piste, 1 segment ) */
  3. /*****************************************************************/
  4. #include "fctsys.h"
  5. #include "gr_basic.h"
  6. #include "common.h"
  7. #include "pcbnew.h"
  8. #include "trigo.h"
  9. #include "protos.h"
  10. /* variables locales : */
  11. /*********************************************************************************/
  12. void Trace_Pistes(WinEDA_DrawPanel * panel, BOARD * Pcb, wxDC * DC, int drawmode)
  13. /********************************************************************************/
  14. /* Draw all tracks and zones.
  15. */
  16. {
  17. TRACK * track;
  18. track = Pcb->m_Track;
  19. for ( ; track != NULL ; track = track->Next() )
  20. {
  21. track->Draw(panel, DC, drawmode);
  22. }
  23. track = Pcb->m_Zone;
  24. for ( ; track != NULL ; track = track->Next() )
  25. {
  26. track->Draw(panel, DC, drawmode);
  27. }
  28. }
  29. /************************************************************************/
  30. void Trace_Une_Piste(WinEDA_DrawPanel * panel, wxDC * DC, TRACK * Track,
  31. int nbsegment, int draw_mode)
  32. /************************************************************************/
  33. /* routine de trace de n segments consecutifs en memoire.
  34. Utile pour monter une piste en cours de trace car les segments de cette
  35. piste sont alors contigus en memoire
  36. Parametres :
  37. pt_start_piste = adresse de depart de la liste des segments
  38. nbsegment = nombre de segments a tracer
  39. draw_mode = mode ( GR_XOR, GR_OR..)
  40. ATTENTION:
  41. le point de depart d'une piste suivante DOIT exister: peut etre
  42. donc mis a 0 avant appel a la routine si la piste a tracer est la derniere
  43. */
  44. {
  45. if ( Track == NULL ) return;
  46. for ( ;nbsegment > 0; nbsegment--, Track = (TRACK*)Track->Pnext)
  47. {
  48. if ( Track == NULL ) break;
  49. Track->Draw(panel, DC, draw_mode) ;
  50. }
  51. }
  52. /*************************************************************/
  53. void Trace_DrawSegmentPcb(WinEDA_DrawPanel * panel, wxDC * DC,
  54. DRAWSEGMENT * PtDrawSegment, int draw_mode)
  55. /*************************************************************/
  56. /* Affichage d'un segment type drawing PCB:
  57. draw_mode = mode de trace ( GR_OR, GR_XOR, GrAND)
  58. Les contours sont de differents type:
  59. segment
  60. cercle
  61. arc
  62. */
  63. {
  64. int ux0, uy0, dx, dy;
  65. int l_piste;
  66. int color, mode;
  67. int zoom;
  68. int rayon;
  69. color = g_DesignSettings.m_LayerColor[PtDrawSegment->m_Layer];
  70. if(color & ITEM_NOT_SHOW ) return ;
  71. if ( panel ) zoom = panel->GetZoom();
  72. else zoom = ActiveScreen->GetZoom();
  73. GRSetDrawMode(DC, draw_mode);
  74. l_piste = PtDrawSegment->m_Width >> 1; /* l_piste = demi largeur piste */
  75. /* coord de depart */
  76. ux0 = PtDrawSegment->m_Start.x;
  77. uy0 = PtDrawSegment->m_Start.y;
  78. /* coord d'arrivee */
  79. dx = PtDrawSegment->m_End.x;
  80. dy = PtDrawSegment->m_End.y;
  81. mode = DisplayOpt.DisplayDrawItems;
  82. if(PtDrawSegment->m_Flags & FORCE_SKETCH) mode = SKETCH;
  83. if ( l_piste < (L_MIN_DESSIN * zoom) ) mode = FILAIRE;
  84. switch (PtDrawSegment->m_Shape)
  85. {
  86. case S_CIRCLE:
  87. rayon = (int)hypot((double)(dx-ux0),(double)(dy-uy0) );
  88. if ( mode == FILAIRE)
  89. {
  90. GRCircle(&panel->m_ClipBox, DC, ux0, uy0, rayon, color) ;
  91. }
  92. else if( mode == SKETCH)
  93. {
  94. GRCircle(&panel->m_ClipBox, DC, ux0, uy0, rayon-l_piste, color);
  95. GRCircle(&panel->m_ClipBox, DC, ux0, uy0, rayon+l_piste, color);
  96. }
  97. else
  98. {
  99. GRCircle(&panel->m_ClipBox, DC, ux0, uy0, rayon, PtDrawSegment->m_Width,color);
  100. }
  101. break;
  102. case S_ARC:
  103. {
  104. int StAngle, EndAngle;
  105. rayon = (int)hypot((double)(dx-ux0),(double)(dy-uy0) );
  106. StAngle = (int) ArcTangente(dy-uy0, dx-ux0);
  107. EndAngle = StAngle + PtDrawSegment->m_Angle;
  108. if ( StAngle > EndAngle) EXCHG (StAngle, EndAngle);
  109. if ( mode == FILAIRE)
  110. GRArc(&panel->m_ClipBox, DC, ux0, uy0, StAngle, EndAngle, rayon, color);
  111. else if( mode == SKETCH)
  112. {
  113. GRArc(&panel->m_ClipBox, DC, ux0, uy0, StAngle, EndAngle,
  114. rayon - l_piste, color);
  115. GRArc(&panel->m_ClipBox, DC, ux0, uy0, StAngle, EndAngle,
  116. rayon + l_piste, color);
  117. }
  118. else
  119. {
  120. GRArc(&panel->m_ClipBox, DC, ux0, uy0, StAngle, EndAngle,
  121. rayon, PtDrawSegment->m_Width,color);
  122. }
  123. }
  124. break;
  125. default:
  126. if( mode == FILAIRE)
  127. GRLine(&panel->m_ClipBox, DC, ux0, uy0, dx, dy, 0, color) ;
  128. else if( mode == SKETCH)
  129. {
  130. GRCSegm(&panel->m_ClipBox, DC, ux0, uy0, dx, dy,
  131. PtDrawSegment->m_Width, color) ;
  132. }
  133. else
  134. {
  135. GRFillCSegm(&panel->m_ClipBox, DC, ux0, uy0, dx, dy,
  136. PtDrawSegment->m_Width, color) ;
  137. }
  138. break;
  139. }
  140. }