Skip to content

Instantly share code, notes, and snippets.

@jimfoltz
Last active October 10, 2015 11:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jimfoltz/1bacad3ef1a23d34b4ef to your computer and use it in GitHub Desktop.
Save jimfoltz/1bacad3ef1a23d34b4ef to your computer and use it in GitHub Desktop.
nudge-tool.rb
module JF
module Nudge
class NudgeTool
def enableVCB?
true
end
def activate
@dist ||= 1.0.to_l
@ent = Sketchup.active_model.selection[0]
Sketchup.vcb_label = "Nudge dist"
Sketchup.vcb_value = @dist
axes = best_axes()
end
def onKeyUp(key, repeat, flags, view)
case key
when COPY_MODIFIER_KEY
@ctrl = nil
when CONSTRAIN_MODIFIER_KEY
@shift = nil
when ALT_MODIFIER_KEY
@alt = nil
end
end
def onKeyDown(key, repeat, flags, view)
sel = Sketchup.active_model.selection[0]
dist = @dist
axes = best_axes()
case key
when COPY_MODIFIER_KEY
@ctrl = true
when CONSTRAIN_MODIFIER_KEY
@shift = true
when ALT_MODIFIER_KEY
@alt = true
end
if sel.class == Sketchup::SectionPlane
move_section_plane(sel, key)
elsif sel == nil
move_camera(key)
else
case key
when VK_UP
dist = @ent.bounds.height if @dist == 0
#vec = [0, dist, 0]
vec = axes
make_copy(@ent) if @ctrl
do_move(@ent, dist, vec[2])
when VK_DOWN
dist = @ent.bounds.height if @dist == 0
vec = [0, -dist, 0]
vec = axes
make_copy(@ent) if @ctrl
do_move(@ent, dist, vec[2])
when VK_RIGHT
dist = @ent.bounds.width if @dist == 0
vec = [dist, 0, 0]
vec = axes
vec.length = dist
make_copy(@ent) if @ctrl
do_move(@ent, dist, vec)
when VK_LEFT
dist = @ent.bounds.width if @dist == 0
vec = [-dist, 0, 0]
vec = axes
vec.length = -dist
make_copy(@ent) if @ctrl
do_move(@ent, dist, vec)
end
# p [@shift, @ctrl, @alt]
view.invalidate
end
end
def do_move(ent, dist, vec)
#dist
origin = ent.transformation.origin
new_pt = origin.offset(vec)
tr = Geom::Transformation.new(new_pt)
ent.move!(tr)
end
def move_section_plane(splane, key)
dist = @dist == 0 ? 1.to_l : @dist
plane = splane.get_plane
if key == VK_UP
plane[-1] += dist
elsif key == VK_DOWN
plane[-1] -= dist
end
splane.set_plane(plane)
end
def move_camera(key)
cam = Sketchup.active_model.active_view.camera
eye = cam.eye
target = cam.target
up = cam.up
vec = cam.xaxis
vec.length = @dist
case key
when VK_RIGHT
eye = eye.offset(vec)
target = target.offset(vec)
when VK_LEFT
eye = eye.offset(vec.reverse)
target = target.offset(vec.reverse)
end
cam.set(eye, target, up)
end
def best_axes
cam = Sketchup.active_model.active_view.camera
xaxis = cam.xaxis
xangle = (cam.xaxis.angle_between(X_AXIS)).radians
yangle = (cam.xaxis.angle_between(Y_AXIS)).radians
if xangle <= 45.0
vec = [1, 0, 0]
elsif xangle > 135.0
vec = [-1, 0, 0]
elsif yangle > 135.0
vec = [0, -1, 0]
else
vec = [0, 1, 0]
end
Geom::Vector3d.new(vec)
end
def make_copy(ent)
if ent.is_a?(Sketchup::Group)
copy = ent.copy
copy.transformation = ent.transformation
end
if ent.is_a?(Sketchup::ComponentInstance)
ent.parent.entities.add_instance(ent.definition, ent.transformation)
end
end
def onUserText(text, view)
begin
l = text.to_l
rescue
nil
else
@dist = l
Sketchup.vcb_value = @dist
end
end
def draw(view)
#view.refresh
end
end # NudgeTool
end # Nudge
end # JF
menu = defined?(JF.menu) ? JF.menu : UI.menu('Plugins')
menu.add_item("Nudge Tool") {
Sketchup.active_model.select_tool(JF::Nudge::NudgeTool.new)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment