mirror of
https://gitlab.com/kicad/code/kicad.git
synced 2025-09-14 02:03:12 +02:00
435 lines
15 KiB
C++
435 lines
15 KiB
C++
/*
|
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
|
*
|
|
* Copyright The KiCad Developers, see AUTHORS.txt for contributors.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, you may find one here:
|
|
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
|
* or you may search the http://www.gnu.org website for the version 2 license,
|
|
* or you may write to the Free Software Foundation, Inc.,
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
|
*/
|
|
|
|
|
|
#ifndef PANEL_ASSIGN_COMPONENT_CLASSES_H
|
|
#define PANEL_ASSIGN_COMPONENT_CLASSES_H
|
|
|
|
|
|
#include <panel_assign_component_classes_base.h>
|
|
|
|
#include <unordered_set>
|
|
#include <vector>
|
|
|
|
#include <dialog_shim.h>
|
|
#include <pcb_edit_frame.h>
|
|
#include <project/component_class_settings.h>
|
|
|
|
|
|
/**************************************************************************************************
|
|
*
|
|
* PANEL_ASSIGN_COMPONENT_CLASSES
|
|
*
|
|
*************************************************************************************************/
|
|
|
|
/**
|
|
* Top-level panel for dynamic component class assignment configuration. Nests a
|
|
* PANEL_COMPONENT_CLASS_ASSIGNMENT panel for each set of component class assignment conditions
|
|
*/
|
|
class PANEL_COMPONENT_CLASS_ASSIGNMENT;
|
|
|
|
class PANEL_ASSIGN_COMPONENT_CLASSES : public PANEL_ASSIGN_COMPONENT_CLASSES_BASE
|
|
{
|
|
public:
|
|
PANEL_ASSIGN_COMPONENT_CLASSES( wxWindow* aParentWindow, PCB_EDIT_FRAME* aFrame,
|
|
std::shared_ptr<COMPONENT_CLASS_SETTINGS> aSettings,
|
|
DIALOG_SHIM* aDlg );
|
|
|
|
~PANEL_ASSIGN_COMPONENT_CLASSES() override;
|
|
|
|
/// Loads current component class assignments from the board settings
|
|
bool TransferDataToWindow() override;
|
|
|
|
/// Saves the component class assignments to the board settings
|
|
bool TransferDataFromWindow() override;
|
|
|
|
/// Loads component class assignments from the given settings object
|
|
void ImportSettingsFrom( const std::shared_ptr<COMPONENT_CLASS_SETTINGS>& aOtherSettings );
|
|
|
|
/// Adds a new component class assignment rule
|
|
void OnAddAssignmentClick( wxCommandEvent& event ) override;
|
|
|
|
/// Removes a given component class assignment rule
|
|
void RemoveAssignment( PANEL_COMPONENT_CLASS_ASSIGNMENT* aPanel );
|
|
|
|
/// Returns references for all currently selected footprints
|
|
const std::vector<wxString>& GetSelectionRefs() const { return m_selectionRefs; }
|
|
|
|
/// Returns names of all fields present in footprints
|
|
const std::vector<wxString>& GetFieldNames() const { return m_fieldNames; }
|
|
|
|
/// Returns names of all sheets present in footprints
|
|
const std::vector<wxString>& GetSheetNames() const { return m_sheetNames; }
|
|
|
|
/// Gets the active edit frame
|
|
PCB_EDIT_FRAME* GetFrame() const { return m_frame; }
|
|
|
|
/// Validates that all assignment rules can compile successfully
|
|
bool Validate() override;
|
|
|
|
private:
|
|
/// Adds a new component class assignment rule
|
|
PANEL_COMPONENT_CLASS_ASSIGNMENT* addAssignment();
|
|
|
|
/// Scrolls the panel to specified assignment rule
|
|
void scrollToAssignment( const PANEL_COMPONENT_CLASS_ASSIGNMENT* aAssignment ) const;
|
|
|
|
/// The parent dialog
|
|
DIALOG_SHIM* m_dlg;
|
|
|
|
/// The active edit frame
|
|
PCB_EDIT_FRAME* m_frame;
|
|
|
|
/// Vector of all currently displayed assignment rules
|
|
std::vector<PANEL_COMPONENT_CLASS_ASSIGNMENT*> m_assignments;
|
|
|
|
/// The active settings object
|
|
std::shared_ptr<COMPONENT_CLASS_SETTINGS> m_componentClassSettings;
|
|
|
|
/// All currently selected footprint references
|
|
std::vector<wxString> m_selectionRefs;
|
|
|
|
/// All footprint fields names present on the board
|
|
std::vector<wxString> m_fieldNames;
|
|
|
|
/// All sheet names present on the board
|
|
std::vector<wxString> m_sheetNames;
|
|
|
|
/// The list of all currently present component class assignments
|
|
wxBoxSizer* m_assignmentsList;
|
|
};
|
|
|
|
|
|
/**************************************************************************************************
|
|
*
|
|
* CONDITION_DATA
|
|
*
|
|
*************************************************************************************************/
|
|
|
|
/**
|
|
* Class used to provide a unified interface from condition panels
|
|
* Handles determining the type of condition in use, and getting and settings the field data
|
|
*/
|
|
class CONDITION_DATA
|
|
{
|
|
public:
|
|
CONDITION_DATA( const COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE aCondition,
|
|
wxTextEntry* aPrimary, wxTextEntry* aSecondary = nullptr ) :
|
|
m_conditionType( aCondition ), m_primaryCtrl( aPrimary ), m_secondaryCtrl( aSecondary )
|
|
{
|
|
}
|
|
|
|
virtual ~CONDITION_DATA() {};
|
|
|
|
/// Gets the type of condition (e.g. Reference, Side) this data represents
|
|
virtual COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE GetConditionType() const
|
|
{
|
|
return m_conditionType;
|
|
}
|
|
|
|
/// Gets the primary data member for the condition (e.g. Reference, Side)
|
|
virtual wxString GetPrimaryField() const;
|
|
|
|
/// Sets the primary data member for the condition (e.g. Reference, Side)
|
|
virtual void SetPrimaryField( const wxString& aVal );
|
|
|
|
/// Gets the primary data member for the condition (e.g. FOOTPRITNT field value)
|
|
virtual wxString GetSecondaryField() const;
|
|
|
|
/// Sets the primary data member for the condition (e.g. FOOTPRITNT field
|
|
/// value)
|
|
virtual void SetSecondaryField( const wxString& aVal );
|
|
|
|
private:
|
|
/// The type of condition being referenced
|
|
COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE m_conditionType;
|
|
|
|
/// The primary data field in the condition panel
|
|
wxTextEntry* m_primaryCtrl;
|
|
|
|
/// The Secondary data field in the condition panel
|
|
wxTextEntry* m_secondaryCtrl;
|
|
};
|
|
|
|
|
|
/**************************************************************************************************
|
|
*
|
|
* PANEL_COMPONENT_CLASS_ASSIGNMENT
|
|
*
|
|
*************************************************************************************************/
|
|
|
|
/**
|
|
* Panel which configures a set of conditions for a component class assignment rule
|
|
*/
|
|
class PANEL_COMPONENT_CLASS_ASSIGNMENT : public PANEL_COMPONENT_CLASS_ASSIGNMENT_BASE
|
|
{
|
|
public:
|
|
/// IDs for match type popup menu
|
|
enum ADD_MATCH_POPUP
|
|
{
|
|
ID_REFERENCE = wxID_HIGHEST + 1,
|
|
ID_FOOTPRINT,
|
|
ID_SIDE,
|
|
ID_ROTATION,
|
|
ID_FOOTPRINT_FIELD,
|
|
ID_SHEET_NAME,
|
|
ID_CUSTOM
|
|
};
|
|
|
|
PANEL_COMPONENT_CLASS_ASSIGNMENT( wxWindow* aParent,
|
|
PANEL_ASSIGN_COMPONENT_CLASSES* aPanelParent,
|
|
DIALOG_SHIM* aDlg );
|
|
~PANEL_COMPONENT_CLASS_ASSIGNMENT();
|
|
|
|
/// Deletes this component class assignment rule
|
|
void OnDeleteAssignmentClick( wxCommandEvent& event ) override;
|
|
|
|
/// Adds a match condition to this component class assignment rule
|
|
void OnAddConditionClick( wxCommandEvent& event ) override;
|
|
|
|
/// Highlights footprints matching this set of conditions
|
|
void OnHighlightItemsClick( wxCommandEvent& event ) override;
|
|
|
|
/// Adds a condition to this component class assignment rule
|
|
CONDITION_DATA* AddCondition( COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE aCondition );
|
|
|
|
/// Removes a given condition from this component class assignment rule (note: called from the child
|
|
/// condition panel)
|
|
void RemoveCondition( wxPanel* aMatch );
|
|
|
|
const std::vector<CONDITION_DATA*>& GetConditions() const { return m_matches; }
|
|
|
|
/// Sets the resulting component class for this assignment
|
|
void SetComponentClass( const wxString& aComponentClass ) const;
|
|
|
|
/// Gets the resulting component class for this assignment
|
|
const wxString GetComponentClass() const;
|
|
|
|
/// Sets the boolean operator applied to all assignment conditions
|
|
void
|
|
SetConditionsOperator( COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITIONS_OPERATOR aCondition ) const;
|
|
|
|
/// Gets the boolean operator applied to all assignment conditions
|
|
COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITIONS_OPERATOR GetConditionsOperator() const;
|
|
|
|
/// Converts the UI representation in to the internal assignment data representation
|
|
COMPONENT_CLASS_ASSIGNMENT_DATA GenerateAssignmentData() const;
|
|
|
|
protected:
|
|
/// Handles add match condition popup menu selections
|
|
void onMenu( wxCommandEvent& aEvent );
|
|
|
|
/// The top-level configuration panel which owns this assignment rule
|
|
PANEL_ASSIGN_COMPONENT_CLASSES* m_parentPanel;
|
|
|
|
/// The sizer containing match condition panels
|
|
wxStaticBoxSizer* m_matchesList;
|
|
|
|
/// Set containing all currently configured match condition types
|
|
std::unordered_set<COMPONENT_CLASS_ASSIGNMENT_DATA::CONDITION_TYPE> m_conditionTypes;
|
|
|
|
/// The parent configuration dialog
|
|
DIALOG_SHIM* m_dlg;
|
|
|
|
/// All match conditions for this component class assignment rule
|
|
std::vector<CONDITION_DATA*> m_matches;
|
|
};
|
|
|
|
|
|
/**************************************************************************************************
|
|
*
|
|
* PANEL_COMPONENT_CLASS_CONDITION_REFERENCE
|
|
*
|
|
*************************************************************************************************/
|
|
|
|
/**
|
|
* Configures matching based on footprint reference
|
|
*/
|
|
class PANEL_COMPONENT_CLASS_CONDITION_REFERENCE
|
|
: public PANEL_COMPONENT_CLASS_CONDITION_REFERENCE_BASE,
|
|
public CONDITION_DATA
|
|
{
|
|
public:
|
|
/// IDs for match type popup menu
|
|
enum IMPORT_POPUP_IDS
|
|
{
|
|
ID_IMPORT_REFS = wxID_HIGHEST + 1
|
|
};
|
|
|
|
explicit PANEL_COMPONENT_CLASS_CONDITION_REFERENCE( wxWindow* aParent );
|
|
|
|
void OnDeleteConditionClick( wxCommandEvent& event ) override;
|
|
|
|
void OnImportRefsClick( wxCommandEvent& event ) override;
|
|
void SetSelectionRefs( const std::vector<wxString>& aRefs ) { m_selectionRefs = aRefs; }
|
|
|
|
protected:
|
|
/// Handles import references popup menu selections
|
|
void onMenu( wxCommandEvent& aEvent );
|
|
|
|
PANEL_COMPONENT_CLASS_ASSIGNMENT* m_panelParent;
|
|
std::vector<wxString> m_selectionRefs;
|
|
};
|
|
|
|
|
|
/**************************************************************************************************
|
|
*
|
|
* PANEL_COMPONENT_CLASS_CONDITION_FOOTPRINT
|
|
*
|
|
*************************************************************************************************/
|
|
|
|
/**
|
|
* Configures matching based on footprint library identifier
|
|
*/
|
|
class PANEL_COMPONENT_CLASS_CONDITION_FOOTPRINT
|
|
: public PANEL_COMPONENT_CLASS_CONDITION_FOOTPRINT_BASE,
|
|
public CONDITION_DATA
|
|
{
|
|
public:
|
|
explicit PANEL_COMPONENT_CLASS_CONDITION_FOOTPRINT( wxWindow* aParent, DIALOG_SHIM* aDlg );
|
|
|
|
void OnDeleteConditionClick( wxCommandEvent& event ) override;
|
|
void OnShowLibraryClick( wxCommandEvent& event ) override;
|
|
|
|
protected:
|
|
PANEL_COMPONENT_CLASS_ASSIGNMENT* m_panelParent;
|
|
DIALOG_SHIM* m_dlg;
|
|
};
|
|
|
|
|
|
/**************************************************************************************************
|
|
*
|
|
* PANEL_COMPONENT_CLASS_CONDITION_SIDE
|
|
*
|
|
*************************************************************************************************/
|
|
|
|
/**
|
|
* Configures matching based on which side of the board a footprint is on
|
|
*/
|
|
class PANEL_COMPONENT_CLASS_CONDITION_SIDE : public PANEL_COMPONENT_CLASS_CONDITION_SIDE_BASE,
|
|
public CONDITION_DATA
|
|
{
|
|
public:
|
|
explicit PANEL_COMPONENT_CLASS_CONDITION_SIDE( wxWindow* aParent );
|
|
|
|
void OnDeleteConditionClick( wxCommandEvent& event ) override;
|
|
|
|
protected:
|
|
PANEL_COMPONENT_CLASS_ASSIGNMENT* m_panelParent;
|
|
};
|
|
|
|
|
|
/**************************************************************************************************
|
|
*
|
|
* PANEL_COMPONENT_CLASS_CONDITION_ROTATION
|
|
*
|
|
*************************************************************************************************/
|
|
|
|
/**
|
|
* Configures matching based on footprint rotation
|
|
*/
|
|
class PANEL_COMPONENT_CLASS_CONDITION_ROTATION
|
|
: public PANEL_COMPONENT_CLASS_CONDITION_ROTATION_BASE,
|
|
public CONDITION_DATA
|
|
{
|
|
public:
|
|
explicit PANEL_COMPONENT_CLASS_CONDITION_ROTATION( wxWindow* aParent );
|
|
|
|
void OnDeleteConditionClick( wxCommandEvent& event ) override;
|
|
|
|
protected:
|
|
PANEL_COMPONENT_CLASS_ASSIGNMENT* m_panelParent;
|
|
};
|
|
|
|
|
|
/**************************************************************************************************
|
|
*
|
|
* PANEL_COMPONENT_CLASS_CONDITION_FIELD
|
|
*
|
|
*************************************************************************************************/
|
|
|
|
/**
|
|
* Configures matching based on footprint field contents
|
|
*/
|
|
class PANEL_COMPONENT_CLASS_CONDITION_FIELD : public PANEL_COMPONENT_CLASS_CONDITION_FIELD_BASE,
|
|
public CONDITION_DATA
|
|
{
|
|
public:
|
|
explicit PANEL_COMPONENT_CLASS_CONDITION_FIELD( wxWindow* aParent );
|
|
|
|
void OnDeleteConditionClick( wxCommandEvent& event ) override;
|
|
|
|
void SetFieldsList( const std::vector<wxString>& aFields );
|
|
|
|
protected:
|
|
PANEL_COMPONENT_CLASS_ASSIGNMENT* m_panelParent;
|
|
};
|
|
|
|
|
|
/**************************************************************************************************
|
|
*
|
|
* PANEL_COMPONENT_CLASS_CONDITION_CUSTOM
|
|
*
|
|
*************************************************************************************************/
|
|
|
|
/**
|
|
* Configures matching based on a custom DRC expression
|
|
*/
|
|
class PANEL_COMPONENT_CLASS_CONDITION_CUSTOM : public PANEL_COMPONENT_CLASS_CONDITION_CUSTOM_BASE,
|
|
public CONDITION_DATA
|
|
{
|
|
public:
|
|
explicit PANEL_COMPONENT_CLASS_CONDITION_CUSTOM( wxWindow* aParent );
|
|
|
|
void OnDeleteConditionClick( wxCommandEvent& event ) override;
|
|
|
|
protected:
|
|
PANEL_COMPONENT_CLASS_ASSIGNMENT* m_panelParent;
|
|
};
|
|
|
|
|
|
/**************************************************************************************************
|
|
*
|
|
* PANEL_COMPONENT_CLASS_SHEET
|
|
*
|
|
*************************************************************************************************/
|
|
|
|
/**
|
|
* Configures matching based on a custom DRC expression
|
|
*/
|
|
class PANEL_COMPONENT_CLASS_CONDITION_SHEET : public PANEL_COMPONENT_CLASS_CONDITION_SHEET_BASE,
|
|
public CONDITION_DATA
|
|
{
|
|
public:
|
|
explicit PANEL_COMPONENT_CLASS_CONDITION_SHEET( wxWindow* aParent );
|
|
|
|
void OnDeleteConditionClick( wxCommandEvent& event ) override;
|
|
|
|
void SetSheetsList( const std::vector<wxString>& aSheets );
|
|
|
|
protected:
|
|
PANEL_COMPONENT_CLASS_ASSIGNMENT* m_panelParent;
|
|
};
|
|
|
|
#endif //PANEL_ASSIGN_COMPONENT_CLASSES_H
|