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.
		
		
		
		
		
			
		
			
				
					
					
						
							171 lines
						
					
					
						
							5.0 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							171 lines
						
					
					
						
							5.0 KiB
						
					
					
				| /*****************************************************************/ | |
| /* Routines de tracage des pistes ( Toutes, 1 piste, 1 segment ) */ | |
| /*****************************************************************/ | |
| 
 | |
| #include "fctsys.h" | |
| #include "gr_basic.h" | |
|  | |
| #include "common.h" | |
| #include "pcbnew.h" | |
| #include "trigo.h" | |
|  | |
| #include "protos.h" | |
|  | |
| /* variables locales : */ | |
| 
 | |
| /*********************************************************************************/ | |
| void Trace_Pistes( WinEDA_DrawPanel* panel, BOARD* Pcb, wxDC* DC, int drawmode ) | |
| /********************************************************************************/ | |
| 
 | |
| /* Draw all tracks and zones. | |
|  */ | |
| { | |
|     TRACK* track; | |
| 
 | |
|     track = Pcb->m_Track; | |
|     for( ; track != NULL; track = track->Next() ) | |
|     { | |
|         track->Draw( panel, DC, drawmode ); | |
|     } | |
| 
 | |
|     track = Pcb->m_Zone; | |
|     for( ; track != NULL; track = track->Next() ) | |
|     { | |
|         track->Draw( panel, DC, drawmode ); | |
|     } | |
| } | |
| 
 | |
| 
 | |
| /************************************************************************/ | |
| void Trace_Une_Piste( WinEDA_DrawPanel* panel, wxDC* DC, TRACK* Track, | |
|                       int nbsegment, int draw_mode ) | |
| /************************************************************************/ | |
| 
 | |
| /* routine de trace de n segments consecutifs en memoire. | |
|  *  Utile pour monter une piste en cours de trace car les segments de cette | |
|  *  piste sont alors contigus en memoire | |
|  *  Parametres : | |
|  *  pt_start_piste = adresse de depart de la liste des segments | |
|  *  nbsegment = nombre de segments a tracer | |
|  *  draw_mode = mode ( GR_XOR, GR_OR..) | |
|  *  ATTENTION: | |
|  *  le point de depart d'une piste suivante DOIT exister: peut etre | |
|  *  donc mis a 0 avant appel a la routine si la piste a tracer est la derniere | |
|  */ | |
| { | |
|     if( Track == NULL ) | |
|         return; | |
|     for( ; nbsegment > 0; nbsegment--, Track = (TRACK*) Track->Pnext ) | |
|     { | |
|         if( Track == NULL ) | |
|             break; | |
|         Track->Draw( panel, DC, draw_mode ); | |
|     } | |
| } | |
| 
 | |
| 
 | |
| /*************************************************************/ | |
| void Trace_DrawSegmentPcb( WinEDA_DrawPanel* panel, wxDC* DC, | |
|                            DRAWSEGMENT* PtDrawSegment, int draw_mode ) | |
| /*************************************************************/ | |
| 
 | |
| /* Affichage d'un segment type drawing PCB: | |
|  *  draw_mode = mode de trace ( GR_OR, GR_XOR, GrAND) | |
|  *      Les contours sont de differents type: | |
|  *      segment | |
|  *      cercle | |
|  *      arc | |
|  */ | |
| { | |
|     int ux0, uy0, dx, dy; | |
|     int l_piste; | |
|     int color, mode; | |
|     int zoom; | |
|     int rayon; | |
| 
 | |
|     color = g_DesignSettings.m_LayerColor[PtDrawSegment->GetLayer()]; | |
|     if( color & ITEM_NOT_SHOW ) | |
|         return; | |
| 
 | |
|     if( panel ) | |
|         zoom = panel->GetZoom(); | |
|     else | |
|         zoom = ActiveScreen->GetZoom(); | |
| 
 | |
|     GRSetDrawMode( DC, draw_mode ); | |
|     l_piste = PtDrawSegment->m_Width >> 1;  /* l_piste = demi largeur piste */ | |
| 
 | |
|     /* coord de depart */ | |
|     ux0 = PtDrawSegment->m_Start.x; | |
|     uy0 = PtDrawSegment->m_Start.y; | |
|     /* coord d'arrivee */ | |
|     dx = PtDrawSegment->m_End.x; | |
|     dy = PtDrawSegment->m_End.y; | |
| 
 | |
| 
 | |
|     mode = DisplayOpt.DisplayDrawItems; | |
|     if( PtDrawSegment->m_Flags & FORCE_SKETCH ) | |
|         mode = SKETCH; | |
|     if( l_piste < (L_MIN_DESSIN * zoom) ) | |
|         mode = FILAIRE; | |
| 
 | |
|     switch( PtDrawSegment->m_Shape ) | |
|     { | |
|     case S_CIRCLE: | |
|         rayon = (int) hypot( (double) (dx - ux0), (double) (dy - uy0) ); | |
|         if( mode == FILAIRE ) | |
|         { | |
|             GRCircle( &panel->m_ClipBox, DC, ux0, uy0, rayon, color ); | |
|         } | |
|         else if( mode == SKETCH ) | |
|         { | |
|             GRCircle( &panel->m_ClipBox, DC, ux0, uy0, rayon - l_piste, color ); | |
|             GRCircle( &panel->m_ClipBox, DC, ux0, uy0, rayon + l_piste, color ); | |
|         } | |
|         else | |
|         { | |
|             GRCircle( &panel->m_ClipBox, DC, ux0, uy0, rayon, PtDrawSegment->m_Width, color ); | |
|         } | |
|         break; | |
| 
 | |
|     case S_ARC: | |
|     { | |
|         int StAngle, EndAngle; | |
|         rayon    = (int) hypot( (double) (dx - ux0), (double) (dy - uy0) ); | |
|         StAngle  = (int) ArcTangente( dy - uy0, dx - ux0 ); | |
|         EndAngle = StAngle + PtDrawSegment->m_Angle; | |
|         if( StAngle > EndAngle ) | |
|             EXCHG( StAngle, EndAngle ); | |
|         if( mode == FILAIRE ) | |
|             GRArc( &panel->m_ClipBox, DC, ux0, uy0, StAngle, EndAngle, rayon, color ); | |
|         else if( mode == SKETCH ) | |
|         { | |
|             GRArc( &panel->m_ClipBox, DC, ux0, uy0, StAngle, EndAngle, | |
|                    rayon - l_piste, color ); | |
|             GRArc( &panel->m_ClipBox, DC, ux0, uy0, StAngle, EndAngle, | |
|                    rayon + l_piste, color ); | |
|         } | |
|         else | |
|         { | |
|             GRArc( &panel->m_ClipBox, DC, ux0, uy0, StAngle, EndAngle, | |
|                    rayon, PtDrawSegment->m_Width, color ); | |
|         } | |
|     } | |
|         break; | |
| 
 | |
|     default: | |
|         if( mode == FILAIRE ) | |
|             GRLine( &panel->m_ClipBox, DC, ux0, uy0, dx, dy, 0, color ); | |
|         else if( mode == SKETCH ) | |
|         { | |
|             GRCSegm( &panel->m_ClipBox, DC, ux0, uy0, dx, dy, | |
|                      PtDrawSegment->m_Width, color ); | |
|         } | |
|         else | |
|         { | |
|             GRFillCSegm( &panel->m_ClipBox, DC, ux0, uy0, dx, dy, | |
|                          PtDrawSegment->m_Width, color ); | |
|         } | |
|         break; | |
|     } | |
| }
 |