diff --git a/examples/pa_doublepass_graph.rs b/examples/pa_doublepass_graph.rs index e8fe55421cdfb27b6617f03fa9267d3e2d0c159e..b6bf1e32e164467e0a8028cb9a9e4449419bb8cc 100644 --- a/examples/pa_doublepass_graph.rs +++ b/examples/pa_doublepass_graph.rs @@ -8,7 +8,7 @@ use std::io::Write; fn main() { let mut scenery = OpticScenery::new(); scenery.set_description("PreAmp Doublepass section".into()); - let n0 = scenery.add_element("LightSource", NodeSource); + let n0 = scenery.add_element("LightSource", NodeSource::default()); let n1 = scenery.add_element("TFP", NodeDummy); let n2 = scenery.add_element("19mm amp", NodeDummy); let n3 = scenery.add_element("Faraday", NodeDummy); @@ -38,7 +38,7 @@ fn main() { let g_n1 = group.add_node(OpticNode::new("Beamsplitter", NodeDummy)); let g_n2 = group.add_node(OpticNode::new("Lens", NodeDummy)); let g_n3 = group.add_node(OpticNode::new("Lens2", NodeDummy)); - let g_n4 = group.add_node(OpticNode::new("Det", NodeDetector)); + let g_n4 = group.add_node(OpticNode::new("Det", NodeDetector::default())); group.connect_nodes(g_n1, "rear", g_n2, "front").unwrap(); group.connect_nodes(g_n2, "rear", g_n3, "front").unwrap(); diff --git a/examples/source_detector_test.rs b/examples/source_detector_test.rs new file mode 100644 index 0000000000000000000000000000000000000000..2e2c6e9f4c6379843ecd78856f80c81439dad003 --- /dev/null +++ b/examples/source_detector_test.rs @@ -0,0 +1,26 @@ +use std::fs::File; +use std::io::Write; + +use opossum::{ + lightdata::{LightData, LightDataEnergy}, + nodes::{NodeDetector, NodeSource}, + optic_scenery::OpticScenery, +}; + +fn main() { + let mut scenery = OpticScenery::new(); + scenery.set_description("src - detector demo".into()); + + let i_s = scenery.add_element( + "Source", + NodeSource::new(LightData::Energy(LightDataEnergy { energy: 1.0 })), + ); + let i_d = scenery.add_element("Detector", NodeDetector::default()); + + scenery.connect_nodes(i_s, "out1", i_d, "in1").unwrap(); + + let path = "src_detector.dot"; + let mut output = File::create(path).unwrap(); + write!(output, "{}", scenery.to_dot()).unwrap(); + println!("{:?}", scenery.node_ref(i_s).unwrap()); +} diff --git a/examples/uopa_graph.rs b/examples/uopa_graph.rs index 4712d48c5f467277b82701b3fc23d929c91a6541..f1f7c4b5ce239f35ed25cf1814d655e46d9cf95d 100644 --- a/examples/uopa_graph.rs +++ b/examples/uopa_graph.rs @@ -43,9 +43,9 @@ fn main() { ); scenery.connect_nodes(pump_compressor_node, "rear", pump_shg_node, "front"); scenery.connect_nodes(pump_shg_node, "rear", pump_splitter_node, "front"); - scenery.connect_nodes(pump_splitter_node, "transmitted", uOPA_1_node, "front").unwrap(); + scenery.connect_nodes(pump_splitter_node, "out1_trans1_refl2", uOPA_1_node, "front").unwrap(); scenery.connect_nodes(uOPA_1_node, "rear", uOPA_2_node, "front"); - scenery.connect_nodes(pump_splitter_node, "reflected", uOPA_2_node, "front").unwrap(); + scenery.connect_nodes(pump_splitter_node, "out2_trans2_refl1", uOPA_2_node, "front").unwrap(); let mut scenery_2 = OpticScenery::new(); scenery_2.set_description("PHELIX uOPA Pump Pre-Amplifier".into()); diff --git a/src/lightdata.rs b/src/lightdata.rs index e7cb72e2b725579ea06d300f92b5169ce6864279..001378639d200f7abf1654edc24b297368e75a0a 100644 --- a/src/lightdata.rs +++ b/src/lightdata.rs @@ -7,7 +7,7 @@ pub enum LightData { #[derive(Debug, PartialEq, Clone)] pub struct LightDataEnergy { - energy: f32, + pub energy: f32, } #[derive(Debug, PartialEq, Clone)] diff --git a/src/nodes/node_beam_splitter.rs b/src/nodes/node_beam_splitter.rs index b0a5b6f3253064e0c5488673d61ca0becf9b2dfe..206b2f4a1a8d4a49523795ff498751db02dc874d 100644 --- a/src/nodes/node_beam_splitter.rs +++ b/src/nodes/node_beam_splitter.rs @@ -1,5 +1,6 @@ use crate::{optic_node::{Optical, Dottable}, optic_ports::OpticPorts}; +#[derive(Debug)] pub struct NodeBeamSplitter; impl Optical for NodeBeamSplitter { diff --git a/src/nodes/node_detector.rs b/src/nodes/node_detector.rs index 81f1aacadbcd585f1bdc37a8b3a6c8ec1fb63e01..e0183483d749e6f8b706ff37b97879f7dcf916a3 100644 --- a/src/nodes/node_detector.rs +++ b/src/nodes/node_detector.rs @@ -1,6 +1,12 @@ +use std::fmt::Display; + use crate::{optic_node::{Optical, Dottable}, optic_ports::OpticPorts}; +use crate::lightdata::LightData; -pub struct NodeDetector; +#[derive(Debug, Default)] +pub struct NodeDetector { + light_data: Option<LightData> +} impl Optical for NodeDetector { fn node_type(&self) -> &str { @@ -14,6 +20,17 @@ impl Optical for NodeDetector { } +impl Display for NodeDetector { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "Detector: ").unwrap(); + if self.light_data.is_none() { + write!(f,"no data available") + } else { + write!(f, "{:?}", self.light_data) + } + } +} + impl Dottable for NodeDetector{ fn node_color(&self) -> &str { "lemonchiffon" diff --git a/src/nodes/node_dummy.rs b/src/nodes/node_dummy.rs index 42b26352180daba3c4be444b34020f5c3131c647..065bf31ea1a81854a728f55d2e43ffb9808f0b2b 100644 --- a/src/nodes/node_dummy.rs +++ b/src/nodes/node_dummy.rs @@ -1,6 +1,7 @@ use crate::optic_node::{Optical,Dottable}; use crate::optic_ports::OpticPorts; +#[derive(Debug)] /// A fake / dummy component without any functions. It is mainly used for development and debugging purposes. pub struct NodeDummy; diff --git a/src/nodes/node_group.rs b/src/nodes/node_group.rs index e578de7cbff89b9032502f6c6e129606e688b844..72184bb2645be31651b6af39293b4bc617893455 100644 --- a/src/nodes/node_group.rs +++ b/src/nodes/node_group.rs @@ -7,7 +7,7 @@ use crate::light::Light; type Result<T> = std::result::Result<T, OpossumError>; -#[derive(Default)] +#[derive(Default, Debug)] pub struct NodeGroup { g: DiGraph<OpticNode, Light>, } diff --git a/src/nodes/node_reference.rs b/src/nodes/node_reference.rs index 2603b4b809ad0349d31e09e41bd6d9ea6a3ce1f0..18c74f1aae37133a6825804251ca2c20f2a657b8 100644 --- a/src/nodes/node_reference.rs +++ b/src/nodes/node_reference.rs @@ -3,6 +3,7 @@ use std::rc::{Weak, Rc}; use crate::optic_node::{OpticNode, Optical, Dottable}; use crate::optic_ports::OpticPorts; +#[derive(Debug)] /// A virtual component referring to another existing component. This node type is necessary in order to model resonators (loops) or double-pass systems. pub struct NodeReference { reference: Weak<OpticNode>, diff --git a/src/nodes/node_source.rs b/src/nodes/node_source.rs index def2f73ca307bea49cdb4ef38266a44119067747..9a61865920a095310437b49a10e6136118a354e1 100644 --- a/src/nodes/node_source.rs +++ b/src/nodes/node_source.rs @@ -1,21 +1,42 @@ -use crate::{optic_node::{Optical, Dottable}, optic_ports::OpticPorts}; +use crate::{ + lightdata::LightData, + optic_node::{Dottable, Optical}, + optic_ports::OpticPorts, +}; -pub struct NodeSource; +#[derive(Debug, Default)] +pub struct NodeSource { + light_data: Option<LightData>, +} + +impl NodeSource { + pub fn new(light: LightData) -> Self { + NodeSource { + light_data: Some(light), + } + } + pub fn light_data(&self) -> Option<&LightData> { + self.light_data.as_ref() + } + + pub fn set_light_data(&mut self, light_data: LightData) { + self.light_data = Some(light_data); + } +} impl Optical for NodeSource { - fn node_type(&self) -> &str { - "light source" - } - fn ports(&self) -> OpticPorts { - let mut ports=OpticPorts::new(); - ports.add_output("out1").unwrap(); - ports - } - + fn node_type(&self) -> &str { + "light source" + } + fn ports(&self) -> OpticPorts { + let mut ports = OpticPorts::new(); + ports.add_output("out1").unwrap(); + ports + } } -impl Dottable for NodeSource{ - fn node_color(&self) -> &str { - "slateblue" - } +impl Dottable for NodeSource { + fn node_color(&self) -> &str { + "slateblue" + } } diff --git a/src/optic_node.rs b/src/optic_node.rs index 7f514a0d7c32578f007658668a4b076982afeb26..b3441499fe18019e9038429135c1e7f1f59b3a45 100644 --- a/src/optic_node.rs +++ b/src/optic_node.rs @@ -65,7 +65,7 @@ impl OpticNode { impl Debug for OpticNode { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}", self.name) + write!(f, "{} - {:?}", self.name, self.node) } } @@ -199,8 +199,8 @@ pub trait Dottable { } } -pub trait OpticComponent: Optical + Dottable {} -impl<T: Optical + Dottable> OpticComponent for T {} +pub trait OpticComponent: Optical + Dottable + Debug {} +impl<T: Optical + Dottable + Debug> OpticComponent for T {} #[cfg(test)]