KiCad PCB EDA Suite
Loading...
Searching...
No Matches
refdes_utils.cpp
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright The KiCad Developers, see AUTHORS.TXT for contributors.
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <https://www.gnu.org/licenses/>.
18 */
19
20#include <refdes_utils.h>
21
22#include <string_utils.h>
23
24#include <algorithm>
25#include <cctype>
26
27
28namespace UTIL
29{
30
31wxString GetRefDesPrefix( const wxString& aRefDes )
32{
33 // find the first non-digit, non-question-mark character from the back
34 auto res = std::find_if( aRefDes.rbegin(), aRefDes.rend(),
35 []( wxUniChar aChr )
36 {
37 return aChr != '?' && !std::isdigit( aChr );
38 } );
39
40 return { aRefDes.begin(), res.base() };
41}
42
43
44wxString GetRefDesUnannotated( const wxString& aSource )
45{
46 return UTIL::GetRefDesPrefix( aSource ) + wxT( "?" );
47}
48
49
50int GetRefDesNumber( const wxString& aRefDes )
51{
52 int retval = -1; // negative to indicate not found
53 size_t firstnum = aRefDes.find_first_of( wxS( "0123456789" ) );
54
55 if( firstnum != wxString::npos )
56 {
57 wxString candidateValue = aRefDes.Mid( firstnum );
58 long result;
59
60 if( !candidateValue.ToLong( &result ) )
61 retval = -1;
62 else
63 retval = static_cast<int>( result );
64 }
65
66 return retval;
67}
68
69
70wxString FormatRefDesRanges( const std::vector<wxString>& aReferences, const wxString& aRefDelimiter,
71 const wxString& aRefRangeDelimiter )
72{
73 wxString retVal;
74 size_t i = 0;
75
76 while( i < aReferences.size() )
77 {
78 const wxString& reference = aReferences[i];
79 wxString prefix = GetRefDesPrefix( reference );
80 wxString numberText = reference.Mid( prefix.length() );
81 long number;
82 bool hasNumber = numberText.ToLong( &number );
83 size_t range = 1;
84
85 while( hasNumber && i + range < aReferences.size() )
86 {
87 const wxString& nextReference = aReferences[i + range];
88 wxString nextPrefix = GetRefDesPrefix( nextReference );
89 wxString nextNumberText = nextReference.Mid( nextPrefix.length() );
90 long nextNumber;
91
92 if( nextPrefix != prefix || !nextNumberText.ToLong( &nextNumber )
93 || nextNumber != number + static_cast<long>( range ) )
94 {
95 break;
96 }
97
98 range++;
99
100 if( range == 2 && aRefRangeDelimiter.IsEmpty() )
101 break;
102 }
103
104 if( !retVal.IsEmpty() )
105 retVal << aRefDelimiter;
106
107 if( range == 1 )
108 {
109 retVal << reference;
110 }
111 else if( range == 2 || aRefRangeDelimiter.IsEmpty() )
112 {
113 retVal << reference;
114 retVal << aRefDelimiter;
115 retVal << aReferences[i + 1];
116 }
117 else
118 {
119 retVal << reference;
120 retVal << aRefRangeDelimiter;
121 retVal << aReferences[i + range - 1];
122 }
123
124 i += range;
125 }
126
127 return retVal;
128}
129
130} // namespace UTIL
A model subscriber implementation using links to represent connections.
wxString GetRefDesPrefix(const wxString &aRefDes)
Get the (non-numeric) prefix from a refdes - e.g.
wxString FormatRefDesRanges(const std::vector< wxString > &aReferences, const wxString &aRefDelimiter, const wxString &aRefRangeDelimiter)
Format a sorted list of reference designators, shortening consecutive sequences of three or more refe...
wxString GetRefDesUnannotated(const wxString &aSource)
Return an unannotated refdes from either a prefix or an existing refdes.
int GetRefDesNumber(const wxString &aRefDes)
Get the numeric suffix from a refdes - e.g.
Collection of utility functions for component reference designators (refdes)
VECTOR3I res
wxString result
Test unit parsing edge cases and error handling.