Skip to content

Commit f7be829

Browse files
authored
Merge pull request #3 from Lab42-Team/dev
First version of Extended Event Tree Editor (EETE)
2 parents f252c58 + 9ef27c5 commit f7be829

36 files changed

+4917
-685
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ at [getcomposer.org](http://getcomposer.org/doc/00-intro.md#installation-nix).
4444
You can then install this editor using the following command:
4545

4646
~~~
47-
composer nikita-dorodnykh/eeteditor
47+
composer create-project nikita-dorodnykh/eeteditor
4848
~~~
4949

5050

commands/EventTreesController.php

Lines changed: 352 additions & 3 deletions
Large diffs are not rendered by default.

components/EventTreeXMLGenerator.php

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,9 @@ public static function drawingParameter($xml, $id_event, $xml_element)
2828
$parameter_element = $xml->createElement('Parameter');
2929
$parameter_element->setAttribute('id', $p_elem->id);
3030
$parameter_element->setAttribute('name', $p_elem->name);
31-
$parameter_element->setAttribute('value', $p_elem->value);
3231
$parameter_element->setAttribute('description', $p_elem->description);
32+
$parameter_element->setAttribute('operator', $p_elem->getOperatorName());
33+
$parameter_element->setAttribute('value', $p_elem->value);
3334
$xml_element->appendChild($parameter_element);
3435
}
3536
}
@@ -50,9 +51,10 @@ public static function drawingEvent($xml, $event, $xml_element, $id_level)
5051
if ($event->parent_node != null){
5152
$node_element->setAttribute('parent_node', $event->parent_node);
5253
}
53-
$node_element->setAttribute('type', $event->getTypeName());
54+
$node_element->setAttribute('type', $event->getTypeNameEn());
5455
$node_element->setAttribute('name', $event->name);
5556
$node_element->setAttribute('description', $event->description);
57+
$node_element->setAttribute('certainty_factor', $event->certainty_factor);
5658
$xml_element->appendChild($node_element);
5759

5860
//отрисовка "Parameter"
@@ -105,14 +107,15 @@ public function generateEETDXMLCode($id)
105107
// Создание корневого узла Diagram
106108
$diagram_element = $xml->createElement('Diagram');
107109
$diagram_element->setAttribute('id', $diagram->id);
108-
$diagram_element->setAttribute('type', $diagram->getTypeName());
110+
$diagram_element->setAttribute('type', $diagram->getTypeNameEn());
109111
$diagram_element->setAttribute('name', $diagram->name);
110112
$diagram_element->setAttribute('description', $diagram->description);
113+
$diagram_element->setAttribute('mode', $diagram->getModesNameEn()); // Расширенное дерево // Классическое дерево
111114
// Добавление корневого узла Diagram в XML-документ
112115
$xml->appendChild($diagram_element);
113116

114117
//подбор всех Level
115-
$level_elements = Level::find()->where(['tree_diagram' => $id])->all();
118+
$level_elements = Level::find()->where(['tree_diagram' => $id])->orderBy(['id' => SORT_ASC])->all();
116119
if ($level_elements != null) {
117120
foreach ($level_elements as $l_elem) {
118121

components/EventTreeXMLImport.php

Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
<?php
2+
3+
namespace app\components;
4+
5+
use app\modules\editor\models\Level;
6+
use app\modules\editor\models\Node;
7+
use app\modules\editor\models\Sequence;
8+
use app\modules\editor\models\Parameter;
9+
use app\modules\editor\models\TreeDiagram;
10+
11+
/**
12+
* Class EventTreeXMLImport - Класс реализующий импорт деревьев событий в формате XML (EETD).
13+
* @package app\components
14+
*/
15+
class EventTreeXMLImport
16+
{
17+
public static $array_nodes;
18+
public static $j;
19+
20+
/**
21+
* Добавление нового узла (элемента) в XML-документ.
22+
*
23+
* @param $parent - родетельский xml-элемент
24+
* @param $tree_diagram_id - идентификатор диаграммы
25+
* @param $level_id - идентификатор уровня
26+
* @param $node_id - идентификатор узла (события или механизма)
27+
*/
28+
public static function addChild($parent, $tree_diagram_id, $level_id, $node_id)
29+
{
30+
//$parent родительский xml-элемент
31+
// Если у родетельского xml-элемента есть дочернии
32+
if ($parent->count() != 0) {
33+
// Получаем у родетельского xml-элемента дочернии
34+
foreach($parent->children() as $child) {
35+
// Проверки если имя дочернего элемента равны
36+
if ($child->getName() == 'Operator')
37+
self::addChild($child, $tree_diagram_id, $level_id, $node_id);
38+
if ($child->getName() == 'Event') {
39+
// Создание Node
40+
$node_model = new Node();
41+
$node_model->name = (string)$child['name'];
42+
$node_model->certainty_factor = (real)$child['certainty_factor'];
43+
$node_model->description = (string)$child['description'];
44+
$node_model->operator = Node::AND_OPERATOR;
45+
46+
if ((string)$child['type'] == 'Инициирующее событие' || (string)$child['type'] == 'Initial event')
47+
$node_model->type = Node::INITIAL_EVENT_TYPE;
48+
if ((string)$child['type'] == 'Событие' || (string)$child['type'] == 'Event')
49+
$node_model->type = Node::EVENT_TYPE;
50+
if ((string)$child['type'] == 'Механизм' || (string)$child['type'] == 'Mechanism')
51+
$node_model->type = Node::MECHANISM_TYPE;
52+
53+
// Ннахождение parent_node из таблицы $array_nodes если родитель не определен,
54+
// но присутствует значение parent_node в xml
55+
if ($node_id == null && (integer)$child['parent_node'] <> 0)
56+
for ($i = 0; $i < self::$j; $i++)
57+
if ((integer)$child['parent_node'] == self::$array_nodes[$i]['node_template'])
58+
$node_model->parent_node = self::$array_nodes[$i]['node'];
59+
else
60+
$node_model->parent_node = $node_id;
61+
$node_model->tree_diagram = $tree_diagram_id;
62+
$node_model->level_id = $level_id;
63+
$node_model->save();
64+
65+
// Таблица $array_nodes внесение значений, где:
66+
// 'node_template' значение id node из xml
67+
// 'node' значение нового id node из только что созданного
68+
self::$array_nodes[self::$j]['node_template'] = (integer)$child['id'];
69+
self::$array_nodes[self::$j]['node'] = $node_model->id;
70+
self::$j++;
71+
72+
// Создание модели Sequence
73+
$sequence_model = new Sequence();
74+
$sequence_model->tree_diagram = $tree_diagram_id;
75+
$sequence_model->level = $level_id;
76+
$sequence_model->node = $node_model->id;
77+
$sequence_model_count = Sequence::find()->where(['tree_diagram' => $tree_diagram_id])->count();
78+
$sequence_model->priority = $sequence_model_count;
79+
$sequence_model->save();
80+
81+
self::addChild($child, $tree_diagram_id, $level_id, $node_model->id);
82+
}
83+
if ($child->getName() == 'Parameter') {
84+
// Создание Parameter
85+
$parameter_model = new Parameter();
86+
$parameter_model->name = (string)$child['name'];
87+
$parameter_model->description = (string)$child['description'];
88+
if ((string)$child['operator'] == '=')
89+
$parameter_model->operator = Parameter::EQUALLY_OPERATOR;
90+
if ((string)$child['operator'] == '>')
91+
$parameter_model->operator = Parameter::MORE_OPERATOR;
92+
if ((string)$child['operator'] == '<')
93+
$parameter_model->operator = Parameter::LESS_OPERATOR;
94+
if ((string)$child['operator'] == '>=')
95+
$parameter_model->operator = Parameter::MORE_EQUAL_OPERATOR;
96+
if ((string)$child['operator'] == '<=')
97+
$parameter_model->operator = Parameter::LESS_EQUAL_OPERATOR;
98+
if ((string)$child['operator'] == '')
99+
$parameter_model->operator = Parameter::NOT_EQUAL_OPERATOR;
100+
if ((string)$child['operator'] == '')
101+
$parameter_model->operator = Parameter::APPROXIMATELY_EQUAL_OPERATOR;
102+
$parameter_model->value = (string)$child['value'];
103+
$parameter_model->node = $node_id;
104+
$parameter_model->save();
105+
}
106+
}
107+
}
108+
}
109+
110+
/**
111+
* Очистка диаграммы.
112+
*
113+
* @param $id - идентификатор диаграммы
114+
* @throws \Throwable
115+
* @throws \yii\db\StaleObjectException
116+
*/
117+
public static function cleanDiagram($id)
118+
{
119+
$level_mas = Level::find()->where(['tree_diagram' => $id])->all();
120+
foreach ($level_mas as $elem)
121+
$elem->delete();
122+
$node_mas = Node::find()->where(['tree_diagram' => $id])->all();
123+
foreach ($node_mas as $elem)
124+
$elem->delete();
125+
}
126+
127+
/**
128+
* Импорт XML-кода.
129+
*
130+
* @param $id - идентификатор диаграммы
131+
* @param $file - XML-файл дерева событий
132+
* @throws \Throwable
133+
* @throws \yii\db\StaleObjectException
134+
*/
135+
public function importXMLCode($id, $file)
136+
{
137+
self::cleanDiagram($id);
138+
139+
// Массив node (для копирования связей)
140+
self::$array_nodes = array();
141+
self::$j = 0;
142+
143+
$tree_diagram_model = TreeDiagram::find()->where(['id' => $id])->one();
144+
$tree_diagram_model->description = (string)$file['description'];
145+
$tree_diagram_model->save();
146+
147+
$parent_level = null;
148+
foreach($file->Level as $level) {
149+
$level_model = new Level();
150+
$level_model->name = (string)$level['name'];
151+
$level_model->description = (string)$level['description'];
152+
$level_model->parent_level = $parent_level;
153+
$level_model->tree_diagram = $id;
154+
$level_model->save();
155+
$parent_level = $level_model->id;
156+
// Создание дочерних элементов
157+
self::addChild($level, $id, $parent_level, null);
158+
}
159+
// Удаление файла
160+
//unlink('uploads/temp.xml');
161+
}
162+
}

0 commit comments

Comments
 (0)