import { useState } from 'react' import { useSelector, useDispatch } from 'react-redux' import { Accordion, AccordionDetails, AccordionSummary, Button, InputAdornment, List, ListItem, MenuItem, TextField, Typography } from '@material-ui/core' import { makeStyles } from '@material-ui/core/styles' import ExpandMoreIcon from '@material-ui/icons/ExpandMore' import { setResultTitle, setResultTaskId, resetResult } from '../../redux/simulationSlice' import store from '../../redux/store' import api from '../../utils/Api' import { sanitizeTitle } from '../../utils/GalleryUtils' import { isStatusDone } from '../Shared/Graph' import { saveXml } from './Helper/ToolbarTools' import SimulationScreen, { setGraphStatusClosed } from './SimulationScreen' const useStyles = makeStyles((theme) => ({ toolbar: { minHeight: '90px' }, pages: { margin: theme.spacing(0, 1) }, propertiesBox: { width: '100%' }, simulationOptions: { margin: '0px', padding: '0px', width: '100%' }, heading: { fontSize: theme.typography.pxToRem(15), fontWeight: theme.typography.fontWeightRegular } })) export default function SimulationProperties () { const title = useSelector(state => state.saveSchematic.title) const isSimRes = useSelector(state => state.simulation.isSimRes) const dispatch = useDispatch() const classes = useStyles() const [transientAnalysisControlLine, setTransientAnalysisControlLine] = useState({ final_integration_time: '30', real_time_scaling: '0', integrator_absolute_tolerance: '1E-6', integrator_relative_tolerance: '1E-6', tolerance_on_time: '1E-10', max_integration_time_interval: '100001', solver_kind: '1', maximum_step_size: '0' }) const handleTransientAnalysisControlLine = (evt) => { const value = evt.target.value setTransientAnalysisControlLine({ ...transientAnalysisControlLine, [evt.target.id]: value }) } const [simulateOpen, setSimulateOpen] = useState(false) const handleSimulateOpen = () => { setSimulateOpen(true) } const handleSimulateClose = (taskId) => { if (taskId && !isStatusDone()) { const getUrl = 'simulation/cancel/' + taskId api.get(getUrl) } setGraphStatusClosed() setSimulateOpen(false) } // Prepare Netlist to file const prepareNetlist = (netlist) => { const titleA = sanitizeTitle(title) const myblob = new Blob([netlist], { type: 'text/plain' }) const file = new File([myblob], `${titleA}.xml`, { type: 'text/xml', lastModified: Date.now() }) const type = 'XCOS' sendNetlist(file, type) } function sendNetlist (file, type) { netlistConfig(file, type) .then((response) => { const res = response.data const taskId = res.task_id dispatch(setResultTaskId(taskId)) }) .catch(function (error) { console.error(error) }) } // Upload the nelist async function netlistConfig (file, type) { const scriptTaskId = store.getState().simulation.scriptTaskId const formData = new FormData() formData.append('app_name', process.env.REACT_APP_NAME) formData.append('file', file) formData.append('type', type) if (scriptTaskId) { formData.append('script_task_id', scriptTaskId) } for (const [key, value] of Object.entries(transientAnalysisControlLine)) { formData.append(key, value) } const config = { headers: { 'Content-Type': 'multipart/form-data' } } return await api.post('simulation/upload', formData, config) } const startSimulate = (type) => { dispatch(resetResult()) const compNetlist = saveXml() switch (type) { case 'Transient': dispatch(setResultTitle('Transient Analysis Output')) break default: break } const netlist = compNetlist prepareNetlist(netlist) handleSimulateOpen() } // simulation properties add expression input box return ( <>