资源说明:近日拜读了“北辰之北灬”的《C#CAD二次开发图案填充对象边界提取》一文(原文链接:https://blog.csdn.net/pp_fzp/article/details/52992615),并在Visual Studio 2012版本中进行了反复的测试,或许因版本的原因,也或许是变量声明的位置不当,当提取带孤岛的图案填充时只能获取内部边界的坐标集合,无法获取外部边界的坐标集合。现修改并说明如下:
在AutoCAD的C#二次开发过程中,图案填充对象的边界提取是一个常见的需求,尤其是在GIS转换等应用场景中。本文主要讨论如何修正《C#CAD二次开发图案填充对象边界提取》一文中提到的问题,以便正确地获取带孤岛的图案填充内外部边界的坐标集合。
原文中的一个无效代码片段可能导致在处理带孤岛的图案填充时,无法正确获取外部边界的坐标。原代码试图通过`hatLoop.IsPolyline`判断HatchLoop是否为多段线,但这种方法在某些情况下可能返回错误结果,导致系统闪退。因此,需要重新评估和调整这部分代码,确保在不同类型的HatchLoop上都能正常工作。
当HatchLoop为Curves时,内部可能包含多种类型的子线,如直线、圆弧、椭圆弧等。对于直线,我们通常只需要其首尾两个点;而对于其他曲线类型,简单地设定固定采样点数并不理想。更有效的做法是根据子曲线的长度动态计算采样间隔,这样可以确保采样点能精确反映曲线的实际形状。例如,如果子曲线长度为10000米,采样间隔设为2.5米,则采样点数应为4000个。
再者,为了满足GIS转换的需求,代码应当提供一个选项来适应Shape文件的要求。Shape文件格式通常要求边界坐标以特定的方向闭合,外环遵循顺时针方向,内环遵循逆时针方向。因此,我们需要在提取坐标集合时,检查并调整这些方向,确保生成的数据符合Shape文件的标准。
以下是一个简化版的代码实现,展示了如何处理这些问题:
```csharp
[CommandMethod("HatchXYtest")]
public static void HatchXYtest()
{
Database db = HostApplicationServices.WorkingDatabase;
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
ObjectId id = ed.GetEntity("\n 请选择对象").ObjectId;
using (Transaction trans = db.TransactionManager.StartTransaction())
{
BlockTableRecord btr = trans.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTableRecord;
Entity ent = trans.GetObject(id, OpenMode.ForRead) as Entity;
if (ent.ObjectType == ObjectType.Hatch)
{
Hatch hatch = ent as Hatch;
bool isShpFormat = false; // 是否按照Shape文件格式
foreach (HatchLoop hl in hatch.Loops)
{
if (hl.IsOuter)
{
// 提取外部边界
ExtractLoopPoints(hl, isShpFormat);
}
else
{
// 提取内部边界(孤岛)
ExtractLoopPoints(hl, !isShpFormat);
}
}
trans.Commit();
}
}
}
private static void ExtractLoopPoints(HatchLoop hl, bool isShpFormat)
{
// 这里进行边界点提取,处理isShpFormat标志
}
```
在这个例子中,`ExtractLoopPoints`方法会根据`isShpFormat`参数调整坐标提取的逻辑,确保满足GIS转换的要求。具体到每个子曲线的采样,可以根据实际情况调整代码,确保在不同类型的子曲线(如弧线、椭圆弧等)上都能正确采样。
正确处理AutoCAD的C#二次开发中图案填充对象的边界提取,需要考虑边界类型、曲线采样策略以及GIS转换的要求。通过改进代码逻辑,我们可以确保获取到的坐标集合既能反映出填充边界的真实形状,又能够适应不同的数据格式标准。
本源码包内暂不包含可直接显示的源代码文件,请下载源码包。