Class: Autocad::SelectionSet

Inherits:
Object
  • Object
show all
Defined in:
lib/autocad/selection_set.rb

Overview

Manages named selection criteria for AutoCAD entities

Stores filter criteria for entity selection without executing the selection. Works with SelectionSetAdapter to apply filters and retrieve entities.

Examples:

Create a selection set with complex filters

ss = SelectionSet.new("walls")
ss.filter do |f|
  f.and(f.layer("WALLS"), f.or(f.type("LINE"), f.type("POLYLINE")))
end

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name) ⇒ SelectionSet

Initialize a new selection set with a name



25
26
27
28
29
# File 'lib/autocad/selection_set.rb', line 25

def initialize(name)
  @name = name
  @filter_types = []
  @filter_values = []
end

Instance Attribute Details

#filter_typesObject (readonly)

Returns the value of attribute filter_types.



19
20
21
# File 'lib/autocad/selection_set.rb', line 19

def filter_types
  @filter_types
end

#filter_valuesObject (readonly)

Returns the value of attribute filter_values.



19
20
21
# File 'lib/autocad/selection_set.rb', line 19

def filter_values
  @filter_values
end

#nameObject (readonly)

Returns the value of attribute name.



19
20
21
# File 'lib/autocad/selection_set.rb', line 19

def name
  @name
end

Instance Method Details

#clear_filterself

Clear all filter criteria



84
85
86
87
88
# File 'lib/autocad/selection_set.rb', line 84

def clear_filter
  @filter_types = []
  @filter_values = []
  self
end

#filter {|Filter| ... } ⇒ self

Configure complex filters through block

Examples:

Create a filter for red circles

ss.filter do |f|
  f.and(f.type("CIRCLE"), f.color(1))
end

Combine multiple conditions

ss.filter do |f|
  st = f.type('Circle').or(f.type('Arc'))
  st2 = f.layer('0').or(f.layer('1'))
  f.and(st, st2)
end

Yields:

  • (Filter)

    Block for building filter criteria



72
73
74
75
76
77
78
79
# File 'lib/autocad/selection_set.rb', line 72

def filter
  if block_given?
    filter = Filter.new
    result = yield filter
    @filter_types, @filter_values = result.convert_clauses
  end
  self
end

#filter_block_references(name = nil) ⇒ self

Filter for block references with optional name

Examples:

Filter for any block reference

ss.filter_block_references

Filter for specific block

ss.filter_block_references("DOOR")


136
137
138
# File 'lib/autocad/selection_set.rb', line 136

def filter_block_references(name = nil)
  filter { |f| f.block_reference(name) }
end

#filter_by_layer(*layers) ⇒ self

Filter by layer names

Examples:

Filter for entities on specific layers

ss.filter_by_layer("WALLS", "DOORS")


110
111
112
# File 'lib/autocad/selection_set.rb', line 110

def filter_by_layer(*layers)
  filter { |f| f.or(*layers.map { |l| f.layer(l) }) }
end

#filter_by_type(*types) ⇒ self

Filter by entity types

Examples:

Filter for lines and polylines

ss.filter_by_type("LINE", "POLYLINE")


99
100
101
# File 'lib/autocad/selection_set.rb', line 99

def filter_by_type(*types)
  filter { |f| f.or(*types.map { |t| f.type(t) }) }
end

#filter_text(str = nil) ⇒ self

Filter for text entities with optional content matching

Examples:

Filter all text entities

ss.filter_text

Filter text with specific content

ss.filter_text("Revision")


47
48
49
50
51
52
53
54
55
# File 'lib/autocad/selection_set.rb', line 47

def filter_text(str = nil)
  if str
    filter_text_containing(str)
  else
    filter do |f|
      f.or(f.type("TEXT"), f.type("MTEXT"))
    end
  end
end

#filter_text_containing(text) ⇒ self

Filter text entities containing specific text

Examples:

Find text containing “NOTE”

ss.filter_text_containing("*NOTE*")


121
122
123
124
125
# File 'lib/autocad/selection_set.rb', line 121

def filter_text_containing(text)
  filter do |f|
    f.and(f.has_text(text), f.or(f.type("TEXT"), f.type("MTEXT")))
  end
end

#has_filter?Boolean

Check if set has active filters



34
35
36
# File 'lib/autocad/selection_set.rb', line 34

def has_filter?
  filter_types && filter_types.any?
end