SketchUp Ruby - Display a message box to user if they clicked on a line in SketchUp

331 Views Asked by At

I am trying to develop a custom tool which will allow the user to select a line and they will be given the slope distance, azimuth and zenith angle of the line. A small table with all that info will then appear on their screen.

I currently have a little bit of code written which you can see below:

class MySpecialLineTool
    def onLButtonDown(flags, x, y, view)
        puts "onMButtonDoubleClick: flags = #{flags}"
        puts "                          x = #{x}"
        puts "                          y = #{y}"
        puts "                       view = #{view}"
        UI.messagebox("You clicked somewhere in SketchUp.")
    end
end

def self.activate_special_tool
    Sketchup.active_model.select_tool(MySpecialLineTool.new)
end

unless file_loaded?(__FILE__)
    menu = UI.menu('Plugins')
        menu.add_item("Darrian's Special Line Tool") {
        self.activate_special_tool
    }
    file_loaded(__FILE__)
end

This will add a tool under the 'Extensions' tab at the top of SketchUp called 'Darrian's Special Line Tool'. When you click on this tool, then click anywhere in SketchUp, a message box appears which says, "You clicked somewhere in SketchUp." But that's about it, I've hit a brick wall so far.

Below is a picture of what 'should' happen if the whole thing worked as intended. https://i.stack.imgur.com/DPmdF.png

I'm quite okay with the calculations. It's just being able to get the code to know that a line has been clicked and to retrieve the Delta X, Y and Z of that line in order to be able to calculate the slope distance, azimuth and zenith angle.

I'm not too concerned about starting and ending point. I am aware this will have an affect on the azimuth and zenith angle, but I was already thinking of providing information from both directions to the user.

I can provide more info if required.

Thanks for your help!

1

There are 1 best solutions below

0
Rafael Rivera On BEST ANSWER

The code below might help you with creating class variables of the selected edge's vertex start & end positions of X, Y, Z coordinates. These values might be needed to calculate some math formulas. Let me know if it helped or not.

I recommend encapsulating your code with Ruby modules for variable or method names not clashing with other SketchUp scripts on the Plugins folder.

module CodeZealot
  # # #
  module MySpecialLineTool
    # # #
    class Main
      def initialize
        @model = Sketchup.active_model
        @selection = @model.selection
        @edges = @selection.grep(Sketchup::Edge)
        @edge = @edges[0]
      end

      def activate
        if @edges.empty?
          msg = 'Select edge before using this tool.'
          UI.messagebox(msg)
          return
        end

        # # # XYZ Cordinate values of first edge vertex
        @edge_start_x = @edge.start.position.x
        @edge_start_y = @edge.start.position.y
        @edge_start_z = @edge.start.position.z
        # # # XYZ Cordinate values of other edge vertex
        # These XYZ might be used for MATH formulas maybe?
        @edge_end_x = @edge.end.position.x
        @edge_end_y = @edge.end.position.y
        @edge_end_z = @edge.end.position.z
        # call math calculation method here...
        math_calculation
      end

      def math_calculation
        # Use class variables for you Math formulas here.
        # Example...
        result = @edge_start_x + @edge_end_x
        msg = "The result = #{result}"
        UI.messagebox(msg, MB_OK)
      end
    end
    # # #
    def self.activate_special_tool
      Sketchup.active_model.select_tool(Main.new)
    end

    unless file_loaded?(__FILE__)
      menu = UI.menu('Plugins')
      menu.add_item("Darrian's Special Line Tool") { self.activate_special_tool }
      file_loaded(__FILE__)
    end
    # # #
  end
end