Added support for upto 9 comment lines (KiCad 6)
This commit is contained in:
parent
64bfc4824d
commit
1eefdeb5a3
|
|
@ -255,10 +255,7 @@ You can always choose the file name for a particular output.
|
||||||
The pattern uses the following expansions:
|
The pattern uses the following expansions:
|
||||||
|
|
||||||
- **%c** company from pcb/sch metadata.
|
- **%c** company from pcb/sch metadata.
|
||||||
- **%C1** comments line 1 from pcb/sch metadata.
|
- **%C`n`** comments line `n` from pcb/sch metadata.
|
||||||
- **%C2** comments line 2 from pcb/sch metadata.
|
|
||||||
- **%C3** comments line 3 from pcb/sch metadata.
|
|
||||||
- **%C4** comments line 4 from pcb/sch metadata.
|
|
||||||
- **%d** pcb/sch date from metadata if available, file modification date otherwise.
|
- **%d** pcb/sch date from metadata if available, file modification date otherwise.
|
||||||
- **%D** date the script was started.
|
- **%D** date the script was started.
|
||||||
- **%f** original pcb/sch file name without extension.
|
- **%f** original pcb/sch file name without extension.
|
||||||
|
|
@ -283,7 +280,7 @@ global:
|
||||||
output: '%f_rev_%r-%i.%x'
|
output: '%f_rev_%r-%i.%x'
|
||||||
```
|
```
|
||||||
|
|
||||||
Note that the following patterns: **%c**, **%C1**, **%C2**, **%C3**, **%C4**, **%d**, **%f**, **%F**, **%p** and **%r** depends on the context.
|
Note that the following patterns: **%c**, **%C`n`**, **%d**, **%f**, **%F**, **%p** and **%r** depends on the context.
|
||||||
If you use them for an output related to the PCB these values will be obtained from the PCB.
|
If you use them for an output related to the PCB these values will be obtained from the PCB.
|
||||||
If you need to force the origin of the data you can use **%bX** for the PCB and **%sX** for the schematic, where
|
If you need to force the origin of the data you can use **%bX** for the PCB and **%sX** for the schematic, where
|
||||||
**X** is the pattern to expand.
|
**X** is the pattern to expand.
|
||||||
|
|
|
||||||
|
|
@ -193,10 +193,7 @@ You can always choose the file name for a particular output.
|
||||||
The pattern uses the following expansions:
|
The pattern uses the following expansions:
|
||||||
|
|
||||||
- **%c** company from pcb/sch metadata.
|
- **%c** company from pcb/sch metadata.
|
||||||
- **%C1** comments line 1 from pcb/sch metadata.
|
- **%C`n`** comments line `n` from pcb/sch metadata.
|
||||||
- **%C2** comments line 2 from pcb/sch metadata.
|
|
||||||
- **%C3** comments line 3 from pcb/sch metadata.
|
|
||||||
- **%C4** comments line 4 from pcb/sch metadata.
|
|
||||||
- **%d** pcb/sch date from metadata if available, file modification date otherwise.
|
- **%d** pcb/sch date from metadata if available, file modification date otherwise.
|
||||||
- **%D** date the script was started.
|
- **%D** date the script was started.
|
||||||
- **%f** original pcb/sch file name without extension.
|
- **%f** original pcb/sch file name without extension.
|
||||||
|
|
@ -221,7 +218,7 @@ global:
|
||||||
output: '%f_rev_%r-%i.%x'
|
output: '%f_rev_%r-%i.%x'
|
||||||
```
|
```
|
||||||
|
|
||||||
Note that the following patterns: **%c**, **%C1**, **%C2**, **%C3**, **%C4**, **%d**, **%f**, **%F**, **%p** and **%r** depends on the context.
|
Note that the following patterns: **%c**, **%C`n`**, **%d**, **%f**, **%F**, **%p** and **%r** depends on the context.
|
||||||
If you use them for an output related to the PCB these values will be obtained from the PCB.
|
If you use them for an output related to the PCB these values will be obtained from the PCB.
|
||||||
If you need to force the origin of the data you can use **%bX** for the PCB and **%sX** for the schematic, where
|
If you need to force the origin of the data you can use **%bX** for the PCB and **%sX** for the schematic, where
|
||||||
**X** is the pattern to expand.
|
**X** is the pattern to expand.
|
||||||
|
|
|
||||||
39
kibot/gs.py
39
kibot/gs.py
|
|
@ -53,19 +53,13 @@ class GS(object):
|
||||||
sch_date = None
|
sch_date = None
|
||||||
sch_rev = None
|
sch_rev = None
|
||||||
sch_comp = None
|
sch_comp = None
|
||||||
sch_com1 = None
|
sch_com = [None]*9
|
||||||
sch_com2 = None
|
|
||||||
sch_com3 = None
|
|
||||||
sch_com4 = None
|
|
||||||
# Data from the board title block
|
# Data from the board title block
|
||||||
pcb_title = None
|
pcb_title = None
|
||||||
pcb_date = None
|
pcb_date = None
|
||||||
pcb_rev = None
|
pcb_rev = None
|
||||||
pcb_comp = None
|
pcb_comp = None
|
||||||
pcb_com1 = None
|
pcb_com = [None]*9
|
||||||
pcb_com2 = None
|
|
||||||
pcb_com3 = None
|
|
||||||
pcb_com4 = None
|
|
||||||
# Current variant/s
|
# Current variant/s
|
||||||
variant = None
|
variant = None
|
||||||
# All the outputs
|
# All the outputs
|
||||||
|
|
@ -120,10 +114,7 @@ class GS(object):
|
||||||
GS.sch_date = GS.sch.date
|
GS.sch_date = GS.sch.date
|
||||||
GS.sch_rev = GS.sch.revision
|
GS.sch_rev = GS.sch.revision
|
||||||
GS.sch_comp = GS.sch.company
|
GS.sch_comp = GS.sch.company
|
||||||
GS.sch_com1 = GS.sch.comment1
|
GS.sch_com = GS.sch.comment
|
||||||
GS.sch_com2 = GS.sch.comment2
|
|
||||||
GS.sch_com3 = GS.sch.comment3
|
|
||||||
GS.sch_com4 = GS.sch.comment4
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def format_date(d, fname, what):
|
def format_date(d, fname, what):
|
||||||
|
|
@ -144,14 +135,16 @@ class GS(object):
|
||||||
if GS.ki6(): # pragma: no cover (Ki6)
|
if GS.ki6(): # pragma: no cover (Ki6)
|
||||||
# Backward compatibility ... what's this?
|
# Backward compatibility ... what's this?
|
||||||
# Also: Maintaining the same numbers used before (and found in the file) is asking too much?
|
# Also: Maintaining the same numbers used before (and found in the file) is asking too much?
|
||||||
return title_block.GetComment(num-1)
|
return title_block.GetComment(num)
|
||||||
if num == 1:
|
if num == 0:
|
||||||
return title_block.GetComment1()
|
return title_block.GetComment1()
|
||||||
if num == 2:
|
if num == 1:
|
||||||
return title_block.GetComment2()
|
return title_block.GetComment2()
|
||||||
if num == 3:
|
if num == 2:
|
||||||
return title_block.GetComment3()
|
return title_block.GetComment3()
|
||||||
return title_block.GetComment4()
|
if num == 3:
|
||||||
|
return title_block.GetComment4()
|
||||||
|
return ''
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_modules():
|
def get_modules():
|
||||||
|
|
@ -196,18 +189,14 @@ class GS(object):
|
||||||
GS.pcb_title = GS.pcb_basename
|
GS.pcb_title = GS.pcb_basename
|
||||||
GS.pcb_rev = title_block.GetRevision()
|
GS.pcb_rev = title_block.GetRevision()
|
||||||
GS.pcb_comp = title_block.GetCompany()
|
GS.pcb_comp = title_block.GetCompany()
|
||||||
GS.pcb_com1 = GS.get_pcb_comment(title_block, 1)
|
for num in range(9):
|
||||||
GS.pcb_com2 = GS.get_pcb_comment(title_block, 2)
|
GS.pcb_com[num] = GS.get_pcb_comment(title_block, num)
|
||||||
GS.pcb_com3 = GS.get_pcb_comment(title_block, 3)
|
|
||||||
GS.pcb_com4 = GS.get_pcb_comment(title_block, 4)
|
|
||||||
logger.debug("PCB title: `{}`".format(GS.pcb_title))
|
logger.debug("PCB title: `{}`".format(GS.pcb_title))
|
||||||
logger.debug("PCB date: `{}`".format(GS.pcb_date))
|
logger.debug("PCB date: `{}`".format(GS.pcb_date))
|
||||||
logger.debug("PCB revision: `{}`".format(GS.pcb_rev))
|
logger.debug("PCB revision: `{}`".format(GS.pcb_rev))
|
||||||
logger.debug("PCB company: `{}`".format(GS.pcb_comp))
|
logger.debug("PCB company: `{}`".format(GS.pcb_comp))
|
||||||
logger.debug("PCB comment 1: `{}`".format(GS.pcb_com1))
|
for num in range(4 if GS.ki5() else 9):
|
||||||
logger.debug("PCB comment 2: `{}`".format(GS.pcb_com2))
|
logger.debug("PCB comment {}: `{}`".format(num+1, GS.pcb_com[num]))
|
||||||
logger.debug("PCB comment 3: `{}`".format(GS.pcb_com3))
|
|
||||||
logger.debug("PCB comment 4: `{}`".format(GS.pcb_com4))
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def check_pcb():
|
def check_pcb():
|
||||||
|
|
|
||||||
|
|
@ -1463,6 +1463,7 @@ class Schematic(object):
|
||||||
self.dcms = {}
|
self.dcms = {}
|
||||||
self.lib_comps = {}
|
self.lib_comps = {}
|
||||||
self.annotation_error = False
|
self.annotation_error = False
|
||||||
|
self.max_comments = 4
|
||||||
|
|
||||||
def _get_title_block(self, f):
|
def _get_title_block(self, f):
|
||||||
line = f.get_line()
|
line = f.get_line()
|
||||||
|
|
@ -1475,6 +1476,7 @@ class Schematic(object):
|
||||||
self.sheet = 1
|
self.sheet = 1
|
||||||
self.nsheets = 1
|
self.nsheets = 1
|
||||||
self.title_block = OrderedDict()
|
self.title_block = OrderedDict()
|
||||||
|
self.comment = ['']*9
|
||||||
while True:
|
while True:
|
||||||
line = f.get_line()
|
line = f.get_line()
|
||||||
if line.startswith('$EndDescr'):
|
if line.startswith('$EndDescr'):
|
||||||
|
|
@ -1482,10 +1484,8 @@ class Schematic(object):
|
||||||
self.date = self.title_block.get('Date', '')
|
self.date = self.title_block.get('Date', '')
|
||||||
self.revision = self.title_block.get('Rev', '')
|
self.revision = self.title_block.get('Rev', '')
|
||||||
self.company = self.title_block.get('Comp', '')
|
self.company = self.title_block.get('Comp', '')
|
||||||
self.comment1 = self.title_block.get('Comment1', '')
|
for num in range(4):
|
||||||
self.comment2 = self.title_block.get('Comment2', '')
|
self.comment[num] = self.title_block.get('Comment'+str(num+1), '')
|
||||||
self.comment3 = self.title_block.get('Comment3', '')
|
|
||||||
self.comment4 = self.title_block.get('Comment4', '')
|
|
||||||
return
|
return
|
||||||
elif line.startswith('encoding'):
|
elif line.startswith('encoding'):
|
||||||
if line[9:14] != 'utf-8':
|
if line[9:14] != 'utf-8':
|
||||||
|
|
@ -1789,17 +1789,9 @@ class Schematic(object):
|
||||||
dt.text = self.date
|
dt.text = self.date
|
||||||
SubElement(tblock, 'source').text = os.path.basename(self.fname)
|
SubElement(tblock, 'source').text = os.path.basename(self.fname)
|
||||||
com = SubElement(tblock, 'comment')
|
com = SubElement(tblock, 'comment')
|
||||||
com.set('number', '1')
|
for num in range(self.max_comments):
|
||||||
com.set('value', self.comment1)
|
com.set('number', str(num+1))
|
||||||
com = SubElement(tblock, 'comment')
|
com.set('value', self.comment[num])
|
||||||
com.set('number', '2')
|
|
||||||
com.set('value', self.comment2)
|
|
||||||
com = SubElement(tblock, 'comment')
|
|
||||||
com.set('number', '3')
|
|
||||||
com.set('value', self.comment3)
|
|
||||||
com = SubElement(tblock, 'comment')
|
|
||||||
com.set('number', '4')
|
|
||||||
com.set('value', self.comment4)
|
|
||||||
|
|
||||||
def save_netlist_components(self, root, comps, excluded, fitted, no_field):
|
def save_netlist_components(self, root, comps, excluded, fitted, no_field):
|
||||||
""" Generates the `components` section of the netlist """
|
""" Generates the `components` section of the netlist """
|
||||||
|
|
|
||||||
|
|
@ -1386,7 +1386,8 @@ class SchematicV6(Schematic):
|
||||||
self.annotation_error = False
|
self.annotation_error = False
|
||||||
# The title block is optional
|
# The title block is optional
|
||||||
self.date = self.title = self.revision = self.company = ''
|
self.date = self.title = self.revision = self.company = ''
|
||||||
self.comment1 = self.comment2 = self.comment3 = self.comment4 = ''
|
self.comment = ['']*9
|
||||||
|
self.max_comments = 9
|
||||||
self.title_ori = self.date_ori = None
|
self.title_ori = self.date_ori = None
|
||||||
|
|
||||||
def _fill_missing_title_block(self):
|
def _fill_missing_title_block(self):
|
||||||
|
|
@ -1412,17 +1413,10 @@ class SchematicV6(Schematic):
|
||||||
self.company = _check_str(item, 1, i_type)
|
self.company = _check_str(item, 1, i_type)
|
||||||
elif i_type == 'comment':
|
elif i_type == 'comment':
|
||||||
index = _check_integer(item, 1, i_type)
|
index = _check_integer(item, 1, i_type)
|
||||||
if index < 1 or index > 4:
|
if index < 1 or index > 9:
|
||||||
raise SchError('Unsupported comment index {} in title block'.format(index))
|
raise SchError('Unsupported comment index {} in title block'.format(index))
|
||||||
value = _check_str(item, 2, i_type)
|
value = _check_str(item, 2, i_type)
|
||||||
if index == 1:
|
self.comment[index-1] = value
|
||||||
self.comment1 = value
|
|
||||||
elif index == 2:
|
|
||||||
self.comment2 = value
|
|
||||||
elif index == 3:
|
|
||||||
self.comment3 = value
|
|
||||||
elif index == 4:
|
|
||||||
self.comment4 = value
|
|
||||||
else:
|
else:
|
||||||
raise SchError('Unsupported entry in title block ({})'.format(item))
|
raise SchError('Unsupported entry in title block ({})'.format(item))
|
||||||
self._fill_missing_title_block()
|
self._fill_missing_title_block()
|
||||||
|
|
@ -1460,10 +1454,8 @@ class SchematicV6(Schematic):
|
||||||
data += [_symbol('date', [self.date_ori]), Sep()]
|
data += [_symbol('date', [self.date_ori]), Sep()]
|
||||||
data += [_symbol('rev', [self.revision]), Sep()]
|
data += [_symbol('rev', [self.revision]), Sep()]
|
||||||
data += [_symbol('company', [self.company]), Sep()]
|
data += [_symbol('company', [self.company]), Sep()]
|
||||||
data += [_symbol('comment', [1, self.comment1]), Sep()]
|
for num, val in enumerate(self.comment):
|
||||||
data += [_symbol('comment', [2, self.comment2]), Sep()]
|
data += [_symbol('comment', [num+1, val]), Sep()]
|
||||||
data += [_symbol('comment', [3, self.comment3]), Sep()]
|
|
||||||
data += [_symbol('comment', [4, self.comment4]), Sep()]
|
|
||||||
return [Sep(), Sep(), _symbol('title_block', data)]
|
return [Sep(), Sep(), _symbol('title_block', data)]
|
||||||
|
|
||||||
def write_lib_symbols(self, cross=False):
|
def write_lib_symbols(self, cross=False):
|
||||||
|
|
|
||||||
|
|
@ -230,10 +230,8 @@ class Optionable(object):
|
||||||
name = name.replace('%bf', GS.pcb_basename)
|
name = name.replace('%bf', GS.pcb_basename)
|
||||||
name = name.replace('%bp', _cl(GS.pcb_title))
|
name = name.replace('%bp', _cl(GS.pcb_title))
|
||||||
name = name.replace('%br', _cl(GS.pcb_rev))
|
name = name.replace('%br', _cl(GS.pcb_rev))
|
||||||
name = name.replace('%bC1', _cl(GS.pcb_com1))
|
for num, val in enumerate(GS.pcb_com):
|
||||||
name = name.replace('%bC2', _cl(GS.pcb_com2))
|
name = name.replace('%bC'+str(num+1), _cl(val))
|
||||||
name = name.replace('%bC3', _cl(GS.pcb_com3))
|
|
||||||
name = name.replace('%bC4', _cl(GS.pcb_com4))
|
|
||||||
if GS.solved_global_variant:
|
if GS.solved_global_variant:
|
||||||
name = name.replace('%g', GS.solved_global_variant.file_id)
|
name = name.replace('%g', GS.solved_global_variant.file_id)
|
||||||
name = name.replace('%G', GS.solved_global_variant.name)
|
name = name.replace('%G', GS.solved_global_variant.name)
|
||||||
|
|
@ -245,10 +243,8 @@ class Optionable(object):
|
||||||
name = name.replace('%sf', GS.sch_basename)
|
name = name.replace('%sf', GS.sch_basename)
|
||||||
name = name.replace('%sp', _cl(GS.sch_title))
|
name = name.replace('%sp', _cl(GS.sch_title))
|
||||||
name = name.replace('%sr', _cl(GS.sch_rev))
|
name = name.replace('%sr', _cl(GS.sch_rev))
|
||||||
name = name.replace('%sC1', _cl(GS.sch_com1))
|
for num, val in enumerate(GS.sch_com):
|
||||||
name = name.replace('%sC2', _cl(GS.sch_com2))
|
name = name.replace('%sC'+str(num+1), _cl(val))
|
||||||
name = name.replace('%sC3', _cl(GS.sch_com3))
|
|
||||||
name = name.replace('%sC4', _cl(GS.sch_com4))
|
|
||||||
name = name.replace('%D', GS.n.strftime(GS.global_date_format))
|
name = name.replace('%D', GS.n.strftime(GS.global_date_format))
|
||||||
name = name.replace('%T', GS.n.strftime(GS.global_time_format))
|
name = name.replace('%T', GS.n.strftime(GS.global_time_format))
|
||||||
if self:
|
if self:
|
||||||
|
|
@ -292,10 +288,8 @@ class Optionable(object):
|
||||||
name = name.replace('%f', GS.pcb_basename)
|
name = name.replace('%f', GS.pcb_basename)
|
||||||
name = name.replace('%p', _cl(GS.pcb_title))
|
name = name.replace('%p', _cl(GS.pcb_title))
|
||||||
name = name.replace('%r', _cl(GS.pcb_rev))
|
name = name.replace('%r', _cl(GS.pcb_rev))
|
||||||
name = name.replace('%C1', _cl(GS.pcb_com1))
|
for num, val in enumerate(GS.pcb_com):
|
||||||
name = name.replace('%C2', _cl(GS.pcb_com2))
|
name = name.replace('%C'+str(num+1), _cl(val))
|
||||||
name = name.replace('%C3', _cl(GS.pcb_com3))
|
|
||||||
name = name.replace('%C4', _cl(GS.pcb_com4))
|
|
||||||
if GS.sch and do_sch:
|
if GS.sch and do_sch:
|
||||||
name = name.replace('%c', _cl(GS.sch_comp))
|
name = name.replace('%c', _cl(GS.sch_comp))
|
||||||
name = name.replace('%d', _cl(GS.sch_date))
|
name = name.replace('%d', _cl(GS.sch_date))
|
||||||
|
|
@ -303,10 +297,8 @@ class Optionable(object):
|
||||||
name = name.replace('%f', GS.sch_basename)
|
name = name.replace('%f', GS.sch_basename)
|
||||||
name = name.replace('%p', _cl(GS.sch_title))
|
name = name.replace('%p', _cl(GS.sch_title))
|
||||||
name = name.replace('%r', _cl(GS.sch_rev))
|
name = name.replace('%r', _cl(GS.sch_rev))
|
||||||
name = name.replace('%C1', _cl(GS.sch_com1))
|
for num, val in enumerate(GS.sch_com):
|
||||||
name = name.replace('%C2', _cl(GS.sch_com2))
|
name = name.replace('%C'+str(num+1), _cl(val))
|
||||||
name = name.replace('%C3', _cl(GS.sch_com3))
|
|
||||||
name = name.replace('%C4', _cl(GS.sch_com4))
|
|
||||||
# sanitize the name to avoid characters illegal in file systems
|
# sanitize the name to avoid characters illegal in file systems
|
||||||
name = name.replace('\\', '/')
|
name = name.replace('\\', '/')
|
||||||
name = re.sub(r'[?%*:|"<>]', '_', name)
|
name = re.sub(r'[?%*:|"<>]', '_', name)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue