# Name :          Drop 1.52
# Description :   drop group/component on selected level (change in Y)
# Author :        TBD
# Usage :         1. select groups and/or components, right click, drop at intersection
#                   or
#                 1. select face, right click, get position to set level
#                 2. select groups and/or components, right click, drop at ...
# Date :          22.Jul.2oo4
# Type :          tool
# History:        1.5 (22.Jul.2oo4) - drop selected items at intersection instead of level
#                 1.4 (20.Jul.2oo4) - added debug construction line for drop at intersection
#                                   - bugfixed get position
#                 1.3 (19.Jul.2oo4) - added "find intersection"
#                 1.2 (14.Jul.2oo4) - added support for units
#                 1.1 (14.Jul.2oo4) - added "Drop at ..."
#                 1.o (14.Jul.2oo4) - first version

require 'sketchup.rb'

class Drop

   # Y value for the drop, convert to Length
   @@level = 0.m
   
   # validate the level entity (menu) - allow only Face entities
   def Drop::validate_level_entity
      ss = Sketchup.active_model.selection
      return nil if ss.empty? 
      return true if (ss.first.kind_of? Sketchup::Face and ss.count==1)
   end

   # validate the drop entity (menu)  - allow only Groups and Components 
   def Drop::validate_drop_entity
      ss = Sketchup.active_model.selection
      return nil if ss.empty?

      is_valid = nil
      ss.each do |e| 
         if (e.kind_of? Sketchup::Group) or (e.kind_of? Sketchup::ComponentInstance)   
            is_valid = true 
         else 
            is_valid = false
         end
      end

      return is_valid
   end
   
   # perform the drop
   def Drop::perform_drop (entity)
      position = entity.transformation.to_a
      # Y value at position 14, the rest are orientation and some view values (not sure)
      position[14] = @@level
      entity.transformation = position

      # invalidate the view to see the move action
      Sketchup.active_model.active_view.invalidate
   end

   # get the level from user and perform drop
   def Drop::drop_at
      prompts = ["enter drop level: "]
      values = [@@level]
      results = inputbox prompts, values, "Drop level"
      return if not results 

      @@level = results[0]
      ss = Sketchup.active_model.selection
      ss.each do |e|
         Drop.perform_drop e
      end
   end

   # drop at intersection
   def Drop::drop_intersection
      dir = [0,0,-1]
      ss = Sketchup.active_model.selection
     
      ss.each do |e|
         position = e.transformation.origin
         rt = Sketchup.active_model.raytest(position,dir)
         dir_rt = [position.x, position.y, -1]       
         if rt == nil
            Sketchup.active_model.active_entities.add_cline position,dir_rt
         else
            pt2 = rt[0] 
            @@level = pt2[2]
            Drop.perform_drop e
         end
      end
   end
   
   # get face Y position for drop level
   def Drop::get_plane_position
      ss = Sketchup.active_model.selection
      
      if ss.first.kind_of? Sketchup::Face
         @@level = ss.first.vertices.first.position[2]
         return @@level.to_s
      end
   end

end # Class Drop

# -------------------------------------------------------------------------------------------------

if( not file_loaded?("drop.rb") )
   UI.add_context_menu_handler do |menu|
      menu.add_separator if (Drop.validate_level_entity || Drop.validate_drop_entity)
      menu.add_item("Drop at intersection") { Drop.drop_intersection } if Drop.validate_drop_entity
      menu.add_item("Drop at ...") { Drop.drop_at } if Drop.validate_drop_entity
      menu.add_item("Get position: "+Drop.get_plane_position) {} if Drop.validate_level_entity
   end
end

file_loaded("drop.rb")