Hi everyone,
I’m having trouble with a custom SketchUp tool that was created by AI. The tool correctly highlights a selected plane and applies materials to it when clicked. Additionally, this code works for closed groups and components. However, the CTRL modifier functionality is not working as expected. Here’s a summary of the issues I’m facing:
Plane Highlighting: The tool highlights the plane correctly when hovered over and works on closed groups and components.
Material Application: Materials are correctly applied to the selected plane or to closed groups and components when clicked.
CTRL Modifier: The CTRL key should trigger the application of the material to the entire object (group or component) rather than just the selected plane. This should work for both closed groups and components, but this functionality is not working.
Here is the relevant code:
module CustomSelectionTool
class SelectPlaneTool
def initialize
@ip = Sketchup::InputPoint.new
@view = Sketchup.active_model.active_view
@last_face = nil
@model = Sketchup.active_model
@selection = @model.selection
@materials = @model.materials
end
def onMouseMove(flags, x, y, view)
@ip.pick(view, x, y)
face = @ip.face
if face && face.is_a?(Sketchup::Face)
if face != @last_face
# Clear previous selection
@selection.clear
# Select the new face
@selection.add(face)
@last_face = face
view.invalidate
end
else
if @last_face
# Clear selection when there is no face
@selection.clear
@last_face = nil
view.invalidate
end
end
view.tooltip = @last_face ? "Face selected" : "No face selected"
end
def onLButtonDown(flags, x, y, view)
if @last_face
if (flags & MK_CONTROL) == MK_CONTROL
# Apply material to the entire object (group or component)
apply_material_to_object(@last_face.parent)
else
# Apply material to the selected face
apply_material(@last_face)
end
@last_face = nil
view.invalidate
end
end
def apply_material(face)
material = @model.materials.current
if material
face.material = material
else
puts "No material to apply"
end
end
def apply_material_to_object(entity)
material = @model.materials.current
if material
if entity.is_a?(Sketchup::Group) || entity.is_a?(Sketchup::ComponentInstance)
entity.entities.grep(Sketchup::Face).each { |f| f.material = material }
elsif entity.is_a?(Sketchup::Face)
entity.material = material
else
puts "Cannot apply material to this type of object"
end
else
puts "No material to apply"
end
end
end
def self.activate_select_plane_tool
Sketchup.active_model.select_tool(SelectPlaneTool.new)
end
end
if !file_loaded?(__FILE__)
UI.menu('Plugins').add_item('Select Plane Tool') {
CustomSelectionTool.activate_select_plane_tool
}
file_loaded(__FILE__)
end
What I’ve Tried:
Using Sketchup::InputModifier::CTRL to check if the CTRL key is pressed.
Ensuring the current material is selected before applying it.
Any suggestions or insights on why the CTRL key functionality is not applying the material to the entire object (including closed groups and components) as intended would be greatly appreciated. Thank you!
The code is written in Ruby 1.8, which is compatible with SketchUp 8.
Robert