File size: 3,814 Bytes
8c52bbf
 
cfe4dff
8c52bbf
 
 
0d9e5b3
 
 
8c52bbf
 
0d9e5b3
8c52bbf
 
 
0d9e5b3
4a33878
0d9e5b3
 
 
8c52bbf
cfe4dff
8c52bbf
0d9e5b3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8f4ea34
 
 
 
 
 
 
 
 
 
 
0d9e5b3
 
 
8f4ea34
 
 
0d9e5b3
8f4ea34
 
0d9e5b3
 
 
8f4ea34
0d9e5b3
 
8f4ea34
 
0d9e5b3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import streamlit as st
import ast
import base64
import streamlit.components.v1 as components
from transformers import pipeline

st.set_page_config(page_title="AR/VR Code Visualizer", layout="wide")
st.title("πŸ‘“ AR/VR Code Visualizer with Call Relationships")

@st.cache_resource
def load_model():
    return pipeline("summarization", model="philschmid/bart-large-cnn-samsum")

summarizer = load_model()

uploaded_file = st.file_uploader("πŸ“ Upload a Python file", type=["py"])

if uploaded_file:
    code = uploaded_file.read().decode("utf-8")
    st.code(code, language="python")

    # Parse AST
    tree = ast.parse(code)

    # Find functions and their calls
    class FunctionCallVisitor(ast.NodeVisitor):
        def __init__(self):
            self.calls = {}  # {caller: [callee1, callee2]}

        def visit_FunctionDef(self, node):
            caller = node.name
            self.calls[caller] = []
            for child in ast.walk(node):
                if isinstance(child, ast.Call) and isinstance(child.func, ast.Name):
                    self.calls[caller].append(child.func.id)
            self.generic_visit(node)

    visitor = FunctionCallVisitor()
    visitor.visit(tree)
    call_graph = visitor.calls
    all_functions = list(call_graph.keys())

    # Show extracted relationships
    st.subheader("πŸ“Š Call Relationships")
    for fn, callees in call_graph.items():
        st.write(f"πŸ”Ή `{fn}` calls: {', '.join(callees) if callees else 'None'}")

    # Summarize using Hugging Face
    prompt = f"Explain the structure and purpose of the following functions and how they call each other: {call_graph}"
    summary = summarizer(prompt, max_length=60, min_length=15, do_sample=False)
    st.success(summary[0]['summary_text'])

    # Generate A-Frame HTML
    def generate_aframe(call_graph):
        spacing = 3
        boxes = []
        lines = []
        positions = {}

        # Assign fixed positions on x-axis
        for i, fn in enumerate(call_graph):
            x = i * spacing
            positions[fn] = (x, 1, -3)
            boxes.append(f'''
                <a-box position="{x} 1 -3" depth="0.5" height="0.5" width="2" color="#FFC65D"></a-box>
                <a-text value="{fn}" position="{x} 1.8 -3" align="center" color="#000"></a-text>
            ''')

        # Draw arrows between caller β†’ callee
        for caller, callees in call_graph.items():
            for callee in callees:
                if callee in positions:
                    x1, y1, z1 = positions[caller]
                    x2, y2, z2 = positions[callee]
                    lines.append(f'''
                        <a-entity line="start: {x1} {y1} {z1}; end: {x2} {y2} {z2}; color: red"></a-entity>
                    ''')

        html = f'''
        <!DOCTYPE html>
        <html>
          <head>
            <script src="https://aframe.io/releases/1.3.0/aframe.min.js"></script>
          </head>
          <body>
            <a-scene background="color: #ECECEC">
              <a-entity position="0 1.6 3">
                <a-camera wasd-controls-enabled="true" look-controls-enabled="true"></a-camera>
              </a-entity>
              <a-light type="ambient" color="#FFF"></a-light>
              <a-plane rotation="-90 0 0" width="40" height="40" color="#7BC8A4"></a-plane>
              {''.join(boxes)}
              {''.join(lines)}
            </a-scene>
          </body>
        </html>
        '''
        return html

    aframe_html = generate_aframe(call_graph)
    b64 = base64.b64encode(aframe_html.encode()).decode()
    data_url = f"data:text/html;base64,{b64}"

    st.subheader("🌐 3D Call Relationship Visualization")
    components.iframe(data_url, height=500)

else:
    st.info("Upload a Python file to visualize function call relationships.")