44 m_cols.push_back( { aFieldName, aLabel, aAddedByUser,
false,
false } );
55 const wxString& aFieldName )
63 if( field->IsPrivate() )
106 node.key() = newName;
111 m_cols[aCol].m_fieldName = newName;
112 m_cols[aCol].m_label = newName;
118 for(
size_t i = 0; i <
m_cols.size(); i++ )
120 if(
m_cols[i].m_fieldName == aFieldName )
130 std::vector<BOM_FIELD> fields;
133 fields.push_back( { col.m_fieldName, col.m_label, col.m_show, col.m_group } );
141 size_t foundCount = 0;
143 for(
const wxString& newField : aNewOrder )
145 for(
size_t i = 0; i <
m_cols.size(); i++ )
147 if(
m_cols[i].m_fieldName == newField )
179 wxGridCellAttr::wxAttrKind aKind )
202 const wxString& refDelimiter,
203 const wxString& refRangeDelimiter,
205 bool listMixedValues )
207 std::vector<SCH_REFERENCE> references;
208 std::set<wxString> mixedValues;
215 references.push_back( ref );
227 wxString refFieldValue;
242 if( listMixedValues )
243 mixedValues.insert( refFieldValue );
244 else if( &ref == &
group.m_Refs.front() )
245 fieldValue = refFieldValue;
246 else if( fieldValue != refFieldValue )
251 if( listMixedValues )
253 fieldValue = wxEmptyString;
255 for(
const wxString& value : mixedValues )
257 if( value.IsEmpty() )
259 else if( fieldValue.IsEmpty() )
262 fieldValue +=
"," + value;
269 std::sort( references.begin(), references.end(),
272 wxString l_ref( l.GetRef() << l.GetRefNumber() );
273 wxString r_ref( r.GetRef() << r.GetRefNumber() );
274 return StrNumCmp( l_ref, r_ref, true ) < 0;
277 auto logicalEnd = std::unique( references.begin(), references.end(),
282 if( l.GetRefNumber() == wxT(
"?" ) )
285 wxString l_ref( l.GetRef() << l.GetRefNumber() );
286 wxString r_ref( r.GetRef() << r.GetRefNumber() );
287 return l_ref == r_ref;
290 references.erase( logicalEnd, references.end() );
296 fieldValue = wxString::Format( wxT(
"%d" ), (
int) references.size() );
298 fieldValue = wxString::Format( wxT(
"%d" ),
group.m_ItemNumber );
306 wxCHECK_RET( aCol >= 0 && aCol < (
int)
m_cols.size(), wxS(
"Invalid column number" ) );
326 wxCHECK( aCol >= 0 && aCol < (
int)
m_cols.size(),
false );
333 wxCHECK( aCol >= 0 && aCol < (
int)
m_cols.size(),
false );
340 wxCHECK( aCol >= 0 && aCol < (
int)
m_cols.size(),
false );
347 wxCHECK( aCol >= 0 && aCol < (
int)
m_cols.size(),
false );
354 wxCHECK( aCol >= 0 && aCol < (
int)
m_cols.size(),
false );
365 if( lhGroup.
m_Refs.size() == 0 )
367 else if( rhGroup.
m_Refs.size() == 0 )
373 [ ascending ](
const auto a,
const auto b )
383 wxString lhs = dataModel->
GetValue( lhGroup, sortCol ).Trim(
true ).Trim(
false );
384 wxString rhs = dataModel->
GetValue( rhGroup, sortCol ).Trim(
true ).Trim(
false );
388 wxString lhRef = lhGroup.
m_Refs[0].GetRef() + lhGroup.
m_Refs[0].GetRefNumber();
389 wxString rhRef = rhGroup.
m_Refs[0].GetRef() + rhGroup.
m_Refs[0].GetRefNumber();
390 return local_cmp(
StrNumCmp( lhRef, rhRef,
true ), 0 );
407 std::sort( row.m_Refs.begin(), row.m_Refs.end(),
410 wxString lhs_ref( lhs.GetRef() << lhs.GetRefNumber() );
411 wxString rhs_ref( rhs.GetRef() << rhs.GetRefNumber() );
412 return StrNumCmp( lhs_ref, rhs_ref, true ) < 0;
419 return cmp( lhs, rhs, this, m_sortColumn, m_sortAscending );
426 row.m_ItemNumber = itemNumber++;
449 bool matchFound =
false;
456 if(
m_cols[refCol].m_group )
469 for(
size_t i = 0; i <
m_cols.size(); ++i )
472 if( (
int) i == refCol )
504 wxString fieldName =
m_cols[i].m_fieldName;
517 const wxString& aFieldName )
524 return wxEmptyString;
536 std::function<bool( wxString* )> symbolResolver =
537 [&]( wxString* token ) ->
bool
545 return wxEmptyString;
551 return aFieldName == wxS(
"${DNP}" )
552 || aFieldName == wxS(
"${EXCLUDE_FROM_BOARD}" )
553 || aFieldName == wxS(
"${EXCLUDE_FROM_BOM}" )
554 || aFieldName == wxS(
"${EXCLUDE_FROM_SIM}" );
559 const wxString& aAttributeName )
561 if( aAttributeName == wxS(
"${DNP}" ) )
562 return aSymbol.
GetDNP() ? wxS(
"1" ) : wxS(
"0" );
564 if( aAttributeName == wxS(
"${EXCLUDE_FROM_BOARD}" ) )
567 if( aAttributeName == wxS(
"${EXCLUDE_FROM_BOM}" ) )
570 if( aAttributeName == wxS(
"${EXCLUDE_FROM_SIM}" ) )
577 const wxString& aAttributeName,
578 const wxString& aValue )
580 if( aAttributeName == wxS(
"${DNP}" ) )
581 aSymbol.
SetDNP( aValue == wxS(
"1" ) );
582 else if( aAttributeName == wxS(
"${EXCLUDE_FROM_BOARD}" ) )
584 else if( aAttributeName == wxS(
"${EXCLUDE_FROM_BOM}" ) )
586 else if( aAttributeName == wxS(
"${EXCLUDE_FROM_SIM}" ) )
612 static_cast<WX_GRID*
>( GetView() )->CommitPendingChanges(
true );
614 wxGridTableMessage msg(
this, wxGRIDTABLE_NOTIFY_ROWS_DELETED, 0,
m_rows.size() );
615 GetView()->ProcessTableMessage( msg );
642 || (
m_scope == SCOPE::SCOPE_SHEET_RECURSIVE
648 bool matchFound =
false;
666 row.m_Refs.push_back( ref );
672 row.m_Refs.push_back( ref );
684 wxGridTableMessage msg(
this, wxGRIDTABLE_NOTIFY_ROWS_APPENDED,
m_rows.size() );
685 GetView()->ProcessTableMessage( msg );
694 std::vector<DATA_MODEL_ROW> children;
698 bool matchFound =
false;
708 child.m_Refs.push_back( ref );
717 if( children.size() < 2 )
720 std::sort( children.begin(), children.end(),
723 return cmp( lhs, rhs, this, m_sortColumn, m_sortAscending );
727 m_rows.insert(
m_rows.begin() + aRow + 1, children.begin(), children.end() );
729 wxGridTableMessage msg(
this, wxGRIDTABLE_NOTIFY_ROWS_INSERTED, aRow, children.size() );
730 GetView()->ProcessTableMessage( msg );
736 auto firstChild =
m_rows.begin() + aRow + 1;
737 auto afterLastChild = firstChild;
740 while( afterLastChild !=
m_rows.end() && afterLastChild->m_Flag ==
CHILD_ITEM )
747 m_rows.erase( firstChild, afterLastChild );
749 wxGridTableMessage msg(
this, wxGRIDTABLE_NOTIFY_ROWS_DELETED, aRow + 1, deleted );
750 GetView()->ProcessTableMessage( msg );
767 for(
size_t i = 0; i <
m_rows.size(); ++i )
780 for(
size_t i = 0; i <
m_rows.size(); ++i )
798 for(
const auto& [srcName, srcValue] : fieldStore )
814 if( destField && destField->
IsPrivate() )
816 if( srcValue.IsEmpty() )
823 bool userAdded = ( col != -1 &&
m_cols[col].m_userAdded );
826 bool createField = !destField && ( !srcValue.IsEmpty() || userAdded );
846 for(
int ii = (
int) symbol.
GetFields().size() - 1; ii >= 0; ii-- )
851 if( fieldStore.count( symbol.
GetFields()[ii].GetName() ) == 0 )
889 for(
size_t i = 0; i <
m_cols.size(); i++ )
895 std::vector<wxString> order;
904 order.emplace_back( field.
name );
969 for(
size_t col = 0; col <
m_cols.size(); col++ )
972 last_col = (int) col;
980 [&]( wxString field,
bool last ) -> wxString
984 field.Replace( wxS(
"\r" ), wxS(
"" ) );
985 field.Replace( wxS(
"\n" ), wxS(
"" ) );
990 field.Replace( wxS(
"\t" ), wxS(
"" ) );
1004 for(
size_t col = 0; col <
m_cols.size(); col++ )
1006 if( !
m_cols[col].m_show )
1009 out.Append( formatField(
m_cols[col].m_label, col == (
size_t) last_col ) );
1013 for(
size_t row = 0; row <
m_rows.size(); row++ )
1019 for(
size_t col = 0; col <
m_cols.size(); col++ )
1021 if( !
m_cols[col].m_show )
1027 col == (
size_t) last_col ) );
1048 if( !field.IsPrivate() )
1050 wxString
name = field.GetCanonicalName();
1072 return ref.GetSymbol()->m_Uuid == aSymbol.m_Uuid;
1089 if( ref.GetSymbol()->GetInstances().empty() )
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Modify a given item in the model.
wxString GetColFieldName(int aCol)
std::vector< DATA_MODEL_ROW > m_rows
void ApplyBomPreset(const BOM_PRESET &preset)
void SetFieldsOrder(const std::vector< wxString > &aNewOrder)
SCH_REFERENCE_LIST m_symbolsList
void SetGroupingEnabled(bool group)
wxString getAttributeValue(const SCH_SYMBOL &, const wxString &aAttributeName)
bool ColIsItemNumber(int aCol)
bool ColIsQuantity(int aCol)
void updateDataStoreSymbolField(const SCH_SYMBOL &aSymbol, const wxString &aFieldName)
int GetFieldNameCol(const wxString &aFieldName)
bool groupMatch(const SCH_REFERENCE &lhRef, const SCH_REFERENCE &rhRef)
wxGridCellAttr * m_urlEditor
BOM_PRESET GetBomSettings()
bool unitMatch(const SCH_REFERENCE &lhRef, const SCH_REFERENCE &rhRef)
bool ColIsReference(int aCol)
wxString GetExportValue(int aRow, int aCol, const wxString &refDelimiter, const wxString &refRangeDelimiter)
bool GetGroupingEnabled()
int GetNumberRows() override
void CollapseRow(int aRow)
wxString getFieldShownText(const SCH_REFERENCE &aRef, const wxString &aFieldName)
void RenameColumn(int aCol, const wxString &newName)
wxString Export(const BOM_FMT_PRESET &settings)
void AddColumn(const wxString &aFieldName, const wxString &aLabel, bool aAddedByUser)
std::vector< DATA_MODEL_COL > m_cols
void SetSorting(int aCol, bool ascending)
void ExpandCollapseRow(int aRow)
wxGridCellAttr * GetAttr(int aRow, int aCol, wxGridCellAttr::wxAttrKind aKind) override
void SetFilter(const wxString &aFilter)
std::map< int, wxGridCellAttr * > m_colAttrs
static bool cmp(const DATA_MODEL_ROW &lhGroup, const DATA_MODEL_ROW &rhGroup, FIELDS_EDITOR_GRID_DATA_MODEL *dataModel, int sortCol, bool ascending)
static const wxString ITEM_NUMBER_VARIABLE
void SetIncludeExcludedFromBOM(bool include)
bool isAttribute(const wxString &aFieldName)
wxString GetValue(int aRow, int aCol) override
int GetDataWidth(int aCol)
void UpdateReferences(const SCH_REFERENCE_LIST &aRefs)
void ApplyData(SCH_COMMIT &aCommit)
void RemoveColumn(int aCol)
GROUP_TYPE GetRowFlags(int aRow)
const wxString & GetFilter()
std::map< KIID, std::map< wxString, wxString > > m_dataStore
static const wxString QUANTITY_VARIABLE
bool ColIsValue(int aCol)
void SetGroupColumn(int aCol, bool group)
void SetExcludeDNP(bool exclude)
void RemoveSymbol(const SCH_SYMBOL &aSymbol)
void SetValue(int aRow, int aCol, const wxString &aValue) override
bool ColIsAttribute(int aCol)
void SetColLabelValue(int aCol, const wxString &aLabel) override
void RemoveReferences(const SCH_REFERENCE_LIST &aRefs)
bool GetIncludeExcludedFromBOM()
void SetShowColumn(int aCol, bool show)
void setAttributeValue(SCH_SYMBOL &aSymbol, const wxString &aAttributeName, const wxString &aValue)
void AddReferences(const SCH_REFERENCE_LIST &aRefs)
const std::vector< BOM_FIELD > GetFieldsOrdered()
wxString ConvertKIIDsToRefs(const wxString &aSource) const
wxString ConvertRefsToKIIDs(const wxString &aSource) const
Instances are attached to a symbol or sheet and provide a place for the symbol's value,...
wxString GetShownText(const SCH_SHEET_PATH *aPath, bool aAllowExtraText, int aDepth=0) const
void SetText(const wxString &aText) override
void SetPrivate(bool aPrivate)
SCHEMATIC * Schematic() const
Search the item hierarchy to find a SCHEMATIC.
Container to create a flattened list of symbols because in a complex hierarchy, a symbol can be used ...
bool Contains(const SCH_REFERENCE &aItem) const
Return true if aItem exists in this list.
iterator erase(iterator position)
static wxString Shorthand(std::vector< SCH_REFERENCE > aList, const wxString &refDelimiter, const wxString &refRangeDelimiter)
Return a shorthand string representing all the references in the list.
int FindRefByFullPath(const wxString &aFullPath) const
Search the list for a symbol with the given KIID path (as string).
void AddItem(const SCH_REFERENCE &aItem)
void RemoveItem(unsigned int aIndex)
Remove an item from the list of references.
A helper to define a symbol's reference designator in a schematic.
const SCH_SHEET_PATH & GetSheetPath() const
wxString GetFullRef() const
Return reference name with unit altogether.
SCH_SYMBOL * GetSymbol() const
wxString GetRefNumber() const
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
bool GetExcludedFromBOM() const
bool IsContainedWithin(const SCH_SHEET_PATH &aSheetPathToTest) const
Check if this path is contained inside aSheetPathToTest.
SCH_FIELD * GetFieldByName(const wxString &aFieldName)
Return a field in this symbol.
SCH_FIELD * FindField(const wxString &aFieldName, bool aIncludeDefaultFields=true, bool aCaseInsensitive=false)
Search for a SCH_FIELD with aFieldName.
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly) override
Populate a std::vector with SCH_FIELDs.
VECTOR2I GetPosition() const override
bool ResolveTextVar(const SCH_SHEET_PATH *aPath, wxString *token, int aDepth=0) const
Resolve any references to system tokens supported by the symbol.
SCH_FIELD * AddField(const SCH_FIELD &aField)
Add a field to the symbol.
bool GetExcludedFromBoard() const
bool GetExcludedFromBOM() const
void SetExcludedFromSim(bool aExcludeFromSim) override
Set or clear the exclude from simulation flag.
bool GetDNP() const
Set or clear the 'Do Not Populate' flag.
void SetExcludedFromBOM(bool aExcludeFromBOM)
Set or clear the exclude from schematic bill of materials flag.
void SetExcludedFromBoard(bool aExcludeFromBoard)
Set or clear exclude from board netlist flag.
bool GetExcludedFromSim() const override
wxGridCellAttr * enhanceAttr(wxGridCellAttr *aInputAttr, int aRow, int aCol, wxGridCellAttr::wxAttrKind aKind)
wxString ExpandTextVars(const wxString &aSource, const PROJECT *aProject, int aFlags)
bool IsTextVar(const wxString &aSource)
Returns true if the string is a text var, e.g starts with ${.
@ GROUP_COLLAPSED_DURING_SORT
KICOMMON_API wxSize GetTextSize(const wxString &aSingleLine, wxWindow *aWindow)
Return the size of aSingleLine of text when it is rendered in aWindow using whatever font is currentl...
int StrNumCmp(const wxString &aString1, const wxString &aString2, bool aIgnoreCase)
Compare two strings with alphanumerical content.
bool WildCompareString(const wxString &pattern, const wxString &string_to_tst, bool case_sensitive)
Compare a string against wild card (* and ?) pattern using the usual rules.
int ValueStringCompare(const wxString &strFWord, const wxString &strSWord)
Compare strings like the strcmp function but handle numbers and modifiers within the string text corr...
bool IsURL(wxString aStr)
Performs a URL sniff-test on a string.
wxString refRangeDelimiter
std::vector< BOM_FIELD > fieldsOrdered
bool includeExcludedFromBOM
std::vector< SCH_REFERENCE > m_Refs
wxString GetCanonicalFieldName(int idx)
@ DATASHEET_FIELD
name of datasheet
@ VALUE_FIELD
Field Value of part, i.e. "3.3K".
@ REFERENCE_FIELD
Field Reference of part, i.e. "IC21".
#define INDETERMINATE_STATE
Used for holding indeterminate values, such as with multiple selections holding different values or c...