OpenREM 1.0.0b2__py3-none-any.whl → 1.0.0b3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- openrem/locale/de/LC_MESSAGES/django.po +1060 -1059
- openrem/locale/django.pot +973 -972
- openrem/locale/es_MX/LC_MESSAGES/django.po +1049 -1048
- openrem/locale/it/LC_MESSAGES/django.po +1044 -1043
- openrem/locale/lt/LC_MESSAGES/django.po +989 -988
- openrem/locale/nb_NO/LC_MESSAGES/django.po +985 -984
- openrem/locale/pt_BR/LC_MESSAGES/django.po +1003 -1002
- openrem/manage.py +10 -10
- openrem/openremproject/__init__.py +1 -1
- openrem/openremproject/local_settings.py.linux +128 -128
- openrem/openremproject/local_settings.py.windows +144 -144
- openrem/openremproject/local_settings.py.windows-sqlite3 +129 -129
- openrem/openremproject/settings.py +278 -278
- openrem/openremproject/urls.py +32 -32
- openrem/openremproject/wsgi.py.example +28 -28
- openrem/remapp/__init__.py +2 -2
- openrem/remapp/admin.py +31 -31
- openrem/remapp/exports/ct_export.py +780 -753
- openrem/remapp/exports/dx_export.py +817 -805
- openrem/remapp/exports/export_common.py +931 -951
- openrem/remapp/exports/export_common_pandas.py +2422 -0
- openrem/remapp/exports/exportviews.py +815 -860
- openrem/remapp/exports/mg_csv_nhsbsp.py +292 -292
- openrem/remapp/exports/mg_export.py +673 -510
- openrem/remapp/exports/nm_export.py +796 -575
- openrem/remapp/exports/rf_export.py +1418 -1431
- openrem/remapp/extractors/ct_philips.py +424 -414
- openrem/remapp/extractors/ct_toshiba.py +2116 -2108
- openrem/remapp/extractors/dx.py +1033 -952
- openrem/remapp/extractors/extract_common.py +817 -817
- openrem/remapp/extractors/import_views.py +426 -426
- openrem/remapp/extractors/mam.py +685 -672
- openrem/remapp/extractors/nm_image.py +439 -431
- openrem/remapp/extractors/ptsizecsv2db.py +368 -368
- openrem/remapp/extractors/rdsr.py +667 -654
- openrem/remapp/extractors/rdsr_methods.py +1771 -1768
- openrem/remapp/extractors/rrdsr_methods.py +630 -622
- openrem/remapp/fixtures/openskin_safelist.json +11 -11
- openrem/remapp/forms.py +2286 -2277
- openrem/remapp/interface/chart_functions.py +2412 -2393
- openrem/remapp/interface/mod_filters.py +1241 -1243
- openrem/remapp/migrations/0001_initial.py.1-0-upgrade +1043 -1043
- openrem/remapp/models.py +3418 -3407
- openrem/remapp/netdicom/dicomviews.py +681 -683
- openrem/remapp/netdicom/qrscu.py +2646 -2646
- openrem/remapp/netdicom/tools.py +134 -134
- openrem/remapp/static/css/bootstrap-theme.css +587 -587
- openrem/remapp/static/css/bootstrap-theme.min.css +4 -4
- openrem/remapp/static/css/bootstrap.css +6800 -6800
- openrem/remapp/static/css/bootstrap.min.css +4 -4
- openrem/remapp/static/css/datepicker3.css +790 -790
- openrem/remapp/static/css/jquery.qtip.min.css +2 -2
- openrem/remapp/static/css/openrem-extra.css +442 -442
- openrem/remapp/static/css/openrem.css +96 -96
- openrem/remapp/static/css/registration.css +34 -34
- openrem/remapp/static/fonts/glyphicons-halflings-regular.svg +287 -287
- openrem/remapp/static/js/bootstrap-datepicker.js +1671 -1671
- openrem/remapp/static/js/bootstrap.js +2363 -2363
- openrem/remapp/static/js/bootstrap.min.js +6 -6
- openrem/remapp/static/js/charts/chartCommonFunctions.js +75 -75
- openrem/remapp/static/js/charts/chartFullScreen.js +41 -41
- openrem/remapp/static/js/charts/ctChartAjax.js +331 -331
- openrem/remapp/static/js/charts/dxChartAjax.js +290 -290
- openrem/remapp/static/js/charts/mgChartAjax.js +144 -144
- openrem/remapp/static/js/charts/nmChartAjax.js +64 -64
- openrem/remapp/static/js/charts/plotly-2.35.2.min.js +8 -0
- openrem/remapp/static/js/charts/rfChartAjax.js +128 -128
- openrem/remapp/static/js/chroma.min.js +32 -32
- openrem/remapp/static/js/datepicker.js +5 -5
- openrem/remapp/static/js/dicom.js +115 -115
- openrem/remapp/static/js/django_reverse/reverse.js +13 -13
- openrem/remapp/static/js/formatDate.js +7 -7
- openrem/remapp/static/js/html5shiv.min.js +8 -8
- openrem/remapp/static/js/jquery-1.11.0.min.js +4 -4
- openrem/remapp/static/js/npm.js +12 -12
- openrem/remapp/static/js/respond.min.js +4 -4
- openrem/remapp/static/js/skin-dose-maps/jquery.qtip.min.js +4 -4
- openrem/remapp/static/js/skin-dose-maps/rfSkinDoseMap3dHUDObject.js +112 -112
- openrem/remapp/static/js/skin-dose-maps/rfSkinDoseMap3dObject.js +367 -367
- openrem/remapp/static/js/skin-dose-maps/rfSkinDoseMap3dPersonObject.js +158 -158
- openrem/remapp/static/js/skin-dose-maps/rfSkinDoseMapColourScaleObject.js +153 -153
- openrem/remapp/static/js/skin-dose-maps/rfSkinDoseMapObject.js +367 -367
- openrem/remapp/static/js/skin-dose-maps/rfSkinDoseMapping.js +584 -584
- openrem/remapp/static/js/skin-dose-maps/rfSkinDoseMapping3d.js +255 -255
- openrem/remapp/static/js/skin-dose-maps/rfSkinDoseMappingAjax.js +267 -212
- openrem/remapp/static/js/skin-dose-maps/three.min.js +835 -835
- openrem/remapp/static/js/sorttable.js +495 -495
- openrem/remapp/templates/base.html +253 -253
- openrem/remapp/templates/registration/changepassword.html +25 -25
- openrem/remapp/templates/registration/changepassworddone.html +12 -12
- openrem/remapp/templates/registration/login.html +42 -42
- openrem/remapp/templates/remapp/backgroundtaskmaximumrows_form.html +29 -29
- openrem/remapp/templates/remapp/base.html +1 -1
- openrem/remapp/templates/remapp/ctdetail.html +235 -235
- openrem/remapp/templates/remapp/ctfiltered.html +310 -310
- openrem/remapp/templates/remapp/dicomdeletesettings_form.html +31 -31
- openrem/remapp/templates/remapp/dicomqr.html +147 -147
- openrem/remapp/templates/remapp/dicomquerydetails.html +83 -83
- openrem/remapp/templates/remapp/dicomqueryimages.html +49 -49
- openrem/remapp/templates/remapp/dicomqueryseries.html +109 -109
- openrem/remapp/templates/remapp/dicomquerysummary.html +48 -48
- openrem/remapp/templates/remapp/dicomremoteqr_confirm_delete.html +60 -60
- openrem/remapp/templates/remapp/dicomremoteqr_form.html +32 -32
- openrem/remapp/templates/remapp/dicomstorescp_confirm_delete.html +53 -53
- openrem/remapp/templates/remapp/dicomstorescp_form.html +48 -48
- openrem/remapp/templates/remapp/dicomsummary.html +257 -257
- openrem/remapp/templates/remapp/displaychartoptions.html +184 -184
- openrem/remapp/templates/remapp/displayhomepageoptions.html +57 -57
- openrem/remapp/templates/remapp/displayname-count.html +6 -6
- openrem/remapp/templates/remapp/displayname-last-date.html +3 -3
- openrem/remapp/templates/remapp/displayname-modality.html +86 -105
- openrem/remapp/templates/remapp/displayname-skinmap.html +18 -18
- openrem/remapp/templates/remapp/displaynameupdate.html +100 -100
- openrem/remapp/templates/remapp/displaynameview.html +222 -219
- openrem/remapp/templates/remapp/dxdetail.html +176 -176
- openrem/remapp/templates/remapp/dxfiltered.html +324 -324
- openrem/remapp/templates/remapp/exports-active.html +25 -25
- openrem/remapp/templates/remapp/exports-complete.html +35 -35
- openrem/remapp/templates/remapp/exports-error.html +26 -26
- openrem/remapp/templates/remapp/exports-queue.html +18 -18
- openrem/remapp/templates/remapp/exports.html +191 -191
- openrem/remapp/templates/remapp/failed_summary_list.html +27 -27
- openrem/remapp/templates/remapp/filteredbase.html +162 -162
- openrem/remapp/templates/remapp/highdosemetricalertsettings_form.html +76 -76
- openrem/remapp/templates/remapp/home-list-modalities.html +94 -94
- openrem/remapp/templates/remapp/home.html +202 -202
- openrem/remapp/templates/remapp/list_filters.html +24 -24
- openrem/remapp/templates/remapp/mgdetail.html +160 -138
- openrem/remapp/templates/remapp/mgfiltered.html +311 -311
- openrem/remapp/templates/remapp/nmdetail.html +300 -300
- openrem/remapp/templates/remapp/nmfiltered.html +255 -255
- openrem/remapp/templates/remapp/notpatient.html +190 -190
- openrem/remapp/templates/remapp/notpatientindicators_form_base.html +81 -81
- openrem/remapp/templates/remapp/notpatientindicatorsid_confirm_delete.html +54 -54
- openrem/remapp/templates/remapp/notpatientindicatorsid_form.html +23 -23
- openrem/remapp/templates/remapp/notpatientindicatorsname_confirm_delete.html +54 -54
- openrem/remapp/templates/remapp/notpatientindicatorsname_form.html +23 -23
- openrem/remapp/templates/remapp/notpatientindicatorsname_form_base.html +85 -85
- openrem/remapp/templates/remapp/openskinsafelist_add.html +130 -130
- openrem/remapp/templates/remapp/openskinsafelist_confirm_delete.html +100 -100
- openrem/remapp/templates/remapp/openskinsafelist_form.html +207 -207
- openrem/remapp/templates/remapp/patientidsettings_form.html +83 -83
- openrem/remapp/templates/remapp/populate_summary_progress.html +83 -83
- openrem/remapp/templates/remapp/populate_summary_progress_error.html +36 -36
- openrem/remapp/templates/remapp/review_failed_imports.html +157 -157
- openrem/remapp/templates/remapp/review_failed_study.html +41 -41
- openrem/remapp/templates/remapp/review_studies_delete_button.html +20 -20
- openrem/remapp/templates/remapp/review_study.html +19 -19
- openrem/remapp/templates/remapp/review_summary_list.html +245 -245
- openrem/remapp/templates/remapp/rf_dose_alert_email_template.html +14 -1
- openrem/remapp/templates/remapp/rfalertnotificationsview.html +59 -59
- openrem/remapp/templates/remapp/rfdetail.html +547 -543
- openrem/remapp/templates/remapp/rfdetailbase.html +18 -18
- openrem/remapp/templates/remapp/rffiltered.html +404 -404
- openrem/remapp/templates/remapp/sizeimports.html +119 -119
- openrem/remapp/templates/remapp/sizeprocess.html +96 -96
- openrem/remapp/templates/remapp/sizeupload.html +110 -110
- openrem/remapp/templates/remapp/skindosemapcalcsettings_form.html +28 -28
- openrem/remapp/templates/remapp/standardname-modality.html +69 -69
- openrem/remapp/templates/remapp/standardnames_confirm_delete.html +71 -71
- openrem/remapp/templates/remapp/standardnames_form.html +87 -87
- openrem/remapp/templates/remapp/standardnamesettings_form.html +41 -41
- openrem/remapp/templates/remapp/standardnamesrefreshall.html +92 -92
- openrem/remapp/templates/remapp/standardnameview.html +103 -103
- openrem/remapp/templates/remapp/study_confirm_delete.html +147 -147
- openrem/remapp/templates/remapp/task_admin.html +265 -265
- openrem/remapp/templates/remapp/tasks.html +76 -76
- openrem/remapp/templatetags/formfilters.py +13 -13
- openrem/remapp/templatetags/proper_paginate.py +38 -38
- openrem/remapp/templatetags/remappduration.py +36 -36
- openrem/remapp/templatetags/sigdig.py +38 -38
- openrem/remapp/templatetags/sort_class_property_value.py +15 -15
- openrem/remapp/templatetags/update_variable.py +20 -20
- openrem/remapp/templatetags/url_replace.py +25 -25
- openrem/remapp/tests/test_charts_common.py +202 -202
- openrem/remapp/tests/test_charts_ct.py +7111 -7111
- openrem/remapp/tests/test_charts_dx.py +3513 -3513
- openrem/remapp/tests/test_charts_mg.py +1116 -1115
- openrem/remapp/tests/test_dcmdatetime.py +189 -189
- openrem/remapp/tests/test_dicom_qr.py +2580 -2580
- openrem/remapp/tests/test_display_name.py +274 -274
- openrem/remapp/tests/test_export_ct_xlsx.py +272 -248
- openrem/remapp/tests/test_export_dx_xlsx.py +137 -134
- openrem/remapp/tests/test_export_mammo_csv.py +242 -242
- openrem/remapp/tests/test_export_rf_xlsx.py +246 -246
- openrem/remapp/tests/test_files/DX-Im-DRGEM.dcm +0 -0
- openrem/remapp/tests/test_files/MG-RDSR-GEPristina-2D.dcm +0 -0
- openrem/remapp/tests/test_files/MG-RDSR-GEPristina-DBT.dcm +0 -0
- openrem/remapp/tests/test_files/MG-RDSR-Giotto-DBT.dcm +0 -0
- openrem/remapp/tests/test_files/skin_map_alphenix.py +590 -590
- openrem/remapp/tests/test_files/skin_map_zee.py +354 -354
- openrem/remapp/tests/test_filters_ct.py +321 -321
- openrem/remapp/tests/test_filters_dx.py +92 -92
- openrem/remapp/tests/test_filters_mammo.py +183 -183
- openrem/remapp/tests/test_filters_rf.py +118 -118
- openrem/remapp/tests/test_get_values.py +72 -72
- openrem/remapp/tests/test_hash_id.py +65 -65
- openrem/remapp/tests/test_import_ct_esr_ge.py +3034 -3034
- openrem/remapp/tests/test_import_ct_philips_rdsr.py +42 -42
- openrem/remapp/tests/test_import_ct_rdsr_multiple.py +256 -256
- openrem/remapp/tests/test_import_ct_rdsr_siemens.py +827 -827
- openrem/remapp/tests/test_import_ct_rdsr_spectrumdynamics.py +91 -91
- openrem/remapp/tests/test_import_ct_rdsr_toshiba_dosecheck.py +67 -67
- openrem/remapp/tests/test_import_ct_rdsr_toshiba_multivaluesd.py +33 -33
- openrem/remapp/tests/test_import_ct_rdsr_toshiba_pixelmed.py +118 -118
- openrem/remapp/tests/test_import_ct_sc_philips.py +44 -44
- openrem/remapp/tests/test_import_dual_rdsr.py +110 -110
- openrem/remapp/tests/test_import_dx.py +1267 -1191
- openrem/remapp/tests/test_import_dx_rdsr.py +1250 -1253
- openrem/remapp/tests/test_import_mam.py +438 -438
- openrem/remapp/tests/test_import_mg_im_hol_proj.py +46 -46
- openrem/remapp/tests/test_import_mg_rdsr.py +586 -586
- openrem/remapp/tests/test_import_nm_image.py +420 -420
- openrem/remapp/tests/test_import_nm_siemens_rdsr.py +396 -396
- openrem/remapp/tests/test_import_px.py +161 -161
- openrem/remapp/tests/test_import_rf_rdsr.py +420 -418
- openrem/remapp/tests/test_missing_date.py +42 -42
- openrem/remapp/tests/test_not_patient.py +60 -60
- openrem/remapp/tests/test_openskin.py +272 -272
- openrem/remapp/tests/test_patient_id_settings.py +72 -72
- openrem/remapp/tests/test_pt_size_import.py +232 -232
- openrem/remapp/tests/test_rf_detail.py +113 -113
- openrem/remapp/tests/test_rf_high_dose_alert.py +361 -361
- openrem/remapp/tools/background.py +361 -361
- openrem/remapp/tools/check_standard_name_status.py +47 -0
- openrem/remapp/tools/check_uid.py +70 -70
- openrem/remapp/tools/dcmdatetime.py +248 -248
- openrem/remapp/tools/default_import.py +44 -47
- openrem/remapp/tools/get_values.py +230 -230
- openrem/remapp/tools/hash_id.py +58 -58
- openrem/remapp/tools/make_skin_map.py +448 -406
- openrem/remapp/tools/not_patient_indicators.py +72 -72
- openrem/remapp/tools/openskin/calc_exp_map.py +173 -173
- openrem/remapp/tools/openskin/geomclass.py +475 -475
- openrem/remapp/tools/openskin/geomfunc.py +433 -432
- openrem/remapp/tools/openskin/skinmap.py +417 -417
- openrem/remapp/tools/populate_summary.py +185 -193
- openrem/remapp/tools/save_skin_map_structure.py +73 -73
- openrem/remapp/tools/send_high_dose_alert_emails.py +238 -207
- openrem/remapp/urls.py +456 -448
- openrem/remapp/version.py +11 -11
- openrem/remapp/views.py +1147 -1052
- openrem/remapp/views_admin.py +3876 -3936
- openrem/remapp/views_charts_ct.py +2110 -2058
- openrem/remapp/views_charts_dx.py +1906 -1836
- openrem/remapp/views_charts_mg.py +1349 -1196
- openrem/remapp/views_charts_nm.py +535 -535
- openrem/remapp/views_charts_rf.py +1219 -1241
- openrem/remapp/views_openskin.py +379 -384
- openrem/sample-config/openrem-consumer.service +12 -12
- openrem/sample-config/openrem-gunicorn.service +13 -13
- openrem/sample-config/openrem-server +14 -13
- openrem/sample-config/openrem_orthanc_config_linux.lua +454 -454
- openrem/sample-config/openrem_orthanc_config_windows.lua +455 -455
- openrem/sample-config/queue-init.bat +73 -73
- openrem/scripts/openrem_ctphilips.py +25 -25
- openrem/scripts/openrem_cttoshiba.py +28 -28
- openrem/scripts/openrem_dx.py +22 -22
- openrem/scripts/openrem_mg.py +22 -22
- openrem/scripts/openrem_nm.py +22 -22
- openrem/scripts/openrem_ptsizecsv.py +17 -17
- openrem/scripts/openrem_qr.py +12 -12
- openrem/scripts/openrem_rdsr.py +25 -25
- {OpenREM-1.0.0b2.dist-info → openrem-1.0.0b3.dist-info}/METADATA +39 -29
- openrem-1.0.0b3.dist-info/RECORD +379 -0
- {OpenREM-1.0.0b2.dist-info → openrem-1.0.0b3.dist-info}/WHEEL +1 -1
- {OpenREM-1.0.0b2.dist-info → openrem-1.0.0b3.dist-info/licenses}/COPYING-GPLv3 +674 -674
- {OpenREM-1.0.0b2.dist-info → openrem-1.0.0b3.dist-info/licenses}/LICENSE +22 -22
- OpenREM-1.0.0b2.dist-info/RECORD +0 -373
- openrem/remapp/static/js/charts/plotly-2.17.1.min.js +0 -8
- {OpenREM-1.0.0b2.data → openrem-1.0.0b3.data}/scripts/openrem_ctphilips.py +0 -0
- {OpenREM-1.0.0b2.data → openrem-1.0.0b3.data}/scripts/openrem_cttoshiba.py +0 -0
- {OpenREM-1.0.0b2.data → openrem-1.0.0b3.data}/scripts/openrem_dx.py +0 -0
- {OpenREM-1.0.0b2.data → openrem-1.0.0b3.data}/scripts/openrem_mg.py +0 -0
- {OpenREM-1.0.0b2.data → openrem-1.0.0b3.data}/scripts/openrem_nm.py +0 -0
- {OpenREM-1.0.0b2.data → openrem-1.0.0b3.data}/scripts/openrem_ptsizecsv.py +0 -0
- {OpenREM-1.0.0b2.data → openrem-1.0.0b3.data}/scripts/openrem_qr.py +0 -0
- {OpenREM-1.0.0b2.data → openrem-1.0.0b3.data}/scripts/openrem_rdsr.py +0 -0
- {OpenREM-1.0.0b2.dist-info → openrem-1.0.0b3.dist-info}/top_level.txt +0 -0
|
@@ -1,584 +1,584 @@
|
|
|
1
|
-
/*global skinDoseMapObj:true, skinDoseMapColourScaleObj:true, skinDoseMap3dObj:true, skinDoseMap3dHUDObj:true,
|
|
2
|
-
show3dSkinDoseMap, chroma, renderer*/
|
|
3
|
-
/*eslint no-undef: "error"*/
|
|
4
|
-
/*eslint security/detect-object-injection: "off" */
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Function to draw the available colour scales
|
|
8
|
-
*/
|
|
9
|
-
function colourScaleSelection() {
|
|
10
|
-
var colourScales = ["OrRd","PuBu","BuPu","Oranges","BuGn","YlOrBr",
|
|
11
|
-
"YlGn","Reds","RdPu","Greens","YlGnBu","Purples","GnBu","Greys",
|
|
12
|
-
"YlOrRd","PuRd","Blues","PuBuGn"];
|
|
13
|
-
var i, j;
|
|
14
|
-
var colourScale;
|
|
15
|
-
var canvas, context;
|
|
16
|
-
var sideLength = 15;
|
|
17
|
-
var numShades = 11;
|
|
18
|
-
|
|
19
|
-
for (i=0; i<colourScales.length; i++) {
|
|
20
|
-
canvas = $("#" + colourScales[i])[0];
|
|
21
|
-
context = canvas.getContext("2d");
|
|
22
|
-
canvas.height = sideLength;
|
|
23
|
-
canvas.width = sideLength * numShades;
|
|
24
|
-
colourScale = chroma.scale(colourScales[i]);
|
|
25
|
-
for (j=0; j<numShades; j++) {
|
|
26
|
-
context.fillStyle = colourScale(j/(numShades-1));
|
|
27
|
-
context.fillRect(j*sideLength, 0, sideLength, sideLength);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Function to set a new colour scale
|
|
35
|
-
* @param newScale
|
|
36
|
-
* @param skinDoseMap
|
|
37
|
-
* @param skinDoseMapColourScale
|
|
38
|
-
* @param skinDoseMap3d
|
|
39
|
-
* @param show3dSkinDoseMap
|
|
40
|
-
*/
|
|
41
|
-
function useNewColourScale(newScale, skinDoseMap, skinDoseMapColourScale, skinDoseMap3d, show3dSkinDoseMap) {
|
|
42
|
-
skinDoseMap.useNewColourScale(newScale);
|
|
43
|
-
skinDoseMap.draw();
|
|
44
|
-
if (skinDoseMap.showOverlay) {skinDoseMap.drawOverlay();}
|
|
45
|
-
skinDoseMap.writeInformation();
|
|
46
|
-
|
|
47
|
-
skinDoseMapColourScale.useNewColourScale(newScale);
|
|
48
|
-
skinDoseMapColourScale.draw();
|
|
49
|
-
|
|
50
|
-
if (show3dSkinDoseMap) {
|
|
51
|
-
skinDoseMap3d.useNewColourScale(newScale);
|
|
52
|
-
skinDoseMap3d.draw();
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Function to return the position of the cursor
|
|
59
|
-
* @param obj
|
|
60
|
-
* @returns {*}
|
|
61
|
-
*/
|
|
62
|
-
function findPos(obj) {
|
|
63
|
-
var curleft = 0, curtop = 0;
|
|
64
|
-
if (obj.offsetParent) {
|
|
65
|
-
do {
|
|
66
|
-
curleft += obj.offsetLeft;
|
|
67
|
-
curtop += obj.offsetTop;
|
|
68
|
-
} while (obj = obj.offsetParent);
|
|
69
|
-
return {x: curleft, y: curtop};
|
|
70
|
-
}
|
|
71
|
-
return undefined;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* Function to decode an rgb value to a dose in Gy
|
|
77
|
-
* @param r
|
|
78
|
-
* @param g
|
|
79
|
-
* @param b
|
|
80
|
-
* @param doseUpperLimit
|
|
81
|
-
* @returns {number}
|
|
82
|
-
*/
|
|
83
|
-
function rgbToDoseInGy(r, g, b, doseUpperLimit) {
|
|
84
|
-
return doseUpperLimit * ((r * b) + g) / 65535.0;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Function to convert a dose in Gy to an rgb value
|
|
90
|
-
* @param dose
|
|
91
|
-
* @returns {string}
|
|
92
|
-
*/
|
|
93
|
-
function doseInGyToRGB(dose) {
|
|
94
|
-
var r, g, b;
|
|
95
|
-
dose = dose / 10. * 65535;
|
|
96
|
-
r = Math.floor(dose / 255);
|
|
97
|
-
g = Math.round(dose % 255);
|
|
98
|
-
b = 255;
|
|
99
|
-
return "rgb(" + r.toString() + "," + g.toString() + "," + b.toString() + ")";
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* Function to reset the skin dose maps to their default settings
|
|
105
|
-
* @param skinDoseMap
|
|
106
|
-
* @param skinDoseMapColourScale
|
|
107
|
-
* @param skinDoseMap3d
|
|
108
|
-
* @param show3dSkinDoseMap
|
|
109
|
-
* @param skinDoseMap3dPerson
|
|
110
|
-
*/
|
|
111
|
-
function reset(skinDoseMap, skinDoseMapColourScale, skinDoseMap3d, show3dSkinDoseMap, skinDoseMap3dPerson) {
|
|
112
|
-
skinDoseMap.updateWindowWidth(skinDoseMap.maxDose - skinDoseMap.minDose);
|
|
113
|
-
skinDoseMap.updateWindowLevel(skinDoseMap.minDose + (skinDoseMap.windowWidth/2.0));
|
|
114
|
-
skinDoseMap.draw();
|
|
115
|
-
if (skinDoseMap.showOverlay) {skinDoseMap.drawOverlay();}
|
|
116
|
-
skinDoseMap.writeInformation();
|
|
117
|
-
|
|
118
|
-
skinDoseMapColourScale.minDose = skinDoseMap.minDisplayedDose;
|
|
119
|
-
skinDoseMapColourScale.maxDose = skinDoseMap.maxDisplayedDose;
|
|
120
|
-
skinDoseMapColourScale.redrawValues();
|
|
121
|
-
|
|
122
|
-
if (show3dSkinDoseMap) {
|
|
123
|
-
skinDoseMap3d.windowWidth = skinDoseMap.windowWidth;
|
|
124
|
-
skinDoseMap3d.windowLevel = skinDoseMap.windowLevel;
|
|
125
|
-
skinDoseMap3d.draw();
|
|
126
|
-
|
|
127
|
-
skinDoseMap3d.reset();
|
|
128
|
-
skinDoseMap3dPerson.reset();
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
$("input[name=currentWindowLevel]").val(skinDoseMap.windowLevel.toFixed(skinDoseMapColourScale.decimalPlaces));
|
|
132
|
-
$("input[name=currentWindowWidth]").val(skinDoseMap.windowWidth.toFixed(skinDoseMapColourScale.decimalPlaces));
|
|
133
|
-
|
|
134
|
-
$("input[name=windowLevelSlider]").prop({"value": skinDoseMap.windowLevel});
|
|
135
|
-
$("input[name=windowWidthSlider]").prop({"value": skinDoseMap.windowWidth});
|
|
136
|
-
|
|
137
|
-
$("input[name=minDoseSlider]").prop({"value": skinDoseMap.minDose});
|
|
138
|
-
$("input[name=maxDoseSlider]").prop({"value": skinDoseMap.maxDose});
|
|
139
|
-
|
|
140
|
-
$("input[name=currentMinDisplayedDose]").val(skinDoseMap.minDose.toFixed(skinDoseMapColourScale.decimalPlaces));
|
|
141
|
-
$("input[name=currentMaxDisplayedDose]").val(skinDoseMap.maxDose.toFixed(skinDoseMapColourScale.decimalPlaces));
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
/**
|
|
146
|
-
* Function to update the skin dose map when the window level has been changed with a slider or the mouse
|
|
147
|
-
* @param newWindowLevel
|
|
148
|
-
* @param skinDoseMap
|
|
149
|
-
* @param skinDoseMapColourScale
|
|
150
|
-
* @param skinDoseMap3d
|
|
151
|
-
* @param show3dSkinDoseMap
|
|
152
|
-
*/
|
|
153
|
-
function updateWindowLevel(newWindowLevel, skinDoseMap, skinDoseMapColourScale, skinDoseMap3d, show3dSkinDoseMap) {
|
|
154
|
-
newWindowLevel = parseFloat(newWindowLevel);
|
|
155
|
-
if (newWindowLevel < 0) {newWindowLevel = 0;}
|
|
156
|
-
|
|
157
|
-
$("input[name=currentWindowLevel]").val(newWindowLevel.toFixed(skinDoseMapColourScale.decimalPlaces));
|
|
158
|
-
$("input[name=windowLevelSlider]").prop({"value": newWindowLevel});
|
|
159
|
-
|
|
160
|
-
skinDoseMap.updateWindowLevel(newWindowLevel);
|
|
161
|
-
skinDoseMap.draw();
|
|
162
|
-
if (skinDoseMap.showOverlay) {skinDoseMap.drawOverlay();}
|
|
163
|
-
skinDoseMap.writeInformation();
|
|
164
|
-
|
|
165
|
-
skinDoseMapColourScale.minDose = skinDoseMap.minDisplayedDose;
|
|
166
|
-
skinDoseMapColourScale.maxDose = skinDoseMap.maxDisplayedDose;
|
|
167
|
-
skinDoseMapColourScale.redrawValues();
|
|
168
|
-
|
|
169
|
-
if (show3dSkinDoseMap) {
|
|
170
|
-
skinDoseMap3d.windowWidth = skinDoseMap.windowWidth;
|
|
171
|
-
skinDoseMap3d.windowLevel = skinDoseMap.windowLevel;
|
|
172
|
-
skinDoseMap3d.draw();
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
$("input[name=minDoseSlider]").prop({"value": skinDoseMap.minDisplayedDose});
|
|
176
|
-
$("input[name=maxDoseSlider]").prop({"value": skinDoseMap.maxDisplayedDose});
|
|
177
|
-
|
|
178
|
-
$("input[name=currentMinDisplayedDose]").val(skinDoseMap.minDisplayedDose.toFixed(skinDoseMapColourScale.decimalPlaces));
|
|
179
|
-
$("input[name=currentMaxDisplayedDose]").val(skinDoseMap.maxDisplayedDose.toFixed(skinDoseMapColourScale.decimalPlaces));
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
/**
|
|
184
|
-
* Function to update the skin dose map when the window width has been changed with a slider or the mouse
|
|
185
|
-
* @param newWindowWidth
|
|
186
|
-
* @param skinDoseMap
|
|
187
|
-
* @param skinDoseMapColourScale
|
|
188
|
-
* @param skinDoseMap3d
|
|
189
|
-
* @param show3dSkinDoseMap
|
|
190
|
-
*/
|
|
191
|
-
function updateWindowWidth(newWindowWidth, skinDoseMap, skinDoseMapColourScale, skinDoseMap3d, show3dSkinDoseMap) {
|
|
192
|
-
newWindowWidth = parseFloat(newWindowWidth);
|
|
193
|
-
$("input[name=currentWindowWidth]").val(newWindowWidth.toFixed(skinDoseMapColourScale.decimalPlaces));
|
|
194
|
-
$("input[name=windowWidthSlider]").prop({"value": newWindowWidth});
|
|
195
|
-
|
|
196
|
-
skinDoseMap.updateWindowWidth(newWindowWidth);
|
|
197
|
-
skinDoseMap.draw();
|
|
198
|
-
if (skinDoseMap.showOverlay) {skinDoseMap.drawOverlay();}
|
|
199
|
-
skinDoseMap.writeInformation();
|
|
200
|
-
|
|
201
|
-
skinDoseMapColourScale.minDose = skinDoseMap.minDisplayedDose;
|
|
202
|
-
skinDoseMapColourScale.maxDose = skinDoseMap.maxDisplayedDose;
|
|
203
|
-
skinDoseMapColourScale.redrawValues();
|
|
204
|
-
|
|
205
|
-
if (show3dSkinDoseMap) {
|
|
206
|
-
skinDoseMap3d.windowWidth = skinDoseMap.windowWidth;
|
|
207
|
-
skinDoseMap3d.windowLevel = skinDoseMap.windowLevel;
|
|
208
|
-
skinDoseMap3d.draw();
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
$("input[name=minDoseSlider]").prop({"value": skinDoseMap.minDisplayedDose});
|
|
212
|
-
$("input[name=maxDoseSlider]").prop({"value": skinDoseMap.maxDisplayedDose});
|
|
213
|
-
|
|
214
|
-
$("input[name=currentMinDisplayedDose]").val(skinDoseMap.minDisplayedDose.toFixed(skinDoseMapColourScale.decimalPlaces));
|
|
215
|
-
$("input[name=currentMaxDisplayedDose]").val(skinDoseMap.maxDisplayedDose.toFixed(skinDoseMapColourScale.decimalPlaces));
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
/**
|
|
220
|
-
* Function to update the HTML sliders and their displayed values
|
|
221
|
-
* @param skinDoseMap
|
|
222
|
-
* @param skinDoseMapColourScale
|
|
223
|
-
*/
|
|
224
|
-
function updateSlidersAndValues(skinDoseMap, skinDoseMapColourScale) {
|
|
225
|
-
$("input[name=minDoseSlider]").prop({"value": skinDoseMap.minDisplayedDose});
|
|
226
|
-
$("input[name=maxDoseSlider]").prop({"value": skinDoseMap.maxDisplayedDose});
|
|
227
|
-
|
|
228
|
-
$("input[name=currentMinDisplayedDose]").val(skinDoseMap.minDisplayedDose.toFixed(skinDoseMapColourScale.decimalPlaces));
|
|
229
|
-
$("input[name=currentMaxDisplayedDose]").val(skinDoseMap.maxDisplayedDose.toFixed(skinDoseMapColourScale.decimalPlaces));
|
|
230
|
-
|
|
231
|
-
$("input[name=currentWindowLevel]").val(skinDoseMap.windowLevel.toFixed(skinDoseMapColourScale.decimalPlaces));
|
|
232
|
-
$("input[name=currentWindowWidth]").val(skinDoseMap.windowWidth.toFixed(skinDoseMapColourScale.decimalPlaces));
|
|
233
|
-
|
|
234
|
-
$("input[name=windowLevelSlider]").prop({"value": skinDoseMap.windowLevel});
|
|
235
|
-
$("input[name=windowWidthSlider]").prop({"value": skinDoseMap.windowWidth});
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
/**
|
|
240
|
-
* Function to update the skin dose map when the minimum displayed dose has been changed using a slider or the mouse
|
|
241
|
-
* @param minDisplayedDose
|
|
242
|
-
* @param skinDoseMap
|
|
243
|
-
* @param skinDoseMapColourScale
|
|
244
|
-
* @param skinDoseMap3d
|
|
245
|
-
* @param show3dSkinDoseMap
|
|
246
|
-
*/
|
|
247
|
-
function updateMinDisplayedDose(minDisplayedDose, skinDoseMap, skinDoseMapColourScale, skinDoseMap3d, show3dSkinDoseMap) {
|
|
248
|
-
minDisplayedDose = parseFloat(minDisplayedDose);
|
|
249
|
-
|
|
250
|
-
skinDoseMap.updateMinDisplayedDose(minDisplayedDose);
|
|
251
|
-
skinDoseMap.draw();
|
|
252
|
-
if (skinDoseMap.showOverlay) {skinDoseMap.drawOverlay();}
|
|
253
|
-
skinDoseMap.writeInformation();
|
|
254
|
-
|
|
255
|
-
skinDoseMapColourScale.minDose = skinDoseMap.minDisplayedDose;
|
|
256
|
-
skinDoseMapColourScale.redrawValues();
|
|
257
|
-
|
|
258
|
-
if (show3dSkinDoseMap) {
|
|
259
|
-
skinDoseMap3d.windowWidth = skinDoseMap.windowWidth;
|
|
260
|
-
skinDoseMap3d.windowLevel = skinDoseMap.windowLevel;
|
|
261
|
-
skinDoseMap3d.draw();
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
updateSlidersAndValues(skinDoseMap, skinDoseMapColourScale);
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
/**
|
|
269
|
-
* Function to update the skin dose map when the maximum displayed dose has been changed using a slider or the mouse
|
|
270
|
-
* @param maxDisplayedDose
|
|
271
|
-
* @param skinDoseMap
|
|
272
|
-
* @param skinDoseMapColourScale
|
|
273
|
-
* @param skinDoseMap3d
|
|
274
|
-
* @param show3dSkinDoseMap
|
|
275
|
-
*/
|
|
276
|
-
function updateMaxDisplayedDose(maxDisplayedDose, skinDoseMap, skinDoseMapColourScale, skinDoseMap3d, show3dSkinDoseMap) {
|
|
277
|
-
maxDisplayedDose = parseFloat(maxDisplayedDose);
|
|
278
|
-
|
|
279
|
-
skinDoseMap.updateMaxDisplayedDose(maxDisplayedDose);
|
|
280
|
-
skinDoseMap.draw();
|
|
281
|
-
if (skinDoseMap.showOverlay) {skinDoseMap.drawOverlay();}
|
|
282
|
-
skinDoseMap.writeInformation();
|
|
283
|
-
|
|
284
|
-
skinDoseMapColourScale.maxDose = skinDoseMap.maxDisplayedDose;
|
|
285
|
-
skinDoseMapColourScale.redrawValues();
|
|
286
|
-
|
|
287
|
-
if (show3dSkinDoseMap) {
|
|
288
|
-
skinDoseMap3d.windowWidth = skinDoseMap.windowWidth;
|
|
289
|
-
skinDoseMap3d.windowLevel = skinDoseMap.windowLevel;
|
|
290
|
-
skinDoseMap3d.draw();
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
updateSlidersAndValues(skinDoseMap, skinDoseMapColourScale);
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
/**
|
|
298
|
-
* Function to change the skin dose map when the minimum displayed dose has been changed manually
|
|
299
|
-
* @param minDisplayedDose
|
|
300
|
-
* @param skinDoseMap
|
|
301
|
-
* @param skinDoseMapColourScale
|
|
302
|
-
* @param skinDoseMap3d
|
|
303
|
-
* @param show3dSkinDoseMap
|
|
304
|
-
*/
|
|
305
|
-
function updateMinDisplayedDoseManual(minDisplayedDose, skinDoseMap, skinDoseMapColourScale, skinDoseMap3d, show3dSkinDoseMap) {
|
|
306
|
-
minDisplayedDose = parseFloat(minDisplayedDose);
|
|
307
|
-
|
|
308
|
-
skinDoseMap.updateMinDisplayedDoseManual(minDisplayedDose);
|
|
309
|
-
skinDoseMap.draw();
|
|
310
|
-
if (skinDoseMap.showOverlay) {skinDoseMap.drawOverlay();}
|
|
311
|
-
skinDoseMap.writeInformation();
|
|
312
|
-
|
|
313
|
-
skinDoseMapColourScale.minDose = skinDoseMap.minDisplayedDose;
|
|
314
|
-
skinDoseMapColourScale.redrawValues();
|
|
315
|
-
|
|
316
|
-
if (show3dSkinDoseMap) {
|
|
317
|
-
skinDoseMap3d.windowWidth = skinDoseMap.windowWidth;
|
|
318
|
-
skinDoseMap3d.windowLevel = skinDoseMap.windowLevel;
|
|
319
|
-
skinDoseMap3d.draw();
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
updateSlidersAndValues(skinDoseMap, skinDoseMapColourScale);
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
/**
|
|
327
|
-
* Function to update the skin dose map when the maximum displayed dose has been changed
|
|
328
|
-
* @param maxDisplayedDose
|
|
329
|
-
* @param skinDoseMap
|
|
330
|
-
* @param skinDoseMapColourScale
|
|
331
|
-
* @param skinDoseMap3d
|
|
332
|
-
* @param show3dSkinDoseMap
|
|
333
|
-
*/
|
|
334
|
-
function updateMaxDisplayedDoseManual(maxDisplayedDose, skinDoseMap, skinDoseMapColourScale, skinDoseMap3d, show3dSkinDoseMap) {
|
|
335
|
-
maxDisplayedDose = parseFloat(maxDisplayedDose);
|
|
336
|
-
|
|
337
|
-
skinDoseMap.updateMaxDisplayedDoseManual(maxDisplayedDose);
|
|
338
|
-
skinDoseMap.draw();
|
|
339
|
-
if (skinDoseMap.showOverlay) {skinDoseMap.drawOverlay();}
|
|
340
|
-
skinDoseMap.writeInformation();
|
|
341
|
-
|
|
342
|
-
skinDoseMapColourScale.maxDose = skinDoseMap.maxDisplayedDose;
|
|
343
|
-
skinDoseMapColourScale.redrawValues();
|
|
344
|
-
|
|
345
|
-
if (show3dSkinDoseMap) {
|
|
346
|
-
skinDoseMap3d.windowWidth = skinDoseMap.windowWidth;
|
|
347
|
-
skinDoseMap3d.windowLevel = skinDoseMap.windowLevel;
|
|
348
|
-
skinDoseMap3d.draw();
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
updateSlidersAndValues(skinDoseMap, skinDoseMapColourScale);
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
var previousMousePosition = {
|
|
356
|
-
x: 0,
|
|
357
|
-
y: 0
|
|
358
|
-
};
|
|
359
|
-
|
|
360
|
-
var isDragging = false;
|
|
361
|
-
|
|
362
|
-
// jQuery mouse event handlers for the DIV that contains the 2D skin dose map
|
|
363
|
-
$("#skinDoseMap")
|
|
364
|
-
.on("mouseup", function () {
|
|
365
|
-
isDragging = false;
|
|
366
|
-
})
|
|
367
|
-
.on("mousedown", function () {
|
|
368
|
-
isDragging = true;
|
|
369
|
-
})
|
|
370
|
-
.on("mousemove", function (e) {
|
|
371
|
-
var pos = findPos(this);
|
|
372
|
-
var x = e.pageX - pos.x;
|
|
373
|
-
var y = e.pageY - pos.y;
|
|
374
|
-
//var p = skinDoseMapObj.skinDoseMapContext.getImageData(x, y, 1, 1).data;
|
|
375
|
-
var mag = skinDoseMapObj.mag;
|
|
376
|
-
if (x <= this.width-1 && y <= this.height-1) {
|
|
377
|
-
var currentDose = parseFloat(skinDoseMapObj.skinDoseMap[(Math.floor(y/mag)) * Math.floor(this.width/mag) + Math.floor(x/mag)]).toPrecision(2) + " Gy";
|
|
378
|
-
$("[data-tooltip='skin_dose_map']").qtip("option", "content.text", currentDose);
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
var deltaMove = {
|
|
382
|
-
x: e.offsetX - previousMousePosition.x,
|
|
383
|
-
y: e.offsetY - previousMousePosition.y
|
|
384
|
-
};
|
|
385
|
-
|
|
386
|
-
if (isDragging) {
|
|
387
|
-
var maxWL = parseFloat($("#windowLevelSlider")[0].max);
|
|
388
|
-
var newWL = skinDoseMapObj.windowLevel * (100-deltaMove.y)/100;
|
|
389
|
-
if (newWL === 0) {newWL += 0.01;}
|
|
390
|
-
if (newWL < 0) {newWL = 0;}
|
|
391
|
-
if (newWL > maxWL) {newWL = maxWL;}
|
|
392
|
-
skinDoseMapObj.updateWindowLevel(newWL);
|
|
393
|
-
|
|
394
|
-
var maxWW = parseFloat($("#windowWidthSlider")[0].max);
|
|
395
|
-
var newWW = skinDoseMapObj.windowWidth + skinDoseMapObj.windowWidth * deltaMove.x/100;
|
|
396
|
-
if (newWW === 0) {newWW += 0.01;}
|
|
397
|
-
if (newWW < 0) {newWW = 0;}
|
|
398
|
-
if (newWW > maxWW) {newWW = maxWW;}
|
|
399
|
-
skinDoseMapObj.updateWindowWidth(newWW);
|
|
400
|
-
|
|
401
|
-
skinDoseMapObj.draw();
|
|
402
|
-
if (skinDoseMapObj.showOverlay) {skinDoseMapObj.drawOverlay();}
|
|
403
|
-
skinDoseMapObj.writeInformation();
|
|
404
|
-
|
|
405
|
-
skinDoseMapColourScaleObj.minDose = skinDoseMapObj.minDisplayedDose;
|
|
406
|
-
skinDoseMapColourScaleObj.maxDose = skinDoseMapObj.maxDisplayedDose;
|
|
407
|
-
skinDoseMapColourScaleObj.redrawValues();
|
|
408
|
-
|
|
409
|
-
if (show3dSkinDoseMap) {
|
|
410
|
-
skinDoseMap3dObj.windowLevel = newWL;
|
|
411
|
-
skinDoseMap3dObj.windowWidth = newWW;
|
|
412
|
-
skinDoseMap3dObj.draw();
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
updateSlidersAndValues(skinDoseMapObj, skinDoseMapColourScaleObj);
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
previousMousePosition = {
|
|
419
|
-
x: e.offsetX,
|
|
420
|
-
y: e.offsetY
|
|
421
|
-
};
|
|
422
|
-
});
|
|
423
|
-
|
|
424
|
-
colourScaleSelection();
|
|
425
|
-
|
|
426
|
-
$("[data-tooltip='skin_dose_map']").qtip({
|
|
427
|
-
content: {
|
|
428
|
-
text: ""
|
|
429
|
-
},
|
|
430
|
-
position: {
|
|
431
|
-
target: "mouse",
|
|
432
|
-
adjust: {
|
|
433
|
-
mouse: true,
|
|
434
|
-
x: 15,
|
|
435
|
-
y: 15
|
|
436
|
-
}
|
|
437
|
-
},
|
|
438
|
-
style: { classes: "qtip-bootstrap" }
|
|
439
|
-
});
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
/**
|
|
443
|
-
* Function to enable the user to save the contents of the HTML canvas as a png file
|
|
444
|
-
* @param link
|
|
445
|
-
* @param canvasId
|
|
446
|
-
* @param filename
|
|
447
|
-
*/
|
|
448
|
-
function downloadCanvas(link, canvasId, filename) {
|
|
449
|
-
var canvas = $("#"+canvasId)[0];
|
|
450
|
-
|
|
451
|
-
if (canvas.msToBlob) { //for IE
|
|
452
|
-
var blob = canvas.msToBlob();
|
|
453
|
-
window.navigator.msSaveBlob(blob, filename);
|
|
454
|
-
} else { //other browsers
|
|
455
|
-
link.href = canvas.toDataURL();
|
|
456
|
-
link.download = filename;
|
|
457
|
-
}
|
|
458
|
-
}
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
/**
|
|
462
|
-
* Function to enable the user to save the contents of the three.js display as a png file
|
|
463
|
-
* @param link
|
|
464
|
-
* @param filename
|
|
465
|
-
*/
|
|
466
|
-
function download3dCanvas(link, filename) {
|
|
467
|
-
if (renderer.domElement.msToBlob) { //for IE
|
|
468
|
-
var blob = renderer.domElement.msToBlob();
|
|
469
|
-
window.navigator.msSaveBlob(blob, filename);
|
|
470
|
-
} else { //other browsers
|
|
471
|
-
link.href = renderer.domElement.toDataURL("image/png");
|
|
472
|
-
link.download = filename;
|
|
473
|
-
}
|
|
474
|
-
}
|
|
475
|
-
|
|
476
|
-
$("#save2dSkinMap").click(function() {
|
|
477
|
-
downloadCanvas(this, "skinDoseMap", "2dSkinMap.png");
|
|
478
|
-
});
|
|
479
|
-
|
|
480
|
-
$("#save3dSkinMap").click(function() {
|
|
481
|
-
download3dCanvas(this, "3dSkinMap.png");
|
|
482
|
-
});
|
|
483
|
-
|
|
484
|
-
$("#skinDoseMapOverlayShow").click(function() {
|
|
485
|
-
$("#skinDoseMapOverlayHide").toggle();
|
|
486
|
-
$("#skinDoseMapOverlayShow").toggle();
|
|
487
|
-
skinDoseMapObj.toggleOverlay();
|
|
488
|
-
});
|
|
489
|
-
|
|
490
|
-
$("#skinDoseMapOverlayHide").click(function() {
|
|
491
|
-
$("#skinDoseMapOverlayHide").toggle();
|
|
492
|
-
$("#skinDoseMapOverlayShow").toggle();
|
|
493
|
-
skinDoseMapObj.toggleOverlay();
|
|
494
|
-
});
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
var skinMapFullScreen = false;
|
|
498
|
-
var skinDoseMapGroupOrigWidth, skinDoseMapGroupOrigHeight;
|
|
499
|
-
$("#skinDoseMapFullscreenBtn").click(function() {
|
|
500
|
-
skinMapFullScreen = !skinMapFullScreen;
|
|
501
|
-
|
|
502
|
-
var skinDoseMapContainer = $("#skinDoseMapContainer");
|
|
503
|
-
|
|
504
|
-
var otherHeight = skinDoseMapContainer.height() - $("#skinDoseMap").height();
|
|
505
|
-
|
|
506
|
-
skinDoseMapContainer.toggleClass("fullscreen");
|
|
507
|
-
|
|
508
|
-
var skinDoseMapGroup = $("#skinDoseMapGroup");
|
|
509
|
-
|
|
510
|
-
if (skinMapFullScreen) {
|
|
511
|
-
var skinDoseMapGroupWidth = $(window).width();
|
|
512
|
-
var skinDoseMapGroupHeight = $(window).height() - otherHeight;
|
|
513
|
-
|
|
514
|
-
var maxMagWidth = Math.floor((skinDoseMapGroupWidth-80) / skinDoseMapObj.skinDoseMapWidth);
|
|
515
|
-
var maxMagHeight = Math.floor(skinDoseMapGroupHeight / skinDoseMapObj.skinDoseMapHeight);
|
|
516
|
-
|
|
517
|
-
skinDoseMapObj.mag = (maxMagHeight <= maxMagWidth) ? maxMagHeight : maxMagWidth;
|
|
518
|
-
skinDoseMapObj.resizeSkinDoseMap();
|
|
519
|
-
skinDoseMapGroup.width(skinDoseMapObj.skinDoseMapCanvas.width + 80 + "px").height(skinDoseMapObj.skinDoseMapCanvas.height + "px");
|
|
520
|
-
skinDoseMapObj.draw();
|
|
521
|
-
skinDoseMapObj.updateBoundaries();
|
|
522
|
-
if (skinDoseMapObj.showOverlay) {skinDoseMapObj.drawOverlay();}
|
|
523
|
-
skinDoseMapObj.writeInformation();
|
|
524
|
-
|
|
525
|
-
skinDoseMapColourScaleObj.resizeColourScale(70, skinDoseMapObj.skinDoseMapCanvas.height);
|
|
526
|
-
skinDoseMapColourScaleObj.draw();
|
|
527
|
-
|
|
528
|
-
if (show3dSkinDoseMap) {
|
|
529
|
-
skinDoseMap3dObj.canvas.width = skinDoseMapObj.skinDoseMapCanvas.width;
|
|
530
|
-
skinDoseMap3dObj.canvas.height = skinDoseMapObj.skinDoseMapCanvas.height;
|
|
531
|
-
skinDoseMap3dObj.draw();
|
|
532
|
-
skinDoseMap3dHUDObj.width = skinDoseMapObj.skinDoseMapCanvas.width;
|
|
533
|
-
skinDoseMap3dHUDObj.height = skinDoseMapObj.skinDoseMapCanvas.height;
|
|
534
|
-
skinDoseMap3dHUDObj.redraw();
|
|
535
|
-
}
|
|
536
|
-
} else {
|
|
537
|
-
skinDoseMapGroup.width(skinDoseMapGroupOrigWidth).height(skinDoseMapGroupOrigHeight);
|
|
538
|
-
skinDoseMapObj.mag = 6;
|
|
539
|
-
skinDoseMapObj.resizeSkinDoseMap();
|
|
540
|
-
skinDoseMapObj.draw();
|
|
541
|
-
skinDoseMapObj.updateBoundaries();
|
|
542
|
-
if (skinDoseMapObj.showOverlay) {skinDoseMapObj.drawOverlay();}
|
|
543
|
-
skinDoseMapObj.writeInformation();
|
|
544
|
-
|
|
545
|
-
skinDoseMapColourScaleObj.resizeColourScale(70, skinDoseMapObj.skinDoseMapCanvas.height);
|
|
546
|
-
skinDoseMapColourScaleObj.draw();
|
|
547
|
-
|
|
548
|
-
if (show3dSkinDoseMap) {
|
|
549
|
-
skinDoseMap3dObj.canvas.width = skinDoseMapObj.skinDoseMapCanvas.width;
|
|
550
|
-
skinDoseMap3dObj.canvas.height = skinDoseMapObj.skinDoseMapCanvas.height;
|
|
551
|
-
skinDoseMap3dObj.draw();
|
|
552
|
-
skinDoseMap3dHUDObj.width = skinDoseMapObj.skinDoseMapCanvas.width;
|
|
553
|
-
skinDoseMap3dHUDObj.height = skinDoseMapObj.skinDoseMapCanvas.height;
|
|
554
|
-
skinDoseMap3dHUDObj.redraw();
|
|
555
|
-
}
|
|
556
|
-
}
|
|
557
|
-
});
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
/**
|
|
561
|
-
* Function to check that the HTML5 canvas is supported by the user's browser
|
|
562
|
-
* @returns {boolean}
|
|
563
|
-
*/
|
|
564
|
-
function isCanvasSupported(){
|
|
565
|
-
var elem = document.createElement("canvas");
|
|
566
|
-
return !!(elem.getContext && elem.getContext("2d"));
|
|
567
|
-
}
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
/**
|
|
571
|
-
* Function to toggle between 2D and 3D skin dose map display
|
|
572
|
-
*/
|
|
573
|
-
function switch2d3dSkinDoseMap() {
|
|
574
|
-
$("#save2dSkinMap").toggle();
|
|
575
|
-
$("#save3dSkinMap").toggle();
|
|
576
|
-
$("#skinDoseMap3d").toggle();
|
|
577
|
-
$("#skinDoseMap").toggle();
|
|
578
|
-
|
|
579
|
-
$("#maxDose").toggleClass("whiteText");
|
|
580
|
-
$("#phantomDimensions").toggleClass("whiteText");
|
|
581
|
-
$("#patientHeight").toggleClass("whiteText");
|
|
582
|
-
$("#patientMass").toggleClass("whiteText");
|
|
583
|
-
$("#patientOrientation").toggleClass("whiteText");
|
|
584
|
-
}
|
|
1
|
+
/*global skinDoseMapObj:true, skinDoseMapColourScaleObj:true, skinDoseMap3dObj:true, skinDoseMap3dHUDObj:true,
|
|
2
|
+
show3dSkinDoseMap, chroma, renderer*/
|
|
3
|
+
/*eslint no-undef: "error"*/
|
|
4
|
+
/*eslint security/detect-object-injection: "off" */
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Function to draw the available colour scales
|
|
8
|
+
*/
|
|
9
|
+
function colourScaleSelection() {
|
|
10
|
+
var colourScales = ["OrRd","PuBu","BuPu","Oranges","BuGn","YlOrBr",
|
|
11
|
+
"YlGn","Reds","RdPu","Greens","YlGnBu","Purples","GnBu","Greys",
|
|
12
|
+
"YlOrRd","PuRd","Blues","PuBuGn"];
|
|
13
|
+
var i, j;
|
|
14
|
+
var colourScale;
|
|
15
|
+
var canvas, context;
|
|
16
|
+
var sideLength = 15;
|
|
17
|
+
var numShades = 11;
|
|
18
|
+
|
|
19
|
+
for (i=0; i<colourScales.length; i++) {
|
|
20
|
+
canvas = $("#" + colourScales[i])[0];
|
|
21
|
+
context = canvas.getContext("2d");
|
|
22
|
+
canvas.height = sideLength;
|
|
23
|
+
canvas.width = sideLength * numShades;
|
|
24
|
+
colourScale = chroma.scale(colourScales[i]);
|
|
25
|
+
for (j=0; j<numShades; j++) {
|
|
26
|
+
context.fillStyle = colourScale(j/(numShades-1));
|
|
27
|
+
context.fillRect(j*sideLength, 0, sideLength, sideLength);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Function to set a new colour scale
|
|
35
|
+
* @param newScale
|
|
36
|
+
* @param skinDoseMap
|
|
37
|
+
* @param skinDoseMapColourScale
|
|
38
|
+
* @param skinDoseMap3d
|
|
39
|
+
* @param show3dSkinDoseMap
|
|
40
|
+
*/
|
|
41
|
+
function useNewColourScale(newScale, skinDoseMap, skinDoseMapColourScale, skinDoseMap3d, show3dSkinDoseMap) {
|
|
42
|
+
skinDoseMap.useNewColourScale(newScale);
|
|
43
|
+
skinDoseMap.draw();
|
|
44
|
+
if (skinDoseMap.showOverlay) {skinDoseMap.drawOverlay();}
|
|
45
|
+
skinDoseMap.writeInformation();
|
|
46
|
+
|
|
47
|
+
skinDoseMapColourScale.useNewColourScale(newScale);
|
|
48
|
+
skinDoseMapColourScale.draw();
|
|
49
|
+
|
|
50
|
+
if (show3dSkinDoseMap) {
|
|
51
|
+
skinDoseMap3d.useNewColourScale(newScale);
|
|
52
|
+
skinDoseMap3d.draw();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Function to return the position of the cursor
|
|
59
|
+
* @param obj
|
|
60
|
+
* @returns {*}
|
|
61
|
+
*/
|
|
62
|
+
function findPos(obj) {
|
|
63
|
+
var curleft = 0, curtop = 0;
|
|
64
|
+
if (obj.offsetParent) {
|
|
65
|
+
do {
|
|
66
|
+
curleft += obj.offsetLeft;
|
|
67
|
+
curtop += obj.offsetTop;
|
|
68
|
+
} while (obj = obj.offsetParent);
|
|
69
|
+
return {x: curleft, y: curtop};
|
|
70
|
+
}
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Function to decode an rgb value to a dose in Gy
|
|
77
|
+
* @param r
|
|
78
|
+
* @param g
|
|
79
|
+
* @param b
|
|
80
|
+
* @param doseUpperLimit
|
|
81
|
+
* @returns {number}
|
|
82
|
+
*/
|
|
83
|
+
function rgbToDoseInGy(r, g, b, doseUpperLimit) {
|
|
84
|
+
return doseUpperLimit * ((r * b) + g) / 65535.0;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Function to convert a dose in Gy to an rgb value
|
|
90
|
+
* @param dose
|
|
91
|
+
* @returns {string}
|
|
92
|
+
*/
|
|
93
|
+
function doseInGyToRGB(dose) {
|
|
94
|
+
var r, g, b;
|
|
95
|
+
dose = dose / 10. * 65535;
|
|
96
|
+
r = Math.floor(dose / 255);
|
|
97
|
+
g = Math.round(dose % 255);
|
|
98
|
+
b = 255;
|
|
99
|
+
return "rgb(" + r.toString() + "," + g.toString() + "," + b.toString() + ")";
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Function to reset the skin dose maps to their default settings
|
|
105
|
+
* @param skinDoseMap
|
|
106
|
+
* @param skinDoseMapColourScale
|
|
107
|
+
* @param skinDoseMap3d
|
|
108
|
+
* @param show3dSkinDoseMap
|
|
109
|
+
* @param skinDoseMap3dPerson
|
|
110
|
+
*/
|
|
111
|
+
function reset(skinDoseMap, skinDoseMapColourScale, skinDoseMap3d, show3dSkinDoseMap, skinDoseMap3dPerson) {
|
|
112
|
+
skinDoseMap.updateWindowWidth(skinDoseMap.maxDose - skinDoseMap.minDose);
|
|
113
|
+
skinDoseMap.updateWindowLevel(skinDoseMap.minDose + (skinDoseMap.windowWidth/2.0));
|
|
114
|
+
skinDoseMap.draw();
|
|
115
|
+
if (skinDoseMap.showOverlay) {skinDoseMap.drawOverlay();}
|
|
116
|
+
skinDoseMap.writeInformation();
|
|
117
|
+
|
|
118
|
+
skinDoseMapColourScale.minDose = skinDoseMap.minDisplayedDose;
|
|
119
|
+
skinDoseMapColourScale.maxDose = skinDoseMap.maxDisplayedDose;
|
|
120
|
+
skinDoseMapColourScale.redrawValues();
|
|
121
|
+
|
|
122
|
+
if (show3dSkinDoseMap) {
|
|
123
|
+
skinDoseMap3d.windowWidth = skinDoseMap.windowWidth;
|
|
124
|
+
skinDoseMap3d.windowLevel = skinDoseMap.windowLevel;
|
|
125
|
+
skinDoseMap3d.draw();
|
|
126
|
+
|
|
127
|
+
skinDoseMap3d.reset();
|
|
128
|
+
skinDoseMap3dPerson.reset();
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
$("input[name=currentWindowLevel]").val(skinDoseMap.windowLevel.toFixed(skinDoseMapColourScale.decimalPlaces));
|
|
132
|
+
$("input[name=currentWindowWidth]").val(skinDoseMap.windowWidth.toFixed(skinDoseMapColourScale.decimalPlaces));
|
|
133
|
+
|
|
134
|
+
$("input[name=windowLevelSlider]").prop({"value": skinDoseMap.windowLevel});
|
|
135
|
+
$("input[name=windowWidthSlider]").prop({"value": skinDoseMap.windowWidth});
|
|
136
|
+
|
|
137
|
+
$("input[name=minDoseSlider]").prop({"value": skinDoseMap.minDose});
|
|
138
|
+
$("input[name=maxDoseSlider]").prop({"value": skinDoseMap.maxDose});
|
|
139
|
+
|
|
140
|
+
$("input[name=currentMinDisplayedDose]").val(skinDoseMap.minDose.toFixed(skinDoseMapColourScale.decimalPlaces));
|
|
141
|
+
$("input[name=currentMaxDisplayedDose]").val(skinDoseMap.maxDose.toFixed(skinDoseMapColourScale.decimalPlaces));
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Function to update the skin dose map when the window level has been changed with a slider or the mouse
|
|
147
|
+
* @param newWindowLevel
|
|
148
|
+
* @param skinDoseMap
|
|
149
|
+
* @param skinDoseMapColourScale
|
|
150
|
+
* @param skinDoseMap3d
|
|
151
|
+
* @param show3dSkinDoseMap
|
|
152
|
+
*/
|
|
153
|
+
function updateWindowLevel(newWindowLevel, skinDoseMap, skinDoseMapColourScale, skinDoseMap3d, show3dSkinDoseMap) {
|
|
154
|
+
newWindowLevel = parseFloat(newWindowLevel);
|
|
155
|
+
if (newWindowLevel < 0) {newWindowLevel = 0;}
|
|
156
|
+
|
|
157
|
+
$("input[name=currentWindowLevel]").val(newWindowLevel.toFixed(skinDoseMapColourScale.decimalPlaces));
|
|
158
|
+
$("input[name=windowLevelSlider]").prop({"value": newWindowLevel});
|
|
159
|
+
|
|
160
|
+
skinDoseMap.updateWindowLevel(newWindowLevel);
|
|
161
|
+
skinDoseMap.draw();
|
|
162
|
+
if (skinDoseMap.showOverlay) {skinDoseMap.drawOverlay();}
|
|
163
|
+
skinDoseMap.writeInformation();
|
|
164
|
+
|
|
165
|
+
skinDoseMapColourScale.minDose = skinDoseMap.minDisplayedDose;
|
|
166
|
+
skinDoseMapColourScale.maxDose = skinDoseMap.maxDisplayedDose;
|
|
167
|
+
skinDoseMapColourScale.redrawValues();
|
|
168
|
+
|
|
169
|
+
if (show3dSkinDoseMap) {
|
|
170
|
+
skinDoseMap3d.windowWidth = skinDoseMap.windowWidth;
|
|
171
|
+
skinDoseMap3d.windowLevel = skinDoseMap.windowLevel;
|
|
172
|
+
skinDoseMap3d.draw();
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
$("input[name=minDoseSlider]").prop({"value": skinDoseMap.minDisplayedDose});
|
|
176
|
+
$("input[name=maxDoseSlider]").prop({"value": skinDoseMap.maxDisplayedDose});
|
|
177
|
+
|
|
178
|
+
$("input[name=currentMinDisplayedDose]").val(skinDoseMap.minDisplayedDose.toFixed(skinDoseMapColourScale.decimalPlaces));
|
|
179
|
+
$("input[name=currentMaxDisplayedDose]").val(skinDoseMap.maxDisplayedDose.toFixed(skinDoseMapColourScale.decimalPlaces));
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Function to update the skin dose map when the window width has been changed with a slider or the mouse
|
|
185
|
+
* @param newWindowWidth
|
|
186
|
+
* @param skinDoseMap
|
|
187
|
+
* @param skinDoseMapColourScale
|
|
188
|
+
* @param skinDoseMap3d
|
|
189
|
+
* @param show3dSkinDoseMap
|
|
190
|
+
*/
|
|
191
|
+
function updateWindowWidth(newWindowWidth, skinDoseMap, skinDoseMapColourScale, skinDoseMap3d, show3dSkinDoseMap) {
|
|
192
|
+
newWindowWidth = parseFloat(newWindowWidth);
|
|
193
|
+
$("input[name=currentWindowWidth]").val(newWindowWidth.toFixed(skinDoseMapColourScale.decimalPlaces));
|
|
194
|
+
$("input[name=windowWidthSlider]").prop({"value": newWindowWidth});
|
|
195
|
+
|
|
196
|
+
skinDoseMap.updateWindowWidth(newWindowWidth);
|
|
197
|
+
skinDoseMap.draw();
|
|
198
|
+
if (skinDoseMap.showOverlay) {skinDoseMap.drawOverlay();}
|
|
199
|
+
skinDoseMap.writeInformation();
|
|
200
|
+
|
|
201
|
+
skinDoseMapColourScale.minDose = skinDoseMap.minDisplayedDose;
|
|
202
|
+
skinDoseMapColourScale.maxDose = skinDoseMap.maxDisplayedDose;
|
|
203
|
+
skinDoseMapColourScale.redrawValues();
|
|
204
|
+
|
|
205
|
+
if (show3dSkinDoseMap) {
|
|
206
|
+
skinDoseMap3d.windowWidth = skinDoseMap.windowWidth;
|
|
207
|
+
skinDoseMap3d.windowLevel = skinDoseMap.windowLevel;
|
|
208
|
+
skinDoseMap3d.draw();
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
$("input[name=minDoseSlider]").prop({"value": skinDoseMap.minDisplayedDose});
|
|
212
|
+
$("input[name=maxDoseSlider]").prop({"value": skinDoseMap.maxDisplayedDose});
|
|
213
|
+
|
|
214
|
+
$("input[name=currentMinDisplayedDose]").val(skinDoseMap.minDisplayedDose.toFixed(skinDoseMapColourScale.decimalPlaces));
|
|
215
|
+
$("input[name=currentMaxDisplayedDose]").val(skinDoseMap.maxDisplayedDose.toFixed(skinDoseMapColourScale.decimalPlaces));
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Function to update the HTML sliders and their displayed values
|
|
221
|
+
* @param skinDoseMap
|
|
222
|
+
* @param skinDoseMapColourScale
|
|
223
|
+
*/
|
|
224
|
+
function updateSlidersAndValues(skinDoseMap, skinDoseMapColourScale) {
|
|
225
|
+
$("input[name=minDoseSlider]").prop({"value": skinDoseMap.minDisplayedDose});
|
|
226
|
+
$("input[name=maxDoseSlider]").prop({"value": skinDoseMap.maxDisplayedDose});
|
|
227
|
+
|
|
228
|
+
$("input[name=currentMinDisplayedDose]").val(skinDoseMap.minDisplayedDose.toFixed(skinDoseMapColourScale.decimalPlaces));
|
|
229
|
+
$("input[name=currentMaxDisplayedDose]").val(skinDoseMap.maxDisplayedDose.toFixed(skinDoseMapColourScale.decimalPlaces));
|
|
230
|
+
|
|
231
|
+
$("input[name=currentWindowLevel]").val(skinDoseMap.windowLevel.toFixed(skinDoseMapColourScale.decimalPlaces));
|
|
232
|
+
$("input[name=currentWindowWidth]").val(skinDoseMap.windowWidth.toFixed(skinDoseMapColourScale.decimalPlaces));
|
|
233
|
+
|
|
234
|
+
$("input[name=windowLevelSlider]").prop({"value": skinDoseMap.windowLevel});
|
|
235
|
+
$("input[name=windowWidthSlider]").prop({"value": skinDoseMap.windowWidth});
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Function to update the skin dose map when the minimum displayed dose has been changed using a slider or the mouse
|
|
241
|
+
* @param minDisplayedDose
|
|
242
|
+
* @param skinDoseMap
|
|
243
|
+
* @param skinDoseMapColourScale
|
|
244
|
+
* @param skinDoseMap3d
|
|
245
|
+
* @param show3dSkinDoseMap
|
|
246
|
+
*/
|
|
247
|
+
function updateMinDisplayedDose(minDisplayedDose, skinDoseMap, skinDoseMapColourScale, skinDoseMap3d, show3dSkinDoseMap) {
|
|
248
|
+
minDisplayedDose = parseFloat(minDisplayedDose);
|
|
249
|
+
|
|
250
|
+
skinDoseMap.updateMinDisplayedDose(minDisplayedDose);
|
|
251
|
+
skinDoseMap.draw();
|
|
252
|
+
if (skinDoseMap.showOverlay) {skinDoseMap.drawOverlay();}
|
|
253
|
+
skinDoseMap.writeInformation();
|
|
254
|
+
|
|
255
|
+
skinDoseMapColourScale.minDose = skinDoseMap.minDisplayedDose;
|
|
256
|
+
skinDoseMapColourScale.redrawValues();
|
|
257
|
+
|
|
258
|
+
if (show3dSkinDoseMap) {
|
|
259
|
+
skinDoseMap3d.windowWidth = skinDoseMap.windowWidth;
|
|
260
|
+
skinDoseMap3d.windowLevel = skinDoseMap.windowLevel;
|
|
261
|
+
skinDoseMap3d.draw();
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
updateSlidersAndValues(skinDoseMap, skinDoseMapColourScale);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* Function to update the skin dose map when the maximum displayed dose has been changed using a slider or the mouse
|
|
270
|
+
* @param maxDisplayedDose
|
|
271
|
+
* @param skinDoseMap
|
|
272
|
+
* @param skinDoseMapColourScale
|
|
273
|
+
* @param skinDoseMap3d
|
|
274
|
+
* @param show3dSkinDoseMap
|
|
275
|
+
*/
|
|
276
|
+
function updateMaxDisplayedDose(maxDisplayedDose, skinDoseMap, skinDoseMapColourScale, skinDoseMap3d, show3dSkinDoseMap) {
|
|
277
|
+
maxDisplayedDose = parseFloat(maxDisplayedDose);
|
|
278
|
+
|
|
279
|
+
skinDoseMap.updateMaxDisplayedDose(maxDisplayedDose);
|
|
280
|
+
skinDoseMap.draw();
|
|
281
|
+
if (skinDoseMap.showOverlay) {skinDoseMap.drawOverlay();}
|
|
282
|
+
skinDoseMap.writeInformation();
|
|
283
|
+
|
|
284
|
+
skinDoseMapColourScale.maxDose = skinDoseMap.maxDisplayedDose;
|
|
285
|
+
skinDoseMapColourScale.redrawValues();
|
|
286
|
+
|
|
287
|
+
if (show3dSkinDoseMap) {
|
|
288
|
+
skinDoseMap3d.windowWidth = skinDoseMap.windowWidth;
|
|
289
|
+
skinDoseMap3d.windowLevel = skinDoseMap.windowLevel;
|
|
290
|
+
skinDoseMap3d.draw();
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
updateSlidersAndValues(skinDoseMap, skinDoseMapColourScale);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* Function to change the skin dose map when the minimum displayed dose has been changed manually
|
|
299
|
+
* @param minDisplayedDose
|
|
300
|
+
* @param skinDoseMap
|
|
301
|
+
* @param skinDoseMapColourScale
|
|
302
|
+
* @param skinDoseMap3d
|
|
303
|
+
* @param show3dSkinDoseMap
|
|
304
|
+
*/
|
|
305
|
+
function updateMinDisplayedDoseManual(minDisplayedDose, skinDoseMap, skinDoseMapColourScale, skinDoseMap3d, show3dSkinDoseMap) {
|
|
306
|
+
minDisplayedDose = parseFloat(minDisplayedDose);
|
|
307
|
+
|
|
308
|
+
skinDoseMap.updateMinDisplayedDoseManual(minDisplayedDose);
|
|
309
|
+
skinDoseMap.draw();
|
|
310
|
+
if (skinDoseMap.showOverlay) {skinDoseMap.drawOverlay();}
|
|
311
|
+
skinDoseMap.writeInformation();
|
|
312
|
+
|
|
313
|
+
skinDoseMapColourScale.minDose = skinDoseMap.minDisplayedDose;
|
|
314
|
+
skinDoseMapColourScale.redrawValues();
|
|
315
|
+
|
|
316
|
+
if (show3dSkinDoseMap) {
|
|
317
|
+
skinDoseMap3d.windowWidth = skinDoseMap.windowWidth;
|
|
318
|
+
skinDoseMap3d.windowLevel = skinDoseMap.windowLevel;
|
|
319
|
+
skinDoseMap3d.draw();
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
updateSlidersAndValues(skinDoseMap, skinDoseMapColourScale);
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* Function to update the skin dose map when the maximum displayed dose has been changed
|
|
328
|
+
* @param maxDisplayedDose
|
|
329
|
+
* @param skinDoseMap
|
|
330
|
+
* @param skinDoseMapColourScale
|
|
331
|
+
* @param skinDoseMap3d
|
|
332
|
+
* @param show3dSkinDoseMap
|
|
333
|
+
*/
|
|
334
|
+
function updateMaxDisplayedDoseManual(maxDisplayedDose, skinDoseMap, skinDoseMapColourScale, skinDoseMap3d, show3dSkinDoseMap) {
|
|
335
|
+
maxDisplayedDose = parseFloat(maxDisplayedDose);
|
|
336
|
+
|
|
337
|
+
skinDoseMap.updateMaxDisplayedDoseManual(maxDisplayedDose);
|
|
338
|
+
skinDoseMap.draw();
|
|
339
|
+
if (skinDoseMap.showOverlay) {skinDoseMap.drawOverlay();}
|
|
340
|
+
skinDoseMap.writeInformation();
|
|
341
|
+
|
|
342
|
+
skinDoseMapColourScale.maxDose = skinDoseMap.maxDisplayedDose;
|
|
343
|
+
skinDoseMapColourScale.redrawValues();
|
|
344
|
+
|
|
345
|
+
if (show3dSkinDoseMap) {
|
|
346
|
+
skinDoseMap3d.windowWidth = skinDoseMap.windowWidth;
|
|
347
|
+
skinDoseMap3d.windowLevel = skinDoseMap.windowLevel;
|
|
348
|
+
skinDoseMap3d.draw();
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
updateSlidersAndValues(skinDoseMap, skinDoseMapColourScale);
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
|
|
355
|
+
var previousMousePosition = {
|
|
356
|
+
x: 0,
|
|
357
|
+
y: 0
|
|
358
|
+
};
|
|
359
|
+
|
|
360
|
+
var isDragging = false;
|
|
361
|
+
|
|
362
|
+
// jQuery mouse event handlers for the DIV that contains the 2D skin dose map
|
|
363
|
+
$("#skinDoseMap")
|
|
364
|
+
.on("mouseup", function () {
|
|
365
|
+
isDragging = false;
|
|
366
|
+
})
|
|
367
|
+
.on("mousedown", function () {
|
|
368
|
+
isDragging = true;
|
|
369
|
+
})
|
|
370
|
+
.on("mousemove", function (e) {
|
|
371
|
+
var pos = findPos(this);
|
|
372
|
+
var x = e.pageX - pos.x;
|
|
373
|
+
var y = e.pageY - pos.y;
|
|
374
|
+
//var p = skinDoseMapObj.skinDoseMapContext.getImageData(x, y, 1, 1).data;
|
|
375
|
+
var mag = skinDoseMapObj.mag;
|
|
376
|
+
if (x <= this.width-1 && y <= this.height-1) {
|
|
377
|
+
var currentDose = parseFloat(skinDoseMapObj.skinDoseMap[(Math.floor(y/mag)) * Math.floor(this.width/mag) + Math.floor(x/mag)]).toPrecision(2) + " Gy";
|
|
378
|
+
$("[data-tooltip='skin_dose_map']").qtip("option", "content.text", currentDose);
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
var deltaMove = {
|
|
382
|
+
x: e.offsetX - previousMousePosition.x,
|
|
383
|
+
y: e.offsetY - previousMousePosition.y
|
|
384
|
+
};
|
|
385
|
+
|
|
386
|
+
if (isDragging) {
|
|
387
|
+
var maxWL = parseFloat($("#windowLevelSlider")[0].max);
|
|
388
|
+
var newWL = skinDoseMapObj.windowLevel * (100-deltaMove.y)/100;
|
|
389
|
+
if (newWL === 0) {newWL += 0.01;}
|
|
390
|
+
if (newWL < 0) {newWL = 0;}
|
|
391
|
+
if (newWL > maxWL) {newWL = maxWL;}
|
|
392
|
+
skinDoseMapObj.updateWindowLevel(newWL);
|
|
393
|
+
|
|
394
|
+
var maxWW = parseFloat($("#windowWidthSlider")[0].max);
|
|
395
|
+
var newWW = skinDoseMapObj.windowWidth + skinDoseMapObj.windowWidth * deltaMove.x/100;
|
|
396
|
+
if (newWW === 0) {newWW += 0.01;}
|
|
397
|
+
if (newWW < 0) {newWW = 0;}
|
|
398
|
+
if (newWW > maxWW) {newWW = maxWW;}
|
|
399
|
+
skinDoseMapObj.updateWindowWidth(newWW);
|
|
400
|
+
|
|
401
|
+
skinDoseMapObj.draw();
|
|
402
|
+
if (skinDoseMapObj.showOverlay) {skinDoseMapObj.drawOverlay();}
|
|
403
|
+
skinDoseMapObj.writeInformation();
|
|
404
|
+
|
|
405
|
+
skinDoseMapColourScaleObj.minDose = skinDoseMapObj.minDisplayedDose;
|
|
406
|
+
skinDoseMapColourScaleObj.maxDose = skinDoseMapObj.maxDisplayedDose;
|
|
407
|
+
skinDoseMapColourScaleObj.redrawValues();
|
|
408
|
+
|
|
409
|
+
if (show3dSkinDoseMap) {
|
|
410
|
+
skinDoseMap3dObj.windowLevel = newWL;
|
|
411
|
+
skinDoseMap3dObj.windowWidth = newWW;
|
|
412
|
+
skinDoseMap3dObj.draw();
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
updateSlidersAndValues(skinDoseMapObj, skinDoseMapColourScaleObj);
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
previousMousePosition = {
|
|
419
|
+
x: e.offsetX,
|
|
420
|
+
y: e.offsetY
|
|
421
|
+
};
|
|
422
|
+
});
|
|
423
|
+
|
|
424
|
+
colourScaleSelection();
|
|
425
|
+
|
|
426
|
+
$("[data-tooltip='skin_dose_map']").qtip({
|
|
427
|
+
content: {
|
|
428
|
+
text: ""
|
|
429
|
+
},
|
|
430
|
+
position: {
|
|
431
|
+
target: "mouse",
|
|
432
|
+
adjust: {
|
|
433
|
+
mouse: true,
|
|
434
|
+
x: 15,
|
|
435
|
+
y: 15
|
|
436
|
+
}
|
|
437
|
+
},
|
|
438
|
+
style: { classes: "qtip-bootstrap" }
|
|
439
|
+
});
|
|
440
|
+
|
|
441
|
+
|
|
442
|
+
/**
|
|
443
|
+
* Function to enable the user to save the contents of the HTML canvas as a png file
|
|
444
|
+
* @param link
|
|
445
|
+
* @param canvasId
|
|
446
|
+
* @param filename
|
|
447
|
+
*/
|
|
448
|
+
function downloadCanvas(link, canvasId, filename) {
|
|
449
|
+
var canvas = $("#"+canvasId)[0];
|
|
450
|
+
|
|
451
|
+
if (canvas.msToBlob) { //for IE
|
|
452
|
+
var blob = canvas.msToBlob();
|
|
453
|
+
window.navigator.msSaveBlob(blob, filename);
|
|
454
|
+
} else { //other browsers
|
|
455
|
+
link.href = canvas.toDataURL();
|
|
456
|
+
link.download = filename;
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
|
|
461
|
+
/**
|
|
462
|
+
* Function to enable the user to save the contents of the three.js display as a png file
|
|
463
|
+
* @param link
|
|
464
|
+
* @param filename
|
|
465
|
+
*/
|
|
466
|
+
function download3dCanvas(link, filename) {
|
|
467
|
+
if (renderer.domElement.msToBlob) { //for IE
|
|
468
|
+
var blob = renderer.domElement.msToBlob();
|
|
469
|
+
window.navigator.msSaveBlob(blob, filename);
|
|
470
|
+
} else { //other browsers
|
|
471
|
+
link.href = renderer.domElement.toDataURL("image/png");
|
|
472
|
+
link.download = filename;
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
$("#save2dSkinMap").click(function() {
|
|
477
|
+
downloadCanvas(this, "skinDoseMap", "2dSkinMap.png");
|
|
478
|
+
});
|
|
479
|
+
|
|
480
|
+
$("#save3dSkinMap").click(function() {
|
|
481
|
+
download3dCanvas(this, "3dSkinMap.png");
|
|
482
|
+
});
|
|
483
|
+
|
|
484
|
+
$("#skinDoseMapOverlayShow").click(function() {
|
|
485
|
+
$("#skinDoseMapOverlayHide").toggle();
|
|
486
|
+
$("#skinDoseMapOverlayShow").toggle();
|
|
487
|
+
skinDoseMapObj.toggleOverlay();
|
|
488
|
+
});
|
|
489
|
+
|
|
490
|
+
$("#skinDoseMapOverlayHide").click(function() {
|
|
491
|
+
$("#skinDoseMapOverlayHide").toggle();
|
|
492
|
+
$("#skinDoseMapOverlayShow").toggle();
|
|
493
|
+
skinDoseMapObj.toggleOverlay();
|
|
494
|
+
});
|
|
495
|
+
|
|
496
|
+
|
|
497
|
+
var skinMapFullScreen = false;
|
|
498
|
+
var skinDoseMapGroupOrigWidth, skinDoseMapGroupOrigHeight;
|
|
499
|
+
$("#skinDoseMapFullscreenBtn").click(function() {
|
|
500
|
+
skinMapFullScreen = !skinMapFullScreen;
|
|
501
|
+
|
|
502
|
+
var skinDoseMapContainer = $("#skinDoseMapContainer");
|
|
503
|
+
|
|
504
|
+
var otherHeight = skinDoseMapContainer.height() - $("#skinDoseMap").height();
|
|
505
|
+
|
|
506
|
+
skinDoseMapContainer.toggleClass("fullscreen");
|
|
507
|
+
|
|
508
|
+
var skinDoseMapGroup = $("#skinDoseMapGroup");
|
|
509
|
+
|
|
510
|
+
if (skinMapFullScreen) {
|
|
511
|
+
var skinDoseMapGroupWidth = $(window).width();
|
|
512
|
+
var skinDoseMapGroupHeight = $(window).height() - otherHeight;
|
|
513
|
+
|
|
514
|
+
var maxMagWidth = Math.floor((skinDoseMapGroupWidth-80) / skinDoseMapObj.skinDoseMapWidth);
|
|
515
|
+
var maxMagHeight = Math.floor(skinDoseMapGroupHeight / skinDoseMapObj.skinDoseMapHeight);
|
|
516
|
+
|
|
517
|
+
skinDoseMapObj.mag = (maxMagHeight <= maxMagWidth) ? maxMagHeight : maxMagWidth;
|
|
518
|
+
skinDoseMapObj.resizeSkinDoseMap();
|
|
519
|
+
skinDoseMapGroup.width(skinDoseMapObj.skinDoseMapCanvas.width + 80 + "px").height(skinDoseMapObj.skinDoseMapCanvas.height + "px");
|
|
520
|
+
skinDoseMapObj.draw();
|
|
521
|
+
skinDoseMapObj.updateBoundaries();
|
|
522
|
+
if (skinDoseMapObj.showOverlay) {skinDoseMapObj.drawOverlay();}
|
|
523
|
+
skinDoseMapObj.writeInformation();
|
|
524
|
+
|
|
525
|
+
skinDoseMapColourScaleObj.resizeColourScale(70, skinDoseMapObj.skinDoseMapCanvas.height);
|
|
526
|
+
skinDoseMapColourScaleObj.draw();
|
|
527
|
+
|
|
528
|
+
if (show3dSkinDoseMap) {
|
|
529
|
+
skinDoseMap3dObj.canvas.width = skinDoseMapObj.skinDoseMapCanvas.width;
|
|
530
|
+
skinDoseMap3dObj.canvas.height = skinDoseMapObj.skinDoseMapCanvas.height;
|
|
531
|
+
skinDoseMap3dObj.draw();
|
|
532
|
+
skinDoseMap3dHUDObj.width = skinDoseMapObj.skinDoseMapCanvas.width;
|
|
533
|
+
skinDoseMap3dHUDObj.height = skinDoseMapObj.skinDoseMapCanvas.height;
|
|
534
|
+
skinDoseMap3dHUDObj.redraw();
|
|
535
|
+
}
|
|
536
|
+
} else {
|
|
537
|
+
skinDoseMapGroup.width(skinDoseMapGroupOrigWidth).height(skinDoseMapGroupOrigHeight);
|
|
538
|
+
skinDoseMapObj.mag = 6;
|
|
539
|
+
skinDoseMapObj.resizeSkinDoseMap();
|
|
540
|
+
skinDoseMapObj.draw();
|
|
541
|
+
skinDoseMapObj.updateBoundaries();
|
|
542
|
+
if (skinDoseMapObj.showOverlay) {skinDoseMapObj.drawOverlay();}
|
|
543
|
+
skinDoseMapObj.writeInformation();
|
|
544
|
+
|
|
545
|
+
skinDoseMapColourScaleObj.resizeColourScale(70, skinDoseMapObj.skinDoseMapCanvas.height);
|
|
546
|
+
skinDoseMapColourScaleObj.draw();
|
|
547
|
+
|
|
548
|
+
if (show3dSkinDoseMap) {
|
|
549
|
+
skinDoseMap3dObj.canvas.width = skinDoseMapObj.skinDoseMapCanvas.width;
|
|
550
|
+
skinDoseMap3dObj.canvas.height = skinDoseMapObj.skinDoseMapCanvas.height;
|
|
551
|
+
skinDoseMap3dObj.draw();
|
|
552
|
+
skinDoseMap3dHUDObj.width = skinDoseMapObj.skinDoseMapCanvas.width;
|
|
553
|
+
skinDoseMap3dHUDObj.height = skinDoseMapObj.skinDoseMapCanvas.height;
|
|
554
|
+
skinDoseMap3dHUDObj.redraw();
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
});
|
|
558
|
+
|
|
559
|
+
|
|
560
|
+
/**
|
|
561
|
+
* Function to check that the HTML5 canvas is supported by the user's browser
|
|
562
|
+
* @returns {boolean}
|
|
563
|
+
*/
|
|
564
|
+
function isCanvasSupported(){
|
|
565
|
+
var elem = document.createElement("canvas");
|
|
566
|
+
return !!(elem.getContext && elem.getContext("2d"));
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
|
|
570
|
+
/**
|
|
571
|
+
* Function to toggle between 2D and 3D skin dose map display
|
|
572
|
+
*/
|
|
573
|
+
function switch2d3dSkinDoseMap() {
|
|
574
|
+
$("#save2dSkinMap").toggle();
|
|
575
|
+
$("#save3dSkinMap").toggle();
|
|
576
|
+
$("#skinDoseMap3d").toggle();
|
|
577
|
+
$("#skinDoseMap").toggle();
|
|
578
|
+
|
|
579
|
+
$("#maxDose").toggleClass("whiteText");
|
|
580
|
+
$("#phantomDimensions").toggleClass("whiteText");
|
|
581
|
+
$("#patientHeight").toggleClass("whiteText");
|
|
582
|
+
$("#patientMass").toggleClass("whiteText");
|
|
583
|
+
$("#patientOrientation").toggleClass("whiteText");
|
|
584
|
+
}
|