Save predefined PPI and sensor sizes in JSON files.
[master-thesis.git] / Parasitemia / ParasitemiaUI / Types.fs
index 7d80294..fa99d90 100644 (file)
@@ -2,14 +2,25 @@
 
 open System
 open System.Windows
+open System.Windows.Media
 
 open Emgu.CV
 open Emgu.CV.Structure
 
+open Newtonsoft.Json
+
+open ParasitemiaCore.UnitsOfMeasure
+
+let healthyRBColor = Color.FromRgb(255uy, 255uy, 0uy) // Yellow-green.
+let infectedRBColor = Color.FromRgb(255uy, 0uy, 40uy) // Red with a bit of blue.
+
 type RBC = {
     num: int
 
+    [<JsonIgnore>]
     mutable infected: bool
+
+    [<JsonIgnore>]
     mutable setManually: bool
 
     center: Point
@@ -18,7 +29,51 @@ type RBC = {
 
 type SourceImage = {
     mutable num: int
+    mutable name: string
+
     mutable config: ParasitemiaCore.Config.Config
     mutable dateLastAnalysis: DateTime // UTC.
     img: Image<Bgr, byte>
-    mutable rbcs: RBC list }
\ No newline at end of file
+    mutable rbcs: RBC list
+
+    mutable healthyRBCBrightness: float32
+    mutable infectedRBCBrightness: float32 } with
+
+    member this.HealthyRBCColor: SolidColorBrush =
+        let mutable color = healthyRBColor * this.healthyRBCBrightness
+        color.A <- 255uy;
+        SolidColorBrush(color)
+
+    member this.InfectedRBCColor: SolidColorBrush =
+        let mutable color = infectedRBColor * this.infectedRBCBrightness
+        color.A <- 255uy;
+        SolidColorBrush(color)
+
+type PredefinedPPI = {
+    ppi: int<ppi>
+    label: string } with
+    override this.ToString() =
+        sprintf "%s: %d" this.label this.ppi
+
+type SensorSize = {
+    w: float<mm>
+    h: float<mm>
+    label: string } with
+    override this.ToString () =
+        sprintf "%g mm × %g mm%s" this.w this.h (if this.label = "" then "" else " (" + this.label + ")")
+
+let defaultPredefinedPPI = [
+    { ppi = 230000<ppi>; label = "50×" }
+    { ppi = 460000<ppi>; label = "100×" } ]
+
+let defaultSensorSizes = [
+    { w = 3.2<mm>;  h = 2.4<mm>;  label = "1/4″" }
+    { w = 4.8<mm>;  h = 3.6<mm>;  label = "1/3″" }
+    { w = 5.76<mm>; h = 4.29<mm>; label = "1/2.5″" }
+    { w = 6.4<mm>;  h = 4.8<mm>;  label = "1/2″" }
+    { w = 7.18<mm>; h = 5.32<mm>; label = "1/1.8″" }
+    { w = 7.6<mm>;  h = 5.7<mm>;  label = "1/1.7″" }
+    { w = 8.8<mm>;  h = 6.6<mm>;  label = "2/3″" }
+    { w = 13.2<mm>; h = 8.8<mm>;  label = "1″" } ]
+
+