Revit 2023 Python API创建三角形楼板报错求助
问题分析与解决方案
核心问题排查
你的代码存在几个关键问题导致ArgumentException:
1. 坐标单位不统一
Revit API中XYZ的单位是英尺,但你直接使用了厘米单位的c=0.0作为点的Z坐标,导致曲线环的平面与创建的Level(已转换为英尺)不在同一高度,Revit判定边界无效。
2. 曲线构造冗余调用
Line.CreateBound()返回的已经是Revit原生Line对象,无需额外调用.ToRevitType(),这个多余的调用可能破坏曲线的有效性。
3. 曲线环列表构造错误
Floor.Create()要求传入的是包含CurveLoop的集合,你直接用List[CurveLoop](curveloop)构造列表,会错误地尝试枚举CurveLoop的内部曲线来初始化列表,而非将整个CurveLoop作为元素放入列表。
修正后的代码
#! python3 #---------------------------------------------------------------------------------------------- # IMPORT LIBRARIES import clr clr.AddReference('RevitAPI') clr.AddReference('RevitAPIUI') from Autodesk.Revit.DB import Transaction, TaskDialog, XYZ, Line, CurveLoop, Level, Floor, FloorType, FilteredElementCollector from System.Collections.Generic import List # 单位转换:厘米转英尺 def centimeters_to_feet(centimeters): return centimeters * 0.0328084 doc = __revit__.ActiveUIDocument.Document # 坐标参数(厘米) a_cm = 0.0 b_cm = 10.0 elevation_cm = 0.0 # 转换为Revit内部单位(英尺) a_ft = centimeters_to_feet(a_cm) b_ft = centimeters_to_feet(b_cm) elevation_ft = centimeters_to_feet(elevation_cm) # 创建Level new_level = None trans_level = Transaction(doc, '创建新标高') trans_level.Start() try: new_level = Level.Create(doc, elevation_ft) new_level.Name = f"elBS_BuildingStorey_{elevation_cm:.0f}cm" trans_level.Commit() except Exception as e: trans_level.RollBack() TaskDialog.Show('错误', f"创建标高失败:{str(e)}") if new_level: TaskDialog.Show('成功', f"标高已创建,海拔:{elevation_cm}厘米") # 创建楼板边界曲线 point0 = XYZ(a_ft, a_ft, elevation_ft) point1 = XYZ(b_ft, a_ft, elevation_ft) point2 = XYZ(b_ft, b_ft, elevation_ft) # 直接创建Line,无需ToRevitType line01 = Line.CreateBound(point0, point1) line12 = Line.CreateBound(point1, point2) line20 = Line.CreateBound(point2, point0) curveloop = CurveLoop() curveloop.Append(line01) curveloop.Append(line12) curveloop.Append(line20) # 验证曲线环状态 print("曲线数量:", curveloop.NumberOfCurves()) print("是否开放:", curveloop.IsOpen()) print("是否共面:", curveloop.HasPlane()) # 获取楼板类型(取第一个可用类型) floor_types = list(FilteredElementCollector(doc).OfClass(FloorType)) if not floor_types: TaskDialog.Show('错误', "未找到可用楼板类型") sys.exit() floor_type_id = floor_types[0].Id # 创建楼板 trans_floor = Transaction(doc, "创建三角形楼板") trans_floor.Start() try: # 正确构造CurveLoop列表:将curveloop添加到List中 curve_loop_list = List[CurveLoop]() curve_loop_list.Add(curveloop) new_floor = Floor.Create(doc, curve_loop_list, floor_type_id, new_level.Id) trans_floor.Commit() TaskDialog.Show('成功', "三角形楼板已创建") except Exception as e: trans_floor.RollBack() TaskDialog.Show('错误', f"创建楼板失败:{str(e)}")
额外验证建议
- 确认曲线环的逆时针方向:可以通过
CurveLoop.GetSignedArea()验证,返回正值即为逆时针(符合Revit要求)。 - 检查楼板类型是否适用于创建楼板:部分楼板类型(如结构楼板、建筑楼板)可能有不同的创建要求,确保选择的类型支持边界创建。
内容的提问来源于stack exchange,提问作者Angelo Massafra
相关产品推荐
相关产品推荐

