-
Notifications
You must be signed in to change notification settings - Fork 1
/
UserControl1.xaml.cs
123 lines (98 loc) · 4.04 KB
/
UserControl1.xaml.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using VMS.TPS.Common.Model.API;
using VMS.TPS.Common.Model.Types;
namespace CreateOptStructures
{
/// <summary>
/// Interaction logic for UserControl1.xaml
/// </summary>
public partial class UserControl1 : UserControl
{
private StructureSet _ss;
private Structure _ptvsSum;
private Double _marginToCrop;
public UserControl1(StructureSet ss)
{
InitializeComponent();
_ss = ss;
_ptvsSum = CreatePtvsSum();
}
private Structure CreatePtvsSum()
{
List<Structure> ptvs = _ss.Structures.Where(s => s.DicomType == "PTV").ToList();
if (_ss.CanAddStructure("CONTROL", "ptvs_sum"))
_ss.AddStructure("CONTROL", "ptvs_sum");
var ptvsSum = _ss.Structures.FirstOrDefault(s => s.Id.ToLower() == "ptvs_sum");
ptvsSum.SegmentVolume = ptvs[0].SegmentVolume;
for (var i = 1; i < ptvs.Count(); i++)
ptvsSum.SegmentVolume = ptvsSum.Or(ptvs[i]);
return ptvsSum;
}
private bool ThereIsOverlap(Structure st1, Structure st2, double margin = 2)
{
bool result = false;
if (_ss.CanAddStructure("CONTROL", "temp"))
_ss.AddStructure("CONTROL", "temp");
var temp = _ss.Structures.FirstOrDefault(s => s.Id.ToLower() == "temp");
temp.SegmentVolume = st1.And(st2.Margin(margin));
if (!temp.IsEmpty)
result = true;
if (_ss.CanRemoveStructure(temp))
_ss.RemoveStructure(temp);
return result;
}
private void marginToCropComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
oarsStackPanel.Children.Clear();
_marginToCrop = Convert.ToDouble(((ComboBoxItem)marginToCropComboBox.SelectedItem).Content.ToString());
foreach (var oar in _ss.Structures.Where(x => x.DicomType == "ORGAN").ToList()) // aqui NÃO funciona sem ".ToList()
{
if (ThereIsOverlap(oar, _ptvsSum, _marginToCrop))
oarsStackPanel.Children.Add(new CheckBox() { Content = oar.Id, IsChecked = true });
}
if (oarsStackPanel.Children.Count > 0)
gerarEstruturasButton.IsEnabled = true;
else
{
gerarEstruturasButton.IsEnabled = false;
MessageBox.Show("Não há intersecção entre 'OAR' e 'PTV' para a margem selecionada.", "CreateOpStructure", MessageBoxButton.OK, MessageBoxImage.Exclamation);
}
}
private void Button_Click(object sender, RoutedEventArgs e)
{
foreach (CheckBox cb in oarsStackPanel.Children)
{
if ((bool)cb.IsChecked)
{
Structure oar = _ss.Structures.FirstOrDefault(x => x.Id.ToLower() == cb.Content.ToString().ToLower());
string id = GenerateOarOptId(oar.Id);
if (_ss.CanAddStructure("CONTROL", id))
_ss.AddStructure("CONTROL", id);
Structure structureOpt = _ss.Structures.FirstOrDefault(x => x.Id.ToLower() == id.ToLower());
structureOpt.SegmentVolume = oar.Sub(_ptvsSum.Margin(_marginToCrop));
MessageBox.Show(string.Format($"Estrutura {id} gerada."));
}
}
}
private string GenerateOarOptId(string oarId)
{
if (oarId.Length <= 12)
return oarId + "_opt";
else
return oarId.Substring(0, 12) + "_opt";
}
}
}