天天看點

ObjectARX-CAD實體求空間交集

       最近在做一項CAD二次開發,就是根據一個行政單元,求在行政單元内的所有河流的面積。如果用ArcGIS來做,顯然簡單的多,但是用CAD來“濫竽充數”顯然很不給力。下面介紹一下ObjectARX來空間求交集,多謝師弟的幫助。開發環境是VS2005。

       1. 首先建立一個類工程,添加5個比用引用,分别是:

            acdbmgd(位置在“C:/Program Files/AutoCAD 2006/acdbmgd.dll”)

            acmgd(位置在“C:/Program Files/AutoCAD 2006/acmgd.dll”)

    AutoCAD(COM元件庫,别名:AutoCAD 2006 Type Library)

            AxDBLib(COM元件庫,别名:AutoCAD/OjbectDBX Common 16.0 Type Library)

       2. 建立一個CAD執行個體類:

         using System;

using System.Collections.Generic;

using System.Text;

using System.Runtime.InteropServices;

using Autodesk.AutoCAD.Interop;//需要引用com

namespace cadBoolOperator

{

#region CLASS AutoCADConnector(利用COM)

public class AutoCADConnector : IDisposable

{

private AcadApplication _application;

private bool _initialized;

private bool _disposed;

public AutoCADConnector()

{

try

{

_application = (AcadApplication)Marshal.GetActiveObject("AutoCAD.Application.16");

}

catch

{

try

{

_application = new AcadApplicationClass();

_initialized = true;

}

catch

{

throw;

}

}

}

~AutoCADConnector()

{

Dispose(false);

}

public AcadApplication Application

{

get

{

return _application;

}

}

public void Dispose()

{

Dispose(true);

GC.SuppressFinalize(this);

}

protected virtual void Dispose(bool disposing)

{

if (!this._disposed && _initialized)

_application.Quit();

_disposed = true;

}

}

#endregion

}

       3. 建立一個函數,将閉合的多義線(Polyline)轉換為面(Region)

           /// <summary>

/// 将閉合的多義線轉化為面

/// </summary>

/// <param name="pline"></param>

/// <returns></returns>

private static DATABASE.Region Convert2Region(Polyline pline)

{

Database AcadDB = HostApplicationServices.WorkingDatabase;

try

{

using (Transaction trans = AcadDB.TransactionManager.StartTransaction())

{

//BlockTable bt = (BlockTable)trans.GetObject(AcadDB.BlockTableId, OpenMode.ForRead, false);

//BlockTableRecord btr = (BlockTableRecord)trans.GetObject(AcadDB.CurrentSpaceId, OpenMode.ForWrite, false);

DBObjectCollection curveSegments = new DBObjectCollection();

curveSegments.Add(pline);

DBObjectCollection regions = DATABASE.Region.CreateFromCurves(curveSegments);

DATABASE.Region region = regions[0] as DATABASE.Region;

if (region != null)

{

trans.Commit();

return region;

}

}

}

catch (Autodesk.AutoCAD.Runtime.Exception err)//如果多義線自相交或不在一個平面上

{

//ACADUtilities.UtilityClass.ShowMessage("/nError in CreateRegion: " + err.ErrorStatus.ToString());

}

catch

{

//ACADUtilities.UtilityClass.ShowMessage("/nError in CreateRegion/n");

}

return null;

       4. 将兩個封閉的多義線(Polyline)轉換為面(Region)後,就可以求交集了:

           /// <summary>

/// 計算兩個面域公共部門面積(求交)

/// </summary>

/// <param name="r1"></param>

/// <param name="r2"></param>

/// <returns></returns>

private static double calculate(Region r1, Region r2)

{

r1.BooleanOperation(BooleanOperationType.BoolIntersect, r2);

return r1.Area;

繼續閱讀