2024-08-29 16:23:28 +08:00
|
|
|
|
const scheme = 'wadouri'
|
|
|
|
|
const baseUrl = ''
|
2024-08-04 18:23:33 +08:00
|
|
|
|
//功能名称
|
|
|
|
|
const functionNames = [
|
|
|
|
|
"Magnify", "Pan", "Zoom", "ZoomMouseWheel", "Wwwc",
|
|
|
|
|
"ScaleOverlay", "OrientationMarkers", "WwwcRegion", "Rotate", "Angle", "ArrowAnnotate", "Bidirectional", "CobbAngle", "EllipticalRoi", "FreehandRoi", "Length", "Probe", "RectangleRoi", "TextMarker",
|
|
|
|
|
"StackScroll", "StackScrollMouseWheel"
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
//标尺和方向显示可与其他状态同时启用
|
|
|
|
|
const displayFunctions = ["ScaleOverlay", "OrientationMarkers"]
|
|
|
|
|
|
|
|
|
|
//不能同时启用的功能
|
|
|
|
|
const notNeedDisableFunctions = ["WwwcRegion", "Rotate", "Angle", "ArrowAnnotate", "Bidirectional", "CobbAngle", "EllipticalRoi", "FreehandRoi", "Length", "Probe", "RectangleRoi", "TextMarker"]
|
|
|
|
|
|
|
|
|
|
//状态数据
|
|
|
|
|
var stateData = {
|
|
|
|
|
rowCount: 1,
|
|
|
|
|
columnCount: 1,
|
|
|
|
|
imgIndex: 0,
|
|
|
|
|
element: {},
|
|
|
|
|
dicomInfo: {},
|
2024-08-16 23:27:45 +08:00
|
|
|
|
showMapping: new Map(),
|
|
|
|
|
processMapping: new Map() //进度条映射 key为序列索引,value为加载完成数量
|
2024-08-04 18:23:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*切换工具*/
|
|
|
|
|
function switchAction(tagName, flag, btn) {
|
|
|
|
|
//btn btn-primary
|
|
|
|
|
var isSelected = $(btn).hasClass('selected');
|
|
|
|
|
if (isSelected) {
|
|
|
|
|
$(btn).removeClass("btn-primary")
|
|
|
|
|
$(btn).removeClass("selected")
|
|
|
|
|
$(btn).addClass("btn-default")
|
|
|
|
|
disableFunctions(tagName);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
disableFunctions(tagName);
|
|
|
|
|
$(btn).removeClass("btn-default")
|
|
|
|
|
$(btn).addClass("btn-primary")
|
|
|
|
|
$(btn).addClass("selected")
|
|
|
|
|
}
|
|
|
|
|
if (!isSelected) {
|
|
|
|
|
cornerstoneTools.setToolActive(tagName, { mouseButtonMask: 1 })
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function reload() {
|
|
|
|
|
var data = cornerstoneTools.getToolState(stateData.element, "stack").data[0];
|
|
|
|
|
var index = data.currentImageIdIndex;
|
|
|
|
|
var imgId = data.imageIds[index];
|
|
|
|
|
data.currentImageIdIndex = index;
|
|
|
|
|
cornerstone.loadAndCacheImage(imgId).then(function (image) {
|
|
|
|
|
cornerstone.enable(stateData.element);
|
|
|
|
|
cornerstone.displayImage(stateData.element, image);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//下一张
|
|
|
|
|
function next(imgId) {
|
|
|
|
|
if (imgId && stateData.element != imgId) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
var data = cornerstoneTools.getToolState(stateData.element, "stack").data[0];
|
|
|
|
|
var index = data.currentImageIdIndex;
|
|
|
|
|
if (index == data.imageIds.length - 1) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
index += 1;
|
|
|
|
|
}
|
|
|
|
|
var imgId = data.imageIds[index];
|
|
|
|
|
data.currentImageIdIndex = index;
|
2024-08-19 17:44:16 +08:00
|
|
|
|
cornerstone.loadImage(imgId).then(function (image) {
|
2024-08-04 18:23:33 +08:00
|
|
|
|
cornerstone.enable(stateData.element);
|
|
|
|
|
cornerstone.displayImage(stateData.element, image);
|
2024-08-16 23:27:45 +08:00
|
|
|
|
renderTagText(stateData.element, image)
|
2024-08-04 18:23:33 +08:00
|
|
|
|
});
|
2024-08-19 17:44:16 +08:00
|
|
|
|
//for (var i = 0; i < 10; i++) {
|
|
|
|
|
// if (index + i == data.imageIds.length - 1) {
|
|
|
|
|
// break;
|
|
|
|
|
// }
|
|
|
|
|
// cornerstone.loadImage(data.imageIds[index + i]).then((image) => {
|
|
|
|
|
// console.log("loaded ok " + data.imageIds[index + i]);
|
|
|
|
|
// })
|
|
|
|
|
//}
|
2024-08-04 18:23:33 +08:00
|
|
|
|
setSliderValue(stateData.element.id)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//读取文件中的标签信息
|
|
|
|
|
function getDicomInfo(image) {
|
|
|
|
|
var imageInfo = {};
|
|
|
|
|
imageInfo.seriesNumber = image.data.string('x00200011');//图像序列号
|
|
|
|
|
imageInfo.imageNum = image.data.string('x00200013');//图像位置
|
|
|
|
|
imageInfo.imageDate = image.data.string("x00080021");//拍摄日期
|
|
|
|
|
imageInfo.sliceThickness = image.data.string('x00180050');//层厚
|
|
|
|
|
imageInfo.patientId = image.data.string('x00100020');//病理号
|
|
|
|
|
// 判断窗宽窗位是否合法
|
|
|
|
|
imageInfo.pixelR = image.data.uint16('x00280103');
|
|
|
|
|
imageInfo.heightBit = image.data.uint16('x00280102') || '';
|
|
|
|
|
// 病人基本信息
|
|
|
|
|
imageInfo.patientName = image.data.string('x00100010');
|
|
|
|
|
imageInfo.patientBirthDate = image.data.string('x00100030');
|
|
|
|
|
imageInfo.patientGender = image.data.string('x00100040');
|
|
|
|
|
imageInfo.sID = image.data.string('x00200011');
|
|
|
|
|
// 像素间距
|
|
|
|
|
imageInfo.pixelSpacing = image.data.string('x00280030');
|
|
|
|
|
imageInfo.height = image.data.uint16('x00280010');
|
|
|
|
|
imageInfo.width = image.data.uint16('x00280011');
|
|
|
|
|
imageInfo.height = image.data.uint16('x00280010');
|
|
|
|
|
imageInfo.windowCenter = image.data.string('x00281050');
|
|
|
|
|
imageInfo.windowWidth = image.data.string('x00281051');
|
|
|
|
|
imageInfo.imagePixelSpacing = image.data.string('x00181164') || '';
|
|
|
|
|
imageInfo.rowPixelSpacing = image.rowPixelSpacing;
|
|
|
|
|
// 放射放大系数
|
|
|
|
|
imageInfo.magnification = Number(image.data.string('x00181114'));
|
|
|
|
|
// 放射源到面板的距离
|
|
|
|
|
imageInfo.sourceTOdetector = image.data.string('x00181110');
|
|
|
|
|
// 放射源到病人的距离
|
|
|
|
|
imageInfo.sourceTOpatient = image.data.string('x00181111');
|
|
|
|
|
//this.modalityLUT = cornerstone.metaData.get('modalityLutModule', image.imageId).modalityLUTSequence;
|
|
|
|
|
imageInfo.voiContent = cornerstone.metaData.get('voiLutModule', image.imageId);
|
|
|
|
|
// 斜率截距
|
|
|
|
|
imageInfo.rescaleIntercept = Number(image.data.string('x00281052'));
|
|
|
|
|
imageInfo.rescaleSlope = Number(image.data.string('x00281053'));
|
|
|
|
|
return imageInfo;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//上一张
|
|
|
|
|
function last(imgId) {
|
|
|
|
|
if (imgId && stateData.element != imgId) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
var data = cornerstoneTools.getToolState(stateData.element, "stack").data[0];
|
|
|
|
|
var index = data.currentImageIdIndex;
|
|
|
|
|
if (index == 0) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
index -= 1;
|
|
|
|
|
}
|
|
|
|
|
var imgId = data.imageIds[index];
|
|
|
|
|
data.currentImageIdIndex = index;
|
|
|
|
|
cornerstone.loadAndCacheImage(imgId).then(function (image) {
|
|
|
|
|
cornerstone.enable(stateData.element);
|
|
|
|
|
cornerstone.displayImage(stateData.element, image);
|
|
|
|
|
renderTagText(stateData.element, image)
|
|
|
|
|
});
|
|
|
|
|
setSliderValue(stateData.element.id)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//进度条更新
|
|
|
|
|
function setAllSliderValue() {
|
|
|
|
|
//获取所有已经加载的图片区映射关系
|
|
|
|
|
if (stateData.showMapping) {
|
|
|
|
|
stateData.showMapping.forEach((value, key) => {
|
|
|
|
|
setSliderValue(key);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//标签文本更新
|
|
|
|
|
function setAllTagsValue() {
|
|
|
|
|
if (stateData.showMapping) {
|
|
|
|
|
stateData.showMapping.forEach((value, key) => {
|
|
|
|
|
var element = document.getElementById(key)
|
|
|
|
|
var image = cornerstone.getImage(element);
|
|
|
|
|
//TODO 缺少获取图片对象信息
|
|
|
|
|
renderTagText(element, image)
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//重置画布
|
|
|
|
|
function resetRenderCanvase() {
|
|
|
|
|
var element = stateData.element;
|
|
|
|
|
const enabledElement = cornerstone.getEnabledElement(element);
|
|
|
|
|
|
|
|
|
|
enabledElement.renderingTools.colormapId = undefined;
|
|
|
|
|
enabledElement.renderingTools.colorLut = undefined;
|
|
|
|
|
|
|
|
|
|
const renderCanvas = enabledElement.renderingTools.renderCanvas;
|
|
|
|
|
const canvasContext = renderCanvas.getContext('2d');
|
|
|
|
|
|
|
|
|
|
// NOTE - we need to fill the render canvas with white pixels since we
|
|
|
|
|
// control the luminance using the alpha channel to improve rendering performance.
|
|
|
|
|
canvasContext.fillStyle = 'white';
|
|
|
|
|
canvasContext.fillRect(0, 0, renderCanvas.width, renderCanvas.height);
|
|
|
|
|
const renderCanvasData = canvasContext.getImageData(0, 0, renderCanvas.width, renderCanvas.height);
|
|
|
|
|
|
|
|
|
|
enabledElement.renderingTools.renderCanvasContext = canvasContext;
|
|
|
|
|
enabledElement.renderingTools.renderCanvasData = renderCanvasData;
|
|
|
|
|
cornerstone.updateImage(stateData.element);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//重置按钮状态
|
|
|
|
|
function resetBtnState(id) {
|
|
|
|
|
if ($("#" + id).hasClass("selected")) {
|
|
|
|
|
$("#" + id).removeClass("btn-primary")
|
|
|
|
|
$("#" + id).removeClass("selected")
|
|
|
|
|
$("#" + id).addClass("btn-default")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function disableFunctions(currentFun) {
|
|
|
|
|
functionNames.forEach(function (fname) {
|
|
|
|
|
resetBtnState(fname)
|
|
|
|
|
if (currentFun != fname && (notNeedDisableFunctions.includes(fname) || displayFunctions.includes(fname))) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
cornerstoneTools.setToolDisabled(fname, { mouseButtonMask: 1 })
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//辅助工具
|
|
|
|
|
const toolFunction = ["ScaleOverlay", "OrientationMarkers"]
|
|
|
|
|
const wheelFunction = ["ZoomMouseWheel"]
|
|
|
|
|
|
2024-10-21 15:32:43 +08:00
|
|
|
|
//截图按钮
|
|
|
|
|
function screenshotTool() {
|
|
|
|
|
let dicomCenter = document.getElementById('dicom-img-box_0_0');
|
|
|
|
|
if (dicomCenter) {
|
|
|
|
|
let canvasCenter = document.querySelector("#dicomImage_0_0 canvas");
|
|
|
|
|
let sliderCenter = document.querySelector("#dicom-img-box_0_0 .slider-container");
|
|
|
|
|
try {
|
|
|
|
|
dicomCenter.style.borderWidth = "0px";
|
|
|
|
|
if (canvasCenter)
|
|
|
|
|
canvasCenter.crossorign = "anonymous";
|
|
|
|
|
if (sliderCenter)
|
|
|
|
|
sliderCenter.style.display = "none";
|
|
|
|
|
let targetWidth = dicomCenter.offsetWidth + 6;
|
|
|
|
|
let targetHeight = dicomCenter.offsetHeight + 4;
|
|
|
|
|
html2canvas(
|
|
|
|
|
dicomCenter,
|
|
|
|
|
{
|
|
|
|
|
allowTaint: false,
|
|
|
|
|
taintTest: false,
|
|
|
|
|
logging: false,
|
|
|
|
|
useCORS: true,
|
|
|
|
|
width: targetWidth,
|
|
|
|
|
height: targetHeight,
|
|
|
|
|
dpi: window.devicePixelRatio * 12, //将分辨率提高到特定的DPI 提高四倍
|
|
|
|
|
scale: 12, //按比例增加分辨率
|
|
|
|
|
}
|
|
|
|
|
).then((canvas) => {
|
|
|
|
|
canvas.crossorign = "anonymous";
|
|
|
|
|
let imageDataUrl = canvas.toDataURL('image/jpeg', 1);
|
|
|
|
|
$.ajax({
|
|
|
|
|
type: 'POST',
|
|
|
|
|
contentType: 'application/json',
|
2024-10-25 21:52:24 +08:00
|
|
|
|
url: 'http://192.168.0.110:8095/admin-api/ultrasoniccom/ultrasonic/ftpimage',
|
|
|
|
|
data: JSON.stringify({ id: window.localStorage.regid_pathology, orgId: window.localStorage.orgId_pathology, imagebase: imageDataUrl, imgType: '3' }),
|
2024-10-21 15:32:43 +08:00
|
|
|
|
success: function (data, textStatus, jqXHR) {
|
|
|
|
|
alert('添加成功,请刷新报告单中的图片');
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
} finally {
|
|
|
|
|
dicomCenter.style.borderWidth = "";
|
|
|
|
|
if (canvasCenter)
|
|
|
|
|
canvasCenter.crossorign = "";
|
|
|
|
|
if (sliderCenter)
|
|
|
|
|
sliderCenter.style.display = "";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-04 18:23:33 +08:00
|
|
|
|
//撤销所有改动
|
|
|
|
|
function resetTool() {
|
|
|
|
|
//反转色
|
|
|
|
|
//invert(null, $("#invert"), true)
|
|
|
|
|
//changColor(0, $("#changeColor"), true)
|
|
|
|
|
functionNames.forEach(function (fname) {
|
|
|
|
|
if (notNeedDisableFunctions.includes(fname)) {
|
|
|
|
|
cornerstoneTools.clearToolState(stateData.element, fname);
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
cornerstone.reset(stateData.element);
|
|
|
|
|
cornerstone.updateImage(stateData.element);
|
|
|
|
|
}
|
|
|
|
|
//反转颜色
|
|
|
|
|
function invert(flag, btn, reset) {
|
|
|
|
|
//btn btn-primary
|
|
|
|
|
var isSelected = $(btn).hasClass('selected');
|
|
|
|
|
if (isSelected || reset) {
|
|
|
|
|
$(btn).removeClass("btn-primary")
|
|
|
|
|
$(btn).removeClass("selected")
|
|
|
|
|
$(btn).addClass("btn-default")
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
$(btn).removeClass("btn-default")
|
|
|
|
|
$(btn).addClass("btn-primary")
|
|
|
|
|
$(btn).addClass("selected")
|
|
|
|
|
}
|
|
|
|
|
//反转颜色
|
|
|
|
|
var viewport = {
|
|
|
|
|
invert: !isSelected ? true : false
|
|
|
|
|
}
|
|
|
|
|
cornerstone.setViewport(stateData.element, viewport);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//彩色
|
|
|
|
|
function changColor(flag, btn, reset) {
|
|
|
|
|
var element = stateData.element;
|
|
|
|
|
//btn btn-primary
|
|
|
|
|
var isSelected = $(btn).hasClass('selected');
|
|
|
|
|
if (isSelected || reset) {
|
|
|
|
|
$(btn).removeClass("btn-primary")
|
|
|
|
|
$(btn).removeClass("selected")
|
|
|
|
|
$(btn).addClass("btn-default")
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
$(btn).removeClass("btn-default")
|
|
|
|
|
$(btn).addClass("btn-primary")
|
|
|
|
|
$(btn).addClass("selected")
|
|
|
|
|
}
|
|
|
|
|
resetRenderCanvase();
|
|
|
|
|
const b = cornerstone.getEnabledElement(element)
|
|
|
|
|
const v = cornerstone.getDefaultViewport(b.canvas, b.image)
|
|
|
|
|
var vp = cornerstone.getViewport(element);
|
|
|
|
|
vp.colormap = !isSelected ? "hsv" : undefined;
|
|
|
|
|
if (!flag) {
|
|
|
|
|
cornerstone.setViewport(element, v)
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
cornerstone.setViewport(element, vp)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//重置cornerstone
|
|
|
|
|
function reset() {
|
|
|
|
|
cornerstone.reset(stateData.element);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function initConerstone(element) {
|
|
|
|
|
// 注册并挂载cornerstone及其cornerstoneTools,固定操作
|
|
|
|
|
cornerstoneTools.external.cornerstone = cornerstone;
|
|
|
|
|
cornerstoneTools.external.cornerstoneMath = cornerstoneMath;
|
|
|
|
|
cornerstoneTools.external.Hammer = Hammer;
|
|
|
|
|
cornerstoneWADOImageLoader.external.dicomParser = dicomParser;
|
|
|
|
|
cornerstoneWADOImageLoader.external.cornerstone = cornerstone;
|
|
|
|
|
// imageId就是cornerstone要求的.dcm图片地址,例如:var imageId = "wadouri:http://127.0.0.1:6699/ctdcm1.dcm";
|
|
|
|
|
//var imageId = "wadouri:./1.dcm";
|
|
|
|
|
// 初始化cornerstoneTools工具
|
|
|
|
|
cornerstoneTools.init();
|
|
|
|
|
//// 获取要用于加载图片的div区域
|
|
|
|
|
//element = document.getElementById('dicomImage');
|
|
|
|
|
////激活获取到的用于图片加载的区域
|
|
|
|
|
cornerstone.enable(element);
|
|
|
|
|
// 从cornerstoneTools库中获取窗宽,窗高工具
|
|
|
|
|
const WwwcTool = cornerstoneTools.WwwcTool;
|
|
|
|
|
//添加获取到的窗宽,窗高工具
|
|
|
|
|
cornerstoneTools.addTool(WwwcTool);
|
|
|
|
|
|
|
|
|
|
//放大
|
|
|
|
|
const MagnifyTool = cornerstoneTools.MagnifyTool;
|
|
|
|
|
cornerstoneTools.addTool(MagnifyTool)
|
|
|
|
|
|
|
|
|
|
//平移
|
|
|
|
|
const PanTool = cornerstoneTools.PanTool;
|
|
|
|
|
cornerstoneTools.addTool(PanTool)
|
|
|
|
|
|
|
|
|
|
const ZoomTool = cornerstoneTools.ZoomTool;
|
|
|
|
|
cornerstoneTools.addTool(ZoomTool, {
|
|
|
|
|
// Optional configuration
|
|
|
|
|
configuration: {
|
|
|
|
|
invert: false,
|
|
|
|
|
preventZoomOutsideImage: false,
|
|
|
|
|
minScale: .1,
|
|
|
|
|
maxScale: 20.0,
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const ZoomMouseWheelTool = cornerstoneTools.ZoomMouseWheelTool;
|
|
|
|
|
cornerstoneTools.addTool(ZoomMouseWheelTool)
|
|
|
|
|
|
|
|
|
|
const WwwcRegionTool = cornerstoneTools.WwwcRegionTool;
|
|
|
|
|
cornerstoneTools.addTool(WwwcRegionTool)
|
|
|
|
|
|
|
|
|
|
const ScaleOverlayTool = cornerstoneTools.ScaleOverlayTool;
|
|
|
|
|
cornerstoneTools.addTool(ScaleOverlayTool)
|
|
|
|
|
|
|
|
|
|
//旋转
|
|
|
|
|
const RotateTool = cornerstoneTools.RotateTool;
|
|
|
|
|
cornerstoneTools.addTool(RotateTool)
|
|
|
|
|
|
|
|
|
|
const OrientationMarkersTool = cornerstoneTools.OrientationMarkersTool;
|
|
|
|
|
cornerstoneTools.addTool(OrientationMarkersTool)
|
|
|
|
|
|
|
|
|
|
const AngleTool = cornerstoneTools.AngleTool;
|
|
|
|
|
cornerstoneTools.addTool(AngleTool)
|
|
|
|
|
|
|
|
|
|
const ArrowAnnotateTool = cornerstoneTools.ArrowAnnotateTool;
|
|
|
|
|
cornerstoneTools.addTool(ArrowAnnotateTool)
|
|
|
|
|
|
|
|
|
|
const BidirectionalTool = cornerstoneTools.BidirectionalTool;
|
|
|
|
|
cornerstoneTools.addTool(BidirectionalTool)
|
|
|
|
|
|
|
|
|
|
const CobbAngleTool = cornerstoneTools.CobbAngleTool;
|
|
|
|
|
cornerstoneTools.addTool(CobbAngleTool)
|
|
|
|
|
|
|
|
|
|
const EllipticalRoiTool = cornerstoneTools.EllipticalRoiTool;
|
|
|
|
|
cornerstoneTools.addTool(EllipticalRoiTool)
|
|
|
|
|
|
|
|
|
|
const FreehandRoiTool = cornerstoneTools.FreehandRoiTool;
|
|
|
|
|
cornerstoneTools.addTool(FreehandRoiTool)
|
|
|
|
|
|
|
|
|
|
const LengthTool = cornerstoneTools.LengthTool;
|
|
|
|
|
cornerstoneTools.addTool(LengthTool)
|
|
|
|
|
|
|
|
|
|
const ProbeTool = cornerstoneTools.ProbeTool;
|
|
|
|
|
cornerstoneTools.addTool(ProbeTool)
|
|
|
|
|
|
|
|
|
|
const RectangleRoiTool = cornerstoneTools.RectangleRoiTool;
|
|
|
|
|
cornerstoneTools.addTool(RectangleRoiTool)
|
|
|
|
|
|
|
|
|
|
const TextMarkerTool = cornerstoneTools.TextMarkerTool
|
|
|
|
|
// set up the markers configuration
|
|
|
|
|
const configuration = {
|
2024-08-27 18:38:22 +08:00
|
|
|
|
markers: ['双击修改注释'],
|
|
|
|
|
current: '双击修改注释',
|
2024-08-04 18:23:33 +08:00
|
|
|
|
ascending: true,
|
|
|
|
|
loop: true,
|
|
|
|
|
}
|
|
|
|
|
cornerstoneTools.addTool(TextMarkerTool, { configuration })
|
|
|
|
|
|
|
|
|
|
const StackScrollTool = cornerstoneTools.StackScrollTool
|
|
|
|
|
cornerstoneTools.addTool(StackScrollTool)
|
|
|
|
|
|
|
|
|
|
const StackScrollMouseWheelTool = cornerstoneTools.StackScrollMouseWheelTool
|
|
|
|
|
cornerstoneTools.addTool(StackScrollMouseWheelTool)
|
|
|
|
|
cornerstoneTools.setToolActive('StackScrollMouseWheel', {})
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function initConerstoneAndData() {
|
|
|
|
|
var series = stateData.dicomInfo.seriesList[stateData.imgIndex].instanceList
|
2024-08-29 16:23:28 +08:00
|
|
|
|
|
2024-08-04 18:23:33 +08:00
|
|
|
|
const imageIds = series.map(seriesImage => `${scheme}:${baseUrl}${seriesImage.imageid}`)
|
|
|
|
|
|
|
|
|
|
//define the stack
|
|
|
|
|
const stack = {
|
|
|
|
|
currentImageIdIndex: 0,
|
|
|
|
|
imageIds: imageIds
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
cornerstone.enable(stateData.element);
|
|
|
|
|
|
|
|
|
|
// load images and set the stack
|
|
|
|
|
cornerstone.loadImage(imageIds[0]).then((image) => {
|
2024-10-21 15:32:43 +08:00
|
|
|
|
updateProcess(stateData.imgIndex, "initConerstoneAndData")
|
2024-08-04 18:23:33 +08:00
|
|
|
|
initSlider(stateData.element);
|
|
|
|
|
cornerstone.displayImage(stateData.element, image)
|
|
|
|
|
cornerstoneTools.addStackStateManager(stateData.element, ['stack'])
|
|
|
|
|
cornerstoneTools.addToolState(stateData.element, 'stack', stack)
|
|
|
|
|
renderTagText(stateData.element, image)
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//页面加载完成,执行初始化
|
|
|
|
|
$(document).ready(function () {
|
2024-08-16 23:27:45 +08:00
|
|
|
|
createElements(1, 1, true);
|
2024-08-04 18:23:33 +08:00
|
|
|
|
//激活获取到的用于图片加载的区域
|
|
|
|
|
stateData.element = document.getElementById('dicomImage_0_0');
|
2024-08-16 23:27:45 +08:00
|
|
|
|
stateData.showMapping.set('dicomImage_0_0', 0);
|
2024-08-04 18:23:33 +08:00
|
|
|
|
//cornerstone.enable(stateData.element);
|
|
|
|
|
initConerstone(stateData.element);
|
|
|
|
|
//初始化数据
|
|
|
|
|
initData();
|
|
|
|
|
//鼠标滚轮事件
|
|
|
|
|
document.addEventListener('mousewheel', function (event) {
|
|
|
|
|
// 处理事件
|
|
|
|
|
setAllSliderValue();
|
|
|
|
|
setAllTagsValue();
|
|
|
|
|
});
|
|
|
|
|
//鼠标移动事件
|
|
|
|
|
document.addEventListener('mousemove', function (event) {
|
|
|
|
|
// 处理事件
|
|
|
|
|
setAllSliderValue();
|
|
|
|
|
setAllTagsValue();
|
|
|
|
|
});
|
2024-08-16 23:27:45 +08:00
|
|
|
|
setImgListParentHeight();
|
2024-08-04 18:23:33 +08:00
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
//初始化右侧图片列表
|
|
|
|
|
function initImgList(data) {
|
|
|
|
|
$("#dicom-list").empty();
|
|
|
|
|
for (var i = 0; i < data.seriesList.length; i++) {
|
|
|
|
|
var className = "series_img";
|
|
|
|
|
if (stateData.imgIndex == i) {
|
|
|
|
|
className += "_active";
|
|
|
|
|
}
|
2024-08-16 23:27:45 +08:00
|
|
|
|
//$("#dicom-list").append('<img id="img_' + i + '" onclick="changeIndex(' + i + ')" class="' + className + '" src="' + data.seriesList[i].thumbUrl + '"/>');
|
|
|
|
|
//$("#dicom-list").append('<div class="icon-img-box" onclick="changeIndex(' + i + ')"><img id="img_' + i + '" class="' + className + '" src="' + data.seriesList[i].thumbUrl + '"/><div class="process-div" id="process-' + i + '"></div></div>');
|
|
|
|
|
//$("#dicom-list").append('<div class="icon-img-box" id="icon-img-box-'+i+'" onclick="changeIndex(' + i + ')"><img id="img_' + i + '" class="' + className + '"/><div class="process-div" id="process-' + i + '"></div></div>');
|
2024-10-21 15:32:43 +08:00
|
|
|
|
$("#dicom-list").append('<div style="height: 220px;" class="icon-img-box ' + className + '" id="icon-img-box-' + i + '" onclick="changeIndex(' + i + ')"><div class="process-div" id="process-' + i + '"></div><span style="color: white;word-wrap: break-word;font-size: 16px; id="h_' + i + '" >' + data.seriesList[i].SeriesDesc + '</span></div>');
|
2024-08-04 18:23:33 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//修改序列
|
|
|
|
|
function changeIndex(i) {
|
|
|
|
|
if (stateData.imgIndex == i && stateData.showMapping.get(stateData.element.id) == i) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
2024-08-16 23:27:45 +08:00
|
|
|
|
//$("#img_" + stateData.imgIndex).removeClass("series_img_active");
|
|
|
|
|
//$("#img_" + stateData.imgIndex).addClass("series_img")
|
|
|
|
|
//$("#img_" + i).removeClass("series_img")
|
|
|
|
|
//$("#img_" + i).addClass("series_img_active")
|
|
|
|
|
$("#icon-img-box-" + stateData.imgIndex).removeClass("series_img_active");
|
|
|
|
|
$("#icon-img-box-" + stateData.imgIndex).addClass("series_img")
|
|
|
|
|
$("#icon-img-box-" + i).removeClass("series_img")
|
|
|
|
|
$("#icon-img-box-" + i).addClass("series_img_active")
|
2024-08-04 18:23:33 +08:00
|
|
|
|
stateData.imgIndex = i
|
2024-08-16 23:27:45 +08:00
|
|
|
|
clearProcess(i)
|
2024-08-04 18:23:33 +08:00
|
|
|
|
initConerstone(stateData.element)
|
|
|
|
|
initConerstoneAndData();
|
|
|
|
|
stateData.showMapping.set(stateData.element.id, i);
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-16 23:27:45 +08:00
|
|
|
|
//获取数据
|
2024-08-04 18:23:33 +08:00
|
|
|
|
function initData() {
|
2024-08-29 16:23:28 +08:00
|
|
|
|
|
2024-10-21 15:32:43 +08:00
|
|
|
|
// var idx = GetQueryString("idx");
|
|
|
|
|
// var maxSize = GetQueryString("maxSize");
|
|
|
|
|
|
2024-08-04 18:23:33 +08:00
|
|
|
|
var localStorage = window.localStorage;
|
2024-08-16 23:27:45 +08:00
|
|
|
|
var localData = JSON.parse(localStorage.data);
|
2024-10-21 15:32:43 +08:00
|
|
|
|
var maxSize = localData.maxSize
|
|
|
|
|
console.log("网页接受到数据maxSize" + maxSize)
|
2024-08-29 16:23:28 +08:00
|
|
|
|
if (maxSize) {
|
|
|
|
|
cacheProcess.maxSize = maxSize;
|
|
|
|
|
}
|
|
|
|
|
var data = JSON.parse(localData.do);
|
|
|
|
|
console.log("网页接受到数据" + data)
|
2024-08-06 13:35:42 +08:00
|
|
|
|
stateData.dicomInfo = data;
|
2024-08-19 17:44:16 +08:00
|
|
|
|
//初始化进度
|
|
|
|
|
initProcess();
|
2024-08-29 16:23:28 +08:00
|
|
|
|
initQueue();
|
2024-08-19 17:44:16 +08:00
|
|
|
|
initImgList(stateData.dicomInfo);
|
2024-08-16 23:27:45 +08:00
|
|
|
|
//加载icon图片
|
2024-08-19 17:44:16 +08:00
|
|
|
|
convertDicom2Img();
|
|
|
|
|
//缓存文件
|
|
|
|
|
setTimeout(function () {
|
|
|
|
|
cacheImages();
|
|
|
|
|
}, 500)
|
2024-08-06 13:35:42 +08:00
|
|
|
|
initConerstoneAndData();
|
2024-08-29 16:23:28 +08:00
|
|
|
|
|
2024-08-04 18:23:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//初始化滚动条
|
|
|
|
|
function initSlider(element) {
|
|
|
|
|
var idx = stateData.showMapping.get(element.id);
|
|
|
|
|
var size = stateData.dicomInfo.seriesList[idx].instanceList.length;
|
|
|
|
|
//当前索引
|
|
|
|
|
var index = 0;
|
|
|
|
|
try {
|
|
|
|
|
var data = cornerstoneTools.getToolState(element, "stack").data[0];
|
|
|
|
|
index = data.currentImageIdIndex;
|
|
|
|
|
}
|
|
|
|
|
catch (err) {
|
2024-08-16 23:27:45 +08:00
|
|
|
|
console.log('err', err)
|
2024-08-04 18:23:33 +08:00
|
|
|
|
}
|
|
|
|
|
$("#" + element.id + "-slider").attr("min", 1)
|
|
|
|
|
$("#" + element.id + "-slider").attr("max", size)
|
|
|
|
|
$("#" + element.id + "-slider").val(index + 1)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//选中元素
|
|
|
|
|
function changeElement(b) {
|
|
|
|
|
//滚动条和上下翻页禁用
|
|
|
|
|
$(".operator").attr("disabled", "true");
|
|
|
|
|
$("#" + b.id + "-btn-next").removeAttr("disabled");
|
|
|
|
|
$("#" + b.id + "-btn-last").removeAttr("disabled");
|
|
|
|
|
$("#" + b.id + "-slider").removeAttr("disabled");
|
|
|
|
|
if (stateData.element == b) {
|
|
|
|
|
$(b).parent().removeClass("dicom-img-box");
|
|
|
|
|
$(b).parent().addClass("dicom-img-box-active");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
$(b).parent().removeClass("dicom-img-box");
|
|
|
|
|
$(b).parent().addClass("dicom-img-box-active");
|
|
|
|
|
$(stateData.element).parent().removeClass("dicom-img-box-active");
|
|
|
|
|
$(stateData.element).parent().addClass("dicom-img-box");
|
|
|
|
|
stateData.element = b;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//获取URL参数
|
|
|
|
|
function GetQueryString(name) {
|
|
|
|
|
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
|
|
|
|
|
var r = window.location.search.substr(1).match(reg);
|
|
|
|
|
if (r != null) return unescape(r[2]); return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//设置滑动条值
|
|
|
|
|
function setSliderValue(imgId) {
|
|
|
|
|
//获取被选中胶片区域元素
|
|
|
|
|
var element = document.getElementById(imgId)
|
|
|
|
|
var data = cornerstoneTools.getToolState(element, "stack").data[0];
|
|
|
|
|
var index = data.currentImageIdIndex;
|
2024-08-16 23:27:45 +08:00
|
|
|
|
$("#" + imgId + "-slider").val(index + 1);
|
2024-08-04 18:23:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function changeSlider(imgId, slider) {
|
|
|
|
|
var sliderValue = $(slider).val();
|
|
|
|
|
var data = cornerstoneTools.getToolState(stateData.element, "stack").data[0];
|
|
|
|
|
index = sliderValue - 1;
|
|
|
|
|
var imgId = data.imageIds[index];
|
|
|
|
|
data.currentImageIdIndex = index;
|
|
|
|
|
cornerstone.loadAndCacheImage(imgId).then(function (image) {
|
|
|
|
|
cornerstone.enable(stateData.element);
|
|
|
|
|
cornerstone.displayImage(stateData.element, image);
|
2024-08-16 23:27:45 +08:00
|
|
|
|
renderTagText(stateData.element, image)
|
2024-08-04 18:23:33 +08:00
|
|
|
|
});
|
2024-08-19 17:44:16 +08:00
|
|
|
|
//for (var i = 0; i < 10; i++) {
|
|
|
|
|
// if (index + i == data.imageIds.length - 1) {
|
|
|
|
|
// break;
|
|
|
|
|
// }
|
|
|
|
|
// cornerstone.loadImage(data.imageIds[index + i]).then((image) => {
|
|
|
|
|
// console.log("loaded ok " + data.imageIds[index + i]);
|
|
|
|
|
// })
|
|
|
|
|
//}
|
2024-08-04 18:23:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//渲染标签文本
|
|
|
|
|
function renderTagText(e, i) {
|
|
|
|
|
var tagsInfo = getDicomInfo(i);
|
|
|
|
|
var element = $(e).parent()[0];
|
|
|
|
|
var boxId = element.id;
|
|
|
|
|
//判断文本是否已经显示
|
|
|
|
|
if (!$("#" + boxId + "_left-top").length) {
|
|
|
|
|
var infoElement =
|
|
|
|
|
' <div id="' + boxId + '_left-top" class="around-info-left-top"></div>' +
|
|
|
|
|
' <div id="' + boxId + '_right-top" class="around-info-right-top"></div>' +
|
|
|
|
|
' <div id="' + boxId + '_left-bottom" class="around-info-left-bottom"></div>' +
|
|
|
|
|
' <div id="' + boxId + '_right-bottom" class="around-info-right-bottom"></div>';
|
|
|
|
|
$(element).children().first().before(infoElement);
|
|
|
|
|
}
|
|
|
|
|
//左上角
|
|
|
|
|
var leftTop = $("#" + boxId + "_left-top");
|
|
|
|
|
leftTop.empty();
|
|
|
|
|
leftTop.append("<div class='tag-item'>" + tagsInfo.patientId + "</div>");//体检编号
|
|
|
|
|
leftTop.append("<div class='tag-item'>姓名:" + stateData.dicomInfo.patientname + "</div>");//患者姓名
|
2024-08-16 23:27:45 +08:00
|
|
|
|
leftTop.append("<div class='tag-item'>" + tagsInfo.patientBirthDate + " " + (tagsInfo.patientGender == 'F' ? "女" : "男") + "</div>");
|
2024-08-04 18:23:33 +08:00
|
|
|
|
leftTop.append("<div class='tag-item'>" + tagsInfo.imageDate + "</div>");
|
2024-08-16 23:27:45 +08:00
|
|
|
|
|
2024-08-04 18:23:33 +08:00
|
|
|
|
//左下角
|
|
|
|
|
var leftBottom = $("#" + boxId + "_left-bottom");
|
|
|
|
|
leftBottom.empty();
|
2024-08-16 23:27:45 +08:00
|
|
|
|
leftBottom.append("<div class='tag-item'>" + stateData.dicomInfo.hospital + "</div>");
|
2024-08-04 18:23:33 +08:00
|
|
|
|
//右上角
|
|
|
|
|
var rightTop = $("#" + boxId + "_right-top");
|
|
|
|
|
rightTop.empty();
|
|
|
|
|
rightTop.append("<div class='tag-item'>序列:" + tagsInfo.seriesNumber + " 图像:" + tagsInfo.imageNum + "</div>");
|
|
|
|
|
//右下角
|
|
|
|
|
var vp = cornerstone.getViewport(e);
|
|
|
|
|
var rightBottom = $("#" + boxId + "_right-bottom");
|
|
|
|
|
rightBottom.empty();
|
|
|
|
|
rightBottom.append("<div class='tag-item'>缩放:" + vp.scale.toFixed(2) + "</div>");
|
|
|
|
|
rightBottom.append("<div class='tag-item'>" + tagsInfo.width + "x" + tagsInfo.height + "</div>");
|
|
|
|
|
rightBottom.append("<div class='tag-item'>窗宽:" + tagsInfo.windowWidth + " 窗位:" + tagsInfo.windowCenter + "</div>");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//创建视图元素
|
2024-08-16 23:27:45 +08:00
|
|
|
|
function createElements(rowCount, columnCount, isInit) {
|
2024-08-04 18:23:33 +08:00
|
|
|
|
var container = document.getElementById('dicom-continer');
|
|
|
|
|
if (!isInit) {
|
|
|
|
|
clearChildren(container);
|
|
|
|
|
}
|
|
|
|
|
for (var i = 0; i < rowCount; i++) {
|
|
|
|
|
//生成行
|
|
|
|
|
var rowDom = document.createElement('div')
|
|
|
|
|
rowDom.setAttribute("class", "flex-row");
|
|
|
|
|
for (var j = 0; j < columnCount; j++) {
|
|
|
|
|
var columnDom = document.createElement('div');
|
|
|
|
|
columnDom.setAttribute("class", "dicom-img-box");
|
|
|
|
|
columnDom.setAttribute("id", 'dicom-img-box_' + i + '_' + j)
|
|
|
|
|
var imgId = 'dicomImage_' + i + '_' + j;
|
|
|
|
|
$(columnDom).append('<div class="dicom-img" id="' + imgId + '" onclick="changeElement(this)"></div>'
|
2024-08-16 23:27:45 +08:00
|
|
|
|
+ '<div class="slider-container">'
|
|
|
|
|
+ '<i class="iconfont icon-fangxiangjiantou-shang icon-shang operator" id="' + imgId + '-last_btn" onclick="last(' + imgId + ')"></i>'
|
|
|
|
|
+ '<input type="range" class="lcmf-range lcmf-range-date operator" value="0" id="' + imgId + '-slider" onchange="changeSlider(\'' + imgId + '\',this)" />'
|
|
|
|
|
+ '<i class="iconfont icon-fangxiangjiantou-xia icon-xia operator" id="' + imgId + '-next_btn" onclick="next(' + imgId + ')"></i>'
|
2024-08-04 18:23:33 +08:00
|
|
|
|
+ '</div>');
|
|
|
|
|
rowDom.appendChild(columnDom);
|
|
|
|
|
}
|
|
|
|
|
container.appendChild(rowDom);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//清理元素
|
|
|
|
|
function clearChildren(element) {
|
|
|
|
|
if (element && element.children.length > 0) {
|
|
|
|
|
for (var i = 0; i < element.children.length; i++) {
|
|
|
|
|
element.removeChild(element.children[i]);
|
|
|
|
|
i--;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//创建视图入口
|
|
|
|
|
function doCreate() {
|
|
|
|
|
let rowCount = parseInt(document.getElementById('row-count').value);
|
|
|
|
|
let columnCount = parseInt(document.getElementById('column-count').value);
|
|
|
|
|
if (stateData.rowCount == rowCount && stateData.columnCount == columnCount) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
createElements(rowCount, columnCount, false);
|
|
|
|
|
|
|
|
|
|
stateData.rowCount = rowCount;
|
|
|
|
|
stateData.columnCount = columnCount;
|
|
|
|
|
stateData.imgIndex = 0;
|
|
|
|
|
stateData.element = null;
|
|
|
|
|
stateData.showMapping = new Map()
|
2024-08-16 23:27:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function cacheImages() {
|
2024-08-19 17:44:16 +08:00
|
|
|
|
startCache();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var cacheProcess = {
|
2024-10-21 15:32:43 +08:00
|
|
|
|
taskSize: 0,//当前正在进行的任务数量
|
|
|
|
|
maxSize: 10 //同时最大缓存个数
|
2024-08-29 16:23:28 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var queue = [];
|
|
|
|
|
|
|
|
|
|
function initQueue() {
|
|
|
|
|
console.log("初始化队列开始");
|
|
|
|
|
//序列分组个数
|
|
|
|
|
var groupSize = stateData.dicomInfo.seriesList.length;
|
|
|
|
|
for (var i = 0; i < groupSize; i++) {
|
|
|
|
|
var group = stateData.dicomInfo.seriesList[i];
|
|
|
|
|
var imageSize = group.instanceList.length;
|
|
|
|
|
for (var j = 0; j < imageSize; j++) {
|
|
|
|
|
var message = {
|
|
|
|
|
index: i,
|
|
|
|
|
sindex: j,
|
|
|
|
|
imageId: imageId = `${scheme}:${baseUrl}${group.instanceList[j].imageid}`
|
|
|
|
|
};
|
|
|
|
|
queue.push(message)
|
|
|
|
|
console.log("队列push消息", message);
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-10-21 15:32:43 +08:00
|
|
|
|
console.log("初始化队列完成", queue);
|
2024-08-16 23:27:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
2024-08-19 17:44:16 +08:00
|
|
|
|
var cacheInterval = null;
|
|
|
|
|
|
|
|
|
|
function startCache() {
|
|
|
|
|
cacheInterval = setInterval(function () {
|
2024-08-29 16:23:28 +08:00
|
|
|
|
if (queue.length == 0) {
|
|
|
|
|
console.log("队列任务已清空");
|
2024-08-19 17:44:16 +08:00
|
|
|
|
clearInterval(cacheInterval);
|
|
|
|
|
return;
|
|
|
|
|
}
|
2024-08-29 16:23:28 +08:00
|
|
|
|
if (cacheProcess.maxSize <= cacheProcess.taskSize) {
|
|
|
|
|
//任务已满,等待
|
|
|
|
|
console.log("队列已满-等待", cacheProcess.taskSize);
|
2024-08-19 17:44:16 +08:00
|
|
|
|
return;
|
|
|
|
|
}
|
2024-08-29 16:23:28 +08:00
|
|
|
|
//从队列获取数据
|
|
|
|
|
var queueMessage = queue.shift();
|
|
|
|
|
console.log("获取队列消息", queueMessage);
|
|
|
|
|
cacheImg(queueMessage);
|
|
|
|
|
}, 1)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function cacheImg(queueMessage) {
|
|
|
|
|
cacheProcess.taskSize++;
|
|
|
|
|
cornerstone.loadAndCacheImage(queueMessage.imageId).then(() => {
|
|
|
|
|
console.log("缓存回调--", cacheProcess);
|
|
|
|
|
cacheProcess.taskSize--;
|
|
|
|
|
updateProcess(queueMessage.index);
|
|
|
|
|
console.log("缓存回调用,更新索引--", cacheProcess);
|
|
|
|
|
});
|
2024-08-19 17:44:16 +08:00
|
|
|
|
}
|
2024-08-16 23:27:45 +08:00
|
|
|
|
|
|
|
|
|
function cacheImageIndex(a) {
|
|
|
|
|
if (a >= stateData.dicomInfo.seriesList.length) {
|
|
|
|
|
clearInterval(cacheInterval);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
var series = stateData.dicomInfo.seriesList[a].instanceList
|
|
|
|
|
const imageIds = series.map(seriesImage => `${scheme}:${baseUrl}${seriesImage.imageid}`)
|
|
|
|
|
for (var j = 0; j < imageIds.length; j++) {
|
2024-08-19 17:44:16 +08:00
|
|
|
|
cornerstone.loadAndCacheImage(imageIds[j]).then(() => {
|
2024-08-16 23:27:45 +08:00
|
|
|
|
updateProcess(a, "cacheImages");
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//初始化进度信息
|
|
|
|
|
function initProcess() {
|
|
|
|
|
console.log("初始化进度 stateData.dicomInfo", stateData.dicomInfo);
|
|
|
|
|
var size = stateData.dicomInfo.seriesList.length;
|
|
|
|
|
for (var i = 0; i < size; i++) {
|
|
|
|
|
stateData.processMapping.set(i, 0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//更新进度信息
|
|
|
|
|
function updateProcess(i, fun) {
|
|
|
|
|
stateData.processMapping.set(i, stateData.processMapping.get(i) + 1)
|
|
|
|
|
renderProcess();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function clearProcess(i) {
|
|
|
|
|
return;
|
|
|
|
|
stateData.processMapping.set(i, 0)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//渲染进度
|
|
|
|
|
function renderProcess() {
|
|
|
|
|
var length = stateData.dicomInfo.seriesList.length;
|
|
|
|
|
for (var i = 0; i < length; i++) {
|
|
|
|
|
var totalSize = stateData.dicomInfo.seriesList[i].instanceList.length;
|
|
|
|
|
var currentSize = stateData.processMapping.get(i);
|
|
|
|
|
if (totalSize > currentSize) {
|
|
|
|
|
$("#process-" + i).show();
|
|
|
|
|
$("#process-" + i).text(currentSize + "/" + totalSize);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
$("#process-" + i).text("");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//生成图片
|
|
|
|
|
function convertDicom2Img() {
|
|
|
|
|
var length = stateData.dicomInfo.seriesList.length;
|
|
|
|
|
for (var i = 0; i < length; i++) {
|
|
|
|
|
loadDicomShowIcom(i);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//加载dicom文件,转换为base64格式
|
|
|
|
|
function loadDicomShowIcom(i) {
|
|
|
|
|
console.log("加载icon-" + i);
|
|
|
|
|
const imageId = `${scheme}:${baseUrl}${stateData.dicomInfo.seriesList[i].instanceList[0].imageid}`
|
|
|
|
|
console.log("imgId:", imageId);
|
|
|
|
|
const imgElement = document.getElementById('icon-img-box-' + i);
|
|
|
|
|
cornerstone.loadAndCacheImage(imageId).then(function (image) {
|
|
|
|
|
cornerstone.enable(imgElement);
|
|
|
|
|
cornerstone.displayImage(imgElement, image);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function setImgListParentHeight() {
|
|
|
|
|
const height = $(window).height() - $("#top-menu").height()
|
|
|
|
|
$("#dicom-list").css("max-height", height + "px")
|
|
|
|
|
|
2024-10-21 15:32:43 +08:00
|
|
|
|
console.log("window的高度", $(window).height());
|
|
|
|
|
console.log("topMenu的高度", $("#top-menu").height());
|
2024-08-16 23:27:45 +08:00
|
|
|
|
console.log("dicom-list高度", $("#dicom-list").height());
|
2024-08-04 18:23:33 +08:00
|
|
|
|
}
|