HtexController.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. using DocumentFormat.OpenXml.Presentation;
  2. using HTEXLib.Animations;
  3. using HTEXLib.Helpers.ShapeHelpers;
  4. using HTEXLib.Models;
  5. using HTEXLib.Models.HTEX;
  6. using Newtonsoft.Json.Linq;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Linq;
  10. using System.Text;
  11. using System.Text.Json;
  12. using System.Text.RegularExpressions;
  13. namespace HTEXLib.Controller
  14. {
  15. public class HtexController
  16. {
  17. private List<Item> htexElements;
  18. private readonly PPTSlide _mSlide;
  19. public double SlideWidth { get; set; }
  20. public double SlideHeight { get; set; }
  21. public HtexController(PPTSlide aSlide, int slideCounter, int slidesNumber)
  22. {
  23. this._mSlide = aSlide;
  24. this.htexElements = new List<Item>();
  25. }
  26. public Slide GenerateHtex() {
  27. HtexSlide htexSlide = new HtexSlide(_mSlide, _mSlide.slideIndex)
  28. {
  29. ContainerShape = _mSlide.ContainerShape,
  30. };
  31. Slide slide = new Slide() { id= Guid.NewGuid().ToString()};
  32. Background background = _mSlide.background;
  33. if (background != null)
  34. {
  35. slide.fill = PPTXHelper.DoBackgroundProperties(background.BackgroundProperties, _mSlide, _mSlide.backgroundFrom);
  36. };
  37. Dictionary<string, List<string>> children = new Dictionary<string, List<string>>();
  38. List<Item> ditems = htexSlide.DrawElement();
  39. List<Item> items = new List<Item>();
  40. //处理组合图形在Wpf不能多层嵌套
  41. int len = ditems.Count;
  42. for (int i = 0; i < len; i++)
  43. {
  44. //if (!(ditems[i] is Group && ditems[i] is Diagram) ) {
  45. // items.Add(ditems[i]);
  46. //}
  47. if (ditems[i] is Group group)
  48. {
  49. List<string> GroupItems = new List<string>();
  50. // ItemGroup itemGroup = new ItemGroup { id = group.uid, items = new List<string>() };
  51. doGroup(group, items, GroupItems);
  52. children.Add(group.uid, GroupItems);
  53. }
  54. else if (ditems[i] is Diagram diagram)
  55. {
  56. List<string> GroupItems = new List<string>();
  57. // ItemGroup itemGroup = new ItemGroup { id = diagram.uid, items = new List<string>() };
  58. doDiagram(diagram, items, GroupItems);
  59. children.Add(diagram.uid, GroupItems);
  60. }
  61. else
  62. {
  63. items.Add(ditems[i]);
  64. }
  65. }
  66. slide.itemGroup = children;
  67. htexElements.AddRange(items);
  68. slide.item = htexElements;
  69. List<AnimtimeTree> animtimes = DoAnimtime(_mSlide, slide.item);
  70. slide.animations = animtimes;
  71. return slide;
  72. }
  73. public List<AnimtimeTree> DoAnimtime(PPTSlide slide,List<Item> items) {
  74. int number = 1;
  75. Timing SlideMaster_Timing = slide.slideMasterPart.SlideMaster.Descendants<Timing>().FirstOrDefault();
  76. Timing SlideLayoutPart_Timing = slide.SlideLayoutPart.SlideLayout.Descendants<Timing>().FirstOrDefault();
  77. Timing Slide_Timing = slide.PSlide.Descendants<Timing>().FirstOrDefault();
  78. AnimtimeTree master_animtimeTree = null;
  79. AnimtimeTree layout_animtimeTree = null;
  80. AnimtimeTree slide_animtimeTree = null;
  81. Dictionary<string, AnimtimeData> master_dict = new Dictionary<string, AnimtimeData>();
  82. Dictionary<string, AnimtimeData> layout_dict = new Dictionary<string, AnimtimeData>();
  83. Dictionary<string, AnimtimeData> slide_dict = new Dictionary<string, AnimtimeData>();
  84. var SlideMaster_BuildList= SlideMaster_Timing != null ? SlideMaster_Timing.BuildList : null;
  85. var SlideLayoutPart_BuildList = SlideLayoutPart_Timing != null ? SlideLayoutPart_Timing.BuildList : null;
  86. var Slide_BuildList = Slide_Timing != null ? Slide_Timing.BuildList : null;
  87. var Master_spgrp = DoBuildList(SlideMaster_BuildList);
  88. var Layout_spgrp = DoBuildList(SlideLayoutPart_BuildList);
  89. var Slide_spgrp = DoBuildList(Slide_BuildList);
  90. //播放母版的动画
  91. master_animtimeTree= AnimtimeHelper.AddTimings(SlideMaster_Timing, "master", master_animtimeTree, slide, number, Master_spgrp,items, master_dict);
  92. //播放样式表的动画
  93. layout_animtimeTree=AnimtimeHelper.AddTimings(SlideLayoutPart_Timing, "layout", layout_animtimeTree, slide, number, Layout_spgrp, items, layout_dict);
  94. //播放单页动画
  95. slide_animtimeTree= AnimtimeHelper.AddTimings(Slide_Timing, "slide", slide_animtimeTree, slide, number, Slide_spgrp, items, slide_dict);
  96. List<AnimtimeTree> animtimeTrees = new List<AnimtimeTree>();
  97. if (master_animtimeTree != null)
  98. {
  99. foreach (var dict in master_dict) {
  100. master_animtimeTree.obj_dic.Add(dict);
  101. }
  102. animtimeTrees.Add(master_animtimeTree);
  103. }
  104. if (layout_animtimeTree != null)
  105. {
  106. foreach (var dict in layout_dict)
  107. {
  108. layout_animtimeTree.obj_dic.Add(dict);
  109. }
  110. animtimeTrees.Add(layout_animtimeTree);
  111. }
  112. if (slide_animtimeTree != null)
  113. {
  114. foreach (var dict in slide_dict)
  115. {
  116. slide_animtimeTree.obj_dic.Add(dict);
  117. }
  118. animtimeTrees.Add(slide_animtimeTree);
  119. }
  120. return animtimeTrees;
  121. }
  122. public List<SpGrp> DoBuildList(BuildList BuildList) {
  123. List<SpGrp> spGrps = new List<SpGrp>();
  124. if (BuildList == null) {
  125. return spGrps;
  126. }
  127. var BuildParagraph = BuildList.Descendants<BuildParagraph>();
  128. if (BuildParagraph != null) {
  129. BuildParagraph.ToList().ForEach(x=> { spGrps.Add(new SpGrp { spid=x.ShapeId,grpId=x.GroupId}); });
  130. }
  131. var BuildDiagram = BuildList.Descendants<BuildDiagram>();
  132. if (BuildDiagram != null)
  133. {
  134. BuildDiagram.ToList().ForEach(x => { spGrps.Add(new SpGrp { spid = x.ShapeId, grpId = x.GroupId }); });
  135. }
  136. var BuildOleChart = BuildList.Descendants<BuildOleChart>();
  137. if (BuildOleChart != null)
  138. {
  139. BuildOleChart.ToList().ForEach(x => { spGrps.Add(new SpGrp { spid = x.ShapeId, grpId = x.GroupId }); });
  140. }
  141. var BuildGraphics = BuildList.Descendants<BuildGraphics>();
  142. if (BuildGraphics != null)
  143. {
  144. BuildGraphics.ToList().ForEach(x => { spGrps.Add(new SpGrp { spid = x.ShapeId, grpId = x.GroupId }); });
  145. }
  146. return spGrps;
  147. }
  148. public void doGroup(Group group, List<Item> items, List<string> GroupItems)
  149. {
  150. if (group != null && group.shapes != null && group.shapes.Count > 0)
  151. {
  152. Shape htexGroup = new Shape
  153. {
  154. type = "Sp",
  155. style = group.style,
  156. index = group.index,
  157. uid = group.uid,
  158. sid = group.sid,
  159. opacity = group.opacity,
  160. copy = group.copy,
  161. @lock = group.@lock,
  162. //link = group.link,
  163. //audio = group.audio,
  164. links = group.links,
  165. subName = group.subName,
  166. shapeType = "rect",
  167. quDesc = group.quDesc,
  168. textBody = null,
  169. svg = group.svg
  170. };
  171. items.Add(htexGroup);
  172. List<string> ids = new List<string>();
  173. int len = group.shapes.Count;
  174. for(int i= 0; i < len;i++ ){
  175. if (group.shapes[i] is Group gp)
  176. {
  177. doGroup(gp, items, GroupItems);
  178. }
  179. else if (group.shapes[i] is Diagram diagram)
  180. {
  181. doDiagram(diagram, items, GroupItems);
  182. }
  183. else {
  184. items.Add(group.shapes[i]);
  185. }
  186. ids.Add(group.shapes[i].uid);
  187. }
  188. GroupItems.AddRange(ids);
  189. }
  190. }
  191. public void doDiagram(Diagram group, List<Item> items, List<string> GroupItems)
  192. {
  193. if (group != null && group.shapes != null && group.shapes.Count > 0)
  194. {
  195. Shape htexGroup = new Shape
  196. {
  197. // type = group.type,
  198. type = "Sp",
  199. style = group.style,
  200. index = group.index,
  201. uid = group.uid,
  202. sid = group.sid,
  203. opacity = group.opacity,
  204. copy = group.copy,
  205. @lock = group.@lock,
  206. //link = group.link,
  207. // audio = group.audio,
  208. links= group.links,
  209. subName = group.subName ,
  210. shapeType = "rect",
  211. quDesc = group.quDesc,
  212. textBody = null,
  213. svg = group.svg
  214. };
  215. items.Add(htexGroup);
  216. List<string> ids = new List<string>();
  217. int len = group.shapes.Count;
  218. for (int i = 0; i < len; i++)
  219. {
  220. if (group.shapes[i] is Diagram diagram)
  221. {
  222. doDiagram(diagram, items, GroupItems);
  223. }
  224. else if (group.shapes[i] is Group gp)
  225. {
  226. doGroup(gp, items, GroupItems);
  227. }
  228. else
  229. {
  230. items.Add(group.shapes[i]);
  231. }
  232. ids.Add(group.shapes[i].uid);
  233. }
  234. GroupItems.AddRange(ids);
  235. }
  236. }
  237. }
  238. public class SpGrp {
  239. public string spid { get; set; }
  240. public string grpId { get; set; }
  241. }
  242. }