Questions about realization of tools
-
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 anddegrees_of_freedomis in this case = 3
Another question I have is, How to detect the position of the tool outside the edit window?, (as happens with the 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. 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.
-
@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
onMouseMoveonly respond within the drawing window.any suggestions to prevent my tool display incomplete?
.
-
What if you also hook into the event callback of when the cursor moves? Ignoring the Tool class' events?
-
-
@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
-
@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,

-
Got a bare bone example that shows this slowness?
-
@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)
-
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. -
@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 -
I give up, I can not understand how to use
view.pickray x, yfor 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
-
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. -
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 toModel#raytest(). -
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?
-
Keep a reference to the observer instance.
<span class="syntaxdefault"><br /></span><span class="syntaxkeyword">@</span><span class="syntaxdefault">tool_observer </span><span class="syntaxkeyword">= </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 /> </span><span class="syntaxdefault"></span> -
@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 + tb
z = z0 + t*cin my case a, b, c is associated with
Geom :: Vector3D(parallel to the line)
and x0, y0, z0 is associated withGeom :: Point3D(content in the line)
the intersection with plane z=0 (XY plane), for example would beray = 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 planeFor 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 -
Thom thank you very much, really I could not understand how to do this

-
The API doc examples are confusing. One learn the hard way.
-
is true, on several occasions have been very frustrating these examples

Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register LoginAdvertisement