下面是一段代码(对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!“真的有吗?
我将顶点数组“放入”到我的控制台,并将其视为输出。
#<Sketchup::Vertex:0x00000180a0788440>
#<Sketchup::Vertex:0x00000180a0788418>
#<Sketchup::Vertex:0x00000180a07883c8>
#<Sketchup::Vertex:0x00000180a07883a0>
#<Sketchup::Vertex:0x00000180a0788440>
#<Sketchup::Vertex:0x00000180a0788418>
#<Sketchup::Vertex:0x00000180a07883c8>那么,我到底是在说什么呢?
谢谢!
发布于 2022-03-14 10:31:45
它所做的与您在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://stackoverflow.com/questions/71465913
复制相似问题