# Copyright 2004, Rick Wilson 

# Permission to use, copy, modify, and distribute this software for 
# any purpose and without fee is hereby granted, provided that the above
# copyright notice appear in all copies.

# THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.

# Name :          extend.rb 1.0
# Description :   Extend edges to the nearest intersected edge
# Author :        Rick Wilson
# Usage :         1.	Install into the plugins directory or into the 
#				Plugins/examples directory and manually load from the
#				ruby console "load 'examples/bomb.rb'" 
#                 2.	Run "Extend to nearest" from the context menu after
#				selecting an edge.
# Date :          20.Aug.2004
# Type :          Tool
# History:
#			1.0 (20.Aug.2004) - first version
# 
require 'sketchup.rb'

class Extend

def Extend.nearest 	#EXTEND TO NEAREST EDGE
	model=Sketchup.active_model
	view=model.active_view
	ents=model.entities
	ss=model.selection
	sel=[]
	0.upto(ss.length-1) do |a|
		sel.push(ss[a]) if ((ss[a].class == Sketchup::Edge) && (ss[a].curve == nil))
	end
	model.start_operation "Prolonger"
	0.upto(sel.length-1) do |a|
		d1=d2=nil
		s=sel[a]
		pt1=s.start
		pt2=s.end
		vec1=s.line[1].reverse
		vec2=s.line[1]
		ext1=model.raytest(pt1.position,vec1)
		ext2=model.raytest(pt2.position,vec2)
		d1=(pt1.position.distance (ext1[0])).to_f if ext1 != nil
		d2=(pt2.position.distance (ext2[0])).to_f if ext2 != nil
		if ((d1 != nil) && (d2 != nil))
			if d1 <= d2
				t=Geom::Transformation.new(ext1[0]-pt1.position)
				ents.transform_entities(t, pt1)
				ents.add_line(pt1.position, pt2.position).find_faces
			else
				t=Geom::Transformation.new(ext2[0]-pt2.position)
				ents.transform_entities(t, pt2)
				ents.add_line(pt1.position, pt2.position).find_faces
			end
		elsif ((d1 != nil) || (d2 != nil))
			if d1 != nil
				t=Geom::Transformation.new(ext1[0]-pt1.position)
				ents.transform_entities(t, pt1)
				ents.add_line(pt1.position, pt2.position).find_faces
			else
				t=Geom::Transformation.new(ext2[0]-pt2.position)
				ents.transform_entities(t, pt2)
				ents.add_line(pt1.position, pt2.position).find_faces
			end
		end
		sel[a].find_faces
	end
	ss.clear()
	model.commit_operation
end

def Extend.trim_nearest 	#TRIM TO NEAREST EDGE
	model=Sketchup.active_model
	view=model.active_view
	ents=model.entities
	ss=model.selection
	sel=[]
	0.upto(ss.length-1) do |a|
		sel.push(ss[a]) if ((ss[a].class == Sketchup::Edge) && (ss[a].curve == nil))
	end
	model.start_operation "Ajuster"
	0.upto(sel.length-1) do |a|
		d1=d2=nil
		s=sel[a]
		pt1=s.start
		pt2=s.end
		vec1=s.line[1]
		vec2=s.line[1].reverse
		ext1=model.raytest(pt1.position,vec1)
		ext2=model.raytest(pt2.position,vec2)
		d1=(pt1.position.distance (ext1[0])).to_f if ext1 != nil
		d2=(pt2.position.distance (ext2[0])).to_f if ext2 != nil
		if (((d1 != nil) && (d2 != nil)) && (d1 < pt1.position.distance(pt2.position)))
			if d1 <= d2
				t=Geom::Transformation.new(ext1[0]-pt1.position)
				ents.transform_entities(t, pt1)
				ents.add_line(pt1.position, pt2.position).find_faces
			else
				t=Geom::Transformation.new(ext2[0]-pt2.position)
				ents.transform_entities(t, pt2)
				ents.add_line(pt1.position, pt2.position).find_faces
			end
		elsif (((d1 != nil) || (d2 != nil)) && (d1 < pt1.position.distance(pt2.position)))
			if d1 != nil
				t=Geom::Transformation.new(ext1[0]-pt1.position)
				ents.transform_entities(t, pt1)
				ents.add_line(pt1.position, pt2.position).find_faces
			else
				t=Geom::Transformation.new(ext2[0]-pt2.position)
				ents.transform_entities(t, pt2)
				ents.add_line(pt1.position, pt2.position).find_faces
			end
		end
		view.invalidate
	end
	ss.clear()
	model.commit_operation
end

def Extend.validate_selection
	Sketchup.active_model.selection.each {|e| return true if e.class == Sketchup::Edge}
	return nil
end

end	#END CLASS

if( not file_loaded?("fr_extend.rb") )
	UI.add_context_menu_handler do |menu|
		menu.add_separator if Extend.validate_selection
		submenu=menu.add_submenu("Extender ") if Extend.validate_selection
			submenu.add_item("To the Nearest") { Extend.nearest } if Extend.validate_selection
#			submenu.add_item("to Select") { Extend.select } if Extend.validate_selection
		submenu=menu.add_submenu("Trim ") if Extend.validate_selection
			submenu.add_item("To the Nearest") { Extend.trim_nearest } if Extend.validate_selection
#			submenu.add_item("to Select") { Extend.trim_select } if Extend.validate_selection
#		submenu=menu.add_item("Fillet") if Extend.validate_selection
#			submenu.add_item("to Select") { Extend.fillet_corner } if Extend.validate_selection
#			submenu.add_item("to Select") { Extend.fillet_radius } if Extend.validate_selection
	end
end

#-----------------------------------------------------------------------------
file_loaded("fr_extend.rb")