Skip to content

Commit 02ca277

Browse files
added placeholder in parameters input fields with default values
1 parent 4e7d7fe commit 02ca277

2 files changed

Lines changed: 127 additions & 94 deletions

File tree

src/App.jsx

Lines changed: 101 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,24 @@ export default function App() {
8989

9090
// Global variables state
9191
const [globalVariables, setGlobalVariables] = useState([]);
92+
const [defaultValues, setDefaultValues] = useState({});
93+
94+
// Function to fetch default values for a node type
95+
const fetchDefaultValues = async (nodeType) => {
96+
try {
97+
const response = await fetch(`http://localhost:8000/default-values/${nodeType}`);
98+
if (response.ok) {
99+
const defaults = await response.json();
100+
return defaults;
101+
} else {
102+
console.error('Failed to fetch default values');
103+
return {};
104+
}
105+
} catch (error) {
106+
console.error('Error fetching default values:', error);
107+
return {};
108+
}
109+
};
92110

93111
// Function to save a graph to computer with "Save As" dialog
94112
const saveGraph = async () => {
@@ -527,7 +545,7 @@ export default function App() {
527545
);
528546
};
529547
// Function to add a new node to the graph
530-
const addNode = () => {
548+
const addNode = async () => {
531549
// Get available node types from nodeTypes object
532550
const availableTypes = Object.keys(nodeTypes);
533551

@@ -555,73 +573,22 @@ export default function App() {
555573
const selectedType = availableTypes[choiceIndex];
556574
const newNodeId = nodeCounter.toString();
557575

558-
// Create appropriate data based on node type
576+
// Fetch default values for this node type
577+
const defaults = await fetchDefaultValues(selectedType);
578+
579+
// Store default values for this node type
580+
setDefaultValues(prev => ({
581+
...prev,
582+
[selectedType]: defaults
583+
}));
584+
585+
// Create node data with label and initialize all expected fields as empty strings
559586
let nodeData = { label: `${selectedType} ${newNodeId}` };
560587

561-
// Add type-specific default parameters
562-
switch (selectedType) {
563-
case 'process':
564-
nodeData = { ...nodeData, residence_time: '', source_term: '', initial_value: '' };
565-
break;
566-
case 'process_horizontal':
567-
nodeData = { ...nodeData, residence_time: '', source_term: '', initial_value: '' };
568-
break;
569-
case 'constant':
570-
nodeData = { ...nodeData, value: '' };
571-
break;
572-
case 'stepsource':
573-
nodeData = { ...nodeData, amplitude: '1', delay: '1' };
574-
break;
575-
case 'pulsesource':
576-
nodeData = { ...nodeData, amplitude: '1', T: '1', t_rise: '0.0', t_fall: '0.0', tau: '0.0', duty: '0.5' };
577-
break;
578-
case 'amplifier':
579-
nodeData = { ...nodeData, gain: ''};
580-
break;
581-
case 'amplifier_reverse':
582-
nodeData = { ...nodeData, gain: ''};
583-
break;
584-
case 'multiplier':
585-
break;
586-
case 'integrator':
587-
nodeData = { ...nodeData, initial_value: '', reset_times: '' };
588-
break;
589-
case 'adder':
590-
break;
591-
case 'scope':
592-
nodeData = { ...nodeData };
593-
break;
594-
case 'function':
595-
nodeData = { ...nodeData, expression: '' };
596-
break;
597-
case 'delay':
598-
nodeData = { ...nodeData, tau: '' };
599-
break;
600-
case 'rng':
601-
nodeData = { ...nodeData, sampling_rate: ''};
602-
break;
603-
case 'pid':
604-
nodeData = { ...nodeData, Kp: '', Ki: '', Kd: '', f_max: '' };
605-
break;
606-
case 'splitter2':
607-
nodeData = { ...nodeData, f1: '0.5', f2: '0.5' };
608-
break;
609-
case 'splitter3':
610-
nodeData = { ...nodeData, f1: '1/3', f2: '1/3', f3: '1/3' };
611-
break;
612-
case 'bubbler':
613-
nodeData = { ...nodeData, conversion_efficiency: '0.95', vial_efficiency: '0.9', replacement_times: '' };
614-
break;
615-
case 'white_noise':
616-
nodeData = { ...nodeData, spectral_density: '1', sampling_rate: '' };
617-
break;
618-
case 'pink_noise':
619-
nodeData = { ...nodeData, spectral_density: '1', num_octaves: '16', sampling_rate: '' };
620-
break;
621-
default:
622-
// For any other types, just use basic data
623-
break;
624-
}
588+
// Initialize all expected parameters as empty strings
589+
Object.keys(defaults).forEach(key => {
590+
nodeData[key] = '';
591+
});
625592

626593
const newNode = {
627594
id: newNodeId,
@@ -1069,37 +1036,78 @@ export default function App() {
10691036
}}
10701037
>
10711038
<h3>{selectedNode.data.label}</h3>
1072-
{Object.entries(selectedNode.data)
1073-
.map(([key, value]) => (
1074-
<div key={key} style={{ marginBottom: '10px' }}>
1075-
<label>{key}:</label>
1076-
<input
1077-
type="text"
1078-
value={value}
1079-
onChange={(e) => {
1080-
const newValue = e.target.value;
1081-
const updatedNode = {
1082-
...selectedNode,
1083-
data: { ...selectedNode.data, [key]: newValue },
1084-
};
1085-
1086-
setNodes((nds) =>
1087-
nds.map((node) =>
1088-
node.id === selectedNode.id ? updatedNode : node
1089-
)
1090-
);
1091-
setSelectedNode(updatedNode);
1092-
1093-
}}
1039+
{(() => {
1040+
// Get default values for this node type
1041+
const nodeDefaults = defaultValues[selectedNode.type] || {};
1042+
1043+
// Create a list of all possible parameters (both current data and defaults)
1044+
const allParams = new Set([
1045+
...Object.keys(selectedNode.data),
1046+
...Object.keys(nodeDefaults)
1047+
]);
1048+
1049+
return Array.from(allParams)
1050+
.map(key => {
1051+
const currentValue = selectedNode.data[key] || '';
1052+
const defaultValue = nodeDefaults[key];
1053+
const placeholder = defaultValue !== undefined && defaultValue !== null ?
1054+
String(defaultValue) : '';
1055+
1056+
return (
1057+
<div key={key} style={{ marginBottom: '10px' }}>
1058+
<label style={{
1059+
color: '#ffffff',
1060+
display: 'block',
1061+
marginBottom: '4px',
1062+
fontSize: '14px'
1063+
}}>
1064+
{key}:
1065+
</label>
1066+
<input
1067+
type="text"
1068+
value={currentValue}
1069+
placeholder={placeholder}
1070+
onChange={(e) => {
1071+
const newValue = e.target.value;
1072+
const updatedNode = {
1073+
...selectedNode,
1074+
data: { ...selectedNode.data, [key]: newValue },
1075+
};
10941076

1095-
style={{ width: '100%', marginTop: 4 }}
1096-
/>
1097-
</div>
1098-
))}
1077+
setNodes((nds) =>
1078+
nds.map((node) =>
1079+
node.id === selectedNode.id ? updatedNode : node
1080+
)
1081+
);
1082+
setSelectedNode(updatedNode);
1083+
}}
1084+
style={{
1085+
width: '100%',
1086+
marginTop: 4,
1087+
padding: '8px',
1088+
borderRadius: '4px',
1089+
border: '1px solid #555',
1090+
backgroundColor: '#2a2a3e',
1091+
color: '#ffffff',
1092+
fontSize: '14px'
1093+
}}
1094+
/>
1095+
</div>
1096+
);
1097+
});
1098+
})()}
10991099

11001100
<br />
11011101
<button
1102-
style={{ marginTop: 10 }}
1102+
style={{
1103+
marginTop: 10,
1104+
padding: '8px 16px',
1105+
backgroundColor: '#666',
1106+
color: 'white',
1107+
border: 'none',
1108+
borderRadius: '4px',
1109+
cursor: 'pointer'
1110+
}}
11031111
onClick={() => setSelectedNode(null)}
11041112
>
11051113
Close

src/backend.py

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@
77
from plotly.subplots import make_subplots
88
import plotly
99
import json as plotly_json
10+
import inspect
1011

1112
from .convert_to_python import convert_graph_to_python
12-
from .pathsim_utils import make_pathsim_model
13+
from .pathsim_utils import make_pathsim_model, map_str_to_object
1314
from pathsim.blocks import Scope
1415

1516
app = Flask(__name__)
@@ -34,6 +35,30 @@ def health_check():
3435
), 200
3536

3637

38+
# returns default values for parameters of a node
39+
@app.route("/default-values/<string:node_type>", methods=["GET"])
40+
def get_default_values(node_type):
41+
try:
42+
if node_type not in map_str_to_object:
43+
return jsonify({"error": f"Unknown node type: {node_type}"}), 400
44+
45+
block_class = map_str_to_object[node_type]
46+
parameters_for_class = inspect.signature(block_class.__init__).parameters
47+
default_values = {}
48+
for param in parameters_for_class:
49+
if param != "self": # Skip 'self' parameter
50+
default_value = parameters_for_class[param].default
51+
if default_value is inspect._empty:
52+
default_values[param] = None # Handle empty defaults
53+
else:
54+
default_values[param] = default_value
55+
return jsonify(default_values)
56+
except Exception as e:
57+
return jsonify(
58+
{"error": f"Could not get default values for {node_type}: {str(e)}"}
59+
), 400
60+
61+
3762
# Function to save graphs
3863
@app.route("/save", methods=["POST"])
3964
def save_graph():

0 commit comments

Comments
 (0)