You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 09:23:22