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

news2024/12/27 5:26:26

摘要: 本文详细介绍了如何使用 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),半径为 3
        Circle 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.coloradmin.cn/o/2253260.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

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

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

「Mac畅玩鸿蒙与硬件36」UI互动应用篇13 - 数字滚动抽奖器

本篇将带你实现一个简单的数字滚动抽奖器。用户点击按钮后&#xff0c;屏幕上的数字会以滚动动画的形式随机变动&#xff0c;最终显示一个抽奖数字。这个项目展示了如何结合定时器、状态管理和动画实现一个有趣的互动应用。 关键词 UI互动应用数字滚动动画效果状态管理用户交…

Selenium3+Python如何操作键盘

selenium操作键盘&#xff0c;需要导入Keys类&#xff1a;“from selenium.webdriver.common.keys import Keys” 调用键盘操作的快捷键的方法 &#xff1a; 单键值&#xff1a;直接传入对应的键值“element.send_keys”(快捷键的键值) 组合键&#xff1a;键值之间由逗号分隔…

从技术视角看AI在Facebook全球化中的作用

在全球化日益加深的今天&#xff0c;人工智能&#xff08;AI&#xff09;作为一种变革性技术&#xff0c;正在深刻影响全球互联网巨头的发展方向。Facebook作为全球最大的社交媒体平台之一&#xff0c;正通过AI技术突破语言、文化和技术的障碍&#xff0c;推动全球化战略的实现…

jmeter 压测常用静默参数解释应用

简介&#xff1a; JMeter静默压测&#xff08;即无界面压测&#xff09;是一种常用的性能测试方法&#xff0c;用于模拟多个用户同时访问系统并测量系统的响应时间和吞吐量等关键性能指标。在JMeter静默压测中&#xff0c;常用的压测参数及其解释如下&#xff1a; 一、基本…

【机器学习】分类任务: 二分类与多分类

二分类与多分类&#xff1a;概念与区别 二分类和多分类是分类任务的两种类型&#xff0c;区分的核心在于目标变量&#xff08;label&#xff09;的类别数&#xff1a; 二分类&#xff1a;目标变量 y 只有两个类别&#xff0c;通常记为 y∈{0,1} 或 y∈{−1,1}。 示例&#xff…

【自用】管材流转项目前端重部署流程 vue2 webpackage4 vuecli4

一、配置 1.下载项目&#xff0c;使用 IDEA 打开&#xff0c;并配置 Nodejs 它提示我&#xff0c;需要 Node.js&#xff0c;因为 nodejs 14 的 installer 已经官网已经找不到了&#xff0c;使用 fnm 又太麻烦&#xff0c; 所以直接采用在 IDEA 中下载的方式就好了。 2.清除缓…

java调用ai模型:使用国产通义千问完成基于知识库的问答

整体介绍&#xff1a; 基于RAG&#xff08;Retrieval-Augmented Generation&#xff09;技术&#xff0c;可以实现一个高效的Java智能问答客服机器人。核心思路是将预先准备的问答QA文档&#xff08;例如Word格式文件&#xff09;导入系统&#xff0c;通过数据清洗、向量化处理…

跨平台应用开发框架(4)----Qt(系统篇)

目录 1.Qt事件 1.事件来源 2.事件处理 3.按键事件 1.组合按键 4.鼠标事件 1.鼠标单击事件 2.鼠标释放事件 3.鼠标双击事件 4.鼠标移动事件 5.滚轮事件 5.定时器 1.QTimerEvent类 2.QTimer 类 3.获取系统日期及时间 6.事件分发器 7.事件过滤器 2.Qt文件 1.输入…

算法刷题Day8:BM30 二叉搜索树与双向链表

题目 牛客网题目传送门 思路 对二叉搜索树进行中序遍历&#xff0c;结果就是按序数组。因此想办法把前面遍历过的节点给记下来&#xff0c;记作pre。当遍历到某个节点node的时候&#xff0c;令前驱指向pre&#xff0c;然后让pre的后驱指向node。 代码 class TreeNode:def…

MySQL--视图

目录 1 认识视图 1.1 视图的定义 1.1 创建视图 1.2 查询 1.3 修改 1.4 删除 1.5 视图的优缺点 1.5.1 优点 1.5.2 缺点 1.6 视图的类型 1.7 视图与物化视图 2 视图检查选项 2.1 CASCADED 2.2 LOCAL 3 视图更新及作用 3.1 视图案列结合 3.1.1 屏蔽敏感数据 3.1…

基于Matlab高速动车组转臂定位橡胶节点刚度对车辆动力学影响仿真研究

本研究针对高速动车组转臂定位系统中橡胶节点的刚度对车辆动力学性能的影响进行仿真研究。随着高速铁路的发展&#xff0c;动车组的运行稳定性和舒适性成为设计和运营的核心问题&#xff0c;其中&#xff0c;转臂定位系统作为动车组悬挂系统的重要组成部分&#xff0c;其性能对…

并发专题(8)之JUC阻塞容器源码剖析

一、ArrayBlockingQueue源码剖析 ArrayBlockingQueue底层是采用数组实现的一个队列。因为底层是数据&#xff0c;一般被成为有界队列、其阻塞模式是基于ReentrantLock来实现的。 // 存数据操作 add(E),offer(E),put(E)&#xff0c;offer(E,time,unit) // add(E)&#xff1a;添加…

AI/ML 基础知识与常用术语全解析

目录 一.引言 二.AI/ML 基础知识 1.人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09; (1).定义 (2).发展历程 (3).应用领域 2.机器学习&#xff08;Machine Learning&#xff0c;ML&#xff09; (1).定义 (2).学习方式 ①.监督学习 ②.无监督…

【WRF-Urban】WPS中有关Urban的变量设置

【WRF-Urban】WPS中有关Urban的变量设置 地理数据源的配置WRF-Urban所需静态地理数据1、LANDUSE&#xff1a;包含城市地表分类的土地利用数据。2、URB_PARAM&#xff1a;城市参数数据集。3、FRC_URB2D&#xff1a;城市覆盖度数据集 WRF默认设置&#xff08;美国&#xff09;数据…

NVR录像机汇聚管理EasyNVR多个NVR同时管理基于B/S架构的技术特点与能力应用

EasyNVR视频融合平台基于云边端协同设计&#xff0c;能够轻松接入并管理海量的视频数据。该平台兼容性强、拓展灵活&#xff0c;提供了视频监控直播、录像存储、云存储服务、回放检索以及平台级联等一系列功能。B/S架构使得EasyNVR实现了视频监控的多元化兼容与高效管理。 其采…

c++预编译头文件

文章目录 c预编译头文件1.使用g编译预编译头文件2.使用visual studio进行预编译头文件2.1visual studio如何设置输出预处理文件&#xff08;.i文件&#xff09;2.2visual studio 如何设置预编译&#xff08;初始创建空项目的情况下&#xff09;2.3 visual studio打开输出编译时…

Zookeeper的通知机制是什么?

大家好&#xff0c;我是锋哥。今天分享关于【Zookeeper的通知机制是什么?】面试题。希望对大家有帮助&#xff1b; Zookeeper的通知机制是什么? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Zookeeper的通知机制主要通过Watcher实现&#xff0c;它是Zookeeper客…

基于Pyside6开发一个通用的在线升级工具

UI main.ui <?xml version"1.0" encoding"UTF-8"?> <ui version"4.0"><class>MainWindow</class><widget class"QMainWindow" name"MainWindow"><property name"geometry"&…

开源 - Ideal库 - Excel帮助类,ExcelHelper实现(四)

书接上回&#xff0c;前面章节已经实现Excel帮助类的第一步TableHeper的对象集合与DataTable相互转换功能&#xff0c;今天实现进入其第二步的核心功能ExcelHelper实现。 01、接口设计 下面我们根据第一章中讲解的核心设计思路&#xff0c;先进行接口设计&#xff0c;确定Exce…