From baa8f570b887a0c5c71663d161f5219998bfde08 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Thu, 19 May 2016 07:51:53 +1000 Subject: [PATCH] Improved documentation --- KiBOM_CLI.py | 1 + README.md | 19 ++++++++++++++++++- __init__.py | 5 ++--- example/help.png | Bin 0 -> 11638 bytes example/html_eg.png | Bin 0 -> 8317 bytes 5 files changed, 21 insertions(+), 4 deletions(-) create mode 100644 example/help.png create mode 100644 example/html_eg.png diff --git a/KiBOM_CLI.py b/KiBOM_CLI.py index 25339580..04e4e5d1 100644 --- a/KiBOM_CLI.py +++ b/KiBOM_CLI.py @@ -11,6 +11,7 @@ import argparse here = os.path.abspath(os.path.dirname(sys.argv[0])) sys.path.append(here) +sys.path.append(os.path.join(here,"KiBOM")) from KiBOM.columns import ColumnList from KiBOM.netlist_reader import * diff --git a/README.md b/README.md index 828772cc..ea64ce89 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,23 @@ KiBoM intelligently groups components based on multiple factors, and can generat BoM options are user-configurable in a per-project configuration file. +## Usage + +The *KiBOM_CLI* script can be run directly from KiCad or from the command line. For command help, run the script with the *-h* flag e.g. + + python KiBOM_CLI.py -h + +![alt tag](example/help.png?raw=True "Command Line") + +**netlist** The netlist must be provided to the script. When running from KiCAD use "%I" +**--output / -o** If provided, this is the path to the BoM output. If not provided, the script will use the same name as the input file, with the suffix "_bom.csv" +**--cfg** If provided, this is the BOM config file that will be used. If not provided, options will be loaded from "bom.ini" +**--verbose / -v** Enable extra debugging information + +To run from KiCad, simply add the same command line in the *Bill of Materials* script window. e.g. to generate a HTML output: + +![alt tag](example/html_eg.png?raw=True "HTML Example") + ## Features ### Intelligent Component Grouping @@ -107,7 +124,7 @@ Hit the "Generate" button, and the output window should show that the BoM genera ### HTML Output The output HTML file is generated as follows: -![alt tag](example/html.png?raw=True "HTML") +![alt tag](example/html_eg.png?raw=True "HTML") Here the components are correctly grouped, with links to datasheets where appropriate, and fields color-coded. diff --git a/__init__.py b/__init__.py index 90b1d514..f234336b 100644 --- a/__init__.py +++ b/__init__.py @@ -1,3 +1,2 @@ - -import sys -sys.path.append(".") \ No newline at end of file +import KiBOM +from KiBOM import * \ No newline at end of file diff --git a/example/help.png b/example/help.png new file mode 100644 index 0000000000000000000000000000000000000000..8dbb526feff2f4b2b8dda1ac411398e2853cc8a3 GIT binary patch literal 11638 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 o0NV;w#ZaY&CJ0Ecf*~kM2{j-hU_gV?RC=!> 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 literal 0 HcmV?d00001