From ac45264b4ea29c4bcf67fafb63c58c3b3e9e52e9 Mon Sep 17 00:00:00 2001 From: charras Date: Fri, 1 May 2009 16:46:56 +0000 Subject: [PATCH] some enhancements in pcbnew (see changelog) and Cmake files updated to handle a change in doc files --- CHANGELOG.txt | 7 + common/base_struct.cpp | 38 +- include/base_struct.h | 22 +- pcbnew/class_pcb_text.cpp | 109 +++-- pcbnew/dialog_copper_zones.cpp | 2 - ...ialog_non_copper_zones_properties_base.cpp | 36 +- ...ialog_non_copper_zones_properties_base.fbp | 376 +++++++++++++----- .../dialog_non_copper_zones_properties_base.h | 15 +- pcbnew/plot_rtn.cpp | 62 ++- pcbnew/zones_non_copper_type_functions.cpp | 53 ++- 10 files changed, 532 insertions(+), 188 deletions(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 0ad869fe89..7688052781 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -4,6 +4,13 @@ KiCad ChangeLog 2009 Please add newer entries at the top, list the date and your name with email address. +2009-may-01 UPDATE Jean-Pierre Charras +================================================================================ +++pcbnew: + Better dialog options for zones on technical layers. + Zones on silk screen filled with segments are now plotted + Better support of multiline texts (work in progress) + 2009-apr-25 UPDATE Jean-Pierre Charras ================================================================================ ++ Eeschema: diff --git a/common/base_struct.cpp b/common/base_struct.cpp index 020f6abd16..6f471ff8be 100644 --- a/common/base_struct.cpp +++ b/common/base_struct.cpp @@ -171,7 +171,7 @@ EDA_TextStruct::EDA_TextStruct( const wxString& text ) m_Orient = 0; /* Orient in 0.1 degrees */ m_Attributs = 0; m_Mirror = false; // display mirror if true - m_HJustify = GR_TEXT_HJUSTIFY_LEFT; + m_HJustify = GR_TEXT_HJUSTIFY_CENTER; m_VJustify = GR_TEXT_VJUSTIFY_CENTER; /* Justifications Horiz et Vert du texte */ m_Width = 0; /* thickness */ m_Italic = false; /* true = italic shape */ @@ -267,6 +267,7 @@ void EDA_TextStruct::Draw( WinEDA_DrawPanel* aPanel, wxDC* aDC, /***************************************************************/ /** Function Draw + * Draws this, that can be a multiline text * @param aPanel = the current DrawPanel * @param aDC = the current Device Context * @param aOffset = draw offset (usually (0,0)) @@ -279,11 +280,18 @@ void EDA_TextStruct::Draw( WinEDA_DrawPanel* aPanel, wxDC* aDC, { wxPoint pos = m_Pos; wxArrayString* list = wxStringSplit( m_Text, '\n' ); + wxPoint offset; + + offset.y = (int) (m_Size.y * 1.5 ); + + RotatePoint( &offset, m_Orient ); + if( m_Mirror ) + offset.x = -offset.x; for( unsigned i = 0; iCount(); i++ ) { wxString txt = list->Item( i ); - wxSize size = DrawOneLine( aPanel, + DrawOneLineOfText( aPanel, aDC, aOffset, aColor, @@ -292,18 +300,31 @@ void EDA_TextStruct::Draw( WinEDA_DrawPanel* aPanel, wxDC* aDC, aAnchor_color, txt, pos ); - pos.y += 1.5 * (size.y); + pos += offset; } delete (list); } -wxSize EDA_TextStruct::DrawOneLine( WinEDA_DrawPanel* aPanel, wxDC* aDC, +/** Function DrawOneLineOfText + * Draw a single text line. + * Used to draw each line of this EDA_TextStruct, that can be multiline + * @param aPanel = the current DrawPanel + * @param aDC = the current Device Context + * @param aOffset = draw offset (usually (0,0)) + * @param EDA_Colors aColor = text color + * @param aDrawMode = GR_OR, GR_XOR.., -1 to use the current mode. + * @param aDisplayMode = FILAIRE, FILLED or SKETCH + * @param EDA_Colors aAnchor_color = anchor color ( UNSPECIFIED_COLOR = do not draw anchor ). + * @param EDA_Colors aText = the single line of text to draw. + * @param EDA_Colors aPos = the position of this line ). + */ +void EDA_TextStruct::DrawOneLineOfText( WinEDA_DrawPanel* aPanel, wxDC* aDC, const wxPoint& aOffset, EDA_Colors aColor, int aDrawMode, GRFillMode aDisplayMode, EDA_Colors aAnchor_color, - wxString txt, wxPoint pos ) + wxString& aText, wxPoint aPos ) { int width = m_Width; @@ -319,8 +340,8 @@ wxSize EDA_TextStruct::DrawOneLine( WinEDA_DrawPanel* aPanel, wxDC* aDC, int anchor_size = aPanel->GetScreen()->Unscale( 2 ); aAnchor_color = (EDA_Colors) (aAnchor_color & MASKCOLOR); - int cX = pos.x + aOffset.x; - int cY = pos.y + aOffset.y; + int cX = aPos.x + aOffset.x; + int cY = aPos.y + aOffset.y; GRLine( &aPanel->m_ClipBox, aDC, cX - anchor_size, cY, cX + anchor_size, cY, 0, aAnchor_color ); @@ -339,10 +360,9 @@ wxSize EDA_TextStruct::DrawOneLine( WinEDA_DrawPanel* aPanel, wxDC* aDC, DrawGraphicText( aPanel, aDC, - aOffset + pos, aColor, txt, + aOffset + aPos, aColor, aText, m_Orient, size, m_HJustify, m_VJustify, width, m_Italic ); - return size; } diff --git a/include/base_struct.h b/include/base_struct.h index c404f5b2c1..63c2ce382a 100644 --- a/include/base_struct.h +++ b/include/base_struct.h @@ -527,10 +527,26 @@ public: int aDisplayMode, GRFillMode aDisplay_mode = FILAIRE, EDA_Colors aAnchor_color = UNSPECIFIED_COLOR ); - wxSize DrawOneLine( WinEDA_DrawPanel* aPanel, wxDC* aDC, +private: + /** Function DrawOneLineOfText + * Draw a single text line. + * Used to draw each line of this EDA_TextStruct, that can be multiline + * @param aPanel = the current DrawPanel + * @param aDC = the current Device Context + * @param aOffset = draw offset (usually (0,0)) + * @param EDA_Colors aColor = text color + * @param aDrawMode = GR_OR, GR_XOR.., -1 to use the current mode. + * @param aDisplayMode = FILAIRE, FILLED or SKETCH + * @param EDA_Colors aAnchor_color = anchor color ( UNSPECIFIED_COLOR = do not draw anchor ). + * @param EDA_Colors aText = the single line of text to draw. + * @param EDA_Colors aPos = the position of this line ). + */ + void DrawOneLineOfText( WinEDA_DrawPanel* aPanel, wxDC* aDC, const wxPoint& aOffset, EDA_Colors aColor, - int aDisplayMode, GRFillMode aDisplay_mode = FILAIRE, - EDA_Colors aAnchor_color = UNSPECIFIED_COLOR, wxString txt=wxString(),wxPoint pos=wxPoint(0,0) ); + int aDisplayMode, GRFillMode aDisplay_mode, + EDA_Colors aAnchor_color, wxString& aText, + wxPoint aPos ); +public: /** * Function HitTest * tests if the given wxPoint is within the bounds of this object. diff --git a/pcbnew/class_pcb_text.cpp b/pcbnew/class_pcb_text.cpp index 7e97fbc31f..103a615c02 100644 --- a/pcbnew/class_pcb_text.cpp +++ b/pcbnew/class_pcb_text.cpp @@ -51,48 +51,80 @@ void TEXTE_PCB::Copy( TEXTE_PCB* source ) /****************************************************************/ int TEXTE_PCB::ReadTextePcbDescr( FILE* File, int* LineNum ) /****************************************************************/ + +/** Function ReadTextePcbDescr + * Read a pcb text description + * The format is like: + * $TEXTPCB + * Te "Text example" + * Po 66750 53450 600 800 150 0 + * De 24 1 0 Italic + * $EndTEXTPCB + * for a single line text + * + * or + * + * $TEXTPCB + * Te "Text example" + * nl "ligne 2" + * Po 66750 53450 600 800 150 0 + * De 24 1 0 Italic + * $EndTEXTPCB + * for a multi line text + * nl "ligne nn" is a line added to the current text + */ { char text[1024], Line[1024]; - char style[256]; + char style[256]; while( GetLine( File, Line, LineNum ) != NULL ) { if( strnicmp( Line, "$EndTEXTPCB", 11 ) == 0 ) return 0; - if( strncmp( Line, "Te", 2 ) == 0 ) /* Texte */ + if( strncmp( Line, "Te", 2 ) == 0 ) /* Text line (first line for multi line texts */ { ReadDelimitedText( text, Line + 2, sizeof(text) ); m_Text = CONV_FROM_UTF8( text ); continue; } + if( strncmp( Line, "nl", 2 ) == 0 ) /* next line of the current text */ + { + ReadDelimitedText( text, Line + 2, sizeof(text) ); + m_Text.Append( '\n' ); + m_Text += CONV_FROM_UTF8( text ); + continue; + } if( strncmp( Line, "Po", 2 ) == 0 ) { sscanf( Line + 2, " %d %d %d %d %d %d", &m_Pos.x, &m_Pos.y, &m_Size.x, &m_Size.y, &m_Width, &m_Orient ); + // Ensure the text has minimal size to see this text on screen: - if ( m_Size.x < 5 ) m_Size.x = 5; - if ( m_Size.y < 5 ) m_Size.y = 5; + if( m_Size.x < 5 ) + m_Size.x = 5; + if( m_Size.y < 5 ) + m_Size.y = 5; continue; } if( strncmp( Line, "De", 2 ) == 0 ) { - style[0] = 0; - int normal_display = 1; + style[0] = 0; + int normal_display = 1; sscanf( Line + 2, " %d %d %lX %s\n", &m_Layer, &normal_display, &m_TimeStamp, style ); - m_Mirror = normal_display ? false : true; + m_Mirror = normal_display ? false : true; if( m_Layer < FIRST_COPPER_LAYER ) m_Layer = FIRST_COPPER_LAYER; if( m_Layer > LAST_NO_COPPER_LAYER ) m_Layer = LAST_NO_COPPER_LAYER; - if ( strnicmp( style, "Italic", 6) == 0 ) - m_Italic = 1; - else - m_Italic = 0; + if( strnicmp( style, "Italic", 6 ) == 0 ) + m_Italic = 1; + else + m_Italic = 0; continue; } } @@ -111,30 +143,36 @@ bool TEXTE_PCB::Save( FILE* aFile ) const if( m_Text.IsEmpty() ) return true; - bool rc = false; - const char * style = m_Italic ? "Italic" : "Normal"; + if( fprintf( aFile, "$TEXTPCB\n" ) != sizeof("$TEXTPCB\n") - 1 ) + return false; - if( fprintf( aFile, "$TEXTPCB\n" ) != sizeof("$TEXTPCB\n")-1 ) - goto out; + bool rc = false; + const char* style = m_Italic ? "Italic" : "Normal"; + + wxArrayString* list = wxStringSplit( m_Text, '\n' ); + for( unsigned ii = 0; ii < list->Count(); ii++ ) + { + wxString txt = list->Item( ii ); + if ( ii == 0 ) + fprintf( aFile, "Te \"%s\"\n", CONV_TO_UTF8( txt ) ); + else + fprintf( aFile, "nl \"%s\"\n", CONV_TO_UTF8( txt ) ); + } + delete (list); - fprintf( aFile, "Te \"%s\"\n", CONV_TO_UTF8( m_Text ) ); fprintf( aFile, "Po %d %d %d %d %d %d\n", m_Pos.x, m_Pos.y, m_Size.x, m_Size.y, m_Width, m_Orient ); fprintf( aFile, "De %d %d %lX %s\n", m_Layer, - m_Mirror ? 0 : 1, - m_TimeStamp, style ); + m_Mirror ? 0 : 1, + m_TimeStamp, style ); - if( fprintf( aFile, "$EndTEXTPCB\n" ) != sizeof("$EndTEXTPCB\n")-1 ) - goto out; + if( fprintf( aFile, "$EndTEXTPCB\n" ) != sizeof("$EndTEXTPCB\n") - 1 ) + return false; - rc = true; -out: - return rc; + return true; } - - /**********************************************************************/ void TEXTE_PCB::Draw( WinEDA_DrawPanel* panel, wxDC* DC, int DrawMode, const wxPoint& offset ) @@ -149,20 +187,26 @@ void TEXTE_PCB::Draw( WinEDA_DrawPanel* panel, wxDC* DC, if( color & ITEM_NOT_SHOW ) return; - EDA_TextStruct::Draw( panel, DC, offset, (EDA_Colors) color, - DrawMode, (GRFillMode)DisplayOpt.DisplayDrawItems, - (g_AnchorColor & ITEM_NOT_SHOW) ? UNSPECIFIED_COLOR : (EDA_Colors)g_AnchorColor ); + EDA_TextStruct::Draw( + panel, + DC, + offset, + (EDA_Colors) color, + DrawMode, + (GRFillMode) DisplayOpt.DisplayDrawItems, + (g_AnchorColor & + ITEM_NOT_SHOW) ? UNSPECIFIED_COLOR : (EDA_Colors) g_AnchorColor ); } - // see class_pcb_text.h void TEXTE_PCB::DisplayInfo( WinEDA_DrawFrame* frame ) { - wxString msg; + wxString msg; BOARD* board; BOARD_ITEM* parent = (BOARD_ITEM*) m_Parent; + wxASSERT( parent ); if( parent->Type() == TYPE_COTATION ) @@ -183,7 +227,7 @@ void TEXTE_PCB::DisplayInfo( WinEDA_DrawFrame* frame ) g_DesignSettings.m_LayerColor[m_Layer] & MASKCOLOR ); Affiche_1_Parametre( frame, 36, _( "Mirror" ), wxEmptyString, GREEN ); - if( ! m_Mirror ) + if( !m_Mirror ) Affiche_1_Parametre( frame, -1, wxEmptyString, _( "No" ), DARKGREEN ); else Affiche_1_Parametre( frame, -1, wxEmptyString, _( "Yes" ), DARKGREEN ); @@ -215,9 +259,10 @@ void TEXTE_PCB::Show( int nestLevel, std::ostream& os ) { // for now, make it look like XML: NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() << - " string=\"" << m_Text.mb_str() << "\"/>\n"; + " string=\"" << m_Text.mb_str() << "\"/>\n"; // NestedSpace( nestLevel, os ) << "\n"; } + #endif diff --git a/pcbnew/dialog_copper_zones.cpp b/pcbnew/dialog_copper_zones.cpp index 9d907c1cd8..2d11d65b52 100644 --- a/pcbnew/dialog_copper_zones.cpp +++ b/pcbnew/dialog_copper_zones.cpp @@ -49,8 +49,6 @@ void dialog_copper_zone::OnInitDialog( wxInitDialogEvent& event ) { BOARD* board = m_Parent->GetBoard(); - SetFont( *g_DialogFont ); - SetFocus(); // Required under wxGTK if we want to demiss the dialog with the ESC key wxString msg; diff --git a/pcbnew/dialog_non_copper_zones_properties_base.cpp b/pcbnew/dialog_non_copper_zones_properties_base.cpp index faad72c93b..e31779ac72 100644 --- a/pcbnew/dialog_non_copper_zones_properties_base.cpp +++ b/pcbnew/dialog_non_copper_zones_properties_base.cpp @@ -10,7 +10,6 @@ /////////////////////////////////////////////////////////////////////////// BEGIN_EVENT_TABLE( DialogNonCopperZonesPropertiesBase, wxDialog ) - EVT_INIT_DIALOG( DialogNonCopperZonesPropertiesBase::_wxFB_InitDialog ) EVT_BUTTON( wxID_OK, DialogNonCopperZonesPropertiesBase::_wxFB_OnOkClick ) EVT_BUTTON( wxID_CANCEL, DialogNonCopperZonesPropertiesBase::_wxFB_OnCancelClick ) END_EVENT_TABLE() @@ -25,17 +24,40 @@ DialogNonCopperZonesPropertiesBase::DialogNonCopperZonesPropertiesBase( wxWindow wxBoxSizer* m_UpperSizer; m_UpperSizer = new wxBoxSizer( wxHORIZONTAL ); - wxString m_OutlineAppearanceCtrlChoices[] = { _("Line"), _("Hatched Outline"), _("Full Hatched") }; - int m_OutlineAppearanceCtrlNChoices = sizeof( m_OutlineAppearanceCtrlChoices ) / sizeof( wxString ); - m_OutlineAppearanceCtrl = new wxRadioBox( this, wxID_ANY, _("Outlines Appearence"), wxDefaultPosition, wxDefaultSize, m_OutlineAppearanceCtrlNChoices, m_OutlineAppearanceCtrlChoices, 1, wxRA_SPECIFY_COLS ); - m_OutlineAppearanceCtrl->SetSelection( 1 ); - m_UpperSizer->Add( m_OutlineAppearanceCtrl, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + wxStaticBoxSizer* sbLeftSizer_; + sbLeftSizer_ = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Zone Fill Options:") ), wxVERTICAL ); + + wxString m_FillModeCtrlChoices[] = { _("Use polygons"), _("Use segments") }; + int m_FillModeCtrlNChoices = sizeof( m_FillModeCtrlChoices ) / sizeof( wxString ); + m_FillModeCtrl = new wxRadioBox( this, wxID_ANY, _("Filling Mode:"), wxDefaultPosition, wxDefaultSize, m_FillModeCtrlNChoices, m_FillModeCtrlChoices, 1, wxRA_SPECIFY_COLS ); + m_FillModeCtrl->SetSelection( 0 ); + sbLeftSizer_->Add( m_FillModeCtrl, 0, wxALL|wxEXPAND, 5 ); + + m_MinThicknessValueTitle = new wxStaticText( this, wxID_ANY, _("Zone min thickness value"), wxDefaultPosition, wxDefaultSize, 0 ); + m_MinThicknessValueTitle->Wrap( -1 ); + sbLeftSizer_->Add( m_MinThicknessValueTitle, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_ZoneMinThicknessCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + sbLeftSizer_->Add( m_ZoneMinThicknessCtrl, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + m_UpperSizer->Add( sbLeftSizer_, 0, 0, 5 ); + + wxStaticBoxSizer* m_OutilinesBoxOpt; + m_OutilinesBoxOpt = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Outlines Options:") ), wxVERTICAL ); wxString m_OrientEdgesOptChoices[] = { _("Any"), _("H, V and 45 deg") }; int m_OrientEdgesOptNChoices = sizeof( m_OrientEdgesOptChoices ) / sizeof( wxString ); m_OrientEdgesOpt = new wxRadioBox( this, wxID_ANY, _("Zone Edges Orient"), wxDefaultPosition, wxDefaultSize, m_OrientEdgesOptNChoices, m_OrientEdgesOptChoices, 1, wxRA_SPECIFY_COLS ); m_OrientEdgesOpt->SetSelection( 0 ); - m_UpperSizer->Add( m_OrientEdgesOpt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + m_OutilinesBoxOpt->Add( m_OrientEdgesOpt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + wxString m_OutlineAppearanceCtrlChoices[] = { _("Line"), _("Hatched Outline"), _("Full Hatched") }; + int m_OutlineAppearanceCtrlNChoices = sizeof( m_OutlineAppearanceCtrlChoices ) / sizeof( wxString ); + m_OutlineAppearanceCtrl = new wxRadioBox( this, wxID_ANY, _("Outlines Appearence"), wxDefaultPosition, wxDefaultSize, m_OutlineAppearanceCtrlNChoices, m_OutlineAppearanceCtrlChoices, 1, wxRA_SPECIFY_COLS ); + m_OutlineAppearanceCtrl->SetSelection( 1 ); + m_OutilinesBoxOpt->Add( m_OutlineAppearanceCtrl, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_UpperSizer->Add( m_OutilinesBoxOpt, 0, 0, 5 ); wxBoxSizer* m_ButtonsSizer; m_ButtonsSizer = new wxBoxSizer( wxVERTICAL ); diff --git a/pcbnew/dialog_non_copper_zones_properties_base.fbp b/pcbnew/dialog_non_copper_zones_properties_base.fbp index 9d9d02bfef..c59451160b 100644 --- a/pcbnew/dialog_non_copper_zones_properties_base.fbp +++ b/pcbnew/dialog_non_copper_zones_properties_base.fbp @@ -32,7 +32,7 @@ DialogNonCopperZonesPropertiesBase - 366,221 + 416,287 wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER Non Copper Zones Properties @@ -49,7 +49,7 @@ - InitDialog + @@ -86,110 +86,298 @@ none 5 - wxALL|wxALIGN_CENTER_VERTICAL + 0 - - - "Line" "Hatched Outline" "Full Hatched" - - 1 - - - 0 + wxID_ANY - Outlines Appearence - 1 - + Zone Fill Options: - m_OutlineAppearanceCtrl - protected - - 1 - - wxRA_SPECIFY_COLS - - - - - - - - - - - - - - - - - - - - - - - - - - - - + sbLeftSizer_ + wxVERTICAL + none + + 5 + wxALL|wxEXPAND + 0 + + + "Use polygons" "Use segments" + + 1 + + + 0 + wxID_ANY + Filling Mode: + 1 + + + m_FillModeCtrl + protected + + 0 + + wxRA_SPECIFY_COLS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + + + 1 + + + 0 + wxID_ANY + Zone min thickness value + + + m_MinThicknessValueTitle + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT + 0 + + + + 1 + + + 0 + wxID_ANY + + 0 + + m_ZoneMinThicknessCtrl + protected + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 - wxALL|wxALIGN_CENTER_VERTICAL + 0 - - - "Any" "H, V and 45 deg" - - 1 - - - 0 + wxID_ANY - Zone Edges Orient - 1 - + Outlines Options: - m_OrientEdgesOpt - protected - - 0 - - wxRA_SPECIFY_COLS - - - - - - - - - - - - - - - - - - - - - - - - - - - - + m_OutilinesBoxOpt + wxVERTICAL + none + + 5 + wxALL|wxALIGN_CENTER_VERTICAL + 0 + + + "Any" "H, V and 45 deg" + + 1 + + + 0 + wxID_ANY + Zone Edges Orient + 1 + + + m_OrientEdgesOpt + protected + + 0 + + wxRA_SPECIFY_COLS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxALIGN_CENTER_VERTICAL + 0 + + + "Line" "Hatched Outline" "Full Hatched" + + 1 + + + 0 + wxID_ANY + Outlines Appearence + 1 + + + m_OutlineAppearanceCtrl + protected + + 1 + + wxRA_SPECIFY_COLS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pcbnew/dialog_non_copper_zones_properties_base.h b/pcbnew/dialog_non_copper_zones_properties_base.h index 0bf36f0c1a..a2f7db34a2 100644 --- a/pcbnew/dialog_non_copper_zones_properties_base.h +++ b/pcbnew/dialog_non_copper_zones_properties_base.h @@ -16,9 +16,11 @@ #include #include #include -#include -#include #include +#include +#include +#include +#include #include #include @@ -33,27 +35,28 @@ class DialogNonCopperZonesPropertiesBase : public wxDialog private: // Private event handlers - void _wxFB_InitDialog( wxInitDialogEvent& event ){ InitDialog( event ); } void _wxFB_OnOkClick( wxCommandEvent& event ){ OnOkClick( event ); } void _wxFB_OnCancelClick( wxCommandEvent& event ){ OnCancelClick( event ); } protected: - wxRadioBox* m_OutlineAppearanceCtrl; + wxRadioBox* m_FillModeCtrl; + wxStaticText* m_MinThicknessValueTitle; + wxTextCtrl* m_ZoneMinThicknessCtrl; wxRadioBox* m_OrientEdgesOpt; + wxRadioBox* m_OutlineAppearanceCtrl; wxButton* m_buttonOk; wxButton* m_buttonCancel; wxStaticText* m_staticTextLayerSelection; wxListBox* m_LayerSelectionCtrl; // Virtual event handlers, overide them in your derived class - virtual void InitDialog( wxInitDialogEvent& event ){ event.Skip(); } virtual void OnOkClick( wxCommandEvent& event ){ event.Skip(); } virtual void OnCancelClick( wxCommandEvent& event ){ event.Skip(); } public: - DialogNonCopperZonesPropertiesBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Non Copper Zones Properties"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 366,221 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER|wxFULL_REPAINT_ON_RESIZE|wxSUNKEN_BORDER ); + DialogNonCopperZonesPropertiesBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Non Copper Zones Properties"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 416,287 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER|wxFULL_REPAINT_ON_RESIZE|wxSUNKEN_BORDER ); ~DialogNonCopperZonesPropertiesBase(); }; diff --git a/pcbnew/plot_rtn.cpp b/pcbnew/plot_rtn.cpp index 00097b4f52..a4ce7157a8 100644 --- a/pcbnew/plot_rtn.cpp +++ b/pcbnew/plot_rtn.cpp @@ -196,7 +196,7 @@ void WinEDA_BasePcbFrame::Plot_Serigraphie( int format_plot, trace_val = Sel_Texte_Valeur; trace_ref = Sel_Texte_Reference; // les 2 autorisations de tracer sont donnees - TEXTE_MODULE* text = Module->m_Reference; + TEXTE_MODULE* text = Module->m_Reference; unsigned textLayer = text->GetLayer(); if( textLayer >= 32 ) @@ -216,7 +216,7 @@ void WinEDA_BasePcbFrame::Plot_Serigraphie( int format_plot, if( text->m_NoShow && !Sel_Texte_Invisible ) trace_ref = FALSE; - text = Module->m_Value; + text = Module->m_Value; textLayer = text->GetLayer(); if( textLayer > 32 ) @@ -287,6 +287,28 @@ void WinEDA_BasePcbFrame::Plot_Serigraphie( int format_plot, PlotFilledAreas( edge_zone, format_plot ); } + // Plot segments used to fill zone areas: + for( SEGZONE* seg = m_Pcb->m_Zone; seg != NULL; seg = seg->Next() ) + { + if( ( ( 1 << seg->GetLayer() ) & masque_layer ) == 0 ) + continue; + switch( format_plot ) + { + case PLOT_FORMAT_GERBER: + SelectD_CODE_For_LineDraw( seg->m_Width ); + PlotGERBERLine( seg->m_Start, seg->m_End, seg->m_Width ); + break; + + case PLOT_FORMAT_HPGL: + Plot_Filled_Segment_HPGL( seg->m_Start, seg->m_End, seg->m_Width, FILLED ); + break; + + case PLOT_FORMAT_POST: + PlotFilledSegmentPS( seg->m_Start, seg->m_End, seg->m_Width ); + break; + } + } + exit: ; } @@ -497,7 +519,7 @@ void Plot_1_EdgeModule( int format_plot, EDGE_MODULE* PtEdge ) break; case PLOT_FORMAT_HPGL: - Plot_Filled_Segment_HPGL( pos, end, thickness, (GRFillMode)g_Plot_Mode ); + Plot_Filled_Segment_HPGL( pos, end, thickness, (GRFillMode) g_Plot_Mode ); break; case PLOT_FORMAT_POST: @@ -508,12 +530,12 @@ void Plot_1_EdgeModule( int format_plot, EDGE_MODULE* PtEdge ) break; /* Fin trace segment simple */ case S_CIRCLE: - radius = (int) hypot( (double) (end.x - pos.x), (double) (end.y - pos.y) ); + radius = (int) hypot( (double) ( end.x - pos.x ), (double) ( end.y - pos.y ) ); PlotCircle( format_plot, thickness, pos, radius ); break; case S_ARC: - radius = (int) hypot( (double) (end.x - pos.x), (double) (end.y - pos.y) ); + radius = (int) hypot( (double) ( end.x - pos.x ), (double) ( end.y - pos.y ) ); StAngle = ArcTangente( end.y - pos.y, end.x - pos.x ); EndAngle = StAngle + PtEdge->m_Angle; if( StAngle > EndAngle ) @@ -556,7 +578,7 @@ void Plot_1_EdgeModule( int format_plot, EDGE_MODULE* PtEdge ) PlotFilledPolygon( format_plot, PtEdge->m_PolyPoints.size(), ptr_base ); free( ptr_base ); } - break; + break; } } @@ -626,13 +648,13 @@ void PlotFilledAreas( ZONE_CONTAINER* aZone, int aFormat ) if( CornersBuffer == NULL ) { CornersBufferSize = imax * 4; - CornersBuffer = (int*) MyMalloc( CornersBufferSize * sizeof(int) ); + CornersBuffer = (int*) MyMalloc( CornersBufferSize * sizeof(int) ); } if( (imax * 4) > CornersBufferSize ) { CornersBufferSize = imax * 4; - CornersBuffer = (int*) realloc( CornersBuffer, CornersBufferSize * sizeof(int) ); + CornersBuffer = (int*) realloc( CornersBuffer, CornersBufferSize * sizeof(int) ); } imax--; @@ -692,12 +714,12 @@ void PlotDrawSegment( DRAWSEGMENT* pt_segm, int Format, int masque_layer ) if( pt_segm->m_Shape == S_CIRCLE ) { - radius = (int) hypot( (double) (end.x - start.x), (double) (end.y - start.y) ); + radius = (int) hypot( (double) ( end.x - start.x ), (double) ( end.y - start.y ) ); } if( pt_segm->m_Shape == S_ARC ) { - radius = (int) hypot( (double) (end.x - start.x), (double) (end.y - start.y) ); + radius = (int) hypot( (double) ( end.x - start.x ), (double) ( end.y - start.y ) ); StAngle = ArcTangente( end.y - start.y, end.x - start.x ); EndAngle = StAngle + pt_segm->m_Angle; if( StAngle > EndAngle ) @@ -723,7 +745,7 @@ void PlotDrawSegment( DRAWSEGMENT* pt_segm, int Format, int masque_layer ) else if( pt_segm->m_Shape == S_ARC ) PlotArc( PLOT_FORMAT_HPGL, start, StAngle, EndAngle, radius, thickness ); else - Plot_Filled_Segment_HPGL( start, end, thickness, (GRFillMode)g_Plot_Mode ); + Plot_Filled_Segment_HPGL( start, end, thickness, (GRFillMode) g_Plot_Mode ); break; case PLOT_FORMAT_POST: @@ -815,13 +837,13 @@ void PlotPolygon( int format_plot, int nbpoints, int* coord, int width ) for( int ii = 1; ii < nbpoints; ii++ ) { end.x = *coord++; - end.y = *coord++; - Plot_Filled_Segment_HPGL( start, end, width, (GRFillMode)g_Plot_Mode ); + end.y = *coord++; + Plot_Filled_Segment_HPGL( start, end, width, (GRFillMode) g_Plot_Mode ); start = end; } } } - break; + break; case PLOT_FORMAT_POST: PlotPolyPS( nbpoints, coord, false, width ); @@ -890,9 +912,9 @@ void PlotArc( int format_plot, wxPoint centre, int start_angle, int end_angle, break; case PLOT_FORMAT_HPGL: - Plot_Filled_Segment_HPGL( wxPoint(centre.x + ox, centre.y + oy), - wxPoint(centre.x + fx, centre.y + fy), - thickness, (GRFillMode)g_Plot_Mode ); + Plot_Filled_Segment_HPGL( wxPoint( centre.x + ox, centre.y + oy ), + wxPoint( centre.x + fx, centre.y + fy ), + thickness, (GRFillMode) g_Plot_Mode ); break; case PLOT_FORMAT_POST: @@ -916,9 +938,9 @@ void PlotArc( int format_plot, wxPoint centre, int start_angle, int end_angle, break; case PLOT_FORMAT_HPGL: - Plot_Filled_Segment_HPGL( wxPoint(centre.x + ox, centre.y + oy), - wxPoint(centre.x + fx, centre.y + fy), - thickness, (GRFillMode)g_Plot_Mode ); + Plot_Filled_Segment_HPGL( wxPoint( centre.x + ox, centre.y + oy ), + wxPoint( centre.x + fx, centre.y + fy ), + thickness, (GRFillMode) g_Plot_Mode ); break; case PLOT_FORMAT_POST: diff --git a/pcbnew/zones_non_copper_type_functions.cpp b/pcbnew/zones_non_copper_type_functions.cpp index 1f41c8f2fc..b064e341af 100644 --- a/pcbnew/zones_non_copper_type_functions.cpp +++ b/pcbnew/zones_non_copper_type_functions.cpp @@ -23,28 +23,34 @@ class DialogNonCopperZonesEditor : public DialogNonCopperZonesPropertiesBase private: WinEDA_PcbFrame* m_Parent; ZONE_CONTAINER* m_Zone_Container; + ZONE_SETTING* m_Zone_Setting; private: void OnOkClick( wxCommandEvent& event ); void OnCancelClick( wxCommandEvent& event ); - void InitDialog( wxInitDialogEvent& event ); + void Init(); public: DialogNonCopperZonesEditor( WinEDA_PcbFrame* parent, - ZONE_CONTAINER* zone_container ); + ZONE_CONTAINER* zone_container, + ZONE_SETTING* zone_setting ); ~DialogNonCopperZonesEditor(); }; /*******************************************************************************************/ DialogNonCopperZonesEditor::DialogNonCopperZonesEditor( WinEDA_PcbFrame* parent, - ZONE_CONTAINER* zone_container ) : + ZONE_CONTAINER* zone_container, + ZONE_SETTING* zone_setting ) : DialogNonCopperZonesPropertiesBase( parent ) /*******************************************************************************************/ { m_Parent = parent; m_Zone_Container = zone_container; - SetFont( *g_DialogFont ); + m_Zone_Setting = zone_setting; + Init(); + /* the size of some items has changed, so we must call SetSizeHints() */ + GetSizer()->SetSizeHints( this ); } @@ -54,24 +60,32 @@ DialogNonCopperZonesEditor::~DialogNonCopperZonesEditor() { } + /* install function for DialogNonCopperZonesEditor dialog frame :*/ -bool InstallDialogNonCopperZonesEditor(WinEDA_PcbFrame* aParent, ZONE_CONTAINER* aZone) +bool InstallDialogNonCopperZonesEditor( WinEDA_PcbFrame* aParent, ZONE_CONTAINER* aZone ) { - DialogNonCopperZonesEditor* frame = new DialogNonCopperZonesEditor( aParent, aZone ); - bool diag = frame->ShowModal(); - frame->Destroy(); + DialogNonCopperZonesEditor frame( aParent, aZone, &g_Zone_Default_Setting ); + bool diag = frame.ShowModal(); return diag; } /********************************************************************/ -void DialogNonCopperZonesEditor::InitDialog( wxInitDialogEvent& event ) +void DialogNonCopperZonesEditor::Init() /********************************************************************/ { SetFocus(); SetReturnCode( ZONE_ABORT ); // Will be changed on buttons click + m_FillModeCtrl->SetSelection( m_Zone_Setting->m_FillMode ? 1 : 0 ); + + AddUnitSymbol( *m_MinThicknessValueTitle, g_UnitMetric ); + wxString msg = ReturnStringFromValue( g_UnitMetric, + m_Zone_Setting->m_ZoneMinThickness, + m_Parent->m_InternalUnits ); + m_ZoneMinThicknessCtrl->SetValue( msg ); + if( g_Zone_45_Only ) m_OrientEdgesOpt->SetSelection( 1 ); @@ -106,13 +120,10 @@ void DialogNonCopperZonesEditor::InitDialog( wxInitDialogEvent& event ) } else { - if( ( (PCB_SCREEN*) ( m_Parent->GetScreen() ) )->m_Active_Layer == layer_number ) + if( ( (PCB_SCREEN*)( m_Parent->GetScreen() ) )->m_Active_Layer == layer_number ) m_LayerSelectionCtrl->SetSelection( ii ); } } - - /* the size of m_LayerSelectionCtrl has changed, so we must recall SetSizeHints() */ - GetSizer()->SetSizeHints(this); } @@ -120,6 +131,19 @@ void DialogNonCopperZonesEditor::InitDialog( wxInitDialogEvent& event ) void DialogNonCopperZonesEditor::OnOkClick( wxCommandEvent& event ) /******************************************************************/ { + wxString txtvalue = m_ZoneMinThicknessCtrl->GetValue(); + m_Zone_Setting->m_ZoneMinThickness = + ReturnValueFromString( g_UnitMetric, txtvalue, m_Parent->m_InternalUnits ); + if( m_Zone_Setting->m_ZoneMinThickness < 10 ) + { + DisplayError( this, + _( + "Error :\nyou must choose a copper min thickness value bigger than 0.001 inch (or 0.0254 mm)" ) ); + return; + } + + m_Zone_Setting->m_FillMode = (m_FillModeCtrl->GetSelection() == 0) ? 0 : 1; + switch( m_OutlineAppearanceCtrl->GetSelection() ) { case 0: @@ -138,7 +162,7 @@ void DialogNonCopperZonesEditor::OnOkClick( wxCommandEvent& event ) if( wxGetApp().m_EDA_Config ) { wxGetApp().m_EDA_Config->Write( ZONE_NET_OUTLINES_HATCH_OPTION_KEY, - (long) g_Zone_Default_Setting.m_Zone_HatchingStyle ); + (long) g_Zone_Default_Setting.m_Zone_HatchingStyle ); } if( m_OrientEdgesOpt->GetSelection() == 0 ) @@ -164,4 +188,3 @@ void DialogNonCopperZonesEditor::OnCancelClick( wxCommandEvent& event ) { EndModal( ZONE_ABORT ); } -