← Back to team overview

kicad-developers team mailing list archive

Re: DXF import only works in default Canvas.

 

Work in progress patch attached.

This includes some changes in the DXF import dialog to have a 'Fill Polygon' checkbox and
code in the importer to import an area instead of a group of lines.

Marco

On 29-Jul-15 22:14, easyw wrote:
Hi Marco,
would you post the patch, so to try it?
(could you zip it?)

thank you
Maurice

On 29/07/2015 12.25, Marco Hess wrote:
Sorry Nick,

I could have worded that better. I am working on making the DXF import
as an area.
So I have a modified version of dxf2brd_items that in addPolyline
detects that
a 'fill_polygon' flag is set (in the modified dxfimport dialog) and when
the DXF is
then a closed polygon, it imports the poly as a PCB_ZONE_T and an S_POLYGON
shape (which I assume is the right type and shape).

Like this:

     // Closed polyline can be imported as a filled area when this
     // selected in the import dialog box.
     if( ( aData.flags & 1 ) && m_fillPolygons )
     {
         DRAWSEGMENT* poly = new DRAWSEGMENT( NULL );

         wxPoint startpoint;
         wxPoint polypoint;

         std::vector <wxPoint> pts;
         for( unsigned ii = 0; ii < aData.vertlist.size(); ii++ )
         {
             DRW_Vertex* vertex = aData.vertlist[ii];
             polypoint = wxPoint( mapX( vertex->basePoint.x ),
                                  mapY( vertex->basePoint.y ) );
             // Remember start point
             if( ii == 0 )
             {
                 startpoint = polypoint;
             }
             pts.push_back( polypoint );
         }

         // Close polygon back to the start point
         pts.push_back( startpoint );

         poly->SetType( PCB_ZONE_T );
         poly->SetShape( S_POLYGON );
         poly->SetLayer( ToLAYER_ID( m_brdLayer ) );
         poly->SetWidth( mapDim( 0.0001 ) );
         poly->SetPolyPoints( pts );

         m_newItemsList.push_back( poly );
     }
     else
             .....

This will result in a 'gr_poly' in pcbnew with the issues described of
importing only in
legacy mode and only showing in GL mode.

In the footprint editor this import results in an 'fp_poly' but will al
the points missing
in the footprint file. As yet I have not been able to track what the
issue there is.

So the DXF area import is not really ready for prime time as yet. My aim
is to eventually
import complex copper shapes like antennas onto the board from a DXF.

But the DXF import only working in legacy mode and not in the other
modes is a
definitely a bug I think.

Marco


--
Marco Hess
Through IP Pty. Ltd. - AUSTRALIA
www.through-ip.com  | marco.hess@xxxxxxxxxxxxxx
p: +61 407 78 55 66 | f: +61 8 8121 6191

 pcbnew/import_dxf/dialog_dxf_import.cpp      |  78 +++++---
 pcbnew/import_dxf/dialog_dxf_import.fbp      | 286 +++++++++++++++++++--------
 pcbnew/import_dxf/dialog_dxf_import.h        |   1 +
 pcbnew/import_dxf/dialog_dxf_import_base.cpp |  17 +-
 pcbnew/import_dxf/dialog_dxf_import_base.h   |   3 +
 pcbnew/import_dxf/dxf2brd_items.cpp          |  96 ++++++---
 pcbnew/import_dxf/dxf2brd_items.h            |   9 +-
 7 files changed, 346 insertions(+), 144 deletions(-)

diff --git a/pcbnew/import_dxf/dialog_dxf_import.cpp b/pcbnew/import_dxf/dialog_dxf_import.cpp
index 724a9d2..405ebbf 100644
--- a/pcbnew/import_dxf/dialog_dxf_import.cpp
+++ b/pcbnew/import_dxf/dialog_dxf_import.cpp
@@ -44,13 +44,14 @@
 #define DXF_IMPORT_LAYER_OPTION_KEY wxT("DxfImportBrdLayer")
 #define DXF_IMPORT_COORD_ORIGIN_KEY wxT("DxfImportCoordOrigin")
 #define DXF_IMPORT_LAST_FILE_KEY wxT("DxfImportLastFile")
+#define DXF_IMPORT_FILL_POLYGONS_KEY wxT("DxfImportFillPolygons")
 
 // Static members of DIALOG_DXF_IMPORT, to remember
 // the user's choices during the session
 wxString DIALOG_DXF_IMPORT::m_dxfFilename;
 int DIALOG_DXF_IMPORT::m_offsetSelection = 4;
 LAYER_NUM DIALOG_DXF_IMPORT::m_layer = Dwgs_User;
-
+bool DIALOG_DXF_IMPORT::m_fillPolygons = false;
 
 DIALOG_DXF_IMPORT::DIALOG_DXF_IMPORT( PCB_BASE_FRAME* aParent )
     : DIALOG_DXF_IMPORT_BASE( aParent )
@@ -63,14 +64,18 @@ DIALOG_DXF_IMPORT::DIALOG_DXF_IMPORT( PCB_BASE_FRAME* aParent )
         m_layer = m_config->Read( DXF_IMPORT_LAYER_OPTION_KEY, (long)Dwgs_User );
         m_offsetSelection = m_config->Read( DXF_IMPORT_COORD_ORIGIN_KEY, 3 );
         m_dxfFilename =  m_config->Read( DXF_IMPORT_LAST_FILE_KEY, wxEmptyString );
+        m_config->Read( DXF_IMPORT_FILL_POLYGONS_KEY, &m_fillPolygons, false );
     }
 
     m_textCtrlFileName->SetValue( m_dxfFilename );
     m_rbOffsetOption->SetSelection( m_offsetSelection );
-
+    m_checkBoxFillPolygons->SetValue( m_fillPolygons );
     // Configure the layers list selector
-    m_SelLayerBox->SetLayersHotkeys( false );           // Do not display hotkeys
-    m_SelLayerBox->SetLayerSet( LSET::AllCuMask() );    // Do not use copper layers
+    m_SelLayerBox->SetLayersHotkeys( false );               // Do not display hotkeys
+
+    //m_SelLayerBox->SetLayerSet( LSET::AllCuMask() );      // Do not use copper layers
+    m_SelLayerBox->SetLayerSet( LSET::InternalCuMask() );   // Allow Top Bottom Cu
+
     m_SelLayerBox->SetBoardFrame( m_parent );
     m_SelLayerBox->Resync();
 
@@ -90,12 +95,14 @@ DIALOG_DXF_IMPORT::~DIALOG_DXF_IMPORT()
 {
     m_offsetSelection = m_rbOffsetOption->GetSelection();
     m_layer = m_SelLayerBox->GetLayerSelection();
+    m_fillPolygons = m_checkBoxFillPolygons->IsChecked();
 
     if( m_config )
     {
         m_config->Write( DXF_IMPORT_LAYER_OPTION_KEY, (long)m_layer );
         m_config->Write( DXF_IMPORT_COORD_ORIGIN_KEY, m_offsetSelection );
         m_config->Write( DXF_IMPORT_LAST_FILE_KEY, m_dxfFilename );
+        m_config->Write( DXF_IMPORT_FILL_POLYGONS_KEY, m_fillPolygons );
     }
 }
 
@@ -137,6 +144,8 @@ void DIALOG_DXF_IMPORT::OnOKClick( wxCommandEvent& event )
     if( m_dxfFilename.IsEmpty() )
         return;
 
+    m_fillPolygons = m_checkBoxFillPolygons->IsChecked();
+
     double offsetX = 0;
     double offsetY = 0;
 
@@ -162,6 +171,7 @@ void DIALOG_DXF_IMPORT::OnOKClick( wxCommandEvent& event )
 
     // Set coordinates offset for import (offset is given in mm)
     m_dxfImporter.SetOffset( offsetX, offsetY );
+    m_dxfImporter.SetFillPolygons( m_fillPolygons );
     m_layer = m_SelLayerBox->GetLayerSelection();
     m_dxfImporter.SetBrdLayer( m_layer );
 
@@ -194,7 +204,7 @@ bool InvokeDXFDialogBoardImport( PCB_BASE_FRAME* aCaller )
             ITEM_PICKER itemWrapper( item, UR_NEW );
             picklist.PushItem( itemWrapper );
 
-            if( aCaller->IsGalCanvasActive() )
+            //if( aCaller->IsGalCanvasActive() )
                 view->Add( item );
         }
 
@@ -231,32 +241,44 @@ bool InvokeDXFDialogModuleImport( PCB_BASE_FRAME* aCaller, MODULE* aModule )
             // so we need to convert imported items to appropriate classes.
             switch( item->Type() )
             {
-            case PCB_LINE_T:
-            {
-                converted = new EDGE_MODULE( aModule );
-                *static_cast<DRAWSEGMENT*>( converted ) = *static_cast<DRAWSEGMENT*>( item );
-                aModule->Add( converted );
-                static_cast<EDGE_MODULE*>( converted )->SetLocalCoord();
-                delete item;
-                break;
-            }
-
-            case PCB_TEXT_T:
-            {
-                converted = new TEXTE_MODULE( aModule );
-                *static_cast<TEXTE_PCB*>( converted ) = *static_cast<TEXTE_PCB*>( item );
-                aModule->Add( converted );
-                static_cast<TEXTE_MODULE*>( converted )->SetLocalCoord();
-                delete item;
-                break;
-            }
 
-            default:
-                wxLogDebug( wxT( "type %d currently not handled" ), item->Type() );
-                break;
+                case PCB_ZONE_T:
+
+                case PCB_LINE_T:
+                {
+                    converted = new EDGE_MODULE( aModule );
+                    *static_cast<DRAWSEGMENT*>( converted ) = *static_cast<DRAWSEGMENT*>( item );
+                    aModule->Add( converted );
+                    static_cast<EDGE_MODULE*>( converted )->SetLocalCoord();
+                    delete item;
+                    break;
+                }
+
+                case PCB_TEXT_T:
+                {
+                    converted = new TEXTE_MODULE( aModule );
+                    *static_cast<TEXTE_PCB*>( converted ) = *static_cast<TEXTE_PCB*>( item );
+                    aModule->Add( converted );
+                    static_cast<TEXTE_MODULE*>( converted )->SetLocalCoord();
+                    delete item;
+                    break;
+                }
+
+                default:
+                {
+                    wxString msg;
+                    msg.Printf( wxT( "Module import needs work: BOARD_ITEM type (%d) not handled" ),
+                                item->Type() );
+                    wxFAIL_MSG( msg );
+
+                    wxLogDebug( wxT( "type %d currently not handled" ), item->Type() );
+
+                    break;
+                }
             }
 
-            if( aCaller->IsGalCanvasActive() && converted )
+            //if( aCaller->IsGalCanvasActive() && converted )
+            if( converted )
                 view->Add( converted );
         }
     }
diff --git a/pcbnew/import_dxf/dialog_dxf_import.fbp b/pcbnew/import_dxf/dialog_dxf_import.fbp
index e68140b..383e5f1 100644
--- a/pcbnew/import_dxf/dialog_dxf_import.fbp
+++ b/pcbnew/import_dxf/dialog_dxf_import.fbp
@@ -366,92 +366,208 @@
                 </object>
                 <object class="sizeritem" expanded="1">
                     <property name="border">5</property>
-                    <property name="flag">wxALL|wxEXPAND</property>
-                    <property name="proportion">0</property>
-                    <object class="wxRadioBox" expanded="1">
-                        <property name="BottomDockable">1</property>
-                        <property name="LeftDockable">1</property>
-                        <property name="RightDockable">1</property>
-                        <property name="TopDockable">1</property>
-                        <property name="aui_layer"></property>
-                        <property name="aui_name"></property>
-                        <property name="aui_position"></property>
-                        <property name="aui_row"></property>
-                        <property name="best_size"></property>
-                        <property name="bg"></property>
-                        <property name="caption"></property>
-                        <property name="caption_visible">1</property>
-                        <property name="center_pane">0</property>
-                        <property name="choices">&quot;Right top corner&quot; &quot;Middle&quot; &quot;Centered on page&quot; &quot;Right bottom corner&quot;</property>
-                        <property name="close_button">1</property>
-                        <property name="context_help"></property>
-                        <property name="context_menu">1</property>
-                        <property name="default_pane">0</property>
-                        <property name="dock">Dock</property>
-                        <property name="dock_fixed">0</property>
-                        <property name="docking">Left</property>
-                        <property name="enabled">1</property>
-                        <property name="fg"></property>
-                        <property name="floatable">1</property>
-                        <property name="font"></property>
-                        <property name="gripper">0</property>
-                        <property name="hidden">0</property>
-                        <property name="id">wxID_ANY</property>
-                        <property name="label">Origin of DXF Coordinates</property>
-                        <property name="majorDimension">1</property>
-                        <property name="max_size"></property>
-                        <property name="maximize_button">0</property>
-                        <property name="maximum_size"></property>
-                        <property name="min_size"></property>
-                        <property name="minimize_button">0</property>
+                    <property name="flag">wxEXPAND</property>
+                    <property name="proportion">1</property>
+                    <object class="wxGridSizer" expanded="1">
+                        <property name="cols">2</property>
+                        <property name="hgap">0</property>
                         <property name="minimum_size"></property>
-                        <property name="moveable">1</property>
-                        <property name="name">m_rbOffsetOption</property>
-                        <property name="pane_border">1</property>
-                        <property name="pane_position"></property>
-                        <property name="pane_size"></property>
-                        <property name="permission">protected</property>
-                        <property name="pin_button">1</property>
-                        <property name="pos"></property>
-                        <property name="resize">Resizable</property>
-                        <property name="selection">3</property>
-                        <property name="show">1</property>
-                        <property name="size"></property>
-                        <property name="style">wxRA_SPECIFY_COLS</property>
-                        <property name="subclass"></property>
-                        <property name="toolbar_pane">0</property>
-                        <property name="tooltip"></property>
-                        <property name="validator_data_type"></property>
-                        <property name="validator_style">wxFILTER_NONE</property>
-                        <property name="validator_type">wxDefaultValidator</property>
-                        <property name="validator_variable"></property>
-                        <property name="window_extra_style"></property>
-                        <property name="window_name"></property>
-                        <property name="window_style"></property>
-                        <event name="OnChar"></event>
-                        <event name="OnEnterWindow"></event>
-                        <event name="OnEraseBackground"></event>
-                        <event name="OnKeyDown"></event>
-                        <event name="OnKeyUp"></event>
-                        <event name="OnKillFocus"></event>
-                        <event name="OnLeaveWindow"></event>
-                        <event name="OnLeftDClick"></event>
-                        <event name="OnLeftDown"></event>
-                        <event name="OnLeftUp"></event>
-                        <event name="OnMiddleDClick"></event>
-                        <event name="OnMiddleDown"></event>
-                        <event name="OnMiddleUp"></event>
-                        <event name="OnMotion"></event>
-                        <event name="OnMouseEvents"></event>
-                        <event name="OnMouseWheel"></event>
-                        <event name="OnPaint"></event>
-                        <event name="OnRadioBox"></event>
-                        <event name="OnRightDClick"></event>
-                        <event name="OnRightDown"></event>
-                        <event name="OnRightUp"></event>
-                        <event name="OnSetFocus"></event>
-                        <event name="OnSize"></event>
-                        <event name="OnUpdateUI"></event>
+                        <property name="name">gSizerOptions</property>
+                        <property name="permission">none</property>
+                        <property name="rows">0</property>
+                        <property name="vgap">0</property>
+                        <object class="sizeritem" expanded="1">
+                            <property name="border">5</property>
+                            <property name="flag">wxALL|wxEXPAND</property>
+                            <property name="proportion">0</property>
+                            <object class="wxRadioBox" expanded="1">
+                                <property name="BottomDockable">1</property>
+                                <property name="LeftDockable">1</property>
+                                <property name="RightDockable">1</property>
+                                <property name="TopDockable">1</property>
+                                <property name="aui_layer"></property>
+                                <property name="aui_name"></property>
+                                <property name="aui_position"></property>
+                                <property name="aui_row"></property>
+                                <property name="best_size"></property>
+                                <property name="bg"></property>
+                                <property name="caption"></property>
+                                <property name="caption_visible">1</property>
+                                <property name="center_pane">0</property>
+                                <property name="choices">&quot;Right top corner&quot; &quot;Middle&quot; &quot;Centered on page&quot; &quot;Right bottom corner&quot;</property>
+                                <property name="close_button">1</property>
+                                <property name="context_help"></property>
+                                <property name="context_menu">1</property>
+                                <property name="default_pane">0</property>
+                                <property name="dock">Dock</property>
+                                <property name="dock_fixed">0</property>
+                                <property name="docking">Left</property>
+                                <property name="enabled">1</property>
+                                <property name="fg"></property>
+                                <property name="floatable">1</property>
+                                <property name="font"></property>
+                                <property name="gripper">0</property>
+                                <property name="hidden">0</property>
+                                <property name="id">wxID_ANY</property>
+                                <property name="label">Origin of DXF Coordinates</property>
+                                <property name="majorDimension">1</property>
+                                <property name="max_size"></property>
+                                <property name="maximize_button">0</property>
+                                <property name="maximum_size"></property>
+                                <property name="min_size"></property>
+                                <property name="minimize_button">0</property>
+                                <property name="minimum_size"></property>
+                                <property name="moveable">1</property>
+                                <property name="name">m_rbOffsetOption</property>
+                                <property name="pane_border">1</property>
+                                <property name="pane_position"></property>
+                                <property name="pane_size"></property>
+                                <property name="permission">protected</property>
+                                <property name="pin_button">1</property>
+                                <property name="pos"></property>
+                                <property name="resize">Resizable</property>
+                                <property name="selection">3</property>
+                                <property name="show">1</property>
+                                <property name="size"></property>
+                                <property name="style">wxRA_SPECIFY_COLS</property>
+                                <property name="subclass"></property>
+                                <property name="toolbar_pane">0</property>
+                                <property name="tooltip"></property>
+                                <property name="validator_data_type"></property>
+                                <property name="validator_style">wxFILTER_NONE</property>
+                                <property name="validator_type">wxDefaultValidator</property>
+                                <property name="validator_variable"></property>
+                                <property name="window_extra_style"></property>
+                                <property name="window_name"></property>
+                                <property name="window_style"></property>
+                                <event name="OnChar"></event>
+                                <event name="OnEnterWindow"></event>
+                                <event name="OnEraseBackground"></event>
+                                <event name="OnKeyDown"></event>
+                                <event name="OnKeyUp"></event>
+                                <event name="OnKillFocus"></event>
+                                <event name="OnLeaveWindow"></event>
+                                <event name="OnLeftDClick"></event>
+                                <event name="OnLeftDown"></event>
+                                <event name="OnLeftUp"></event>
+                                <event name="OnMiddleDClick"></event>
+                                <event name="OnMiddleDown"></event>
+                                <event name="OnMiddleUp"></event>
+                                <event name="OnMotion"></event>
+                                <event name="OnMouseEvents"></event>
+                                <event name="OnMouseWheel"></event>
+                                <event name="OnPaint"></event>
+                                <event name="OnRadioBox"></event>
+                                <event name="OnRightDClick"></event>
+                                <event name="OnRightDown"></event>
+                                <event name="OnRightUp"></event>
+                                <event name="OnSetFocus"></event>
+                                <event name="OnSize"></event>
+                                <event name="OnUpdateUI"></event>
+                            </object>
+                        </object>
+                        <object class="sizeritem" expanded="1">
+                            <property name="border">5</property>
+                            <property name="flag">wxALL|wxEXPAND</property>
+                            <property name="proportion">1</property>
+                            <object class="wxStaticBoxSizer" expanded="1">
+                                <property name="id">wxID_ANY</property>
+                                <property name="label">Import Options</property>
+                                <property name="minimum_size"></property>
+                                <property name="name">sbSizerCheckboxes</property>
+                                <property name="orient">wxVERTICAL</property>
+                                <property name="permission">none</property>
+                                <event name="OnUpdateUI"></event>
+                                <object class="sizeritem" expanded="1">
+                                    <property name="border">5</property>
+                                    <property name="flag">wxALL</property>
+                                    <property name="proportion">0</property>
+                                    <object class="wxCheckBox" expanded="1">
+                                        <property name="BottomDockable">1</property>
+                                        <property name="LeftDockable">1</property>
+                                        <property name="RightDockable">1</property>
+                                        <property name="TopDockable">1</property>
+                                        <property name="aui_layer"></property>
+                                        <property name="aui_name"></property>
+                                        <property name="aui_position"></property>
+                                        <property name="aui_row"></property>
+                                        <property name="best_size"></property>
+                                        <property name="bg"></property>
+                                        <property name="caption"></property>
+                                        <property name="caption_visible">1</property>
+                                        <property name="center_pane">0</property>
+                                        <property name="checked">0</property>
+                                        <property name="close_button">1</property>
+                                        <property name="context_help"></property>
+                                        <property name="context_menu">1</property>
+                                        <property name="default_pane">0</property>
+                                        <property name="dock">Dock</property>
+                                        <property name="dock_fixed">0</property>
+                                        <property name="docking">Left</property>
+                                        <property name="enabled">1</property>
+                                        <property name="fg"></property>
+                                        <property name="floatable">1</property>
+                                        <property name="font"></property>
+                                        <property name="gripper">0</property>
+                                        <property name="hidden">0</property>
+                                        <property name="id">wxID_ANY</property>
+                                        <property name="label">Fill Polygons</property>
+                                        <property name="max_size"></property>
+                                        <property name="maximize_button">0</property>
+                                        <property name="maximum_size"></property>
+                                        <property name="min_size"></property>
+                                        <property name="minimize_button">0</property>
+                                        <property name="minimum_size"></property>
+                                        <property name="moveable">1</property>
+                                        <property name="name">m_checkBoxFillPolygons</property>
+                                        <property name="pane_border">1</property>
+                                        <property name="pane_position"></property>
+                                        <property name="pane_size"></property>
+                                        <property name="permission">protected</property>
+                                        <property name="pin_button">1</property>
+                                        <property name="pos"></property>
+                                        <property name="resize">Resizable</property>
+                                        <property name="show">1</property>
+                                        <property name="size"></property>
+                                        <property name="style"></property>
+                                        <property name="subclass"></property>
+                                        <property name="toolbar_pane">0</property>
+                                        <property name="tooltip"></property>
+                                        <property name="validator_data_type"></property>
+                                        <property name="validator_style">wxFILTER_NONE</property>
+                                        <property name="validator_type">wxDefaultValidator</property>
+                                        <property name="validator_variable"></property>
+                                        <property name="window_extra_style"></property>
+                                        <property name="window_name"></property>
+                                        <property name="window_style"></property>
+                                        <event name="OnChar"></event>
+                                        <event name="OnCheckBox"></event>
+                                        <event name="OnEnterWindow"></event>
+                                        <event name="OnEraseBackground"></event>
+                                        <event name="OnKeyDown"></event>
+                                        <event name="OnKeyUp"></event>
+                                        <event name="OnKillFocus"></event>
+                                        <event name="OnLeaveWindow"></event>
+                                        <event name="OnLeftDClick"></event>
+                                        <event name="OnLeftDown"></event>
+                                        <event name="OnLeftUp"></event>
+                                        <event name="OnMiddleDClick"></event>
+                                        <event name="OnMiddleDown"></event>
+                                        <event name="OnMiddleUp"></event>
+                                        <event name="OnMotion"></event>
+                                        <event name="OnMouseEvents"></event>
+                                        <event name="OnMouseWheel"></event>
+                                        <event name="OnPaint"></event>
+                                        <event name="OnRightDClick"></event>
+                                        <event name="OnRightDown"></event>
+                                        <event name="OnRightUp"></event>
+                                        <event name="OnSetFocus"></event>
+                                        <event name="OnSize"></event>
+                                        <event name="OnUpdateUI"></event>
+                                    </object>
+                                </object>
+                            </object>
+                        </object>
                     </object>
                 </object>
                 <object class="sizeritem" expanded="1">
diff --git a/pcbnew/import_dxf/dialog_dxf_import.h b/pcbnew/import_dxf/dialog_dxf_import.h
index 2785732..4b16555 100644
--- a/pcbnew/import_dxf/dialog_dxf_import.h
+++ b/pcbnew/import_dxf/dialog_dxf_import.h
@@ -50,6 +50,7 @@ private:
     static wxString      m_dxfFilename;
     static int           m_offsetSelection;
     static LAYER_NUM     m_layer;
+    static bool          m_fillPolygons;
 
     // Virtual event handlers
     void OnCancelClick( wxCommandEvent& event ) { event.Skip(); }
diff --git a/pcbnew/import_dxf/dialog_dxf_import_base.cpp b/pcbnew/import_dxf/dialog_dxf_import_base.cpp
index 03e80e2..7dd2a32 100644
--- a/pcbnew/import_dxf/dialog_dxf_import_base.cpp
+++ b/pcbnew/import_dxf/dialog_dxf_import_base.cpp
@@ -36,11 +36,26 @@ DIALOG_DXF_IMPORT_BASE::DIALOG_DXF_IMPORT_BASE( wxWindow* parent, wxWindowID id,
 	
 	bSizerMain->Add( bSizerFile, 0, wxEXPAND|wxBOTTOM, 5 );
 	
+	wxGridSizer* gSizerOptions;
+	gSizerOptions = new wxGridSizer( 0, 2, 0, 0 );
+	
 	wxString m_rbOffsetOptionChoices[] = { _("Right top corner"), _("Middle"), _("Centered on page"), _("Right bottom corner") };
 	int m_rbOffsetOptionNChoices = sizeof( m_rbOffsetOptionChoices ) / sizeof( wxString );
 	m_rbOffsetOption = new wxRadioBox( this, wxID_ANY, _("Origin of DXF Coordinates"), wxDefaultPosition, wxDefaultSize, m_rbOffsetOptionNChoices, m_rbOffsetOptionChoices, 1, wxRA_SPECIFY_COLS );
 	m_rbOffsetOption->SetSelection( 3 );
-	bSizerMain->Add( m_rbOffsetOption, 0, wxALL|wxEXPAND, 5 );
+	gSizerOptions->Add( m_rbOffsetOption, 0, wxALL|wxEXPAND, 5 );
+	
+	wxStaticBoxSizer* sbSizerCheckboxes;
+	sbSizerCheckboxes = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Import Options") ), wxVERTICAL );
+	
+	m_checkBoxFillPolygons = new wxCheckBox( this, wxID_ANY, _("Fill Polygons"), wxDefaultPosition, wxDefaultSize, 0 );
+	sbSizerCheckboxes->Add( m_checkBoxFillPolygons, 0, wxALL, 5 );
+	
+	
+	gSizerOptions->Add( sbSizerCheckboxes, 1, wxALL|wxEXPAND, 5 );
+	
+	
+	bSizerMain->Add( gSizerOptions, 1, wxEXPAND, 5 );
 	
 	m_staticTextBrdlayer = new wxStaticText( this, wxID_ANY, _("Board layer for import:"), wxDefaultPosition, wxDefaultSize, 0 );
 	m_staticTextBrdlayer->Wrap( -1 );
diff --git a/pcbnew/import_dxf/dialog_dxf_import_base.h b/pcbnew/import_dxf/dialog_dxf_import_base.h
index b0e47c0..7fd61fc 100644
--- a/pcbnew/import_dxf/dialog_dxf_import_base.h
+++ b/pcbnew/import_dxf/dialog_dxf_import_base.h
@@ -25,6 +25,8 @@ class PCB_LAYER_BOX_SELECTOR;
 #include <wx/button.h>
 #include <wx/sizer.h>
 #include <wx/radiobox.h>
+#include <wx/checkbox.h>
+#include <wx/statbox.h>
 #include <wx/bmpcbox.h>
 #include <wx/statline.h>
 #include <wx/dialog.h>
@@ -44,6 +46,7 @@ class DIALOG_DXF_IMPORT_BASE : public DIALOG_SHIM
 		wxTextCtrl* m_textCtrlFileName;
 		wxButton* m_buttonBrowse;
 		wxRadioBox* m_rbOffsetOption;
+		wxCheckBox* m_checkBoxFillPolygons;
 		wxStaticText* m_staticTextBrdlayer;
 		PCB_LAYER_BOX_SELECTOR* m_SelLayerBox;
 		wxStaticLine* m_staticline8;
diff --git a/pcbnew/import_dxf/dxf2brd_items.cpp b/pcbnew/import_dxf/dxf2brd_items.cpp
index db65306..4f49fec 100644
--- a/pcbnew/import_dxf/dxf2brd_items.cpp
+++ b/pcbnew/import_dxf/dxf2brd_items.cpp
@@ -55,6 +55,7 @@ DXF2BRD_CONVERTER::DXF2BRD_CONVERTER() : DRW_Interface()
     m_version   = 0;
     m_defaultThickness = 0.1;
     m_brdLayer = Dwgs_User;
+    m_fillPolygons = false; // Default import DXF polygons as lines
 }
 
 
@@ -128,44 +129,81 @@ void DXF2BRD_CONVERTER::addPolyline(const DRW_Polyline& aData )
     // So we have to convert a polyline to a set of segments.
     // Obviously, the z coordinate is ignored
 
-    wxPoint polyline_startpoint;
-    wxPoint segment_startpoint;
-
-    for( unsigned ii = 0; ii < aData.vertlist.size(); ii++ )
+    // Closed polyline can be imported as a filled area when this
+    // selected in the import dialog. box
+    if( ( aData.flags & 1 ) && m_fillPolygons )
     {
-        DRW_Vertex* vertex = aData.vertlist[ii];
+        DRAWSEGMENT* poly = new DRAWSEGMENT( NULL );
 
-        if( ii == 0 )
+        wxPoint startpoint;
+        wxPoint polypoint;
+
+        std::vector <wxPoint> pts;
+        for( unsigned ii = 0; ii < aData.vertlist.size(); ii++ )
         {
-            segment_startpoint.x = mapX( vertex->basePoint.x );
-            segment_startpoint.y = mapY( vertex->basePoint.y );
-            polyline_startpoint  = segment_startpoint;
-            continue;
+            DRW_Vertex* vertex = aData.vertlist[ii];
+            polypoint = wxPoint( mapX( vertex->basePoint.x ),
+                                 mapY( vertex->basePoint.y ) );
+            // Remember start point
+            if( ii == 0 )
+            {
+                startpoint = polypoint;
+            }
+            pts.push_back( polypoint );
         }
 
-        DRAWSEGMENT*    segm = new DRAWSEGMENT( NULL );
+        // Close polygon back to the start point
+        pts.push_back( startpoint );
 
-        segm->SetLayer( ToLAYER_ID( m_brdLayer ) );
-        segm->SetStart( segment_startpoint );
-        wxPoint segment_endpoint( mapX( vertex->basePoint.x ), mapY( vertex->basePoint.y ) );
-        segm->SetEnd( segment_endpoint );
-        segm->SetWidth( mapDim( aData.thickness == 0 ? m_defaultThickness
-                                : aData.thickness ) );
-        m_newItemsList.push_back( segm );
-        segment_startpoint = segment_endpoint;
-    }
+        poly->SetType( PCB_ZONE_T );
+        poly->SetShape( S_POLYGON );
+        poly->SetLayer( ToLAYER_ID( m_brdLayer ) );
+        poly->SetWidth( mapDim( 0.0001 ) );
+        poly->SetPolyPoints( pts );
 
-    // Polyline flags bit 0 indicates closed (1) or open (0) polyline
-    if( aData.flags & 1 )
+        m_newItemsList.push_back( poly );
+    }
+    else
     {
-        DRAWSEGMENT*    closing_segm = new DRAWSEGMENT( NULL );
+        wxPoint polyline_startpoint;
+        wxPoint segment_startpoint;
 
-        closing_segm->SetLayer( ToLAYER_ID( m_brdLayer ) );
-        closing_segm->SetStart( segment_startpoint );
-        closing_segm->SetEnd( polyline_startpoint );
-        closing_segm->SetWidth( mapDim( aData.thickness == 0 ? m_defaultThickness
-                                : aData.thickness ) );
-        m_newItemsList.push_back( closing_segm );
+        for( unsigned ii = 0; ii < aData.vertlist.size(); ii++ )
+        {
+            DRW_Vertex* vertex = aData.vertlist[ii];
+
+            if( ii == 0 )
+            {
+                segment_startpoint.x = mapX( vertex->basePoint.x );
+                segment_startpoint.y = mapY( vertex->basePoint.y );
+                polyline_startpoint  = segment_startpoint;
+                continue;
+            }
+
+            DRAWSEGMENT*    segm = new DRAWSEGMENT( NULL );
+
+            segm->SetLayer( ToLAYER_ID( m_brdLayer ) );
+            segm->SetStart( segment_startpoint );
+            wxPoint segment_endpoint( mapX( vertex->basePoint.x ), mapY( vertex->basePoint.y ) );
+            segm->SetEnd( segment_endpoint );
+            segm->SetWidth( mapDim( aData.thickness == 0 ? m_defaultThickness
+                                    : aData.thickness ) );
+            m_newItemsList.push_back( segm );
+            segment_startpoint = segment_endpoint;
+        }
+
+        // Polyline flags bit 0 indicates closed (1) or open (0) polyline
+        if( aData.flags & 1 )
+        {
+            DRAWSEGMENT*    closing_segm = new DRAWSEGMENT( NULL );
+
+            closing_segm->SetLayer( ToLAYER_ID( m_brdLayer ) );
+            closing_segm->SetStart( segment_startpoint );
+            closing_segm->SetEnd( polyline_startpoint );
+            closing_segm->SetWidth( mapDim( aData.thickness == 0 ? m_defaultThickness
+                                    : aData.thickness ) );
+            m_newItemsList.push_back( closing_segm );
+        }
     }
 }
 
diff --git a/pcbnew/import_dxf/dxf2brd_items.h b/pcbnew/import_dxf/dxf2brd_items.h
index c95ec09..6eafa08 100644
--- a/pcbnew/import_dxf/dxf2brd_items.h
+++ b/pcbnew/import_dxf/dxf2brd_items.h
@@ -52,13 +52,14 @@ private:
     int m_brdLayer;         // The board layer to place imported dfx items
     int m_version;          // the dxf version, not used here
     std::string m_codePage; // The code page, not used here
+    bool m_fillPolygons;    // Convert closed polygons as filled areas when true
 
 public:
     DXF2BRD_CONVERTER();
     ~DXF2BRD_CONVERTER();
 
     /**
-     * Set the coordinate offset between the importede dxf items
+     * Set the coordinate offset between the imported dxf items
      * and Pcbnew.
      * because dxf files have the Y axis from bottom to top;
      * aOffsetX = 0, and aOffsetY = - vertical page size to import a full page
@@ -78,6 +79,12 @@ public:
     void SetBrdLayer( int aBrdLayer ) { m_brdLayer = aBrdLayer; }
 
     /**
+     * Set flag to convert closed polygons to filled areas instead of a set
+     * of lines.
+     */
+    void SetFillPolygons( int aFillPolygons ) { m_fillPolygons = aFillPolygons; };
+
+    /**
      * Implementation of the method used for communicate
      * with this filter.
      *

References