Code correction
-
Hello, I'm practicing making code by myself and got stuck on error. I can connect arc with a line from 0,0,0. but can't add one more line that connects between 0,0,0 and the other side of arc. I wish one icecream cone shape will show up after executing codes.
ents = Sketchup.active_model.entities pt0 = [0,0,0] pt1 = [0, 0, -5.cm] pt2=pt1.transform(Geom::Transformation.rotation(pt0,[0,0,1],30.degrees)) arc = ents.add_arc [0,0,0], [0,0,-1],[0,-1,0], 5.cm, 0, 30.degrees g=ents.add_group() ge=g.entities ge.add_cpoint(pt0) ge.add_cpoint(pt1) ge.add_cpoint(pt2) ents.add_line pt0, pt1 ents.add_line pt0, pt2 face = ents.add_face pt0, pt1, pt2 path = ents.add_circle [0,0,-5.cm], [0,0,1], -5.cm face.followme path ents.erase_entities path
-
In the future, please enclose your code in
...
- make it easier for others to copy.
You try to rotate pt1, which is on the blue axis, using a rotation also about the blue axis. This has no effect, since pt1 has no x or y value to rotate. Hence pt2 is the same as pt1 and this causes a duplicate points error when you try to add a face using them as two corners. Try using [0,-1,0] as the vector instead of [0,0,1].
-
Thanks you, slbaumgartner. Now its working well
However, this is the first step for drawing cone. The main goal is to draw cone freely.
I'm trying to add inputbox with the corrected code you gave, and have already made codes that can draw various shape with inputbox, but it didn't work again. In my view, there is no problem. Could you please look over it again?require 'sketchup.rb' class Cone @@Length = @@angle = nil def create_cone @@Length = 0.mm if not @@Length @@angle = 0.degrees if not @@angle prompts = ["Radius","Angle"] values = [@@Length, @@angle] results = inputbox prompts, values, "Fire sensor" if results @@Length, @@angle = results model = Sketchup.active_model model.start_operation "Fire sensor" compdef = Sketchup.active_model.definition.add ents = compdef.entities @Length = @@Length @angle = (@@angle)/2 @pt0 = [0,0,0] @pt1 = [0, 0, -@Length] @pt2=@pt1.transform(Geom;;Transformation.rotation(@pt0,[0,-1,0],@angle)) arcarray = ents.add_arc [0,0,0], [0,0,-1],[0,-1,0], @Length, 0, @angle arc = arcarray[0] arccurve = arc.curve verts = arccurve.vertices a = ents.add_line @pt0, @pt1 b = ents.add_line @pt0, @pt2 face = ents.add_face @pt0, @pt1, @pt2 path = ents.add_circle [0,0,-@Length], [0,0,1], -@Length face.followme path ents.erase_entities path face2 = ents.add_face verts path2 = ents.add_circle [0,0,-@Length], [0,0,1], -@Length face2.followme path2 ents.erase_entities path2 group=ents.add_group ents.to_a trans = Geom;;Transformation.new status = model.place_component(compdef) Sketchup.active_model.active_entities.add_instance(compdef, trans) model.commit_operation end #if Sketchup.send_action 'selectSelectionTool;' end #def end #Class if( not file_loaded?(__FILE__) ) UI.add_context_menu_handler do |menu| end dir=File.dirname(__FILE__) cmd_array = [] cmd = UI;;Toolbar.new "sphere" # Create the Command object cmd = UI;;Command.new("Cone") {Sketchup.active_model.select_tool Cone.new.create_cone} # Configure the Command's appearance cmd.small_icon = cmd.large_icon = dir+"/FGmanual/images/cone.png"#<-- cmd.tooltip = "Cone" cmd_array.push(cmd) tb=UI;;Toolbar.new("Creating tools") cmd_array.each {|i| tb.add_item(i)} tb.show if tb.get_last_state == -1 end file_loaded(__FILE__)
-
...
@@angle = **30.0** unless @@angle
...
@angle = (@@angle**.degrees**)/2
...
The various parts of the API accepting angles needs them in radians.
If the user inputs a float as 'degrees' you need to tell SketchUp it in 'radians' by using the converter .degrees
You do NOT want the angle to be 0.0 as that does nothing so trap for wrong inputs.
Also the length should never be 0.0 so trap for that too - perhaps with defaults of say 30.0 and 50.mm ? -
Thanks you for a kind comment, TIG, but it's not still working now. There is no problem until adding numbers in the inputbox. The problem is nothing shows up after clicking 'ok'.
-
Sorry, but your code is full of issues...
Can I suggest you temporarily add a few
Sketchup.active_model.active_view.refresh;UI.messagebox('?')
into your code, then run it with the Ruby Console open, and see what happens, when you see it fails you can see what's made at that step.The length/angle need fixing as I said before, but also...
I see is that you attempt to add a group from an array of entities that are NOT in the active_entities context - this will often fail - even splat! I don't see why you do this anyway ?
Also itsmodel.definition**s**
- you missed off the 's'.
Also consider naming the component definition ?
Also why place an instance and then also add one - why ? -
Hi, TIG. Finally, Its working as I have hoped. This is the corrected code. I needed not use 'group'. The cone shape is created after I deleted the line. Thank you!
require 'sketchup.rb' class Cone @@Length = @@angle =@@x=@@y=@@z = nil def create_cone @@Length = 100 if not @@Length @@angle = 30.0 if not @@angle @@x = 0.mm if not @@x @@y = 0.mm if not @@y @@z = 0.mm if not @@z prompts = ["Radius","Angle", "x", "y", "z"] values = [@@Length, @@angle, @@x, @@y, @@z] results = inputbox prompts, values, "Fire sensor" if results @@Length, @@angle, @@x, @@y, @@z = results model = Sketchup.active_model model.start_operation "Fire sensor" compdef = Sketchup.active_model.definitions.add ents = compdef.entities @Length = @@Length.mm @angle = (@@angle.degrees)/2 @pt0 = [0,0,0] @pt1 = [0, 0, -@Length] @pt2=@pt1.transform(Geom;;Transformation.rotation(@pt0,[0,-1,0],@angle)) arcarray = ents.add_arc [0,0,0], [0,0,-1],[0,-1,0], @Length, 0, @angle arc = arcarray[0] arccurve = arc.curve verts = arccurve.vertices a = ents.add_line @pt0, @pt1 b = ents.add_line @pt0, @pt2 face = ents.add_face @pt0, @pt1, @pt2 path = ents.add_circle [0,0,-@Length], [0,0,1], -@Length face.followme path ents.erase_entities path face2 = ents.add_face verts path2 = ents.add_circle [0,0,-@Length], [0,0,1], -@Length face2.followme path2 ents.erase_entities path2 trans = Geom;;Transformation.new([@@x.to_i, @@y.to_i, @@z.to_i]) status=model.place_component(compdef) Sketchup.active_model.active_entities.add_instance(compdef, trans) model.commit_operation end #if Sketchup.send_action 'selectSelectionTool;' end #def end #Class if( not file_loaded?(__FILE__) ) UI.add_context_menu_handler do |menu| end dir=File.dirname(__FILE__) cmd_array = [] cmd = UI;;Toolbar.new "sphere" # Create the Command object cmd = UI;;Command.new("Cone") {Sketchup.active_model.select_tool Cone.new.create_cone} # Configure the Command's appearance cmd.small_icon = cmd.large_icon = dir+"/FGmanual/images/cone.png"#<-- cmd.tooltip = "Cone" cmd_array.push(cmd) tb=UI;;Toolbar.new("Creating tools") cmd_array.each {|i| tb.add_item(i)} tb.show if tb.get_last_state == -1 end file_loaded(__FILE__)
Advertisement