From 13642c2f06060f206b43ddc183b9c58d80ae121d Mon Sep 17 00:00:00 2001 From: codeboss <2422523675@qq.com> Date: Wed, 31 Jul 2024 11:47:09 +0800 Subject: [PATCH] base-prototype --- .idea/workspace.xml | 30 ++++++++- frame/ContentView.py | 63 +++++++++++++++++- graph/DataType.py | 5 +- graph/__pycache__/DataType.cpython-312.pyc | Bin 3033 -> 3134 bytes graph/directed_acyclic_graph/DAGPresent.py | 11 +-- .../__pycache__/DAGPresent.cpython-312.pyc | Bin 0 -> 15361 bytes parse/StoryMap.py | 8 ++- parse/__pycache__/StoryMap.cpython-312.pyc | Bin 8005 -> 8312 bytes 8 files changed, 104 insertions(+), 13 deletions(-) create mode 100644 graph/directed_acyclic_graph/__pycache__/DAGPresent.cpython-312.pyc diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 2d48b85..edc6068 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -6,9 +6,10 @@ + - + - + + + + + @@ -156,6 +181,7 @@ + diff --git a/frame/ContentView.py b/frame/ContentView.py index 6322abd..4e8259a 100644 --- a/frame/ContentView.py +++ b/frame/ContentView.py @@ -1,4 +1,61 @@ -from PyQt5.QtWidgets import QApplication, QWidget -from networkx import DiGraph -import networkx as nx +from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout +from graph.directed_acyclic_graph.DAGPresent import DAGActiveView, Direction +from parse.StoryMap import StoryMap, FragmentSlice, XAST_ParseTool +from graph.DataType import Arrow, Point +import sys +from typing import Dict,List +from parse.ast_load import global_ast_path + +class FragmentPoint(Point): + def __init__(self, name: str, start_mark: bool): + Point.__init__(self, name, start_mark) + pass + + +class ContentWindow(QWidget): + def __init__(self, parent): + QWidget.__init__(self, parent) + layout = QVBoxLayout(self) + self.fragment_view = DAGActiveView(Direction.RankLR, self) + layout.addWidget(self.fragment_view) + pass + pass + + def present_stories_graph(self, graph: Dict[str, StoryMap]) -> None: + arrows: List[Arrow] = [] + for story_name in graph: + fragments = graph[story_name].slice_list + for fragi in range(1, len(fragments)): + start_frag = fragments[fragi - 1] + start_node_label = f"{start_frag.parent_story}&{start_frag.is_define_node[1]}" + if not start_frag.is_define_node[0]: + start_node_label = f"{start_frag.story_refer}&{start_frag.fragm_refer}" + if fragi == 1: + start_node_label = story_name + + end_frag = fragments[fragi] + end_node_label = f"{end_frag.parent_story}&{end_frag.is_define_node[1]}" + if not end_frag.is_define_node[0]: + end_node_label = f"{end_frag.story_refer}&{end_frag.fragm_refer}" + + arrows.append(Arrow( + FragmentPoint(start_node_label, fragi == 1), + FragmentPoint(end_node_label, False)) + ) + pass + pass + + self.fragment_view.update_with_edges(arrows) + pass + + +if __name__ == "__main__": + app = QApplication(sys.argv) + view = ContentWindow(None) + view.show() + + tool = XAST_ParseTool(global_ast_path) + view.present_stories_graph(tool.get_story_graph()) + + app.exec() \ No newline at end of file diff --git a/graph/DataType.py b/graph/DataType.py index 100a964..e98f09d 100644 --- a/graph/DataType.py +++ b/graph/DataType.py @@ -12,15 +12,16 @@ class Pos: class Point: - def __init__(self, name:str): + def __init__(self, name:str, start_mark: bool): self.point_name = name + self.is_start = start_mark pass def name(self) -> str: return self.point_name def make_copy(self) -> 'Point': - return Point(self.point_name) + return Point(self.point_name, self.is_start) class Line: diff --git a/graph/__pycache__/DataType.cpython-312.pyc b/graph/__pycache__/DataType.cpython-312.pyc index 7644fdf907547892bc1ce203f5f22e4fdff426e6..43b744ffda6da18b0120391b575d1a07daee1d94 100644 GIT binary patch delta 640 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 literal 0 HcmV?d00001 diff --git a/parse/StoryMap.py b/parse/StoryMap.py index d9ed95c..f90d359 100644 --- a/parse/StoryMap.py +++ b/parse/StoryMap.py @@ -83,7 +83,7 @@ class XAST_ParseTool: if node.getAttribute("name") == name: mem_node = StoryMap(name) mem_node.sort_index = int(node.getAttribute("sort")) - return (mem_node, node) + return mem_node, node pass return None @@ -134,6 +134,12 @@ class XAST_ParseTool: pass pass pass + + def get_story_graph(self) -> Dict[str, StoryMap]: + story_dict = storyline_list2map(self.story_list) + self.storylines_plait(story_dict) + return story_dict + pass diff --git a/parse/__pycache__/StoryMap.cpython-312.pyc b/parse/__pycache__/StoryMap.cpython-312.pyc index 84dda602e5ad8a91b2e05388a2767a6edc766cd0..23db8e76a363c63c844e766b6620b237d2b0a975 100644 GIT binary patch delta 396 zcmX?V_rrnjG%qg~0}ynsUYTYux{*(poAKG?g{-oZBe}Oor7)-Rr!uE~mVwL(WYCkHZ%aRdRCPiH7$oLtSU z##YN%!;r-~xsX|SatsGIcMW4OLs2GBfhP0h|FWX>&Ol~S4v5cGBnG5zaTS;37gffm zWG0ssGXVt@6pF+_;{55UCGils^rFOqj4HVZ$Ka6ofW)HW)R6rA96dDoE}*7j6(G^T za7R>q15Cs(g!IV4H