HtexController.cs 10 KB

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