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); }