谁能解释一下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]