public static void AddFrameMotionAnimation(PowerPointSlide animationSlide, PowerPoint.Shape initialShape, PowerPoint.Shape finalShape, float duration) { float initialX = (initialShape.Left + (initialShape.Width) / 2); float initialY = (initialShape.Top + (initialShape.Height) / 2); float initialRotation = initialShape.Rotation; float initialWidth = initialShape.Width; float initialHeight = initialShape.Height; float initialFont = 0.0f; float finalX = (finalShape.Left + (finalShape.Width) / 2); float finalY = (finalShape.Top + (finalShape.Height) / 2); float finalRotation = finalShape.Rotation; float finalWidth = finalShape.Width; float finalHeight = finalShape.Height; float finalFont = 0.0f; if (initialShape.HasTextFrame == Office.MsoTriState.msoTrue && (initialShape.TextFrame.HasText == Office.MsoTriState.msoTriStateMixed || initialShape.TextFrame.HasText == Office.MsoTriState.msoTrue) && initialShape.TextFrame.TextRange.Font.Size != finalShape.TextFrame.TextRange.Font.Size) { finalFont = finalShape.TextFrame.TextRange.Font.Size; initialFont = initialShape.TextFrame.TextRange.Font.Size; } int numFrames = (int)(duration / 0.04f); numFrames = (numFrames > 30) ? 30 : numFrames; float incrementWidth = ((finalWidth / initialWidth) - 1.0f) / numFrames; float incrementHeight = ((finalHeight / initialHeight) - 1.0f) / numFrames; float incrementRotation = LegacyShapeUtil.GetMinimumRotation(initialRotation, finalRotation) / numFrames; float incrementLeft = (finalX - initialX) / numFrames; float incrementTop = (finalY - initialY) / numFrames; float incrementFont = (finalFont - initialFont) / numFrames; AddFrameAnimationEffects(animationSlide, initialShape, incrementLeft, incrementTop, incrementWidth, incrementHeight, incrementRotation, incrementFont, duration, numFrames); }
//Shape dimensions should match the slide dimensions and the shape should be within the slide private static PowerPoint.Shape GetBestFitShape(PowerPointSlide currentSlide, PowerPoint.Shape zoomShape) { zoomShape.Copy(); PowerPoint.Shape zoomShapeCopy = currentSlide.Shapes.Paste()[1]; zoomShapeCopy.LockAspectRatio = Office.MsoTriState.msoFalse; if (zoomShape.Width > zoomShape.Height) { zoomShapeCopy.Width = zoomShape.Width; zoomShapeCopy.Height = PowerPointPresentation.Current.SlideHeight * zoomShapeCopy.Width / PowerPointPresentation.Current.SlideWidth; } else { zoomShapeCopy.Height = zoomShape.Height; zoomShapeCopy.Width = PowerPointPresentation.Current.SlideWidth * zoomShapeCopy.Height / PowerPointPresentation.Current.SlideHeight; } LegacyShapeUtil.CopyShapePosition(zoomShape, ref zoomShapeCopy); if (zoomShapeCopy.Width > PowerPointPresentation.Current.SlideWidth) zoomShapeCopy.Width = PowerPointPresentation.Current.SlideWidth; if (zoomShapeCopy.Height > PowerPointPresentation.Current.SlideHeight) zoomShapeCopy.Height = PowerPointPresentation.Current.SlideHeight; if (zoomShapeCopy.Left < 0) zoomShapeCopy.Left = 0; if (zoomShapeCopy.Left + zoomShapeCopy.Width > PowerPointPresentation.Current.SlideWidth) zoomShapeCopy.Left = PowerPointPresentation.Current.SlideWidth - zoomShapeCopy.Width; if (zoomShapeCopy.Top < 0) zoomShapeCopy.Top = 0; if (zoomShapeCopy.Top + zoomShapeCopy.Height > PowerPointPresentation.Current.SlideHeight) zoomShapeCopy.Top = PowerPointPresentation.Current.SlideHeight - zoomShapeCopy.Height; return zoomShapeCopy; }
private static PowerPoint.Effect AddRotationAnimation(PowerPointSlide animationSlide, PowerPoint.Shape animationShape, float initialRotation, float finalRotation, float duration, ref PowerPoint.MsoAnimTriggerType trigger) { if (finalRotation != initialRotation) { PowerPoint.Effect effectRotate = animationSlide.TimeLine.MainSequence.AddEffect(animationShape, PowerPoint.MsoAnimEffect.msoAnimEffectSpin, PowerPoint.MsoAnimateByLevel.msoAnimateLevelNone, trigger); PowerPoint.AnimationBehavior rotate = effectRotate.Behaviors[1]; effectRotate.Timing.Duration = duration; effectRotate.EffectParameters.Amount = LegacyShapeUtil.GetMinimumRotation(initialRotation, finalRotation); trigger = PowerPoint.MsoAnimTriggerType.msoAnimTriggerWithPrevious; return(effectRotate); } return(null); }
//Set position, size and animations of the previous slide copy private static void PreparePreviousSlidePicture(PowerPointSlide currentSlide, PowerPoint.Shape selectedShape, ref PowerPoint.Shape previousSlidePicture) { previousSlidePicture.LockAspectRatio = Office.MsoTriState.msoTrue; if (selectedShape.Width > selectedShape.Height) { previousSlidePicture.Height = selectedShape.Height; } else { previousSlidePicture.Width = selectedShape.Width; } LegacyShapeUtil.CopyShapePosition(selectedShape, ref previousSlidePicture); selectedShape.Visible = Office.MsoTriState.msoFalse; previousSlidePicture.Name = "PPTZoomOutShape" + DateTime.Now.ToString("yyyyMMddHHmmssffff"); }
//Return picture copy of next slide where shapes with exit animations have been deleted private static PowerPoint.Shape GetNextSlidePictureWithoutBackground(PowerPointSlide currentSlide, PowerPointSlide nextSlide, out PowerPoint.Shape pictureOnNextSlide) { Globals.ThisAddIn.Application.ActiveWindow.Selection.Unselect(); Globals.ThisAddIn.Application.ActiveWindow.View.GotoSlide(nextSlide.Index); List <PowerPoint.Shape> shapesOnNextSlide = new List <PowerPoint.Shape>(); foreach (PowerPoint.Shape sh in nextSlide.Shapes) { if (!nextSlide.HasEntryAnimation(sh) && !Graphics.IsHidden(sh)) { shapesOnNextSlide.Add(sh); } } var copiedShapes = new List <PowerPoint.Shape>(); foreach (PowerPoint.Shape sh in shapesOnNextSlide) { sh.Copy(); var shapeCopy = nextSlide.Shapes.Paste()[1]; LegacyShapeUtil.CopyShapeAttributes(sh, ref shapeCopy); copiedShapes.Add(shapeCopy); } SelectAllShape(copiedShapes); PowerPoint.Selection sel = Globals.ThisAddIn.Application.ActiveWindow.Selection; PowerPoint.Shape shapeGroup = null; if (sel.ShapeRange.Count > 1) { shapeGroup = sel.ShapeRange.Group(); } else { shapeGroup = sel.ShapeRange[1]; } shapeGroup.Copy(); pictureOnNextSlide = nextSlide.Shapes.PasteSpecial(PowerPoint.PpPasteDataType.ppPastePNG)[1]; LegacyShapeUtil.CopyShapePosition(shapeGroup, ref pictureOnNextSlide); shapeGroup.Delete(); pictureOnNextSlide.Copy(); PowerPoint.Shape slidePicture = currentSlide.Shapes.PasteSpecial(PowerPoint.PpPasteDataType.ppPastePNG)[1]; return(slidePicture); }
//Set position, size and animations of the next slide copy private static void PrepareNextSlidePicture(PowerPointSlide currentSlide, PowerPoint.Shape selectedShape, ref PowerPoint.Shape nextSlidePicture) { nextSlidePicture.LockAspectRatio = Office.MsoTriState.msoTrue; if (selectedShape.Width > selectedShape.Height) { nextSlidePicture.Height = selectedShape.Height; } else { nextSlidePicture.Width = selectedShape.Width; } LegacyShapeUtil.CopyShapePosition(selectedShape, ref nextSlidePicture); selectedShape.Visible = Office.MsoTriState.msoFalse; nextSlidePicture.Name = "PPTZoomInShape" + DateTime.Now.ToString("yyyyMMddHHmmssffff"); PowerPoint.Effect effectAppear = currentSlide.TimeLine.MainSequence.AddEffect(nextSlidePicture, PowerPoint.MsoAnimEffect.msoAnimEffectFade, PowerPoint.MsoAnimateByLevel.msoAnimateLevelNone, PowerPoint.MsoAnimTriggerType.msoAnimTriggerOnPageClick); effectAppear.Timing.Duration = 0.50f; }
private static PowerPoint.Shape GetStepBackWithoutBackgroundShapeToZoom(PowerPointSlide currentSlide, PowerPointSlide addedSlide, PowerPointSlide previousSlide) { Globals.ThisAddIn.Application.ActiveWindow.Selection.Unselect(); Globals.ThisAddIn.Application.ActiveWindow.View.GotoSlide(addedSlide.Index); var copiedShapes = new List <PowerPoint.Shape>(); foreach (PowerPoint.Shape sh in previousSlide.Shapes) { if (!previousSlide.HasExitAnimation(sh) && !Graphics.IsHidden(sh)) { sh.Copy(); PowerPoint.Shape shapeCopy = addedSlide.Shapes.Paste()[1]; LegacyShapeUtil.CopyShapeAttributes(sh, ref shapeCopy); copiedShapes.Add(shapeCopy); } } SelectAllShape(copiedShapes); PowerPoint.Selection sel = Globals.ThisAddIn.Application.ActiveWindow.Selection; PowerPoint.Shape shapeGroup = null; if (sel.ShapeRange.Count > 1) { shapeGroup = sel.ShapeRange.Group(); } else { shapeGroup = sel.ShapeRange[1]; } shapeGroup.Copy(); PowerPoint.Shape previousSlidePicture = addedSlide.Shapes.PasteSpecial(PowerPoint.PpPasteDataType.ppPastePNG)[1]; LegacyShapeUtil.CopyShapePosition(shapeGroup, ref previousSlidePicture); previousSlidePicture.Name = "PPTZoomOutShape" + DateTime.Now.ToString("yyyyMMddHHmmssffff"); shapeGroup.Delete(); return(previousSlidePicture); }