阅读:1874回复:1
[求助]AE中的镜像
需要做个编辑的工具,镜像功能,选择一个对象,再选择一条线,生成该对象对于线的镜像,有人知道怎么做么?
|
|
1楼#
发布于:2008-07-02 11:20
<P>本来想找engine的接口,但没找到,只好用数学自己算了</P>
<P>IFeatureClass pfeaclass = (IFeatureClass)pfea.Class;<BR> IDataset pDataset = (IDataset)pfeaclass;<BR> IFeatureWorkspace pFeatureWorkspace = (IFeatureWorkspace)pDataset.Workspace;<BR> IWorkspace pWS = (IWorkspace)pFeatureWorkspace;<BR> IWorkspaceEdit m_pWSEdit = (IWorkspaceEdit)pWS;<BR> object missing = Type.Missing;<BR> m_pWSEdit.StartEditing(true);<BR> m_pWSEdit.StartEditOperation();</P> <P> if (pfea.Shape.GeometryType == esriGeometryType.esriGeometryPoint)<BR> {<BR> ESRI.ArcGIS.Geometry.IPoint pPoint = (IPoint)pfea.Shape;<BR> ESRI.ArcGIS.Geometry.IPolyline pPolyline = (IPolyline)plinefea.Shape;<BR> ILine pline = new LineClass();<BR> pline.FromPoint = pPolyline.FromPoint;<BR> pline.ToPoint = pPolyline.ToPoint;<BR> double angle = pline.Angle;<BR> ESRI.ArcGIS.Geometry.IPoint pNewPoint = new ESRI.ArcGIS.Geometry.Point();</P> <P> IProximityOperator pProximityOperator = (IProximityOperator)pPolyline;<BR> ESRI.ArcGIS.Geometry.IPoint pNearestPoint = pProximityOperator.ReturnNearestPoint(pPoint, esriSegmentExtension.esriExtendEmbeddedAtFrom);<BR> ILine pNearestline = new LineClass();<BR> pNearestline.FromPoint = pPoint;<BR> pNearestline.ToPoint = pNearestPoint;<BR> double diatan = pNearestline.Length * 2;<BR> if (angle <= 3.1415926 ; angle > 0)<BR> {<BR> pNewPoint.X = pPoint.X + Math.Cos(angle - 3.1415926 / 2) * diatan;<BR> pNewPoint.Y = pPoint.Y + Math.Sin(angle - 3.1415926 / 2) * diatan;<BR> }<BR> else if (angle <=0 ; angle >= -3.1415926)<BR> {<BR> pNewPoint.X = pPoint.X - Math.Cos(angle - 3.1415926 / 2) * diatan;<BR> pNewPoint.Y = pPoint.Y - Math.Sin(angle - 3.1415926 / 2) * diatan;<BR> }<BR> IFeature newfea =pfeaclass.CreateFeature();<BR> newfea.Shape = pNewPoint;<BR> newfea.Store();<BR> }<BR> if (pfea.Shape.GeometryType == esriGeometryType.esriGeometryPolyline)<BR> {<BR> ESRI.ArcGIS.Geometry.IPolyline pImagePolyline = (IPolyline)pfea.Shape;<BR> ESRI.ArcGIS.Geometry.IPolyline pNewPolyline = new PolylineClass() ;<BR> ESRI.ArcGIS.Geometry.IPolyline pPolyline = (IPolyline)plinefea.Shape;<BR> IPointCollection pPointCol = (IPointCollection)pImagePolyline;<BR> IPointCollection pNewPointCol =(IPointCollection) pNewPolyline;<BR> if (pPointCol.PointCount == 2)<BR> {<BR> pPolyline = (IPolyline)pfea.Shape;<BR> pImagePolyline = (IPolyline)plinefea.Shape;<BR> pPointCol = (IPointCollection)pImagePolyline;<BR> }<BR> for(int i=0 ;i<pPointCol.PointCount ;i++)<BR> {<BR> ESRI.ArcGIS.Geometry.IPoint pPoint = pPointCol.get_Point(i);<BR> ILine pline = new LineClass();<BR> pline.FromPoint = pPolyline.FromPoint;<BR> pline.ToPoint = pPolyline.ToPoint;<BR> double angle = pline.Angle;<BR> ESRI.ArcGIS.Geometry.IPoint pNewPoint = new ESRI.ArcGIS.Geometry.Point();<BR> IProximityOperator pProximityOperator = (IProximityOperator)pPolyline;<BR> ESRI.ArcGIS.Geometry.IPoint pNearestPoint = pProximityOperator.ReturnNearestPoint(pPoint, esriSegmentExtension.esriExtendEmbeddedAtFrom);<BR> ILine pNearestline = new LineClass();<BR> pNearestline.FromPoint = pPoint;<BR> pNearestline.ToPoint = pNearestPoint;<BR> double diatan = pNearestline.Length * 2;<BR> if (angle <= 3.1415926 ; angle > 0)<BR> {<BR> pNewPoint.X = pPoint.X + Math.Cos(angle - 3.1415926 / 2) * diatan;<BR> pNewPoint.Y = pPoint.Y + Math.Sin(angle - 3.1415926 / 2) * diatan;<BR> }<BR> else if (angle <= 0 ; angle >= -3.1415926)<BR> {<BR> pNewPoint.X = pPoint.X - Math.Cos(angle - 3.1415926 / 2) * diatan;<BR> pNewPoint.Y = pPoint.Y - Math.Sin(angle - 3.1415926 / 2) * diatan;<BR> }<BR> pNewPointCol.AddPoint(pNewPoint,ref missing, ref missing);<BR> }<BR> IFeature newfea = pfeaclass.CreateFeature();<BR> newfea.Shape = pNewPolyline;<BR> newfea.Store();<BR> }<BR> if (pfea.Shape.GeometryType == esriGeometryType.esriGeometryPolygon )<BR> {<BR> ESRI.ArcGIS.Geometry.IPolygon pImagePolygon = (IPolygon)pfea.Shape;<BR> ESRI.ArcGIS.Geometry.IPolyline pPolyline = (IPolyline)plinefea.Shape;<BR> ESRI.ArcGIS.Geometry.IPolygon pNewPolygon = new PolygonClass();<BR> IPointCollection pPointCol = (IPointCollection)pImagePolygon;<BR> IPointCollection pNewPointCol = (IPointCollection)pNewPolygon;<BR> for (int i = 0; i < pPointCol.PointCount; i++)<BR> {<BR> ESRI.ArcGIS.Geometry.IPoint pPoint = pPointCol.get_Point(i);<BR> ILine pline = new LineClass();<BR> pline.FromPoint = pPolyline.FromPoint;<BR> pline.ToPoint = pPolyline.ToPoint;<BR> double angle = pline.Angle;<BR> ESRI.ArcGIS.Geometry.IPoint pNewPoint = new ESRI.ArcGIS.Geometry.Point();<BR> IProximityOperator pProximityOperator = (IProximityOperator)pPolyline;<BR> ESRI.ArcGIS.Geometry.IPoint pNearestPoint = pProximityOperator.ReturnNearestPoint(pPoint, esriSegmentExtension.esriExtendEmbeddedAtFrom);<BR> ILine pNearestline = new LineClass();<BR> pNearestline.FromPoint = pPoint;<BR> pNearestline.ToPoint = pNearestPoint;<BR> double diatan = pNearestline.Length * 2;<BR> if (angle <= 3.1415926 ; angle > 0)<BR> {<BR> pNewPoint.X = pPoint.X + Math.Cos(angle - 3.1415926 / 2) * diatan;<BR> pNewPoint.Y = pPoint.Y + Math.Sin(angle - 3.1415926 / 2) * diatan;<BR> }<BR> else if (angle <= 0 ; angle >= -3.1415926)<BR> {<BR> pNewPoint.X = pPoint.X - Math.Cos(angle - 3.1415926 / 2) * diatan;<BR> pNewPoint.Y = pPoint.Y - Math.Sin(angle - 3.1415926 / 2) * diatan;<BR> }<BR> pNewPointCol.AddPoint(pNewPoint, ref missing, ref missing);<BR> }<BR> IFeature newfea = pfeaclass.CreateFeature();<BR> newfea.Shape = pNewPolygon;<BR> newfea.Store();</P> <P><BR> }</P> <P> m_pWSEdit.StopEditOperation();<BR> m_pWSEdit.StopEditing(true);<BR> MapMain.ActiveView.Refresh();</P> |
|