Making a SketchUp tool - incorporating the mouse & keyboard
-
Hmm, I see, I think that I do have something wrong about the base units. I suppose SU always works in inches and you have to always convert back to .to_l to get to the default base unit? I've clearly confused myself.
-
2 things;
first; really? It didn't work for you at all? Ah well, I'm mostly playing around, and with it written out like you said, it works too.
second; I don't think it's in the user's default length automatically, because as I said, for me it works as 0.0254m, or 1 inch. My default is set to meters.
UPDATE: I wrote that before You finnished writing your last post. Sorry
-
Yup, if I run it in the webconsole just as you have it written, I get this error:
(eval):9:in βinitializeβ: undefined method βto_iβ for ["1", "1", "1"]:Array
It doesn't like converting the array to an integer. It wants each element of the array to be converted separately on my machine. SU7
-
` model= Sketchup.active_model
@ent= model.entitiesprompts = ["X", "Y", "Z"]
defaults = [ 0.0.to_l, 0.0.to_l, 0.0.to_l]
list = ["", "", ""]
results = UI.inputbox prompts, defaults, list, "Input X, Y, Z."
pt1= Geom::Point3d.new results
pt2= [ 0, 0, 0]
line = @ent.add_edges pt1, pt2`
-
That's strange. .to_i worked fine on my mac.
-
Hey!!!! Great job. I was really confused how on earth to get the inputbox to work in the default units! That did the trick though, setting it to 0.0.to_l. I really couldn't figure that out.
So there you have it, 0.0.to_l makes the inputbox work in the default units. Thanks for posting the solution before I went crazy!
Chris
-
@chris fullmer said:
you might need to provide a way to make and place construction points.
` model = Sketchup.active_model
@ent = model.entitiesprompts = ["X", "Y", "Z"]
defaults = [ 0.0.to_l, 0.0.to_l, 0.0.to_l]
list = ["", "", ""]
results = UI.inputbox prompts, defaults, list, "Input X, Y, Z."
pt1= Geom::Point3d.new results
@ent.add_cpoint pt1`
-
Excellent
-
... Now I need to figure out where in the class to put that . I'm still not that fond of what defs do what exactly.
-
I think you'll probably put it in its own method.
If you want it to be the first thing run every time the user begins the script, then you can call that method at the bottom of the activate method.
And then call other methods from the onReturn method probably (though onLbuttonUp is common too). So it works like this, if you want your script to advance when the user hits enter, then call all YOUR methods from the onReturn method. It only gets triggered when the user hits enter/return. So only call your method from within onReturn and it will only get run once they hit enter. Here's an example of how it could flow
Your "add cpoint" method gets run from the activate method because that is run everytime the user starts the tool. So that will run your construction point right off the bat. Then the user should click on a vertex to specify that vertex as the center of operations. So you would have code in the onLbuttonUp method that yould trigger when they click the mouse. It should take the InputPoint and store it as some @centerPoint variable, assuming its a vertex they clicked on).
Once the cpoint is set and the centerpoint is selected, you could pop up a UI.inputbox asking what radius to use. When they hit enter, then you run a method that does all the calculation and drawing/transforming.
The way I described it there did not require the user to hit enter, so all that would be run from the onLButtonUp method then.
Seriously a tool with the mouse, and with transformations. Nearly as hard as it gets, but do-able. Good luck!
Chris
-
One problem i'm having is not knowing what to enter in the grayed in area. I thought that Pinchmover, the name of the class, would work, but it doesn't. What does?
-
Sketchup.active_model.select_tool Pinchmover.new
And you will also need to move that to the bottom of the script. You can't instantiate the class until after it has been defined. Just put all your menu work at the bottom of the script.
Chris
-
Just the name of the class doesn't work, because with "tools" you are making special classes that Sketchup watches. So you have to tell sketchup to start your class as a tool.
-
Okay
Man, I've got a LOT to learn -
` require "sketchup.rb"
class Pinchmover def activate @model = Sketchup.active_model @ent = @model.entities @view = @model.active_view @slct = @model.selection @slct.clear end def onLButtonUp(flags, x, y, view) ip = view.inputpoint x,y pt = ip.position pt2 = Geom::Point3d.new pt @cpoint = @ent.add_cpoint pt2 end end
plugins_menu = UI.menu("Plugins")
item = plugins_menu.add_item("Pinch Mover") {
Sketchup.active_model.select_tool Pinchmover.new
}`I like mouse interaction and inferencing better than a dumb little inputbox
... Now to get it to make only ONE cont.point ...
... And THEN a way to select an endpoint for the tool to use as the centerpoint of the pinch -
; But now I think I know how to tackle both issues at once
-
Hey, that's great! Its adding the construction point really well. Once its added, you have its position so you know where the pinch is going to. The second cpoint should indicate the vertex to be used.
I agree, you have to figure out those things, so I'm interested to hear how you do it!
Chris
-
That works great! You have two separate points defined and stored for later use. Perfect. Now you have to decide how you want your script to move forward. Does it just begin automatically once the 2nd construction point is set? Or does it pop up a radius input box immediately after the 2nd point is added. Or does it just sit there until the user hits enter? Once they hit enter then it beings running. etc.
So far so good. You've gotten past much of the mouse implementation. Now its on to transformations! WooHoo!
Chris
-
**` require "sketchup.rb"
class Pinchmover def activate @model = Sketchup.active_model @ent = @model.entities @view = @model.active_view @slct = @model.selection @ip = Sketchup::InputPoint.new @slct.clear @first = 0 @second = 0 end def onLButtonUp(flags, x, y, view) if @first == 0 ip1 = view.inputpoint x,y pt1 = ip1.position pt2 = Geom::Point3d.new pt1 @cpoint = @ent.add_cpoint pt2 @first = 1 @second = 1 elsif @second == 1 ip2 = view.inputpoint x,y pt3 = ip2.position pt4 = Geom::Point3d.new pt3 @cpoint2 = @ent.add_cpoint pt4 @second = 2 end end def onReturn(view) #Unnecessary, I just want to see if it's working. UI.messagebox @cpoint UI.messagebox @cpoint2 end end
plugins_menu = UI.menu("Plugins")
item = plugins_menu.add_item("Pinch Mover") {
Sketchup.active_model.select_tool Pinchmover.new
}`**
... So? -
I edited that last post about 30 seconds ago, so that it would have different variables to repeat. I don't know if it'll help, but I thought it would be a good idea.
Advertisement