diff --git a/eeschema/class_libentry.cpp b/eeschema/class_libentry.cpp index 45dc86465e..6fb4e43ac2 100644 --- a/eeschema/class_libentry.cpp +++ b/eeschema/class_libentry.cpp @@ -383,21 +383,59 @@ void LIB_COMPONENT::Plot( PLOTTER* aPlotter, int aUnit, int aConvert, { wxASSERT( aPlotter != NULL ); + aPlotter->SetColor( GetLayerColor( LAYER_DEVICE ) ); + bool fill = aPlotter->GetColorMode(); + BOOST_FOREACH( LIB_ITEM& item, drawings ) { + // Lib Fields not are plotted here, because this plot function + // is used to plot schematic items, which have they own fields + if( item.Type() == LIB_FIELD_T ) + continue; + if( aUnit && item.m_Unit && ( item.m_Unit != aUnit ) ) continue; if( aConvert && item.m_Convert && ( item.m_Convert != aConvert ) ) continue; - aPlotter->SetColor( GetLayerColor( LAYER_DEVICE ) ); - bool fill = aPlotter->GetColorMode(); - item.Plot( aPlotter, aOffset, fill, aTransform ); } } +void LIB_COMPONENT::PlotLibFields( PLOTTER* aPlotter, int aUnit, int aConvert, + const wxPoint& aOffset, const TRANSFORM& aTransform ) +{ + wxASSERT( aPlotter != NULL ); + + aPlotter->SetColor( GetLayerColor( LAYER_FIELDS ) ); + bool fill = aPlotter->GetColorMode(); + + BOOST_FOREACH( LIB_ITEM& item, drawings ) + { + if( item.Type() != LIB_FIELD_T ) + continue; + + if( aUnit && item.m_Unit && ( item.m_Unit != aUnit ) ) + continue; + + if( aConvert && item.m_Convert && ( item.m_Convert != aConvert ) ) + continue; + + // The reference is a special case: we shoud change the basic text + // to add '?' and the part id + LIB_FIELD& field = (LIB_FIELD&) item; + wxString tmp = field.GetText(); + if( field.GetId() == REFERENCE ) + { + wxString text = field.GetFullText( aUnit ); + field.SetText( text ); + } + item.Plot( aPlotter, aOffset, fill, aTransform ); + field.SetText( tmp ); + } +} + void LIB_COMPONENT::RemoveDrawItem( LIB_ITEM* aItem, EDA_DRAW_PANEL* aPanel, wxDC* aDc ) { diff --git a/eeschema/class_libentry.h b/eeschema/class_libentry.h index ee567a258e..8ce3b1622a 100644 --- a/eeschema/class_libentry.h +++ b/eeschema/class_libentry.h @@ -404,7 +404,9 @@ public: bool aOnlySelected = false ); /** - * Plot component to plotter. + * Plot lib component to plotter. + * Lib Fields not are plotted here, because this plot function + * is used to plot schematic items, which have they own fields * * @param aPlotter - Plotter object to plot to. * @param aUnit - Component part to plot. @@ -413,7 +415,20 @@ public: * @param aTransform - Component plot transform matrix. */ void Plot( PLOTTER* aPlotter, int aUnit, int aConvert, const wxPoint& aOffset, - const TRANSFORM& aTransform ); + const TRANSFORM& aTransform ); + + /** + * Plot Lib Fields only of the component to plotter. + * is used to plot the full lib component, outside the schematic + * + * @param aPlotter - Plotter object to plot to. + * @param aUnit - Component part to plot. + * @param aConvert - Component alternate body style to plot. + * @param aOffset - Distance to shift the plot coordinates. + * @param aTransform - Component plot transform matrix. + */ + void PlotLibFields( PLOTTER* aPlotter, int aUnit, int aConvert, + const wxPoint& aOffset, const TRANSFORM& aTransform ); /** * Add a new draw \a aItem to the draw object list. diff --git a/eeschema/lib_field.cpp b/eeschema/lib_field.cpp index b4bafcc4f2..052f805148 100644 --- a/eeschema/lib_field.cpp +++ b/eeschema/lib_field.cpp @@ -473,9 +473,33 @@ void LIB_FIELD::Rotate( const wxPoint& center, bool aRotateCCW ) } -void LIB_FIELD::Plot( PLOTTER* plotter, const wxPoint& offset, bool fill, +void LIB_FIELD::Plot( PLOTTER* aPlotter, const wxPoint& aOffset, bool aFill, const TRANSFORM& aTransform ) { + if( IsVoid() ) + return; + + /* Calculate the text orientation, according to the component + * orientation/mirror */ + int orient = m_Orient; + + if( aTransform.y1 ) // Rotate component 90 deg. + { + if( orient == TEXT_ORIENT_HORIZ ) + orient = TEXT_ORIENT_VERT; + else + orient = TEXT_ORIENT_HORIZ; + } + + EDA_RECT BoundaryBox = GetBoundingBox(); + EDA_TEXT_HJUSTIFY_T hjustify = GR_TEXT_HJUSTIFY_CENTER; + EDA_TEXT_VJUSTIFY_T vjustify = GR_TEXT_VJUSTIFY_CENTER; + wxPoint textpos = aTransform.TransformCoordinate( BoundaryBox.Centre() ) + + aOffset; + + aPlotter->Text( textpos, GetDefaultColor(), m_Text, orient, m_Size, + hjustify, vjustify, + GetPenSize(), m_Italic, m_Bold ); } diff --git a/eeschema/libedit_plot_component.cpp b/eeschema/libedit_plot_component.cpp index 90362cc417..45bf13a412 100644 --- a/eeschema/libedit_plot_component.cpp +++ b/eeschema/libedit_plot_component.cpp @@ -41,6 +41,8 @@ #include #include +#include + void LIB_EDIT_FRAME::OnPlotCurrentComponent( wxCommandEvent& event ) { @@ -103,7 +105,7 @@ void LIB_EDIT_FRAME::OnPlotCurrentComponent( wxCommandEvent& event ) pageTemp.SetHeightMils( int( componentSize.y * 1.2 ) ); GetScreen()->SetPageSettings( pageTemp ); - SVG_Print_Component( FullFileName ); + SVG_PlotComponent( FullFileName ); GetScreen()->SetPageSettings( pageSave ); } break; @@ -136,12 +138,49 @@ void LIB_EDIT_FRAME::CreatePNGorJPEGFile( const wxString& aFileName, bool aFmt_j } -void LIB_EDIT_FRAME::SVG_Print_Component( const wxString& FullFileName ) +void LIB_EDIT_FRAME::SVG_PlotComponent( const wxString& aFullFileName ) { - bool plotBW = false; - bool plotFrameRef = false; - DIALOG_PLOT_SCHEMATIC::plotOneSheetSVG( this, FullFileName, GetScreen(), - plotBW, plotFrameRef ); + const bool plotBW = false; + const PAGE_INFO& pageInfo = GetScreen()->GetPageSettings(); + + SVG_PLOTTER* plotter = new SVG_PLOTTER(); + plotter->SetPageSettings( pageInfo ); + plotter->SetDefaultLineWidth( GetDefaultLineThickness() ); + plotter->SetColorMode( plotBW ); + + wxPoint plot_offset; + const double scale = 1.0; + plotter->SetViewport( plot_offset, IU_PER_DECIMILS, scale, false ); + + // Init : + plotter->SetCreator( wxT( "Eeschema-SVG" ) ); + + if( ! plotter->OpenFile( aFullFileName ) ) + { + delete plotter; + return; + } + + LOCALE_IO toggle; + + plotter->StartPlot(); + + if( m_component ) + { + TRANSFORM temp; // Uses default transform + wxPoint plotPos; + plotPos.x = pageInfo.GetWidthIU() /2; + plotPos.y = pageInfo.GetHeightIU()/2; + + m_component->Plot( plotter, GetUnit(), GetConvert(), plotPos, temp ); + + // Plot lib fields, not plotted by m_component->Plot(): + m_component->PlotLibFields( plotter, GetUnit(), GetConvert(), + plotPos, temp ); + } + + plotter->EndPlot(); + delete plotter; } void LIB_EDIT_FRAME::PrintPage( wxDC* aDC, LAYER_MSK aPrintMask, bool aPrintMirrorMode, void* aData) diff --git a/eeschema/libeditframe.h b/eeschema/libeditframe.h index af7e5b001c..16802af6b0 100644 --- a/eeschema/libeditframe.h +++ b/eeschema/libeditframe.h @@ -641,11 +641,11 @@ public: bool aPrintMirrorMode, void* aData = NULL ); /** - * Function SVG_Print_Component + * Function SVG_PlotComponent * Creates the SVG print file for the current edited component. - * @param aFullFileName = the full filename of the file + * @param aFullFileName = the full filename */ - void SVG_Print_Component( const wxString& aFullFileName ); + void SVG_PlotComponent( const wxString& aFullFileName ); DECLARE_EVENT_TABLE() diff --git a/eeschema/sch_screen.cpp b/eeschema/sch_screen.cpp index 3d1a25f606..d0f3a5bcb9 100644 --- a/eeschema/sch_screen.cpp +++ b/eeschema/sch_screen.cpp @@ -1,8 +1,10 @@ /* * This program source code file is part of KiCad, a free EDA CAD application. * - * Copyright (C) 2009 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com - * Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors. + * Copyright (C) 2013 Jean-Pierre Charras, jp.charras at wanadoo.fr + * Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck + * Copyright (C) 2008-2013 Wayne Stambaugh + * Copyright (C) 1992-2013 KiCad Developers, see AUTHORS.txt for contributors. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -549,9 +551,10 @@ bool SCH_SCREEN::Save( FILE* aFile ) const return true; } -// note: SCH_SCREEN::Draw is useful only for schematic. -// library editor and library viewer do not use a draw list, and therefore -// SCH_SCREEN::Draw draws nothing +/* note: SCH_SCREEN::Draw is useful only for schematic. + * library editor and library viewer do not use a draw list, and therefore + * SCH_SCREEN::Draw draws nothing + */ void SCH_SCREEN::Draw( EDA_DRAW_PANEL* aCanvas, wxDC* aDC, GR_DRAWMODE aDrawMode, EDA_COLOR_T aColor ) { for( SCH_ITEM* item = m_drawList.begin(); item != NULL; item = item->Next() ) @@ -568,6 +571,10 @@ void SCH_SCREEN::Draw( EDA_DRAW_PANEL* aCanvas, wxDC* aDC, GR_DRAWMODE aDrawMode } +/* note: SCH_SCREEN::Plot is useful only for schematic. + * library editor and library viewer do not use a draw list, and therefore + * SCH_SCREEN::Plot plots nothing + */ void SCH_SCREEN::Plot( PLOTTER* aPlotter ) { for( SCH_ITEM* item = m_drawList.begin(); item; item = item->Next() ) diff --git a/include/class_sch_screen.h b/include/class_sch_screen.h index 26f9a7b0ec..14cdefa81d 100644 --- a/include/class_sch_screen.h +++ b/include/class_sch_screen.h @@ -184,6 +184,9 @@ public: /** * Function Draw * draws all the items in the screen to \a aCanvas. + * note: this function is useful only for schematic. + * library editor and library viewer do not use a draw list, and therefore + * draws nothing * @param aCanvas The canvas item to draw on. * @param aDC The device context to draw on. * @param aDrawMode The drawing mode. @@ -195,6 +198,9 @@ public: /** * Function Plot * plots all the schematic objects to \a aPlotter. + * note: this function is useful only for schematic. + * library editor and library viewer do not use a draw list, and therefore + * plots nothing * * @param aPlotter The plotter object to plot to. */