Exemplo n.º 1
0
        public void SetCoordinate(IFeature feature, int coordinateIndex, ICoordinate coordinate)
        {
            IGeometry geometry = feature.Geometry;
            Collection <IGeometry> trackers      = new Collection <IGeometry>();
            List <int>             handleIndices = new List <int>();

            for (int i = 0; i < geometry.Coordinates.Length; i++)
            {
                trackers.Add(GeometryFactory.CreatePoint((ICoordinate)geometry.Coordinates[i].Clone()));
            }
            handleIndices.Add(coordinateIndex);

            IFeatureProvider provider = GetFeatureProviderByFeature(feature);
            int geometryIndex         = provider.IndexOf(feature);

            if (geometryIndex == -1)
            {
                log.DebugFormat("Can't find layer for geometry (via feature): {0}", geometry);
                return;
            }

            IGeometry updatedGeometry = (IGeometry)geometry.Clone();

            double deltaX = coordinate.X - geometry.Coordinates[coordinateIndex].X;
            double deltaY = coordinate.Y - geometry.Coordinates[coordinateIndex].Y;

            fallOffPolicy.Reset();
            fallOffPolicy.Move(updatedGeometry, trackers, handleIndices, coordinateIndex, deltaX, deltaY);
            fallOffPolicy.Reset();

            ((IFeature)provider.Features[geometryIndex]).Geometry = updatedGeometry;
        }
Exemplo n.º 2
0
        public virtual bool MoveTracker(ITrackerFeature trackerFeature, double deltaX, double deltaY, ISnapResult snapResult)
        {
            int               index      = -1;
            IList <int>       handles    = new List <int>();
            IList <IGeometry> geometries = new List <IGeometry>();

            for (int i = 0; i < trackers.Count; i++)
            {
                geometries.Add(trackers[i].Geometry);
                if (trackers[i].Selected)
                {
                    handles.Add(i);
                }
                if (trackers[i] == trackerFeature)
                {
                    index = i;
                }
            }

            if (-1 == index)
            {
                throw new ArgumentException("Can not find tracker; can not move.");
            }
            //return false;
            if (0 == handles.Count)
            {
                throw new ArgumentException("No trackers selected, can not move.");
            }
            //return false;
            if (null != FallOffPolicy)
            {
                FallOffPolicy.Move(TargetFeature.Geometry, geometries, handles, index, deltaX, deltaY);
            }
            else
            {
                GeometryHelper.MoveCoordinate(TargetFeature.Geometry, index, deltaX, deltaY);
                TargetFeature.Geometry.GeometryChangedAction();

                GeometryHelper.MoveCoordinate(trackerFeature.Geometry, 0, deltaX, deltaY);
                trackerFeature.Geometry.GeometryChangedAction();
            }

            foreach (IFeatureRelationEditor topologyRule in TopologyRules)
            {
                topologyRule.UpdateRelatedFeatures(SourceFeature, TargetFeature.Geometry, handles);
            }

            return(true);
        }
Exemplo n.º 3
0
        public virtual bool MoveTracker(ITrackerFeature trackerFeature, double deltaX, double deltaY, ISnapResult snapResult)
        {
            int               index      = -1;
            IList <int>       handles    = new List <int>();
            IList <IGeometry> geometries = new List <IGeometry>();

            for (int i = 0; i < trackers.Count; i++)
            {
                geometries.Add(trackers[i].Geometry);
                if (trackers[i].Selected)
                {
                    handles.Add(i);
                }
                if (trackers[i] == trackerFeature)
                {
                    index = i;
                }
            }

            //NS, 2013-10-29, Untuk polygon hasil buffer control point seharusnya tidak bisa dipindah-pindah,
            // kecuali titik tengahnya yang di drag....
            if (trackerFeature.FeatureEditor.SourceFeature.Attributes.Keys.Contains("Buffer"))
            {
                if ((bool)trackerFeature.FeatureEditor.SourceFeature.Attributes["Buffer"])
                {
                    return(false); //throw new ArgumentException("Jangan dipindah-pindah :P.");
                }
            }

            //NS, 2013-09-09, Karena bila "throw ne ArgumentException", user awam akan menganggap error fatal,
            //jadi d return false saja deh...
            if (-1 == index)
            {
                //throw new ArgumentException("Can not find tracker; can not move.");
                //NS, 2013-09-09
                return(false);
            }
            if (0 == handles.Count)
            {
                //throw new ArgumentException("No trackers selected, can not move.");
                //NS, 2013-09-09
                return(false);
            }

            if (null != FallOffPolicy)
            {
                FallOffPolicy.Move(TargetFeature.Geometry, geometries, handles, index, deltaX, deltaY);
            }
            else
            {
                GeometryHelper.MoveCoordinate(TargetFeature.Geometry, index, deltaX, deltaY);
                TargetFeature.Geometry.GeometryChangedAction();

                GeometryHelper.MoveCoordinate(trackerFeature.Geometry, 0, deltaX, deltaY);
                trackerFeature.Geometry.GeometryChangedAction();
            }

            foreach (IFeatureRelationEditor topologyRule in TopologyRules)
            {
                topologyRule.UpdateRelatedFeatures(SourceFeature, TargetFeature.Geometry, handles);
            }

            return(true);
        }