require 'sketchup.rb' def divide_cpoint model=Sketchup.active_model @e=Sketchup.active_model.selection[0] ents=model.active_entities @subdiv=2 @arc_type="Arc" pts=[] ind_pts={} model.start_operation "Divide with construction points" if Sketchup.active_model.selection.length == 1 @obj_type="Edge" @e=model.selection[0] elsif @e.curve.typename == "ArcCurve" verts=@e.curve.vertices if verts[0].position == verts[verts.length-1].position @arc_type="Circle" @obj_type="Arc" else @obj_type="Arc" end @e=model.selection[0].curve else UI.messagebox("Unsupported curve. Aborting...") return nil end case @obj_type when "Edge" @ps=@e.start.position @pe=@e.end.position @v=@ps.vector_to @pe @vlength=@v.length r=divide_cpoint_dialog @subdiv=r[1] @explode=r[0] # Generate points along @v pts.push(@ps) 1.upto(@subdiv-1) do |i| @v.length=i*(@vlength/@subdiv) cp=ents.add_cpoint(@ps.offset(@v)) pts.push(cp.position) end pts.push(@pe) if @explode == "Yes" @e.erase! 0.upto(@subdiv-1) do |line| ents.add_line pts[line], pts[line+1] end end when "Arc" @ps=@e.first_edge.start.position @pe=@e.last_edge.end.position @verts=@e.vertices @verts.freeze @nsegs=@e.count_edges @clength=@e.length @unit_seg=@clength/@nsegs r=divide_cpoint_dialog @subdiv=r[1] @explode=r[0] @unit_length=@clength/@subdiv 1.upto(@subdiv-1) do |i| current_length=i*@unit_length n_seg=(current_length/@unit_seg).to_i current_seg=@e.edges[n_seg] @p1=current_seg.start.position @p2=current_seg.end.position @v=@p1.vector_to @p2 @remaining=current_length-(n_seg*@unit_seg) @v.length=@remaining @p=@p1.offset(@v) cp=ents.add_cpoint(@p) pts.push(cp.position) ind_pts[cp]=n_seg end if @arc_type == "Circle" cp=ents.add_cpoint(@pe) pts.push(cp.position) end #Explode option if @explode == "Yes" org_verts=[] @verts.each do |p| org_verts.push(p.position) end Sketchup.active_model.selection.each { |o| o.erase! } # Sort vertives and new cpoints all_pts=sort_cpoints(org_verts,pts) ents.add_line all_pts end end #case model.commit_operation end def sort_cpoints(verts,cpoints) new_pts=[] 0.upto(verts.length-2) do |i| p1=verts[i] p2=verts[i+1] new_pts.push(p1) cpoints.each do |cp| if cp.on_line? [p1, (p1.vector_to p2)] new_pts.push(cp) end end new_pts.push(p2) end return new_pts end def divide_cpoint_dialog s=2 if not s list=["Yes","No"].join("|") prompts=["Explode at points: ","Segments:"] values=["No",s] enums=[list] results = inputbox prompts, values, enums, "Divide" return if not results return results end def divide_cpoint_valid_selection return true if Sketchup.active_model.selection[0].typename == "Edge" end if not $divide_cpoint_loaded UI.add_context_menu_handler do |menu| if divide_cpoint_valid_selection menu.add_item("Divide with construction points") { divide_cpoint } end end end $divide_cpoint_loaded=true