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

Rhino脚本曲线偏移代码嵌套while循环出现无限循环问题

解决Rhino脚本的偏移循环异常与无限循环问题

嘿,咱们一步步拆解并解决你的问题~先看看原代码里导致异常和无限循环的核心问题:

  • 输入类型不匹配:input()返回的是字符串,你直接拿来和数值i做比较、做加法,会彻底打乱逻辑(比如字符串和数字的大小比较不符合预期,i += a会变成字符串拼接),这大概率是无限循环的元凶。
  • 初始偏移无意义:第一次循环时i=0,rs.OffsetCurve偏移距离为0,这不仅没效果,还可能触发Rhino的内部异常。
  • 循环逻辑模糊:原有的交替加a和b的逻辑,改成列表后没做好边界判断,很容易陷入死循环。

下面是优化后的代码,改用偏移量列表来控制所有偏移操作,同时修复上述所有问题:

import rhinoscriptsyntax as rs

# 选择目标曲线
obj = rs.GetObject("Select a curve", rs.filter.curve)
if not rs.IsCurve(obj):
    rs.MessageBox("You didn't select a valid curve!")
    exit()

# 获取并转换输入为数值类型,同时做异常校验
try:
    max_offset = float(input("Enter maximum total offset: "))
    first_offset = float(input("Enter first offset distance: "))
    next_offset = float(input("Enter subsequent offset distance: "))
except ValueError:
    rs.MessageBox("Please enter valid numbers!")
    exit()

# 按规则生成符合要求的偏移量列表(避免循环边界出错)
offset_list = []
current_offset = first_offset
while current_offset <= max_offset:
    offset_list.append(current_offset)
    current_offset += next_offset

# 执行所有偏移操作(优化基准点,避免原点不在曲线平面的问题)
base_point = rs.CurveAreaCentroid(obj)[0]
for offset in offset_list:
    # 负数表示向内/向下偏移,可根据需求调整正负
    rs.OffsetCurve(obj, base_point, -offset)

关键优化说明:

  1. 输入校验与类型转换:用try-except捕获无效输入,确保所有偏移相关的变量都是数值类型,从根源避免逻辑混乱。
  2. 预先生成偏移列表:先把所有符合要求的偏移量计算好存入列表,再遍历执行偏移,彻底杜绝无限循环的可能。
  3. 优化偏移基准点:改用曲线的质心作为偏移基准,代替固定的[0,0,0],避免曲线不在XY平面时偏移出错。
  4. 移除无效操作:直接从第一个有效偏移量开始处理,跳过偏移距离为0的无意义操作。

如果你想直接自定义偏移量(比如手动输入多个不同的偏移值),可以用这个版本:

# 自定义偏移列表版本
import rhinoscriptsyntax as rs

obj = rs.GetObject("Select a curve", rs.filter.curve)
if not rs.IsCurve(obj):
    rs.MessageBox("Invalid curve selected!")
    exit()

# 让用户输入多个偏移值,用逗号分隔
offset_input = input("Enter offset distances separated by commas (e.g., 1,2,3,4): ")
try:
    offset_list = [float(val.strip()) for val in offset_input.split(",")]
except ValueError:
    rs.MessageBox("Please enter valid numbers separated by commas!")
    exit()

# 执行偏移
base_point = rs.CurveAreaCentroid(obj)[0]
for offset in offset_list:
    rs.OffsetCurve(obj, base_point, -offset)

这样你就能完全自主控制需要的偏移量,再也不用担心循环问题啦~

内容的提问来源于stack exchange,提问作者user9711016

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:07:34