PyCharm 中 FREECAD 二次开发:从基础建模到深度定制
一、引言
在当今的三维建模与设计领域,FREECAD 以其开源、参数化设计的强大特性,成为众多工程师、设计师和开发者的首选工具。然而,面对日益复杂和多样化的设计需求,仅仅依靠 FREECAD 的原生功能往往难以满足。此时,二次开发就显得尤为重要。PyCharm 作为一款功能强大的 Python 集成开发环境(IDE),为 FREECAD 的二次开发提供了便捷、高效的开发平台。通过 PyCharm,开发者可以利用 Python 语言结合 FREECAD 的 API,实现个性化的功能拓展,从而极大地提升工作效率和设计质量。
二、FREECAD 二次开发基础结构
2.1 核心模块概述
FREECAD 的二次开发主要围绕其 Python API 展开,其中Part
、Sketch
和Gui
等核心模块是开发的关键。Part
模块用于基础几何建模,提供了创建各种基本几何形状(如长方体、圆柱体、球体等)的功能;Sketch
模块则专注于草图绘制,为创建二维草图提供了丰富的工具;Gui
模块则用于用户界面定制,允许开发者创建自定义的菜单、工具栏和对话框等。
2.2 基础模型创建
在 PyCharm 中进行 FREECAD 二次开发,首先要完成 FREECAD 的 Python 环境配置。完成配置后,通过import FreeCAD
即可导入核心库,开启开发之旅。以下是创建基础模型的代码示例:
import FreeCAD# 新建文档
doc = FreeCAD.newDocument("BoxDocument")
# 添加长方体对象
box = doc.addObject("Part::Box", "MyBox")
# 设置尺寸
box.Length = 20
box.Width = 15
box.Height = 10
# 触发文档计算更新模型
doc.recompute()
运行上述代码后,FREECAD 会自动弹出窗口展示创建的长方体。若想为模型添加颜色和材质,可结合AppGui
模块实现:
import FreeCAD
import FreeCADGui# 新建文档与长方体
doc = FreeCAD.newDocument("ColoredBox")
box = doc.addObject("Part::Box", "ColoredBox")
box.Length = 20
box.Width = 15
box.Height = 10# 设置颜色(RGB值,范围0 - 1)
box.ViewObject.ShapeColor = (0.2, 0.6, 0.8)
# 应用材质(简单示例,实际可加载更多材质库)
box.ViewObject.DisplayMode = "Shaded"doc.recompute()
除了长方体,我们还可以创建其他基本几何形状,如圆柱体和球体:
import FreeCAD# 新建文档
doc = FreeCAD.newDocument("GeometryDocument")# 创建圆柱体
cylinder = doc.addObject("Part::Cylinder", "MyCylinder")
cylinder.Radius = 5
cylinder.Height = 15
# 创建球体
sphere = doc.addObject("Part::Sphere", "MySphere")
sphere.Radius = 8doc.recompute()
2.3 布尔运算
在 FREECAD 中,布尔运算可以用于组合和修改几何形状。以下是一个使用布尔运算创建复杂形状的示例:
import FreeCAD# 新建文档
doc = FreeCAD.newDocument("BooleanDocument")# 创建一个长方体
box = doc.addObject("Part::Box", "Box")
box.Length = 20
box.Width = 15
box.Height = 10# 创建一个圆柱体
cylinder = doc.addObject("Part::Cylinder", "Cylinder")
cylinder.Radius = 5
cylinder.Height = 15
cylinder.Placement.Base = FreeCAD.Vector(10, 7.5, 0)# 进行布尔差运算
cut = doc.addObject("Part::Cut", "Cut")
cut.Base = box
cut.Tool = cylinderdoc.recompute()
三、参数化设计与动态模型更新
3.1 参数化设计原理
参数化设计是 FREECAD 二次开发的核心优势之一。通过将模型的尺寸、位置等属性定义为参数,开发者可以方便地修改这些参数,从而实现模型的动态更新。这种设计方式使得模型的修改和调整更加灵活,大大提高了设计效率。
3.2 圆柱阵列的参数化设计
以创建可动态调整尺寸的圆柱阵列为例,先定义参数变量,再通过函数控制模型更新:
import FreeCAD# 新建文档
doc = FreeCAD.newDocument("ParametricArray")# 定义基础参数
radius = 5
height = 10
num_columns = 3
num_rows = 3
spacing_x = 15
spacing_y = 15# 定义创建单个圆柱的函数
def create_cylinder(doc, name, pos_x, pos_y):cylinder = doc.addObject("Part::Cylinder", name)cylinder.Radius = radiuscylinder.Height = heightcylinder.Placement.Base = FreeCAD.Vector(pos_x, pos_y, 0)return cylinder# 循环创建圆柱阵列
for row in range(num_rows):for col in range(num_columns):x = col * spacing_xy = row * spacing_ycylinder_name = f"Cylinder_{row}_{col}"create_cylinder(doc, cylinder_name, x, y)doc.recompute()# 定义更新函数,可动态修改阵列参数
def update_array(new_radius, new_height, new_num_columns, new_num_rows, new_spacing_x, new_spacing_y):global radius, height, num_columns, num_rows, spacing_x, spacing_yradius = new_radiusheight = new_heightnum_columns = new_num_columnsnum_rows = new_num_rowsspacing_x = new_spacing_xspacing_y = new_spacing_y# 删除原有圆柱for obj in doc.Objects:doc.removeObject(obj.Name)# 重新创建阵列for row in range(num_rows):for col in range(num_columns):x = col * spacing_xy = row * spacing_ycylinder_name = f"Cylinder_{row}_{col}"create_cylinder(doc, cylinder_name, x, y)doc.recompute()
调用update_array(8, 15, 4, 4, 20, 20)
,就能实时修改圆柱阵列的尺寸和数量。
3.3 更复杂的参数化设计示例:齿轮模型
以下是一个创建简单齿轮模型的参数化设计示例:
import FreeCAD
import math# 新建文档
doc = FreeCAD.newDocument("GearDocument")# 定义齿轮参数
module = 2
teeth = 20
pressure_angle = 20
pitch_diameter = module * teeth
base_diameter = pitch_diameter * math.cos(math.radians(pressure_angle))
outer_diameter = pitch_diameter + 2 * module# 创建齿轮草图
sketch = doc.addObject("Sketcher::SketchObject", "GearSketch")
sketch.Support = (doc.getObject("XY_Plane"), [""])
sketch.MapMode = "FlatFace"# 绘制齿轮齿形(简化示例)
for i in range(teeth):angle = 2 * math.pi * i / teethx1 = pitch_diameter / 2 * math.cos(angle)y1 = pitch_diameter / 2 * math.sin(angle)x2 = outer_diameter / 2 * math.cos(angle)y2 = outer_diameter / 2 * math.sin(angle)sketch.addGeometry(FreeCAD.Geom.LineSegment(FreeCAD.Vector(x1, y1, 0), FreeCAD.Vector(x2, y2, 0)))# 拉伸草图形成齿轮
gear = doc.addObject("PartDesign::Pad", "Gear")
gear.Profile = sketch
gear.Length = 10doc.recompute()
四、用户界面深度定制
4.1 自定义工具栏
借助Gui
模块,能在 FREECAD 中创建自定义菜单、工具栏和对话框。以下是创建自定义工具栏的示例:
import FreeCADGui
from PySide2 import QtGui, QtCore# 定义工具栏类
class MyToolbar:def __init__(self):self.toolbar = FreeCADGui.getMainWindow().addToolBar("MyToolbar")self.create_buttons()def create_buttons(self):# 按钮1:创建长方体create_box_icon = QtGui.QIcon(":/icons/box_icon.png") # 需提前准备图标文件create_box_btn = self.toolbar.addAction(create_box_icon, "Create Box")create_box_btn.triggered.connect(self.create_box_action)# 按钮2:更新圆柱阵列update_array_icon = QtGui.QIcon(":/icons/update_icon.png")update_array_btn = self.toolbar.addAction(update_array_icon, "Update Array")update_array_btn.triggered.connect(self.update_array_action)def create_box_action(self):doc = FreeCAD.newDocument("FromToolbarBox")box = doc.addObject("Part::Box", "ToolbarBox")box.Length = 10box.Width = 10box.Height = 10doc.recompute()def update_array_action(self):update_array(6, 12, 3, 3, 18, 18) # 调用前面定义的更新函数# 注册工具栏
my_toolbar = MyToolbar()
4.2 自定义对话框
若要创建复杂对话框,实现用户输入参数后动态生成模型,可使用PySide2
库:
from PySide2.QtWidgets import QDialog, QVBoxLayout, QLabel, QLineEdit, QPushButton
import FreeCADclass InputDialog(QDialog):def __init__(self):super().__init__()self.init_ui()def init_ui(self):layout = QVBoxLayout()# 输入框1:圆柱半径self.radius_label = QLabel("Cylinder Radius:")self.radius_input = QLineEdit()layout.addWidget(self.radius_label)layout.addWidget(self.radius_input)# 输入框2:圆柱高度self.height_label = QLabel("Cylinder Height:")self.height_input = QLineEdit()layout.addWidget(self.height_label)layout.addWidget(self.height_input)# 确定按钮self.ok_button = QPushButton("Create Cylinder")self.ok_button.clicked.connect(self.create_cylinder)layout.addWidget(self.ok_button)self.setLayout(layout)self.setWindowTitle("Input Parameters")def create_cylinder(self):try:radius = float(self.radius_input.text())height = float(self.height_input.text())doc = FreeCAD.newDocument("DialogCylinder")cylinder = doc.addObject("Part::Cylinder", "DialogCylinder")cylinder.Radius = radiuscylinder.Height = heightdoc.recompute()self.accept()except ValueError:print("Invalid input!")# 调用对话框
dialog = InputDialog()
if dialog.exec_():print("Cylinder created successfully!")
4.3 自定义菜单
除了工具栏和对话框,我们还可以创建自定义菜单:
import FreeCADGui
from PySide2 import QtGui# 创建自定义菜单
menu = FreeCADGui.getMainWindow().menuBar().addMenu("MyCustomMenu")# 创建菜单项1:创建球体
action1 = QtGui.QAction("Create Sphere", FreeCADGui.getMainWindow())
action1.triggered.connect(lambda: create_sphere())
menu.addAction(action1)# 创建菜单项2:保存文档
action2 = QtGui.QAction("Save Document", FreeCADGui.getMainWindow())
action2.triggered.connect(lambda: save_document())
menu.addAction(action2)def create_sphere():doc = FreeCAD.newDocument("SphereDocument")sphere = doc.addObject("Part::Sphere", "MySphere")sphere.Radius = 10doc.recompute()def save_document():doc = FreeCAD.ActiveDocumentif doc:doc.saveAs("saved_document.FCStd")
五、复杂模型与数据交互
5.1 从外部文件读取数据生成模型
在大型项目中,常需从外部文件读取数据生成模型。例如,从 CSV 文件读取点坐标生成三维点:
import FreeCAD
import csvdoc = FreeCAD.newDocument("PointsFromCSV")# 假设CSV文件格式为 x,y,z
with open('points.csv', 'r') as file:reader = csv.reader(file)next(reader) # 跳过表头for row in reader:x, y, z = map(float, row)point = doc.addObject("Part::Point", f"Point_{x}_{y}_{z}")point.Placement.Base = FreeCAD.Vector(x, y, z)doc.recompute()
5.2 将模型数据导出到其他格式
如需将 FREECAD 模型数据导出为其他格式(如 STL),可参考以下代码:
import FreeCAD
import Partdoc = FreeCAD.ActiveDocument
for obj in doc.Objects:if hasattr(obj, "Shape"):shape = obj.Shapestl_file_path = f"{obj.Name}.stl"Part.show(shape).exportStl(stl_file_path)
5.3 与数据库交互
我们还可以将 FREECAD 模型数据存储到数据库中,以下是一个使用 SQLite 数据库的示例:
import FreeCAD
import sqlite3# 连接到SQLite数据库
conn = sqlite3.connect('model_data.db')
c = conn.cursor()# 创建表
c.execute('''CREATE TABLE IF NOT EXISTS models(id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,type TEXT,radius REAL,height REAL)''')# 获取当前文档中的模型数据
doc = FreeCAD.ActiveDocument
for obj in doc.Objects:if hasattr(obj, "Radius") and hasattr(obj, "Height"):name = obj.Nametype_ = obj.TypeIdradius = obj.Radiusheight = obj.Heightc.execute("INSERT INTO models (name, type, radius, height) VALUES (?,?,?,?)", (name, type_, radius, height))# 提交更改并关闭连接
conn.commit()
conn.close()
六、调试与优化技巧
6.1 调试技巧
在 PyCharm 中调试 FREECAD 代码,断点和变量查看功能十分实用。例如,在更新模型的函数中设置断点:
def update_array(new_radius, new_height, new_num_columns, new_num_rows, new_spacing_x, new_spacing_y):global radius, height, num_columns, num_rows, spacing_x, spacing_yradius = new_radiusheight = new_heightnum_columns = new_num_columnsnum_rows = new_num_rowsspacing_x = new_spacing_xspacing_y = new_spacing_y# 在删除对象前设置断点,检查参数是否正确传递breakpoint()for obj in doc.Objects:doc.removeObject(obj.Name)# 重新创建阵列for row in range(num_rows):for col in range(num_columns):x = col * spacing_xy = row * spacing_ycylinder_name = f"Cylinder_{row}_{col}"create_cylinder(doc, cylinder_name, x, y)doc.recompute()
运行时 PyCharm 会在断点处暂停,便于查看变量状态。
6.2 优化技巧
为了提高代码的性能和效率,应避免在循环中频繁调用doc.recompute()
,可在完成多个修改操作后统一调用。另外,合理使用函数和类来封装代码,提高代码的可读性和可维护性。
七、结论
通过以上的介绍和丰富的代码示例,我们可以看到,使用 PyCharm 进行 FREECAD 二次开发具有强大的功能和广泛的应用前景。从基础的几何建模到复杂的参数化设计,从用户界面定制到数据交互,开发者可以根据自己的需求灵活运用各种技术和方法,实现个性化的功能拓展。在实际开发过程中,不断积累经验,掌握调试和优化技巧,能够进一步提高开发效率和代码质量。希望本文能够为广大 FREECAD 开发者提供有益的参考和帮助,让大家在三维建模的道路上走得更远。
相关文章:
PyCharm 中 FREECAD 二次开发:从基础建模到深度定制
一、引言 在当今的三维建模与设计领域,FREECAD 以其开源、参数化设计的强大特性,成为众多工程师、设计师和开发者的首选工具。然而,面对日益复杂和多样化的设计需求,仅仅依靠 FREECAD 的原生功能往往难以满足。此时,二…...
C++入侵检测与网络攻防之网络嗅探以及ARP攻击
目录 1.tcpdump基本使用 2.tcpdump条件过滤 3.wireshark介绍 4.wireshark的介绍 5.tcp握手挥手分析 6.telnet服务的介绍和部署 7.复习 8.telnet服务的报文嗅探 9.网络嗅探基础 10.arp协议的解析 11.arp攻击原理以及试验环境 12.arp实验以及防御方式 1.tcpdump基本使…...
Integer[]::new方法引用
Integer[]::new 这种写法是 Java 中方法引用的一种具体应用,它遵循 Java 方法引用的语法规则。 方法引用概述 方法引用是 Java 8 引入的一种简化 Lambda 表达式的语法糖,它允许你通过方法的名称直接引用已有的方法或构造函数。方法引用可以使代码更加简…...
Pycharm(三):梯度下降法
梯度下降算法(Gradient Descent Algorithm)是深度学习中常用的更新权重的方法,它采用的贪心法的思想,每次都往函数值下降最快的方向去更新,梯度方向是增长最快的方向,负梯度方向是下降最快的方向。 一、梯…...
系统测试的技术要求
文章目录 一、系统测试的概念二、测试对象三、测试目的四、进入条件五、内容要求1、基于需求的考核要求2、基于任务的考核要求 六、测试环境 一、系统测试的概念 系统测试(System Testing),主要是对多个软件组成的系统进行的整体测试。系统测…...
升级Ubuntu 20.04 LTS到22.04 LTS
按照 Ubuntu发布周期 每2年会发布一个 "长期支持版" (LTS, Long Term Support)。具体来说,就是每2年的4月份会发布一个支持周期长达5年的稳定版本,如: 20.04 和 22.04 分别代表 2020年4月 和 2022年4月 发布的长期支持版本. 当前(2022年9月)&a…...
【神经网络与深度学习】训练集与验证集的功能解析与差异探究
引言 在深度学习模型的训练过程中,训练集和验证集是两个关键组成部分,它们在模型性能的提升和评估中扮演着不可替代的角色。通过分析这两者的区别和作用,可以帮助我们深入理解模型的学习过程和泛化能力,同时为防止过拟合及优化超…...
单精度浮点运算/定点运算下 MATLAB (VS) VIVADO
VIVADO中单精度浮点数IP核计算结果与MATLAB单精度浮点数计算结果的对比 MATLAB定点运算仿真,对比VIVADO计算的结果 目录 前言 一、VIVADO与MATLAB单精度浮点数运算结果对比 二、MATLAB定点运算仿真 总结 前言 本文介绍了怎么在MATLAB中使用单精度浮点数进行运算…...
如何让 HTML 文件嵌入另一个 HTML 文件:详解与实践
目录 一、为什么需要在HTML中嵌入其他HTML文件? 二、常用的方法概览 三、利用 1. 基本原理 2. 使用场景 3. 优缺点 4. 实践示例 5. 适用建议 四、利用JavaScript动态加载内容 1. 原理简介 2. 实现步骤 示例代码 3. 优缺点分析 4. 应用场景 5. 实践建…...
7.10 GitHub Sentinel CLI开发实战:Python构建企业级监控工具的5大核心技巧
GitHub Sentinel CLI开发实战:Python构建企业级监控工具的5大核心技巧 GitHub Sentinel Agent 用户界面设计与实现:命令行工具开发实战 关键词:命令行工具开发、Python argparse、API 集成、错误处理、测试覆盖率 设计并实现基本的命令行工具 命令行界面(CLI)是企业级工…...
将AAB转APK的两种好用方法AAB to APK Converter
文章目录 第一种方法:Unity工具转换第二种方法:Python转换参数填写 第一种方法:Unity工具转换 适用人群: 策划,程序等装Unity的人 需要安装: Unity 下载AAB-to-APK-Converter 导入unity,点…...
netcore8.0项目部署到windows服务器中(或个人windows电脑),利用nginx反向代理
1、发布netcore项目,默认即可 1.1、前提,需在appsettings添加Kestrel代理 配置如下: {"Kestrel": {"Endpoints": {"http": {"Url": "http://localhost:7022"},"Https": {&qu…...
Python数据分析案例73——基于多种异常值监测算法探查内幕交易信息
背景 之前有监督模型案例都做烂了,现在来做一下无监督的模型吧,异常检测模型。 其实这个案例主要目的是为了展示这些异常值的无监督算法怎么使用的,本文是一个无监督算法的总结大全。只是恰巧有同学需要做这个内幕交易的数据,因…...
电商数据中台架构:淘宝 API 实时采集与多源数据融合技术拆解
引言 在当今竞争激烈的电商领域,数据已成为企业决策和业务发展的核心驱动力。电商数据中台能够整合和管理企业内外部的各种数据,为业务提供有力支持。其中,淘宝 API 实时采集与多源数据融合技术是数据中台架构中的关键部分。本文将深入探讨这…...
【C语言】动态经典试题练习
前言: 在上一章节讲解了动态的常见错误,在上上章节讲解了动态内存的概念。 古人云: 习题一 请大家看下面的习题,试着分析输出结果 / 找出代码错误的地方。 #include <stdio.h>void GetMemory(char* p) {p (char*)mall…...
Memcached 主主复制架构搭建与 Keepalived 高可用实现
实验目的 掌握基于 repcached 的 Memcached 主主复制配置 实现通过 Keepalived 的 VIP 高可用机制 验证数据双向同步及故障自动切换能力 实验环境 角色IP 地址主机名虚拟 IP (VIP)主节点10.1.1.78server-a10.1.1.80备节点10.1.1.79server-b10.1.1.80 操作系统: CentOS 7 软…...
详解 Servlet 处理表单数据
Servlet 处理表单数据 1. 什么是 Servlet?2. 表单数据如何发送到 Servlet?2.1 GET 方法2.2 POST 方法 3. Servlet 如何接收表单数据?3.1 获取单个参数:getParameter()示例: 3.2 获取多个参数:getParameterV…...
八大排序——冒泡排序/归并排序
八大排序——冒泡排序/归并排序 一、冒泡排序 1.1 冒泡排序 1.2 冒泡排序优化 二、归并排序 1.1 归并排序(递归) 1.2 递归排序(非递归) 一、冒泡排序 1.1 冒泡排序 比较相邻的元素。如果第一个比第二个大,就交换…...
高等数学第三章---微分中值定理与导数的应用(3.1微分中值定理3.2洛必达法则)
3.1 微分中值定理 一、罗尔(Rolle)中值定理 1. 费马(Fermat)引理 定义: 设函数 y f ( x ) y f(x) yf(x) 满足以下条件: 在点 x 0 x_0 x0 的某邻域 U ( x 0 ) U(x_0) U(x0) 内有定义࿱…...
AI超级智能体项目教程(二)---后端项目初始化(设计knif4j接口文档的使用)
文章目录 1.选择JDK的版本和相关配置2.添加依赖信息2.1指定lombok版本信息2.2引入hutool工具类2.3了解knif4j依赖2.4引入knif4j依赖 3.contrller测试3.1完成yml文件配置3.2修改默认扫描路径3.3controller具体的内容3.4配置接口和访问路径3.5如何访问3.6调试接口3.6调试接口 1.选…...
C++面试复习日记(8)2025.4.25,malloc,free和new,delete的区别
1,malloc,free和new,delete的区别 答:malloc和free是c语言中库函数; new和delete是c的操作符; 分配内存:malloc和new 区别: malloc:需要手动计算存储空间 new&#…...
14.ArkUI Radio的介绍和使用
ArkUI Radio 组件介绍与使用指南 什么是 Radio 组件? Radio(单选框)是 ArkUI 中的单选按钮组件,允许用户从一组互斥的选项中选择一个选项。它通常用于表单、设置界面等需要用户做出单一选择的场景。 Radio 的核心特性 单选功能…...
数据结构------C语言经典题目(7)
1.系统栈和数据结构中的栈有什么区别? 1.本质: 系统栈:由程序运行时由操作系统自动分配的一块连续内存区域,用于存储函数调用过程中的临时数据(参数、局部变量、返回地址),是程序运行的底层机制…...
Python教程(一)——Python速览
目录 1. 引言2. Python用作计算器2.1 数字2.2 文本2.3 列表 3. 走向编程的第一步参考 1. 引言 本系列的目的主要是重新回顾Python的语法,以供阅读由Python编写的源码。 在安装完Python后,在命令行中输入python就可以进入交互模式。下文代码段中以>…...
跟我学C++中级篇——处理对象的复制
一、对象的传递 在应用程序中,经常会遇到不同线程或不同模块间需要进行对象的传递,本来传递不是什么多大的事。但问题是,如果对象的值大到一定的程度后,传递不是问题可对象值的处理反而成了问题了。举一个现实世界的例子…...
基于PyQt5实现仿QQ-第二章-用户登录
基于PyQt5实现仿QQ-第二章-用户登录 Author: Daydreamer 项目简介 本项目基于PyQt5仿照目前流行的即时通信软件QQ,实现了新用户注册、用户登录、自动登录、记住多用户账号、用户搜索、添加好友、好友间聊天(消息持久化、同步化)等功能。 …...
[OS_8] 终端和 UNIX Shell | 会话和进程组 | sigaction | dash
我们已经知道如何用 “文件描述符” 相关的系统调用访问操作系统中的对象:open, read, write, lseek, close。操作系统也提供了 mount, pipe, mkfifo 这些系统调用能 “创建” 操作系统中的对象。 当然,我们也知道操作系统中的对象远不止于此࿰…...
IP查询专业版:支持IPv4/IPv6自动识别并切换解析的API接口使用指南
以下是根据您提供的网页内容编辑的符合CSDN内容发布要求的Markdown格式文本: 一、API概述 在开发过程中,我们常常需要对IP地址进行查询,以获取其详细信息,如地理位置、运营商等。万维易源的“IP查询专业版”API接口能够提供丰富…...
ESG跨境电商如何为国内的跨境电商企业打开国外的市场
现在不管是国内还是国外,做电商的企业都非常的多,那么既然有这么多大电商公司,就要有为这些电商公司提供服务的公司,这就是ESG,它是专门为跨境电商服务的公司,那么这家公司的主要业务是什么呢?它…...
建筑节能成发展焦点,楼宇自控应用范围持续扩大
在全球能源危机日益严峻、环保意识不断增强的大环境下,建筑节能已成为建筑行业发展的核心议题。从大型商业综合体到普通住宅,从公共建筑到工业厂房,节能需求贯穿建筑全生命周期。而楼宇自控系统凭借其对建筑设备的智能化管理和精准调控能力&a…...
中国矿业大学iGMAS分析中心介绍
一、关于GNSS和iGMAS 在浩瀚的太空中,全球卫星导航系统(GNSS)构建起精准定位的时空基准。IGMAS——国际GNSS监测评估系统,是由中国倡导并主导建设的全球GNSS监测网络,旨在提供高精度、高可靠的导航、定位与授时服务。 …...
python如何取消word中的缩进
在python-docx中,取消缩进可以通过将相应的缩进属性设置为None或0来实现。以下是取消不同类型缩进的方法: 取消左缩进 from docx import Documentdoc Document(existing_document.docx)for paragraph in doc.paragraphs:# 取消左缩进paragraph.paragr…...
Lesar: 面向 Lustre/Scade 语言的形式化模型检测工具
在《同步反应式系统》的第一课中,介绍了同步数据流语言 Lustre 生态中的形式化模型检查器 Lesar 的用法。Lesar 可对 lustre v4 语言以及 Scade 语言中部分数据流核心特性进行模型检查。 Lesar 介绍 Lesar 是 Verimag 研发维护的形式化方法模型检查工具。该工具的理…...
YOLOv12 改进有效系列目录 - 包含卷积、主干、检测头、注意力机制、Neck上百种创新机制 - 针对多尺度、小目标、遮挡、复杂环境、噪声等问题!
🔥 在 YOLO 系列一路狂飙之后,YOLOv12 带来了令人耳目一新的范式转变——它不再以 CNN 为绝对核心,而是首次 围绕注意力机制构建 YOLO 框架,在保证实时性的前提下,将检测精度再次推向新高度! 为了进一步探…...
STM32 I2C总线通信协议
引言 在嵌入式系统开发领域,I2C(Inter-Integrated Circuit)总线作为经典的双线制串行通信协议,凭借其简洁的物理层设计和灵活的通信机制,在传感器互联、存储设备控制、显示模块驱动等场景中占据重要地位。本文将深入剖…...
多物理场耦合低温等离子体装置求解器PASSKEy2
文章目录 PASSKEy2简介PASSKEY2计算流程PASSKEy2 中求解的物理方程电路模型等离子体模型燃烧模型 PASSKEy2的使用 PASSKEy2简介 PASSKEy2 是在 PASSKEy1 的基础上重新编写的等离子体数值模拟程序。 相较于 PASSKEy1, PASSKEy2 在具备解决低温等离子体模拟问题的能力…...
【Harmony_Bug】forEach + asyncawait 的异步陷阱
一、问题描述 今天在做一个RDB的小项目时,遇到一个问题,因为没报错其实也是不算是BUG,以下描述时我就直接说关键点,其他代码忽略。 我的数据模型初始化有六条数据如图 在持久化层,通过initUserData这个方法执行插入。…...
智慧医院建设的三大关键领域
智慧医院建设是医疗行业数字化转型的核心载体,其本质是通过新一代信息技术重构医疗服务模式、优化管理流程、提升患者体验。在当前医疗资源供需矛盾突出的背景下,智慧医院建设已从单纯的设备智能化向系统性变革演进,主要集中在以下三大关键领…...
雷电模拟器怎么更改IP地址
游戏搬砖会使用雷电模拟器多开窗口,若模拟器窗口开多了,IP地址是一样的就怕有限制,很容易被游戏后台检测到。在雷电模拟器中更改IP地址可以通过以下方法实现: 方法一:通过模拟器内设置代理 1. 打开雷电模拟器 启动雷…...
软件编程命名规范
编程命名规范是保证代码可读性、可维护性和团队协作效率的重要基础。以下是涵盖主流编程语言的通用命名规范,结合行业最佳实践和常见规范(如Google、Microsoft、Airbnb等风格指南): 一、通用命名原则 清晰优先:名称应…...
#什么是爬虫?——从技术原理到现实应用的全面解析 VI
什么是爬虫?——从技术原理到现实应用的全面解析 V 二十六、异构数据采集技术突破 26.1 PDF文本与表格提取 import pdfplumber import pandas as pddef extract_pdf_data(pdf_path):"""从PDF中提取文本和表格数据:param pdf_path: PDF文件路径:return: 包含…...
芯岭技术XL32F003单片机 32位Cortex M0+ MCU简单介绍 性能优异
XL32F003单片机是深圳市芯岭技术有限公司的一款基于 32 位 ARM Cortex-M0 内核的高性能微控制器,提供SOP8/SOP14/SOP16/TSSOP20/SSOP24/QFN20/QFN32多种封装可选,可满足不同设计需求。XL32F003可用于工业控制、手持设备、PC 外设、传感器节点等应用场景&…...
使用浏览器的Clipboard API实现前端复制copy功能
在前端开发中,复制文本到剪贴板的功能通常使用浏览器的 Clipboard API 实现。比如 navigator.clipboard.writeText 方法。以下是一个简单的案例,展示如何使用 Clipboard API 实现复制文本的功能。 基本用法 首先,你需要创建一个按钮&#x…...
Struts2框架学习
文章目录 基础实战配置文件NameSpaces 基础 实战 配置文件 文件1: <?xml version"1.0" encoding"UTF-8"?> // 声明这是一个 XML 文件,且使用 UTF - 8 编码 <!DOCTYPE struts PUBLIC"-//Apache Software Foundat…...
React 实现爱心花园动画
主页: import React, { useEffect, useRef, useState } from react; import /assets/css/Love.less; import { Garden } from /utils/GardenClasses;// 组件属性接口 interface LoveAnimationProps {startDate?: Date; // 可选的开始日期messages?: { // 可…...
CAPL编程_03
1_文件操作的相关函数: 读文本文件内容 读取文本文件操作的三部曲 1)打开文件 —— openFileRead ( ) 2)逐行读取 —— fileGetString ( ) 、fileGetStringSZ ( ) 3)关闭文件 —— fileClose ( ) char content[100];…...
网络准入控制系统:2025年网络安全的坚固防线
在当今数字化时代,网络安全已成为至关重要的议题。阳途网络准入控制系统作为保障网络安全的关键机制,发挥着不可替代的作用。 阳途网络准入控制系统核心目的在于确保只有合法、合规的设备与用户能够接入网络。从本质上讲,它通过一系列技术手段…...
【音视频】⾳频处理基本概念及⾳频重采样
一、重采样 1.1 什么是重采样 所谓的重采样,就是改变⾳频的采样率、sample format、声道数等参数,使之按照我们期望的参数输出。 1.2 为什么要重采样 为什么要重采样? 当然是原有的⾳频参数不满⾜我们的需求,⽐如在FFmpeg解码⾳频的时候…...
自然语言处理将如何颠覆未来教育?个性化学习新纪元
教育领域正经历着自印刷术发明以来最深刻的变革。自然语言处理(NLP)技术突破传统教育框架的桎梏,正在重塑人类知识传递的基本范式。这场变革的实质不在于教学工具的数字化升级,而在于重新定义了"教"与"学"的本…...
4月25日星期五今日早报简报微语报早读
4月25日星期五,农历三月廿八,早报#微语早读。 1、祝贺!神舟二十号载人飞船发射取得圆满成功; 2、文旅部:今年一季度国内出游人次17.94亿,同比增长26.4%; 3、2025五一档新片预售票房破1000万&…...