|
|
import gradio as gr |
|
|
import numpy as np |
|
|
import plotly.graph_objects as go |
|
|
from dataclasses import dataclass |
|
|
|
|
|
@dataclass |
|
|
class Project: |
|
|
name: str |
|
|
difficulty: str |
|
|
components: list |
|
|
description: str |
|
|
model_data: dict |
|
|
|
|
|
class VirtualLab3D: |
|
|
def __init__(self): |
|
|
self.projects = { |
|
|
'basic': self._load_basic_projects(), |
|
|
'intermediate': self._load_intermediate_projects(), |
|
|
'advanced': self._load_advanced_projects() |
|
|
} |
|
|
|
|
|
def _load_basic_projects(self): |
|
|
return { |
|
|
'led_circuit': { |
|
|
'name': 'LED Circuit', |
|
|
'components': ['LED', 'Resistor', 'Battery'], |
|
|
'steps': ['Connect resistor to LED', 'Add power source'], |
|
|
'model': self._create_led_model() |
|
|
}, |
|
|
'voltage_divider': { |
|
|
'name': 'Voltage Divider', |
|
|
'components': ['Resistor x2', 'Power Source'], |
|
|
'steps': ['Series connection', 'Measure output voltage'], |
|
|
'model': self._create_voltage_divider_model() |
|
|
} |
|
|
} |
|
|
|
|
|
def _load_intermediate_projects(self): |
|
|
return { |
|
|
'arduino_robot': { |
|
|
'name': 'Arduino Robot Arm', |
|
|
'components': ['Arduino Uno', 'Servo Motors x3', 'Power Supply'], |
|
|
'steps': ['Servo wiring', 'Arduino programming', '3D assembly'], |
|
|
'model': self._create_robot_model() |
|
|
}, |
|
|
'oscilloscope': { |
|
|
'name': 'Digital Oscilloscope', |
|
|
'components': ['MCU', 'ADC', 'Display', 'Amplifier'], |
|
|
'steps': ['Signal conditioning', 'ADC setup', 'Display interface'], |
|
|
'model': self._create_oscilloscope_model() |
|
|
} |
|
|
} |
|
|
|
|
|
def _load_advanced_projects(self): |
|
|
return { |
|
|
'smart_grid': { |
|
|
'name': 'Smart Grid Simulator', |
|
|
'components': ['Power Sources', 'Load Banks', 'Smart Meters'], |
|
|
'steps': ['Grid topology', 'Power flow analysis', 'Control system'], |
|
|
'model': self._create_smart_grid_model() |
|
|
}, |
|
|
'quantum_circuit': { |
|
|
'name': 'Quantum Circuit Simulator', |
|
|
'components': ['Quantum Gates', 'Qubits', 'Measurement Units'], |
|
|
'steps': ['Circuit design', 'Quantum operations', 'State analysis'], |
|
|
'model': self._create_quantum_model() |
|
|
} |
|
|
} |
|
|
|
|
|
def _create_led_model(self): |
|
|
|
|
|
return { |
|
|
'name': 'LED Circuit', |
|
|
'vertices': np.array([[0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0]]), |
|
|
'faces': np.array([[0, 1, 2], [0, 2, 3]]) |
|
|
} |
|
|
|
|
|
def _create_voltage_divider_model(self): |
|
|
|
|
|
return { |
|
|
'name': 'Voltage Divider', |
|
|
'vertices': np.array([[0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0]]), |
|
|
'faces': np.array([[0, 1, 2], [0, 2, 3]]) |
|
|
} |
|
|
|
|
|
def _create_robot_model(self): |
|
|
|
|
|
return { |
|
|
'name': 'Arduino Robot Arm', |
|
|
'vertices': np.array([[0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0]]), |
|
|
'faces': np.array([[0, 1, 2], [0, 2, 3]]) |
|
|
} |
|
|
|
|
|
def _create_oscilloscope_model(self): |
|
|
|
|
|
return { |
|
|
'name': 'Digital Oscilloscope', |
|
|
'vertices': np.array([[0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0]]), |
|
|
'faces': np.array([[0, 1, 2], [0, 2, 3]]) |
|
|
} |
|
|
|
|
|
def _create_smart_grid_model(self): |
|
|
|
|
|
return { |
|
|
'name': 'Smart Grid Simulator', |
|
|
'vertices': np.array([[0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0]]), |
|
|
'faces': np.array([[0, 1, 2], [0, 2, 3]]) |
|
|
} |
|
|
|
|
|
def _create_quantum_model(self): |
|
|
|
|
|
return { |
|
|
'name': 'Quantum Circuit Simulator', |
|
|
'vertices': np.array([[0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0]]), |
|
|
'faces': np.array([[0, 1, 2], [0, 2, 3]]) |
|
|
} |
|
|
|
|
|
def _create_3d_model(self, data): |
|
|
fig = go.Figure(data=[ |
|
|
go.Mesh3d( |
|
|
x=data['vertices'][:, 0], |
|
|
y=data['vertices'][:, 1], |
|
|
z=data['vertices'][:, 2], |
|
|
i=data['faces'][:, 0], |
|
|
j=data['faces'][:, 1], |
|
|
k=data['faces'][:, 2], |
|
|
color='lightblue', |
|
|
opacity=0.7 |
|
|
) |
|
|
]) |
|
|
fig.update_layout( |
|
|
scene=dict( |
|
|
aspectmode='data' |
|
|
), |
|
|
title=data['name'] |
|
|
) |
|
|
return fig |
|
|
|
|
|
def get_project_info(self, difficulty, project_name): |
|
|
project = self.projects[difficulty][project_name] |
|
|
model_data = self._create_3d_model(project['model']) |
|
|
return { |
|
|
'name': project['name'], |
|
|
'components': project['components'], |
|
|
'steps': project['steps'], |
|
|
'model': model_data, |
|
|
'difficulty': difficulty |
|
|
} |
|
|
|
|
|
def simulate_project(self, project_data, parameters): |
|
|
|
|
|
results = { |
|
|
'voltage': [], |
|
|
'current': [], |
|
|
'power': [], |
|
|
'temperature': [] |
|
|
} |
|
|
t = np.linspace(0, 10, 100) |
|
|
|
|
|
if project_data['difficulty'] == 'basic': |
|
|
results['voltage'] = np.sin(t) |
|
|
results['current'] = np.cos(t) |
|
|
elif project_data['difficulty'] == 'intermediate': |
|
|
results['voltage'] = np.sin(2*t) |
|
|
results['current'] = np.cos(2*t) |
|
|
results['temperature'] = 20 + 5*np.sin(t/2) |
|
|
else: |
|
|
results['voltage'] = np.sin(3*t) |
|
|
results['current'] = np.cos(3*t) |
|
|
results['power'] = np.sin(3*t) * np.cos(3*t) |
|
|
results['temperature'] = 25 + 10*np.sin(t/3) |
|
|
|
|
|
return results |
|
|
|
|
|
def create_interface(): |
|
|
def process_project(difficulty, project_name, parameters): |
|
|
lab = VirtualLab3D() |
|
|
project_info = lab.get_project_info(difficulty, project_name) |
|
|
simulation = lab.simulate_project(project_info, parameters) |
|
|
|
|
|
return ( |
|
|
project_info['model'], |
|
|
f""" |
|
|
π Project: {project_info['name']} |
|
|
|
|
|
π§ Components Required: |
|
|
{', '.join(project_info['components'])} |
|
|
|
|
|
π Implementation Steps: |
|
|
{', '.join(project_info['steps'])} |
|
|
|
|
|
π Simulation Results: |
|
|
- Peak Voltage: {max(simulation['voltage']):.2f}V |
|
|
- Max Current: {max(simulation['current']):.2f}A |
|
|
- Power Usage: {np.mean(simulation.get('power', [0])):.2f}W |
|
|
|
|
|
π― Learning Objectives: |
|
|
1. Circuit design principles |
|
|
2. Component integration |
|
|
3. System analysis |
|
|
4. Troubleshooting skills |
|
|
""" |
|
|
) |
|
|
|
|
|
iface = gr.Interface( |
|
|
fn=process_project, |
|
|
inputs=[ |
|
|
gr.Dropdown(choices=["basic", "intermediate", "advanced"], label="Difficulty Level"), |
|
|
gr.Dropdown(choices=["led_circuit", "voltage_divider", "arduino_robot", "oscilloscope", "smart_grid", "quantum_circuit"], label="Project Type"), |
|
|
gr.Slider(minimum=0, maximum=100, label="Simulation Parameters") |
|
|
], |
|
|
outputs=[ |
|
|
gr.Plot(label="3D Model Visualization"), |
|
|
gr.Textbox(label="Project Details and Analysis") |
|
|
], |
|
|
title="π¬ 3D Virtual Electrical Engineering Lab", |
|
|
description="Experiment with various electrical projects in a 3D virtual environment" |
|
|
) |
|
|
return iface |
|
|
|
|
|
if __name__ == "__main__": |
|
|
interface = create_interface() |
|
|
interface.launch(share=True) |