Advertisement
Guest User

Untitled

a guest
Oct 22nd, 2019
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.90 KB | None | 0 0
  1. #TODO
  2. # All to layer 0
  3. # Explode all Groups
  4. # Generate new Group with all entities
  5.  
  6. # generate grats (bridges) within a template to prevent parts from disloging or falling out during lasercutting
  7.  
  8. #---------------------------------------------------------------------------------
  9. # return first edge from edgeList that connects to vertex lastVertex
  10. def self.FindConnectingEdge(lastVertex, edgeList)
  11. edgeList.each do |e|
  12. p3 = e.start.position
  13. p4 = e.end.position
  14. #puts "~~~~~~~~~" + p3.inspect + " " + p4.inspect
  15. if lastVertex == p3 or lastVertex == p4
  16. #puts "---" + p3.inspect + " " + p4.inspect
  17. return e
  18. end
  19. end
  20. return 0
  21. end
  22.  
  23. #---------------------------------------------------------------------------------
  24. # put connected edges into groups in group_buffer[][]
  25. def self.SortConnectedEdgesIntoGroups(edge_buffer)
  26. group_buffer = []
  27. loop do
  28. break if edge_buffer.size === 0
  29. current_group_buffer = []
  30. e = edge_buffer[0]
  31. current_group_buffer << e
  32. edge_buffer.delete(e)
  33. last_vertex = e.end.position
  34.  
  35. loop do
  36. e = FindConnectingEdge(last_vertex, edge_buffer)
  37. if e != 0
  38. current_group_buffer << e
  39. edge_buffer.delete(e)
  40. if last_vertex === e.start.position
  41. last_vertex = e.end.position
  42. else
  43. last_vertex = e.start.position
  44. end
  45. else
  46. group_buffer << current_group_buffer
  47. break
  48. end
  49. end
  50. end
  51. return group_buffer
  52. end
  53.  
  54. #---------------------------------------------------------------------------------
  55. # select all edges from selection
  56. def self.SelectEdges(buffer)
  57. select_buffer = []
  58. buffer.each do |e|
  59. if e.is_a? Sketchup::Edge
  60. select_buffer << e
  61. end
  62. end
  63. return select_buffer
  64. end
  65.  
  66. #---------------------------------------------------------------------------------
  67. # meassure lengths of all edgegroups in edge_buffer[][] and return them in length_buffer[]
  68. def self.CreateLengthBuffer(group_buffer)
  69. length_buffer = []
  70. group_buffer.each do |g|
  71. len = 0
  72. g.each do |e|
  73. p1 = e.start.position
  74. p2 = e.end.position
  75. d = p1.distance(p2)
  76. len = len + d
  77. end
  78. length_buffer << len
  79. end
  80. return length_buffer
  81. end
  82.  
  83. #---------------------------------------------------------------------------------
  84. # returns array of vertices for the new lines
  85. def self.IntercutEdgeAtIndex(e,grat_breite)
  86. returnbuffer = []
  87.  
  88. p1 = e.start.position
  89. p2 = e.end.position
  90.  
  91. d = p1.distance(p2)
  92. b = d-grat_breite
  93.  
  94. if d > grat_breite
  95. scale1 = (b / 2) / d
  96. scale2 = scale1 + (grat_breite / d)
  97.  
  98. p3 = Geom::Point3d.linear_combination(scale1, p2, 1 - scale1, p1)
  99. p4 = Geom::Point3d.linear_combination(1-scale2, p1, scale2, p2)
  100.  
  101. returnbuffer << p1 << p3 << p4 << p2
  102. else
  103. returnbuffer << p1 << p2
  104. end
  105. return returnbuffer
  106. end
  107.  
  108. #---------------------------------------------------------------------------------
  109. def self.select_longest_edge(edge_group)
  110. l_index = 0
  111. l_val = 0
  112. edge_group.each_with_index do |e,index|
  113. p1 = e.start.position
  114. p2 = e.end.position
  115. d = p1.distance(p2)
  116. if d > l_val
  117. l_val = d
  118. l_index = index
  119. end
  120. end
  121. return l_index
  122. end
  123.  
  124. #---------------------------------------------------------------------------------
  125. # returns returnbuffer[][] with first parameter being the deleted edges and second
  126. # parameter the new vertices!
  127. def self.CreateVerticsBufferWithGrates(group_buffer, length_buffer, mm_per_grat, grat_breite)
  128. returnbuffer = Array.new(2) { Array.new(0) }
  129. length_buffer.each_with_index do |val, index|
  130. #puts "#{val} => #{index}"
  131.  
  132. if val <= mm_per_grat
  133. # if the group is shorter than the minimal length only do one grat
  134. edge_index = select_longest_edge(group_buffer[index])
  135. new_vetices = IntercutEdgeAtIndex(group_buffer[index][edge_index],grat_breite)
  136. returnbuffer[0] << group_buffer[index][edge_index]
  137. new_vetices.each do |v|
  138. returnbuffer[1] << v
  139. end
  140. else
  141. # do multiple equidistante grats
  142. num_grats = val / mm_per_grat.round
  143. avg_dist = val / num_grats
  144.  
  145. current_dist = avg_dist / 2
  146.  
  147. group_buffer[index].each do |e|
  148. p1 = e.start.position
  149. p2 = e.end.position
  150. d = p1.distance(p2)
  151. current_dist = current_dist + d
  152.  
  153. if current_dist > avg_dist and d > grat_breite
  154. new_vetices = IntercutEdgeAtIndex(e,grat_breite)
  155. returnbuffer[0] << e
  156. new_vetices.each do |v|
  157. returnbuffer[1] << v
  158. end
  159. current_dist = current_dist - avg_dist
  160. end
  161.  
  162. end
  163.  
  164. end
  165. end
  166. return returnbuffer
  167. end
  168.  
  169. #---------------------------------------------------------------------------------
  170. def self.ReplaceOldEdgesWithNewEdges(delete_buffer, new_buffer)
  171. mod = Sketchup.active_model # Open model
  172. ent = mod.entities # All entities in model
  173. # delete old edges
  174. delete_buffer.each do |e|
  175. e.erase!
  176. end
  177.  
  178. # add the new edges
  179. e1 = 0
  180. sw = 0
  181. new_buffer.each do |e|
  182. if sw === 0
  183. e1 = e
  184. sw = 1
  185. else
  186. ent.add_line(e1,e)
  187. sw = 0
  188. end
  189. end
  190. end
  191.  
  192. #---------------------------------------------------------------------------------
  193. def self.MakeGrats(sel,mm_per_grat,grat_breite)
  194. edge_buffer = SelectEdges(sel)
  195.  
  196. group_buffer = SortConnectedEdgesIntoGroups(edge_buffer)
  197. #puts group_buffer.inspect
  198.  
  199. length_buffer = CreateLengthBuffer(group_buffer)
  200. #puts length_buffer.inspect
  201.  
  202. buffer = CreateVerticsBufferWithGrates(group_buffer,length_buffer,mm_per_grat,grat_breite)
  203.  
  204. ReplaceOldEdgesWithNewEdges(buffer[0],buffer[1])
  205.  
  206. puts "ENDE"
  207. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement