private void MovePathParts(PathPartSelectionSet pathPartSelectionSet, BaseFrameworkElement sceneElement, PathEditMode pathEditMode, Vector deltaOffset) { ICollection <PathPart> selectionByElement = pathPartSelectionSet.GetSelectionByElement((SceneElement)sceneElement, pathEditMode); Tool activeTool = this.ActiveSceneViewModel.DesignerContext.ToolManager.ActiveTool; if (selectionByElement.Count <= 0 || activeTool == null) { return; } PathEditorTarget pathEditorTarget = activeTool.GetPathEditorTarget((Base2DElement)sceneElement, pathEditMode); if (pathEditorTarget == null) { return; } this.EnsureEditTransaction(); pathEditorTarget.BeginEditing(); if (!this.pathEditorTargets.ContainsKey(pathEditorTarget)) { this.pathEditorTargets.Add(pathEditorTarget, true); } Matrix transformToAncestor = pathEditorTarget.GetTransformToAncestor((IViewObject)this.ActiveView.HitTestRoot); Vector correspondingVector = ElementUtilities.GetCorrespondingVector(deltaOffset, transformToAncestor); PathEditBehavior.TranslateSelection(pathEditorTarget, selectionByElement, correspondingVector); this.ActiveView.AdornerLayer.InvalidateAdornerVisuals((SceneElement)pathEditorTarget.EditingElement); }
protected override bool OnButtonDown(Point pointerPosition) { this.pathPartAdorner = (PathPartAdorner)this.ActiveAdorner; this.isConstrainingAxes = this.IsShiftDown; this.startRootPoint = pointerPosition; this.currentEditingElement = this.pathPartAdorner.Element; bool isShiftDown = this.IsShiftDown; int num = this.IsAltDown ? true : false; bool isControlDown = this.IsControlDown; PathPointAdorner pathPointAdorner = this.pathPartAdorner as PathPointAdorner; PathTangentAdorner pathTangentAdorner = this.pathPartAdorner as PathTangentAdorner; PathSegmentAdorner pathSegmentAdorner = this.pathPartAdorner as PathSegmentAdorner; this.pathEditorTargets.Clear(); if (pathTangentAdorner != null) { pathTangentAdorner.PathAdornerSet.SetActive((PathPartAdorner)pathTangentAdorner, true); this.isEnforcingSmoothness = this.ShouldEnforceSmoothness(pathTangentAdorner); } else { PathPartSelectionSet partSelectionSet = this.ActiveSceneViewModel.PathPartSelectionSet; PathPart pathPart = (PathPart)null; if (pathPointAdorner != null) { pathPart = (PathPart)(PathPoint)pathPointAdorner; } else if (pathSegmentAdorner != null) { pathPart = (PathPart)(PathSegment)pathSegmentAdorner; } if (isShiftDown) { partSelectionSet.ExtendSelection(pathPart); } else if (isControlDown && this.ToolBehaviorContext.ActiveTool is ISelectionTool) { partSelectionSet.ToggleSelection(pathPart); if (!partSelectionSet.IsSelected(pathPart)) { this.currentEditingElement = (BaseFrameworkElement)null; } } else if (!partSelectionSet.IsSelected(pathPart)) { partSelectionSet.Clear(); partSelectionSet.ExtendSelection(pathPart); } if (partSelectionSet.IsSelected(pathPart) && pathSegmentAdorner != null) { this.ComputeSegmentParameter(); } } this.ToolBehaviorContext.SnappingEngine.Start(this.ToolBehaviorContext, (BaseFrameworkElement)null, (IList <BaseFrameworkElement>)null); return(true); }
private HashSet <SceneElement> PathPartDelete(SceneEditTransaction editTransaction) { HashSet <SceneElement> hashSet = new HashSet <SceneElement>(); PathPartSelectionSet partSelectionSet = this.SceneViewModel.PathPartSelectionSet; Dictionary <PathEditMode, List <PathEditorTarget> > dictionary = new Dictionary <PathEditMode, List <PathEditorTarget> >(); dictionary[PathEditMode.ClippingPath] = new List <PathEditorTarget>(); dictionary[PathEditMode.ScenePath] = new List <PathEditorTarget>(); dictionary[PathEditMode.MotionPath] = new List <PathEditorTarget>(); Tool activeTool = this.SceneViewModel.DesignerContext.ToolManager.ActiveTool; if (activeTool != null) { foreach (PathPart pathPart in partSelectionSet.Selection) { BaseFrameworkElement frameworkElement = pathPart.SceneElement as BaseFrameworkElement; if (frameworkElement != null) { PathEditorTarget pathEditorTarget = activeTool.GetPathEditorTarget((Base2DElement)frameworkElement, pathPart.PathEditMode); if (pathEditorTarget != null && !dictionary[pathPart.PathEditMode].Contains(pathEditorTarget)) { dictionary[pathPart.PathEditMode].Add(pathEditorTarget); hashSet.Add((SceneElement)frameworkElement); } } } } List <PathEditorTarget> list1 = new List <PathEditorTarget>(); List <PathEditorTarget> list2 = new List <PathEditorTarget>(); foreach (KeyValuePair <PathEditMode, List <PathEditorTarget> > keyValuePair in dictionary) { foreach (PathEditorTarget pathEditorTarget in keyValuePair.Value) { pathEditorTarget.BeginEditing(); int count1 = pathEditorTarget.PathGeometry.Figures.Count; ICollection <PathPart> selectionByElement = partSelectionSet.GetSelectionByElement((SceneElement)pathEditorTarget.EditingElement, keyValuePair.Key); new DeleteCommand.SelectedComponentsRemover(pathEditorTarget).Execute(selectionByElement); pathEditorTarget.EndEditing(false); pathEditorTarget.PostDeleteAction(); if (keyValuePair.Key == PathEditMode.ScenePath) { if (!PathGeometryUtilities.IsEmpty(pathEditorTarget.PathGeometry)) { PathElement pathElement = (PathElement)pathEditorTarget.EditingElement; int count2 = pathElement.PathGeometry.Figures.Count; if (count1 == 1 && count2 > 1) { ISceneNodeCollection <SceneNode> collectionContainer = pathElement.GetCollectionContainer(); if (!collectionContainer.FixedCapacity.HasValue || collectionContainer.FixedCapacity.Value >= collectionContainer.Count - 1 + count2) { list2.Add(pathEditorTarget); } } } else { list1.Add(pathEditorTarget); } } pathEditorTarget.AddCriticalEdit(); } } List <SceneElement> list3 = new List <SceneElement>(); foreach (PathEditorTarget pathEditorTarget in list2) { PathElement pathElement1 = (PathElement)pathEditorTarget.EditingElement; using (this.SceneView.AdornerLayer.SuspendUpdates()) { this.SceneView.UpdateLayout(); foreach (PathElement pathElement2 in PathCommandHelper.ReleaseCompoundPaths(pathElement1, editTransaction)) { list3.Add((SceneElement)pathElement2); } } } foreach (PathEditorTarget pathEditorTarget in list1) { pathEditorTarget.RemovePath(); } partSelectionSet.Clear(); this.SceneViewModel.ElementSelectionSet.ExtendSelection((ICollection <SceneElement>)list3); foreach (SceneElement sceneElement in list3) { hashSet.Add(sceneElement); } return(hashSet); }
protected virtual void CreatePathAdorners(List <Adorner> oldAdornerList, List <Adorner> newAdornerList) { this.adornerCounts.Clear(); this.adornerOffsets.Clear(); PathPartSelectionSet partSelectionSet = this.PathPartSelectionSet; List <PathPointAdorner> list1 = new List <PathPointAdorner>(); List <PathSegmentAdorner> list2 = new List <PathSegmentAdorner>(); List <PathTangentAdorner> list3 = new List <PathTangentAdorner>(); int index1 = 0; int index2 = 0; int index3 = 0; foreach (Adorner adorner in oldAdornerList) { PathPointAdorner pathPointAdorner; if ((pathPointAdorner = adorner as PathPointAdorner) != null) { list1.Add(pathPointAdorner); } else { PathSegmentAdorner pathSegmentAdorner; if ((pathSegmentAdorner = adorner as PathSegmentAdorner) != null) { list2.Add(pathSegmentAdorner); } else { PathTangentAdorner pathTangentAdorner; if ((pathTangentAdorner = adorner as PathTangentAdorner) != null) { list3.Add(pathTangentAdorner); } } } } for (int figureIndex = 0; figureIndex < this.PathGeometry.Figures.Count; ++figureIndex) { PathFigure figure = this.PathGeometry.Figures[figureIndex]; PathFigureEditor pathFigureEditor = new PathFigureEditor(figure); this.adornerOffsets.Add((object)this.AdornerList.Count); int length1 = PathFigureUtilities.PointCount(figure); int length2 = length1 + (PathFigureUtilities.IsClosed(figure) ? true : false); PathSegmentAdorner[] pathSegmentAdornerArray = new PathSegmentAdorner[length2]; PathPointKind[] pathPointKindArray = new PathPointKind[length2]; pathPointKindArray[0] = pathFigureEditor.GetPointKind(0); int num1 = 1; for (int index4 = 0; index4 < figure.Segments.Count; ++index4) { System.Windows.Media.PathSegment segment = figure.Segments[index4]; int pointCount = PathSegmentUtilities.GetPointCount(segment); for (int index5 = 0; index5 < pointCount; ++index5) { pathPointKindArray[num1++] = PathSegmentUtilities.GetPointKind(segment, index5); } } int index6 = 1; for (int segmentIndex = 0; segmentIndex < figure.Segments.Count; ++segmentIndex) { int pointCount = PathSegmentUtilities.GetPointCount(figure.Segments[segmentIndex]); for (int segmentPointIndex = 0; segmentPointIndex < pointCount; ++segmentPointIndex) { if (pathPointKindArray[index6] != PathPointKind.BezierHandle) { PathSegmentAdorner pathSegmentAdorner; if (index2 < list2.Count) { pathSegmentAdorner = list2[index2]; pathSegmentAdorner.Initialize(figureIndex, index6 % length1, segmentIndex, segmentPointIndex); oldAdornerList.Remove((Adorner)pathSegmentAdorner); ++index2; } else { pathSegmentAdorner = new PathSegmentAdorner(this, figureIndex, index6 % length1, segmentIndex, segmentPointIndex); } if (partSelectionSet != null) { pathSegmentAdorner.IsActive = partSelectionSet.IsSelected((PathPart)(PathSegment)pathSegmentAdorner); } newAdornerList.Add((Adorner)pathSegmentAdorner); pathSegmentAdornerArray[index6] = pathSegmentAdorner; } else { pathSegmentAdornerArray[index6] = (PathSegmentAdorner)null; } ++index6; } } if (figure.IsClosed && figure.Segments.Count > 0) { Point lastPoint = PathSegmentUtilities.GetLastPoint(figure.Segments[figure.Segments.Count - 1]); if (!VectorUtilities.ArePathPointsVeryClose(figure.StartPoint, lastPoint)) { PathSegmentAdorner pathSegmentAdorner; if (index2 < list2.Count) { pathSegmentAdorner = list2[index2]; pathSegmentAdorner.Initialize(figureIndex, index6 % length1, -1, 0); oldAdornerList.Remove((Adorner)pathSegmentAdorner); ++index2; } else { pathSegmentAdorner = new PathSegmentAdorner(this, figureIndex, index6 % length1, -1, 0); } if (partSelectionSet != null) { pathSegmentAdorner.IsActive = partSelectionSet.IsSelected((PathPart)(PathSegment)pathSegmentAdorner); } newAdornerList.Add((Adorner)pathSegmentAdorner); pathSegmentAdornerArray[index6] = pathSegmentAdorner; } } this.adornerCounts.Add((object)(this.AdornerList.Count - (int)this.adornerOffsets[this.adornerOffsets.Count - 1])); this.adornerTypes.Add((object)PathPart.PartType.PathSegment); PathPointAdorner[] pathPointAdornerArray = new PathPointAdorner[length1]; int index7 = 0; for (int segmentIndex = -1; segmentIndex < figure.Segments.Count; ++segmentIndex) { int num2 = 1; if (segmentIndex != -1) { num2 = PathSegmentUtilities.GetPointCount(figure.Segments[segmentIndex]); } for (int segmentPointIndex = 0; segmentPointIndex < num2 && index7 < length1; ++segmentPointIndex) { if (pathPointKindArray[index7] == PathPointKind.BezierHandle) { pathPointAdornerArray[index7] = (PathPointAdorner)null; } else { PathPointAdorner pathPointAdorner; if (index1 < list1.Count) { pathPointAdorner = list1[index1]; pathPointAdorner.Initialize(figureIndex, index7, segmentIndex, segmentPointIndex); oldAdornerList.Remove((Adorner)pathPointAdorner); ++index1; } else { pathPointAdorner = new PathPointAdorner(this, figureIndex, index7, segmentIndex, segmentPointIndex); } pathPointAdornerArray[index7] = pathPointAdorner; if (partSelectionSet != null) { pathPointAdornerArray[index7].IsActive = partSelectionSet.IsSelected((PathPart)(PathPoint)pathPointAdornerArray[index7]); } } ++index7; } } int endPointIndex = 0; for (int segmentIndex = -1; segmentIndex < figure.Segments.Count; ++segmentIndex) { int num2 = 1; if (segmentIndex != -1) { num2 = PathSegmentUtilities.GetPointCount(figure.Segments[segmentIndex]); } for (int segmentPointIndex = 0; segmentPointIndex < num2 && endPointIndex < length1; ++segmentPointIndex) { if (pathPointKindArray[endPointIndex] == PathPointKind.BezierHandle) { PathPointAdorner pathPointAdorner = (PathPointAdorner)null; PathSegmentAdorner pathSegmentAdorner = (PathSegmentAdorner)null; if (pathPointKindArray[endPointIndex] == PathPointKind.BezierHandle && endPointIndex + 2 < pathPointKindArray.Length && pathPointKindArray[endPointIndex + 2] == PathPointKind.Cubic) { pathPointAdorner = pathPointAdornerArray[endPointIndex - 1]; pathSegmentAdorner = pathSegmentAdornerArray[endPointIndex + 2]; } else if (pathPointKindArray[endPointIndex] == PathPointKind.BezierHandle && endPointIndex + 1 < pathPointKindArray.Length && pathPointKindArray[endPointIndex + 1] == PathPointKind.Cubic) { pathPointAdorner = pathPointAdornerArray[(endPointIndex + 1) % length1]; pathSegmentAdorner = pathSegmentAdornerArray[endPointIndex + 1]; } if (pathPointAdorner != null) { PathTangentAdorner pathTangentAdorner; if (index3 < list3.Count) { pathTangentAdorner = list3[index3]; pathTangentAdorner.Initialize(figureIndex, endPointIndex, segmentIndex, segmentPointIndex, pathPointAdorner, pathSegmentAdorner); oldAdornerList.Remove((Adorner)pathTangentAdorner); ++index3; } else { pathTangentAdorner = new PathTangentAdorner(this, figureIndex, endPointIndex, segmentIndex, segmentPointIndex, pathPointAdorner, pathSegmentAdorner); } newAdornerList.Add((Adorner)pathTangentAdorner); } } ++endPointIndex; } } foreach (PathPointAdorner pathPointAdorner in pathPointAdornerArray) { if (pathPointAdorner != null) { newAdornerList.Add((Adorner)pathPointAdorner); } } this.adornerOffsets.Add((object)this.AdornerList.Count); this.adornerCounts.Add((object)(this.AdornerList.Count - (int)this.adornerOffsets[this.adornerOffsets.Count - 1])); this.adornerTypes.Add((object)PathPart.PartType.PathPoint); } }
private void MoveSelection() { Matrix matrixToAdornerLayer = this.pathPartAdorner.PathAdornerSet.GetTransformMatrixToAdornerLayer(); Point pointInAdornerLayer = this.GetSnappedPointInAdornerLayer(); PathTangentAdorner pathTangentAdorner = this.pathPartAdorner as PathTangentAdorner; PathEditContext pathEditContext = new PathEditContext(this.pathPartAdorner.FigureIndex, this.pathPartAdorner.PartIndex); if (pathTangentAdorner != null) { this.EnsureEditTransaction(); this.pathEditorTarget.BeginEditing(); if (!this.HasMouseMovedAfterDown) { this.startRootPoint = PathFigureUtilities.GetPoint(this.pathEditorTarget.PathGeometry.Figures[pathEditContext.FigureIndex], pathEditContext.PartIndex, false); this.correspondingPoint = PathFigureUtilities.GetPoint(this.pathEditorTarget.PathGeometry.Figures[pathEditContext.FigureIndex], pathEditContext.PartIndex, true); } Point point = this.IsShiftDown ? this.correspondingPoint : this.startRootPoint; Vector correspondingVector = ElementUtilities.GetCorrespondingVector(pointInAdornerLayer - point * matrixToAdornerLayer, matrixToAdornerLayer, this.IsShiftDown ? this.axisConstraint : (AxisConstraint)null); new PathFigureEditor(pathEditContext.GetPathFigure(this.pathEditorTarget.PathGeometry)).MoveTangent(pathEditContext.PartIndex, point + correspondingVector, this.isEnforcingSmoothness); this.ActiveView.AdornerLayer.InvalidateAdornerVisuals(this.EditingElement); } else { this.EnsureEditTransaction(); PathPointAdorner pathPointAdorner = this.pathPartAdorner as PathPointAdorner; PathSegmentAdorner pathSegmentAdorner = this.pathPartAdorner as PathSegmentAdorner; this.pathPartAdorner.PathAdornerSet.PathEditorTarget.BeginEditing(); if (!this.HasMouseMovedAfterDown) { Point point; if (pathPointAdorner != null) { point = PathFigureUtilities.GetPoint(pathEditContext.GetPathFigure(this.pathEditorTarget.PathGeometry), pathEditContext.PartIndex); } else { PathFigureEditor pathFigureEditor = new PathFigureEditor(pathEditContext.GetPathFigure(this.pathEditorTarget.PathGeometry)); int segmentIndex; int segmentPointIndex; PathFigureUtilities.GetSegmentFromPointIndex(pathEditContext.GetPathFigure(this.pathEditorTarget.PathGeometry), pathEditContext.PartIndex, out segmentIndex, out segmentPointIndex); point = pathFigureEditor.Evaluate(segmentIndex, segmentPointIndex, this.pathSegmentParameter) * pathSegmentAdorner.PathGeometryTransformMatrix; } this.startRootPoint = point; this.previousRootPoint = this.startRootPoint; } Vector correspondingVector = ElementUtilities.GetCorrespondingVector(pointInAdornerLayer - this.startRootPoint * matrixToAdornerLayer, matrixToAdornerLayer, this.IsShiftDown ? this.axisConstraint : (AxisConstraint)null); double zoom = this.ActiveView.Artboard.Zoom; Vector rootToArtboardScale = this.ActiveView.Artboard.ViewRootToArtboardScale; correspondingVector.X /= zoom * rootToArtboardScale.X; correspondingVector.Y /= zoom * rootToArtboardScale.Y; Vector vector = this.startRootPoint - this.previousRootPoint + correspondingVector; this.previousRootPoint = this.startRootPoint + correspondingVector; Vector deltaOffset = matrixToAdornerLayer.Transform(vector); PathPartSelectionSet partSelectionSet = this.ActiveSceneViewModel.PathPartSelectionSet; if (partSelectionSet == null) { return; } foreach (BaseFrameworkElement sceneElement in (IEnumerable <SceneElement>)partSelectionSet.SelectedPaths) { this.MovePathParts(partSelectionSet, sceneElement, PathEditMode.ScenePath, deltaOffset); this.MovePathParts(partSelectionSet, sceneElement, PathEditMode.MotionPath, deltaOffset); this.MovePathParts(partSelectionSet, sceneElement, PathEditMode.ClippingPath, deltaOffset); } } }