blenderFds代码解读

一. 介绍

1. FDS(Fire Dynamics Simulator)

FDS 是一种火灾动力学模拟软件,主要用于模拟建筑物、隧道和其他空间中的火灾行为。由美国国家标准与技术研究院(NIST)开发,它采用计算流体力学(CFD)方法来模拟火灾的烟气扩散、温度分布、流体运动等现象。FDS 适用于火灾科学研究、建筑物防火设计、火灾安全分析等领域。

特点:

使用大涡模拟(LES)方法,精确模拟火焰、烟气流动和热量传递。
支持复杂的几何结构,可以模拟多种材料的燃烧行为。
与烟气可视化工具 Smokeview 集成,可以生成火灾的三维可视化效果。

2. BlenderFDS

BlenderFDS 是一个为 Blender 开发的插件,专门用于辅助 FDS 模型的创建和编辑。由于 FDS 本身没有友好的图形界面,建模复杂的几何结构比较困难。BlenderFDS 利用 Blender 的 3D 建模能力,让用户在 Blender 中创建和编辑 FDS 模型,然后将模型导出为 FDS 能够读取的文件格式。

特点:

提供简单的界面,将 Blender 的几何模型转换为 FDS 兼容的模型。
支持 FDS 中常用的火灾模拟属性设置,比如材料属性、热释放速率(HRR)、烟气排放等。
通过 Blender 的直观建模工具,可以快速创建复杂的建筑结构和空间。

二. 下载代码

blenderfds的github链接

三. 开发环境配置

常见的配置方法有
1.conda创建虚拟环境,blender改掉原本调用的python为虚拟环境
2.pycharm中使用blender的python, 还需要安装一些框架
3.将插件安装,然后pycharm打开插件所在位置,即可动态更改.

这里采用最简单的方式3,安装blenderfds插件后,可以打开下列路径,记得修改用户名.
C:\Users\用户名\AppData\Roaming\Blender Foundation\Blender\4.2\scripts\addons\blenderfds

这个方式暂时没有发现弊病, 其他方法后续再尝试. (后续:别的方法安装麻烦,但使用更好

四. 代码解读

1. blender python特有语法

c语言中定义变量和使用的方法是:

int my_int = 5;    // 整数变量,默认值为5
float my_float = 3.14;   // 浮点变量,默认值为3.14

void function() {
    // 使用这些变量
    printf("Integer Value: %d\n", my_int);
    printf("Float Value: %.2f\n", my_float);
}

除了常规的python定义变量的方法, blender中,还有一种定义变量的方法

import bpy

# 定义一个操作符类
class OBJECT_OT_custom_operator(bpy.types.Operator):
    bl_idname = "object.custom_operator"
    bl_label = "Custom Operator"
    
    # 定义自定义变量(属性)
    my_int: bpy.props.IntProperty(
        name="Integer Property",     # 属性名称
        description="An integer property",  # 描述
        default=5,                    # 默认值
        min=1,                        # 最小值
        max=100                       # 最大值
    )

    my_float: bpy.props.FloatProperty(
        name="Float Property",       # 属性名称
        description="A floating point property",  # 描述
        default=3.14                 # 默认值
    )
    
    def execute(self, context):
        # 使用自定义变量
        print(f"Integer Value: {self.my_int}")    # 输出整数值
        print(f"Float Value: {self.my_float}")    # 输出浮点值
        
        # 在Blender中,调整对象的位置(类比C语言中的操作)
        obj = context.active_object  # 获取当前活动对象
        obj.location.x += self.my_float  # 用浮点值来调整对象的位置
        
        return {'FINISHED'}  # 操作完成,返回

如何赋值这种变量呢,
赋值方法1: 通过ui界面
Blender中的 bpy.props.FloatProperty 属性通常是在操作符的UI面板中呈现的,用户可以通过界面交互来设置其值。

在你定义的操作符类中,my_float 作为属性,Blender会自动为其生成一个控件(通常是一个滑块或者文本框),并允许用户修改它。你只需要确保在 draw 方法中显示这个属性控件。

import bpy

class OBJECT_OT_custom_operator(bpy.types.Operator):
    bl_idname = "object.custom_operator"
    bl_label = "Custom Operator"
    
    # 定义自定义属性
    my_float: bpy.props.FloatProperty(
        name="Float Property",       # 属性名称
        description="A floating point property",  # 描述
        default=3.14                 # 默认值
    )

    def draw(self, context):
        layout = self.layout
        layout.prop(self, "my_float")  # 显示my_float控件,用户可以在UI中修改这个值

    def execute(self, context):
        print(f"Float Value: {self.my_float}")  # 输出my_float的当前值
        
        return {'FINISHED'}

执行操作符后,my_float 将显示在Blender的UI面板上(通常是一个浮动的面板)。你可以通过面板中的滑动条或输入框来设置其值。
当用户点击"确认"按钮时,my_float 的新值会被传递到 execute 方法中,进行后续的操作。

赋值方法2: 直接赋值

import bpy

class OBJECT_OT_custom_operator(bpy.types.Operator):
    bl_idname = "object.custom_operator"
    bl_label = "Custom Operator"
    
    my_float: bpy.props.FloatProperty(
        name="Float Property", 
        description="A floating point property",  
        default=3.14  
    )
    
    def execute(self, context):
        # 直接给my_float赋值
        self.my_float = 5.67  # 将my_float的值设置为5.67

        print(f"New Float Value: {self.my_float}")  # 输出新值
        
        return {'FINISHED'}

2. 代码结构

在这里插入图片描述

2.1 变量名解释

这个是根据代码内容推测的,部分变量名中常出现的一些缩写

  • OT_bf : Operator_blenderfds

2.2 bl文件夹

operators文件夹
  1. check_geom.py 检查几何体封闭性(Check Sanity)和相交(Check Intersections)情况

  2. choose_namelist_id.py 用于在自由文本中选择 MATL_ID 和 PROP_ID 的操作符。

  3. clean_ma_slots.py 清理对象的材质槽,材质槽(Material Slots)是Blender中一个对象的属性,它决定了该对象可以使用多少个材质。每个材质槽可以关联一个材质(Material),用来为对象的不同部分(如面、边、顶点)设置不同的外观。材质槽允许你为一个对象的不同面或区域指定不同的材质,

  4. copy_params.py 用于在实体之间复制FDS参数值。

  5. gis.py 地理位置相关,对象的地理位置啥的

  6. load_bf_settings.py 加载默认BlenderFDS设置,删除当前数据!

  7. mesh_tools.py 设置mesh 设置建议的单元格大小, 自定义了很多参数涉及的数据类型

  8. run_external.py 加载默认命令,在终端中运行 FDS。估算 FDS 计算完成的预计时间。运行 Smokeview 显示 FDS 模拟结果。

  9. scene_export.py 将blender导出为fds文件

  10. scene_import.py 将fds导入当前/新场景

  11. show_fds_code.py 对话框类用于提示, 显示代码类, 从选中对象/集合/材质/场景 导出代码

  12. show_fds_geometry.py 这个没看懂
    “Show FDS Geometry” 操作符将会展示当前对象的FDS几何体。
    “Hide FDS Geometry” 操作符将会隐藏所有的临时FDS几何体。

  13. show_ui.py
    展示材料面板
    在这里插入图片描述
    SCENE_OT_bf_show_text: 在Blender的文本编辑器中显示文本

  14. update_addon.py 更新插件相关

ui
  1. init.py 注册simplify_ui
  2. simplify.py 实现了一个简化版的Blender界面。用户可以通过插件首选项控制是否启用简化UI。
其他文件
  1. init.py 注册bl文件夹内所有内容
  2. handlers.py 加载blender后, 文件保存前, 依赖图更新后处理.
  3. menus.py 菜单中添加导入导出fds文件
  4. panels.py ,面板ui, 图下两块
    在这里插入图片描述
  5. preferences.py 偏好设置中,对插件的设置界面,包括设置smv, fds运行的指令
  6. ui_lists.py 只是定义了一下右侧其他参数的那个像表格的ui

2.2 lang文件夹

除了一些公用属性和定义, 定义了每个命令的参数,导入,导出.

bf_scene
  1. bf_scene.py 扩展了 Blender Scene,为其添加了与 FDS(火灾动力学模拟器)相关的功能。
    ,添加了导入和导出 FDS 格式数据的功能,支持从 FDS 文件或字符串创建场景,或将场景数据转换为 FDS 格式。
  2. export_help.py 将 Blender 中的对象、集合、材质等数据转化为 FDS 所需的格式,支持完整导出和部分导出,并根据配置文件的设置处理输出顺序和内容。
  3. import_help.py 从 FDS 格式数据导入到 Blender 场景中,支持场景(Scene)、物体(Object)、材质(Material)等不同类型的 FDS namelists 导入。它根据 FDS 数据将相应的 Blender 元素创建或更新,并根据数据类型分别处理,支持管理和非管理 namelists 的导入,还包括了错误处理和进度显示。
ON_GEOM
  1. bingeom.py 读取和写入 FDS bingeom 文件的功能 没看懂
  2. geom_to_ob.py 将 FDS 数据中的几何体准确转换为 Blender 可用的 3D 对象,并确保其材质和几何属性正确映射。
  3. ob_to_geom.py 将Blender模型转换成FDS可以使用的格式
  4. ON_GEOM.py 从 FDS 参数列表中读取几何体相关的参数,并根据这些参数进行几何体的创建或转换。用于处理Blender对象的表面ID(SURF_ID)相关操作的类。它包括:
    get_value: 获取物体的表面ID值。
    set_value: 设置物体的表面ID,涉及材料槽的删除和重新赋值
ON_MESH
  1. align_meshes.py 对齐网格
  2. calc_meshes.py 于计算网格(Mesh)参数的函数,目的是为网格生成、细分和对齐等操作提供支持。
  3. split_mesh.py 这段代码实现了对网格(Mesh)的划分操作,主要包括根据给定的细分数(nsplits)对网格进行分割,并计算分割后的相关信息,如每个子网格的 ijk 尺寸、网格的边界框(xbs)、网格细胞大小(cs)、网格 ID(hids)等。
  4. ON_MESH.py 包含网格(MESH)相关参数和操作的系统,用于在 Blender 中处理计算流体动力学(CFD)模拟或其他物理仿真任务。具体地,它设置了不同的网格参数(如 IJK、nsplits、XB 等),并实现了这些参数的更新、显示和导出。
ON_MOVE
  1. t34.py 将FDS中的MOVE变换数据(包括平移、缩放、旋转等)转回Blender中使用的4x4矩阵格式,将Blender中的4x4矩阵转换为FDS中的T34格式(一个由9个元素组成的三行三列矩阵和一个3D平移向量)。
  2. ON_MOVE.py 用于处理几何变换(MOVE)。该类是一个Namlist(命名列表),它包含了多个几何变换参数,如平移、旋转、缩放等。
ON_MULT

MULT MultiplierParameters
用于生成多个网格的命令。它允许通过复制和位移现有网格来快速创建多个均匀排列的网格,而无需手动逐一定义每个网格。这对于大规模模拟尤其有用,例如在一个规则的几何区域中布置多个相同尺寸的网格。

  1. multiply.py 这段代码的核心是根据给定的多重变换规则,扩展生成多个新的 xb 坐标和 hid 标识符。
  2. ON_MULT.py 这个命令相关的一些操作,包括其ui界面
    在这里插入图片描述
OP_PB

PB是指PBX PBY PBZ这种指定平面的数据,例如PBX=1 表示x=1的平面, blender与fds中的定义不同,要相互转换.

  1. ob_to_pbs,py 用于将Blender中的物体几何信息转换为FDS(火灾动力学模拟)中的PB(Planes)表示法的一个模块。
  2. pbs_to_ob.py 将FDS PB格式的平面数据(例如 (“PBX”, x3))导入到Blender物体(ob)中,生成一个新的网格。
  3. OP_PB.py
    OP_PB 类
    功能:这是一个Blender操作类,主要用于处理PB格式的导出操作。它继承自 BFParam,并用于将Blender对象的几何数据导出为FDS的PB(Planes)格式。
    OP_PBX, OP_PBY, OP_PBZ 类
    功能:这些类分别用于导入FDS中的不同平面类型(PBX、PBY、PBZ)到Blender中,继承自 OP_PB,但只用于导入操作,不涉及导出。
OP_XB

xb是fds中的位置大小定义方式,XB: 定义网格的边界,网格是一个单一的直角平行六面体(长方体),遵循右手坐标系规则。网格的起点由六个实数(XB)中的第 1、3 和 5 个值定义,网格的对角点由第 2、4 和 6 个值定义。

  1. cakc_pixels.py Blender对象的像素化(Pixelization)算法,用于将Blender中的三维几何对象转换为一个二维的像素表示形式。
  2. calc_voxels.py 体素化, 将blender对象坐标转换为xb
  3. ob_to_xbs.py xbs_to_ob.py blender对象转换为符合fds格式的xb数据, 或者后者转换为前者.
  4. OP_XB.py 这段代码允许用户通过Blender界面设置对象的几何数据导出类型,可以选择边界框、体素、像素、面或边作为导出选项。在导出时,代码会将选择的几何数据转换为FDS支持的格式,用于火灾模拟。
OP_XYZ

XYZ: 节点的坐标。

  1. ob_to_xyzs.py xyzs_to_ob.py将Blender对象的几何数据转换为FDS(火灾动态模拟)使用的XYZ坐标数据格式。反之,后者转换为前者.
  2. OP_XYZ.py OP_XYZ这是一个Blender自定义操作(操作面板上的按钮/选项),用于导出Blender对象的XYZ点数据。to_fds_list 此方法将Blender对象的几何数据转换为FDS所需的格式. set_value
    此方法允许从FDS导出数据后将XYZ坐标应用回Blender对象:
SN_DUMP

DUMP命令用于控制FDS中不同类型数据的输出频率和方式,包括点设备、切片、粒子、等值面等数据的保存。通过配置参数,可以灵活指定输出的时间间隔和特定的输出时刻。
NFRAMES: 定义总输出帧数,默认值为1000。输出频率由(T_END - T_BEGIN)/ NFRAMES计算。
SMOKE3D:是否输出三维烟雾数据。

  1. sc_to_ge1.py 将Blender的几何数据导出为GE1文件格式,GE1是一种用于FDS(Fire Dynamics Simulator)模拟的几何文件格式。没看懂这个ge1
  2. SN_DUMP.py
    DUMP Namelist 类:SN_DUMP
    SN_DUMP 类代表了 FDS 中的 DUMP Namelist,它包含了与输出数据相关的各种参数,如:
    几何描述文件 (RENDER_FILE)
    状态文件 (STATUS_FILES)
    输出频率 (NFRAMES, DT_RESTART 等)
    bf_params 元组定义了所有可以添加到 DUMP Namelist 中的导出参数,它们在上述的类中已经定义。

scene_to_ge1 函数,将 Blender 场景的几何数据转换为 GE1 格式,然后保存为文件。

在这里插入图片描述

其他
  1. bf_collenction.py
    get_layer_collection 方法的使用:
    在 Blender 中,集合(Collection)被组织在多个 layer_collection 层中。通过 get_layer_collection 方法,能够定位与特定 Collection 对象相关联的层集合。
    to_fds_list 方法用于将 Collection 对象及其包含的所有对象转换为 FDS 格式的数据。它会遍历集合中的所有对象,并将它们按字母顺序进行排序。
  2. bf_material.py
    在这里插入图片描述
    update_MP_namelist_cls_items 函数:

该函数更新了 MP_namelist_cls 中可选项的列表。MP_namelist_cls 是一个枚举类型,定义了与 FDS 中的 namelist 相关的材质类别。它会根据 BFNamelist 中的子类更新可选项。
函数会从 BFNamelist 子类中收集材质类型(如 SURF),并更新 MP_namelist_cls 的 items。

  1. bf_object.py 关联到 FDS 数据模型并生成适当的 namelist。OP_is_tmp 和 OP_has_tmp 类分别管理对象是否为临时对象. OP_ID 类扩展了对象的标识符管理,在临时对象的情况下允许通过添加后缀来区分不同的对象实例。

  2. MN_SURF.py
    定义了一个 SURF(边界条件)名单类型,指定了与该名单相关的属性(如 ID、颜色、透明度等)以及导出控制逻辑。它通过继承 BFNamelistMa 类,并在其基础上扩展了导出和导入的行为。

  3. ON_DEVC.py
    ON_DEVC 类继承自 BFNamelistOb,并包含多个参数类,用于配置和控制设备(Device)的输出属性。

  4. ON_HOLE.py

  5. ON_INIT.py

  6. ON_OBST.py

  7. ON_other.py

  8. ON_PROF.py

  9. ON_SLCF.py

  10. ON_VENT.py

  11. ON_ZONE.py

  12. OP_SURF_ID.py

  13. SN_CATF.py

  14. SN_config.py

  15. SN_HEAD.py

  16. SN_MISC.py

  17. SN_MOVE.py

  18. SN_MULT.py

  19. SN_PERS.py

  20. SN_RADI.py

  21. SN_REAC.py

  22. SN_TIME.py

2.3 types

  1. bf_exception.py
    BFException 类具有灵活的异常信息生成机制,可以包含错误源和详细的描述,而 BFNotImported 类则专门用于处理与 FDS 导入相关的失败情况。
  2. bf_namelist.py
    BFNamelist 类:
    功能:这是一个抽象基类,表示 Blender 中与 FDS(火灾动态模拟器)Namelist 组的对应关系。它定义了如何管理 Blender 中的 FDS 参数,并通过各种方法与 FDS 配置进行交互。
  3. bf_param.py
    BFParam:
    这个类表示一个 Blender 参数,它对应于 FDS 的一个命令。
    BFParamOther:
    继承自 BFParam,用于处理自定义的 “其他” FDS 参数。
  4. fds_list.py
    FDSNamelist
    FDSList 的子类:表示FDS输入文件中的一个命名列表(Namelist),它是参数的集合。
    构造函数 (init):初始化时需要指定一个 fds_label(命名列表的名称),还可以提供 f90_params(F90格式的参数)、msgs(注释信息)等参数。

2.4 utils

  1. binpacking.py
    简单的装箱算法。
    该脚本实现了一个简单的第一适应装箱算法,其中物品被分配到固定数量的箱子中。每个物品都有一个重量,目标是将物品分配到箱子中,以最小化每个箱子的总重量。

  2. geometry.py
    对对象的操作: 获取,设置临时,移除, 变换, 获取边界框
    对材质的操作: 创建, 获取

  3. gis.py
    地理坐标系统(WGS84)与UTM(Universal Transverse Mercator)坐标系统之间的转换。

  4. io.py
    这段代码包含了多个用于处理文件路径和文件输入输出的实用函数,主要用于Blender与FDS(火灾模拟)文件之间的转换和文件操作。

  5. text.py
    这段代码提供了一个用于文本管理的实用函数,append_word。该函数主要用于将一个单词追加到文本行的末尾,同时确保文本不会超过最大长度MAXLEN。如果当前行的长度不足以容纳新的单词,它将自动换行并添加必要的缩进。

  6. ui.py

  • get_screen_area(context, area_type=“PROPERTIES”)
    该函数用于获取指定类型的Blender界面区域(如 “PROPERTIES” 面板)。如果该区域不存在,函数会尝试创建它。context: Blender的上下文对象,提供关于当前场景、对象等的相关信息。
    area_type: 要查找或创建的区域类型,默认为 “PROPERTIES”。

  • show_bl_text(context, bl_text=None, name=None)
    该函数将在Blender的文本编辑器中显示文本。context: Blender的上下文。
    bl_text: 要显示的文本对象。如果未给定,则创建一个新的文本对象。
    name: 可选的文本名称,如果没有提供,则使用默认名称。

  • write_bl_text(context, bl_text, header=None, texts=())
    该函数将文本写入Blender的文本编辑器。
    参数:
    context: Blender的上下文。
    bl_text: 要写入的文本对象。
    header: 可选的文本头部,添加到文本内容的前面。
    texts: 要添加的实际文本内容。

  • show_property_panel(context, space_context=“MATERIAL”)
    该函数用于显示或切换到Blender的属性面板(默认为材料面板)。

  • view_all(context)
    该函数执行视图操作 view3d.view_all,即在3D视图中适应所有对象。

  1. updater.py
    用于管理Blender插件更新的工具。

2.5 其他文件

config.py

配置信息,包括精度,是否开启自动设置,输出格式缩进,github更新设置等
比较重要的:

  1. FDS_COMMAND SMV_COMMAND TERM_COMMAND指定了在不同操作系统(Linux、Mac、Windows)上执行FDS和SMV命令的方式。
init.py

bl_info插件信息
日志
注册,注销 bl和lang

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值