Mostly EAGLE_PLUGIN work:
* Derive the pcbnew copper zone and non-copper zone dialog windows from DIAG_SHIM, which injects some template code. * Update UIpolicies.txt to talk about DIALOG_SHIM support. * Add zone support to eagle_plugin. * Organize ZONE_CONTAINER class declaration for future privacy and accessors.
This commit is contained in:
parent
52318f6988
commit
f2bd20ab34
|
@ -42,6 +42,14 @@ Dialogs:
|
|||
leaving them all bundled tightly together. The dialog box should look
|
||||
nice at any size large enough to show all the components.
|
||||
|
||||
When using wxFormBuilder, please add the following settings to the
|
||||
"Dialog" node:
|
||||
subclass.name <- DIALOG_SHIM
|
||||
subclass.header <- dialog_shim.h
|
||||
|
||||
This will provide for an override of the Show( bool ) wxWindow() function
|
||||
and provide retentitive size and position for the session.
|
||||
|
||||
Use tooltips to explain the functionality of each non-obvious control.
|
||||
This is important because the help files and the wiki often lag behind
|
||||
the source code.
|
||||
|
|
|
@ -1468,7 +1468,7 @@ int BOARD::SetAreasNetCodesFromNetNames( void )
|
|||
|
||||
if( GetArea( ii )->GetNet() != 0 ) // i.e. if this zone is connected to a net
|
||||
{
|
||||
const NETINFO_ITEM* net = FindNet( GetArea( ii )->m_Netname );
|
||||
const NETINFO_ITEM* net = FindNet( GetArea( ii )->GetNetName() );
|
||||
|
||||
if( net )
|
||||
{
|
||||
|
|
|
@ -74,6 +74,7 @@ ZONE_CONTAINER::ZONE_CONTAINER( const ZONE_CONTAINER& aZone ) :
|
|||
|
||||
// For corner moving, corner index to drag, or -1 if no selection
|
||||
m_CornerSelection = -1;
|
||||
m_IsFilled = aZone.m_IsFilled;
|
||||
m_ZoneClearance = aZone.m_ZoneClearance; // clearance value
|
||||
m_ZoneMinThickness = aZone.m_ZoneMinThickness;
|
||||
m_FillMode = aZone.m_FillMode; // Filling mode (segments/polygons)
|
||||
|
@ -84,6 +85,11 @@ ZONE_CONTAINER::ZONE_CONTAINER( const ZONE_CONTAINER& aZone ) :
|
|||
m_ThermalReliefCopperBridge = aZone.m_ThermalReliefCopperBridge;
|
||||
m_FilledPolysList = aZone.m_FilledPolysList;
|
||||
m_FillSegmList = aZone.m_FillSegmList;
|
||||
|
||||
cornerSmoothingType = aZone.cornerSmoothingType;
|
||||
cornerRadius = aZone.cornerRadius;
|
||||
utility = aZone.utility;
|
||||
utility2 = aZone.utility;
|
||||
}
|
||||
|
||||
|
||||
|
@ -717,7 +723,7 @@ void ZONE_CONTAINER::DisplayInfo( EDA_DRAW_FRAME* frame )
|
|||
frame->AppendMsgPanel( _( "Corners" ), msg, BLUE );
|
||||
|
||||
if( m_FillMode )
|
||||
msg.Printf( _( "Segments" ), m_FillMode );
|
||||
msg = _( "Segments" );
|
||||
else
|
||||
msg = _( "Polygons" );
|
||||
|
||||
|
|
|
@ -77,58 +77,7 @@ struct SEGMENT
|
|||
class ZONE_CONTAINER : public BOARD_CONNECTED_ITEM
|
||||
{
|
||||
public:
|
||||
wxString m_Netname; // Net Name
|
||||
CPolyLine* m_Poly; // outlines
|
||||
|
||||
// For corner moving, corner index to drag, or -1 if no selection.
|
||||
int m_CornerSelection;
|
||||
int m_ZoneClearance; // clearance value
|
||||
int m_ZoneMinThickness; // Min thickness value in filled areas
|
||||
|
||||
// How to fill areas: 0 = use filled polygons, != 0 fill with segments.
|
||||
int m_FillMode;
|
||||
|
||||
// number of segments to convert a circle to a polygon (uses
|
||||
//ARC_APPROX_SEGMENTS_COUNT_LOW_DEF or ARC_APPROX_SEGMENTS_COUNT_HIGHT_DEF)
|
||||
int m_ArcToSegmentsCount;
|
||||
|
||||
// thickness of the gap in thermal reliefs.
|
||||
int m_ThermalReliefGap;
|
||||
|
||||
// thickness of the copper bridge in thermal reliefs
|
||||
int m_ThermalReliefCopperBridge;
|
||||
int utility, utility2; // flags used in polygon calculations
|
||||
|
||||
// true when a zone was filled, false after deleting the filled areas
|
||||
bool m_IsFilled;
|
||||
|
||||
/* set of filled polygons used to draw a zone as a filled area.
|
||||
* from outlines (m_Poly) but unlike m_Poly these filled polygons have no hole
|
||||
* (they are* all in one piece) In very simple cases m_FilledPolysList is same
|
||||
* as m_Poly. In less simple cases (when m_Poly has holes) m_FilledPolysList is
|
||||
* a polygon equivalent to m_Poly, without holes but with extra outline segment
|
||||
* connecting "holes" with external main outline. In complex cases an outline
|
||||
* described by m_Poly can have many filled areas
|
||||
*/
|
||||
std::vector <CPolyPt> m_FilledPolysList;
|
||||
|
||||
/* set of segments used to fill area, when fill zone by segment is used.
|
||||
* ( m_FillMode == 1 )
|
||||
* in this case segments have m_ZoneMinThickness width
|
||||
*/
|
||||
std::vector <SEGMENT> m_FillSegmList;
|
||||
|
||||
private:
|
||||
CPolyLine* smoothedPoly; // Corner-smoothed version of m_Poly
|
||||
int cornerSmoothingType;
|
||||
unsigned int cornerRadius;
|
||||
// Priority: when a zone outline is inside and other zone, if its priority is higher
|
||||
// the other zone priority, it will be created inside.
|
||||
// if priorities are equal, a DRC error is set
|
||||
unsigned m_priority;
|
||||
ZoneConnection m_PadConnection;
|
||||
|
||||
public:
|
||||
ZONE_CONTAINER( BOARD* parent );
|
||||
|
||||
ZONE_CONTAINER( const ZONE_CONTAINER& aZone );
|
||||
|
@ -257,13 +206,13 @@ public:
|
|||
* returns the net name.
|
||||
* @return const wxString& - The net name.
|
||||
*/
|
||||
const wxString& GetNetName() const { return m_Netname; };
|
||||
void SetNetName( const wxString& aName ) { m_Netname = aName; }
|
||||
const wxString& GetNetName() const { return m_Netname; };
|
||||
void SetNetName( const wxString& aName ) { m_Netname = aName; }
|
||||
|
||||
void SetFillMode( int aFillMode ) { m_FillMode = aFillMode; }
|
||||
int GetFillMode() const { return m_FillMode; }
|
||||
void SetFillMode( int aFillMode ) { m_FillMode = aFillMode; }
|
||||
int GetFillMode() const { return m_FillMode; }
|
||||
|
||||
void SetThermalReliefGap( int aThermalReliefGap ) { m_ThermalReliefGap = aThermalReliefGap; }
|
||||
void SetThermalReliefGap( int aThermalReliefGap ) { m_ThermalReliefGap = aThermalReliefGap; }
|
||||
int GetThermalReliefGap( D_PAD* aPad = NULL ) const;
|
||||
|
||||
void SetThermalReliefCopperBridge( int aThermalReliefCopperBridge )
|
||||
|
@ -547,6 +496,59 @@ public:
|
|||
#if defined(DEBUG)
|
||||
void Show( int nestLevel, std::ostream& os ) const { ShowDummy( os ); } // override
|
||||
#endif
|
||||
|
||||
|
||||
CPolyLine* m_Poly; // outlines
|
||||
|
||||
// For corner moving, corner index to drag, or -1 if no selection.
|
||||
int m_CornerSelection;
|
||||
int m_ZoneClearance; // clearance value
|
||||
int m_ZoneMinThickness; // Min thickness value in filled areas
|
||||
|
||||
// How to fill areas: 0 = use filled polygons, != 0 fill with segments.
|
||||
int m_FillMode;
|
||||
|
||||
// number of segments to convert a circle to a polygon (uses
|
||||
//ARC_APPROX_SEGMENTS_COUNT_LOW_DEF or ARC_APPROX_SEGMENTS_COUNT_HIGHT_DEF)
|
||||
int m_ArcToSegmentsCount;
|
||||
|
||||
// thickness of the gap in thermal reliefs.
|
||||
int m_ThermalReliefGap;
|
||||
|
||||
// thickness of the copper bridge in thermal reliefs
|
||||
int m_ThermalReliefCopperBridge;
|
||||
int utility, utility2; // flags used in polygon calculations
|
||||
|
||||
// true when a zone was filled, false after deleting the filled areas
|
||||
bool m_IsFilled;
|
||||
|
||||
/* set of filled polygons used to draw a zone as a filled area.
|
||||
* from outlines (m_Poly) but unlike m_Poly these filled polygons have no hole
|
||||
* (they are* all in one piece) In very simple cases m_FilledPolysList is same
|
||||
* as m_Poly. In less simple cases (when m_Poly has holes) m_FilledPolysList is
|
||||
* a polygon equivalent to m_Poly, without holes but with extra outline segment
|
||||
* connecting "holes" with external main outline. In complex cases an outline
|
||||
* described by m_Poly can have many filled areas
|
||||
*/
|
||||
std::vector <CPolyPt> m_FilledPolysList;
|
||||
|
||||
/* set of segments used to fill area, when fill zone by segment is used.
|
||||
* ( m_FillMode == 1 )
|
||||
* in this case segments have m_ZoneMinThickness width
|
||||
*/
|
||||
std::vector <SEGMENT> m_FillSegmList;
|
||||
|
||||
|
||||
private:
|
||||
wxString m_Netname; // Net Name
|
||||
CPolyLine* smoothedPoly; // Corner-smoothed version of m_Poly
|
||||
int cornerSmoothingType;
|
||||
unsigned int cornerRadius;
|
||||
// Priority: when a zone outline is inside and other zone, if its priority is higher
|
||||
// the other zone priority, it will be created inside.
|
||||
// if priorities are equal, a DRC error is set
|
||||
unsigned m_priority;
|
||||
ZoneConnection m_PadConnection;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -56,9 +56,6 @@ private:
|
|||
|
||||
wxListView* m_LayerSelectionCtrl;
|
||||
|
||||
static wxPoint prevPosition; ///< Dialog position & size
|
||||
static wxSize prevSize;
|
||||
|
||||
/**
|
||||
* Function initDialog
|
||||
* fills in the dialog controls using the current settings.
|
||||
|
@ -108,8 +105,6 @@ private:
|
|||
|
||||
// Initialize static member variables
|
||||
wxString DIALOG_COPPER_ZONE::m_netNameShowFilter( wxT( "*" ) );
|
||||
wxPoint DIALOG_COPPER_ZONE::prevPosition( -1, -1 );
|
||||
wxSize DIALOG_COPPER_ZONE::prevSize;
|
||||
|
||||
|
||||
ZONE_EDIT_T InvokeCopperZonesEditor( PCB_BASE_FRAME* aCaller, ZONE_SETTINGS* aSettings )
|
||||
|
@ -157,11 +152,7 @@ DIALOG_COPPER_ZONE::DIALOG_COPPER_ZONE( PCB_BASE_FRAME* aParent, ZONE_SETTINGS*
|
|||
|
||||
GetSizer()->SetSizeHints( this );
|
||||
|
||||
if( prevPosition.x != -1 )
|
||||
SetSize( prevPosition.x, prevPosition.y,
|
||||
prevSize.x, prevSize.y );
|
||||
else
|
||||
Center();
|
||||
Center();
|
||||
}
|
||||
|
||||
|
||||
|
@ -169,8 +160,6 @@ void DIALOG_COPPER_ZONE::initDialog()
|
|||
{
|
||||
BOARD* board = m_Parent->GetBoard();
|
||||
|
||||
SetFocus(); // Required under wxGTK if we want to demiss the dialog with the ESC key
|
||||
|
||||
wxString msg;
|
||||
|
||||
if( m_settings.m_Zone_45_Only )
|
||||
|
@ -297,8 +286,6 @@ void DIALOG_COPPER_ZONE::OnButtonCancelClick( wxCommandEvent& event )
|
|||
void DIALOG_COPPER_ZONE::OnButtonOkClick( wxCommandEvent& event )
|
||||
{
|
||||
m_netNameShowFilter = m_ShowNetNameFilter->GetValue();
|
||||
prevPosition = GetPosition();
|
||||
prevSize = GetSize();
|
||||
|
||||
if( AcceptOptions( true ) )
|
||||
{
|
||||
|
@ -311,9 +298,6 @@ void DIALOG_COPPER_ZONE::OnButtonOkClick( wxCommandEvent& event )
|
|||
// called on system close button
|
||||
void DIALOG_COPPER_ZONE::OnClose( wxCloseEvent& event )
|
||||
{
|
||||
prevPosition = GetPosition();
|
||||
prevSize = GetSize();
|
||||
|
||||
if( m_OnExitCode != ZONE_ABORT )
|
||||
*m_ptr = m_settings;
|
||||
|
||||
|
@ -384,7 +368,7 @@ bool DIALOG_COPPER_ZONE::AcceptOptions( bool aPromptForErrors, bool aUseExportab
|
|||
wxString txtvalue = m_ZoneClearanceCtrl->GetValue();
|
||||
m_settings.m_ZoneClearance = ReturnValueFromString( g_UserUnit, txtvalue );
|
||||
|
||||
// Test if this is a reasonnable value for this parameter
|
||||
// Test if this is a reasonable value for this parameter
|
||||
// A too large value can hang Pcbnew
|
||||
#define CLEARANCE_MAX_VALUE 5000 // in 1/10000 inch
|
||||
if( m_settings.m_ZoneClearance > CLEARANCE_MAX_VALUE )
|
||||
|
@ -519,9 +503,6 @@ void DIALOG_COPPER_ZONE::OnNetSortingOptionSelected( wxCommandEvent& event )
|
|||
|
||||
void DIALOG_COPPER_ZONE::ExportSetupToOtherCopperZones( wxCommandEvent& event )
|
||||
{
|
||||
prevPosition = GetPosition();
|
||||
prevSize = GetSize();
|
||||
|
||||
if( !AcceptOptions( true, true ) )
|
||||
return;
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version Jun 30 2011)
|
||||
// C++ code generated with wxFormBuilder (version Apr 11 2012)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO "NOT" EDIT THIS FILE!
|
||||
|
@ -9,7 +9,7 @@
|
|||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
BEGIN_EVENT_TABLE( DIALOG_COPPER_ZONE_BASE, wxDialog )
|
||||
BEGIN_EVENT_TABLE( DIALOG_COPPER_ZONE_BASE, DIALOG_SHIM )
|
||||
EVT_CLOSE( DIALOG_COPPER_ZONE_BASE::_wxFB_OnClose )
|
||||
EVT_SIZE( DIALOG_COPPER_ZONE_BASE::_wxFB_OnSize )
|
||||
EVT_CHOICE( ID_M_NETDISPLAYOPTION, DIALOG_COPPER_ZONE_BASE::_wxFB_OnNetSortingOptionSelected )
|
||||
|
@ -23,7 +23,7 @@ BEGIN_EVENT_TABLE( DIALOG_COPPER_ZONE_BASE, wxDialog )
|
|||
EVT_BUTTON( wxID_CANCEL, DIALOG_COPPER_ZONE_BASE::_wxFB_OnButtonCancelClick )
|
||||
END_EVENT_TABLE()
|
||||
|
||||
DIALOG_COPPER_ZONE_BASE::DIALOG_COPPER_ZONE_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
|
||||
DIALOG_COPPER_ZONE_BASE::DIALOG_COPPER_ZONE_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : DIALOG_SHIM( parent, id, title, pos, size, style )
|
||||
{
|
||||
this->SetSizeHints( wxDefaultSize, wxDefaultSize );
|
||||
|
||||
|
@ -38,6 +38,7 @@ DIALOG_COPPER_ZONE_BASE::DIALOG_COPPER_ZONE_BASE( wxWindow* parent, wxWindowID i
|
|||
m_staticText17->Wrap( -1 );
|
||||
m_layerSizer->Add( m_staticText17, 0, wxLEFT|wxRIGHT|wxTOP, 5 );
|
||||
|
||||
|
||||
m_OptionsBoxSizer->Add( m_layerSizer, 1, wxEXPAND, 5 );
|
||||
|
||||
wxBoxSizer* bSizer7;
|
||||
|
@ -50,6 +51,7 @@ DIALOG_COPPER_ZONE_BASE::DIALOG_COPPER_ZONE_BASE( wxWindow* parent, wxWindowID i
|
|||
m_ListNetNameSelection = new wxListBox( this, ID_NETNAME_SELECTION, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
|
||||
bSizer7->Add( m_ListNetNameSelection, 1, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
|
||||
m_OptionsBoxSizer->Add( bSizer7, 1, wxEXPAND, 5 );
|
||||
|
||||
wxStaticBoxSizer* m_NetSortOptSizer;
|
||||
|
@ -86,8 +88,10 @@ DIALOG_COPPER_ZONE_BASE::DIALOG_COPPER_ZONE_BASE( wxWindow* parent, wxWindowID i
|
|||
m_buttonRunFilter = new wxButton( this, wxID_APPLY_FILTERS, _("Apply Filters"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_NetSortOptSizer->Add( m_buttonRunFilter, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
|
||||
m_OptionsBoxSizer->Add( m_NetSortOptSizer, 0, wxALL, 5 );
|
||||
|
||||
|
||||
m_MainBoxSizer->Add( m_OptionsBoxSizer, 1, wxALL|wxEXPAND, 5 );
|
||||
|
||||
wxStaticBoxSizer* m_ExportableSetupSizer;
|
||||
|
@ -129,6 +133,7 @@ DIALOG_COPPER_ZONE_BASE::DIALOG_COPPER_ZONE_BASE( wxWindow* parent, wxWindowID i
|
|||
m_cornerSmoothingCtrl = new wxTextCtrl( this, ID_M_CORNERSMOOTHINGCTRL, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
bSizer9->Add( m_cornerSmoothingCtrl, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 );
|
||||
|
||||
|
||||
m_ExportableSetupSizer->Add( bSizer9, 0, wxEXPAND, 5 );
|
||||
|
||||
wxBoxSizer* m_LeftBox;
|
||||
|
@ -165,8 +170,10 @@ DIALOG_COPPER_ZONE_BASE::DIALOG_COPPER_ZONE_BASE( wxWindow* parent, wxWindowID i
|
|||
|
||||
m_ThermalShapesParamsSizer->Add( m_CopperWidthValue, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 );
|
||||
|
||||
|
||||
m_LeftBox->Add( m_ThermalShapesParamsSizer, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
|
||||
m_ExportableSetupSizer->Add( m_LeftBox, 0, wxEXPAND, 5 );
|
||||
|
||||
wxBoxSizer* m_MiddleBox;
|
||||
|
@ -201,6 +208,7 @@ DIALOG_COPPER_ZONE_BASE::DIALOG_COPPER_ZONE_BASE( wxWindow* parent, wxWindowID i
|
|||
m_ArcApproximationOpt->SetSelection( 0 );
|
||||
m_MiddleBox->Add( m_ArcApproximationOpt, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 );
|
||||
|
||||
|
||||
m_ExportableSetupSizer->Add( m_MiddleBox, 0, wxEXPAND, 5 );
|
||||
|
||||
wxBoxSizer* bSizer81;
|
||||
|
@ -226,8 +234,10 @@ DIALOG_COPPER_ZONE_BASE::DIALOG_COPPER_ZONE_BASE( wxWindow* parent, wxWindowID i
|
|||
m_OutlineAppearanceCtrl->SetSelection( 0 );
|
||||
bSizer81->Add( m_OutlineAppearanceCtrl, 0, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 );
|
||||
|
||||
|
||||
m_ExportableSetupSizer->Add( bSizer81, 0, wxEXPAND, 5 );
|
||||
|
||||
|
||||
m_MainBoxSizer->Add( m_ExportableSetupSizer, 1, wxALL|wxEXPAND, 5 );
|
||||
|
||||
wxBoxSizer* bSizer10;
|
||||
|
@ -245,8 +255,10 @@ DIALOG_COPPER_ZONE_BASE::DIALOG_COPPER_ZONE_BASE( wxWindow* parent, wxWindowID i
|
|||
m_ButtonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
bSizer10->Add( m_ButtonCancel, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
|
||||
m_MainBoxSizer->Add( bSizer10, 0, wxALIGN_RIGHT|wxALL, 5 );
|
||||
|
||||
|
||||
this->SetSizer( m_MainBoxSizer );
|
||||
this->Layout();
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,5 +1,5 @@
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version Jun 30 2011)
|
||||
// C++ code generated with wxFormBuilder (version Apr 11 2012)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO "NOT" EDIT THIS FILE!
|
||||
|
@ -11,6 +11,7 @@
|
|||
#include <wx/artprov.h>
|
||||
#include <wx/xrc/xmlres.h>
|
||||
#include <wx/intl.h>
|
||||
#include "dialog_shim.h"
|
||||
#include <wx/string.h>
|
||||
#include <wx/stattext.h>
|
||||
#include <wx/gdicmn.h>
|
||||
|
@ -31,7 +32,7 @@
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
/// Class DIALOG_COPPER_ZONE_BASE
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
class DIALOG_COPPER_ZONE_BASE : public wxDialog
|
||||
class DIALOG_COPPER_ZONE_BASE : public DIALOG_SHIM
|
||||
{
|
||||
DECLARE_EVENT_TABLE()
|
||||
private:
|
||||
|
@ -66,7 +67,7 @@ class DIALOG_COPPER_ZONE_BASE : public wxDialog
|
|||
ID_M_ARCAPPROXIMATIONOPT,
|
||||
ID_M_ORIENTEDGESOPT,
|
||||
ID_M_OUTLINEAPPEARANCECTRL,
|
||||
wxID_BUTTON_EXPORT,
|
||||
wxID_BUTTON_EXPORT
|
||||
};
|
||||
|
||||
wxBoxSizer* m_MainBoxSizer;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version Apr 16 2008)
|
||||
// C++ code generated with wxFormBuilder (version Apr 11 2012)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO "NOT" EDIT THIS FILE!
|
||||
|
@ -9,12 +9,12 @@
|
|||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
BEGIN_EVENT_TABLE( DialogNonCopperZonesPropertiesBase, wxDialog )
|
||||
BEGIN_EVENT_TABLE( DialogNonCopperZonesPropertiesBase, DIALOG_SHIM )
|
||||
EVT_BUTTON( wxID_OK, DialogNonCopperZonesPropertiesBase::_wxFB_OnOkClick )
|
||||
EVT_BUTTON( wxID_CANCEL, DialogNonCopperZonesPropertiesBase::_wxFB_OnCancelClick )
|
||||
END_EVENT_TABLE()
|
||||
|
||||
DialogNonCopperZonesPropertiesBase::DialogNonCopperZonesPropertiesBase( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
|
||||
DialogNonCopperZonesPropertiesBase::DialogNonCopperZonesPropertiesBase( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : DIALOG_SHIM( parent, id, title, pos, size, style )
|
||||
{
|
||||
this->SetSizeHints( wxDefaultSize, wxDefaultSize );
|
||||
|
||||
|
@ -40,6 +40,7 @@ DialogNonCopperZonesPropertiesBase::DialogNonCopperZonesPropertiesBase( wxWindow
|
|||
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;
|
||||
|
@ -57,6 +58,7 @@ DialogNonCopperZonesPropertiesBase::DialogNonCopperZonesPropertiesBase( wxWindow
|
|||
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;
|
||||
|
@ -69,8 +71,10 @@ DialogNonCopperZonesPropertiesBase::DialogNonCopperZonesPropertiesBase( wxWindow
|
|||
m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_ButtonsSizer->Add( m_buttonCancel, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 );
|
||||
|
||||
|
||||
m_UpperSizer->Add( m_ButtonsSizer, 1, wxALIGN_CENTER_VERTICAL, 5 );
|
||||
|
||||
|
||||
m_MainSizer->Add( m_UpperSizer, 1, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 );
|
||||
|
||||
m_staticTextLayerSelection = new wxStaticText( this, wxID_ANY, _("Layer selection:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
|
@ -80,6 +84,7 @@ DialogNonCopperZonesPropertiesBase::DialogNonCopperZonesPropertiesBase( wxWindow
|
|||
m_LayerSelectionCtrl = new wxListBox( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
|
||||
m_MainSizer->Add( m_LayerSelectionCtrl, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
|
||||
this->SetSizer( m_MainSizer );
|
||||
this->Layout();
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,15 +1,17 @@
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version Apr 16 2008)
|
||||
// C++ code generated with wxFormBuilder (version Apr 11 2012)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO "NOT" EDIT THIS FILE!
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __dialog_non_copper_zones_properties_base__
|
||||
#define __dialog_non_copper_zones_properties_base__
|
||||
#ifndef __DIALOG_NON_COPPER_ZONES_PROPERTIES_BASE_H__
|
||||
#define __DIALOG_NON_COPPER_ZONES_PROPERTIES_BASE_H__
|
||||
|
||||
#include <wx/artprov.h>
|
||||
#include <wx/xrc/xmlres.h>
|
||||
#include <wx/intl.h>
|
||||
|
||||
#include "dialog_shim.h"
|
||||
#include <wx/string.h>
|
||||
#include <wx/radiobox.h>
|
||||
#include <wx/gdicmn.h>
|
||||
|
@ -29,7 +31,7 @@
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
/// Class DialogNonCopperZonesPropertiesBase
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
class DialogNonCopperZonesPropertiesBase : public wxDialog
|
||||
class DialogNonCopperZonesPropertiesBase : public DIALOG_SHIM
|
||||
{
|
||||
DECLARE_EVENT_TABLE()
|
||||
private:
|
||||
|
@ -51,14 +53,15 @@ class DialogNonCopperZonesPropertiesBase : public wxDialog
|
|||
wxListBox* m_LayerSelectionCtrl;
|
||||
|
||||
// Virtual event handlers, overide them in your derived class
|
||||
virtual void OnOkClick( wxCommandEvent& event ){ event.Skip(); }
|
||||
virtual void OnCancelClick( wxCommandEvent& 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( 416,287 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER|wxFULL_REPAINT_ON_RESIZE|wxSUNKEN_BORDER );
|
||||
~DialogNonCopperZonesPropertiesBase();
|
||||
|
||||
};
|
||||
|
||||
#endif //__dialog_non_copper_zones_properties_base__
|
||||
#endif //__DIALOG_NON_COPPER_ZONES_PROPERTIES_BASE_H__
|
||||
|
|
|
@ -55,6 +55,8 @@ Load() TODO's
|
|||
*) fix text twisting and final location issues.
|
||||
*) netclass info?
|
||||
*) code factoring, for polygon at least
|
||||
*) zone fill clearances
|
||||
*) package rectangles
|
||||
|
||||
*/
|
||||
|
||||
|
@ -92,7 +94,9 @@ typedef MODULE_MAP::const_iterator MODULE_CITER;
|
|||
typedef boost::optional<std::string> opt_string;
|
||||
typedef boost::optional<int> opt_int;
|
||||
typedef boost::optional<double> opt_double;
|
||||
typedef boost::optional<CPTREE&> opt_cptree;
|
||||
typedef boost::optional<bool> opt_bool;
|
||||
//typedef boost::optional<CPTREE&> opt_cptree;
|
||||
|
||||
|
||||
/// Eagle wire
|
||||
struct EWIRE
|
||||
|
@ -179,9 +183,8 @@ struct ETEXT
|
|||
opt_string font;
|
||||
opt_double ratio;
|
||||
opt_erot erot;
|
||||
opt_int align;
|
||||
|
||||
enum {
|
||||
enum { // for align
|
||||
CENTER,
|
||||
CENTER_LEFT,
|
||||
TOP_CENTER,
|
||||
|
@ -194,6 +197,78 @@ struct ETEXT
|
|||
BOTTOM_LEFT = -TOP_RIGHT,
|
||||
BOTTOM_RIGHT = -TOP_LEFT,
|
||||
};
|
||||
|
||||
opt_int align;
|
||||
};
|
||||
|
||||
/// Eagle thru hol pad
|
||||
struct EPAD
|
||||
{
|
||||
std::string name;
|
||||
double x;
|
||||
double y;
|
||||
double drill;
|
||||
opt_double diameter;
|
||||
|
||||
// for shape: (square | round | octagon | long | offset)
|
||||
enum {
|
||||
SQUARE,
|
||||
ROUND,
|
||||
OCTAGON,
|
||||
LONG,
|
||||
OFFSET,
|
||||
};
|
||||
|
||||
opt_int shape;
|
||||
|
||||
opt_erot erot;
|
||||
|
||||
opt_bool stop;
|
||||
opt_bool thermals;
|
||||
opt_bool first;
|
||||
};
|
||||
|
||||
|
||||
/// Eagle SMD pad
|
||||
struct ESMD
|
||||
{
|
||||
std::string name;
|
||||
double x;
|
||||
double y;
|
||||
double dx;
|
||||
double dy;
|
||||
int layer;
|
||||
opt_int roundness;
|
||||
opt_erot erot;
|
||||
opt_bool stop;
|
||||
opt_bool thermals;
|
||||
opt_bool cream;
|
||||
};
|
||||
|
||||
struct EVERTEX
|
||||
{
|
||||
double x;
|
||||
double y;
|
||||
};
|
||||
|
||||
// Eagle polygon, without vertices which are parsed as needed
|
||||
struct EPOLYGON
|
||||
{
|
||||
double width;
|
||||
int layer;
|
||||
opt_double spacing;
|
||||
|
||||
enum { // for pour
|
||||
SOLID,
|
||||
HATCH,
|
||||
CUTOUT,
|
||||
};
|
||||
|
||||
opt_int pour;
|
||||
opt_double isolate;
|
||||
opt_bool orphans;
|
||||
opt_bool thermals;
|
||||
opt_int rank;
|
||||
};
|
||||
|
||||
|
||||
|
@ -212,6 +287,18 @@ static inline unsigned long timeStamp( CPTREE& aTree )
|
|||
}
|
||||
|
||||
|
||||
static opt_bool parseOptionalBool( CPTREE& attribs, const char* aName )
|
||||
{
|
||||
opt_bool ret;
|
||||
opt_string stemp = attribs.get_optional<std::string>( aName );
|
||||
|
||||
if( stemp )
|
||||
ret = !stemp->compare( "yes" );
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
EAGLE_PLUGIN::EAGLE_PLUGIN()
|
||||
{
|
||||
init( NULL );
|
||||
|
@ -459,40 +546,31 @@ void EAGLE_PLUGIN::loadPlain( CPTREE& aGraphics, const std::string& aXpath )
|
|||
// net related info on it from the DTD.
|
||||
else if( !gr->first.compare( "rectangle" ) )
|
||||
{
|
||||
#if 0
|
||||
ERECT r = erect( gr->second );
|
||||
int layer = kicad_layer( r.layer );
|
||||
|
||||
// hope the angle of rotation is zero.
|
||||
|
||||
// might be better off making this into a ZONE:
|
||||
|
||||
if( IsValidCopperLayerIndex( layer ) )
|
||||
{
|
||||
auto_ptr<DRAWSEGMENT> dseg = new DRAWSEGMENT( m_board );
|
||||
// use a "netcode = 0" type ZONE:
|
||||
ZONE_CONTAINER* zone = new ZONE_CONTAINER( m_board );
|
||||
m_board->Add( zone, ADD_APPEND );
|
||||
|
||||
dseg->SetTimeStamp( timeStamp( gr->second ) );
|
||||
dseg->SetLayer( layer );
|
||||
dseg->SetShape( S_POLYGON );
|
||||
dseg->SetWidth( Mils2iu( 12 ) );
|
||||
zone->SetTimeStamp( timeStamp( gr->second ) );
|
||||
zone->SetLayer( layer );
|
||||
zone->SetNet( 0 );
|
||||
|
||||
std::vector<wxPoint> pts;
|
||||
int outline_hatch = CPolyLine::DIAGONAL_EDGE;
|
||||
|
||||
pts.push_back( wxPoint( kicad_x( r.x1 ), kicad_y( r.y1 ) ) );
|
||||
pts.push_back( wxPoint( kicad_x( r.x2 ), kicad_y( r.y1 ) ) );
|
||||
pts.push_back( wxPoint( kicad_x( r.x2 ), kicad_y( r.y2 ) ) );
|
||||
pts.push_back( wxPoint( kicad_x( r.x1 ), kicad_y( r.y2 ) ) );
|
||||
dseg->SetPolyPoints( pts );
|
||||
zone->m_Poly->Start( layer, kicad_x( r.x1 ), kicad_y( r.y1 ), outline_hatch );
|
||||
zone->AppendCorner( wxPoint( kicad_x( r.x2 ), kicad_y( r.y1 ) ) );
|
||||
zone->AppendCorner( wxPoint( kicad_x( r.x2 ), kicad_y( r.y2 ) ) );
|
||||
zone->AppendCorner( wxPoint( kicad_x( r.x1 ), kicad_y( r.y2 ) ) );
|
||||
zone->m_Poly->Close();
|
||||
|
||||
m_board->Add( dseg.release(), ADD_APPEND );
|
||||
// this is not my fault:
|
||||
zone->m_Poly->SetHatch( outline_hatch,
|
||||
Mils2iu( zone->m_Poly->GetDefaultHatchPitchMils() ) );
|
||||
}
|
||||
#elif 0
|
||||
// use a "netcode = 0" type ZONE:
|
||||
auto_ptr<ZONE_CONTAINER> zone = new ZONE_CONTAINER( m_board );
|
||||
|
||||
;
|
||||
m_board->Add( zone.release(), ADD_APPEND );
|
||||
#endif
|
||||
}
|
||||
else if( !gr->first.compare( "hole" ) )
|
||||
{
|
||||
|
@ -630,18 +708,13 @@ void EAGLE_PLUGIN::loadElements( CPTREE& aElements, const std::string& aXpath )
|
|||
|
||||
for( D_PAD* pad = m->m_Pads; pad; pad = pad->Next() )
|
||||
{
|
||||
const ENET& enet = m_pads_to_nets[ makeKey( name, TO_UTF8( pad->GetPadName())) ];
|
||||
std::string key = makeKey( name, TO_UTF8( pad->GetPadName() ) );
|
||||
|
||||
D(printf( "refname:'%s' pad:'%s' netcode:%d netname:'%s'\n",
|
||||
name.c_str(), TO_UTF8( pad->GetPadName() ),
|
||||
enet.netcode,
|
||||
enet.netname.c_str()
|
||||
);)
|
||||
|
||||
if( enet.netname.size() )
|
||||
NET_MAP_CITER ni = m_pads_to_nets.find( key );
|
||||
if( ni != m_pads_to_nets.end() )
|
||||
{
|
||||
pad->SetNetname( FROM_UTF8( enet.netname.c_str() ) );
|
||||
pad->SetNet( enet.netcode );
|
||||
pad->SetNetname( FROM_UTF8( ni->second.netname.c_str() ) );
|
||||
pad->SetNet( ni->second.netcode );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -808,7 +881,7 @@ ERECT EAGLE_PLUGIN::erect( CPTREE& aRect ) const
|
|||
r.y2 = attribs.get<double>( "y2" );
|
||||
r.layer = attribs.get<int>( "layer" );
|
||||
|
||||
// @todo: hoping that rot is not used
|
||||
// @todo: stop hoping that rot is not used
|
||||
|
||||
return r;
|
||||
}
|
||||
|
@ -883,7 +956,11 @@ EROT EAGLE_PLUGIN::erot( const std::string& aRot ) const
|
|||
|
||||
rot.spin = aRot.find( 'S' ) != aRot.npos;
|
||||
rot.mirror = aRot.find( 'M' ) != aRot.npos;
|
||||
rot.degrees = strtod( aRot.c_str() + 1 + int( rot.spin || rot.mirror ), NULL );
|
||||
rot.degrees = strtod( aRot.c_str()
|
||||
+ 1 // skip leading 'R'
|
||||
+ int( rot.spin ) // skip optional leading 'S'
|
||||
+ int( rot.mirror ), // skip optional leading 'M'
|
||||
NULL );
|
||||
|
||||
return rot;
|
||||
}
|
||||
|
@ -947,6 +1024,173 @@ EATTR EAGLE_PLUGIN::eattr( CPTREE& aAttribute ) const
|
|||
}
|
||||
|
||||
|
||||
EPAD EAGLE_PLUGIN::epad( CPTREE& aPad ) const
|
||||
{
|
||||
EPAD p;
|
||||
CPTREE& attribs = aPad.get_child( "<xmlattr>" );
|
||||
|
||||
/*
|
||||
<!ELEMENT pad EMPTY>
|
||||
<!ATTLIST pad
|
||||
name %String; #REQUIRED
|
||||
x %Coord; #REQUIRED
|
||||
y %Coord; #REQUIRED
|
||||
drill %Dimension; #REQUIRED
|
||||
diameter %Dimension; "0"
|
||||
shape %PadShape; "round"
|
||||
rot %Rotation; "R0"
|
||||
stop %Bool; "yes"
|
||||
thermals %Bool; "yes"
|
||||
first %Bool; "no"
|
||||
>
|
||||
*/
|
||||
|
||||
// the DTD says these must be present, throw exception if not found
|
||||
p.name = attribs.get<std::string>( "name" );
|
||||
p.x = attribs.get<double>( "x" );
|
||||
p.y = attribs.get<double>( "y" );
|
||||
p.drill = attribs.get<double>( "drill" );
|
||||
|
||||
p.diameter = attribs.get_optional<double>( "diameter" );
|
||||
|
||||
opt_string s = attribs.get_optional<std::string>( "shape" );
|
||||
if( s )
|
||||
{
|
||||
// (square | round | octagon | long | offset)
|
||||
if( !s->compare( "square" ) )
|
||||
p.shape = EPAD::SQUARE;
|
||||
else if( !s->compare( "round" ) )
|
||||
p.shape = EPAD::ROUND;
|
||||
else if( !s->compare( "octagon" ) )
|
||||
p.shape = EPAD::OCTAGON;
|
||||
else if( !s->compare( "long" ) )
|
||||
p.shape = EPAD::LONG;
|
||||
else if( !s->compare( "offset" ) )
|
||||
p.shape = EPAD::OFFSET;
|
||||
}
|
||||
|
||||
opt_string rot = attribs.get_optional<std::string>( "rot" );
|
||||
if( rot )
|
||||
{
|
||||
p.erot = erot( *rot );
|
||||
}
|
||||
|
||||
p.stop = parseOptionalBool( attribs, "stop" );
|
||||
p.thermals = parseOptionalBool( attribs, "thermals" );
|
||||
p.first = parseOptionalBool( attribs, "first" );
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
|
||||
ESMD EAGLE_PLUGIN::esmd( CPTREE& aSMD ) const
|
||||
{
|
||||
ESMD s;
|
||||
CPTREE& attribs = aSMD.get_child( "<xmlattr>" );
|
||||
|
||||
/*
|
||||
<!ATTLIST smd
|
||||
name %String; #REQUIRED
|
||||
x %Coord; #REQUIRED
|
||||
y %Coord; #REQUIRED
|
||||
dx %Dimension; #REQUIRED
|
||||
dy %Dimension; #REQUIRED
|
||||
layer %Layer; #REQUIRED
|
||||
roundness %Int; "0"
|
||||
rot %Rotation; "R0"
|
||||
stop %Bool; "yes"
|
||||
thermals %Bool; "yes"
|
||||
cream %Bool; "yes"
|
||||
>
|
||||
*/
|
||||
|
||||
// the DTD says these must be present, throw exception if not found
|
||||
s.name = attribs.get<std::string>( "name" );
|
||||
s.x = attribs.get<double>( "x" );
|
||||
s.y = attribs.get<double>( "y" );
|
||||
s.dx = attribs.get<double>( "dx" );
|
||||
s.dy = attribs.get<double>( "dy" );
|
||||
s.layer = attribs.get<int>( "layer" );
|
||||
|
||||
opt_string rot = attribs.get_optional<std::string>( "rot" );
|
||||
if( rot )
|
||||
{
|
||||
s.erot = erot( *rot );
|
||||
}
|
||||
|
||||
s.roundness = attribs.get_optional<int>( "roundness" );
|
||||
s.thermals = parseOptionalBool( attribs, "thermals" );
|
||||
s.stop = parseOptionalBool( attribs, "stop" );
|
||||
s.thermals = parseOptionalBool( attribs, "thermals" );
|
||||
s.cream = parseOptionalBool( attribs, "cream" );
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
EVERTEX EAGLE_PLUGIN::evertex( CPTREE& aVertex ) const
|
||||
{
|
||||
EVERTEX v;
|
||||
CPTREE& attribs = aVertex.get_child( "<xmlattr>" );
|
||||
|
||||
/*
|
||||
<!ELEMENT vertex EMPTY>
|
||||
<!ATTLIST vertex
|
||||
x %Coord; #REQUIRED
|
||||
y %Coord; #REQUIRED
|
||||
curve %WireCurve; "0" -- the curvature from this vertex to the next one --
|
||||
>
|
||||
*/
|
||||
|
||||
v.x = attribs.get<double>( "x" );
|
||||
v.y = attribs.get<double>( "y" );
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
|
||||
EPOLYGON EAGLE_PLUGIN::epolygon( CPTREE& aPolygon ) const
|
||||
{
|
||||
EPOLYGON p;
|
||||
CPTREE& attribs = aPolygon.get_child( "<xmlattr>" );
|
||||
|
||||
/*
|
||||
<!ATTLIST polygon
|
||||
width %Dimension; #REQUIRED
|
||||
layer %Layer; #REQUIRED
|
||||
spacing %Dimension; #IMPLIED
|
||||
pour %PolygonPour; "solid"
|
||||
isolate %Dimension; #IMPLIED -- only in <signal> or <package> context --
|
||||
orphans %Bool; "no" -- only in <signal> context --
|
||||
thermals %Bool; "yes" -- only in <signal> context --
|
||||
rank %Int; "0" -- 1..6 in <signal> context, 0 or 7 in <package> context --
|
||||
>
|
||||
*/
|
||||
|
||||
p.width = attribs.get<double>( "width" );
|
||||
p.layer = attribs.get<int>( "layer" );
|
||||
p.spacing = attribs.get_optional<double>( "spacing" );
|
||||
|
||||
opt_string s = attribs.get_optional<std::string>( "pour" );
|
||||
if( s )
|
||||
{
|
||||
// (solid | hatch | cutout)
|
||||
if( !s->compare( "hatch" ) )
|
||||
p.pour = EPOLYGON::HATCH;
|
||||
else if( !s->compare( "cutout" ) )
|
||||
p.pour = EPOLYGON::CUTOUT;
|
||||
else
|
||||
p.pour = EPOLYGON::SOLID;
|
||||
}
|
||||
|
||||
p.orphans = parseOptionalBool( attribs, "orphans" );
|
||||
p.thermals = parseOptionalBool( attribs, "thermals" );
|
||||
p.rank = attribs.get_optional<int>( "rank" );
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
|
||||
MODULE* EAGLE_PLUGIN::makeModule( CPTREE& aPackage, const std::string& aPkgName ) const
|
||||
{
|
||||
std::auto_ptr<MODULE> m( new MODULE( NULL ) );
|
||||
|
@ -1014,11 +1258,10 @@ void EAGLE_PLUGIN::packageWire( MODULE* aModule, CPTREE& aTree ) const
|
|||
|
||||
void EAGLE_PLUGIN::packagePad( MODULE* aModule, CPTREE& aTree ) const
|
||||
{
|
||||
// pay for this tree traversal only once
|
||||
CPTREE& attrs = aTree.get_child( "<xmlattr>" );
|
||||
// this is thru hole technology here, no SMDs
|
||||
EPAD e = epad( aTree );
|
||||
|
||||
/* from <ealge>/doc/eagle.dtd
|
||||
|
||||
<!ELEMENT pad EMPTY>
|
||||
<!ATTLIST pad
|
||||
name %String; #REQUIRED
|
||||
|
@ -1037,19 +1280,12 @@ void EAGLE_PLUGIN::packagePad( MODULE* aModule, CPTREE& aTree ) const
|
|||
D_PAD* pad = new D_PAD( aModule );
|
||||
aModule->m_Pads.PushBack( pad );
|
||||
|
||||
// the DTD says these must be present, throw exception if not found
|
||||
const std::string& name = attrs.get<std::string>( "name" );
|
||||
|
||||
double x = attrs.get<double>( "x" );
|
||||
double y = attrs.get<double>( "y" );
|
||||
double drill = attrs.get<double>( "drill" );
|
||||
pad->SetPadName( FROM_UTF8( e.name.c_str() ) );
|
||||
|
||||
// pad's "Position" is not relative to the module's,
|
||||
// whereas Pos0 is relative to the module's but is the unrotated coordinate.
|
||||
|
||||
pad->SetPadName( FROM_UTF8( name.c_str() ) );
|
||||
|
||||
wxPoint padpos( kicad_x( x ), kicad_y( y ) );
|
||||
wxPoint padpos( kicad_x( e.x ), kicad_y( e.y ) );
|
||||
|
||||
pad->SetPos0( padpos );
|
||||
|
||||
|
@ -1057,34 +1293,31 @@ void EAGLE_PLUGIN::packagePad( MODULE* aModule, CPTREE& aTree ) const
|
|||
|
||||
pad->SetPosition( padpos + aModule->GetPosition() );
|
||||
|
||||
pad->SetDrillSize( wxSize( kicad( drill ), kicad( drill ) ) );
|
||||
pad->SetDrillSize( wxSize( kicad( e.drill ), kicad( e.drill ) ) );
|
||||
|
||||
pad->SetLayerMask( 0x00C0FFFF ); // should tell it to go through all layers
|
||||
pad->SetLayerMask( ALL_CU_LAYERS | SOLDERMASK_LAYER_BACK | SOLDERMASK_LAYER_FRONT );
|
||||
|
||||
// Optional according to DTD.
|
||||
opt_double diameter = attrs.get_optional<double>( "diameter" );
|
||||
opt_string shape = attrs.get_optional<std::string>( "shape" );
|
||||
opt_string rot = attrs.get_optional<std::string>( "rot" );
|
||||
/*
|
||||
opt_string stop = attrs.get_optional<std::string>( "stop" );
|
||||
opt_string thermals = attrs.get_optional<std::string>( "thermals" );
|
||||
opt_string first = attrs.get_optional<std::string>( "first" );
|
||||
*/
|
||||
|
||||
if( diameter )
|
||||
if( e.diameter )
|
||||
{
|
||||
int kidiam = kicad( *diameter );
|
||||
pad->SetSize( wxSize( kidiam, kidiam ) );
|
||||
int diameter = kicad( *e.diameter );
|
||||
pad->SetSize( wxSize( diameter, diameter ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
// the pad size is optional in the eagle DTD, supply something here that is a
|
||||
// 6 mil copper surround as a minimum.
|
||||
int drillz = pad->GetDrillSize().x;
|
||||
int diameter = std::max( drillz + 2 * Mils2iu( 6 ), int( drillz * 1.2 ) );
|
||||
pad->SetSize( wxSize( diameter, diameter ) );
|
||||
}
|
||||
|
||||
if( shape ) // if not shape, our default is circle and that matches their default "round"
|
||||
if( e.shape ) // if not shape, our default is circle and that matches their default "round"
|
||||
{
|
||||
// <!ENTITY % PadShape "(square | round | octagon | long | offset)">
|
||||
|
||||
if( !shape->compare( "round" ) )
|
||||
if( *e.shape == EPAD::ROUND )
|
||||
wxASSERT( pad->GetShape()==PAD_CIRCLE ); // verify set in D_PAD constructor
|
||||
|
||||
else if( !shape->compare( "octagon" ) )
|
||||
else if( *e.shape == EPAD::OCTAGON )
|
||||
{
|
||||
wxASSERT( pad->GetShape()==PAD_CIRCLE ); // verify set in D_PAD constructor
|
||||
|
||||
|
@ -1092,7 +1325,7 @@ void EAGLE_PLUGIN::packagePad( MODULE* aModule, CPTREE& aTree ) const
|
|||
// pad->SetShape( PAD_OCTAGON );
|
||||
}
|
||||
|
||||
else if( !shape->compare( "long" ) )
|
||||
else if( *e.shape == EPAD::LONG )
|
||||
{
|
||||
pad->SetShape( PAD_OVAL );
|
||||
|
||||
|
@ -1100,19 +1333,18 @@ void EAGLE_PLUGIN::packagePad( MODULE* aModule, CPTREE& aTree ) const
|
|||
z.x *= 2;
|
||||
pad->SetSize( z );
|
||||
}
|
||||
else if( !shape->compare( "square" ) )
|
||||
else if( *e.shape == EPAD::SQUARE )
|
||||
{
|
||||
pad->SetShape( PAD_RECT );
|
||||
}
|
||||
}
|
||||
|
||||
if( rot )
|
||||
if( e.erot )
|
||||
{
|
||||
EROT r = erot( *rot );
|
||||
pad->SetOrientation( r.degrees * 10 );
|
||||
pad->SetOrientation( e.erot->degrees * 10 );
|
||||
}
|
||||
|
||||
// don't know what stop and thermals should look like now.
|
||||
// @todo: handle stop and thermal
|
||||
}
|
||||
|
||||
|
||||
|
@ -1236,32 +1468,8 @@ void EAGLE_PLUGIN::packageHole( MODULE* aModule, CPTREE& aTree ) const
|
|||
|
||||
void EAGLE_PLUGIN::packageSMD( MODULE* aModule, CPTREE& aTree ) const
|
||||
{
|
||||
// pay for this tree traversal only once
|
||||
CPTREE& attrs = aTree.get_child( "<xmlattr>" );
|
||||
|
||||
/*
|
||||
<!ATTLIST smd
|
||||
name %String; #REQUIRED
|
||||
x %Coord; #REQUIRED
|
||||
y %Coord; #REQUIRED
|
||||
dx %Dimension; #REQUIRED
|
||||
dy %Dimension; #REQUIRED
|
||||
layer %Layer; #REQUIRED
|
||||
roundness %Int; "0"
|
||||
rot %Rotation; "R0"
|
||||
stop %Bool; "yes"
|
||||
thermals %Bool; "yes"
|
||||
cream %Bool; "yes"
|
||||
>
|
||||
*/
|
||||
|
||||
// the DTD says these must be present, throw exception if not found
|
||||
const std::string& name = attrs.get<std::string>( "name" );
|
||||
double x = attrs.get<double>( "x" );
|
||||
double y = attrs.get<double>( "y" );
|
||||
double dx = attrs.get<double>( "dx" );
|
||||
double dy = attrs.get<double>( "dy" );
|
||||
int layer = attrs.get<int>( "layer" );
|
||||
ESMD e = esmd( aTree );
|
||||
int layer = kicad_layer( e.layer );
|
||||
|
||||
if( !IsValidCopperLayerIndex( layer ) )
|
||||
{
|
||||
|
@ -1271,15 +1479,14 @@ void EAGLE_PLUGIN::packageSMD( MODULE* aModule, CPTREE& aTree ) const
|
|||
D_PAD* pad = new D_PAD( aModule );
|
||||
aModule->m_Pads.PushBack( pad );
|
||||
|
||||
|
||||
pad->SetPadName( FROM_UTF8( name.c_str() ) );
|
||||
pad->SetPadName( FROM_UTF8( e.name.c_str() ) );
|
||||
pad->SetShape( PAD_RECT );
|
||||
pad->SetAttribute( PAD_SMD );
|
||||
|
||||
// pad's "Position" is not relative to the module's,
|
||||
// whereas Pos0 is relative to the module's but is the unrotated coordinate.
|
||||
|
||||
wxPoint padpos( kicad_x( x ), kicad_y( y ) );
|
||||
wxPoint padpos( kicad_x( e.x ), kicad_y( e.y ) );
|
||||
|
||||
pad->SetPos0( padpos );
|
||||
|
||||
|
@ -1287,33 +1494,26 @@ void EAGLE_PLUGIN::packageSMD( MODULE* aModule, CPTREE& aTree ) const
|
|||
|
||||
pad->SetPosition( padpos + aModule->GetPosition() );
|
||||
|
||||
pad->SetSize( wxSize( kicad( dx ), kicad( dy ) ) );
|
||||
pad->SetSize( wxSize( kicad( e.dx ), kicad( e.dy ) ) );
|
||||
|
||||
pad->SetLayer( kicad_layer( layer ) );
|
||||
pad->SetLayerMask( 0x00888000 );
|
||||
pad->SetLayer( layer );
|
||||
pad->SetLayerMask( LAYER_FRONT | SOLDERPASTE_LAYER_FRONT | SOLDERMASK_LAYER_FRONT );
|
||||
|
||||
// Optional according to DTD
|
||||
opt_double roundness = attrs.get_optional<double>( "roundness" );
|
||||
opt_string rot = attrs.get_optional<std::string>( "rot" );
|
||||
opt_string stop = attrs.get_optional<std::string>( "stop" );
|
||||
opt_string thermals = attrs.get_optional<std::string>( "thermals" );
|
||||
opt_string cream = attrs.get_optional<std::string>( "cream" );
|
||||
|
||||
if( roundness ) // set set shape to PAD_RECT above, in case roundness is not present
|
||||
if( e.roundness ) // set set shape to PAD_RECT above, in case roundness is not present
|
||||
{
|
||||
if( *roundness >= 75 ) // roundness goes from 0-100%
|
||||
if( *e.roundness >= 75 ) // roundness goes from 0-100% as integer
|
||||
{
|
||||
if( dy == dx )
|
||||
if( e.dy == e.dx )
|
||||
pad->SetShape( PAD_ROUND );
|
||||
else
|
||||
pad->SetShape( PAD_OVAL );
|
||||
}
|
||||
}
|
||||
|
||||
if( rot )
|
||||
if( e.erot )
|
||||
{
|
||||
EROT r = erot( *rot );
|
||||
pad->SetOrientation( r.degrees * 10 );
|
||||
pad->SetOrientation( e.erot->degrees * 10 );
|
||||
}
|
||||
|
||||
// don't know what stop, thermals, and cream should look like now.
|
||||
|
@ -1413,14 +1613,54 @@ void EAGLE_PLUGIN::loadSignals( CPTREE& aSignals, const std::string& aXpath )
|
|||
|
||||
std::string key = makeKey( reference, pad ) ;
|
||||
|
||||
D(printf( "adding refname:'%s' pad:'%s' netcode:%d netname:'%s'\n",
|
||||
reference.c_str(), pad.c_str(), netCode, nname.c_str() );)
|
||||
// D(printf( "adding refname:'%s' pad:'%s' netcode:%d netname:'%s'\n", reference.c_str(), pad.c_str(), netCode, nname.c_str() );)
|
||||
|
||||
m_pads_to_nets[ key ] = ENET( netCode, nname );
|
||||
}
|
||||
|
||||
else if( !it->first.compare( "polygon" ) )
|
||||
{
|
||||
EPOLYGON p = epolygon( it->second );
|
||||
int layer = kicad_layer( p.layer );
|
||||
|
||||
if( IsValidCopperLayerIndex( layer ) )
|
||||
{
|
||||
// use a "netcode = 0" type ZONE:
|
||||
ZONE_CONTAINER* zone = new ZONE_CONTAINER( m_board );
|
||||
m_board->Add( zone, ADD_APPEND );
|
||||
|
||||
zone->SetTimeStamp( timeStamp( it->second ) );
|
||||
zone->SetLayer( layer );
|
||||
zone->SetNet( netCode );
|
||||
zone->SetNetName( netName );
|
||||
|
||||
|
||||
|
||||
int outline_hatch = CPolyLine::DIAGONAL_EDGE;
|
||||
|
||||
bool first = true;
|
||||
for( CITER vi = it->second.begin(); vi != it->second.end(); ++vi )
|
||||
{
|
||||
if( vi->first.compare( "vertex" ) ) // skip <xmlattr> node
|
||||
continue;
|
||||
|
||||
EVERTEX v = evertex( vi->second );
|
||||
|
||||
// the ZONE_CONTAINER API needs work, as you can see:
|
||||
if( first )
|
||||
{
|
||||
zone->m_Poly->Start( layer, kicad_x( v.x ), kicad_y( v.y ), outline_hatch );
|
||||
first = false;
|
||||
}
|
||||
else
|
||||
zone->AppendCorner( wxPoint( kicad_x( v.x ), kicad_y( v.y ) ) );
|
||||
}
|
||||
|
||||
zone->m_Poly->Close();
|
||||
|
||||
zone->m_Poly->SetHatch( outline_hatch,
|
||||
Mils2iu( zone->m_Poly->GetDefaultHatchPitchMils() ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -57,6 +57,7 @@ struct ENET
|
|||
};
|
||||
|
||||
typedef std::map< std::string, ENET > NET_MAP;
|
||||
typedef NET_MAP::const_iterator NET_MAP_CITER;
|
||||
|
||||
/*
|
||||
#include
|
||||
|
@ -81,7 +82,10 @@ struct EATTR;
|
|||
struct ECIRCLE;
|
||||
struct ETEXT;
|
||||
struct ERECT;
|
||||
|
||||
struct EPAD;
|
||||
struct ESMD;
|
||||
struct EVERTEX;
|
||||
struct EPOLYGON;
|
||||
|
||||
/**
|
||||
* Class EAGLE_PLUGIN
|
||||
|
@ -190,20 +194,26 @@ private:
|
|||
|
||||
void loadElements( CPTREE& aElements, const std::string& aXpath );
|
||||
|
||||
// none of the 'e'funcs do any "to KiCad" conversion, they merely read the XML into binary:
|
||||
|
||||
/**
|
||||
* Function ewire
|
||||
* converts a <wire>'s xml attributes to binary without additional conversion.
|
||||
* @param aResult is an EWIRE to fill in with the <wire> data converted to binary.
|
||||
*/
|
||||
EWIRE ewire( CPTREE& aWire ) const;
|
||||
EWIRE ewire( CPTREE& aWire ) const;
|
||||
|
||||
EVIA evia( CPTREE& aVia ) const;
|
||||
EVIA evia( CPTREE& aVia ) const;
|
||||
|
||||
ECIRCLE ecircle( CPTREE& aCircle ) const;
|
||||
ETEXT etext( CPTREE& aText ) const;
|
||||
ERECT erect( CPTREE& aRect ) const;
|
||||
ECIRCLE ecircle( CPTREE& aCircle ) const;
|
||||
ETEXT etext( CPTREE& aText ) const;
|
||||
ERECT erect( CPTREE& aRect ) const;
|
||||
|
||||
EROT erot( const std::string& aRot ) const;
|
||||
EROT erot( const std::string& aRot ) const;
|
||||
EPAD epad( CPTREE& aPad ) const;
|
||||
ESMD esmd( CPTREE& aSMD ) const;
|
||||
EVERTEX evertex( CPTREE& aVertex ) const;
|
||||
EPOLYGON epolygon( CPTREE& aPolygon ) const;
|
||||
|
||||
/**
|
||||
* Function eattr
|
||||
|
|
|
@ -1152,7 +1152,7 @@ void SPECCTRA_DB::FromBOARD( BOARD* aBoard ) throw( IO_ERROR )
|
|||
PATH* mainPolygon = new PATH( plane, T_polygon );
|
||||
plane->SetShape( mainPolygon );
|
||||
|
||||
plane->name = TO_UTF8( item->m_Netname );
|
||||
plane->name = TO_UTF8( item->GetNetName() );
|
||||
|
||||
if( plane->name.size() == 0 )
|
||||
{
|
||||
|
|
|
@ -800,7 +800,7 @@ void PCB_EDIT_FRAME::Edit_Zone_Params( wxDC* DC, ZONE_CONTAINER* aZone )
|
|||
NETINFO_ITEM* net = GetBoard()->FindNet( zoneInfo.m_NetcodeSelection );
|
||||
|
||||
if( net ) // net == NULL should not occur
|
||||
aZone->m_Netname = net->GetNetname();
|
||||
aZone->SetNetName( net->GetNetname() );
|
||||
|
||||
// Combine zones if possible
|
||||
GetBoard()->AreaPolygonModified( &_AuxiliaryList, aZone, true, s_Verbose );
|
||||
|
|
|
@ -74,7 +74,6 @@ DIALOG_NON_COPPER_ZONES_EDITOR::DIALOG_NON_COPPER_ZONES_EDITOR( PCB_BASE_FRAME*
|
|||
|
||||
void DIALOG_NON_COPPER_ZONES_EDITOR::Init()
|
||||
{
|
||||
SetFocus();
|
||||
SetReturnCode( ZONE_ABORT ); // Will be changed on button click
|
||||
|
||||
m_FillModeCtrl->SetSelection( m_settings.m_FillMode ? 1 : 0 );
|
||||
|
|
|
@ -282,7 +282,7 @@ int BOARD::ClipAreaPolygon( PICKED_ITEMS_LIST * aNewZonesList,
|
|||
{
|
||||
wxString str;
|
||||
str.Printf( wxT( "Area %08lX of net \"%s\" has arcs intersecting other sides.\n" ),
|
||||
aCurrArea->GetTimeStamp(), GetChars( aCurrArea->m_Netname ) );
|
||||
aCurrArea->GetTimeStamp(), GetChars( aCurrArea->GetNetName() ) );
|
||||
str += wxT( "This may cause problems with other editing operations,\n" );
|
||||
str += wxT( "such as adding cutouts. It can't be fixed automatically.\n" );
|
||||
str += wxT( "Manual correction is recommended." );
|
||||
|
@ -305,7 +305,7 @@ int BOARD::ClipAreaPolygon( PICKED_ITEMS_LIST * aNewZonesList,
|
|||
{
|
||||
wxString str;
|
||||
str.Printf( wxT( "Area %08lX of net \"%s\" is self-intersecting and will be clipped.\n" ),
|
||||
aCurrArea->GetTimeStamp(), GetChars( aCurrArea->m_Netname ) );
|
||||
aCurrArea->GetTimeStamp(), GetChars( aCurrArea->GetNetName() ) );
|
||||
str += wxT( "This may result in splitting the area.\n" );
|
||||
str += wxT( "If the area is complex, this may take a few seconds." );
|
||||
wxMessageBox( str );
|
||||
|
@ -482,7 +482,7 @@ int BOARD::CombineAllAreasInNet( PICKED_ITEMS_LIST* aDeletedList, int aNetCode,
|
|||
str.Printf( wxT( "Areas %d and %d of net \"%s\" intersect, but some of the intersecting sides are arcs.\n" ),
|
||||
ia1 + 1,
|
||||
ia2 + 1,
|
||||
GetChars( curr_area->m_Netname ) );
|
||||
GetChars( curr_area->GetNetName() ) );
|
||||
str += wxT( "Therefore, these areas can't be combined." );
|
||||
wxMessageBox( str );
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue