谁能解释一下vertices.flatten!在 SketchUp Ruby 给我?
Could someone explain vertices.flatten! in SketchUp Ruby to me?
下面是一段代码(来自 Rafael Rivera),它在 SketchUp 模型的顶点绘制点。
def pointplot
model = Sketchup.active_model
entities = model.active_entities
selection = model.selection
edges = selection.grep(Sketchup::Edge)
if edges.empty?
msg = 'Select one or more edges before using this tool.'
UI.messagebox(msg)
return
end
vertices = []
edges.each { |edge| vertices << edge.vertices }
vertices.flatten!
vertices.uniq!
vertices.each { |vertex| entities.add_cpoint vertex.position }
end
def check_line
sel = Sketchup.active_model.selection
ok = sel.find { |e| e.typename == "Edge" }
ok ? MF_ENABLED : MF_GRAYED
end
UI.add_context_menu_handler do |menu|
menu.add_separator
item = menu.add_item("Point Plot") { pointplot }
menu.set_validation_proc(item) {check_line}
end
有人可以向我解释一下这行代码,它实际上做了什么,以及为什么它是代码工作所必需的。
vertices.flatten!
我知道什么是“.flatten!”正常情况下做的。我从 rubyapi.org
中完全理解这个例子
a = [ 0, [ 1, [2, 3], 4 ], 5 ]
a.flatten!(1) # => [0, 1, [2, 3], 4, 5]
a = [ 0, [ 1, [2, 3], 4 ], 5 ]
a.flatten!(2) # => [0, 1, 2, 3, 4, 5]
a = [ 0, [ 1, [2, 3], 4 ], 5 ]
a.flatten!(3) # => [0, 1, 2, 3, 4, 5]
[0, 1, 2].flatten!(1) # => nil
但在 SketchUp 的世界里,“.flatten!”是什么意思?实际上呢?
我 'put' 将顶点数组发送到我的控制台,我将其视为输出。
#<Sketchup::Vertex:0x00000180a0788440>
#<Sketchup::Vertex:0x00000180a0788418>
#<Sketchup::Vertex:0x00000180a07883c8>
#<Sketchup::Vertex:0x00000180a07883a0>
#<Sketchup::Vertex:0x00000180a0788440>
#<Sketchup::Vertex:0x00000180a0788418>
#<Sketchup::Vertex:0x00000180a07883c8>
那么我 'flattening' 到底是什么?
谢谢!
它与您在 flatten
中观察到的行为完全相同,唯一的区别是它更改了调用它的对象,而不是返回更改后的对象。
让我们看看这三行:
vertices = []
edges.each { |edge| vertices << edge.vertices }
vertices.flatten!
首先,创建了一个空数组。然后通过遍历所有边,将边的顶点(很可能存储在数组中)添加到数组中。这意味着在这一行之后你有一个嵌套的顶点数组,看起来像这样 (pseudo-code):
[[vertice_1, vertice_2], [vertice_3, vertice_4], [vertice_1, vertice_4]]
vertices.flatten!
然后会将 vertices
展平为:
[vertice_1, vertice_2, vertice_3, vertice_4, vertice_1, vertice_4]
下面是一段代码(来自 Rafael Rivera),它在 SketchUp 模型的顶点绘制点。
def pointplot
model = Sketchup.active_model
entities = model.active_entities
selection = model.selection
edges = selection.grep(Sketchup::Edge)
if edges.empty?
msg = 'Select one or more edges before using this tool.'
UI.messagebox(msg)
return
end
vertices = []
edges.each { |edge| vertices << edge.vertices }
vertices.flatten!
vertices.uniq!
vertices.each { |vertex| entities.add_cpoint vertex.position }
end
def check_line
sel = Sketchup.active_model.selection
ok = sel.find { |e| e.typename == "Edge" }
ok ? MF_ENABLED : MF_GRAYED
end
UI.add_context_menu_handler do |menu|
menu.add_separator
item = menu.add_item("Point Plot") { pointplot }
menu.set_validation_proc(item) {check_line}
end
有人可以向我解释一下这行代码,它实际上做了什么,以及为什么它是代码工作所必需的。
vertices.flatten!
我知道什么是“.flatten!”正常情况下做的。我从 rubyapi.org
中完全理解这个例子a = [ 0, [ 1, [2, 3], 4 ], 5 ]
a.flatten!(1) # => [0, 1, [2, 3], 4, 5]
a = [ 0, [ 1, [2, 3], 4 ], 5 ]
a.flatten!(2) # => [0, 1, 2, 3, 4, 5]
a = [ 0, [ 1, [2, 3], 4 ], 5 ]
a.flatten!(3) # => [0, 1, 2, 3, 4, 5]
[0, 1, 2].flatten!(1) # => nil
但在 SketchUp 的世界里,“.flatten!”是什么意思?实际上呢?
我 'put' 将顶点数组发送到我的控制台,我将其视为输出。
#<Sketchup::Vertex:0x00000180a0788440>
#<Sketchup::Vertex:0x00000180a0788418>
#<Sketchup::Vertex:0x00000180a07883c8>
#<Sketchup::Vertex:0x00000180a07883a0>
#<Sketchup::Vertex:0x00000180a0788440>
#<Sketchup::Vertex:0x00000180a0788418>
#<Sketchup::Vertex:0x00000180a07883c8>
那么我 'flattening' 到底是什么?
谢谢!
它与您在 flatten
中观察到的行为完全相同,唯一的区别是它更改了调用它的对象,而不是返回更改后的对象。
让我们看看这三行:
vertices = []
edges.each { |edge| vertices << edge.vertices }
vertices.flatten!
首先,创建了一个空数组。然后通过遍历所有边,将边的顶点(很可能存储在数组中)添加到数组中。这意味着在这一行之后你有一个嵌套的顶点数组,看起来像这样 (pseudo-code):
[[vertice_1, vertice_2], [vertice_3, vertice_4], [vertice_1, vertice_4]]
vertices.flatten!
然后会将 vertices
展平为:
[vertice_1, vertice_2, vertice_3, vertice_4, vertice_1, vertice_4]