/* * 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 3 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, see . */ #ifndef PROJECT_COMPONENT_CLASS_SETTINGS_H #define PROJECT_COMPONENT_CLASS_SETTINGS_H #include #include #include class KICOMMON_API COMPONENT_CLASS_ASSIGNMENT_DATA { public: /// A condition match type enum class CONDITION_TYPE { REFERENCE, FOOTPRINT, SIDE, ROTATION, FOOTPRINT_FIELD, CUSTOM, SHEET_NAME }; /// Whether conditions are applied with OR or AND logic enum class CONDITIONS_OPERATOR { ALL, ANY }; /// Sets the given condition type with the assocated match data void SetCondition( const CONDITION_TYPE aCondition, const wxString& aPrimaryData, const wxString& aSecondaryData ) { m_conditions[aCondition] = { aPrimaryData, aSecondaryData }; } /// Gets all conditions const std::unordered_map>& GetConditions() const { return m_conditions; } /// Sets the resulting component class for matching footprints void SetComponentClass( const wxString& aComponentClass ) { m_componentClass = aComponentClass; } /// Gets the resulting component class for matching footprints const wxString& GetComponentClass() const { return m_componentClass; } /// Sets the boolean operation in use for all conditions void SetConditionsOperation( const CONDITIONS_OPERATOR aOperator ) { m_conditionsOperator = aOperator; } /// Gets the boolean operation in use for all conditions CONDITIONS_OPERATOR GetConditionsOperator() const { return m_conditionsOperator; } /// Maps a CONDITION_TYPE to a descriptive string static wxString GetConditionName( const CONDITION_TYPE aCondition ); /// Maps a descriptive string to a CONDITION_TYPE static CONDITION_TYPE GetConditionType( const wxString& aCondition ); /// Returns the DRC rules language for this component class assignment wxString GetAssignmentInDRCLanguage() const; protected: /// The name of the component class for this assignment rule wxString m_componentClass; /// Map of condition types to primary and secondary data fields for the condition std::unordered_map> m_conditions; /// Whether conditions are applied with AND or OR logic /// Defaults to ALL CONDITIONS_OPERATOR m_conditionsOperator{ CONDITIONS_OPERATOR::ALL }; }; /** * COMPONENT_CLASS_SETTINGS stores data for component classes, including rules for automatic * generation of component classes. */ class KICOMMON_API COMPONENT_CLASS_SETTINGS : public NESTED_SETTINGS { public: COMPONENT_CLASS_SETTINGS( JSON_SETTINGS* aParent, const std::string& aPath ); virtual ~COMPONENT_CLASS_SETTINGS(); /// Sets whether component classes should be generated for components in hierarchical sheets void SetEnableSheetComponentClasses( bool aEnabled ) { m_enableSheetComponentClasses = aEnabled; } /// Gets whether component classes should be generated for components in hierarchical sheets bool GetEnableSheetComponentClasses() const { return m_enableSheetComponentClasses; } /// Clear all dynamic component class assignments void ClearComponentClassAssignments() { m_componentClassAssignments.clear(); } /// Gets all dynamic component class assignments const std::vector& GetComponentClassAssignments() const { return m_componentClassAssignments; } // Adds a dynamic component class assignment void AddComponentClassAssignment( const COMPONENT_CLASS_ASSIGNMENT_DATA& aAssignment ) { m_componentClassAssignments.push_back( aAssignment ); } bool operator==( const COMPONENT_CLASS_SETTINGS& aOther ) const; bool operator!=( const COMPONENT_CLASS_SETTINGS& aOther ) const { return !operator==( aOther ); } private: /// Toggle generation of component classes for hierarchical sheets bool m_enableSheetComponentClasses; /// All dynamic component class assignment rules std::vector m_componentClassAssignments; /// Saves a dynamic component class assignment to JSON static nlohmann::json saveAssignment( const COMPONENT_CLASS_ASSIGNMENT_DATA& aAssignment ); /// Loads a dynamic component class assignment from JSON static COMPONENT_CLASS_ASSIGNMENT_DATA loadAssignment( const nlohmann::json& aJson ); }; #endif // PROJECT_COMPONENT_CLASS_SETTINGS_H