ArcEngine根據對稱軸生成鏡像實體

用過CAD的同志應該清楚,在CAD中可以指定對稱軸,然後根據對稱軸生成鏡像,ArcEngine中也可以進行類似操作,如下圖所示:
在這裏插入圖片描述
代碼如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.DataSourcesFile;
using ESRI.ArcGIS.DataSourcesGDB;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Output;
using ESRI.ArcGIS.SystemUI;

namespace WindowsFormsApplication1
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
            axMapControl1.LoadMxFile(@"C:\Users\DSF\Desktop\data\無標題.mxd");
        }

        // 創建緩衝區
        private void btnCreateGeometry_Click(object sender, EventArgs e)
        {
            // 線要素
            IFeatureLayer pPolylineFeatureLayer = axMapControl1.get_Layer(0) as IFeatureLayer;
            IFeatureClass pPolylineFeatureClass = pPolylineFeatureLayer.FeatureClass;
            IPolyline pPolyline = pPolylineFeatureClass.GetFeature(0).Shape as IPolyline;

            // 對稱軸
            ILine pLine = new Line();
            pLine.PutCoords(pPolyline.FromPoint, pPolyline.ToPoint);

            // 面要素
            IFeatureLayer pPolygonFeatureLayer = axMapControl1.get_Layer(1) as IFeatureLayer;
            IFeatureClass pPolygonFeatureClass = pPolygonFeatureLayer.FeatureClass;

            // 繪製鏡像
            IFeatureCursor pPolygonFeatureCursor = pPolygonFeatureClass.Search(null, true);
            IFeature pPolygonFeature = pPolygonFeatureCursor.NextFeature();
            while (pPolygonFeature != null)
            {
                IGeometry pGeometry = CreateGeometry(pPolygonFeature.ShapeCopy, pLine);
                Draw(pGeometry);
                pPolygonFeature = pPolygonFeatureCursor.NextFeature();
            }
            System.Runtime.InteropServices.Marshal.ReleaseComObject(pPolygonFeatureCursor);
        }

        // 生成鏡像實體
        private IGeometry CreateGeometry(IGeometry pGeometry, ILine pLine)
        {
            IAffineTransformation2D pAffineTransformation2D = new AffineTransformation2D() as IAffineTransformation2D;
            pAffineTransformation2D.DefineReflection(pLine);
            ITransform2D pTransform2D = pGeometry as ITransform2D;
            pTransform2D.Transform(esriTransformDirection.esriTransformForward, pAffineTransformation2D);
            return pTransform2D as IGeometry;
        }

        // 繪製
        private void Draw(IGeometry pGeometry)
        {
            IRgbColor pRgbColor = new RgbColor();
            pRgbColor.Red = 0;
            pRgbColor.Green = 255;
            pRgbColor.Blue = 0;

            // 創建符號
            ISimpleFillSymbol pSimpleFillSymbol = new SimpleFillSymbol();
            pSimpleFillSymbol.Color = pRgbColor;

            // 創建元素
            IFillShapeElement pFillShapeElement = new PolygonElement() as IFillShapeElement;
            pFillShapeElement.Symbol = pSimpleFillSymbol;
            IElement pElement = pFillShapeElement as IElement;
            pElement.Geometry = pGeometry;

            // 繪製元素
            IActiveView pActiveView = axMapControl1.ActiveView;
            IGraphicsContainer pGraphicsContainer = pActiveView.GraphicsContainer;
            pGraphicsContainer.AddElement(pElement, 0);
            pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章