/******************************************/ /* Kicad: Common plot HPGL Routines */ /******************************************/ #include "fctsys.h" #include "gr_basic.h" #include "trigo.h" #include "wxstruct.h" #include "base_struct.h" #include "common.h" #include "plot_common.h" #include "macros.h" /* parametre HPGL pour trace de cercle: */ #define CHORD_ANGLE 10 // Variables partagees avec Common plot Postscript Routines extern wxPoint LastPenPosition; extern wxPoint PlotOffset; extern FILE * PlotOutputFile; extern double XScale, YScale; extern int g_DefaultPenWidth, g_CurrentPenWidth; extern int PlotOrientOptions, etat_plume; //Variables locales void Move_Plume_HPGL( wxPoint pos, int plume ); void Plume_HPGL( int plume ); /***********************************************************************************/ void InitPlotParametresHPGL(wxPoint offset, double xscale, double yscale, int orient) /***********************************************************************************/ /* Set the plot offset for the current plotting xscale,yscale = coordinate scale (scale coefficient for coordinates) device_xscale,device_yscale = device coordinate scale (i.e scale used by plot device) */ { PlotOffset = offset; XScale = xscale; YScale = yscale; g_DefaultPenWidth = 6; /* epaisseur du trait standard en 1/1000 pouce */ PlotOrientOptions = orient; g_CurrentPenWidth = -1; } /*****************************************************************/ bool PrintHeaderHPGL(FILE * plot_file, int pen_speed, int pen_num) /*****************************************************************/ { char Line[256]; PlotOutputFile = plot_file; etat_plume = 'U'; sprintf(Line,"IN;VS%d;PU;PA;SP%d;\n",pen_speed,pen_num); fputs(Line,plot_file); return TRUE; } /**********************************/ bool CloseFileHPGL(FILE * plot_file) /**********************************/ { fputs("PU;PA;SP0;\n",plot_file); fclose(plot_file); return TRUE; } /************************************************************/ void PlotCircle_HPGL(wxPoint centre, int diameter, int width) /************************************************************/ { int rayon; char Line[256]; UserToDeviceCoordinate(centre); rayon = (int)(diameter / 2 * XScale); if(rayon < 0 ) rayon = 0 ; Plume_HPGL('U'); sprintf(Line,"PA %d,%d;CI %d,%d;\n", centre.x, centre.y, rayon , CHORD_ANGLE); fputs(Line,PlotOutputFile) ; Plume_HPGL('U'); return ; } /********************************************************************/ void PlotArcHPGL(wxPoint centre, int StAngle, int EndAngle, int rayon, int width) /********************************************************************/ /* trace d'un arc de cercle: centre = coord du centre StAngle, EndAngle = angle de debut et fin rayon = rayon de l'arc commande PU;PA x,y;PD;AA start_arc_X, start_arc_Y, angle, NbSegm; PU; ou PU;PA x,y;PD;AA start_arc_X, start_arc_Y, angle; PU; */ { char Line[256]; wxPoint cmap; /* point de depart */ wxPoint cpos; /* centre */ float angle; /* angle de l'arc*/ if(rayon <= 0 ) return ; cpos = centre; UserToDeviceCoordinate(cpos); if( PlotOrientOptions == PLOT_MIROIR) { EndAngle = - EndAngle; StAngle = - StAngle; EXCHG (StAngle, EndAngle); } angle = (EndAngle - StAngle) /10.0; /* Calcul des coord du point de depart : */ cmap.x = (int)( centre.x + ( rayon * cos(StAngle * M_PI / 1800 ) ) ); cmap.y = (int)(centre.y + ( rayon * sin(StAngle * M_PI / 1800 ) ) ); UserToDeviceCoordinate(cmap); Plume_HPGL('U'); sprintf(Line,"PU;PA %d,%d;PD;AA %d,%d, ", cmap.x, cmap.y, cpos.x, cpos.y); fputs(Line,PlotOutputFile) ; sprintf(Line,"%f", - angle); to_point(Line); // Transforme , et . du separateur fputs(Line,PlotOutputFile) ; sprintf(Line,", %d", CHORD_ANGLE); fputs(Line,PlotOutputFile) ; sprintf(Line,";PU;\n"); fputs(Line,PlotOutputFile) ; Plume_HPGL('U'); } /*****************************************************/ void PlotPolyHPGL( int nb, int * coord, int fill, int width) /*****************************************************/ /* Trace un polygone (ferme si rempli) en format HPGL coord = tableau des coord des sommets nb = nombre de coord ( 1 coord = 2 elements: X et Y du tableau ) fill : si != 0 polygone rempli */ { int ii; if( nb <= 1 ) return; Move_Plume_HPGL( wxPoint(coord[0],coord[1]), 'U'); for( ii = 1; ii < nb ; ii ++ ) { Move_Plume_HPGL( wxPoint(coord[ii * 2],coord[(ii*2) +1]), 'D'); } /* Fermeture eventuelle du polygone */ if ( fill ) { ii = (nb - 1) * 2; if( (coord[ii] != coord[0] ) || (coord[ii+1] != coord[0]) ) Move_Plume_HPGL( wxPoint(coord[0],coord[1]), 'D'); } Plume_HPGL('U'); } /**********************************************/ void Move_Plume_HPGL( wxPoint pos, int plume ) /**********************************************/ /* deplace la plume levee (plume = 'U') ou baissee (plume = 'D') en position x,y Unites en Unites DESSIN Si plume = 'Z' lever de plume sans deplacement */ { char Line[256]; if ( plume == 'Z') { Plume_HPGL('U'); return; } Plume_HPGL(plume); UserToDeviceCoordinate(pos); sprintf(Line,"PA %d,%d;\n",pos.x,pos.y) ; fputs(Line,PlotOutputFile) ; } /***************************/ void Plume_HPGL( int plume ) /***************************/ /* leve (plume = 'U') ou baisse (plume = 'D') la plume */ { if ( plume == 'U') { if(etat_plume != 'U' ) fputs("PU;",PlotOutputFile) ; etat_plume = 'U'; } else { if(etat_plume != 'D' )fputs("PD;",PlotOutputFile) ; etat_plume = 'D'; } }