首页 > 其他分享 >CAD软件:GstarCAD二次开发

CAD软件:GstarCAD二次开发

时间:2024-10-14 12:48:38浏览次数:3  
标签:using doc tr Editor ed 二次开发 GstarCAD CAD

GstarCAD二次开发入门

在这里插入图片描述

1.1 二次开发概述

GstarCAD是一款功能强大的CAD软件,广泛应用于建筑设计、机械制造、电子工程等领域。二次开发是指在现有的GstarCAD软件基础上,通过编程技术扩展其功能,满足特定的业务需求。二次开发可以大大提升工作效率,帮助用户解决复杂的设计问题。

GstarCAD支持多种二次开发方式,包括LISP、VBA、.NET等。其中,.NET开发因其强大的功能和灵活性,成为最受欢迎的二次开发方式之一。.NET开发允许使用C#和VB.NET语言,通过调用GstarCAD的API来实现各种自定义功能。

1.2 .NET开发环境搭建

在开始GstarCAD的.NET二次开发之前,需要搭建合适的开发环境。以下是具体的步骤:

  1. 安装GstarCAD:确保已经安装了最新版本的GstarCAD软件。

  2. 安装Visual Studio:推荐使用Visual Studio 2019或以上版本,因为它提供了强大的开发工具和调试功能。

  3. 安装GstarCAD .NET API:GstarCAD提供了一个.NET API库,需要下载并安装。通常,这个API库可以在GstarCAD官方网站上找到。

1.3 创建第一个.NET插件

1.3.1 项目创建
  1. 打开Visual Studio,选择“文件” > “新建” > “项目”。

  2. 在“新建项目”对话框中,选择“类库(.NET Framework)”模板。

  3. 输入项目名称,例如“GstarCADPlugin”,选择项目保存位置,点击“创建”。

  4. 在项目创建完成后,右键点击解决方案资源管理器中的项目,选择“管理NuGet程序包”。

  5. 在NuGet包管理器中,搜索并安装“GstarCAD .NET API”。

1.3.2 编写代码

创建一个类文件,例如MyPlugin.cs,并编写以下代码:


using System;

using GstarCAD.DatabaseServices;

using GstarCAD.EditorInput;

using GstarCAD.Runtime;



[assembly: CommandClass(typeof(GstarCADPlugin.MyPlugin))]



namespace GstarCADPlugin

{

    public class MyPlugin

    {

        [CommandMethod("HelloWorld")]

        public void HelloWorld()

        {

            // 获取当前的文档和编辑器

            Document doc = Application.DocumentManager.MdiActiveDocument;

            Editor ed = doc.Editor;



            // 在命令行输出“Hello, GstarCAD!”

            ed.WriteMessage("\nHello, GstarCAD!");

        }

    }

}

1.3.3 编译和加载插件
  1. 在Visual Studio中,选择“生成” > “生成解决方案”。

  2. 生成完成后,找到生成的DLL文件,例如GstarCADPlugin.dll

  3. 打开GstarCAD,选择“工具” > “加载应用程序”。

  4. 在“加载应用程序”对话框中,找到并加载生成的DLL文件。

  5. 在GstarCAD命令行中输入HelloWorld,按回车键,应该会看到命令行输出“Hello, GstarCAD!”。

1.4 常用API介绍

GstarCAD .NET API提供了丰富的功能,以下是一些常用的API及其用法:

1.4.1 文档和编辑器
  • Document:表示当前的CAD文档。

  • Editor:用于与用户进行交互,例如提示用户输入、在命令行输出信息等。


using GstarCAD.DatabaseServices;

using GstarCAD.EditorInput;

using GstarCAD.Runtime;



public class MyPlugin

{

    [CommandMethod("DrawLine")]

    public void DrawLine()

    {

        Document doc = Application.DocumentManager.MdiActiveDocument;

        Editor ed = doc.Editor;



        // 提示用户输入起点和终点

        PromptPointResult startPrompt = ed.GetPoint("\n请输入起点:");

        PromptPointResult endPrompt = ed.GetPoint(startPrompt.Value, "\n请输入终点:");



        if (startPrompt.Status == PromptStatus.OK && endPrompt.Status == PromptStatus.OK)

        {

            // 获取起点和终点

            Point3d start = startPrompt.Value;

            Point3d end = endPrompt.Value;



            // 创建线段

            using (Transaction tr = doc.Database.TransactionManager.StartTransaction())

            {

                BlockTable blockTable = tr.GetObject(doc.Database.BlockTableId, OpenMode.ForRead) as BlockTable;

                BlockTableRecord blockTableRecord = tr.GetObject(blockTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;



                Line line = new Line(start, end);

                blockTableRecord.AppendEntity(line);

                tr.AddNewlyCreatedDBObject(line, true);

                tr.Commit();

            }

        }

    }

}

1.4.2 图形对象
  • Line:表示线段。

  • Circle:表示圆。

  • Polyline:表示多段线。


using GstarCAD.DatabaseServices;

using GstarCAD.EditorInput;

using GstarCAD.Runtime;



public class MyPlugin

{

    [CommandMethod("DrawCircle")]

    public void DrawCircle()

    {

        Document doc = Application.DocumentManager.MdiActiveDocument;

        Editor ed = doc.Editor;



        // 提示用户输入圆心和半径

        PromptPointResult centerPrompt = ed.GetPoint("\n请输入圆心:");

        PromptDistanceResult radiusPrompt = ed.GetDistance(centerPrompt.Value, "\n请输入半径:");



        if (centerPrompt.Status == PromptStatus.OK && radiusPrompt.Status == PromptStatus.OK)

        {

            // 获取圆心和半径

            Point3d center = centerPrompt.Value;

            double radius = radiusPrompt.Value;



            // 创建圆

            using (Transaction tr = doc.Database.TransactionManager.StartTransaction())

            {

                BlockTable blockTable = tr.GetObject(doc.Database.BlockTableId, OpenMode.ForRead) as BlockTable;

                BlockTableRecord blockTableRecord = tr.GetObject(blockTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;



                Circle circle = new Circle(center, Vector3d.ZAxis, radius);

                blockTableRecord.AppendEntity(circle);

                tr.AddNewlyCreatedDBObject(circle, true);

                tr.Commit();

            }

        }

    }

}

1.5 数据库操作

GstarCAD的数据库是其核心部分,通过数据库操作可以实现对图形对象的创建、修改和查询。

1.5.1 创建图形对象

创建图形对象的基本步骤如下:

  1. 获取当前的文档和数据库。

  2. 开始一个事务。

  3. 获取模型空间或当前的布局空间。

  4. 创建图形对象实例。

  5. 将图形对象添加到模型空间或布局空间。

  6. 提交事务。


using GstarCAD.DatabaseServices;

using GstarCAD.EditorInput;

using GstarCAD.Runtime;



public class MyPlugin

{

    [CommandMethod("DrawPolyline")]

    public void DrawPolyline()

    {

        Document doc = Application.DocumentManager.MdiActiveDocument;

        Editor ed = doc.Editor;



        // 提示用户输入多段线的顶点

        PromptPointResult pointPrompt = ed.GetPoint("\n请输入多段线的第一个顶点:");

        Point3dCollection points = new Point3dCollection();

        points.Add(pointPrompt.Value);



        while (true)

        {

            pointPrompt = ed.GetPoint(pointPrompt.Value, "\n请输入下一个顶点(回车结束):");

            if (pointPrompt.Status != PromptStatus.OK)

                break;



            points.Add(pointPrompt.Value);

        }



        if (points.Count > 1)

        {

            // 创建多段线

            using (Transaction tr = doc.Database.TransactionManager.StartTransaction())

            {

                BlockTable blockTable = tr.GetObject(doc.Database.BlockTableId, OpenMode.ForRead) as BlockTable;

                BlockTableRecord blockTableRecord = tr.GetObject(blockTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;



                Polyline polyline = new Polyline();

                foreach (Point3d point in points)

                {

                    polyline.AddVertexAt(polyline.NumberOfVertices, new Point2d(point.X, point.Y), 0, 0, 0);

                }



                blockTableRecord.AppendEntity(polyline);

                tr.AddNewlyCreatedDBObject(polyline, true);

                tr.Commit();

            }

        }

    }

}

1.5.2 修改图形对象

修改图形对象的基本步骤如下:

  1. 获取当前的文档和数据库。

  2. 开始一个事务。

  3. 获取要修改的图形对象。

  4. 修改图形对象的属性。

  5. 提交事务。


using GstarCAD.DatabaseServices;

using GstarCAD.EditorInput;

using GstarCAD.Runtime;



public class MyPlugin

{

    [CommandMethod("MoveLine")]

    public void MoveLine()

    {

        Document doc = Application.DocumentManager.MdiActiveDocument;

        Editor ed = doc.Editor;



        // 提示用户选择要移动的线段

        PromptEntityResult entityPrompt = ed.GetEntity("\n请选择要移动的线段:");



        if (entityPrompt.Status == PromptStatus.OK)

        {

            // 获取线段对象

            Line line = entityPrompt.ObjectId.GetObject(OpenMode.ForWrite) as Line;



            // 提示用户输入移动的向量

            PromptPointResult vectorPrompt = ed.GetPoint("\n请输入移动向量:");

            Vector3d vector = vectorPrompt.Value - line.StartPoint;



            // 移动线段

            line.StartPoint = line.StartPoint + vector;

            line.EndPoint = line.EndPoint + vector;



            // 提交事务

            line.Close();

        }

    }

}

1.5.3 查询图形对象

查询图形对象的基本步骤如下:

  1. 获取当前的文档和数据库。

  2. 开始一个事务。

  3. 使用过滤器或遍历方式查找图形对象。

  4. 处理查询结果。

  5. 提交事务。


using GstarCAD.DatabaseServices;

using GstarCAD.EditorInput;

using GstarCAD.Runtime;



public class MyPlugin

{

    [CommandMethod("FindLines")]

    public void FindLines()

    {

        Document doc = Application.DocumentManager.MdiActiveDocument;

        Editor ed = doc.Editor;



        // 查询模型空间中的所有线段

        using (Transaction tr = doc.Database.TransactionManager.StartTransaction())

        {

            BlockTable blockTable = tr.GetObject(doc.Database.BlockTableId, OpenMode.ForRead) as BlockTable;

            BlockTableRecord blockTableRecord = tr.GetObject(blockTable[BlockTableRecord.ModelSpace], OpenMode.ForRead) as BlockTableRecord;



            TypedValue[] filterList = new TypedValue[] {

                new TypedValue((int)DxfCode.Start, "LINE")

            };



            SelectionSet ss = ed.SelectAll(filterList).Value;



            if (ss != null && ss.Count > 0)

            {

                foreach (SelectedObject selectedObject in ss)

                {

                    if (selectedObject.Status == SelectedStatus.Only)

                    {

                        Line line = selectedObject.ObjectId.GetObject(OpenMode.ForRead) as Line;

                        if (line != null)

                        {

                            // 输出线段的起点和终点

                            ed.WriteMessage($"\n线段起点:{line.StartPoint},终点:{line.EndPoint}");

                        }

                    }

                }

            }



            tr.Commit();

        }

    }

}

1.6 用户界面开发

GstarCAD .NET API不仅支持图形对象的创建和修改,还支持自定义用户界面的开发。通过编写对话框或命令行提示,可以实现与用户的交互。

1.6.1 创建对话框

创建对话框的基本步骤如下:

  1. 创建一个Windows窗体应用程序或WPF应用程序。

  2. 在主窗体中添加所需的控件。

  3. 在GstarCAD插件中调用窗体。


using System.Windows.Forms;

using GstarCAD.DatabaseServices;

using GstarCAD.EditorInput;

using GstarCAD.Runtime;



public class MyPlugin

{

    [CommandMethod("ShowForm")]

    public void ShowForm()

    {

        Document doc = Application.DocumentManager.MdiActiveDocument;

        Editor ed = doc.Editor;



        // 创建并显示对话框

        MyForm form = new MyForm();

        form.ShowDialog();

    }

}



public class MyForm : Form

{

    public MyForm()

    {

        this.Text = "自定义对话框";

        this.Width = 300;

        this.Height = 200;



        Button btnDrawLine = new Button();

        btnDrawLine.Text = "绘制线段";

        btnDrawLine.Location = new System.Drawing.Point(50, 50);

        btnDrawLine.Click += (sender, e) => {

            Document doc = Application.DocumentManager.MdiActiveDocument;

            Editor ed = doc.Editor;



            // 提示用户输入起点和终点

            PromptPointResult startPrompt = ed.GetPoint("\n请输入起点:");

            PromptPointResult endPrompt = ed.GetPoint(startPrompt.Value, "\n请输入终点:");



            if (startPrompt.Status == PromptStatus.OK && endPrompt.Status == PromptStatus.OK)

            {

                // 获取起点和终点

                Point3d start = startPrompt.Value;

                Point3d end = endPrompt.Value;



                // 创建线段

                using (Transaction tr = doc.Database.TransactionManager.StartTransaction())

                {

                    BlockTable blockTable = tr.GetObject(doc.Database.BlockTableId, OpenMode.ForRead) as BlockTable;

                    BlockTableRecord blockTableRecord = tr.GetObject(blockTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;



                    Line line = new Line(start, end);

                    blockTableRecord.AppendEntity(line);

                    tr.AddNewlyCreatedDBObject(line, true);

                    tr.Commit();

                }

            }



            this.Close();

        };



        this.Controls.Add(btnDrawLine);

    }

}

1.6.2 命令行提示

命令行提示是一种简单的用户交互方式,通过命令行可以获取用户的输入信息,并根据输入执行相应的操作。


using GstarCAD.DatabaseServices;

using GstarCAD.EditorInput;

using GstarCAD.Runtime;



public class MyPlugin

{

    [CommandMethod("DrawRectangle")]

    public void DrawRectangle()

    {

        Document doc = Application.DocumentManager.MdiActiveDocument;

        Editor ed = doc.Editor;



        // 提示用户输入矩形的对角线顶点

        PromptPointResult corner1Prompt = ed.GetPoint("\n请输入矩形的第一个顶点:");

        PromptPointResult corner2Prompt = ed.GetPoint(corner1Prompt.Value, "\n请输入矩形的第二个顶点:");



        if (corner1Prompt.Status == PromptStatus.OK && corner2Prompt.Status == PromptStatus.OK)

        {

            // 获取对角线顶点

            Point3d corner1 = corner1Prompt.Value;

            Point3d corner2 = corner2Prompt.Value;



            // 计算矩形的其他两个顶点

            Point3d corner3 = new Point3d(corner2.X, corner1.Y, corner1.Z);

            Point3d corner4 = new Point3d(corner1.X, corner2.Y, corner1.Z);



            // 创建矩形

            using (Transaction tr = doc.Database.TransactionManager.StartTransaction())

            {

                BlockTable blockTable = tr.GetObject(doc.Database.BlockTableId, OpenMode.ForRead) as BlockTable;

                BlockTableRecord blockTableRecord = tr.GetObject(blockTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;



                Polyline polyline = new Polyline();

                polyline.AddVertexAt(0, new Point2d(corner1.X, corner1.Y), 0, 0, 0);

                polyline.AddVertexAt(1, new Point2d(corner2.X, corner2.Y), 0, 0, 0);

                polyline.AddVertexAt(2, new Point2d(corner4.X, corner4.Y), 0, 0, 0);

                polyline.AddVertexAt(3, new Point2d(corner3.X, corner3.Y), 0, 0, 0);

                polyline.Closed = true;



                blockTableRecord.AppendEntity(polyline);

                tr.AddNewlyCreatedDBObject(polyline, true);

                tr.Commit();

            }

        }

    }

}

1.7 错误处理和调试

在开发过程中,错误处理和调试是非常重要的环节。GstarCAD .NET API提供了一些工具和方法来帮助开发者进行错误处理和调试。

1.7.1 错误处理

使用try-catch语句来捕获和处理异常,确保插件的健壮性和用户体验。


using GstarCAD.DatabaseServices;

using GstarCAD.EditorInput;

using GstarCAD.Runtime;



public class MyPlugin

{

    [CommandMethod("DrawLineWithErrorHandling")]

    public void DrawLineWithErrorHandling()

    {

        Document doc = Application.DocumentManager.MdiActiveDocument;

        Editor ed = doc.Editor;



        try

        {

            // 提示用户输入起点和终点

            PromptPointResult startPrompt = ed.GetPoint("\n请输入起点:");

            PromptPointResult endPrompt = ed.GetPoint(startPrompt.Value, "\n请输入终点:");



            if (startPrompt.Status == PromptStatus.OK && endPrompt.Status == PromptStatus.OK)

            {

                // 获取起点和终点

                Point3d start = startPrompt.Value;

                Point3d end = endPrompt.Value;



                // 创建线段

                using (Transaction tr = doc.Database.TransactionManager.StartTransaction())

                {

                    BlockTable blockTable = tr.GetObject(doc.Database.BlockTableId, OpenMode.ForRead) as BlockTable;

                    BlockTableRecord blockTableRecord = tr.GetObject(blockTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;



                    Line line = new Line(start, end);

                    blockTableRecord.AppendEntity(line);

                    tr.AddNewlyCreatedDBObject(line, true);

                    tr.Commit();

                }

            }

        }

        catch (System.Exception ex)

        {

            // 输出错误信息

            ed.WriteMessage($"\n发生错误:{ex.Message}");

        }

    }

}

1.7.2 调试

在Visual Studio中,可以通过设置断点、单步调试等方式来调试GstarCAD插件。以下是一些常用的调试技巧:

  1. 设置断点:在代码的关键位置设置断点,以便在运行时暂停并检查变量的值。

  2. 单步调试:使用F10或F11键单步执行代码,观察每一步的变化。

  3. 查看调用堆栈:在调试过程中,查看调用堆栈可以帮助理解代码的执行流程。

  4. 使用即时窗口:在调试过程中,可以使用即时窗口(Immediate Window)来执行代码片段,测试某些功能。

1.8 插件打包和分发

开发完成后,需要将插件打包并分发给用户。以下是具体的步骤### 1.8 插件打包和分发

开发完成后,需要将插件打包并分发给用户。以下是具体的步骤:

1.8.1 打包插件
  1. 生成DLL文件:在Visual Studio中,选择“生成” > “生成解决方案”,确保插件项目能够成功编译生成DLL文件。

  2. 创建配置文件:如果插件需要配置文件(例如app.config),确保配置文件与生成的DLL文件一起打包。

  3. 创建资源文件:如果插件需要使用资源文件(例如图片、图标等),确保这些资源文件也包含在打包文件中。

1.8.2 打包工具

使用一些打包工具可以简化插件的打包过程,例如:

  • Visual Studio内置的发布工具:可以使用Visual Studio的发布功能,选择“发布” > “创建发布配置文件”,生成包含所有必要文件的安装包。

  • 第三方打包工具:例如Inno Setup、NSIS等,这些工具提供更灵活的打包选项和安装脚本。

1.8.3 分发插件
  1. 提供安装包:将生成的安装包提供给用户,用户可以通过双击安装包来安装插件。

  2. 手动加载:用户也可以手动将生成的DLL文件加载到GstarCAD中:

    • 打开GstarCAD,选择“工具” > “加载应用程序”。

    • 在“加载应用程序”对话框中,找到并加载生成的DLL文件。

  3. 编写安装说明:提供详细的安装说明,帮助用户顺利安装和使用插件。

1.9 示例项目

为了更好地理解GstarCAD .NET二次开发的全过程,以下是一个完整的示例项目,包括创建、编译、加载和使用插件。

1.9.1 项目创建
  1. 打开Visual Studio,选择“文件” > “新建” > “项目”。

  2. 在“新建项目”对话框中,选择“类库(.NET Framework)”模板。

  3. 输入项目名称,例如“GstarCADExamplePlugin”,选择项目保存位置,点击“创建”。

  4. 在项目创建完成后,右键点击解决方案资源管理器中的项目,选择“管理NuGet程序包”。

  5. 在NuGet包管理器中,搜索并安装“GstarCAD .NET API”。

1.9.2 编写代码

创建一个类文件,例如ExamplePlugin.cs,并编写以下代码:


using System;

using GstarCAD.DatabaseServices;

using GstarCAD.EditorInput;

using GstarCAD.Runtime;



[assembly: CommandClass(typeof(GstarCADExamplePlugin.ExamplePlugin))]



namespace GstarCADExamplePlugin

{

    public class ExamplePlugin

    {

        [CommandMethod("DrawLineExample")]

        public void DrawLineExample()

        {

            Document doc = Application.DocumentManager.MdiActiveDocument;

            Editor ed = doc.Editor;



            try

            {

                // 提示用户输入起点和终点

                PromptPointResult startPrompt = ed.GetPoint("\n请输入起点:");

                PromptPointResult endPrompt = ed.GetPoint(startPrompt.Value, "\n请输入终点:");



                if (startPrompt.Status == PromptStatus.OK && endPrompt.Status == PromptStatus.OK)

                {

                    // 获取起点和终点

                    Point3d start = startPrompt.Value;

                    Point3d end = endPrompt.Value;



                    // 创建线段

                    using (Transaction tr = doc.Database.TransactionManager.StartTransaction())

                    {

                        BlockTable blockTable = tr.GetObject(doc.Database.BlockTableId, OpenMode.ForRead) as BlockTable;

                        BlockTableRecord blockTableRecord = tr.GetObject(blockTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;



                        Line line = new Line(start, end);

                        blockTableRecord.AppendEntity(line);

                        tr.AddNewlyCreatedDBObject(line, true);

                        tr.Commit();

                    }

                }

            }

            catch (System.Exception ex)

            {

                // 输出错误信息

                ed.WriteMessage($"\n发生错误:{ex.Message}");

            }

        }



        [CommandMethod("DrawCircleExample")]

        public void DrawCircleExample()

        {

            Document doc = Application.DocumentManager.MdiActiveDocument;

            Editor ed = doc.Editor;



            try

            {

                // 提示用户输入圆心和半径

                PromptPointResult centerPrompt = ed.GetPoint("\n请输入圆心:");

                PromptDistanceResult radiusPrompt = ed.GetDistance(centerPrompt.Value, "\n请输入半径:");



                if (centerPrompt.Status == PromptStatus.OK && radiusPrompt.Status == PromptStatus.OK)

                {

                    // 获取圆心和半径

                    Point3d center = centerPrompt.Value;

                    double radius = radiusPrompt.Value;



                    // 创建圆

                    using (Transaction tr = doc.Database.TransactionManager.StartTransaction())

                    {

                        BlockTable blockTable = tr.GetObject(doc.Database.BlockTableId, OpenMode.ForRead) as BlockTable;

                        BlockTableRecord blockTableRecord = tr.GetObject(blockTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;



                        Circle circle = new Circle(center, Vector3d.ZAxis, radius);

                        blockTableRecord.AppendEntity(circle);

                        tr.AddNewlyCreatedDBObject(circle, true);

                        tr.Commit();

                    }

                }

            }

            catch (System.Exception ex)

            {

                // 输出错误信息

                ed.WriteMessage($"\n发生错误:{ex.Message}");

            }

        }



        [CommandMethod("FindLinesExample")]

        public void FindLinesExample()

        {

            Document doc = Application.DocumentManager.MdiActiveDocument;

            Editor ed = doc.Editor;



            try

            {

                // 查询模型空间中的所有线段

                using (Transaction tr = doc.Database.TransactionManager.StartTransaction())

                {

                    BlockTable blockTable = tr.GetObject(doc.Database.BlockTableId, OpenMode.ForRead) as BlockTable;

                    BlockTableRecord blockTableRecord = tr.GetObject(blockTable[BlockTableRecord.ModelSpace], OpenMode.ForRead) as BlockTableRecord;



                    TypedValue[] filterList = new TypedValue[] {

                        new TypedValue((int)DxfCode.Start, "LINE")

                    };



                    SelectionSet ss = ed.SelectAll(filterList).Value;



                    if (ss != null && ss.Count > 0)

                    {

                        foreach (SelectedObject selectedObject in ss)

                        {

                            if (selectedObject.Status == SelectedStatus.Only)

                            {

                                Line line = selectedObject.ObjectId.GetObject(OpenMode.ForRead) as Line;

                                if (line != null)

                                {

                                    // 输出线段的起点和终点

                                    ed.WriteMessage($"\n线段起点:{line.StartPoint},终点:{line.EndPoint}");

                                }

                            }

                        }

                    }



                    tr.Commit();

                }

            }

            catch (System.Exception ex)

            {

                // 输出错误信息

                ed.WriteMessage($"\n发生错误:{ex.Message}");

            }

        }



        [CommandMethod("ShowFormExample")]

        public void ShowFormExample()

        {

            Document doc = Application.DocumentManager.MdiActiveDocument;

            Editor ed = doc.Editor;



            try

            {

                // 创建并显示对话框

                MyForm form = new MyForm();

                form.ShowDialog();

            }

            catch (System.Exception ex)

            {

                // 输出错误信息

                ed.WriteMessage($"\n发生错误:{ex.Message}");

            }

        }

    }



    public class MyForm : Form

    {

        public MyForm()

        {

            this.Text = "自定义对话框";

            this.Width = 300;

            this.Height = 200;



            Button btnDrawLine = new Button();

            btnDrawLine.Text = "绘制线段";

            btnDrawLine.Location = new System.Drawing.Point(50, 50);

            btnDrawLine.Click += (sender, e) => {

                Document doc = Application.DocumentManager.MdiActiveDocument;

                Editor ed = doc.Editor;



                // 提示用户输入起点和终点

                PromptPointResult startPrompt = ed.GetPoint("\n请输入起点:");

                PromptPointResult endPrompt = ed.GetPoint(startPrompt.Value, "\n请输入终点:");



                if (startPrompt.Status == PromptStatus.OK && endPrompt.Status == PromptStatus.OK)

                {

                    // 获取起点和终点

                    Point3d start = startPrompt.Value;

                    Point3d end = endPrompt.Value;



                    // 创建线段

                    using (Transaction tr = doc.Database.TransactionManager.StartTransaction())

                    {

                        BlockTable blockTable = tr.GetObject(doc.Database.BlockTableId, OpenMode.ForRead) as BlockTable;

                        BlockTableRecord blockTableRecord = tr.GetObject(blockTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;



                        Line line = new Line(start, end);

                        blockTableRecord.AppendEntity(line);

                        tr.AddNewlyCreatedDBObject(line, true);

                        tr.Commit();

                    }

                }



                this.Close();

            };



            this.Controls.Add(btnDrawLine);

        }

    }

}

1.9.3 编译和加载插件
  1. 编译项目:在Visual Studio中,选择“生成” > “生成解决方案”,生成所需的DLL文件。

  2. 找到生成的DLL文件:通常,生成的DLL文件位于项目的bin\Debugbin\Release目录下。

  3. 加载插件

    • 打开GstarCAD,选择“工具” > “加载应用程序”。

    • 在“加载应用程序”对话框中,找到并加载生成的DLL文件,例如GstarCADExamplePlugin.dll

  4. 测试插件

    • 在GstarCAD命令行中输入DrawLineExample,按回车键,应该会看到命令行提示用户输入起点和终点,并绘制一条线段。

    • 输入DrawCircleExample,按回车键,应该会看到命令行提示用户输入圆心和半径,并绘制一个圆。

    • 输入FindLinesExample,按回车键,应该会看到命令行输出模型空间中所有线段的起点和终点。

    • 输入ShowFormExample,按回车键,应该会弹出一个自定义对话框,用户可以点击按钮绘制线段。

1.10 高级主题

1.10.1 事件处理

GstarCAD .NET API支持事件处理,可以在特定的事件发生时执行自定义操作。例如,监听文档打开、关闭等事件。


using GstarCAD.ApplicationServices;

using GstarCAD.DatabaseServices;

using GstarCAD.EditorInput;

using GstarCAD.Runtime;



[assembly: CommandClass(typeof(GstarCADExamplePlugin.EventHandlingPlugin))]



namespace GstarCADExamplePlugin

{

    public class EventHandlingPlugin

    {

        [CommandMethod("StartEventHandling")]

        public void StartEventHandling()

        {

            Document doc = Application.DocumentManager.MdiActiveDocument;

            Editor ed = doc.Editor;



            // 注册文档打开事件

            Application.DocumentManager.DocumentOpened += (sender, e) =>

            {

                ed.WriteMessage("\n文档已打开");

            };



            // 注册文档关闭事件

            Application.DocumentManager.DocumentClosing += (sender, e) =>

            {

                ed.WriteMessage("\n文档即将关闭");

            };



            ed.WriteMessage("\n事件处理已启动");

        }



        [CommandMethod("StopEventHandling")]

        public void StopEventHandling()

        {

            Document doc = Application.DocumentManager.MdiActiveDocument;

            Editor ed = doc.Editor;



            // 注销文档打开事件

            Application.DocumentManager.DocumentOpened -= (sender, e) =>

            {

                ed.WriteMessage("\n文档已打开");

            };



            // 注销文档关闭事件

            Application.DocumentManager.DocumentClosing -= (sender, e) =>

            {

                ed.WriteMessage("\n文档即将关闭");

            };



            ed.WriteMessage("\n事件处理已停止");

        }

    }

}

1.10.2 个性化设置

通过GstarCAD .NET API,可以实现对用户界面的个性化设置,例如更改命令行颜色、设置默认图层等。


using GstarCAD.ApplicationServices;

using GstarCAD.DatabaseServices;

using GstarCAD.EditorInput;

using GstarCAD.Runtime;



[assembly: CommandClass(typeof(GstarCADExamplePlugin.PersonalizationPlugin))]



namespace GstarCADExamplePlugin

{

    public class PersonalizationPlugin

    {

        [CommandMethod("SetCommandLineColor")]

        public void SetCommandLineColor()

        {

            Document doc = Application.DocumentManager.MdiActiveDocument;

            Editor ed = doc.Editor;



            // 设置命令行颜色为红色

            ed.CommandLineColor = System.Drawing.Color.Red;



            ed.WriteMessage("\n命令行颜色已设置为红色");

        }



        [CommandMethod("SetDefaultLayer")]

        public void SetDefaultLayer()

        {

            Document doc = Application.DocumentManager.MdiActiveDocument;

            Editor ed = doc.Editor;



            using (Transaction tr = doc.Database.TransactionManager.StartTransaction())

            {

                // 获取图层表

                LayerTable layerTable = tr.GetObject(doc.Database.LayerTableId, OpenMode.ForRead) as LayerTable;



                // 创建新的图层

                string layerName = "MyLayer";

                LayerTableRecord layerTableRecord = new LayerTableRecord { Name = layerName };

                layerTable.UpgradeOpen();

                layerTable.Add(layerTableRecord);

                tr.AddNewlyCreatedDBObject(layerTableRecord, true);



                // 设置默认图层

                doc.Database.Clayer = layerTableRecord.ObjectId;



                tr.Commit();

            }



            ed.WriteMessage($"\n默认图层已设置为:{layerName}");

        }

    }

}

1.11 总结

通过本指南,您应该已经掌握了GstarCAD .NET二次开发的基本步骤和常用API。二次开发不仅可以扩展GstarCAD的功能,还可以提高工作效率,解决复杂的设计问题。希望这些内容对您有所帮助,祝您开发顺利!

如果您有任何问题或需要进一步的帮助,请参考GstarCAD的官方文档和开发社区。

标签:using,doc,tr,Editor,ed,二次开发,GstarCAD,CAD
From: https://blog.csdn.net/weixin_42749425/article/details/142907878

相关文章

  • AutoCAD C# RIBBOIN自动加载的研究
    创建自定义类publicstructAutoCADDllCommand{publicstringAssemblyName;publicstringclsName;publicstringMethodName;publicstringMacro;publicMethodInfoMethodInfo;}publicclassMyRibbonTab{publicstri......
  • 制图软件cad百度云下载与安装(附详细教程)
    如大家所熟悉的,CAD是一款自动计算机辅助设计软件,用于二维绘图、详细绘制、设计文档和基本三维设计,现已经成为国际上广为流行的绘图工具。不得不承认,CAD具有良好的用户界面,通过交互菜单或命令行方式便可以进行各种操作。它的多文档设计环境,让非计算机专业人员也能很快地学会使......
  • 一款Java CMS 网站管理系统,基于RuoYi-fast二次开发,网站后台采用SpringBoot + MyBati
    一款JavaCMS网站管理系统基于RuoYi-fast二次开发,网站后台采用SpringBoot+MyBatis文章目录前言一、开源地址二、环境要求三、功能亮点3.1扩展功能3.2内置功能四、安装方法4.1、拉取源码4.2、修改数据库链接配置4.3、创建数据库并导入数据4.4、配置资源上传......
  • dwg解析-样条曲线拟合点解析(中望CAD导出)
    dwg解析-样条曲线拟合点解析(中望CAD导出)中望CAD导出的dwg文件,其中样条曲线拟合点解析出的结果出拟合点和起始点的方向,解析代码如下:/harrayistheHandle(TColgp_HArray1OfPnt)containingthesampledcirclepointsintheYZplaneatPI/4,PI/2,3/2PIand2PIGeomAPI_......
  • opencascade AIS_WalkDelta、AIS_ViewInputBuffer源码学习工作
    opencascadeAIS_WalkDelta前言运行方法1.空构造函数。AIS_WalkDelta():myIsDefined(false),myIsJumping(false),myIsCrouching(false),myIsRunning(false){}2.返回平移组件。constAIS_WalkPart&operator[](AIS_WalkTranslationthePart);3.返回平移组件。A......
  • Paper Reading: Deep balanced cascade forest: An novel fault diagnosis method for
    目录研究动机文章贡献本文方法混合采样新型平衡森林DBCF整体流程实验结果数据集和实验设置对比故障诊断方法对比基于决策树的方法对比不平衡分类方法模型效率的比较优点和创新点PaperReading是从个人角度进行的一些总结分享,受到个人关注点的侧重和实力所限,可能有理解不到位的......
  • opencascade TopoDS_AlertWithShape源码学习
    opencascadeTopoDS_AlertWithShape前言一种特定的对象(我们称之为Alert对象),该对象在其内部字段中存储了一个TopoDS形状方法1带有形状参数的构造函数TopoDS_AlertWithShape(constTopoDS_Shape&theShape);2返回包含的形状TopoDS_Shape&GetShape();3设置形状voidSe......
  • opencascade TopoDS_Shape源码学习【重中之重】
    opencascadeTopoDS_Shape前言描述了一个形状,它引用了一个基础形状,该基础形状有可能被赋予一个位置和方向为基础形状提供了一个位置,定义了它在本地坐标系中的位置为基础形状提供了一个方向,这是从几何学的角度(而不是相对于其他形状的方向)来定义的。注意:如果一个形状引用的基础......
  • opencascade TopoDS_Iterator源码学习拓扑迭代器
    opencascadeTopoDS_Iterator前言遍历给定TopoDS_Shape对象的底层形状,提供对其组件子形状的访问。每个组件形状作为带有方向的TopoDS_Shape返回,并且由原始值和相对值组成的复合体。方法1//!创建一个空的迭代器。TopoDS_Iterator();2//!子形状上创建一个迭代器。如......
  • opencascade Bnd_B3f源码学习 包围盒
    opencascadeBnd_B3f方法1//!空构造函数。Bnd_B3f();2//!构造函数。Bnd_B3f(constgp_XYZ&theCenter,constgp_XYZ&theHSize);3//!如果盒子是空的(未初始化),则返回True。Standard_BooleanIsVoid()const;4//!重置盒子数据。voidClear();5//!通过一个点更......