示例#1
0
        public SegmentVolume AsymmetricMargin(AxisAlignedMargins margins)
        {
            var local  = this;
            var retVal = X.Instance.CurrentContext.GetValue(sc =>
            {
                return(new SegmentVolume(local._client.AsymmetricMargin(margins)));
            });

            return(retVal);
        }
        public void Execute(ScriptContext context /*, System.Windows.Window window, ScriptEnvironment environment*/)

        {
            if (context.Patient == null || context.StructureSet == null)

            {
                MessageBox.Show("Please load a patient, 3D image, and structure set before running this script.", SCRIPT_NAME, MessageBoxButton.OK, MessageBoxImage.Exclamation);

                return;
            }

            string msg1 = "";

            string msg2 = "";

            StructureSet ss = context.StructureSet;


            // get list of structures for loaded plan

            var listStructures = context.StructureSet.Structures;

            // define PTV (selected)

            //Structure ptv = listStructures.Where(x => !x.IsEmpty && x.Id.ToUpper().Contains("PTV1 REKTM")).FirstOrDefault();

            //Structure ptv = listStructures.Where(x => x.Id == context.PlanSetup.TargetVolumeID).FirstOrDefault();

            var ptv = SelectStructureWindow.SelectStructure(ss);

            if (ptv == null)
            {
                return;
            }

            else
            {
                msg2 += string.Format("'{0}' found \n", ptv.Id);
            }


            context.Patient.BeginModifications();   // enable writing with this script.

            //============================

            // FIND OAR

            //============================


            // find Rectum

            Structure rectum = listStructures.Where(x => !x.IsEmpty && (x.Id.ToUpper().Contains("REKTUM") || x.Id.ToUpper().Contains("RECTUM")) && x.DicomType.Equals("ORGAN") & !x.Id.ToUpper().Contains("HK")).FirstOrDefault();

            if (rectum == null)
            {
                msg1 += string.Format("Not found: '{0}' \n", "Rektum (OAR)");
            }

            else
            {
                msg2 += string.Format("'{0}' found \n", rectum.Id);
            }



            // find Blase

            Structure blase = listStructures.Where(x => !x.IsEmpty && x.Id.ToUpper().Contains("BLASE") && x.DicomType.Equals("ORGAN") & !x.Id.ToUpper().Contains("HK")).FirstOrDefault();

            if (blase == null)
            {
                msg1 += string.Format("Not found: '{0}' \n", "Blase (OAR)");
            }

            else
            {
                msg2 += string.Format("'{0}' found \n", blase.Id);
            }



            MessageBox.Show(msg2 + "\n" + msg1, SCRIPT_NAME, MessageBoxButton.OK, MessageBoxImage.Information);



            //============================

            // GENERATE HelpStructures

            //============================

            int RectumHkCount = 1;

            int BlaseHkCount = 1;

            foreach (Structure scan in listStructures)

            {
                if (scan.Id.ToUpper().Contains("ZHK REKTUM"))
                {
                    RectumHkCount++;
                }
                if (scan.Id.ToUpper().Contains("ZHK BLASE"))
                {
                    BlaseHkCount++;
                }
            }

            // HK Rektum

            if (rectum != null)

            {
                Structure hk_rectum = ss.AddStructure("CONTROL", "zHK Rektum_" + RectumHkCount);

                hk_rectum.SegmentVolume = rectum.Margin(8.0);

                hk_rectum.SegmentVolume = hk_rectum.Sub(ptv);
            }



            // HK Blase (german for bladder)

            if (blase != null)

            {
                double             x1       = 5;
                double             y1       = 10;
                double             z1       = 15;
                double             x2       = 5;
                double             y2       = 20;
                double             z2       = 8;
                AxisAlignedMargins margins  = new AxisAlignedMargins(StructureMarginGeometry.Outer, x1, y1, z1, x2, y2, z2);
                Structure          hk_blase = ss.AddStructure("CONTROL", "zHK Blase_" + BlaseHkCount);

                hk_blase.SegmentVolume = blase.AsymmetricMargin(margins);

                hk_blase.SegmentVolume = hk_blase.Sub(ptv);
            }

            //============================

            // remove structures unneccesary for optimization

            //============================
            //ss.RemoveStructure(ptv_3mm);
            //ss.RemoveStructure(ptv_minus);
            //ss.RemoveStructure(Iso95);
        }