summaryrefslogtreecommitdiff
path: root/pcbnew/dialogs/dialog_export_idf.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'pcbnew/dialogs/dialog_export_idf.cpp')
-rw-r--r--pcbnew/dialogs/dialog_export_idf.cpp231
1 files changed, 231 insertions, 0 deletions
diff --git a/pcbnew/dialogs/dialog_export_idf.cpp b/pcbnew/dialogs/dialog_export_idf.cpp
new file mode 100644
index 0000000..ed405a6
--- /dev/null
+++ b/pcbnew/dialogs/dialog_export_idf.cpp
@@ -0,0 +1,231 @@
+/**
+ * @file dialog_export_idf.cpp
+ */
+
+/*
+ * This program source code file is part of KiCad, a free EDA CAD application.
+ *
+ * Copyright (C) 2013-2015 Cirilo Bernardo
+ *
+ * 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
+ */
+
+#include <wxPcbStruct.h>
+#include <kiface_i.h>
+#include <pcbnew.h>
+#include <class_board.h>
+#include <convert_from_iu.h>
+
+// IDF export header generated by wxFormBuilder
+#include <dialog_export_idf_base.h>
+
+#define OPTKEY_IDF_THOU wxT( "IDFExportThou" )
+#define OPTKEY_IDF_REF_AUTOADJ wxT( "IDFRefAutoAdj" )
+#define OPTKEY_IDF_REF_UNITS wxT( "IDFRefUnits" )
+#define OPTKEY_IDF_REF_X wxT( "IDFRefX" )
+#define OPTKEY_IDF_REF_Y wxT( "IDFRefY" )
+
+
+/**
+ * Function Export_IDF3
+ * Creates an IDF3 compliant BOARD (*.emn) and LIBRARY (*.emp) file.
+ *
+ * @param aPcb = a pointer to the board to be exported to IDF
+ * @param aFullFileName = the full filename of the export file
+ * @param aUseThou = set to true if the desired IDF unit is thou (mil)
+ * @param aXRef = the board Reference Point in mm, X value
+ * @param aYRef = the board Reference Point in mm, Y value
+ * @return true if OK
+ */
+bool Export_IDF3( BOARD *aPcb, const wxString & aFullFileName, bool aUseThou,
+ double aXRef, double aYRef );
+
+
+class DIALOG_EXPORT_IDF3: public DIALOG_EXPORT_IDF3_BASE
+{
+private:
+ PCB_EDIT_FRAME* m_parent;
+ wxConfigBase* m_config;
+ bool m_idfThouOpt; // remember last preference for units in THOU
+ bool m_AutoAdjust; // remember last Reference Point AutoAdjust setting
+ int m_RefUnits; // remember last units for Reference Point
+ double m_XRef; // remember last X Reference Point
+ double m_YRef; // remember last Y Reference Point
+
+public:
+ DIALOG_EXPORT_IDF3( PCB_EDIT_FRAME* parent ) :
+ DIALOG_EXPORT_IDF3_BASE( parent )
+ {
+ m_parent = parent;
+ m_config = Kiface().KifaceSettings();
+ SetFocus();
+ m_idfThouOpt = false;
+ m_config->Read( OPTKEY_IDF_THOU, &m_idfThouOpt );
+ m_rbUnitSelection->SetSelection( m_idfThouOpt ? 1 : 0 );
+ m_config->Read( OPTKEY_IDF_REF_AUTOADJ, &m_AutoAdjust, false );
+ m_config->Read( OPTKEY_IDF_REF_UNITS, &m_RefUnits, 0 );
+ m_config->Read( OPTKEY_IDF_REF_X, &m_XRef, 0.0 );
+ m_config->Read( OPTKEY_IDF_REF_Y, &m_YRef, 0.0 );
+
+ m_cbAutoAdjustOffset->SetValue( m_AutoAdjust );
+ m_cbAutoAdjustOffset->Bind( wxEVT_CHECKBOX, &DIALOG_EXPORT_IDF3::OnAutoAdjustOffset, this );
+
+ m_IDF_RefUnitChoice->SetSelection( m_RefUnits );
+ wxString tmpStr;
+ tmpStr << m_XRef;
+ m_IDF_Xref->SetValue( tmpStr );
+ tmpStr = wxT( "" );
+ tmpStr << m_YRef;
+ m_IDF_Yref->SetValue( tmpStr );
+
+ if( m_AutoAdjust )
+ {
+ m_IDF_RefUnitChoice->Enable( false );
+ m_IDF_Xref->Enable( false );
+ m_IDF_Yref->Enable( false );
+ }
+ else
+ {
+ m_IDF_RefUnitChoice->Enable( true );
+ m_IDF_Xref->Enable( true );
+ m_IDF_Yref->Enable( true );
+ }
+
+ m_sdbSizerOK->SetDefault();
+
+ FixOSXCancelButtonIssue();
+
+ // Now all widgets have the size fixed, call FinishDialogSettings
+ FinishDialogSettings();
+ }
+
+ ~DIALOG_EXPORT_IDF3()
+ {
+ m_idfThouOpt = m_rbUnitSelection->GetSelection() == 1;
+ m_config->Write( OPTKEY_IDF_THOU, m_idfThouOpt );
+ m_config->Write( OPTKEY_IDF_REF_AUTOADJ, GetAutoAdjustOffset() );
+ m_config->Write( OPTKEY_IDF_REF_UNITS, m_IDF_RefUnitChoice->GetSelection() );
+ m_config->Write( OPTKEY_IDF_REF_X, m_IDF_Xref->GetValue() );
+ m_config->Write( OPTKEY_IDF_REF_Y, m_IDF_Yref->GetValue() );
+ }
+
+ bool GetThouOption()
+ {
+ return m_rbUnitSelection->GetSelection() == 1;
+ }
+
+ wxFilePickerCtrl* FilePicker()
+ {
+ return m_filePickerIDF;
+ }
+
+ int GetRefUnitsChoice()
+ {
+ return m_IDF_RefUnitChoice->GetSelection();
+ }
+
+ double GetXRef()
+ {
+ return DoubleValueFromString( UNSCALED_UNITS, m_IDF_Xref->GetValue() );
+ }
+
+ double GetYRef()
+ {
+ return DoubleValueFromString( UNSCALED_UNITS, m_IDF_Yref->GetValue() );
+ }
+
+ bool GetAutoAdjustOffset()
+ {
+ return m_cbAutoAdjustOffset->GetValue();
+ }
+
+ void OnAutoAdjustOffset( wxCommandEvent& event )
+ {
+ if( GetAutoAdjustOffset() )
+ {
+ m_IDF_RefUnitChoice->Enable( false );
+ m_IDF_Xref->Enable( false );
+ m_IDF_Yref->Enable( false );
+ }
+ else
+ {
+ m_IDF_RefUnitChoice->Enable( true );
+ m_IDF_Xref->Enable( true );
+ m_IDF_Yref->Enable( true );
+ }
+
+ event.Skip();
+ }
+
+};
+
+
+/**
+ * Function OnExportIDF3
+ * will export the current BOARD to IDF board and lib files.
+ */
+void PCB_EDIT_FRAME::ExportToIDF3( wxCommandEvent& event )
+{
+ wxFileName fn;
+
+ // Build default file name
+ fn = GetBoard()->GetFileName();
+ fn.SetExt( wxT( "emn" ) );
+
+ DIALOG_EXPORT_IDF3 dlg( this );
+ dlg.FilePicker()->SetPath( fn.GetFullPath() );
+
+ if ( dlg.ShowModal() != wxID_OK )
+ return;
+
+ bool thou = dlg.GetThouOption();
+ double aXRef;
+ double aYRef;
+
+ if( dlg.GetAutoAdjustOffset() )
+ {
+ EDA_RECT bbox = GetBoard()->ComputeBoundingBox( true );
+
+ aXRef = bbox.Centre().x * MM_PER_IU;
+ aYRef = bbox.Centre().y * MM_PER_IU;
+ }
+ else
+ {
+ aXRef = dlg.GetXRef();
+ aYRef = dlg.GetYRef();
+
+ if( dlg.GetRefUnitsChoice() == 1 )
+ {
+ // selected reference unit is in inches
+ aXRef *= 25.4;
+ aYRef *= 25.4;
+ }
+
+ }
+
+ wxBusyCursor dummy;
+
+ wxString fullFilename = dlg.FilePicker()->GetPath();
+
+ if( !Export_IDF3( GetBoard(), fullFilename, thou, aXRef, aYRef ) )
+ {
+ wxString msg = _( "Unable to create " ) + fullFilename;
+ wxMessageBox( msg );
+ return;
+ }
+}