Questo codice c # può essere utilizzato per creare un componente aggiuntivo per Arcmap .
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Windows.Forms;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.ArcMapUI;
using ESRI.ArcGIS.DataSourcesFile;
using ESRI.ArcGIS.Geodatabase;
namespace MainToolsAddin
{
public class Extent2ShapefileButton : ESRI.ArcGIS.Desktop.AddIns.Button
{
public Extent2ShapefileButton()
{
}
protected override void OnClick()
{
try
{
var polygon = GetExtentPolygon(ArcMap.Document.FocusMap);
//IGraphicsContainer gc = ArcMap.Document.FocusMap as IGraphicsContainer;
//var element = new PolygonElementClass() as IElement;
//element.Geometry = polygon;
//((IFillShapeElement)element).Symbol = ((IDocumentDefaultSymbols)ArcMap.Document).FillSymbol;
//gc.AddElement(element,0);
//((IActiveView)ArcMap.Document.FocusMap).Refresh();
WritePolygon(@"C:\projects\forums\extents.shp", polygon);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
protected override void OnUpdate()
{
}
private void WritePolygon(string shpFilePath, IGeometry geom)
{
var featClass = OpenShapeFile(shpFilePath);
if (featClass == null)
featClass = CreateShapeFile(shpFilePath, geom);
IFeature feat = featClass.CreateFeature();
feat.Shape = geom;
feat.Store();
}
private IFeatureClass CreateShapeFile(string shpFilepath, IGeometry geom)
{
System.IO.FileInfo fi = new FileInfo(shpFilepath);
var wsf = Activator.CreateInstance(Type.GetTypeFromProgID("esriDataSourcesFile.ShapefileWorkspaceFactory")) as IWorkspaceFactory;
var fws = wsf.OpenFromFile(fi.DirectoryName, 0) as IFeatureWorkspace;
IFieldsEdit flds = new FieldsClass();
flds.AddField(MakeField("ObjectID", esriFieldType.esriFieldTypeOID,0));
IGeometryDefEdit geomDef = new GeometryDefClass();
geomDef.GeometryType_2 = geom.GeometryType;
geomDef.SpatialReference_2 = geom.SpatialReference;
var shpField = MakeField("Shape", esriFieldType.esriFieldTypeGeometry, 0) as IFieldEdit;
shpField.GeometryDef_2 = geomDef;
flds.AddField(shpField);
flds.AddField(MakeField("Name", esriFieldType.esriFieldTypeString, 16));
string fcName = fi.Name;
if (fcName.ToUpper().EndsWith(".SHP"))
fcName = fcName.Substring(0, fcName.LastIndexOf("."));
var fc = fws.CreateFeatureClass(fcName, flds, null, null, esriFeatureType.esriFTSimple, "Shape", "");
return fc;
}
private IField MakeField(string name, esriFieldType fType, int length)
{
IFieldEdit fld = new FieldClass();
fld.Name_2 = name;
fld.Type_2 = fType;
if (length > 0 && fType == esriFieldType.esriFieldTypeString)
fld.Length_2 = length;
return fld;
}
private IFeatureClass OpenShapeFile(string shpFilepath)
{
var wsf = Activator.CreateInstance(Type.GetTypeFromProgID("esriDataSourcesFile.ShapefileWorkspaceFactory")) as IWorkspaceFactory;
System.IO.FileInfo fi = new FileInfo(shpFilepath);
string name = fi.Name.ToUpper().EndsWith(".SHP") ? fi.Name.Substring(0, fi.Name.LastIndexOf(".")) : fi.Name;
string fileName = String.Format("{0}.shp", name);
if (File.Exists(System.IO.Path.Combine(fi.DirectoryName,fileName)))
{
var fws = wsf.OpenFromFile(fi.DirectoryName, 0) as IFeatureWorkspace;
return fws.OpenFeatureClass(name);
}
else
return null;
}
private IPolygon GetExtentPolygon(IMap map)
{
// A polygon is returned since the dataframe might be rotated
var grphCont = ArcMap.Document.PageLayout as IGraphicsContainer;
var mapFrame = grphCont.FindFrame(map) as IMapFrame;
var av = map as IActiveView;
var extent = mapFrame.MapBounds.Envelope;
ISegmentCollection sc = new PolygonClass() as ISegmentCollection;
sc.SetRectangle(extent);
var center = ((IArea)extent).Centroid;
var angle = -(av.ScreenDisplay.DisplayTransformation.Rotation / 180.0 * Math.PI);
((ITransform2D)sc).Rotate(center, angle);
return (IPolygon)sc;
}
}
}
Quando si crea un nuovo progetto di componente aggiuntivo con Visual Studio, è necessario visualizzare alcune opzioni come questa. Non sono sicuro che funzioni con Visual Studio Express o se ArcObjects SDK debba essere installato.