use serde::{Deserialize, Serialize};
use crate::mesh::edges_from_faces;
use crate::network::Network;
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct MeshDocument {
pub faces: Vec<Vec<usize>>,
#[serde(default)]
pub faces_load: Vec<[f64; 3]>,
#[serde(default)]
pub faces_load_local: bool,
#[serde(default)]
pub q: Option<Vec<f64>>,
}
impl MeshDocument {
pub fn apply_to_network(&self, net: &mut Network) {
net.faces = Some(self.faces.clone());
if !self.faces_load.is_empty() {
net.faces_load = Some(self.faces_load.clone());
}
net.faces_load_local = self.faces_load_local;
if let Some(ref q) = self.q {
if q.len() == net.num_edges() {
net.q.clone_from(q);
}
}
}
pub fn to_network(&self, xyz: Vec<f64>, is_support: Vec<bool>, loads: Vec<f64>) -> Network {
let edges = edges_from_faces(&self.faces);
let q = self.q.clone().unwrap_or_else(|| vec![-1.0; edges.len()]);
let net = Network {
xyz,
is_support,
loads,
edges,
q,
edges_load: None,
faces: Some(self.faces.clone()),
faces_load: if self.faces_load.is_empty() {
None
} else {
Some(self.faces_load.clone())
},
faces_load_local: self.faces_load_local,
};
net
}
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct NetworkMeshJson {
#[serde(flatten)]
pub topology: serde_json::Value,
#[serde(default)]
pub faces: Vec<Vec<usize>>,
#[serde(default)]
pub faces_load: Vec<[f64; 3]>,
#[serde(default)]
pub faces_load_local: bool,
}