sketchucation logo sketchucation
    • Login
    ℹ️ Licensed Extensions | FredoBatch, ElevationProfile, FredoSketch, LayOps, MatSim and Pic2Shape will require license from Sept 1st More Info

    Handling Unknown Arguments

    Scheduled Pinned Locked Moved SketchUp Tutorials
    sketchup
    2 Posts 2 Posters 2.4k Views 2 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • J Offline
      Jim
      last edited by

      When testing code for Observers, I was curious about what exactly was being passed to the Observer event methods. I would normally trust the documentation, but in this case... So anyway, here's a little trick. If you prefix an asterisk (*) to the variable name in the method def, every argument passed to the method gets put in the variable as an array element.

      The ToolObsever methods below normally accept 3 parameters, according to the API docs;

      • A Tools object
      • The tool name
      • The toolid.

      In the code below, the args variable is prefixed with an asterisk, which make it into an array and each argument passed to the method are added to the array. This makes an easy way to inspect all of the arguments.

      
      class MyToolsObserver < Sketchup;;ToolsObserver
         def onActiveToolChanged(*args)
            print "onActiveToolChanged; "
            p args
         end
         def onToolStateChanged(*args)
            print "onToolStateChanged; "
            p args
         end
      end
      Sketchup.active_model.tools.add_observer(MyToolsObserver.new)
      
      

      And a look at some output:

      
      onToolStateChanged; [#<Sketchup;;Tools;0xc681940>, "CircleTool", 21096, 0]
      onToolStateChanged; [#<Sketchup;;Tools;0xc681940>, "CircleTool", 21096, 0]
      onActiveToolChanged; [#<Sketchup;;Tools;0xc681940>, "CircleTool", 21096]
      onActiveToolChanged; [#<Sketchup;;Tools;0xc681940>, "CircleTool", 21096]
      onToolStateChanged; [#<Sketchup;;Tools;0xc681940>, "RectangleTool", 21094, 0]
      onToolStateChanged; [#<Sketchup;;Tools;0xc681940>, "RectangleTool", 21094, 0]
      onActiveToolChanged; [#<Sketchup;;Tools;0xc681940>, "RectangleTool", 21094]
      onActiveToolChanged; [#<Sketchup;;Tools;0xc681940>, "RectangleTool", 21094]
      onActiveToolChanged; [#<Sketchup;;Tools;0xc681940>, "CameraOrbitTool", 10508]
      onActiveToolChanged; [#<Sketchup;;Tools;0xc681940>, "CameraOrbitTool", 10508]
      onActiveToolChanged; [#<Sketchup;;Tools;0xc681940>, "RectangleTool", 21094]
      onActiveToolChanged; [#<Sketchup;;Tools;0xc681940>, "RectangleTool", 21094]
      onActiveToolChanged; [#<Sketchup;;Tools;0xc681940>, "SelectionTool", 21022]
      onActiveToolChanged; [#<Sketchup;;Tools;0xc681940>, "SelectionTool", 21022]
      
      

      So the output is mostly right according to the docs. In some cases, there is a fourth argument passed to the methods. I can only guess what it is - perhaps a flag, or indicator of the tool state.

      Hi

      1 Reply Last reply Reply Quote 0
      • T Offline
        todd burch
        last edited by

        I am pretty sure it's a tool state that cannot be relied upon. I discussed this with Google some time ago. While it does seem to work for some tools, it completely doesn't for others.

        For instance, the line tool. State 1 might be a down and release of the LMB, and state 2 might be the second click to complete the line after you've moved the mouse. However, you can also down left click, move the mouse, and release the mouse to draw the line, in which case, the (hypothetical) state rule above does not apply.

        The net of it all is that right now, we cannot depend on the tool state flag for anything, either because we don't have enough additional information to go along with it (like how the line tool is being used), or, it's simply residual information that is being push over through the API and is meaningless. (And that fact that "we're not supposed to be using it - it wasn't put in for us mere mortals")

        Perhaps in the future it can be relied upon.

        Todd

        1 Reply Last reply Reply Quote 0
        • 1 / 1
        • First post
          Last post
        Buy SketchPlus
        Buy SUbD
        Buy WrapR
        Buy eBook
        Buy Modelur
        Buy Vertex Tools
        Buy SketchCuisine
        Buy FormFonts

        Advertisement