diff options
author | saurabhb17 | 2020-02-26 16:00:53 +0530 |
---|---|---|
committer | GitHub | 2020-02-26 16:00:53 +0530 |
commit | 886d9cb772e81d2e5262284bc3082664f084337f (patch) | |
tree | 6acee185a4dc19113fcbf0f9a3d6941085dedaf7 /pcbnew/import_dxf | |
parent | 0db48f6533517ecebfd9f0693f89deca28408b76 (diff) | |
parent | aa35045840b78d3f48212db45da59a2e5c69b223 (diff) | |
download | KiCad-eSim-886d9cb772e81d2e5262284bc3082664f084337f.tar.gz KiCad-eSim-886d9cb772e81d2e5262284bc3082664f084337f.tar.bz2 KiCad-eSim-886d9cb772e81d2e5262284bc3082664f084337f.zip |
Merge pull request #1 from saurabhb17/develop
Added main functions
Diffstat (limited to 'pcbnew/import_dxf')
-rw-r--r-- | pcbnew/import_dxf/dialog_dxf_import.cpp | 285 | ||||
-rw-r--r-- | pcbnew/import_dxf/dialog_dxf_import.fbp | 1328 | ||||
-rw-r--r-- | pcbnew/import_dxf/dialog_dxf_import.h | 64 | ||||
-rw-r--r-- | pcbnew/import_dxf/dialog_dxf_import_base.cpp | 154 | ||||
-rw-r--r-- | pcbnew/import_dxf/dialog_dxf_import_base.h | 77 | ||||
-rw-r--r-- | pcbnew/import_dxf/dxf2brd_items.cpp | 824 | ||||
-rw-r--r-- | pcbnew/import_dxf/dxf2brd_items.h | 192 | ||||
-rw-r--r-- | pcbnew/import_dxf/examples/basic_ellipses.dxf | 2992 | ||||
-rw-r--r-- | pcbnew/import_dxf/examples/test_outlines.dxf | 7264 |
9 files changed, 13180 insertions, 0 deletions
diff --git a/pcbnew/import_dxf/dialog_dxf_import.cpp b/pcbnew/import_dxf/dialog_dxf_import.cpp new file mode 100644 index 0000000..caf0c77 --- /dev/null +++ b/pcbnew/import_dxf/dialog_dxf_import.cpp @@ -0,0 +1,285 @@ +/** + * @file dialog_dxf_import.cpp + * @brief Dialog to import a dxf file on a given board layer. + */ + +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2013 Jean-Pierre Charras, jp.charras at wanadoo.fr + * Copyright (C) 1992-2016 KiCad Developers, see AUTHORS.txt for contributors. + * + * 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 <dialog_dxf_import.h> +#include <kiface_i.h> +#include <convert_from_iu.h> +#include <class_pcb_layer_box_selector.h> + +#include <class_board.h> +#include <class_module.h> +#include <class_edge_mod.h> +#include <class_text_mod.h> +#include <class_pcb_text.h> + +// Keys to store setup in config +#define DXF_IMPORT_LAYER_OPTION_KEY "DxfImportBrdLayer" +#define DXF_IMPORT_COORD_ORIGIN_KEY "DxfImportCoordOrigin" +#define DXF_IMPORT_LAST_FILE_KEY "DxfImportLastFile" +#define DXF_IMPORT_GRID_UNITS_KEY "DxfImportGridUnits" +#define DXF_IMPORT_GRID_OFFSET_X_KEY "DxfImportGridOffsetX" +#define DXF_IMPORT_GRID_OFFSET_Y_KEY "DxfImportGridOffsetY" + + +// 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 = 0; +LAYER_NUM DIALOG_DXF_IMPORT::m_layer = Dwgs_User; + + +DIALOG_DXF_IMPORT::DIALOG_DXF_IMPORT( PCB_BASE_FRAME* aParent, bool aUseModuleItems ) + : DIALOG_DXF_IMPORT_BASE( aParent ) +{ + m_parent = aParent; + m_dxfImporter.UseModuleItems( aUseModuleItems ); + m_config = Kiface().KifaceSettings(); + m_PCBGridUnits = 0; + m_PCBGridOffsetX = 0.0; + m_PCBGridOffsetY = 0.0; + + if( m_config ) + { + m_layer = m_config->Read( DXF_IMPORT_LAYER_OPTION_KEY, (long)Dwgs_User ); + m_offsetSelection = m_config->Read( DXF_IMPORT_COORD_ORIGIN_KEY, (long)0 ); + m_dxfFilename = m_config->Read( DXF_IMPORT_LAST_FILE_KEY, wxEmptyString ); + m_config->Read( DXF_IMPORT_GRID_UNITS_KEY, &m_PCBGridUnits, 0 ); + m_config->Read( DXF_IMPORT_GRID_OFFSET_X_KEY, &m_PCBGridOffsetX, 0.0 ); + m_config->Read( DXF_IMPORT_GRID_OFFSET_Y_KEY, &m_PCBGridOffsetY, 0.0 ); + } + + m_DXFPCBGridUnits->SetSelection( m_PCBGridUnits ); + wxString tmpStr; + tmpStr << m_PCBGridOffsetX; + m_DXFPCBXCoord->SetValue( tmpStr ); + tmpStr = ""; + tmpStr << m_PCBGridOffsetY; + m_DXFPCBYCoord->SetValue( tmpStr ); + + m_textCtrlFileName->SetValue( m_dxfFilename ); + m_rbOffsetOption->SetSelection( m_offsetSelection ); + + // 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->SetBoardFrame( m_parent ); + m_SelLayerBox->Resync(); + + if( m_SelLayerBox->SetLayerSelection( m_layer ) < 0 ) + { + m_layer = Dwgs_User; + m_SelLayerBox->SetLayerSelection( m_layer ); + } + + m_sdbSizer1OK->SetDefault(); + GetSizer()->Fit( this ); + GetSizer()->SetSizeHints( this ); + Centre(); +} + + +DIALOG_DXF_IMPORT::~DIALOG_DXF_IMPORT() +{ + m_offsetSelection = m_rbOffsetOption->GetSelection(); + m_layer = m_SelLayerBox->GetLayerSelection(); + + 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_GRID_UNITS_KEY, GetPCBGridUnits() ); + m_config->Write( DXF_IMPORT_GRID_OFFSET_X_KEY, m_DXFPCBXCoord->GetValue() ); + m_config->Write( DXF_IMPORT_GRID_OFFSET_Y_KEY, m_DXFPCBYCoord->GetValue() ); + } +} + + +void DIALOG_DXF_IMPORT::OnBrowseDxfFiles( wxCommandEvent& event ) +{ + wxString path; + wxString filename; + + if( !m_dxfFilename.IsEmpty() ) + { + wxFileName fn( m_dxfFilename ); + path = fn.GetPath(); + filename = fn.GetFullName(); + } + + wxFileDialog dlg( m_parent, + _( "Open File" ), + path, filename, + "DXF Files (*.dxf)|*.dxf", + wxFD_OPEN|wxFD_FILE_MUST_EXIST ); + + if( dlg.ShowModal() != wxID_OK ) + return; + + wxString fileName = dlg.GetPath(); + + if( fileName.IsEmpty() ) + return; + + m_dxfFilename = fileName; + m_textCtrlFileName->SetValue( fileName ); +} + + +void DIALOG_DXF_IMPORT::OnOKClick( wxCommandEvent& event ) +{ + m_dxfFilename = m_textCtrlFileName->GetValue(); + + if( m_dxfFilename.IsEmpty() ) + return; + + double offsetX = 0; + double offsetY = 0; + + m_offsetSelection = m_rbOffsetOption->GetSelection(); + + switch( m_offsetSelection ) + { + case 0: + offsetX = m_parent->GetPageSizeIU().x * MM_PER_IU / 2; + offsetY = m_parent->GetPageSizeIU().y * MM_PER_IU / 2; + break; + + case 1: + break; + + case 2: + offsetY = m_parent->GetPageSizeIU().y * MM_PER_IU / 2; + break; + + case 3: + offsetY = m_parent->GetPageSizeIU().y * MM_PER_IU; + break; + + case 4: + GetPCBGridOffsets( offsetX, offsetY ); + + if( GetPCBGridUnits() ) + { + offsetX *= 25.4; + offsetY *= 25.4; + } + break; + } + + // Set coordinates offset for import (offset is given in mm) + m_dxfImporter.SetOffset( offsetX, offsetY ); + m_layer = m_SelLayerBox->GetLayerSelection(); + m_dxfImporter.SetBrdLayer( m_layer ); + + // Read dxf file: + m_dxfImporter.ImportDxfFile( m_dxfFilename ); + + EndModal( wxID_OK ); +} + + +bool InvokeDXFDialogBoardImport( PCB_BASE_FRAME* aCaller ) +{ + DIALOG_DXF_IMPORT dlg( aCaller ); + bool success = ( dlg.ShowModal() == wxID_OK ); + + if( success ) + { + const std::list<BOARD_ITEM*>& list = dlg.GetImportedItems(); + PICKED_ITEMS_LIST picklist; + BOARD* board = aCaller->GetBoard(); + + std::list<BOARD_ITEM*>::const_iterator it, itEnd; + for( it = list.begin(), itEnd = list.end(); it != itEnd; ++it ) + { + BOARD_ITEM* item = *it; + board->Add( item ); + + ITEM_PICKER itemWrapper( item, UR_NEW ); + picklist.PushItem( itemWrapper ); + } + + aCaller->SaveCopyInUndoList( picklist, UR_NEW, wxPoint( 0, 0 ) ); + aCaller->OnModify(); + } + + return success; +} + + +bool InvokeDXFDialogModuleImport( PCB_BASE_FRAME* aCaller, MODULE* aModule ) +{ + wxASSERT( aModule ); + + DIALOG_DXF_IMPORT dlg( aCaller, true ); + bool success = ( dlg.ShowModal() == wxID_OK ); + + if( success ) + { + const std::list<BOARD_ITEM*>& list = dlg.GetImportedItems(); + + aCaller->SaveCopyInUndoList( aModule, UR_MODEDIT ); + aCaller->OnModify(); + + std::list<BOARD_ITEM*>::const_iterator it, itEnd; + + for( it = list.begin(), itEnd = list.end(); it != itEnd; ++it ) + { + aModule->Add( *it ); + } + } + + return success; +} + + +void DIALOG_DXF_IMPORT::OriginOptionOnUpdateUI( wxUpdateUIEvent& event ) +{ + bool enable = m_rbOffsetOption->GetSelection() == 4; + + m_DXFPCBGridUnits->Enable( enable ); + m_DXFPCBXCoord->Enable( enable ); + m_DXFPCBYCoord->Enable( enable ); +} + + +int DIALOG_DXF_IMPORT::GetPCBGridUnits( void ) +{ + return m_DXFPCBGridUnits->GetSelection(); +} + + +void DIALOG_DXF_IMPORT::GetPCBGridOffsets( double &aXOffset, double &aYOffset ) +{ + aXOffset = DoubleValueFromString( UNSCALED_UNITS, m_DXFPCBXCoord->GetValue() ); + aYOffset = DoubleValueFromString( UNSCALED_UNITS, m_DXFPCBYCoord->GetValue() ); + return; +} diff --git a/pcbnew/import_dxf/dialog_dxf_import.fbp b/pcbnew/import_dxf/dialog_dxf_import.fbp new file mode 100644 index 0000000..f2f699d --- /dev/null +++ b/pcbnew/import_dxf/dialog_dxf_import.fbp @@ -0,0 +1,1328 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> +<wxFormBuilder_Project> + <FileVersion major="1" minor="13" /> + <object class="Project" expanded="1"> + <property name="class_decoration"></property> + <property name="code_generation">C++</property> + <property name="disconnect_events">1</property> + <property name="disconnect_mode">source_name</property> + <property name="disconnect_php_events">0</property> + <property name="disconnect_python_events">0</property> + <property name="embedded_files_path">res</property> + <property name="encoding">UTF-8</property> + <property name="event_generation">connect</property> + <property name="file">dialog_dxf_import_base</property> + <property name="first_id">1000</property> + <property name="help_provider">none</property> + <property name="internationalize">1</property> + <property name="name">dialog_dxf_import</property> + <property name="namespace"></property> + <property name="path">.</property> + <property name="precompiled_header"></property> + <property name="relative_path">1</property> + <property name="skip_lua_events">1</property> + <property name="skip_php_events">1</property> + <property name="skip_python_events">1</property> + <property name="ui_table">UI</property> + <property name="use_enum">0</property> + <property name="use_microsoft_bom">0</property> + <object class="Dialog" expanded="1"> + <property name="aui_managed">0</property> + <property name="aui_manager_style">wxAUI_MGR_DEFAULT</property> + <property name="bg"></property> + <property name="center">wxBOTH</property> + <property name="context_help"></property> + <property name="context_menu">1</property> + <property name="enabled">1</property> + <property name="event_handler">impl_virtual</property> + <property name="extra_style"></property> + <property name="fg"></property> + <property name="font"></property> + <property name="hidden">0</property> + <property name="id">wxID_ANY</property> + <property name="maximum_size"></property> + <property name="minimum_size"></property> + <property name="name">DIALOG_DXF_IMPORT_BASE</property> + <property name="pos"></property> + <property name="size">-1,-1</property> + <property name="style">wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</property> + <property name="subclass">DIALOG_SHIM; dialog_shim.h</property> + <property name="title">Import DXF File</property> + <property name="tooltip"></property> + <property name="window_extra_style"></property> + <property name="window_name"></property> + <property name="window_style"></property> + <event name="OnActivate"></event> + <event name="OnActivateApp"></event> + <event name="OnAuiFindManager"></event> + <event name="OnAuiPaneButton"></event> + <event name="OnAuiPaneClose"></event> + <event name="OnAuiPaneMaximize"></event> + <event name="OnAuiPaneRestore"></event> + <event name="OnAuiRender"></event> + <event name="OnChar"></event> + <event name="OnClose"></event> + <event name="OnEnterWindow"></event> + <event name="OnEraseBackground"></event> + <event name="OnHibernate"></event> + <event name="OnIconize"></event> + <event name="OnIdle"></event> + <event name="OnInitDialog"></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 class="wxBoxSizer" expanded="1"> + <property name="minimum_size"></property> + <property name="name">bSizerMain</property> + <property name="orient">wxVERTICAL</property> + <property name="permission">none</property> + <object class="sizeritem" expanded="1"> + <property name="border">5</property> + <property name="flag">wxALL|wxEXPAND</property> + <property name="proportion">0</property> + <object class="wxBoxSizer" expanded="1"> + <property name="minimum_size"></property> + <property name="name">bSizerFile</property> + <property name="orient">wxHORIZONTAL</property> + <property name="permission">none</property> + <object class="sizeritem" expanded="1"> + <property name="border">5</property> + <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property> + <property name="proportion">0</property> + <object class="wxStaticText" 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="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">File:</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_staticText37</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="window_extra_style"></property> + <property name="window_name"></property> + <property name="window_style"></property> + <property name="wrap">-1</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="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">wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxTOP</property> + <property name="proportion">1</property> + <object class="wxTextCtrl" 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="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="max_size"></property> + <property name="maximize_button">0</property> + <property name="maximum_size"></property> + <property name="maxlength"></property> + <property name="min_size"></property> + <property name="minimize_button">0</property> + <property name="minimum_size">300,-1</property> + <property name="moveable">1</property> + <property name="name">m_textCtrlFileName</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="value"></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="OnRightDClick"></event> + <event name="OnRightDown"></event> + <event name="OnRightUp"></event> + <event name="OnSetFocus"></event> + <event name="OnSize"></event> + <event name="OnText"></event> + <event name="OnTextEnter"></event> + <event name="OnTextMaxLen"></event> + <event name="OnTextURL"></event> + <event name="OnUpdateUI"></event> + </object> + </object> + <object class="sizeritem" expanded="1"> + <property name="border">5</property> + <property name="flag">wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxTOP</property> + <property name="proportion">0</property> + <object class="wxButton" 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="close_button">1</property> + <property name="context_help"></property> + <property name="context_menu">1</property> + <property name="default">0</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">Browse</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_buttonBrowse</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="OnButtonClick">OnBrowseDxfFiles</event> + <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="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 class="sizeritem" expanded="1"> + <property name="border">5</property> + <property name="flag">wxALL|wxEXPAND</property> + <property name="proportion">1</property> + <object class="wxBoxSizer" expanded="1"> + <property name="minimum_size"></property> + <property name="name">bSizer3</property> + <property name="orient">wxHORIZONTAL</property> + <property name="permission">none</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">"Center of page" "Upper left corner of page" "Center left side of page" "Lower left corner of page" "User defined position"</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_ORIGIN_SELECT</property> + <property name="label">Place DXF origin (0,0) point:</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">0</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">OriginOptionOnUpdateUI</event> + </object> + </object> + <object class="sizeritem" expanded="1"> + <property name="border">5</property> + <property name="flag"></property> + <property name="proportion">1</property> + <object class="wxBoxSizer" expanded="1"> + <property name="minimum_size"></property> + <property name="name">bSizer4</property> + <property name="orient">wxVERTICAL</property> + <property name="permission">none</property> + <object class="sizeritem" expanded="1"> + <property name="border">5</property> + <property name="flag">wxEXPAND</property> + <property name="proportion">1</property> + <object class="wxBoxSizer" expanded="1"> + <property name="minimum_size"></property> + <property name="name">bSizer6</property> + <property name="orient">wxHORIZONTAL</property> + <property name="permission">none</property> + <object class="sizeritem" expanded="1"> + <property name="border">5</property> + <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property> + <property name="proportion">0</property> + <object class="wxStaticText" 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="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">X Position:</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_staticText4</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="window_extra_style"></property> + <property name="window_name"></property> + <property name="window_style"></property> + <property name="wrap">-1</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="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">wxALIGN_CENTER_VERTICAL|wxALL</property> + <property name="proportion">0</property> + <object class="wxTextCtrl" 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="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="max_size"></property> + <property name="maximize_button">0</property> + <property name="maximum_size"></property> + <property name="maxlength">10</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_DXFPCBXCoord</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">DXF origin on PCB Grid, X Coordinate</property> + <property name="validator_data_type"></property> + <property name="validator_style">wxFILTER_NUMERIC</property> + <property name="validator_type">wxTextValidator</property> + <property name="validator_variable"></property> + <property name="value">0.0</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="OnRightDClick"></event> + <event name="OnRightDown"></event> + <event name="OnRightUp"></event> + <event name="OnSetFocus"></event> + <event name="OnSize"></event> + <event name="OnText"></event> + <event name="OnTextEnter"></event> + <event name="OnTextMaxLen"></event> + <event name="OnTextURL"></event> + <event name="OnUpdateUI"></event> + </object> + </object> + </object> + </object> + <object class="sizeritem" expanded="1"> + <property name="border">5</property> + <property name="flag">wxEXPAND</property> + <property name="proportion">1</property> + <object class="wxBoxSizer" expanded="1"> + <property name="minimum_size"></property> + <property name="name">bSizer7</property> + <property name="orient">wxHORIZONTAL</property> + <property name="permission">none</property> + <object class="sizeritem" expanded="1"> + <property name="border">5</property> + <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property> + <property name="proportion">0</property> + <object class="wxStaticText" 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="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">Y Position:</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_staticText5</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="window_extra_style"></property> + <property name="window_name"></property> + <property name="window_style"></property> + <property name="wrap">-1</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="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">wxALIGN_CENTER_VERTICAL|wxALL</property> + <property name="proportion">0</property> + <object class="wxTextCtrl" 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="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="max_size"></property> + <property name="maximize_button">0</property> + <property name="maximum_size"></property> + <property name="maxlength">10</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_DXFPCBYCoord</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">DXF origin on PCB Grid, Y Coordinate</property> + <property name="validator_data_type"></property> + <property name="validator_style">wxFILTER_NUMERIC</property> + <property name="validator_type">wxTextValidator</property> + <property name="validator_variable"></property> + <property name="value">0.0</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="OnRightDClick"></event> + <event name="OnRightDown"></event> + <event name="OnRightUp"></event> + <event name="OnSetFocus"></event> + <event name="OnSize"></event> + <event name="OnText"></event> + <event name="OnTextEnter"></event> + <event name="OnTextMaxLen"></event> + <event name="OnTextURL"></event> + <event name="OnUpdateUI"></event> + </object> + </object> + </object> + </object> + <object class="sizeritem" expanded="1"> + <property name="border">5</property> + <property name="flag">wxEXPAND</property> + <property name="proportion">1</property> + <object class="wxBoxSizer" expanded="1"> + <property name="minimum_size"></property> + <property name="name">bSizer5</property> + <property name="orient">wxHORIZONTAL</property> + <property name="permission">none</property> + <object class="sizeritem" expanded="0"> + <property name="border">5</property> + <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property> + <property name="proportion">0</property> + <object class="wxStaticText" expanded="0"> + <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="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">Units:</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_staticText3</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="window_extra_style"></property> + <property name="window_name"></property> + <property name="window_style"></property> + <property name="wrap">-1</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="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="0"> + <property name="border">5</property> + <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property> + <property name="proportion">0</property> + <object class="wxChoice" expanded="0"> + <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">"mm" "inch"</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="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_DXFPCBGridUnits</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">0</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">Select PCB grid units</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="OnChoice"></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> + </object> + <object class="sizeritem" expanded="1"> + <property name="border">5</property> + <property name="flag">wxALL|wxEXPAND</property> + <property name="proportion">0</property> + <object class="wxBoxSizer" expanded="1"> + <property name="minimum_size"></property> + <property name="name">bSizer8</property> + <property name="orient">wxHORIZONTAL</property> + <property name="permission">none</property> + <object class="sizeritem" expanded="1"> + <property name="border">5</property> + <property name="flag">wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxLEFT|wxTOP</property> + <property name="proportion">0</property> + <object class="wxStaticText" 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="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">Layer:</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_staticTextBrdlayer</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="window_extra_style"></property> + <property name="window_name"></property> + <property name="window_style"></property> + <property name="wrap">-1</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="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">wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND</property> + <property name="proportion">1</property> + <object class="wxBitmapComboBox" 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"></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="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_SelLayerBox</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">-1</property> + <property name="show">1</property> + <property name="size"></property> + <property name="style"></property> + <property name="subclass">PCB_LAYER_BOX_SELECTOR; class_pcb_layer_box_selector.h</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="value"></property> + <property name="window_extra_style"></property> + <property name="window_name"></property> + <property name="window_style"></property> + <event name="OnChar"></event> + <event name="OnCombobox"></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="OnText"></event> + <event name="OnTextEnter"></event> + <event name="OnUpdateUI"></event> + </object> + </object> + </object> + </object> + <object class="sizeritem" expanded="1"> + <property name="border">5</property> + <property name="flag">wxALL|wxEXPAND</property> + <property name="proportion">0</property> + <object class="wxStaticLine" 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="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="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_staticline8</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">wxLI_HORIZONTAL</property> + <property name="subclass"></property> + <property name="toolbar_pane">0</property> + <property name="tooltip"></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="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">wxALIGN_RIGHT|wxBOTTOM|wxLEFT|wxRIGHT</property> + <property name="proportion">0</property> + <object class="wxStdDialogButtonSizer" expanded="1"> + <property name="Apply">0</property> + <property name="Cancel">1</property> + <property name="ContextHelp">0</property> + <property name="Help">0</property> + <property name="No">0</property> + <property name="OK">1</property> + <property name="Save">0</property> + <property name="Yes">0</property> + <property name="minimum_size"></property> + <property name="name">m_sdbSizer1</property> + <property name="permission">protected</property> + <event name="OnApplyButtonClick"></event> + <event name="OnCancelButtonClick">OnCancelClick</event> + <event name="OnContextHelpButtonClick"></event> + <event name="OnHelpButtonClick"></event> + <event name="OnNoButtonClick"></event> + <event name="OnOKButtonClick">OnOKClick</event> + <event name="OnSaveButtonClick"></event> + <event name="OnYesButtonClick"></event> + </object> + </object> + </object> + </object> + </object> +</wxFormBuilder_Project> diff --git a/pcbnew/import_dxf/dialog_dxf_import.h b/pcbnew/import_dxf/dialog_dxf_import.h new file mode 100644 index 0000000..91f87de --- /dev/null +++ b/pcbnew/import_dxf/dialog_dxf_import.h @@ -0,0 +1,64 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2013 Jean-Pierre Charras, jp.charras at wanadoo.fr + * Copyright (C) 1992-2016 KiCad Developers, see AUTHORS.txt for contributors. + * + * 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 <dialog_dxf_import_base.h> +#include <wxPcbStruct.h> +#include <dxf2brd_items.h> + +class DIALOG_DXF_IMPORT : public DIALOG_DXF_IMPORT_BASE +{ +public: + DIALOG_DXF_IMPORT( PCB_BASE_FRAME* aParent, bool aUseModuleItems = false ); + ~DIALOG_DXF_IMPORT(); + + /** + * Function GetImportedItems() + * + * Returns a list of items imported from a DXF file. + */ + const std::list<BOARD_ITEM*>& GetImportedItems() const + { + return m_dxfImporter.GetItemsList(); + } + +private: + PCB_BASE_FRAME* m_parent; + wxConfigBase* m_config; // Current config + DXF2BRD_CONVERTER m_dxfImporter; + int m_PCBGridUnits; + double m_PCBGridOffsetX; + double m_PCBGridOffsetY; + + static wxString m_dxfFilename; + static int m_offsetSelection; + static LAYER_NUM m_layer; + + // Virtual event handlers + void OnCancelClick( wxCommandEvent& event ) { event.Skip(); } + void OnOKClick( wxCommandEvent& event ); + void OnBrowseDxfFiles( wxCommandEvent& event ); + void OriginOptionOnUpdateUI( wxUpdateUIEvent& event ); + int GetPCBGridUnits( void ); + void GetPCBGridOffsets( double &aXOffset, double &aYOffset ); +}; diff --git a/pcbnew/import_dxf/dialog_dxf_import_base.cpp b/pcbnew/import_dxf/dialog_dxf_import_base.cpp new file mode 100644 index 0000000..f3ba8e3 --- /dev/null +++ b/pcbnew/import_dxf/dialog_dxf_import_base.cpp @@ -0,0 +1,154 @@ +/////////////////////////////////////////////////////////////////////////// +// C++ code generated with wxFormBuilder (version Jun 5 2014) +// http://www.wxformbuilder.org/ +// +// PLEASE DO "NOT" EDIT THIS FILE! +/////////////////////////////////////////////////////////////////////////// + +#include "class_pcb_layer_box_selector.h" + +#include "dialog_dxf_import_base.h" + +/////////////////////////////////////////////////////////////////////////// + +DIALOG_DXF_IMPORT_BASE::DIALOG_DXF_IMPORT_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 ); + + wxBoxSizer* bSizerMain; + bSizerMain = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizerFile; + bSizerFile = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText37 = new wxStaticText( this, wxID_ANY, _("File:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText37->Wrap( -1 ); + bSizerFile->Add( m_staticText37, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + m_textCtrlFileName = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_textCtrlFileName->SetMinSize( wxSize( 300,-1 ) ); + + bSizerFile->Add( m_textCtrlFileName, 1, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxTOP, 5 ); + + m_buttonBrowse = new wxButton( this, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizerFile->Add( m_buttonBrowse, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxTOP, 5 ); + + + bSizerMain->Add( bSizerFile, 0, wxALL|wxEXPAND, 5 ); + + wxBoxSizer* bSizer3; + bSizer3 = new wxBoxSizer( wxHORIZONTAL ); + + wxString m_rbOffsetOptionChoices[] = { _("Center of page"), _("Upper left corner of page"), _("Center left side of page"), _("Lower left corner of page"), _("User defined position") }; + int m_rbOffsetOptionNChoices = sizeof( m_rbOffsetOptionChoices ) / sizeof( wxString ); + m_rbOffsetOption = new wxRadioBox( this, wxID_ORIGIN_SELECT, _("Place DXF origin (0,0) point:"), wxDefaultPosition, wxDefaultSize, m_rbOffsetOptionNChoices, m_rbOffsetOptionChoices, 1, wxRA_SPECIFY_COLS ); + m_rbOffsetOption->SetSelection( 0 ); + bSizer3->Add( m_rbOffsetOption, 0, wxALL|wxEXPAND, 5 ); + + wxBoxSizer* bSizer4; + bSizer4 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer6; + bSizer6 = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText4 = new wxStaticText( this, wxID_ANY, _("X Position:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText4->Wrap( -1 ); + bSizer6->Add( m_staticText4, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + m_DXFPCBXCoord = new wxTextCtrl( this, wxID_ANY, _("0.0"), wxDefaultPosition, wxDefaultSize, 0 ); + m_DXFPCBXCoord->SetMaxLength( 10 ); + m_DXFPCBXCoord->SetToolTip( _("DXF origin on PCB Grid, X Coordinate") ); + + bSizer6->Add( m_DXFPCBXCoord, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + + bSizer4->Add( bSizer6, 1, wxEXPAND, 5 ); + + wxBoxSizer* bSizer7; + bSizer7 = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText5 = new wxStaticText( this, wxID_ANY, _("Y Position:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText5->Wrap( -1 ); + bSizer7->Add( m_staticText5, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + m_DXFPCBYCoord = new wxTextCtrl( this, wxID_ANY, _("0.0"), wxDefaultPosition, wxDefaultSize, 0 ); + m_DXFPCBYCoord->SetMaxLength( 10 ); + m_DXFPCBYCoord->SetToolTip( _("DXF origin on PCB Grid, Y Coordinate") ); + + bSizer7->Add( m_DXFPCBYCoord, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + + bSizer4->Add( bSizer7, 1, wxEXPAND, 5 ); + + wxBoxSizer* bSizer5; + bSizer5 = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText3 = new wxStaticText( this, wxID_ANY, _("Units:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText3->Wrap( -1 ); + bSizer5->Add( m_staticText3, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxString m_DXFPCBGridUnitsChoices[] = { _("mm"), _("inch") }; + int m_DXFPCBGridUnitsNChoices = sizeof( m_DXFPCBGridUnitsChoices ) / sizeof( wxString ); + m_DXFPCBGridUnits = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_DXFPCBGridUnitsNChoices, m_DXFPCBGridUnitsChoices, 0 ); + m_DXFPCBGridUnits->SetSelection( 0 ); + m_DXFPCBGridUnits->SetToolTip( _("Select PCB grid units") ); + + bSizer5->Add( m_DXFPCBGridUnits, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + + bSizer4->Add( bSizer5, 1, wxEXPAND, 5 ); + + + bSizer3->Add( bSizer4, 1, 0, 5 ); + + + bSizerMain->Add( bSizer3, 1, wxALL|wxEXPAND, 5 ); + + wxBoxSizer* bSizer8; + bSizer8 = new wxBoxSizer( wxHORIZONTAL ); + + m_staticTextBrdlayer = new wxStaticText( this, wxID_ANY, _("Layer:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextBrdlayer->Wrap( -1 ); + bSizer8->Add( m_staticTextBrdlayer, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxLEFT|wxTOP, 5 ); + + m_SelLayerBox = new PCB_LAYER_BOX_SELECTOR( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + bSizer8->Add( m_SelLayerBox, 1, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5 ); + + + bSizerMain->Add( bSizer8, 0, wxALL|wxEXPAND, 5 ); + + m_staticline8 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizerMain->Add( m_staticline8, 0, wxALL|wxEXPAND, 5 ); + + m_sdbSizer1 = new wxStdDialogButtonSizer(); + m_sdbSizer1OK = new wxButton( this, wxID_OK ); + m_sdbSizer1->AddButton( m_sdbSizer1OK ); + m_sdbSizer1Cancel = new wxButton( this, wxID_CANCEL ); + m_sdbSizer1->AddButton( m_sdbSizer1Cancel ); + m_sdbSizer1->Realize(); + + bSizerMain->Add( m_sdbSizer1, 0, wxALIGN_RIGHT|wxBOTTOM|wxLEFT|wxRIGHT, 5 ); + + + this->SetSizer( bSizerMain ); + this->Layout(); + bSizerMain->Fit( this ); + + this->Centre( wxBOTH ); + + // Connect Events + m_buttonBrowse->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_DXF_IMPORT_BASE::OnBrowseDxfFiles ), NULL, this ); + m_rbOffsetOption->Connect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_DXF_IMPORT_BASE::OriginOptionOnUpdateUI ), NULL, this ); + m_sdbSizer1Cancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_DXF_IMPORT_BASE::OnCancelClick ), NULL, this ); + m_sdbSizer1OK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_DXF_IMPORT_BASE::OnOKClick ), NULL, this ); +} + +DIALOG_DXF_IMPORT_BASE::~DIALOG_DXF_IMPORT_BASE() +{ + // Disconnect Events + m_buttonBrowse->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_DXF_IMPORT_BASE::OnBrowseDxfFiles ), NULL, this ); + m_rbOffsetOption->Disconnect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_DXF_IMPORT_BASE::OriginOptionOnUpdateUI ), NULL, this ); + m_sdbSizer1Cancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_DXF_IMPORT_BASE::OnCancelClick ), NULL, this ); + m_sdbSizer1OK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_DXF_IMPORT_BASE::OnOKClick ), NULL, this ); + +} diff --git a/pcbnew/import_dxf/dialog_dxf_import_base.h b/pcbnew/import_dxf/dialog_dxf_import_base.h new file mode 100644 index 0000000..7592d9b --- /dev/null +++ b/pcbnew/import_dxf/dialog_dxf_import_base.h @@ -0,0 +1,77 @@ +/////////////////////////////////////////////////////////////////////////// +// C++ code generated with wxFormBuilder (version Jun 5 2014) +// http://www.wxformbuilder.org/ +// +// PLEASE DO "NOT" EDIT THIS FILE! +/////////////////////////////////////////////////////////////////////////// + +#ifndef __DIALOG_DXF_IMPORT_BASE_H__ +#define __DIALOG_DXF_IMPORT_BASE_H__ + +#include <wx/artprov.h> +#include <wx/xrc/xmlres.h> +#include <wx/intl.h> +class DIALOG_SHIM; +class PCB_LAYER_BOX_SELECTOR; + +#include "dialog_shim.h" +#include <wx/string.h> +#include <wx/stattext.h> +#include <wx/gdicmn.h> +#include <wx/font.h> +#include <wx/colour.h> +#include <wx/settings.h> +#include <wx/textctrl.h> +#include <wx/button.h> +#include <wx/sizer.h> +#include <wx/radiobox.h> +#include <wx/valtext.h> +#include <wx/choice.h> +#include <wx/bmpcbox.h> +#include <wx/statline.h> +#include <wx/dialog.h> + +/////////////////////////////////////////////////////////////////////////// + +#define wxID_ORIGIN_SELECT 1000 + +/////////////////////////////////////////////////////////////////////////////// +/// Class DIALOG_DXF_IMPORT_BASE +/////////////////////////////////////////////////////////////////////////////// +class DIALOG_DXF_IMPORT_BASE : public DIALOG_SHIM +{ + private: + + protected: + wxStaticText* m_staticText37; + wxTextCtrl* m_textCtrlFileName; + wxButton* m_buttonBrowse; + wxRadioBox* m_rbOffsetOption; + wxStaticText* m_staticText4; + wxTextCtrl* m_DXFPCBXCoord; + wxStaticText* m_staticText5; + wxTextCtrl* m_DXFPCBYCoord; + wxStaticText* m_staticText3; + wxChoice* m_DXFPCBGridUnits; + wxStaticText* m_staticTextBrdlayer; + PCB_LAYER_BOX_SELECTOR* m_SelLayerBox; + wxStaticLine* m_staticline8; + wxStdDialogButtonSizer* m_sdbSizer1; + wxButton* m_sdbSizer1OK; + wxButton* m_sdbSizer1Cancel; + + // Virtual event handlers, overide them in your derived class + virtual void OnBrowseDxfFiles( wxCommandEvent& event ) { event.Skip(); } + virtual void OriginOptionOnUpdateUI( wxUpdateUIEvent& event ) { event.Skip(); } + virtual void OnCancelClick( wxCommandEvent& event ) { event.Skip(); } + virtual void OnOKClick( wxCommandEvent& event ) { event.Skip(); } + + + public: + + DIALOG_DXF_IMPORT_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Import DXF File"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); + ~DIALOG_DXF_IMPORT_BASE(); + +}; + +#endif //__DIALOG_DXF_IMPORT_BASE_H__ diff --git a/pcbnew/import_dxf/dxf2brd_items.cpp b/pcbnew/import_dxf/dxf2brd_items.cpp new file mode 100644 index 0000000..a48f591 --- /dev/null +++ b/pcbnew/import_dxf/dxf2brd_items.cpp @@ -0,0 +1,824 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2013 Jean-Pierre Charras, jp.charras at wanadoo.fr + * Copyright (C) 1992-2016 KiCad Developers, see AUTHORS.txt for contributors. + * + * 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 + */ + +// The DXF reader lib (libdxfrw) comes from LibreCAD project, a 2D CAD program +// libdxfrw can be found on http://sourceforge.net/projects/libdxfrw/ +// or (latest sources) on +// https://github.com/LibreCAD/LibreCAD/tree/master/libraries/libdxfrw/src +// +// There is no doc to use it, but have a look to +// https://github.com/LibreCAD/LibreCAD/blob/master/librecad/src/lib/filters/rs_filterdxf.cpp +// and https://github.com/LibreCAD/LibreCAD/blob/master/librecad/src/lib/filters/rs_filterdxf.h +// Each time a dxf entity is read, a "call back" fuction is called +// like void DXF2BRD_CONVERTER::addLine( const DRW_Line& data ) when a line is read. +// this function just add the BOARD entity from dxf parameters (start and end point ...) + + +#include "libdxfrw.h" +#include "dxf2brd_items.h" +#include <wx/arrstr.h> +#include <wx/regex.h> + +#include <trigo.h> +#include <macros.h> +#include <class_board.h> +#include <class_drawsegment.h> +#include <class_edge_mod.h> +#include <class_pcb_text.h> +#include <convert_from_iu.h> +#include <class_text_mod.h> +#include <drw_base.h> + +// minimum bulge value before resorting to a line segment; +// the value 0.0218 is equivalent to about 5 degrees arc, +#define MIN_BULGE 0.0218 + +DXF2BRD_CONVERTER::DXF2BRD_CONVERTER() : DRW_Interface() +{ + m_xOffset = 0.0; // X coord offset for conversion (in mm) + m_yOffset = 0.0; // Y coord offset for conversion (in mm) + m_DXF2mm = 1.0; // The scale factor to convert DXF units to mm + m_version = 0; + m_defaultThickness = 0.1; + m_brdLayer = Dwgs_User; +} + + +DXF2BRD_CONVERTER::~DXF2BRD_CONVERTER() +{ +} + + +// coordinate conversions from dxf to internal units +int DXF2BRD_CONVERTER::mapX( double aDxfCoordX ) +{ + return Millimeter2iu( m_xOffset + ( aDxfCoordX * m_DXF2mm ) ); +} + + +int DXF2BRD_CONVERTER::mapY( double aDxfCoordY ) +{ + return Millimeter2iu( m_yOffset - ( aDxfCoordY * m_DXF2mm ) ); +} + + +int DXF2BRD_CONVERTER::mapDim( double aDxfValue ) +{ + return Millimeter2iu( aDxfValue * m_DXF2mm ); +} + + +bool DXF2BRD_CONVERTER::ImportDxfFile( const wxString& aFile ) +{ + dxfRW* dxf = new dxfRW( aFile.ToUTF8() ); + bool success = dxf->read( this, true ); + + delete dxf; + + return success; +} + + +void DXF2BRD_CONVERTER::addLayer( const DRW_Layer& aData ) +{ + // Not yet useful in Pcbnew. +#if 0 + wxString name = wxString::FromUTF8( aData.name.c_str() ); + wxLogMessage( name ); +#endif +} + + +void DXF2BRD_CONVERTER::addLine( const DRW_Line& aData ) +{ + DRAWSEGMENT* segm = ( m_useModuleItems ) ? + static_cast< DRAWSEGMENT* >( new EDGE_MODULE( NULL ) ) : new DRAWSEGMENT; + + segm->SetLayer( ToLAYER_ID( m_brdLayer ) ); + wxPoint start( mapX( aData.basePoint.x ), mapY( aData.basePoint.y ) ); + segm->SetStart( start ); + wxPoint end( mapX( aData.secPoint.x ), mapY( aData.secPoint.y ) ); + segm->SetEnd( end ); + segm->SetWidth( mapDim( aData.thickness == 0 ? m_defaultThickness / m_DXF2mm + : aData.thickness ) ); + m_newItemsList.push_back( segm ); +} + +void DXF2BRD_CONVERTER::addPolyline(const DRW_Polyline& aData ) +{ + // Currently, Pcbnew does not know polylines, for boards. + // 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++ ) + { + 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 = ( m_useModuleItems ) ? + static_cast< DRAWSEGMENT* >( new EDGE_MODULE( NULL ) ) : + new DRAWSEGMENT; + + 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 / m_DXF2mm + : 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 = ( m_useModuleItems ) ? + static_cast< DRAWSEGMENT* >( new EDGE_MODULE( NULL ) ) : + new DRAWSEGMENT; + + 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 / m_DXF2mm + : aData.thickness ) ); + m_newItemsList.push_back( closing_segm ); + } +} + + +void DXF2BRD_CONVERTER::addLWPolyline(const DRW_LWPolyline& aData ) +{ + // Currently, Pcbnew does not know polylines, for boards. + // So we have to convert a polyline to a set of segments. + // The import is a simplified import: the width of segment is + // (obviously constant and is the width of the DRW_LWPolyline. + // the variable width of each vertex (when exists) is not used. + wxRealPoint seg_start; + wxRealPoint poly_start; + double bulge = 0.0; + int lineWidth = mapDim( aData.thickness == 0 ? m_defaultThickness / m_DXF2mm + : aData.thickness ); + + for( unsigned ii = 0; ii < aData.vertlist.size(); ii++ ) + { + DRW_Vertex2D* vertex = aData.vertlist[ii]; + + if( ii == 0 ) + { + seg_start.x = m_xOffset + vertex->x * m_DXF2mm; + seg_start.y = m_yOffset - vertex->y * m_DXF2mm; + bulge = vertex->bulge; + poly_start = seg_start; + continue; + } + + wxRealPoint seg_end( m_xOffset + vertex->x * m_DXF2mm, m_yOffset - vertex->y * m_DXF2mm ); + + if( std::abs( bulge ) < MIN_BULGE ) + insertLine( seg_start, seg_end, lineWidth ); + else + insertArc( seg_start, seg_end, bulge, lineWidth ); + + bulge = vertex->bulge; + seg_start = seg_end; + } + + // LWPolyline flags bit 0 indicates closed (1) or open (0) polyline + if( aData.flags & 1 ) + { + if( std::abs( bulge ) < MIN_BULGE ) + insertLine( seg_start, poly_start, lineWidth ); + else + insertArc( seg_start, poly_start, bulge, lineWidth ); + } +} + + +void DXF2BRD_CONVERTER::addCircle( const DRW_Circle& aData ) +{ + DRAWSEGMENT* segm = ( m_useModuleItems ) ? + static_cast< DRAWSEGMENT* >( new EDGE_MODULE( NULL ) ) : new DRAWSEGMENT; + + segm->SetLayer( ToLAYER_ID( m_brdLayer ) ); + segm->SetShape( S_CIRCLE ); + wxPoint center( mapX( aData.basePoint.x ), mapY( aData.basePoint.y ) ); + segm->SetCenter( center ); + wxPoint circle_start( mapX( aData.basePoint.x + aData.radious ), mapY( aData.basePoint.y ) ); + segm->SetArcStart( circle_start ); + segm->SetWidth( mapDim( aData.thickness == 0 ? m_defaultThickness / m_DXF2mm + : aData.thickness ) ); + m_newItemsList.push_back( segm ); +} + + +/* + * Import Arc entities. + */ +void DXF2BRD_CONVERTER::addArc( const DRW_Arc& data ) +{ + DRAWSEGMENT* segm = ( m_useModuleItems ) ? + static_cast< DRAWSEGMENT* >( new EDGE_MODULE( NULL ) ) : new DRAWSEGMENT; + + segm->SetLayer( ToLAYER_ID( m_brdLayer ) ); + segm->SetShape( S_ARC ); + + // Init arc centre: + wxPoint center( mapX( data.basePoint.x ), mapY( data.basePoint.y ) ); + segm->SetCenter( center ); + + // Init arc start point + double arcStartx = data.radious; + double arcStarty = 0; + double startangle = data.staangle; + double endangle = data.endangle; + + RotatePoint( &arcStartx, &arcStarty, -RAD2DECIDEG( startangle ) ); + wxPoint arcStart( mapX( arcStartx + data.basePoint.x ), + mapY( arcStarty + data.basePoint.y ) ); + segm->SetArcStart( arcStart ); + + // calculate arc angle (arcs are CCW, and should be < 0 in Pcbnew) + double angle = -RAD2DECIDEG( endangle - startangle ); + + if( angle > 0.0 ) + angle -= 3600.0; + + segm->SetAngle( angle ); + + segm->SetWidth( mapDim( data.thickness == 0 ? m_defaultThickness / m_DXF2mm + : data.thickness ) ); + m_newItemsList.push_back( segm ); +} + + +void DXF2BRD_CONVERTER::addText( const DRW_Text& aData ) +{ + BOARD_ITEM* brdItem; + EDA_TEXT* textItem; + + if( m_useModuleItems ) + { + TEXTE_MODULE* modText = new TEXTE_MODULE( NULL ); + brdItem = static_cast< BOARD_ITEM* >( modText ); + textItem = static_cast< EDA_TEXT* >( modText ); + } + else + { + TEXTE_PCB* pcbText = new TEXTE_PCB( NULL ); + brdItem = static_cast< BOARD_ITEM* >( pcbText ); + textItem = static_cast< EDA_TEXT* >( pcbText ); + } + + brdItem->SetLayer( ToLAYER_ID( m_brdLayer ) ); + + wxPoint refPoint( mapX( aData.basePoint.x ), mapY( aData.basePoint.y ) ); + wxPoint secPoint( mapX( aData.secPoint.x ), mapY( aData.secPoint.y ) ); + + if( aData.alignV != 0 || aData.alignH != 0 || aData.alignH == DRW_Text::HMiddle ) + { + if( aData.alignH != DRW_Text::HAligned && aData.alignH != DRW_Text::HFit ) + { + wxPoint tmp = secPoint; + secPoint = refPoint; + refPoint = tmp; + } + } + + switch( aData.alignV ) + { + case DRW_Text::VBaseLine: + textItem->SetVertJustify( GR_TEXT_VJUSTIFY_BOTTOM ); + break; + + case DRW_Text::VBottom: + textItem->SetVertJustify( GR_TEXT_VJUSTIFY_BOTTOM ); + break; + + case DRW_Text::VMiddle: + textItem->SetVertJustify( GR_TEXT_VJUSTIFY_CENTER ); + break; + + case DRW_Text::VTop: + textItem->SetVertJustify( GR_TEXT_VJUSTIFY_TOP ); + break; + } + + switch( aData.alignH ) + { + case DRW_Text::HLeft: + textItem->SetHorizJustify( GR_TEXT_HJUSTIFY_LEFT ); + break; + + case DRW_Text::HCenter: + textItem->SetHorizJustify( GR_TEXT_HJUSTIFY_CENTER ); + break; + + case DRW_Text::HRight: + textItem->SetHorizJustify( GR_TEXT_HJUSTIFY_RIGHT ); + break; + + case DRW_Text::HAligned: + // no equivalent options in text pcb. + textItem->SetHorizJustify( GR_TEXT_HJUSTIFY_LEFT ); + break; + + case DRW_Text::HMiddle: + // no equivalent options in text pcb. + textItem->SetHorizJustify( GR_TEXT_HJUSTIFY_CENTER ); + break; + + case DRW_Text::HFit: + // no equivalent options in text pcb. + textItem->SetHorizJustify( GR_TEXT_HJUSTIFY_LEFT ); + break; + } + +#if 0 + wxString sty = wxString::FromUTF8( aData.style.c_str() ); + sty = sty.ToLower(); + + if( aData.textgen == 2 ) + { + // Text dir = left to right; + } else if( aData.textgen == 4 ) + { + // Text dir = top to bottom; + } else + { + } +#endif + + wxString text = toNativeString( wxString::FromUTF8( aData.text.c_str() ) ); + + textItem->SetTextPosition( refPoint ); + textItem->SetOrientation( aData.angle * 10 ); + + // The 0.8 factor gives a better height/width ratio with our font + textItem->SetWidth( mapDim( aData.height * 0.8 ) ); + textItem->SetHeight( mapDim( aData.height ) ); + textItem->SetThickness( mapDim( aData.thickness == 0 ? m_defaultThickness / m_DXF2mm + : aData.thickness ) ); + textItem->SetText( text ); + + m_newItemsList.push_back( static_cast< BOARD_ITEM* >( brdItem ) ); +} + + +void DXF2BRD_CONVERTER::addMText( const DRW_MText& aData ) +{ + wxString text = toNativeString( wxString::FromUTF8( aData.text.c_str() ) ); + wxString attrib, tmp; + + /* Some texts start by '\' and have formating chars (font name, font option...) + * ending with ';' + * Here are some mtext formatting codes: + * Format code Purpose + * \0...\o Turns overline on and off + * \L...\l Turns underline on and off + * \~ Inserts a nonbreaking space + \\ Inserts a backslash + \\\{...\} Inserts an opening and closing brace + \\ \File name; Changes to the specified font file + \\ \Hvalue; Changes to the text height specified in drawing units + \\ \Hvaluex; Changes the text height to a multiple of the current text height + \\ \S...^...; Stacks the subsequent text at the \, #, or ^ symbol + \\ \Tvalue; Adjusts the space between characters, from.75 to 4 times + \\ \Qangle; Changes obliquing angle + \\ \Wvalue; Changes width factor to produce wide text + \\ \A Sets the alignment value; valid values: 0, 1, 2 (bottom, center, top) while( text.StartsWith( wxT("\\") ) ) + */ + while( text.StartsWith( wxT( "\\" ) ) ) + { + attrib << text.BeforeFirst( ';' ); + tmp = text.AfterFirst( ';' ); + text = tmp; + } + + BOARD_ITEM* brdItem; + EDA_TEXT* textItem; + + if( m_useModuleItems ) + { + TEXTE_MODULE* modText = new TEXTE_MODULE( NULL ); + brdItem = static_cast< BOARD_ITEM* >( modText ); + textItem = static_cast< EDA_TEXT* >( modText ); + } + else + { + TEXTE_PCB* pcbText = new TEXTE_PCB( NULL ); + brdItem = static_cast< BOARD_ITEM* >( pcbText ); + textItem = static_cast< EDA_TEXT* >( pcbText ); + } + + brdItem->SetLayer( ToLAYER_ID( m_brdLayer ) ); + wxPoint textpos( mapX( aData.basePoint.x ), mapY( aData.basePoint.y ) ); + + textItem->SetTextPosition( textpos ); + textItem->SetOrientation( aData.angle * 10 ); + + // The 0.8 factor gives a better height/width ratio with our font + textItem->SetWidth( mapDim( aData.height * 0.8 ) ); + textItem->SetHeight( mapDim( aData.height ) ); + textItem->SetThickness( mapDim( aData.thickness == 0 ? m_defaultThickness / m_DXF2mm + : aData.thickness ) ); + textItem->SetText( text ); + + // Initialize text justifications: + if( aData.textgen <= 3 ) + { + textItem->SetVertJustify( GR_TEXT_VJUSTIFY_TOP ); + } + else if( aData.textgen <= 6 ) + { + textItem->SetVertJustify( GR_TEXT_VJUSTIFY_CENTER ); + } + else + { + textItem->SetVertJustify( GR_TEXT_VJUSTIFY_BOTTOM ); + } + + if( aData.textgen % 3 == 1 ) + { + textItem->SetHorizJustify( GR_TEXT_HJUSTIFY_LEFT ); + } + else if( aData.textgen % 3 == 2 ) + { + textItem->SetHorizJustify( GR_TEXT_HJUSTIFY_CENTER ); + } + else + { + textItem->SetHorizJustify( GR_TEXT_HJUSTIFY_RIGHT ); + } + +#if 0 // These setting have no mening in Pcbnew + if( data.alignH == 1 ) + { + // Text is left to right; + } + else if( data.alignH == 3 ) + { + // Text is top to bottom; + } + else + { + // use ByStyle; + } + + if( aData.alignV == 1 ) + { + // use AtLeast; + } + else + { + // useExact; + } +#endif + + m_newItemsList.push_back( static_cast< BOARD_ITEM* >( brdItem ) ); +} + + +void DXF2BRD_CONVERTER::addHeader( const DRW_Header* data ) +{ + std::map<std::string, DRW_Variant*>::const_iterator it; + m_DXF2mm = 1.0; // assume no scale factor + + for( it = data->vars.begin(); it != data->vars.end(); ++it ) + { + std::string key = ( (*it).first ).c_str(); + + if( key == "$DWGCODEPAGE" ) + { + DRW_Variant* var = (*it).second; + m_codePage = ( *var->content.s ); + } + else if( key == "$INSUNITS" ) + { + DRW_Variant* var = (*it).second; + + switch( var->content.i ) + { + case 1: // inches + m_DXF2mm = 25.4; + break; + + case 2: // feet + m_DXF2mm = 304.8; + break; + + case 5: // centimeters + m_DXF2mm = 10.0; + break; + + case 6: // meters + m_DXF2mm = 1000.0; + break; + + case 8: // microinches + m_DXF2mm = 2.54e-5; + break; + + case 9: // mils + m_DXF2mm = 0.0254; + break; + + case 10: // yards + m_DXF2mm = 914.4; + break; + + case 11: // Angstroms + m_DXF2mm = 1.0e-7; + break; + + case 12: // nanometers + m_DXF2mm = 1.0e-6; + break; + + case 13: // micrometers + m_DXF2mm = 1.0e-3; + break; + + case 14: // decimeters + m_DXF2mm = 100.0; + break; + + default: + // use the default of 1.0 for: + // 0: Unspecified Units + // 4: mm + // 3: miles + // 7: kilometers + // 15: decameters + // 16: hectometers + // 17: gigameters + // 18: AU + // 19: lightyears + // 20: parsecs + break; + } + } + } +} + + +wxString DXF2BRD_CONVERTER::toDxfString( const wxString& aStr ) +{ + wxString res; + int j = 0; + + for( unsigned i = 0; i<aStr.length(); ++i ) + { + int c = aStr[i]; + + if( c > 175 || c < 11 ) + { + res.append( aStr.Mid( j, i - j ) ); + j = i; + + switch( c ) + { + case 0x0A: + res += wxT( "\\P" ); + break; + + // diameter: +#ifdef __WINDOWS_ + // windows, as always, is special. + case 0x00D8: +#else + case 0x2205: +#endif + res += wxT( "%%C" ); + break; + + // degree: + case 0x00B0: + res += wxT( "%%D" ); + break; + + // plus/minus + case 0x00B1: + res += wxT( "%%P" ); + break; + + default: + j--; + break; + } + + j++; + } + } + + res.append( aStr.Mid( j ) ); + return res; +} + + +wxString DXF2BRD_CONVERTER::toNativeString( const wxString& aData ) +{ + wxString res; + + // Ignore font tags: + int j = 0; + + for( unsigned i = 0; i < aData.length(); ++i ) + { + if( aData[ i ] == 0x7B ) // is '{' ? + { + if( aData[ i + 1 ] == 0x5c && aData[ i + 2 ] == 0x66 ) // is "\f" ? + { + // found font tag, append parsed part + res.append( aData.Mid( j, i - j ) ); + + // skip to ';' + for( unsigned k = i + 3; k < aData.length(); ++k ) + { + if( aData[ k ] == 0x3B ) + { + i = j = ++k; + break; + } + } + + // add to '}' + for( unsigned k = i; k < aData.length(); ++k ) + { + if( aData[ k ] == 0x7D ) + { + res.append( aData.Mid( i, k - i ) ); + i = j = ++k; + break; + } + } + } + } + } + + res.append( aData.Mid( j ) ); + +#if 1 + wxRegEx regexp; + // Line feed: + regexp.Compile( wxT( "\\\\P" ) ); + regexp.Replace( &res, wxT( "\n" ) ); + + // Space: + regexp.Compile( wxT( "\\\\~" ) ); + regexp.Replace( &res, wxT( " " ) ); + + // diameter: + regexp.Compile( wxT( "%%[cC]" ) ); +#ifdef __WINDOWS__ + // windows, as always, is special. + regexp.Replace( &res, wxChar( 0xD8 ) ); +#else + // Empty_set, diameter is 0x2300 + regexp.Replace( &res, wxChar( 0x2205 ) ); +#endif + + // degree: + regexp.Compile( wxT( "%%[dD]" ) ); + regexp.Replace( &res, wxChar( 0x00B0 ) ); + // plus/minus + regexp.Compile( wxT( "%%[pP]" ) ); + regexp.Replace( &res, wxChar( 0x00B1 ) ); +#endif + + return res; +} + + +void DXF2BRD_CONVERTER::addTextStyle( const DRW_Textstyle& aData ) +{ + // TODO +} + + +void DXF2BRD_CONVERTER::insertLine( const wxRealPoint& aSegStart, + const wxRealPoint& aSegEnd, int aWidth ) +{ + DRAWSEGMENT* segm = ( m_useModuleItems ) ? + static_cast< DRAWSEGMENT* >( new EDGE_MODULE( NULL ) ) : new DRAWSEGMENT; + wxPoint segment_startpoint( Millimeter2iu( aSegStart.x ), Millimeter2iu( aSegStart.y ) ); + wxPoint segment_endpoint( Millimeter2iu( aSegEnd.x ), Millimeter2iu( aSegEnd.y ) ); + + segm->SetLayer( ToLAYER_ID( m_brdLayer ) ); + segm->SetStart( segment_startpoint ); + segm->SetEnd( segment_endpoint ); + segm->SetWidth( aWidth ); + + m_newItemsList.push_back( segm ); + return; +} + + +void DXF2BRD_CONVERTER::insertArc( const wxRealPoint& aSegStart, const wxRealPoint& aSegEnd, + double aBulge, int aWidth ) +{ + DRAWSEGMENT* segm = ( m_useModuleItems ) ? + static_cast< DRAWSEGMENT* >( new EDGE_MODULE( NULL ) ) : new DRAWSEGMENT; + + wxPoint segment_startpoint( Millimeter2iu( aSegStart.x ), Millimeter2iu( aSegStart.y ) ); + wxPoint segment_endpoint( Millimeter2iu( aSegEnd.x ), Millimeter2iu( aSegEnd.y ) ); + + // ensure aBulge represents an angle from +/- ( 0 .. approx 359.8 deg ) + if( aBulge < -2000.0 ) + aBulge = -2000.0; + else if( aBulge > 2000.0 ) + aBulge = 2000.0; + + double ang = 4.0 * atan( aBulge ); + + // reflect the Y values to put everything in a RHCS + wxRealPoint sp( aSegStart.x, -aSegStart.y ); + wxRealPoint ep( aSegEnd.x, -aSegEnd.y ); + // angle from end->start + double offAng = atan2( ep.y - sp.y, ep.x - sp.x ); + // length of subtended segment = 1/2 distance between the 2 points + double d = 0.5 * sqrt( (sp.x - ep.x) * (sp.x - ep.x) + (sp.y - ep.y) * (sp.y - ep.y) ); + // midpoint of the subtended segment + double xm = ( sp.x + ep.x ) * 0.5; + double ym = ( sp.y + ep.y ) * 0.5; + double radius = d / sin( ang * 0.5 ); + + if( radius < 0.0 ) + radius = -radius; + + // calculate the height of the triangle with base d and hypotenuse r + double dh2 = radius * radius - d * d; + + // this should only ever happen due to rounding errors when r == d + if( dh2 < 0.0 ) + dh2 = 0.0; + + double h = sqrt( dh2 ); + + if( ang < 0.0 ) + offAng -= M_PI_2; + else + offAng += M_PI_2; + + // for angles greater than 180 deg we need to flip the + // direction in which the arc center is found relative + // to the midpoint of the subtended segment. + if( ang < -M_PI ) + offAng += M_PI; + else if( ang > M_PI ) + offAng -= M_PI; + + // center point + double cx = h * cos( offAng ) + xm; + double cy = h * sin( offAng ) + ym; + + segm->SetLayer( ToLAYER_ID( m_brdLayer ) ); + segm->SetShape( S_ARC ); + segm->SetCenter( wxPoint( Millimeter2iu( cx ), Millimeter2iu( -cy ) ) ); + + if( ang < 0.0 ) + { + segm->SetArcStart( wxPoint( Millimeter2iu( ep.x ), Millimeter2iu( -ep.y ) ) ); + segm->SetAngle( RAD2DECIDEG( ang ) ); + } + else + { + segm->SetArcStart( wxPoint( Millimeter2iu( sp.x ), Millimeter2iu( -sp.y ) ) ); + segm->SetAngle( RAD2DECIDEG( -ang ) ); + } + + segm->SetWidth( aWidth ); + + m_newItemsList.push_back( segm ); + return; +} diff --git a/pcbnew/import_dxf/dxf2brd_items.h b/pcbnew/import_dxf/dxf2brd_items.h new file mode 100644 index 0000000..7e4f7e9 --- /dev/null +++ b/pcbnew/import_dxf/dxf2brd_items.h @@ -0,0 +1,192 @@ +/**************************************************************************** +** +** This file comes from the LibreCAD project, a 2D CAD program +** +** Copyright (C) 2011 Rallaz, rallazz@gmail.com +** Copyright (C) 2010 R. van Twisk (librecad@rvt.dds.nl) +** +** +** This file may be distributed and/or modified 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, write to the Free Software +** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +** +**********************************************************************/ + + +#ifndef FILTERDXFRW_H +#define FILTERDXFRW_H + +#include "drw_interface.h" +#include "wx/wx.h" +#include <list> + +class BOARD; +class BOARD_ITEM; + +/** + * This format filter class can import and export DXF files. + * It depends on the dxflib library. + * + * @author Rallaz + */ +class DXF2BRD_CONVERTER : public DRW_Interface +{ +private: + std::list<BOARD_ITEM*> m_newItemsList; // The list of new items added to the board + double m_xOffset; // X coord offset for conversion (in mm) + double m_yOffset; // Y coord offset for conversion (in mm) + double m_defaultThickness; // default line thickness for conversion (in mm) + double m_DXF2mm; // The scale factor to convert DXF units to mm + int m_brdLayer; // The board layer to place imported DXF items + int m_version; // the dxf version, not used here + std::string m_codePage; // The code page, not used here + bool m_useModuleItems; // Use module items instead of board items when true. + +public: + DXF2BRD_CONVERTER(); + ~DXF2BRD_CONVERTER(); + + bool IsUsingModuleItems() const { return m_useModuleItems; } + void UseModuleItems( bool aUseModuleItems = true ) { m_useModuleItems = aUseModuleItems; } + + /** + * Set the coordinate offset between the importede 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 + * @param aOffsetX = the X offset in mm + * @param aOffsetY = the Y offset in mm + */ + void SetOffset( double aOffsetX, double aOffsetY ) + { + m_xOffset = aOffsetX; + m_yOffset = aOffsetY; + } + + /** + * Set the layer number to import dxf items. + * the layer should be a techicanl layer, not a copper layer + */ + void SetBrdLayer( int aBrdLayer ) { m_brdLayer = aBrdLayer; } + + /** + * Implementation of the method used for communicate + * with this filter. + * + * @param aFile = the full filename. + */ + bool ImportDxfFile( const wxString& aFile ); + + /** + * @return the list of new BOARD_ITEM + */ + const std::list<BOARD_ITEM*>& GetItemsList() const + { + return m_newItemsList; + } + +private: + // coordinate conversions from dxf to internal units + int mapX( double aDxfCoordX ); + int mapY( double aDxfCoordY ); + int mapDim( double aDxfValue ); + + // Functions to aid in the creation of a LWPolyline + void insertLine( const wxRealPoint& aSegStart, const wxRealPoint& aSegEnd, int aWidth ); + void insertArc( const wxRealPoint& aSegStart, const wxRealPoint& aSegEnd, + double aBulge, int aWidth ); + + // Methods from DRW_CreationInterface: + // They are "call back" fonctions, called when the corresponding object + // is read in dxf file + // Depending of the application, they can do something or not + virtual void addHeader( const DRW_Header* aData ); + virtual void addLType( const DRW_LType& aData ) {} + virtual void addLayer( const DRW_Layer& aData ); + virtual void addDimStyle( const DRW_Dimstyle& aData ) {} + virtual void addBlock( const DRW_Block& aData ) {} + virtual void endBlock() {} + virtual void addPoint( const DRW_Point& aData ) {} + virtual void addLine( const DRW_Line& aData); + virtual void addRay( const DRW_Ray& aData ) {} + virtual void addXline( const DRW_Xline& aData ) {} + virtual void addCircle( const DRW_Circle& aData ); + virtual void addArc( const DRW_Arc& aData ); + virtual void addEllipse( const DRW_Ellipse& aData ) {} + virtual void addLWPolyline( const DRW_LWPolyline& aData ); + virtual void addText( const DRW_Text& aData ); + virtual void addPolyline( const DRW_Polyline& aData ); + virtual void addSpline( const DRW_Spline* aData ) {} + virtual void addKnot( const DRW_Entity&) {} + virtual void addInsert( const DRW_Insert& aData ){} + virtual void addTrace( const DRW_Trace& aData ){} + virtual void addSolid( const DRW_Solid& aData ){} + virtual void addMText( const DRW_MText& aData); + virtual void addDimAlign( const DRW_DimAligned* aData ) {} + virtual void addDimLinear( const DRW_DimLinear* aData ) {} + virtual void addDimRadial( const DRW_DimRadial* aData ) {} + virtual void addDimDiametric( const DRW_DimDiametric* aData ) {} + virtual void addDimAngular( const DRW_DimAngular* aData ) {} + virtual void addDimAngular3P( const DRW_DimAngular3p* aData ) {} + virtual void addDimOrdinate( const DRW_DimOrdinate* aData ) {} + virtual void addLeader( const DRW_Leader* aData ) {} + virtual void addHatch( const DRW_Hatch* aData ) {} + virtual void addImage( const DRW_Image* aData ) {} + virtual void linkImage( const DRW_ImageDef* aData ) {} + + virtual void add3dFace( const DRW_3Dface& aData ) {} + virtual void addComment( const char*) {} + + virtual void addVport( const DRW_Vport& aData ) {} + + virtual void addTextStyle( const DRW_Textstyle& aData ); + + virtual void addViewport( const DRW_Viewport& aData ) {} + + virtual void setBlock( const int aHandle ) {} + + /** + * Converts a native unicode string into a DXF encoded string. + * + * DXF endoding includes the following special sequences: + * - %%%c for a diameter sign + * - %%%d for a degree sign + * - %%%p for a plus/minus sign + */ + static wxString toDxfString( const wxString& aStr ); + + /** + * Converts a DXF encoded string into a native Unicode string. + */ + static wxString toNativeString( const wxString& aData ); + + // These functions are not used in Kicad. + // But because they are virtual pure in DRW_Interface, they should be defined + virtual void writeTextstyles() {} + virtual void writeVports() {} + virtual void writeHeader( DRW_Header& aData ) {} + virtual void writeEntities() {} + virtual void writeLTypes() {} + virtual void writeLayers() {} + virtual void writeBlockRecords() {} + virtual void writeBlocks() {} + virtual void writeDimstyles() {} + + void writeLine(); + void writeMtext(); + + virtual void addAppId( const DRW_AppId& data ) {} + virtual void writeAppId() {} +}; + +#endif // FILTERDXFRW_H diff --git a/pcbnew/import_dxf/examples/basic_ellipses.dxf b/pcbnew/import_dxf/examples/basic_ellipses.dxf new file mode 100644 index 0000000..8b0bb14 --- /dev/null +++ b/pcbnew/import_dxf/examples/basic_ellipses.dxf @@ -0,0 +1,2992 @@ +999 +dxfrw 0.5.13 +0 +SECTION +2 +HEADER +9 +$ACADVER +1 +AC1009 +9 +$DWGCODEPAGE +3 +ANSI_1252 +9 +$INSBASE +10 +0 +20 +0 +30 +0 +9 +$EXTMIN +10 +0 +20 +0 +30 +0 +9 +$EXTMAX +10 +286.021046008 +20 +141.572897408 +30 +0 +9 +$LIMMIN +10 +0 +20 +0 +9 +$LIMMAX +10 +420 +20 +297 +9 +$ORTHOMODE +70 +0 +9 +$LTSCALE +40 +1 +9 +$TEXTSTYLE +7 +STANDARD +9 +$CLAYER +8 +0 +9 +$DIMASZ +40 +2.5 +9 +$DIMLFAC +40 +1 +9 +$DIMSCALE +40 +1 +9 +$DIMEXO +40 +0.625 +9 +$DIMEXE +40 +1.25 +9 +$DIMTXT +40 +2.5 +9 +$DIMTSZ +40 +0 +9 +$DIMUNIT +70 +2 +9 +$DIMSTYLE +2 +STANDARD +9 +$DIMGAP +40 +0.625 +9 +$DIMTIH +70 +0 +9 +$LUNITS +70 +2 +9 +$LUPREC +70 +4 +9 +$AUNITS +70 +0 +9 +$AUPREC +70 +2 +9 +$SNAPSTYLE +70 +0 +9 +$PLIMMIN +10 +0 +20 +0 +9 +$PLIMMAX +10 +841 +20 +594 +0 +ENDSEC +0 +SECTION +2 +CLASSES +0 +ENDSEC +0 +SECTION +2 +TABLES +0 +TABLE +2 +VPORT +70 +1 +0 +VPORT +2 +*ACTIVE +70 +0 +10 +0 +20 +0 +11 +1 +21 +1 +12 +190.125 +22 +76.75 +13 +0 +23 +0 +14 +10 +24 +10 +15 +10 +25 +10 +16 +0 +26 +0 +36 +1 +17 +0 +27 +0 +37 +0 +40 +166 +41 +2.36596385542 +42 +50 +43 +0 +44 +0 +50 +0 +51 +0 +71 +0 +72 +100 +73 +1 +74 +3 +75 +0 +76 +1 +77 +0 +78 +0 +0 +ENDTAB +0 +TABLE +2 +LTYPE +70 +4 +0 +LTYPE +2 +BYBLOCK +70 +0 +3 + +72 +65 +73 +0 +40 +0 +0 +LTYPE +2 +BYLAYER +70 +0 +3 + +72 +65 +73 +0 +40 +0 +0 +LTYPE +2 +CONTINUOUS +70 +0 +3 +Solid line +72 +65 +73 +0 +40 +0 +0 +LTYPE +2 +DOT +70 +0 +3 +Dot . . . . . . . . . . . . . . . . . . . . . . +72 +65 +73 +2 +40 +6.35 +49 +0 +49 +-6.35 +0 +LTYPE +2 +DOT2 +70 +0 +3 +Dot (.5x) ..................................... +72 +65 +73 +2 +40 +3.175 +49 +0 +49 +-3.175 +0 +LTYPE +2 +DOTX2 +70 +0 +3 +Dot (2x) . . . . . . . . . . . . . +72 +65 +73 +2 +40 +12.7 +49 +0 +49 +-12.7 +0 +LTYPE +2 +DASHED +70 +0 +3 +Dot . . . . . . . . . . . . . . . . . . . . . . +72 +65 +73 +2 +40 +19.05 +49 +12.7 +49 +-6.35 +0 +LTYPE +2 +DASHED2 +70 +0 +3 +Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +72 +65 +73 +2 +40 +9.525 +49 +6.35 +49 +-3.175 +0 +LTYPE +2 +DASHEDX2 +70 +0 +3 +Dashed (2x) ____ ____ ____ ____ ____ ___ +72 +65 +73 +2 +40 +38.1 +49 +25.4 +49 +-12.7 +0 +LTYPE +2 +DASHDOT +70 +0 +3 +Dash dot __ . __ . __ . __ . __ . __ . __ . __ +72 +65 +73 +4 +40 +25.4 +49 +12.7 +49 +-6.35 +49 +0 +49 +-6.35 +0 +LTYPE +2 +DASHDOT2 +70 +0 +3 +Dash dot (.5x) _._._._._._._._._._._._._._._. +72 +65 +73 +4 +40 +12.7 +49 +6.35 +49 +-3.175 +49 +0 +49 +-3.175 +0 +LTYPE +2 +DASHDOTX2 +70 +0 +3 +Dash dot (2x) ____ . ____ . ____ . ___ +72 +65 +73 +4 +40 +50.8 +49 +25.4 +49 +-12.7 +49 +0 +49 +-12.7 +0 +LTYPE +2 +DIVIDE +70 +0 +3 +Divide ____ . . ____ . . ____ . . ____ . . ____ +72 +65 +73 +6 +40 +31.75 +49 +12.7 +49 +-6.35 +49 +0 +49 +-6.35 +49 +0 +49 +-6.35 +0 +LTYPE +2 +DIVIDE2 +70 +0 +3 +Divide (.5x) __..__..__..__..__..__..__..__.._ +72 +65 +73 +6 +40 +15.875 +49 +6.35 +49 +-3.175 +49 +0 +49 +-3.175 +49 +0 +49 +-3.175 +0 +LTYPE +2 +DIVIDEX2 +70 +0 +3 +Divide (2x) ________ . . ________ . . _ +72 +65 +73 +6 +40 +63.5 +49 +25.4 +49 +-12.7 +49 +0 +49 +-12.7 +49 +0 +49 +-12.7 +0 +LTYPE +2 +BORDER +70 +0 +3 +Border __ __ . __ __ . __ __ . __ __ . __ __ . +72 +65 +73 +6 +40 +44.45 +49 +12.7 +49 +-6.35 +49 +12.7 +49 +-6.35 +49 +0 +49 +-6.35 +0 +LTYPE +2 +BORDER2 +70 +0 +3 +Border (.5x) __.__.__.__.__.__.__.__.__.__.__. +72 +65 +73 +6 +40 +22.225 +49 +6.35 +49 +-3.175 +49 +6.35 +49 +-3.175 +49 +0 +49 +-3.175 +0 +LTYPE +2 +BORDERX2 +70 +0 +3 +Border (2x) ____ ____ . ____ ____ . ___ +72 +65 +73 +6 +40 +88.9 +49 +25.4 +49 +-12.7 +49 +25.4 +49 +-12.7 +49 +0 +49 +-12.7 +0 +LTYPE +2 +CENTER +70 +0 +3 +Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ +72 +65 +73 +4 +40 +50.8 +49 +31.75 +49 +-6.35 +49 +6.35 +49 +-6.35 +0 +LTYPE +2 +CENTER2 +70 +0 +3 +Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ +72 +65 +73 +4 +40 +28.575 +49 +19.05 +49 +-3.175 +49 +3.175 +49 +-3.175 +0 +LTYPE +2 +CENTERX2 +70 +0 +3 +Center (2x) ________ __ ________ __ _____ +72 +65 +73 +4 +40 +101.6 +49 +63.5 +49 +-12.7 +49 +12.7 +49 +-12.7 +0 +ENDTAB +0 +TABLE +2 +LAYER +70 +1 +0 +LAYER +2 +0 +70 +0 +62 +7 +6 +CONTINUOUS +0 +ENDTAB +0 +TABLE +2 +STYLE +70 +3 +0 +STYLE +2 +STANDARD +70 +0 +40 +0 +41 +1 +50 +0 +71 +0 +42 +1 +3 +TXT +4 + +0 +ENDTAB +0 +TABLE +2 +VIEW +70 +0 +0 +ENDTAB +0 +TABLE +2 +UCS +70 +0 +0 +ENDTAB +0 +TABLE +2 +APPID +70 +1 +0 +APPID +2 +ACAD +70 +0 +0 +APPID +2 +LIBRECAD +70 +0 +0 +ENDTAB +0 +TABLE +2 +DIMSTYLE +70 +1 +0 +DIMSTYLE +2 +STANDARD +70 +0 +3 + +4 + +5 + +6 + +7 + +40 +1 +41 +2.5 +42 +0.625 +43 +0.38 +44 +1.25 +45 +0 +46 +0 +47 +0 +48 +0 +140 +2.5 +141 +0.09 +142 +0 +143 +25.4 +144 +1 +145 +0 +146 +1 +147 +0.625 +71 +0 +72 +0 +73 +0 +74 +1 +75 +0 +76 +0 +77 +0 +78 +0 +170 +0 +171 +2 +172 +0 +173 +0 +174 +0 +175 +0 +176 +0 +177 +0 +178 +0 +0 +ENDTAB +0 +ENDSEC +0 +SECTION +2 +BLOCKS +0 +BLOCK +8 +0 +2 +$MODEL_SPACE +70 +0 +10 +0 +20 +0 +30 +0 +3 +$MODEL_SPACE +1 + +0 +ENDBLK +8 +0 +0 +BLOCK +8 +0 +2 +$PAPER_SPACE +70 +0 +10 +0 +20 +0 +30 +0 +3 +$PAPER_SPACE +1 + +0 +ENDBLK +8 +0 +0 +ENDSEC +0 +SECTION +2 +ENTITIES +0 +POLYLINE +5 +31 +8 +0 +6 +BYLAYER +62 +256 +66 +1 +10 +0 +20 +0 +30 +0 +70 +1 +0 +VERTEX +5 +32 +8 +0 +6 +BYLAYER +62 +256 +10 +114.5 +20 +76.5 +30 +0 +0 +VERTEX +5 +33 +8 +0 +6 +BYLAYER +62 +256 +10 +115.06685415 +20 +74.8221771035 +30 +0 +0 +VERTEX +5 +34 +8 +0 +6 +BYLAYER +62 +256 +10 +115.838319688 +20 +73.2044075157 +30 +0 +0 +VERTEX +5 +35 +8 +0 +6 +BYLAYER +62 +256 +10 +116.812538085 +20 +71.6505885853 +30 +0 +0 +VERTEX +5 +36 +8 +0 +6 +BYLAYER +62 +256 +10 +117.987162364 +20 +70.1644635983 +30 +0 +0 +VERTEX +5 +37 +8 +0 +6 +BYLAYER +62 +256 +10 +119.359362753 +20 +68.7496127599 +30 +0 +0 +VERTEX +5 +38 +8 +0 +6 +BYLAYER +62 +256 +10 +120.9258335 +20 +67.4094445696 +30 +0 +0 +VERTEX +5 +39 +8 +0 +6 +BYLAYER +62 +256 +10 +122.68280084 +20 +66.14718761 +30 +0 +0 +VERTEX +5 +3A +8 +0 +6 +BYLAYER +62 +256 +10 +124.626032085 +20 +64.9658827688 +30 +0 +0 +VERTEX +5 +3B +8 +0 +6 +BYLAYER +62 +256 +10 +126.750845821 +20 +63.8683759127 +30 +0 +0 +VERTEX +5 +3C +8 +0 +6 +BYLAYER +62 +256 +10 +129.052123185 +20 +62.8573110318 +30 +0 +0 +VERTEX +5 +3D +8 +0 +6 +BYLAYER +62 +256 +10 +131.524320199 +20 +61.9351238702 +30 +0 +0 +VERTEX +5 +3E +8 +0 +6 +BYLAYER +62 +256 +10 +134.161481123 +20 +61.1040360573 +30 +0 +0 +VERTEX +5 +3F +8 +0 +6 +BYLAYER +62 +256 +10 +136.957252806 +20 +60.3660497565 +30 +0 +0 +VERTEX +5 +40 +8 +0 +6 +BYLAYER +62 +256 +10 +139.904899989 +20 +59.7229428415 +30 +0 +0 +VERTEX +5 +41 +8 +0 +6 +BYLAYER +62 +256 +10 +142.997321531 +20 +59.1762646132 +30 +0 +0 +VERTEX +5 +42 +8 +0 +6 +BYLAYER +62 +256 +10 +146.227067519 +20 +58.7273320672 +30 +0 +0 +VERTEX +5 +43 +8 +0 +6 +BYLAYER +62 +256 +10 +149.586357211 +20 +58.3772267214 +30 +0 +0 +VERTEX +5 +44 +8 +0 +6 +BYLAYER +62 +256 +10 +153.067097784 +20 +58.1267920103 +30 +0 +0 +VERTEX +5 +45 +8 +0 +6 +BYLAYER +62 +256 +10 +156.660903829 +20 +57.9766312531 +30 +0 +0 +VERTEX +5 +46 +8 +0 +6 +BYLAYER +62 +256 +10 +160.359117554 +20 +57.9271062 +30 +0 +0 +VERTEX +5 +47 +8 +0 +6 +BYLAYER +62 +256 +10 +164.152829636 +20 +57.9783361613 +30 +0 +0 +VERTEX +5 +48 +8 +0 +6 +BYLAYER +62 +256 +10 +168.032900691 +20 +58.1301977196 +30 +0 +0 +VERTEX +5 +49 +8 +0 +6 +BYLAYER +62 +256 +10 +171.989983289 +20 +58.3823250271 +30 +0 +0 +VERTEX +5 +4A +8 +0 +6 +BYLAYER +62 +256 +10 +176.01454447 +20 +58.734110687 +30 +0 +0 +VERTEX +5 +4B +8 +0 +6 +BYLAYER +62 +256 +10 +180.096888714 +20 +59.1847072167 +30 +0 +0 +VERTEX +5 +4C +8 +0 +6 +BYLAYER +62 +256 +10 +184.227181297 +20 +59.7330290899 +30 +0 +0 +VERTEX +5 +4D +8 +0 +6 +BYLAYER +62 +256 +10 +188.395471982 +20 +60.3777553511 +30 +0 +0 +VERTEX +5 +4E +8 +0 +6 +BYLAYER +62 +256 +10 +192.591718991 +20 +61.1173327983 +30 +0 +0 +VERTEX +5 +4F +8 +0 +6 +BYLAYER +62 +256 +10 +196.805813198 +20 +61.9499797245 +30 +0 +0 +VERTEX +5 +50 +8 +0 +6 +BYLAYER +62 +256 +10 +201.027602481 +20 +62.8736902105 +30 +0 +0 +VERTEX +5 +51 +8 +0 +6 +BYLAYER +62 +256 +10 +205.246916179 +20 +63.8862389568 +30 +0 +0 +VERTEX +5 +52 +8 +0 +6 +BYLAYER +62 +256 +10 +209.453589597 +20 +64.9851866447 +30 +0 +0 +VERTEX +5 +53 +8 +0 +6 +BYLAYER +62 +256 +10 +213.637488489 +20 +66.167885813 +30 +0 +0 +VERTEX +5 +54 +8 +0 +6 +BYLAYER +62 +256 +10 +217.788533477 +20 +67.4314872359 +30 +0 +0 +VERTEX +5 +55 +8 +0 +6 +BYLAYER +62 +256 +10 +221.89672433 +20 +68.7729467867 +30 +0 +0 +VERTEX +5 +56 +8 +0 +6 +BYLAYER +62 +256 +10 +225.952164056 +20 +70.189032772 +30 +0 +0 +VERTEX +5 +57 +8 +0 +6 +BYLAYER +62 +256 +10 +229.945082745 +20 +71.6763337166 +30 +0 +0 +VERTEX +5 +58 +8 +0 +6 +BYLAYER +62 +256 +10 +233.865861108 +20 +73.2312665823 +30 +0 +0 +VERTEX +5 +59 +8 +0 +6 +BYLAYER +62 +256 +10 +237.705053644 +20 +74.8500853995 +30 +0 +0 +VERTEX +5 +5A +8 +0 +6 +BYLAYER +62 +256 +10 +241.453411404 +20 +76.5288902919 +30 +0 +0 +VERTEX +5 +5B +8 +0 +6 +BYLAYER +62 +256 +10 +245.101904265 +20 +78.2636368716 +30 +0 +0 +VERTEX +5 +5C +8 +0 +6 +BYLAYER +62 +256 +10 +248.641742688 +20 +80.0501459821 +30 +0 +0 +VERTEX +5 +5D +8 +0 +6 +BYLAYER +62 +256 +10 +252.064398893 +20 +81.8841137663 +30 +0 +0 +VERTEX +5 +5E +8 +0 +6 +BYLAYER +62 +256 +10 +255.3616274 +20 +83.7611220354 +30 +0 +0 +VERTEX +5 +5F +8 +0 +6 +BYLAYER +62 +256 +10 +258.525484898 +20 +85.6766489119 +30 +0 +0 +VERTEX +5 +60 +8 +0 +6 +BYLAYER +62 +256 +10 +261.548349376 +20 +87.6260797239 +30 +0 +0 +VERTEX +5 +61 +8 +0 +6 +BYLAYER +62 +256 +10 +264.42293849 +20 +89.6047181218 +30 +0 +0 +VERTEX +5 +62 +8 +0 +6 +BYLAYER +62 +256 +10 +267.142327102 +20 +91.6077973924 +30 +0 +0 +VERTEX +5 +63 +8 +0 +6 +BYLAYER +62 +256 +10 +269.699963967 +20 +93.6304919422 +30 +0 +0 +VERTEX +5 +64 +8 +0 +6 +BYLAYER +62 +256 +10 +272.089687514 +20 +95.6679289229 +30 +0 +0 +VERTEX +5 +65 +8 +0 +6 +BYLAYER +62 +256 +10 +274.305740689 +20 +97.7151999704 +30 +0 +0 +VERTEX +5 +66 +8 +0 +6 +BYLAYER +62 +256 +10 +276.342784827 +20 +99.7673730293 +30 +0 +0 +VERTEX +5 +67 +8 +0 +6 +BYLAYER +62 +256 +10 +278.195912509 +20 +101.819504235 +30 +0 +0 +VERTEX +5 +68 +8 +0 +6 +BYLAYER +62 +256 +10 +279.860659389 +20 +103.866649824 +30 +0 +0 +VERTEX +5 +69 +8 +0 +6 +BYLAYER +62 +256 +10 +281.333014945 +20 +105.903878043 +30 +0 +0 +VERTEX +5 +6A +8 +0 +6 +BYLAYER +62 +256 +10 +282.609432145 +20 +107.926281031 +30 +0 +0 +VERTEX +5 +6B +8 +0 +6 +BYLAYER +62 +256 +10 +283.686835986 +20 +109.928986641 +30 +0 +0 +VERTEX +5 +6C +8 +0 +6 +BYLAYER +62 +256 +10 +284.56263091 +20 +111.907170181 +30 +0 +0 +VERTEX +5 +6D +8 +0 +6 +BYLAYER +62 +256 +10 +285.234707049 +20 +113.856066033 +30 +0 +0 +VERTEX +5 +6E +8 +0 +6 +BYLAYER +62 +256 +10 +285.701445313 +20 +115.770979137 +30 +0 +0 +VERTEX +5 +6F +8 +0 +6 +BYLAYER +62 +256 +10 +285.961721289 +20 +117.647296299 +30 +0 +0 +VERTEX +5 +70 +8 +0 +6 +BYLAYER +62 +256 +10 +286.014907949 +20 +119.480497306 +30 +0 +0 +VERTEX +5 +71 +8 +0 +6 +BYLAYER +62 +256 +10 +285.860877161 +20 +121.266165817 +30 +0 +0 +VERTEX +5 +72 +8 +0 +6 +BYLAYER +62 +256 +10 +285.5 +20 +123 +30 +0 +0 +VERTEX +5 +73 +8 +0 +6 +BYLAYER +62 +256 +10 +284.93314585 +20 +124.677822897 +30 +0 +0 +VERTEX +5 +74 +8 +0 +6 +BYLAYER +62 +256 +10 +284.161680312 +20 +126.295592484 +30 +0 +0 +VERTEX +5 +75 +8 +0 +6 +BYLAYER +62 +256 +10 +283.187461915 +20 +127.849411415 +30 +0 +0 +VERTEX +5 +76 +8 +0 +6 +BYLAYER +62 +256 +10 +282.012837636 +20 +129.335536402 +30 +0 +0 +VERTEX +5 +77 +8 +0 +6 +BYLAYER +62 +256 +10 +280.640637247 +20 +130.75038724 +30 +0 +0 +VERTEX +5 +78 +8 +0 +6 +BYLAYER +62 +256 +10 +279.0741665 +20 +132.09055543 +30 +0 +0 +VERTEX +5 +79 +8 +0 +6 +BYLAYER +62 +256 +10 +277.31719916 +20 +133.35281239 +30 +0 +0 +VERTEX +5 +7A +8 +0 +6 +BYLAYER +62 +256 +10 +275.373967915 +20 +134.534117231 +30 +0 +0 +VERTEX +5 +7B +8 +0 +6 +BYLAYER +62 +256 +10 +273.249154179 +20 +135.631624087 +30 +0 +0 +VERTEX +5 +7C +8 +0 +6 +BYLAYER +62 +256 +10 +270.947876815 +20 +136.642688968 +30 +0 +0 +VERTEX +5 +7D +8 +0 +6 +BYLAYER +62 +256 +10 +268.475679801 +20 +137.56487613 +30 +0 +0 +VERTEX +5 +7E +8 +0 +6 +BYLAYER +62 +256 +10 +265.838518877 +20 +138.395963943 +30 +0 +0 +VERTEX +5 +7F +8 +0 +6 +BYLAYER +62 +256 +10 +263.042747194 +20 +139.133950243 +30 +0 +0 +VERTEX +5 +80 +8 +0 +6 +BYLAYER +62 +256 +10 +260.095100011 +20 +139.777057158 +30 +0 +0 +VERTEX +5 +81 +8 +0 +6 +BYLAYER +62 +256 +10 +257.002678469 +20 +140.323735387 +30 +0 +0 +VERTEX +5 +82 +8 +0 +6 +BYLAYER +62 +256 +10 +253.772932481 +20 +140.772667933 +30 +0 +0 +VERTEX +5 +83 +8 +0 +6 +BYLAYER +62 +256 +10 +250.413642789 +20 +141.122773279 +30 +0 +0 +VERTEX +5 +84 +8 +0 +6 +BYLAYER +62 +256 +10 +246.932902216 +20 +141.37320799 +30 +0 +0 +VERTEX +5 +85 +8 +0 +6 +BYLAYER +62 +256 +10 +243.339096171 +20 +141.523368747 +30 +0 +0 +VERTEX +5 +86 +8 +0 +6 +BYLAYER +62 +256 +10 +239.640882446 +20 +141.5728938 +30 +0 +0 +VERTEX +5 +87 +8 +0 +6 +BYLAYER +62 +256 +10 +235.847170364 +20 +141.521663839 +30 +0 +0 +VERTEX +5 +88 +8 +0 +6 +BYLAYER +62 +256 +10 +231.967099309 +20 +141.36980228 +30 +0 +0 +VERTEX +5 +89 +8 +0 +6 +BYLAYER +62 +256 +10 +228.010016711 +20 +141.117674973 +30 +0 +0 +VERTEX +5 +8A +8 +0 +6 +BYLAYER +62 +256 +10 +223.98545553 +20 +140.765889313 +30 +0 +0 +VERTEX +5 +8B +8 +0 +6 +BYLAYER +62 +256 +10 +219.903111286 +20 +140.315292783 +30 +0 +0 +VERTEX +5 +8C +8 +0 +6 +BYLAYER +62 +256 +10 +215.772818703 +20 +139.76697091 +30 +0 +0 +VERTEX +5 +8D +8 +0 +6 +BYLAYER +62 +256 +10 +211.604528018 +20 +139.122244649 +30 +0 +0 +VERTEX +5 +8E +8 +0 +6 +BYLAYER +62 +256 +10 +207.408281009 +20 +138.382667202 +30 +0 +0 +VERTEX +5 +8F +8 +0 +6 +BYLAYER +62 +256 +10 +203.194186802 +20 +137.550020275 +30 +0 +0 +VERTEX +5 +90 +8 +0 +6 +BYLAYER +62 +256 +10 +198.972397519 +20 +136.626309789 +30 +0 +0 +VERTEX +5 +91 +8 +0 +6 +BYLAYER +62 +256 +10 +194.753083821 +20 +135.613761043 +30 +0 +0 +VERTEX +5 +92 +8 +0 +6 +BYLAYER +62 +256 +10 +190.546410403 +20 +134.514813355 +30 +0 +0 +VERTEX +5 +93 +8 +0 +6 +BYLAYER +62 +256 +10 +186.362511511 +20 +133.332114187 +30 +0 +0 +VERTEX +5 +94 +8 +0 +6 +BYLAYER +62 +256 +10 +182.211466523 +20 +132.068512764 +30 +0 +0 +VERTEX +5 +95 +8 +0 +6 +BYLAYER +62 +256 +10 +178.10327567 +20 +130.727053213 +30 +0 +0 +VERTEX +5 +96 +8 +0 +6 +BYLAYER +62 +256 +10 +174.047835944 +20 +129.310967228 +30 +0 +0 +VERTEX +5 +97 +8 +0 +6 +BYLAYER +62 +256 +10 +170.054917255 +20 +127.823666283 +30 +0 +0 +VERTEX +5 +98 +8 +0 +6 +BYLAYER +62 +256 +10 +166.134138892 +20 +126.268733418 +30 +0 +0 +VERTEX +5 +99 +8 +0 +6 +BYLAYER +62 +256 +10 +162.294946356 +20 +124.649914601 +30 +0 +0 +VERTEX +5 +9A +8 +0 +6 +BYLAYER +62 +256 +10 +158.546588596 +20 +122.971109708 +30 +0 +0 +VERTEX +5 +9B +8 +0 +6 +BYLAYER +62 +256 +10 +154.898095735 +20 +121.236363128 +30 +0 +0 +VERTEX +5 +9C +8 +0 +6 +BYLAYER +62 +256 +10 +151.358257312 +20 +119.449854018 +30 +0 +0 +VERTEX +5 +9D +8 +0 +6 +BYLAYER +62 +256 +10 +147.935601107 +20 +117.615886234 +30 +0 +0 +VERTEX +5 +9E +8 +0 +6 +BYLAYER +62 +256 +10 +144.6383726 +20 +115.738877965 +30 +0 +0 +VERTEX +5 +9F +8 +0 +6 +BYLAYER +62 +256 +10 +141.474515102 +20 +113.823351088 +30 +0 +0 +VERTEX +5 +A0 +8 +0 +6 +BYLAYER +62 +256 +10 +138.451650624 +20 +111.873920276 +30 +0 +0 +VERTEX +5 +A1 +8 +0 +6 +BYLAYER +62 +256 +10 +135.57706151 +20 +109.895281878 +30 +0 +0 +VERTEX +5 +A2 +8 +0 +6 +BYLAYER +62 +256 +10 +132.857672898 +20 +107.892202608 +30 +0 +0 +VERTEX +5 +A3 +8 +0 +6 +BYLAYER +62 +256 +10 +130.300036033 +20 +105.869508058 +30 +0 +0 +VERTEX +5 +A4 +8 +0 +6 +BYLAYER +62 +256 +10 +127.910312486 +20 +103.832071077 +30 +0 +0 +VERTEX +5 +A5 +8 +0 +6 +BYLAYER +62 +256 +10 +125.694259311 +20 +101.78480003 +30 +0 +0 +VERTEX +5 +A6 +8 +0 +6 +BYLAYER +62 +256 +10 +123.657215173 +20 +99.7326269707 +30 +0 +0 +VERTEX +5 +A7 +8 +0 +6 +BYLAYER +62 +256 +10 +121.804087491 +20 +97.6804957648 +30 +0 +0 +VERTEX +5 +A8 +8 +0 +6 +BYLAYER +62 +256 +10 +120.139340611 +20 +95.633350176 +30 +0 +0 +VERTEX +5 +A9 +8 +0 +6 +BYLAYER +62 +256 +10 +118.666985055 +20 +93.5961219571 +30 +0 +0 +VERTEX +5 +AA +8 +0 +6 +BYLAYER +62 +256 +10 +117.390567855 +20 +91.5737189695 +30 +0 +0 +VERTEX +5 +AB +8 +0 +6 +BYLAYER +62 +256 +10 +116.313164014 +20 +89.571013359 +30 +0 +0 +VERTEX +5 +AC +8 +0 +6 +BYLAYER +62 +256 +10 +115.43736909 +20 +87.5928298189 +30 +0 +0 +VERTEX +5 +AD +8 +0 +6 +BYLAYER +62 +256 +10 +114.765292951 +20 +85.6439339666 +30 +0 +0 +VERTEX +5 +AE +8 +0 +6 +BYLAYER +62 +256 +10 +114.298554687 +20 +83.7290208629 +30 +0 +0 +VERTEX +5 +AF +8 +0 +6 +BYLAYER +62 +256 +10 +114.038278711 +20 +81.8527037013 +30 +0 +0 +VERTEX +5 +B0 +8 +0 +6 +BYLAYER +62 +256 +10 +113.985092051 +20 +80.019502694 +30 +0 +0 +VERTEX +5 +B1 +8 +0 +6 +BYLAYER +62 +256 +10 +114.139122839 +20 +78.233834183 +30 +0 +0 +SEQEND +5 +B2 +8 +0 +6 +BYLAYER +62 +256 +0 +ENDSEC +0 +EOF diff --git a/pcbnew/import_dxf/examples/test_outlines.dxf b/pcbnew/import_dxf/examples/test_outlines.dxf new file mode 100644 index 0000000..c5448b1 --- /dev/null +++ b/pcbnew/import_dxf/examples/test_outlines.dxf @@ -0,0 +1,7264 @@ +999 +dxfrw 0.5.10 +0 +SECTION +2 +HEADER +9 +$ACADVER +1 +AC1021 +9 +$HANDSEED +5 +20000 +9 +$DWGCODEPAGE +3 +ANSI_1252 +9 +$INSBASE +10 +0 +20 +0 +30 +0 +9 +$EXTMIN +10 +8.01510349296 +20 +22.3703927791 +30 +0 +9 +$EXTMAX +10 +160.415103493 +20 +173.677807569 +30 +0 +9 +$LIMMIN +10 +0 +20 +0 +9 +$LIMMAX +10 +210 +20 +297 +9 +$ORTHOMODE +70 +0 +9 +$LTSCALE +40 +1 +9 +$TEXTSTYLE +7 +Standard +9 +$DIMASZ +40 +1.8 +9 +$DIMSCALE +40 +1 +9 +$DIMEXO +40 +0.0625 +9 +$DIMEXE +40 +0.18 +9 +$DIMTXT +40 +0.25 +9 +$DIMTSZ +40 +0 +9 +$DIMAUNIT +70 +0 +9 +$DIMADEC +70 +0 +9 +$DIMLUNIT +70 +2 +9 +$DIMSTYLE +2 +Standard +9 +$DIMGAP +40 +0.09 +9 +$DIMTIH +70 +1 +9 +$LUNITS +70 +2 +9 +$LUPREC +70 +4 +9 +$AUNITS +70 +0 +9 +$AUPREC +70 +0 +9 +$SPLINESEGS +70 +8 +9 +$GRIDMODE +70 +0 +9 +$SNAPSTYLE +70 +0 +9 +$PINSBASE +10 +0 +20 +0 +30 +0 +9 +$PLIMMIN +10 +0 +20 +0 +9 +$PLIMMAX +10 +210 +20 +297 +9 +$INSUNITS +70 +4 +9 +$PSVPSCALE +40 +0 +0 +ENDSEC +0 +SECTION +2 +CLASSES +0 +ENDSEC +0 +SECTION +2 +TABLES +0 +TABLE +2 +VPORT +5 +8 +330 +0 +100 +AcDbSymbolTable +70 +1 +0 +VPORT +5 +31 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbViewportTableRecord +2 +*ACTIVE +70 +0 +10 +0 +20 +0 +11 +1 +21 +1 +12 +103.477837818 +22 +82.10741479 +13 +0 +23 +0 +14 +10 +24 +10 +15 +10 +25 +10 +16 +0 +26 +0 +36 +1 +17 +0 +27 +0 +37 +0 +40 +368.920987002 +41 +0.976829268293 +42 +50 +43 +0 +44 +0 +50 +0 +51 +0 +71 +0 +72 +100 +73 +1 +74 +3 +75 +0 +76 +0 +77 +0 +78 +0 +281 +0 +65 +1 +110 +0 +120 +0 +130 +0 +111 +1 +121 +0 +131 +0 +112 +0 +122 +1 +132 +0 +79 +0 +146 +0 +348 +10020 +60 +7 +61 +5 +292 +1 +282 +1 +141 +0 +142 +0 +63 +250 +421 +3358443 +0 +ENDTAB +0 +TABLE +2 +LTYPE +5 +5 +330 +0 +100 +AcDbSymbolTable +70 +4 +0 +LTYPE +5 +14 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord +2 +ByBlock +70 +0 +3 + +72 +65 +73 +0 +40 +0 +0 +LTYPE +5 +15 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord +2 +ByLayer +70 +0 +3 + +72 +65 +73 +0 +40 +0 +0 +LTYPE +5 +16 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord +2 +Continuous +70 +0 +3 +Solid line +72 +65 +73 +0 +40 +0 +0 +LTYPE +5 +32 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord +2 +DOT +70 +0 +3 +Dot . . . . . . . . . . . . . . . . . . . . . . +72 +65 +73 +2 +40 +6.35 +49 +0 +74 +0 +49 +-6.35 +74 +0 +0 +LTYPE +5 +33 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord +2 +DOT2 +70 +0 +3 +Dot (.5x) ..................................... +72 +65 +73 +2 +40 +3.175 +49 +0 +74 +0 +49 +-3.175 +74 +0 +0 +LTYPE +5 +34 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord +2 +DOTX2 +70 +0 +3 +Dot (2x) . . . . . . . . . . . . . +72 +65 +73 +2 +40 +12.7 +49 +0 +74 +0 +49 +-12.7 +74 +0 +0 +LTYPE +5 +35 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord +2 +DASHED +70 +0 +3 +Dot . . . . . . . . . . . . . . . . . . . . . . +72 +65 +73 +2 +40 +19.05 +49 +12.7 +74 +0 +49 +-6.35 +74 +0 +0 +LTYPE +5 +36 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord +2 +DASHED2 +70 +0 +3 +Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +72 +65 +73 +2 +40 +9.525 +49 +6.35 +74 +0 +49 +-3.175 +74 +0 +0 +LTYPE +5 +37 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord +2 +DASHEDX2 +70 +0 +3 +Dashed (2x) ____ ____ ____ ____ ____ ___ +72 +65 +73 +2 +40 +38.1 +49 +25.4 +74 +0 +49 +-12.7 +74 +0 +0 +LTYPE +5 +38 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord +2 +DASHDOT +70 +0 +3 +Dash dot __ . __ . __ . __ . __ . __ . __ . __ +72 +65 +73 +4 +40 +25.4 +49 +12.7 +74 +0 +49 +-6.35 +74 +0 +49 +0 +74 +0 +49 +-6.35 +74 +0 +0 +LTYPE +5 +39 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord +2 +DASHDOT2 +70 +0 +3 +Dash dot (.5x) _._._._._._._._._._._._._._._. +72 +65 +73 +4 +40 +12.7 +49 +6.35 +74 +0 +49 +-3.175 +74 +0 +49 +0 +74 +0 +49 +-3.175 +74 +0 +0 +LTYPE +5 +3A +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord +2 +DASHDOTX2 +70 +0 +3 +Dash dot (2x) ____ . ____ . ____ . ___ +72 +65 +73 +4 +40 +50.8 +49 +25.4 +74 +0 +49 +-12.7 +74 +0 +49 +0 +74 +0 +49 +-12.7 +74 +0 +0 +LTYPE +5 +3B +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord +2 +DIVIDE +70 +0 +3 +Divide ____ . . ____ . . ____ . . ____ . . ____ +72 +65 +73 +6 +40 +31.75 +49 +12.7 +74 +0 +49 +-6.35 +74 +0 +49 +0 +74 +0 +49 +-6.35 +74 +0 +49 +0 +74 +0 +49 +-6.35 +74 +0 +0 +LTYPE +5 +3C +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord +2 +DIVIDE2 +70 +0 +3 +Divide (.5x) __..__..__..__..__..__..__..__.._ +72 +65 +73 +6 +40 +15.875 +49 +6.35 +74 +0 +49 +-3.175 +74 +0 +49 +0 +74 +0 +49 +-3.175 +74 +0 +49 +0 +74 +0 +49 +-3.175 +74 +0 +0 +LTYPE +5 +3D +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord +2 +DIVIDEX2 +70 +0 +3 +Divide (2x) ________ . . ________ . . _ +72 +65 +73 +6 +40 +63.5 +49 +25.4 +74 +0 +49 +-12.7 +74 +0 +49 +0 +74 +0 +49 +-12.7 +74 +0 +49 +0 +74 +0 +49 +-12.7 +74 +0 +0 +LTYPE +5 +3E +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord +2 +BORDER +70 +0 +3 +Border __ __ . __ __ . __ __ . __ __ . __ __ . +72 +65 +73 +6 +40 +44.45 +49 +12.7 +74 +0 +49 +-6.35 +74 +0 +49 +12.7 +74 +0 +49 +-6.35 +74 +0 +49 +0 +74 +0 +49 +-6.35 +74 +0 +0 +LTYPE +5 +3F +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord +2 +BORDER2 +70 +0 +3 +Border (.5x) __.__.__.__.__.__.__.__.__.__.__. +72 +65 +73 +6 +40 +22.225 +49 +6.35 +74 +0 +49 +-3.175 +74 +0 +49 +6.35 +74 +0 +49 +-3.175 +74 +0 +49 +0 +74 +0 +49 +-3.175 +74 +0 +0 +LTYPE +5 +40 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord +2 +BORDERX2 +70 +0 +3 +Border (2x) ____ ____ . ____ ____ . ___ +72 +65 +73 +6 +40 +88.9 +49 +25.4 +74 +0 +49 +-12.7 +74 +0 +49 +25.4 +74 +0 +49 +-12.7 +74 +0 +49 +0 +74 +0 +49 +-12.7 +74 +0 +0 +LTYPE +5 +41 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord +2 +CENTER +70 +0 +3 +Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ +72 +65 +73 +4 +40 +50.8 +49 +31.75 +74 +0 +49 +-6.35 +74 +0 +49 +6.35 +74 +0 +49 +-6.35 +74 +0 +0 +LTYPE +5 +42 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord +2 +CENTER2 +70 +0 +3 +Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ +72 +65 +73 +4 +40 +28.575 +49 +19.05 +74 +0 +49 +-3.175 +74 +0 +49 +3.175 +74 +0 +49 +-3.175 +74 +0 +0 +LTYPE +5 +43 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord +2 +CENTERX2 +70 +0 +3 +Center (2x) ________ __ ________ __ _____ +72 +65 +73 +4 +40 +101.6 +49 +63.5 +74 +0 +49 +-12.7 +74 +0 +49 +12.7 +74 +0 +49 +-12.7 +74 +0 +0 +ENDTAB +0 +TABLE +2 +LAYER +5 +2 +330 +0 +100 +AcDbSymbolTable +70 +1 +0 +LAYER +5 +10 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord +2 +0 +70 +0 +62 +7 +6 +CONTINUOUS +370 +-3 +390 +F +0 +LAYER +5 +44 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord +2 +Visible Edges(PEC) +70 +0 +62 +7 +6 +CONTINUOUS +370 +50 +390 +F +0 +ENDTAB +0 +TABLE +2 +STYLE +5 +3 +330 +0 +100 +AcDbSymbolTable +70 +3 +0 +STYLE +5 +45 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbTextStyleTableRecord +2 +Standard +70 +0 +40 +0 +41 +1 +50 +0 +71 +0 +42 +1 +3 +txt +4 + +0 +ENDTAB +0 +TABLE +2 +VIEW +5 +6 +330 +0 +100 +AcDbSymbolTable +70 +0 +0 +ENDTAB +0 +TABLE +2 +UCS +5 +7 +330 +0 +100 +AcDbSymbolTable +70 +0 +0 +ENDTAB +0 +TABLE +2 +APPID +5 +9 +330 +0 +100 +AcDbSymbolTable +70 +1 +0 +APPID +5 +12 +330 +9 +100 +AcDbSymbolTableRecord +100 +AcDbRegAppTableRecord +2 +ACAD +70 +0 +0 +ENDTAB +0 +TABLE +2 +DIMSTYLE +5 +A +330 +0 +100 +AcDbSymbolTable +70 +1 +100 +AcDbDimStyleTable +71 +1 +0 +DIMSTYLE +105 +46 +330 +A +100 +AcDbSymbolTableRecord +100 +AcDbDimStyleTableRecord +2 +Standard +70 +0 +40 +1 +41 +1.8 +42 +0.0625 +43 +0.38 +44 +0.18 +45 +0 +46 +0 +47 +0 +48 +0 +140 +0.25 +141 +0.09 +142 +0 +143 +25.4 +144 +1 +145 +0 +146 +1 +147 +0.09 +148 +0 +71 +0 +72 +0 +73 +0 +74 +1 +75 +0 +76 +0 +77 +0 +78 +0 +79 +0 +170 +0 +171 +2 +172 +0 +173 +0 +174 +0 +175 +0 +176 +0 +177 +0 +178 +0 +179 +0 +271 +4 +272 +4 +273 +2 +274 +2 +275 +0 +276 +0 +277 +2 +278 +46 +279 +0 +280 +0 +281 +0 +282 +0 +283 +1 +284 +0 +285 +0 +286 +0 +288 +0 +289 +3 +340 +Standard +341 + +371 +-2 +372 +-2 +0 +ENDTAB +0 +TABLE +2 +BLOCK_RECORD +5 +1 +330 +0 +100 +AcDbSymbolTable +70 +2 +0 +BLOCK_RECORD +5 +1F +330 +1 +100 +AcDbSymbolTableRecord +100 +AcDbBlockTableRecord +2 +*Model_Space +70 +0 +280 +1 +281 +0 +0 +BLOCK_RECORD +5 +1E +330 +1 +100 +AcDbSymbolTableRecord +100 +AcDbBlockTableRecord +2 +*Paper_Space +70 +0 +280 +1 +281 +0 +0 +ENDTAB +0 +ENDSEC +0 +SECTION +2 +BLOCKS +0 +BLOCK +5 +20 +330 +1F +100 +AcDbEntity +8 +0 +100 +AcDbBlockBegin +2 +*Model_Space +70 +0 +10 +0 +20 +0 +30 +0 +3 +*Model_Space +1 + +0 +ENDBLK +5 +21 +330 +1F +100 +AcDbEntity +8 +0 +100 +AcDbBlockEnd +0 +BLOCK +5 +1C +330 +1B +100 +AcDbEntity +8 +0 +100 +AcDbBlockBegin +2 +*Paper_Space +70 +0 +10 +0 +20 +0 +30 +0 +3 +*Paper_Space +1 + +0 +ENDBLK +5 +1D +330 +1F +100 +AcDbEntity +8 +0 +100 +AcDbBlockEnd +0 +ENDSEC +0 +SECTION +2 +ENTITIES +0 +LINE +5 +47 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +54.0015095768 +20 +145.07427149 +11 +57.9407405889 +21 +144.379678779 +0 +LINE +5 +48 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +57.9407405889 +20 +144.379678779 +11 +55.9264217279 +21 +132.955908844 +0 +LINE +5 +49 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +55.9264217279 +20 +132.955908844 +11 +51.9871907159 +21 +133.650501555 +0 +CIRCLE +5 +4A +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +76.6151034931 +20 +128.870392779 +40 +2 +0 +CIRCLE +5 +4B +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +62.3755750957 +20 +142.867767753 +40 +1.6 +0 +CIRCLE +5 +4C +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +60.6112785469 +20 +132.861944812 +40 +1.6 +0 +CIRCLE +5 +4D +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +76.9279747741 +20 +141.354399538 +40 +1.1 +0 +CIRCLE +5 +4E +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +28.165103493 +20 +25.4703927791 +40 +0.7 +0 +CIRCLE +5 +4F +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +44.265103493 +20 +25.4703927791 +40 +0.7 +0 +CIRCLE +5 +50 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +36.965103493 +20 +25.4703927791 +40 +0.7 +0 +ARC +5 +51 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +78.5610437151 +20 +131.847953136 +40 +0.4 +100 +AcDbArc +50 +85.34 +51 +265.34 +0 +LINE +5 +52 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +78.5935407971 +20 +132.246630875 +11 +79.4905657101 +21 +132.173512441 +0 +ARC +5 +53 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +79.4580686281 +20 +131.774834702 +40 +0.4 +100 +AcDbArc +50 +265.34 +51 +85.34 +0 +LINE +5 +54 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +79.4255715461 +20 +131.376156963 +11 +78.5285466331 +21 +131.449275397 +0 +LINE +5 +55 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +79.1866125401 +20 +139.522499614 +11 +80.0836374531 +21 +139.44938118 +0 +ARC +5 +56 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +80.0511403711 +20 +139.050703441 +40 +0.4 +100 +AcDbArc +50 +265.34 +51 +85.34 +0 +LINE +5 +57 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +80.0186432901 +20 +138.652025702 +11 +79.1216183771 +21 +138.725144136 +0 +ARC +5 +58 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +79.1541154581 +20 +139.123821875 +40 +0.4 +100 +AcDbArc +50 +85.34 +51 +265.34 +0 +ARC +5 +59 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +73.8716354151 +20 +139.554408209 +40 +0.4 +100 +AcDbArc +50 +85.34 +51 +265.34 +0 +LINE +5 +5A +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +73.9041324969 +20 +139.953085949 +11 +74.8011574099 +21 +139.879967514 +0 +ARC +5 +5B +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +74.7686603281 +20 +139.481289775 +40 +0.4 +100 +AcDbArc +50 +265.34 +51 +85.34 +0 +LINE +5 +5C +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +74.7361632463 +20 +139.082612036 +11 +73.8391383333 +21 +139.15573047 +0 +ARC +5 +5D +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +73.2785636718 +20 +132.27853947 +40 +0.4 +100 +AcDbArc +50 +85.34 +51 +265.34 +0 +LINE +5 +5E +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +73.3110607536 +20 +132.67721721 +11 +74.2080856666 +21 +132.604098775 +0 +ARC +5 +5F +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +74.1755885848 +20 +132.205421036 +40 +0.4 +100 +AcDbArc +50 +265.34 +51 +85.34 +0 +LINE +5 +60 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +74.143091503 +20 +131.806743297 +11 +73.2460665899 +21 +131.879861731 +0 +LINE +5 +61 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +56.8197279711 +20 +132.003859741 +11 +57.9030164994 +21 +131.812846746 +0 +ARC +5 +62 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +57.8509220461 +20 +131.51740442 +40 +0.3 +100 +AcDbArc +50 +260 +51 +80 +0 +LINE +5 +63 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +57.7988275928 +20 +131.221962094 +11 +56.7155390645 +21 +131.412975089 +0 +ARC +5 +64 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +56.7676335178 +20 +131.708417415 +40 +0.3 +100 +AcDbArc +50 +80 +51 +260 +0 +LINE +5 +65 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +59.2022229169 +20 +145.515660013 +11 +60.2855114452 +21 +145.324647017 +0 +ARC +5 +66 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +60.2334169919 +20 +145.029204691 +40 +0.3 +100 +AcDbArc +50 +260 +51 +80 +0 +LINE +5 +67 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +60.1813225386 +20 +144.733762365 +11 +59.0980340103 +21 +144.924775361 +0 +ARC +5 +68 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +59.1501284636 +20 +145.220217687 +40 +0.3 +100 +AcDbArc +50 +80 +51 +260 +0 +CIRCLE +5 +69 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +17.415103493 +20 +33.7103927791 +40 +0.5 +0 +CIRCLE +5 +6A +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +17.415103493 +20 +36.2503927791 +40 +0.5 +0 +CIRCLE +5 +6B +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +17.415103493 +20 +38.7903927791 +40 +0.5 +0 +CIRCLE +5 +6C +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +17.415103493 +20 +41.3303927791 +40 +0.5 +0 +CIRCLE +5 +6D +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +76.1591754285 +20 +137.461644322 +40 +0.45 +0 +CIRCLE +5 +6E +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +75.8748259626 +20 +133.973214105 +40 +0.45 +0 +CIRCLE +5 +6F +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +68.0851733401 +20 +138.680315907 +40 +0.45 +0 +CIRCLE +5 +70 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +67.6440992029 +20 +136.178860171 +40 +0.45 +0 +CIRCLE +5 +71 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +70.3686653354 +20 +137.003365518 +40 +0.45 +0 +CIRCLE +5 +72 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +69.9275911982 +20 +134.501909782 +40 +0.45 +0 +LINE +5 +73 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +54.388745013 +20 +147.270392779 +11 +54.0015095768 +21 +145.07427149 +0 +LINE +5 +74 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +51.9871907159 +20 +133.650501555 +11 +50.7387765123 +21 +126.570392779 +0 +LINE +5 +75 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +26.115103493 +20 +28.5703927791 +11 +26.115103493 +21 +22.3703927791 +0 +LINE +5 +76 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +26.115103493 +20 +22.3703927791 +11 +46.315103493 +21 +22.3703927791 +0 +LINE +5 +77 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +46.315103493 +20 +22.3703927791 +11 +46.315103493 +21 +28.5703927791 +0 +LINE +5 +78 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +80.1469013801 +20 +126.070392779 +11 +81.4988185711 +21 +142.655860116 +0 +LINE +5 +79 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +54.388745013 +20 +147.270392779 +11 +81.4988185711 +21 +142.655860116 +0 +CIRCLE +5 +7A +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +38.615103493 +20 +36.0703927791 +40 +0.75 +0 +CIRCLE +5 +7B +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +31.115103493 +20 +33.8203927791 +40 +0.75 +0 +CIRCLE +5 +7C +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +141.915103493 +20 +109.820392779 +40 +0.75 +0 +CIRCLE +5 +7D +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +149.415103493 +20 +112.070392779 +40 +0.75 +0 +CIRCLE +5 +7E +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +139.665103493 +20 +71.8203927791 +40 +0.75 +0 +CIRCLE +5 +7F +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +147.165103493 +20 +74.0703927791 +40 +0.75 +0 +CIRCLE +5 +80 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +135.165103493 +20 +52.8203927791 +40 +0.75 +0 +CIRCLE +5 +81 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +142.665103493 +20 +55.0703927791 +40 +0.75 +0 +CIRCLE +5 +82 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +137.415103493 +20 +33.8203927791 +40 +0.75 +0 +CIRCLE +5 +83 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +144.915103493 +20 +36.0703927791 +40 +0.75 +0 +CIRCLE +5 +84 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +114.765103493 +20 +36.0703927791 +40 +0.75 +0 +CIRCLE +5 +85 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +107.265103493 +20 +33.8203927791 +40 +0.75 +0 +CIRCLE +5 +86 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +91.3651034931 +20 +36.0703927791 +40 +0.75 +0 +CIRCLE +5 +87 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +83.8651034931 +20 +33.8203927791 +40 +0.75 +0 +CIRCLE +5 +88 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +67.965103493 +20 +36.0703927791 +40 +0.75 +0 +CIRCLE +5 +89 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +60.465103493 +20 +33.8203927791 +40 +0.75 +0 +CIRCLE +5 +8A +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +104.715103493 +20 +52.8203927791 +40 +0.75 +0 +CIRCLE +5 +8B +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +112.215103493 +20 +55.0703927791 +40 +0.75 +0 +CIRCLE +5 +8C +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +85.5151034931 +20 +52.8203927791 +40 +0.75 +0 +CIRCLE +5 +8D +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +93.0151034931 +20 +55.0703927791 +40 +0.75 +0 +CIRCLE +5 +8E +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +66.315103493 +20 +52.8203927791 +40 +0.75 +0 +CIRCLE +5 +8F +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +73.815103493 +20 +55.0703927791 +40 +0.75 +0 +CIRCLE +5 +90 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +47.115103493 +20 +52.8203927791 +40 +0.75 +0 +CIRCLE +5 +91 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +54.615103493 +20 +55.0703927791 +40 +0.75 +0 +CIRCLE +5 +92 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +35.415103493 +20 +55.0703927791 +40 +0.75 +0 +CIRCLE +5 +93 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +27.915103493 +20 +52.8203927791 +40 +0.75 +0 +CIRCLE +5 +94 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +121.325103493 +20 +74.0703927791 +40 +0.75 +0 +CIRCLE +5 +95 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +113.825103493 +20 +71.8203927791 +40 +0.75 +0 +CIRCLE +5 +96 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +102.235103493 +20 +74.0703927791 +40 +0.75 +0 +CIRCLE +5 +97 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +94.7351034931 +20 +71.8203927791 +40 +0.75 +0 +CIRCLE +5 +98 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +83.1451034931 +20 +74.0703927791 +40 +0.75 +0 +CIRCLE +5 +99 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +75.645103493 +20 +71.8203927791 +40 +0.75 +0 +CIRCLE +5 +9A +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +64.055103493 +20 +74.0703927791 +40 +0.75 +0 +CIRCLE +5 +9B +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +56.555103493 +20 +71.8203927791 +40 +0.75 +0 +CIRCLE +5 +9C +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +44.965103493 +20 +74.0703927791 +40 +0.75 +0 +CIRCLE +5 +9D +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +37.465103493 +20 +71.8203927791 +40 +0.75 +0 +CIRCLE +5 +9E +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +18.375103493 +20 +71.8203927791 +40 +0.75 +0 +CIRCLE +5 +9F +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +25.875103493 +20 +74.0703927791 +40 +0.75 +0 +CIRCLE +5 +A0 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +146.415103493 +20 +90.8203927791 +40 +0.75 +0 +CIRCLE +5 +A1 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +153.915103493 +20 +93.0703927791 +40 +0.75 +0 +CIRCLE +5 +A2 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +127.415103493 +20 +90.8203927791 +40 +0.75 +0 +CIRCLE +5 +A3 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +134.915103493 +20 +93.0703927791 +40 +0.75 +0 +CIRCLE +5 +A4 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +108.415103493 +20 +90.8203927791 +40 +0.75 +0 +CIRCLE +5 +A5 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +115.915103493 +20 +93.0703927791 +40 +0.75 +0 +CIRCLE +5 +A6 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +89.4151034931 +20 +90.8203927791 +40 +0.75 +0 +CIRCLE +5 +A7 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +96.9151034931 +20 +93.0703927791 +40 +0.75 +0 +CIRCLE +5 +A8 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +70.415103493 +20 +90.8203927791 +40 +0.75 +0 +CIRCLE +5 +A9 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +77.9151034931 +20 +93.0703927791 +40 +0.75 +0 +CIRCLE +5 +AA +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +58.915103493 +20 +93.0703927791 +40 +0.75 +0 +CIRCLE +5 +AB +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +32.415103493 +20 +90.8203927791 +40 +0.75 +0 +CIRCLE +5 +AC +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +39.915103493 +20 +93.0703927791 +40 +0.75 +0 +CIRCLE +5 +AD +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +13.415103493 +20 +90.8203927791 +40 +0.75 +0 +CIRCLE +5 +AE +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +20.915103493 +20 +93.0703927791 +40 +0.75 +0 +CIRCLE +5 +AF +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +118.415103493 +20 +109.820392779 +40 +0.75 +0 +CIRCLE +5 +B0 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +125.915103493 +20 +112.070392779 +40 +0.75 +0 +CIRCLE +5 +B1 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +99.4151034931 +20 +109.820392779 +40 +0.75 +0 +CIRCLE +5 +B2 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +106.915103493 +20 +112.070392779 +40 +0.75 +0 +CIRCLE +5 +B3 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +80.4151034931 +20 +109.820392779 +40 +0.75 +0 +CIRCLE +5 +B4 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +87.9151034931 +20 +112.070392779 +40 +0.75 +0 +CIRCLE +5 +B5 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +61.415103493 +20 +109.820392779 +40 +0.75 +0 +CIRCLE +5 +B6 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +68.915103493 +20 +112.070392779 +40 +0.75 +0 +CIRCLE +5 +B7 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +42.415103493 +20 +109.820392779 +40 +0.75 +0 +CIRCLE +5 +B8 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +49.915103493 +20 +112.070392779 +40 +0.75 +0 +CIRCLE +5 +B9 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +23.415103493 +20 +109.820392779 +40 +0.75 +0 +CIRCLE +5 +BA +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +30.915103493 +20 +112.070392779 +40 +0.75 +0 +LINE +5 +BB +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +19.215103493 +20 +114.070392779 +11 +19.215103493 +21 +110.070392779 +0 +LINE +5 +BC +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +19.215103493 +20 +110.070392779 +11 +17.915103493 +21 +110.070392779 +0 +LINE +5 +BD +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +17.915103493 +20 +114.070392779 +11 +19.215103493 +21 +114.070392779 +0 +LINE +5 +BE +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +19.215103493 +20 +122.070392779 +11 +19.215103493 +21 +118.070392779 +0 +LINE +5 +BF +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +19.215103493 +20 +118.070392779 +11 +17.915103493 +21 +118.070392779 +0 +LINE +5 +C0 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +17.915103493 +20 +122.070392779 +11 +19.215103493 +21 +122.070392779 +0 +LINE +5 +C1 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +23.815103493 +20 +64.0703927791 +11 +23.815103493 +21 +60.0703927791 +0 +LINE +5 +C2 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +23.815103493 +20 +60.0703927791 +11 +22.515103493 +21 +60.0703927791 +0 +LINE +5 +C3 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +22.515103493 +20 +64.0703927791 +11 +23.815103493 +21 +64.0703927791 +0 +LINE +5 +C4 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +23.815103493 +20 +57.0703927791 +11 +23.815103493 +21 +53.0703927791 +0 +LINE +5 +C5 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +23.815103493 +20 +53.0703927791 +11 +22.515103493 +21 +53.0703927791 +0 +LINE +5 +C6 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +22.515103493 +20 +57.0703927791 +11 +23.815103493 +21 +57.0703927791 +0 +LINE +5 +C7 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +14.315103493 +20 +76.0703927791 +11 +14.315103493 +21 +72.0703927791 +0 +LINE +5 +C8 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +14.315103493 +20 +72.0703927791 +11 +13.015103493 +21 +72.0703927791 +0 +LINE +5 +C9 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +13.015103493 +20 +76.0703927791 +11 +14.315103493 +21 +76.0703927791 +0 +LINE +5 +CA +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +14.315103493 +20 +83.5703927791 +11 +14.315103493 +21 +79.5703927791 +0 +LINE +5 +CB +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +14.315103493 +20 +79.5703927791 +11 +13.015103493 +21 +79.5703927791 +0 +LINE +5 +CC +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +13.015103493 +20 +83.5703927791 +11 +14.315103493 +21 +83.5703927791 +0 +LINE +5 +CD +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +9.31510349296 +20 +95.0703927791 +11 +9.31510349296 +21 +91.0703927791 +0 +LINE +5 +CE +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +9.31510349296 +20 +91.0703927791 +11 +8.01510349296 +21 +91.0703927791 +0 +LINE +5 +CF +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +8.01510349296 +20 +95.0703927791 +11 +9.31510349296 +21 +95.0703927791 +0 +LINE +5 +D0 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +9.31510349296 +20 +102.070392779 +11 +9.31510349296 +21 +98.0703927791 +0 +LINE +5 +D1 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +9.31510349296 +20 +98.0703927791 +11 +8.01510349296 +21 +98.0703927791 +0 +LINE +5 +D2 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +8.01510349296 +20 +102.070392779 +11 +9.31510349296 +21 +102.070392779 +0 +LINE +5 +D3 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +15.615103493 +20 +28.5703927791 +11 +26.115103493 +21 +28.5703927791 +0 +LINE +5 +D4 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +46.315103493 +20 +28.5703927791 +11 +160.415103493 +21 +28.5703927791 +0 +LINE +5 +D5 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +21.115103493 +20 +126.570392779 +11 +21.115103493 +21 +123.270392779 +0 +LINE +5 +D6 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +21.115103493 +20 +123.270392779 +11 +17.915103493 +21 +123.270392779 +0 +LINE +5 +D7 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +50.7387765123 +20 +126.570392779 +11 +21.115103493 +21 +126.570392779 +0 +LINE +5 +D8 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +31.215103493 +20 +103.570392779 +11 +8.01510349296 +21 +103.570392779 +0 +LINE +5 +D9 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +17.915103493 +20 +108.570392779 +11 +31.215103493 +21 +108.570392779 +0 +LINE +5 +DA +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +31.215103493 +20 +108.570392779 +11 +31.215103493 +21 +103.570392779 +0 +LINE +5 +DB +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +160.415103493 +20 +126.070392779 +11 +80.1469013801 +21 +126.070392779 +0 +LINE +5 +DC +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +31.215103493 +20 +84.5703927791 +11 +13.015103493 +21 +84.5703927791 +0 +LINE +5 +DD +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +31.215103493 +20 +89.5703927791 +11 +31.215103493 +21 +84.5703927791 +0 +LINE +5 +DE +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +8.01510349296 +20 +89.5703927791 +11 +31.215103493 +21 +89.5703927791 +0 +LINE +5 +DF +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +41.715103493 +20 +46.5703927791 +11 +15.615103493 +21 +46.5703927791 +0 +LINE +5 +E0 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +41.715103493 +20 +51.5703927791 +11 +41.715103493 +21 +46.5703927791 +0 +LINE +5 +E1 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +22.515103493 +20 +51.5703927791 +11 +41.715103493 +21 +51.5703927791 +0 +LINE +5 +E2 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +41.715103493 +20 +65.5703927791 +11 +22.515103493 +21 +65.5703927791 +0 +LINE +5 +E3 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +41.715103493 +20 +70.5703927791 +11 +41.715103493 +21 +65.5703927791 +0 +LINE +5 +E4 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +13.015103493 +20 +70.5703927791 +11 +41.715103493 +21 +70.5703927791 +0 +LINE +5 +E5 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +17.915103493 +20 +122.070392779 +11 +17.915103493 +21 +123.270392779 +0 +LINE +5 +E6 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +17.915103493 +20 +108.570392779 +11 +17.915103493 +21 +110.070392779 +0 +LINE +5 +E7 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +8.01510349296 +20 +102.070392779 +11 +8.01510349296 +21 +103.570392779 +0 +LINE +5 +E8 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +8.01510349296 +20 +89.5703927791 +11 +8.01510349296 +21 +91.0703927791 +0 +LINE +5 +E9 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +15.615103493 +20 +28.5703927791 +11 +15.615103493 +21 +46.5703927791 +0 +LINE +5 +EA +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +17.915103493 +20 +114.070392779 +11 +17.915103493 +21 +118.070392779 +0 +LINE +5 +EB +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +8.01510349296 +20 +95.0703927791 +11 +8.01510349296 +21 +98.0703927791 +0 +LINE +5 +EC +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +13.015103493 +20 +83.5703927791 +11 +13.015103493 +21 +84.5703927791 +0 +LINE +5 +ED +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +13.015103493 +20 +76.0703927791 +11 +13.015103493 +21 +79.5703927791 +0 +LINE +5 +EE +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +13.015103493 +20 +70.5703927791 +11 +13.015103493 +21 +72.0703927791 +0 +LINE +5 +EF +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +22.515103493 +20 +64.0703927791 +11 +22.515103493 +21 +65.5703927791 +0 +LINE +5 +F0 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +22.515103493 +20 +57.0703927791 +11 +22.515103493 +21 +60.0703927791 +0 +LINE +5 +F1 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +22.515103493 +20 +51.5703927791 +11 +22.515103493 +21 +53.0703927791 +0 +LINE +5 +F2 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +160.415103493 +20 +126.070392779 +11 +160.415103493 +21 +28.5703927791 +0 +CIRCLE +5 +F3 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +44.915103493 +20 +105.570392779 +40 +2.1 +0 +CIRCLE +5 +F4 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +59.715103493 +20 +67.5703927791 +40 +2.1 +0 +CIRCLE +5 +F5 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +98.1151034931 +20 +67.5703927791 +40 +2.1 +0 +CIRCLE +5 +F6 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +155.415103493 +20 +77.5703927791 +40 +2.1 +0 +CIRCLE +5 +F7 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +111.915103493 +20 +106.570392779 +40 +2.1 +0 +CIRCLE +5 +F8 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +140.415103493 +20 +39.5703927791 +40 +2 +0 +CIRCLE +5 +F9 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +110.265103493 +20 +39.5703927791 +40 +2 +0 +CIRCLE +5 +FA +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +107.715103493 +20 +58.5703927791 +40 +2 +0 +CIRCLE +5 +FB +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +138.165103493 +20 +58.5703927791 +40 +2 +0 +CIRCLE +5 +FC +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +142.665103493 +20 +77.5703927791 +40 +2 +0 +CIRCLE +5 +FD +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +116.825103493 +20 +77.5703927791 +40 +2 +0 +CIRCLE +5 +FE +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +149.415103493 +20 +96.5703927791 +40 +2 +0 +CIRCLE +5 +FF +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +144.915103493 +20 +115.570392779 +40 +2 +0 +CIRCLE +5 +100 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +121.415103493 +20 +115.570392779 +40 +2 +0 +CIRCLE +5 +101 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +102.415103493 +20 +115.570392779 +40 +2 +0 +CIRCLE +5 +102 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +83.4151034931 +20 +115.570392779 +40 +2 +0 +CIRCLE +5 +103 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +64.415103493 +20 +115.570392779 +40 +2 +0 +CIRCLE +5 +104 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +45.415103493 +20 +115.570392779 +40 +2 +0 +CIRCLE +5 +105 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +26.415103493 +20 +115.570392779 +40 +2 +0 +CIRCLE +5 +106 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +130.415103493 +20 +96.5703927791 +40 +2 +0 +CIRCLE +5 +107 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +111.415103493 +20 +96.5703927791 +40 +2 +0 +CIRCLE +5 +108 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +92.4151034931 +20 +96.5703927791 +40 +2 +0 +CIRCLE +5 +109 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +73.415103493 +20 +96.5703927791 +40 +2 +0 +CIRCLE +5 +10A +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +54.415103493 +20 +96.5703927791 +40 +2 +0 +CIRCLE +5 +10B +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +35.415103493 +20 +96.5703927791 +40 +2 +0 +CIRCLE +5 +10C +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +16.415103493 +20 +96.5703927791 +40 +2 +0 +CIRCLE +5 +10D +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +97.7351034931 +20 +77.5703927791 +40 +2 +0 +CIRCLE +5 +10E +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +78.6451034931 +20 +77.5703927791 +40 +2 +0 +CIRCLE +5 +10F +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +59.555103493 +20 +77.5703927791 +40 +2 +0 +CIRCLE +5 +110 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +40.465103493 +20 +77.5703927791 +40 +2 +0 +CIRCLE +5 +111 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +21.375103493 +20 +77.5703927791 +40 +2 +0 +CIRCLE +5 +112 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +88.5151034931 +20 +58.5703927791 +40 +2 +0 +CIRCLE +5 +113 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +69.315103493 +20 +58.5703927791 +40 +2 +0 +CIRCLE +5 +114 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +50.115103493 +20 +58.5703927791 +40 +2 +0 +CIRCLE +5 +115 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +30.915103493 +20 +58.5703927791 +40 +2 +0 +CIRCLE +5 +116 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +34.115103493 +20 +39.5703927791 +40 +2 +0 +CIRCLE +5 +117 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +86.8651034931 +20 +39.5703927791 +40 +2 +0 +CIRCLE +5 +118 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +63.465103493 +20 +39.5703927791 +40 +2 +0 +ARC +5 +119 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +124.426298668 +20 +54.6043548311 +40 +2.37170824513 +100 +AcDbArc +50 +341.565051177 +51 +198.434948823 +0 +LINE +5 +11A +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +122.176298668 +20 +53.8543548311 +11 +123.676298668 +21 +50.8543548311 +0 +LINE +5 +11B +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +126.676298668 +20 +53.8543548311 +11 +125.176298668 +21 +50.8543548311 +0 +ARC +5 +11C +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +124.426298668 +20 +51.2543548311 +40 +0.85 +100 +AcDbArc +50 +208.072486936 +51 +331.927513064 +0 +ARC +5 +11D +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +124.380058759 +20 +41.2642934551 +40 +2.37170824513 +100 +AcDbArc +50 +161.565051177 +51 +18.4349488229 +0 +LINE +5 +11E +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +126.630058759 +20 +42.0142934551 +11 +125.130058759 +21 +45.0142934551 +0 +LINE +5 +11F +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +122.130058759 +20 +42.0142934551 +11 +123.630058759 +21 +45.0142934551 +0 +ARC +5 +120 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +124.380058759 +20 +44.6142934551 +40 +0.85 +100 +AcDbArc +50 +28.0724869359 +51 +151.927513064 +0 +ARC +5 +121 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +117.630058759 +20 +48.1425852101 +40 +2.37170824513 +100 +AcDbArc +50 +71.5650511771 +51 +288.434948823 +0 +LINE +5 +122 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +118.380058759 +20 +45.8925852101 +11 +121.380058759 +21 +47.3925852101 +0 +LINE +5 +123 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +118.380058759 +20 +50.3925852101 +11 +121.380058759 +21 +48.8925852101 +0 +ARC +5 +124 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +120.980058759 +20 +48.1425852101 +40 +0.85 +100 +AcDbArc +50 +298.072486936 +51 +61.9275130641 +0 +ARC +5 +125 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +131.130058759 +20 +48.1425852101 +40 +2.37170824513 +100 +AcDbArc +50 +251.565051177 +51 +108.434948823 +0 +LINE +5 +126 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +130.380058759 +20 +50.3925852101 +11 +127.380058759 +21 +48.8925852101 +0 +LINE +5 +127 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +130.380058759 +20 +45.8925852101 +11 +127.380058759 +21 +47.3925852101 +0 +ARC +5 +128 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +127.780058759 +20 +48.1425852101 +40 +0.85 +100 +AcDbArc +50 +118.072486936 +51 +241.927513064 +0 +ARC +5 +129 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +53.1318556378 +20 +37.0101551811 +40 +0.85 +100 +AcDbArc +50 +73.0724869359 +51 +196.927513064 +0 +ARC +5 +12A +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +45.8640058389 +20 +34.7320634341 +40 +2.37170824513 +100 +AcDbArc +50 +116.565051177 +51 +333.434948823 +0 +LINE +5 +12B +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +47.9853261825 +20 +33.6714032621 +11 +49.0459863543 +21 +36.8533837771 +0 +LINE +5 +12C +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +44.8033456672 +20 +36.8533837771 +11 +47.9853261825 +21 +37.9140439491 +0 +ARC +5 +12D +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +48.2328135559 +20 +37.1008711511 +40 +0.85 +100 +AcDbArc +50 +343.072486936 +51 +106.927513064 +0 +ARC +5 +12E +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +55.4099473849 +20 +44.2780049801 +40 +2.37170824513 +100 +AcDbArc +50 +296.565051177 +51 +153.434948823 +0 +LINE +5 +12F +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +53.2886270414 +20 +45.3386651511 +11 +52.2279668696 +21 +42.1566846361 +0 +LINE +5 +130 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +56.4706075567 +20 +42.1566846361 +11 +53.2886270414 +21 +41.0960244641 +0 +ARC +5 +131 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +53.041139668 +20 +41.9091972631 +40 +0.85 +100 +AcDbArc +50 +163.072486936 +51 +286.927513064 +0 +ARC +5 +132 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +46.1005120477 +20 +44.1068918771 +40 +2.37170824513 +100 +AcDbArc +50 +26.5650511771 +51 +243.434948823 +0 +LINE +5 +133 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +45.0398518759 +20 +41.9855715331 +11 +48.2218323913 +21 +40.9249113611 +0 +LINE +5 +134 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +48.2218323913 +20 +45.1675520491 +11 +49.282492563 +21 +41.9855715331 +0 +ARC +5 +135 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +48.4693197647 +20 +41.7380841601 +40 +0.85 +100 +AcDbArc +50 +253.072486936 +51 +16.9275130641 +0 +ARC +5 +136 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +55.5006633548 +20 +34.6413474641 +40 +2.37170824513 +100 +AcDbArc +50 +206.565051177 +51 +63.4349488229 +0 +LINE +5 +137 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +56.5613235266 +20 +36.7626678071 +11 +53.3793430112 +21 +37.8233279791 +0 +LINE +5 +138 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbLine +10 +53.3793430112 +20 +33.5806872921 +11 +52.3186828395 +21 +36.7626678071 +0 +CIRCLE +5 +139 +100 +AcDbEntity +8 +Visible Edges(PEC) +6 +ByLayer +62 +256 +370 +-1 +100 +AcDbCircle +10 +156.82650113 +20 +63.0606544828 +40 +0.75 +0 +ENDSEC +0 +SECTION +2 +OBJECTS +0 +DICTIONARY +5 +C +330 +0 +100 +AcDbDictionary +281 +1 +3 +ACAD_GROUP +350 +D +0 +DICTIONARY +5 +D +330 +C +100 +AcDbDictionary +281 +1 +0 +ENDSEC +0 +EOF |