335 lines
11 KiB
JavaScript
335 lines
11 KiB
JavaScript
var isLevelLine = false;
|
|
var locator = null;
|
|
var slope = null;
|
|
|
|
function Localizer() {
|
|
}
|
|
|
|
//Static method
|
|
Localizer.drawScout = function() {
|
|
var frames = jQuery(window.parent.document).find('iframe');
|
|
|
|
if (frames.length <= 1) {
|
|
return;
|
|
}
|
|
|
|
for ( var i = 0; i < frames.length; i++) {
|
|
var contents = jQuery(frames[i]).contents();
|
|
|
|
if (contents.find('body').css('border') !== '1px solid rgb(255, 138, 0)') {
|
|
|
|
var modality = contents.find('#modalityDiv').text().indexOf('CT') >= 0 ? 'CT' : 'MR';
|
|
|
|
if (modality === 'CT') {
|
|
if (jQuery('#imgType').text() === 'AXIAL' && jQuery(frames[i]).contents().find('#imgType').text() === 'LOCALIZER') {
|
|
var sopUid = contents.find('#frameSrc').html();
|
|
sopUid = sopUid.substring(sopUid.indexOf('objectUID=') + 10);
|
|
|
|
var refArr = jQuery('#refSOPInsUID').html().split(',');
|
|
|
|
if ((jQuery('#forUIDPanel').text() === contents.find('#forUIDPanel').text()) || jQuery.inArray(sopUid, refArr) >= 0) {
|
|
project(contents, modality);
|
|
}
|
|
|
|
} else if (jQuery(frames[i]).contents().find('#imgType').text() === 'AXIAL' && jQuery('#imgType').text() === "LOCALIZER") {
|
|
project(contents, modality);
|
|
} else {
|
|
var tmpCanvas = contents.find('#canvasLayer1').get(0);
|
|
clearCanvas(tmpCanvas.getContext('2d'), tmpCanvas.width,tmpCanvas.height);
|
|
tmpCanvas = contents.find('#canvasLayer2').get(0);
|
|
clearCanvas(tmpCanvas.getContext('2d'), tmpCanvas.width,tmpCanvas.height);
|
|
}
|
|
} else { //MR
|
|
var sopUid = contents.find('#frameSrc').text();
|
|
sopUid = sopUid.substring(sopUid.indexOf('objectUID=') + 10);
|
|
var refArr = jQuery('#refSOPInsUID').html().split(',');
|
|
|
|
if ((jQuery('#forUIDPanel').text() === contents.find('#forUIDPanel').text()) || jQuery.inArray(sopUid, refArr) >= 0) {
|
|
project(contents, modality)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
isLevelLine = true;
|
|
}
|
|
|
|
function project(contents, modality) {
|
|
//Current slice
|
|
locator = new SliceLocator();
|
|
var imgPlane = contents.find('#imgPlane').text();
|
|
|
|
var scoutPos = contents.find('#imgPosition').html();
|
|
var scoutOrientation = contents.find('#imgOrientation').html();
|
|
var scoutPixelSpacing = contents.find('#pixelSpacing').html();
|
|
var scoutImgSize = contents.find('#imageSize').html();
|
|
|
|
if (scoutImgSize) {
|
|
scoutImgSize = scoutImgSize.substring(11).split("x");
|
|
} else {
|
|
return;
|
|
}
|
|
|
|
var scoutRow = scoutImgSize[1];
|
|
var scoutColumn = scoutImgSize[0];
|
|
|
|
var zoomPer = contents.find('#zoomPercent').html();
|
|
zoomPer = zoomPer.substring(zoomPer.indexOf(':') + 1,zoomPer.indexOf('%'))/100;
|
|
|
|
var canvas = contents.find('#canvasLayer2').get(0);
|
|
var context = canvas.getContext('2d');
|
|
|
|
context.clearRect(0, 0, canvas.width, canvas.height);
|
|
|
|
context.save();
|
|
// reset the transformation matrix
|
|
context.setTransform(1, 0, 0, 1, 0, 0);
|
|
// move origin to center of canvas
|
|
context.translate((canvas.width - zoomPer * scoutColumn) / 2,(canvas.height - zoomPer * scoutRow) / 2);
|
|
context.scale(zoomPer, zoomPer);
|
|
|
|
if (imgPlane === '') {
|
|
var oImgOrient = new ImageOrientation();
|
|
var imgOri = contents.find('#imgOrientation').html();
|
|
imgPlane = oImgOrient.getImagePlane(imgOri);
|
|
contents.find('#imgPlane').html(imgPlane);
|
|
}
|
|
|
|
if (!isLevelLine) {
|
|
//First and last slice
|
|
drawBorder(contents, zoomPer, imgPlane, modality);
|
|
}
|
|
|
|
// Current Slice
|
|
var imgPos = jQuery('#imgPosition').html();
|
|
var imgOrientation = jQuery('#imgOrientation').html();
|
|
var imgPixelSpacing = jQuery('#pixelSpacing').html();
|
|
var imgSize = jQuery('#imageSize').html();
|
|
if (imgSize) {
|
|
imgSize = imgSize.substring(11).split("x");
|
|
} else {
|
|
return;
|
|
}
|
|
|
|
var imgRow = imgSize[1];
|
|
var imgColumn = imgSize[0];
|
|
|
|
var ps = jQuery('#pixelSpacing').text();
|
|
var cThickLoc = null;
|
|
var cThick = null;
|
|
|
|
var psArr = ps.split("\\");
|
|
ps = parseFloat(psArr[0]) / parseFloat(psArr[1]);
|
|
|
|
if (jQuery('#imgType').text() !== 'LOCALIZER') {
|
|
cThickLoc = jQuery('#thickLocationPanel').html();
|
|
cThick = parseFloat(cThickLoc.match("Thick:(.*)mm Loc")[1]);
|
|
} else {
|
|
cThickLoc = contents.find('#thickLocationPanel').html();
|
|
cThick = parseFloat(cThickLoc.match("Thick:(.*)mm Loc")[1]);
|
|
}
|
|
|
|
var thick = cThick * ps * zoomPer;
|
|
thick /= 2;
|
|
|
|
if (imgPlane === "SAGITTAL") {
|
|
locator.projectSlice(scoutPos, scoutOrientation, scoutPixelSpacing,
|
|
scoutRow, scoutColumn, imgPos, imgOrientation, imgPixelSpacing,
|
|
imgRow, imgColumn);
|
|
drawLine(parseInt(locator.getBoxUlx()), parseInt(locator.getBoxUly()),
|
|
parseInt(locator.getBoxLlx()), parseInt(locator.getBoxLly()),
|
|
context, "GREEN", null);
|
|
|
|
drawLine(parseInt(locator.getBoxUlx()), parseInt(locator.getBoxUly())
|
|
+ thick, parseInt(locator.getBoxLlx()), parseInt(locator
|
|
.getBoxLly())
|
|
+ thick, context, "GREEN", null);
|
|
drawLine(parseInt(locator.getBoxUlx()), parseInt(locator.getBoxUly())
|
|
- thick, parseInt(locator.getBoxLlx()), parseInt(locator
|
|
.getBoxLly())
|
|
- thick, context, "GREEN", null);
|
|
} else if (imgPlane === "CORONAL" && modality === 'CT' || modality === 'MR') {
|
|
locator.projectSlice(scoutPos, scoutOrientation, scoutPixelSpacing,
|
|
scoutRow, scoutColumn, imgPos, imgOrientation, imgPixelSpacing,
|
|
imgRow, imgColumn);
|
|
drawLine(parseInt(locator.getmAxisLeftx()), parseInt(locator
|
|
.getmAxisLefty()), parseInt(locator.getmAxisRightx()),
|
|
parseInt(locator.getmAxisRighty()), context, "GREEN", null);
|
|
|
|
drawLine(parseInt(locator.getmAxisLeftx()), parseInt(locator
|
|
.getmAxisLefty())
|
|
+ thick, parseInt(locator.getmAxisRightx()), parseInt(locator
|
|
.getmAxisRighty())
|
|
+ thick, context, "GREEN", null);
|
|
drawLine(parseInt(locator.getmAxisLeftx()), parseInt(locator
|
|
.getmAxisLefty())
|
|
- thick, parseInt(locator.getmAxisRightx()), parseInt(locator
|
|
.getmAxisRighty())
|
|
- thick, context, "GREEN", null);
|
|
} else {
|
|
locator.projectSlice(scoutPos, scoutOrientation, scoutPixelSpacing,
|
|
scoutRow, scoutColumn, imgPos, imgOrientation, imgPixelSpacing,
|
|
imgRow, imgColumn);
|
|
drawLine(parseInt(locator.getmAxisLeftx()), parseInt(locator
|
|
.getmAxisLefty()), parseInt(locator.getmAxisRightx()),
|
|
parseInt(locator.getmAxisRighty()), context, "GREEN",
|
|
parseFloat(cThick * ps * zoomPer));
|
|
}
|
|
|
|
// translate the origin back to the corner of the image so the event handlers can draw in image coordinate system
|
|
context.translate(-scoutColumn / 2 / zoomPer, -scoutRow / 2 / zoomPer);
|
|
context.restore();
|
|
}
|
|
|
|
Localizer.hideScoutLine = function() {
|
|
var frames = jQuery(window.parent.document).find('iframe');
|
|
for ( var i = 0; i < frames.length; i++) {
|
|
var localCanvas = jQuery(frames[i]).contents().find('#canvasLayer1').get(0);
|
|
if (localCanvas != null && localCanvas !== undefined) {
|
|
clearCanvas(localCanvas.getContext('2d'), localCanvas.width,localCanvas.height);
|
|
}
|
|
localCanvas = jQuery(frames[i]).contents().find('#canvasLayer2').get(0);
|
|
if (localCanvas != null && localCanvas !== undefined) {
|
|
clearCanvas(localCanvas.getContext('2d'), localCanvas.width,localCanvas.height);
|
|
}
|
|
}
|
|
isLevelLine = false;
|
|
}
|
|
|
|
Localizer.toggleLevelLine = function(levelLine) {
|
|
isLevelLine = levelLine;
|
|
}
|
|
|
|
|
|
/*Localizer.clearCanvasContent = function() {
|
|
var localCanvas = jQuery(parent.jcanvas).siblings().get(0);
|
|
clearCanvas(localCanvas);
|
|
localCanvas = jQuery(parent.jcanvas).siblings().get(1);
|
|
clearCanvas(localCanvas);
|
|
isLevelLine = false;
|
|
}*/
|
|
|
|
function drawLine(x1, y1, x2, y2, oCtx, color, lineWidth) {
|
|
if (lineWidth != null) {
|
|
oCtx.lineWidth = lineWidth;
|
|
}
|
|
|
|
oCtx.beginPath();
|
|
oCtx.moveTo(x1, y1);
|
|
oCtx.lineTo(x2, y2);
|
|
oCtx.closePath();
|
|
oCtx.strokeStyle = color;
|
|
oCtx.stroke();
|
|
}
|
|
|
|
function clearCanvas(oCtx, width, height) {
|
|
// Store the current transformation matrix
|
|
oCtx.save();
|
|
|
|
// Use the identity matrix while clearing the canvas
|
|
oCtx.setTransform(1, 0, 0, 1, 0, 0);
|
|
oCtx.clearRect(0, 0, width, height);
|
|
|
|
// Restore the transform
|
|
oCtx.restore();
|
|
}
|
|
|
|
function drawBorder(contents, zoomPer, imgPlane, modality) {
|
|
var imageType = jQuery('#imgType').html();
|
|
var firstImage = null, lastImage = null;
|
|
|
|
var instanceData = JSON.parse(sessionStorage[seriesUid]);
|
|
|
|
|
|
for ( var i = 0; i < instanceData.length; i++) {
|
|
if((instanceData[i])['imageType']==imageType) {
|
|
firstImage = instanceData[i];
|
|
break;
|
|
}
|
|
}
|
|
|
|
for ( var i = instanceData.length - 1; i > 0; i--) {
|
|
if((instanceData[i])['imageType']==imageType) {
|
|
lastImage = instanceData[i];
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (firstImage != null && lastImage != null) {
|
|
var imgSize = contents.find('#imageSize').html().substring(11).split("x");
|
|
var scoutRow = imgSize[1];
|
|
var scoutColumn = imgSize[0];
|
|
|
|
var canvas = contents.find('#canvasLayer1').get(0);
|
|
var context = canvas.getContext('2d');
|
|
|
|
context.clearRect(0, 0, canvas.width, canvas.height);
|
|
|
|
context.save();
|
|
// reset the transformation matrix
|
|
context.setTransform(1, 0, 0, 1, 0, 0);
|
|
// move origin to center of canvas
|
|
context.translate((canvas.width - zoomPer * scoutColumn) / 2,
|
|
(canvas.height - zoomPer * scoutRow) / 2);
|
|
context.scale(zoomPer, zoomPer);
|
|
|
|
slope = null;
|
|
projectBorder(contents, firstImage, context, imgPlane, modality,
|
|
zoomPer);
|
|
projectBorder(contents, lastImage, context, imgPlane, modality, zoomPer);
|
|
|
|
// translate the origin back to the corner of the image so the event handlers can draw in image coordinate system
|
|
context.translate(-scoutColumn / 2 / zoomPer, -scoutRow / 2 / zoomPer);
|
|
context.restore();
|
|
}
|
|
}
|
|
|
|
function projectBorder(contents, dataset, context, imgPlane, modality, zoomPer) {
|
|
var scoutPos = contents.find('#imgPosition').html();
|
|
var scoutOrientation = contents.find('#imgOrientation').html();
|
|
var scoutPixelSpacing = contents.find('#pixelSpacing').html();
|
|
var imgSize = contents.find('#imageSize').html().substring(11).split("x");
|
|
var scoutRow = imgSize[1];
|
|
var scoutColumn = imgSize[0];
|
|
|
|
var imgPos = dataset['imagePositionPatient'];
|
|
var imgOrientation = dataset['imageOrientPatient'];
|
|
var imgPixelSpacing = dataset['pixelSpacing'];
|
|
var imgRow = dataset['nativeRows'];
|
|
var imgColumn = dataset['nativeColumns'];
|
|
|
|
locator.projectSlice(scoutPos, scoutOrientation, scoutPixelSpacing,
|
|
scoutRow, scoutColumn, imgPos, imgOrientation, imgPixelSpacing,
|
|
imgRow, imgColumn);
|
|
|
|
if (modality === "MR") {
|
|
var slp = findSlope(parseInt(locator.getBoxUlx() * zoomPer),
|
|
parseInt(locator.getBoxUly() * zoomPer), parseInt(locator
|
|
.getBoxLlx()
|
|
* zoomPer), parseInt(locator.getBoxLly() * zoomPer));
|
|
if (slope == null) {
|
|
slope = slp;
|
|
} else {
|
|
if (slp != slope) {
|
|
canvas = contents.find('#canvasLayer1').get(0);
|
|
clearCanvas(canvas.getContext('2d'), canvas.width,canvas.height);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (imgPlane == "SAGITTAL") {
|
|
drawLine(parseInt(locator.getBoxUlx()), parseInt(locator.getBoxUly()),
|
|
parseInt(locator.getBoxLlx()), parseInt(locator.getBoxLly()),
|
|
context, "YELLOW", null);
|
|
|
|
} else {
|
|
drawLine(parseInt(locator.getmAxisLeftx()), parseInt(locator
|
|
.getmAxisLefty()), parseInt(locator.getmAxisRightx()),
|
|
parseInt(locator.getmAxisRighty()), context, "YELLOW", null);
|
|
}
|
|
}
|
|
|
|
function findSlope(x1, y1, x2, y2) {
|
|
var sl = (y2-y1)!=0 ? (y2 - y1) / (x2 - x1) : 0;
|
|
return sl;
|
|
} |