Teigha应用——解析CAD文件(DWG格式)Teigha在CAD C#二次开发中的基本应用
Teigha是一款专为开发者设计的工具,其核心技术在于强大的API和丰富的功能集,提供了一系列工具和方法,使开发者能够轻松地读取、解析和操作DWG文件。它支持多种操作系统,能在处理大型DWG文件时保持高效性能,还可用于构建数据转换工具,将DWG文件转换为其他格式,或进行反向转换。
此外,Teigha能与BIM软件集成,支持DWG文件的导入和导出,提升BIM模型的数据兼容性。众多CAD软件替代品,如Bricscad、ZWCAD和IntelliCAD等,也都依赖Teigha来处理DWG格式和与Acad对象进行交互。
Teigha简介
Teigha是Bentley公司提供的CAD文件格式开发库,允许开发者在不依赖AutoCAD的情况下读写DWG/DXF文件。与AutoCAD .NET API相比,Teigha具有跨平台特性,支持多种开发语言和操作系统。
核心命名空间
- Bentley.MicroStation.DgnPlatformNET :基础平台功能
- Bentley.DgnPlatformNET :DGN文件操作
- Bentley.DwgPlatformNET :DWG文件操作
- Bentley.GeometryNET :几何图形处理
- Bentley.MathNET :数学计算功能
基本功能示例与代码
下面通过几个典型场景演示Teigha在C#中的基本应用,包括文件读写、图形创建、对象遍历和属性操作:
using System;
using System.Collections.Generic;
using Bentley.DwgPlatformNET;
using Bentley.DgnPlatformNET;
using Bentley.GeometryNET;
using Bentley.MathNET;
using Bentley.Transactions;namespace TeighaCADExample
{class Program{static void Main(string[] args){// 初始化Teigha平台InitializeTeigha();try{// 1. 创建新DWG文件并添加图形CreateNewDWGFile();// 2. 读取DWG文件并遍历对象ReadAndProcessDWGFile();// 3. 修改现有图形对象属性ModifyEntityProperties();// 4. 执行图形集合运算PerformGeometryOperations();Console.WriteLine("Teigha示例执行完成!");}catch (Exception ex){Console.WriteLine($"错误: {ex.Message}");}finally{// 清理资源CleanUpTeigha();}Console.ReadKey();}// 初始化Teigha平台static void InitializeTeigha(){// 加载Teigha许可证License BentleyLicense = new License();BentleyLicense.SetProductLevel(License.ProductLevels.Professional);Console.WriteLine("Teigha平台初始化成功");}// 清理Teigha资源static void CleanUpTeigha(){// 释放许可证等资源Console.WriteLine("Teigha资源已清理");}// 示例1:创建新DWG文件并添加图形static void CreateNewDWGFile(){string filePath = @"C:\Temp\TeighaExample.dwg";// 创建DWG文档using (DwgDocument doc = new DwgDocument()){// 开始事务using (Transaction tr = doc.TransactionManager.StartTransaction()){// 获取模型空间BlockTableRecord modelSpace = doc.Database.ActiveModelSpace;// 1. 添加直线LineString line = new LineString();line.StartPoint = new Point3d(0, 0, 0);line.EndPoint = new Point3d(10, 0, 0);// 创建DwgLine实体DwgLine dwgLine = new DwgLine();dwgLine.Geometry = line;// 添加到模型空间modelSpace.AppendEntity(dwgLine);tr.AddNewlyCreatedDBObject(dwgLine, true);Console.WriteLine("已添加直线");// 2. 添加圆Circle circle = new Circle();circle.Center = new Point3d(5, 5, 0);circle.Radius = 3.0;DwgCircle dwgCircle = new DwgCircle();dwgCircle.Geometry = circle;modelSpace.AppendEntity(dwgCircle);tr.AddNewlyCreatedDBObject(dwgCircle, true);Console.WriteLine("已添加圆");// 3. 添加文本TextElement text = new TextElement();text.Text = "Teigha示例文本";text.Position = new Point3d(5, 0, 0);text.Height = 1.0;DwgText dwgText = new DwgText();dwgText.Geometry = text;modelSpace.AppendEntity(dwgText);tr.AddNewlyCreatedDBObject(dwgText, true);Console.WriteLine("已添加文本");// 提交事务并保存文件tr.Commit();doc.SaveAs(filePath);Console.WriteLine($"文件已保存至: {filePath}");}}}// 示例2:读取DWG文件并遍历对象static void ReadAndProcessDWGFile(){string filePath = @"C:\Temp\TeighaExample.dwg";if (!System.IO.File.Exists(filePath)){Console.WriteLine("示例文件不存在,请先执行创建文件操作");return;}using (DwgDocument doc = new DwgDocument()){// 打开DWG文件doc.Open(filePath);Console.WriteLine("已打开DWG文件");using (Transaction tr = doc.TransactionManager.StartTransaction()){// 获取模型空间BlockTableRecord modelSpace = doc.Database.ActiveModelSpace;Console.WriteLine("开始遍历模型空间对象:");int entityCount = 0;// 遍历模型空间所有实体foreach (DBObject obj in modelSpace){if (obj is Entity entity){entityCount++;// 根据实体类型执行不同操作if (entity is DwgLine line){LineString lineGeom = line.Geometry as LineString;Console.WriteLine($"发现直线: 起点({lineGeom.StartPoint.X},{lineGeom.StartPoint.Y}), 终点({lineGeom.EndPoint.X},{lineGeom.EndPoint.Y})");}else if (entity is DwgCircle circle){Circle circleGeom = circle.Geometry as Circle;Console.WriteLine($"发现圆: 圆心({circleGeom.Center.X},{circleGeom.Center.Y}), 半径{circleGeom.Radius}");}else if (entity is DwgText text){TextElement textGeom = text.Geometry as TextElement;Console.WriteLine($"发现文本: \"{textGeom.Text}\", 位置({textGeom.Position.X},{textGeom.Position.Y})");}}}Console.WriteLine($"共找到{entityCount}个图形实体");tr.Commit();}}}// 示例3:修改现有图形对象属性static void ModifyEntityProperties(){string filePath = @"C:\Temp\TeighaExample.dwg";if (!System.IO.File.Exists(filePath)){Console.WriteLine("示例文件不存在,请先执行创建文件操作");return;}using (DwgDocument doc = new DwgDocument()){doc.Open(filePath);using (Transaction tr = doc.TransactionManager.StartTransaction()){BlockTableRecord modelSpace = doc.Database.ActiveModelSpace;Console.WriteLine("开始修改对象属性:");int modifiedCount = 0;foreach (DBObject obj in modelSpace){if (obj is Entity entity){// 1. 修改颜色:将所有对象设为红色entity.Color = Color.FromColorIndex(ColorMethod.ByAci, 1); // 红色// 2. 特别处理圆:增大半径if (entity is DwgCircle circle){Circle circleGeom = circle.Geometry as Circle;circleGeom.Radius *= 1.5;circle.Geometry = circleGeom;Console.WriteLine($"圆半径已修改为{circleGeom.Radius}");modifiedCount++;}// 3. 特别处理文本:修改内容else if (entity is DwgText text){TextElement textGeom = text.Geometry as TextElement;textGeom.Text = "修改后的Teigha示例文本";text.Geometry = textGeom;Console.WriteLine("文本内容已修改");modifiedCount++;}}}if (modifiedCount > 0){Console.WriteLine($"成功修改{modifiedCount}个对象属性");tr.Commit();doc.Save();}else{Console.WriteLine("未找到可修改的对象");}}}}// 示例4:执行图形集合运算static void PerformGeometryOperations(){// 创建新文件用于演示几何运算string filePath = @"C:\Temp\TeighaGeometry.dwg";using (DwgDocument doc = new DwgDocument()){using (Transaction tr = doc.TransactionManager.StartTransaction()){BlockTableRecord modelSpace = doc.Database.ActiveModelSpace;// 1. 创建两个相交的圆用于求交运算Circle circle1 = new Circle();circle1.Center = new Point3d(5, 5, 0);circle1.Radius = 3.0;DwgCircle circleEnt1 = new DwgCircle();circleEnt1.Geometry = circle1;modelSpace.AppendEntity(circleEnt1);tr.AddNewlyCreatedDBObject(circleEnt1, true);Circle circle2 = new Circle();circle2.Center = new Point3d(8, 5, 0);circle2.Radius = 3.0;DwgCircle circleEnt2 = new DwgCircle();circleEnt2.Geometry = circle2;modelSpace.AppendEntity(circleEnt2);tr.AddNewlyCreatedDBObject(circleEnt2, true);// 2. 执行几何求交运算GeometryIntersector intersector = new GeometryIntersector();GeometryBase result = intersector.GetIntersection(circle1, circle2);if (result is Point3dCollection intersectionPoints){Console.WriteLine($"两圆相交,找到{intersectionPoints.Count}个交点");// 将交点绘制成点foreach (Point3d pt in intersectionPoints){PointElement point = new PointElement();point.Position = pt;DwgPoint pointEnt = new DwgPoint();pointEnt.Geometry = point;modelSpace.AppendEntity(pointEnt);tr.AddNewlyCreatedDBObject(pointEnt, true);}}else{Console.WriteLine("两圆未相交");}// 3. 创建矩形和圆形用于求差运算Polyline polyline = new Polyline();polyline.AddVertexAt(0, new Point3d(2, 2, 0), 0, 0, 0);polyline.AddVertexAt(1, new Point3d(2, 8, 0), 0, 0, 0);polyline.AddVertexAt(2, new Point3d(8, 8, 0), 0, 0, 0);polyline.AddVertexAt(3, new Point3d(8, 2, 0), 0, 0, 0);polyline.Closed = true;DwgPolyline rectEnt = new DwgPolyline();rectEnt.Geometry = polyline;modelSpace.AppendEntity(rectEnt);tr.AddNewlyCreatedDBObject(rectEnt, true);// 执行矩形减去圆形的差集运算GeometryDifferencer differencer = new GeometryDifferencer();GeometryBase diffResult = differencer.GetDifference(polyline, circle1);if (diffResult is Polyline resultPolyline){Console.WriteLine("成功执行差集运算");// 绘制差集结果DwgPolyline diffEnt = new DwgPolyline();diffEnt.Geometry = resultPolyline;diffEnt.Color = Color.FromColorIndex(ColorMethod.ByAci, 2); // 绿色modelSpace.AppendEntity(diffEnt);tr.AddNewlyCreatedDBObject(diffEnt, true);}tr.Commit();doc.SaveAs(filePath);Console.WriteLine($"几何运算结果已保存至: {filePath}");}}}}
}
1. 基础文件操作
- 文件创建:通过 DwgDocument 类创建新DWG文件,使用 Transaction 管理数据库事务
- 文件读取:通过 doc.Open() 方法读取现有DWG文件,遍历 ActiveModelSpace 中的实体
2. 图形对象操作
- 直线创建:通过 LineString 定义线段起点和终点,封装为 DwgLine 实体
- 圆形创建:使用 Circle 几何对象定义圆心和半径,转换为 DwgCircle
- 文本创建:通过 TextElement 设置文本内容、位置和高度,生成 DwgText 实体
3. 对象属性修改
- 颜色修改:通过 entity.Color 属性设置对象颜色(示例中使用红色Aci 1)
- 几何修改:直接操作几何对象(如圆的半径、文本内容)并更新实体
4. 几何运算应用
- 求交运算:使用 GeometryIntersector 计算两圆交点,结果为 Point3dCollection
- 差集运算:通过 GeometryDifferencer 实现矩形与圆形的差集计算,返回新的多边形
Teigha与AutoCAD API的主要差异
5. 架构设计:
- Teigha采用更通用的对象模型,不依赖AutoCAD环境
- AutoCAD API紧密绑定AutoCAD进程,需在AutoCAD中运行
6. 命名空间差异:
- Teigha使用 Bentley 命名空间(如 Bentley.DwgPlatformNET )
- AutoCAD API使用 Autodesk.AutoCAD 命名空间
7. 几何处理:
- Teigha提供独立的 GeometryNET 命名空间,几何运算功能更丰富
- AutoCAD API的几何处理与实体对象耦合更紧密
8. 事务管理:
- 两者都使用事务机制管理数据库操作,但Teigha的 Transaction 接口更简洁
开发环境配置
3. 引用程序集:
- 需要在项目中引用以下Teigha程序集:
- Bentley.DgnPlatformNET.dll
- Bentley.DwgPlatformNET.dll
- Bentley.GeometryNET.dll
- Bentley.MathNET.dll
- Bentley.Transactions.dll
4. 许可证管理:
- 使用Teigha前需初始化许可证(如示例中的 License 类)
- 商业应用需购买Bentley官方许可证
应用场景扩展
5. 批量文件处理:利用Teigha不依赖AutoCAD的特性,开发批量转换、检查DWG文件的工具
6. 跨平台应用:基于Teigha的跨平台能力,开发Windows、Linux或macOS环境下的CAD文件处理程序
7. 轻量化显示:提取DWG文件中的几何数据,用于轻量化图形显示或Web端可视化
8. 数据提取与分析:从DWG文件中提取特定类型的对象(如管道、结构构件)进行数据分析
上述示例代码可直接编译运行(需正确配置Teigha环境),实际项目中可根据需求进一步扩展功能,如添加图层管理、块参照处理、尺寸标注操作等高级功能。
以下是关于 **Teigha (Open Design Alliance SDK)** 在CAD二次开发中的基本应用示例,包含常见功能的详细代码和注释。Teigha 是用于处理DWG/DXF文件的跨平台开发库,支持无需AutoCAD环境即可操作CAD文件。
一、Teigha开发环境准备**
1. 安装Teigha SDK(ODA SDK)
2. 在C#项目中添加以下引用:
- `Teigha.Core.dll`
- `Teigha.Runtime.dll`
- `Teigha.DatabaseServices.dll`
- `Teigha.Geometry.dll`
二、基本功能示例**#### **1. 创建新DWG文件并添加直线**
using Teigha.Core;
using Teigha.DatabaseServices;
using Teigha.Geometry;
using System;public class TeighaBasicDemo
{public static void CreateDwgWithLine(){// 初始化Teigha环境Services.Start(); try{// 创建内存中的新Database(相当于DWG文件)using (Database db = new Database(true, true))using (Transaction tr = db.TransactionManager.StartTransaction()){// 打开块表(BlockTable)BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForWrite) as BlockTable;// 打开模型空间块表记录BlockTableRecord modelSpace = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;// 创建一条直线(从点(0,0,0)到点(100,100,0))Line line = new Line(new Point3d(0, 0, 0),new Point3d(100, 100, 0));// 将直线添加到模型空间modelSpace.AppendEntity(line);tr.AddNewlyCreatedDBObject(line, true);// 保存为DWG文件db.SaveAs("C:\\Temp\\Output.dwg", DwgVersion.Current);tr.Commit();}}catch (Exception ex){Console.WriteLine("Error: " + ex.Message);}finally{// 释放Teigha资源Services.Release();}}
}
2. 读取DWG文件并遍历所有实体**
using Teigha.Core;
using Teigha.DatabaseServices;public class TeighaReadDemo
{public static void ReadDwgEntities(){Services.Start();try{using (Database db = new Database(false, true)){// 读取现有DWG文件db.ReadDwgFile("C:\\Temp\\Sample.dwg", FileOpenMode.OpenForReadAndAllShare, false, null);using (Transaction tr = db.TransactionManager.StartTransaction()){BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;BlockTableRecord modelSpace = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead) as BlockTableRecord;// 遍历模型空间中的实体foreach (ObjectId entityId in modelSpace){Entity entity = tr.GetObject(entityId, OpenMode.ForRead) as Entity;if (entity != null){// 输出实体类型和句柄Console.WriteLine($"Entity Type: {entity.GetType().Name}, Handle: {entity.Handle}");}}tr.Commit();}}}catch (Exception ex){Console.WriteLine("Error: " + ex.Message);}finally{Services.Release();}}
}
3. 创建图层并设置颜色**
using Teigha.Core;
using Teigha.DatabaseServices;public class LayerDemo
{public static void CreateLayer(){Services.Start();try{using (Database db = new Database(true, true))using (Transaction tr = db.TransactionManager.StartTransaction()){// 获取层表(LayerTable)LayerTable lt = tr.GetObject(db.LayerTableId, OpenMode.ForWrite) as LayerTable;// 创建新图层LayerTableRecord layer = new LayerTableRecord{Name = "MyLayer",Color = Color.FromColorIndex(ColorMethod.ByAci, 1) // 红色};// 将图层添加到层表lt.Add(layer);tr.AddNewlyCreatedDBObject(layer, true);tr.Commit();db.SaveAs("C:\\Temp\\LayerDemo.dwg", DwgVersion.Current);}}catch (Exception ex){Console.WriteLine("Error: " + ex.Message);}finally{Services.Release();}}
}
4. 添加块定义与块引用
using Teigha.Core;
using Teigha.DatabaseServices;public class BlockDemo
{public static void CreateBlockWithReference(){Services.Start();try{using (Database db = new Database(true, true))using (Transaction tr = db.TransactionManager.StartTransaction()){// 创建块定义BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForWrite) as BlockTable;BlockTableRecord blockDef = new BlockTableRecord{Name = "MyBlock"};// 在块定义中添加一个圆Circle circle = new Circle(new Point3d(0, 0, 0),Vector3d.ZAxis,50.0);blockDef.AppendEntity(circle);tr.AddNewlyCreatedDBObject(circle, true);// 将块定义添加到块表bt.Add(blockDef);tr.AddNewlyCreatedDBObject(blockDef, true);// 在模型空间中插入块引用BlockTableRecord modelSpace = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;BlockReference blockRef = new BlockReference(new Point3d(200, 200, 0),blockDef.ObjectId);modelSpace.AppendEntity(blockRef);tr.AddNewlyCreatedDBObject(blockRef, true);tr.Commit();db.SaveAs("C:\\Temp\\BlockDemo.dwg", DwgVersion.Current);}}catch (Exception ex){Console.WriteLine("Error: " + ex.Message);}finally{Services.Release();}}
}
三、关键技术点说明**
1. **环境初始化与释放**
- `Services.Start()`:初始化Teigha运行时环境
- `Services.Release()`:释放资源(必须调用,否则内存泄漏)
2. **数据库操作**
- `new Database(true, true)`:创建空数据库(第一个参数为`true`表示新建)
- `db.ReadDwgFile()`:读取现有DWG文件
- `db.SaveAs()`:保存DWG文件
3. **事务管理**
- 所有数据库操作必须包裹在事务中
- 使用`TransactionManager.StartTransaction()`开启事务
- 必须调用`Commit()`或`Abort()`结束事务
4. **实体操作流程**
```plaintext
创建实体 → 打开目标块表记录 → AppendEntity → AddNewlyCreatedDBObject
```
四、Teigha与AutoCAD API的区别
| 功能 | Teigha (ODA) | AutoCAD .NET API |
|---------------------|---------------------------- |---------------------------|
| 环境依赖 | 无需安装AutoCAD | 必须安装AutoCAD |
| 跨平台支持 | 支持Windows/Linux/macOS | 仅Windows |
| 文件格式支持 | 支持DWG/DXF/DWF | 主要支持DWG |
| 类名前缀 | 无命名空间前缀(如`Database`)| 带`Autodesk.AutoCAD`前缀 |
| 商业授权 | 需要ODA商业许可 | 需AutoCAD授权 |
五、常见问题处理
1. **句柄(Handle)冲突**
使用`db.Undo()`回滚操作时需注意对象状态管理。
2. **内存泄漏**
确保所有`DBObject`在使用后调用`Dispose()`或包裹在`using`语句中。
3. **坐标系差异**
Teigha使用右手坐标系,需注意与AutoCAD坐标系的一致性。
---
通过上述示例,可以快速掌握Teigha在CAD文件操作中的核心功能。建议参考ODA官方文档([Open Design Alliance](https://www.opendesign.com/))获取更详细的API说明。
相关文章:
Teigha应用——解析CAD文件(DWG格式)Teigha在CAD C#二次开发中的基本应用
Teigha是一款专为开发者设计的工具,其核心技术在于强大的API和丰富的功能集,提供了一系列工具和方法,使开发者能够轻松地读取、解析和操作DWG文件。它支持多种操作系统,能在处理大型DWG文件时保持高效性能,还可用于构建…...

C++23内存分配新特性:std::allocate_at_least
文章目录 一、背景与动机二、std::allocator::allocate_at_least的特性三、std::allocate_at_least的自由函数版本四、实际应用场景1. 动态容器的优化2. 自定义分配器 五、总结 在C23标准中, std::allocate_at_least和 std::allocator::allocate_at_least的引入为…...
JavaScript性能优化全景指南
JavaScript性能优化全景指南 Ⅰ. 加载性能优化 1.1 代码分割与懒加载 动态导入(ES2020) javascript // 路由级代码分割 const ProductPage () > import(/* webpackChunkName: "product" */ ./ProductPage.vue); // 交互驱动加载 document.querySelector(#char…...

04-jenkins学习之旅-java后端项目部署实践
1、创建被管理项目 2、构建流程说明 jenkins其实就是将服务部署拆分成了: 1、拉取代码(git) 2、打包编译 3、自定义脚本(jar复制、执行启动脚本) 4、部署成功后的一些通知等 3、demo配置 3.1、General 3.2 源码管理 添加用户名密码方式如下图 3.2.1 常见错误(r…...

基于Python flask 的豆瓣电影top250数据评分可视化
文章目录 基于Python flask 的豆瓣电影top250数据评分可视化项目简介项目结构效果展示源码获取 基于Python flask 的豆瓣电影top250数据评分可视化 博主介绍:✌安替-AnTi:CSDN博客专家、掘金/华为云//InfoQ等平台优质作者,硕士研究生毕业。专…...

Cat.4+WiFi6工业路由器介绍小体积大作用ER4200
ER42004G Cat.4WiFi6 工业路由器隶属于纵横智控ER系列,型号为ER4200,是一款坚固耐用、性能强大的网络设备,专为应对严苛环境而设计。它采用工业级品质设计,集成 4G Cat.4 全网络支持和 WiFi6 技术,可在稳定性和性能至关…...
大模型应用开发第三讲:大模型是Agent的“大脑”,提供通用推理能力(如GPT-4、Claude 3)
大模型应用开发第三讲:大模型是Agent的“大脑”,提供通用推理能力(如GPT-4、Claude 3) 资料取自《大模型应用开发:动手做AI Agent 》。 查看总目录:学习大纲 关于DeepSeek本地部署指南可以看下我之前写的…...

创建型模式之Abstract Factory(抽象工厂)
创建型模式之Abstract Factory(抽象工厂) 摘要: 本文介绍了抽象工厂模式(Abstract Factory),它是一种创建型设计模式,提供了一种创建一系列相关对象的接口而无需指定具体类。文章通过手机工厂示…...
GitLab 18.0 正式发布,15.0 将不再受技术支持,须升级【一】
GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料: 极狐GitLab 官网极狐…...

【DeepSeek论文精读】12. DeepSeek-Prover-V2: 通过强化学习实现子目标分解的形式化数学推理
欢迎关注[【AIGC论文精读】](https://blog.csdn.net/youcans/category_12321605.html)原创作品 【DeepSeek论文精读】1. 从 DeepSeek LLM 到 DeepSeek R1 【DeepSeek论文精读】10. DeepSeek-Coder-V2: 突破闭源模型在代码智能领域的障碍 【DeepSeek论文精读】12. De…...
字符串day7
344 反转字符串 字符串理论上也是一个数组,因此只需要用双指针即可 class Solution { public:void reverseString(vector<char>& s) {for(int i0,js.size()-1;i<j;i,j--){swap(s[i],s[j]);}} };541 反转字符串 自己实现一个反转从start到end的字符串…...

vue2中,codemirror编辑器的使用
交互说明 在编辑器中输入{时,会自动弹出选项弹窗,然后可以选值插入。 代码 父组件 <variable-editorv-model"content":variables"variables"placeholder"请输入模板内容..."blur"handleBlur" />data…...

FastAPI与MongoDB分片集群:异步数据路由与聚合优化
title: FastAPI与MongoDB分片集群:异步数据路由与聚合优化 date: 2025/05/26 16:04:31 updated: 2025/05/26 16:04:31 author: cmdragon excerpt: FastAPI与MongoDB分片集群集成实战探讨了分片集群的核心概念、Motor驱动配置技巧、分片数据路由策略、聚合管道高级应用、分片…...

Perl单元测试实战指南:从Test::Class入门到精通的完整方案
阅读原文 前言:为什么Perl开发者需要重视单元测试? "这段代码昨天还能运行,今天就出问题了!"——这可能是每位Perl开发者都经历过的噩梦。在没有充分测试覆盖的情况下,即使是微小的改动也可能导致系统崩溃。单元测试正是解决这一痛点的最佳实践,它能帮助我们在…...

强大的免费工具,集合了30+功能
今天给大家分享一款免费的绿色办公软件,它涵盖了自动任务、系统工具、文件工具、PDF 工具、OCR 图文识别、文字处理、电子表格这七个模块,多达 30 余项实用功能,堪称办公利器。 作者开发这款软件的初衷是为了解决日常办公中常见的痛点问题&am…...

从0开始学习R语言--Day11--主成分分析
主成分分析(PCA) PCA是一种降维技术,它把一堆相关的变量(比如身高、体重、年龄)转换成少数几个不相关的新变量(叫“主成分”),这些新变量能最大程度保留原始数据的信息。 核心理念 …...
通用前端框架项目静态部署到Hugging Face Space的实践指南
背景介绍 在轻量级展示前端项目的场景中,Hugging Face Space 提供了一个便捷的静态托管平台。需求是将无后端服务的Vite的 Vue项目部署到Hugging Face Space 上。其实无论是基于Vite的Vue/React项目,还是使用Webpack构建的工程化方案,都可以通过两种方式将其部署到Space:自…...

AI辅助写作 从提笔难到高效创作的智能升级
你是否经历过面对空白文档头脑空白的绝望?是否为整理实验数据通宵达旦?在这个信息爆炸的时代,一种新型写作方式正悄悄改变知识工作者的创作模式—AI辅助写作。这种技术既不像科幻作品里的自动生成机器人,也非简单的文字模板&#…...
十一、Samba文件共享服务
目录 1、Samba介绍1.1、Samba概述1.2、Samba服务器的主要组成部分1.3、Samba的工作原理2、Samab服务器的安装与配置2.1、安装samba2.2、Samba主配置文件2.2.1、全局设置段[global]2.2.2、用户目录段[homes]2.2.3、配置文件检查工具3、示例3.1、需要用户验证的共享3.2、用户映射…...
医疗影像检测系统设计与实现
以下是一个基于YOLO系列模型的医疗影像检测系统实现及对比分析的详细技术文档。由于目前官方YOLOv11尚未发布,本文将基于YOLOv8架构设计改进型YOLOv11,并与YOLOv8、YOLOv5进行对比实验。全文包含完整代码实现及分析,字数超过6000字。 # 注意:本文代码需要Python 3.8+、PyT…...
11.13 LangGraph记忆机制解析:构建生产级AI Agent的关键技术
LangGraph 持久化与记忆:构建具备记忆能力的生产级 AI Agent 关键词:LangGraph 持久化, 多回合记忆, 单回合记忆, 检查点系统, 状态管理 1. 记忆机制的核心价值 在对话式 AI Agent 的开发中,记忆管理直接决定了用户体验的连贯性和智能性。LangGraph 通过 多回合记忆(Mult…...

C++23中std::span和std::basic_string_view可平凡复制提案解析
文章目录 一、引言二、相关概念解释2.1 平凡复制(Trivially Copyable)2.2 std::span2.3 std::basic_string_view 三、std::span和std::basic_string_view的应用场景3.1 std::span的应用场景3.2 std::basic_string_view的应用场景 四、P2251R1提案对std::…...

[yolov11改进系列]基于yolov11引入感受野注意力卷积RFAConv的python源码+训练源码
[RFAConv介绍] 1、RFAConv 在传统卷积操作中,每个感受野都使用相同的卷积核参数,无法区分不同位置的信息差异,这都限制了网络性能。此外,由于空间注意力以及现有空间注意力机制的局限性,虽然能够突出关键特征…...

Springboot引入Spring Cloud for AWS的配置中心(Parameter Store和Secrets)
问题 现在手上有一个老Spring2.5.15项目,需要使用AWS Parameter Store作为配置中心服务。 思路 引入这个Spring版本对应的Spring Cloud,然后再引入Spring Cloud AWS相关组件。然后,在AWS云上面准备好配置,然后,启动…...

打破云平台壁垒支持多层级JSON生成的MQTT网关技术解析
工业智能网关的上行通信以MQTT协议为核心,但在实际应用中,企业往往需要将数据同时或分场景接入多个公有云平台(如华为云IoT、阿里云IoT、亚马逊AWS IoT),甚至私有化部署的第三方平台。为实现这一目标,网关需…...
Modbus通信中的延迟和时间间隔详解
在工业自动化领域,Modbus协议作为最广泛使用的通信协议之一,其通信时序和延迟控制直接影响到系统的稳定性和效率。本文将深入探讨Modbus通信中涉及的各种延迟和时间间隔,帮助开发者更好地理解和应用这些概念。 一、串口Modbus通信中的延迟问题 1.1 为什么需要延迟? 在基…...
maven 最短路径依赖优先
问题描述: 项目在升级大版本后出现了,两个不同模块所引用的同一个依赖包版本不同 module A 引用了 module B,module B 引用了 A_1.0.jar->B_1.0.jar->C_1.0.jar(C 为B 里面的包) 在执行 mvn dependency:tree 后发现: modul…...

SAAS架构设计2-流程图-用户与租户之间对应关系图
在SAAS(Software as a Service,软件即服务)结构中,用户与租户之间的关系可以通过一对一和多对多两种方式来定义。这两种关系模式各自有着不同的应用场景和特点。 用户和租户的关系(一对一) 一对一关系 在这…...

TypeScript入门到精通
学习ts之前,我们首先了解一下我们为什么要学ts,ts是什么?ts比js有不同呢? TypeScript 是 JavaScript 的一个超集,是由微软开发的自由和开源的编程语言,支持 ECMAScript 6 标准(ES6 教程)。在 Ja…...

三、Docker目录挂载、卷映射、网络
目录挂载 如果主机目录为空,则容器内也为空 -v表示目录挂载 冒号前面的是主机上的目录,冒号后面的是docker容器里面的地址 修改主机上的文件,发现docker容器里面的内容也随之改变。 同样修改docker容器里面的内容,主机上的文件…...