43 m_cols.push_back( { aFieldName, aLabel, aAddedByUser,
false,
false } );
54 const wxString& aFieldName )
95 m_cols[aCol].m_fieldName = newName;
96 m_cols[aCol].m_label = newName;
102 for(
size_t i = 0; i <
m_cols.size(); i++ )
104 if(
m_cols[i].m_fieldName == aFieldName )
114 std::vector<BOM_FIELD> fields;
117 fields.push_back( { col.m_fieldName, col.m_label, col.m_show, col.m_group } );
125 size_t foundCount = 0;
127 for(
const wxString& newField : aNewOrder )
129 for(
size_t i = 0; i <
m_cols.size(); i++ )
131 if(
m_cols[i].m_fieldName == newField )
163 const wxString& refDelimiter,
164 const wxString& refRangeDelimiter,
167 std::vector<SCH_REFERENCE> references;
174 references.push_back( ref );
186 wxString refFieldValue;
199 if( &ref == &
group.m_Refs.front() )
200 fieldValue = refFieldValue;
201 else if( fieldValue != refFieldValue )
209 std::sort( references.begin(), references.end(),
212 wxString l_ref( l.GetRef() << l.GetRefNumber() );
213 wxString r_ref( r.GetRef() << r.GetRefNumber() );
214 return StrNumCmp( l_ref, r_ref, true ) < 0;
217 auto logicalEnd = std::unique( references.begin(), references.end(),
222 if( l.GetRefNumber() == wxT(
"?" ) )
225 wxString l_ref( l.GetRef() << l.GetRefNumber() );
226 wxString r_ref( r.GetRef() << r.GetRefNumber() );
227 return l_ref == r_ref;
230 references.erase( logicalEnd, references.end() );
236 fieldValue = wxString::Format( wxT(
"%d" ), (
int) references.size() );
238 fieldValue = wxString::Format( wxT(
"%d" ),
group.m_ItemNumber );
246 wxCHECK_RET( aCol >= 0 && aCol < (
int)
m_cols.size(), wxS(
"Invalid column number" ) );
266 wxCHECK( aCol >= 0 && aCol < (
int)
m_cols.size(),
false );
273 wxCHECK( aCol >= 0 && aCol < (
int)
m_cols.size(),
false );
280 wxCHECK( aCol >= 0 && aCol < (
int)
m_cols.size(),
false );
287 wxCHECK( aCol >= 0 && aCol < (
int)
m_cols.size(),
false );
294 wxCHECK( aCol >= 0 && aCol < (
int)
m_cols.size(),
false );
305 if( lhGroup.
m_Refs.size() == 0 )
307 else if( rhGroup.
m_Refs.size() == 0 )
313 [ ascending ](
const auto a,
const auto b )
323 wxString lhs = dataModel->
GetValue( lhGroup, sortCol ).Trim(
true ).Trim(
false );
324 wxString rhs = dataModel->
GetValue( rhGroup, sortCol ).Trim(
true ).Trim(
false );
328 wxString lhRef = lhGroup.
m_Refs[0].GetRef() + lhGroup.
m_Refs[0].GetRefNumber();
329 wxString rhRef = rhGroup.
m_Refs[0].GetRef() + rhGroup.
m_Refs[0].GetRefNumber();
330 return local_cmp(
StrNumCmp( lhRef, rhRef,
true ), 0 );
347 std::sort( row.m_Refs.begin(), row.m_Refs.end(),
350 wxString lhs_ref( lhs.GetRef() << lhs.GetRefNumber() );
351 wxString rhs_ref( rhs.GetRef() << rhs.GetRefNumber() );
352 return StrNumCmp( lhs_ref, rhs_ref, true ) < 0;
359 return cmp( lhs, rhs, this, m_sortColumn, m_sortAscending );
366 row.m_ItemNumber = itemNumber++;
389 bool matchFound =
false;
396 if(
m_cols[refCol].m_group )
409 for(
size_t i = 0; i <
m_cols.size(); ++i )
412 if( (
int) i == refCol )
440 wxString fieldName =
m_cols[i].m_fieldName;
453 const wxString& aFieldName )
467 std::function<bool( wxString* )> symbolResolver =
468 [&]( wxString* token ) ->
bool
476 return wxEmptyString;
482 return aFieldName == wxS(
"${DNP}" )
483 || aFieldName == wxS(
"${EXCLUDE_FROM_BOARD}" )
484 || aFieldName == wxS(
"${EXCLUDE_FROM_BOM}" )
485 || aFieldName == wxS(
"${EXCLUDE_FROM_SIM}" );
490 const wxString& aAttributeName )
492 if( aAttributeName == wxS(
"${DNP}" ) )
493 return aSymbol.
GetDNP() ? wxS(
"1" ) : wxS(
"0" );
495 if( aAttributeName == wxS(
"${EXCLUDE_FROM_BOARD}" ) )
498 if( aAttributeName == wxS(
"${EXCLUDE_FROM_BOM}" ) )
501 if( aAttributeName == wxS(
"${EXCLUDE_FROM_SIM}" ) )
508 const wxString& aAttributeName,
509 const wxString& aValue )
511 if( aAttributeName == wxS(
"${DNP}" ) )
512 aSymbol.
SetDNP( aValue == wxS(
"1" ) );
513 else if( aAttributeName == wxS(
"${EXCLUDE_FROM_BOARD}" ) )
515 else if( aAttributeName == wxS(
"${EXCLUDE_FROM_BOM}" ) )
517 else if( aAttributeName == wxS(
"${EXCLUDE_FROM_SIM}" ) )
543 static_cast<WX_GRID*
>( GetView() )->CommitPendingChanges(
true );
545 wxGridTableMessage msg(
this, wxGRIDTABLE_NOTIFY_ROWS_DELETED, 0,
m_rows.size() );
546 GetView()->ProcessTableMessage( msg );
567 || (
m_scope == SCOPE::SCOPE_SHEET_RECURSIVE
573 bool matchFound =
false;
591 row.m_Refs.push_back( ref );
597 row.m_Refs.push_back( ref );
609 wxGridTableMessage msg(
this, wxGRIDTABLE_NOTIFY_ROWS_APPENDED,
m_rows.size() );
610 GetView()->ProcessTableMessage( msg );
619 std::vector<DATA_MODEL_ROW> children;
623 bool matchFound =
false;
633 child.m_Refs.push_back( ref );
642 if( children.size() < 2 )
645 std::sort( children.begin(), children.end(),
648 return cmp( lhs, rhs, this, m_sortColumn, m_sortAscending );
652 m_rows.insert(
m_rows.begin() + aRow + 1, children.begin(), children.end() );
654 wxGridTableMessage msg(
this, wxGRIDTABLE_NOTIFY_ROWS_INSERTED, aRow, children.size() );
655 GetView()->ProcessTableMessage( msg );
661 auto firstChild =
m_rows.begin() + aRow + 1;
662 auto afterLastChild = firstChild;
665 while( afterLastChild !=
m_rows.end() && afterLastChild->m_Flag ==
CHILD_ITEM )
672 m_rows.erase( firstChild, afterLastChild );
674 wxGridTableMessage msg(
this, wxGRIDTABLE_NOTIFY_ROWS_DELETED, aRow + 1, deleted );
675 GetView()->ProcessTableMessage( msg );
692 for(
size_t i = 0; i <
m_rows.size(); ++i )
705 for(
size_t i = 0; i <
m_rows.size(); ++i )
720 symbolChangeHandler( symbol,
m_symbolsList[i].GetSheetPath() );
724 for(
const std::pair<wxString, wxString> srcData : fieldStore )
726 const wxString& srcName = srcData.first;
727 const wxString& srcValue = srcData.second;
743 bool userAdded = ( col != -1 &&
m_cols[col].m_userAdded );
746 bool createField = !destField && ( !srcValue.IsEmpty() || userAdded );
764 if( !srcValue.IsEmpty() )
773 destField->
SetText( srcValue );
779 if( fieldStore.count( symbol.
GetFields()[ii].GetName() ) == 0 )
817 for(
size_t i = 0; i <
m_cols.size(); i++ )
823 std::vector<wxString> order;
832 order.emplace_back( field.
name );
897 for(
size_t col = 0; col <
m_cols.size(); col++ )
900 last_col = (int) col;
907 auto formatField = [&]( wxString field,
bool last ) -> wxString
911 field.Replace( wxS(
"\r" ), wxS(
"" ) );
912 field.Replace( wxS(
"\n" ), wxS(
"" ) );
917 field.Replace( wxS(
"\t" ), wxS(
"" ) );
929 for(
size_t col = 0; col <
m_cols.size(); col++ )
934 out.Append( formatField(
m_cols[col].m_label, col == (
size_t) last_col ) );
938 for(
size_t row = 0; row <
m_rows.size(); row++ )
944 for(
size_t col = 0; col <
m_cols.size(); col++ )
952 col == (
size_t) last_col ) );
969 for(
const SCH_FIELD& field : ref.GetSymbol()->GetFields() )
970 m_dataStore[ref.GetSymbol()->m_Uuid][field.GetCanonicalName()] = field.GetText();
987 return ref.GetSymbol()->m_Uuid == aSymbol.m_Uuid;
1004 if( ref.GetSymbol()->GetInstances().empty() )
wxString GetColFieldName(int aCol)
std::vector< DATA_MODEL_ROW > m_rows
int GetFieldNameCol(wxString aFieldName)
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)
bool groupMatch(const SCH_REFERENCE &lhRef, const SCH_REFERENCE &rhRef)
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)
void SetFilter(const wxString &aFilter)
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(std::function< void(SCH_SYMBOL &, SCH_SHEET_PATH &)> symbolChangeHandler)
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()
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
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
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 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.
void SetValueFieldText(const wxString &aValue)
SCH_FIELD * FindField(const wxString &aFieldName, bool aIncludeDefaultFields=true, bool aCaseInsensitive=false)
Search for a SCH_FIELD with aFieldName.
void SetFootprintFieldText(const wxString &aFootprint)
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.
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly)
Populate a std::vector with SCH_FIELDs.
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' flaga.
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
bool IsTextVar(const wxString &aSource)
Returns true if the string is a text var, e.g starts with ${.
wxString ExpandTextVars(const wxString &aSource, const PROJECT *aProject)
@ 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...
wxString refRangeDelimiter
std::vector< BOM_FIELD > fieldsOrdered
bool includeExcludedFromBOM
std::vector< SCH_REFERENCE > m_Refs
wxString GetCanonicalFieldName(int idx)
@ FOOTPRINT_FIELD
Field Name Module PCB, i.e. "16DIP300".
@ VALUE_FIELD
Field Value of part, i.e. "3.3K".
@ MANDATORY_FIELDS
The first 5 are mandatory, and must be instantiated in SCH_COMPONENT and LIB_PART constructors.
@ 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...