写在前面
为了更好地介绍这个代理框架,以降低使用同学的操作门槛。
由于这个框架是原来笔者的科研过程中流式代码转换过来的,且在完整的框架开发时由于对Plaxis机理和机制理解有限,因此难免存在疏漏和错误,还请各位同学及时提出,辅助修正。当前笔者的相关工作也已经从之前的流式代码切换到当前框架,优化的频率较高,因此代码库更新的速度较快,同学们使用这个框架时,应当首先运行以下命令检查当前的代码库是否有更新,然后再运行业务代码。
1 2 3 4 5
| pip install plaxisproxy_excavation -U
pip install pandas openpyxl scipy
|
下面将详细解析Examples/testmapper.ipynb和Examples/testmapper.py这两个文件的具体结构和功能。
testmapper.ipynb结构解析
什么是 .ipynb 文件?
简单理解:
.ipynb 是 Jupyter Notebook 的工作文件;
- 里面可以同时包含:
- 可以运行的代码(通常是 Python)
- 文字说明(Markdown)
- 图表、公式、输出结果等
你可以把它看成一个“可以运行的文档”:
一边写说明,一边写代码,一边看到运行结果,非常适合教学、实验和记录笔记。
下面给初学者简单介绍一下如何运行这类文件。
方案 A:用 Anaconda(傻瓜式、体积大、但省心)
- 前往 Anaconda 官网下载:
https://www.anaconda.com/download
- 选择对应系统(Windows / macOS),一路下一步安装;
- 安装完成后,系统会多出一个叫 Anaconda Prompt 的终端。
方案 B:已有 Python,用 pip 安装 Jupyter
如果你已经装了 Python,可以直接在命令行输入:
1 2 3 4 5
| pip install jupyter
pip install jupyterlab
|
终端打开方式:
- Windows:Win + R → 输入 cmd → 回车
- macOS:打开 Terminal(终端)
而后使用终端用cd命令,进入你的ipynb所在的文件目录,运行jupyter notebook即可。
运行效果如下:

Notebook在浏览器中的效果如图所示:

什么是testmapper.ipynb
testmapper.ipynb是一个全面的测试文件,系统地验证了Plaxis代理框架中各个核心组件的功能。文件按照模块化结构组织,从基础材料到复杂结构,再到完整的工程流程,层层递进地展示了框架的能力。由于testmapper.ipynb是在本框架的源码上测试得到的,因此在引入相关代码模块时存在src等文件目录字样,同时import时直接对具体代码文件中的对象或函数进行引用,与当前直接通过pip安装得到的模块包引用的方式存在一定的区别,这里仅对当前的测试文件进行介绍,实际本框架内各个模块怎么导入和使用建议阅读源码和第二部分的真实示例介绍。
代码中主要包括两类实例,一类是Material、Structure等之类的直接表示具体的材料、结构或施工阶段相关的对象实例,这类实例直接用来储存对象的基本信息;另一类是Mapper之类的映射器实例,该实例将对象实例中的内容发送到Plaxis软件实现在软件内的自动控制。
基于Notebook中的映射测试源代码,我将详细介绍每一部分的测试内容和实现原理:
1. 材料映射测试
土体材料测试
1 2 3 4 5 6 7 8 9
| mc = MCMaterial("MC", SoilMaterialsType.MC, "", 22, 5e3, 0.3, 25, 0.4) soil_mat_mc = SoilMaterialMapper.create_material(g_i, mc)
mcc = MCCMaterial("MCC", SoilMaterialsType.MCC, "", 22, 5e3, 0.3, 25, 0.4) soil_mat_mcc = SoilMaterialMapper.create_material(g_i, mcc)
hss = HSSMaterial("HSS", SoilMaterialsType.HSS, "", 22, 5e3, 0.3, 25, 0.4) soil_mat_hss = SoilMaterialMapper.create_material(g_i, hss)
|
代码作用:创建三种不同本构模型的土体材料,包括基本的Mohr-Coulomb模型、修正剑桥模型和考虑小应变硬化的HSS模型,测试土体材料映射器的基本功能。
映射原理:
- 创建三种不同本构模型的土体材料对象
- 通过
SoilMaterialMapper.create_material()将领域对象映射到Plaxis材料
- 每个材料对象会自动获得
plx_id属性,存储Plaxis句柄
板材料测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| ep = ElasticPlate( name="Slab_EL_ISO", type=PlateType.Elastic, comment="isotropic elastic plate", gamma=24.0, E=30e6, d=1.0, nu=0.2, preventpunch=True, isotropic=True ) plx_plate_1 = PlateMaterialMapper.create_material(g_i, ep)
ep_aniso = ElasticPlate( name="Slab_EL_ANISO", type=PlateType.Elastic, comment="orthotropic elastic plate", gamma=24.0, E=30e6, nu=0.2, d=1.0, preventpunch=True, isotropic=False, E2=20e6, G12=12e6, G13=10e6, G23=9e6 ) plx_plate_2 = PlateMaterialMapper.create_material(g_i, ep_aniso)
|
代码作用:测试板材料的创建,包括各向同性和各向异性弹性板,验证材料参数的正确传递和各向异性参数的处理能力。
映射特点:
- 支持各向同性和各向异性材料定义
- 自动处理材料参数的完整性和有效性
- 通过
PlateMaterialMapper统一接口创建
梁材料测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| beam_el_cyl = ElasticBeam( name="Beam_EL_Cylinder", type=BeamType.Elastic, comment="Elastic beam - solid circular section", gamma=25.0, E=30e6, nu=0.20, cross_section=CrossSectionType.PreDefine, predefined_section=PreDefineSection.Cylinder, diameter=0.60 ) plx_beam_el_cyl = BeamMaterialMapper.create_material(g_i, beam_el_cyl)
beam_ep_custom = ElastoplasticBeam( name="Beam_EP_Custom", type=BeamType.Elastoplastic, comment="Elasto-plastic beam - custom section with yield", gamma=24.0, E=31e6, nu=0.20, cross_section=CrossSectionType.Custom, predefined_section=None, A=0.42, Iy=0.018, Iz=0.014, W=0.028, sigma_y=300e3, yield_dir=2 ) plx_beam_ep_custom = BeamMaterialMapper.create_material(g_i, beam_ep_custom)
|
代码作用:测试梁材料的各种截面类型,包括预定义截面(圆形、矩形、管状)和自定义截面,验证弹性梁和弹塑性梁的材料映射。
截面类型支持:
- 预定义截面:圆形、矩形、管状等
- 自定义截面:直接定义A、Iy、Iz等参数
- 自动计算截面特性
2. 几何映射测试
点线面创建
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| def make_rectangle(z: float = 0.0, width: float = 10.0, height: float = 6.0, x0: float = 0.0, y0: float = 0.0): """返回闭合矩形:Point 列表、PointSet、Line3D、Polygon3D(外环)""" pts: List[Point] = [ Point(x0, y0, z), Point(x0 + width, y0, z), Point(x0 + width, y0 + height, z), Point(x0, y0 + height, z), Point(x0, y0, z) ] ps = PointSet(pts) line = Line3D(ps) poly = Polygon3D.from_points(ps) return pts, ps, line, poly
pts, ps, line, poly = make_rectangle(z=0.0, width=12.0, height=5.0, x0=2.0, y0=3.0) handles = GeometryMapper.create_points(g_i, ps)
line_created = GeometryMapper.create_line(g_i, line, name="DemoRectEdge")
surf_id = GeometryMapper.create_surface(g_i, poly, name="DemoRectSurface")
|
代码作用:测试几何对象的创建流程,从基础的点开始,逐步构建线、面,验证几何映射器的层次化创建能力和几何依赖关系处理。
几何映射流程:
- 创建领域几何对象(Point→PointSet→Line3D→Polygon3D)
- 通过
GeometryMapper批量创建Plaxis几何
- 自动设置
plx_id建立双向映射
删除验证
1 2 3 4 5 6 7 8 9 10
|
ok_surf = GeometryMapper.delete_surface(g_i, poly) assert ok_surf, "Surface deletion failed" assert_plx_id_cleared(poly, "Polygon3D")
ok_line = GeometryMapper.delete_line(g_i, line) if ok_line: assert_plx_id_cleared(line, "Line3D")
|
代码作用:测试几何对象的删除功能,验证映射器能够正确清理Plaxis资源和本地引用,确保资源管理的完整性。
生命周期管理:
- 创建时自动设置
plx_id
- 删除时自动清理
plx_id
- 支持断言验证映射状态
3. 结构映射测试
结构创建
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| line_beam = make_line(pA_ref, pB_ref) line_pile = make_line(pA_ref, pB_ref) line_anchor = make_line(pA_ref, pB_ref)
beam1 = Beam(name="B1", line=line_beam, beam_type=beam_mat) pile1 = EmbeddedPile(name="P1", line=line_pile, pile_type=pile_mat) anchor1 = Anchor(name="A1", line=line_anchor, anchor_type=anchor_mat)
BeamMapper.create(g_i, beam1) EmbeddedPileMapper.create(g_i, pile1) AnchorMapper.create(g_i, anchor1)
|
代码作用:测试各种结构类型(梁、桩、锚杆等)的创建,验证结构映射器能够正确处理几何依赖关系和材料关联。
结构映射特点:
- 每个结构使用独立的几何实例,避免句柄冲突
- Mapper自动处理几何依赖关系
- 支持复杂的结构类型组合
4. 钻孔映射测试
钻孔数据构建
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| def build_borehole_set(fill_mat, sand_mat, clay_mat, gravel_mat): sl_fill = SoilLayer(name="Fill", material=fill_mat) sl_sand = SoilLayer(name="Sand", material=sand_mat) bh1_layers = [ BoreholeLayer(name="Fill@BH1", top_z=0.0, bottom_z=-1.5, soil_layer=sl_fill), BoreholeLayer(name="Sand@BH1", top_z=-1.5, bottom_z=-8.0, soil_layer=sl_sand), ] bh1 = Borehole(name="BH_1", location=Point(0, 0, 0), ground_level=0.0, layers=bh1_layers, water_head=-2.0) return BoreholeSet(name="Site BH", boreholes=[bh1, ...], comment="Full demo set")
summary = BoreholeSetMapper.create(g_i, bhset, normalize=True)
|
代码作用:测试复杂钻孔数据的创建和导入,包括多层土体剖面、不同钻孔间的土层变化,验证钻孔映射器的土层归一化能力。
钻孔映射特性:
- 支持多层土体剖面定义
- 自动处理土层归一化(补全缺失层)
- 生成土层分布汇总信息
5. 荷载映射测试
静态荷载创建
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| pl_static = PointLoad( name="PL_static", comment="static point load", point=P3, Fx=0.0, Fy=0.0, Fz=-100.0, Mx=0.0, My=0.0, Mz=0.0 ) LoadMapper.create(g_i, pl_static)
ll_static_linear = LineLoad( name="LL_static_linear", comment="static linear line load", line=L13, distribution=DistributionType.LINEAR, qx=0.0, qy=0.0, qz=-5.0, qx_end=0.0, qy_end=0.0, qz_end=-12.0 ) LoadMapper.create(g_i, ll_static_linear)
|
代码作用:测试各种静态荷载类型的创建,包括点荷载、线荷载(均匀分布和线性分布)、面荷载,验证荷载映射器的几何关联和分布模式处理能力。
动态荷载与乘子
1 2 3 4 5 6 7 8 9 10 11 12 13
| mul_h_5Hz = LoadMultiplier( name="Mul_H_5Hz", comment="harmonic 5 Hz", signal_type=SignalType.HARMONIC, amplitude=1.0, phase=0.0, frequency=5.0 ) LoadMultiplierMapper.create(g_i, mul_h_5Hz)
pl_dyn = pl_static.create_dyn( name="PL_dyn", comment="dynamic point (from PL_static)", multiplier={LoadMultiplierKey.Fz: mul_h_5Hz} ) LoadMapper.create(g_i, pl_dyn)
|
代码作用:测试动态荷载系统的创建,包括荷载乘子的定义和动态荷载的生成,验证荷载映射器对静态-动态荷载关联关系的处理。
荷载映射机制:
- 静态荷载直接创建Plaxis荷载对象
- 动态荷载通过乘子附加到静态荷载基座上
- 支持谐波、表格等多种荷载类型
6. 阶段映射测试
阶段定义与继承
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| st_init = PlasticStageSettings( load_type=LoadType.StageConstruction, max_steps=100, time_interval=0.5, over_relaxation_factor=1.05, ΣM_weight=1.0 )
phase0 = Phase( name="Phase0_InitialSupports", comment="Activate base supports the anchor depends on.", settings=st_init, activate=[wall1, waler, plate1, pile1], deactivate=[], inherits=initial_phase )
h = PhaseMapper.create(g_i, ph)
|
代码作用:测试施工阶段的创建和管理,包括阶段设置、结构激活/冻结、阶段继承关系,验证阶段映射器对复杂施工序列的处理能力。
阶段映射特点:
- 强制阶段继承关系,确保计算连续性
- 支持结构激活/冻结状态管理
- 可配置土体材料行为覆盖
7. 完整建模流程测试
基坑模型组装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| def assemble_pit(runner=None) -> FoundationPit: proj = ProjectInformation( title="Rectangular Pit – DWall + Braces + Wells", company="Demo", model="3D", element="10-noded", length_unit=Units.Length.M, force_unit=Units.Force.KN ) pit = FoundationPit(project_information=proj) fill = SoilMaterialFactory.create(SoilMaterialsType.MC, name="Fill", ...) pit.add_material("soil_materials", fill) pit.borehole_set = build_borehole_set(...) walls = [RetainingWall(name=..., surface=..., plate_type=...)] for w in walls: pit.add_structure(StructureType.RETAINING_WALLS.value, w) wells_unique, stats = layout_wells_with_limit(...) for w in wells_unique: pit.add_structure(StructureType.WELLS.value, w) for p in (ph0, ph1, ph2, ph3): pit.add_phase(p) return pit
|
代码作用:测试完整的基坑工程建模流程,集成所有组件(材料、几何、结构、荷载、阶段),验证框架在复杂工程场景下的综合应用能力。
构建器执行
1 2 3 4 5 6 7 8 9
| runner = PlaxisRunner(HOST, PORT, PASSWORD) pit = assemble_pit(runner=runner) builder = ExcavationBuilder(runner, pit)
print("[BUILD] start …") builder.build() print("[BUILD] done.")
builder.calculate()
|
代码作用:测试构建器的执行流程,从模型定义到实际构建和计算,验证整个框架的端到端功能完整性。
完整流程映射:
- 通过
FoundationPit容器组织所有工程组件
ExcavationBuilder负责执行映射构建
- 支持从模型定义到计算的全自动化流程
测试小结
通过深入分析testmapper.ipynb中的映射测试源代码,我们可以看到这个测试文件实际上构建了一个完整的Plaxis代理框架验证体系。它不仅测试了各个独立组件的功能,更重要的是验证了组件之间的协同工作和整个建模流程的完整性。
测试文件从最基础的材料映射开始,逐步构建起复杂的工程模型。在材料测试部分,我们看到框架支持从简单的弹性材料到复杂的各向异性材料和弹塑性材料。每种材料类型都有对应的映射器负责将领域对象转换为Plaxis内部表示,这个过程不仅仅是简单的参数传递,还包含了类型检查、参数验证和默认值处理等复杂逻辑。特别值得注意的是,材料映射器会自动为每个创建的对象分配plx_id,这个标识符成为连接领域模型和Plaxis实体的桥梁,为后续的引用和管理奠定了基础。
几何映射测试展现了框架在处理空间关系方面的能力。从简单的点开始,到线、面的构建,测试代码演示了一个完整的几何创建链条。这里体现了一个重要的设计理念:几何对象之间存在严格的依赖关系,框架必须确保这种关系在映射过程中得到保持。删除测试则验证了资源管理的正确性,确保在对象生命周期结束时能够正确释放Plaxis资源,避免内存泄漏和句柄混乱。这种严格的生命周期管理对于长期运行的岩土工程分析至关重要。
结构映射测试将材料和几何结合起来,创建出具有工程意义的实体。测试中特别强调了每个结构使用独立几何实例的重要性,这避免了在复杂模型中可能出现的句柄冲突问题。结构映射器不仅要处理自身的创建逻辑,还要协调材料引用和几何依赖,这种多层级的关联管理体现了框架设计的复杂性。
钻孔数据测试展示了框架处理地质信息的能力。在实际工程中,钻孔数据往往存在土层缺失、厚度变化等不一致情况,测试中的归一化功能正是为了解决这一问题。通过自动补全缺失土层和调整层序,框架确保了地质模型的一致性,这为后续的稳定性分析提供了可靠的基础。
荷载系统测试涵盖了从静态到动态的完整荷载类型。特别值得注意的是动态荷载的实现方式:它不是创建新的荷载实体,而是在静态荷载的基础上附加乘子。这种设计既符合Plaxis的内部机制,又提供了清晰的荷载管理逻辑。测试中的荷载防护机制确保同一几何体上不会创建多个静态荷载,这避免了荷载叠加导致的数值计算问题。
阶段映射测试验证了施工序列的管理能力。岩土工程的核心就是模拟施工过程,阶段管理系统必须确保每个阶段的继承关系和状态转换的正确性。测试中展示的阶段继承机制、结构激活/冻结功能以及土体行为覆盖能力,构成了一个完整的施工过程模拟框架。
最终的完整建模流程测试将所有这些组件整合在一起,构建了一个真实的基坑工程模型。从工程信息配置到材料定义,从钻孔数据导入到结构系统布置,从降水井设计到施工阶段划分,测试代码演示了一个端到端的工程建模过程。这种集成测试不仅验证了各个组件的功能,更重要的是检验了组件之间的协同工作和数据流传递。