Dynamo中Python创建CurveLoop遇不连续错误,求线条方向调整方法
解决Dynamo中Python创建CurveLoop的不连续错误
当用给定线条列表创建CurveLoop时出现ArgumentException: This curve will make the loop discontinuous,核心原因是线条首尾未连续衔接——当前线条的起点必须与前一条线条的终点重合,不匹配时需反转当前线条方向。
以下是修正后的完整代码:
import clr import sys import System import math # 导入Revit API clr.AddReference('RevitAPI') import Autodesk from Autodesk.Revit.DB import * import Autodesk.Revit.DB as DB # 导入.NET库 from System import Array from System.Collections.Generic import List, IList, Dictionary clr.AddReference('RevitNodes') import Revit clr.ImportExtensions(Revit.Elements) clr.ImportExtensions(Revit.GeometryConversion) clr.ImportExtensions(Revit.GeometryReferences) # 导入Dynamo专属的事务和文档管理类 clr.AddReference('RevitServices') import RevitServices from RevitServices.Persistence import DocumentManager from RevitServices.Transactions import TransactionManager doc = DocumentManager.Instance.CurrentDBDocument Lines = [] line1 = Line.CreateBound(XYZ(5,0,5), XYZ(5,0,0)) Lines.append(line1) line2 = Line.CreateBound(XYZ(-5,0,0), XYZ(5,0,0)) Lines.append(line2) line3 = Line.CreateBound(XYZ(-5,0,0), XYZ(-5,0,5)) Lines.append(line3) curves = CurveLoop() prev_end_point = None for idx, line in enumerate(Lines): # 处理第一条线,直接添加并记录终点 if idx == 0: curves.Append(line) prev_end_point = line.GetEndPoint(1) continue # 获取当前线的起点和终点 curr_start = line.GetEndPoint(0) curr_end = line.GetEndPoint(1) # 用Revit API的IsAlmostEqualTo判断点是否重合(避免直接用==的精度问题) if curr_start.IsAlmostEqualTo(prev_end_point): curves.Append(line) prev_end_point = curr_end else: # 反转线条方向后添加 reversed_line = line.CreateReversed() curves.Append(reversed_line) prev_end_point = reversed_line.GetEndPoint(1) OUT = curves
关键逻辑说明
- 用
enumerate遍历线条,通过索引区分第一条线(无需前置检查) - 调用
GetEndPoint(0)/GetEndPoint(1)获取线条的起点、终点 - 用
IsAlmostEqualTo判断两个点是否重合(Revit中不建议直接用==比较XYZ点,会有精度误差) - 方向不匹配时,调用
CreateReversed()生成反转后的线条,再添加到CurveLoop - 每次添加后更新
prev_end_point为当前线条的终点,供下一条线做衔接检查
内容的提问来源于stack exchange,提问作者Redouane TEBBOUNE
相关产品推荐
相关产品推荐

