Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
f24540e
initial commit - added EagleParser
Funkenjaeger Jan 2, 2021
a635ba5
Stylistic fixes
Funkenjaeger Jan 3, 2021
41cbc46
Refactored EagleParser to GenericJsonParser, added 'spec version' log…
Funkenjaeger Jan 3, 2021
83dbbc7
_type and _spec_version in top level object only
Funkenjaeger Jan 4, 2021
5c900c7
#216 code review updates
Funkenjaeger Jan 4, 2021
2816e8a
Fix format string syntax
Funkenjaeger Jan 4, 2021
9bbceae
Initial implementation of JSON validation with schema in GenericJsonP…
Funkenjaeger Jan 6, 2021
d363618
Updated to implement the rest of the pcbdata struct as defined in DAT…
Funkenjaeger Jan 9, 2021
976f1c5
Fix ExtraData (array vs. object)
Funkenjaeger Jan 9, 2021
ca9e92a
Initial cut at support for extra_fields in generic JSON schema & parser
Funkenjaeger Jan 10, 2021
6cc6c96
Merge branch 'master' into eagle_support
Funkenjaeger Jan 15, 2021
ccb2f55
Merge upstream, some changes to address code review comments
Funkenjaeger Jan 16, 2021
c7a5e44
Merge branch 'genericjson_extra_fields' into eagle_support
Funkenjaeger Jan 16, 2021
44c8d22
More schema updates based on code review
Funkenjaeger Jan 16, 2021
63ed7fd
Removed parser-specific code from the core code in ibom.py
Funkenjaeger Jan 16, 2021
021723e
#216 code review updates
Funkenjaeger Jan 20, 2021
2b46456
Funkenjaeger Jan 20, 2021
2afaf02
Extra field data embedded in components for kicad parser also
Funkenjaeger Jan 22, 2021
65f4afb
Merge remote-tracking branch 'upstream/master' into eagle_support
Funkenjaeger Jan 22, 2021
eb31d9f
Override board bounding box from generic JSON based on edges
Funkenjaeger Jan 23, 2021
7ac7d8a
Restore warning for outdated netlist/xml in kicad parser
Funkenjaeger Jan 23, 2021
667b0c1
Fix clerical issues noted in code review
Funkenjaeger Jan 23, 2021
f023f0d
Fix improper access of footprint ref in kicad.py
Funkenjaeger Jan 24, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 14 additions & 1 deletion InteractiveHtmlBom/ecad/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,15 @@ def get_parser_by_extension(file_name, config, logger):
if ext == '.kicad_pcb':
return get_kicad_parser(file_name, config, logger)
elif ext == '.json':
return get_easyeda_parser(file_name, config, logger)
""".json file may be from EasyEDA or Eagle - look for '_source' attribute in the file to disambiguate"""
import io
import json
with io.open(file_name, 'r') as f:
obj = json.load(f)
if '_source' in obj and obj['_source'] == 'eagle':
return get_eagle_parser(file_name, config, logger)
else:
return get_easyeda_parser(file_name, config, logger)
else:
return None

Expand All @@ -19,3 +27,8 @@ def get_kicad_parser(file_name, config, logger, board=None):
def get_easyeda_parser(file_name, config, logger):
from .easyeda import EasyEdaParser
return EasyEdaParser(file_name, config, logger)


def get_eagle_parser(file_name, config, logger):
from .eagle import EagleParser
return EagleParser(file_name, config, logger)
45 changes: 45 additions & 0 deletions InteractiveHtmlBom/ecad/eagle.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import io

from .common import EcadParser, Component


class EagleParser(EcadParser):
import json

class EagleJsonDecoder(json.JSONDecoder):
def __init__(self, *args, **kwargs):
import json
json.JSONDecoder.__init__(self, object_hook=self.object_hook, *args, **kwargs)

def object_hook(self, obj):
if '_type' in obj and obj['_type'] == 'InteractiveHtmlBom.ecad.common.Component':
return [Component(c['ref'], c['val'], c['footprint'], c['layer'], c['attr']) for c in obj['object']]
else:
return obj

def get_eagle_pcb(self):
import json
with io.open(self.file_name, 'r') as f:
return json.load(f, cls=self.EagleJsonDecoder)

def _verify(self, pcb):

"""Spot check the pcb object."""
if 'pcbdata' not in pcb:
self.logger.error('No pcbdata object.')
return False

if 'components' not in pcb:
self.logger.error('No components object.')
return False

return True

def parse(self):
pcb = self.get_eagle_pcb()
if not self._verify(pcb):
self.logger.error('File ' + self.file_name +
' does not appear to be valid Eagle json file.')
return None, None

return pcb['pcbdata'], pcb['components']