From b979d1e0b970498ab50fff703d4cd2f2fc293659 Mon Sep 17 00:00:00 2001 From: Dick Hollenbeck Date: Mon, 12 Dec 2011 02:37:05 -0600 Subject: [PATCH] plugin work, accessors --- common/base_struct.cpp | 11 +- cvpcb/readschematicnetlist.cpp | 2 +- eeschema/block.cpp | 2 +- eeschema/bus-wire-junction.cpp | 2 +- eeschema/component_references_lister.cpp | 2 +- eeschema/erc.cpp | 4 +- eeschema/events_called_functions_for_edit.cpp | 2 +- eeschema/netform.cpp | 2 +- eeschema/operations_on_items_lists.cpp | 6 +- eeschema/sch_component.cpp | 6 +- eeschema/sch_screen.cpp | 6 +- eeschema/sch_sheet.cpp | 8 +- eeschema/sch_sheet_path.cpp | 6 +- eeschema/sheet.cpp | 2 +- gerbview/class_gerber_draw_item.cpp | 2 +- include/base_struct.h | 44 +- pcbnew/block.cpp | 4 +- pcbnew/block_module_editor.cpp | 68 +- pcbnew/class_dimension.cpp | 2 +- pcbnew/class_drawsegment.cpp | 2 +- pcbnew/class_drawsegment.h | 7 +- pcbnew/class_edge_mod.cpp | 2 +- pcbnew/class_mire.cpp | 2 +- pcbnew/class_module.cpp | 2 +- pcbnew/class_module.h | 100 ++- pcbnew/class_module_transform_functions.cpp | 2 +- pcbnew/class_pad.cpp | 35 +- pcbnew/class_pad.h | 77 +- pcbnew/class_text_mod.h | 33 +- pcbnew/class_track.cpp | 2 +- pcbnew/class_zone.cpp | 2 +- pcbnew/collectors.cpp | 2 +- pcbnew/controle.cpp | 4 +- pcbnew/cross-probing.cpp | 6 +- .../dialog_edit_module_for_BoardEditor.cpp | 5 +- pcbnew/dialogs/dialog_edit_module_text.cpp | 26 +- pcbnew/dialogs/dialog_pad_properties.cpp | 4 +- pcbnew/editmod.cpp | 6 +- pcbnew/edtxtmod.cpp | 6 +- pcbnew/export_gencad.cpp | 4 +- pcbnew/export_vrml.cpp | 2 +- pcbnew/ioascii.cpp | 2 +- pcbnew/item_io.cpp | 2 +- pcbnew/kicad_plugin.cpp | 810 ++++++++++-------- pcbnew/kicad_plugin.h | 34 +- pcbnew/librairi.cpp | 4 +- pcbnew/loadcmp.cpp | 4 +- pcbnew/modedit.cpp | 20 +- pcbnew/modedit_onclick.cpp | 2 +- pcbnew/moduleframe.cpp | 4 +- pcbnew/move-drag_pads.cpp | 2 +- pcbnew/muonde.cpp | 24 +- pcbnew/netlist.cpp | 4 +- pcbnew/onrightclick.cpp | 2 +- pcbnew/plot_rtn.cpp | 6 +- pcbnew/print_board_functions.cpp | 4 +- pcbnew/specctra_export.cpp | 2 +- pcbnew/xchgmod.cpp | 4 +- pcbnew/zones_by_polygon.cpp | 4 +- pcbnew/zones_by_polygon_fill_functions.cpp | 4 +- pcbnew/zones_test_and_combine_areas.cpp | 6 +- 61 files changed, 820 insertions(+), 636 deletions(-) diff --git a/common/base_struct.cpp b/common/base_struct.cpp index 6ea8378280..52e7a4360e 100644 --- a/common/base_struct.cpp +++ b/common/base_struct.cpp @@ -68,7 +68,7 @@ EDA_ITEM::EDA_ITEM( const EDA_ITEM& base ) m_Parent = base.m_Parent; m_Son = base.m_Son; m_Flags = base.m_Flags; - m_TimeStamp = base.m_TimeStamp; + SetTimeStamp( base.m_TimeStamp ); m_Status = base.m_Status; m_Selected = base.m_Selected; } @@ -84,7 +84,7 @@ void EDA_ITEM::InitVars() m_List = NULL; // I am not on any list yet m_Image = NULL; // Link to an image copy for undelete or abort command m_Flags = 0; // flags for editions and other - m_TimeStamp = 0; // Time stamp used for logical links + SetTimeStamp( 0 ); // Time stamp used for logical links m_Status = 0; m_Selected = 0; // Used by block commands, and selective editing } @@ -107,6 +107,13 @@ EDA_ITEM* EDA_ITEM::doClone() const } +EDA_ITEM* EDA_ITEM::Clone() const +{ + // save about 6 bytes per call by hiding the virtual function in this non-inline function. + return doClone(); +} + + SEARCH_RESULT EDA_ITEM::IterateForward( EDA_ITEM* listStart, INSPECTOR* inspector, const void* testData, diff --git a/cvpcb/readschematicnetlist.cpp b/cvpcb/readschematicnetlist.cpp index 332997be2a..6567c508ce 100644 --- a/cvpcb/readschematicnetlist.cpp +++ b/cvpcb/readschematicnetlist.cpp @@ -182,7 +182,7 @@ int CVPCB_MAINFRAME::ReadSchematicNetlist() while( Line[idx] != ' ' && Line[idx] ) cbuffer[jj++] = Line[idx++]; cbuffer[jj] = 0; - Cmp->m_TimeStamp = FROM_UTF8(cbuffer); + Cmp->m_TimeStamp = FROM_UTF8( cbuffer ); /* search val/ref.lib */ while( Line[idx] == ' ' ) diff --git a/eeschema/block.cpp b/eeschema/block.cpp index 4c7d0b3145..2fa58c37cb 100644 --- a/eeschema/block.cpp +++ b/eeschema/block.cpp @@ -554,7 +554,7 @@ void SCH_EDIT_FRAME::PasteListOfItems( wxDC* DC ) // Clear annotation and init new time stamp for the new components: if( Struct->Type() == SCH_COMPONENT_T ) { - ( (SCH_COMPONENT*) Struct )->m_TimeStamp = GetNewTimeStamp(); + ( (SCH_COMPONENT*) Struct )->SetTimeStamp( GetNewTimeStamp() ); ( (SCH_COMPONENT*) Struct )->ClearAnnotation( NULL ); } diff --git a/eeschema/bus-wire-junction.cpp b/eeschema/bus-wire-junction.cpp index 8a5121b3e3..9c062e6771 100644 --- a/eeschema/bus-wire-junction.cpp +++ b/eeschema/bus-wire-junction.cpp @@ -526,7 +526,7 @@ void SCH_EDIT_FRAME::RepeatDrawItem( wxDC* DC ) wxPoint pos = GetScreen()->GetCrossHairPosition() - ( (SCH_COMPONENT*) m_itemToRepeat )->GetPosition(); m_itemToRepeat->SetFlags( IS_NEW ); - ( (SCH_COMPONENT*) m_itemToRepeat )->m_TimeStamp = GetNewTimeStamp(); + ( (SCH_COMPONENT*) m_itemToRepeat )->SetTimeStamp( GetNewTimeStamp() ); m_itemToRepeat->Move( pos ); m_itemToRepeat->Draw( DrawPanel, DC, wxPoint( 0, 0 ), g_XorMode ); MoveItem( m_itemToRepeat, DC ); diff --git a/eeschema/component_references_lister.cpp b/eeschema/component_references_lister.cpp index 71c60b8ad7..6547edfb63 100644 --- a/eeschema/component_references_lister.cpp +++ b/eeschema/component_references_lister.cpp @@ -668,7 +668,7 @@ SCH_REFERENCE::SCH_REFERENCE( SCH_COMPONENT* aComponent, LIB_COMPONENT* aLibComp m_SheetPath = aSheetPath; m_IsNew = false; m_Flag = 0; - m_TimeStamp = aComponent->m_TimeStamp; + m_TimeStamp = aComponent->GetTimeStamp(); m_CmpPos = aComponent->GetPosition(); m_SheetNum = 0; diff --git a/eeschema/erc.cpp b/eeschema/erc.cpp index 67731a730f..9dd3169f54 100644 --- a/eeschema/erc.cpp +++ b/eeschema/erc.cpp @@ -204,7 +204,7 @@ int TestDuplicateSheetNames( bool aCreateMarker ) { /* Create a new marker type ERC error*/ SCH_MARKER* marker = new SCH_MARKER(); - marker->m_TimeStamp = GetNewTimeStamp(); + marker->SetTimeStamp( GetNewTimeStamp() ); marker->SetData( ERCE_DUPLICATE_SHEET_NAME, ( (SCH_SHEET*) test_item )->GetPosition(), _( "Duplicate sheet name" ), @@ -237,7 +237,7 @@ void Diagnose( NETLIST_OBJECT* aNetItemRef, NETLIST_OBJECT* aNetItemTst, /* Create new marker for ERC error. */ marker = new SCH_MARKER(); - marker->m_TimeStamp = GetNewTimeStamp(); + marker->SetTimeStamp( GetNewTimeStamp() ); marker->SetMarkerType( MARK_ERC ); marker->SetErrorLevel( WAR ); diff --git a/eeschema/events_called_functions_for_edit.cpp b/eeschema/events_called_functions_for_edit.cpp index 29bd68eb01..ef7dbb5bd8 100644 --- a/eeschema/events_called_functions_for_edit.cpp +++ b/eeschema/events_called_functions_for_edit.cpp @@ -29,7 +29,7 @@ void SCH_EDIT_FRAME::OnCopySchematicItemRequest( wxCommandEvent& event ) { SCH_COMPONENT* newitem; newitem = new SCH_COMPONENT( *( (SCH_COMPONENT*) curr_item ) ); - newitem->m_TimeStamp = GetNewTimeStamp(); + newitem->SetTimeStamp( GetNewTimeStamp() ); newitem->ClearAnnotation( NULL ); newitem->m_Flags = IS_NEW; MoveItem( (SCH_ITEM*) newitem, &dc ); diff --git a/eeschema/netform.cpp b/eeschema/netform.cpp index 2d4b6b0b39..ad95458487 100644 --- a/eeschema/netform.cpp +++ b/eeschema/netform.cpp @@ -1035,7 +1035,7 @@ XNODE* EXPORT_HELP::makeGenericComponents() xsheetpath->AddAttribute( sNames, path->PathHumanReadable() ); xsheetpath->AddAttribute( sTStamps, path->Path() ); - timeStamp.Printf( sTSFmt, comp->m_TimeStamp ); + timeStamp.Printf( sTSFmt, comp->GetTimeStamp() ); xcomp->AddChild( node( sTStamp, timeStamp ) ); } } diff --git a/eeschema/operations_on_items_lists.cpp b/eeschema/operations_on_items_lists.cpp index ef7ea0fd22..6998fa7f91 100644 --- a/eeschema/operations_on_items_lists.cpp +++ b/eeschema/operations_on_items_lists.cpp @@ -207,13 +207,13 @@ void DuplicateItemsInList( SCH_SCREEN* screen, PICKED_ITEMS_LIST& aItemsList, case SCH_SHEET_T: { SCH_SHEET* sheet = (SCH_SHEET*) newitem; - sheet->m_TimeStamp = GetNewTimeStamp(); + sheet->SetTimeStamp( GetNewTimeStamp() ); sheet->SetSon( NULL ); break; } case SCH_COMPONENT_T: - ( (SCH_COMPONENT*) newitem )->m_TimeStamp = GetNewTimeStamp(); + ( (SCH_COMPONENT*) newitem )->SetTimeStamp( GetNewTimeStamp() ); ( (SCH_COMPONENT*) newitem )->ClearAnnotation( NULL ); break; } @@ -246,7 +246,7 @@ SCH_ITEM* DuplicateStruct( SCH_ITEM* aDrawStruct, bool aClone ) SCH_ITEM* NewDrawStruct = aDrawStruct->Clone(); if( aClone ) - NewDrawStruct->m_TimeStamp = aDrawStruct->m_TimeStamp; + NewDrawStruct->SetTimeStamp( aDrawStruct->GetTimeStamp() ); NewDrawStruct->m_Image = aDrawStruct; diff --git a/eeschema/sch_component.cpp b/eeschema/sch_component.cpp index 6c9afedfdb..fc468b1de4 100644 --- a/eeschema/sch_component.cpp +++ b/eeschema/sch_component.cpp @@ -130,7 +130,7 @@ SCH_COMPONENT::SCH_COMPONENT( LIB_COMPONENT& libComponent, SCH_SHEET_PATH* sheet m_unit = unit; m_convert = convert; m_ChipName = libComponent.GetName(); - m_TimeStamp = GetNewTimeStamp(); + SetTimeStamp( GetNewTimeStamp() ); if( setNewItemFlag ) m_Flags = IS_NEW | IS_MOVED; @@ -189,7 +189,7 @@ SCH_COMPONENT::SCH_COMPONENT( const SCH_COMPONENT& aComponent ) : m_unit = aComponent.m_unit; m_convert = aComponent.m_convert; m_ChipName = aComponent.m_ChipName; - m_TimeStamp = aComponent.m_TimeStamp; + SetTimeStamp( aComponent.m_TimeStamp ); m_transform = aComponent.m_transform; m_prefix = aComponent.m_prefix; m_PathsAndReferences = aComponent.m_PathsAndReferences; @@ -524,7 +524,7 @@ void SCH_COMPONENT::SetTimeStamp( long aNewTimeStamp ) string_timestamp.Printf( wxT( "%8.8X" ), aNewTimeStamp ); string_oldtimestamp.Printf( wxT( "%8.8X" ), m_TimeStamp ); - m_TimeStamp = aNewTimeStamp; + SetTimeStamp( aNewTimeStamp ); for( unsigned ii = 0; ii < m_PathsAndReferences.GetCount(); ii++ ) { diff --git a/eeschema/sch_screen.cpp b/eeschema/sch_screen.cpp index ec0b2b586d..797da93e32 100644 --- a/eeschema/sch_screen.cpp +++ b/eeschema/sch_screen.cpp @@ -1327,7 +1327,7 @@ int SCH_SCREEN::GetConnection( const wxPoint& aPosition, PICKED_ITEMS_LIST& aLis */ static bool SortByTimeStamp( const EDA_ITEM* item1, const EDA_ITEM* item2 ) { - int ii = item1->m_TimeStamp - item2->m_TimeStamp; + int ii = item1->GetTimeStamp() - item2->GetTimeStamp(); /* If the time stamps are the same, compare type in order to have component objects * before sheet object. This is done because changing the sheet time stamp @@ -1463,7 +1463,7 @@ int SCH_SCREENS::ReplaceDuplicateTimeStamps() SCH_ITEM* nextItem = (SCH_ITEM*)items[ii + 1]; - if( item->m_TimeStamp == nextItem->m_TimeStamp ) + if( item->GetTimeStamp() == nextItem->GetTimeStamp() ) { count++; @@ -1477,7 +1477,7 @@ int SCH_SCREENS::ReplaceDuplicateTimeStamps() // @todo: see how to change sheet paths for its cmp list (can // be possible in most cases) else - item->m_TimeStamp = GetNewTimeStamp(); + item->SetTimeStamp( GetNewTimeStamp() ); } } diff --git a/eeschema/sch_sheet.cpp b/eeschema/sch_sheet.cpp index 90c2129f2a..11bc4e4e6a 100644 --- a/eeschema/sch_sheet.cpp +++ b/eeschema/sch_sheet.cpp @@ -53,7 +53,7 @@ SCH_SHEET::SCH_SHEET( const wxPoint& pos ) : m_Layer = LAYER_SHEET; m_pos = pos; m_size = wxSize( MIN_SHEET_WIDTH, MIN_SHEET_HEIGHT ); - m_TimeStamp = GetNewTimeStamp(); + SetTimeStamp( GetNewTimeStamp() ); m_sheetNameSize = m_fileNameSize = 60; m_screen = NULL; m_name.Printf( wxT( "Sheet%8.8lX" ), m_TimeStamp ); @@ -67,7 +67,7 @@ SCH_SHEET::SCH_SHEET( const SCH_SHEET& aSheet ) : m_pos = aSheet.m_pos; m_size = aSheet.m_size; m_Layer = aSheet.m_Layer; - m_TimeStamp = aSheet.m_TimeStamp; + SetTimeStamp( aSheet.m_TimeStamp ); m_sheetNameSize = aSheet.m_sheetNameSize; m_fileNameSize = aSheet.m_fileNameSize; m_screen = aSheet.m_screen; @@ -184,7 +184,7 @@ bool SCH_SHEET::Load( LINE_READER& aLine, wxString& aErrorMsg ) SCH_SHEET_PIN* sheetPin; char* ptcar; - m_TimeStamp = GetNewTimeStamp(); + SetTimeStamp( GetNewTimeStamp() ); // sheets are added to the GetDrawItems() like other schematic components. // however, in order to preserve the hierarchy (through m_Parent pointers), @@ -224,7 +224,7 @@ bool SCH_SHEET::Load( LINE_READER& aLine, wxString& aErrorMsg ) { sscanf( ((char*)aLine) + 1, "%lX", &m_TimeStamp ); if( m_TimeStamp == 0 ) // zero is not unique! - m_TimeStamp = GetNewTimeStamp(); + SetTimeStamp( GetNewTimeStamp() ); continue; } diff --git a/eeschema/sch_sheet_path.cpp b/eeschema/sch_sheet_path.cpp index a3b142731f..fcaaf2df5c 100644 --- a/eeschema/sch_sheet_path.cpp +++ b/eeschema/sch_sheet_path.cpp @@ -101,10 +101,10 @@ int SCH_SHEET_PATH::Cmp( const SCH_SHEET_PATH& aSheetPathToTest ) const //otherwise, same number of sheets. for( unsigned i = 0; im_TimeStamp > aSheetPathToTest.m_sheets[i]->m_TimeStamp ) + if( m_sheets[i]->GetTimeStamp() > aSheetPathToTest.m_sheets[i]->GetTimeStamp() ) return 1; - if( m_sheets[i]->m_TimeStamp < aSheetPathToTest.m_sheets[i]->m_TimeStamp ) + if( m_sheets[i]->GetTimeStamp() < aSheetPathToTest.m_sheets[i]->GetTimeStamp() ) return -1; } @@ -200,7 +200,7 @@ wxString SCH_SHEET_PATH::Path() const // it's timestamp changes anyway. for( unsigned i = 1; i < m_numSheets; i++ ) { - t.Printf( _( "%8.8lX/" ), m_sheets[i]->m_TimeStamp ); + t.Printf( _( "%8.8lX/" ), m_sheets[i]->GetTimeStamp() ); s = s + t; } diff --git a/eeschema/sheet.cpp b/eeschema/sheet.cpp index c680c76327..25697d9ad7 100644 --- a/eeschema/sheet.cpp +++ b/eeschema/sheet.cpp @@ -312,7 +312,7 @@ SCH_SHEET* SCH_EDIT_FRAME::CreateSheet( wxDC* aDC ) SCH_SHEET* sheet = new SCH_SHEET( GetScreen()->GetCrossHairPosition() ); sheet->SetFlags( IS_NEW | IS_RESIZED ); - sheet->m_TimeStamp = GetNewTimeStamp(); + sheet->SetTimeStamp( GetNewTimeStamp() ); sheet->SetParent( GetScreen() ); sheet->SetScreen( NULL ); diff --git a/gerbview/class_gerber_draw_item.cpp b/gerbview/class_gerber_draw_item.cpp index 8575083704..4e4028f28c 100644 --- a/gerbview/class_gerber_draw_item.cpp +++ b/gerbview/class_gerber_draw_item.cpp @@ -70,7 +70,7 @@ GERBER_DRAW_ITEM::GERBER_DRAW_ITEM( const GERBER_DRAW_ITEM& aSource ) : m_Shape = aSource.m_Shape; m_Flags = aSource.m_Flags; - m_TimeStamp = aSource.m_TimeStamp; + SetTimeStamp( aSource.m_TimeStamp ); SetStatus( aSource.ReturnStatus() ); m_Start = aSource.m_Start; diff --git a/include/base_struct.h b/include/base_struct.h index e5157cd4f5..f1952b9608 100644 --- a/include/base_struct.h +++ b/include/base_struct.h @@ -366,16 +366,17 @@ private: int m_Status; protected: - EDA_ITEM* Pnext; /* Linked list: Link (next struct) */ - EDA_ITEM* Pback; /* Linked list: Link (previous struct) */ + EDA_ITEM* Pnext; ///< next in linked list + EDA_ITEM* Pback; ///< previous in linked list + DHEAD* m_List; ///< which DLIST I am on. + EDA_ITEM* m_Parent; /* Linked list: Link (parent struct) */ EDA_ITEM* m_Son; /* Linked list: Link (son struct) */ - DHEAD* m_List; ///< which DLIST I am on. + unsigned long m_TimeStamp; ///< Time stamp used for logical links public: int m_Flags; // flags for editing and other uses. - unsigned long m_TimeStamp; // Time stamp used for logical links int m_Selected; /* Used by block commands, and selective editing */ // member used in undo/redo function @@ -385,7 +386,7 @@ private: void InitVars(); /** - * @brief Function doClone + * Function doClone * is used by the derived class to actually implement the cloning. * * The default version will return NULL in release builds and likely crash the @@ -520,15 +521,17 @@ public: } /** - * @brief Function Clone + * Function Clone * creates a duplicate of this item with linked list members set to NULL. * * The Clone() function only calls the private virtual doClone() which actually * does the cloning for the derived object. * + * @todo: use this instead of Copy() everywhere, then kill Copy(). + * * @return A clone of the item. */ - EDA_ITEM* Clone() const { return doClone(); } + EDA_ITEM* Clone() const; // should not be inline, to save the ~ 6 bytes per call site. /** * Function IterateForward @@ -755,20 +758,19 @@ enum FILL_T { class EDA_TEXT { public: - int m_Thickness; /* pen size used to draw this text */ - int m_Orient; /* Orient in 0.1 degrees */ - - wxString m_Text; /* text! */ - wxPoint m_Pos; /* XY position of anchor text. */ - wxSize m_Size; /* XY size of text */ + wxString m_Text; + int m_Thickness; ///< pen size used to draw this text + int m_Orient; ///< Orient in 0.1 degrees + wxPoint m_Pos; ///< XY position of anchor text. + wxSize m_Size; ///< XY size of text bool m_Mirror; ///< true iff mirrored - int m_Attributs; /* flags (visible...) */ - bool m_Italic; /* true to simulate (or use if exists) - * an italic font... */ - bool m_Bold; /* true to simulate a bold font ... */ - GRTextHorizJustifyType m_HJustify; /* Horiz justification */ - GRTextVertJustifyType m_VJustify; /* Vertical justification */ - bool m_MultilineAllowed; /* true to use multiline option, false + int m_Attributs; ///< bit flags such as visible, etc. + bool m_Italic; ///< should be italic font (if available) + bool m_Bold; ///< should be bold font (if available) + GRTextHorizJustifyType m_HJustify; ///< horizontal justification + GRTextVertJustifyType m_VJustify; ///< vertical justification + + bool m_MultilineAllowed; /**< true to use multiline option, false * to use only single line text * Single line is faster in * calculations than multiline */ @@ -798,7 +800,7 @@ public: void SetItalic( bool isItalic ) { m_Italic = isItalic; } bool IsItalic() const { return m_Italic; } - void SetMirrored( bool doMirror ) { m_Mirror = doMirror; } + void SetMirrored( bool isMirrored ) { m_Mirror = isMirrored; } bool IsMirrored() const { return m_Mirror; } /** diff --git a/pcbnew/block.cpp b/pcbnew/block.cpp index 5e6946f0e0..d1eff9213b 100644 --- a/pcbnew/block.cpp +++ b/pcbnew/block.cpp @@ -854,7 +854,7 @@ void PCB_EDIT_FRAME::Block_Duplicate() module->m_Flags = 0; newitem = new_module = new MODULE( m_Pcb ); new_module->Copy( module ); - new_module->m_TimeStamp = GetNewTimeStamp(); + new_module->SetTimeStamp( GetNewTimeStamp() ); m_Pcb->m_Modules.PushFront( new_module ); } break; @@ -877,7 +877,7 @@ void PCB_EDIT_FRAME::Block_Duplicate() { ZONE_CONTAINER* new_zone = new ZONE_CONTAINER( (BOARD*) item->GetParent() ); new_zone->Copy( (ZONE_CONTAINER*) item ); - new_zone->m_TimeStamp = GetNewTimeStamp(); + new_zone->SetTimeStamp( GetNewTimeStamp() ); newitem = new_zone; m_Pcb->Add( new_zone ); } diff --git a/pcbnew/block_module_editor.cpp b/pcbnew/block_module_editor.cpp index ea4856d460..2d2457cad4 100644 --- a/pcbnew/block_module_editor.cpp +++ b/pcbnew/block_module_editor.cpp @@ -408,7 +408,7 @@ void CopyMarkedItems( MODULE* module, wxPoint offset ) module->m_Pads.PushFront( NewPad ); } - for( BOARD_ITEM* item = module->m_Drawings; item; item = item->Next() ) + for( BOARD_ITEM* item = module->m_Drawings; item; item = item->Next() ) { if( item->m_Selected == 0 ) continue; @@ -473,16 +473,21 @@ void MoveMarkedItems( MODULE* module, wxPoint offset ) switch( item->Type() ) { case PCB_MODULE_TEXT_T: - ( (TEXTE_MODULE*) item )->m_Pos += offset; - ( (TEXTE_MODULE*) item )->m_Pos0 += offset; + { + TEXTE_MODULE* tm = (TEXTE_MODULE*) item; + tm->m_Pos += offset; + tm->SetPos0( tm->GetPos0() + offset ); + } break; case PCB_MODULE_EDGE_T: - ( (EDGE_MODULE*) item )->m_Start += offset; - ( (EDGE_MODULE*) item )->m_End += offset; - - ( (EDGE_MODULE*) item )->m_Start0 += offset; - ( (EDGE_MODULE*) item )->m_End0 += offset; + { + EDGE_MODULE* em = (EDGE_MODULE*) item; + em->m_Start += offset; + em->m_End += offset; + em->m_Start0 += offset; + em->m_End0 += offset; + } break; default: @@ -571,20 +576,25 @@ void MirrorMarkedItems( MODULE* module, wxPoint offset ) switch( item->Type() ) { case PCB_MODULE_EDGE_T: - EDGE_MODULE * edge; - edge = (EDGE_MODULE*) item; - SETMIRROR( edge->m_Start.x ); - edge->m_Start0.x = edge->m_Start.x; - SETMIRROR( edge->m_End.x ); - edge->m_End0.x = edge->m_End.x; - NEGATE( edge->m_Angle ); + { + EDGE_MODULE* em = (EDGE_MODULE*) item; + SETMIRROR( em->m_Start.x ); + em->m_Start0.x = em->m_Start.x; + SETMIRROR( em->m_End.x ); + em->m_End0.x = em->m_End.x; + NEGATE( em->m_Angle ); + } break; case PCB_MODULE_TEXT_T: - tmp = ( (TEXTE_MODULE*) item )->GetPosition(); - SETMIRROR( tmp.x ); - ( (TEXTE_MODULE*) item )->SetPosition( tmp ); - ( (TEXTE_MODULE*) item )->m_Pos0.x = ( (TEXTE_MODULE*) item )->GetPosition().x; + { + TEXTE_MODULE* tm = (TEXTE_MODULE*) item; + tmp = tm->GetPosition(); + SETMIRROR( tmp.x ); + tm->SetPosition( tmp ); + tmp.y = tm->GetPos0().y; + tm->SetPos0( tmp ); + } break; default: @@ -633,20 +643,24 @@ void RotateMarkedItems( MODULE* module, wxPoint offset ) switch( item->Type() ) { case PCB_MODULE_EDGE_T: - ROTATE( ( (EDGE_MODULE*) item )->m_Start ); - ( (EDGE_MODULE*) item )->m_Start0 = ( (EDGE_MODULE*) item )->m_Start; - ROTATE( ( (EDGE_MODULE*) item )->m_End ); - ( (EDGE_MODULE*) item )->m_End0 = ( (EDGE_MODULE*) item )->m_End; + { + EDGE_MODULE* em = (EDGE_MODULE*) item; + ROTATE( em->m_Start ); + em->m_Start0 = em->m_Start; + ROTATE( em->m_End ); + em->m_End0 = em->m_End; + } break; case PCB_MODULE_TEXT_T: { - wxPoint pos = ( (TEXTE_MODULE*) item )->GetPosition(); + TEXTE_MODULE* tm = (TEXTE_MODULE*) item; + wxPoint pos = tm->GetPosition(); ROTATE( pos ); - ( (TEXTE_MODULE*) item )->SetPosition( pos ); + tm->SetPosition( pos ); + tm->SetPos0( tm->GetPosition() ); + tm->SetOrientation( tm->GetOrientation() + 900 ); } - ( (TEXTE_MODULE*) item )->m_Pos0 = ( (TEXTE_MODULE*) item )->GetPosition(); - ( (TEXTE_MODULE*) item )->m_Orient += 900; break; default: diff --git a/pcbnew/class_dimension.cpp b/pcbnew/class_dimension.cpp index 6e80cebd8c..397cdb9fb7 100644 --- a/pcbnew/class_dimension.cpp +++ b/pcbnew/class_dimension.cpp @@ -71,7 +71,7 @@ void DIMENSION::Copy( DIMENSION* source ) m_Pos = source->m_Pos; m_Shape = source->m_Shape; m_Unit = source->m_Unit; - m_TimeStamp = GetNewTimeStamp(); + SetTimeStamp( GetNewTimeStamp() ); m_Text->Copy( source->m_Text ); m_crossBarOx = source->m_crossBarOx; diff --git a/pcbnew/class_drawsegment.cpp b/pcbnew/class_drawsegment.cpp index 61974753ca..8b9872c575 100644 --- a/pcbnew/class_drawsegment.cpp +++ b/pcbnew/class_drawsegment.cpp @@ -48,7 +48,7 @@ void DRAWSEGMENT::Copy( DRAWSEGMENT* source ) m_End = source->m_End; m_Shape = source->m_Shape; m_Angle = source->m_Angle; - m_TimeStamp = source->m_TimeStamp; + SetTimeStamp( source->m_TimeStamp ); m_BezierC1 = source->m_BezierC1; m_BezierC2 = source->m_BezierC1; m_BezierPoints = source->m_BezierPoints; diff --git a/pcbnew/class_drawsegment.h b/pcbnew/class_drawsegment.h index 2a44cdfd5e..e1f588028b 100644 --- a/pcbnew/class_drawsegment.h +++ b/pcbnew/class_drawsegment.h @@ -41,6 +41,7 @@ public: DRAWSEGMENT* Back() const { return (DRAWSEGMENT*) Pback; } void SetWidth( int aWidth ) { m_Width = aWidth; } + int GetWidth() const { return m_Width; } void SetStart( const wxPoint& aStart ) { m_Start = aStart; } @@ -52,10 +53,12 @@ public: * @param aAngle is tenths of degrees, but will soon be degrees. */ void SetAngle( double aAngle ); // encapsulates the transition to degrees + double GetAngle() const { return m_Angle; } void SetType( int aType ) { m_Type = aType; } void SetShape( int aShape ) { m_Shape = aShape; } + int GetShape() const { return m_Shape; } void SetBezControl1( const wxPoint& aPoint ) { m_BezierC1 = aPoint; } void SetBezControl2( const wxPoint& aPoint ) { m_BezierC2 = aPoint; } @@ -104,8 +107,8 @@ public: */ MODULE* GetParentModule() const; - std::vector& GetBezierPoints() { return m_BezierPoints; }; - std::vector& GetPolyPoints() { return m_PolyPoints; }; + const std::vector& GetBezierPoints() const { return m_BezierPoints; }; + const std::vector& GetPolyPoints() const { return m_PolyPoints; }; void SetBezierPoints( std::vector& aPoints ) { diff --git a/pcbnew/class_edge_mod.cpp b/pcbnew/class_edge_mod.cpp index 4d72b4729b..5deb6e6890 100644 --- a/pcbnew/class_edge_mod.cpp +++ b/pcbnew/class_edge_mod.cpp @@ -223,7 +223,7 @@ void EDGE_MODULE::DisplayInfo( EDA_DRAW_FRAME* frame ) frame->AppendMsgPanel( _( "Module" ), module->m_Reference->m_Text, DARKCYAN ); frame->AppendMsgPanel( _( "Value" ), module->m_Value->m_Text, BLUE ); - msg.Printf( wxT( "%8.8lX" ), module->m_TimeStamp ); + msg.Printf( wxT( "%8.8lX" ), module->GetTimeStamp() ); frame->AppendMsgPanel( _( "TimeStamp" ), msg, BROWN ); frame->AppendMsgPanel( _( "Mod Layer" ), board->GetLayerName( module->GetLayer() ), RED ); frame->AppendMsgPanel( _( "Seg Layer" ), board->GetLayerName( GetLayer() ), RED ); diff --git a/pcbnew/class_mire.cpp b/pcbnew/class_mire.cpp index 33d0d168f3..518eecfdd1 100644 --- a/pcbnew/class_mire.cpp +++ b/pcbnew/class_mire.cpp @@ -50,7 +50,7 @@ void PCB_TARGET::Copy( PCB_TARGET* source ) m_Pos = source->m_Pos; m_Shape = source->m_Shape; m_Size = source->m_Size; - m_TimeStamp = GetNewTimeStamp(); + SetTimeStamp( GetNewTimeStamp() ); } diff --git a/pcbnew/class_module.cpp b/pcbnew/class_module.cpp index 34aeaf17c8..84a04f5661 100644 --- a/pcbnew/class_module.cpp +++ b/pcbnew/class_module.cpp @@ -125,7 +125,7 @@ void MODULE::Copy( MODULE* aModule ) m_LastEdit_Time = aModule->m_LastEdit_Time; m_Link = aModule->m_Link; m_Path = aModule->m_Path; //is this correct behavior? - m_TimeStamp = GetNewTimeStamp(); + SetTimeStamp( GetNewTimeStamp() ); m_LocalClearance = aModule->m_LocalClearance; m_LocalSolderMaskMargin = aModule->m_LocalSolderMaskMargin; diff --git a/pcbnew/class_module.h b/pcbnew/class_module.h index dd83b76a1c..10e32b27e4 100644 --- a/pcbnew/class_module.h +++ b/pcbnew/class_module.h @@ -23,22 +23,22 @@ class D_PAD; class BOARD; -enum Mod_Attribut /* Attributes used for modules */ +/** + * Enum MODULE_ATTR_T + * is the set of attributes allowed within a MODULE, using MODULE::SetAttributes() + * and MODULE::GetAttributes(). These are to be ORed together when calling + * MODULE::SetAttrbute() + */ +enum MODULE_ATTR_T { - MOD_DEFAULT = 0, /* Type default */ - MOD_CMS = 1, /* Set for modules listed in the automatic insertion list - * (usually SMD footprints) */ - MOD_VIRTUAL = 2 /* Virtual component: when created by copper shapes on - * board (Like edge card connectors, mounting hole...) */ + MOD_DEFAULT = 0, ///< default + MOD_CMS = 1, ///< Set for modules listed in the automatic insertion list + ///< (usually SMD footprints) + MOD_VIRTUAL = 2 ///< Virtual component: when created by copper shapes on + ///< board (Like edge card connectors, mounting hole...) }; -/* flags for autoplace and autoroute (.m_ModuleStatus member) */ -#define MODULE_is_LOCKED 0x01 /* module LOCKED: no autoplace allowed */ -#define MODULE_is_PLACED 0x02 /* In autoplace: module automatically placed */ -#define MODULE_to_PLACE 0x04 /* In autoplace: module waiting for autoplace */ - - class MODULE : public BOARD_ITEM { @@ -53,22 +53,33 @@ public: wxString m_LibRef; /* Name of the module in library (and * the default value when loading a * module from the library) */ + wxString m_AlternateReference; /* Used when m_Reference cannot * be used to identify the * footprint ( after a full * reannotation of the schematic */ - int m_Attributs; /* Flag bits ( see Mod_Attribut ) */ + int m_Attributs; ///< Flag bits ( see Mod_Attribut ) int flag; /* Use to trace ratsnest and auto routing. */ - int m_ModuleStatus; /* For autoplace: flags (LOCKED, AUTOPLACED) */ + + int m_ModuleStatus; ///< For autoplace: flags (LOCKED, AUTOPLACED) + +// m_ModuleStatus bits: +#define MODULE_is_LOCKED 0x01 ///< module LOCKED: no autoplace allowed +#define MODULE_is_PLACED 0x02 ///< In autoplace: module automatically placed +#define MODULE_to_PLACE 0x04 ///< In autoplace: module waiting for autoplace + + EDA_RECT m_BoundaryBox; // Bounding box : coordinates on board, real orientation. int m_PadNum; // Pad count int m_AltPadNum; /* Pad with netcode > 0 (active pads) count */ - int m_CntRot90; /* Automatic placement : cost ( 0..10 ) - * for 90 degrees rotation (Horiz<->Vertical) */ - int m_CntRot180; /* Automatic placement : cost ( 0..10 ) - * for 180 degrees rotation (UP <->Down) */ + int m_CntRot90; ///< Automatic placement : cost ( 0..10 ) + ///< for 90 degrees rotation (Horiz<->Vertical) + + int m_CntRot180; ///< Automatic placement : cost ( 0..10 ) + ///< for 180 degrees rotation (UP <->Down) + wxSize m_Ext; /* Automatic placement margin around the module */ double m_Surface; // Bounding box area @@ -79,16 +90,16 @@ public: wxString m_Doc; // Module Description (info for users) wxString m_KeyWord; // Keywords to select the module in lib - // Local clearance. When null, the netclasses values are used. Usually - // the local clearance is null + // Local tolerances. When zero, this means the corresponding netclass value + // is used. Usually theses local tolerances zero, in deference to the + // corresponding netclass values. int m_LocalClearance; + int m_LocalSolderMaskMargin; ///< Solder mask margin + int m_LocalSolderPasteMargin; ///< Solder paste margin + ///< absolute value - // Local mask margins: when NULL, the global design values are used - int m_LocalSolderMaskMargin; // Solder mask margin - int m_LocalSolderPasteMargin; /* Solder paste margin - * absolute value */ - double m_LocalSolderPasteMarginRatio; /* Solder mask margin ratio - * value of pad size */ + double m_LocalSolderPasteMarginRatio; ///< Solder mask margin ratio + ///< value of pad size // The final margin is the sum of these 2 values public: @@ -139,9 +150,35 @@ public: void SetPosition( const wxPoint& aPos ); // overload void SetOrientation( int newangle ); - int GetOrientation() const { return m_Orient; } + const wxString& GetLibRef() const { return m_LibRef; } + void SetLibRef( const wxString& aLibRef ) { m_LibRef = aLibRef; } + + const wxString& GetDescription() const { return m_Doc; } + void SetDescription( const wxString& aDoc ) { m_Doc = aDoc; } + + const wxString& GetKeywords() const { return m_KeyWord; } + void SetKeywords( const wxString& aKeywords ) { m_KeyWord = aKeywords; } + + const wxString& GetPath() const { return m_Path; } + void SetPath( const wxString& aPath ) { m_Path = aPath; } + + int GetLocalSolderMaskMargin() const { return m_LocalSolderMaskMargin; } + void SetLocalSolderMaskMargin( int aMargin ) { m_LocalSolderMaskMargin = aMargin; } + + int GetLocalClearance() const { return m_LocalClearance; } + void SetLocalClearance( int aClearance ) { m_LocalClearance = aClearance; } + + int GetLocalSolderPasteMargin() const { return m_LocalSolderPasteMargin; } + void SetLocalSolderPasteMargin( int aMargin ) { m_LocalSolderPasteMargin = aMargin; } + + double GetLocalSolderPasteMarginRatio() const { return m_LocalSolderPasteMarginRatio; } + void SetLocalSolderPasteMarginRatio( double aRatio ) { m_LocalSolderPasteMarginRatio = aRatio; } + + int GetAttributes() const { return m_Attributs; } + void SetAttributes( int aAttributes ) { m_Attributs = aAttributes; } + /** * Function Move * move this object. @@ -177,11 +214,11 @@ public: /** * Function SetLocked * sets the MODULE_is_LOCKED bit in the m_ModuleStatus - * @param setLocked When true means turn on locked status, else unlock + * @param isLocked When true means turn on locked status, else unlock */ - void SetLocked( bool setLocked ) + void SetLocked( bool isLocked ) { - if( setLocked ) + if( isLocked ) m_ModuleStatus |= MODULE_is_LOCKED; else m_ModuleStatus &= ~MODULE_is_LOCKED; @@ -197,6 +234,7 @@ public: } void SetLastEditTime( long aTime ) { m_LastEdit_Time = aTime; } + long GetLastEditTime() const { return m_LastEdit_Time; } /* Reading and writing data on files */ @@ -340,7 +378,7 @@ public: virtual BITMAP_DEF GetMenuImage() const { return module_xpm; } - #if defined(DEBUG) +#if defined(DEBUG) /** * Function Show diff --git a/pcbnew/class_module_transform_functions.cpp b/pcbnew/class_module_transform_functions.cpp index 8b64e6f20c..7fee9ff96f 100644 --- a/pcbnew/class_module_transform_functions.cpp +++ b/pcbnew/class_module_transform_functions.cpp @@ -150,7 +150,7 @@ void MODULE::Rotate(const wxPoint& aRotCentre, int aAngle) wxPoint newpos = m_Pos; RotatePoint( &newpos, aRotCentre, aAngle ); SetPosition( newpos ); - SetOrientation( m_Orient + aAngle ); + SetOrientation( GetOrientation() + aAngle ); } diff --git a/pcbnew/class_pad.cpp b/pcbnew/class_pad.cpp index 35ff4e6902..ccf302a071 100644 --- a/pcbnew/class_pad.cpp +++ b/pcbnew/class_pad.cpp @@ -139,32 +139,33 @@ const wxPoint D_PAD::ReturnShapePos() } -/* Return pad name as string in a wxString - */ -wxString D_PAD::ReturnStringPadName() const +const wxString D_PAD::GetPadName() const { - wxString name; + // Return pad name as wxString, assume it starts as a non-terminated + // utf8 character sequence - ReturnStringPadName( name ); - return name; + char temp[sizeof(m_Padname)+1]; // a place to terminate with '\0' + + strncpy( temp, m_Padname, sizeof(m_Padname) ); + + temp[sizeof(m_Padname)] = 0; + + return FROM_UTF8( temp ); } -/* Return pad name as string in a buffer - */ void D_PAD::ReturnStringPadName( wxString& text ) const { - int ii; + // Return pad name as wxString, assume it starts as a non-terminated + // utf8 character sequence - text.Empty(); + char temp[sizeof(m_Padname)+1]; // a place to terminate with '\0' - for( ii = 0; ii < 4; ii++ ) - { - if( m_Padname[ii] == 0 ) - break; + strncpy( temp, m_Padname, sizeof(m_Padname) ); - text.Append( m_Padname[ii] ); - } + temp[sizeof(m_Padname)] = 0; + + text = FROM_UTF8( temp ); } @@ -712,7 +713,7 @@ wxString D_PAD::GetSelectMenuText() const padlayers = _( "???" ); text.Printf( _( "Pad [%s] (%s) of %s" ), - GetChars(ReturnStringPadName() ), GetChars( padlayers ), + GetChars(GetPadName() ), GetChars( padlayers ), GetChars(( (MODULE*) GetParent() )->GetReference() ) ); return text; diff --git a/pcbnew/class_pad.h b/pcbnew/class_pad.h index 2306d9fe26..6df7e577a8 100644 --- a/pcbnew/class_pad.h +++ b/pcbnew/class_pad.h @@ -117,8 +117,9 @@ public: int m_ShapeMaxRadius; // radius of the circle containing the pad shape int m_Attribut; // NORMAL, PAD_SMD, PAD_CONN, PAD_HOLE_NOT_PLATED int m_Orient; // in 1/10 degrees - static int m_PadSketchModePenSize; // Pen size used to draw pads in sketch mode - // (mode used to print pads on silkscreen layer) + + static int m_PadSketchModePenSize; // Pen size used to draw pads in sketch mode + // (mode used to print pads on silkscreen layer) int m_LengthDie; // Length net from pad to die on chip @@ -146,43 +147,51 @@ public: D_PAD* Next() { return (D_PAD*) Pnext; } - /** - * Function GetNetname - * @return const wxString * , a pointer to the full netname - */ - wxString GetNetname() const { return m_Netname; } - - /** - * Function GetShortNetname - * @return const wxString * , a pointer to the short netname - */ - wxString GetShortNetname() const { return m_ShortNetname; } - /** * Function SetNetname * @param aNetname: the new netname */ void SetNetname( const wxString& aNetname ); + /** + * Function GetNetname + * @return const wxString& - the full netname + */ + const wxString& GetNetname() const { return m_Netname; } + + /** + * Function GetShortNetname + * @return const wxString& - the short netname + */ + const wxString& GetShortNetname() const { return m_ShortNetname; } + /** * Function GetShape * @return the shape of this pad. */ int GetShape() const { return m_PadShape & 0xFF; } - void SetShape( int aShape ) { m_PadShape = aShape; } + void SetShape( int aShape ) { m_PadShape = aShape; } + void SetPosition( const wxPoint& aPos ) { m_Pos = aPos; } // overload const wxPoint GetPosition() const // overload { return m_Pos; } - void SetPosition( const wxPoint& aPos ) { m_Pos = aPos; } // overload - void SetPos0( const wxPoint& aPos ) { m_Pos0 = aPos; } + const wxPoint& GetPos0() const { return m_Pos0; } + void SetSize( const wxSize& aSize ) { m_Size = aSize; } + const wxSize& GetSize() const { return m_Size; } + void SetDelta( const wxSize& aSize ) { m_DeltaSize = aSize; } + const wxSize& GetDelta() const { return m_DeltaSize; } + void SetDrillSize( const wxSize& aSize ) { m_Drill = aSize; } + const wxSize& GetDrillSize() const { return m_Drill; } + void SetOffset( const wxSize& aOffset ) { m_Offset = aOffset; } + const wxSize& GetOffset() const { return m_Offset; } /** * Function SetOrientation @@ -198,15 +207,29 @@ public: double GetOrientation() const { return m_Orient; } void SetDrillShape( int aDrillShape ) { m_DrillShape = aDrillShape; } - void SetLayerMask( int aLayerMask ) { m_layerMask = aLayerMask; } - void SetAttribute( int aAttribute ) { m_Attribut = aAttribute; } - void SetDieLength( int aLength ) { m_LengthDie = aLength; } - void SetSolderMaskMargin( int aLength ) { m_LocalSolderMaskMargin = aLength; } - void SetSolderPasteMargin( int aLength ) { m_LocalSolderPasteMargin = aLength; } - void SetSolderPasteRatio( double aRatio ) { m_LocalSolderPasteMarginRatio = aRatio; } + int GetDrillShape() const { return m_DrillShape; } + + void SetLayerMask( int aLayerMask ) { m_layerMask = aLayerMask; } + int GetLayerMask() const { return m_layerMask; } + + void SetAttribute( int aAttribute ) { m_Attribut = aAttribute; } + int GetAttribute() const { return m_Attribut; } + + void SetDieLength( int aLength ) { m_LengthDie = aLength; } + int GetDieLength() const { return m_LengthDie; } + + int GetLocalSolderMaskMargin() const { return m_LocalSolderMaskMargin; } + void SetLocalSolderMaskMargin( int aMargin ) { m_LocalSolderMaskMargin = aMargin; } + + int GetLocalClearance() const { return m_LocalClearance; } + void SetLocalClearance( int aClearance ) { m_LocalClearance = aClearance; } + + int GetLocalSolderPasteMargin() const { return m_LocalSolderPasteMargin; } + void SetLocalSolderPasteMargin( int aMargin ) { m_LocalSolderPasteMargin = aMargin; } + + double GetLocalSolderPasteMarginRatio() const { return m_LocalSolderPasteMarginRatio; } + void SetLocalSolderPasteMarginRatio( double aRatio ) { m_LocalSolderPasteMarginRatio = aRatio; } - /// A local override of the Module's clearance - void SetPadClearance( int aLength ) { m_LocalClearance = aLength; } /** * Function TransformShapeWithClearanceToPolygon @@ -324,11 +347,9 @@ public: */ int BuildSegmentFromOvalShape( wxPoint& aSegStart, wxPoint& aSegEnd, int aRotation ) const; - // others void SetPadName( const wxString& name ); // Change pad name void SetPadName( const char* aName ); - - wxString ReturnStringPadName() const; // Return pad name as string in a wxString + const wxString GetPadName() const; void ReturnStringPadName( wxString& text ) const; // Return pad name as string in a buffer diff --git a/pcbnew/class_text_mod.h b/pcbnew/class_text_mod.h index 43553805b0..d86e810ae6 100644 --- a/pcbnew/class_text_mod.h +++ b/pcbnew/class_text_mod.h @@ -27,14 +27,19 @@ class MODULE; class TEXTE_MODULE : public BOARD_ITEM, public EDA_TEXT { -/* Note: orientation in 1/10 deg relative to the footprint - * Physical orient is m_Orient + m_Parent->m_Orient - */ -public: - wxPoint m_Pos0; // text coordinates relatives to the footprint anchor, orient 0 - // Text coordinate ref point is the text centre - char m_Type; // 0: ref,1: val, others = 2..255 - bool m_NoShow; // true = invisible + // @todo eliminate these friends, make them use accessors + friend class MODULE; + friend class FOOTPRINT_EDIT_FRAME; + + /* Note: orientation in 1/10 deg relative to the footprint + * Physical orient is m_Orient + m_Parent->m_Orient + */ + + int m_Type; ///< 0=ref, 1=val, etc. + bool m_NoShow; ///< true = invisible + + wxPoint m_Pos0; ///< text coordinates relatives to the footprint anchor, orient 0. + ///< text coordinate ref point is the text centre public: TEXTE_MODULE( MODULE* parent, int text_type = TEXT_is_DIVERS ); @@ -45,6 +50,11 @@ public: TEXTE_MODULE* Back() const { return (TEXTE_MODULE*) Pback; } + void SetPosition( const wxPoint& aPos ) // overload a base + { + m_Pos = aPos; // in EDA_TEXT + } + const wxPoint GetPosition() const // overload a base { return m_Pos; // from EDA_TEXT @@ -52,16 +62,13 @@ public: /// @deprecated it seems void SetType( int aType ) { m_Type = aType; } - - void SetPosition( const wxPoint& aPos ) // overload a base - { - m_Pos = aPos; // in EDA_TEXT - } + int GetType() const { return m_Type; } void SetVisible( bool isVisible ) { m_NoShow = !isVisible; } bool IsVisible() const { return !m_NoShow; } void SetPos0( const wxPoint& aPos ) { m_Pos0 = aPos; } + const wxPoint& GetPos0() const { return m_Pos0; } void Copy( TEXTE_MODULE* source ); // copy structure diff --git a/pcbnew/class_track.cpp b/pcbnew/class_track.cpp index 18b9a9cf70..c956269628 100644 --- a/pcbnew/class_track.cpp +++ b/pcbnew/class_track.cpp @@ -230,7 +230,7 @@ TRACK::TRACK( const TRACK& Source ) : SetNet( Source.GetNet() ); m_Flags = Source.m_Flags; - m_TimeStamp = Source.m_TimeStamp; + SetTimeStamp( Source.m_TimeStamp ); SetStatus( Source.ReturnStatus() ); m_Start = Source.m_Start; m_End = Source.m_End; diff --git a/pcbnew/class_zone.cpp b/pcbnew/class_zone.cpp index bbedb78cc1..2310918237 100644 --- a/pcbnew/class_zone.cpp +++ b/pcbnew/class_zone.cpp @@ -815,7 +815,7 @@ void ZONE_CONTAINER::Copy( ZONE_CONTAINER* src ) m_Parent = src->m_Parent; m_Layer = src->m_Layer; SetNet( src->GetNet() ); - m_TimeStamp = src->m_TimeStamp; + SetTimeStamp( src->m_TimeStamp ); m_Poly->RemoveAllContours(); m_Poly->Copy( src->m_Poly ); // copy outlines m_CornerSelection = -1; // For corner moving, corner index to drag, or -1 if no selection diff --git a/pcbnew/collectors.cpp b/pcbnew/collectors.cpp index ef010802d6..096df2834f 100644 --- a/pcbnew/collectors.cpp +++ b/pcbnew/collectors.cpp @@ -270,7 +270,7 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_ITEM* testItem, const void* testDa case PCB_MODULE_TEXT_T: module = (MODULE*) item->GetParent(); - if( m_Guide->IgnoreMTextsMarkedNoShow() && ( (TEXTE_MODULE*) item )->m_NoShow ) + if( m_Guide->IgnoreMTextsMarkedNoShow() && !( (TEXTE_MODULE*) item )->IsVisible() ) goto exit; if( module ) diff --git a/pcbnew/controle.cpp b/pcbnew/controle.cpp index 5189c4ef5f..1c952a113c 100644 --- a/pcbnew/controle.cpp +++ b/pcbnew/controle.cpp @@ -168,14 +168,14 @@ BOARD_ITEM* PCB_BASE_FRAME::PcbGeneralLocateAndDisplay( int aHotKeyCode ) continue; /* Found a TYPE ZONE */ - if( item->m_TimeStamp == timestampzone ) // Remove it, redundant, zone already found + if( item->GetTimeStamp() == timestampzone ) // Remove it, redundant, zone already found { m_Collector->Remove( ii ); ii--; } else { - timestampzone = item->m_TimeStamp; + timestampzone = item->GetTimeStamp(); } } diff --git a/pcbnew/cross-probing.cpp b/pcbnew/cross-probing.cpp index 23f7f3e1f6..feb065ea6b 100644 --- a/pcbnew/cross-probing.cpp +++ b/pcbnew/cross-probing.cpp @@ -164,7 +164,7 @@ void PCB_EDIT_FRAME::SendMessageToEESCHEMA( BOARD_ITEM* objectToSync ) case PCB_PAD_T: module = (MODULE*) objectToSync->GetParent(); pad = (D_PAD*) objectToSync; - msg = pad->ReturnStringPadName(); + msg = pad->GetPadName(); sprintf( cmd, "$PART: \"%s\" $PAD: \"%s\"", TO_UTF8( module->m_Reference->m_Text ), TO_UTF8( msg ) ); @@ -176,9 +176,9 @@ void PCB_EDIT_FRAME::SendMessageToEESCHEMA( BOARD_ITEM* objectToSync ) module = (MODULE*) objectToSync->GetParent(); text_mod = (TEXTE_MODULE*) objectToSync; - if( text_mod->m_Type == REFERENCE ) + if( text_mod->GetType() == REFERENCE ) text_key = "$REF:"; - else if( text_mod->m_Type == VALUE ) + else if( text_mod->GetType() == VALUE ) text_key = "$VAL:"; else break; diff --git a/pcbnew/dialogs/dialog_edit_module_for_BoardEditor.cpp b/pcbnew/dialogs/dialog_edit_module_for_BoardEditor.cpp index f3ab292a78..18feb5d892 100644 --- a/pcbnew/dialogs/dialog_edit_module_for_BoardEditor.cpp +++ b/pcbnew/dialogs/dialog_edit_module_for_BoardEditor.cpp @@ -143,10 +143,9 @@ void DIALOG_MODULE_BOARD_EDITOR::OnCancelClick( wxCommandEvent& event ) void DIALOG_MODULE_BOARD_EDITOR::GotoModuleEditor( wxCommandEvent& event ) { - if( m_CurrentModule->m_TimeStamp == 0 ) // Module Editor needs a non - // null timestamp + if( m_CurrentModule->GetTimeStamp() == 0 ) // Module Editor needs a non null timestamp { - m_CurrentModule->m_TimeStamp = GetNewTimeStamp(); + m_CurrentModule->SetTimeStamp( GetNewTimeStamp() ); m_Parent->OnModify(); } diff --git a/pcbnew/dialogs/dialog_edit_module_text.cpp b/pcbnew/dialogs/dialog_edit_module_text.cpp index 49e3cd4d40..4ba044924b 100644 --- a/pcbnew/dialogs/dialog_edit_module_text.cpp +++ b/pcbnew/dialogs/dialog_edit_module_text.cpp @@ -108,11 +108,11 @@ void DialogEditModuleText::initDlg( ) m_ModuleInfoText->SetLabel( msg ); - if( m_currentText->m_Type == TEXT_is_VALUE ) + if( m_currentText->GetType() == TEXT_is_VALUE ) m_TextDataTitle->SetLabel( _( "Value:" ) ); - else if( m_currentText->m_Type == TEXT_is_DIVERS ) + else if( m_currentText->GetType() == TEXT_is_DIVERS ) m_TextDataTitle->SetLabel( _( "Text:" ) ); - else if( m_currentText->m_Type != TEXT_is_REFERENCE ) + else if( m_currentText->GetType() != TEXT_is_REFERENCE ) m_TextDataTitle->SetLabel( wxT( "???" ) ); m_Name->SetValue( m_currentText->m_Text ); @@ -128,11 +128,11 @@ void DialogEditModuleText::initDlg( ) m_parent->m_InternalUnits ); AddUnitSymbol( *m_PosXTitle ); - PutValueInLocalUnits( *m_TxtPosCtrlX, m_currentText->m_Pos0.x, + PutValueInLocalUnits( *m_TxtPosCtrlX, m_currentText->GetPos0().x, m_parent->m_InternalUnits ); AddUnitSymbol( *m_PosYTitle ); - PutValueInLocalUnits( *m_TxtPosCtrlY, m_currentText->m_Pos0.y, + PutValueInLocalUnits( *m_TxtPosCtrlY, m_currentText->GetPos0().y, m_parent->m_InternalUnits ); AddUnitSymbol( *m_WidthTitle ); @@ -144,9 +144,8 @@ void DialogEditModuleText::initDlg( ) if( (text_orient != 0) ) m_Orient->SetSelection( 1 ); - if( m_currentText->m_NoShow ) + if( !m_currentText->IsVisible() ) m_Show->SetSelection( 1 );; - } @@ -167,13 +166,15 @@ void DialogEditModuleText::OnOkClick( wxCommandEvent& event ) m_currentText->m_Italic = m_Style->GetSelection() == 1 ? true : false; + wxPoint tmp; msg = m_TxtPosCtrlX->GetValue(); - m_currentText->m_Pos0.x = ReturnValueFromString( g_UserUnit, msg, - m_parent->m_InternalUnits ); + tmp.x = ReturnValueFromString( g_UserUnit, msg, m_parent->m_InternalUnits ); + msg = m_TxtPosCtrlY->GetValue(); - m_currentText->m_Pos0.y = ReturnValueFromString( g_UserUnit, msg, - m_parent->m_InternalUnits ); + tmp.y = ReturnValueFromString( g_UserUnit, msg, m_parent->m_InternalUnits ); + + m_currentText->SetPos0( tmp ); msg = m_TxtSizeCtrlX->GetValue(); m_currentText->m_Size.x = ReturnValueFromString( g_UserUnit, msg, @@ -202,7 +203,8 @@ void DialogEditModuleText::OnOkClick( wxCommandEvent& event ) } m_currentText->SetThickness( width ); - m_currentText->m_NoShow = (m_Show->GetSelection() == 0) ? 0 : 1; + m_currentText->SetVisible( m_Show->GetSelection() == 0 ); + int text_orient = (m_Orient->GetSelection() == 0) ? 0 : 900; m_currentText->m_Orient = text_orient; diff --git a/pcbnew/dialogs/dialog_pad_properties.cpp b/pcbnew/dialogs/dialog_pad_properties.cpp index 04e38d2f89..4c6fb45256 100644 --- a/pcbnew/dialogs/dialog_pad_properties.cpp +++ b/pcbnew/dialogs/dialog_pad_properties.cpp @@ -214,7 +214,7 @@ void DIALOG_PAD_PROPERTIES::initValues() } m_staticTextWarningPadFlipped->Show(m_isFlipped); - m_PadNumCtrl->SetValue( m_dummyPad->ReturnStringPadName() ); + m_PadNumCtrl->SetValue( m_dummyPad->GetPadName() ); m_PadNetNameCtrl->SetValue( m_dummyPad->GetNetname() ); // Display current unit name in dialog: @@ -637,7 +637,7 @@ void DIALOG_PAD_PROPERTIES::PadPropertiesAccept( wxCommandEvent& event ) if( m_isFlipped ) m_CurrentPad->m_layerMask = ChangeSideMaskLayer( m_CurrentPad->m_layerMask ); - m_CurrentPad->SetPadName( g_Pad_Master.ReturnStringPadName() ); + m_CurrentPad->SetPadName( g_Pad_Master.GetPadName() ); if( m_CurrentPad->GetNetname() != g_Pad_Master.GetNetname() ) { diff --git a/pcbnew/editmod.cpp b/pcbnew/editmod.cpp index 5592b84084..c642a9c646 100644 --- a/pcbnew/editmod.cpp +++ b/pcbnew/editmod.cpp @@ -102,7 +102,7 @@ void FOOTPRINT_EDIT_FRAME::Place_Ancre( MODULE* pt_mod ) case PCB_MODULE_TEXT_T: #undef STRUCT #define STRUCT ( (TEXTE_MODULE*) PtStruct ) - STRUCT->m_Pos0 += moveVector; + STRUCT->SetPos0( STRUCT->GetPos0() + moveVector ); break; default: @@ -129,13 +129,13 @@ void FOOTPRINT_EDIT_FRAME::RemoveStruct( EDA_ITEM* Item ) { TEXTE_MODULE* text = (TEXTE_MODULE*) Item; - if( text->m_Type == TEXT_is_REFERENCE ) + if( text->GetType() == TEXT_is_REFERENCE ) { DisplayError( this, _( "Text is REFERENCE!" ) ); break; } - if( text->m_Type == TEXT_is_VALUE ) + if( text->GetType() == TEXT_is_VALUE ) { DisplayError( this, _( "Text is VALUE!" ) ); break; diff --git a/pcbnew/edtxtmod.cpp b/pcbnew/edtxtmod.cpp index 6582be988d..1a3218af61 100644 --- a/pcbnew/edtxtmod.cpp +++ b/pcbnew/edtxtmod.cpp @@ -36,7 +36,7 @@ static int TextInitialOrientation; // module text initial orientation for /* Add a new graphical text to the active module (footprint) * Note there always are 2 texts: reference and value. - * New texts have the member TEXTE_MODULE.m_Type set to TEXT_is_DIVERS + * New texts have the member TEXTE_MODULE.GetType() set to TEXT_is_DIVERS */ TEXTE_MODULE* PCB_BASE_FRAME::CreateTextModule( MODULE* Module, wxDC* DC ) { @@ -118,7 +118,7 @@ void PCB_BASE_FRAME::DeleteTextModule( TEXTE_MODULE* Text ) Module = (MODULE*) Text->GetParent(); - if( Text->m_Type == TEXT_is_DIVERS ) + if( Text->GetType() == TEXT_is_DIVERS ) { DrawPanel->RefreshDrawingRect( Text->GetBoundingBox() ); Text->DeleteStructure(); @@ -226,7 +226,7 @@ void PCB_BASE_FRAME::PlaceTexteModule( TEXTE_MODULE* Text, wxDC* DC ) Text->m_Pos = GetScreen()->GetCrossHairPosition(); wxPoint textRelPos = Text->m_Pos - Module->m_Pos; RotatePoint( &textRelPos, -Module->m_Orient ); - Text->m_Pos0 = textRelPos; + Text->SetPos0( textRelPos ); Text->m_Flags = 0; Module->m_Flags = 0; Module->m_LastEdit_Time = time( NULL ); diff --git a/pcbnew/export_gencad.cpp b/pcbnew/export_gencad.cpp index 9f9b76d698..0d85dc9b04 100644 --- a/pcbnew/export_gencad.cpp +++ b/pcbnew/export_gencad.cpp @@ -602,8 +602,8 @@ static void CreateComponentsSection( FILE* aFile, BOARD* aPcb ) SILKSCREEN_N_BACK : SILKSCREEN_N_FRONT]; fprintf( aFile, "TEXT %g %g %g %g %s %s \"%s\"", - textmod->m_Pos0.x / SCALE_FACTOR, - -textmod->m_Pos0.y / SCALE_FACTOR, + textmod->GetPos0().x / SCALE_FACTOR, + -textmod->GetPos0().y / SCALE_FACTOR, textmod->m_Size.x / SCALE_FACTOR, orient / 10.0, mirror, diff --git a/pcbnew/export_vrml.cpp b/pcbnew/export_vrml.cpp index b8984a2073..38f6aae0a2 100644 --- a/pcbnew/export_vrml.cpp +++ b/pcbnew/export_vrml.cpp @@ -834,7 +834,7 @@ static void export_vrml_zones( BOARD* pcb ) static void export_vrml_text_module( TEXTE_MODULE* module ) /*{{{*/ { - if( !module->m_NoShow ) + if( module->IsVisible() ) { wxSize size = module->m_Size; diff --git a/pcbnew/ioascii.cpp b/pcbnew/ioascii.cpp index 93b941548b..26e8515561 100644 --- a/pcbnew/ioascii.cpp +++ b/pcbnew/ioascii.cpp @@ -165,7 +165,7 @@ int PCB_BASE_FRAME::ReadListeSegmentDescr( LINE_READER* aReader, break; } - newTrack->m_TimeStamp = timeStamp; + newTrack->SetTimeStamp( timeStamp ); newTrack->m_Start.x = tempStartX; newTrack->m_Start.y = tempStartY; diff --git a/pcbnew/item_io.cpp b/pcbnew/item_io.cpp index a277757e96..852cb66f00 100644 --- a/pcbnew/item_io.cpp +++ b/pcbnew/item_io.cpp @@ -1737,7 +1737,7 @@ int ZONE_CONTAINER::ReadDescr( LINE_READER* aReader ) } else { - m_TimeStamp = ts; + SetTimeStamp( ts ); SetNet( netcode ); ReadDelimitedText( netname_buffer, netname_buffer, 1024 ); m_Netname = FROM_UTF8( netname_buffer ); diff --git a/pcbnew/kicad_plugin.cpp b/pcbnew/kicad_plugin.cpp index b0a5b81bf4..9d9073aae6 100644 --- a/pcbnew/kicad_plugin.cpp +++ b/pcbnew/kicad_plugin.cpp @@ -90,7 +90,10 @@ #include -#define VERSION_ERROR_FORMAT _( "File '%s' is format version %d.\nI only support format version <= %d.\nPlease upgrade PCBNew to load this file." ) +#define VERSION_ERROR_FORMAT _( "File '%s' is format version: %d.\nI only support format version <= %d.\nPlease upgrade PCBNew to load this file." ) +#define UNKNOWN_GRAPHIC_FORMAT _( "unknown graphic type: %d") +#define UNKNOWN_PAD_FORMAT _( "unknown pad type: %d") +#define UNKNOWN_PAD_ATTRIBUTE _( "unknown pad attribute: %d" ) /* #include @@ -389,7 +392,7 @@ void KICAD_PLUGIN::loadGENERAL() else if( TESTLINE( "NoConn" ) ) { - int tmp = atoi( line + SZ( "NoConn" ) ); + int tmp = intParse( line + SZ( "NoConn" ) ); m_board->m_NbNoconnect = tmp; } @@ -467,12 +470,12 @@ void KICAD_PLUGIN::loadSHEET() text = strtok( NULL, delims ); if( text ) - sheet->m_Size.x = atoi( text ); + sheet->m_Size.x = intParse( text ); text = strtok( NULL, delims ); if( text ) - sheet->m_Size.y = atoi( text ); + sheet->m_Size.y = intParse( text ); } break; @@ -569,7 +572,7 @@ void KICAD_PLUGIN::loadSETUP() else if( TESTLINE( "Layers" ) ) { - int tmp = atoi( line + SZ( "Layers" ) ); + int tmp = intParse( line + SZ( "Layers" ) ); m_board->SetCopperLayerCount( tmp ); } @@ -694,7 +697,7 @@ void KICAD_PLUGIN::loadSETUP() else if( TESTLINE( "MicroViasAllowed" ) ) { - int tmp = atoi( line + SZ( "MicroViasAllowed" ) ); + int tmp = intParse( line + SZ( "MicroViasAllowed" ) ); m_board->GetDesignSettings().m_MicroViasAllowed = tmp; } @@ -946,20 +949,24 @@ void KICAD_PLUGIN::loadMODULE() else if( TESTLINE( "At" ) ) // (At)tributes of module { + int attrs = MOD_DEFAULT; + data = line + SZ( "At" ); if( strstr( data, "SMD" ) ) - module->m_Attributs |= MOD_CMS; + attrs |= MOD_CMS; if( strstr( data, "VIRTUAL" ) ) - module->m_Attributs |= MOD_VIRTUAL; + attrs |= MOD_VIRTUAL; + + module->SetAttributes( attrs ); } else if( TESTLINE( "AR" ) ) // Alternate Reference { // e.g. "AR /47BA2624/45525076" data = strtok( line + SZ( "AR" ), delims ); - module->m_Path = FROM_UTF8( data ); + module->SetPath( FROM_UTF8( data ) ); } else if( TESTLINE( "$SHAPE3D" ) ) @@ -978,6 +985,31 @@ void KICAD_PLUGIN::loadMODULE() module->m_KeyWord = FROM_UTF8( StrPurge( line + SZ( "Kw" ) ) ); } + // test this longer similar string before the shorter ".SolderPaste" + else if( TESTLINE( ".SolderPasteRatio" ) ) + { + double tmp = atof( line + SZ( ".SolderPasteRatio" ) ); + module->SetLocalSolderPasteMarginRatio( tmp ); + } + + else if( TESTLINE( ".SolderPaste" ) ) + { + BIU tmp = biuParse( line + SZ( ".SolderPaste" ) ); + module->SetLocalSolderPasteMargin( tmp ); + } + + else if( TESTLINE( ".SolderMask" ) ) + { + BIU tmp = biuParse( line + SZ( ".SolderMask" ) ); + module->SetLocalSolderMaskMargin( tmp ); + } + + else if( TESTLINE( ".LocalClearance" ) ) + { + BIU tmp = biuParse( line + SZ( ".LocalClearance" ) ); + module->SetLocalClearance( tmp ); + } + else if( TESTLINE( "$EndMODULE" ) ) { module->CalculateBoundingBox(); @@ -1135,25 +1167,26 @@ void KICAD_PLUGIN::loadPAD( MODULE* aModule ) else if( TESTLINE( ".SolderMask" ) ) { BIU tmp = biuParse( line + SZ( ".SolderMask" ) ); - pad->SetSolderMaskMargin( tmp ); + pad->SetLocalSolderMaskMargin( tmp ); + } + + // test this before the similar but shorter ".SolderPaste" + else if( TESTLINE( ".SolderPasteRatio" ) ) + { + double tmp = atof( line + SZ( ".SolderPasteRatio" ) ); + pad->SetLocalSolderPasteMarginRatio( tmp ); } else if( TESTLINE( ".SolderPaste" ) ) { BIU tmp = biuParse( line + SZ( ".SolderPaste" ) ); - pad->SetSolderPasteMargin( tmp ); - } - - else if( TESTLINE( ".SolderPasteRatio" ) ) - { - double tmp = atof( line + SZ( ".SolderPasteRatio" ) ); - pad->SetSolderPasteRatio( tmp ); + pad->SetLocalSolderPasteMargin( tmp ); } else if( TESTLINE( ".LocalClearance" ) ) { BIU tmp = biuParse( line + SZ( ".LocalClearance" ) ); - pad->SetPadClearance( tmp ); + pad->SetLocalClearance( tmp ); } else if( TESTLINE( "$EndPAD" ) ) @@ -1251,7 +1284,7 @@ void KICAD_PLUGIN::loadEDGE_MODULE( MODULE* aModule ) dwg->m_Start0 = wxPoint( start0_x, start0_y ); dwg->m_End0 = wxPoint( end0_x, end0_y ); - std::vector& pts = dwg->GetPolyPoints(); + std::vector pts; pts.reserve( ptCount ); for( int ii = 0; iiSetPolyPoints( pts ); } break; @@ -1958,7 +1993,7 @@ void KICAD_PLUGIN::loadZONE_CONTAINER() // e.g. "ZCorner 25650 49500 0" BIU x = biuParse( line + SZ( "ZCorner" ), &data ); BIU y = biuParse( data, &data ); - int flag = atoi( data ); + int flag = intParse( data ); if( !sawCorner ) zc->m_Poly->Start( zc->GetLayer(), x, y, outline_hatch ); @@ -2399,26 +2434,52 @@ void KICAD_PLUGIN::loadPCB_TARGET() } -std::string KICAD_PLUGIN::biuFmt( BIU aValue ) +int KICAD_PLUGIN::biuSprintf( char* buf, BIU aValue ) const { double engUnits = biuToDisk * aValue; - char temp[48]; + int len; if( engUnits != 0.0 && fabs( engUnits ) <= 0.0001 ) { // printf( "f: " ); - int len = sprintf( temp, "%.10f", engUnits ); + len = sprintf( buf, "%.10f", engUnits ); - while( --len > 0 && temp[len] == '0' ) - temp[len] = '\0'; + while( --len > 0 && buf[len] == '0' ) + buf[len] = '\0'; + + ++len; } else { // printf( "g: " ); - sprintf( temp, "%.10g", engUnits ); + len = sprintf( buf, "%.10g", engUnits ); } + return len; +} - return temp; + +std::string KICAD_PLUGIN::fmtBIU( BIU aValue ) const +{ + char temp[50]; + + int len = biuSprintf( temp, aValue ); + + return std::string( temp, len ); +} + + +std::string KICAD_PLUGIN::fmtBIUPair( BIU first, BIU second ) const +{ + char temp[100]; + char* cp = temp; + + cp += biuSprintf( cp, first ); + + *cp++ = ' '; + + cp += biuSprintf( cp, second ); + + return std::string( temp, cp - temp ); } @@ -2538,15 +2599,19 @@ void KICAD_PLUGIN::Save( const wxString& aFileName, BOARD* aBoard, PROPERTIES* a } -void KICAD_PLUGIN::checkWriteError( const char* aCaller ) const +wxString KICAD_PLUGIN::writeError() const { - if( ferror( m_fp ) ) - { - THROW_IO_ERROR( wxString::Format( _( "error writing to file '%s' from function %s" ), - m_filename.GetData(), FROM_UTF8( aCaller ).GetData() ) ); - } + return wxString::Format( _( "error writing to file '%s'" ), m_filename.GetData() ); } +#define CHECK_WRITE_ERROR() \ + do { \ + if( ferror( m_fp ) ) \ + { \ + THROW_IO_ERROR( writeError() ); \ + } \ + } while(0) + void KICAD_PLUGIN::saveAllSections() const { @@ -2579,7 +2644,7 @@ void KICAD_PLUGIN::saveSETUP() const void KICAD_PLUGIN::saveBOARD() const { -#if 0 +#if 1 // save the nets int netcount = m_board->GetNetCount(); for( int i = 0; i < netcount; ++i ) @@ -2610,7 +2675,7 @@ void KICAD_PLUGIN::saveBOARD() const saveDIMENTION( (DIMENSION*) gr ); break; default: - THROW_IO_ERROR( wxString::Format( _( "unknown graphic type %d"), gr->Type() ) ); + THROW_IO_ERROR( wxString::Format( UNKNOWN_GRAPHIC_FORMAT, gr->Type() ) ); } } @@ -2644,7 +2709,7 @@ void KICAD_PLUGIN::saveNETINFO_ITEM( const NETINFO_ITEM* aNet ) const fprintf( m_fp, "St %s\n", "~" ); fprintf( m_fp, "$EndEQUIPOT\n" ); - checkWriteError( __FUNCTION__ ); + CHECK_WRITE_ERROR(); } @@ -2660,38 +2725,358 @@ void KICAD_PLUGIN::saveNETCLASSES() const for( NETCLASSES::const_iterator it = nc.begin(); it != nc.end(); ++it ) { NETCLASS* netclass = it->second; - saveNETCLASS( netclass ); } - checkWriteError( __FUNCTION__ ); + CHECK_WRITE_ERROR(); } void KICAD_PLUGIN::saveNETCLASS( const NETCLASS* nc ) const { fprintf( m_fp, "$NCLASS\n" ); - fprintf( m_fp, "Name %s\n", EscapedUTF8( nc->GetName() ).c_str() ); - fprintf( m_fp, "Desc %s\n", EscapedUTF8( nc->GetDescription() ).c_str() ); + fprintf( m_fp, "Name %s\n", EscapedUTF8( nc->GetName() ).c_str() ); + fprintf( m_fp, "Desc %s\n", EscapedUTF8( nc->GetDescription() ).c_str() ); - // Write parameters + fprintf( m_fp, "Clearance %d\n", nc->GetClearance() ); + fprintf( m_fp, "TrackWidth %d\n", nc->GetTrackWidth() ); - fprintf( m_fp, "Clearance %d\n", nc->GetClearance() ); - fprintf( m_fp, "TrackWidth %d\n", nc->GetTrackWidth() ); + fprintf( m_fp, "ViaDia %d\n", nc->GetViaDiameter() ); + fprintf( m_fp, "ViaDrill %d\n", nc->GetViaDrill() ); - fprintf( m_fp, "ViaDia %d\n", nc->GetViaDiameter() ); - fprintf( m_fp, "ViaDrill %d\n", nc->GetViaDrill() ); + fprintf( m_fp, "uViaDia %d\n", nc->GetuViaDiameter() ); + fprintf( m_fp, "uViaDrill %d\n", nc->GetuViaDrill() ); - fprintf( m_fp, "uViaDia %d\n", nc->GetuViaDiameter() ); - fprintf( m_fp, "uViaDrill %d\n", nc->GetuViaDrill() ); - - // Write members: for( NETCLASS::const_iterator it = nc->begin(); it!=nc->end(); ++it ) fprintf( m_fp, "AddNet %s\n", EscapedUTF8( *it ).c_str() ); fprintf( m_fp, "$EndNCLASS\n" ); - checkWriteError( __FUNCTION__ ); + CHECK_WRITE_ERROR(); +} + + +void KICAD_PLUGIN::saveMODULE_TEXT( const TEXTE_MODULE* me ) const +{ + MODULE* parent = (MODULE*) me->GetParent(); + double orient = me->GetOrientation(); + + // Due to the Pcbnew history, m_Orient is saved in screen value + // but it is handled as relative to its parent footprint + if( parent ) + orient += parent->GetOrientation(); + + fprintf( m_fp, "T%d %s %s %g %s %c %c %d %c %s\n", + me->GetType(), + fmtBIUPoint( me->GetPos0() ).c_str(), // m_Pos0.x, m_Pos0.y, + fmtBIUSize( me->GetSize() ).c_str(), // m_Size.y, m_Size.x, + orient, + fmtBIU( me->GetThickness() ).c_str(), // m_Thickness, + me->IsMirrored() ? 'M' : 'N', + me->IsVisible() ? 'V' : 'I', + me->GetLayer(), + me->IsItalic() ? 'I' : 'N', + EscapedUTF8( me->GetText() ).c_str() + ); + + CHECK_WRITE_ERROR(); +} + + +void KICAD_PLUGIN::saveMODULE_EDGE( const EDGE_MODULE* me ) const +{ + switch( me->GetShape() ) + { + case S_SEGMENT: + fprintf( m_fp, "DS %s %s %s %d\n", + fmtBIUPoint( me->m_Start0 ).c_str(), + fmtBIUPoint( me->m_End0 ).c_str(), + fmtBIU( me->GetWidth() ).c_str(), + me->GetLayer() ); + break; + + case S_CIRCLE: + fprintf( m_fp, "DC %s %s %s %d\n", + fmtBIUPoint( me->m_Start0 ).c_str(), + fmtBIUPoint( me->m_End0 ).c_str(), + fmtBIU( me->GetWidth() ).c_str(), + me->GetLayer() ); + break; + + case S_ARC: + { + double angle = me->GetAngle(); + + fprintf( m_fp, "DA %s %s %g %s %d\n", + fmtBIUPoint( me->m_Start0 ).c_str(), + fmtBIUPoint( me->m_End0 ).c_str(), + angle, + fmtBIU( me->GetWidth() ).c_str(), + me->GetLayer() ); + } + break; + + case S_POLYGON: + { + const std::vector& polyPoints = me->GetPolyPoints(); + + fprintf( m_fp, "DP %s %s %d %s %d\n", + fmtBIUPoint( me->m_Start0 ).c_str(), + fmtBIUPoint( me->m_End0 ).c_str(), + (int) polyPoints.size(), + fmtBIU( me->GetWidth() ).c_str(), + me->GetLayer() ); + + for( unsigned i = 0; iGetShape() ) ); + } + + CHECK_WRITE_ERROR(); +} + + +void KICAD_PLUGIN::savePAD( const D_PAD* me ) const +{ + fprintf( m_fp, "$PAD\n" ); + + int cshape; + + switch( me->GetShape() ) + { + case PAD_CIRCLE: cshape = 'C'; break; + case PAD_RECT: cshape = 'R'; break; + case PAD_OVAL: cshape = 'O'; break; + case PAD_TRAPEZOID: cshape = 'T'; break; + + default: + THROW_IO_ERROR( wxString::Format( UNKNOWN_PAD_FORMAT, me->GetShape() ) ); + } + + fprintf( m_fp, "Sh %s %c %s %s %g\n", + EscapedUTF8( me->GetPadName() ).c_str(), + cshape, + fmtBIUSize( me->GetSize() ).c_str(), + fmtBIUSize( me->GetDelta() ).c_str(), + me->GetOrientation() ); + + fprintf( m_fp, "Dr %s %s", + fmtBIU( me->GetDrillSize().x ).c_str(), + fmtBIUSize( me->GetOffset() ).c_str() + ); + + if( me->GetDrillShape() == PAD_OVAL ) + { + fprintf( m_fp, " %c %s", 'O', fmtBIUSize( me->GetDrillSize() ).c_str() ); + } + + fprintf( m_fp, "\n" ); + + const char* texttype; + + switch( me->GetAttribute() ) + { + case PAD_STANDARD: texttype = "STD"; break; + case PAD_SMD: texttype = "SMD"; break; + case PAD_CONN: texttype = "CONN"; break; + case PAD_HOLE_NOT_PLATED: texttype = "HOLE"; break; + + default: + THROW_IO_ERROR( wxString::Format( UNKNOWN_PAD_ATTRIBUTE, me->GetAttribute() ) ); + } + + fprintf( m_fp, "At %s N %8.8X\n", texttype, me->GetLayerMask() ); + + fprintf( m_fp, "Ne %d %s\n", me->GetNet(), EscapedUTF8( me->GetNetname() ).c_str() ); + + fprintf( m_fp, "Po %s\n", fmtBIUPoint( me->GetPos0() ).c_str() ); + + if( me->GetDieLength() != 0 ) + fprintf( m_fp, "Le %s\n", fmtBIU( me->GetDieLength() ).c_str() ); + + if( me->GetLocalSolderMaskMargin() != 0 ) + fprintf( m_fp, ".SolderMask %s\n", fmtBIU( me->GetLocalSolderMaskMargin() ).c_str() ); + + if( me->GetLocalSolderPasteMargin() != 0 ) + fprintf( m_fp, ".SolderPaste %s\n", fmtBIU( me->GetLocalSolderPasteMargin() ).c_str() ); + + if( me->GetLocalSolderPasteMarginRatio() != 0 ) + fprintf( m_fp, ".SolderPasteRatio %g\n", me->GetLocalSolderPasteMarginRatio() ); + + if( me->GetLocalClearance() != 0 ) + fprintf( m_fp, ".LocalClearance %s\n", fmtBIU( me->GetLocalClearance( ) ).c_str() ); + + fprintf( m_fp, "$EndPAD\n" ); + + CHECK_WRITE_ERROR(); +} + + +void KICAD_PLUGIN::saveMODULE( const MODULE* me ) const +{ + char statusTxt[3]; + double orient = me->GetOrientation(); + + fprintf( m_fp, "$MODULE %s\n", TO_UTF8( me->GetLibRef() ) ); + + if( me->IsLocked() ) + statusTxt[0] = 'F'; + else + statusTxt[0] = '~'; + + if( me->IsPlaced() ) + statusTxt[1] = 'P'; + else + statusTxt[1] = '~'; + + statusTxt[2] = '\0'; + + fprintf( m_fp, "Po %s %g %d %8.8lX %8.8lX %s\n", + fmtBIUPoint( me->GetPosition() ).c_str(), // m_Pos.x, m_Pos.y, + orient, + me->GetLayer(), + me->GetLastEditTime(), + me->GetTimeStamp(), + statusTxt ); + + fprintf( m_fp, "Li %s\n", TO_UTF8( me->GetLibRef() ) ); + + if( !me->GetDescription().IsEmpty() ) + { + fprintf( m_fp, "Cd %s\n", TO_UTF8( me->GetDescription() ) ); + } + + if( !me->GetKeywords().IsEmpty() ) + { + fprintf( m_fp, "Kw %s\n", TO_UTF8( me->GetKeywords() ) ); + } + + fprintf( m_fp, "Sc %8.8lX\n", me->GetTimeStamp() ); + fprintf( m_fp, "AR %s\n", TO_UTF8( me->GetPath() ) ); + fprintf( m_fp, "Op %X %X 0\n", me->m_CntRot90, me->m_CntRot180 ); + + if( me->GetLocalSolderMaskMargin() != 0 ) + fprintf( m_fp, ".SolderMask %s\n", fmtBIU( me->GetLocalSolderMaskMargin() ).c_str() ); + + if( me->GetLocalSolderPasteMargin() != 0 ) + fprintf( m_fp, ".SolderPaste %s\n", fmtBIU( me->GetLocalSolderPasteMargin() ).c_str() ); + + if( me->GetLocalSolderPasteMarginRatio() != 0 ) + fprintf( m_fp, ".SolderPasteRatio %g\n", me->GetLocalSolderPasteMarginRatio() ); + + if( me->GetLocalClearance() != 0 ) + fprintf( m_fp, ".LocalClearance %s\n", fmtBIU( me->GetLocalClearance( ) ).c_str() ); + + // attributes + if( me->GetAttributes() != MOD_DEFAULT ) + { + fprintf( m_fp, "At" ); + + if( me->GetAttributes() & MOD_CMS ) + fprintf( m_fp, " SMD" ); + + if( me->GetAttributes() & MOD_VIRTUAL ) + fprintf( m_fp, " VIRTUAL" ); + + fprintf( m_fp, "\n" ); + } + + saveMODULE_TEXT( (TEXTE_MODULE*) &me->m_Reference ); + + saveMODULE_TEXT( (TEXTE_MODULE*) &me->m_Value ); + + // save drawing elements + for( BOARD_ITEM* item = me->m_Drawings; item; item = item->Next() ) + { + switch( item->Type() ) + { + case PCB_MODULE_TEXT_T: + saveMODULE_TEXT( (TEXTE_MODULE*) item ); + break; + case PCB_MODULE_EDGE_T: + saveMODULE_EDGE( (EDGE_MODULE*) item ); + break; + default: + THROW_IO_ERROR( wxString::Format( UNKNOWN_GRAPHIC_FORMAT, item->Type() ) ); + } + } + + for( D_PAD* pad = me->m_Pads; pad; pad = pad->Next() ) + savePAD( pad ); + + save3D( me ); + + fprintf( m_fp, "$EndMODULE %s\n", TO_UTF8( me->GetLibRef() ) ); +} + + +void KICAD_PLUGIN::save3D( const MODULE* me ) const +{ + for( S3D_MASTER* t3D = me->m_3D_Drawings; t3D; t3D = t3D->Next() ) + { + if( !t3D->m_Shape3DName.IsEmpty() ) + { + fprintf( m_fp, "$SHAPE3D\n" ); + + fprintf( m_fp, "Na %s\n", EscapedUTF8( t3D->m_Shape3DName ).c_str() ); + + fprintf( m_fp, "Sc %.16g %.16g %.16g\n", + t3D->m_MatScale.x, + t3D->m_MatScale.y, + t3D->m_MatScale.z ); + + fprintf( m_fp, "Of %.16g %.16g %.16g\n", + t3D->m_MatPosition.x, + t3D->m_MatPosition.y, + t3D->m_MatPosition.z ); + + fprintf( m_fp, "Ro %.16g %.16g %.16g\n", + t3D->m_MatRotation.x, + t3D->m_MatRotation.y, + t3D->m_MatRotation.z ); + + fprintf( m_fp, "$EndSHAPE3D\n" ); + } + } +} + + +void KICAD_PLUGIN::saveTARGET(PCB_TARGET const*) const +{ +} + + +void KICAD_PLUGIN::saveTRACK(TRACK const*) const +{ +} + + +void KICAD_PLUGIN::saveSEGZONE(SEGZONE const*) const +{ +} + + +void KICAD_PLUGIN::saveZONE_CONTAINER(ZONE_CONTAINER const*) const +{ +} + + +void KICAD_PLUGIN::saveDIMENTION(DIMENSION const*) const +{ +} + + +void KICAD_PLUGIN::savePCB_TEXT(TEXTE_PCB const*) const +{ +} + + +void KICAD_PLUGIN::saveEDGE_MODULE(EDGE_MODULE const*) const +{ } @@ -2954,91 +3339,6 @@ bool TEXTE_PCB::Save( FILE* m_fp ) const } -/** - * Function Save - * writes the data structures for this object out to a FILE in "*.brd" format. - * @param m_fp The FILE to write to. - * @return bool - true if success writing else false. - */ -bool TEXTE_MODULE::Save( FILE* m_fp ) const -{ - MODULE* parent = (MODULE*) GetParent(); - int orient = m_Orient; - - // Due to the Pcbnew history, m_Orient is saved in screen value - // but it is handled as relative to its parent footprint - if( parent ) - orient += parent->m_Orient; - - int ret = fprintf( m_fp, "T%d %d %d %d %d %d %d %c %c %d %c %s\n", - m_Type, - m_Pos0.x, m_Pos0.y, - m_Size.y, m_Size.x, - orient, - m_Thickness, - m_Mirror ? 'M' : 'N', m_NoShow ? 'I' : 'V', - GetLayer(), - m_Italic ? 'I' : 'N', - EscapedUTF8( m_Text ).c_str() - ); - - return ret > 20; -} - - -bool EDGE_MODULE::Save( FILE* m_fp ) const -{ - int ret = -1; - - switch( m_Shape ) - { - case S_SEGMENT: - ret = fprintf( m_fp, "DS %d %d %d %d %d %d\n", - m_Start0.x, m_Start0.y, - m_End0.x, m_End0.y, - m_Width, m_Layer ); - break; - - case S_CIRCLE: - ret = fprintf( m_fp, "DC %d %d %d %d %d %d\n", - m_Start0.x, m_Start0.y, - m_End0.x, m_End0.y, - m_Width, m_Layer ); - break; - - case S_ARC: - ret = fprintf( m_fp, "DA %d %d %d %d %d %d %d\n", - m_Start0.x, m_Start0.y, - m_End0.x, m_End0.y, - m_Angle, - m_Width, m_Layer ); - break; - - case S_POLYGON: - ret = fprintf( m_fp, "DP %d %d %d %d %d %d %d\n", - m_Start0.x, m_Start0.y, - m_End0.x, m_End0.y, - (int) m_PolyPoints.size(), - m_Width, m_Layer ); - - for( unsigned i = 0; i 5; -} - - bool TRACK::Save( FILE* m_fp ) const { int type = 0; @@ -3122,244 +3422,4 @@ out: return rc; } - -bool D_PAD::Save( FILE* m_fp ) const -{ - int cshape; - const char* texttype; - - // check the return values for first and last fprints() in this function - if( fprintf( m_fp, "$PAD\n" ) != sizeof("$PAD\n") - 1 ) - return false; - - switch( m_PadShape ) - { - case PAD_CIRCLE: - cshape = 'C'; break; - - case PAD_RECT: - cshape = 'R'; break; - - case PAD_OVAL: - cshape = 'O'; break; - - case PAD_TRAPEZOID: - cshape = 'T'; break; - - default: - cshape = 'C'; - DisplayError( NULL, _( "Unknown pad shape" ) ); - break; - } - - fprintf( m_fp, "Sh \"%.4s\" %c %d %d %d %d %d\n", - m_Padname, cshape, m_Size.x, m_Size.y, - m_DeltaSize.x, m_DeltaSize.y, m_Orient ); - - fprintf( m_fp, "Dr %d %d %d", m_Drill.x, m_Offset.x, m_Offset.y ); - - if( m_DrillShape == PAD_OVAL ) - { - fprintf( m_fp, " %c %d %d", 'O', m_Drill.x, m_Drill.y ); - } - - fprintf( m_fp, "\n" ); - - switch( m_Attribut ) - { - case PAD_STANDARD: - texttype = "STD"; break; - - case PAD_SMD: - texttype = "SMD"; break; - - case PAD_CONN: - texttype = "CONN"; break; - - case PAD_HOLE_NOT_PLATED: - texttype = "HOLE"; break; - - default: - texttype = "STD"; - DisplayError( NULL, wxT( "Invalid Pad attribute" ) ); - break; - } - - fprintf( m_fp, "At %s N %8.8X\n", texttype, m_layerMask ); - - fprintf( m_fp, "Ne %d %s\n", GetNet(), EscapedUTF8( m_Netname ).c_str() ); - - fprintf( m_fp, "Po %d %d\n", m_Pos0.x, m_Pos0.y ); - - if( m_LengthDie != 0 ) - fprintf( m_fp, "Le %d\n", m_LengthDie ); - - if( m_LocalSolderMaskMargin != 0 ) - fprintf( m_fp, ".SolderMask %d\n", m_LocalSolderMaskMargin ); - - if( m_LocalSolderPasteMargin != 0 ) - fprintf( m_fp, ".SolderPaste %d\n", m_LocalSolderPasteMargin ); - - if( m_LocalSolderPasteMarginRatio != 0 ) - fprintf( m_fp, ".SolderPasteRatio %g\n", m_LocalSolderPasteMarginRatio ); - - if( m_LocalClearance != 0 ) - fprintf( m_fp, ".LocalClearance %d\n", m_LocalClearance ); - - if( fprintf( m_fp, "$EndPAD\n" ) != sizeof("$EndPAD\n") - 1 ) - return false; - - return true; -} - - -bool MODULE::Save( FILE* m_fp ) const -{ - char statusTxt[8]; - BOARD_ITEM* item; - - bool rc = false; - - fprintf( m_fp, "$MODULE %s\n", TO_UTF8( m_LibRef ) ); - - memset( statusTxt, 0, sizeof(statusTxt) ); - if( IsLocked() ) - statusTxt[0] = 'F'; - else - statusTxt[0] = '~'; - - if( m_ModuleStatus & MODULE_is_PLACED ) - statusTxt[1] = 'P'; - else - statusTxt[1] = '~'; - - fprintf( m_fp, "Po %d %d %d %d %8.8lX %8.8lX %s\n", - m_Pos.x, m_Pos.y, - m_Orient, m_Layer, m_LastEdit_Time, - m_TimeStamp, statusTxt ); - - fprintf( m_fp, "Li %s\n", TO_UTF8( m_LibRef ) ); - - if( !m_Doc.IsEmpty() ) - { - fprintf( m_fp, "Cd %s\n", TO_UTF8( m_Doc ) ); - } - - if( !m_KeyWord.IsEmpty() ) - { - fprintf( m_fp, "Kw %s\n", TO_UTF8( m_KeyWord ) ); - } - - fprintf( m_fp, "Sc %8.8lX\n", m_TimeStamp ); - fprintf( m_fp, "AR %s\n", TO_UTF8( m_Path ) ); - fprintf( m_fp, "Op %X %X 0\n", m_CntRot90, m_CntRot180 ); - - if( m_LocalSolderMaskMargin != 0 ) - fprintf( m_fp, ".SolderMask %d\n", m_LocalSolderMaskMargin ); - - if( m_LocalSolderPasteMargin != 0 ) - fprintf( m_fp, ".SolderPaste %d\n", m_LocalSolderPasteMargin ); - - if( m_LocalSolderPasteMarginRatio != 0 ) - fprintf( m_fp, ".SolderPasteRatio %g\n", m_LocalSolderPasteMarginRatio ); - - if( m_LocalClearance != 0 ) - fprintf( m_fp, ".LocalClearance %d\n", m_LocalClearance ); - - // attributes - if( m_Attributs != MOD_DEFAULT ) - { - fprintf( m_fp, "At " ); - - if( m_Attributs & MOD_CMS ) - fprintf( m_fp, "SMD " ); - - if( m_Attributs & MOD_VIRTUAL ) - fprintf( m_fp, "VIRTUAL " ); - - fprintf( m_fp, "\n" ); - } - - // save reference - if( !m_Reference->Save( m_fp ) ) - goto out; - - // save value - if( !m_Value->Save( m_fp ) ) - goto out; - - // save drawing elements - for( item = m_Drawings; item; item = item->Next() ) - { - switch( item->Type() ) - { - case PCB_MODULE_TEXT_T: - case PCB_MODULE_EDGE_T: - if( !item->Save( m_fp ) ) - goto out; - - break; - - default: -#if defined(DEBUG) - printf( "MODULE::Save() ignoring type %d\n", item->Type() ); #endif - break; - } - } - - // save the pads - for( item = m_Pads; item; item = item->Next() ) - if( !item->Save( m_fp ) ) - goto out; - - Write_3D_Descr( m_fp ); - - fprintf( m_fp, "$EndMODULE %s\n", TO_UTF8( m_LibRef ) ); - - rc = true; -out: - return rc; -} - -/* Save the description of 3D MODULE - */ -int MODULE::Write_3D_Descr( FILE* File ) const -{ - char buf[512]; - - for( S3D_MASTER* t3D = m_3D_Drawings; t3D; t3D = t3D->Next() ) - { - if( !t3D->m_Shape3DName.IsEmpty() ) - { - fprintf( File, "$SHAPE3D\n" ); - - fprintf( File, "Na %s\n", EscapedUTF8( t3D->m_Shape3DName ).c_str() ); - - sprintf( buf, "Sc %lf %lf %lf\n", - t3D->m_MatScale.x, - t3D->m_MatScale.y, - t3D->m_MatScale.z ); - fprintf( File, "%s", to_point( buf ) ); - - sprintf( buf, "Of %lf %lf %lf\n", - t3D->m_MatPosition.x, - t3D->m_MatPosition.y, - t3D->m_MatPosition.z ); - fprintf( File, "%s", to_point( buf ) ); - - sprintf( buf, "Ro %lf %lf %lf\n", - t3D->m_MatRotation.x, - t3D->m_MatRotation.y, - t3D->m_MatRotation.z ); - fprintf( File, "%s", to_point( buf ) ); - - fprintf( File, "$EndSHAPE3D\n" ); - } - } - - return 0; -} - -#endif - diff --git a/pcbnew/kicad_plugin.h b/pcbnew/kicad_plugin.h index 50f8dd4947..3b8a8a9183 100644 --- a/pcbnew/kicad_plugin.h +++ b/pcbnew/kicad_plugin.h @@ -43,7 +43,7 @@ class TEXTE_MODULE; class EDGE_MODULE; class TRACK; class SEGZONE; - +class D_PAD; /** * Class KICAD_PLUGIN @@ -164,21 +164,43 @@ protected: //---------------------------------------------------------- /** - * Function checkWriteError - * checks to see if there is an error on the output FILE, and its ability to - * continue saving to disk. + * Function writeError + * returns an error message wxString containing the filename being + * currently written. */ - void checkWriteError( const char* aCaller ) const; + wxString writeError() const; + + int biuSprintf( char* buf, BIU aValue ) const; /// convert a BIU to engineering units by scaling and formatting to ASCII. - std::string biuFmt( BIU aValue ); + std::string fmtBIU( BIU aValue ) const; + + std::string fmtBIUPair( BIU first, BIU second ) const; + + std::string fmtBIUPoint( const wxPoint& aPoint ) const + { + return fmtBIUPair( aPoint.x, aPoint.y ); + } + + std::string fmtBIUSize( const wxSize& aSize ) const + { + // unfortunately there is inconsistency in the order of saving wxSize, + // so sometimes we use fmtBIUPair() directly in the saveXXX() functions. + return fmtBIUPair( aSize.x, aSize.y ); + } void saveAllSections() const; void saveGENERAL() const; void saveSHEET() const; void saveSETUP() const; void saveBOARD() const; + void saveMODULE( const MODULE* aModule ) const; + void saveMODULE_TEXT( const TEXTE_MODULE* aText ) const; + void saveMODULE_EDGE( const EDGE_MODULE* aGraphic ) const; + void savePAD( const D_PAD* aPad ) const; + void save3D( const MODULE* aModule ) const; + void saveNETINFO_ITEM( const NETINFO_ITEM* aNet ) const; void saveNETCLASSES() const; void saveNETCLASS( const NETCLASS* aNetclass ) const; diff --git a/pcbnew/librairi.cpp b/pcbnew/librairi.cpp index a31aa652e3..b5879f5f89 100644 --- a/pcbnew/librairi.cpp +++ b/pcbnew/librairi.cpp @@ -604,9 +604,9 @@ bool PCB_BASE_FRAME::Save_Module_In_Library( const wxString& aLibName, } /* Write the new footprint ( append it to the list of footprint ) */ - tmp = aModule->m_TimeStamp; aModule->m_TimeStamp = 0; + tmp = aModule->GetTimeStamp(); aModule->SetTimeStamp( 0 ); aModule->Save( dest ); - aModule->m_TimeStamp = tmp; + aModule->SetTimeStamp( tmp ); output_lib.WriteEndOfFile(); diff --git a/pcbnew/loadcmp.cpp b/pcbnew/loadcmp.cpp index 2332101d7f..63721e1af2 100644 --- a/pcbnew/loadcmp.cpp +++ b/pcbnew/loadcmp.cpp @@ -78,7 +78,7 @@ bool FOOTPRINT_EDIT_FRAME::Load_Module_From_BOARD( MODULE* aModule ) GetBoard()->m_Status_Pcb = 0; newModule = new MODULE( GetBoard() ); newModule->Copy( aModule ); - newModule->m_Link = aModule->m_TimeStamp; + newModule->m_Link = aModule->GetTimeStamp(); aModule = newModule; @@ -185,7 +185,7 @@ MODULE* PCB_BASE_FRAME::Load_Module_From_Library( const wxString& library, wxDC* module->m_Flags = IS_NEW; module->m_Link = 0; - module->m_TimeStamp = GetNewTimeStamp(); + module->SetTimeStamp( GetNewTimeStamp() ); GetBoard()->m_Status_Pcb = 0; module->SetPosition( curspos ); diff --git a/pcbnew/modedit.cpp b/pcbnew/modedit.cpp index dda8090b4c..62183a9098 100644 --- a/pcbnew/modedit.cpp +++ b/pcbnew/modedit.cpp @@ -284,7 +284,7 @@ void FOOTPRINT_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event ) for( ; source_module != NULL; source_module = (MODULE*) source_module->Next() ) { - if( module_in_edit->m_Link == source_module->m_TimeStamp ) + if( module_in_edit->m_Link == source_module->GetTimeStamp() ) break; } } @@ -325,7 +325,7 @@ void FOOTPRINT_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event ) // and the source_module (old module) is deleted PICKED_ITEMS_LIST pickList; pcbframe->Exchange_Module( source_module, newmodule, &pickList ); - newmodule->m_TimeStamp = module_in_edit->m_Link; + newmodule->SetTimeStamp( module_in_edit->m_Link ); if( pickList.GetCount() ) pcbframe->SaveCopyInUndoList( pickList, UR_UNSPECIFIED ); @@ -336,7 +336,7 @@ void FOOTPRINT_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event ) pcbframe->GetScreen()->SetCrossHairPosition( wxPoint( 0, 0 ) ); pcbframe->PlaceModule( newmodule, NULL ); pcbframe->GetScreen()->SetCrossHairPosition( cursor_pos ); - newmodule->m_TimeStamp = GetNewTimeStamp(); + newmodule->SetTimeStamp( GetNewTimeStamp() ); pcbframe->SaveCopyInUndoList( newmodule, UR_NEW ); } @@ -413,12 +413,12 @@ void FOOTPRINT_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event ) if( val && ref ) { - ref->m_Type = TEXT_is_REFERENCE; // just in case ... + ref->SetType( TEXT_is_REFERENCE ); // just in case ... if( ref->m_Text.Length() == 0 ) ref->m_Text = L"Ref**"; - val->m_Type = TEXT_is_VALUE; // just in case ... + val->SetType( TEXT_is_VALUE ); // just in case ... if( val->m_Text.Length() == 0 ) val->m_Text = L"Val**"; @@ -708,20 +708,20 @@ void FOOTPRINT_EDIT_FRAME::Transform( MODULE* module, int transform ) for( ; pad != NULL; pad = (D_PAD*) pad->Next() ) { - pad->m_Pos0 = pad->m_Pos; + pad->SetPos0( pad->m_Pos ); pad->m_Orient -= angle; RotatePoint( &pad->m_Offset.x, &pad->m_Offset.y, angle ); EXCHG( pad->m_Size.x, pad->m_Size.y ); RotatePoint( &pad->m_DeltaSize.x, &pad->m_DeltaSize.y, -angle ); } - module->m_Reference->m_Pos0 = module->m_Reference->m_Pos; + module->m_Reference->SetPos0( module->m_Reference->m_Pos ); module->m_Reference->m_Orient += angle; if( module->m_Reference->m_Orient >= 1800 ) module->m_Reference->m_Orient -= 1800; - module->m_Value->m_Pos0 = module->m_Value->m_Pos; + module->m_Value->SetPos0( module->m_Value->m_Pos ); module->m_Value->m_Orient += angle; if( module->m_Value->m_Orient >= 1800 ) @@ -739,7 +739,7 @@ void FOOTPRINT_EDIT_FRAME::Transform( MODULE* module, int transform ) if( PtStruct->Type() == PCB_MODULE_TEXT_T ) { textmod = (TEXTE_MODULE*) PtStruct; - textmod->m_Pos0 = textmod->m_Pos; + textmod->SetPos0( textmod->m_Pos ); } } @@ -747,7 +747,7 @@ void FOOTPRINT_EDIT_FRAME::Transform( MODULE* module, int transform ) break; case ID_MODEDIT_MODULE_MIRROR: - for( ; pad != NULL; pad = (D_PAD*) pad->Next() ) + for( ; pad; pad = pad->Next() ) { NEGATE( pad->m_Pos.y ); NEGATE( pad->m_Pos0.y ); diff --git a/pcbnew/modedit_onclick.cpp b/pcbnew/modedit_onclick.cpp index 21e4d28bbf..12d8102e5b 100644 --- a/pcbnew/modedit_onclick.cpp +++ b/pcbnew/modedit_onclick.cpp @@ -307,7 +307,7 @@ bool FOOTPRINT_EDIT_FRAME::OnRightClick( const wxPoint& MousePos, wxMenu* PopMen HK_EDIT_ITEM ); AddMenuItem( PopMenu, ID_POPUP_PCB_EDIT_TEXTMODULE, msg, KiBitmap( edit_text_xpm ) ); - if( ( (TEXTE_MODULE*) item )->m_Type == TEXT_is_DIVERS ) + if( ( (TEXTE_MODULE*) item )->GetType() == TEXT_is_DIVERS ) { msg = AddHotkeyName( _("Delete Text Mod." ), g_Module_Editor_Hokeys_Descr, HK_DELETE ); diff --git a/pcbnew/moduleframe.cpp b/pcbnew/moduleframe.cpp index 443f75ac0c..8aa47eb119 100644 --- a/pcbnew/moduleframe.cpp +++ b/pcbnew/moduleframe.cpp @@ -300,7 +300,7 @@ void FOOTPRINT_EDIT_FRAME::OnUpdateInsertModuleInBoard( wxUpdateUIEvent& aEvent // search if the source module was not deleted: for( ; source_module != NULL; source_module = source_module->Next() ) { - if( module_in_edit->m_Link == source_module->m_TimeStamp ) + if( module_in_edit->m_Link == source_module->GetTimeStamp() ) break; } @@ -326,7 +326,7 @@ void FOOTPRINT_EDIT_FRAME::OnUpdateReplaceModuleInBoard( wxUpdateUIEvent& aEvent // search if the source module was not deleted: for( ; source_module != NULL; source_module = source_module->Next() ) { - if( module_in_edit->m_Link == source_module->m_TimeStamp ) + if( module_in_edit->m_Link == source_module->GetTimeStamp() ) break; } diff --git a/pcbnew/move-drag_pads.cpp b/pcbnew/move-drag_pads.cpp index a00d3c0c76..83f0e03186 100644 --- a/pcbnew/move-drag_pads.cpp +++ b/pcbnew/move-drag_pads.cpp @@ -187,7 +187,7 @@ void PCB_BASE_FRAME::Import_Pad_Settings( D_PAD* aPad, bool aDraw ) void PCB_BASE_FRAME::AddPad( MODULE* Module, bool draw ) { wxString lastPadName; // Last used pad name (pad num) - lastPadName = g_Pad_Master.ReturnStringPadName(); + lastPadName = g_Pad_Master.GetPadName(); m_Pcb->m_Status_Pcb = 0; Module->m_LastEdit_Time = time( NULL ); diff --git a/pcbnew/muonde.cpp b/pcbnew/muonde.cpp index 251f931c48..f61c7d46ca 100644 --- a/pcbnew/muonde.cpp +++ b/pcbnew/muonde.cpp @@ -287,8 +287,8 @@ MODULE* PCB_EDIT_FRAME::Genere_Self( wxDC* DC ) Module->m_Reference->m_Pos.y -= Module->m_Reference->m_Size.y; Module->m_Value->m_Pos.y += Module->m_Value->m_Size.y; - Module->m_Reference->m_Pos0 = Module->m_Reference->m_Pos - Module->m_Pos; - Module->m_Value->m_Pos0 = Module->m_Value->m_Pos - Module->m_Pos; + Module->m_Reference->SetPos0( Module->m_Reference->m_Pos - Module->m_Pos ); + Module->m_Value->SetPos0( Module->m_Value->m_Pos - Module->m_Pos ); Module->CalculateBoundingBox(); Module->Draw( DrawPanel, DC, GR_OR ); @@ -532,14 +532,22 @@ MODULE* PCB_EDIT_FRAME::Create_MuWaveBasicShape( const wxString& name, int pad_c return NULL; #define DEFAULT_SIZE 30 - Module->m_TimeStamp = GetNewTimeStamp(); + Module->SetTimeStamp( GetNewTimeStamp() ); + Module->m_Value->m_Size = wxSize( DEFAULT_SIZE, DEFAULT_SIZE ); - Module->m_Value->m_Pos0.y = -DEFAULT_SIZE; - Module->m_Value->m_Pos.y += Module->m_Value->m_Pos0.y; - Module->m_Value->m_Thickness = DEFAULT_SIZE / 4; + + Module->m_Value->SetPos0( wxPoint( 0, -DEFAULT_SIZE ) ); + + Module->m_Value->m_Pos.y += Module->m_Value->GetPos0().y; + + Module->m_Value->m_Thickness = DEFAULT_SIZE / 4; + Module->m_Reference->m_Size = wxSize( DEFAULT_SIZE, DEFAULT_SIZE ); - Module->m_Reference->m_Pos0.y = DEFAULT_SIZE; - Module->m_Reference->m_Pos.y += Module->m_Reference->m_Pos0.y; + + Module->m_Reference->SetPos0( wxPoint( 0, DEFAULT_SIZE ) ); + + Module->m_Reference->m_Pos.y += Module->m_Reference->GetPos0().y; + Module->m_Reference->m_Thickness = DEFAULT_SIZE / 4; /* Create 2 pads used in gaps and stubs. diff --git a/pcbnew/netlist.cpp b/pcbnew/netlist.cpp index c00418f62d..57abc6fa16 100644 --- a/pcbnew/netlist.cpp +++ b/pcbnew/netlist.cpp @@ -1160,7 +1160,7 @@ bool NETLIST_READER::loadNewModules() /* Update schematic links : reference "Time Stamp" and schematic * hierarchical path */ Module->m_Reference->m_Text = cmp->m_CmpName; - Module->m_TimeStamp = GetNewTimeStamp(); + Module->SetTimeStamp( GetNewTimeStamp() ); Module->m_Path = cmp->m_TimeStampPath; } else @@ -1176,7 +1176,7 @@ bool NETLIST_READER::loadNewModules() Module = newmodule; Module->m_Reference->m_Text = cmp->m_CmpName; - Module->m_TimeStamp = GetNewTimeStamp(); + Module->SetTimeStamp( GetNewTimeStamp() ); Module->m_Path = cmp->m_TimeStampPath; } } diff --git a/pcbnew/onrightclick.cpp b/pcbnew/onrightclick.cpp index 9f5cc2d2ed..0a400c586f 100644 --- a/pcbnew/onrightclick.cpp +++ b/pcbnew/onrightclick.cpp @@ -699,7 +699,7 @@ void PCB_EDIT_FRAME::createPopUpMenuForFpTexts( TEXTE_MODULE* FpText, wxMenu* me } // Graphic texts can be deleted only if are not currently edited. - if( !flags && FpText->m_Type == TEXT_is_DIVERS ) + if( !flags && FpText->GetType() == TEXT_is_DIVERS ) { AddMenuItem( sub_menu_Fp_text, ID_POPUP_PCB_DELETE_TEXTMODULE, _( "Delete" ), KiBitmap( delete_xpm ) ); diff --git a/pcbnew/plot_rtn.cpp b/pcbnew/plot_rtn.cpp index f780dfc32d..3d1c2906fc 100644 --- a/pcbnew/plot_rtn.cpp +++ b/pcbnew/plot_rtn.cpp @@ -145,7 +145,7 @@ module\n %s's \"reference\" text." ), if( ( ( 1 << textLayer ) & aLayerMask ) == 0 ) trace_ref = false; - if( text->m_NoShow && !g_PcbPlotOptions.m_PlotInvisibleTexts ) + if( !text->IsVisible() && !g_PcbPlotOptions.m_PlotInvisibleTexts ) trace_ref = false; text = Module->m_Value; @@ -165,7 +165,7 @@ module\n %s's \"value\" text." ), if( ( (1 << textLayer) & aLayerMask ) == 0 ) trace_val = false; - if( text->m_NoShow && !g_PcbPlotOptions.m_PlotInvisibleTexts ) + if( !text->IsVisible() && !g_PcbPlotOptions.m_PlotInvisibleTexts ) trace_val = false; /* Plot text fields, if allowed */ @@ -185,7 +185,7 @@ module\n %s's \"value\" text." ), if( !g_PcbPlotOptions.m_PlotTextOther ) continue; - if( (pt_texte->m_NoShow) && !g_PcbPlotOptions.m_PlotInvisibleTexts ) + if( !pt_texte->IsVisible() && !g_PcbPlotOptions.m_PlotInvisibleTexts ) continue; textLayer = pt_texte->GetLayer(); diff --git a/pcbnew/print_board_functions.cpp b/pcbnew/print_board_functions.cpp index 1771a01331..15f045dde0 100644 --- a/pcbnew/print_board_functions.cpp +++ b/pcbnew/print_board_functions.cpp @@ -382,10 +382,10 @@ static void Print_Module( EDA_DRAW_PANEL* aPanel, wxDC* aDC, MODULE* aModule, if( mlayer & aMasklayer ) { - if( !aModule->m_Reference->m_NoShow ) + if( aModule->m_Reference->IsVisible() ) aModule->m_Reference->Draw( aPanel, aDC, aDraw_mode ); - if( !aModule->m_Value->m_NoShow ) + if( aModule->m_Value->IsVisible() ) aModule->m_Value->Draw( aPanel, aDC, aDraw_mode ); } diff --git a/pcbnew/specctra_export.cpp b/pcbnew/specctra_export.cpp index c4c7a41c75..ed2a3a5427 100644 --- a/pcbnew/specctra_export.cpp +++ b/pcbnew/specctra_export.cpp @@ -565,7 +565,7 @@ IMAGE* SPECCTRA_DB::makeIMAGE( BOARD* aBoard, MODULE* aModule ) PIN* pin = new PIN(image); - padName = pad->ReturnStringPadName(); + padName = pad->GetPadName(); pin->pin_id = TO_UTF8( padName ); if( padName!=wxEmptyString && pinmap.find( padName )==pinmap.end() ) diff --git a/pcbnew/xchgmod.cpp b/pcbnew/xchgmod.cpp index 6aaaca5f28..f7f547dc0c 100644 --- a/pcbnew/xchgmod.cpp +++ b/pcbnew/xchgmod.cpp @@ -516,7 +516,7 @@ void PCB_EDIT_FRAME::Exchange_Module( MODULE* aOldModule, aNewModule->m_Value->m_Text = aOldModule->m_Value->m_Text; /* Updating other parameters */ - aNewModule->m_TimeStamp = aOldModule->m_TimeStamp; + aNewModule->SetTimeStamp( aOldModule->GetTimeStamp() ); aNewModule->m_Path = aOldModule->m_Path; /* Update pad netnames ( when possible) */ @@ -624,7 +624,7 @@ void PCB_EDIT_FRAME::RecreateCmpFileFromBoard( wxCommandEvent& aEvent ) for( ; Module != NULL; Module = Module->Next() ) { fprintf( FichCmp, "\nBeginCmp\n" ); - fprintf( FichCmp, "TimeStamp = %8.8lX\n", Module->m_TimeStamp ); + fprintf( FichCmp, "TimeStamp = %8.8lX\n", Module->GetTimeStamp() ); fprintf( FichCmp, "Path = %s\n", TO_UTF8( Module->m_Path ) ); fprintf( FichCmp, "Reference = %s;\n", !Module->m_Reference->m_Text.IsEmpty() ? diff --git a/pcbnew/zones_by_polygon.cpp b/pcbnew/zones_by_polygon.cpp index d7424ebec8..f0290233c8 100644 --- a/pcbnew/zones_by_polygon.cpp +++ b/pcbnew/zones_by_polygon.cpp @@ -534,7 +534,7 @@ int PCB_EDIT_FRAME::Begin_Zone( wxDC* DC ) if( zone->GetNumCorners() == 0 ) { zone->m_Flags = IS_NEW; - zone->m_TimeStamp = GetNewTimeStamp(); + zone->SetTimeStamp( GetNewTimeStamp() ); g_Zone_Default_Setting.ExportSetting( *zone ); zone->m_Poly->Start( g_Zone_Default_Setting.m_CurrentZone_Layer, GetScreen()->GetCrossHairPosition().x, @@ -791,7 +791,7 @@ void PCB_EDIT_FRAME::Delete_Zone_Contour( wxDC* DC, ZONE_CONTAINER* zone_contain EDA_RECT dirty = zone_container->GetBoundingBox(); // For compatibility with old boards: remove old SEGZONE fill segments - Delete_OldZone_Fill( NULL, zone_container->m_TimeStamp ); + Delete_OldZone_Fill( NULL, zone_container->GetTimeStamp() ); // Remove current filling: zone_container->UnFill(); diff --git a/pcbnew/zones_by_polygon_fill_functions.cpp b/pcbnew/zones_by_polygon_fill_functions.cpp index 55957c62bb..7600c295f0 100644 --- a/pcbnew/zones_by_polygon_fill_functions.cpp +++ b/pcbnew/zones_by_polygon_fill_functions.cpp @@ -59,7 +59,7 @@ void PCB_EDIT_FRAME::Delete_OldZone_Fill( SEGZONE* aZone, long aTimestamp ) if( aZone == NULL ) TimeStamp = aTimestamp; else - TimeStamp = aZone->m_TimeStamp; // Save reference time stamp (aZone will be deleted) + TimeStamp = aZone->GetTimeStamp(); // Save reference time stamp (aZone will be deleted) SEGZONE* next; @@ -67,7 +67,7 @@ void PCB_EDIT_FRAME::Delete_OldZone_Fill( SEGZONE* aZone, long aTimestamp ) { next = zone->Next(); - if( zone->m_TimeStamp == TimeStamp ) + if( zone->GetTimeStamp() == TimeStamp ) { modify = true; /* remove item from linked list and free memory */ diff --git a/pcbnew/zones_test_and_combine_areas.cpp b/pcbnew/zones_test_and_combine_areas.cpp index 9078c44ea5..8cf1996a89 100644 --- a/pcbnew/zones_test_and_combine_areas.cpp +++ b/pcbnew/zones_test_and_combine_areas.cpp @@ -88,7 +88,7 @@ ZONE_CONTAINER* BOARD::InsertArea( int netcode, int iarea, int layer, int x, int new_area->SetNet( netcode ); new_area->SetLayer( layer ); - new_area->m_TimeStamp = GetNewTimeStamp(); + new_area->SetTimeStamp( GetNewTimeStamp() ); if( iarea < (int) ( m_ZoneDescriptorList.size() - 1 ) ) m_ZoneDescriptorList.insert( m_ZoneDescriptorList.begin() + iarea + 1, new_area ); @@ -284,7 +284,7 @@ int BOARD::ClipAreaPolygon( PICKED_ITEMS_LIST * aNewZonesList, { wxString str; str.Printf( wxT( "Area %8.8X of net \"%s\" has arcs intersecting other sides.\n" ), - aCurrArea->m_TimeStamp, GetChars( aCurrArea->m_Netname ) ); + aCurrArea->GetTimeStamp(), GetChars( aCurrArea->m_Netname ) ); str += wxT( "This may cause problems with other editing operations,\n" ); str += wxT( "such as adding cutouts. It can't be fixed automatically.\n" ); str += wxT( "Manual correction is recommended." ); @@ -307,7 +307,7 @@ int BOARD::ClipAreaPolygon( PICKED_ITEMS_LIST * aNewZonesList, { wxString str; str.Printf( wxT( "Area %8.8X of net \"%s\" is self-intersecting and will be clipped.\n" ), - aCurrArea->m_TimeStamp, GetChars( aCurrArea->m_Netname ) ); + aCurrArea->GetTimeStamp(), GetChars( aCurrArea->m_Netname ) ); str += wxT( "This may result in splitting the area.\n" ); str += wxT( "If the area is complex, this may take a few seconds." ); wxMessageBox( str );