CAD 二次开发入门与实践:以 C# 为例

摘要: 本文详细介绍了如何使用 C# 进行 CAD 软件的二次开发。首先阐述了 CAD 二次开发的概念、意义与应用场景,接着深入探讨了开发环境的搭建,包括 CAD 相关 API 的引用与 C# 开发工具的配置。随后重点讲解了基于 C# 的 CAD 二次开发的核心技术,如基本图形绘制、图层管理、块操作、尺寸标注等,并结合实际代码示例进行说明。同时,对 CAD 二次开发中的事件处理机制、交互操作实现以及数据交互与处理也进行了细致分析。最后,通过一个完整的案例展示了 C# 在 CAD 二次开发中的实际应用流程,为读者提供了全面深入的 CAD 二次开发学习指南,旨在帮助读者快速掌握使用 C# 进行 CAD 二次开发的技能,从而能够根据自身需求定制 CAD 功能,提高设计效率与质量。

一、引言

CAD(计算机辅助设计)软件在工程设计、建筑设计、机械设计等众多领域得到了广泛应用。然而,通用的 CAD 软件往往不能完全满足特定行业或企业的个性化需求。CAD 二次开发应运而生,它允许用户在现有 CAD 软件的基础上,根据自身业务需求扩展软件功能,提高设计效率与质量。本文将以 C# 语言为例,详细介绍 CAD 二次开发的全过程。

二、CAD 二次开发概述

(一)概念

CAD 二次开发是指在已有的 CAD 软件平台上,利用其提供的开发工具和接口,开发定制化的功能模块、插件或应用程序,以满足特定用户群体或项目的特殊需求。例如,在建筑设计中,可以开发专门用于生成特定风格建筑构件的插件;在机械设计中,可以开发自动化的装配检测工具等。

(二)意义

  • 提高工作效率:通过定制化功能,减少重复性操作,自动化处理一些复杂任务,如批量生成图纸、自动标注等。
  • 满足个性化需求:不同行业、企业和项目对 CAD 功能有不同要求,二次开发能够使 CAD 软件贴合实际需求,如特定行业的标准规范检查功能。
  • 增强软件竞争力:企业可以通过二次开发为自身打造独特的 CAD 应用解决方案,提升在市场中的竞争力。

(三)应用场景

  • 行业定制:如建筑、机械、电子、汽车等行业,可开发符合行业规范和工作流程的功能模块。例如,建筑行业中开发日照分析插件、机械行业中开发模具设计辅助工具。
  • 企业内部流程优化:针对企业内部特定的设计流程和标准,开发专用的 CAD 工具,如企业特定产品的快速设计系统。
  • 与其他系统集成:将 CAD 与企业的 PDM(产品数据管理)、ERP(企业资源计划)等系统集成,实现数据共享与协同工作。

三、开发环境搭建

(一)引用 CAD API

不同的 CAD 软件提供了不同的开发接口,以 AutoCAD 为例,其提供了 ObjectARX 开发库,在使用 C# 进行开发时,需要引用相关的.NET 组件。通常在安装 CAD 软件时,会同时安装对应的开发工具包。在 Visual Studio 中,可以通过 “引用” 管理器添加对 CAD API 相关的.dll 文件的引用。例如,对于 AutoCAD,需要引用如 acmgd.dll、acdbmgd.dll 等核心库文件,这些库文件包含了访问 CAD 图形数据库、进行图形绘制与编辑等功能的接口。

(二)配置 C# 开发工具

  • 安装 Visual Studio:选择合适版本的 Visual Studio 进行安装,建议使用专业版或企业版,因为它们提供了更丰富的开发功能和工具集。
  • 创建项目:在 Visual Studio 中创建一个新的 C# 类库项目或控制台项目,根据开发需求而定。如果是开发 CAD 插件,通常创建类库项目较为合适。
  • 设置项目属性:根据 CAD 软件的要求,设置项目的目标框架、输出路径等属性。例如,对于与特定版本 AutoCAD 兼容的开发,需要设置正确的.NET 框架版本,并确保输出路径与 CAD 软件加载插件的路径相匹配。

四、基于 C# 的 CAD 二次开发核心技术

(一)基本图形绘制

在 CAD 中,基本图形包括点、线、圆、多边形等。使用 C# 进行基本图形绘制时,首先需要获取当前的 CAD 图形数据库和文档对象。例如:

using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;[CommandMethod("DrawLine")]
public void DrawLineInCAD()
{// 获取当前文档和数据库Document doc = Application.DocumentManager.MdiActiveDocument;Database db = doc.Database;// 开始事务using (Transaction tr = db.TransactionManager.StartTransaction()){// 获取块表记录模型空间BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);// 创建直线对象Line line = new Line(new Point3d(0, 0, 0), new Point3d(10, 10, 0));// 将直线添加到模型空间btr.AppendEntity(line);tr.AddNewlyCreatedDBObject(line, true);// 提交事务tr.Commit();}
}

上述代码定义了一个名为 “DrawLine” 的命令,当在 CAD 命令行输入该命令时,将在模型空间绘制一条从原点 (0, 0, 0) 到点 (10, 10, 0) 的直线。代码首先获取当前的 CAD 文档和图形数据库,然后开启一个事务,事务用于保证图形操作的一致性和完整性。在事务中,获取模型空间的块表记录,创建直线对象,并将其添加到模型空间,最后提交事务使图形绘制操作生效。

类似地,可以绘制圆、多边形等其他基本图形。例如,绘制圆的代码如下:

[CommandMethod("DrawCircle")]
public void DrawCircleInCAD()
{Document doc = Application.DocumentManager.MdiActiveDocument;Database db = doc.Database;using (Transaction tr = db.TransactionManager.StartTransaction()){BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);BlockTableRecord btr = (BlockTable)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);// 创建圆对象,圆心为(5, 5, 0),半径为 3Circle circle = new Circle(new Point3d(5, 5, 0), Vector3d.ZAxis, 3);btr.AppendEntity(circle);tr.AddNewlyCreatedDBObject(circle, true);tr.Commit();}
}

(二)图层管理

图层在 CAD 绘图中用于组织和管理图形对象。使用 C# 可以创建、删除、设置图层的属性等。以下是创建一个新图层并设置其颜色的示例代码:

[CommandMethod("CreateLayer")]
public void CreateLayerInCAD()
{Document doc = Application.DocumentManager.MdiActiveDocument;Database db = doc.Database;using (Transaction tr = db.TransactionManager.StartTransaction()){// 获取图层表LayerTable lt = (LayerTable)tr.GetObject(db.LayerTableId, OpenMode.ForRead);// 创建新图层表记录LayerTableRecord ltr = new LayerTableRecord();ltr.Name = "MyLayer";// 设置图层颜色为红色(颜色索引为 1)ltr.Color = Color.FromColorIndex(ColorMethod.ByAci, 1);// 将新图层添加到图层表lt.UpgradeOpen();lt.Add(ltr);tr.AddNewlyCreatedDBObject(ltr, true);tr.Commit();}
}

在上述代码中,首先获取当前图形数据库的图层表,然后创建一个新的图层表记录,设置其名称为 “MyLayer”,颜色为红色(颜色索引为 1),最后将新图层添加到图层表并提交事务。

(三)块操作

块是 CAD 中一组图形对象的集合,可以方便地进行重复使用和管理。使用 C# 可以创建块、插入块等操作。以下是创建一个简单块并插入到图形中的示例:

[CommandMethod("CreateAndInsertBlock")]
public void CreateAndInsertBlockInCAD()
{Document doc = Application.DocumentManager.MdiActiveDocument;Database db = doc.Database;using (Transaction tr = db.TransactionManager.StartTransaction()){// 创建块表BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);// 创建新的块表记录BlockTableRecord btrBlock = new BlockTableRecord();btrBlock.Name = "MyBlock";// 在块中添加一个圆Circle circleInBlock = new Circle(new Point3d(0, 0, 0), Vector3d.ZAxis, 2);btrBlock.AppendEntity(circleInBlock);// 将块添加到块表bt.UpgradeOpen();bt.Add(btrBlock);tr.AddNewlyCreatedDBObject(btrBlock, true);// 获取模型空间块表记录BlockTableRecord btrModelSpace = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);// 创建块引用并插入到模型空间BlockReference blockRef = new BlockReference(new Point3d(5, 5, 0), btrBlock.ObjectId);btrModelSpace.AppendEntity(blockRef);tr.AddNewlyCreatedDBObject(blockRef, true);tr.Commit();}
}

此代码首先创建一个名为 “MyBlock” 的块,块中包含一个半径为 2 的圆,然后将该块插入到模型空间的点 (5, 5, 0) 处。

(四)尺寸标注

尺寸标注是 CAD 绘图中重要的一部分,用于表达图形的尺寸信息。使用 C# 可以进行线性标注、半径标注、角度标注等操作。以下是一个线性标注的示例代码:

[CommandMethod("LinearDimension")]
public void LinearDimensionInCAD()
{Document doc = Application.DocumentManager.MdiActiveDocument;Database db = doc.Database;using (Transaction tr = db.TransactionManager.StartTransaction()){// 获取模型空间块表记录BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);// 创建两条直线用于标注Line line1 = new Line(new Point3d(0, 0, 0), new Point3d(5, 0, 0));Line line2 = new Line(new Point3d(5, 0, 0), new Point3d(5, 5, 0));btr.AppendEntity(line1);btr.AppendEntity(line2);tr.AddNewlyCreatedDBObject(line1, true);tr.AddNewlyCreatedDBObject(line2, true);// 创建线性标注对象Dimension dimension = new AlignedDimension(new Point3d(0, -1, 0), new Point3d(5, -1, 0), new Point3d(5, 5, 0),new DimensionStyleTableRecord());// 设置标注文本dimension.DimensionText = "5";// 将标注添加到模型空间btr.AppendEntity(dimension);tr.AddNewlyCreatedDBObject(dimension, true);tr.Commit();}
}

该代码首先在模型空间创建两条直线,然后创建一个线性标注对象,标注这两条直线之间的距离,并设置标注文本为 “5”,最后将标注添加到模型空间。

五、CAD 二次开发中的其他重要技术

(一)事件处理机制

CAD 软件提供了丰富的事件,如鼠标点击、图形对象修改等事件。在 C# 中,可以通过注册事件处理程序来响应这些事件。例如,以下是一个简单的鼠标点击事件处理示例:

using Autodesk.AutoCAD.EditorInput;public class EventHandlerExample
{[CommandMethod("RegisterMouseEvent")]public void RegisterMouseEvent(){Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;// 注册鼠标点击事件处理程序ed.MouseClick += new EditorMouseClickEventHandler(OnMouseClick);}private void OnMouseClick(object sender, EditorMouseEventArgs e){Application.ShowAlertDialog("鼠标在 CAD 中点击了,坐标为:" + e.Point.ToString());}
}

在上述代码中,当在 CAD 中注册了 “RegisterMouseEvent” 命令后,每次鼠标点击 CAD 绘图区域时,都会弹出一个对话框显示点击的坐标信息。

(二)交互操作实现

在 CAD 二次开发中,常常需要与用户进行交互操作,如获取用户输入的点、数值等。可以使用 C# 中的 Prompt 类来实现交互操作。例如,以下是获取用户输入一个点的示例代码:

[CommandMethod("GetUserPoint")]
public void GetUserPointInCAD()
{Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;PromptPointOptions ppo = new PromptPointOptions("\n请指定一个点:");PromptPointResult ppr = ed.GetPoint(ppo);if (ppr.Status == PromptStatus.OK){Point3d userPoint = ppr.Value;Application.ShowAlertDialog("您指定的点坐标为:" + userPoint.ToString());}
}

此代码在 CAD 命令行提示用户指定一个点,当用户指定点后,获取该点的坐标并弹出对话框显示。

(三)数据交互与处理

CAD 二次开发中可能需要与外部数据库、文件等进行数据交互。例如,可以使用 C# 的数据库连接技术(如 ADO.NET)与企业数据库进行连接,读取或写入与 CAD 绘图相关的数据,如零件信息、设计参数等。同时,也可以读取和写入文本文件、XML 文件等,用于存储 CAD 绘图的配置信息、日志信息等。例如,以下是将一些 CAD 绘图信息写入文本文件的示例:

[CommandMethod("WriteCADInfoToFile")]
public void WriteCADInfoToFile()
{string filePath = @"C:\CADInfo.txt";using (StreamWriter sw = new StreamWriter(filePath, true)){// 获取当前文档名称Document doc = Application.DocumentManager.MdiActiveDocument;sw.WriteLine("文档名称:" + doc.Name);// 获取当前图形数据库中的图形对象数量Database db = doc.Database;using (Transaction tr = db.TransactionManager.StartTransaction()){BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);sw.WriteLine("模型空间图形对象数量:" + btr.Count);tr.Commit();}}
}

该代码将当前 CAD 文档的名称和模型空间图形对象数量写入到指定的文本文件 “C:\CADInfo.txt” 中。

六、案例:开发一个简单的 CAD 建筑平面图生成器

(一)需求分析

开发一个简单的 CAD 建筑平面图生成器,能够根据用户输入的房间数量、房间尺寸等信息,自动生成一个简单的建筑平面图,包括墙体绘制、门窗插入、房间标注等功能。

(二)设计思路

  • 用户交互模块:使用 Prompt 类获取用户输入的房间数量、房间长和宽等参数。
  • 图形绘制模块:根据用户输入的参数,使用基本图形绘制功能绘制墙体(可使用多段线绘制)、门窗(通过块插入)等图形对象。
  • 标注模块:使用尺寸标注功能对房间尺寸、门窗尺寸等进行标注。

(三)代码实现

以下是部分关键代码示例:

[CommandMethod("GenerateBuildingPlan")]
public void GenerateBuildingPlan()
{// 用户交互获取房间数量Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;PromptIntegerOptions pioRoomCount = new PromptIntegerOptions("\n请输入房间数量:");PromptIntegerResult pirRoomCount = ed.GetInteger(pioRoomCount);if (pirRoomCount.Status!= PromptStatus.OK) return;int roomCount = pirRoomCount.Value;// 存储房间尺寸的列表List<(double length, double width)> roomSizes = new List<(double, double)>();// 获取每个房间的尺寸for (int i = 0; i < roomCount; i++){PromptDoubleOptions pioLength = new PromptDoubleOptions("\n请输入房间 " + (i + 1) + " 的长度:");PromptDoubleResult pirLength = ed.GetDouble(pioLength);if (pirLength.Status!= PromptStatus.OK) return;double length = pirLength.Value;PromptDoubleOptions pioWidth = new PromptDoubleOptions("\n请输入房间 " + (i + 1) + " 的宽度:");PromptDoubleResult pirWidth = ed.GetDouble(pioWidth);if (pirWidth.Status!= PromptStatus.OK) return;double width = pirWidth.Value;roomSizes.Add((length, width));}// 图形绘制Document doc = Application.DocumentManager.MdiActiveDocument;Database db = doc.Database;using (Transaction tr = db.TransactionManager.StartTransaction()){// 创建墙体图层并设置属性LayerTable lt = (LayerTable)tr.GetObject(db.LayerTableId, OpenMode.ForRead);LayerTableRecord ltrWall = new LayerTableRecord();ltrWall.Name = "Wall";ltrWall.Color = Color.FromColorIndex(ColorMethod.ByAci, 3);lt.UpgradeOpen();lt.Add(ltrWall);tr.AddNewlyCreatedDBObject(ltrWall, true);// 绘制墙体double startX = 0;double startY = 0;for (int i = 0; i < roomCount; i++){(double length, double width) = roomSizes[i];// 绘制外墙Polyline wall = new Polyline();wall.AddVertexAt(0, new Point2d(startX, startY), 0, 0, 0);wall.AddVertexAt(1, new Point2d(startX + length, startY), 0, 0, 0);wall.AddVertexAt(2, new Point2d(startX + length, startY + width), 0, 0, 0);wall.AddVertexAt(3, new Point2d(startX, startY + width), 0, 0, 0);wall.Closed = true;// 将墙体添加到墙体图层BlockTableRecord btr = (BlockTableRecord)tr.GetObject(lt["Wall"], OpenMode.ForWrite);btr.AppendEntity(wall);tr.AddNewlyCreatedDBObject(wall, true);startX += length;}// 创建门窗图层并设置属性LayerTableRecord ltrDoorWindow = new LayerTableRecord();ltrDoorWindow.Name = "DoorWindow";ltrDoorWindow.Color = Color.FromColorIndex(ColorMethod.ByAci, 5);lt.Add(ltrDoorWindow);tr.AddNewlyCreatedDBObject(ltrDoorWindow, true);// 插入门窗(此处简单示例,仅在墙体中心插入一个门块)startX = 0;startY = 0;for (int i = 0; i < roomCount; i++){(double length, double width) = roomSizes[i];double doorX = startX + length / 2;double doorY = startY;// 创建门块引用并插入到门窗图层BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);BlockTableRecord btrDoorWindowSpace = (BlockTableRecord)tr.GetObject(lt["DoorWindow"], OpenMode.ForWrite);BlockReference doorRef = new BlockReference(new Point3d(doorX, doorY, 0), bt["Door"].ObjectId);btrDoorWindowSpace.AppendEntity(doorRef);tr.AddNewlyCreatedDBObject(doorRef, true);startX += length;}// 标注模块// 创建标注图层并设置属性LayerTableRecord ltrDimension = new LayerTableRecord();ltrDimension.Name = "Dimension";ltrDimension.Color = Color.FromColorIndex(ColorMethod.ByAci, 6);lt.Add(ltrDimension);tr.AddNewlyCreatedDBObject(ltrDimension, true);// 标注房间尺寸startX = 0;startY = 0;for (int i = 0; i < roomCount; i++){(double length, double width) = roomSizes[i];// 线性标注长度Dimension lengthDimension = new AlignedDimension(new Point3d(startX - 1, startY + width / 2, 0), new Point3d(startX + length + 1, startY + width / 2, 0),new Point3d(startX + length, startY + width, 0), new DimensionStyleTableRecord());lengthDimension.DimensionText = length.ToString();// 将标注添加到标注图层BlockTableRecord btrDimensionSpace = (BlockTableRecord)tr.GetObject(lt["Dimension"], OpenMode.ForWrite);btrDimensionSpace.AppendEntity(lengthDimension);tr.AddNewlyCreatedDBObject(lengthDimension, true);// 线性标注宽度Dimension widthDimension = new AlignedDimension(new Point3d(startX + length / 2, startY - 1, 0), new Point3d(startX + length / 2, startY + width + 1, 0),new Point3d(startX, startY + width, 0), new DimensionStyleTableRecord());widthDimension.DimensionText = width.ToString();btrDimensionSpace.AppendEntity(widthDimension);tr.AddNewlyCreatedDBObject(widthDimension, true);startX += length;}tr.Commit();}
}

在上述代码中,首先通过用户交互获取房间数量以及每个房间的长度和宽度信息,并存储在相应的列表中。然后在图形绘制部分,创建了墙体图层、门窗图层和标注图层,并分别设置了图层的属性。接着,根据房间尺寸信息使用多段线绘制墙体,在墙体中心简单插入门块作为门窗示例,并使用线性标注对房间的长度和宽度进行标注,最后提交事务使所有图形操作在 CAD 中生效。

请注意,在实际应用中,门窗块的创建和插入可能需要更复杂的逻辑以适应不同的门窗类型和位置要求,并且还可以进一步完善标注的样式和内容,如添加房间名称标注等,但此示例能够展示一个简单的 CAD 建筑平面图生成器的基本开发思路和主要代码实现过程,为进一步深入开发提供基础。

七、总结

通过本文的介绍,我们详细了解了使用 C# 进行 CAD 二次开发的全过程。从开发环境搭建到核心技术的应用,再到实际案例的开发,涵盖了 CAD 二次开发的多个重要方面。CAD 二次开发为定制化 CAD 应用提供了强大的手段,能够极大地提高设计效率和满足特定业务需求。随着 CAD 技术的不断发展,掌握二次开发技能将有助于工程师和开发者在相关领域创造出更具价值的设计工具和解决方案。在实际学习和实践过程中,需要不断深入研究 CAD 软件的 API 文档,积累开发经验,逐步提升二次开发的能力,以应对日益复杂和多样化的设计挑战。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/483692.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript实现tab栏切换

JavaScript实现tab栏切换 代码功能概述 这段代码实现了一个简单的选项卡&#xff08;Tab&#xff09;切换功能。它通过操作 HTML 元素的类名&#xff08;class&#xff09;来控制哪些选项卡&#xff08;Tab&#xff09;和对应的内容板块显示&#xff0c;哪些隐藏。基本思路是先…

【娱乐项目】基于cnchar库与JavaScript的汉字查询工具

Demo介绍 利用了 cnchar 库来进行汉字相关的信息查询&#xff0c;并展示了汉字的拼音、笔画数、笔画顺序、笔画动画等信息用户输入一个汉字后&#xff0c;点击查询按钮&#xff0c;页面会展示该汉字的拼音、笔画数、笔画顺序&#xff0c;并绘制相应的笔画动画和测试图案 cnchar…

组合问题变式——选数(dfs)

代码随想录听课笔记1——回溯算法-CSDN博客 这是从1&#xff0c;2&#xff0c;3...,n个数字中选出k个数的组合&#xff0c;输出组合的全部可能的代码 //组合&#xff1a;返回1-n中所有个数为k的组合 1,2,3,4 #include<bits/stdc.h> using namespace std; #define MAX 1…

C++知识整理day3类与对象(下)——赋值运算符重载、取地址重载、列表初始化、友元、匿名对象、static

文章目录 1.赋值运算符重载1.1 运算符重载1.2 赋值运算符重载 2.取地址重载2.1 const成员函数2.2 取地址运算符重载 3.类与对象的补充3.1 再探构造函数---初始化列表3.2 类型转换3.3 static成员3.4 友元3.5 内部类3.6 匿名对象3.7 对象拷贝时的编译器优化 1.赋值运算符重载 赋…

<数据集>路面坑洼识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;665张 标注数量(xml文件个数)&#xff1a;665 标注数量(txt文件个数)&#xff1a;665 标注类别数&#xff1a;1 标注类别名称&#xff1a;[pothole] 序号类别名称图片数框数1pothole6651740 使用标注工具&#x…

Oracle篇—通过官网下载最新的数据库软件或者历史数据库软件

&#x1f4ab;《博主介绍》&#xff1a;✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ &#x1f4ab;《擅长领域》&#xff1a;✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux&#xff0c;也在扩展大数据方向的知识面✌️…

dns实验3:主从同步-完全区域传输

服务器192.168.234.111&#xff08;主服务器&#xff09;&#xff0c;打开配置文件&#xff1a; 打开配置文件&#xff1a; 关闭防火墙&#xff0c;改宽松模式&#xff1a; 重启服务&#xff1a; 服务器192.168.234.112&#xff08;从服务器&#xff09;&#xff0c;打开配置文…

OpenCV圆形标定板检测算法findCirclesGrid原理详解

OpenCV的findCirclesGrid函数检测圆形标定板的流程如下:   findCirclesGrid函数源码: //_image,输入图像 //patternSize,pattern的宽高 //_centers,blobs中心点的位置 //flags,pattern是否对称 //blobDetector,这里使用的是SimpleBlobDetector bool cv::findCirclesGrid(…

Java - JSR223规范解读_在JVM上实现多语言支持

文章目录 1. 概述2. 核心目标3. 支持的脚本语言4. 主要接口5. 脚本引擎的使用执行JavaScript脚本执行groovy脚本1. Groovy简介2. Groovy脚本示例3. 如何在Java中集成 Groovy4. 集成注意事项 6. 与Java集成7. 常见应用场景8. 优缺点9. 总结 1. 概述 JSR223&#xff08;Java Spe…

自然语言处理:基于BERT预训练模型的中文命名实体识别(使用PyTorch)

命名实体识别&#xff08;NER&#xff09; 命名实体识别&#xff08;Named Entity Recognition, NER&#xff09;是自然语言处理&#xff08;NLP&#xff09;中的一个关键任务&#xff0c;其目标是从文本中识别出具有特定意义的实体&#xff0c;并将其分类到预定义的类别中。这…

【C++】数组

1.概述 所谓数组&#xff0c;就是一个集合&#xff0c;该集合里面存放了相同类型的数据元素。 数组特点&#xff1a; &#xff08;1&#xff09;数组中的每个数据元素都是相同的数据类型。 &#xff08;2&#xff09;数组是有连续的内存空间组成的。 2、一维数组 2.1维数组定…

微软表示不会使用你的 Word、Excel 数据进行 AI 训练

​微软否认使用 Microsoft 365 应用程序&#xff08;包括 Word、Excel 和 PowerPoint&#xff09;收集数据来训练公司人工智能 (AI) 模型的说法。 此前&#xff0c;Tumblr 的一篇博文声称&#xff0c;雷德蒙德使用“互联体验”功能抓取客户的 Word 和 Excel 数据&#xff0c;用…

leetcode--螺旋矩阵

LCR 146.螺旋遍历二维数组 给定一个二维数组 array&#xff0c;请返回「螺旋遍历」该数组的结果。 螺旋遍历&#xff1a;从左上角开始&#xff0c;按照 向右、向下、向左、向上 的顺序 依次 提取元素&#xff0c;然后再进入内部一层重复相同的步骤&#xff0c;直到提取完所有元…

C++ 分治

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 1.分治法 2.二分搜索 函数传参——数组 3.棋盘覆盖 4.合并排序 5.快速排序 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 1.分治法 基…

Spark常问面试题---项目总结

一、数据清洗&#xff0c;你都清洗什么&#xff1f;或者说 ETL 你是怎么做的&#xff1f; 我在这个项目主要清洗的式日志数据&#xff0c;日志数据传过来的json格式 去除掉无用的字段&#xff0c;过滤掉json格式不正确的脏数据 过滤清洗掉日志中缺少关键字段的数据&#xff…

基于智能语音交互的智能呼叫中心工作机制

在智能化和信息化不断进步的现代&#xff0c;智能呼叫中心为客户提供高质量、高效率的服务体验&#xff0c;提升众多品牌用户的满意度和忠诚度。作为实现智能呼叫中心的关键技术之一的智能语音交互技术&#xff0c;它通过集成自然语言处理&#xff08;NLP&#xff09;、语音识别…

Android Studio 右侧工具栏 Gradle 不显示 Task 列表

问题&#xff1a; android studio 4.2.1版本更新以后AS右侧工具栏Gradle Task列表不显示&#xff0c;这里需要手动去设置 解决办法&#xff1a; android studio 2024.2.1 Patch 2版本以前的版本设置&#xff1a;依次打开 File -> Settings -> Experimental 选项&#x…

SpringBoot集成Kafka和avro和Schema注册表

Schema注册表 为了提升kafka的性能&#xff0c;减少网络传输和存储的数据大小&#xff0c;可以把数据的schema部分单独存储到外部的schema注册表中&#xff0c;整体架构如下图所示&#xff1a; 1&#xff09;把所有数据需要用到的 schema 保存在注册表里&#xff0c;然后在记…

http(请求方法,状态码,Cookie与)

目录 1.http中常见的Header(KV结构) 2.http请求方法 2.1 请求方法 2.2 telnet 2.3 网页根目录 2.3.1 概念 2.3.2 构建一个首页 2.4 GET与POST方法 2.4.1 提交参数 2.4.2 GET与POST提交参数对比 2.4.3 GET和POST对比 3.状态码 3.1 状态码分类 3.2 3XXX状态码 3.2 …

十,[极客大挑战 2019]Secret File1

点击进入靶场 查看源代码 有个显眼的紫色文件夹&#xff0c;点击 点击secret看看 既然这样&#xff0c;那就回去查看源代码吧 好像没什么用 抓个包 得到一个文件名 404 如果包含"../"、"tp"、"input"或"data"&#xff0c;则输出"…