文章目录
一. 介绍
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 的直观建模工具,可以快速创建复杂的建筑结构和空间。
二. 下载代码
三. 开发环境配置
常见的配置方法有
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文件夹
-
check_geom.py 检查几何体封闭性(Check Sanity)和相交(Check Intersections)情况
-
choose_namelist_id.py 用于在自由文本中选择 MATL_ID 和 PROP_ID 的操作符。
-
clean_ma_slots.py 清理对象的材质槽,
材质槽(Material Slots)是Blender中一个对象的属性,它决定了该对象可以使用多少个材质。每个材质槽可以关联一个材质(Material),用来为对象的不同部分(如面、边、顶点)设置不同的外观。材质槽允许你为一个对象的不同面或区域指定不同的材质,
-
copy_params.py 用于在实体之间复制FDS参数值。
-
gis.py 地理位置相关,对象的地理位置啥的
-
load_bf_settings.py 加载默认BlenderFDS设置,删除当前数据!
-
mesh_tools.py 设置mesh 设置建议的单元格大小, 自定义了很多参数涉及的数据类型
-
run_external.py 加载默认命令,在终端中运行 FDS。估算 FDS 计算完成的预计时间。运行 Smokeview 显示 FDS 模拟结果。
-
scene_export.py 将blender导出为fds文件
-
scene_import.py 将fds导入当前/新场景
-
show_fds_code.py 对话框类用于提示, 显示代码类, 从选中对象/集合/材质/场景 导出代码
-
show_fds_geometry.py 这个没看懂
“Show FDS Geometry” 操作符将会展示当前对象的FDS几何体。
“Hide FDS Geometry” 操作符将会隐藏所有的临时FDS几何体。 -
show_ui.py
展示材料面板
SCENE_OT_bf_show_text: 在Blender的文本编辑器中显示文本 -
update_addon.py 更新插件相关
ui
- init.py 注册simplify_ui
- simplify.py 实现了一个简化版的Blender界面。用户可以通过插件首选项控制是否启用简化UI。
其他文件
- init.py 注册bl文件夹内所有内容
- handlers.py 加载blender后, 文件保存前, 依赖图更新后处理.
- menus.py 菜单中添加导入导出fds文件
- panels.py ,面板ui, 图下两块
- preferences.py 偏好设置中,对插件的设置界面,包括设置smv, fds运行的指令
- ui_lists.py 只是定义了一下右侧其他参数的那个像表格的ui
2.2 lang文件夹
除了一些公用属性和定义, 定义了每个命令的参数,导入,导出.
bf_scene
- bf_scene.py 扩展了 Blender Scene,为其添加了与 FDS(火灾动力学模拟器)相关的功能。
,添加了导入和导出 FDS 格式数据的功能,支持从 FDS 文件或字符串创建场景,或将场景数据转换为 FDS 格式。 - export_help.py 将 Blender 中的对象、集合、材质等数据转化为 FDS 所需的格式,支持完整导出和部分导出,并根据配置文件的设置处理输出顺序和内容。
- import_help.py 从 FDS 格式数据导入到 Blender 场景中,支持场景(Scene)、物体(Object)、材质(Material)等不同类型的 FDS namelists 导入。它根据 FDS 数据将相应的 Blender 元素创建或更新,并根据数据类型分别处理,支持管理和非管理 namelists 的导入,还包括了错误处理和进度显示。
ON_GEOM
- bingeom.py 读取和写入 FDS bingeom 文件的功能 没看懂
- geom_to_ob.py 将 FDS 数据中的几何体准确转换为 Blender 可用的 3D 对象,并确保其材质和几何属性正确映射。
- ob_to_geom.py 将Blender模型转换成FDS可以使用的格式
- ON_GEOM.py 从 FDS 参数列表中读取几何体相关的参数,并根据这些参数进行几何体的创建或转换。用于处理Blender对象的表面ID(SURF_ID)相关操作的类。它包括:
get_value: 获取物体的表面ID值。
set_value: 设置物体的表面ID,涉及材料槽的删除和重新赋值
ON_MESH
- align_meshes.py 对齐网格
- calc_meshes.py 于计算网格(Mesh)参数的函数,目的是为网格生成、细分和对齐等操作提供支持。
- split_mesh.py 这段代码实现了对网格(Mesh)的划分操作,主要包括根据给定的细分数(nsplits)对网格进行分割,并计算分割后的相关信息,如每个子网格的 ijk 尺寸、网格的边界框(xbs)、网格细胞大小(cs)、网格 ID(hids)等。
- ON_MESH.py 包含网格(MESH)相关参数和操作的系统,用于在 Blender 中处理计算流体动力学(CFD)模拟或其他物理仿真任务。具体地,它设置了不同的网格参数(如 IJK、nsplits、XB 等),并实现了这些参数的更新、显示和导出。
ON_MOVE
- t34.py 将FDS中的MOVE变换数据(包括平移、缩放、旋转等)转回Blender中使用的4x4矩阵格式,将Blender中的4x4矩阵转换为FDS中的T34格式(一个由9个元素组成的三行三列矩阵和一个3D平移向量)。
- ON_MOVE.py 用于处理几何变换(MOVE)。该类是一个Namlist(命名列表),它包含了多个几何变换参数,如平移、旋转、缩放等。
ON_MULT
MULT MultiplierParameters
用于生成多个网格的命令。它允许通过复制和位移现有网格来快速创建多个均匀排列的网格,而无需手动逐一定义每个网格。这对于大规模模拟尤其有用,例如在一个规则的几何区域中布置多个相同尺寸的网格。
- multiply.py 这段代码的核心是根据给定的多重变换规则,扩展生成多个新的 xb 坐标和 hid 标识符。
- ON_MULT.py 这个命令相关的一些操作,包括其ui界面
OP_PB
PB是指PBX PBY PBZ这种指定平面的数据,例如PBX=1 表示x=1的平面, blender与fds中的定义不同,要相互转换.
- ob_to_pbs,py 用于将Blender中的物体几何信息转换为FDS(火灾动力学模拟)中的PB(Planes)表示法的一个模块。
- pbs_to_ob.py 将FDS PB格式的平面数据(例如 (“PBX”, x3))导入到Blender物体(ob)中,生成一个新的网格。
- 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 个值定义。
- cakc_pixels.py Blender对象的像素化(Pixelization)算法,用于将Blender中的三维几何对象转换为一个二维的像素表示形式。
- calc_voxels.py 体素化, 将blender对象坐标转换为xb
- ob_to_xbs.py xbs_to_ob.py blender对象转换为符合fds格式的xb数据, 或者后者转换为前者.
- OP_XB.py 这段代码允许用户通过Blender界面设置对象的几何数据导出类型,可以选择边界框、体素、像素、面或边作为导出选项。在导出时,代码会将选择的几何数据转换为FDS支持的格式,用于火灾模拟。
OP_XYZ
XYZ: 节点的坐标。
- ob_to_xyzs.py xyzs_to_ob.py将Blender对象的几何数据转换为FDS(火灾动态模拟)使用的XYZ坐标数据格式。反之,后者转换为前者.
- 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:是否输出三维烟雾数据。
- sc_to_ge1.py 将Blender的几何数据导出为GE1文件格式,GE1是一种用于FDS(Fire Dynamics Simulator)模拟的几何文件格式。没看懂这个ge1
- 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 格式,然后保存为文件。
其他
- bf_collenction.py
get_layer_collection 方法的使用:
在 Blender 中,集合(Collection)被组织在多个 layer_collection 层中。通过 get_layer_collection 方法,能够定位与特定 Collection 对象相关联的层集合。
to_fds_list 方法用于将 Collection 对象及其包含的所有对象转换为 FDS 格式的数据。它会遍历集合中的所有对象,并将它们按字母顺序进行排序。 - bf_material.py
update_MP_namelist_cls_items 函数:
该函数更新了 MP_namelist_cls 中可选项的列表。MP_namelist_cls 是一个枚举类型,定义了与 FDS 中的 namelist 相关的材质类别。它会根据 BFNamelist 中的子类更新可选项。
函数会从 BFNamelist 子类中收集材质类型(如 SURF),并更新 MP_namelist_cls 的 items。
-
bf_object.py 关联到 FDS 数据模型并生成适当的 namelist。OP_is_tmp 和 OP_has_tmp 类分别管理对象是否为临时对象. OP_ID 类扩展了对象的标识符管理,在临时对象的情况下允许通过添加后缀来区分不同的对象实例。
-
MN_SURF.py
定义了一个 SURF(边界条件)名单类型,指定了与该名单相关的属性(如 ID、颜色、透明度等)以及导出控制逻辑。它通过继承 BFNamelistMa 类,并在其基础上扩展了导出和导入的行为。 -
ON_DEVC.py
ON_DEVC 类继承自 BFNamelistOb,并包含多个参数类,用于配置和控制设备(Device)的输出属性。 -
ON_HOLE.py
-
ON_INIT.py
-
ON_OBST.py
-
ON_other.py
-
ON_PROF.py
-
ON_SLCF.py
-
ON_VENT.py
-
ON_ZONE.py
-
OP_SURF_ID.py
-
SN_CATF.py
-
SN_config.py
-
SN_HEAD.py
-
SN_MISC.py
-
SN_MOVE.py
-
SN_MULT.py
-
SN_PERS.py
-
SN_RADI.py
-
SN_REAC.py
-
SN_TIME.py
2.3 types
- bf_exception.py
BFException 类具有灵活的异常信息生成机制,可以包含错误源和详细的描述,而 BFNotImported 类则专门用于处理与 FDS 导入相关的失败情况。 - bf_namelist.py
BFNamelist 类:
功能:这是一个抽象基类,表示 Blender 中与 FDS(火灾动态模拟器)Namelist 组的对应关系。它定义了如何管理 Blender 中的 FDS 参数,并通过各种方法与 FDS 配置进行交互。 - bf_param.py
BFParam:
这个类表示一个 Blender 参数,它对应于 FDS 的一个命令。
BFParamOther:
继承自 BFParam,用于处理自定义的 “其他” FDS 参数。 - fds_list.py
FDSNamelist
FDSList 的子类:表示FDS输入文件中的一个命名列表(Namelist),它是参数的集合。
构造函数 (init):初始化时需要指定一个 fds_label(命名列表的名称),还可以提供 f90_params(F90格式的参数)、msgs(注释信息)等参数。
2.4 utils
-
binpacking.py
简单的装箱算法。
该脚本实现了一个简单的第一适应装箱算法,其中物品被分配到固定数量的箱子中。每个物品都有一个重量,目标是将物品分配到箱子中,以最小化每个箱子的总重量。 -
geometry.py
对对象的操作: 获取,设置临时,移除, 变换, 获取边界框
对材质的操作: 创建, 获取 -
gis.py
地理坐标系统(WGS84)与UTM(Universal Transverse Mercator)坐标系统之间的转换。 -
io.py
这段代码包含了多个用于处理文件路径和文件输入输出的实用函数,主要用于Blender与FDS(火灾模拟)文件之间的转换和文件操作。 -
text.py
这段代码提供了一个用于文本管理的实用函数,append_word。该函数主要用于将一个单词追加到文本行的末尾,同时确保文本不会超过最大长度MAXLEN。如果当前行的长度不足以容纳新的单词,它将自动换行并添加必要的缩进。 -
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视图中适应所有对象。
- updater.py
用于管理Blender插件更新的工具。
2.5 其他文件
config.py
配置信息,包括精度,是否开启自动设置,输出格式缩进,github更新设置等
比较重要的:
FDS_COMMAND
SMV_COMMAND
TERM_COMMAND
指定了在不同操作系统(Linux、Mac、Windows)上执行FDS和SMV命令的方式。
init.py
bl_info插件信息
日志
注册,注销 bl和lang