//Edit selected spotlight shape to fit within the current slide public PowerPoint.Shape CreateSpotlightShape(PowerPoint.Shape spotShape) { spotShape.Copy(); bool isCallout = false; PowerPoint.Shape spotlightShape; if (spotShape.Type == Office.MsoShapeType.msoCallout) { isCallout = true; } if (isCallout) { spotlightShape = this.Shapes.Paste()[1]; LegacyShapeUtil.CopyShapePosition(spotShape, ref spotlightShape); } else { spotlightShape = this.Shapes.PasteSpecial(PowerPoint.PpPasteDataType.ppPastePNG)[1]; LegacyShapeUtil.CopyShapePosition(spotShape, ref spotlightShape); CropSpotlightPictureToSlide(ref spotlightShape); } PrepareSpotlightShape(ref spotlightShape); return(spotlightShape); }
//Return zoomed version of cropped slide picture to be used for zoom out animation private void GetShapeToZoomWithBackground(PowerPoint.Shape zoomShape) { PowerPoint.Shape referenceShape = GetReferenceShape(zoomShape); float finalWidthMagnify = referenceShape.Width; float initialWidthMagnify = zoomShape.Width; float finalHeightMagnify = referenceShape.Height; float initialHeightMagnify = zoomShape.Height; zoomShape.Copy(); PowerPoint.Shape zoomShapeCopy = _slide.Shapes.Paste()[1]; LegacyShapeUtil.CopyShapeAttributes(zoomShape, ref zoomShapeCopy); Globals.ThisAddIn.Application.ActiveWindow.View.GotoSlide(_slide.SlideIndex); zoomSlideCroppedShapes.Select(); zoomShapeCopy.Visible = Office.MsoTriState.msoTrue; zoomShapeCopy.Select(Office.MsoTriState.msoFalse); PowerPoint.ShapeRange selection = Globals.ThisAddIn.Application.ActiveWindow.Selection.ShapeRange; PowerPoint.Shape groupShape = selection.Group(); groupShape.Width *= (finalWidthMagnify / initialWidthMagnify); groupShape.Height *= (finalHeightMagnify / initialHeightMagnify); groupShape.Ungroup(); zoomSlideCroppedShapes.Left += (referenceShape.Left - zoomShapeCopy.Left); zoomSlideCroppedShapes.Top += (referenceShape.Top - zoomShapeCopy.Top); zoomShapeCopy.Delete(); referenceShape.Delete(); }
private static PowerPoint.Shape GetStepBackWithoutBackgroundShapeToZoom(PowerPointSlide addedSlide, PowerPointSlide previousSlide) { Globals.ThisAddIn.Application.ActiveWindow.Selection.Unselect(); Globals.ThisAddIn.Application.ActiveWindow.View.GotoSlide(addedSlide.Index); List <PowerPoint.Shape> copiedShapes = new List <PowerPoint.Shape>(); foreach (PowerPoint.Shape sh in previousSlide.Shapes) { if (!previousSlide.HasExitAnimation(sh) && !sh.IsHidden()) { PowerPoint.Shape shapeCopy = addedSlide.Shapes.SafeCopyPlaceholder(sh); LegacyShapeUtil.CopyShapeAttributes(sh, ref shapeCopy); copiedShapes.Add(shapeCopy); } } Globals.ThisAddIn.Application.ActiveWindow.View.GotoSlide(addedSlide.Index); SelectAllShape(copiedShapes); PowerPoint.Selection sel = Globals.ThisAddIn.Application.ActiveWindow.Selection; PowerPoint.Shape shapeGroup = sel.ShapeRange.SafeGroup(); PowerPoint.Shape previousSlidePicture = addedSlide.Shapes.SafeCopyPNG(shapeGroup); LegacyShapeUtil.CopyCenterShapePosition(shapeGroup, ref previousSlidePicture); previousSlidePicture.Name = "PPTZoomOutShape" + DateTime.Now.ToString("yyyyMMddHHmmssffff"); shapeGroup.SafeDelete(); return(previousSlidePicture); }
public void AddZoomToAreaAnimation(PowerPoint.Shape zoomShape) { PrepareForZoomToArea(zoomShape); PowerPoint.Shape shapeToZoom = null, referenceShape = null; if (!ZoomLabSettings.BackgroundZoomChecked) { shapeToZoom = GetShapeToZoom(zoomShape); referenceShape = GetReferenceShape(shapeToZoom); DefaultMotionAnimation.AddDefaultMotionAnimation(this, shapeToZoom, referenceShape, 0.5f, PowerPoint.MsoAnimTriggerType.msoAnimTriggerAfterPrevious); } else { shapeToZoom = zoomSlideCroppedShapes.Duplicate()[1]; DeleteShapeAnimations(shapeToZoom); LegacyShapeUtil.CopyShapePosition(zoomSlideCroppedShapes, ref shapeToZoom); referenceShape = GetReferenceShape(zoomShape); DefaultMotionAnimation.AddZoomToAreaMotionAnimation(this, shapeToZoom, zoomShape, referenceShape, 0.5f, PowerPoint.MsoAnimTriggerType.msoAnimTriggerAfterPrevious); } shapeToZoom.Name = "PPTLabsMagnifyAreaSlide" + DateTime.Now.ToString("yyyyMMddHHmmssffff"); referenceShape.Delete(); zoomSlideCroppedShapes.Visible = Office.MsoTriState.msoFalse; indicatorShape.ZOrder(Office.MsoZOrderCmd.msoBringToFront); }
//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> copiedShapes = new List <PowerPoint.Shape>(); foreach (PowerPoint.Shape sh in nextSlide.Shapes) { if (!nextSlide.HasEntryAnimation(sh) && !sh.IsHidden()) { PowerPoint.Shape shapeCopy = currentSlide.Shapes.SafeCopyPlaceholder(sh); LegacyShapeUtil.CopyShapeAttributes(sh, ref shapeCopy); copiedShapes.Add(shapeCopy); } } Globals.ThisAddIn.Application.ActiveWindow.View.GotoSlide(currentSlide.Index); SelectAllShape(copiedShapes); PowerPoint.Selection sel = Globals.ThisAddIn.Application.ActiveWindow.Selection; PowerPoint.Shape shapeGroup = sel.ShapeRange.SafeGroup(); pictureOnNextSlide = nextSlide.Shapes.SafeCopyPNG(shapeGroup); LegacyShapeUtil.CopyCenterShapePosition(shapeGroup, ref pictureOnNextSlide); shapeGroup.SafeDelete(); PowerPoint.Shape slidePicture = currentSlide.Shapes.SafeCopyPNG(pictureOnNextSlide); return(slidePicture); }
public void AddZoomToAreaAnimation(PowerPoint.Shape zoomShape) { PrepareForZoomToArea(); //Create zoomed-in version of the part of the slide specified by zoom shape zoomSlideCroppedShapes.PictureFormat.CropLeft += zoomShape.Left; zoomSlideCroppedShapes.PictureFormat.CropTop += zoomShape.Top; zoomSlideCroppedShapes.PictureFormat.CropRight += (PowerPointPresentation.Current.SlideWidth - (zoomShape.Left + zoomShape.Width)); zoomSlideCroppedShapes.PictureFormat.CropBottom += (PowerPointPresentation.Current.SlideHeight - (zoomShape.Top + zoomShape.Height)); LegacyShapeUtil.CopyShapePosition(zoomShape, ref zoomSlideCroppedShapes); zoomSlideCroppedShapes.LockAspectRatio = Office.MsoTriState.msoTrue; if (zoomSlideCroppedShapes.Width > zoomSlideCroppedShapes.Height) { zoomSlideCroppedShapes.Width = PowerPointPresentation.Current.SlideWidth; } else { zoomSlideCroppedShapes.Height = PowerPointPresentation.Current.SlideHeight; } zoomSlideCroppedShapes.Left = (PowerPointPresentation.Current.SlideWidth / 2) - (zoomSlideCroppedShapes.Width / 2); zoomSlideCroppedShapes.Top = (PowerPointPresentation.Current.SlideHeight / 2) - (zoomSlideCroppedShapes.Height / 2); zoomSlideCroppedShapes.PictureFormat.CropLeft = 0; zoomSlideCroppedShapes.PictureFormat.CropTop = 0; zoomSlideCroppedShapes.PictureFormat.CropRight = 0; zoomSlideCroppedShapes.PictureFormat.CropBottom = 0; indicatorShape.ZOrder(Office.MsoZOrderCmd.msoBringToFront); }
//Edit selected spotlight shape to fit within the current slide public PowerPoint.Shape CreateSpotlightShape(PowerPoint.Shape spotShape) { bool isCallout = false; PowerPoint.Shape spotlightShape; if (spotShape.Type == Office.MsoShapeType.msoCallout) { isCallout = true; } if (isCallout) { spotlightShape = this.Shapes.SafeCopy(spotShape); // confident it is not a placeholder LegacyShapeUtil.CopyCenterShapePosition(spotShape, ref spotlightShape); } else { spotlightShape = this.Shapes.SafeCopyPNG(spotShape); LegacyShapeUtil.CopyCenterShapePosition(spotShape, ref spotlightShape); CropSpotlightPictureToSlide(ref spotlightShape); } PrepareSpotlightShape(ref spotlightShape); return(spotlightShape); }
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); }
//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); }
//Return cropped version of slide picture private PowerPoint.Shape GetShapeToZoom(PowerPoint.Shape zoomShape) { PowerPoint.Shape shapeToZoom = zoomSlideCroppedShapes.Duplicate()[1]; DeleteShapeAnimations(shapeToZoom); LegacyShapeUtil.CopyShapePosition(zoomSlideCroppedShapes, ref shapeToZoom); shapeToZoom.PictureFormat.CropLeft += zoomShape.Left; shapeToZoom.PictureFormat.CropTop += zoomShape.Top; shapeToZoom.PictureFormat.CropRight += (PowerPointPresentation.Current.SlideWidth - (zoomShape.Left + zoomShape.Width)); shapeToZoom.PictureFormat.CropBottom += (PowerPointPresentation.Current.SlideHeight - (zoomShape.Top + zoomShape.Height)); LegacyShapeUtil.CopyShapePosition(zoomShape, ref shapeToZoom); return(shapeToZoom); }
//Store cropped version of slide picture as global variable private void AddZoomSlideCroppedPicture(PowerPoint.Shape zoomShape) { zoomSlideCroppedShapes = GetShapesWithPrefix("PPTLabsMagnifyAreaGroup")[0]; zoomSlideCroppedShapes.Visible = Office.MsoTriState.msoTrue; DeleteShapeAnimations(zoomSlideCroppedShapes); if (!ZoomLabSettings.BackgroundZoomChecked) { zoomSlideCroppedShapes.PictureFormat.CropLeft += zoomShape.Left; zoomSlideCroppedShapes.PictureFormat.CropTop += zoomShape.Top; zoomSlideCroppedShapes.PictureFormat.CropRight += (PowerPointPresentation.Current.SlideWidth - (zoomShape.Left + zoomShape.Width)); zoomSlideCroppedShapes.PictureFormat.CropBottom += (PowerPointPresentation.Current.SlideHeight - (zoomShape.Top + zoomShape.Height)); LegacyShapeUtil.CopyShapePosition(zoomShape, ref zoomSlideCroppedShapes); } }
//Set position, size and animations of the previous slide copy private static void PreparePreviousSlidePicture(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) && !ShapeUtil.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 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) && !ShapeUtil.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); }
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; bool isFlippedHorizontally = initialShape.HorizontalFlip != finalShape.HorizontalFlip; bool isFlippedVertically = initialShape.VerticalFlip != finalShape.VerticalFlip; if (isFlippedHorizontally) { finalWidth = -finalWidth; } if (isFlippedVertically) { finalHeight = -finalHeight; } 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; } if (initialShape.IsStraightLine()) { double initialAngle = GetLineAngle(initialShape); double finalAngle = GetLineAngle(finalShape); double deltaAngle = initialAngle - finalAngle; finalRotation = (float)(RadiansToDegrees(deltaAngle)); float initialLength = (float)Math.Sqrt(initialWidth * initialWidth + initialHeight * initialHeight); float finalLength = (float)Math.Sqrt(finalWidth * finalWidth + finalHeight * finalHeight); float initialAngleCosine = initialWidth / initialLength; float initialAngleSine = initialHeight / initialLength; finalWidth = finalLength * initialAngleCosine; finalHeight = finalLength * initialAngleSine; initialShape = MakePivotCenteredLine(animationSlide, initialShape); } int numFrames = (int)(duration / 0.04f); numFrames = (numFrames > 30) ? 30 : numFrames; initialWidth = SetToPositiveMinIfIsZero(initialWidth); initialHeight = SetToPositiveMinIfIsZero(initialHeight); finalWidth = SetToPositiveMinIfIsZero(finalWidth); finalHeight = SetToPositiveMinIfIsZero(finalHeight); 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, isFlippedHorizontally, isFlippedVertically, incrementRotation, incrementFont, duration, numFrames); }