using DocumentFormat.OpenXml.Presentation; using HTEXLib.Animations; using HTEXLib.Helpers.ShapeHelpers; using HTEXLib.Models; using HTEXLib.Models.HTEX; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.Json; using System.Text.RegularExpressions; namespace HTEXLib.Controller { public class HtexController { private List htexElements; private readonly PPTSlide _mSlide; public double SlideWidth { get; set; } public double SlideHeight { get; set; } public HtexController(PPTSlide aSlide, int slideCounter, int slidesNumber) { this._mSlide = aSlide; this.htexElements = new List(); } public Slide GenerateHtex() { HtexSlide htexSlide = new HtexSlide(_mSlide, _mSlide.slideIndex) { ContainerShape = _mSlide.ContainerShape, }; Slide slide = new Slide() { id= Guid.NewGuid().ToString()}; Background background = _mSlide.background; if (background != null) { slide.fill = PPTXHelper.DoBackgroundProperties(background.BackgroundProperties, _mSlide, _mSlide.backgroundFrom); }; Dictionary> children = new Dictionary>(); List ditems = htexSlide.DrawElement(); List items = new List(); //处理组合图形在Wpf不能多层嵌套 int len = ditems.Count; for (int i = 0; i < len; i++) { //if (!(ditems[i] is Group && ditems[i] is Diagram) ) { // items.Add(ditems[i]); //} if (ditems[i] is Group group) { List GroupItems = new List(); // ItemGroup itemGroup = new ItemGroup { id = group.uid, items = new List() }; doGroup(group, items, GroupItems); children.Add(group.uid, GroupItems); } else if (ditems[i] is Diagram diagram) { List GroupItems = new List(); // ItemGroup itemGroup = new ItemGroup { id = diagram.uid, items = new List() }; doDiagram(diagram, items, GroupItems); children.Add(diagram.uid, GroupItems); } else { items.Add(ditems[i]); } } slide.itemGroup = children; htexElements.AddRange(items); slide.item = htexElements; List animtimes = DoAnimtime(_mSlide, slide.item); slide.animations = animtimes; return slide; } public List DoAnimtime(PPTSlide slide,List items) { int number = 1; Timing SlideMaster_Timing = slide.slideMasterPart.SlideMaster.Descendants().FirstOrDefault(); Timing SlideLayoutPart_Timing = slide.SlideLayoutPart.SlideLayout.Descendants().FirstOrDefault(); Timing Slide_Timing = slide.PSlide.Descendants().FirstOrDefault(); AnimtimeTree master_animtimeTree = null; AnimtimeTree layout_animtimeTree = null; AnimtimeTree slide_animtimeTree = null; Dictionary master_dict = new Dictionary(); Dictionary layout_dict = new Dictionary(); Dictionary slide_dict = new Dictionary(); var SlideMaster_BuildList= SlideMaster_Timing != null ? SlideMaster_Timing.BuildList : null; var SlideLayoutPart_BuildList = SlideLayoutPart_Timing != null ? SlideLayoutPart_Timing.BuildList : null; var Slide_BuildList = Slide_Timing != null ? Slide_Timing.BuildList : null; var Master_spgrp = DoBuildList(SlideMaster_BuildList); var Layout_spgrp = DoBuildList(SlideLayoutPart_BuildList); var Slide_spgrp = DoBuildList(Slide_BuildList); //播放母版的动画 master_animtimeTree= AnimtimeHelper.AddTimings(SlideMaster_Timing, "master", master_animtimeTree, slide, number, Master_spgrp,items, master_dict); //播放样式表的动画 layout_animtimeTree=AnimtimeHelper.AddTimings(SlideLayoutPart_Timing, "layout", layout_animtimeTree, slide, number, Layout_spgrp, items, layout_dict); //播放单页动画 slide_animtimeTree= AnimtimeHelper.AddTimings(Slide_Timing, "slide", slide_animtimeTree, slide, number, Slide_spgrp, items, slide_dict); List animtimeTrees = new List(); if (master_animtimeTree != null) { foreach (var dict in master_dict) { master_animtimeTree.obj_dic.Add(dict); } animtimeTrees.Add(master_animtimeTree); } if (layout_animtimeTree != null) { foreach (var dict in layout_dict) { layout_animtimeTree.obj_dic.Add(dict); } animtimeTrees.Add(layout_animtimeTree); } if (slide_animtimeTree != null) { foreach (var dict in slide_dict) { slide_animtimeTree.obj_dic.Add(dict); } animtimeTrees.Add(slide_animtimeTree); } return animtimeTrees; } public List DoBuildList(BuildList BuildList) { List spGrps = new List(); if (BuildList == null) { return spGrps; } var BuildParagraph = BuildList.Descendants(); if (BuildParagraph != null) { BuildParagraph.ToList().ForEach(x=> { spGrps.Add(new SpGrp { spid=x.ShapeId,grpId=x.GroupId}); }); } var BuildDiagram = BuildList.Descendants(); if (BuildDiagram != null) { BuildDiagram.ToList().ForEach(x => { spGrps.Add(new SpGrp { spid = x.ShapeId, grpId = x.GroupId }); }); } var BuildOleChart = BuildList.Descendants(); if (BuildOleChart != null) { BuildOleChart.ToList().ForEach(x => { spGrps.Add(new SpGrp { spid = x.ShapeId, grpId = x.GroupId }); }); } var BuildGraphics = BuildList.Descendants(); if (BuildGraphics != null) { BuildGraphics.ToList().ForEach(x => { spGrps.Add(new SpGrp { spid = x.ShapeId, grpId = x.GroupId }); }); } return spGrps; } public void doGroup(Group group, List items, List GroupItems) { if (group != null && group.shapes != null && group.shapes.Count > 0) { Shape htexGroup = new Shape { type = "Sp", style = group.style, index = group.index, uid = group.uid, sid = group.sid, opacity = group.opacity, copy = group.copy, @lock = group.@lock, //link = group.link, //audio = group.audio, links = group.links, subName = group.subName, shapeType = "rect", quDesc = group.quDesc, textBody = null, svg = group.svg }; items.Add(htexGroup); List ids = new List(); int len = group.shapes.Count; for(int i= 0; i < len;i++ ){ if (group.shapes[i] is Group gp) { doGroup(gp, items, GroupItems); } else if (group.shapes[i] is Diagram diagram) { doDiagram(diagram, items, GroupItems); } else { items.Add(group.shapes[i]); } ids.Add(group.shapes[i].uid); } GroupItems.AddRange(ids); } } public void doDiagram(Diagram group, List items, List GroupItems) { if (group != null && group.shapes != null && group.shapes.Count > 0) { Shape htexGroup = new Shape { // type = group.type, type = "Sp", style = group.style, index = group.index, uid = group.uid, sid = group.sid, opacity = group.opacity, copy = group.copy, @lock = group.@lock, //link = group.link, // audio = group.audio, links= group.links, subName = group.subName , shapeType = "rect", quDesc = group.quDesc, textBody = null, svg = group.svg }; items.Add(htexGroup); List ids = new List(); int len = group.shapes.Count; for (int i = 0; i < len; i++) { if (group.shapes[i] is Diagram diagram) { doDiagram(diagram, items, GroupItems); } else if (group.shapes[i] is Group gp) { doGroup(gp, items, GroupItems); } else { items.Add(group.shapes[i]); } ids.Add(group.shapes[i].uid); } GroupItems.AddRange(ids); } } } public class SpGrp { public string spid { get; set; } public string grpId { get; set; } } }