public Task <Point3D> GetIsocenterAsync(string courseId, string planId, string beamId) => RunAsync(context => { var planningItem = Extensions.GetPlanningItem(context.Patient, courseId, planId); var plan = (PlanSetup)planningItem; var beam = plan.Beams.FirstOrDefault(x => x.Id == beamId); return(CollisionSummariesCalculator.GetIsocenter(beam)); });
public Task <Model3DGroup> AddFieldMeshAsync(Model3DGroup modelGroup, string courseId, string planId, string beamId, string status) => RunAsync(context => { var planningItem = Extensions.GetPlanningItem(context.Patient, courseId, planId); var plan = (PlanSetup)planningItem; var beam = plan.Beams.FirstOrDefault(x => x.Id == beamId); return(CollisionSummariesCalculator.AddFieldMesh(plan, beam, status)); });
public Task <CollisionCheckViewModel> GetBeamCollisionsAsync(string courseId, string planId, string beamId) => RunAsync(context => { var planningItem = Extensions.GetPlanningItem(context.Patient, courseId, planId); var calculator = new CollisionSummariesCalculator(); var plan = (PlanSetup)planningItem; var beam = plan.Beams.FirstOrDefault(x => x.Id == beamId); return(calculator.CalculateBeamCollision(plan, beam)); });
public Task <Model3DGroup> AddCouchBodyAsync(string courseId, string planId) => RunAsync(context => { var planningItem = Extensions.GetPlanningItem(context.Patient, courseId, planId); var structureSet = planningItem.StructureSet; var body = structureSet.Structures.Where(x => x.Id.Contains("BODY")).First(); Structure couch = null; try { foreach (Structure structure in structureSet.Structures) { if (structure.StructureCodeInfos.FirstOrDefault().Code == "Support") { couch = structure; } } } catch { } return(CollisionSummariesCalculator.AddCouchBodyMesh(body, couch)); });
public CollisionCheckViewModel CalculateBeamCollision(PlanSetup planSetup, Beam beam) { var calculator = new CollisionSummariesCalculator(); var modelGroup = new Model3DGroup(); var isoctr = GetIsocenter(beam); bool isVMAT = false; bool isStatic = false; bool isElectron = false; bool isSRSArc = false; var collisionSummary = new CollisionCheckViewModel(); MeshGeometry3D bodyMesh; var iso3DMesh = CalculateIsoMesh(isoctr); var body = planSetup.StructureSet.Structures.Where(x => x.Id.Contains("BODY")).First(); Structure couch = null; MeshGeometry3D couchMesh = null; try { foreach (Structure structure in planSetup.StructureSet.Structures) { if (structure.StructureCodeInfos.FirstOrDefault().Code == "Support") { couch = structure; couchMesh = couch.MeshGeometry; } } } catch { couch = null; } bodyMesh = body.MeshGeometry; var collimatorMaterial = new DiffuseMaterial(new SolidColorBrush(Colors.Green)); if (beam.EnergyModeDisplayName.Contains("E")) { isElectron = true; } if (beam.EnergyModeDisplayName.Contains("SRS")) { isSRSArc = true; } if (beam.MLCPlanType.ToString() == "VMAT" || beam.Technique.Id.Contains("ARC")) { isVMAT = true; collimatorMaterial = collimatorMaterialVMAT; } if (beam.Technique.ToString().Contains("STATIC")) { isStatic = true; collimatorMaterial = collimatorMaterialStatic; } MeshGeometry3D collimatorMesh = CalculateCollimatorMesh(beam, isoctr, isVMAT, isStatic, isElectron, isSRSArc); collisionSummary = calculator.GetFieldCollisionSummary(beam, couch, body); modelGroup.Children.Add(new GeometryModel3D { Geometry = iso3DMesh, Material = redMaterial, BackMaterial = redMaterial }); modelGroup.Children.Add(new GeometryModel3D { Geometry = collimatorMesh, Material = collimatorMaterial, BackMaterial = darkblueMaterial }); return(collisionSummary); }
public Tuple <List <CollisionCheckViewModel>, Model3DGroup> GetCollisionSummary(PlanningItemViewModel planningItem) { var waitWindowCollision = new WaitWindowCollision(); waitWindowCollision.Show(); var calculator = new CollisionSummariesCalculator(); var collimatorModelGroup = new Model3DGroup(); var isoModelGroup = new Model3DGroup(); var modelGroup = new Model3DGroup(); upDir = new Vector3D(0, -1, 0); lookDir = new Vector3D(0, 0, 1); isoctr = new Point3D(0, 0, 0); //just to initalize cameraPosition = new Point3D(0, 0, -3500); var CollisionSummaries = new List <CollisionCheckViewModel>(); // Create some materials var redMaterial = new DiffuseMaterial(new SolidColorBrush(Colors.Red)); var darkblueMaterial = new DiffuseMaterial(new SolidColorBrush(Colors.DarkBlue)); var collimatorMaterial = new DiffuseMaterial(new SolidColorBrush(Colors.Green)); Structure bodyStruct; var iso3DMesh = calculator.CalculateIsoMesh(isoctr); MeshGeometry3D bodyMesh = null; MeshGeometry3D couchMesh = null; if (planningItem.PlanningItemObject is PlanSetup) { PlanSetup planSetup = (PlanSetup)planningItem.PlanningItemObject; bodyStruct = planSetup.StructureSet.Structures.Where(x => x.Id.Contains("BODY")).First(); bodyMesh = bodyStruct.MeshGeometry; foreach (Structure structure in planSetup.StructureSet.Structures) { if (structure.StructureCodeInfos.FirstOrDefault().Code != null) { if (structure.StructureCodeInfos.FirstOrDefault().Code == "Support") { Structure couchStruct = structure; couchMesh = couchStruct.MeshGeometry; } } } foreach (Beam beam in planSetup.Beams) { isoctr = calculator.GetIsocenter(beam); iso3DMesh = calculator.CalculateIsoMesh(calculator.GetIsocenter(beam)); bool view = true; if (planSetup.TreatmentOrientation.ToString() == "HeadFirstProne") { upDir = new Vector3D(0, 1, 0); } bool isArc = false; bool isElectron = false; bool isSRSCone = false; collimatorMaterial = new DiffuseMaterial(new SolidColorBrush(Colors.Green)); if (beam.IsSetupField == true) { continue; } if (beam.Name.Contains("Subfield 2") || beam.Name.Contains("Subfield 3")) { continue; } if (beam.EnergyModeDisplayName.Contains("E")) { isElectron = true; } if (beam.EnergyModeDisplayName.Contains("SRS")) { isSRSCone = true; } if (beam.Technique.Id.Contains("ARC")) { isArc = true; collimatorMaterial = new DiffuseMaterial(new SolidColorBrush(Colors.GreenYellow)); } foreach (Structure structure in planSetup.StructureSet.Structures) { if (structure.Id.Contains("CouchSurface") == true) { Structure couchStruct = planSetup.StructureSet.Structures.Where(x => x.Id.Contains("CouchSurface")).First(); couchMesh = couchStruct.MeshGeometry; } } MeshGeometry3D collimatorMesh = calculator.CalculateCollimatorMesh(planSetup, beam, isoctr, isArc, isElectron, isSRSCone); string shortestDistanceBody = "2000000"; string shortestDistanceTable = "2000000"; string status = "Clear"; shortestDistanceBody = calculator.ShortestDistance(collimatorMesh, bodyMesh); if (couchMesh != null) { shortestDistanceTable = calculator.ShortestDistance(collimatorMesh, couchMesh); } else { shortestDistanceTable = " - "; status = " - "; } Console.WriteLine(beam.Id + " - gantry to body is " + shortestDistanceBody + " cm"); Console.WriteLine(beam.Id + " - gantry to table is " + shortestDistanceTable + " cm"); if (shortestDistanceTable != " - ") { if ((Convert.ToDouble(shortestDistanceBody) < 3.0) || (Convert.ToDouble(shortestDistanceTable) < 3.0)) { collimatorMaterial = new DiffuseMaterial(new SolidColorBrush(Colors.Red)); status = "Collision"; } } collimatorModelGroup.Children.Add(new GeometryModel3D { Geometry = collimatorMesh, Material = collimatorMaterial, BackMaterial = darkblueMaterial }); isoModelGroup.Children.Add(new GeometryModel3D { Geometry = iso3DMesh, Material = redMaterial, BackMaterial = redMaterial }); var collisionSummary = calculator.GetFieldCollisionSummary(beam, view, shortestDistanceBody, shortestDistanceTable, status); CollisionSummaries.Add(collisionSummary); } } modelGroup = CreateModel(bodyMesh, couchMesh, isoModelGroup, collimatorModelGroup, collimatorMaterial); waitWindowCollision.Close(); return(Tuple.Create(CollisionSummaries, modelGroup)); }