module SolidRuby::ScrewThreads
This file is part of SolidRuby
.
SolidRuby
is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
SolidRuby
is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with SolidRuby
. If not, see <www.gnu.org/licenses/>.
Public Instance Methods
create_bolts(face, obj1, obj2, args = {})
click to toggle source
# File lib/solidruby/screw_thread.rb, line 79 def create_bolts(face, obj1, obj2, args = {}) # make a obj1-=obj2 with bolts corresponding to the height of obj1 if face.nil? || obj1.nil? || obj2.nil? raise 'usage: create_bolts(face,obj1,obj2,args={}) - args can include (obj1.)height and bolt_height' return end # we need to know obj1 height (if not supplied by user) #TODO: Rescuing like this is not good practise height ||= args[:height] case face.to_s when 'top' height ||= obj1.z rescue nil when 'bottom' height ||= obj1.z rescue nil when 'left' height ||= obj1.x rescue nil when 'right' height ||= obj1.x rescue nil when 'front' height ||= obj1.y rescue nil when 'back' height ||= obj1.y rescue nil end height ||= obj1.height rescue nil if height.nil? raise "the object we're substracting from doesn't have a height defined; please define manually" return end # lets check if the obj2 responds to the threads_[face] method meth = "threads_#{face}" unless obj2.respond_to?(meth) raise "The object you're trying to get bolts from doesn't supply any on the face '#{face}'. Please add a method #{meth} to this object" return end holes = obj2.send(meth) return if holes.nil? # let the user either define bolt_heights as integer, array or none (will be guessed) if args[:bolt_height].is_a? Array bolt_heights = args[:bolt_height] if bolt_heights.size != holes.size raise "object has #{holes.size} threads for bolts but you supplied #{bolt_heights.size}" return end else bolt_heights = [] holes.each do |hole| bolt_heights << if args[:bolt_height] args[:bolt_height] else (height + hole.depth).floor end end end ret = [] holes.each_with_index do |hole, i| bolt = Bolt.new(hole.size, bolt_heights[i], washer: args[:washer]) case face when 'top' bolt.transformations << Rotate.new(x: 180) bolt.transformations << Translate.new(x: hole.x, y: hole.y, z: hole.z + height) when 'bottom' bolt.transformations << Translate.new(x: hole.x, y: hole.y, z: hole.z) when 'left' bolt.transformations << Rotate.new(y: 90) bolt.transformations << Translate.new(x: hole.x, y: hole.y, z: hole.z) when 'right' bolt.transformations << Rotate.new(y: -90) bolt.transformations << Translate.new(x: hole.x + height, y: hole.y, z: hole.z) when 'front' bolt.transformations << Rotate.new(x: -90) bolt.transformations << Translate.new(x: hole.x, y: hole.y, z: hole.z) when 'back' bolt.transformations << Rotate.new(x: 90) bolt.transformations << Translate.new(x: hole.x, y: hole.y + height, z: hole.z) end bolt.transformations += obj2.transformations unless obj2.transformations.nil? ret << bolt end ret end