You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用Python(pyRevit)存储Revit插件设置?

用pyRevit实现Revit插件文件路径的持久化配置方案

刚好之前做过类似的需求,用pyRevit自带的设置存储功能就能完美解决,不用自己手动写配置文件,还能自动持久化到本地,重启Revit也不会丢失设置。给你一套完整的实现方案:

核心思路

pyRevit提供了script.get_settings()方法,可以获取当前插件的专属配置实例,这些配置会以JSON格式保存在用户本地的pyRevit设置目录中,天然支持持久化。我们只需要:

  • 首次使用时弹出文件选择框让用户指定路径
  • 将选中的路径保存到插件配置中
  • 后续启动时直接读取配置里的路径,若路径不存在则重新引导用户选择

完整代码实现

import os
from pyrevit import script, forms

def get_configured_file_path():
    # 获取当前插件的设置实例
    settings = script.get_settings()
    
    # 尝试读取已保存的文件路径
    saved_path = settings.get('target_text_file', None)
    
    # 检查路径是否有效:未保存过 或 路径不存在
    if not saved_path or not os.path.exists(saved_path):
        # 弹出文件选择对话框,限制txt格式
        saved_path = forms.pick_file(
            title="请选择需要读取的文本文件",
            file_ext="txt",
            multiple=False
        )
        
        if saved_path:
            # 将路径保存到设置中
            settings.set('target_text_file', saved_path)
            # 确保设置写入本地文件
            settings.save()
        else:
            # 用户取消选择,弹出提示并退出脚本
            forms.alert("未选择目标文件,插件将退出", exitscript=True)
    
    return saved_path

# 主逻辑
if __name__ == "__main__":
    file_path = get_configured_file_path()
    
    # 读取文件内容示例
    try:
        with open(file_path, 'r', encoding='utf-8') as f:
            file_content = f.read()
            forms.alert(f"成功读取文件内容:\n{file_content[:100]}...", title="读取成功")
            # 这里替换成你的业务逻辑
    except Exception as e:
        forms.alert(f"读取文件失败:{str(e)}", title="错误")

关键细节说明

  1. 设置的存储位置:配置会自动存在%APPDATA%\pyRevit\Settings目录下,每个插件对应一个独立的JSON文件,不会和其他插件的配置冲突。
  2. 路径有效性检查:每次启动都会检查保存的路径是否存在,避免因为文件被移动或删除导致插件崩溃。
  3. 用户体验优化:只有在必要时才弹出选择框,正常情况下直接读取配置,减少用户操作。

扩展功能建议

如果需要让用户随时修改路径,可以在插件里加一个“修改文件路径”的按钮分支,比如:

# 新增修改路径的逻辑
if forms.alert("是否需要修改文件路径?", yes=True, no=True):
    new_path = forms.pick_file(title="请选择新的文本文件", file_ext="txt")
    if new_path:
        settings.set('target_text_file', new_path)
        settings.save()
        forms.alert("路径已更新", title="成功")

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

火山引擎 最新活动