Basic Cube Grid Wireframe Script (Cubic Array)

Menu: Extension / Support BirdCage by Dezmo
'quick&dirty! Does not really tested.
No warranties, use at your own risk!

module Dezmo
module SupportBirdCage
  extend self
  @@loaded = false unless defined?(@@loaded)
  
  def draw_wireframe_cube(pt, model)
    entities = model.active_entities
    bb = Geom::BoundingBox.new
    bb.add(ORIGIN, pt)
    cr = (0..7).map{ |i| bb.corner(i) }
    qd = [
       [cr[0], cr[1], cr[3], cr[2]],
       [cr[0], cr[1], cr[5], cr[4]],
       [cr[1], cr[3], cr[7], cr[5]],
       [cr[3], cr[2], cr[6], cr[7]],
       [cr[2], cr[0], cr[4], cr[6]],
       [cr[4], cr[5], cr[7], cr[6]]
      ]
    group = entities.add_group
    qd.each{|q|
      face = group.entities.add_face q
      face.erase!
    }
    lx = model.layers.add("Ledgers")
    ly = model.layers.add("Transoms")
    lz = model.layers.add("Standards")
    lb = model.layers.add("Braces")
    group.entities.grep(Sketchup::Edge){|e|
      if e.line[1].parallel?(X_AXIS)
        e.layer = lx
      elsif e.line[1].parallel?(Y_AXIS)
        e.layer = ly
      elsif e.line[1].parallel?(Z_AXIS)
        e.layer = lz
      end
    }
    groupx = entities.add_group
    ex = groupx.entities.add_line(cr[0], cr[5])
    groupy = entities.add_group
    ey = groupy.entities.add_line(cr[2], cr[4])
    groupx.layer = lb
    groupy.layer = lb
    [ group, groupx, groupy ]
  end

  def create_ui
    prompts = ['Cube Size X:', 'Cube Size Y:', 'Cube Size Z:', 'Overall Length X:', 'Overall Length Y:', 'Overall Length Z:']
    @defaults ||= ['100', '100', '100', '500', '500', '500']

    input = UI.inputbox(prompts, @defaults, 'Wireframe Cubes')

    if input
      model = Sketchup.active_model
      model.start_operation("Wireframe Cubes", true)
      cube_x = input[0].to_l
      cube_y = input[1].to_l
      cube_z = input[2].to_l
      overall_x = input[3].to_l
      overall_y = input[4].to_l
      overall_z = input[5].to_l
      @defaults = [cube_x, cube_y, cube_z, overall_x, overall_y, overall_z]
      
      cube_group, groupx, groupy = draw_wireframe_cube([cube_x, cube_y, cube_z], model)
      count = 0
      for i in 0..(overall_x / cube_x).to_i - 1
        for j in 0..(overall_y / cube_y).to_i - 1
          for k in 0..(overall_z / cube_z).to_i - 1
            new_cube_group = cube_group.copy
            new_cube_group.move!([cube_x * i, cube_y * j, cube_z * k])
            count += 1
          end
        end
      end
      cube_group.erase!
      
      ptsx = groupx.entities.grep(Sketchup::Edge)[0].vertices.map(&:position)
      ptsy = groupy.entities.grep(Sketchup::Edge)[0].vertices.map(&:position)
      ((overall_z / cube_z).to_i - 1).times do
        ptsx[0].z += cube_z
        ptsx[1].z += cube_z
        groupx.entities.add_edges(ptsx)
        ptsy[0].z += cube_z
        ptsy[1].z += cube_z
        groupy.entities.add_edges(ptsy)
      end
      
      model.commit_operation
      plural = count > 1 ? "s" : ""
      UI.messagebox("#{count} Wireframe cube#{plural} created\n1-1 X-Y base 'Braces' added.")
    end
  end
  
  unless @@loaded
    @@loaded = true
    UI.menu('Plugins').add_item('Support BirdCage by Dezmo') { create_ui }
  end
  
end
end