libeagle 1.1

Sign up to get free protection for your applications and to get access to all the features.
data/MIT_license.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License
2
+
3
+ Copyright (c) 2011-2012 Aurimas Niekis
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,86 @@
1
+ # LibEagle [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/gcds/libeagle)
2
+
3
+ LibEagle is a library for __[Cadsoft Eagle PCB Design Software](http://www.cadsoftusa.com/eagle-pcb-design-software/product-overview/?language=en)__. Eagle uses xml based files. This library implements Eagle xml files and converts it to Objects and reverse.
4
+
5
+ ## Requirements:
6
+ * Nokogiri
7
+ * HTMLEntities
8
+ * [Eagle PCB Design Software](http://www.cadsoftusa.com/eagle-pcb-design-software/product-overview/?language=en) __> 6.0 (only)__
9
+
10
+ ## Installation:
11
+
12
+ ### Bundler:
13
+
14
+ gem 'libeagle'
15
+
16
+ ### Rubygems:
17
+
18
+ $ gem install libeagle
19
+
20
+ ## Usage:
21
+
22
+ The usage is really simple first you include gem in your file:
23
+
24
+ require "libeagle"
25
+
26
+ ### Parsing:
27
+
28
+ Parsing eagle files (schematic, board or library) or block of eagle elements (packages, devices, symbols and etc.) you have two options parse from file or string:
29
+
30
+ eagle = LibEagle::Parser.parseFile(file_name)
31
+ => #<LibEagle::Eagle:0x007fd5ca956738>
32
+
33
+ or string:
34
+
35
+ eagle = LibEagle::Parser.parseXML("…")
36
+ => #<LibEagle::Eagle:0x007fd5ca956738>
37
+
38
+
39
+ ### Hand Crafting:
40
+
41
+ To Create eagle files with hands or dynamically. Just use as simple objects:
42
+
43
+ eagle = LibEagle::Eagle.new
44
+ # Create a drawing object
45
+ eagle.object_drawing = LibEagle::Drawing.new
46
+
47
+ #### Setting attributes
48
+
49
+ eagle.attribute_version = "6.0"
50
+
51
+ #### Setting object
52
+
53
+ eagle.object_drawing = LibEagle::Drawing.new
54
+
55
+ ### XML Saving:
56
+
57
+ After creating, parsing, editing if you want to save file use `.saveXML` will generate xml code of that object:
58
+
59
+
60
+ eagle = LibEagle::Eagle.new
61
+ eagle.attribute_version = "6.0"
62
+ eagle.saveXML
63
+ => "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE eagle SYSTEM \"eagle.dtd\">\n<eagle version=\"6.0\">\n</eagle>\n"
64
+
65
+
66
+ ## Todo:
67
+ 1. Create API DOcs
68
+ 2. Optimize source code
69
+
70
+ ## Thank you:
71
+ * __Martin DeMello__ (for pointing out how to optimize code)
72
+
73
+ ## Contributing:
74
+
75
+ 1. Fork it
76
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
77
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
78
+ 4. Push to the branch (`git push origin my-new-feature`)
79
+ 5. Create new Pull Request
80
+
81
+ ## License
82
+
83
+ Copyright (c) 2012 Aurimas Niekis Dual licensed under the MIT license and GPL license.
84
+
85
+ ## Links:
86
+ * [Cadsoft Eagle PCB Design Software](http://www.cadsoftusa.com/eagle-pcb-design-software/product-overview/?language=en)
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
data/lib/libeagle.rb ADDED
@@ -0,0 +1,12 @@
1
+ require 'nokogiri'
2
+ require 'pp'
3
+ require 'yaml'
4
+ require 'nokogiri'
5
+ require 'HTMLEntities'
6
+ require_relative "libeagle/xml"
7
+ require_relative "libeagle/base"
8
+ require_relative "libeagle/eagle"
9
+ require_relative "libeagle/types"
10
+ require_relative "libeagle/libeagle"
11
+
12
+ raise "LibEagle requires Ruby >= 1.8.6" if RUBY_VERSION < "1.8.6"
@@ -0,0 +1,184 @@
1
+ module LibEagle
2
+ class AttributeRequired < StandardError; end
3
+ class AttributeValueInvalid < StandardError; end
4
+ class Base
5
+
6
+ def self.iname(name)
7
+ name.gsub(/^class$/, "clazz")
8
+ end
9
+
10
+ #
11
+ # Getter of LibEagle objects
12
+ def self.lib_eagle_objects
13
+ @lib_eagle_objects ||= Hash.new
14
+ @lib_eagle_objects[:attributes] ||= {}
15
+ @lib_eagle_objects[:objects] ||= {}
16
+ @lib_eagle_objects[:empty_element] ||= false
17
+ @lib_eagle_objects[:root_element] ||= false
18
+ @lib_eagle_objects[:text_content] ||= false
19
+ @lib_eagle_objects[:element_name] ||= false
20
+ @lib_eagle_objects
21
+ end
22
+
23
+ def self.empty_element
24
+ lib_eagle_objects[:empty_element] = true
25
+ end
26
+
27
+ def self.root_element
28
+ lib_eagle_objects[:root_element] = true
29
+ end
30
+
31
+ def self.text_content
32
+ lib_eagle_objects[:text_content] = true
33
+
34
+ # Define Setter and getter
35
+ attr_accessor :content
36
+ end
37
+
38
+ def self.change_element_name(element_name)
39
+ lib_eagle_objects[:element_name] = true
40
+ define_method "element_name".to_sym do
41
+ instance_variable_set("@element_name", element_name) unless instance_variable_defined?("@element_name")
42
+ instance_variable_get("@element_name")
43
+ end
44
+ end
45
+
46
+
47
+ def self.attribute(attribute_name, params = {})
48
+ attribute_name = attribute_name.to_s
49
+ variable_name = "@attribute_#{attribute_name}"
50
+
51
+ # Initialize place inside LibEagle objects
52
+ lib_eagle_objects[:attributes][attribute_name] ||= {}
53
+ lib_eagle_objects[:attributes][attribute_name][:required] = true if params[:required]
54
+ lib_eagle_objects[:attributes][attribute_name][:type] = params[:type] if params[:type]
55
+ lib_eagle_objects[:attributes][attribute_name][:valid_values] = params[:valid_values] if params[:valid_values]
56
+
57
+ # If default value is set return default value
58
+ if params[:default]
59
+ define_method "attribute_#{attribute_name}".to_sym do
60
+ instance_variable_set(variable_name, params[:default]) unless instance_variable_defined?(variable_name)
61
+ instance_variable_get(variable_name)
62
+ end
63
+ else
64
+ define_method "attribute_#{attribute_name}".to_sym do
65
+ instance_variable_get(variable_name)
66
+ end
67
+ end
68
+
69
+ # Attribute setter
70
+ define_method "attribute_#{attribute_name}=".to_sym do |value|
71
+ if is_valid?(attribute_name,value)
72
+ instance_variable_set(variable_name,value)
73
+ end
74
+ end
75
+ end
76
+
77
+ def self.object(object_name, params = {})
78
+ object_name = object_name.to_s
79
+ variable_name = "@object_#{object_name}"
80
+
81
+ # Initialize place inside LibEagle objects
82
+ lib_eagle_objects[:objects][object_name] ||= {}
83
+ lib_eagle_objects[:objects][object_name][:class] = params[:class] if params[:class]
84
+ lib_eagle_objects[:objects][object_name][:class] = object_name.capitalize unless params[:class]
85
+
86
+ # Object getter
87
+ define_method "object_#{object_name}".to_sym do
88
+ instance_variable_get(variable_name)
89
+ end
90
+
91
+ # Object setter
92
+ define_method "object_#{object_name}=".to_sym do |value|
93
+ instance_variable_set(variable_name,value)
94
+ end
95
+ end
96
+
97
+ def self.newFile(file)
98
+ xml = LibEagle::XML::Loader.new.loadFile(file)
99
+ self.new_with_xml(xml)
100
+ end
101
+
102
+ def self.newXML(block_xml)
103
+ xml = LibEagle::XML::Loader.new.loadBlock(block_xml)
104
+ self.new_with_xml(xml)
105
+ end
106
+
107
+ def self.new_with_xml(xml)
108
+ @base_class = self.new
109
+
110
+ if @lib_eagle_objects[:text_content]
111
+ @base_class.instance_variable_set("@content", xml.content)
112
+ end
113
+
114
+ if @lib_eagle_objects[:attributes].size > 0
115
+ @lib_eagle_objects[:attributes].each_pair do |attribute_name, params|
116
+ @base_class.instance_variable_set("@attribute_#{attribute_name}",xml[attribute_name]) if xml[attribute_name]
117
+ end
118
+ end
119
+
120
+ if @lib_eagle_objects[:objects].size > 0
121
+ @lib_eagle_objects[:objects].each_pair do |object_name, params|
122
+ if xml.xpath(object_name).size > 1
123
+ objects = []
124
+ xml.xpath(object_name).each do |xml_node|
125
+ objects << LibEagle::const_get(params[:class]).new_with_xml(xml_node)
126
+ end
127
+ @base_class.instance_variable_set("@object_#{object_name}",objects)
128
+ elsif xml.xpath(object_name).size == 1
129
+ xml_node = xml.xpath(object_name).first
130
+ object = LibEagle::const_get(params[:class]).new_with_xml(xml_node)
131
+ @base_class.instance_variable_set("@object_#{object_name}",object)
132
+ end
133
+ end
134
+ end
135
+
136
+ return @base_class
137
+ end
138
+
139
+ def is_valid?(attribute,value)
140
+ params = self.class.lib_eagle_objects[:attributes][attribute]
141
+ if params[:required]
142
+ unless value
143
+ raise AttributeRequired.new("#{self.class.name}: #{attribute} is required")
144
+ return false
145
+ end
146
+ end
147
+
148
+ if params[:type] && value
149
+ unless params[:type] =~ value
150
+ raise AttributeValueInvalid.new("`#{attribute}` value: \"#{value}\" isn't in valid range (#{params[:type]})")
151
+ return false
152
+ end
153
+ end
154
+ return true
155
+ end
156
+
157
+ def valid?
158
+ self.class.lib_eagle_objects[:attributes].each_pair do |attribute, params|
159
+ value = self.instance_variable_get("@attribute_#{attribute}")
160
+ if params[:required]
161
+ unless value
162
+ raise AttributeRequired.new("#{self.class.name}: #{attribute} is required")
163
+ return false
164
+ end
165
+ end
166
+
167
+ if params[:type] && value
168
+ unless params[:type] =~ value
169
+ raise AttributeValueInvalid.new("`#{attribute}` value: \"#{value}\" isn't in valid range (#{params[:type]})")
170
+ return false
171
+ end
172
+ end
173
+ return true
174
+ end
175
+ end
176
+
177
+ def saveXML
178
+ if valid?
179
+ LibEagle::XML::Saver.new(self.class.lib_eagle_objects,self).parse
180
+ end
181
+ end
182
+
183
+ end
184
+ end
@@ -0,0 +1,680 @@
1
+ require_relative "types"
2
+ module LibEagle
3
+
4
+ CLASS_NAMES = {
5
+ 'eagle' => "Eagle",
6
+ 'compatibility' => "Compatibility",
7
+ 'note' => "Note",
8
+ 'drawing' => "Drawing",
9
+ 'library' => "Library",
10
+ 'schematic' => "Schematic",
11
+ 'board' => "Board",
12
+ 'sheet' => "Sheet",
13
+ 'package' => "Package",
14
+ 'symbol' => "Symbol",
15
+ 'deviceset' => "Deviceset",
16
+ 'device' => "Device",
17
+ 'bus' => "Bus",
18
+ 'net' => "Net",
19
+ 'segment' => "Segment",
20
+ 'signal' => "Signal",
21
+ 'variantdef' => "Variantdef",
22
+ 'variant' => "Variant",
23
+ 'gate' => "Gate",
24
+ 'wire' => "Wire",
25
+ 'dimension' => "Dimension",
26
+ 'text' => "Text",
27
+ 'circle' => "Circle",
28
+ 'rectangle' => "Rectangle",
29
+ 'frame' => "Frame",
30
+ 'hole' => "Hole",
31
+ 'pad' => "Pad",
32
+ 'smd' => "Smd",
33
+ 'element' => "Element",
34
+ 'via' => "Via",
35
+ 'polygon' => "Polygon",
36
+ 'vertex' => "Vertex",
37
+ 'pin' => "Pin",
38
+ 'part' => "Part",
39
+ 'instance' => "Instance",
40
+ 'label' => "Label",
41
+ 'junction' => "Junction",
42
+ 'connect' => "Connect",
43
+ 'technology' => "Technology",
44
+ 'attribute' => "Attribute",
45
+ 'pinref' => "Pinref",
46
+ 'contactref' => "Contactref",
47
+ 'variantdefs' => "Variantdefs",
48
+ 'settings' => "Settings",
49
+ 'sheets' => "Sheets",
50
+ 'layers' => "Layers",
51
+ 'packages' => "Packages",
52
+ 'symbols' => "Symbols",
53
+ 'devicesets' => "Devicesets",
54
+ 'gates' => "Gates",
55
+ 'devices' => "Devices",
56
+ 'libraries' => "Libraries",
57
+ 'connects' => "Connects",
58
+ 'technologies' => "Technologies",
59
+ 'attributes' => "Attributes",
60
+ 'classes' => "Classes",
61
+ 'parts' => "Parts",
62
+ 'instances' => "Instances",
63
+ 'errors' => "Errors",
64
+ 'plain' => "Plain",
65
+ 'autorouter' => "Autorouter",
66
+ 'elements' => "Elements",
67
+ 'signals' => "Signals",
68
+ 'busses' => "Busses",
69
+ 'nets' => "Nets",
70
+ 'setting' => "Setting",
71
+ 'designrules' => "Designrules",
72
+ 'grid' => "Grid",
73
+ 'layer' => "Layer",
74
+ 'cclass' => "CClass",
75
+ 'clearance' => "Clearance",
76
+ 'description' => "Description",
77
+ 'param' => "Param",
78
+ 'pass' => "Pass",
79
+ 'approved' => "Approved"}
80
+
81
+ #
82
+ # Drawing definitions
83
+ #
84
+ class Eagle < LibEagle::Base
85
+ root_element
86
+ object :compatibility
87
+ object :drawing
88
+ attribute :version, :required => true
89
+ end
90
+
91
+ class Compatibility < LibEagle::Base
92
+ object :note
93
+ end
94
+
95
+ class Note < LibEagle::Base
96
+ text_content
97
+ attribute :version, :required => true
98
+ attribute :severity, :required => true, :type => LibEagle::Types.Severity
99
+ end
100
+
101
+ class Drawing < LibEagle::Base
102
+ object :settings
103
+ object :grid
104
+ object :layers
105
+ object :library
106
+ object :schematic
107
+ object :board
108
+ end
109
+
110
+ class Library < LibEagle::Base
111
+ object :description
112
+ object :packages
113
+ object :symbols
114
+ object :devicesets
115
+ attribute :name
116
+ end
117
+
118
+ class Schematic < LibEagle::Base
119
+ object :description
120
+ object :libraries
121
+ object :attributes
122
+ object :variantdefs
123
+ object :classes
124
+ object :parts
125
+ object :sheets
126
+ object :errors
127
+ attribute :xreflabel
128
+ attribute :xrefpart
129
+ end
130
+
131
+ class Board < LibEagle::Base
132
+ object :description
133
+ object :plain
134
+ object :libraries
135
+ object :attributes
136
+ object :variantdefs
137
+ object :classes
138
+ object :designrules
139
+ object :autorouter
140
+ object :elements
141
+ object :signals
142
+ object :errors
143
+ end
144
+
145
+ #
146
+ # High Level Objects
147
+ #
148
+ class Sheet < LibEagle::Base
149
+ object :description
150
+ object :plain
151
+ object :instances
152
+ object :busses
153
+ object :nets
154
+ end
155
+
156
+ class Package < LibEagle::Base
157
+ object :description
158
+ object :wire
159
+ object :circle
160
+ object :frame
161
+ object :hole
162
+ object :pad
163
+ object :smd
164
+ object :text
165
+ object :rectangle
166
+ object :polygon
167
+ attribute :name, :required => true
168
+ end
169
+
170
+ class Symbol < LibEagle::Base
171
+ object :description
172
+ object :polygon
173
+ object :wire
174
+ object :text
175
+ object :pin
176
+ object :circle
177
+ object :rectangle
178
+ object :frame
179
+ attribute :name, :required => true
180
+ end
181
+
182
+ class Deviceset < LibEagle::Base
183
+ object :description
184
+ object :gates
185
+ object :devices
186
+ attribute :name, :required => true
187
+ attribute :prefix, :default => ""
188
+ attribute :uservalue, :default => "no", :type => LibEagle::Types.Bool
189
+ end
190
+
191
+ class Device < LibEagle::Base
192
+ object :connects
193
+ object :technologies
194
+ attribute :name, :default => ""
195
+ attribute :package
196
+ end
197
+
198
+ class Bus < LibEagle::Base
199
+ object :segment
200
+ attribute :name, :required => true
201
+ end
202
+
203
+ class Net < LibEagle::Base
204
+ object :segment
205
+ attribute :name, :required => true
206
+ attribute :class, :default => "0"
207
+ end
208
+
209
+ class Segment < LibEagle::Base
210
+ object :pinref
211
+ object :wire
212
+ object :junction
213
+ object :label
214
+ end
215
+
216
+ class Signal < LibEagle::Base
217
+ attribute :name, :required => true
218
+ attribute :class, :default => "0"
219
+ attribute :airwireshidden, :default => "no", :type => LibEagle::Types.Bool
220
+ object :contactref
221
+ object :polygon
222
+ object :wire
223
+ object :via
224
+ end
225
+
226
+ #
227
+ # Basic Objects
228
+ #
229
+ class Variantdef < LibEagle::Base
230
+ empty_element
231
+ attribute :name, :required => true
232
+ attribute :current, :default => "no", :type => LibEagle::Types.Bool
233
+ end
234
+
235
+ class Variant < LibEagle::Base
236
+ empty_element
237
+ attribute :name, :required => true
238
+ attribute :populate, :default => "yes", :type => LibEagle::Types.Bool
239
+ attribute :value
240
+ attribute :technology
241
+ end
242
+
243
+ class Gate < LibEagle::Base
244
+ empty_element
245
+ attribute :name, :required => true
246
+ attribute :symbol, :required => true
247
+ attribute :x, :required => true
248
+ attribute :y, :required => true
249
+ attribute :addlevel, :default => "next", :type => LibEagle::Types.GateAddLevel
250
+ attribute :swaplevel, :default => 0
251
+ end
252
+
253
+ class Wire < LibEagle::Base
254
+ empty_element
255
+ attribute :x1, :required => true
256
+ attribute :y1, :required => true
257
+ attribute :x2, :required => true
258
+ attribute :y2, :required => true
259
+ attribute :width, :required => true
260
+ attribute :layer, :required => true
261
+ attribute :extent
262
+ attribute :style, :default => "continuous", :type => LibEagle::Types.WireStyle
263
+ attribute :curve, :default => "0"
264
+ attribute :cap, :default => "round", :type => LibEagle::Types.WireCap
265
+ end
266
+
267
+ class Dimension < LibEagle::Base
268
+ empty_element
269
+ attribute :x1, :required => true
270
+ attribute :y2, :required => true
271
+ attribute :x2, :required => true
272
+ attribute :y2, :required => true
273
+ attribute :x3, :required => true
274
+ attribute :y3, :required => true
275
+ attribute :layer, :required => true
276
+ attribute :dtype, :default => "continuous", :type => LibEagle::Types.DimensionType
277
+ end
278
+
279
+ class Text < LibEagle::Base
280
+ text_content
281
+ attribute :x, :required => true
282
+ attribute :y, :required => true
283
+ attribute :size, :required => true
284
+ attribute :layer, :required => true
285
+ attribute :font, :default => "proportional", :type => LibEagle::Types.TextFont
286
+ attribute :ratio, :default => "8"
287
+ attribute :rot, :default => "R0"
288
+ attribute :align, :default => "bottom-left", :type => LibEagle::Types.Align
289
+ attribute :distance, :default => "50"
290
+ end
291
+
292
+ class Circle < LibEagle::Base
293
+ empty_element
294
+ attribute :x, :required => true
295
+ attribute :y, :required => true
296
+ attribute :radius, :required => true
297
+ attribute :width, :required => true
298
+ attribute :layer, :required => true
299
+ end
300
+
301
+ class Rectangle < LibEagle::Base
302
+ empty_element
303
+ attribute :x1, :required => true
304
+ attribute :y1, :required => true
305
+ attribute :x2, :required => true
306
+ attribute :y2, :required => true
307
+ attribute :layer, :required => true
308
+ attribute :rot, :default => "R0"
309
+ end
310
+
311
+ class Frame < LibEagle::Base
312
+ empty_element
313
+ attribute :x1, :required => true
314
+ attribute :y2, :required => true
315
+ attribute :x2, :required => true
316
+ attribute :y2, :required => true
317
+ attribute :columns, :required => true
318
+ attribute :rows, :required => true
319
+ attribute :layer, :required => true
320
+ attribute :border_left, :default => "yes", :type => LibEagle::Types.Bool
321
+ attribute :border_top, :default => "yes", :type => LibEagle::Types.Bool
322
+ attribute :border_right, :default => "yes", :type => LibEagle::Types.Bool
323
+ attribute :border_bottom, :default => "yes", :type => LibEagle::Types.Bool
324
+ end
325
+
326
+ class Hole < LibEagle::Base
327
+ empty_element
328
+ attribute :x, :required => true
329
+ attribute :y, :required => true
330
+ attribute :drill, :required => true
331
+ end
332
+
333
+
334
+ class Pad < LibEagle::Base
335
+ empty_element
336
+ attribute :name, :required => true
337
+ attribute :x, :required => true
338
+ attribute :y, :required => true
339
+ attribute :drill, :required => true
340
+ attribute :diameter, :default => "0"
341
+ attribute :shape, :default => "round", :type => LibEagle::Types.PadShape
342
+ attribute :rot, :default => "R0"
343
+ attribute :stop, :default => "yes", :type => LibEagle::Types.Bool
344
+ attribute :thermals, :default => "yes", :type => LibEagle::Types.Bool
345
+ attribute :first, :default => "no", :type => LibEagle::Types.Bool
346
+ end
347
+
348
+ class Smd < LibEagle::Base
349
+ empty_element
350
+ attribute :name, :required => true
351
+ attribute :x, :required => true
352
+ attribute :y, :required => true
353
+ attribute :dx, :required => true
354
+ attribute :dy, :required => true
355
+ attribute :layer, :required => true
356
+ attribute :roundness, :default => "0"
357
+ attribute :rot, :default => "R0"
358
+ attribute :stop, :default => "yes", :type => LibEagle::Types.Bool
359
+ attribute :thermals, :default => "yes", :type => LibEagle::Types.Bool
360
+ attribute :cream, :default => "yes", :type => LibEagle::Types.Bool
361
+ end
362
+
363
+ class Element < LibEagle::Base
364
+ object :attribute
365
+ object :variant
366
+ attribute :name, :required => true
367
+ attribute :library, :required => true
368
+ attribute :package, :required => true
369
+ attribute :value, :required => true
370
+ attribute :x, :required => true
371
+ attribute :y, :required => true
372
+ attribute :locked, :default => "no", :type => LibEagle::Types.Bool
373
+ attribute :smashed, :default => "no", :type => LibEagle::Types.Bool
374
+ attribute :rot, :default => "R0"
375
+ end
376
+
377
+ class Via < LibEagle::Base
378
+ empty_element
379
+ attribute :x, :required => true
380
+ attribute :y, :required => true
381
+ attribute :extent, :required => true
382
+ attribute :drill, :required => true
383
+ attribute :diameter, :default => "0"
384
+ attribute :shape, :default => "round", :type => LibEagle::Types.ViaShape
385
+ attribute :alwaysstop, :default => "no", :type => LibEagle::Types.Bool
386
+ end
387
+
388
+ class Polygon < LibEagle::Base
389
+ object :vertex
390
+ attribute :width, :required => true
391
+ attribute :layer, :required => true
392
+ attribute :spacing
393
+ attribute :pour, :default => "solid", :type => LibEagle::Types.PolygonPour
394
+ attribute :isolate
395
+ attribute :orphans, :default => "no", :type => LibEagle::Types.Bool
396
+ attribute :thermals, :default => "yes", :type => LibEagle::Types.Bool
397
+ attribute :rank, :default => "0"
398
+ end
399
+
400
+ class Vertex < LibEagle::Base
401
+ empty_element
402
+ attribute :x, :required => true
403
+ attribute :y, :required => true
404
+ attribute :curve, :default => "0"
405
+ end
406
+
407
+ class Pin < LibEagle::Base
408
+ empty_element
409
+ attribute :name, :required => true
410
+ attribute :x, :required => true
411
+ attribute :y, :required => true
412
+ attribute :visible, :default => "both", :type => LibEagle::Types.PinVisible
413
+ attribute :length, :default => "long", :type => LibEagle::Types.PinLength
414
+ attribute :direction, :default => "io", :type => LibEagle::Types.PinDirection
415
+ attribute :function, :default => "none", :type => LibEagle::Types.PinFunction
416
+ attribute :swaplevel, :default => "0"
417
+ attribute :rot, :default => "R0"
418
+ end
419
+
420
+ class Part < LibEagle::Base
421
+ empty_element
422
+ object :attribute
423
+ object :variant
424
+ attribute :name, :required => true
425
+ attribute :library, :required => true
426
+ attribute :deviceset, :required => true
427
+ attribute :device, :required => true
428
+ attribute :technology, :default => ""
429
+ attribute :value
430
+ end
431
+
432
+ class Instance < LibEagle::Base
433
+ empty_element
434
+ object :attribute
435
+ attribute :part, :required => true
436
+ attribute :gate, :required => true
437
+ attribute :x, :required => true
438
+ attribute :y, :required => true
439
+ attribute :smashed, :default => "no", :type => LibEagle::Types.Bool
440
+ attribute :rot, :default => "R0"
441
+ end
442
+
443
+ class Label < LibEagle::Base
444
+ empty_element
445
+ attribute :x, :required => true
446
+ attribute :y, :required => true
447
+ attribute :size, :required => true
448
+ attribute :layer, :required => true
449
+ attribute :font, :default => "proportional", :type => LibEagle::Types.TextFont
450
+ attribute :ratio, :default => "8"
451
+ attribute :rot, :default => "R0"
452
+ attribute :xref, :default => "no", :type => LibEagle::Types.Bool
453
+ end
454
+
455
+ class Junction < LibEagle::Base
456
+ empty_element
457
+ attribute :x, :required => true
458
+ attribute :y, :required => true
459
+ end
460
+
461
+ class Connect < LibEagle::Base
462
+ empty_element
463
+ attribute :gate, :required => true
464
+ attribute :pin, :required => true
465
+ attribute :pad, :required => true
466
+ attribute :route, :default => "all", :type => LibEagle::Types.ContactRoute
467
+ end
468
+
469
+ class Technology < LibEagle::Base
470
+ object :attribute
471
+ attribute :name, :required => true
472
+ end
473
+
474
+ class Attribute < LibEagle::Base
475
+ empty_element
476
+ attribute :name, :required => true
477
+ attribute :value
478
+ attribute :x
479
+ attribute :y
480
+ attribute :size
481
+ attribute :layer
482
+ attribute :font, :type => LibEagle::Types.TextFont
483
+ attribute :ratio
484
+ attribute :rot, :default => "R0"
485
+ attribute :display, :default => "value", :type => LibEagle::Types.AttributeDisplay
486
+ attribute :constant, :default => "no", :type => LibEagle::Types.Bool
487
+ end
488
+
489
+ class Pinref < LibEagle::Base
490
+ empty_element
491
+ attribute :part, :required => true
492
+ attribute :gate, :required => true
493
+ attribute :pin, :required => true
494
+ end
495
+
496
+ class Contactref < LibEagle::Base
497
+ empty_element
498
+ attribute :element, :required => true
499
+ attribute :pad, :required => true
500
+ attribute :route, :default => "all", :type => LibEagle::Types.ContactRoute
501
+ attribute :routetag, :default => ""
502
+ end
503
+
504
+ #
505
+ # Object Lists
506
+ #
507
+ class Variantdefs < LibEagle::Base
508
+ object :variantdef
509
+ end
510
+
511
+ class Settings < LibEagle::Base
512
+ object :setting
513
+ end
514
+
515
+ class Sheets < LibEagle::Base
516
+ object :sheet
517
+ end
518
+
519
+ class Layers < LibEagle::Base
520
+ object :layer
521
+ end
522
+
523
+ class Packages < LibEagle::Base
524
+ object :package
525
+ end
526
+
527
+ class Symbols < LibEagle::Base
528
+ object :symbol
529
+ end
530
+
531
+ class Devicesets < LibEagle::Base
532
+ object :deviceset
533
+ end
534
+
535
+ class Gates < LibEagle::Base
536
+ object :gate
537
+ end
538
+
539
+ class Devices < LibEagle::Base
540
+ object :device
541
+ end
542
+
543
+ class Libraries < LibEagle::Base
544
+ object :library
545
+ end
546
+
547
+ class Connects < LibEagle::Base
548
+ object :connect
549
+ end
550
+
551
+ class Technologies < LibEagle::Base
552
+ object :technology
553
+ end
554
+
555
+ class Attributes < LibEagle::Base
556
+ object :attribute
557
+ end
558
+
559
+ class Classes < LibEagle::Base
560
+ object :class, :class => "CClass"
561
+ end
562
+
563
+ class Parts < LibEagle::Base
564
+ object :part
565
+ end
566
+
567
+ class Instances < LibEagle::Base
568
+ object :instance
569
+ end
570
+
571
+ class Errors < LibEagle::Base
572
+ object :error
573
+ end
574
+
575
+ class Plain < LibEagle::Base
576
+ object :polygon
577
+ object :wire
578
+ object :text
579
+ object :circle
580
+ object :rectangle
581
+ object :frame
582
+ object :hole
583
+ end
584
+
585
+ class Autorouter < LibEagle::Base
586
+ object :pass
587
+ end
588
+
589
+ class Elements < LibEagle::Base
590
+ object :element
591
+ end
592
+
593
+ class Signals < LibEagle::Base
594
+ object :signal
595
+ end
596
+
597
+ class Busses < LibEagle::Base
598
+ object :busse
599
+ end
600
+
601
+ class Nets < LibEagle::Base
602
+ object :net
603
+ end
604
+
605
+ #
606
+ # Miscellaneous Objects
607
+ #
608
+ class Setting < LibEagle::Base
609
+ empty_element
610
+ attribute :alwaysvectorfont, :type => LibEagle::Types.Bool
611
+ attribute :verticaltext, :type => LibEagle::Types.VerticalText
612
+ end
613
+
614
+ class Designrules < LibEagle::Base
615
+ object :description
616
+ object :param
617
+ attribute :name, :required => true
618
+ end
619
+
620
+ class Grid < LibEagle::Base
621
+ empty_element
622
+ attribute :distance
623
+ attribute :unitdist, :type => LibEagle::Types.GridUnit
624
+ attribute :unit, :type => LibEagle::Types.GridUnit
625
+ attribute :style, :default => "lines", :type => LibEagle::Types.GridStyle
626
+ attribute :multiple, :default => "0"
627
+ attribute :display, :default => "no", :type => LibEagle::Types.Bool
628
+ attribute :altdistance
629
+ attribute :altunitdist, :type => LibEagle::Types.GridUnit
630
+ attribute :altunit, :type => LibEagle::Types.GridUnit
631
+ end
632
+
633
+ class Layer < LibEagle::Base
634
+ empty_element
635
+ attribute :number, :required => true
636
+ attribute :name, :required => true
637
+ attribute :color, :required => true
638
+ attribute :fill, :required => true
639
+ attribute :visible, :default => "yes"
640
+ attribute :active, :default => "yes"
641
+ end
642
+
643
+ class CClass < LibEagle::Base
644
+ change_element_name "class"
645
+ object :clearance
646
+ attribute :number, :required => true
647
+ attribute :name, :required => true
648
+ attribute :width, :default => "0"
649
+ attribute :drill, :default => "0"
650
+ end
651
+
652
+ class Clearance < LibEagle::Base
653
+ empty_element
654
+ attribute :class, :required => true
655
+ attribute :value, :default => "0"
656
+ end
657
+
658
+ class Description < LibEagle::Base
659
+ text_content
660
+ attribute :language
661
+ end
662
+
663
+ class Param < LibEagle::Base
664
+ empty_element
665
+ attribute :name, :required => true
666
+ attribute :value, :required => true
667
+ end
668
+
669
+ class Pass < LibEagle::Base
670
+ object :param
671
+ attribute :name, :required => true
672
+ attribute :refer
673
+ attribute :active, :default => "yes"
674
+ end
675
+
676
+ class Approved < LibEagle::Base
677
+ empty_element
678
+ attribute :hash, :required => true
679
+ end
680
+ end