最近在做一項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;
}