initial commit
This commit is contained in:
commit
a1db7dd9ba
238
Library.go
Normal file
238
Library.go
Normal file
@ -0,0 +1,238 @@
|
|||||||
|
package geagle
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/xml"
|
||||||
|
"io"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Boolean string
|
||||||
|
|
||||||
|
func True() Boolean {
|
||||||
|
return "yes"
|
||||||
|
}
|
||||||
|
|
||||||
|
func False() Boolean {
|
||||||
|
return "no"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b Boolean) ToBool() bool {
|
||||||
|
return b == "yes" || b == "on"
|
||||||
|
}
|
||||||
|
|
||||||
|
type Rotation string
|
||||||
|
|
||||||
|
func (r Rotation) Angle() int {
|
||||||
|
s := strings.TrimPrefix(string(r), "R")
|
||||||
|
v, _ := strconv.Atoi(s)
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
|
||||||
|
// Layer definition
|
||||||
|
type Layer struct {
|
||||||
|
Number int `xml:"number,attr"`
|
||||||
|
Name string `xml:"name,attr"`
|
||||||
|
Color int `xml:"color,attr"`
|
||||||
|
|
||||||
|
Fill int `xml:"fill,attr"`
|
||||||
|
Visible Boolean `xml:"visible,attr"`
|
||||||
|
Active Boolean `xml:"active,attr"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Grid definition
|
||||||
|
type Grid struct {
|
||||||
|
Distance float32 `xml:"distance,attr"`
|
||||||
|
Unitdist string `xml:"unitdist,attr"`
|
||||||
|
Unit string `xml:"unit,attr"`
|
||||||
|
Style string `xml:"style,attr"`
|
||||||
|
Multiple int `xml:"multiple,attr"`
|
||||||
|
Display Boolean `xml:"display,attr"`
|
||||||
|
|
||||||
|
// Alternative Grid Information
|
||||||
|
AlternativeDistance float32 `xml:"altdistance,attr"`
|
||||||
|
AlternativeDistanceUnit string `xml:"altunitdist,attr"`
|
||||||
|
AlternativeUnit string `xml:"altunit,attr"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Point struct {
|
||||||
|
X float32 `xml:"x,attr"`
|
||||||
|
Y float32 `xml:"y,attr"`
|
||||||
|
}
|
||||||
|
type Hole struct {
|
||||||
|
Point
|
||||||
|
Drill string `xml:"drill,attr"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Line struct {
|
||||||
|
X1 float32 `xml:"x1,attr"`
|
||||||
|
X2 float32 `xml:"x2,attr"`
|
||||||
|
Y1 float32 `xml:"y1,attr"`
|
||||||
|
Y2 float32 `xml:"y2,attr"`
|
||||||
|
}
|
||||||
|
type Wire struct {
|
||||||
|
Line
|
||||||
|
Width float32 `xml:"width,attr"`
|
||||||
|
Layer int `xml:"layer,attr"`
|
||||||
|
Curve float64 `xml:"curve,attr,omitempty"`
|
||||||
|
Cap string `xml:"cap,attr,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Pad struct {
|
||||||
|
Point
|
||||||
|
Name string `xml:"name,attr"`
|
||||||
|
Drill float32 `xml:"drill,attr"`
|
||||||
|
Shape string `xml:"shape,attr"`
|
||||||
|
Rotation Rotation `xml:"rot,attr,omitempty"`
|
||||||
|
}
|
||||||
|
type SmdPad struct {
|
||||||
|
Point
|
||||||
|
Name string `xml:"name,attr"`
|
||||||
|
Width float32 `xml:"dx,attr"`
|
||||||
|
Height float32 `xml:"dy,attr"`
|
||||||
|
Layer int `xml:"layer,attr"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Text struct {
|
||||||
|
Point
|
||||||
|
Size float32 `xml:"size,attr"`
|
||||||
|
Layer int `xml:"layer,attr"`
|
||||||
|
Alignment string `xml:"align,attr,omitempty"`
|
||||||
|
Ratio int `xml:"ratio,attr,omitempty"`
|
||||||
|
Text string `xml:",innerxml"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Circle struct {
|
||||||
|
Point
|
||||||
|
Radius float32 `xml:"radius,attr"`
|
||||||
|
Width float32 `xml:"width,attr"`
|
||||||
|
Layer int `xml:"layer,attr"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Rectangle struct {
|
||||||
|
Line
|
||||||
|
Layer int `xml:"layer,attr"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Primitives struct {
|
||||||
|
Wires []Wire `xml:"wire"`
|
||||||
|
Circles []Circle `xml:"circle"`
|
||||||
|
Texts []Text `xml:"text"`
|
||||||
|
Rectangle []Rectangle `xml:"rectangle"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Package struct {
|
||||||
|
Name string `xml:"name,attr"`
|
||||||
|
Description string `xml:"description"`
|
||||||
|
Urn string `xml:"urn,attr,omitempty"`
|
||||||
|
|
||||||
|
Primitives
|
||||||
|
Holes []Hole `xml:"hole"`
|
||||||
|
Pads []Pad `xml:"pad"`
|
||||||
|
SmdPads []SmdPad `xml:"smd"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Pin struct {
|
||||||
|
Point
|
||||||
|
Name string `xml:"name,attr"`
|
||||||
|
Visible string `xml:"visible,attr,omitempty"`
|
||||||
|
Length string `xml:"length,attr,omitempty"`
|
||||||
|
Direction string `xml:"direction,attr,omitempty"`
|
||||||
|
Rotation Rotation `xml:"rot,attr,omitempty"`
|
||||||
|
Function string `xml:"function,attr,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Symbol struct {
|
||||||
|
Name string `xml:"name,attr"`
|
||||||
|
Urn string `xml:"urn,attr,omitempty"`
|
||||||
|
|
||||||
|
Primitives
|
||||||
|
Pins []Pin `xml:"pin"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Gate struct {
|
||||||
|
Point
|
||||||
|
Name string `xml:"name,attr"`
|
||||||
|
Symbol string `xml:"symbol,attr"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Technology struct {
|
||||||
|
Name string `xml:"name,attr"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Connection struct {
|
||||||
|
Gate string `xml:"gate,attr"`
|
||||||
|
Pin string `xml:"pin,attr"`
|
||||||
|
Pad string `xml:"pad,attr"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Package3d struct {
|
||||||
|
Urn string `xml:"package3d_urn,attr"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Device struct {
|
||||||
|
Name string `xml:"name,attr"`
|
||||||
|
Package string `xml:"package,attr"`
|
||||||
|
|
||||||
|
Package3d []Package3d `xml:package3dinstances>package3dinstance"`
|
||||||
|
Technologies []Technology `xml:"technologies>technology"`
|
||||||
|
Connections []Connection `xml:"connects>connect"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Deviceset struct {
|
||||||
|
Name string `xml:"name,attr"`
|
||||||
|
Prefix string `xml:"prefix,attr"`
|
||||||
|
Description string `xml:"description,omitempty"`
|
||||||
|
Urn string `xml:"urn,attr,omitempty"`
|
||||||
|
|
||||||
|
Gates []Gate `xml:"gates>gate"`
|
||||||
|
Devices []Device `xml:"devices>device"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Library struct {
|
||||||
|
Packages []Package `xml:"packages>package"`
|
||||||
|
Symbols []Symbol `xml:"symbols>symbol"`
|
||||||
|
Devicesets []Deviceset `xml:"devicesets>deviceset"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Drawing struct {
|
||||||
|
Grid Grid `xml:"grid"`
|
||||||
|
Layers []Layer `xml:"layers>layer"`
|
||||||
|
Library Library `xml:"library"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type FileHeader struct {
|
||||||
|
Version string `xml:"version,attr"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func ParseLibrary(in io.Reader) (result Drawing, err error) {
|
||||||
|
file := struct {
|
||||||
|
Eagle FileHeader
|
||||||
|
Drawing Drawing `xml:"drawing"`
|
||||||
|
}{}
|
||||||
|
|
||||||
|
decoder := xml.NewDecoder(in)
|
||||||
|
err = decoder.Decode(&file)
|
||||||
|
return file.Drawing, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// defines an eagle file
|
||||||
|
type eagle struct {
|
||||||
|
FileHeader
|
||||||
|
Drawing *Drawing `xml:"drawing"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (drw *Drawing) WriteTo(out io.Writer) error {
|
||||||
|
// write DOCTYPE and xml header
|
||||||
|
io.WriteString(out, "<?xml version=\"1.0\" encoding=\"utf-8\"?>")
|
||||||
|
io.WriteString(out, "<!DOCTYPE eagle SYSTEM \"eagle.dtd\">")
|
||||||
|
|
||||||
|
encoder := xml.NewEncoder(out)
|
||||||
|
|
||||||
|
file := eagle{
|
||||||
|
FileHeader: FileHeader{"8.3.2"},
|
||||||
|
Drawing: drw,
|
||||||
|
}
|
||||||
|
|
||||||
|
return encoder.Encode(&file)
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user