下面是一段代碼(歸功于 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!” 正常情況下會這樣。我從 ruby??api.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!”是什么意思?實際上呢?
我將頂點陣列“放入”我的控制臺,并將其視為輸出。
#<Sketchup::Vertex:0x00000180a0788440>
#<Sketchup::Vertex:0x00000180a0788418>
#<Sketchup::Vertex:0x00000180a07883c8>
#<Sketchup::Vertex:0x00000180a07883a0>
#<Sketchup::Vertex:0x00000180a0788440>
#<Sketchup::Vertex:0x00000180a0788418>
#<Sketchup::Vertex:0x00000180a07883c8>
那么我到底在“扁平化”什么呢?
謝謝!
uj5u.com熱心網友回復:
它與您已經觀察到的行為完全相同,flatten唯一的區別是它更改了呼叫它的物件而不是回傳更改的物件。
讓我們看看這三行:
vertices = []
edges.each { |edge| vertices << edge.vertices }
vertices.flatten!
首先,創建了一個空陣列。然后通過遍歷所有邊,將邊的頂點(很可能存盤在陣列中)添加到陣列中。這意味著在這一行之后,您有一個嵌套的頂點陣列,如下所示(偽代碼):
[[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]
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/445017.html
