dialog_orient_footprints.cpp 4.66 KB
Newer Older
1 2 3 4
/**
 * @file DIALOG_ORIENT_FOOTPRINTS.cpp
 */
/*
5
 * This program source code file is part of KiCad, a free EDA CAD application.
6 7
 *
 * Copyright (C) 1992-2010 Jean_Pierre Charras <jp.charras@ujf-grenoble.fr>
8
 * Copyright (C) 1992-2010 KiCad Developers, see change_log.txt for contributors.
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, you may find one here:
 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
 * or you may search the http://www.gnu.org website for the version 2 license,
 * or you may write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
 */


29 30 31 32 33 34 35 36 37 38 39 40
#include <fctsys.h>
#include <class_drawpanel.h>
#include <confirm.h>
#include <kicad_string.h>
#include <pcbnew.h>
#include <wxPcbStruct.h>
#include <macros.h>

#include <class_board.h>
#include <class_module.h>

#include <dialog_orient_footprints_base.h>
41 42 43 44 45 46 47 48 49



/* DIALOG_ORIENT_FOOTPRINTS class declaration
 */

class DIALOG_ORIENT_FOOTPRINTS: public DIALOG_ORIENT_FOOTPRINTS_BASE
{
private:
50
    PCB_EDIT_FRAME * m_Parent;
51 52 53
    static int newOrientation;

public:
54
    DIALOG_ORIENT_FOOTPRINTS( PCB_EDIT_FRAME* parent );
55
    ~DIALOG_ORIENT_FOOTPRINTS() {}
56

57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
    bool ApplyToLockedModules()
    {
        return m_ApplyToLocked->IsChecked();
    }
    int GetOrientation()
    {
        return newOrientation;
    }
    wxString GetFilter()
    {
        return m_FilterPattern->GetValue();
    }

private:
    void init();

    void OnOkClick( wxCommandEvent& event );
    void OnCancelClick( wxCommandEvent& event );
};
int DIALOG_ORIENT_FOOTPRINTS::newOrientation = 0;


79
DIALOG_ORIENT_FOOTPRINTS::DIALOG_ORIENT_FOOTPRINTS( PCB_EDIT_FRAME* parent )
80 81 82 83 84 85 86 87 88 89 90 91 92
    : DIALOG_ORIENT_FOOTPRINTS_BASE( parent )
{
    m_Parent = parent;
    wxString txt;
    txt.Printf(wxT("%g"), (double) newOrientation/10);
    m_OrientationCtrl->SetValue(txt);
    SetFocus( );
    GetSizer()->SetSizeHints(this);
    Centre();
}


/****************************************************************/
93
void PCB_EDIT_FRAME::OnOrientFootprints( wxCommandEvent& event )
94 95 96 97 98 99 100 101 102 103 104
/****************************************************************/
/**
 * Function OnOrientFootprints
 * install the dialog box for the comman Orient Footprints
 */
{
    DIALOG_ORIENT_FOOTPRINTS dlg(this);
    if( dlg.ShowModal() != wxID_OK )
        return;

    wxString text = dlg.GetFilter();
105

106 107
    if( ReOrientModules( text, dlg.GetOrientation(), dlg.ApplyToLockedModules() ) )
    {
108
        m_canvas->Refresh();
109 110 111 112 113 114
        Compile_Ratsnest( NULL, true );
    }
}


/*******************************************************************/
115 116
bool PCB_EDIT_FRAME::ReOrientModules( const wxString& ModuleMask,
                                      int Orient, bool include_fixe )
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
/*******************************************************************/
/**
 * Function ReOrientModules
 * Set the orientation of footprints
 * @param ModuleMask = mask (wildcard allowed) selection
 * @param Orient = new orientation
 * @param include_fixe = true to orient locked footprints
 * @return true if some footprints modified, false if no change
 */
{
    wxString line;
    bool modified = false;

    line.Printf( _( "Ok to set footprints orientation to %.1f degrees ?" ), (double)Orient / 10 );
    if( !IsOK( this, line ) )
        return false;

    for( MODULE* module = GetBoard()->m_Modules;  module;  module = module->Next() )
    {
        if( module->IsLocked() && !include_fixe )
            continue;

139
        if( WildCompareString( ModuleMask, module->m_Reference->m_Text, false ) )
140 141
        {
            modified = true;
142
            Rotate_Module( NULL, module, Orient, false );
143 144 145 146 147
        }
    }

    if ( modified )
        OnModify();
148

149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172
    return modified;
}


void DIALOG_ORIENT_FOOTPRINTS::OnOkClick( wxCommandEvent& event )
{
    double d_orient;
    wxString text = m_OrientationCtrl->GetValue();

    if ( ! text.ToDouble(&d_orient) )
    {
        DisplayError(this, _("Bad value for footprints orientation"));
        return;
    }

    newOrientation = wxRound(d_orient * 10);
    NORMALIZE_ANGLE_180( newOrientation );
    EndModal( wxID_OK );
}

void DIALOG_ORIENT_FOOTPRINTS::OnCancelClick( wxCommandEvent& event )
{
    EndModal( wxID_CANCEL );
}