AutoCAD_C#Net获取图案填充的边界线.docx
文件大小: 40k
源码售价: 10 个金币 积分规则     积分充值
资源说明:近日拜读了“北辰之北灬”的《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转换的要求。通过改进代码逻辑,我们可以确保获取到的坐标集合既能反映出填充边界的真实形状,又能够适应不同的数据格式标准。
本源码包内暂不包含可直接显示的源代码文件,请下载源码包。