#coding=utf-8
import rhinoscriptsyntax as rs
import Rhino.Geometry as rg
def extend_lines_to_columns():
print("开始运行脚本...")
# 定义要处理的图层名称
beam_layer = "Make2D::Visible::Curves::02 STR. SOLID MAMBER::1*.1.BEAM MAIN (UNIONED)"
column_layers = [
"03 STR. DRAFT MEMBER::COLUMN BELOW",
"03 STR. DRAFT MEMBER::COLUMN (BELOW AND ABOVE)"
]
# 检查范围(毫米)
search_distance = 1000
# 获取指定图层中的所有线条
beam_objects = rs.ObjectsByLayer(beam_layer)
print("在图层 {} 中找到 {} 个线条".format(beam_layer, len(beam_objects) if beam_objects else 0))
if not beam_objects:
print("未找到线条")
return
# 获取所有柱子对象
column_objects = []
for layer in column_layers:
columns = rs.ObjectsByLayer(layer)
if columns:
for col in columns:
if rs.IsCurveClosed(col):
column_objects.append(col)
print("在图层 {} 中找到 {} 个封闭曲线".format(layer, len(column_objects)))
if not column_objects:
print("未找到封闭曲线")
return
modified_count = 0
# 处理每条线
for beam in beam_objects:
if not rs.IsLine(beam):
continue
# 获取线的端点
start_point = rs.CurveStartPoint(beam)
end_point = rs.CurveEndPoint(beam)
if not start_point or not end_point:
continue
# 计算方向向量
vector = rs.VectorCreate(end_point, start_point)
vector = rs.VectorUnitize(vector)
# 创建检查用的线段(在原始端点的位置延伸)
start_search_point = rs.PointAdd(start_point, rs.VectorScale(vector, -search_distance))
end_search_point = rs.PointAdd(end_point, rs.VectorScale(vector, search_distance))
# 创建搜索线段
start_search_line = rs.AddLine(start_point, start_search_point)
end_search_line = rs.AddLine(end_point, end_search_point)
need_update = False
new_start = start_point
new_end = end_point
# 检查每个柱子
for column in column_objects:
# 检查起点方向
intersections = rs.CurveCurveIntersection(start_search_line, column)
if intersections:
new_start = intersections[0][1]
need_update = True
# 检查终点方向
intersections = rs.CurveCurveIntersection(end_search_line, column)
if intersections:
new_end = intersections[0][1]
need_update = True
# 删除搜索线
rs.DeleteObject(start_search_line)
rs.DeleteObject(end_search_line)
# 如果需要更新,创建新的线段
if need_update:
rs.DeleteObject(beam)
new_beam = rs.AddLine(new_start, new_end)
# 保持原始属性
if new_beam:
rs.ObjectLayer(new_beam, beam_layer)
modified_count += 1
print("处理完成,修改了 {} 个线条".format(modified_count))
rs.Redraw()
# 运行函数
if __name__ == "__main__":
extend_lines_to_columns()
1. 整体流程图