स्केचअप रूबी एपीआई - सभी परतों को हटाते समय ArgumentError - रूबी, स्केचअप

मैंने .dwg फ़ाइल से आयातित सभी परतों को हटाने के लिए एक स्क्रिप्ट बनाई:

# 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 परतें नहीं बची हैं। मुझे इस तरह एक त्रुटि मिली:

Error: #<ArgumentError: layer doesn"t belong to this model>

तो कैसे मेरी परत की जांच करने के लिए पहले से ही हटा नहीं है? मैं शोध समाधान की कोशिश की, लेकिन कोई भी काम किया लगता है

  • layer.deleted? वापस नहीं true
  • layers.at layer.name वापस नहीं nil
  • begin;rescue;end पाश के आसपास दुर्घटना Sketchup

उत्तर:

उत्तर № 1 के लिए 1

आप उस संग्रह को देख रहे हैं जिसे आप तत्वों से हटा रहे हैं। जो कि कभी भी सुरक्षित चीज नहीं है।

परतों को एक सरणी में पुनरावृत्त करें जो एक पुनरावृति है।

यहाँ एक उदाहरण है:

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

जवाब के लिए 0 № 2

मैंने के साथ एक समाधान स्थापित किया Sketchup.active_model.layers[l.name].nil? पहले से ही हटाए गए परतों के साथ रोकना यहाँ मेरे समाधान का नमूना

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
}

संबंधित सवाल
सबसे लोकप्रिय