autocad 0.4.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. checksums.yaml +7 -0
  2. data/.rubocop/minitest.yml +2 -0
  3. data/.rubocop/strict.yml +4 -0
  4. data/.rubocop.yml +33 -0
  5. data/.solargraph.yml +22 -0
  6. data/.vscode/launch.json +30 -0
  7. data/CHANGELOG.md +5 -0
  8. data/CODE_OF_CONDUCT.md +132 -0
  9. data/Guardfile +66 -0
  10. data/LICENSE.txt +21 -0
  11. data/README.md +39 -0
  12. data/Rakefile +10 -0
  13. data/Steepfile +35 -0
  14. data/WASD-D-TDS-C001.dwg +0 -0
  15. data/WASD-D-TDS-C001.pdf +0 -0
  16. data/autocad.log +1 -0
  17. data/autocad_example.rb +26 -0
  18. data/event_handler.log +24 -0
  19. data/examples/example_save_pdf.rb +5 -0
  20. data/exe/autocad +3 -0
  21. data/exe/dgn2pdf +50 -0
  22. data/exe/pw_print +43 -0
  23. data/gemfiles/rubocop.gemfile +6 -0
  24. data/lib/autocad/app.rb +655 -0
  25. data/lib/autocad/arc.rb +29 -0
  26. data/lib/autocad/block.rb +141 -0
  27. data/lib/autocad/block_reference.rb +198 -0
  28. data/lib/autocad/drawing.rb +426 -0
  29. data/lib/autocad/element.rb +454 -0
  30. data/lib/autocad/enumerator.rb +24 -0
  31. data/lib/autocad/errors.rb +37 -0
  32. data/lib/autocad/event_handler.rb +30 -0
  33. data/lib/autocad/filter.rb +168 -0
  34. data/lib/autocad/layer.rb +41 -0
  35. data/lib/autocad/line.rb +55 -0
  36. data/lib/autocad/message_box.rb +95 -0
  37. data/lib/autocad/model.rb +89 -0
  38. data/lib/autocad/mtext.rb +110 -0
  39. data/lib/autocad/paths.rb +29 -0
  40. data/lib/autocad/point3d.rb +143 -0
  41. data/lib/autocad/pviewport.rb +21 -0
  42. data/lib/autocad/selection_filter.rb +180 -0
  43. data/lib/autocad/selection_set.rb +61 -0
  44. data/lib/autocad/selection_set_adapter.rb +146 -0
  45. data/lib/autocad/text.rb +74 -0
  46. data/lib/autocad/version.rb +5 -0
  47. data/lib/autocad.rb +161 -0
  48. data/olegen.rb +341 -0
  49. data/rbs_collection.lock.yaml +188 -0
  50. data/rbs_collection.yaml +19 -0
  51. data/scanner.obj +0 -0
  52. data/sig/generated/autocad/app.rbs +251 -0
  53. data/sig/generated/autocad/arc.rbs +17 -0
  54. data/sig/generated/autocad/block.rbs +63 -0
  55. data/sig/generated/autocad/block_reference.rbs +59 -0
  56. data/sig/generated/autocad/drawing.rbs +158 -0
  57. data/sig/generated/autocad/element.rbs +166 -0
  58. data/sig/generated/autocad/enumerator.rbs +15 -0
  59. data/sig/generated/autocad/errors.rbs +23 -0
  60. data/sig/generated/autocad/event_handler.rbs +14 -0
  61. data/sig/generated/autocad/filter.rbs +60 -0
  62. data/sig/generated/autocad/layer.rbs +19 -0
  63. data/sig/generated/autocad/line.rbs +25 -0
  64. data/sig/generated/autocad/message_box.rbs +81 -0
  65. data/sig/generated/autocad/model.rbs +41 -0
  66. data/sig/generated/autocad/paths.rbs +19 -0
  67. data/sig/generated/autocad/point3d.rbs +66 -0
  68. data/sig/generated/autocad/selection_filter.rbs +50 -0
  69. data/sig/generated/autocad/selection_set.rbs +37 -0
  70. data/sig/generated/autocad/selection_set_adapter.rbs +28 -0
  71. data/sig/generated/autocad/text.rbs +19 -0
  72. data/sig/generated/autocad/text_node.rbs +37 -0
  73. data/sig/generated/autocad/version.rbs +5 -0
  74. data/sig/generated/autocad/viewport.rbs +11 -0
  75. data/sig/generated/autocad.rbs +68 -0
  76. data/sig/prototype/lib/autocad/app.rbs +34 -0
  77. data/sig/prototype/lib/autocad/block.rbs +5 -0
  78. data/sig/prototype/lib/autocad/block_reference.rbs +5 -0
  79. data/sig/prototype/lib/autocad/drawing.rbs +13 -0
  80. data/sig/prototype/lib/autocad/element.rbs +9 -0
  81. data/sig/prototype/lib/autocad/enumerator.rbs +5 -0
  82. data/sig/prototype/lib/autocad/event_handler.rbs +7 -0
  83. data/sig/prototype/lib/autocad/model.rbs +5 -0
  84. data/sig/prototype/lib/autocad/paths.rbs +5 -0
  85. data/sig/prototype/lib/autocad.rbs +3 -0
  86. data/temp/autocad.dwg +0 -0
  87. data/temp/autocad.log +1 -0
  88. data/temp/event_handler.log +0 -0
  89. metadata +147 -0
@@ -0,0 +1,454 @@
1
+ # rbs_inline: enabled
2
+
3
+ # require "autocad/property_handler"
4
+
5
+ class WIN32OLE
6
+ def to_ole
7
+ self
8
+ end
9
+ end
10
+
11
+ module Autocad
12
+ end
13
+
14
+ module Autocad
15
+ module AcadEntity
16
+ def layer
17
+ ole_obj.Layer
18
+ end
19
+
20
+ def layer=(name)
21
+ ole_obj.Layer = name
22
+ end
23
+
24
+ def line_type
25
+ ole_obj.LineType
26
+ end
27
+
28
+ def line_type=(name)
29
+ ole_obj.LineType = name
30
+ end
31
+
32
+ def visible?
33
+ ole_obj.Visible
34
+ end
35
+
36
+ def copy
37
+ end
38
+
39
+ def intersects_with(obj)
40
+ end
41
+
42
+ def mirror
43
+ end
44
+
45
+ def move_to
46
+ end
47
+
48
+ def update
49
+ end
50
+
51
+ def transform_by(matrix)
52
+ end
53
+ end
54
+
55
+ module ElementTrait
56
+ def block_reference?
57
+ false
58
+ end
59
+
60
+ #
61
+ #
62
+ #
63
+ # @rbs return bool -- true if ole type is Text
64
+ #
65
+ def text?
66
+ ole_obj.ole_type == "IAcadText"
67
+ end
68
+
69
+ # @rbs return bool -- true if ole type is TextNode
70
+ def mtext?
71
+ ole_obj.ole_type == "IAcadMText"
72
+ end
73
+
74
+ def has_tags?
75
+ ole_obj.HasAnyTags
76
+ end
77
+
78
+ def to_ole
79
+ ole_obj
80
+ end
81
+
82
+ # @rbs return bool -- true if object is of type cell
83
+ def cell?
84
+ ole_obj.Type == ::ACAD::MsdElementTypeCellHeader
85
+ end
86
+
87
+ # def complex
88
+ # ole_obj.IsComplexElement
89
+ # end
90
+
91
+ # @rbs return bool -- true if Text or TextNode
92
+ def textual?
93
+ text? || mtext?
94
+ end
95
+
96
+ def autocad_id
97
+ @ole_obj.ObjectId
98
+ end
99
+
100
+ def visible?
101
+ @ole_obj.Visible
102
+ end
103
+
104
+ # @rbs return bool -- true if ole type is TypeLine
105
+ def line?
106
+ ole_obj.ObjectName == "AcdbLine"
107
+ end
108
+
109
+ def graphical?
110
+ ole_obj.IsGraphical
111
+ end
112
+
113
+ def inspect
114
+ "<#{self.class}: #{autocad_id}>"
115
+ end
116
+
117
+ def parent
118
+ parent_id = ole_obj.ParentID
119
+ return nil unless parent_id
120
+
121
+ id = id_from_record(parent_id)
122
+ app.active_design_file.find_by_id(id)
123
+ end
124
+
125
+ def id_from_record(id)
126
+ return unless id.instance_of?(WIN32OLE_RECORD)
127
+ return id.Low if id.Low > id.High
128
+
129
+ id.High
130
+ end
131
+
132
+ def select
133
+ app.active_model_reference.select_element(self)
134
+ end
135
+
136
+ # def Type
137
+ # ole_obj.Type
138
+ # end
139
+
140
+ def autocad_type
141
+ ole_obj.ObjectName
142
+ end
143
+
144
+ def model
145
+ Model.new(app, app.current_drawing, ole_obj.ModelReference)
146
+ end
147
+ end
148
+
149
+ class Element
150
+ include ElementTrait
151
+
152
+ def self.convert_item(ole, app, cell = nil)
153
+ return Point3d.from_ole(ole) if ole.instance_of?(WIN32OLE_RECORD) && ole.typename == "Point3d"
154
+ return ole unless ole.instance_of?(WIN32OLE)
155
+
156
+ if ole.respond_to? :ObjectName
157
+ typ = case ole.ObjectName
158
+ when "AcDbModelSpace"
159
+ ::Autocad::ModelSpace.new(ole, app, typ)
160
+ when "AcDbPaperSpace"
161
+ ::Autocad::PaperSpace.new(ole, app, typ)
162
+ when "AcDbBlockTableRecord"
163
+ ::Autocad::Block.new(ole, app, typ, cell)
164
+ when "AcDbPolyline"
165
+ ::Autocad::Polyline.new(ole, app, typ, cell)
166
+ when "AcDbText"
167
+ ::Autocad::Text.new(ole, app, typ, cell)
168
+ when "AcDbMText"
169
+ ::Autocad::TextNode.new(ole, app, typ, cell)
170
+ when "AcDbArc"
171
+ ::Autocad::Arc.new(ole, app, typ, cell)
172
+ when "AcDbViewport"
173
+ ::Autocad::Viewport.new(ole, app, typ)
174
+ when "AcDbBlock"
175
+ ::Autocad::Block.new(ole, app, typ)
176
+ when "AcDbLayerTableRecord"
177
+ ::Autocad::Layer.new(ole, app, typ)
178
+ when AcDbLayerTableRecord
179
+ end
180
+
181
+ return typ if typ
182
+ binding.irb
183
+
184
+ else
185
+ typ = ole.ole_type
186
+ result = case typ.name
187
+ when "IAcadSelectionSet"
188
+ drawing = app.current_drawing
189
+ ::Autocad::SelectionSetAdapter.from_ole_obj(drawing, ole)
190
+ when "IAcadLayer"
191
+ ::Autocad::Layer.new(ole, app, typ)
192
+ when "IAcadLine"
193
+ ::Autocad::Line.new(ole, app, typ)
194
+ when "IAcadCircle"
195
+ ::Autocad::Circle.new(ole, app, typ)
196
+ when "IAcadLWPolyline"
197
+ ::Autocad::Polyline.new(ole, app, typ)
198
+ when "IAcadLineType"
199
+ ::Autocad::Linetype.new(ole, app, typ)
200
+ when "IAcadText"
201
+ ::Autocad::Text.new(ole, app, typ)
202
+ when "IAcadMText"
203
+ ::Autocad::MText.new(ole, app, typ)
204
+ when "IAcadPViewport"
205
+ ::Autocad::PViewport.new(ole, app, typ)
206
+ when "IAcadBlockReference"
207
+ ::Autocad::BlockReference.new(ole, app, typ)
208
+ when "IAcadExternalReference"
209
+ ::Autocad::ExternalReference.new(ole, app, typ)
210
+ when "IAcadAttributeReference"
211
+ ::Autocad::AttributeReference.new(ole, app, typ)
212
+
213
+ else
214
+ Element.new(ole, app, typ)
215
+ end
216
+
217
+ return result if result
218
+ binding.irb
219
+ end
220
+ end
221
+
222
+ def self.ole_object?
223
+ ole.instance_of?(WIN32OLE)
224
+ end
225
+
226
+ attr_reader :ole_obj, :app, :acad_type, :original
227
+
228
+ def initialize(ole, app, typ, cell = nil)
229
+ @ole_obj = ole
230
+ @original = read_ole(ole)
231
+ @app = app
232
+ @cell = cell
233
+ @acad_type = typ
234
+ end
235
+
236
+ def in_cell?
237
+ !!@cell
238
+ end
239
+
240
+ def read_ole(ole)
241
+ end
242
+
243
+ def write_ole(value)
244
+ end
245
+
246
+ def method_missing(meth, *, &)
247
+ if /^[A-Z]/.match?(meth.to_s)
248
+ result = ole_obj.send(meth, *, &)
249
+ Element.convert_item(result, app)
250
+ else
251
+ super
252
+ end
253
+ end
254
+
255
+ def get_property_handler
256
+ ph_ole = app_ole_obj.CreatePropertyHandler(ole_obj)
257
+ PropertyHandler.new(ph_ole)
258
+ end
259
+
260
+ def property_handler
261
+ @property_handler ||= get_property_handler
262
+ end
263
+
264
+ def [](name)
265
+ property_handler[name]
266
+ end
267
+
268
+ def do_update(value)
269
+ return false if value == original
270
+
271
+ saved_original = original
272
+ begin
273
+ write_ole(value)
274
+ @original = read_ole(ole_obj)
275
+ true
276
+ rescue
277
+ @original = saved_original
278
+ false
279
+ end
280
+ end
281
+
282
+ def update(value)
283
+ redraw_el = ole_obj
284
+ if do_update(value)
285
+ if in_cell?
286
+ @cell.ReplaceCurrentElement @ole_obj
287
+ redraw_el = @cell
288
+ end
289
+ redraw(redraw_el)
290
+ @updated = true
291
+ true
292
+ else
293
+ @updated = false
294
+ false
295
+ end
296
+ rescue => e
297
+ app.error_proc.call(e, nil)
298
+ end
299
+
300
+ def updated?
301
+ @updated
302
+ end
303
+
304
+ def redraw(el = ole_obj)
305
+ # el.Redraw ::Autocad::MSD::MsdDrawingModeNormal if el.IsGraphical
306
+ el.Update
307
+ rescue => e
308
+ app.error_proc.call(e, nil)
309
+ end
310
+
311
+ def app_ole_obj
312
+ app.ole_obj
313
+ end
314
+
315
+ def delete
316
+ ole_obj.Delete
317
+ rescue => ex
318
+ raise Autocad::Error.new("Error deleting object #{self} #{ex}")
319
+ end
320
+
321
+ def clone(new_insertion_point)
322
+ pt = Point3d.new(new_insertion_point)
323
+ ole = ole_obj.Copy(pt.to_ole)
324
+ app.wrap(ole)
325
+ rescue => ex
326
+ raise Autocad::Error.new("Error cloning object #{ex}")
327
+ end
328
+
329
+ def move_x(amt)
330
+ pt1 = Point3d(0, 0, 0)
331
+ pt2 = Point3d(amt, 0, 0)
332
+ move_ole(pt1.to_ole, pt2.to_ole)
333
+ end
334
+
335
+ def move_y(amt)
336
+ pt1 = Point3d(0, 0, 0)
337
+ pt2 = Point3d(0, 1, 0)
338
+ move_ole(pt1.to_ole, pt2.to_ole)
339
+ end
340
+
341
+ def move(x, y)
342
+ pt1 = Point3d(0, 0, 0)
343
+ pt2 = Point3d(x, y, 0)
344
+ move_ole(pt1.to_ole, pt2.to_ole)
345
+ end
346
+
347
+ def move_ole(pt1, pt2)
348
+ ole_obj.Move(pt1, pt2)
349
+ app.wrap(ole_obj)
350
+ rescue => ex
351
+ raise Autocad::Error.new("Error moving object #{ex}")
352
+ end
353
+
354
+ def ole_cell(ole)
355
+ ole.IsCellElement || ole.IsSharedCellElement
356
+ end
357
+
358
+ # def each_cell(ole, &)
359
+ # cell = ole if ole_cell(ole)
360
+ # begin
361
+ # ole.ResetElementEnumeration
362
+ # rescue
363
+ # binding.break
364
+ # end
365
+ # while ole.MoveToNextElement
366
+ # component = ole.CopyCurrentElement
367
+ # if component.IsTextNodeElement
368
+ # yield Autocad::Wrap.wrap(component.AsTextNodeElement, app, cell)
369
+ # elsif component.IsTextElement
370
+ # yield Autocad::Wrap.wrap(component.AsTextElement, app, cell)
371
+ # elsif component.IsComplexElement
372
+ # each(component, &)
373
+ # else
374
+ # yield Autocad::Wrap.wrap(component, app, cell)
375
+ # end
376
+ # end
377
+ # end
378
+
379
+ # def each(ole = ole_obj, &block)
380
+ # return unless ole.IsComplexElement
381
+ # return to_enum(:each) unless block
382
+
383
+ # if ole.IsCellElement
384
+ # each_cell(ole, &block)
385
+ # else
386
+ # each_complex(ole, &block)
387
+ # end
388
+ # end
389
+
390
+ def each_complex(ole, &)
391
+ cell = nil
392
+ components = ole.GetSubElements
393
+ while components.MoveNext
394
+ component = components.Current
395
+ if component.IsTextNodeElement
396
+ yield Autocad::Wrap.wrap(component.AsTextNodeElement, app, cell)
397
+ elsif component.IsTextElement
398
+ yield Autocad::Wrap.wrap(component.AsTextElement, app, cell)
399
+ elsif component.IsComplexElement
400
+ each(component, &)
401
+ else
402
+ yield Autocad::Wrap.wrap(component, app, cell)
403
+ end
404
+ end
405
+ end
406
+ end
407
+
408
+ class App
409
+ def ole_to_ruby(ole)
410
+ Element.convert_item(ole, self)
411
+ end
412
+ end
413
+ end
414
+
415
+ module Autocad
416
+ class Arc < Element
417
+ end
418
+ end
419
+
420
+ module Autocad
421
+ class Ellipse < Element
422
+ end
423
+ end
424
+
425
+ module Autocad
426
+ class BSplineSurface < Element
427
+ end
428
+ end
429
+
430
+ module Autocad
431
+ class Linetype < Element
432
+ CONTINUOUS = "Continuous"
433
+ DASHED = "Dashed"
434
+ CENTER = "Center"
435
+ HIDDEN = "Hidden"
436
+ PHANTOM = "Phantom"
437
+ BREAK = "Break"
438
+ BORDER = "Border"
439
+ DOT2 = "Dot2"
440
+ DOTX2 = "DotX2"
441
+ DIVIDE = "Divide"
442
+ TRACKING = "Tracking"
443
+ DASHDOT = "Daskdot"
444
+
445
+ def name
446
+ ole_obj.Name
447
+ end
448
+ end
449
+ end
450
+
451
+ module Autocad
452
+ class BSplineCurve < Element
453
+ end
454
+ end
@@ -0,0 +1,24 @@
1
+ module Autocad
2
+ class Enumerator
3
+ include Enumerable
4
+
5
+ attr_reader :app
6
+
7
+ def initialize(ole, app)
8
+ @ole_obj = ole
9
+ @app = app
10
+ end
11
+
12
+ def each
13
+ return enum_for(:each) unless block_given?
14
+
15
+ @ole_obj.each do |ole|
16
+ yield app.wrap(ole)
17
+ end
18
+ end
19
+
20
+ def reset
21
+ @ole_obj.reset
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,37 @@
1
+ # rbs_enabled: true
2
+
3
+ module Autocad
4
+ Error = Class.new(::RuntimeError)
5
+ NonDGNFile = Class.new(Error)
6
+
7
+ class FileNotFound < Error
8
+ def initialize(path)
9
+ super("File at path #{path} not found")
10
+ end
11
+ end
12
+ MultipleUpdateError = Class.new(Error)
13
+
14
+ # class RetryableError < Error
15
+ # attr_reader :num_tries
16
+ # def initialize(message, num_tries)
17
+ # @num_tries = num_tries
18
+ # super("#{message} (##{num_tries})")
19
+ # end
20
+ # end
21
+
22
+ class DrawingError < Error
23
+ attr_reader :drawing
24
+
25
+ def initialize(message, drawing)
26
+ @drawing = drawing
27
+ super("#{message} for #{drawing.path}")
28
+ end
29
+ end
30
+
31
+ class ExistingFile < Error
32
+ def initialize(path)
33
+ msg = "File at path #{path} already exists"
34
+ super(msg)
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,30 @@
1
+ # rbs_inline: enabled
2
+
3
+ module Autocad
4
+ class EventHandler
5
+ def initialize
6
+ @handlers = {}
7
+ @file = File.open("event_handler.log", "w")
8
+ end
9
+
10
+ # @rbs event: String -- the event name to handle
11
+ def add_handler(event, &block)
12
+ @handlers[event] = block if block
13
+ end
14
+
15
+ def get_handler(event)
16
+ @handlers[event]
17
+ end
18
+
19
+ def method_missing(event, *args)
20
+ if @handlers[event.to_s]
21
+ @handlers[event.to_s].call(*args)
22
+ else
23
+ @file.puts "Unhandled event: #{event} args: #{args}"
24
+ @file.puts "Event class is: #{event.class}, args are: #{args}"
25
+ # event = event.to_sym if event.is_a? String
26
+ # super
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,168 @@
1
+ module Autocad
2
+ class Filter
3
+ attr_reader :types, :values, :clauses
4
+
5
+ def initialize(clauses: {})
6
+ @clauses = clauses
7
+ @types = []
8
+ @values = []
9
+ end
10
+
11
+ def new_filter(clause, value)
12
+ new_clauses = clauses.dup
13
+ new_clauses[clause] = value
14
+ Filter.new(clauses: new_clauses)
15
+ end
16
+
17
+ def has_filters?
18
+ true
19
+ end
20
+
21
+ # convert the clauses to the values and types needed for autocad filter
22
+ # rbs return Array[Array,Array] -- the types and values array
23
+ def convert_clauses
24
+ types = []
25
+ values = []
26
+
27
+ case clauses.keys.first
28
+ when :type
29
+ types << 0
30
+ values << clauses[:type]
31
+ when :layer
32
+ types << 8
33
+ values << clauses[:layer]
34
+ when :color
35
+ types << 62
36
+ values << clauses[:color]
37
+ when :block_reference
38
+ types << 0
39
+ values << 'INSERT'
40
+ if clauses[:block_reference]
41
+ types << 1
42
+ values << clauses[:block_reference]
43
+ end
44
+ when :paper_space
45
+ types << 67
46
+ values << 1
47
+ when :model_space
48
+ types << 67
49
+ values << 0
50
+ when :text_content
51
+ types << 1 # DXF type code 1 for text content
52
+ values << clauses[:text_content]
53
+ when :and, :or, :xor
54
+ operator = clauses.keys.first.to_s.upcase
55
+ types << -4
56
+ values << "<#{operator}"
57
+
58
+ clauses[clauses.keys.first].each do |condition|
59
+ sub_types, sub_values = condition.convert_clauses
60
+ types.concat(sub_types)
61
+ values.concat(sub_values)
62
+ end
63
+
64
+ types << -4
65
+ values << "#{operator}>"
66
+ when :not
67
+ types << -4
68
+ values << '<NOT'
69
+
70
+ sub_types, sub_values = clauses[:not].convert_clauses
71
+ types.concat(sub_types)
72
+ values.concat(sub_values)
73
+
74
+ types << -4
75
+ values << 'NOT>'
76
+ when :gt
77
+ types.concat([-4, 40])
78
+ values.concat(['>=', clauses[:gt]])
79
+ when :lt
80
+ types.concat([-4, 40])
81
+ values.concat(['<=', clauses[:lt]])
82
+ when :eq
83
+ types.concat([-4, 40])
84
+ values.concat(['=', clauses[:eq]])
85
+ when :neq
86
+ types.concat([-4, 40])
87
+ values.concat(['<>', clauses[:neq]])
88
+ end
89
+
90
+ [types, values]
91
+ end
92
+
93
+ # Logical Operators
94
+ def and(*conditions)
95
+ new_filter(:and, conditions)
96
+ end
97
+
98
+ def merge_conditions(existing, new_condition)
99
+ end
100
+
101
+ def or(*conditions)
102
+ new_filter(:or, conditions)
103
+ end
104
+
105
+ def xor(condition1, condition2)
106
+ new_filter(:xor, [condition1, condition2])
107
+ end
108
+
109
+ def not(condition)
110
+ new_filter(:not, condition)
111
+ end
112
+
113
+ # Relational Operators
114
+ # f.type("Circle").greater_than(5)
115
+ def greater_than(value)
116
+ new_filter(:gt, value)
117
+ end
118
+
119
+ def less_than(value)
120
+ new_filter(:lt, value)
121
+ end
122
+
123
+ def equal_to(value)
124
+ new_filter(:eq, value)
125
+ end
126
+
127
+ def not_equal_to(value)
128
+ new_filter(:neq, value)
129
+ end
130
+
131
+ def block_reference(name = nil)
132
+ new_filter(:block_reference, name)
133
+ end
134
+
135
+ def name(value)
136
+ new_filter(:name, value)
137
+ end
138
+
139
+ def type(kind)
140
+ new_filter(:type, kind)
141
+ end
142
+
143
+ def layer(name)
144
+ new_filter(:layer, name)
145
+ end
146
+
147
+ def visible(vis = true)
148
+ new_filter(:visible, vis)
149
+ end
150
+
151
+ def color(num)
152
+ new_filter(:color, num)
153
+ end
154
+
155
+ def paper_space
156
+ new_filter(:paper_space, nil)
157
+ end
158
+
159
+ def model_space
160
+ new_filter(:model_space, nil)
161
+ end
162
+
163
+ def has_text(str)
164
+ new_filter(:text_content, str)
165
+ end
166
+
167
+ end
168
+ end