首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除所有层时的SketchUp Ruby ArgumentError

删除所有层时的SketchUp Ruby ArgumentError
EN

Stack Overflow用户
提问于 2016-09-12 13:42:23
回答 2查看 127关注 0票数 0

我创建了一个脚本来删除从.dwg文件中导入的所有层:

代码语言:javascript
复制
# import the dwg file
show_summary = false
if Sketchup.active_model.import file_path, show_summary

    # delete all layer
    protected_layers = ['Layer0', '! 3D', '! AutoCad']
    10.times do
        Sketchup.active_model.definitions.purge_unused
        Sketchup.active_model.layers.purge_unused

        Sketchup.active_model.layers.each { |layer|
            layer_name = layer.name
            if not layer.deleted? and not protected_layers.include? layer_name  
                puts "\tdeleted"
                Sketchup.active_model.layers.remove layer
            end
        }
    end
end

当我导入一个大的dwg文件时,所有的层都不是立即导入的(大约100层).因此,我向所有层添加了一个10.times循环,并将其完全删除。我的脚本工作得很好,直到剩下10层。我遇到了这样一个错误:

代码语言:javascript
复制
Error: #<ArgumentError: layer doesn't belong to this model>

那么如何检查我的图层还没有被删除呢?我尝试了这些解决方案,但似乎没有人工作。

  • layer.deleted?不返回true
  • layers.at layer.name不返回nil
  • begin;rescue;end循环崩溃草图
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-13 15:27:07

您正在迭代要从其中删除元素的集合。这绝不是一件安全的事。

将这些层缓存到一个数组中,然后进行迭代。

下面是一个示例:

代码语言:javascript
复制
model = Sketchup.active_model
# Map layer names to layers - as object comparison is much faster than string
# comparisons.
protected_layers = ['Layer0', '! 3D', '! AutoCad'].map { |layer_name|
  model.layers[layer_name]
}
# Start an operation as this keeps the undo stack clean and makes the script
# fun faster.
model.start_operation('Remove Layers', true)
model.layers.to_a.each { |layer|
  next if layer.deleted? || protected_layers.include?(layer)
  model.layers.remove(layer)
}
model.commit_operation
票数 1
EN

Stack Overflow用户

发布于 2016-09-12 14:02:47

我创建了一个使用Sketchup.active_model.layers[l.name].nil? wich的解决方案,层已经被移除。这里是我的解决方案的样本

代码语言:javascript
复制
layers.take_while{|l| not l.deleted? and not layers[l.name].nil? }.each { |layer|
    puts layer.name
    unless protected_layers.include? layer.name  
        puts "\t[*] deleted"
        layers.remove layer
    else
        puts "\t[ ] undeleted"
    end
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39451769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档