activiti流程图上获取各节点的信息获取
背景:
由于项⽬的需要,当⽤户在查看流程图时,当点击某个流程图⽚上的节点时,需要提⽰⼀些信息,这就需要获取各个节点的信息,此处获取id和name的值。
注意:这个并不是流程图的⾼亮,即当点击⽹点申请环节时,获取该节点的id和name,即B001和⽹点申请,点击部门申请时,获取B002和部门经理审批
1.下⽅说的x和y:
2.流程定义的key: 即为下⽅id的值
3.节点的id和name的值:
难点分析:
由于activiti在部署时,如果没有流程图⽚,则activiti会⾃动⽣成⼀张图⽚,⽽我们项⽬中使⽤的是activiti modeler实现的在线画流程图,部署时没有图⽚,是由activiti⾃动⽣成。⽽activiti在⽣成图⽚时,会对图⽚做⼀个裁剪操作,所有最终各个节点的坐标会⽐实际的要⼩。
(即:activiti⾃动⽣成的图⽚,会做⼀个裁剪操作,各个节点实际的x和y的值⽐xml⽂件中的要⼩)
⽽我们的难点在于,各个节点实际坐标的获取。如下图所⽰:
即我们实际上获取的坐标需要在减去⼀个minX和minY,得到的才是我们的各个节点实际的坐标。
步骤分析:
1.根据流程定义的key,重新⽣成流程图⽚,⽽不是获取流程图⽚。
2.还是根据流程定义的key,获取各个节点的信息。(此处需要注意的是各个节点实际的x和y的值的获取的⽅法)
3.在jsp页⾯上使⽤绝对定位,给点击的节点加上⾼亮。
步骤实现: 1.根据流程定义的key,重新⽣成流程图⽚,⽽不是获取流程图⽚。
此处重新⽣成图⽚的原因:
因为有些时候我们在部署流程时,将图⽚也部署进去了,此时使⽤的就是⾃⼰的图⽚,activiti不会进⾏图⽚的裁剪。因为我在下⼀步
获取流程节点的信息时,对x和y的进⾏了特殊处理,因此此处需要重新⽣成流程图⽚。
2.还是根据流程定义的key,获取各个节点的信息。
直白获取各个节点的坐标之前,我们先看⼀下activiti中是如果获取到最⼩的x和y的,然后是如何裁剪图⽚的
2.1获取节点包括线的最⼩x和最⼩y :
跟踪acticiti的源码可以发现,最⼩x和y的获取
(ine.impl.bpmn.diagram.ProcessDiagramGenerator.initProcessDiagramCanvas(BpmnModel))
Java代码
1. protected static ProcessDiagramCanvas initProcessDiagramCanvas(BpmnModel bpmnModel) {
2. // We need to calculate maximum values to know how big the image will be in its entirety
3. double minX = Double.MAX_VALUE;
4. double maxX = 0;
5. double minY = Double.MAX_VALUE;
6. double maxY = 0;
7.
8. for (Pool pool : Pools()) {
9. GraphicInfo graphicInfo = Id());
10. minX = X();
学化妆有前途吗11. maxX = X() + Width();
12. minY = Y();
美少女的谎言第二季13. maxY = Y() + Height();
16. List<FlowNode> flowNodes = gatherAllFlowNodes(bpmnModel);
17. for (FlowNode flowNode : flowNodes) {
18.
19. GraphicInfo flowNodeGraphicInfo = Id());
20.
21. // width
22. if (X() + Width() > maxX) {
23. maxX = X() + Width();
24. }
25. if (X() < minX) {
by是什么意思啊26. minX = X();
27. }
28. // height
29. if (Y() + Height() > maxY) {
30. maxY = Y() + Height();
31. }
32. if (Y() < minY) {
瘦腰瑜伽
33. minY = Y();
34. }
35.
36. for (SequenceFlow quenceFlow : OutgoingFlows()) {
37. List<GraphicInfo> graphicInfoList = Id());
38. for (GraphicInfo graphicInfo : graphicInfoList) {
39. // width
40. if (X() > maxX) {
41. maxX = X();
42. }
43. if (X() < minX) {
44. minX = X();
45. }
46. // height
47. if (Y() > maxY) {
48. maxY = Y();
49. }
50. if (Y()< minY) {
51. minY = Y();
52. }
53. }
54. }
55. }
56.
57. int nrOfLanes = 0;
58. for (Process process : Process()) {
silence
59. for (Lane l : Lanes()) {
60.
优秀家长发言稿短一点61. nrOfLanes++;
62.
63. GraphicInfo graphicInfo = Id());
64. // // width
65. if (X() + Width() > maxX) {
66. maxX = X() + Width();
67. }
小学生课堂游戏68. if (X() < minX) {
69. minX = X();
70. }
71. // height
72. if (Y() + Height() > maxY) {
73. maxY = Y() + Height();
74. }
75. if (Y() < minY) {
76. minY = Y();
77. }
78. }
79. }
juice英语怎么读80.
81. // Special ca, dehaus/brow/ACT-1431
82. if (flowNodes.size() == 0 && Pools().size() == 0 && nrOfLanes == 0) {
83. // Nothing to show
84. minX = 0;
85. minY = 0;
86. }
87.
88. return <span >new ProcessDiagramCanvas</span>((int) maxX + 10,
(int) maxY + 10, (int) minX, (int) minY);
89. }
2.2 图⽚的裁剪:
还是activiti的源码:(ine.impl.bpmn.ateImage(String))
>bravia