void DIALOG_PLOT_SCHEMATIC::plotOneSheetPDF( PLOTTER* aPlotter, SCH_SCREEN* aScreen, bool aPlotFrameRef ) { if( aPlotFrameRef ) { aPlotter->SetColor( BLACK ); PlotWorkSheet( aPlotter, m_parent->GetTitleBlock(), m_parent->GetPageSettings(), aScreen->m_ScreenNumber, aScreen->m_NumberOfScreens, m_parent->GetScreenDesc(), aScreen->GetFileName() ); } aScreen->Plot( aPlotter ); }
bool DIALOG_PLOT_SCHEMATIC::plotOneSheetSVG( EDA_DRAW_FRAME* aFrame, const wxString& aFileName, SCH_SCREEN* aScreen, bool aPlotBlackAndWhite, bool aPlotFrameRef ) { SVG_PLOTTER* plotter = new SVG_PLOTTER(); const PAGE_INFO& pageInfo = aScreen->GetPageSettings(); plotter->SetPageSettings( pageInfo ); plotter->SetDefaultLineWidth( GetDefaultLineThickness() ); plotter->SetColorMode( aPlotBlackAndWhite ? false : true ); wxPoint plot_offset; double scale = 1.0; plotter->SetViewport( plot_offset, IU_PER_DECIMILS, scale, false ); // Init : plotter->SetCreator( wxT( "Eeschema-SVG" ) ); if( ! plotter->OpenFile( aFileName ) ) { delete plotter; return false; } LOCALE_IO toggle; plotter->StartPlot(); if( aPlotFrameRef ) { plotter->SetColor( BLACK ); PlotWorkSheet( plotter, aFrame->GetTitleBlock(), aFrame->GetPageSettings(), aScreen->m_ScreenNumber, aScreen->m_NumberOfScreens, aFrame->GetScreenDesc(), aScreen->GetFileName() ); } aScreen->Plot( plotter ); plotter->EndPlot(); delete plotter; return true; }
bool DIALOG_PLOT_SCHEMATIC::Plot_1_Page_HPGL( const wxString& aFileName, SCH_SCREEN* aScreen, const PAGE_INFO& aPageInfo, wxPoint aPlot0ffset, double aScale, bool aPlotFrameRef ) { HPGL_PLOTTER* plotter = new HPGL_PLOTTER(); plotter->SetPageSettings( aPageInfo ); // Currently, plot units are in decimil plotter->SetViewport( aPlot0ffset, IU_PER_MILS/10, aScale, false ); // Init : plotter->SetCreator( wxT( "Eeschema-HPGL" ) ); if( ! plotter->OpenFile( aFileName ) ) { delete plotter; return false; } LOCALE_IO toggle; // Pen num and pen speed are not initialized here. // Default HPGL driver values are used plotter->SetPenDiameter( m_HPGLPenSize ); plotter->StartPlot(); plotter->SetColor( BLACK ); if( getPlotFrameRef() ) PlotWorkSheet( plotter, m_parent->GetTitleBlock(), m_parent->GetPageSettings(), aScreen->m_ScreenNumber, aScreen->m_NumberOfScreens, m_parent->GetScreenDesc(), aScreen->GetFileName() ); aScreen->Plot( plotter ); plotter->EndPlot(); delete plotter; return true; }
bool DIALOG_PLOT_SCHEMATIC::plotOneSheetPS( const wxString& aFileName, SCH_SCREEN* aScreen, const PAGE_INFO& aPageInfo, wxPoint aPlot0ffset, double aScale, bool aPlotFrameRef ) { PS_PLOTTER* plotter = new PS_PLOTTER(); plotter->SetPageSettings( aPageInfo ); plotter->SetDefaultLineWidth( GetDefaultLineThickness() ); plotter->SetColorMode( getModeColor() ); // Currently, plot units are in decimil plotter->SetViewport( aPlot0ffset, IU_PER_MILS/10, aScale, false ); // Init : plotter->SetCreator( wxT( "Eeschema-PS" ) ); if( ! plotter->OpenFile( aFileName ) ) { delete plotter; return false; } LOCALE_IO toggle; // Switch the locale to standard C plotter->StartPlot(); if( aPlotFrameRef ) { plotter->SetColor( BLACK ); PlotWorkSheet( plotter, m_parent->GetTitleBlock(), m_parent->GetPageSettings(), aScreen->m_ScreenNumber, aScreen->m_NumberOfScreens, m_parent->GetScreenDesc(), aScreen->GetFileName() ); } aScreen->Plot( plotter ); plotter->EndPlot(); delete plotter; return true; }
bool DIALOG_PLOT_SCHEMATIC::PlotOneSheetDXF( const wxString& aFileName, SCH_SCREEN* aScreen, wxPoint aPlotOffset, double aScale, bool aPlotFrameRef ) { DXF_PLOTTER* plotter = new DXF_PLOTTER(); const PAGE_INFO& pageInfo = aScreen->GetPageSettings(); plotter->SetPageSettings( pageInfo ); plotter->SetColorMode( getModeColor() ); // Currently, plot units are in decimil plotter->SetViewport( aPlotOffset, IU_PER_MILS/10, aScale, false ); // Init : plotter->SetCreator( wxT( "Eeschema-DXF" ) ); if( ! plotter->OpenFile( aFileName ) ) { delete plotter; return false; } LOCALE_IO toggle; plotter->StartPlot(); if( aPlotFrameRef ) { PlotWorkSheet( plotter, m_parent->GetTitleBlock(), m_parent->GetPageSettings(), aScreen->m_ScreenNumber, aScreen->m_NumberOfScreens, m_parent->GetScreenDesc(), aScreen->GetFileName() ); } aScreen->Plot( plotter ); // finish plotter->EndPlot(); delete plotter; return true; }
/** Open a new plotfile using the options (and especially the format) * specified in the options and prepare the page for plotting. * Return the plotter object if OK, NULL if the file is not created * (or has a problem) */ PLOTTER* StartPlotBoard( BOARD *aBoard, PCB_PLOT_PARAMS *aPlotOpts, const wxString& aFullFileName, const wxString& aSheetDesc ) { // Create the plotter driver and set the few plotter specific // options PLOTTER* plotter = NULL; switch( aPlotOpts->GetFormat() ) { case PLOT_FORMAT_DXF: plotter = new DXF_PLOTTER(); break; case PLOT_FORMAT_POST: PS_PLOTTER* PS_plotter; PS_plotter = new PS_PLOTTER(); PS_plotter->SetScaleAdjust( aPlotOpts->GetFineScaleAdjustX(), aPlotOpts->GetFineScaleAdjustY() ); plotter = PS_plotter; break; case PLOT_FORMAT_PDF: plotter = new PDF_PLOTTER(); break; case PLOT_FORMAT_HPGL: HPGL_PLOTTER* HPGL_plotter; HPGL_plotter = new HPGL_PLOTTER(); /* HPGL options are a little more convoluted to compute, so they're split in an other function */ ConfigureHPGLPenSizes( HPGL_plotter, aPlotOpts ); plotter = HPGL_plotter; break; case PLOT_FORMAT_GERBER: plotter = new GERBER_PLOTTER(); break; case PLOT_FORMAT_SVG: plotter = new SVG_PLOTTER(); break; default: wxASSERT( false ); return NULL; } // Compute the viewport and set the other options // page layout is not mirrored, so temporary change mirror option // just to plot the page layout PCB_PLOT_PARAMS plotOpts = *aPlotOpts; if( plotOpts.GetPlotFrameRef() && plotOpts.GetMirror() ) plotOpts.SetMirror( false ); initializePlotter( plotter, aBoard, &plotOpts ); if( plotter->OpenFile( aFullFileName ) ) { plotter->StartPlot(); // Plot the frame reference if requested if( aPlotOpts->GetPlotFrameRef() ) { PlotWorkSheet( plotter, aBoard->GetTitleBlock(), aBoard->GetPageSettings(), 1, 1, // Only one page aSheetDesc, aBoard->GetFileName() ); if( aPlotOpts->GetMirror() ) initializePlotter( plotter, aBoard, aPlotOpts ); } /* When plotting a negative board: draw a black rectangle * (background for plot board in white) and switch the current * color to WHITE; note the color inversion is actually done * in the driver (if supported) */ if( aPlotOpts->GetNegative() ) { EDA_RECT bbox = aBoard->ComputeBoundingBox(); FillNegativeKnockout( plotter, bbox ); } return plotter; } delete plotter; return NULL; }
void WinEDA_PlotPSFrame::PlotOneSheetPS(const wxString & FileName, BASE_SCREEN * screen, Ki_PageDescr * sheet, int BBox[4], wxPoint plot_offset) /**********************************************************/ /* Trace en format PS. d'une feuille de dessin */ { wxString Line; EDA_BaseStruct *DrawList; EDA_SchComponentStruct *DrawLibItem; int x1=0, y1=0, x2=0, y2=0, layer; PlotOutput = wxFopen(FileName, wxT("wt")); if (PlotOutput == NULL) { Line = wxT("\n** "); Line += _("Unable to create ") + FileName + wxT(" **\n\n"); m_MsgBox->AppendText(Line); wxBell(); return ; } Line.Printf(_("Plot: %s\n"), FileName.GetData()) ; m_MsgBox->AppendText(Line); InitPlotParametresPS(plot_offset, sheet, g_PlotScaleX, g_PlotScaleY); SetDefaultLineWidthPS( s_DefaultPenWidth); /* Init : */ PrintHeaderPS(PlotOutput, wxT("EESchema-PS"), FileName, BBox); InitPlotParametresPS(plot_offset, sheet, 1.0, 1.0); if ( m_Plot_Sheet_Ref->GetValue() ) { if ( (g_PlotFormat == PLOT_FORMAT_POST) && g_PlotPSColorOpt ) SetColorMapPS ( BLACK ); PlotWorkSheet(PLOT_FORMAT_POST, screen); } DrawList = screen->EEDrawList; while ( DrawList ) /* tracage */ { Plume('U'); layer = LAYER_NOTES; switch( DrawList->m_StructType ) { case DRAW_BUSENTRY_STRUCT_TYPE : /* Struct Raccord et Segment sont identiques */ #undef STRUCT #define STRUCT ((DrawBusEntryStruct*)DrawList) x1 = STRUCT->m_Pos.x; y1 = STRUCT->m_Pos.y; x2 = STRUCT->m_End().x; y2 = STRUCT->m_End().y; layer = STRUCT->m_Layer; case DRAW_SEGMENT_STRUCT_TYPE : #undef STRUCT #define STRUCT ((EDA_DrawLineStruct*)DrawList) if ( DrawList->m_StructType == DRAW_SEGMENT_STRUCT_TYPE) { x1 = STRUCT->m_Start.x; y1 = STRUCT->m_Start.y; x2 = STRUCT->m_End.x; y2 = STRUCT->m_End.y; layer = STRUCT->m_Layer; } if ( g_PlotPSColorOpt ) SetColorMapPS ( ReturnLayerColor(layer) ); switch (layer) { case LAYER_NOTES: /* Trace en pointilles */ fprintf(PlotOutput,"[50 50] 0 setdash\n"); Move_Plume( wxPoint(x1,y1), 'U'); Move_Plume( wxPoint(x2,y2), 'D'); fprintf(PlotOutput,"[] 0 setdash\n"); break; case LAYER_BUS: /* Trait large */ { fprintf(PlotOutput,"%d setlinewidth\n", s_DefaultPenWidth * 3); Move_Plume( wxPoint(x1,y1),'U'); Move_Plume( wxPoint(x2,y2),'D'); fprintf(PlotOutput,"%d setlinewidth\n", s_DefaultPenWidth); } break; default: Move_Plume( wxPoint(x1,y1),'U'); Move_Plume( wxPoint(x2,y2),'D'); break; } break; case DRAW_JUNCTION_STRUCT_TYPE : #undef STRUCT #define STRUCT ((DrawJunctionStruct*)DrawList) if ( g_PlotPSColorOpt ) SetColorMapPS (ReturnLayerColor(STRUCT->m_Layer) ); PlotCercle( STRUCT->m_Pos, DRAWJUNCTION_SIZE); break; case DRAW_TEXT_STRUCT_TYPE : case DRAW_LABEL_STRUCT_TYPE : case DRAW_GLOBAL_LABEL_STRUCT_TYPE : PlotTextStruct(DrawList); break; case DRAW_LIB_ITEM_STRUCT_TYPE : DrawLibItem = (EDA_SchComponentStruct *) DrawList; PlotLibPart( DrawLibItem ); break; case DRAW_PICK_ITEM_STRUCT_TYPE : break; case DRAW_POLYLINE_STRUCT_TYPE : break; case DRAW_SHEETLABEL_STRUCT_TYPE: break; case DRAW_MARKER_STRUCT_TYPE : break; case DRAW_SHEET_STRUCT_TYPE : #undef STRUCT #define STRUCT ((DrawSheetStruct*)DrawList) PlotSheetStruct(STRUCT); break; case DRAW_NOCONNECT_STRUCT_TYPE: #undef STRUCT #define STRUCT ((DrawNoConnectStruct*)DrawList) if ( g_PlotPSColorOpt ) SetColorMapPS (ReturnLayerColor(LAYER_NOCONNECT) ); PlotNoConnectStruct(STRUCT); break; default: break; } Plume('U'); DrawList = DrawList->Pnext; } /* fin */ CloseFilePS(PlotOutput); m_MsgBox->AppendText( wxT("Ok\n")); }
bool PCB_BASE_FRAME::ExportToHpglFile( const wxString& aFullFileName, int aLayer, EDA_DRAW_MODE_T aTraceMode ) { wxSize boardSize; wxPoint boardCenter; bool center = false; double scale; wxPoint offset; LOCALE_IO toggle; FILE* output_file = wxFopen( aFullFileName, wxT( "wt" ) ); if( output_file == NULL ) { return false; } // Compute pen_dim (from g_m_HPGLPenDiam in mils) in pcb units, // with plot scale (if Scale is 2, pen diameter is always g_m_HPGLPenDiam // so apparent pen diam is real pen diam / Scale int pen_diam = wxRound( (g_PcbPlotOptions.m_HPGLPenDiam * U_PCB) / g_PcbPlotOptions.m_PlotScale ); // compute pen_overlay (from g_m_HPGLPenOvr in mils) with plot scale if( g_PcbPlotOptions.m_HPGLPenOvr < 0 ) g_PcbPlotOptions.m_HPGLPenOvr = 0; if( g_PcbPlotOptions.m_HPGLPenOvr >= g_PcbPlotOptions.m_HPGLPenDiam ) g_PcbPlotOptions.m_HPGLPenOvr = g_PcbPlotOptions.m_HPGLPenDiam - 1; int pen_overlay = wxRound( g_PcbPlotOptions.m_HPGLPenOvr * 10.0 / g_PcbPlotOptions.m_PlotScale ); if( g_PcbPlotOptions.m_PlotScale != 1.0 || g_PcbPlotOptions.m_AutoScale ) { // when scale != 1.0 we must calculate the position in page // because actual position has no meaning center = true; } wxSize pageSizeIU = GetPageSizeIU(); // Calculate the center of the PCB EDA_RECT bbbox = GetBoardBoundingBox(); boardSize = bbbox.GetSize(); boardCenter = bbbox.Centre(); if( g_PcbPlotOptions.m_AutoScale ) // Optimum scale { // Fit to 80% of the page double Xscale = ( ( pageSizeIU.x * 0.8 ) / boardSize.x ); double Yscale = ( ( pageSizeIU.y * 0.8 ) / boardSize.y ); scale = MIN( Xscale, Yscale ); } else { scale = g_PcbPlotOptions.m_PlotScale; } // Calculate the page size offset. if( center ) { offset.x = wxRound( (double) boardCenter.x - ( (double) pageSizeIU.x / 2.0 ) / scale ); offset.y = wxRound( (double) boardCenter.y - ( (double) pageSizeIU.y / 2.0 ) / scale ); } else { offset.x = 0; offset.y = 0; } HPGL_PLOTTER* plotter = new HPGL_PLOTTER(); plotter->SetPageSettings( GetPageSettings() ); plotter->set_viewport( offset, scale, g_PcbPlotOptions.m_PlotMirror ); plotter->set_default_line_width( g_PcbPlotOptions.m_PlotLineWidth ); plotter->set_creator( wxT( "PCBNEW-HPGL" ) ); plotter->set_filename( aFullFileName ); plotter->set_pen_speed( g_PcbPlotOptions.m_HPGLPenSpeed ); plotter->set_pen_number( g_PcbPlotOptions.m_HPGLPenNum ); plotter->set_pen_overlap( pen_overlay ); plotter->set_pen_diameter( pen_diam ); plotter->start_plot( output_file ); // The worksheet is not significant with scale!=1... It is with paperscale!=1, anyway if( g_PcbPlotOptions.m_PlotFrameRef && !center ) PlotWorkSheet( plotter, GetScreen() ); Plot_Layer( plotter, aLayer, aTraceMode ); plotter->end_plot(); delete plotter; return true; }
void WinEDA_PlotHPGLFrame::Plot_1_Page_HPGL(const wxString & FullFileName, BASE_SCREEN * screen) /**************************************************************************/ /* Trace en format HPGL. d'une feuille de dessin 1 unite HPGL = 0.98 mils ( 1 mil = 1.02041 unite HPGL ) . */ { EDA_BaseStruct *DrawList; EDA_SchComponentStruct *DrawLibItem; int x1=0, y1=0, x2=0, y2=0, layer; wxString msg; PlotOutput = wxFopen(FullFileName, wxT("wt")); if (PlotOutput == 0) { msg = _("Unable to create ") + FullFileName; DisplayError(this, msg); return ; } msg = _("Plot ") + FullFileName + wxT("\n"); m_MsgBox->AppendText(msg); /* Init : */ PrintHeaderHPGL(PlotOutput, g_HPGL_Pen_Descr.m_Pen_Speed, g_HPGL_Pen_Descr.m_Pen_Num); PlotWorkSheet(PLOT_FORMAT_HPGL, screen); DrawList = screen->EEDrawList; while ( DrawList ) /* tracage */ { Plume('U'); layer = LAYER_NOTES; switch( DrawList->m_StructType ) { case DRAW_BUSENTRY_STRUCT_TYPE : #undef STRUCT #define STRUCT ((DrawBusEntryStruct*)DrawList) x1 = STRUCT->m_Pos.x; y1 = STRUCT->m_Pos.y; x2 = STRUCT->m_End().x; y2 = STRUCT->m_End().y; layer = STRUCT->m_Layer; case DRAW_SEGMENT_STRUCT_TYPE : #undef STRUCT #define STRUCT ((EDA_DrawLineStruct*)DrawList) if ( DrawList->m_StructType == DRAW_SEGMENT_STRUCT_TYPE) { x1 = STRUCT->m_Start.x; y1 = STRUCT->m_Start.y; x2 = STRUCT->m_End.x; y2 = STRUCT->m_End.y; layer = STRUCT->m_Layer; } switch (layer) { case LAYER_NOTES: /* Trace en pointilles */ Move_Plume( wxPoint(x1,y1),'U'); fprintf(PlotOutput,"LT 2;\n"); Move_Plume( wxPoint(x2,y2),'D'); fprintf(PlotOutput,"LT;\n"); break; case LAYER_BUS: /* Trait large */ { int deltaX = 0, deltaY = 0; double angle; if( (x2 - x1) == 0 ) deltaX = 8; else if( (y2 - y1) == 0 ) deltaY = 8; else { angle = atan2( (double)(x2-x1), (double)(y1-y2) ); deltaX = (int)( 8 * sin(angle) ); deltaY = (int)( 8 * cos(angle) ); } Move_Plume( wxPoint(x1 + deltaX, y1 - deltaY), 'U'); Move_Plume( wxPoint(x1 - deltaX,y1 + deltaY), 'D'); Move_Plume( wxPoint(x2 - deltaX,y2 + deltaY), 'D'); Move_Plume( wxPoint(x2 + deltaX,y2 - deltaY), 'D'); Move_Plume( wxPoint(x1 + deltaX,y1 - deltaY), 'D'); } break; default: Move_Plume( wxPoint(x1,y1), 'U'); Move_Plume( wxPoint(x2,y2), 'D'); break; } break; case DRAW_JUNCTION_STRUCT_TYPE : #undef STRUCT #define STRUCT ((DrawJunctionStruct*)DrawList) x1 = STRUCT->m_Pos.x; y1 = STRUCT->m_Pos.y; PlotCercle( wxPoint(x1,y1), DRAWJUNCTION_SIZE * 2); break; case DRAW_TEXT_STRUCT_TYPE : case DRAW_LABEL_STRUCT_TYPE : case DRAW_GLOBAL_LABEL_STRUCT_TYPE : PlotTextStruct(DrawList); break; case DRAW_LIB_ITEM_STRUCT_TYPE : DrawLibItem = (EDA_SchComponentStruct *) DrawList; PlotLibPart( DrawLibItem ); break; case DRAW_PICK_ITEM_STRUCT_TYPE : break; case DRAW_POLYLINE_STRUCT_TYPE : break; case DRAW_SHEETLABEL_STRUCT_TYPE : break; case DRAW_MARKER_STRUCT_TYPE : break; case DRAW_SHEET_STRUCT_TYPE : #undef STRUCT #define STRUCT ((DrawSheetStruct*)DrawList) PlotSheetStruct(STRUCT); break; case DRAW_NOCONNECT_STRUCT_TYPE: #undef STRUCT #define STRUCT ((DrawNoConnectStruct*)DrawList) PlotNoConnectStruct(STRUCT); break; default : break; } Plume('U'); DrawList = DrawList->Pnext; } /* fin */ CloseFileHPGL(PlotOutput); }