• Login
sketchucation logo sketchucation
  • Login
⚠️ Attention | Having issues with Sketchucation Tools 5? Report Here

Questions about realization of tools

Scheduled Pinned Locked Moved Developers' Forum
20 Posts 4 Posters 475 Views 4 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.
  • D Offline
    dacastror
    last edited by 12 Jan 2013, 04:32

    Hi, I'm trying to create a tool and I have arisen various questions in the process.
    One question is how orienting a tool as shown in the image? since there are no faces on which to place the tool and degrees_of_freedom is in this case = 3

    rotate tool

    Another question I have is, How to detect the position of the tool outside the edit window?, (as happens with the orbit tool).

    Orbit tool

    and the other question is, what command I can use for prevent my tool this cropped and disappears only when I leave the drawing window?

    sorry for these "gif" can be a bit annoying but needed to illustrate my questions 😄
    (google translator)

    1 Reply Last reply Reply Quote 0
    • T Offline
      thomthom
      last edited by 13 Jan 2013, 12:56

      #1. You make special cases for that. When you don´t hit any geometry, Make a pickray and see if it intersects any of the XY, XZ, YZ planes.

      #2. Don´t think you can with just pure Ruby. The native tools do that because they are done in C++ and capture the mouse. Unfortunatly there is no way to capture the mouse from the Ruby API.

      Thomas Thomassen — SketchUp Monkey & Coding addict
      List of my plugins and link to the CookieWare fund

      1 Reply Last reply Reply Quote 0
      • D Offline
        dacastror
        last edited by 13 Jan 2013, 16:03

        @thomthom said:

        #1. You make special cases for that. When you don´t hit any geometry, Make a pickray and see if it intersects any of the XY, XZ, YZ planes.

        Thomthom thank you very much!, That's what I'll do 😄

        @thomthom said:

        #2. Don´t think you can with just pure Ruby. The native tools do that because they are done in C++ and capture the mouse. Unfortunatly there is no way to capture the mouse from the Ruby API.

        It is a pity. I thought this might serve me

        require 'Win32API'
         
        getCursorPos = Win32API.new("user32", "GetCursorPos", ['P'], 'V')
        lpPoint = " " * 8 # store two LONGs
        getCursorPos.Call(lpPoint)
        x, y = lpPoint.unpack("LL") # get the actual values
        coor_mouse = " y = #{x},  x = #{y}"
        

        but at the end I think can not because onMouseMove only respond within the drawing window.

        any suggestions to prevent my tool display incomplete?

        .

        1 Reply Last reply Reply Quote 0
        • T Offline
          thomthom
          last edited by 13 Jan 2013, 16:45

          What if you also hook into the event callback of when the cursor moves? Ignoring the Tool class' events?

          Thomas Thomassen — SketchUp Monkey & Coding addict
          List of my plugins and link to the CookieWare fund

          1 Reply Last reply Reply Quote 0
          • T Offline
            thomthom
            last edited by 13 Jan 2013, 16:46

            @dacastror said:

            any suggestions to prevent my tool display incomplete?

            ?

            Thomas Thomassen — SketchUp Monkey & Coding addict
            List of my plugins and link to the CookieWare fund

            1 Reply Last reply Reply Quote 0
            • J Offline
              Jim
              last edited by 13 Jan 2013, 20:29

              @thomthom said:

              @dacastror said:

              any suggestions to prevent my tool display incomplete?

              ?

              getExtents, maybe.

              http://www.sketchup.com/intl/en/developer/docs/ourdoc/tool#getExtents

              Hi

              1 Reply Last reply Reply Quote 0
              • D Offline
                dacastror
                last edited by 15 Jan 2013, 23:36

                @jim said:

                getExtents, maybe.

                thank you very much Jim!, this solved the problem, cost me a bit to understand how to implement it, but it goes

                @thomthom said:

                What if you also hook into the event callback of when the cursor moves? Ignoring the Tool class' events?

                I tried but it works very slow when the cursor is outside the window of Sketchup, 😞

                1 Reply Last reply Reply Quote 0
                • T Offline
                  thomthom
                  last edited by 16 Jan 2013, 08:38

                  Got a bare bone example that shows this slowness?

                  Thomas Thomassen — SketchUp Monkey & Coding addict
                  List of my plugins and link to the CookieWare fund

                  1 Reply Last reply Reply Quote 0
                  • D Offline
                    dacastror
                    last edited by 16 Jan 2013, 14:14

                    @thomthom said:

                    Got a bare bone example that shows this slowness?

                    Yes,

                    require 'Win32API'
                     
                    Thread.new {
                       x=1 
                       while (x<1000) do
                         getCursorPos = Win32API.new("user32", "GetCursorPos", ['P'], 'V')
                         lpPoint = " " * 8 # store two LONGs
                         getCursorPos.Call(lpPoint)
                         x, y = lpPoint.unpack("LL") # get the actual values
                         coor_mouse = "  #{x},  #{y}"
                         Sketchup;;set_status_text coor_mouse, SB_VCB_VALUE
                       end
                    }
                    

                    Note : to see how slow returns coordinates, should be small the Sketchup window and put the cursor outside it, to stop the program move the cursor to the right until x >1000

                    (Google Translator)

                    1 Reply Last reply Reply Quote 0
                    • T Offline
                      thomthom
                      last edited by 16 Jan 2013, 14:24

                      Threads doesn't work well in SketchUp Ruby. It's Ruby 1.8 and they are not true threads.

                      And I see you are polling GetCursorPos. I was thinking if there might be a callback function you could register instead.

                      Thomas Thomassen — SketchUp Monkey & Coding addict
                      List of my plugins and link to the CookieWare fund

                      1 Reply Last reply Reply Quote 0
                      • D Offline
                        dacastror
                        last edited by 17 Jan 2013, 03:55

                        @thomthom said:

                        Threads doesn't work well in SketchUp Ruby. It's Ruby 1.8 and they are not true threads.

                        I did not know this 😲, thanks

                        1 Reply Last reply Reply Quote 0
                        • D Offline
                          dacastror
                          last edited by 17 Jan 2013, 04:19

                          I give up, I can not understand how to use view.pickray x, y for the intersection with the XY, XZ and YZ, and thereby be able to guide a tool, really I can not see how this is done 😞

                          I could only understand that returns two points, one coincides with the point of view and the other (I think) is a vector pointing toward the cursor, but do not understand how to use this to get the intersection with the respective flat front or behind me

                          1 Reply Last reply Reply Quote 0
                          • D Offline
                            Dan Rathbun
                            last edited by 17 Jan 2013, 08:12

                            View.pickray() can take ANY screen co-ordinate (it can be, or may not be the mouse position.)

                            It returns a ray

                            @unknownuser said:

                            A ray is a two element array containing a point and a vector [ Geom::Point3d, Geom::Vector3d ]. The point defines the start point of the ray and the vector defines the direction.

                            I'm not here much anymore.

                            1 Reply Last reply Reply Quote 0
                            • D Offline
                              Dan Rathbun
                              last edited by 17 Jan 2013, 08:17

                              Perhaps you wish to use model#raytest ?

                              It can return objects it hits.

                              View#pickray() does not, by itself, "hit" anything, but could be used for the 1st argument to Model#raytest().

                              I'm not here much anymore.

                              1 Reply Last reply Reply Quote 0
                              • D Offline
                                dacastror
                                last edited by 19 Jan 2013, 04:29

                                Guys, how to remove an observer of tools? I created an observer slightly modifying the example shown in the API

                                
                                class MyToolsObserver < Sketchup;;ToolsObserver
                                   def onActiveToolChanged(tools, tool_name, tool_id)
                                      if tool_id == 21100
                                         puts "tool x"
                                      end
                                   end
                                end
                                
                                Sketchup.active_model.tools.add_observer(MyToolsObserver.new)
                                
                                

                                I thought you could with something like this:

                                Sketchup.active_model.tools.remove_observer(MyToolsObserver)

                                What is the correct way to remove this observer?

                                1 Reply Last reply Reply Quote 0
                                • T Offline
                                  thomthom
                                  last edited by 19 Jan 2013, 12:53

                                  Keep a reference to the observer instance.

                                  <span class="syntaxdefault"><br /></span><span class="syntaxkeyword">@</span><span class="syntaxdefault">tool_observer&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">MyToolsObserver</span><span class="syntaxkeyword">.new<br /><br /></span><span class="syntaxdefault">Sketchup</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">active_model</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">tools</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">add_observer</span><span class="syntaxkeyword">(@</span><span class="syntaxdefault">tool_observer</span><span class="syntaxkeyword">)<br /><br /></span><span class="syntaxdefault">Sketchup</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">active_model</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">tools</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">remove_observer</span><span class="syntaxkeyword">(@</span><span class="syntaxdefault">tool_observer</span><span class="syntaxkeyword">)<br />&nbsp;</span><span class="syntaxdefault"></span>
                                  

                                  Thomas Thomassen — SketchUp Monkey & Coding addict
                                  List of my plugins and link to the CookieWare fund

                                  1 Reply Last reply Reply Quote 0
                                  • D Offline
                                    dacastror
                                    last edited by 19 Jan 2013, 14:52

                                    @dan rathbun said:

                                    A ray is a two element array containing a point and a vector [ Geom::Point3d, Geom::Vector3d ]. The point defines the start point of the ray and the vector defines the direction.

                                    Thanks Dan, I now understand better 😄

                                    @dan rathbun said:

                                    Perhaps you wish to use model#raytest ?
                                    It can return objects it hits.
                                    View#pickray() does not, by itself, "hit" anything, but could be used for the 1st argument to Model#raytest().

                                    I've never used it, looks interesting I'll give a look.
                                    For now solve the problem using the parametric form of the line;

                                    x = x0 + ta
                                    y = y0 + t
                                    b
                                    z = z0 + t*c

                                    in my case a, b, c is associated with Geom :: Vector3D (parallel to the line)
                                    and x0, y0, z0 is associated with Geom :: Point3D (content in the line)
                                    the intersection with plane z=0 (XY plane), for example would be

                                    
                                    ray = view.pickray x, y  #ray[0] -> Point3D, ray[1] -> Vector3d
                                    if ray[1].z.abs>0
                                       z1 = 0 #Interesting plane
                                       t1 = (z1-ray[0].z)/ray[1].z
                                       x1 = ray[0].x + t1*ray[1].x
                                       y1 = ray[0].y + t1*ray[1].y 
                                    end
                                    #x1,y1,z1 are coordinates of the point of intersection with the plane
                                    
                                    

                                    For the other two planes is very similar, although in my case I want to compare the different distances of the planes to the point of "eye" for this I did the following

                                    
                                    ray = view.pickray x, y
                                    
                                    if ray[1].z.abs>0
                                       z1 = 0 #Interesting plane
                                       t1 = (z1-ray[0].z)/ray[1].z
                                       d1 = (t1*ray[1].x)**2 + (t1*ray[1].y)**2 + (z1-ray[0].z)**2
                                    end
                                    #d1 is the square of the distance from the eye to the plane
                                    
                                    
                                    
                                    1 Reply Last reply Reply Quote 0
                                    • D Offline
                                      dacastror
                                      last edited by 19 Jan 2013, 15:21

                                      Thom thank you very much, really I could not understand how to do this 👍 😄

                                      1 Reply Last reply Reply Quote 0
                                      • T Offline
                                        thomthom
                                        last edited by 19 Jan 2013, 22:22

                                        The API doc examples are confusing. One learn the hard way.

                                        Thomas Thomassen — SketchUp Monkey & Coding addict
                                        List of my plugins and link to the CookieWare fund

                                        1 Reply Last reply Reply Quote 0
                                        • D Offline
                                          dacastror
                                          last edited by 20 Jan 2013, 18:14

                                          is true, on several occasions have been very frustrating these examples

                                          error

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

                                          Advertisement