示例#1
0
 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));
 });
示例#2
0
 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));
 });
示例#3
0
 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));
 });
示例#4
0
 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));
 });
示例#5
0
        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);
        }
示例#6
0
        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));
        }