README
Installation and usage
The easiest way to use viewportsCore is to install it from npm.
npm install viewports-core
Functionality of framework you can achieve using viewportsCore object.
To create simple viewer first of all you should create html file like this:
<!--index.html file-->
<style>
#viewer {
width: 100%;
height: 100%;
}
</style>
...
<body>
<div id="viewer"></div>
</body>
Then use it in your app:
viewportsCore.create(`viewer`, {});
Features
Here you will find description about viewportsCore features.
Layout
To create viewports layout use this function:
viewportsCore.create(containerId, properties);
Parameters description:
containerId- ID of HTML DOM element where will be store viewports.properties- object which setup parameters of viewports (not required). Possible options:position- this object describes absolute position of viewports layout. Default value:{top: 0, right: 0, bottom: 0, left: 0}.layout- this object defines layout of viewports. Default value:{columns: 1, rows: 1}.enabledScrollBetweenSeries- this parameter allows scrolling between series. Default value:false.autoOpenImageType- parameter defines which way to use for the study auto open. Possible values:none,first,always. Default values:none.features- this parameter enables features which is described in the object as parameter. This is for presentation states, key object, patient history.
To delete viewport by container id:
viewportsCore.deleteViewportByContainerId(containerId);
Parameters description:
containerId- Id of DOM element were viewport is stored (For example:container-1-1).
To delete all viewports:
viewportsCore.deleteAllViewports();
Data loading
Receive and store study data you can use this function (Study will load in active viewport):
viewportsCore.loadStudyWithHIS(studyUid, seriesUid, instanceUid);
Parameters description:
studyUid- study unique identification (string).seriesUid- series unique identification (string). Optional parameter, if not provided - first series from study is loaded.instanceUid- instance unique identification (string). Optional parameter, if not provided - first instance from series is loaded.
Load few studies in one call:
viewportsCore.loadStudiesWithHIS(studiesToLoad);
Example:
const studiesToLoad = [
{
studyUid: '1.2.840.113619.2.55.3.4271045733.996.1449464144.595',
seriesUid: '1.2.840.113619.2.55.3.4271045733.996.1449464144.156',
instanceUid: '1.2.840.113619.2.55.3.4271045733.996.1449464144.111',
containerId: 'container-1-1',
callback: (viewport) => {viewport.applyInvert(true)}
},
{
studyUid: '1.2.840.113619.2.55.3.4271045733.996.1449464144.595',
containerId: 'container-1-2',
callback: (viewport, study) => {console.log(study)}
},
];
Parameters description:
studyUid- study unique identification (string).seriesUid- series unique identification (string). Optional parameter, if not provided - first series from study is loaded.instanceUid- instance unique identification (string). Optional parameter, if not provided - first instance from series is loaded.containerId- ID of HTML DOM element where will be store viewports.callback- loaded study callback (function). Callback parameters are:viewport- current viewport data where study is loaded.study- loaded study data object.
Use this function to load instance in specific container:
viewportsCore.layout.loadInstanceToContainer(instanceUid, viewportColumn, viewportRow);
Parameters description:
instanceUid- instance unique identification (string).viewportColumn- number of column.viewportRow- number of row.
Actions with layout
Supported layout types: 1x1, 1x2, 1x3, 2x1, 2x2, 2x3, 3x1, 3x2, 3x3
To change layout of viewports uses this:
viewportsCore.setLayout(columns, rows);
To get active viewport container:
viewportsCore.layout.getActiveContainerId();
To remove selected active viewport container:
viewportsCore.layout.removeActiveViewportContainer();
Actions with measurements
Measurements id: none, ruler, angle, polyline, oval, volume, VTI, cobb angle, roi;
viewportsCore.getActiveViewport().deleteMeasurements();
viewportsCore.setActiveMeasurementId(`ruler`);
viewportsCore.getActiveMeasurementId();
viewportsCore.enableAngleBetweenIntersectingRulers();
viewportsCore.disableAngleBetweenIntersectingRulers();
viewportsCore.isEnableAngleBetweenIntersectingRulers();
viewportsCore.enableIntensity();
viewportsCore.disableIntensity();
viewportsCore.isEnableIntensity();
Binding mouse button
To bind function on mouse button you need to give number of 1|2|3 and function name of VIEWPORT_FUNCTIONS constant.
VIEWPORT_FUNCTIONS = {
NONE: 0,
WL: 1,
ZOOM: 2,
PAN: 3,
SCROLL: 4,
MEASURE: 5,
ROTATE: 6,
CROSSHAIR: 8,
};
viewportsCore.setMouseButtonFunction(1|2|3, VIEWPORT_FUNCTIONS.WL);
Synchronization
To enable synchronization you need to use this:
viewportsCore.enableSync(yourCallback);
Disable:
viewportsCore.disableSync(yourCallback);
For example:
viewportsCore.enableSync((functionName, parameters) => console.log(functionName, parameters));
- functionName have these event names:
image-position-changed,zoom-changed,container-size-changed. - parameters have function arguments and containerId.
Example of parameters:
image-position-changed: {"imagePosition": {"x": 0.03176011108489626, "y": 0.09775284633952291}, "containerId": "container-1-1"};zoom-changed: {"scale": 1.2529411185263977, "point": { "x": 253.15625", "y": 389}, "containerId": "container-1-1"};container-size-changed: {"width": 531, "height": 883, "scale": 1.037109375, "containerId": "container-1-1"}.
On these events you can manipulate sync functionality.
This function can add desired containers to the list:
viewportsCore.addToSync(containersId);
containersId- array of strings. Example: (['container-1-1', 'container-1-2']).
Function to remove containers from the list:
viewportsCore.removeFromSync(containersId);
containersId- array of strings. Example: (['container-1-1', 'container-1-2']).
Get all containers from the list:
viewportsCore.getLockedViewportContainers();
When sync is enabled you can use zoom function on locked containers:
viewportsCore.applyZoomForLockedViews(containerId, scale, point);
containerId- container id from which zoom operation was performed (to ignore provided container).scale- scale number.point- point object with x and y coordinates. For example: {x: 242, y: 236}.
When sync is enabled you can use pan function on locked containers:
viewportsCore.applyPanForLockedViews(containerId, positionX, positionY);
containerId- container id from which pan operation was performed (to ignore provided container).positionX- position x coordinates.positionY- position y coordinates.
Landmark
To enable event which is triggered on landmark creation, use this:
viewportsCore.landmarksController.enable(yourCallback);
Disable:
viewportsCore.landmarksController.disable(yourCallback);
For example:
viewportsCore.landmarksController.enable((landmarkData) => console.log(landmarkData));
landmarkData- object contains information about added landmark. Landmark information:studyUid: study unique identification (string);frameOfReferenceUid: frame of reference unique identification (string);points: 3 landmark points array with x, y, z coordinates. Array example: [[-7.2, 1.8, -2.5], [-6.5, -1.5, -282.5], [5.5, 8.3, -29.5]].
To enable landmark tool and start drawing landmark, use this:
viewportsCore.landmarksController.createLandmark();
Function to create landmark in viewports by stored landmark data:
viewportsCore.landmarksController.addLandmark(landmarkData);
landmarkData- object with landmark data information:studyUid: study unique identification (string);frameOfReferenceUid: frame of reference unique identification (string);points: 3 landmark points array with x, y, z coordinates. Array example: [[-7.2, 1.8, -2.5], [-6.5, -1.5, -282.5], [5.5, 8.3, -29.5]].
Function to remove created or added landmark:
viewportsCore.landmarksController.removeLandmark(referenceUid);
referenceUid- frame of reference uid.
Function to get landmark data by frame of reference uid:
viewportsCore.landmarksController.getLandmarkData(referenceUid);
referenceUid- frame of reference uid.
MPR actions
Orientations: CORONAL, AXIAL, SAGITTAL.
viewportsCore.changeActiveViewportOrientation(`CORONAL`);
Fusion
Fusion with Hot Iron palette.
viewportsCore.getActiveViewport().enableFusion(seriesId);
Window leveling actions
viewportsCore.getActiveViewport().applyWL(w,l);
viewportsCore.getActiveViewport().applyDefaultWL();
viewportsCore.getActiveViewport().applyAutoWL();
viewportsCore.getActiveViewport().applyInvert(true|false);
viewportsCore.getActiveViewport().isInverted();
Transformations of view
viewportsCore.getActiveViewport().applyRightRotation();
viewportsCore.getActiveViewport().applyLeftRotation();
viewportsCore.getActiveViewport().applyHorizontalFlip();
viewportsCore.getActiveViewport().applyVerticalFlip();
viewportsCore.getActiveViewport().applyTransformationCleanup();
Zoom operations
viewportsCore.getActiveViewport().applyFitToScreen();
viewportsCore.getActiveViewport().applyOriginalResolution();
viewportsCore.applyZoom(containerId, scale, point);
containerId- container id string.scale- scale number.point- point object with x and y coordinates. For example: {x: 242, y: 236}.
Pan operations
viewportsCore.applyPan(containerId, positionX, positionY);
containerId- container id string.positionX- position x coordinates.positionY- position y coordinates.
Reference lines
viewportsCore.enableReferenceLines();
viewportsCore.disableReferenceLines();
viewportsCore.isEnableReferenceLines();
viewportsCore.getActiveViewport().resetRender();
viewportsCore.resetAllViewportsRenders();
Study cache
viewportsCore.cacheStudy(viewportsCore.getActiveViewportStudy().uid, storageId);
Main data objects
Study object
To get study data use this command:
viewportsCore.getStudy(studyUid, storageId);
Series object
To get series data use this command:
viewportsCore.getSeries(seriesUid);
Instance object
To get instance data use this command:
viewportsCore.getInstance(instanceUid);
Events
To register event use:
viewportsCore.registerEvent(`event-constant`, callback);
To remove:
viewportsCore.removeEvent(`event-constant`, callback);
Selected viewport container event
Event constant: selected-viewport-container.
To use the event:
viewportsCore.registerEvent(`selected-viewport-container`, (containerId) => console.log(containerId));
Callback parameter:
containerId- selected viewport container id.
Rotate instance event
Event constant: image-rotation-changed.
To use the event:
viewportsCore.registerEvent(`image-rotation-changed`, ({angle, containerId}) => console.log(angle, containerId));
Callback parameter:
angle- instance rotation angle.containerId- selected viewport container id.
Pan instance event
Event constant: image-position-changed.
To use the event:
viewportsCore.registerEvent(`image-position-changed`, ({imagePosition, containerId}) => console.log(imagePosition, containerId));
Callback parameter:
imagePosition- instance position coordinates.containerId- selected viewport container id.
Zoom instance event
Event constant: zoom-changed.
To use the event:
viewportsCore.registerEvent(`zoom-changed`, ({scale, point, containerId}) => console.log(scale, point, containerId));
Callback parameter:
scale- scale size.point- the point coordinates from which to zoom in or out.containerId- selected viewport container id.
Delete viewports event
Event gives callback when the viewport is deleted and also gives callback when the viewport disappears on layout change.
Event constant: container-cleaned.
To use the event:
viewportsCore.registerEvent(`container-cleaned`, (container) => console.log(container));
Callback parameter:
container- object with container information:containerId- container id from which viewport will be cleaned;viewportId- cleaned viewport id.