Updated repo with new screen shots

This commit is contained in:
John Pateman 2017-08-25 19:30:50 +01:00
parent 95c67e4a99
commit 7cf25f7a8a
13 changed files with 43 additions and 973 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 239 KiB

After

Width:  |  Height:  |  Size: 473 KiB

BIN
Documents/F_Cu.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 475 KiB

BIN
Documents/F_Cu2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 392 KiB

BIN
Documents/F_Fab.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 473 KiB

BIN
Documents/F_Mask.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 382 KiB

After

Width:  |  Height:  |  Size: 380 KiB

View File

@ -1,39 +0,0 @@
# KiCad-Diff
Scripts for performing image diffs between pcbnew layout revisions. Extended to show the graphical diff in a webpage. Also included some genral Kicad/Fossil observations.
Based on the initial scripts of Spuder and described in https://github.com/UltimateHackingKeyboard/electronics/tree/master/scripts
The workflow describes how to use a git repository for Kicad printed circuit board board versions. Kicad uses text files for schematic and pcb layout files. Whilst it is easy enough to generate and diff two pcb layout files, the results are almost meningless as it is impossible to decide what items have moved where.
Additionally, Spuders workflow relied on git - and I rather prefer Fossil-scm as it is a more complete solution (has a wiki and bugtracker built in) and is a small memory footprint.
https://www.fossil-scm.org/index.html/doc/trunk/www/index.wiki
Also, Spuder's workflow relied on a python script that was downloaded to a /tmp directory. This makes the solution problematic if you are without internet access.
I have added a web interface to this project. It is functional but needs some work to render it more attractive.
The code is pretty sloppy and fairly sparesly commented but functional. The diff program should be run within a fossil checkout and takes 0, 1 or 2 commit hashes as arguments. With 0 arguments, the script compares the working copy with the last committed version (i.e what has changes since the last commit). With 1 argument, the current checkout is compared to the version identified and with two commit hashes a diff between those versions is calculated.
The diffed versions of the pcb are then used to generate parallel sets of svg files using the kicad python interface. The svg files are then converted to png and cropped to just the board area. Image magick is used to manipulate the images to highlight the changed items.
One strategy is to use the stereo 0 command but I had no luck with this and have come up with an alternative method.
Finally the images are presented in a webpage - clicking an image will bring up a 3-pane diff showing before and after and the composite image with the differences highlighted. The webpage generation code needs a bit of work to make it neater and easier to follow (next part of project).
Kicad tends to modify some of the minor data in the checkout making commits a bit 'noisy'. I have adopted the sheme proposed here https://jnavila.github.io/plotkicadsch/ to ammend the kicad files before commiting them. Although there is quite extensive scripting support in fossil it seems quite difficult to replicate the clean and smudge technique reliably in Fossil. There is a wrapper project called fsl (http://fossil.0branch.com/fsl/home) which acts as an interceptor to fossil commands and, additionally offers some extra shortcuts and some more colourful logging options (and the Dresden branch allows the use of simple revision numbers). The behavior is controlled by a ~/.fslrc file which I have included in this repo.
I am running this setup on macOs 10.12 but I would imagine any linux varient would work as well. Windows - ymmv...
Dependencies
* gsed (Mac sed is limited)
* Kicad with python scripting enabled
* Image Magick
* Fossil scm
* Possibly some others but all have been installed with the help of brew
## screenshots
Overview
![screenshot overview](/Documents/Overview.png)
Three panel view
![screenshot Three panel view](/Documents/3panel.png)

384
kidiff.sh
View File

@ -1,384 +0,0 @@
#!/usr/bin/env bash
# Takes one or two Fossil ref's as arguments and generates visual diffs between them
# If only one ref specified, generates a diff from that file
# If no refs specified, assumes CURRENT
# TODO Consider moving all formatting to a single, external css file and putting all id:0
# created web content into a 'web' directory.
# TODO Improve 3-pane layout - possible two side by side and comparison image underneath? id:2
# TODO Remove filename from display format i.e 'filename-F_Cu' becomes 'F_Cu' id:6
qual="100"
# TODO Add command line quality option - Quality is dpi. 100 is fast but low quality id:10
# 600 is very detailed. 300 is a good compromise.
# TODO Add recolour option id:15
# 952927
# convert F_Cu.png -fill "#952927" -fuzz 75% -opaque "#ffffff" test2.png
# Remove old plot files
rm -r /tmp/svg
# Set directory for plotting
OUTPUT_DIR="./plots"
rm -r $OUTPUT_DIR
# TODO Have added this temporarily to simply remove all the plots prior to generating files. id:1
# Theoretically the script could check if the files have already been generated and then only generate the
# missing files. This would permit multiple diff compares and you could also use an external diff tool like p4merge
# but the disadvantage is that the resoultions have to match. It is also more complicated to script
# Ideally one could request random compares within the web interface and there would
# be 'on the fly' svg/png creation and diff showing.
# Try to keep the web components seperate from the images so that the images could be
# looked at using a graphical diff viewer like p4merge.
# Set directory for web backend
WEB_DIR=$OUTPUT_DIR"/web"
# TODO Might need to use a more complex strategy to cope with spaces in filename id:3
# using some varient of 'find . -name "*.pro" -print0 | xargs -0'
#################################
# Colours to substitute per layer
#
# Additionally need to add vias, and internal layers.
# TODO Parse the pcbnew file to determine which layers are active. id:7
F_Cu="#952927"
B_Cu="#359632"
B_Paste="#3DC9C9"
F_Paste="#969696"
F_SilkS="#339697"
B_SilkS="#481649"
B_Mask="#943197"
F_Mask="#943197"
Edge_Cuts="#C9C83B"
In1_Cu="#C2C200"
In2_Cu="#C200C2"
User_Dwgs="#C2C2C2"
User_Cmts="#000085"
User_Eco1="#008500"
User_Eco2="#C2C200"
B_Fab="#858585"
F_Fab="#C2C200"
# These are the colour definitions for the 'solarised' theme from pcbnew.
#ColorPCBLayer_F.Cu=rgb(221, 47, 44)
#ColorPCBLayer_In3.Cu=rgba(194, 194, 194, 0.800)
#ColorPCBLayer_In4.Cu=rgba(0, 132, 132, 0.800)
#ColorPCBLayer_In5.Cu=rgba(0, 132, 0, 0.800)
#ColorPCBLayer_In6.Cu=rgba(0, 0, 132, 0.800)
#ColorPCBLayer_Margin=rgba(194, 0, 194, 0.800)
#ColorPCBLayer_B.CrtYd=rgba(194, 194, 0, 0.800)
#ColorPCBLayer_F.CrtYd=rgba(132, 132, 132, 0.800)
#ColorTxtFrontEx=rgba(194, 194, 194, 0.800)
#ColorTxtBackEx=rgba(0, 0, 132, 0.800)
#ColorTxtInvisEx=rgba(132, 132, 132, 0.800)
#ColorAnchorEx=rgba(0, 0, 132, 0.800)
#ColorPadBackEx=rgba(0, 132, 0, 0.800)
#ColorPadFrontEx=rgba(132, 132, 132, 0.800)
#ColorViaThruEx=rgba(194, 194, 194, 0.800)
#ColorViaBBlindEx=rgba(132, 132, 0, 0.800)
#ColorViaMicroEx=rgba(0, 132, 132, 0.800)
#ColorNonPlatedEx=rgba(194, 194, 0, 0.800)
#########################################################
# Find the .kicad_pcb files that differ between commits #
#########################################################
# Look at number of arguments provided set different variables based on number of Fossil refs
#############################################################################################
# 0. User provided no Fossil references, compare against last Fossil commit
if [ $# -eq 0 ]; then
DIFF_1="current"
DIFF_2=$(fossil info current | grep ^uuid: | tr -d 'uuid:[:space:]' | cut -c 1-6)
echo $DIFF_2
CHANGED_KICAD_FILES=$(fossil diff --brief -r "$DIFF_2" | grep '.kicad_pcb$' | tr -d 'CHANGED[:space:]||ADDED[:space:]')
if [[ -z "$CHANGED_KICAD_FILES" ]]; then echo "No .kicad_pcb files differ" && exit 0; fi
# Copy all modified kicad_pcb files to $OUTPUT_DIR/current
for k in $CHANGED_KICAD_FILES; do
mkdir -p "$OUTPUT_DIR/$DIFF_1"
cp "$k" $OUTPUT_DIR/current
done
# Copy the Fossil commit kicad_pcb file to $OUTPUT_DIR/commit uuid
for k in $CHANGED_KICAD_FILES; do
mkdir -p "$OUTPUT_DIR/$DIFF_2"
echo "Copying $DIFF_2:$k to $OUTPUT_DIR/$DIFF_2/"
fossil cat $k -r $DIFF_2 > "$OUTPUT_DIR/$DIFF_2/$(basename $k)"
done
# 1. User supplied one Fossil reference to compare against current files
elif [ $# -eq 1 ]; then
DIFF_1="current"
DIFF_2="$1"
CHANGED_KICAD_FILES=$(fossil diff --brief -r "$DIFF_2" | grep '.kicad_pcb$' | tr -d 'CHANGED[:space:]||ADDED[:space:]')
if [[ -z "$CHANGED_KICAD_FILES" ]]; then echo "No .kicad_pcb files differ" && exit 0; fi
# Copy all modified kicad_file to $OUTPUT_DIR/current
for k in $CHANGED_KICAD_FILES; do
mkdir -p "$OUTPUT_DIR/$DIFF_1"
cp "$k" $OUTPUT_DIR/current
done
# Copy the specified Fossil commit kicad_file to $OUTPUT_DIR/$(Fossil ref)
for k in $CHANGED_KICAD_FILES; do
mkdir -p "$OUTPUT_DIR/$DIFF_2"
echo "Copying $DIFF_2:$k to $OUTPUT_DIR/$DIFF_2/$k"
fossil cat $k -r $DIFF_2 > "$OUTPUT_DIR/$DIFF_2/$(basename $k)"
done
# 2. User supplied 2 Fossil references to compare
elif [ $# -eq 2 ]; then
DIFF_1="$1"
DIFF_2="$2"
CHANGED_KICAD_FILES=$(fossil diff --brief -r "$DIFF_1" --to "$DIFF_2" | grep '.kicad_pcb' | tr -d 'CHANGED[:space:]||ADDED[:space:]')
if [[ -z "$CHANGED_KICAD_FILES" ]]; then echo "No .kicad_pcb files differ" && exit 0; fi
# Copy all modified kicad_file to $OUTPUT_DIR/current
for k in $CHANGED_KICAD_FILES; do
mkdir -p "$OUTPUT_DIR/$DIFF_1"
fossil cat $k -r $DIFF_1 > "$OUTPUT_DIR/$DIFF_1/$(basename $k)"
done
# Copy the specified Fossil commit kicad_file to $OUTPUT_DIR/Fossil uuid
for k in $CHANGED_KICAD_FILES; do
mkdir -p "$OUTPUT_DIR/$DIFF_2"
echo "Copying $DIFF_2:$k to $OUTPUT_DIR/$DIFF_2/$k"
fossil cat $k -r $DIFF_2 > "$OUTPUT_DIR/$DIFF_2/$(basename $k)"
done
# 3. User provided too many references
else
echo "Please only provide 1 or 2 arguments: not $#"
exit 2
fi
echo "Kicad files saved to: '$OUTPUT_DIR/$DIFF_1' and '$OUTPUT_DIR/$DIFF_2'"
# Generate svg files from kicad output
######################################
#
# Use the python script 'plot_pcbnew.py' to generate svg files from the two *.kicad_pcb files.
# Files are saved in /tmp/svg/COMMIT_ID
#
for f in $OUTPUT_DIR/$DIFF_1/*.kicad_pcb; do
mkdir -p /tmp/svg/$DIFF_1
echo "Converting $f to .svg: Files will be saved to /tmp/svg"
/usr/local/bin/plot_pcbnew.py "$f" "/tmp/svg/$DIFF_1"
done
for f in $OUTPUT_DIR/$DIFF_2/*.kicad_pcb; do
mkdir -p /tmp/svg/$DIFF_2
echo "Converting $f to .svg's Files will be saved to /tmp/svg"
/usr/local/bin/plot_pcbnew.py "$f" "/tmp/svg/$DIFF_2"
done
# Convert svg files into png
######################################
#
# Parse the svg files in /tmp/svg/COMMIT_ID using Image Magick.
# The conversion trims the image to the active area using the 'trim' function.
# Fuzz is probably not nescessary (trim measures the corner pixel value and trims
# to the first non-corner coloured pixel. Fuzz allows for minor variation but as this is
# a generated svg, pixels should be white.)
#
# The .png files are created in the output directory.
for p in /tmp/svg/$DIFF_1/*.svg; do
d=$(basename $p)
echo "Converting $p to .png"
convert -density $qual -fuzz 1% -trim +repage "$p" "$OUTPUT_DIR/$DIFF_1/${d%%.*}.png"
convert "$OUTPUT_DIR/$DIFF_1/${d%%.*}.png" -negate "$OUTPUT_DIR/$DIFF_1/${d%%.*}.png"
done
for p in /tmp/svg/$DIFF_2/*.svg; do
d=$(basename $p)
echo "Converting $p to .png"
convert -density $qual -fuzz 1% -trim +repage "$p" "$OUTPUT_DIR/$DIFF_2/${d%%.*}.png"
convert "$OUTPUT_DIR/$DIFF_2/${d%%.*}.png" -negate "$OUTPUT_DIR/$DIFF_2/${d%%.*}.png"
done
# Generate png diffs between DIFF_1 and DIFF_2
##############################################
#
# Originally the intention was to use the ImageMagic 'composite stereo 0' function to identify
# where items have moved but I could not get this to work.
# This flattens the original files to greyscale and they need to be converted
# back to rgb in order to be colourised.
for g in $OUTPUT_DIR/$DIFF_1/*.png; do
d=$(basename $g)
y=${d%.png}
layerName=${y##*-}
mkdir -p "$OUTPUT_DIR/diff-$DIFF_1-$DIFF_2"
echo "Generating composite image $OUTPUT_DIR/diff-$DIFF_1-$DIFF_2/$(basename $g)"
convert '(' $OUTPUT_DIR/$DIFF_2/$(basename $g) -flatten -grayscale Rec709Luminance ')' \
'(' $OUTPUT_DIR/$DIFF_1/$(basename $g) -flatten -grayscale Rec709Luminance ')' \
'(' -clone 0-1 -compose darken -composite ')' \
-channel RGB -combine $OUTPUT_DIR/diff-$DIFF_1-$DIFF_2/$(basename $g)
convert "$OUTPUT_DIR/diff-$DIFF_1-$DIFF_2/$(basename $g)" -fill ${!layerName} -fuzz 75% -opaque "#ffffff" "$OUTPUT_DIR/diff-$DIFF_1-$DIFF_2/$(basename $g)"
done
for p in $OUTPUT_DIR/$DIFF_1/*.png; do
d=$(basename $p)
y=${d%.png}
layerName=${y##*-}
echo "Converting $layerName to .png with colour "${!layerName}
convert "$OUTPUT_DIR/$DIFF_1/${d%%.*}.png" -define png:color-type=2 "$OUTPUT_DIR/$DIFF_1/${d%%.*}.png"
convert "$OUTPUT_DIR/$DIFF_1/${d%%.*}.png" -fill ${!layerName} -fuzz 75% -opaque "#ffffff" "$OUTPUT_DIR/$DIFF_1/${d%%.*}.png"
done
for p in $OUTPUT_DIR/$DIFF_2/*.png; do
d=$(basename $p)
y=${d%.png}
layerName=${y##*-}
echo "Converting $layerName to .png with colour "${!layerName}
convert "$OUTPUT_DIR/$DIFF_2/${d%%.*}.png" -define png:color-type=2 "$OUTPUT_DIR/$DIFF_2/${d%%.*}.png"
convert "$OUTPUT_DIR/$DIFF_2/${d%%.*}.png" -fill ${!layerName} -fuzz 75% -opaque "#ffffff" "$OUTPUT_DIR/$DIFF_2/${d%%.*}.png"
done
# Setup web directories for web output
######################################
#
# Remove index.html prior to streaming new data
# TODO Would be neater to put thumbs, tryptych, index and any .css sheet in a 'web' directory id:11
#
if [ -e $OUTPUT_DIR/index.html ]
then rm $OUTPUT_DIR/index.html
fi
if [ -d thumbs ]
then echo "'thumbs' directory found"
else mkdir $OUTPUT_DIR/thumbs && echo "'thumbs' directory created"
fi
if [ -d tryptych ]
then echo "'tryptych' directory found"
else mkdir $OUTPUT_DIR/tryptych && echo "'tryptych' directory created"
fi
# Stream HTML <head> and <style> to index.html
##############################################
#
# It would make more sense to stream this to $OUTPUT_DIR/web/style.css
# and reuse it in the 'tryptich' section.
cat >> $OUTPUT_DIR/index.html <<_HEAD_
<!DOCTYPE HTML>
<html lang="en">
<head>
<style>
<link rel="stylesheet" href="style.css">
</style>
</head>
<body>
<div class="title">
PCBnew Graphical Diff</div>
<div class="box green"></div><div class="desc1">in <b>$DIFF_1</b> and not in <b>$DIFF_2</b></div>
<div class="box red"></div><div class="desc2">in <b>$DIFF_2</b> and not in <b>$DIFF_1</b></div>
_HEAD_
#for g in $OUTPUT_DIR/diff-$DIFF_1-$DIFF_2/$HTTP/*.png; do
for g in $OUTPUT_DIR/diff-$DIFF_1-$DIFF_2/*.png; do
convert -resize 300 $g ./plots/thumbs/th_$(basename $g)
#cp $g ./plots/thumbs/th_$(basename $g)
route=$g
file=${route##*/}
base=${file%.*}
dir=$(dirname $g)
echo $dir
cat >> $OUTPUT_DIR/index.html <<_HTML_
<div class="responsive">
<div class="gallery">
<a target="_blank" href = tryptych/$(basename $g).html>
<img src = thumbs/th_$(basename $g) width="300" height="200">
</a>
<div class="desc">$base</div>
</div>
</div>
_HTML_
cat >> $OUTPUT_DIR/tryptych/$(basename $g).html <<HTML
<!DOCTYPE HTML>
<html lang="en">
<head>
<style>
<link rel="stylesheet" href="style.css">
</style>
</head>
<div class="title">$base</div>
<body>
<div class="responsive">
<div class="gallery">
<a target="_blank" href = $(basename $g).html>
<a href= ../$DIFF_1/$(basename $g)><img src = "../$DIFF_1/$(basename $g)" width=500></a>
</a>
<div class="desc1">$DIFF_1</div>
</div>
</div>
<div class="responsive">
<div class="gallery">
<a target="_blank" href = $(basename $g).html>
<a href = ../diff-$DIFF_1-$DIFF_2/$(basename $g) ><img src = ../diff-$DIFF_1-$DIFF_2/$(basename $g) width=500></a>
</a>
<div class="desc">Composite</div>
</div>
</div>
<div class="responsive">
<div class="gallery">
<a target="_blank" href = $(basename $g).html>
<a href= ../$DIFF_2/$(basename $g)> <img src = "../$DIFF_2/$(basename $g)" width=500></a>
</a>
<div class="desc2">$DIFF_2</div>
</div>
</div>
HTML
done
cat >>$OUTPUT_DIR/index.html<<FOOT
<div class="clearfix"></div>
<div style="padding:6px;">
</div>
FOOT
echo "HTML created and written to index.html"
open $OUTPUT_DIR/index.html

View File

@ -4,12 +4,40 @@
# If only one ref specified, generates a diff from that file
# If no refs specified, assumes CURRENT
# TODO Rewrite in Python & improve efficiency.
# A Python version should be easier to maintain esp the HTML generation.
# Would be possible to add as a 'plugin' (not sure if that is worthwhile).
# TODO Add a graticle/grid with grid references.
# TODO Add back code to support alternative SCM (eg git)
# TODO Improve 3-pane layout - possible two side by side and comparison image underneath? id:16
# TODO Improve diff text parser. Currently difficult to diff as modules have multiple
# entries on different layers - need to identify graphic change with
# entries on different layers - need to identify graphic change with s-expression parser
# Need to generate a 'tree' and diff changes need to propogate back up tree to id
# the changed heading category. This could then be used to drive a drop down menu tree.
# e.g.
#(module Mounting_Holes:MountingHole_5.5mm (layer F.Cu) (tedit 56D1B4CB) (tstamp 598A07F7)
# (at 112.28 125.28)
# (descr "Mounting Hole 5.5mm, no annular")
# (tags "mounting hole 5.5mm no annular")
# (fp_text reference REF** (at 0 -6.5) (layer F.SilkS)
# (effects (font (size 1 1) (thickness 0.15)))
# )
# (fp_text value MountingHole_5.5mm (at 0 6.5) (layer F.Fab)
# (effects (font (size 1 1) (thickness 0.15)))
# )
# (fp_circle (center 0 0) (end 5.5 0) (layer Cmts.User) (width 0.15))
# (fp_circle (center 0 0) (end 5.75 0) (layer F.CrtYd) (width 0.05))
# (pad 1 np_thru_hole circle (at 0 0) (size 5.5 5.5) (drill 5.5) (layers *.Cu *.Mask))
#)
# Changes to the last line need to propogate through to the parent 'Module Mounting_Holes'
# Ideally the aim would be to have 'clicakble' regions.
# TODO Consider removing filename from display format i.e 'filename-F_Cu' becomes 'F_Cu' id:13
# Add command line quality option - Quality is dpi. 100 is fast but low quality id:4
# TODO Add command line quality option - Quality is dpi. 100 is fast but low quality id:4
# 600 is very detailed. 300 is a good compromise.
# TODO Consider alternatve generation orders
# 1. svg > png > compare > crop to comparison image > crop source images to match
@ -18,7 +46,7 @@
#easily, swaping the white for black seems to be problematic - not sure why
#prob something to do with evenodd
qual="100"
qual="600"
# TODO Command line options for selecting which plots id:8
@ -373,10 +401,10 @@ cat >> $OUTPUT_DIR/$WEB_DIR/index.html <<HTML
<tbody>
<tr>
<td colspan="6" width="256">
<h1>$CHANGED_KICAD_FILES</h>
<h4>$TITLE</h>
<h5>$DATE</h>
<h5>$COMPANY</h>
<h1>$CHANGED_KICAD_FILES
<h4>$TITLE
<h5>$DATE
<h5>$COMPANY
</td>
</tr>
<tr>
@ -523,7 +551,6 @@ div.responsive {
</style>
</head>
<body>
<h2>$base</h><br>
<div class="responsive">

View File

@ -42,11 +42,11 @@ pctl.SetColorMode(True)
layers = [
("F_Cu", pcbnew.F_Cu, "Top layer"),
("B_Cu", pcbnew.B_Cu, "Bottom layer"),
# ("B_Paste", pcbnew.B_Paste, "Paste bottom"),
("B_Paste", pcbnew.B_Paste, "Paste bottom"),
("F_Paste", pcbnew.F_Paste, "Paste top"),
("F_SilkS", pcbnew.F_SilkS, "Silk top"),
# ("B_SilkS", pcbnew.B_SilkS, "Silk top"),
# ("B_Mask", pcbnew.B_Mask, "Mask bottom"),
("B_SilkS", pcbnew.B_SilkS, "Silk top"),
("B_Mask", pcbnew.B_Mask, "Mask bottom"),
("F_Mask", pcbnew.F_Mask, "Mask top"),
("Edge_Cuts", pcbnew.Edge_Cuts, "Edges"),
("Margin", pcbnew.Margin, "Margin"),
@ -56,11 +56,11 @@ layers = [
("Cmts_User", pcbnew.Cmts_User, "Comments_User"),
("Eco1_User", pcbnew.Eco1_User, "ECO1"),
("Eco2_User", pcbnew.Eco2_User, "ECO2"),
# ("B_Fab", pcbnew.B_Fab, "Fab bottom"),
("B_Fab", pcbnew.B_Fab, "Fab bottom"),
("F_Fab", pcbnew.F_Fab, "Fab top"),
# ("B_Adhes", pcbnew.B_Adhes, "Adhesive bottom"),
("B_Adhes", pcbnew.B_Adhes, "Adhesive bottom"),
("F_Adhes", pcbnew.F_Adhes, "Adhesive top"),
# ("B_CrtYd", pcbnew.B_CrtYd, "Courtyard bottom"),
("B_CrtYd", pcbnew.B_CrtYd, "Courtyard bottom"),
("F_CrtYd", pcbnew.F_CrtYd, "Courtyard top"),
]

View File

@ -75,7 +75,7 @@ body {
.responsive {
padding: 0 6px;
float: left;
width: 24.99999%;
width: 19.99999%;
margin: 6px 0;
}

View File

@ -1,431 +0,0 @@
/* style.css */
.gallery {
border: 1px solid #ccc;
}
.gallery:hover {
border: 1px solid #777;
}
.gallery img {
width: 100%;
height: auto;
}
.desc {
padding: 15px;
text-align: center;
font: 15px arial, sans-serif;
}
.title {
padding: 15px;
text-align: left;
font: 25px arial, sans-serif;
color: #202b34;
}
.subtitle {
padding: 5px;
text-align: left;
font: 20px arial, sans-serif;
color: #000000;
}
.details {
padding: 20px;
text-align: left;
font: 15px arial, sans-serif;
color: #000000;
}
.differences{
padding: 5px;
text-align: left;
font: 18px courier, monospace;
color: #000000;
}
.th {
padding: 5px;
text-align: left;
font: 20px arial, sans-serif;
font-weight: bold;
color: #000000;
}
.td {
padding: 5px;
text-align: left;
font: 15px arial, sans-serif;
color: #000000;
}
* {
box-sizing: border-box;
}
.responsive {
padding: 0 6px;
float: left;
width: 24.99999%;
margin: 6px 0;
}
@media only screen and (max-width: 700px) {
.responsive {
width: 49.98%;
margin: 6px 0;
}
}
@media only screen and (max-width: 500px) {
.responsive {
width: 100%;
margin: 6px 0;
}
}
.clearfix:after {
content: "";
display: table;
clear: both;
}
.box {
float: left;
width: 20px;
height: 20px;
margin: 5px;
border: 1px solid rgba(0, 0, 0, .2);
}
.red {
background: #F40008;
}
.green {
background: #43ff01;
}
.white {
background: #ffffff;
}
.added {
color: #5EB6C4;
}
.removed {
color: #BA312D;
}
@import url(http://fonts.googleapis.com/css?family=Inconsolata);
@import url(http://fonts.googleapis.com/css?family=PT+Sans);
@import url(http://fonts.googleapis.com/css?family=PT+Sans+Narrow:400,700);
article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
nav,
section,
summary {
display: block;
}
audio,
canvas,
video {
display: inline-block;
}
audio:not([controls]) {
display: none;
height: 0;
}
[hidden] {
display: none;
}
html {
font-family: sans-serif;
-webkit-text-size-adjust: 100%;
-ms-text-size-adjust: 100%;
}
body {
margin: 0;
}
a:focus {
outline: thin dotted;
}
a:active,
a:hover {
outline: 0;
}
h1 {
font-size: 2em;
}
abbr[title] {
border-bottom: 1px dotted;
}
b,
strong {
font-weight: bold;
}
dfn {
font-style: italic;
}
mark {
background: #ff0;
color: #000;
}
code,
kbd,
pre,
samp {
font-family: monospace, serif;
font-size: 1em;
}
pre {
white-space: pre-wrap;
word-wrap: break-word;
}
q {
quotes: "\201C" "\201D" "\2018" "\2019";
}
small {
font-size: 80%;
}
sub,
sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sup {
top: -0.5em;
}
sub {
bottom: -0.25em;
}
img {
border: 0;
}
svg:not(:root) {
overflow: hidden;
}
figure {
margin: 0;
}
fieldset {
border: 1px solid #c0c0c0;
margin: 0 2px;
padding: 0.35em 0.625em 0.75em;
}
legend {
border: 0;
padding: 0;
}
button,
input,
select,
textarea {
font-family: inherit;
font-size: 100%;
margin: 0;
}
button,
input {
line-height: normal;
}
button,
html input[type="button"],
input[type="reset"],
input[type="submit"] {
-webkit-appearance: button;
cursor: pointer;
}
button[disabled],
input[disabled] {
cursor: default;
}
input[type="checkbox"],
input[type="radio"] {
box-sizing: border-box;
padding: 0;
}
input[type="search"] {
-webkit-appearance: textfield;
-moz-box-sizing: content-box;
-webkit-box-sizing: content-box;
box-sizing: content-box;
}
input[type="search"]::-webkit-search-cancel-button,
input[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
button::-moz-focus-inner,
input::-moz-focus-inner {
border: 0;
padding: 0;
}
textarea {
overflow: auto;
vertical-align: top;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
html {
font-family: 'PT Sans', sans-serif;
}
pre,
code {
font-family: 'Inconsolata', sans-serif;
}
h1,
h2,
h3,
h4,
h5,
h6 {
font-family: 'PT Sans Narrow', sans-serif;
font-weight: 700;
}
html {
background-color: #073642;
color: #839496;
margin: 1em;
}
body {
background-color: #002b36;
margin: 0 auto;
max-width: 23cm;
border: 1pt solid #586e75;
padding: 1em;
}
code {
background-color: #073642;
padding: 2px;
}
a {
color: #b58900;
}
a:visited {
color: #cb4b16;
}
a:hover {
color: #cb4b16;
}
h1 {
color: #d33682;
}
h2,
h3,
h4,
h5,
h6 {
color: #859900;
}
pre {
background-color: #002b36;
color: #839496;
border: 1pt solid #586e75;
padding: 1em;
box-shadow: 5pt 5pt 8pt #073642;
}
pre code {
background-color: #002b36;
}
h1 {
font-size: 2.8em;
}
h2 {
font-size: 2.4em;
}
h3 {
font-size: 1.8em;
}
h4 {
font-size: 1.4em;
}
h5 {
font-size: 1.3em;
}
h6 {
font-size: 1.15em;
}
.tag {
background-color: #073642;
color: #d33682;
padding: 0 0.2em;
}
.todo,
.next,
.done {
color: #002b36;
background-color: #dc322f;
padding: 0 0.2em;
}
.tag {
-webkit-border-radius: 0.35em;
-moz-border-radius: 0.35em;
border-radius: 0.35em;
}
.TODO {
-webkit-border-radius: 0.2em;
-moz-border-radius: 0.2em;
border-radius: 0.2em;
background-color: #2aa198;
}
.NEXT {
-webkit-border-radius: 0.2em;
-moz-border-radius: 0.2em;
border-radius: 0.2em;
background-color: #268bd2;
}
.ACTIVE {
-webkit-border-radius: 0.2em;
-moz-border-radius: 0.2em;
border-radius: 0.2em;
background-color: #268bd2;
}
.DONE {
-webkit-border-radius: 0.2em;
-moz-border-radius: 0.2em;
border-radius: 0.2em;
background-color: #859900;
}
.WAITING {
-webkit-border-radius: 0.2em;
-moz-border-radius: 0.2em;
border-radius: 0.2em;
background-color: #cb4b16;
}
.HOLD {
-webkit-border-radius: 0.2em;
-moz-border-radius: 0.2em;
border-radius: 0.2em;
background-color: #d33682;
}
.NOTE {
-webkit-border-radius: 0.2em;
-moz-border-radius: 0.2em;
border-radius: 0.2em;
background-color: #d33682;
}
.CANCELLED {
-webkit-border-radius: 0.2em;
-moz-border-radius: 0.2em;
border-radius: 0.2em;
background-color: #859900;
}

View File

@ -1,103 +0,0 @@
/* style.css */
TODO Need to differentiate the .responsive tag between the index and tryptych views
body {
background-color: #a2b1c6;
<style>
}
.gallery {
margin: 5px;
border: 1px solid #ccc;
float: left;
width: 180px;
}
.gallery:hover {
border: 1px solid #777;
}
.gallery img {
width: 100%;
height: auto;
}
.desc {
padding: 15px;
text-align: center;
}
.title {
padding: 15px;
text-align: left;
font: 25px arial, sans-serif;
color: #496075;
}
.subtitle {
padding: 5px;
text-align: left;
font: 20px arial, sans-serif;
color: #000000;
}
.details {
padding: 20px;
text-align: left;
font: 15px arial, sans-serif;
color: #000000;
}
.th {
padding: 5px;
text-align: left;
font: 20px arial, sans-serif;
font-weight: bold;
color: #000000;
}
.td {
padding: 5px;
text-align: left;
font: 15px arial, sans-serif;
color: #000000;
}
* {
box-sizing: border-box;
}
.clearfix:after {
content: "";
display: table;
clear: both;
}
.box {
float: left;
width: 20px;
height: 20px;
margin: 5px;
border: 1px solid rgba(0, 0, 0, .2);
}
.red {
background: #F40008;
}
.green {
background: #43ff01;
}
.white {
background: #ffffff;
}
.added {
background: #99ff66;
}
.removed {
background: #ff9966;
}