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