Download as pdf or txt
Download as pdf or txt
You are on page 1of 7

...\Documents\Eclipse Scripting API\Plugins\OptiStructTRX.

cs 1
1 ////////////////////////////////////////////////////////////////////////////////
2 //OptiStructPLVyABD.cs
3 //
4 // Script para la creacion de estructuras de optimizacion.
5 //
6 // Applies to:
7 // Eclipse Scripting API
8 // 15.1.1
9 // 15.5
10 //
11 // Copyright (c) 2017-2018 Varian Medical Systems, Inc.
12 //Modificacion del script en
13 //https://github.com/VarianAPIs/Varian-Code-Samples/blob/master/webinars%20%26%
20workshops/06%20Apr%202018%20Webinar/Eclipse%20Scripting%20API/Projects/
CreateOptStructures/CreateOptStructures.cs
14 //Adecuado para el Departamento de Radioterapia de INCAN Guatemala
15 //Por Carlos Salazar
16 ////////////////////////////////////////////////////////////////////////////////
17
18 using System;
19 using System.Linq;
20 using System.Text;
21 using System.Windows;
22 using System.Collections.Generic;
23 using System.Reflection;
24 using System.Runtime.CompilerServices;
25 using VMS.TPS.Common.Model.API;
26 using VMS.TPS.Common.Model.Types;
27
28 [assembly: ESAPIScript(IsWriteable = true)]
29
30 namespace VMS.TPS
31 {
32 public class Script
33 {
34 // Change these IDs to match your clinical conventions
35 const string SCRIPT_NAME = "Opt Structures Script";
36
37 const string PTV_ID1 = "PTV_40";
38 const string PTV_ID2 = "PTV Total";
39 const string EXPANDED_PTV_ID = "PTV_EXT";
40 const string BODY2_ID = "BODY2";
41 //const string PARRILLA_ID = "PTVMama/Parrilla";
42
43 const string ID1 = "Trachea";//que es mejor, sumar los organos y luego
crear la estruct de opt o al reves?
44 const string ID2 = "Thyroid";
45 const string ID3 = "Larynx";
46 const string ID4 = "Esophagus";
47 const string VIAS = "VIAS";
48 const string z_VIAS = "z_VIAS";
49 const string SPINAL = "SpinalCord";
...\Documents\Eclipse Scripting API\Plugins\OptiStructTRX.cs 2
50 const string z_SPINAL = "z_Spinal";
51 const string IDA = "A";
52 const string IDB = "B";
53
54 float margen = 4; //expansion respecto de la cual cortaremos los OAR
55 float margenInterno = 4;
56 float margenExterno = 1;
57 // float margenSkinflash = 10;
58
59 Structure ptv_FIS;
60 Structure ptv_ext;
61 Structure BODY;
62 Structure BODY2;
63 Structure z_ptv;
64 Structure A, B;
65
66 public Script()
67 {
68 }
69
70 public void Execute(ScriptContext context /*, System.Windows.Window
window, ScriptEnvironment environment*/)
71 {
72 if (context.Patient == null || context.StructureSet == null)
73 {
74 MessageBox.Show("Please load a patient, 3D image, and structure
set before running this script.", SCRIPT_NAME,
MessageBoxButton.OK, MessageBoxImage.Exclamation);
75 return;
76 }
77
78
79 StructureSet ss = context.StructureSet;
80
81 context.Patient.BeginModifications(); // enable writing with this
script.
82
83
84
85 FindPTV(ss, PTV_ID1, PTV_ID2); // crea la estructura ptv fis
86 ptv_FIS = ss.Structures.FirstOrDefault(x => x.Id == "PTV_FIS"); //
guarda la estructura ptv fis en la variable ptv fis, falta sacarlo
del pulmon
87 ptv_ext = ss.AddStructure("PTV", EXPANDED_PTV_ID); // create the
empty "ptv+5mm" structure
88 ptv_ext.SegmentVolume = ptv_FIS.Margin(margen); // expand PTV para
recortar las opti estructuras respecto de ese margen.
89 Aro(ss, "PTV_FIS", margenExterno, margenInterno);//z_ptv
90
91 //Recortar zptv respecto de body
92 BODY = ss.Structures.FirstOrDefault(x => x.Id == "BODY");
93 BODY2 = ss.AddStructure("AVOIDANCE", BODY2_ID); // create the empty
...\Documents\Eclipse Scripting API\Plugins\OptiStructTRX.cs 3
"ptv+5mm" structure
94 BODY2.SegmentVolume = BODY.Margin(-4);
95 BODY2.SegmentVolume = BODY.Sub(BODY2);
96 z_ptv = ss.Structures.FirstOrDefault(x => x.Id == "z_PTV");
97 z_ptv.SegmentVolume = z_ptv.Sub(BODY2); //'Sub' subtracts overlapping
volume of expanded PTV from organ
98
99 ss.RemoveStructure(BODY2);
100
101 RecortarRespectoBody(ss, "PTVMama/Parrilla", margen);
102
103 skinFlash(ss, 10);
104
105
106
107 List<string> union1 = new List<string>() {ID1, ID2, IDA};
108 List<string> union2 = new List<string>() {ID3, ID4, IDB};
109 List<string> union3 = new List<string>() {IDA, IDB, VIAS};
110 List<List<string>> listOfUnions = new List<List<string>>();//lista de
listas
111 listOfUnions.Add(union1);
112 listOfUnions.Add(union2);
113 listOfUnions.Add(union3);
114 foreach (var list in listOfUnions)//margen y recorte de organos
115 {
116 try
117 {
118 JoinOrgan(ss, list[0], list[1], list[2]); //Suma dos
organos
119
120 }
121 catch (Exception e)
122 {
123 Console.WriteLine(e.Message);
124 }
125 // JoinOrgan(ss, list[0], list[1], list[2]); //Suma dos organos
126 }
127
128 A = ss.Structures.FirstOrDefault(x => x.Id == "A");//Estructuras
auxiliares
129 B = ss.Structures.FirstOrDefault(x => x.Id == "B");
130 ss.RemoveStructure(A);
131 ss.RemoveStructure(B);
132
133 List<string> lista1 = new List<string>() { VIAS, z_VIAS};
134 List<string> lista2 = new List<string>() { SPINAL, z_SPINAL};
135 List<List<string>> listOfLists = new List<List<string>>();//lista de
listas
136 listOfLists.Add(lista1);
137 listOfLists.Add(lista2);
138
139 foreach (var list in listOfLists)
...\Documents\Eclipse Scripting API\Plugins\OptiStructTRX.cs 4
140 {
141 try
142 {
143 FindOrgan(ss, list[0], "ORGAN", list[1], ptv_ext, margen); //
podria hacer un margen aparte para spinal cord.
144 }
145
146 catch (Exception e)
147 {
148 Console.WriteLine(e.Message);
149 }
150
151 }
152
153
154 ss.RemoveStructure(ptv_ext);
155
156
157 }
158 //aqui termina la parte principal del programa, el resto son funciones
que son llamadas en la parte principal.
159
160
161
162 static void FindOrgan(StructureSet structureSet, string ID, string
kindOrgan, string optiID, Structure ptvExt, float margen) //busca el
organo y crea su estructura de optimizacion
163 {
164 //previamente declarar organ y structureset ss, tip de organo
AVOIDANCE
165 //El optiOrgan es el buffered_organ
166 //ID y optiID son los nombres del organo y del z organo.
167 Structure organ;
168 Structure optiOrgan;
169 organ = structureSet.Structures.FirstOrDefault(x => x.Id == ID);
170 optiOrgan = structureSet.AddStructure(kindOrgan, optiID);
171 optiOrgan.SegmentVolume = organ.Margin(margen);
172 optiOrgan.SegmentVolume = optiOrgan.Sub(ptvExt); //'Sub' subtracts
overlapping volume of expanded PTV from organ
173
174 }
175
176
177 static void FindPTV(StructureSet structureSet, string ID1, string ID2) //
busca el PTV y crea PTV FIS
178 {
179 //previamente declarar organ y structureset ss, tip de organo
AVOIDANCE
180 //El optiOrgan es el buffered_organ
181 //ID y optiID son los nombres del organo y del z organo.
182 Structure ptv1;
183 Structure ptv2;
...\Documents\Eclipse Scripting API\Plugins\OptiStructTRX.cs 5
184 Structure ptv_Final;
185 Structure ptv_Fis;
186 Structure BODY;
187 Structure BODY2;
188 string BODY2_ID = "BODY2";
189 BODY = structureSet.Structures.FirstOrDefault(x => x.Id == "BODY");
190 BODY2 = structureSet.AddStructure("AVOIDANCE", BODY2_ID); // create
the empty "ptv+5mm" structure
191 BODY2.SegmentVolume = BODY.Margin(-4);
192
193 string ptv_ID = "PTV_FIS";
194 ptv1 = structureSet.Structures.FirstOrDefault(x => x.Id == ID1);
195 if (ptv1 == null)
196 {
197 ptv2 = structureSet.Structures.FirstOrDefault(x => x.Id == ID2);
198
199 if (ptv2 == null)
200 {
201 MessageBox.Show("El PTV no tiene nombres " + ID1 + " o " +
ID2);
202 return; //Parece que con este return sale y ya no continua lo
que esta fuera del if
203
204 }
205 else
206 {
207 ptv_Final = ptv2;
208 }
209 }
210
211 else
212 {
213 ptv_Final = ptv1;
214
215 }
216
217 ptv_Fis = structureSet.AddStructure("PTV", ptv_ID);//estructura vacia
218 BODY2.SegmentVolume = BODY.Sub(BODY2);
219 ptv_Fis.SegmentVolume = ptv_Final.Sub(BODY2); //'Sub' subtracts
overlapping volume of expanded PTV from organ
220
221 structureSet.RemoveStructure(BODY2);
222
223
224 }
225
226 static void JoinOrgan(StructureSet structureSet, string ID1, string ID2,
string unionID) //Suma dos organos
227 {
228 //previamente declarar organ y structureset ss, tip de organo
AVOIDANCE
229 //El optiOrgan es el buffered_organ
...\Documents\Eclipse Scripting API\Plugins\OptiStructTRX.cs 6
230 //ID y optiID son los nombres del organo y del z organo.
231 Structure organ1;
232 Structure organ2;
233 Structure UnionOfOrgans;
234 organ1 = structureSet.Structures.FirstOrDefault(x => x.Id == ID1);
235 organ2 = structureSet.Structures.FirstOrDefault(x => x.Id == ID2);
236
237 UnionOfOrgans = structureSet.AddStructure("ORGAN", unionID);
238 UnionOfOrgans.SegmentVolume = organ1.Or(organ2);
239
240 }
241
242
243
244 static void Aro(StructureSet structureSet, string ID1, float
margenExterno, float margenInterno) //Falta recortar si sale del ptv
245 {
246 //previamente declarar organ y structureset ss, tip de organo
AVOIDANCE
247 //El optiOrgan es el buffered_organ
248 //ID1, el ptv y optiID son los nombres del organo y del z organo.
249 Structure ptvExterno;
250 Structure ptvInterno;
251 Structure z_ptv;
252 Structure ptv;
253 ptv = structureSet.Structures.FirstOrDefault(x => x.Id == ID1);
254 ptvExterno = structureSet.AddStructure("PTV", "PTV_Externo");
255 ptvExterno.SegmentVolume = ptv.Margin(margenExterno);
256
257 ptvInterno = structureSet.AddStructure("PTV", "PTV_Interno");
258 ptvInterno.SegmentVolume = ptv.Margin(-margenInterno);
259
260 z_ptv = structureSet.AddStructure("PTV", "z_PTV");
261 z_ptv.SegmentVolume = ptvExterno.Sub(ptvInterno);
262
263 structureSet.RemoveStructure(ptvExterno);
264 structureSet.RemoveStructure(ptvInterno);
265
266
267 }
268
269
270 static void RecortarRespectoBody(StructureSet structureSet, string ID1,
float margen) //Para recortar la parrilla y luego expandirla en otro
metodo
271 {
272 Structure ptvRecortado;
273 Structure ptv, BODY, BODY2;//parrilla extendida
274 BODY = structureSet.Structures.FirstOrDefault(x => x.Id == "BODY");
275 BODY2 = structureSet.AddStructure("AVOIDANCE", BODY2_ID); // create
the empty "ptv+5mm" structure
276 ptv = structureSet.Structures.FirstOrDefault(x => x.Id == ID1);
...\Documents\Eclipse Scripting API\Plugins\OptiStructTRX.cs 7
277 BODY2.SegmentVolume = BODY.Margin(-margen);//RECORTE RESPECTO DEL
BODY
278 BODY2.SegmentVolume = BODY.Sub(BODY2);
279 ptvRecortado = structureSet.AddStructure("ptv", "ParrillaRecort");
280 ptvRecortado.SegmentVolume = ptv.Sub(BODY2); //'Sub' subtracts
overlapping volume of expanded PTV from organ- Esta linea esta
dando un problema
281
282 //structureSet.RemoveStructure(BODY2); //Necesito el Body2 para el
skinflash
283
284 }
285
286
287 static void skinFlash(StructureSet structureSet, float
margenSkinFlash) //Falta recortar si sale del ptv
288 {
289 //previamente declarar organ y structureset ss, tip de organo
AVOIDANCE
290 //El optiOrgan es el buffered_organ
291 //ID1, el ptv parrilla.
292 Structure ptvExtendido;
293 Structure ptvInterno;
294 Structure BODY2;
295 Structure BODY;
296
297 ptvExtendido = structureSet.AddStructure("PTV", "PTV_Extendido");
298 ptvInterno = structureSet.Structures.FirstOrDefault(x => x.Id ==
"ParrillaRecort");
299 BODY2 = structureSet.Structures.FirstOrDefault(x => x.Id == "BODY2");
300 BODY = structureSet.Structures.FirstOrDefault(x => x.Id == "BODY");
301 BODY2.SegmentVolume = BODY.Sub(BODY2);
302 ptvExtendido.SegmentVolume = ptvInterno.Margin(margenSkinFlash);
303 ptvExtendido.SegmentVolume = ptvExtendido.Sub(BODY2);
304 ptvExtendido.SegmentVolume = ptvExtendido.Or(ptvInterno);
305
306 structureSet.RemoveStructure(ptvInterno);
307 structureSet.RemoveStructure(BODY2);
308 }
309
310
311 }
312 }

You might also like