Beispiel #1
0
        public static SpineStorage GenerateStorageForAddedFile(DicomFile file)
        {
            var storage = new SpineStorage();

            var window_params = DicomUtils.GetWindowParameters(file);

            storage.windowWidth  = window_params.Item1;
            storage.windowCenter = window_params.Item2;

            storage.SetRotatingAngle(0);

            storage.direction      = 0;
            storage.imageDirection = 0;

            return(storage);
        }
Beispiel #2
0
        public static void WriteToFile(SpineStorage storage, string filename)
        {
            var keys    = storage.Keys;
            var sp_keys = storage.SpinousProcessKeys;

            logger.Info("Create XML for storage file - {0}", filename);

            XDocument doc = new XDocument();

            doc.Add(new XElement("storage"));

            var root = doc.Element("storage");


            #region Window Parameters

            var window = new XElement("window");

            window.Add(new XAttribute("center", storage.windowCenter));
            window.Add(new XAttribute("width", storage.windowWidth));

            root.Add(window);

            logger.Info("Add window parameters for file - {0}", filename);

            #endregion

            #region Direction Parameters

            var direction = new XElement("direction");

            direction.Add(new XAttribute("value", storage.direction));

            root.Add(direction);
            logger.Info("Add direction parameter for file - {0}", filename);

            var imageDirection = new XElement("imageDirection");

            imageDirection.Add(new XAttribute("value", storage.imageDirection));

            root.Add(imageDirection);
            logger.Info("Add image direction parameter for file - {0}", filename);

            #endregion

            #region Angle Parameters

            var angle = new XElement("angle");

            angle.Add(new XAttribute("value", storage.GetRotatingAngle()));

            root.Add(angle);
            logger.Info("Add angle parameter for file - {0}", filename);
            #endregion

            #region Marker Points
            var markers = new XElement("markers");

            if (storage.GetMarkersCount() != 0)
            {
                for (int i = 0; i < 4; i++)
                {
                    var point = storage.GetMarkerPoint(i);
                    var p     = new XElement("point");
                    p.Add(new XAttribute("x", point.X));
                    p.Add(new XAttribute("y", point.Y));
                    markers.Add(p);
                }
            }

            root.Add(markers);
            logger.Info("Add markers parameter for file - {0}", filename);
            #endregion

            #region Marker Line

            var markerLine = storage.MarkerLine;

            if (markerLine != null)
            {
                XElement marker = new XElement("markerline");
                marker.Add(new XAttribute("size", storage.MarkerSize));
                marker.Add(new XAttribute("length", storage.MarkerLength));

                XElement point_first  = new XElement("point_first");
                XElement point_second = new XElement("point_second");
                point_first.Add(new XAttribute("first", markerLine.Item1.Item1));
                point_first.Add(new XAttribute("second", markerLine.Item1.Item2));
                point_first.Add(new XAttribute("third", markerLine.Item1.Item3));

                marker.Add(point_first);

                point_second.Add(new XAttribute("first", markerLine.Item2.Item1));
                point_second.Add(new XAttribute("second", markerLine.Item2.Item2));
                point_second.Add(new XAttribute("third", markerLine.Item2.Item3));

                marker.Add(point_second);

                root.Add(marker);
            }


            #endregion

            logger.Info("Add pixel parameters for file - {0}", filename);

            foreach (var key in keys)
            {
                var state = storage.GetDescription(key);

                var element = new XElement("spine");
                var attr    = new XAttribute("key", key);
                element.Add(attr);

                var points_element = new XElement("points");

                var upleft_el = new XElement("point");
                upleft_el.SetAttributeValue("x", state.UpLeft.X);
                upleft_el.SetAttributeValue("y", state.UpLeft.Y);
                var downleft_el = new XElement("point");
                downleft_el.SetAttributeValue("x", state.DownLeft.X);
                downleft_el.SetAttributeValue("y", state.DownLeft.Y);
                var downright_el = new XElement("point");
                downright_el.SetAttributeValue("x", state.DownRight.X);
                downright_el.SetAttributeValue("y", state.DownRight.Y);
                var upright_el = new XElement("point");
                upright_el.SetAttributeValue("x", state.UpRight.X);
                upright_el.SetAttributeValue("y", state.UpRight.Y);

                points_element.Add(upleft_el);
                points_element.Add(downleft_el);
                points_element.Add(downright_el);
                points_element.Add(upright_el);

                element.Add(points_element);


                var geom_element = new XElement("geometry");

                IDescriptionCalculator <SpineDescription> calc = null;

                if (storage.direction == 0)
                {
                    calc = new RightSide(state);
                }
                else if (storage.direction == 1)
                {
                    calc = new LeftSide(state);
                }
                else if (storage.direction == 2)
                {
                    calc = new FrontSide(state);
                }
                else if (storage.direction == 3)
                {
                    calc = new BackSide(state);
                }

                var ks = calc.Keys;

                foreach (var key_param in ks)
                {
                    var geom_node = new XElement("param");
                    attr = new XAttribute("key", key_param);
                    geom_node.Add(attr);
                    attr = new XAttribute("value", calc.GetParameter(key_param));
                    geom_node.Add(attr);
                    geom_element.Add(geom_node);
                }


                element.Add(geom_element);
                root.Add(element);
                logger.Info("Add spine {0} parameters for file - {1}", key, filename);
            }


            foreach (var key in sp_keys)
            {
                var state = storage.GetSpinousProcessDescription(key);

                var element = new XElement("process");
                var attr    = new XAttribute("key", key);
                element.Add(attr);

                var points_element = new XElement("points");

                var uptp_el = new XElement("point");
                uptp_el.SetAttributeValue("x", state.UpPoint.X);
                uptp_el.SetAttributeValue("y", state.UpPoint.Y);
                var vertp_el = new XElement("point");
                vertp_el.SetAttributeValue("x", state.VertexPoint.X);
                vertp_el.SetAttributeValue("y", state.VertexPoint.Y);
                var downtp_el = new XElement("point");
                downtp_el.SetAttributeValue("x", state.DownPoint.X);
                downtp_el.SetAttributeValue("y", state.DownPoint.Y);


                points_element.Add(uptp_el);
                points_element.Add(vertp_el);
                points_element.Add(downtp_el);

                element.Add(points_element);

                var geom_element = new XElement("geometry");

                IDescriptionCalculator <SpinousProcessDescription> calc1 = null;

                if (storage.direction == 0)
                {
                    calc1 = new DescriptionCalculators.SpinousProcess.RightSide(state);
                }
                else if (storage.direction == 1)
                {
                    calc1 = new DescriptionCalculators.SpinousProcess.LeftSide(state);
                }

                var ks = calc1.Keys;

                foreach (var key_param in ks)
                {
                    var geom_node = new XElement("param");
                    attr = new XAttribute("key", key_param);
                    geom_node.Add(attr);
                    attr = new XAttribute("value", calc1.GetParameter(key_param));
                    geom_node.Add(attr);
                    geom_element.Add(geom_node);
                }


                element.Add(geom_element);
                root.Add(element);
                logger.Info("Add process {0} parameters for file - {1}", key, filename);
            }

            doc.Save(filename);

            logger.Info("Storage file has been saved - {0}", filename);
        }
Beispiel #3
0
        public static SpineStorage ReadFromFile(string filename)
        {
            var storage = new SpineStorage();

            string       text = null;
            StreamReader file = null;

            try
            {
                file = new StreamReader(filename);
                text = file.ReadToEnd();
                logger.Info("Read storage file - {0}", filename);
            }
            catch (FileNotFoundException e)
            {
                text = "";
                logger.Error(e, "File not found - {0}", filename);
            }
            finally {
                if (file != null)
                {
                    file.Close();
                }
            }

            XDocument doc = new XDocument();

            try
            {
                doc = XDocument.Parse(text);

                var root = doc.Element("storage");


                #region Window Parameters

                var window_params = ParseWindowParameters(root.Element("window"));
                storage.windowCenter = window_params.Item1;
                storage.windowWidth  = window_params.Item2;


                #endregion

                #region Direction Parameters

                storage.direction = ParseDirectionParameters(root.Element("direction"));

                storage.imageDirection = ParseImageDirectionParameters(root.Element("imageDirection"));

                var angle = ParseAngleParameters(root.Element("angle"));
                storage.SetRotatingAngle(angle);

                #endregion

                #region Marker Points

                var markers = ParseMarkers(root.Element("markers"));

                for (int i = 0; i < markers.Count; i++)
                {
                    var point = new Point(markers[i].Item1, markers[i].Item2);
                    storage.SetMarkerPoint(i, point);
                }

                #endregion

                #region Marker Line

                var markerl = ParseMarkerLine(root.Element("markerline"));

                storage.MarkerLine   = markerl.Item1;
                storage.MarkerLength = markerl.Item2;
                storage.MarkerSize   = markerl.Item3;

                #endregion


                logger.Info("Read pixel parameters for file - {0}", filename);

                foreach (var element in root.Descendants("spine"))
                {
                    var key    = element.Attribute("key").Value;
                    var points = new List <Point>();

                    var points_xml = element.Element("points");

                    var points_x = points_xml.Descendants("point");

                    foreach (var point in points_x)
                    {
                        var x = int.Parse(point.Attribute("x").Value, CultureInfo.InvariantCulture);
                        var y = int.Parse(point.Attribute("y").Value, CultureInfo.InvariantCulture);
                        points.Add(new Point(x, y));
                    }



                    storage.AddDescription(key, new SpineDescription()
                    {
                        UpLeft    = points[0],
                        DownLeft  = points[1],
                        DownRight = points[2],
                        UpRight   = points[3],
                    });


                    logger.Info("Read spine description {0} for file - {1}", key, filename);
                }

                foreach (var element in root.Descendants("process"))
                {
                    var key    = element.Attribute("key").Value;
                    var points = new List <Point>();

                    var points_xml = element.Element("points");

                    var points_x = points_xml.Descendants("point");

                    foreach (var point in points_x)
                    {
                        var x = int.Parse(point.Attribute("x").Value, CultureInfo.InvariantCulture);
                        var y = int.Parse(point.Attribute("y").Value, CultureInfo.InvariantCulture);
                        points.Add(new Point(x, y));
                    }

                    var i = new SpinousProcessDescription()
                    {
                        UpPoint     = points[0],
                        VertexPoint = points[1],
                        DownPoint   = points[2],
                    };

                    logger.Info("Read process description {0} for file - {1}", key, filename);

                    storage.AddSpinousProcessDescription(key, i);
                }
            }
            catch (Exception e)
            {
                logger.Error(e, "Error parsing storage XML");
                return(storage);
            }



            logger.Info("Storage has been read from file - {0}", filename);
            return(storage);
        }