Beispiel #1
0
        public static VectorXaml GetVectorXaml(IEnumerable <string> pathCollection, Brush overrideFill)
        {
            var pathGeometryContainer   = new VectorContainer();
            var streamGeometryContainer = new VectorContainer();
            var pathGeometry            = new PathGeometry();

            foreach (var pathString in pathCollection)
            {
                var path = (Path)XamlReader.Parse(pathString);

                if (overrideFill != Brushes.Transparent && (path.Fill == null || path.Fill.Equals(Brushes.Transparent)))
                {
                    path.Fill = overrideFill;
                }

                pathGeometryContainer.AddToContainer(path);
                pathGeometry.AddGeometry(path.Data);
            }
            streamGeometryContainer.AddToContainer(new Path {
                Data = pathGeometry.Clone()
            });
            var pathData = pathGeometry.ToString();

            return(new VectorXaml
            {
                PathData = pathData,
                PathGeometryXaml = XamlWriter.Save(pathGeometryContainer.Container),
                StreamGeometryXaml = XamlWriter.Save(streamGeometryContainer.Container),
                XamlObject = pathGeometryContainer.Container
            });
        }
    public static PathGeometry TransformedGeometry(PathGeometry g, Transform t)
    {
        Matrix       m      = t.Value;
        double       scaleX = Math.Sqrt(m.M11 * m.M11 + m.M21 * m.M21);
        double       scaleY = (m.M11 * m.M22 - m.M12 * m.M21) / scaleX;
        PathGeometry ng     = g.Clone();

        foreach (PathFigure f in ng.Figures)
        {
            f.StartPoint = t.Transform(f.StartPoint);
            foreach (PathSegment s in f.Segments)
            {
                if (s is LineSegment)
                {
                    (s as LineSegment).Point = t.Transform((s as LineSegment).Point);
                }
                else if (s is PolyLineSegment)
                {
                    (s as PolyLineSegment).Points = TransformPoints((s as PolyLineSegment).Points, t);
                }
                else if (s is BezierSegment)
                {
                    (s as BezierSegment).Point1 = t.Transform((s as BezierSegment).Point1);
                    (s as BezierSegment).Point2 = t.Transform((s as BezierSegment).Point2);
                    (s as BezierSegment).Point3 = t.Transform((s as BezierSegment).Point3);
                }
                else if (s is PolyBezierSegment)
                {
                    (s as PolyBezierSegment).Points = TransformPoints((s as PolyBezierSegment).Points, t);
                }
                else if (s is QuadraticBezierSegment)
                {
                    (s as QuadraticBezierSegment).Point1 = t.Transform((s as QuadraticBezierSegment).Point1);
                    (s as QuadraticBezierSegment).Point2 = t.Transform((s as QuadraticBezierSegment).Point2);
                }
                else if (s is PolyQuadraticBezierSegment)
                {
                    (s as PolyQuadraticBezierSegment).Points = TransformPoints((s as PolyQuadraticBezierSegment).Points, t);
                }
                else if (s is ArcSegment)
                {
                    ArcSegment a = s as ArcSegment;
                    a.Point = t.Transform(a.Point);
                    a.Size  = new Size(a.Size.Width * scaleX, a.Size.Height * scaleY); // NEVER TRIED
                }
            }
        }
        return(ng);
    }
        private static PathGeometry ExtendPathGeometry(PathGeometry geometry, double exLength)
        {
            if (geometry.Figures.Count != 1)
            {
                throw new ArgumentException();
            }
            PathGeometry          geometry2     = (PathGeometry)geometry.Clone();
            PointAndTangentDouble pointAtLength = geometry.GetPointAtLength(0.0, flatteningTolerance);
            VectorDouble          num2          = pointAtLength.Tangent.NormalizeOrZeroCopy();
            PointDouble           num3          = pointAtLength.Point - ((PointDouble)(num2 * exLength));

            geometry2.Figures[0].Segments.Insert(0, new LineSegment(pointAtLength.Point));
            geometry2.Figures[0].StartPoint = num3;
            PointAndTangentDouble num4  = geometry.GetPointAtLength(double.PositiveInfinity, flatteningTolerance);
            VectorDouble          num5  = num4.Tangent.NormalizeOrZeroCopy();
            PointDouble           point = num4.Point + ((PointDouble)(num5 * exLength));

            geometry2.Figures[0].Segments.Add(new LineSegment(point));
            return(geometry2);
        }
Beispiel #4
0
        private void SubdivideSegment(PathGeometry oldGeometry, int figure, int segment, int pointIndex, double parameter, Dictionary <TimelineSceneNode, StoryboardTimelineSceneNode> subdivisionProperties)
        {
            PropertyReference propertyReference1 = new PropertyReference(this.pathProperty).Append(PathElement.FiguresProperty).Append((ReferenceStep)IndexedClrPropertyReferenceStep.GetReferenceStep((IPlatformMetadata)this.platformMetadata, PlatformTypes.PathFigureCollection, figure));
            PropertyReference propertyReference2 = propertyReference1.Append(PathElement.PathFigureSegmentsProperty);
            PropertyReference propertyReference3 = segment != oldGeometry.Figures[figure].Segments.Count ? propertyReference2.Append((ReferenceStep)IndexedClrPropertyReferenceStep.GetReferenceStep((IPlatformMetadata)this.platformMetadata, PlatformTypes.PathSegmentCollection, segment)) : propertyReference1.Append(PathElement.PathFigureStartPointProperty);
            PropertyReference propertyReference4;

            if (segment == 0)
            {
                propertyReference4 = propertyReference1.Append(PathElement.PathFigureStartPointProperty);
            }
            else
            {
                ReferenceStep step = (ReferenceStep)IndexedClrPropertyReferenceStep.GetReferenceStep((IPlatformMetadata)this.platformMetadata, PlatformTypes.PathSegmentCollection, segment - 1);
                propertyReference4 = propertyReference2.Append(step).Append(this.LastPointProperty(oldGeometry.Figures[figure].Segments[segment - 1]));
            }
            PropertyReference propertyReference5 = (PropertyReference)null;

            if (segment == oldGeometry.Figures[figure].Segments.Count - 1 && PathFigureUtilities.IsClosed(oldGeometry.Figures[figure]) && PathFigureUtilities.IsCloseSegmentDegenerate(oldGeometry.Figures[figure]))
            {
                propertyReference5 = propertyReference1.Append(PathElement.PathFigureStartPointProperty);
            }
            foreach (StoryboardTimelineSceneNode timelineSceneNode1 in this.targetElement.ViewModel.AnimationEditor.EnumerateStoryboardsForContainer(this.targetElement.StoryboardContainer))
            {
                Dictionary <double, List <KeyFrameSceneNode> > keyFrames1 = new Dictionary <double, List <KeyFrameSceneNode> >();
                foreach (KeyValuePair <TimelineSceneNode, StoryboardTimelineSceneNode> keyValuePair in subdivisionProperties)
                {
                    if (keyValuePair.Value == timelineSceneNode1)
                    {
                        KeyFrameAnimationSceneNode keyFrameNode = keyValuePair.Key as KeyFrameAnimationSceneNode;
                        if (keyFrameNode != null)
                        {
                            this.RecordKeyFrames(keyFrames1, keyFrameNode);
                        }
                    }
                }
                Dictionary <double, List <KeyFrameSceneNode> > keyFrames2 = new Dictionary <double, List <KeyFrameSceneNode> >();
                foreach (TimelineSceneNode timelineSceneNode2 in (IEnumerable <TimelineSceneNode>)timelineSceneNode1.Children)
                {
                    if (timelineSceneNode2.TargetElement == this.targetElement && timelineSceneNode2.TargetProperty != null && (propertyReference3.Equals((object)timelineSceneNode2.TargetProperty) || propertyReference3.IsPrefixOf(timelineSceneNode2.TargetProperty) || propertyReference4.Equals((object)timelineSceneNode2.TargetProperty) || propertyReference5 != null && propertyReference5.Equals((object)timelineSceneNode2.TargetProperty)))
                    {
                        KeyFrameAnimationSceneNode keyFrameNode = timelineSceneNode2 as KeyFrameAnimationSceneNode;
                        if (keyFrameNode != null)
                        {
                            this.RecordKeyFrames(keyFrames2, keyFrameNode);
                        }
                    }
                }
                foreach (KeyValuePair <double, List <KeyFrameSceneNode> > keyValuePair in keyFrames2)
                {
                    PathGeometry       path = oldGeometry.Clone();
                    PathGeometryEditor pathGeometryEditor = new PathGeometryEditor(path);
                    foreach (KeyFrameSceneNode keyFrameSceneNode in keyValuePair.Value)
                    {
                        PropertyReference propertyReference6 = this.targetElement.ViewModel.DefaultView.ConvertToWpfPropertyReference(keyFrameSceneNode.TargetProperty.Subreference(1));
                        object            valueToSet         = this.targetElement.ViewModel.DefaultView.ConvertToWpfValue(keyFrameSceneNode.Value);
                        propertyReference6.SetValue((object)path, valueToSet);
                    }
                    pathGeometryEditor.SubdivideSegment(figure, pointIndex, parameter);
                    List <KeyFrameSceneNode> list;
                    if (keyFrames1.TryGetValue(keyValuePair.Key, out list))
                    {
                        foreach (KeyFrameSceneNode keyFrameSceneNode in list)
                        {
                            object obj = this.targetElement.ViewModel.DefaultView.ConvertFromWpfValue(this.targetElement.ViewModel.DefaultView.ConvertToWpfPropertyReference(keyFrameSceneNode.TargetProperty.Subreference(1)).GetCurrentValue((object)path));
                            keyFrameSceneNode.Value = obj;
                        }
                    }
                }
            }
        }