Yet more module -> footprint.

This commit is contained in:
Jeff Young 2020-11-13 02:57:11 +00:00
parent 9106cc19bf
commit 522d64968e
44 changed files with 771 additions and 763 deletions

View File

@ -1409,37 +1409,31 @@ void C3D_RENDER_RAYTRACING::load_3D_models( CCONTAINER &aDstContainer, bool aSki
wxPoint pos = fp->GetPosition(); wxPoint pos = fp->GetPosition();
glm::mat4 moduleMatrix = glm::mat4( 1.0f ); glm::mat4 fpMatrix = glm::mat4( 1.0f );
moduleMatrix = glm::translate( moduleMatrix, fpMatrix = glm::translate( fpMatrix, SFVEC3F( pos.x * m_boardAdapter.BiuTo3Dunits(),
SFVEC3F( pos.x * m_boardAdapter.BiuTo3Dunits(),
-pos.y * m_boardAdapter.BiuTo3Dunits(), -pos.y * m_boardAdapter.BiuTo3Dunits(),
zpos ) ); zpos ) );
if( fp->GetOrientation() ) if( fp->GetOrientation() )
{ {
moduleMatrix = glm::rotate( moduleMatrix, fpMatrix = glm::rotate( fpMatrix,
( (float)(fp->GetOrientation() / 10.0f) / 180.0f ) * ( (float)(fp->GetOrientation() / 10.0f) / 180.0f ) * glm::pi<float>(),
glm::pi<float>(),
SFVEC3F( 0.0f, 0.0f, 1.0f ) ); SFVEC3F( 0.0f, 0.0f, 1.0f ) );
} }
if( fp->IsFlipped() ) if( fp->IsFlipped() )
{ {
moduleMatrix = glm::rotate( moduleMatrix, fpMatrix = glm::rotate( fpMatrix, glm::pi<float>(), SFVEC3F( 0.0f, 1.0f, 0.0f ) );
glm::pi<float>(),
SFVEC3F( 0.0f, 1.0f, 0.0f ) );
moduleMatrix = glm::rotate( moduleMatrix, fpMatrix = glm::rotate( fpMatrix, glm::pi<float>(), SFVEC3F( 0.0f, 0.0f, 1.0f ) );
glm::pi<float>(),
SFVEC3F( 0.0f, 0.0f, 1.0f ) );
} }
const double modelunit_to_3d_units_factor = m_boardAdapter.BiuTo3Dunits() * const double modelunit_to_3d_units_factor = m_boardAdapter.BiuTo3Dunits() *
UNITS3D_TO_UNITSPCB; UNITS3D_TO_UNITSPCB;
moduleMatrix = glm::scale( moduleMatrix, fpMatrix = glm::scale( fpMatrix,
SFVEC3F( modelunit_to_3d_units_factor, SFVEC3F( modelunit_to_3d_units_factor,
modelunit_to_3d_units_factor, modelunit_to_3d_units_factor,
modelunit_to_3d_units_factor ) ); modelunit_to_3d_units_factor ) );
@ -1462,7 +1456,7 @@ void C3D_RENDER_RAYTRACING::load_3D_models( CCONTAINER &aDstContainer, bool aSki
// only add it if the return is not NULL // only add it if the return is not NULL
if( modelPtr ) if( modelPtr )
{ {
glm::mat4 modelMatrix = moduleMatrix; glm::mat4 modelMatrix = fpMatrix;
modelMatrix = glm::translate( modelMatrix, modelMatrix = glm::translate( modelMatrix,
SFVEC3F( sM->m_Offset.x, SFVEC3F( sM->m_Offset.x,
@ -1611,12 +1605,9 @@ MODEL_MATERIALS *C3D_RENDER_RAYTRACING::get_3D_model_material( const S3DMODEL *a
return materialVector; return materialVector;
} }
void C3D_RENDER_RAYTRACING::add_3D_models( CCONTAINER &aDstContainer, void C3D_RENDER_RAYTRACING::add_3D_models( CCONTAINER &aDstContainer, const S3DMODEL *a3DModel,
const S3DMODEL *a3DModel, const glm::mat4 &aModelMatrix, float aFPOpacity,
const glm::mat4 &aModelMatrix, bool aSkipMaterialInformation, BOARD_ITEM *aBoardItem )
float aModuleOpacity,
bool aSkipMaterialInformation,
BOARD_ITEM *aBoardItem )
{ {
// Validate a3DModel pointers // Validate a3DModel pointers
@ -1629,12 +1620,12 @@ void C3D_RENDER_RAYTRACING::add_3D_models( CCONTAINER &aDstContainer,
wxASSERT( a3DModel->m_Meshes != NULL ); wxASSERT( a3DModel->m_Meshes != NULL );
wxASSERT( a3DModel->m_MaterialsSize > 0 ); wxASSERT( a3DModel->m_MaterialsSize > 0 );
wxASSERT( a3DModel->m_MeshesSize > 0 ); wxASSERT( a3DModel->m_MeshesSize > 0 );
wxASSERT( aModuleOpacity > 0.0f ); wxASSERT( aFPOpacity > 0.0f );
wxASSERT( aModuleOpacity <= 1.0f ); wxASSERT( aFPOpacity <= 1.0f );
if( aModuleOpacity > 1.0f ) if( aFPOpacity > 1.0f )
{ {
aModuleOpacity = 1.0f; aFPOpacity = 1.0f;
} }
if( (a3DModel->m_Materials != NULL) && (a3DModel->m_Meshes != NULL) && if( (a3DModel->m_Materials != NULL) && (a3DModel->m_Meshes != NULL) &&
@ -1672,14 +1663,14 @@ void C3D_RENDER_RAYTRACING::add_3D_models( CCONTAINER &aDstContainer,
((mesh.m_FaceIdxSize % 3) == 0) && ((mesh.m_FaceIdxSize % 3) == 0) &&
(mesh.m_MaterialIdx < a3DModel->m_MaterialsSize) ) (mesh.m_MaterialIdx < a3DModel->m_MaterialsSize) )
{ {
float moduleTransparency; float fpTransparency;
const CBLINN_PHONG_MATERIAL *blinn_material; const CBLINN_PHONG_MATERIAL *blinn_material;
if( !aSkipMaterialInformation ) if( !aSkipMaterialInformation )
{ {
blinn_material = &(*materialVector)[mesh.m_MaterialIdx]; blinn_material = &(*materialVector)[mesh.m_MaterialIdx];
moduleTransparency = 1.0f - ( ( 1.0f - blinn_material->GetTransparency() ) * aModuleOpacity ); fpTransparency = 1.0f - (( 1.0f - blinn_material->GetTransparency() ) * aFPOpacity );
} }
// Add all face triangles // Add all face triangles
@ -1726,7 +1717,7 @@ void C3D_RENDER_RAYTRACING::add_3D_models( CCONTAINER &aDstContainer,
if( !aSkipMaterialInformation ) if( !aSkipMaterialInformation )
{ {
newTriangle->SetMaterial( blinn_material ); newTriangle->SetMaterial( blinn_material );
newTriangle->SetModelTransparency( moduleTransparency ); newTriangle->SetModelTransparency( fpTransparency );
if( mesh.m_Color == NULL ) if( mesh.m_Color == NULL )
{ {

View File

@ -210,7 +210,7 @@ private:
void add_3D_models( CCONTAINER &aDstContainer, void add_3D_models( CCONTAINER &aDstContainer,
const S3DMODEL *a3DModel, const S3DMODEL *a3DModel,
const glm::mat4 &aModelMatrix, const glm::mat4 &aModelMatrix,
float aModuleOpacity, float aFPOpacity,
bool aSkipMaterialInformation, bool aSkipMaterialInformation,
BOARD_ITEM *aBoardItem ); BOARD_ITEM *aBoardItem );

View File

@ -54,21 +54,21 @@ size_t hash_eda( const EDA_ITEM* aItem, int aFlags )
{ {
case PCB_MODULE_T: case PCB_MODULE_T:
{ {
const MODULE* module = static_cast<const MODULE*>( aItem ); const MODULE* footprint = static_cast<const MODULE*>( aItem );
ret = hash_board_item( module, aFlags ); ret = hash_board_item( footprint, aFlags );
if( aFlags & HASH_POS ) if( aFlags & HASH_POS )
hash_combine( ret, module->GetPosition().x, module->GetPosition().y ); hash_combine( ret, footprint->GetPosition().x, footprint->GetPosition().y );
if( aFlags & HASH_ROT ) if( aFlags & HASH_ROT )
hash_combine( ret, module->GetOrientation() ); hash_combine( ret, footprint->GetOrientation() );
for( auto i : module->GraphicalItems() ) for( BOARD_ITEM* item : footprint->GraphicalItems() )
hash_combine( ret, hash_eda( i, aFlags ) ); hash_combine( ret, hash_eda( item, aFlags ) );
for( auto i : module->Pads() ) for( PAD* pad : footprint->Pads() )
hash_combine( ret, hash_eda( static_cast<EDA_ITEM*>( i ), aFlags ) ); hash_combine( ret, hash_eda( static_cast<EDA_ITEM*>( pad ), aFlags ) );
} }
break; break;

View File

@ -197,7 +197,7 @@ void BACK_ANNOTATE::getPcbModulesFromString( const std::string& aPayload )
else else
{ {
// Add module to the map // Add module to the map
auto data = std::make_shared<PCB_MODULE_DATA>( ref, footprint, value, pinNetMap ); auto data = std::make_shared<PCB_FP_DATA>( ref, footprint, value, pinNetMap );
m_pcbModules.insert( nearestItem, std::make_pair( path, data ) ); m_pcbModules.insert( nearestItem, std::make_pair( path, data ) );
} }
} }
@ -206,7 +206,7 @@ void BACK_ANNOTATE::getPcbModulesFromString( const std::string& aPayload )
void BACK_ANNOTATE::getChangeList() void BACK_ANNOTATE::getChangeList()
{ {
for( std::pair<const wxString, std::shared_ptr<PCB_MODULE_DATA>>& module : m_pcbModules ) for( std::pair<const wxString, std::shared_ptr<PCB_FP_DATA>>& module : m_pcbModules )
{ {
const wxString& pcbPath = module.first; const wxString& pcbPath = module.first;
auto& pcbData = module.second; auto& pcbData = module.second;
@ -273,7 +273,7 @@ void BACK_ANNOTATE::checkForUnusedSymbols()
size_t i = 0; size_t i = 0;
for( const std::pair<SCH_REFERENCE, std::shared_ptr<PCB_MODULE_DATA>>& item : m_changelist ) for( const std::pair<SCH_REFERENCE, std::shared_ptr<PCB_FP_DATA>>& item : m_changelist )
{ {
// Refs and changelist are both sorted by paths, so we just go over m_refs and // Refs and changelist are both sorted by paths, so we just go over m_refs and
// generate errors before we will find m_refs member to which item linked // generate errors before we will find m_refs member to which item linked
@ -305,61 +305,61 @@ void BACK_ANNOTATE::applyChangelist()
for( CHANGELIST_ITEM& item : m_changelist ) for( CHANGELIST_ITEM& item : m_changelist )
{ {
SCH_REFERENCE& ref = item.first; SCH_REFERENCE& ref = item.first;
PCB_MODULE_DATA& module = *item.second; PCB_FP_DATA& fpData = *item.second;
SCH_COMPONENT* comp = ref.GetComp(); SCH_COMPONENT* comp = ref.GetComp();
SCH_SCREEN* screen = ref.GetSheetPath().LastScreen(); SCH_SCREEN* screen = ref.GetSheetPath().LastScreen();
wxString oldFootprint = ref.GetFootprint(); wxString oldFootprint = ref.GetFootprint();
wxString oldValue = ref.GetValue(); wxString oldValue = ref.GetValue();
bool skip = ( ref.GetComp()->GetFlags() & SKIP_STRUCT ) > 0; bool skip = ( ref.GetComp()->GetFlags() & SKIP_STRUCT ) > 0;
if( m_processReferences && ref.GetRef() != module.m_ref && !skip ) if( m_processReferences && ref.GetRef() != fpData.m_ref && !skip )
{ {
++m_changesCount; ++m_changesCount;
msg.Printf( _( "Change \"%s\" reference designator to \"%s\"." ), msg.Printf( _( "Change \"%s\" reference designator to \"%s\"." ),
ref.GetFullRef(), ref.GetFullRef(),
module.m_ref ); fpData.m_ref );
if( !m_dryRun ) if( !m_dryRun )
{ {
m_frame->SaveCopyInUndoList( screen, comp, UNDO_REDO::CHANGED, m_appendUndo ); m_frame->SaveCopyInUndoList( screen, comp, UNDO_REDO::CHANGED, m_appendUndo );
m_appendUndo = true; m_appendUndo = true;
comp->SetRef( &ref.GetSheetPath(), module.m_ref ); comp->SetRef( &ref.GetSheetPath(), fpData.m_ref );
} }
m_reporter.ReportHead( msg, RPT_SEVERITY_ACTION ); m_reporter.ReportHead( msg, RPT_SEVERITY_ACTION );
} }
if( m_processFootprints && oldFootprint != module.m_footprint && !skip ) if( m_processFootprints && oldFootprint != fpData.m_footprint && !skip )
{ {
++m_changesCount; ++m_changesCount;
msg.Printf( _( "Change %s footprint from \"%s\" to \"%s\"." ), msg.Printf( _( "Change %s footprint from \"%s\" to \"%s\"." ),
ref.GetFullRef(), ref.GetFullRef(),
oldFootprint, oldFootprint,
module.m_footprint ); fpData.m_footprint );
if( !m_dryRun ) if( !m_dryRun )
{ {
m_frame->SaveCopyInUndoList( screen, comp, UNDO_REDO::CHANGED, m_appendUndo ); m_frame->SaveCopyInUndoList( screen, comp, UNDO_REDO::CHANGED, m_appendUndo );
m_appendUndo = true; m_appendUndo = true;
comp->SetFootprint( &ref.GetSheetPath(), module.m_footprint ); comp->SetFootprint( &ref.GetSheetPath(), fpData.m_footprint );
} }
m_reporter.ReportHead( msg, RPT_SEVERITY_ACTION ); m_reporter.ReportHead( msg, RPT_SEVERITY_ACTION );
} }
if( m_processValues && oldValue != module.m_value && !skip ) if( m_processValues && oldValue != fpData.m_value && !skip )
{ {
++m_changesCount; ++m_changesCount;
msg.Printf( _( "Change %s value from \"%s\" to \"%s\"." ), msg.Printf( _( "Change %s value from \"%s\" to \"%s\"." ),
ref.GetFullRef(), ref.GetFullRef(),
oldValue, oldValue,
module.m_value ); fpData.m_value );
if( !m_dryRun ) if( !m_dryRun )
{ {
m_frame->SaveCopyInUndoList( screen, comp, UNDO_REDO::CHANGED, m_appendUndo ); m_frame->SaveCopyInUndoList( screen, comp, UNDO_REDO::CHANGED, m_appendUndo );
m_appendUndo = true; m_appendUndo = true;
comp->SetValue( &ref.GetSheetPath(), module.m_value ); comp->SetValue( &ref.GetSheetPath(), fpData.m_value );
} }
m_reporter.ReportHead( msg, RPT_SEVERITY_ACTION ); m_reporter.ReportHead( msg, RPT_SEVERITY_ACTION );
@ -367,7 +367,7 @@ void BACK_ANNOTATE::applyChangelist()
if( m_processNetNames ) if( m_processNetNames )
{ {
for( const std::pair<const wxString, wxString>& entry : module.m_pinMap ) for( const std::pair<const wxString, wxString>& entry : fpData.m_pinMap )
{ {
const wxString& pinNumber = entry.first; const wxString& pinNumber = entry.first;
const wxString& shortNetName = entry.second; const wxString& shortNetName = entry.second;

View File

@ -43,25 +43,25 @@ class SCH_EDIT_FRAME;
* @brief Back annotation algorithm class used to recieve, check, and apply a \ref NETLIST from * @brief Back annotation algorithm class used to recieve, check, and apply a \ref NETLIST from
* PCBNEW. * PCBNEW.
* The following checks are made: * The following checks are made:
* - Schematic symbol exists, but linked PCBnew module missing * - Schematic symbol exists, but linked PCBnew footprint missing
* - PCBnew module exists but no schematic symbol connected to * - PCBnew footprint exists but no schematic symbol connected to
* - PCBnew module is standalone * - PCBnew footprint is standalone
* - Schematic sheet is reused one or more times and user trying to change footprint or value * - Schematic sheet is reused one or more times and user trying to change footprint or value
* only for few of them. * only for few of them.
* - Schematic symbols share same path * - Schematic symbols share same path
* - More than one PCBnew module linked to same path * - More than one PCBnew footprint linked to same path
*/ */
class BACK_ANNOTATE class BACK_ANNOTATE
{ {
public: public:
/** /**
* @brief Struct to hold PCBnew module data * @brief Struct to hold PCBnew footprint data
*/ */
struct PCB_MODULE_DATA struct PCB_FP_DATA
{ {
PCB_MODULE_DATA( const wxString& aRef, const wxString& aFootprint, PCB_FP_DATA( const wxString& aRef, const wxString& aFootprint, const wxString& aValue,
const wxString& aValue, const std::map<wxString, wxString> aPinMap ) : const std::map<wxString, wxString> aPinMap ) :
m_ref( aRef ), m_ref( aRef ),
m_footprint( aFootprint ), m_footprint( aFootprint ),
m_value( aValue ), m_value( aValue ),
@ -75,9 +75,9 @@ public:
}; };
///> Map to hold NETLIST footprints data ///> Map to hold NETLIST footprints data
using PCB_MODULES_MAP = std::map<wxString, std::shared_ptr<PCB_MODULE_DATA>>; using PCB_MODULES_MAP = std::map<wxString, std::shared_ptr<PCB_FP_DATA>>;
using CHANGELIST_ITEM = std::pair<SCH_REFERENCE, std::shared_ptr<PCB_MODULE_DATA>>; using CHANGELIST_ITEM = std::pair<SCH_REFERENCE, std::shared_ptr<PCB_FP_DATA>>;
BACK_ANNOTATE( SCH_EDIT_FRAME* aFrame, REPORTER& aReporter, bool aRelinkFootprints, BACK_ANNOTATE( SCH_EDIT_FRAME* aFrame, REPORTER& aReporter, bool aRelinkFootprints,
bool aProcessFootprints, bool aProcessValues, bool aProcessReferences, bool aProcessFootprints, bool aProcessValues, bool aProcessReferences,

View File

@ -171,7 +171,7 @@ int SCH_DRAWING_TOOLS::PlaceComponent( const TOOL_EVENT& aEvent )
{ {
m_toolMgr->RunAction( EE_ACTIONS::clearSelection, true ); m_toolMgr->RunAction( EE_ACTIONS::clearSelection, true );
// Pick the module to be placed // Pick the footprint to be placed
bool footprintPreviews = m_frame->eeconfig()->m_Appearance.footprint_preview; bool footprintPreviews = m_frame->eeconfig()->m_Appearance.footprint_preview;
PICKED_SYMBOL sel = m_frame->PickSymbolFromLibTree( &filter, *historyList, true, PICKED_SYMBOL sel = m_frame->PickSymbolFromLibTree( &filter, *historyList, true,
1, 1, footprintPreviews ); 1, 1, footprintPreviews );
@ -281,7 +281,7 @@ int SCH_DRAWING_TOOLS::PlaceComponent( const TOOL_EVENT& aEvent )
else else
evt->SetPassEvent(); evt->SetPassEvent();
// Enable autopanning and cursor capture only when there is a module to be placed // Enable autopanning and cursor capture only when there is a footprint to be placed
getViewControls()->SetAutoPan( component != nullptr ); getViewControls()->SetAutoPan( component != nullptr );
getViewControls()->CaptureCursor( component != nullptr ); getViewControls()->CaptureCursor( component != nullptr );
} }
@ -447,7 +447,7 @@ int SCH_DRAWING_TOOLS::PlaceImage( const TOOL_EVENT& aEvent )
else else
evt->SetPassEvent(); evt->SetPassEvent();
// Enable autopanning and cursor capture only when there is a module to be placed // Enable autopanning and cursor capture only when there is a footprint to be placed
getViewControls()->SetAutoPan( image != nullptr ); getViewControls()->SetAutoPan( image != nullptr );
getViewControls()->CaptureCursor( image != nullptr ); getViewControls()->CaptureCursor( image != nullptr );
} }
@ -981,7 +981,7 @@ int SCH_DRAWING_TOOLS::TwoClickPlace( const TOOL_EVENT& aEvent )
else else
evt->SetPassEvent(); evt->SetPassEvent();
// Enable autopanning and cursor capture only when there is a module to be placed // Enable autopanning and cursor capture only when there is a footprint to be placed
getViewControls()->SetAutoPan( item != nullptr ); getViewControls()->SetAutoPan( item != nullptr );
getViewControls()->CaptureCursor( item != nullptr ); getViewControls()->CaptureCursor( item != nullptr );
} }

View File

@ -243,7 +243,7 @@ void GBR_TO_PCB_EXPORTER::export_non_copper_item( GERBER_DRAW_ITEM* aGbrItem, LA
/* /*
* Many holes will be pads, but we have no way to create those without footprints, and creating * Many holes will be pads, but we have no way to create those without footprints, and creating
* a module per pad is not really viable. * a footprint per pad is not really viable.
* *
* So we use vias to mimic holes, with the loss of any hole shape (as we only have round holes * So we use vias to mimic holes, with the loss of any hole shape (as we only have round holes
* in vias at present). * in vias at present).
@ -396,7 +396,7 @@ void GBR_TO_PCB_EXPORTER::export_segarc_copper_item( GERBER_DRAW_ITEM* aGbrItem,
/* /*
* Flashed items are usually pads or vias. Pads are problematic because we have no way to * Flashed items are usually pads or vias. Pads are problematic because we have no way to
* represent one in Pcbnew outside of a module (and creating a module per pad isn't really * represent one in Pcbnew outside of a footprint (and creating a footprint per pad isn't really
* viable). * viable).
* If we've already created a via from a hole, and the flashed copper item is a simple circle * If we've already created a via from a hole, and the flashed copper item is a simple circle
* then we'll enlarge the via to the proper size. Otherwise we create a copper polygon to * then we'll enlarge the via to the proper size. Otherwise we create a copper polygon to

View File

@ -214,18 +214,18 @@ public:
} }
/** /**
* Get info for a module by id. * Get info for a footprint by id.
*/ */
FOOTPRINT_INFO* GetFootprintInfo( const wxString& aFootprintName ); FOOTPRINT_INFO* GetFootprintInfo( const wxString& aFootprintName );
/** /**
* Get info for a module by libNickname/footprintName * Get info for a footprint by libNickname/footprintName
*/ */
FOOTPRINT_INFO* GetFootprintInfo( const wxString& aLibNickname, FOOTPRINT_INFO* GetFootprintInfo( const wxString& aLibNickname,
const wxString& aFootprintName ); const wxString& aFootprintName );
/** /**
* Get info for a module by index. * Get info for a footprint by index.
* @param aIdx = index of the given item * @param aIdx = index of the given item
* @return the aIdx item in list * @return the aIdx item in list
*/ */

View File

@ -89,7 +89,7 @@ int GraphicTextWidth( const wxString& aText, const wxSize& aSize, bool italic, b
/** /**
* Function GRText * Function GRText
* Draw a graphic text (like module texts) * Draw a graphic text (like footprint text)
* @param aClipBox = the clipping rect, or NULL if no clipping * @param aClipBox = the clipping rect, or NULL if no clipping
* @param aDC = the current Device Context. NULL if draw within a 3D GL Canvas * @param aDC = the current Device Context. NULL if draw within a 3D GL Canvas
* @param aPos = text position (according to h_justify, v_justify) * @param aPos = text position (according to h_justify, v_justify)

View File

@ -321,10 +321,10 @@ public:
/** /**
* Adds the given module to the board. * Adds the given module to the board.
* @param module * @param aFootprint
* @param aDC (can be NULL ) = the current Device Context, to draw the new footprint * @param aDC (can be NULL ) = the current Device Context, to draw the new footprint
*/ */
virtual void AddFootprintToBoard( MODULE* module ); virtual void AddFootprintToBoard( MODULE* aFootprint );
/** /**
* Function SelectFootprintFromLibBrowser * Function SelectFootprintFromLibBrowser

View File

@ -67,8 +67,8 @@ public:
bool m_DisplayViaFill; bool m_DisplayViaFill;
bool m_DisplayPadNum; // show pads numbers bool m_DisplayPadNum; // show pads numbers
bool m_DisplayPadIsol; bool m_DisplayPadIsol;
bool m_DisplayGraphicsFill; // How to display module drawings ( sketch/ filled ) bool m_DisplayGraphicsFill; // How to display fp drawings ( sketch/ filled )
bool m_DisplayTextFill; // How to display module texts ( sketch/ filled ) bool m_DisplayTextFill; // How to display fp texts ( sketch/ filled )
bool m_DisplayPcbTrackFill; // false : tracks are show in sketch mode, true = filled. bool m_DisplayPcbTrackFill; // false : tracks are show in sketch mode, true = filled.
/// How trace clearances are displayed. @see TRACE_CLEARANCE_DISPLAY_MODE_T. /// How trace clearances are displayed. @see TRACE_CLEARANCE_DISPLAY_MODE_T.

View File

@ -52,9 +52,9 @@ void ARRAY_CREATOR::Invoke()
if( m_selection.Size() == 0 ) if( m_selection.Size() == 0 )
return; return;
MODULE* const module = m_editModules ? m_parent.GetBoard()->GetFirstFootprint() : nullptr; MODULE* const fp = m_isFootprintEditor ? m_parent.GetBoard()->GetFirstFootprint() : nullptr;
const bool enableArrayNumbering = m_editModules; const bool enableArrayNumbering = m_isFootprintEditor;
const wxPoint rotPoint = (wxPoint) m_selection.GetCenter(); const wxPoint rotPoint = (wxPoint) m_selection.GetCenter();
std::unique_ptr<ARRAY_OPTIONS> array_opts; std::unique_ptr<ARRAY_OPTIONS> array_opts;
@ -68,15 +68,15 @@ void ARRAY_CREATOR::Invoke()
BOARD_COMMIT commit( &m_parent ); BOARD_COMMIT commit( &m_parent );
ARRAY_PAD_NAME_PROVIDER pad_name_provider( module, *array_opts ); ARRAY_PAD_NAME_PROVIDER pad_name_provider( fp, *array_opts );
for ( int i = 0; i < m_selection.Size(); ++i ) for ( int i = 0; i < m_selection.Size(); ++i )
{ {
BOARD_ITEM* item = static_cast<BOARD_ITEM*>( m_selection[ i ] ); BOARD_ITEM* item = static_cast<BOARD_ITEM*>( m_selection[ i ] );
if( item->Type() == PCB_PAD_T && !m_editModules ) if( item->Type() == PCB_PAD_T && !m_isFootprintEditor )
{ {
// If it is not the module editor, then duplicate the parent module instead // If it is not the footprint editor, then duplicate the parent footprint instead
item = static_cast<MODULE*>( item )->GetParent(); item = static_cast<MODULE*>( item )->GetParent();
} }
@ -96,11 +96,11 @@ void ARRAY_CREATOR::Invoke()
// Need to create a new item // Need to create a new item
BOARD_ITEM* new_item = nullptr; BOARD_ITEM* new_item = nullptr;
if( m_editModules ) if( m_isFootprintEditor )
{ {
// Don't bother incrementing pads: the module won't update // Don't bother incrementing pads: the footprint won't update until commit,
// until commit, so we can only do this once // so we can only do this once
new_item = module->DuplicateItem( item ); new_item = fp->DuplicateItem( item );
} }
else else
{ {

View File

@ -33,15 +33,16 @@
#include <tools/pcbnew_selection.h> #include <tools/pcbnew_selection.h>
/*! /*!
* Class that performs array creation by producing a dialog to gather * Class that performs array creation by producing a dialog to gather parameters and then
* parameters and then creating and laying out the items. * creating and laying out the items.
*/ */
class ARRAY_CREATOR class ARRAY_CREATOR
{ {
public: public:
ARRAY_CREATOR( PCB_BASE_FRAME& aParent, bool editModules, const PCBNEW_SELECTION& aSelection ) : ARRAY_CREATOR( PCB_BASE_FRAME& aParent, bool aIsFootprintEditor,
const PCBNEW_SELECTION& aSelection ) :
m_parent( aParent ), m_parent( aParent ),
m_editModules( editModules ), m_isFootprintEditor( aIsFootprintEditor ),
m_selection( aSelection ) m_selection( aSelection )
{} {}
@ -54,7 +55,7 @@ public:
private: private:
PCB_BASE_FRAME& m_parent; PCB_BASE_FRAME& m_parent;
bool m_editModules; bool m_isFootprintEditor;
const PCBNEW_SELECTION& m_selection; const PCBNEW_SELECTION& m_selection;
}; };

View File

@ -26,8 +26,8 @@
#include <pad.h> #include <pad.h>
ARRAY_PAD_NAME_PROVIDER::ARRAY_PAD_NAME_PROVIDER( ARRAY_PAD_NAME_PROVIDER::ARRAY_PAD_NAME_PROVIDER( const MODULE* aFootprint,
const MODULE* aMod, const ARRAY_OPTIONS& aArrayOpts ) const ARRAY_OPTIONS& aArrayOpts )
: m_arrayOpts( aArrayOpts ) : m_arrayOpts( aArrayOpts )
{ {
// start by numbering the first new item // start by numbering the first new item
@ -41,17 +41,15 @@ ARRAY_PAD_NAME_PROVIDER::ARRAY_PAD_NAME_PROVIDER(
} }
else else
{ {
// no module, no reserved names either // no footprint, no reserved names either
if( aMod ) if( aFootprint )
{ {
// reserve the name of each existing pad // reserve the name of each existing pad
for( auto pad : aMod->Pads() ) for( PAD* pad : aFootprint->Pads() )
{
m_existing_pad_names.insert( pad->GetName() ); m_existing_pad_names.insert( pad->GetName() );
} }
} }
} }
}
wxString ARRAY_PAD_NAME_PROVIDER::GetNextPadName() wxString ARRAY_PAD_NAME_PROVIDER::GetNextPadName()

View File

@ -37,10 +37,10 @@ class ARRAY_PAD_NAME_PROVIDER
{ {
public: public:
/** /**
* @param aMod the module to gather existing names from (nullptr for no module) * @param aFootprint the footprint to gather existing names from (nullptr for no footprint)
* @oaram aArrayOpts the array options that provide the candidate names * @oaram aArrayOpts the array options that provide the candidate names
*/ */
ARRAY_PAD_NAME_PROVIDER( const MODULE* aMod, const ARRAY_OPTIONS& aArrayOpts ); ARRAY_PAD_NAME_PROVIDER( const MODULE* aFootprint, const ARRAY_OPTIONS& aArrayOpts );
/** /**
* Get the next available pad name. * Get the next available pad name.

View File

@ -546,7 +546,7 @@ unsigned int AR_AUTOPLACER::calculateKeepOutArea( const EDA_RECT& aRect, int sid
* Returns the value TstRectangle(). * Returns the value TstRectangle().
* Module is known by its bounding box * Module is known by its bounding box
*/ */
int AR_AUTOPLACER::testModuleOnBoard( MODULE* aFootprint, bool TstOtherSide, int AR_AUTOPLACER::testFootprintOnBoard( MODULE* aFootprint, bool TstOtherSide,
const wxPoint& aOffset ) const wxPoint& aOffset )
{ {
int side = AR_SIDE_TOP; int side = AR_SIDE_TOP;
@ -587,23 +587,22 @@ int AR_AUTOPLACER::testModuleOnBoard( MODULE* aFootprint, bool TstOtherSide,
int AR_AUTOPLACER::getOptimalFPPlacement( MODULE* aFootprint ) int AR_AUTOPLACER::getOptimalFPPlacement( MODULE* aFootprint )
{ {
int error = 1; int error = 1;
wxPoint LastPosOK; wxPoint lastPosOK;
double min_cost, curr_cost, Score; double min_cost, curr_cost, Score;
bool TstOtherSide; bool testOtherSide;
aFootprint->CalculateBoundingBox(); aFootprint->CalculateBoundingBox();
LastPosOK = m_matrix.m_BrdBox.GetOrigin(); lastPosOK = m_matrix.m_BrdBox.GetOrigin();
wxPoint mod_pos = aFootprint->GetPosition(); wxPoint fpPos = aFootprint->GetPosition();
EDA_RECT fpBBox = aFootprint->GetFootprintRect(); EDA_RECT fpBBox = aFootprint->GetFootprintRect();
// Move fpBBox to have the footprint position at (0,0) // Move fpBBox to have the footprint position at (0,0)
fpBBox.Move( -mod_pos ); fpBBox.Move( -fpPos );
wxPoint fpBBoxOrg = fpBBox.GetOrigin(); wxPoint fpBBoxOrg = fpBBox.GetOrigin();
// Calculate the limit of the footprint position, relative // Calculate the limit of the footprint position, relative to the routing matrix area
// to the routing matrix area
wxPoint xylimit = m_matrix.m_BrdBox.GetEnd() - fpBBox.GetEnd(); wxPoint xylimit = m_matrix.m_BrdBox.GetEnd() - fpBBox.GetEnd();
wxPoint initialPos = m_matrix.m_BrdBox.GetOrigin() - fpBBoxOrg; wxPoint initialPos = m_matrix.m_BrdBox.GetOrigin() - fpBBoxOrg;
@ -613,12 +612,10 @@ int AR_AUTOPLACER::getOptimalFPPlacement( MODULE* aFootprint )
initialPos.y -= initialPos.y % m_matrix.m_GridRouting; initialPos.y -= initialPos.y % m_matrix.m_GridRouting;
m_curPosition = initialPos; m_curPosition = initialPos;
auto moduleOffset = mod_pos - m_curPosition; wxPoint fpOffset = fpPos - m_curPosition;
/* Examine pads, and set TstOtherSide to true if a footprint // Examine pads, and set testOtherSide to true if a footprint has at least 1 pad through.
* has at least 1 pad through. testOtherSide = false;
*/
TstOtherSide = false;
if( m_matrix.m_RoutingLayersCount > 1 ) if( m_matrix.m_RoutingLayersCount > 1 )
{ {
@ -629,7 +626,7 @@ int AR_AUTOPLACER::getOptimalFPPlacement( MODULE* aFootprint )
if( !( pad->GetLayerSet() & other ).any() ) if( !( pad->GetLayerSet() & other ).any() )
continue; continue;
TstOtherSide = true; testOtherSide = true;
break; break;
} }
} }
@ -648,19 +645,19 @@ int AR_AUTOPLACER::getOptimalFPPlacement( MODULE* aFootprint )
{ {
fpBBox.SetOrigin( fpBBoxOrg + m_curPosition ); fpBBox.SetOrigin( fpBBoxOrg + m_curPosition );
moduleOffset = mod_pos - m_curPosition; fpOffset = fpPos - m_curPosition;
int keepOutCost = testModuleOnBoard( aFootprint, TstOtherSide, moduleOffset ); int keepOutCost = testFootprintOnBoard( aFootprint, testOtherSide, fpOffset );
if( keepOutCost >= 0 ) // i.e. if the module can be put here if( keepOutCost >= 0 ) // i.e. if the footprint can be put here
{ {
error = 0; error = 0;
// m_frame->build_ratsnest_module( aFootprint ); // fixme // m_frame->build_ratsnest_module( aFootprint ); // fixme
curr_cost = computePlacementRatsnestCost( aFootprint, moduleOffset ); curr_cost = computePlacementRatsnestCost( aFootprint, fpOffset );
Score = curr_cost + keepOutCost; Score = curr_cost + keepOutCost;
if( (min_cost >= Score ) || (min_cost < 0 ) ) if( (min_cost >= Score ) || (min_cost < 0 ) )
{ {
LastPosOK = m_curPosition; lastPosOK = m_curPosition;
min_cost = Score; min_cost = Score;
wxString msg; wxString msg;
/* msg.Printf( wxT( "Score %g, pos %s, %s" ), /* msg.Printf( wxT( "Score %g, pos %s, %s" ),
@ -674,7 +671,7 @@ int AR_AUTOPLACER::getOptimalFPPlacement( MODULE* aFootprint )
} }
// Regeneration of the modified variable. // Regeneration of the modified variable.
m_curPosition = LastPosOK; m_curPosition = lastPosOK;
m_minCost = min_cost; m_minCost = min_cost;
return error; return error;
@ -897,7 +894,7 @@ AR_RESULT AR_AUTOPLACER::AutoplaceFootprints( std::vector<MODULE*>& aFootprints,
if( genPlacementRoutingMatrix( ) == 0 ) if( genPlacementRoutingMatrix( ) == 0 )
return AR_FAILURE; return AR_FAILURE;
int moduleCount = 0; int placedCount = 0;
for( MODULE* footprint : m_board->Footprints() ) for( MODULE* footprint : m_board->Footprints() )
footprint->SetNeedsPlaced( false ); footprint->SetNeedsPlaced( false );
@ -928,7 +925,7 @@ AR_RESULT AR_AUTOPLACER::AutoplaceFootprints( std::vector<MODULE*>& aFootprints,
for( MODULE* footprint : m_board->Footprints() ) for( MODULE* footprint : m_board->Footprints() )
{ {
if( footprint->NeedsPlaced() ) // Erase from screen if( footprint->NeedsPlaced() ) // Erase from screen
moduleCount++; placedCount++;
else else
genModuleOnRoutingMatrix( footprint ); genModuleOnRoutingMatrix( footprint );
} }
@ -940,7 +937,7 @@ AR_RESULT AR_AUTOPLACER::AutoplaceFootprints( std::vector<MODULE*>& aFootprints,
if( m_progressReporter ) if( m_progressReporter )
{ {
m_progressReporter->Report( _( "Autoplacing components..." ) ); m_progressReporter->Report( _( "Autoplacing components..." ) );
m_progressReporter->SetMaxProgress( moduleCount ); m_progressReporter->SetMaxProgress( placedCount );
} }
drawPlacementRoutingMatrix(); drawPlacementRoutingMatrix();
@ -992,7 +989,7 @@ AR_RESULT AR_AUTOPLACER::AutoplaceFootprints( std::vector<MODULE*>& aFootprints,
goto end_of_tst; goto end_of_tst;
} }
// Determine if the best orientation of a module is 90. // Determine if the best orientation of a footprint is 90.
rotAllowed = footprint->GetPlacementCost90(); rotAllowed = footprint->GetPlacementCost90();
if( rotAllowed != 0 ) if( rotAllowed != 0 )
@ -1015,7 +1012,7 @@ AR_RESULT AR_AUTOPLACER::AutoplaceFootprints( std::vector<MODULE*>& aFootprints,
goto end_of_tst; goto end_of_tst;
} }
// Determine if the best orientation of a module is -90. // Determine if the best orientation of a footprint is -90.
if( rotAllowed != 0 ) if( rotAllowed != 0 )
{ {
rotateFootprint( footprint, 2700.0, true ); rotateFootprint( footprint, 2700.0, true );
@ -1049,7 +1046,7 @@ end_of_tst:
rotateFootprint( footprint, bestRotation, false ); rotateFootprint( footprint, bestRotation, false );
} }
// Place module. // Place footprint.
placeFootprint( footprint, true, m_curPosition ); placeFootprint( footprint, true, m_curPosition );
footprint->CalculateBoundingBox(); footprint->CalculateBoundingBox();
@ -1061,7 +1058,6 @@ end_of_tst:
if( m_refreshCallback ) if( m_refreshCallback )
m_refreshCallback( footprint ); m_refreshCallback( footprint );
if( m_progressReporter ) if( m_progressReporter )
{ {
m_progressReporter->AdvanceProgress(); m_progressReporter->AdvanceProgress();
@ -1079,8 +1075,8 @@ end_of_tst:
m_matrix.UnInitRoutingMatrix(); m_matrix.UnInitRoutingMatrix();
for( MODULE* footprint : m_board->Footprints() ) for( MODULE* fp : m_board->Footprints() )
footprint->CalculateBoundingBox(); fp->CalculateBoundingBox();
return cancelled ? AR_CANCELLED : AR_COMPLETED; return cancelled ? AR_CANCELLED : AR_COMPLETED;
} }

View File

@ -97,12 +97,12 @@ private:
int testRectangle( const EDA_RECT& aRect, int side ); int testRectangle( const EDA_RECT& aRect, int side );
unsigned int calculateKeepOutArea( const EDA_RECT& aRect, int side ); unsigned int calculateKeepOutArea( const EDA_RECT& aRect, int side );
int testModuleOnBoard( MODULE* aFootprint, bool TstOtherSide, const wxPoint& aOffset ); int testFootprintOnBoard( MODULE* aFootprint, bool TstOtherSide, const wxPoint& aOffset );
int getOptimalFPPlacement( MODULE* aFootprint ); int getOptimalFPPlacement( MODULE* aFootprint );
double computePlacementRatsnestCost( MODULE* aFootprint, const wxPoint& aOffset ); double computePlacementRatsnestCost( MODULE* aFootprint, const wxPoint& aOffset );
/** /**
* Find the "best" module place. The criteria are: * Find the "best" footprint place. The criteria are:
* - Maximum ratsnest with footprints already placed * - Maximum ratsnest with footprints already placed
* - Max size, and number of pads max * - Max size, and number of pads max
*/ */

View File

@ -165,13 +165,13 @@ void moveFootprintsInArea( CRectPlacement& aPlacementArea, std::vector <MODULE*>
pos.x *= scale; pos.x *= scale;
pos.y *= scale; pos.y *= scale;
MODULE * module = aFootprintList[vecSubRects[it].n]; MODULE* footprint = aFootprintList[vecSubRects[it].n];
EDA_RECT fpBBox = module->GetFootprintRect(); EDA_RECT fpBBox = footprint->GetFootprintRect();
wxPoint mod_pos = pos + ( module->GetPosition() - fpBBox.GetOrigin() ) wxPoint mod_pos = pos + ( footprint->GetPosition() - fpBBox.GetOrigin() )
+ aFreeArea.GetOrigin(); + aFreeArea.GetOrigin();
module->Move( mod_pos - module->GetPosition() ); footprint->Move( mod_pos - footprint->GetPosition() );
} }
} }

View File

@ -227,7 +227,7 @@ void MODULE::TransformFPShapesWithClearanceToPolygon( SHAPE_POLY_SET& aCornerBuf
PCB_LAYER_ID aLayer, int aClearance, PCB_LAYER_ID aLayer, int aClearance,
int aError, ERROR_LOC aErrorLoc, int aError, ERROR_LOC aErrorLoc,
bool aIncludeText, bool aIncludeText,
bool aIncludeEdges ) const bool aIncludeShapes ) const
{ {
std::vector<FP_TEXT*> texts; // List of FP_TEXT to convert std::vector<FP_TEXT*> texts; // List of FP_TEXT to convert
@ -241,7 +241,7 @@ void MODULE::TransformFPShapesWithClearanceToPolygon( SHAPE_POLY_SET& aCornerBuf
texts.push_back( text ); texts.push_back( text );
} }
if( item->Type() == PCB_FP_SHAPE_T && aIncludeEdges ) if( item->Type() == PCB_FP_SHAPE_T && aIncludeShapes )
{ {
FP_SHAPE* outline = static_cast<FP_SHAPE*>( item ); FP_SHAPE* outline = static_cast<FP_SHAPE*>( item );

View File

@ -37,7 +37,8 @@
#include <macros.h> #include <macros.h>
#include <math/util.h> // for KiROUND #include <math/util.h> // for KiROUND
/* This module contains out of line member functions for classes given in /*
* This module contains out of line member functions for classes given in
* collectors.h. Those classes augment the functionality of class PCB_EDIT_FRAME. * collectors.h. Those classes augment the functionality of class PCB_EDIT_FRAME.
*/ */
@ -188,7 +189,7 @@ const KICAD_T GENERAL_COLLECTOR::Dimensions[] = {
SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_ITEM* testItem, void* testData ) SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_ITEM* testItem, void* testData )
{ {
BOARD_ITEM* item = (BOARD_ITEM*) testItem; BOARD_ITEM* item = (BOARD_ITEM*) testItem;
MODULE* module = nullptr; MODULE* footprint = nullptr;
PCB_GROUP* group = nullptr; PCB_GROUP* group = nullptr;
PAD* pad = nullptr; PAD* pad = nullptr;
bool pad_through = false; bool pad_through = false;
@ -205,13 +206,11 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_ITEM* testItem, void* testData )
{ {
case PCB_PAD_T: case PCB_PAD_T:
{ {
MODULE* m = (MODULE*) item->GetParent(); MODULE* footprint = (MODULE*) item->GetParent();
if( m->GetReference() == wxT( "Y2" ) ) if( footprint->GetReference() == wxT( "Y2" ) )
{
breakhere++; breakhere++;
} }
}
break; break;
case PCB_VIA_T: case PCB_VIA_T:
@ -237,24 +236,20 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_ITEM* testItem, void* testData )
case PCB_FP_TEXT_T: case PCB_FP_TEXT_T:
{ {
FP_TEXT* tm = (FP_TEXT*) item; FP_TEXT* fpText = (FP_TEXT*) item;
if( tm->GetText() == wxT( "10uH" ) ) if( fpText->GetText() == wxT( "10uH" ) )
{
breakhere++; breakhere++;
} }
}
break; break;
case PCB_MODULE_T: case PCB_MODULE_T:
{ {
MODULE* m = (MODULE*) item; MODULE* footprint = (MODULE*) item;
if( m->GetReference() == wxT( "C98" ) ) if( footprint->GetReference() == wxT( "C98" ) )
{
breakhere++; breakhere++;
} }
}
break; break;
case PCB_MARKER_T: case PCB_MARKER_T:
@ -274,22 +269,22 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_ITEM* testItem, void* testData )
case PCB_PAD_T: case PCB_PAD_T:
// there are pad specific visibility controls. // there are pad specific visibility controls.
// Criterias to select a pad is: // Criterias to select a pad is:
// for smd pads: the module parent must be seen, and pads on the corresponding // for smd pads: the footprint parent must be visible, and pads on the corresponding
// board side must be seen // board side must be visible
// if pad is a thru hole, then it can be visible when its parent module is not. // if pad is a thru hole, then it can be visible when its parent footprint is not.
// for through pads: pads on Front or Back board sides must be seen // for through pads: pads on Front or Back board sides must be visible
pad = static_cast<PAD*>( item ); pad = static_cast<PAD*>( item );
if( (pad->GetAttribute() != PAD_ATTRIB_SMD) && if( (pad->GetAttribute() != PAD_ATTRIB_SMD) &&
(pad->GetAttribute() != PAD_ATTRIB_CONN) ) // a hole is present, so multiple layers (pad->GetAttribute() != PAD_ATTRIB_CONN) ) // a hole is present, so multiple layers
{ {
// proceed to the common tests below, but without the parent module test, // proceed to the common tests below, but without the parent footprint test,
// by leaving module==NULL, but having pad != null // by leaving footprint==NULL, but having pad != null
pad_through = true; pad_through = true;
} }
else // smd, so use pads test after module test else // smd, so use pads test after footprint test
{ {
module = static_cast<MODULE*>( item->GetParent() ); footprint = static_cast<MODULE*>( item->GetParent() );
} }
break; break;
@ -305,7 +300,7 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_ITEM* testItem, void* testData )
break; break;
case PCB_FP_ZONE_T: case PCB_FP_ZONE_T:
module = static_cast<MODULE*>( item->GetParent() ); footprint = static_cast<MODULE*>( item->GetParent() );
// Fallthrough to get the zone as well // Fallthrough to get the zone as well
KI_FALLTHROUGH; KI_FALLTHROUGH;
@ -368,8 +363,8 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_ITEM* testItem, void* testData )
break; break;
} }
// Extract the module since it could be hidden // Extract the footprint since it could be hidden
module = static_cast<MODULE*>( item->GetParent() ); footprint = static_cast<MODULE*>( item->GetParent() );
} }
break; break;
@ -378,7 +373,7 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_ITEM* testItem, void* testData )
break; break;
case PCB_MODULE_T: case PCB_MODULE_T:
module = static_cast<MODULE*>( item ); footprint = static_cast<MODULE*>( item );
break; break;
case PCB_GROUP_T: case PCB_GROUP_T:
@ -395,12 +390,12 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_ITEM* testItem, void* testData )
// common tests: // common tests:
if( module ) // true from case PCB_PAD_T, PCB_FP_TEXT_T, or PCB_MODULE_T if( footprint ) // true from case PCB_PAD_T, PCB_FP_TEXT_T, or PCB_MODULE_T
{ {
if( m_Guide->IgnoreFootprintsOnBack() && ( module->GetLayer() == B_Cu) ) if( m_Guide->IgnoreFootprintsOnBack() && ( footprint->GetLayer() == B_Cu) )
goto exit; goto exit;
if( m_Guide->IgnoreFootprintsOnFront() && ( module->GetLayer() == F_Cu) ) if( m_Guide->IgnoreFootprintsOnFront() && ( footprint->GetLayer() == F_Cu) )
goto exit; goto exit;
} }
@ -459,9 +454,9 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_ITEM* testItem, void* testData )
// footprints and their subcomponents: reference, value and pads are not sensitive // footprints and their subcomponents: reference, value and pads are not sensitive
// to the layer visibility controls. They all have their own separate visibility // to the layer visibility controls. They all have their own separate visibility
// controls for vias, GetLayer() has no meaning, but IsOnLayer() works fine. User // controls for vias, GetLayer() has no meaning, but IsOnLayer() works fine. User
// text in module *is* sensitive to layer visibility but that was already handled. // text in a footprint *is* sensitive to layer visibility but that was already handled.
if( via || module || pad || m_Guide->IsLayerVisible( layer ) if( via || footprint || pad || m_Guide->IsLayerVisible( layer )
|| !m_Guide->IgnoreNonVisibleLayers() ) || !m_Guide->IgnoreNonVisibleLayers() )
{ {
if( !m_Guide->IsLayerLocked( layer ) || !m_Guide->IgnoreLockedLayers() ) if( !m_Guide->IsLayerLocked( layer ) || !m_Guide->IgnoreLockedLayers() )
@ -484,8 +479,8 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_ITEM* testItem, void* testData )
} }
else if( item->Type() == PCB_MODULE_T ) else if( item->Type() == PCB_MODULE_T )
{ {
if( module->HitTest( m_refPos, accuracy ) if( footprint->HitTest( m_refPos, accuracy )
&& module->HitTestAccurate( m_refPos, accuracy ) ) && footprint->HitTestAccurate( m_refPos, accuracy ) )
{ {
Append( item ); Append( item );
goto exit; goto exit;
@ -533,9 +528,9 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_ITEM* testItem, void* testData )
// footprints and their subcomponents: reference, value and pads are not sensitive // footprints and their subcomponents: reference, value and pads are not sensitive
// to the layer visibility controls. They all have their own separate visibility // to the layer visibility controls. They all have their own separate visibility
// controls for vias, GetLayer() has no meaning, but IsOnLayer() works fine. User // controls for vias, GetLayer() has no meaning, but IsOnLayer() works fine. User
// text in module *is* sensitive to layer visibility but that was already handled. // text in a footprint *is* sensitive to layer visibility but that was already handled.
if( via || module || pad || zone || m_Guide->IsLayerVisible( layer ) if( via || footprint || pad || zone || m_Guide->IsLayerVisible( layer )
|| !m_Guide->IgnoreNonVisibleLayers() ) || !m_Guide->IgnoreNonVisibleLayers() )
{ {
if( !m_Guide->IsLayerLocked( layer ) || !m_Guide->IgnoreLockedLayers() ) if( !m_Guide->IsLayerLocked( layer ) || !m_Guide->IgnoreLockedLayers() )
@ -558,8 +553,8 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_ITEM* testItem, void* testData )
} }
else if( item->Type() == PCB_MODULE_T ) else if( item->Type() == PCB_MODULE_T )
{ {
if( module->HitTest( m_refPos, accuracy ) if( footprint->HitTest( m_refPos, accuracy )
&& module->HitTestAccurate( m_refPos, accuracy ) ) && footprint->HitTestAccurate( m_refPos, accuracy ) )
{ {
Append( item ); Append( item );
goto exit; goto exit;

View File

@ -26,7 +26,8 @@
#define COLLECTORS_H #define COLLECTORS_H
/* This module contains a number of COLLECTOR implementations which are used /*
* This module contains a number of COLLECTOR implementations which are used
* to augment the functionality of class PCB_EDIT_FRAME. * to augment the functionality of class PCB_EDIT_FRAME.
*/ */

View File

@ -802,8 +802,7 @@ bool BuildBoardPolygonOutlines( BOARD* aBoard, SHAPE_POLY_SET& aOutlines, unsign
PCB_TYPE_COLLECTOR items; PCB_TYPE_COLLECTOR items;
bool success = false; bool success = false;
// Get all the DRAWSEGMENTS and module graphics into 'items', // Get all the PCB and FP shapes into 'items', then keep only those on layer == Edge_Cuts.
// then keep only those on layer == Edge_Cuts.
static const KICAD_T scan_graphics[] = { PCB_SHAPE_T, PCB_FP_SHAPE_T, EOT }; static const KICAD_T scan_graphics[] = { PCB_SHAPE_T, PCB_FP_SHAPE_T, EOT };
items.Collect( aBoard, scan_graphics ); items.Collect( aBoard, scan_graphics );
@ -1147,7 +1146,7 @@ bool BuildFootprintPolygonOutlines( BOARD* aBoard, SHAPE_POLY_SET& aOutlines,
if( chain.SegmentCount() == 0 ) if( chain.SegmentCount() == 0 )
{ {
// Something is wrong, bail out with the overall module bounding box // Something is wrong, bail out with the overall footprint bounding box
wxLogTrace( traceBoardOutline, "No line segments in provided outline" ); wxLogTrace( traceBoardOutline, "No line segments in provided outline" );
aOutlines = bbox; aOutlines = bbox;
return true; return true;

View File

@ -68,8 +68,8 @@ void PCB_EDIT_FRAME::ExecuteRemoteCommand( const char* cmdline )
char* text; char* text;
int netcode = -1; int netcode = -1;
bool multiHighlight = false; bool multiHighlight = false;
MODULE* module = NULL; MODULE* footprint = nullptr;
PAD* pad = NULL; PAD* pad = nullptr;
BOARD* pcb = GetBoard(); BOARD* pcb = GetBoard();
CROSS_PROBING_SETTINGS& crossProbingSettings = GetPcbNewSettings()->m_CrossProbing; CROSS_PROBING_SETTINGS& crossProbingSettings = GetPcbNewSettings()->m_CrossProbing;
@ -151,15 +151,15 @@ void PCB_EDIT_FRAME::ExecuteRemoteCommand( const char* cmdline )
modName = FROM_UTF8( text ); modName = FROM_UTF8( text );
module = pcb->FindModuleByReference( modName ); footprint = pcb->FindModuleByReference( modName );
if( module ) if( footprint )
pad = module->FindPadByName( pinName ); pad = footprint->FindPadByName( pinName );
if( pad ) if( pad )
netcode = pad->GetNetCode(); netcode = pad->GetNetCode();
if( module == NULL ) if( footprint == NULL )
msg.Printf( _( "%s not found" ), modName ); msg.Printf( _( "%s not found" ), modName );
else if( pad == NULL ) else if( pad == NULL )
msg.Printf( _( "%s pin %s not found" ), modName, pinName ); msg.Printf( _( "%s pin %s not found" ), modName, pinName );
@ -174,9 +174,9 @@ void PCB_EDIT_FRAME::ExecuteRemoteCommand( const char* cmdline )
modName = FROM_UTF8( text ); modName = FROM_UTF8( text );
module = pcb->FindModuleByReference( modName ); footprint = pcb->FindModuleByReference( modName );
if( module ) if( footprint )
msg.Printf( _( "%s found" ), modName ); msg.Printf( _( "%s found" ), modName );
else else
msg.Printf( _( "%s not found" ), modName ); msg.Printf( _( "%s not found" ), modName );
@ -212,14 +212,14 @@ void PCB_EDIT_FRAME::ExecuteRemoteCommand( const char* cmdline )
BOX2I bbox = { { 0, 0 }, { 0, 0 } }; BOX2I bbox = { { 0, 0 }, { 0, 0 } };
if( module ) if( footprint )
{ {
bbox = module->GetBoundingBox( false ); // No invisible text in bbox calc bbox = footprint->GetBoundingBox( false ); // No invisible text in bbox calc
if( pad ) if( pad )
m_toolManager->RunAction( PCB_ACTIONS::highlightItem, true, (void*) pad ); m_toolManager->RunAction( PCB_ACTIONS::highlightItem, true, (void*) pad );
else else
m_toolManager->RunAction( PCB_ACTIONS::highlightItem, true, (void*) module ); m_toolManager->RunAction( PCB_ACTIONS::highlightItem, true, (void*) footprint );
} }
else if( netcode > 0 || multiHighlight ) else if( netcode > 0 || multiHighlight )
{ {
@ -256,10 +256,10 @@ void PCB_EDIT_FRAME::ExecuteRemoteCommand( const char* cmdline )
for( TRACK* track : pcb->Tracks() ) for( TRACK* track : pcb->Tracks() )
merge_area( track ); merge_area( track );
for( MODULE* footprint : pcb->Footprints() ) for( MODULE* fp : pcb->Footprints() )
{ {
for( PAD* pad : footprint->Pads() ) for( PAD* p : fp->Pads() )
merge_area( pad ); merge_area( p );
} }
} }
} }
@ -402,7 +402,7 @@ void PCB_EDIT_FRAME::ExecuteRemoteCommand( const char* cmdline )
std::string FormatProbeItem( BOARD_ITEM* aItem ) std::string FormatProbeItem( BOARD_ITEM* aItem )
{ {
MODULE* module; MODULE* footprint;
if( !aItem ) if( !aItem )
return "$CLEAR: \"HIGHLIGHTED\""; // message to clear highlight state return "$CLEAR: \"HIGHLIGHTED\""; // message to clear highlight state
@ -410,22 +410,22 @@ std::string FormatProbeItem( BOARD_ITEM* aItem )
switch( aItem->Type() ) switch( aItem->Type() )
{ {
case PCB_MODULE_T: case PCB_MODULE_T:
module = (MODULE*) aItem; footprint = (MODULE*) aItem;
return StrPrintf( "$PART: \"%s\"", TO_UTF8( module->GetReference() ) ); return StrPrintf( "$PART: \"%s\"", TO_UTF8( footprint->GetReference() ) );
case PCB_PAD_T: case PCB_PAD_T:
{ {
module = (MODULE*) aItem->GetParent(); footprint = (MODULE*) aItem->GetParent();
wxString pad = static_cast<PAD*>( aItem )->GetName(); wxString pad = static_cast<PAD*>( aItem )->GetName();
return StrPrintf( "$PART: \"%s\" $PAD: \"%s\"", return StrPrintf( "$PART: \"%s\" $PAD: \"%s\"",
TO_UTF8( module->GetReference() ), TO_UTF8( footprint->GetReference() ),
TO_UTF8( pad ) ); TO_UTF8( pad ) );
} }
case PCB_FP_TEXT_T: case PCB_FP_TEXT_T:
{ {
module = static_cast<MODULE*>( aItem->GetParent() ); footprint = static_cast<MODULE*>( aItem->GetParent() );
FP_TEXT* text = static_cast<FP_TEXT*>( aItem ); FP_TEXT* text = static_cast<FP_TEXT*>( aItem );
const char* text_key; const char* text_key;
@ -440,7 +440,7 @@ std::string FormatProbeItem( BOARD_ITEM* aItem )
break; break;
return StrPrintf( "$PART: \"%s\" %s \"%s\"", return StrPrintf( "$PART: \"%s\" %s \"%s\"",
TO_UTF8( module->GetReference() ), TO_UTF8( footprint->GetReference() ),
text_key, text_key,
TO_UTF8( text->GetText() ) ); TO_UTF8( text->GetText() ) );
} }
@ -454,7 +454,7 @@ std::string FormatProbeItem( BOARD_ITEM* aItem )
/* Send a remote command to Eeschema via a socket, /* Send a remote command to Eeschema via a socket,
* aSyncItem = item to be located on schematic (module, pin or text) * aSyncItem = item to be located on schematic (footprint, pin or text)
* Commands are * Commands are
* $PART: "reference" put cursor on component anchor * $PART: "reference" put cursor on component anchor
* $PART: "reference" $PAD: "pad number" put cursor on the component pin * $PART: "reference" $PAD: "pad number" put cursor on the component pin
@ -510,12 +510,12 @@ void PCB_EDIT_FRAME::KiwayMailIn( KIWAY_EXPRESS& mail )
NETLIST netlist; NETLIST netlist;
STRING_FORMATTER sf; STRING_FORMATTER sf;
for( MODULE* module : this->GetBoard()->Footprints() ) for( MODULE* footprint : this->GetBoard()->Footprints() )
{ {
COMPONENT* component = new COMPONENT( module->GetFPID(), module->GetReference(), COMPONENT* component = new COMPONENT( footprint->GetFPID(), footprint->GetReference(),
module->GetValue(), module->GetPath() ); footprint->GetValue(), footprint->GetPath() );
for( PAD* pad : module->Pads() ) for( PAD* pad : footprint->Pads() )
{ {
const wxString& netname = pad->GetShortNetname(); const wxString& netname = pad->GetShortNetname();

View File

@ -97,17 +97,16 @@ wxString ActionMessage[] = {
DIALOG_BOARD_REANNOTATE::DIALOG_BOARD_REANNOTATE( PCB_EDIT_FRAME* aParentFrame ) DIALOG_BOARD_REANNOTATE::DIALOG_BOARD_REANNOTATE( PCB_EDIT_FRAME* aParentFrame )
: DIALOG_BOARD_REANNOTATE_BASE( aParentFrame ), : DIALOG_BOARD_REANNOTATE_BASE( aParentFrame ),
m_modules( aParentFrame->GetBoard()->Footprints() ) m_footprints( aParentFrame->GetBoard()->Footprints() )
{ {
m_Config = Kiface().KifaceSettings(); m_Config = Kiface().KifaceSettings();
InitValues(); InitValues();
m_frame = aParentFrame; m_frame = aParentFrame;
m_screen = m_frame->GetScreen(); m_screen = m_frame->GetScreen();
m_Units = m_frame->GetUserUnits(); m_standalone = !m_frame->TestStandalone(); //Do this here forces the menu on top
m_Standalone = !m_frame->TestStandalone(); //Do this here forces the menu on top
if( m_Standalone ) if( m_standalone )
{ //Only update the schematic if not in standalone mode { //Only update the schematic if not in standalone mode
m_UpdateSchematic->Enable( false ); m_UpdateSchematic->Enable( false );
m_UpdateSchematic->SetValue( false ); m_UpdateSchematic->SetValue( false );
@ -120,37 +119,37 @@ DIALOG_BOARD_REANNOTATE::DIALOG_BOARD_REANNOTATE( PCB_EDIT_FRAME* aParentFrame )
m_sdbSizerCancel->SetLabel( _( "Close" ) ); m_sdbSizerCancel->SetLabel( _( "Close" ) );
m_sdbSizer->Layout(); m_sdbSizer->Layout();
m_Settings = aParentFrame->config(); m_settings = aParentFrame->config();
wxArrayString gridslist; wxArrayString gridslist;
GRID_MENU::BuildChoiceList( &gridslist, m_Settings, aParentFrame ); GRID_MENU::BuildChoiceList( &gridslist, m_settings, aParentFrame );
if( -1 == m_GridIndex ) //If no default loaded if( -1 == m_gridIndex ) //If no default loaded
m_GridIndex = m_Settings->m_Window.grid.last_size_idx; //Get the current grid size m_gridIndex = m_settings->m_Window.grid.last_size_idx; //Get the current grid size
m_SortGridx = m_frame->GetCanvas()->GetGAL()->GetGridSize().x; m_sortGridx = m_frame->GetCanvas()->GetGAL()->GetGridSize().x;
m_SortGridy = m_frame->GetCanvas()->GetGAL()->GetGridSize().y; m_sortGridy = m_frame->GetCanvas()->GetGAL()->GetGridSize().y;
m_GridChoice->Set( gridslist ); //Show the choice in the dialog m_GridChoice->Set( gridslist ); //Show the choice in the dialog
m_GridChoice->SetSelection( m_GridIndex ); m_GridChoice->SetSelection( m_gridIndex );
for( wxRadioButton* button : m_sortButtons ) for( wxRadioButton* button : m_sortButtons )
button->SetValue( false ); button->SetValue( false );
m_sortButtons[m_SortCode]->SetValue( true ); m_sortButtons[m_sortCode]->SetValue( true );
m_selection = m_frame->GetToolManager()->GetTool<SELECTION_TOOL>()->GetSelection(); m_selection = m_frame->GetToolManager()->GetTool<SELECTION_TOOL>()->GetSelection();
if( !m_selection.Empty() ) if( !m_selection.Empty() )
m_AnnotationChoice = AnnotationChoice::AnnotateSelected; m_annotationChoice = AnnotationChoice::AnnotateSelected;
for( wxRadioButton* button : AnnotateWhat ) for( wxRadioButton* button : AnnotateWhat )
button->SetValue( false ); button->SetValue( false );
m_AnnotationChoice = ( m_SortCode >= (int) AnnotateWhat.size() ) ? m_annotationChoice = ( m_sortCode >= (int) AnnotateWhat.size() ) ?
AnnotationChoice::AnnotateAll : AnnotationChoice::AnnotateAll :
m_AnnotationChoice; m_annotationChoice;
AnnotateWhat[m_AnnotationChoice]->SetValue( true ); AnnotateWhat[m_annotationChoice]->SetValue( true );
reannotate_down_right_bitmap->SetBitmap( KiBitmap( reannotate_right_down_xpm ) ); reannotate_down_right_bitmap->SetBitmap( KiBitmap( reannotate_right_down_xpm ) );
reannotate_right_down_bitmap->SetBitmap( KiBitmap( reannotate_left_down_xpm ) ); reannotate_right_down_bitmap->SetBitmap( KiBitmap( reannotate_left_down_xpm ) );
@ -184,16 +183,16 @@ DIALOG_BOARD_REANNOTATE::~DIALOG_BOARD_REANNOTATE()
{ {
GetParameters(); //Get the current menu settings GetParameters(); //Get the current menu settings
PCBNEW_SETTINGS* cfg = m_frame->GetPcbNewSettings(); PCBNEW_SETTINGS* cfg = m_frame->GetPcbNewSettings();
cfg->m_Reannotate.sort_on_module_location = m_locationChoice->GetSelection() == 0; cfg->m_Reannotate.sort_on_fp_location = m_locationChoice->GetSelection() == 0;
cfg->m_Reannotate.remove_front_prefix = m_RemoveFrontPrefix->GetValue(); cfg->m_Reannotate.remove_front_prefix = m_RemoveFrontPrefix->GetValue();
cfg->m_Reannotate.remove_back_prefix = m_RemoveBackPrefix->GetValue(); cfg->m_Reannotate.remove_back_prefix = m_RemoveBackPrefix->GetValue();
cfg->m_Reannotate.update_schematic = m_UpdateSchematic->GetValue(); cfg->m_Reannotate.update_schematic = m_UpdateSchematic->GetValue();
cfg->m_Reannotate.exclude_locked = m_ExcludeLocked->GetValue(); cfg->m_Reannotate.exclude_locked = m_ExcludeLocked->GetValue();
cfg->m_Reannotate.grid_index = m_GridIndex; cfg->m_Reannotate.grid_index = m_gridIndex;
cfg->m_Reannotate.sort_code = m_SortCode; cfg->m_Reannotate.sort_code = m_sortCode;
cfg->m_Reannotate.annotation_choice = m_AnnotationChoice; cfg->m_Reannotate.annotation_choice = m_annotationChoice;
cfg->m_Reannotate.report_severity = m_Severity; cfg->m_Reannotate.report_severity = m_severity;
cfg->m_Reannotate.front_refdes_start = m_FrontRefDesStart->GetValue(); cfg->m_Reannotate.front_refdes_start = m_FrontRefDesStart->GetValue();
cfg->m_Reannotate.back_refdes_start = m_BackRefDesStart->GetValue(); cfg->m_Reannotate.back_refdes_start = m_BackRefDesStart->GetValue();
@ -208,16 +207,16 @@ DIALOG_BOARD_REANNOTATE::~DIALOG_BOARD_REANNOTATE()
void DIALOG_BOARD_REANNOTATE::InitValues( void ) void DIALOG_BOARD_REANNOTATE::InitValues( void )
{ {
PCBNEW_SETTINGS* cfg = m_frame->GetPcbNewSettings(); PCBNEW_SETTINGS* cfg = m_frame->GetPcbNewSettings();
m_locationChoice->SetSelection( cfg->m_Reannotate.sort_on_module_location ? 0 : 1 ); m_locationChoice->SetSelection( cfg->m_Reannotate.sort_on_fp_location ? 0 : 1 );
m_RemoveFrontPrefix->SetValue( cfg->m_Reannotate.remove_front_prefix ); m_RemoveFrontPrefix->SetValue( cfg->m_Reannotate.remove_front_prefix );
m_RemoveBackPrefix->SetValue( cfg->m_Reannotate.remove_back_prefix ); m_RemoveBackPrefix->SetValue( cfg->m_Reannotate.remove_back_prefix );
m_UpdateSchematic->SetValue( cfg->m_Reannotate.update_schematic ); m_UpdateSchematic->SetValue( cfg->m_Reannotate.update_schematic );
m_ExcludeLocked->SetValue( cfg->m_Reannotate.exclude_locked ); m_ExcludeLocked->SetValue( cfg->m_Reannotate.exclude_locked );
m_GridIndex = cfg->m_Reannotate.grid_index ; m_gridIndex = cfg->m_Reannotate.grid_index ;
m_SortCode = cfg->m_Reannotate.sort_code ; m_sortCode = cfg->m_Reannotate.sort_code ;
m_AnnotationChoice = cfg->m_Reannotate.annotation_choice ; m_annotationChoice = cfg->m_Reannotate.annotation_choice ;
m_Severity = cfg->m_Reannotate.report_severity; m_severity = cfg->m_Reannotate.report_severity;
m_FrontRefDesStart->SetValue( cfg->m_Reannotate.front_refdes_start ); m_FrontRefDesStart->SetValue( cfg->m_Reannotate.front_refdes_start );
m_BackRefDesStart->SetValue( cfg->m_Reannotate.back_refdes_start ); m_BackRefDesStart->SetValue( cfg->m_Reannotate.back_refdes_start );
@ -303,7 +302,7 @@ void DIALOG_BOARD_REANNOTATE::MakeSampleText( wxString& aMessage )
wxString tmp; wxString tmp;
aMessage.Printf( _( "\n%s footprints will be reannotated." ), aMessage.Printf( _( "\n%s footprints will be reannotated." ),
_( AnnotateString[m_AnnotationChoice] ) ); _( AnnotateString[m_annotationChoice] ) );
if( !m_ExcludeList->GetValue().empty() ) if( !m_ExcludeList->GetValue().empty() )
{ {
@ -362,14 +361,14 @@ void DIALOG_BOARD_REANNOTATE::MakeSampleText( wxString& aMessage )
} }
} }
bool moduleLocation = m_locationChoice->GetSelection() == 0; bool fpLocation = m_locationChoice->GetSelection() == 0;
aMessage += wxString::Format( _( "\nPrior to sorting by %s, the coordinates of which will be " aMessage += wxString::Format( _( "\nPrior to sorting by %s, the coordinates of which will be "
"rounded to a %s, %s grid." ), "rounded to a %s, %s grid." ),
moduleLocation ? _( "footprint location" ) fpLocation ? _( "footprint location" )
: _( "reference designator location" ), : _( "reference designator location" ),
MessageTextFromValue( m_Units, m_SortGridx ), MessageTextFromValue( m_units, m_sortGridx ),
MessageTextFromValue( m_Units, m_SortGridy ) ); MessageTextFromValue( m_units, m_sortGridy ) );
if( m_UpdateSchematic->GetValue() ) if( m_UpdateSchematic->GetValue() )
aMessage += _( "\nThe schematic will be updated." ); aMessage += _( "\nThe schematic will be updated." );
@ -382,37 +381,37 @@ void DIALOG_BOARD_REANNOTATE::MakeSampleText( wxString& aMessage )
void DIALOG_BOARD_REANNOTATE::GetParameters() void DIALOG_BOARD_REANNOTATE::GetParameters()
{ {
m_SortCode = 0; //Convert radio button to sort direction code m_sortCode = 0; //Convert radio button to sort direction code
for( wxRadioButton* sortbuttons : m_sortButtons ) for( wxRadioButton* sortbuttons : m_sortButtons )
{ {
if( sortbuttons->GetValue() ) if( sortbuttons->GetValue() )
break; break;
m_SortCode++; m_sortCode++;
} }
if( m_SortCode >= (int) m_sortButtons.size() ) if( m_sortCode >= (int) m_sortButtons.size() )
m_SortCode = 0; m_sortCode = 0;
m_FrontPrefixString = m_FrontPrefix->GetValue(); m_frontPrefixString = m_FrontPrefix->GetValue();
m_BackPrefixString = m_BackPrefix->GetValue(); m_backPrefixString = m_BackPrefix->GetValue();
//Get the chosen sort grid for rounding //Get the chosen sort grid for rounding
m_GridIndex = m_GridChoice->GetSelection(); m_gridIndex = m_GridChoice->GetSelection();
if( m_GridIndex >= ( int ) m_Settings->m_Window.grid.sizes.size() ) if( m_gridIndex >= ( int ) m_settings->m_Window.grid.sizes.size() )
{ {
m_SortGridx = DoubleValueFromString( EDA_UNITS::MILS, m_sortGridx = DoubleValueFromString( EDA_UNITS::MILS,
m_Settings->m_Window.grid.user_grid_x ); m_settings->m_Window.grid.user_grid_x );
m_SortGridy = DoubleValueFromString( EDA_UNITS::MILS, m_sortGridy = DoubleValueFromString( EDA_UNITS::MILS,
m_Settings->m_Window.grid.user_grid_y ); m_settings->m_Window.grid.user_grid_y );
} }
else else
{ {
m_SortGridx = DoubleValueFromString( EDA_UNITS::MILS, m_sortGridx = DoubleValueFromString( EDA_UNITS::MILS,
m_Settings->m_Window.grid.sizes[ m_GridIndex ] ); m_settings->m_Window.grid.sizes[ m_gridIndex ] );
m_SortGridy = m_SortGridx; m_sortGridy = m_sortGridx;
} }
int i = 0; int i = 0;
@ -425,7 +424,7 @@ void DIALOG_BOARD_REANNOTATE::GetParameters()
i++; i++;
} }
m_AnnotationChoice = ( i >= (int) AnnotateWhat.size() ) ? AnnotationChoice::AnnotateAll : i; m_annotationChoice = ( i >= (int) AnnotateWhat.size() ) ? AnnotationChoice::AnnotateAll : i;
m_MessageWindow->SetLazyUpdate( true ); m_MessageWindow->SetLazyUpdate( true );
} }
@ -496,8 +495,9 @@ static bool ModuleCompare( const RefDesInfo& aA, const RefDesInfo& aB )
/// @return the string /// @return the string
wxString DIALOG_BOARD_REANNOTATE::CoordTowxString( int aX, int aY ) wxString DIALOG_BOARD_REANNOTATE::CoordTowxString( int aX, int aY )
{ {
return wxString::Format( "%s, %s", MessageTextFromValue( m_Units, aX ), return wxString::Format( "%s, %s",
MessageTextFromValue( m_Units, aY ) ); MessageTextFromValue( m_units, aX ),
MessageTextFromValue( m_units, aY ) );
} }
@ -526,16 +526,16 @@ void DIALOG_BOARD_REANNOTATE::LogChangePlan()
message.Printf( _( "\n\nThere are %i types of reference designations\n" message.Printf( _( "\n\nThere are %i types of reference designations\n"
"**********************************************************\n" ), "**********************************************************\n" ),
(int) m_RefDesTypes.size() ); (int) m_refDesTypes.size() );
for( RefDesTypeStr Type : m_RefDesTypes ) //Show all the types of refdes for( RefDesTypeStr Type : m_refDesTypes ) //Show all the types of refdes
message += Type.RefDesType + ( 0 == ( i++ % 16 ) ? "\n" : " " ); message += Type.RefDesType + ( 0 == ( i++ % 16 ) ? "\n" : " " );
if( !m_ExcludeArray.empty() ) if( !m_excludeArray.empty() )
{ {
wxString excludes; wxString excludes;
for( wxString& exclude : m_ExcludeArray ) //Show the refdes we are excluding for( wxString& exclude : m_excludeArray ) //Show the refdes we are excluding
excludes += exclude + " "; excludes += exclude + " ";
message += wxString::Format( _( "\nExcluding: %s from reannotation\n\n" ), excludes ); message += wxString::Format( _( "\nExcluding: %s from reannotation\n\n" ), excludes );
@ -543,7 +543,7 @@ void DIALOG_BOARD_REANNOTATE::LogChangePlan()
message += _( "\n Change Array\n***********************\n" ); message += _( "\n Change Array\n***********************\n" );
for( RefDesChange Change : m_ChangeArray ) for( RefDesChange Change : m_changeArray )
{ {
message += wxString::Format( "%s -> %s %s %s\n", Change.OldRefDesString, Change.NewRefDes, message += wxString::Format( "%s -> %s %s %s\n", Change.OldRefDesString, Change.NewRefDes,
ActionMessage[Change.Action], ActionMessage[Change.Action],
@ -572,7 +572,7 @@ void DIALOG_BOARD_REANNOTATE::LogFootprints( wxString& aMessage,
fpLocations ? _( "Footprint Coordinates" ) fpLocations ? _( "Footprint Coordinates" )
: _( "Reference Designator Coordinates" ) ); : _( "Reference Designator Coordinates" ) );
message += wxString::Format( _( "\nSort Code %d" ), m_SortCode ); message += wxString::Format( _( "\nSort Code %d" ), m_sortCode );
for( const RefDesInfo& mod : aFootprints ) for( const RefDesInfo& mod : aFootprints )
{ {
@ -636,16 +636,16 @@ bool DIALOG_BOARD_REANNOTATE::ReannotateBoard()
if( m_UpdateSchematic->GetValue() ) if( m_UpdateSchematic->GetValue() )
{ //If updating schematic send a netlist { //If updating schematic send a netlist
for( MODULE* mod : m_modules ) for( MODULE* footprint : m_footprints )
{ // Create a netlist { // Create a netlist
newref = GetNewRefDes( mod ); newref = GetNewRefDes( footprint );
if( nullptr == newref ) if( nullptr == newref )
return false; //Not found in changelist return false; //Not found in changelist
//add to the netlist //add to the netlist
netlist.AddComponent( new COMPONENT( mod->GetFPID(), newref->NewRefDes, netlist.AddComponent( new COMPONENT( footprint->GetFPID(), newref->NewRefDes,
mod->GetValue(), mod->GetPath() ) ); footprint->GetValue(), footprint->GetPath() ) );
} }
netlist.Format( "pcb_netlist", &stringformatter, 0, netlist.Format( "pcb_netlist", &stringformatter, 0,
@ -672,7 +672,7 @@ bool DIALOG_BOARD_REANNOTATE::ReannotateBoard()
if( reannotateok ) if( reannotateok )
{ //Only update if no errors { //Only update if no errors
for( MODULE* mod : m_modules ) for( MODULE* mod : m_footprints )
{ // Create a netlist { // Create a netlist
newref = GetNewRefDes( mod ); newref = GetNewRefDes( mod );
@ -704,17 +704,18 @@ bool DIALOG_BOARD_REANNOTATE::BuildModuleList( std::vector<RefDesInfo>& aBadRefD
unsigned int backstartrefdes; unsigned int backstartrefdes;
size_t firstnum = 0; size_t firstnum = 0;
m_FrontModules.clear(); m_frontFootprints.clear();
m_BackModules.clear(); m_backFootprints.clear();
m_ExcludeArray.clear(); m_excludeArray.clear();
m_modules = m_frame->GetBoard()->Footprints(); m_footprints = m_frame->GetBoard()->Footprints();
std::vector<KIID> selected; std::vector<KIID> selected;
if( m_AnnotateSelection->GetValue() ) if( m_AnnotateSelection->GetValue() )
{ {
for( EDA_ITEM* item : m_selection ) for( EDA_ITEM* item : m_selection )
{ //Get the timestamps of selected footprints {
//Get the timestamps of selected footprints
if( item->Type() == PCB_MODULE_T ) if( item->Type() == PCB_MODULE_T )
selected.push_back( item->m_Uuid ); selected.push_back( item->m_Uuid );
} }
@ -729,20 +730,20 @@ bool DIALOG_BOARD_REANNOTATE::BuildModuleList( std::vector<RefDesInfo>& aBadRefD
if( ( ' ' == thischar ) || ( ',' == thischar ) ) if( ( ' ' == thischar ) || ( ',' == thischar ) )
{ {
m_ExcludeArray.push_back( exclude ); m_excludeArray.push_back( exclude );
exclude.clear(); exclude.clear();
} }
else else
exclude += thischar; exclude += thischar;
if( !exclude.empty() ) if( !exclude.empty() )
m_ExcludeArray.push_back( exclude ); m_excludeArray.push_back( exclude );
} }
RefDesInfo thismodule; RefDesInfo thismodule;
bool useModuleLocation = m_locationChoice->GetSelection() == 0; bool useModuleLocation = m_locationChoice->GetSelection() == 0;
for( MODULE* mod : m_modules ) for( MODULE* mod : m_footprints )
{ {
thismodule.Uuid = mod->m_Uuid; thismodule.Uuid = mod->m_Uuid;
thismodule.RefDesString = mod->GetReference(); thismodule.RefDesString = mod->GetReference();
@ -751,8 +752,8 @@ bool DIALOG_BOARD_REANNOTATE::BuildModuleList( std::vector<RefDesInfo>& aBadRefD
: mod->Reference().GetPosition().x; : mod->Reference().GetPosition().x;
thismodule.y = useModuleLocation ? mod->GetPosition().y thismodule.y = useModuleLocation ? mod->GetPosition().y
: mod->Reference().GetPosition().y; : mod->Reference().GetPosition().y;
thismodule.roundedx = RoundToGrid( thismodule.x, m_SortGridx ); //Round to sort thismodule.roundedx = RoundToGrid( thismodule.x, m_sortGridx ); //Round to sort
thismodule.roundedy = RoundToGrid( thismodule.y, m_SortGridy ); thismodule.roundedy = RoundToGrid( thismodule.y, m_sortGridy );
thismodule.Front = mod->GetLayer() == F_Cu; thismodule.Front = mod->GetLayer() == F_Cu;
thismodule.Action = UpdateRefDes; //Usually good thismodule.Action = UpdateRefDes; //Usually good
@ -769,7 +770,7 @@ bool DIALOG_BOARD_REANNOTATE::BuildModuleList( std::vector<RefDesInfo>& aBadRefD
//Get the type (R, C, etc) //Get the type (R, C, etc)
thismodule.RefDesType = thismodule.RefDesString.substr( 0, firstnum ); thismodule.RefDesType = thismodule.RefDesString.substr( 0, firstnum );
for( wxString excluded : m_ExcludeArray ) for( wxString excluded : m_excludeArray )
{ {
if( excluded == thismodule.RefDesType ) //Am I supposed to exclude this type? if( excluded == thismodule.RefDesType ) //Am I supposed to exclude this type?
{ {
@ -781,7 +782,9 @@ bool DIALOG_BOARD_REANNOTATE::BuildModuleList( std::vector<RefDesInfo>& aBadRefD
if( ( thismodule.Front && annotateback ) || //If a front module and doing backs only if( ( thismodule.Front && annotateback ) || //If a front module and doing backs only
( !thismodule.Front && annotatefront ) || //If a back module and doing front only ( !thismodule.Front && annotatefront ) || //If a back module and doing front only
( mod->IsLocked() && skiplocked ) ) //If excluding locked and it is locked ( mod->IsLocked() && skiplocked ) ) //If excluding locked and it is locked
{
thismodule.Action = Exclude; thismodule.Action = Exclude;
}
if( annotateselected ) if( annotateselected )
{ //If onnly annotating selected c { //If onnly annotating selected c
@ -798,46 +801,50 @@ bool DIALOG_BOARD_REANNOTATE::BuildModuleList( std::vector<RefDesInfo>& aBadRefD
} }
if( thismodule.Front ) if( thismodule.Front )
m_FrontModules.push_back( thismodule ); m_frontFootprints.push_back( thismodule );
else else
m_BackModules.push_back( thismodule ); m_backFootprints.push_back( thismodule );
} }
SetSortCodes( FrontDirectionsArray, m_SortCode ); //Determine the sort order for the front SetSortCodes( FrontDirectionsArray, m_sortCode ); //Determine the sort order for the front
sort( m_FrontModules.begin(), m_FrontModules.end(),ModuleCompare ); //Sort the front footprints sort( m_frontFootprints.begin(), m_frontFootprints.end(), ModuleCompare ); //Sort the front footprints
SetSortCodes( BackDirectionsArray, m_SortCode ); //Determine the sort order for the back SetSortCodes( BackDirectionsArray, m_sortCode ); //Determine the sort order for the back
sort( m_BackModules.begin(), m_BackModules.end(), ModuleCompare ); //Sort the back footprints sort( m_backFootprints.begin(), m_backFootprints.end(), ModuleCompare ); //Sort the back footprints
m_RefDesTypes.clear(); m_refDesTypes.clear();
m_ChangeArray.clear(); m_changeArray.clear();
backstartrefdes = wxAtoi( m_BackRefDesStart->GetValue() ); backstartrefdes = wxAtoi( m_BackRefDesStart->GetValue() );
if( !m_FrontModules.empty() ) if( !m_frontFootprints.empty() )
BuildChangeArray( m_FrontModules, wxAtoi( m_FrontRefDesStart->GetValue() ), {
BuildChangeArray( m_frontFootprints, wxAtoi( m_FrontRefDesStart->GetValue() ),
m_FrontPrefix->GetValue(), m_RemoveFrontPrefix->GetValue(), aBadRefDes ); m_FrontPrefix->GetValue(), m_RemoveFrontPrefix->GetValue(), aBadRefDes );
}
if( !m_BackModules.empty() ) if( !m_backFootprints.empty() )
BuildChangeArray( m_BackModules, backstartrefdes, m_BackPrefix->GetValue(), {
BuildChangeArray( m_backFootprints, backstartrefdes, m_BackPrefix->GetValue(),
m_RemoveBackPrefix->GetValue(), aBadRefDes ); m_RemoveBackPrefix->GetValue(), aBadRefDes );
}
if( !m_ChangeArray.empty() ) if( !m_changeArray.empty() )
sort( m_ChangeArray.begin(), m_ChangeArray.end(), ChangeArrayCompare ); sort( m_changeArray.begin(), m_changeArray.end(), ChangeArrayCompare );
LogChangePlan(); LogChangePlan();
size_t changearraysize = m_ChangeArray.size(); size_t changearraysize = m_changeArray.size();
for( size_t i = 0; i < changearraysize; i++ ) //Scan through for duplicates if update or skip for( size_t i = 0; i < changearraysize; i++ ) //Scan through for duplicates if update or skip
{ {
if( ( m_ChangeArray[i].Action != EmptyRefDes ) if( ( m_changeArray[i].Action != EmptyRefDes )
&& ( m_ChangeArray[i].Action != InvalidRefDes ) ) && ( m_changeArray[i].Action != InvalidRefDes ) )
{ {
for( size_t j = i + 1; j < changearraysize; j++ ) for( size_t j = i + 1; j < changearraysize; j++ )
{ {
if( m_ChangeArray[i].NewRefDes == m_ChangeArray[j].NewRefDes ) if( m_changeArray[i].NewRefDes == m_changeArray[j].NewRefDes )
{ {
ShowReport( "Duplicate instances of " + m_ChangeArray[j].NewRefDes, ShowReport( "Duplicate instances of " + m_changeArray[j].NewRefDes,
RPT_SEVERITY_ERROR ); RPT_SEVERITY_ERROR );
if( errorcount++ > MAXERROR ) if( errorcount++ > MAXERROR )
@ -883,8 +890,8 @@ void DIALOG_BOARD_REANNOTATE::BuildChangeArray( std::vector<RefDesInfo>& aFootpr
if( 0 != aStartRefDes ) //Initialize the change array if present if( 0 != aStartRefDes ) //Initialize the change array if present
{ {
for( i = 0; i < m_RefDesTypes.size(); i++ ) for( i = 0; i < m_refDesTypes.size(); i++ )
m_RefDesTypes[i].RefDesCount = aStartRefDes; m_refDesTypes[i].RefDesCount = aStartRefDes;
} }
for( RefDesInfo footprint : aFootprints ) for( RefDesInfo footprint : aFootprints )
@ -900,7 +907,7 @@ void DIALOG_BOARD_REANNOTATE::BuildChangeArray( std::vector<RefDesInfo>& aFootpr
if( ( change.Action == EmptyRefDes ) || ( change.Action == InvalidRefDes ) ) if( ( change.Action == EmptyRefDes ) || ( change.Action == InvalidRefDes ) )
{ {
m_ChangeArray.push_back( change ); m_changeArray.push_back( change );
aBadRefDes.push_back( footprint ); aBadRefDes.push_back( footprint );
continue; continue;
} }
@ -916,36 +923,40 @@ void DIALOG_BOARD_REANNOTATE::BuildChangeArray( std::vector<RefDesInfo>& aFootpr
if( aRemovePrefix && prefixpresent ) //If there is a prefix remove it if( aRemovePrefix && prefixpresent ) //If there is a prefix remove it
footprint.RefDesType.erase( 0, prefixsize ); footprint.RefDesType.erase( 0, prefixsize );
for( i = 0; i < m_RefDesTypes.size(); i++ ) //See if it is in the types array for( i = 0; i < m_refDesTypes.size(); i++ ) //See if it is in the types array
if( m_RefDesTypes[i].RefDesType == footprint.RefDesType ) //Found it! {
if( m_refDesTypes[i].RefDesType == footprint.RefDesType ) //Found it!
break; break;
}
if( i == m_RefDesTypes.size() ) if( i == m_refDesTypes.size() )
{ //Wasn't in the types array so add it { //Wasn't in the types array so add it
newtype.RefDesType = footprint.RefDesType; newtype.RefDesType = footprint.RefDesType;
newtype.RefDesCount = ( aStartRefDes == 0 ? 1 : aStartRefDes ); newtype.RefDesCount = ( aStartRefDes == 0 ? 1 : aStartRefDes );
m_RefDesTypes.push_back( newtype ); m_refDesTypes.push_back( newtype );
} }
change.NewRefDes = m_RefDesTypes[i].RefDesType change.NewRefDes = m_refDesTypes[i].RefDesType
+ std::to_string( m_RefDesTypes[i].RefDesCount++ ); + std::to_string( m_refDesTypes[i].RefDesCount++ );
} }
m_ChangeArray.push_back( change ); //Add to the change array m_changeArray.push_back( change ); //Add to the change array
} }
} }
// //
/// @returns the new refdes for this module /// @returns the new refdes for this footprint
RefDesChange* DIALOG_BOARD_REANNOTATE::GetNewRefDes( MODULE* aMod ) RefDesChange* DIALOG_BOARD_REANNOTATE::GetNewRefDes( MODULE* aFootprint )
{ {
size_t i; size_t i;
for( i = 0; i < m_ChangeArray.size(); i++ ) for( i = 0; i < m_changeArray.size(); i++ )
if( aMod->m_Uuid == m_ChangeArray[i].Uuid ) {
return ( &m_ChangeArray[i] ); if( aFootprint->m_Uuid == m_changeArray[i].Uuid )
return ( &m_changeArray[i] );
}
ShowReport( _( "Footprint not found in changelist" ) + wxS( " " ) + aMod->GetReference(), ShowReport( _( "Footprint not found in changelist" ) + wxS( " " ) + aFootprint->GetReference(),
RPT_SEVERITY_ERROR ); RPT_SEVERITY_ERROR );
return nullptr; //Should never happen return nullptr; //Should never happen

View File

@ -105,44 +105,60 @@ public:
private: private:
PCB_EDIT_FRAME* m_frame; PCB_EDIT_FRAME* m_frame;
MODULES m_modules; MODULES m_footprints;
PCB_SCREEN* m_screen; PCB_SCREEN* m_screen;
PCBNEW_SELECTION m_selection; PCBNEW_SELECTION m_selection;
std::vector<RefDesChange> m_ChangeArray; std::vector<RefDesChange> m_changeArray;
std::vector<RefDesInfo> m_FrontModules; std::vector<RefDesInfo> m_frontFootprints;
std::vector<RefDesInfo> m_BackModules; std::vector<RefDesInfo> m_backFootprints;
std::vector<RefDesTypeStr> m_RefDesTypes; std::vector<RefDesTypeStr> m_refDesTypes;
std::vector<wxString> m_ExcludeArray; std::vector<wxString> m_excludeArray;
EDA_UNITS m_Units; bool m_standalone;
bool m_Standalone; int m_sortCode;
int m_gridIndex;
int m_annotationChoice;
int m_severity;
int m_SortCode; double m_sortGridx;
int m_GridIndex; double m_sortGridy;
int m_AnnotationChoice;
int m_Severity;
double m_SortGridx; wxString m_frontPrefixString;
double m_SortGridy; wxString m_backPrefixString;
wxString m_validPrefixes;
wxString m_FrontPrefixString; APP_SETTINGS_BASE* m_settings;
wxString m_BackPrefixString;
wxString m_ValidPrefixes;
APP_SETTINGS_BASE* m_Settings; std::vector<wxRadioButton*> m_sortButtons = {
m_Down_Right,
m_Right_Down,
m_Down_Left,
m_Left_Down,
m_Up_Right,
m_Right_Up,
m_Up_Left,
m_Left_Up
};
std::vector<wxRadioButton*> m_sortButtons = { m_Down_Right, m_Right_Down, m_Down_Left, std::vector<wxRadioButton*> AnnotateWhat = {
m_Left_Down, m_Up_Right, m_Right_Up, m_Up_Left, m_Left_Up }; m_AnnotateAll,
m_AnnotateFront,
m_AnnotateBack,
m_AnnotateSelection
};
std::vector<wxRadioButton*> AnnotateWhat = { m_AnnotateAll, m_AnnotateFront, m_AnnotateBack, std::vector<wxStaticBitmap*> Bitmaps = {
m_AnnotateSelection }; reannotate_down_right_bitmap,
reannotate_right_down_bitmap,
reannotate_down_left_bitmap,
std::vector<wxStaticBitmap*> Bitmaps = { reannotate_down_right_bitmap, reannotate_right_down_bitmap, reannotate_left_down_bitmap,
reannotate_down_left_bitmap, reannotate_left_down_bitmap, reannotate_up_right_bitmap, reannotate_up_right_bitmap,
reannotate_right_up_bitmap, reannotate_up_left_bitmap, reannotate_left_up_bitmap }; reannotate_right_up_bitmap,
reannotate_up_left_bitmap,
reannotate_left_up_bitmap
};
APP_SETTINGS_BASE* m_Config; APP_SETTINGS_BASE* m_Config;
@ -162,9 +178,10 @@ private:
bool ReannotateBoard( void ); bool ReannotateBoard( void );
bool BuildModuleList( std::vector<RefDesInfo>& aBadRefDes ); bool BuildModuleList( std::vector<RefDesInfo>& aBadRefDes );
void BuildChangeArray( std::vector<RefDesInfo>& aFootprints, unsigned int aStartRefDes, void BuildChangeArray( std::vector<RefDesInfo>& aFootprints, unsigned int aStartRefDes,
wxString aPrefix, bool aRemovePrefix, std::vector<RefDesInfo>& aBadRefDes ); wxString aPrefix, bool aRemovePrefix,
std::vector<RefDesInfo>& aBadRefDes );
RefDesChange* GetNewRefDes( MODULE* aMod ); RefDesChange* GetNewRefDes( MODULE* aFootprint );
int RoundToGrid( int aCoord, int aGrid ); int RoundToGrid( int aCoord, int aGrid );
wxString CoordTowxString( int aX, int aY ); wxString CoordTowxString( int aX, int aY );

View File

@ -1103,7 +1103,7 @@ bool PCB_EDIT_FRAME::importFile( const wxString& aFileName, int aFileType )
} }
// Update module LIB_IDs to point to the just imported Eagle library // Update footprint LIB_IDs to point to the just imported Eagle library
for( MODULE* footprint : GetBoard()->Footprints() ) for( MODULE* footprint : GetBoard()->Footprints() )
{ {
LIB_ID libId = footprint->GetFPID(); LIB_ID libId = footprint->GetFPID();

View File

@ -43,25 +43,25 @@ MODULE::MODULE( BOARD* parent ) :
BOARD_ITEM_CONTAINER( (BOARD_ITEM*) parent, PCB_MODULE_T ), BOARD_ITEM_CONTAINER( (BOARD_ITEM*) parent, PCB_MODULE_T ),
m_initial_comments( 0 ) m_initial_comments( 0 )
{ {
m_Attributs = 0; m_attributes = 0;
m_Layer = F_Cu; m_Layer = F_Cu;
m_Orient = 0; m_orient = 0;
m_ModuleStatus = MODULE_PADS_LOCKED; m_moduleStatus = FP_PADS_are_LOCKED;
m_arflag = 0; m_arflag = 0;
m_CntRot90 = m_CntRot180 = 0; m_rot90Cost = m_rot180Cost = 0;
m_Link = 0; m_link = 0;
m_LastEditTime = 0; m_lastEditTime = 0;
m_LocalClearance = 0; m_localClearance = 0;
m_LocalSolderMaskMargin = 0; m_localSolderMaskMargin = 0;
m_LocalSolderPasteMargin = 0; m_localSolderPasteMargin = 0;
m_LocalSolderPasteMarginRatio = 0.0; m_localSolderPasteMarginRatio = 0.0;
m_ZoneConnection = ZONE_CONNECTION::INHERITED; // Use zone setting by default m_zoneConnection = ZONE_CONNECTION::INHERITED; // Use zone setting by default
m_ThermalWidth = 0; // Use zone setting by default m_thermalWidth = 0; // Use zone setting by default
m_ThermalGap = 0; // Use zone setting by default m_thermalGap = 0; // Use zone setting by default
// These are special and mandatory text fields // These are special and mandatory text fields
m_Reference = new FP_TEXT( this, FP_TEXT::TEXT_is_REFERENCE ); m_reference = new FP_TEXT( this, FP_TEXT::TEXT_is_REFERENCE );
m_Value = new FP_TEXT( this, FP_TEXT::TEXT_is_VALUE ); m_value = new FP_TEXT( this, FP_TEXT::TEXT_is_VALUE );
m_3D_Drawings.clear(); m_3D_Drawings.clear();
} }
@ -70,31 +70,31 @@ MODULE::MODULE( BOARD* parent ) :
MODULE::MODULE( const MODULE& aFootprint ) : MODULE::MODULE( const MODULE& aFootprint ) :
BOARD_ITEM_CONTAINER( aFootprint ) BOARD_ITEM_CONTAINER( aFootprint )
{ {
m_Pos = aFootprint.m_Pos; m_pos = aFootprint.m_pos;
m_fpid = aFootprint.m_fpid; m_fpid = aFootprint.m_fpid;
m_Attributs = aFootprint.m_Attributs; m_attributes = aFootprint.m_attributes;
m_ModuleStatus = aFootprint.m_ModuleStatus; m_moduleStatus = aFootprint.m_moduleStatus;
m_Orient = aFootprint.m_Orient; m_orient = aFootprint.m_orient;
m_BoundaryBox = aFootprint.m_BoundaryBox; m_boundingBox = aFootprint.m_boundingBox;
m_CntRot90 = aFootprint.m_CntRot90; m_rot90Cost = aFootprint.m_rot90Cost;
m_CntRot180 = aFootprint.m_CntRot180; m_rot180Cost = aFootprint.m_rot180Cost;
m_LastEditTime = aFootprint.m_LastEditTime; m_lastEditTime = aFootprint.m_lastEditTime;
m_Link = aFootprint.m_Link; m_link = aFootprint.m_link;
m_Path = aFootprint.m_Path; m_path = aFootprint.m_path;
m_LocalClearance = aFootprint.m_LocalClearance; m_localClearance = aFootprint.m_localClearance;
m_LocalSolderMaskMargin = aFootprint.m_LocalSolderMaskMargin; m_localSolderMaskMargin = aFootprint.m_localSolderMaskMargin;
m_LocalSolderPasteMargin = aFootprint.m_LocalSolderPasteMargin; m_localSolderPasteMargin = aFootprint.m_localSolderPasteMargin;
m_LocalSolderPasteMarginRatio = aFootprint.m_LocalSolderPasteMarginRatio; m_localSolderPasteMarginRatio = aFootprint.m_localSolderPasteMarginRatio;
m_ZoneConnection = aFootprint.m_ZoneConnection; m_zoneConnection = aFootprint.m_zoneConnection;
m_ThermalWidth = aFootprint.m_ThermalWidth; m_thermalWidth = aFootprint.m_thermalWidth;
m_ThermalGap = aFootprint.m_ThermalGap; m_thermalGap = aFootprint.m_thermalGap;
// Copy reference and value. // Copy reference and value.
m_Reference = new FP_TEXT( *aFootprint.m_Reference ); m_reference = new FP_TEXT( *aFootprint.m_reference );
m_Reference->SetParent( this ); m_reference->SetParent( this );
m_Value = new FP_TEXT( *aFootprint.m_Value ); m_value = new FP_TEXT( *aFootprint.m_value );
m_Value->SetParent( this ); m_value->SetParent( this );
std::map<BOARD_ITEM*, BOARD_ITEM*> ptrMap; std::map<BOARD_ITEM*, BOARD_ITEM*> ptrMap;
@ -150,8 +150,8 @@ MODULE::MODULE( const MODULE& aFootprint ) :
// Copy auxiliary data: 3D_Drawings info // Copy auxiliary data: 3D_Drawings info
m_3D_Drawings = aFootprint.m_3D_Drawings; m_3D_Drawings = aFootprint.m_3D_Drawings;
m_Doc = aFootprint.m_Doc; m_doc = aFootprint.m_doc;
m_KeyWord = aFootprint.m_KeyWord; m_keywords = aFootprint.m_keywords;
m_properties = aFootprint.m_properties; m_properties = aFootprint.m_properties;
m_arflag = 0; m_arflag = 0;
@ -174,8 +174,8 @@ MODULE::MODULE( MODULE&& aFootprint ) :
MODULE::~MODULE() MODULE::~MODULE()
{ {
// Clean up the owned elements // Clean up the owned elements
delete m_Reference; delete m_reference;
delete m_Value; delete m_value;
delete m_initial_comments; delete m_initial_comments;
for( PAD* p : m_pads ) for( PAD* p : m_pads )
@ -204,31 +204,31 @@ MODULE& MODULE::operator=( MODULE&& aOther )
{ {
BOARD_ITEM::operator=( aOther ); BOARD_ITEM::operator=( aOther );
m_Pos = aOther.m_Pos; m_pos = aOther.m_pos;
m_fpid = aOther.m_fpid; m_fpid = aOther.m_fpid;
m_Attributs = aOther.m_Attributs; m_attributes = aOther.m_attributes;
m_ModuleStatus = aOther.m_ModuleStatus; m_moduleStatus = aOther.m_moduleStatus;
m_Orient = aOther.m_Orient; m_orient = aOther.m_orient;
m_BoundaryBox = aOther.m_BoundaryBox; m_boundingBox = aOther.m_boundingBox;
m_CntRot90 = aOther.m_CntRot90; m_rot90Cost = aOther.m_rot90Cost;
m_CntRot180 = aOther.m_CntRot180; m_rot180Cost = aOther.m_rot180Cost;
m_LastEditTime = aOther.m_LastEditTime; m_lastEditTime = aOther.m_lastEditTime;
m_Link = aOther.m_Link; m_link = aOther.m_link;
m_Path = aOther.m_Path; m_path = aOther.m_path;
m_LocalClearance = aOther.m_LocalClearance; m_localClearance = aOther.m_localClearance;
m_LocalSolderMaskMargin = aOther.m_LocalSolderMaskMargin; m_localSolderMaskMargin = aOther.m_localSolderMaskMargin;
m_LocalSolderPasteMargin = aOther.m_LocalSolderPasteMargin; m_localSolderPasteMargin = aOther.m_localSolderPasteMargin;
m_LocalSolderPasteMarginRatio = aOther.m_LocalSolderPasteMarginRatio; m_localSolderPasteMarginRatio = aOther.m_localSolderPasteMarginRatio;
m_ZoneConnection = aOther.m_ZoneConnection; m_zoneConnection = aOther.m_zoneConnection;
m_ThermalWidth = aOther.m_ThermalWidth; m_thermalWidth = aOther.m_thermalWidth;
m_ThermalGap = aOther.m_ThermalGap; m_thermalGap = aOther.m_thermalGap;
// Move reference and value // Move reference and value
m_Reference = aOther.m_Reference; m_reference = aOther.m_reference;
m_Reference->SetParent( this ); m_reference->SetParent( this );
m_Value = aOther.m_Value; m_value = aOther.m_value;
m_Value->SetParent( this ); m_value->SetParent( this );
// Move the pads // Move the pads
@ -274,8 +274,8 @@ MODULE& MODULE::operator=( MODULE&& aOther )
// Copy auxiliary data: 3D_Drawings info // Copy auxiliary data: 3D_Drawings info
m_3D_Drawings.clear(); m_3D_Drawings.clear();
m_3D_Drawings = aOther.m_3D_Drawings; m_3D_Drawings = aOther.m_3D_Drawings;
m_Doc = aOther.m_Doc; m_doc = aOther.m_doc;
m_KeyWord = aOther.m_KeyWord; m_keywords = aOther.m_keywords;
m_properties = aOther.m_properties; m_properties = aOther.m_properties;
// Ensure auxiliary data is up to date // Ensure auxiliary data is up to date
@ -287,8 +287,8 @@ MODULE& MODULE::operator=( MODULE&& aOther )
aOther.Pads().clear(); aOther.Pads().clear();
aOther.Zones().clear(); aOther.Zones().clear();
aOther.GraphicalItems().clear(); aOther.GraphicalItems().clear();
aOther.m_Value = nullptr; aOther.m_value = nullptr;
aOther.m_Reference = nullptr; aOther.m_reference = nullptr;
aOther.m_initial_comments = nullptr; aOther.m_initial_comments = nullptr;
return *this; return *this;
@ -299,31 +299,31 @@ MODULE& MODULE::operator=( const MODULE& aOther )
{ {
BOARD_ITEM::operator=( aOther ); BOARD_ITEM::operator=( aOther );
m_Pos = aOther.m_Pos; m_pos = aOther.m_pos;
m_fpid = aOther.m_fpid; m_fpid = aOther.m_fpid;
m_Attributs = aOther.m_Attributs; m_attributes = aOther.m_attributes;
m_ModuleStatus = aOther.m_ModuleStatus; m_moduleStatus = aOther.m_moduleStatus;
m_Orient = aOther.m_Orient; m_orient = aOther.m_orient;
m_BoundaryBox = aOther.m_BoundaryBox; m_boundingBox = aOther.m_boundingBox;
m_CntRot90 = aOther.m_CntRot90; m_rot90Cost = aOther.m_rot90Cost;
m_CntRot180 = aOther.m_CntRot180; m_rot180Cost = aOther.m_rot180Cost;
m_LastEditTime = aOther.m_LastEditTime; m_lastEditTime = aOther.m_lastEditTime;
m_Link = aOther.m_Link; m_link = aOther.m_link;
m_Path = aOther.m_Path; m_path = aOther.m_path;
m_LocalClearance = aOther.m_LocalClearance; m_localClearance = aOther.m_localClearance;
m_LocalSolderMaskMargin = aOther.m_LocalSolderMaskMargin; m_localSolderMaskMargin = aOther.m_localSolderMaskMargin;
m_LocalSolderPasteMargin = aOther.m_LocalSolderPasteMargin; m_localSolderPasteMargin = aOther.m_localSolderPasteMargin;
m_LocalSolderPasteMarginRatio = aOther.m_LocalSolderPasteMarginRatio; m_localSolderPasteMarginRatio = aOther.m_localSolderPasteMarginRatio;
m_ZoneConnection = aOther.m_ZoneConnection; m_zoneConnection = aOther.m_zoneConnection;
m_ThermalWidth = aOther.m_ThermalWidth; m_thermalWidth = aOther.m_thermalWidth;
m_ThermalGap = aOther.m_ThermalGap; m_thermalGap = aOther.m_thermalGap;
// Copy reference and value // Copy reference and value
*m_Reference = *aOther.m_Reference; *m_reference = *aOther.m_reference;
m_Reference->SetParent( this ); m_reference->SetParent( this );
*m_Value = *aOther.m_Value; *m_value = *aOther.m_value;
m_Value->SetParent( this ); m_value->SetParent( this );
std::map<BOARD_ITEM*, BOARD_ITEM*> ptrMap; std::map<BOARD_ITEM*, BOARD_ITEM*> ptrMap;
@ -380,8 +380,8 @@ MODULE& MODULE::operator=( const MODULE& aOther )
// Copy auxiliary data: 3D_Drawings info // Copy auxiliary data: 3D_Drawings info
m_3D_Drawings.clear(); m_3D_Drawings.clear();
m_3D_Drawings = aOther.m_3D_Drawings; m_3D_Drawings = aOther.m_3D_Drawings;
m_Doc = aOther.m_Doc; m_doc = aOther.m_doc;
m_KeyWord = aOther.m_KeyWord; m_keywords = aOther.m_keywords;
m_properties = aOther.m_properties; m_properties = aOther.m_properties;
// Ensure auxiliary data is up to date // Ensure auxiliary data is up to date
@ -406,12 +406,12 @@ bool MODULE::ResolveTextVar( wxString* token, int aDepth ) const
{ {
if( token->IsSameAs( wxT( "REFERENCE" ) ) ) if( token->IsSameAs( wxT( "REFERENCE" ) ) )
{ {
*token = m_Reference->GetShownText( aDepth + 1 ); *token = m_reference->GetShownText( aDepth + 1 );
return true; return true;
} }
else if( token->IsSameAs( wxT( "VALUE" ) ) ) else if( token->IsSameAs( wxT( "VALUE" ) ) )
{ {
*token = m_Value->GetShownText( aDepth + 1 ); *token = m_value->GetShownText( aDepth + 1 );
return true; return true;
} }
else if( token->IsSameAs( wxT( "LAYER" ) ) ) else if( token->IsSameAs( wxT( "LAYER" ) ) )
@ -563,14 +563,14 @@ void MODULE::Remove( BOARD_ITEM* aBoardItem )
void MODULE::CalculateBoundingBox() void MODULE::CalculateBoundingBox()
{ {
m_BoundaryBox = GetFootprintRect(); m_boundingBox = GetFootprintRect();
} }
double MODULE::GetArea( int aPadding ) const double MODULE::GetArea( int aPadding ) const
{ {
double w = std::abs( static_cast<double>( m_BoundaryBox.GetWidth() ) ) + aPadding; double w = std::abs( static_cast<double>( m_boundingBox.GetWidth() ) ) + aPadding;
double h = std::abs( static_cast<double>( m_BoundaryBox.GetHeight() ) ) + aPadding; double h = std::abs( static_cast<double>( m_boundingBox.GetHeight() ) ) + aPadding;
return w * h; return w * h;
} }
@ -579,8 +579,8 @@ EDA_RECT MODULE::GetFootprintRect() const
{ {
EDA_RECT area; EDA_RECT area;
area.SetOrigin( m_Pos ); area.SetOrigin( m_pos );
area.SetEnd( m_Pos ); area.SetEnd( m_pos );
area.Inflate( Millimeter2iu( 0.25 ) ); // Give a min size to the area area.Inflate( Millimeter2iu( 0.25 ) ); // Give a min size to the area
for( BOARD_ITEM* item : m_drawings ) for( BOARD_ITEM* item : m_drawings )
@ -653,21 +653,21 @@ const EDA_RECT MODULE::GetBoundingBox( bool aIncludeInvisibleText ) const
// not being present in the current PCB stackup. Values, references, and all // not being present in the current PCB stackup. Values, references, and all
// footprint text can also be turned off via the GAL meta-layers, so the 2nd and // footprint text can also be turned off via the GAL meta-layers, so the 2nd and
// 3rd "&&" conditionals handle that. // 3rd "&&" conditionals handle that.
valueLayerIsVisible = board->IsLayerVisible( m_Value->GetLayer() ) valueLayerIsVisible = board->IsLayerVisible( m_value->GetLayer() )
&& board->IsElementVisible( LAYER_MOD_VALUES ) && board->IsElementVisible( LAYER_MOD_VALUES )
&& board->IsElementVisible( LAYER_MOD_TEXT_FR ); && board->IsElementVisible( LAYER_MOD_TEXT_FR );
refLayerIsVisible = board->IsLayerVisible( m_Reference->GetLayer() ) refLayerIsVisible = board->IsLayerVisible( m_reference->GetLayer() )
&& board->IsElementVisible( LAYER_MOD_REFERENCES ) && board->IsElementVisible( LAYER_MOD_REFERENCES )
&& board->IsElementVisible( LAYER_MOD_TEXT_FR ); && board->IsElementVisible( LAYER_MOD_TEXT_FR );
} }
if( ( m_Value->IsVisible() && valueLayerIsVisible ) || aIncludeInvisibleText ) if(( m_value->IsVisible() && valueLayerIsVisible ) || aIncludeInvisibleText )
area.Merge( m_Value->GetBoundingBox() ); area.Merge( m_value->GetBoundingBox() );
if( ( m_Reference->IsVisible() && refLayerIsVisible ) || aIncludeInvisibleText ) if(( m_reference->IsVisible() && refLayerIsVisible ) || aIncludeInvisibleText )
area.Merge( m_Reference->GetBoundingBox() ); area.Merge( m_reference->GetBoundingBox() );
return area; return area;
} }
@ -716,7 +716,7 @@ SHAPE_POLY_SET MODULE::GetBoundingPoly() const
} }
poly.Inflate( Millimeter2iu( 0.01 ), 4 ); poly.Inflate( Millimeter2iu( 0.01 ), 4 );
poly.Rotate( -orientation, m_Pos ); poly.Rotate( -orientation, m_pos );
return poly; return poly;
} }
@ -726,16 +726,16 @@ void MODULE::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM
{ {
wxString msg, msg2; wxString msg, msg2;
aList.emplace_back( m_Reference->GetShownText(), m_Value->GetShownText(), DARKCYAN ); aList.emplace_back( m_reference->GetShownText(), m_value->GetShownText(), DARKCYAN );
if( aFrame->IsType( FRAME_FOOTPRINT_VIEWER ) if( aFrame->IsType( FRAME_FOOTPRINT_VIEWER )
|| aFrame->IsType( FRAME_FOOTPRINT_VIEWER_MODAL ) || aFrame->IsType( FRAME_FOOTPRINT_VIEWER_MODAL )
|| aFrame->IsType( FRAME_FOOTPRINT_EDITOR ) ) || aFrame->IsType( FRAME_FOOTPRINT_EDITOR ) )
{ {
wxDateTime date( static_cast<time_t>( m_LastEditTime ) ); wxDateTime date( static_cast<time_t>( m_lastEditTime ) );
// Date format: see http://www.cplusplus.com/reference/ctime/strftime // Date format: see http://www.cplusplus.com/reference/ctime/strftime
if( m_LastEditTime && date.IsValid() ) if( m_lastEditTime && date.IsValid() )
msg = date.Format( wxT( "%b %d, %Y" ) ); // Abbreviated_month_name Day, Year msg = date.Format( wxT( "%b %d, %Y" ) ); // Abbreviated_month_name Day, Year
else else
msg = _( "Unknown" ); msg = _( "Unknown" );
@ -762,16 +762,16 @@ void MODULE::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM
if( IsLocked() ) if( IsLocked() )
addToken( &status, _( "locked" ) ); addToken( &status, _( "locked" ) );
if( m_ModuleStatus & MODULE_is_PLACED ) if( m_moduleStatus & FP_is_PLACED )
addToken( &status, _( "autoplaced" ) ); addToken( &status, _( "autoplaced" ) );
if( m_Attributs & FP_BOARD_ONLY ) if( m_attributes & FP_BOARD_ONLY )
addToken( &attrs, _( "not in schematic" ) ); addToken( &attrs, _( "not in schematic" ) );
if( m_Attributs & FP_EXCLUDE_FROM_POS_FILES ) if( m_attributes & FP_EXCLUDE_FROM_POS_FILES )
addToken( &attrs, _( "exclude from pos files" ) ); addToken( &attrs, _( "exclude from pos files" ) );
if( m_Attributs & FP_EXCLUDE_FROM_BOM ) if( m_attributes & FP_EXCLUDE_FROM_BOM )
addToken( &attrs, _( "exclude from BOM" ) ); addToken( &attrs, _( "exclude from BOM" ) );
aList.emplace_back( _( "Status: " ) + status, _( "Attributes:" ) + wxS( " " ) + attrs, BROWN ); aList.emplace_back( _( "Status: " ) + status, _( "Attributes:" ) + wxS( " " ) + attrs, BROWN );
@ -784,15 +784,15 @@ void MODULE::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM
m_3D_Drawings.empty() ? _( "none" ) : m_3D_Drawings.front().m_Filename ); m_3D_Drawings.empty() ? _( "none" ) : m_3D_Drawings.front().m_Filename );
aList.emplace_back( msg, msg2, BLUE ); aList.emplace_back( msg, msg2, BLUE );
msg.Printf( _( "Doc: %s" ), m_Doc ); msg.Printf( _( "Doc: %s" ), m_doc );
msg2.Printf( _( "Keywords: %s" ), m_KeyWord ); msg2.Printf( _( "Keywords: %s" ), m_keywords );
aList.emplace_back( msg, msg2, BLACK ); aList.emplace_back( msg, msg2, BLACK );
} }
bool MODULE::HitTest( const wxPoint& aPosition, int aAccuracy ) const bool MODULE::HitTest( const wxPoint& aPosition, int aAccuracy ) const
{ {
EDA_RECT rect = m_BoundaryBox;//.GetBoundingBoxRotated( GetPosition(), m_Orient ); EDA_RECT rect = m_boundingBox;//.GetBoundingBoxRotated( GetPosition(), m_Orient );
return rect.Inflate( aAccuracy ).Contains( aPosition ); return rect.Inflate( aAccuracy ).Contains( aPosition );
} }
@ -809,7 +809,7 @@ bool MODULE::HitTest( const EDA_RECT& aRect, bool aContained, int aAccuracy ) co
arect.Inflate( aAccuracy ); arect.Inflate( aAccuracy );
if( aContained ) if( aContained )
return arect.Contains( m_BoundaryBox ); return arect.Contains( m_boundingBox );
else else
{ {
// If the rect does not intersect the bounding box, skip any tests // If the rect does not intersect the bounding box, skip any tests
@ -954,7 +954,7 @@ void MODULE::Add3DModel( FP_3DMODEL* a3DModel )
} }
// see class_module.h // see footprint.h
SEARCH_RESULT MODULE::Visit( INSPECTOR inspector, void* testData, const KICAD_T scanTypes[] ) SEARCH_RESULT MODULE::Visit( INSPECTOR inspector, void* testData, const KICAD_T scanTypes[] )
{ {
KICAD_T stype; KICAD_T stype;
@ -988,12 +988,12 @@ SEARCH_RESULT MODULE::Visit( INSPECTOR inspector, void* testData, const KICAD_T
break; break;
case PCB_FP_TEXT_T: case PCB_FP_TEXT_T:
result = inspector( m_Reference, testData ); result = inspector( m_reference, testData );
if( result == SEARCH_RESULT::QUIT ) if( result == SEARCH_RESULT::QUIT )
break; break;
result = inspector( m_Value, testData ); result = inspector( m_value, testData );
if( result == SEARCH_RESULT::QUIT ) if( result == SEARCH_RESULT::QUIT )
break; break;
@ -1079,8 +1079,8 @@ void MODULE::RunOnChildren( const std::function<void (BOARD_ITEM*)>& aFunction )
for( BOARD_ITEM* drawing : m_drawings ) for( BOARD_ITEM* drawing : m_drawings )
aFunction( static_cast<BOARD_ITEM*>( drawing ) ); aFunction( static_cast<BOARD_ITEM*>( drawing ) );
aFunction( static_cast<BOARD_ITEM*>( m_Reference ) ); aFunction( static_cast<BOARD_ITEM*>( m_reference ) );
aFunction( static_cast<BOARD_ITEM*>( m_Value ) ); aFunction( static_cast<BOARD_ITEM*>( m_value ) );
} }
catch( std::bad_function_call& ) catch( std::bad_function_call& )
{ {
@ -1184,8 +1184,8 @@ const BOX2I MODULE::ViewBBox() const
EDA_RECT area = GetFootprintRect(); EDA_RECT area = GetFootprintRect();
// Calculate extended area including text fields // Calculate extended area including text fields
area.Merge( m_Reference->GetBoundingBox() ); area.Merge( m_reference->GetBoundingBox() );
area.Merge( m_Value->GetBoundingBox() ); area.Merge( m_value->GetBoundingBox() );
// Add the Clearance shape size: (shape around the pads when the clearance is shown. Not // Add the Clearance shape size: (shape around the pads when the clearance is shown. Not
// optimized, but the draw cost is small (perhaps smaller than optimization). // optimized, but the draw cost is small (perhaps smaller than optimization).
@ -1228,7 +1228,7 @@ const wxChar* MODULE::StringLibNameInvalidChars( bool aUserReadable )
void MODULE::Move( const wxPoint& aMoveVector ) void MODULE::Move( const wxPoint& aMoveVector )
{ {
wxPoint newpos = m_Pos + aMoveVector; wxPoint newpos = m_pos + aMoveVector;
SetPosition( newpos ); SetPosition( newpos );
} }
@ -1237,13 +1237,13 @@ void MODULE::Rotate( const wxPoint& aRotCentre, double aAngle )
{ {
double orientation = GetOrientation(); double orientation = GetOrientation();
double newOrientation = orientation + aAngle; double newOrientation = orientation + aAngle;
wxPoint newpos = m_Pos; wxPoint newpos = m_pos;
RotatePoint( &newpos, aRotCentre, aAngle ); RotatePoint( &newpos, aRotCentre, aAngle );
SetPosition( newpos ); SetPosition( newpos );
SetOrientation( newOrientation ); SetOrientation( newOrientation );
m_Reference->KeepUpright( orientation, newOrientation ); m_reference->KeepUpright( orientation, newOrientation );
m_Value->KeepUpright( orientation, newOrientation ); m_value->KeepUpright( orientation, newOrientation );
for( BOARD_ITEM* item : m_drawings ) for( BOARD_ITEM* item : m_drawings )
{ {
@ -1258,14 +1258,13 @@ void MODULE::Rotate( const wxPoint& aRotCentre, double aAngle )
void MODULE::Flip( const wxPoint& aCentre, bool aFlipLeftRight ) void MODULE::Flip( const wxPoint& aCentre, bool aFlipLeftRight )
{ {
// Move footprint to its final position: // Move footprint to its final position:
wxPoint finalPos = m_Pos; wxPoint finalPos = m_pos;
// Now Flip the footprint. // Now Flip the footprint.
// Flipping a footprint is a specific transform: // Flipping a footprint is a specific transform: it is not mirrored like a text.
// it is not mirrored like a text. // We have to change the side, and ensure the footprint rotation is modified according to the
// We have to change the side, and ensure the footprint rotation is // transform, because this parameter is used in pick and place files, and when updating the
// modified accordint to the transform, because this parameter is used // footprint from library.
// in pick and place files, and when updating the footprint from library.
// When flipped around the X axis (Y coordinates changed) orientation is negated // When flipped around the X axis (Y coordinates changed) orientation is negated
// When flipped around the Y axis (X coordinates changed) orientation is 180 - old orient. // When flipped around the Y axis (X coordinates changed) orientation is 180 - old orient.
// Because it is specfic to a footprint, we flip around the X axis, and after rotate 180 deg // Because it is specfic to a footprint, we flip around the X axis, and after rotate 180 deg
@ -1278,21 +1277,21 @@ void MODULE::Flip( const wxPoint& aCentre, bool aFlipLeftRight )
SetLayer( FlipLayer( GetLayer() ) ); SetLayer( FlipLayer( GetLayer() ) );
// Reverse mirror orientation. // Reverse mirror orientation.
m_Orient = -m_Orient; m_orient = -m_orient;
NORMALIZE_ANGLE_180( m_Orient ); NORMALIZE_ANGLE_180( m_orient );
// Mirror pads to other side of board. // Mirror pads to other side of board.
for( PAD* pad : m_pads ) for( PAD* pad : m_pads )
pad->Flip( m_Pos, false ); pad->Flip( m_pos, false );
// Mirror zones to other side of board. // Mirror zones to other side of board.
for( ZONE* zone : m_fp_zones ) for( ZONE* zone : m_fp_zones )
zone->Flip( m_Pos, aFlipLeftRight ); zone->Flip( m_pos, aFlipLeftRight );
// Mirror reference and value. // Mirror reference and value.
m_Reference->Flip( m_Pos, false ); m_reference->Flip( m_pos, false );
m_Value->Flip( m_Pos, false ); m_value->Flip( m_pos, false );
// Reverse mirror module graphics and texts. // Reverse mirror module graphics and texts.
for( BOARD_ITEM* item : m_drawings ) for( BOARD_ITEM* item : m_drawings )
@ -1300,11 +1299,11 @@ void MODULE::Flip( const wxPoint& aCentre, bool aFlipLeftRight )
switch( item->Type() ) switch( item->Type() )
{ {
case PCB_FP_SHAPE_T: case PCB_FP_SHAPE_T:
static_cast<FP_SHAPE*>( item )->Flip( m_Pos, false ); static_cast<FP_SHAPE*>( item )->Flip( m_pos, false );
break; break;
case PCB_FP_TEXT_T: case PCB_FP_TEXT_T:
static_cast<FP_TEXT*>( item )->Flip( m_Pos, false ); static_cast<FP_TEXT*>( item )->Flip( m_pos, false );
break; break;
default: default:
@ -1323,12 +1322,12 @@ void MODULE::Flip( const wxPoint& aCentre, bool aFlipLeftRight )
void MODULE::SetPosition( const wxPoint& aPos ) void MODULE::SetPosition( const wxPoint& aPos )
{ {
wxPoint delta = aPos - m_Pos; wxPoint delta = aPos - m_pos;
m_Pos += delta; m_pos += delta;
m_Reference->EDA_TEXT::Offset( delta ); m_reference->EDA_TEXT::Offset( delta );
m_Value->EDA_TEXT::Offset( delta ); m_value->EDA_TEXT::Offset( delta );
for( PAD* pad : m_pads ) for( PAD* pad : m_pads )
pad->SetPosition( pad->GetPosition() + delta ); pad->SetPosition( pad->GetPosition() + delta );
@ -1360,7 +1359,7 @@ void MODULE::SetPosition( const wxPoint& aPos )
} }
} }
m_BoundaryBox.Move( delta ); m_boundingBox.Move( delta );
} }
@ -1380,10 +1379,10 @@ void MODULE::MoveAnchorPosition( const wxPoint& aMoveVector )
RotatePoint( &moveVector, -GetOrientation() ); RotatePoint( &moveVector, -GetOrientation() );
// Update of the reference and value. // Update of the reference and value.
m_Reference->SetPos0( m_Reference->GetPos0() + moveVector ); m_reference->SetPos0( m_reference->GetPos0() + moveVector );
m_Reference->SetDrawCoord(); m_reference->SetDrawCoord();
m_Value->SetPos0( m_Value->GetPos0() + moveVector ); m_value->SetPos0( m_value->GetPos0() + moveVector );
m_Value->SetDrawCoord(); m_value->SetDrawCoord();
// Update the pad local coordinates. // Update the pad local coordinates.
for( PAD* pad : m_pads ) for( PAD* pad : m_pads )
@ -1423,11 +1422,11 @@ void MODULE::MoveAnchorPosition( const wxPoint& aMoveVector )
void MODULE::SetOrientation( double aNewAngle ) void MODULE::SetOrientation( double aNewAngle )
{ {
double angleChange = aNewAngle - m_Orient; // change in rotation double angleChange = aNewAngle - m_orient; // change in rotation
NORMALIZE_ANGLE_180( aNewAngle ); NORMALIZE_ANGLE_180( aNewAngle );
m_Orient = aNewAngle; m_orient = aNewAngle;
for( PAD* pad : m_pads ) for( PAD* pad : m_pads )
{ {
@ -1441,8 +1440,8 @@ void MODULE::SetOrientation( double aNewAngle )
} }
// Update of the reference and value. // Update of the reference and value.
m_Reference->SetDrawCoord(); m_reference->SetDrawCoord();
m_Value->SetDrawCoord(); m_value->SetDrawCoord();
// Displace contours and text of the footprint. // Displace contours and text of the footprint.
for( BOARD_ITEM* item : m_drawings ) for( BOARD_ITEM* item : m_drawings )
@ -1473,7 +1472,7 @@ BOARD_ITEM* MODULE::Duplicate() const
} }
BOARD_ITEM* MODULE::DuplicateItem( const BOARD_ITEM* aItem, bool aAddToModule ) BOARD_ITEM* MODULE::DuplicateItem( const BOARD_ITEM* aItem, bool aAddToFootprint )
{ {
BOARD_ITEM* new_item = NULL; BOARD_ITEM* new_item = NULL;
FP_ZONE* new_zone = NULL; FP_ZONE* new_zone = NULL;
@ -1485,7 +1484,7 @@ BOARD_ITEM* MODULE::DuplicateItem( const BOARD_ITEM* aItem, bool aAddToModule )
PAD* new_pad = new PAD( *static_cast<const PAD*>( aItem ) ); PAD* new_pad = new PAD( *static_cast<const PAD*>( aItem ) );
const_cast<KIID&>( new_pad->m_Uuid ) = KIID(); const_cast<KIID&>( new_pad->m_Uuid ) = KIID();
if( aAddToModule ) if( aAddToFootprint )
m_pads.push_back( new_pad ); m_pads.push_back( new_pad );
new_item = new_pad; new_item = new_pad;
@ -1497,7 +1496,7 @@ BOARD_ITEM* MODULE::DuplicateItem( const BOARD_ITEM* aItem, bool aAddToModule )
new_zone = new FP_ZONE( *static_cast<const FP_ZONE*>( aItem ) ); new_zone = new FP_ZONE( *static_cast<const FP_ZONE*>( aItem ) );
const_cast<KIID&>( new_zone->m_Uuid ) = KIID(); const_cast<KIID&>( new_zone->m_Uuid ) = KIID();
if( aAddToModule ) if( aAddToFootprint )
m_fp_zones.push_back( new_zone ); m_fp_zones.push_back( new_zone );
new_item = new_zone; new_item = new_zone;
@ -1520,7 +1519,7 @@ BOARD_ITEM* MODULE::DuplicateItem( const BOARD_ITEM* aItem, bool aAddToModule )
new_text->SetType( FP_TEXT::TEXT_is_DIVERS ); new_text->SetType( FP_TEXT::TEXT_is_DIVERS );
} }
if( aAddToModule ) if( aAddToFootprint )
Add( new_text ); Add( new_text );
new_item = new_text; new_item = new_text;
@ -1533,7 +1532,7 @@ BOARD_ITEM* MODULE::DuplicateItem( const BOARD_ITEM* aItem, bool aAddToModule )
FP_SHAPE* new_shape = new FP_SHAPE( *static_cast<const FP_SHAPE*>( aItem ) ); FP_SHAPE* new_shape = new FP_SHAPE( *static_cast<const FP_SHAPE*>( aItem ) );
const_cast<KIID&>( new_shape->m_Uuid ) = KIID(); const_cast<KIID&>( new_shape->m_Uuid ) = KIID();
if( aAddToModule ) if( aAddToFootprint )
Add( new_shape ); Add( new_shape );
new_item = new_shape; new_item = new_shape;
@ -1627,8 +1626,8 @@ double MODULE::CoverageRatio( const GENERAL_COLLECTOR& aCollector ) const
for( PAD* pad : m_pads ) for( PAD* pad : m_pads )
addRect( holes, pad->GetBoundingBox() ); addRect( holes, pad->GetBoundingBox() );
addRect( holes, m_Reference->GetBoundingBox() ); addRect( holes, m_reference->GetBoundingBox() );
addRect( holes, m_Value->GetBoundingBox() ); addRect( holes, m_value->GetBoundingBox() );
for( int i = 0; i < aCollector.GetCount(); ++i ) for( int i = 0; i < aCollector.GetCount(); ++i )
{ {

View File

@ -95,7 +95,7 @@ public:
VECTOR3D m_Offset; ///< 3D model offset (mm) VECTOR3D m_Offset; ///< 3D model offset (mm)
double m_Opacity; double m_Opacity;
wxString m_Filename; ///< The 3D shape filename in 3D library wxString m_Filename; ///< The 3D shape filename in 3D library
bool m_Show; ///< Include module in rendering bool m_Show; ///< Include model in rendering
}; };
DECL_DEQ_FOR_SWIG( PADS, PAD* ) DECL_DEQ_FOR_SWIG( PADS, PAD* )
@ -111,7 +111,7 @@ public:
MODULE( const MODULE& aFootprint ); MODULE( const MODULE& aFootprint );
// Move constructor and operator needed due to std containers inside the module // Move constructor and operator needed due to std containers inside the footprint
MODULE( MODULE&& aFootprint ); MODULE( MODULE&& aFootprint );
~MODULE(); ~MODULE();
@ -147,7 +147,7 @@ public:
/** /**
* Function GetFootprintRect() * Function GetFootprintRect()
* Build and returns the boundary box of the module footprint excluding any text. * Build and returns the boundary box of the footprint excluding any text.
* @return EDA_RECT - The rectangle containing the footprint. * @return EDA_RECT - The rectangle containing the footprint.
*/ */
EDA_RECT GetFootprintRect() const; EDA_RECT GetFootprintRect() const;
@ -157,7 +157,7 @@ public:
* (call CalculateBoundingBox() to recalculate it) * (call CalculateBoundingBox() to recalculate it)
* @return EDA_RECT - The rectangle containing the footprint * @return EDA_RECT - The rectangle containing the footprint
*/ */
EDA_RECT GetBoundingBoxBase() const { return m_BoundaryBox; } EDA_RECT GetBoundingBoxBase() const { return m_boundingBox; }
/** /**
* Returns the bounding box containing pads when the footprint * Returns the bounding box containing pads when the footprint
@ -169,7 +169,7 @@ public:
EDA_RECT GetFpPadsLocalBbox() const; EDA_RECT GetFpPadsLocalBbox() const;
/** /**
* Returns a bounding polygon for the shapes and pads in the module * Returns a bounding polygon for the shapes and pads in the footprint
* This operation is slower but more accurate than calculating a bounding box * This operation is slower but more accurate than calculating a bounding box
*/ */
SHAPE_POLY_SET GetBoundingPoly() const; SHAPE_POLY_SET GetBoundingPoly() const;
@ -196,57 +196,57 @@ public:
const std::list<FP_3DMODEL>& Models() const { return m_3D_Drawings; } const std::list<FP_3DMODEL>& Models() const { return m_3D_Drawings; }
void SetPosition( const wxPoint& aPos ) override; void SetPosition( const wxPoint& aPos ) override;
wxPoint GetPosition() const override { return m_Pos; } wxPoint GetPosition() const override { return m_pos; }
void SetOrientation( double aNewAngle ); void SetOrientation( double aNewAngle );
void SetOrientationDegrees( double aOrientation ) { SetOrientation( aOrientation * 10.0 ); } void SetOrientationDegrees( double aOrientation ) { SetOrientation( aOrientation * 10.0 ); }
double GetOrientation() const { return m_Orient; } double GetOrientation() const { return m_orient; }
double GetOrientationDegrees() const { return m_Orient / 10.0; } double GetOrientationDegrees() const { return m_orient / 10.0; }
double GetOrientationRadians() const { return m_Orient * M_PI / 1800; } double GetOrientationRadians() const { return m_orient * M_PI / 1800; }
const LIB_ID& GetFPID() const { return m_fpid; } const LIB_ID& GetFPID() const { return m_fpid; }
void SetFPID( const LIB_ID& aFPID ) { m_fpid = aFPID; } void SetFPID( const LIB_ID& aFPID ) { m_fpid = aFPID; }
const wxString& GetDescription() const { return m_Doc; } const wxString& GetDescription() const { return m_doc; }
void SetDescription( const wxString& aDoc ) { m_Doc = aDoc; } void SetDescription( const wxString& aDoc ) { m_doc = aDoc; }
const wxString& GetKeywords() const { return m_KeyWord; } const wxString& GetKeywords() const { return m_keywords; }
void SetKeywords( const wxString& aKeywords ) { m_KeyWord = aKeywords; } void SetKeywords( const wxString& aKeywords ) { m_keywords = aKeywords; }
const KIID_PATH& GetPath() const { return m_Path; } const KIID_PATH& GetPath() const { return m_path; }
void SetPath( const KIID_PATH& aPath ) { m_Path = aPath; } void SetPath( const KIID_PATH& aPath ) { m_path = aPath; }
int GetLocalSolderMaskMargin() const { return m_LocalSolderMaskMargin; } int GetLocalSolderMaskMargin() const { return m_localSolderMaskMargin; }
void SetLocalSolderMaskMargin( int aMargin ) { m_LocalSolderMaskMargin = aMargin; } void SetLocalSolderMaskMargin( int aMargin ) { m_localSolderMaskMargin = aMargin; }
int GetLocalClearance() const { return m_LocalClearance; } int GetLocalClearance() const { return m_localClearance; }
void SetLocalClearance( int aClearance ) { m_LocalClearance = aClearance; } void SetLocalClearance( int aClearance ) { m_localClearance = aClearance; }
int GetLocalClearance( wxString* aSource ) const int GetLocalClearance( wxString* aSource ) const
{ {
if( aSource ) if( aSource )
*aSource = wxString::Format( _( "footprint %s" ), GetReference() ); *aSource = wxString::Format( _( "footprint %s" ), GetReference() );
return m_LocalClearance; return m_localClearance;
} }
int GetLocalSolderPasteMargin() const { return m_LocalSolderPasteMargin; } int GetLocalSolderPasteMargin() const { return m_localSolderPasteMargin; }
void SetLocalSolderPasteMargin( int aMargin ) { m_LocalSolderPasteMargin = aMargin; } void SetLocalSolderPasteMargin( int aMargin ) { m_localSolderPasteMargin = aMargin; }
double GetLocalSolderPasteMarginRatio() const { return m_LocalSolderPasteMarginRatio; } double GetLocalSolderPasteMarginRatio() const { return m_localSolderPasteMarginRatio; }
void SetLocalSolderPasteMarginRatio( double aRatio ) { m_LocalSolderPasteMarginRatio = aRatio; } void SetLocalSolderPasteMarginRatio( double aRatio ) { m_localSolderPasteMarginRatio = aRatio; }
void SetZoneConnection( ZONE_CONNECTION aType ) { m_ZoneConnection = aType; } void SetZoneConnection( ZONE_CONNECTION aType ) { m_zoneConnection = aType; }
ZONE_CONNECTION GetZoneConnection() const { return m_ZoneConnection; } ZONE_CONNECTION GetZoneConnection() const { return m_zoneConnection; }
void SetThermalWidth( int aWidth ) { m_ThermalWidth = aWidth; } void SetThermalWidth( int aWidth ) { m_thermalWidth = aWidth; }
int GetThermalWidth() const { return m_ThermalWidth; } int GetThermalWidth() const { return m_thermalWidth; }
void SetThermalGap( int aGap ) { m_ThermalGap = aGap; } void SetThermalGap( int aGap ) { m_thermalGap = aGap; }
int GetThermalGap() const { return m_ThermalGap; } int GetThermalGap() const { return m_thermalGap; }
int GetAttributes() const { return m_Attributs; } int GetAttributes() const { return m_attributes; }
void SetAttributes( int aAttributes ) { m_Attributs = aAttributes; } void SetAttributes( int aAttributes ) { m_attributes = aAttributes; }
void SetFlag( int aFlag ) { m_arflag = aFlag; } void SetFlag( int aFlag ) { m_arflag = aFlag; }
void IncrementFlag() { m_arflag += 1; } void IncrementFlag() { m_arflag += 1; }
@ -276,20 +276,20 @@ public:
/** /**
* function IsFlipped * function IsFlipped
* @return true if the module is flipped, i.e. on the back side of the board * @return true if the footprint is flipped, i.e. on the back side of the board
*/ */
bool IsFlipped() const { return GetLayer() == B_Cu; } bool IsFlipped() const { return GetLayer() == B_Cu; }
// m_footprintstatus bits: // m_footprintStatus bits:
#define MODULE_is_LOCKED 0x01 ///< module LOCKED: no autoplace allowed #define FP_is_LOCKED 0x01 ///< footprint LOCKED: no autoplace allowed
#define MODULE_is_PLACED 0x02 ///< In autoplace: module automatically placed #define FP_is_PLACED 0x02 ///< In autoplace: footprint automatically placed
#define MODULE_to_PLACE 0x04 ///< In autoplace: module waiting for autoplace #define FP_to_PLACE 0x04 ///< In autoplace: footprint waiting for autoplace
#define MODULE_PADS_LOCKED 0x08 ///< In autoplace: module waiting for autoplace #define FP_PADS_are_LOCKED 0x08
bool IsLocked() const override bool IsLocked() const override
{ {
return ( m_ModuleStatus & MODULE_is_LOCKED ) != 0; return ( m_moduleStatus & FP_is_LOCKED ) != 0;
} }
/** /**
@ -300,42 +300,42 @@ public:
void SetLocked( bool isLocked ) override void SetLocked( bool isLocked ) override
{ {
if( isLocked ) if( isLocked )
m_ModuleStatus |= MODULE_is_LOCKED; m_moduleStatus |= FP_is_LOCKED;
else else
m_ModuleStatus &= ~MODULE_is_LOCKED; m_moduleStatus &= ~FP_is_LOCKED;
} }
bool IsPlaced() const { return m_ModuleStatus & MODULE_is_PLACED; } bool IsPlaced() const { return m_moduleStatus & FP_is_PLACED; }
void SetIsPlaced( bool isPlaced ) void SetIsPlaced( bool isPlaced )
{ {
if( isPlaced ) if( isPlaced )
m_ModuleStatus |= MODULE_is_PLACED; m_moduleStatus |= FP_is_PLACED;
else else
m_ModuleStatus &= ~MODULE_is_PLACED; m_moduleStatus &= ~FP_is_PLACED;
} }
bool NeedsPlaced() const { return m_ModuleStatus & MODULE_to_PLACE; } bool NeedsPlaced() const { return m_moduleStatus & FP_to_PLACE; }
void SetNeedsPlaced( bool needsPlaced ) void SetNeedsPlaced( bool needsPlaced )
{ {
if( needsPlaced ) if( needsPlaced )
m_ModuleStatus |= MODULE_to_PLACE; m_moduleStatus |= FP_to_PLACE;
else else
m_ModuleStatus &= ~MODULE_to_PLACE; m_moduleStatus &= ~FP_to_PLACE;
} }
bool PadsLocked() const { return m_ModuleStatus & MODULE_PADS_LOCKED; } bool PadsLocked() const { return m_moduleStatus & FP_PADS_are_LOCKED; }
void SetPadsLocked( bool aPadsLocked ) void SetPadsLocked( bool aPadsLocked )
{ {
if( aPadsLocked ) if( aPadsLocked )
m_ModuleStatus |= MODULE_PADS_LOCKED; m_moduleStatus |= FP_PADS_are_LOCKED;
else else
m_ModuleStatus &= ~MODULE_PADS_LOCKED; m_moduleStatus &= ~FP_PADS_are_LOCKED;
} }
void SetLastEditTime( timestamp_t aTime ) { m_LastEditTime = aTime; } void SetLastEditTime( timestamp_t aTime ) { m_lastEditTime = aTime; }
void SetLastEditTime() { m_LastEditTime = time( NULL ); } void SetLastEditTime() { m_lastEditTime = time( NULL ); }
timestamp_t GetLastEditTime() const { return m_LastEditTime; } timestamp_t GetLastEditTime() const { return m_lastEditTime; }
/* drawing functions */ /* drawing functions */
@ -375,13 +375,13 @@ public:
* @param aClearance = a value to inflate shapes * @param aClearance = a value to inflate shapes
* @param aError = Maximum error between true arc and polygon approx * @param aError = Maximum error between true arc and polygon approx
* @param aIncludeText = True to transform text shapes * @param aIncludeText = True to transform text shapes
* @param aIncludeEdges = True to transform module shapes * @param aIncludeShapes = True to transform footprint shapes
*/ */
void TransformFPShapesWithClearanceToPolygon( SHAPE_POLY_SET& aCornerBuffer, void TransformFPShapesWithClearanceToPolygon( SHAPE_POLY_SET& aCornerBuffer,
PCB_LAYER_ID aLayer, int aClearance, PCB_LAYER_ID aLayer, int aClearance,
int aError, ERROR_LOC aErrorLoc, int aError, ERROR_LOC aErrorLoc,
bool aIncludeText = true, bool aIncludeText = true,
bool aIncludeEdges = true ) const; bool aIncludeShapes = true ) const;
/** /**
* @brief TransformFPTextWithClearanceToPolygonSet * @brief TransformFPTextWithClearanceToPolygonSet
@ -413,7 +413,7 @@ public:
bool HitTest( const wxPoint& aPosition, int aAccuracy = 0 ) const override; bool HitTest( const wxPoint& aPosition, int aAccuracy = 0 ) const override;
/** /**
* Tests if a point is inside the bounding polygon of the module * Tests if a point is inside the bounding polygon of the footprint
* *
* The other hit test methods are just checking the bounding box, which * The other hit test methods are just checking the bounding box, which
* can be quite inaccurate for rotated or oddly-shaped footprints. * can be quite inaccurate for rotated or oddly-shaped footprints.
@ -431,7 +431,7 @@ public:
*/ */
const wxString GetReference() const const wxString GetReference() const
{ {
return m_Reference->GetText(); return m_reference->GetText();
} }
/** /**
@ -441,7 +441,7 @@ public:
*/ */
void SetReference( const wxString& aReference ) void SetReference( const wxString& aReference )
{ {
m_Reference->SetText( aReference ); m_reference->SetText( aReference );
} }
/** /**
@ -456,7 +456,7 @@ public:
*/ */
const wxString GetValue() const const wxString GetValue() const
{ {
return m_Value->GetText(); return m_value->GetText();
} }
/** /**
@ -465,16 +465,16 @@ public:
*/ */
void SetValue( const wxString& aValue ) void SetValue( const wxString& aValue )
{ {
m_Value->SetText( aValue ); m_value->SetText( aValue );
} }
/// read/write accessors: /// read/write accessors:
FP_TEXT& Value() { return *m_Value; } FP_TEXT& Value() { return *m_value; }
FP_TEXT& Reference() { return *m_Reference; } FP_TEXT& Reference() { return *m_reference; }
/// The const versions to keep the compiler happy. /// The const versions to keep the compiler happy.
FP_TEXT& Value() const { return *m_Value; } FP_TEXT& Value() const { return *m_value; }
FP_TEXT& Reference() const { return *m_Reference; } FP_TEXT& Reference() const { return *m_reference; }
const std::map<wxString, wxString>& GetProperties() const { return m_properties; } const std::map<wxString, wxString>& GetProperties() const { return m_properties; }
void SetProperties( const std::map<wxString, wxString>& aProps ) { m_properties = aProps; } void SetProperties( const std::map<wxString, wxString>& aProps ) { m_properties = aProps; }
@ -535,7 +535,7 @@ public:
/** /**
* Function GetNextPadName * Function GetNextPadName
* returns the next available pad name in the module * returns the next available pad name in the footprint
* *
* @param aFillSequenceGaps true if the numbering should "fill in" gaps in the sequence, * @param aFillSequenceGaps true if the numbering should "fill in" gaps in the sequence,
* else return the highest value + 1 * else return the highest value + 1
@ -545,23 +545,23 @@ public:
double GetArea( int aPadding = 0 ) const; double GetArea( int aPadding = 0 ) const;
KIID GetLink() const { return m_Link; } KIID GetLink() const { return m_link; }
void SetLink( const KIID& aLink ) { m_Link = aLink; } void SetLink( const KIID& aLink ) { m_link = aLink; }
int GetPlacementCost180() const { return m_CntRot180; } int GetPlacementCost180() const { return m_rot180Cost; }
void SetPlacementCost180( int aCost ) { m_CntRot180 = aCost; } void SetPlacementCost180( int aCost ) { m_rot180Cost = aCost; }
int GetPlacementCost90() const { return m_CntRot90; } int GetPlacementCost90() const { return m_rot90Cost; }
void SetPlacementCost90( int aCost ) { m_CntRot90 = aCost; } void SetPlacementCost90( int aCost ) { m_rot90Cost = aCost; }
BOARD_ITEM* Duplicate() const override; BOARD_ITEM* Duplicate() const override;
/** /**
* Function DuplicateItem * Function DuplicateItem
* Duplicate a given item within the module, optionally adding it to the board * Duplicate a given item within the footprint, optionally adding it to the board
* @return the new item, or NULL if the item could not be duplicated * @return the new item, or NULL if the item could not be duplicated
*/ */
BOARD_ITEM* DuplicateItem( const BOARD_ITEM* aItem, bool aAddToModule = false ); BOARD_ITEM* DuplicateItem( const BOARD_ITEM* aItem, bool aAddToFootprint = false );
/** /**
* Function Add3DModel * Function Add3DModel
@ -587,14 +587,14 @@ public:
/** /**
* Function RunOnChildren * Function RunOnChildren
* *
* Invokes a function on all BOARD_ITEMs that belong to the module (pads, drawings, texts). * Invokes a function on all BOARD_ITEMs that belong to the footprint (pads, drawings, texts).
* Note that this function should not add or remove items to the module * Note that this function should not add or remove items to the footprint
* @param aFunction is the function to be invoked. * @param aFunction is the function to be invoked.
*/ */
void RunOnChildren( const std::function<void (BOARD_ITEM*)>& aFunction ) const; void RunOnChildren( const std::function<void (BOARD_ITEM*)>& aFunction ) const;
/** /**
* Returns a set of all layers that this module has drawings on similar to ViewGetLayers() * Returns a set of all layers that this footprint has drawings on similar to ViewGetLayers()
* *
* @param aLayers is an array to store layer ids * @param aLayers is an array to store layer ids
* @param aCount is the number of layers stored in the array * @param aCount is the number of layers stored in the array
@ -696,38 +696,38 @@ private:
FP_ZONES m_fp_zones; // FP_ZONE items, owned by pointer FP_ZONES m_fp_zones; // FP_ZONE items, owned by pointer
MODULE_GROUPS m_fp_groups; // PCB_GROUP items, owned by pointer MODULE_GROUPS m_fp_groups; // PCB_GROUP items, owned by pointer
double m_Orient; // Orientation in tenths of a degree, 900=90.0 degrees. double m_orient; // Orientation in tenths of a degree, 900=90.0 degrees.
wxPoint m_Pos; // Position of module on the board in internal units. wxPoint m_pos; // Position of footprint on the board in internal units.
FP_TEXT* m_Reference; // Component reference designator value (U34, R18..) FP_TEXT* m_reference; // Component reference designator value (U34, R18..)
FP_TEXT* m_Value; // Component value (74LS00, 22K..) FP_TEXT* m_value; // Component value (74LS00, 22K..)
LIB_ID m_fpid; // The #LIB_ID of the MODULE. LIB_ID m_fpid; // The #LIB_ID of the MODULE.
int m_Attributs; // Flag bits ( see Mod_Attribut ) int m_attributes; // Flag bits ( see FOOTPRINT_ATTR_T )
int m_ModuleStatus; // For autoplace: flags (LOCKED, FIELDS_AUTOPLACED) int m_moduleStatus; // For autoplace: flags (LOCKED, FIELDS_AUTOPLACED)
EDA_RECT m_BoundaryBox; // Bounding box : coordinates on board, real orientation. EDA_RECT m_boundingBox; // Bounding box : coordinates on board, real orientation.
ZONE_CONNECTION m_ZoneConnection; ZONE_CONNECTION m_zoneConnection;
int m_ThermalWidth; int m_thermalWidth;
int m_ThermalGap; int m_thermalGap;
int m_LocalClearance; int m_localClearance;
int m_LocalSolderMaskMargin; // Solder mask margin int m_localSolderMaskMargin; // Solder mask margin
int m_LocalSolderPasteMargin; // Solder paste margin absolute value 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
wxString m_Doc; // File name and path for documentation file. wxString m_doc; // File name and path for documentation file.
wxString m_KeyWord; // Search keywords to find module in library. wxString m_keywords; // Search keywords to find footprint in library.
KIID_PATH m_Path; // Path to associated symbol ([sheetUUID, .., symbolUUID]). KIID_PATH m_path; // Path to associated symbol ([sheetUUID, .., symbolUUID]).
timestamp_t m_LastEditTime; timestamp_t m_lastEditTime;
int m_arflag; // Use to trace ratsnest and auto routing. int m_arflag; // Use to trace ratsnest and auto routing.
KIID m_Link; // Temporary logical link used during editing KIID m_link; // Temporary logical link used during editing
int m_CntRot90; // Horizontal automatic placement cost ( 0..10 ). int m_rot90Cost; // Horizontal automatic placement cost ( 0..10 ).
int m_CntRot180; // Vertical automatic placement cost ( 0..10 ). int m_rot180Cost; // Vertical automatic placement cost ( 0..10 ).
std::list<FP_3DMODEL> m_3D_Drawings; // Linked list of 3D models. std::list<FP_3DMODEL> m_3D_Drawings; // Linked list of 3D models.
std::map<wxString, wxString> m_properties; std::map<wxString, wxString> m_properties;
wxArrayString* m_initial_comments; // s-expression comments in the module, wxArrayString* m_initial_comments; // s-expression comments in the footprint,
// lazily allocated only if needed for speed // lazily allocated only if needed for speed
SHAPE_POLY_SET m_poly_courtyard_front; // Note that a module can have both front and back SHAPE_POLY_SET m_poly_courtyard_front; // Note that a footprint can have both front and back
SHAPE_POLY_SET m_poly_courtyard_back; // courtyards populated. SHAPE_POLY_SET m_poly_courtyard_back; // courtyards populated.
}; };

View File

@ -103,14 +103,14 @@ void FOOTPRINT_WIZARD_FRAME::ReloadFootprint()
// Creates the module // Creates the module
wxString msg; wxString msg;
MODULE* module = footprintWizard->GetFootprint( &msg ); MODULE* footprint = footprintWizard->GetFootprint( &msg );
DisplayBuildMessage( msg ); DisplayBuildMessage( msg );
if( module ) if( footprint )
{ {
// Add the object to board // Add the object to board
GetBoard()->Add( module, ADD_MODE::APPEND ); GetBoard()->Add( footprint, ADD_MODE::APPEND );
module->SetPosition( wxPoint( 0, 0 ) ); footprint->SetPosition( wxPoint( 0, 0 ) );
} }
updateView(); updateView();

View File

@ -149,11 +149,11 @@ public:
void Show( int nestLevel, std::ostream& os ) const override { ShowDummy( os ); } void Show( int nestLevel, std::ostream& os ) const override { ShowDummy( os ); }
#endif #endif
wxPoint m_Start0; ///< Start point or center, relative to module origin, orient 0. wxPoint m_Start0; ///< Start point or center, relative to footprint origin, orient 0.
wxPoint m_End0; ///< End point, relative to module origin, orient 0. wxPoint m_End0; ///< End point, relative to footprint origin, orient 0.
wxPoint m_ThirdPoint0; ///< End point for an arc. wxPoint m_ThirdPoint0; ///< End point for an arc.
wxPoint m_Bezier0_C1; ///< Bezier Control Point 1, relative to module origin, orient 0. wxPoint m_Bezier0_C1; ///< Bezier Control Point 1, relative to footprint origin, orient 0.
wxPoint m_Bezier0_C2; ///< Bezier Control Point 2, relative to module origin, orient 0. wxPoint m_Bezier0_C2; ///< Bezier Control Point 2, relative to footprint origin, orient 0.
}; };
#endif // FP_SHAPE_H #endif // FP_SHAPE_H

View File

@ -31,11 +31,11 @@
#include <settings/settings_manager.h> #include <settings/settings_manager.h>
#include <trigo.h> #include <trigo.h>
FP_TEXT::FP_TEXT( MODULE* parent, TEXT_TYPE text_type ) : FP_TEXT::FP_TEXT( MODULE* aParentFootprint, TEXT_TYPE text_type ) :
BOARD_ITEM( parent, PCB_FP_TEXT_T ), BOARD_ITEM( aParentFootprint, PCB_FP_TEXT_T ),
EDA_TEXT() EDA_TEXT()
{ {
MODULE* module = static_cast<MODULE*>( m_Parent ); MODULE* parentFootprint = static_cast<MODULE*>( m_Parent );
m_Type = text_type; m_Type = text_type;
m_keepUpright = true; m_keepUpright = true;
@ -45,11 +45,11 @@ FP_TEXT::FP_TEXT( MODULE* parent, TEXT_TYPE text_type ) :
SetLayer( F_SilkS ); SetLayer( F_SilkS );
// Set position and give a default layer if a valid parent footprint exists // Set position and give a default layer if a valid parent footprint exists
if( module && ( module->Type() == PCB_MODULE_T ) ) if( parentFootprint && ( parentFootprint->Type() == PCB_MODULE_T ) )
{ {
SetTextPos( module->GetPosition() ); SetTextPos( parentFootprint->GetPosition() );
if( IsBackLayer( module->GetLayer() ) ) if( IsBackLayer( parentFootprint->GetLayer() ) )
{ {
SetLayer( B_SilkS ); SetLayer( B_SilkS );
SetMirrored( true ); SetMirrored( true );
@ -127,7 +127,7 @@ void FP_TEXT::KeepUpright( double aOldOrientation, double aNewOrientation )
void FP_TEXT::Rotate( const wxPoint& aRotCentre, double aAngle ) void FP_TEXT::Rotate( const wxPoint& aRotCentre, double aAngle )
{ {
// Used in footprint editing // Used in footprint editing
// Note also in module editor, m_Pos0 = m_Pos // Note also in footprint editor, m_Pos0 = m_Pos
wxPoint pt = GetTextPos(); wxPoint pt = GetTextPos();
RotatePoint( &pt, aRotCentre, aAngle ); RotatePoint( &pt, aRotCentre, aAngle );
@ -197,32 +197,32 @@ int FP_TEXT::GetLength() const
void FP_TEXT::SetDrawCoord() void FP_TEXT::SetDrawCoord()
{ {
const MODULE* module = static_cast<const MODULE*>( m_Parent ); const MODULE* parentFootprint = static_cast<const MODULE*>( m_Parent );
SetTextPos( m_Pos0 ); SetTextPos( m_Pos0 );
if( module ) if( parentFootprint )
{ {
double angle = module->GetOrientation(); double angle = parentFootprint->GetOrientation();
wxPoint pt = GetTextPos(); wxPoint pt = GetTextPos();
RotatePoint( &pt, angle ); RotatePoint( &pt, angle );
SetTextPos( pt ); SetTextPos( pt );
Offset( module->GetPosition() ); Offset( parentFootprint->GetPosition() );
} }
} }
void FP_TEXT::SetLocalCoord() void FP_TEXT::SetLocalCoord()
{ {
const MODULE* module = static_cast<const MODULE*>( m_Parent ); const MODULE* parentFootprint = static_cast<const MODULE*>( m_Parent );
if( module ) if( parentFootprint )
{ {
m_Pos0 = GetTextPos() - module->GetPosition(); m_Pos0 = GetTextPos() - parentFootprint->GetPosition();
double angle = module->GetOrientation(); double angle = parentFootprint->GetOrientation();
RotatePoint( &m_Pos0.x, &m_Pos0.y, -angle ); RotatePoint( &m_Pos0.x, &m_Pos0.y, -angle );
} }
@ -246,11 +246,11 @@ const EDA_RECT FP_TEXT::GetBoundingBox() const
double FP_TEXT::GetDrawRotation() const double FP_TEXT::GetDrawRotation() const
{ {
MODULE* module = (MODULE*) m_Parent; MODULE* parentFootprint = (MODULE*) m_Parent;
double rotation = GetTextAngle(); double rotation = GetTextAngle();
if( module ) if( parentFootprint )
rotation += module->GetOrientation(); rotation += parentFootprint->GetOrientation();
if( m_keepUpright ) if( m_keepUpright )
{ {
@ -273,9 +273,9 @@ double FP_TEXT::GetDrawRotation() const
// see class_text_mod.h // see class_text_mod.h
void FP_TEXT::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList ) void FP_TEXT::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
{ {
MODULE* module = (MODULE*) m_Parent; MODULE* parentFootprint = (MODULE*) m_Parent;
if( module == NULL ) // Happens in modedit, and for new texts if( parentFootprint == NULL ) // Happens in modedit, and for new texts
return; return;
wxString msg, Line; wxString msg, Line;
@ -285,7 +285,7 @@ void FP_TEXT::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITE
_( "Ref." ), _( "Value" ), _( "Text" ) _( "Ref." ), _( "Value" ), _( "Text" )
}; };
Line = module->GetReference(); Line = parentFootprint->GetReference();
aList.emplace_back( _( "Footprint" ), Line, DARKCYAN ); aList.emplace_back( _( "Footprint" ), Line, DARKCYAN );
Line = GetShownText(); Line = GetShownText();
@ -421,14 +421,14 @@ double FP_TEXT::ViewGetLOD( int aLayer, KIGFX::VIEW* aView ) const
wxString FP_TEXT::GetShownText( int aDepth ) const wxString FP_TEXT::GetShownText( int aDepth ) const
{ {
const MODULE* module = static_cast<MODULE*>( GetParent() ); const MODULE* parentFootprint = static_cast<MODULE*>( GetParent() );
wxASSERT( module ); wxASSERT( parentFootprint );
const BOARD* board = module->GetBoard(); const BOARD* board = parentFootprint->GetBoard();
std::function<bool( wxString* )> moduleResolver = std::function<bool( wxString* )> footprintResolver =
[&]( wxString* token ) -> bool [&]( wxString* token ) -> bool
{ {
return module && module->ResolveTextVar( token, aDepth ); return parentFootprint && parentFootprint->ResolveTextVar( token, aDepth );
}; };
std::function<bool( wxString* )> boardTextResolver = std::function<bool( wxString* )> boardTextResolver =
@ -444,11 +444,11 @@ wxString FP_TEXT::GetShownText( int aDepth ) const
{ {
PROJECT* project = nullptr; PROJECT* project = nullptr;
if( module && module->GetParent() ) if( parentFootprint && parentFootprint->GetParent() )
project = static_cast<BOARD*>( module->GetParent() )->GetProject(); project = static_cast<BOARD*>( parentFootprint->GetParent() )->GetProject();
if( aDepth < 10 ) if( aDepth < 10 )
text = ExpandTextVars( text, &moduleResolver, project, &boardTextResolver ); text = ExpandTextVars( text, &footprintResolver, project, &boardTextResolver );
} }
return text; return text;

View File

@ -39,12 +39,12 @@ class SHAPE;
class FP_TEXT : public BOARD_ITEM, public EDA_TEXT class FP_TEXT : public BOARD_ITEM, public EDA_TEXT
{ {
public: public:
/** Text module type: there must be only one (and only one) for each /**
* of the reference and value texts in one module; others could be * Footprint text type: there must be only one (and only one) for each of the reference
* added for the user (DIVERS is French for 'others'). Reference and * value texts in one footprint; others could be added for the user (DIVERS is French for
* value always live on silkscreen (on the module side); other texts * 'others'). Reference and value always live on silkscreen (on the footprint side); other
* are planned to go on whatever layer the user wants (except * texts are planned to go on whatever layer the user wants.
* copper, probably) */ */
enum TEXT_TYPE enum TEXT_TYPE
{ {
TEXT_is_REFERENCE = 0, TEXT_is_REFERENCE = 0,
@ -52,7 +52,7 @@ public:
TEXT_is_DIVERS = 2 TEXT_is_DIVERS = 2
}; };
FP_TEXT( MODULE* parent, TEXT_TYPE text_type = TEXT_is_DIVERS ); FP_TEXT( MODULE* aParentFootprint, TEXT_TYPE text_type = TEXT_is_DIVERS );
// Do not create a copy constructor & operator=. // Do not create a copy constructor & operator=.
// The ones generated by the compiler are adequate. // The ones generated by the compiler are adequate.
@ -119,7 +119,7 @@ public:
/// (for instance in footprint rotation transform) /// (for instance in footprint rotation transform)
void Rotate( const wxPoint& aOffset, double aAngle ) override; void Rotate( const wxPoint& aOffset, double aAngle ) override;
/// Flip entity during module flip /// Flip entity during footprint flip
void Flip( const wxPoint& aCentre, bool aFlipLeftRight ) override; void Flip( const wxPoint& aCentre, bool aFlipLeftRight ) override;
bool IsParentFlipped() const; bool IsParentFlipped() const;
@ -161,7 +161,7 @@ public:
// std::swap( m_Type, aTradingPartner.m_Type ); // std::swap( m_Type, aTradingPartner.m_Type );
} }
// The Pos0 accessors are for module-relative coordinates // The Pos0 accessors are for footprint-relative coordinates
void SetPos0( const wxPoint& aPos ) { m_Pos0 = aPos; SetDrawCoord(); } void SetPos0( const wxPoint& aPos ) { m_Pos0 = aPos; SetDrawCoord(); }
const wxPoint& GetPos0() const { return m_Pos0; } const wxPoint& GetPos0() const { return m_Pos0; }

View File

@ -477,17 +477,17 @@ const EDA_RECT PAD::GetBoundingBox() const
void PAD::SetDrawCoord() void PAD::SetDrawCoord()
{ {
MODULE* module = (MODULE*) m_Parent; MODULE* parentFootprint = (MODULE*) m_Parent;
m_pos = m_pos0; m_pos = m_pos0;
if( module == NULL ) if( parentFootprint == NULL )
return; return;
double angle = module->GetOrientation(); double angle = parentFootprint->GetOrientation();
RotatePoint( &m_pos.x, &m_pos.y, angle ); RotatePoint( &m_pos.x, &m_pos.y, angle );
m_pos += module->GetPosition(); m_pos += parentFootprint->GetPosition();
m_shapesDirty = true; m_shapesDirty = true;
} }
@ -495,16 +495,16 @@ void PAD::SetDrawCoord()
void PAD::SetLocalCoord() void PAD::SetLocalCoord()
{ {
MODULE* module = (MODULE*) m_Parent; MODULE* parentFootprint = (MODULE*) m_Parent;
if( module == NULL ) if( parentFootprint == NULL )
{ {
m_pos0 = m_pos; m_pos0 = m_pos;
return; return;
} }
m_pos0 = m_pos - module->GetPosition(); m_pos0 = m_pos - parentFootprint->GetPosition();
RotatePoint( &m_pos0.x, &m_pos0.y, -module->GetOrientation() ); RotatePoint( &m_pos0.x, &m_pos0.y, -parentFootprint->GetOrientation() );
} }
@ -658,14 +658,14 @@ int PAD::GetSolderMaskMargin() const
int margin = m_localSolderMaskMargin; int margin = m_localSolderMaskMargin;
MODULE* module = GetParent(); MODULE* parentFootprint = GetParent();
if( module ) if( parentFootprint )
{ {
if( margin == 0 ) if( margin == 0 )
{ {
if( module->GetLocalSolderMaskMargin() ) if( parentFootprint->GetLocalSolderMaskMargin() )
margin = module->GetLocalSolderMaskMargin(); margin = parentFootprint->GetLocalSolderMaskMargin();
} }
if( margin == 0 ) if( margin == 0 )
@ -704,12 +704,12 @@ wxSize PAD::GetSolderPasteMargin() const
int margin = m_localSolderPasteMargin; int margin = m_localSolderPasteMargin;
double mratio = m_localSolderPasteMarginRatio; double mratio = m_localSolderPasteMarginRatio;
MODULE* module = GetParent(); MODULE* parentFootprint = GetParent();
if( module ) if( parentFootprint )
{ {
if( margin == 0 ) if( margin == 0 )
margin = module->GetLocalSolderPasteMargin(); margin = parentFootprint->GetLocalSolderPasteMargin();
auto brd = GetBoard(); auto brd = GetBoard();
@ -717,7 +717,7 @@ wxSize PAD::GetSolderPasteMargin() const
margin = brd->GetDesignSettings().m_SolderPasteMargin; margin = brd->GetDesignSettings().m_SolderPasteMargin;
if( mratio == 0.0 ) if( mratio == 0.0 )
mratio = module->GetLocalSolderPasteMarginRatio(); mratio = parentFootprint->GetLocalSolderPasteMarginRatio();
if( mratio == 0.0 && brd ) if( mratio == 0.0 && brd )
{ {
@ -742,14 +742,14 @@ wxSize PAD::GetSolderPasteMargin() const
ZONE_CONNECTION PAD::GetEffectiveZoneConnection( wxString* aSource ) const ZONE_CONNECTION PAD::GetEffectiveZoneConnection( wxString* aSource ) const
{ {
MODULE* module = GetParent(); MODULE* parentFootprint = GetParent();
if( m_zoneConnection == ZONE_CONNECTION::INHERITED && module ) if( m_zoneConnection == ZONE_CONNECTION::INHERITED && parentFootprint )
{ {
if( aSource ) if( aSource )
*aSource = _( "parent footprint" ); *aSource = _( "parent footprint" );
return module->GetZoneConnection(); return parentFootprint->GetZoneConnection();
} }
else else
{ {
@ -763,14 +763,14 @@ ZONE_CONNECTION PAD::GetEffectiveZoneConnection( wxString* aSource ) const
int PAD::GetEffectiveThermalSpokeWidth( wxString* aSource ) const int PAD::GetEffectiveThermalSpokeWidth( wxString* aSource ) const
{ {
MODULE* module = GetParent(); MODULE* parentFootprint = GetParent();
if( m_thermalWidth == 0 && module ) if( m_thermalWidth == 0 && parentFootprint )
{ {
if( aSource ) if( aSource )
*aSource = _( "parent footprint" ); *aSource = _( "parent footprint" );
return module->GetThermalWidth(); return parentFootprint->GetThermalWidth();
} }
if( aSource ) if( aSource )
@ -782,14 +782,14 @@ int PAD::GetEffectiveThermalSpokeWidth( wxString* aSource ) const
int PAD::GetEffectiveThermalGap( wxString* aSource ) const int PAD::GetEffectiveThermalGap( wxString* aSource ) const
{ {
MODULE* module = GetParent(); MODULE* parentFootprint = GetParent();
if( m_thermalGap == 0 && module ) if( m_thermalGap == 0 && parentFootprint )
{ {
if( aSource ) if( aSource )
*aSource = _( "parent footprint" ); *aSource = _( "parent footprint" );
return module->GetThermalGap(); return parentFootprint->GetThermalGap();
} }
if( aSource ) if( aSource )
@ -805,10 +805,10 @@ void PAD::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>&
wxString msg, msg2; wxString msg, msg2;
BOARD* board = GetBoard(); BOARD* board = GetBoard();
BOARD_DESIGN_SETTINGS& bds = board->GetDesignSettings(); BOARD_DESIGN_SETTINGS& bds = board->GetDesignSettings();
MODULE* module = (MODULE*) m_Parent; MODULE* parentFootprint = (MODULE*) m_Parent;
if( module ) if( parentFootprint )
aList.emplace_back( _( "Footprint" ), module->GetReference(), DARKCYAN ); aList.emplace_back( _( "Footprint" ), parentFootprint->GetReference(), DARKCYAN );
aList.emplace_back( _( "Pad" ), m_name, BROWN ); aList.emplace_back( _( "Pad" ), m_name, BROWN );
@ -862,12 +862,12 @@ void PAD::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>&
aList.emplace_back( _( "Height" ), msg, RED ); aList.emplace_back( _( "Height" ), msg, RED );
} }
double module_orient_degrees = module ? module->GetOrientationDegrees() : 0; double fp_orient_degrees = parentFootprint ? parentFootprint->GetOrientationDegrees() : 0;
double pad_orient_degrees = GetOrientationDegrees() - module_orient_degrees; double pad_orient_degrees = GetOrientationDegrees() - fp_orient_degrees;
pad_orient_degrees = NormalizeAngleDegrees( pad_orient_degrees, -180.0, +180.0 ); pad_orient_degrees = NormalizeAngleDegrees( pad_orient_degrees, -180.0, +180.0 );
if( module_orient_degrees != 0.0 ) if( fp_orient_degrees != 0.0 )
msg.Printf( wxT( "%.4g(+ %.4g)" ), pad_orient_degrees, module_orient_degrees ); msg.Printf( wxT( "%.4g(+ %.4g)" ), pad_orient_degrees, fp_orient_degrees );
else else
msg.Printf( wxT( "%.4g" ), GetOrientationDegrees() ); msg.Printf( wxT( "%.4g" ), GetOrientationDegrees() );

View File

@ -457,7 +457,7 @@ public:
/** /**
* Return the zone connection in effect (either locally overridden or overridden in the * Return the zone connection in effect (either locally overridden or overridden in the
* parent module). * parent footprint).
* Optionally reports on the source of the property (pad, parent footprint or zone). * Optionally reports on the source of the property (pad, parent footprint or zone).
*/ */
ZONE_CONNECTION GetEffectiveZoneConnection( wxString* aSource = nullptr ) const; ZONE_CONNECTION GetEffectiveZoneConnection( wxString* aSource = nullptr ) const;
@ -706,7 +706,7 @@ private:
// to have a single axis be non-0. // to have a single axis be non-0.
wxPoint m_pos0; // Initial Pad position (i.e. pad position relative to the wxPoint m_pos0; // Initial Pad position (i.e. pad position relative to the
// module anchor, orientation 0) // footprint anchor, orientation 0)
PAD_ATTR_T m_attribute; // PAD_ATTRIB_NORMAL, PAD_ATTRIB_SMD, PAD_ATTRIB_CONN, PAD_ATTR_T m_attribute; // PAD_ATTRIB_NORMAL, PAD_ATTRIB_SMD, PAD_ATTRIB_CONN,
// PAD_ATTRIB_NPTH // PAD_ATTRIB_NPTH

View File

@ -152,23 +152,23 @@ void PCB_BASE_FRAME::SetBoard( BOARD* aBoard )
} }
void PCB_BASE_FRAME::AddFootprintToBoard( MODULE* module ) void PCB_BASE_FRAME::AddFootprintToBoard( MODULE* aFootprint )
{ {
if( module ) if( aFootprint )
{ {
GetBoard()->Add( module, ADD_MODE::APPEND ); GetBoard()->Add( aFootprint, ADD_MODE::APPEND );
module->SetFlags( IS_NEW ); aFootprint->SetFlags(IS_NEW );
module->SetPosition( wxPoint( 0, 0 ) ); // cursor in GAL may not be initialized yet aFootprint->SetPosition( wxPoint( 0, 0 ) ); // cursor in GAL may not be initialized yet
// Put it on FRONT layer (note that it might be stored flipped if the lib is an archive // Put it on FRONT layer (note that it might be stored flipped if the lib is an archive
// built from a board) // built from a board)
if( module->IsFlipped() ) if( aFootprint->IsFlipped() )
module->Flip( module->GetPosition(), m_settings->m_FlipLeftRight ); aFootprint->Flip( aFootprint->GetPosition(), m_settings->m_FlipLeftRight );
// Place it in orientation 0 even if it is not saved with orientation 0 in lib (note that // Place it in orientation 0 even if it is not saved with orientation 0 in lib (note that
// it might be stored in another orientation if the lib is an archive built from a board) // it might be stored in another orientation if the lib is an archive built from a board)
module->SetOrientation( 0 ); aFootprint->SetOrientation( 0 );
} }
} }

View File

@ -189,19 +189,19 @@ void PCB_DRAW_PANEL_GAL::DisplayBoard( BOARD* aBoard )
m_worksheet->SetFileName( TO_UTF8( aBoard->GetFileName() ) ); m_worksheet->SetFileName( TO_UTF8( aBoard->GetFileName() ) );
// Load drawings // Load drawings
for( auto drawing : const_cast<BOARD*>(aBoard)->Drawings() ) for( BOARD_ITEM* drawing : aBoard->Drawings() )
m_view->Add( drawing ); m_view->Add( drawing );
// Load tracks // Load tracks
for( auto track : aBoard->Tracks() ) for( TRACK* track : aBoard->Tracks() )
m_view->Add( track ); m_view->Add( track );
// Load footprints and its additional elements // Load footprints and its additional elements
for( auto module : aBoard->Footprints() ) for( MODULE* footprint : aBoard->Footprints() )
m_view->Add( module ); m_view->Add( footprint );
// DRC markers // DRC markers
for( auto marker : aBoard->Markers() ) for( MARKER_PCB* marker : aBoard->Markers() )
m_view->Add( marker ); m_view->Add( marker );
// Finalize the triangulation threads // Finalize the triangulation threads
@ -209,7 +209,7 @@ void PCB_DRAW_PANEL_GAL::DisplayBoard( BOARD* aBoard )
std::this_thread::sleep_for( std::chrono::milliseconds( 10 ) ); std::this_thread::sleep_for( std::chrono::milliseconds( 10 ) );
// Load zones // Load zones
for( auto zone : aBoard->Zones() ) for( ZONE* zone : aBoard->Zones() )
m_view->Add( zone ); m_view->Add( zone );
// Ratsnest // Ratsnest

View File

@ -322,9 +322,9 @@ static void insideArea( LIBEVAL::CONTEXT* aCtx, void* self )
} }
} }
for( MODULE* module : item->GetBoard()->Footprints() ) for( MODULE* footprint : item->GetBoard()->Footprints() )
{ {
for( ZONE* candidate : module->Zones() ) for( ZONE* candidate : footprint->Zones() )
{ {
// Only a single zone can match the UUID; exit once we find a match whether // Only a single zone can match the UUID; exit once we find a match whether
// "inside" or not // "inside" or not
@ -353,9 +353,9 @@ static void insideArea( LIBEVAL::CONTEXT* aCtx, void* self )
} }
} }
for( MODULE* module : item->GetBoard()->Footprints() ) for( MODULE* footprint : item->GetBoard()->Footprints() )
{ {
for( ZONE* candidate : module->Zones() ) for( ZONE* candidate : footprint->Zones() )
{ {
// Many zones can match the name; exit only when we find an "inside" // Many zones can match the name; exit only when we find an "inside"
if( candidate->GetZoneName().Matches( arg->AsString() ) ) if( candidate->GetZoneName().Matches( arg->AsString() ) )

View File

@ -580,17 +580,17 @@ const EDA_RECT PCB_SHAPE::GetBoundingBox() const
if( m_Poly.IsEmpty() ) if( m_Poly.IsEmpty() )
break; break;
MODULE* module = GetParentFootprint(); MODULE* parentFootprint = GetParentFootprint();
bbox = EDA_RECT(); // re-init for merging bbox = EDA_RECT(); // re-init for merging
for( auto iter = m_Poly.CIterate(); iter; iter++ ) for( auto iter = m_Poly.CIterate(); iter; iter++ )
{ {
wxPoint pt( iter->x, iter->y ); wxPoint pt( iter->x, iter->y );
if( module ) // Transform, if we belong to a module if( parentFootprint ) // Transform, if we belong to a footprint
{ {
RotatePoint( &pt, module->GetOrientation() ); RotatePoint( &pt, parentFootprint->GetOrientation() );
pt += module->GetPosition(); pt += parentFootprint->GetPosition();
} }
bbox.Merge( pt ); bbox.Merge( pt );
@ -942,18 +942,18 @@ const BOX2I PCB_SHAPE::ViewBBox() const
std::vector<wxPoint> PCB_SHAPE::GetRectCorners() const std::vector<wxPoint> PCB_SHAPE::GetRectCorners() const
{ {
std::vector<wxPoint> pts; std::vector<wxPoint> pts;
MODULE* module = GetParentFootprint(); MODULE* parentFootprint = GetParentFootprint();
wxPoint topLeft = GetStart(); wxPoint topLeft = GetStart();
wxPoint botRight = GetEnd(); wxPoint botRight = GetEnd();
// Un-rotate rect topLeft and botRight // Un-rotate rect topLeft and botRight
if( module && KiROUND( module->GetOrientation() ) % 900 != 0 ) if( parentFootprint && KiROUND( parentFootprint->GetOrientation() ) % 900 != 0 )
{ {
topLeft -= module->GetPosition(); topLeft -= parentFootprint->GetPosition();
RotatePoint( &topLeft, -module->GetOrientation() ); RotatePoint( &topLeft, -parentFootprint->GetOrientation() );
botRight -= module->GetPosition(); botRight -= parentFootprint->GetPosition();
RotatePoint( &botRight, -module->GetOrientation() ); RotatePoint( &botRight, -parentFootprint->GetOrientation() );
} }
// Set up the un-rotated 4 corners // Set up the un-rotated 4 corners
@ -963,12 +963,12 @@ std::vector<wxPoint> PCB_SHAPE::GetRectCorners() const
pts.emplace_back( topLeft.x, botRight.y ); pts.emplace_back( topLeft.x, botRight.y );
// Now re-rotate the 4 corners to get a diamond // Now re-rotate the 4 corners to get a diamond
if( module && KiROUND( module->GetOrientation() ) % 900 != 0 ) if( parentFootprint && KiROUND( parentFootprint->GetOrientation() ) % 900 != 0 )
{ {
for( wxPoint& pt : pts ) for( wxPoint& pt : pts )
{ {
RotatePoint( &pt,module->GetOrientation() ); RotatePoint( &pt, parentFootprint->GetOrientation() );
pt += module->GetPosition(); pt += parentFootprint->GetPosition();
} }
} }

View File

@ -219,9 +219,9 @@ public:
/** /**
* Function GetParentFootprint * Function GetParentFootprint
* returns a pointer to the parent module, or NULL if PCB_SHAPE does not * returns a pointer to the parent footprint, or NULL if PCB_SHAPE does not
* belong to a module. * belong to a footprint.
* @return MODULE* - pointer to the parent module or NULL. * @return MODULE* - pointer to the parent footprint or NULL.
*/ */
MODULE* GetParentFootprint() const; MODULE* GetParentFootprint() const;

View File

@ -395,7 +395,7 @@ PCBNEW_SETTINGS::PCBNEW_SETTINGS()
&m_FootprintWizardList.height, -1 ) ); &m_FootprintWizardList.height, -1 ) );
m_params.emplace_back( new PARAM<bool>( m_params.emplace_back( new PARAM<bool>(
"reannotate_dialog.annotate_sort_on_modules", &m_Reannotate.sort_on_module_location, true ) ); "reannotate_dialog.annotate_sort_on_modules", &m_Reannotate.sort_on_fp_location, true ) );
m_params.emplace_back( new PARAM<bool>( m_params.emplace_back( new PARAM<bool>(
"reannotate_dialog.annotate_remove_front_prefix", &m_Reannotate.remove_front_prefix, false ) ); "reannotate_dialog.annotate_remove_front_prefix", &m_Reannotate.remove_front_prefix, false ) );
m_params.emplace_back( new PARAM<bool>( m_params.emplace_back( new PARAM<bool>(

View File

@ -191,7 +191,7 @@ public:
struct DIALOG_REANNOTATE struct DIALOG_REANNOTATE
{ {
bool sort_on_module_location; bool sort_on_fp_location;
bool remove_front_prefix; bool remove_front_prefix;
bool remove_back_prefix; bool remove_back_prefix;
bool update_schematic; bool update_schematic;

View File

@ -622,7 +622,7 @@ void BRDITEMS_PLOTTER::PlotFootprintGraphicItem( FP_SHAPE* aShape )
// We must compute board coordinates from m_PolyList which are relative to the parent // We must compute board coordinates from m_PolyList which are relative to the parent
// position at orientation 0 // position at orientation 0
MODULE *module = aShape->GetParentFootprint(); MODULE *parentFootprint = aShape->GetParentFootprint();
std::vector<wxPoint> cornerList; std::vector<wxPoint> cornerList;
@ -630,10 +630,10 @@ void BRDITEMS_PLOTTER::PlotFootprintGraphicItem( FP_SHAPE* aShape )
for( wxPoint corner : polyPoints ) for( wxPoint corner : polyPoints )
{ {
if( module ) if( parentFootprint )
{ {
RotatePoint( &corner, module->GetOrientation() ); RotatePoint( &corner, parentFootprint->GetOrientation() );
corner += module->GetPosition(); corner += parentFootprint->GetPosition();
} }
cornerList.push_back( corner ); cornerList.push_back( corner );

View File

@ -194,19 +194,19 @@ void PCB_BASE_EDIT_FRAME::SaveCopyInUndoList( const PICKED_ITEMS_LIST& aItemsLis
commandToUndo->m_TransformPoint = aTransformPoint; commandToUndo->m_TransformPoint = aTransformPoint;
// First, filter unnecessary stuff from the list (i.e. for multiple pads / labels modified), // First, filter unnecessary stuff from the list (i.e. for multiple pads / labels modified),
// take the first occurence of the module (we save copies of footprints when one of its subitems // take the first occurence of the footprint (we save copies of footprints when one of its
// is changed). // subitems is changed).
for( unsigned ii = 0; ii < aItemsList.GetCount(); ii++ ) for( unsigned ii = 0; ii < aItemsList.GetCount(); ii++ )
{ {
ITEM_PICKER curr_picker = aItemsList.GetItemWrapper(ii); ITEM_PICKER curr_picker = aItemsList.GetItemWrapper(ii);
BOARD_ITEM* item = dynamic_cast<BOARD_ITEM*>( aItemsList.GetPickedItem( ii ) ); BOARD_ITEM* item = dynamic_cast<BOARD_ITEM*>( aItemsList.GetPickedItem( ii ) );
// For items belonging to footprints, we need to save state of the parent module // For items belonging to footprints, we need to save state of the parent footprint
if( item && item->GetParent() && item->GetParent()->Type() == PCB_MODULE_T ) if( item && item->GetParent() && item->GetParent()->Type() == PCB_MODULE_T )
{ {
item = item->GetParent(); item = item->GetParent();
// Check if the parent module has already been saved in another entry // Check if the parent footprint has already been saved in another entry
bool found = false; bool found = false;
for( unsigned j = 0; j < commandToUndo->GetCount(); j++ ) for( unsigned j = 0; j < commandToUndo->GetCount(); j++ )
@ -221,7 +221,7 @@ void PCB_BASE_EDIT_FRAME::SaveCopyInUndoList( const PICKED_ITEMS_LIST& aItemsLis
if( !found ) if( !found )
{ {
// Create a clean copy of the parent module // Create a clean copy of the parent footprint
MODULE* orig = static_cast<MODULE*>( item ); MODULE* orig = static_cast<MODULE*>( item );
MODULE* clone = new MODULE( *orig ); MODULE* clone = new MODULE( *orig );
clone->SetParent( GetBoard() ); clone->SetParent( GetBoard() );

View File

@ -119,15 +119,15 @@ bool ZONE_FILLER::Fill( std::vector<ZONE*>& aZones, bool aCheck, wxWindow* aPare
m_worstClearance = std::max( m_worstClearance, zone->GetLocalClearance() ); m_worstClearance = std::max( m_worstClearance, zone->GetLocalClearance() );
} }
for( MODULE* module : m_board->Footprints() ) for( MODULE* footprint : m_board->Footprints() )
{ {
for( PAD* pad : module->Pads() ) for( PAD* pad : footprint->Pads() )
{ {
if( pad->IsDirty() ) if( pad->IsDirty() )
pad->BuildEffectiveShapes( UNDEFINED_LAYER ); pad->BuildEffectiveShapes( UNDEFINED_LAYER );
} }
for( ZONE* zone : module->Zones() ) for( ZONE* zone : footprint->Zones() )
{ {
zone->CacheBoundingBox(); zone->CacheBoundingBox();
m_worstClearance = std::max( m_worstClearance, zone->GetLocalClearance() ); m_worstClearance = std::max( m_worstClearance, zone->GetLocalClearance() );
@ -615,9 +615,9 @@ void ZONE_FILLER::knockoutThermalReliefs( const ZONE* aZone, PCB_LAYER_ID aLayer
{ {
SHAPE_POLY_SET holes; SHAPE_POLY_SET holes;
for( MODULE* module : m_board->Footprints() ) for( MODULE* footprint : m_board->Footprints() )
{ {
for( PAD* pad : module->Pads() ) for( PAD* pad : footprint->Pads() )
{ {
if( !hasThermalConnection( pad, aZone ) ) if( !hasThermalConnection( pad, aZone ) )
continue; continue;
@ -729,9 +729,9 @@ void ZONE_FILLER::buildCopperItemClearances( const ZONE* aZone, PCB_LAYER_ID aLa
} }
}; };
for( MODULE* module : m_board->Footprints() ) for( MODULE* footprint : m_board->Footprints() )
{ {
for( PAD* pad : module->Pads() ) for( PAD* pad : footprint->Pads() )
{ {
if( checkForCancel( m_progressReporter ) ) if( checkForCancel( m_progressReporter ) )
return; return;
@ -818,12 +818,12 @@ void ZONE_FILLER::buildCopperItemClearances( const ZONE* aZone, PCB_LAYER_ID aLa
} }
}; };
for( MODULE* module : m_board->Footprints() ) for( MODULE* footprint : m_board->Footprints() )
{ {
knockoutGraphicClearance( &module->Reference() ); knockoutGraphicClearance( &footprint->Reference() );
knockoutGraphicClearance( &module->Value() ); knockoutGraphicClearance( &footprint->Value() );
for( BOARD_ITEM* item : module->GraphicalItems() ) for( BOARD_ITEM* item : footprint->GraphicalItems() )
{ {
if( checkForCancel( m_progressReporter ) ) if( checkForCancel( m_progressReporter ) )
return; return;
@ -895,9 +895,9 @@ void ZONE_FILLER::buildCopperItemClearances( const ZONE* aZone, PCB_LAYER_ID aLa
} }
} }
for( MODULE* module : m_board->Footprints() ) for( MODULE* footprint : m_board->Footprints() )
{ {
for( ZONE* otherZone : module->Zones() ) for( ZONE* otherZone : footprint->Zones() )
{ {
if( checkForCancel( m_progressReporter ) ) if( checkForCancel( m_progressReporter ) )
return; return;
@ -947,9 +947,9 @@ void ZONE_FILLER::subtractHigherPriorityZones( const ZONE* aZone, PCB_LAYER_ID a
} }
} }
for( MODULE* module : m_board->Footprints() ) for( MODULE* footprint : m_board->Footprints() )
{ {
for( ZONE* otherZone : module->Zones() ) for( ZONE* otherZone : footprint->Zones() )
{ {
if( otherZone->GetNetCode() == aZone->GetNetCode() if( otherZone->GetNetCode() == aZone->GetNetCode()
&& otherZone->GetPriority() > aZone->GetPriority() ) && otherZone->GetPriority() > aZone->GetPriority() )
@ -1248,9 +1248,9 @@ void ZONE_FILLER::buildThermalSpokes( const ZONE* aZone, PCB_LAYER_ID aLayer,
// us avoid the question. // us avoid the question.
int epsilon = KiROUND( IU_PER_MM * 0.04 ); // about 1.5 mil int epsilon = KiROUND( IU_PER_MM * 0.04 ); // about 1.5 mil
for( auto module : m_board->Footprints() ) for( MODULE* footprint : m_board->Footprints() )
{ {
for( auto pad : module->Pads() ) for( PAD* pad : footprint->Pads() )
{ {
if( !hasThermalConnection( pad, aZone ) ) if( !hasThermalConnection( pad, aZone ) )
continue; continue;
@ -1530,9 +1530,9 @@ bool ZONE_FILLER::addHatchFillTypeOnZone( const ZONE* aZone, PCB_LAYER_ID aLayer
} }
} }
for( MODULE* module : m_board->Footprints() ) for( MODULE* footprint : m_board->Footprints() )
{ {
for( PAD* pad : module->Pads() ) for( PAD* pad : footprint->Pads() )
{ {
if( pad->GetNetCode() == aZone->GetNetCode() if( pad->GetNetCode() == aZone->GetNetCode()
&& pad->IsOnLayer( aLayer ) && pad->IsOnLayer( aLayer )