文章目录
Rhino Layer Pattern Matching: Adding Wildcards
Current vs. Improved Pattern Matching
Current Code:
source_layers = [layer for layer in all_layers if pattern in layer]
This only finds exact matches within layer names.
Improved Code with Wildcard:
#coding=utf-8
import rhinoscriptsyntax as rs # 导入Rhino的Python脚本接口
def move_objects_between_layers(source_patterns, target_layers):
"""
在不同图层之间移动对象的函数
参数:
source_patterns: 源图层的匹配模式列表
target_layers: 目标图层名称列表
"""
results = {
} # 创建一个字典存储移动结果
all_layers = rs.LayerNames() # 获取所有图层名称
# 遍历源图层模式和目标图层
for pattern, target in zip(source_patterns, target_layers):
# 如果目标图层不存在,创建新图层
if not rs.IsLayer(target):
rs.AddLayer(target)
# 使用通配符匹配找到符合模式的图层
source_layers = [layer for layer in all_layers if f"*{
pattern}*" in layer]
moved_count = 0 # 记录移动对象的数量
# 遍历找到的源图层
for layer in source_layers:
# 获取图层中的所有对象
objects = rs.ObjectsByLayer(layer)
if objects:
# 将每个对象移动到目标图层
for obj in objects:
rs.ObjectLayer(obj, target)
moved_count += 1
# 记录处理结果
results[pattern] = {
"found_layers": source_layers, # 找到的源图层列表
"moved_count": moved_count, # 移动的对象数量
"target_layer": target # 目标图层名称
}
return results # 返回处理结果
Example Usage:
source_patterns = ["*1000x1000*", "*800x500*"] # With wildcards
target_layers = [
"BEAM LINE::MAIN::Rect 1000x1000",
"BEAM LINE::SECONDARY::Rect 800x500"
]
Why Add Wildcards?
- More flexible matching
- Catches vari