GstarCAD二次开发入门
1.1 二次开发概述
GstarCAD是一款功能强大的CAD软件,广泛应用于建筑设计、机械制造、电子工程等领域。二次开发是指在现有的GstarCAD软件基础上,通过编程技术扩展其功能,满足特定的业务需求。二次开发可以大大提升工作效率,帮助用户解决复杂的设计问题。
GstarCAD支持多种二次开发方式,包括LISP、VBA、.NET等。其中,.NET开发因其强大的功能和灵活性,成为最受欢迎的二次开发方式之一。.NET开发允许使用C#和VB.NET语言,通过调用GstarCAD的API来实现各种自定义功能。
1.2 .NET开发环境搭建
在开始GstarCAD的.NET二次开发之前,需要搭建合适的开发环境。以下是具体的步骤:
-
安装GstarCAD:确保已经安装了最新版本的GstarCAD软件。
-
安装Visual Studio:推荐使用Visual Studio 2019或以上版本,因为它提供了强大的开发工具和调试功能。
-
安装GstarCAD .NET API:GstarCAD提供了一个.NET API库,需要下载并安装。通常,这个API库可以在GstarCAD官方网站上找到。
1.3 创建第一个.NET插件
1.3.1 项目创建
-
打开Visual Studio,选择“文件” > “新建” > “项目”。
-
在“新建项目”对话框中,选择“类库(.NET Framework)”模板。
-
输入项目名称,例如“GstarCADPlugin”,选择项目保存位置,点击“创建”。
-
在项目创建完成后,右键点击解决方案资源管理器中的项目,选择“管理NuGet程序包”。
-
在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 编译和加载插件
-
在Visual Studio中,选择“生成” > “生成解决方案”。
-
生成完成后,找到生成的DLL文件,例如
GstarCADPlugin.dll
。 -
打开GstarCAD,选择“工具” > “加载应用程序”。
-
在“加载应用程序”对话框中,找到并加载生成的DLL文件。
-
在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 创建图形对象
创建图形对象的基本步骤如下:
-
获取当前的文档和数据库。
-
开始一个事务。
-
获取模型空间或当前的布局空间。
-
创建图形对象实例。
-
将图形对象添加到模型空间或布局空间。
-
提交事务。
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 修改图形对象
修改图形对象的基本步骤如下:
-
获取当前的文档和数据库。
-
开始一个事务。
-
获取要修改的图形对象。
-
修改图形对象的属性。
-
提交事务。
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 查询图形对象
查询图形对象的基本步骤如下:
-
获取当前的文档和数据库。
-
开始一个事务。
-
使用过滤器或遍历方式查找图形对象。
-
处理查询结果。
-
提交事务。
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 创建对话框
创建对话框的基本步骤如下:
-
创建一个Windows窗体应用程序或WPF应用程序。
-
在主窗体中添加所需的控件。
-
在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插件。以下是一些常用的调试技巧:
-
设置断点:在代码的关键位置设置断点,以便在运行时暂停并检查变量的值。
-
单步调试:使用F10或F11键单步执行代码,观察每一步的变化。
-
查看调用堆栈:在调试过程中,查看调用堆栈可以帮助理解代码的执行流程。
-
使用即时窗口:在调试过程中,可以使用即时窗口(Immediate Window)来执行代码片段,测试某些功能。
1.8 插件打包和分发
开发完成后,需要将插件打包并分发给用户。以下是具体的步骤### 1.8 插件打包和分发
开发完成后,需要将插件打包并分发给用户。以下是具体的步骤:
1.8.1 打包插件
-
生成DLL文件:在Visual Studio中,选择“生成” > “生成解决方案”,确保插件项目能够成功编译生成DLL文件。
-
创建配置文件:如果插件需要配置文件(例如
app.config
),确保配置文件与生成的DLL文件一起打包。 -
创建资源文件:如果插件需要使用资源文件(例如图片、图标等),确保这些资源文件也包含在打包文件中。
1.8.2 打包工具
使用一些打包工具可以简化插件的打包过程,例如:
-
Visual Studio内置的发布工具:可以使用Visual Studio的发布功能,选择“发布” > “创建发布配置文件”,生成包含所有必要文件的安装包。
-
第三方打包工具:例如Inno Setup、NSIS等,这些工具提供更灵活的打包选项和安装脚本。
1.8.3 分发插件
-
提供安装包:将生成的安装包提供给用户,用户可以通过双击安装包来安装插件。
-
手动加载:用户也可以手动将生成的DLL文件加载到GstarCAD中:
-
打开GstarCAD,选择“工具” > “加载应用程序”。
-
在“加载应用程序”对话框中,找到并加载生成的DLL文件。
-
-
编写安装说明:提供详细的安装说明,帮助用户顺利安装和使用插件。
1.9 示例项目
为了更好地理解GstarCAD .NET二次开发的全过程,以下是一个完整的示例项目,包括创建、编译、加载和使用插件。
1.9.1 项目创建
-
打开Visual Studio,选择“文件” > “新建” > “项目”。
-
在“新建项目”对话框中,选择“类库(.NET Framework)”模板。
-
输入项目名称,例如“GstarCADExamplePlugin”,选择项目保存位置,点击“创建”。
-
在项目创建完成后,右键点击解决方案资源管理器中的项目,选择“管理NuGet程序包”。
-
在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 编译和加载插件
-
编译项目:在Visual Studio中,选择“生成” > “生成解决方案”,生成所需的DLL文件。
-
找到生成的DLL文件:通常,生成的DLL文件位于项目的
bin\Debug
或bin\Release
目录下。 -
加载插件:
-
打开GstarCAD,选择“工具” > “加载应用程序”。
-
在“加载应用程序”对话框中,找到并加载生成的DLL文件,例如
GstarCADExamplePlugin.dll
。
-
-
测试插件:
-
在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