Locks the object(s) currently being edited (selected).
AnnAutomation.prototype.lock = function() lock(): void; Use the CanLock property to determine whether you can currently call this method.
For more information, refer to Implementing Annotation Security.
The following example will show how to lock and unlock an object, prompting the user for a password.
import { AutomationHelper } from "../utilities/AutomationHelper";export class AnnAutomation_LockExample {private automation: lt.Annotations.Automation.AnnAutomation = null;constructor() {const helper = new AutomationHelper();helper.run(this.updateAutomation);document.getElementById('exampleButton').onclick = () => this.lock(this.automation);}private updateAutomation = (automation) => this.automation = automation;private lock = (automation: lt.Annotations.Automation.AnnAutomation) => {const rectObj: lt.Annotations.Engine.AnnRectangleObject = new lt.Annotations.Engine.AnnRectangleObject();rectObj.rect = lt.LeadRectD.create(100, 100, 800, 800);rectObj.stroke = lt.Annotations.Engine.AnnStroke.create(lt.Annotations.Engine.AnnSolidColorBrush.create("blue"),lt.LeadLengthD.create(1));rectObj.fill = lt.Annotations.Engine.AnnSolidColorBrush.create("yellow");automation.container.children.add(rectObj);automation.invalidate(lt.LeadRectD.get_empty());// make sure no objects are selected in the automationautomation.selectObject(null);const myPassword: string = "secret";// Hook to the lock and unlock eventsconst lockObject = (sender, e) => {// e is of type AnnLockObjectEventArgsalert("Lock it, sending password = " + myPassword);e.set_password(myPassword);};const unlockObject = (sender, e) => {// e is of type AnnLockObjectEventArgsalert("Unlock it, sending password = " + myPassword);e.set_password(myPassword);};automation.add_lockObject(lockObject);automation.add_unlockObject(unlockObject);// see if we can lock or unlock the object (this should show a message informing you that no objects are currently selected (bring edited)this.lockUnlock(automation);// select (edit) the object we have just addedautomation.selectObject(rectObj);// see if we can lock or unlock the object (should show the password dialog to lock the object)this.lockUnlock(automation);// see if we can lock or unlock the object (should show the password dialog to unlock the object)this.lockUnlock(automation);automation.remove_lockObject(lockObject);automation.remove_unlockObject(unlockObject);}private lockUnlock = (automation: lt.Annotations.Automation.AnnAutomation): void => {// first, check if we can lock the objectif (automation.canLock) {// lock this objectautomation.lock();}else if (automation.canUnlock) {// unlock this objectautomation.unlock();}else {alert("Cannot lock or unlock because no object is currently being edited (selected)");}}}
export class AutomationHelper {private automation: lt.Annotations.Automation.AnnAutomation = null;constructor() {lt.RasterSupport.setLicenseUri("https://demo.leadtools.com/licenses/v200/LEADTOOLSEVAL.txt", "EVAL", null);}public run(callback?: (automation: lt.Annotations.Automation.AnnAutomation) => void): void {// Create the viewerconst imageViewerDiv = document.getElementById("imageViewerDiv");const createOptions: lt.Controls.ImageViewerCreateOptions = new lt.Controls.ImageViewerCreateOptions(imageViewerDiv);const viewer: lt.Controls.ImageViewer = new lt.Controls.ImageViewer(createOptions);viewer.autoCreateCanvas = true;// PanZoom interactive modeconst panZoom: lt.Controls.ImageViewerPanZoomInteractiveMode = new lt.Controls.ImageViewerPanZoomInteractiveMode();// Create an instance of the Automation control object that works with LEADTOOLS ImageViewerconst imageViewerAutomationControl: lt.Demos.Annotations.ImageViewerAutomationControl = new lt.Demos.Annotations.ImageViewerAutomationControl();// Attach our image viewerimageViewerAutomationControl.imageViewer = viewer;// Set the image viewer interactive modeconst automationInteractiveMode: lt.Demos.Annotations.AutomationInteractiveMode = new lt.Demos.Annotations.AutomationInteractiveMode();automationInteractiveMode.automationControl = imageViewerAutomationControl;// Set the image URLviewer.imageUrl = "http://demo.leadtools.com/images/png/pngimage.png";// Create and set up the automation manager using the HTML5 rendering engineconst renderingEngine: lt.Annotations.Rendering.AnnHtml5RenderingEngine = new lt.Annotations.Rendering.AnnHtml5RenderingEngine();const manager: lt.Annotations.Automation.AnnAutomationManager = lt.Annotations.Automation.AnnAutomationManager.create(renderingEngine);// Create only the line and rectangle automation objectsthis.createMyAutomationObjects(manager);// You can instruct the manager to create the default (all) automation objects.// comment out the call to CreateMyAutomationObjects and call this instead://manager.createDefaultObjects();// Add the objects to the objects select elementconst currentObjectIdSelect = document.getElementById("currentObjectIdSelect") as HTMLSelectElement;// Add the PanZoom optioncurrentObjectIdSelect.options[currentObjectIdSelect.options.length] = new Option("Pan/Zoom", lt.Annotations.Engine.AnnObject.none.toString());const automationObjCount: number = manager.objects.count;for (let i = 0; i < automationObjCount; i++) {// Get the objectconst automationObj: lt.Annotations.Automation.AnnAutomationObject = manager.objects.item(i);// Add its name to the select elementconst name: string = automationObj.name;const id: number = automationObj.id;currentObjectIdSelect.options[currentObjectIdSelect.options.length] = new Option(name, id.toString());}// Hook to its change eventcurrentObjectIdSelect.addEventListener("change", () => {// Get the object IDconst id: number = parseInt(currentObjectIdSelect.options[currentObjectIdSelect.selectedIndex].value);// Set it as the current object in the managermanager.currentObjectId = id;// If this is the "Pan/Zoom" option, then back to pan zoom, otherwise, set our automation controlif (id == lt.Annotations.Engine.AnnObject.none) {viewer.defaultInteractiveMode = panZoom;}else {viewer.defaultInteractiveMode = automationInteractiveMode;}});// When the current object ID changes, we need to update our selectmanager.add_currentObjectIdChanged((sender, e) => {const currentObjectId: number = manager.currentObjectId;for (let i = 0; i < currentObjectIdSelect.options.length; i++) {const id: number = parseInt(currentObjectIdSelect.options[i].value);if (id === currentObjectId) {currentObjectIdSelect.selectedIndex = i;break;}}});// Pan zoom by defaultviewer.defaultInteractiveMode = panZoom;// Set up the automation (will create the container as well)const automation: lt.Annotations.Automation.AnnAutomation = new lt.Annotations.Automation.AnnAutomation(manager, imageViewerAutomationControl);this.automation = automation;// Add handler to update the container size when the image size changesviewer.itemChanged.add((sender, e) => {const container: lt.Annotations.Engine.AnnContainer = automation.container;container.size = container.mapper.sizeToContainerCoordinates(viewer.imageSize);// Create new canvas data provider for the new imageconst canvasDataProvider: lt.Demos.Annotations.CanvasDataProvider = new lt.Demos.Annotations.CanvasDataProvider(viewer.activeItem.canvas);imageViewerAutomationControl.automationDataProvider = canvasDataProvider;});// Set up this automation as the active onethis.automation.active = true;if(callback)callback(this.automation);}private createMyAutomationObjects(manager): void {// Get the automation objects collectionconst automationObjects = manager.objects;// Set up the select automation objectconst selectAutomationObj: lt.Annotations.Automation.AnnAutomationObject = new lt.Annotations.Automation.AnnAutomationObject();selectAutomationObj.id = lt.Annotations.Engine.AnnObject.selectObjectId;selectAutomationObj.name = "Select";selectAutomationObj.drawDesignerType = lt.Annotations.Designers.AnnRectangleDrawDesigner;selectAutomationObj.editDesignerType = lt.Annotations.Designers.AnnSelectionEditDesigner;selectAutomationObj.runDesignerType = null;// Create the object template for itconst selectObj: lt.Annotations.Engine.AnnSelectionObject = new lt.Annotations.Engine.AnnSelectionObject();selectObj.stroke = lt.Annotations.Engine.AnnStroke.create(lt.Annotations.Engine.AnnSolidColorBrush.create("darkgreen"), lt.LeadLengthD.create(2));selectAutomationObj.objectTemplate = selectObj;// Add it to the automation objects of the managerautomationObjects.add(selectAutomationObj);// Set up the line automation objectconst lineAutomationObj: lt.Annotations.Automation.AnnAutomationObject = new lt.Annotations.Automation.AnnAutomationObject();lineAutomationObj.id = lt.Annotations.Engine.AnnObject.lineObjectId;lineAutomationObj.name = "Line";lineAutomationObj.drawDesignerType = lt.Annotations.Designers.AnnLineDrawDesigner;lineAutomationObj.editDesignerType = lt.Annotations.Designers.AnnPolylineEditDesigner;lineAutomationObj.runDesignerType = lt.Annotations.Designers.AnnRunDesigner;// Create the object template for it, use the default strokeconst lineObj: lt.Annotations.Engine.AnnPolylineObject = new lt.Annotations.Engine.AnnPolylineObject();lineAutomationObj.objectTemplate = lineObj;// Add it to the automation objects of the managerautomationObjects.add(lineAutomationObj);// Set up the rectangle automation objectconst rectAutomationObj: lt.Annotations.Automation.AnnAutomationObject = new lt.Annotations.Automation.AnnAutomationObject();rectAutomationObj.id = lt.Annotations.Engine.AnnObject.rectangleObjectId;rectAutomationObj.name = "Rectangle";rectAutomationObj.drawDesignerType = lt.Annotations.Designers.AnnRectangleDrawDesigner;rectAutomationObj.editDesignerType = lt.Annotations.Designers.AnnRectangleEditDesigner;rectAutomationObj.runDesignerType = lt.Annotations.Designers.AnnRunDesigner;// Create the object template for it, use the default stroke and fillconst rectObj: lt.Annotations.Engine.AnnRectangleObject = new lt.Annotations.Engine.AnnRectangleObject();rectAutomationObj.set_objectTemplate(rectObj);// Add it to the automation objects of the managerautomationObjects.add(rectAutomationObj);const textAutomationObj: lt.Annotations.Automation.AnnAutomationObject = new lt.Annotations.Automation.AnnAutomationObject();textAutomationObj.id = lt.Annotations.Engine.AnnObject.textObjectId;textAutomationObj.name = "Text";textAutomationObj.drawDesignerType = lt.Annotations.Designers.AnnRectangleDrawDesigner;textAutomationObj.editDesignerType = lt.Annotations.Designers.AnnTextEditDesigner;textAutomationObj.runDesignerType = lt.Annotations.Designers.AnnRunDesigner;// Create the object template for it, use the default stroke, fill, text and fontconst textObj: lt.Annotations.Engine.AnnTextObject = new lt.Annotations.Engine.AnnTextObject();textAutomationObj.objectTemplate = textObj;// Add it to the automation objects of the managerautomationObjects.add(textAutomationObj);}}
import { AutomationHelper } from "../utilities/AutomationHelper";export class AnnAutomation_LockExample {automation = null;constructor() {const helper = new AutomationHelper();helper.run(this.updateAutomation);document.getElementById('exampleButton').onclick = () => this.lock(this.automation);}updateAutomation = (automation) => this.automation = automation;lock = (automation) => {const rectObj = new lt.Annotations.Engine.AnnRectangleObject();rectObj.rect = lt.LeadRectD.create(100, 100, 800, 800);rectObj.stroke = lt.Annotations.Engine.AnnStroke.create(lt.Annotations.Engine.AnnSolidColorBrush.create("blue"),lt.LeadLengthD.create(1));rectObj.fill = lt.Annotations.Engine.AnnSolidColorBrush.create("yellow");automation.container.children.add(rectObj);automation.invalidate(lt.LeadRectD.get_empty());// make sure no objects are selected in the automationautomation.selectObject(null);const myPassword = "secret";// Hook to the lock and unlock eventsconst lockObject = (sender, e) => {// e is of type AnnLockObjectEventArgsalert("Lock it, sending password = " + myPassword);e.set_password(myPassword);};const unlockObject = (sender, e) => {// e is of type AnnLockObjectEventArgsalert("Unlock it, sending password = " + myPassword);e.set_password(myPassword);};automation.add_lockObject(lockObject);automation.add_unlockObject(unlockObject);// see if we can lock or unlock the object (this should show a message informing you that no objects are currently selected (bring edited)this.lockUnlock(automation);// select (edit) the object we have just addedautomation.selectObject(rectObj);// see if we can lock or unlock the object (should show the password dialog to lock the object)this.lockUnlock(automation);// see if we can lock or unlock the object (should show the password dialog to unlock the object)this.lockUnlock(automation);automation.remove_lockObject(lockObject);automation.remove_unlockObject(unlockObject);}lockUnlock = (automation) => {// first, check if we can lock the objectif (automation.canLock) {// lock this objectautomation.lock();}else if (automation.canUnlock) {// unlock this objectautomation.unlock();}else {alert("Cannot lock or unlock because no object is currently being edited (selected)");}}}
export class AutomationHelper {automation = null;constructor() {lt.RasterSupport.setLicenseUri("https://demo.leadtools.com/licenses/v200/LEADTOOLSEVAL.txt", "EVAL", null);}run(callback) {// Create the viewerconst imageViewerDiv = document.getElementById("imageViewerDiv");const createOptions = new lt.Controls.ImageViewerCreateOptions(imageViewerDiv);const viewer = new lt.Controls.ImageViewer(createOptions);viewer.autoCreateCanvas = true;// PanZoom interactive modeconst panZoom = new lt.Controls.ImageViewerPanZoomInteractiveMode();// Create an instance of the Automation control object that works with LEADTOOLS ImageViewerconst imageViewerAutomationControl = new lt.Demos.Annotations.ImageViewerAutomationControl();// Attach our image viewerimageViewerAutomationControl.imageViewer = viewer;// Set the image viewer interactive modeconst automationInteractiveMode = new lt.Demos.Annotations.AutomationInteractiveMode();automationInteractiveMode.automationControl = imageViewerAutomationControl;// Set the image URLviewer.imageUrl = "http://demo.leadtools.com/images/png/pngimage.png";// Create and set up the automation manager using the HTML5 rendering engineconst renderingEngine = new lt.Annotations.Rendering.AnnHtml5RenderingEngine();const manager = lt.Annotations.Automation.AnnAutomationManager.create(renderingEngine);// Create only the line and rectangle automation objectsthis.createMyAutomationObjects(manager);// You can instruct the manager to create the default (all) automation objects.// comment out the call to CreateMyAutomationObjects and call this instead://manager.createDefaultObjects();// Add the objects to the objects select elementconst currentObjectIdSelect = document.getElementById("currentObjectIdSelect");// Add the PanZoom optioncurrentObjectIdSelect.options[currentObjectIdSelect.options.length] = new Option("Pan/Zoom", lt.Annotations.Engine.AnnObject.none.toString());const automationObjCount = manager.objects.count;for (let i = 0; i < automationObjCount; i++) {// Get the objectconst automationObj = manager.objects.item(i);// Add its name to the select elementconst name = automationObj.name;const id = automationObj.id;currentObjectIdSelect.options[currentObjectIdSelect.options.length] = new Option(name, id.toString());}// Hook to its change eventcurrentObjectIdSelect.addEventListener("change", () => {// Get the object IDconst id = parseInt(currentObjectIdSelect.options[currentObjectIdSelect.selectedIndex].value);// Set it as the current object in the managermanager.currentObjectId = id;// If this is the "Pan/Zoom" option, then back to pan zoom, otherwise, set our automation controlif (id == lt.Annotations.Engine.AnnObject.none) {viewer.defaultInteractiveMode = panZoom;}else {viewer.defaultInteractiveMode = automationInteractiveMode;}});// When the current object ID changes, we need to update our selectmanager.add_currentObjectIdChanged((sender, e) => {const currentObjectId = manager.currentObjectId;for (let i = 0; i < currentObjectIdSelect.options.length; i++) {const id = parseInt(currentObjectIdSelect.options[i].value);if (id === currentObjectId) {currentObjectIdSelect.selectedIndex = i;break;}}});// Pan zoom by defaultviewer.defaultInteractiveMode = panZoom;// Set up the automation (will create the container as well)const automation = new lt.Annotations.Automation.AnnAutomation(manager, imageViewerAutomationControl);this.automation = automation;// Add handler to update the container size when the image size changesviewer.itemChanged.add((sender, e) => {const container = automation.container;container.size = container.mapper.sizeToContainerCoordinates(viewer.imageSize);// Create new canvas data provider for the new imageconst canvasDataProvider = new lt.Demos.Annotations.CanvasDataProvider(viewer.activeItem.canvas);imageViewerAutomationControl.automationDataProvider = canvasDataProvider;});// Set up this automation as the active onethis.automation.active = true;if(callback)callback(this.automation);}createMyAutomationObjects(manager) {// Get the automation objects collectionconst automationObjects = manager.objects;// Set up the select automation objectconst selectAutomationObj = new lt.Annotations.Automation.AnnAutomationObject();selectAutomationObj.id = lt.Annotations.Engine.AnnObject.selectObjectId;selectAutomationObj.name = "Select";selectAutomationObj.drawDesignerType = lt.Annotations.Designers.AnnRectangleDrawDesigner;selectAutomationObj.editDesignerType = lt.Annotations.Designers.AnnSelectionEditDesigner;selectAutomationObj.runDesignerType = null;// Create the object template for itconst selectObj = new lt.Annotations.Engine.AnnSelectionObject();selectObj.stroke = lt.Annotations.Engine.AnnStroke.create(lt.Annotations.Engine.AnnSolidColorBrush.create("darkgreen"), lt.LeadLengthD.create(2));selectAutomationObj.objectTemplate = selectObj;// Add it to the automation objects of the managerautomationObjects.add(selectAutomationObj);// Set up the line automation objectconst lineAutomationObj = new lt.Annotations.Automation.AnnAutomationObject();lineAutomationObj.id = lt.Annotations.Engine.AnnObject.lineObjectId;lineAutomationObj.name = "Line";lineAutomationObj.drawDesignerType = lt.Annotations.Designers.AnnLineDrawDesigner;lineAutomationObj.editDesignerType = lt.Annotations.Designers.AnnPolylineEditDesigner;lineAutomationObj.runDesignerType = lt.Annotations.Designers.AnnRunDesigner;// Create the object template for it, use the default strokeconst lineObj = new lt.Annotations.Engine.AnnPolylineObject();lineAutomationObj.objectTemplate = lineObj;// Add it to the automation objects of the managerautomationObjects.add(lineAutomationObj);// Set up the rectangle automation objectconst rectAutomationObj = new lt.Annotations.Automation.AnnAutomationObject();rectAutomationObj.id = lt.Annotations.Engine.AnnObject.rectangleObjectId;rectAutomationObj.name = "Rectangle";rectAutomationObj.drawDesignerType = lt.Annotations.Designers.AnnRectangleDrawDesigner;rectAutomationObj.editDesignerType = lt.Annotations.Designers.AnnRectangleEditDesigner;rectAutomationObj.runDesignerType = lt.Annotations.Designers.AnnRunDesigner;// Create the object template for it, use the default stroke and fillconst rectObj = new lt.Annotations.Engine.AnnRectangleObject();rectAutomationObj.set_objectTemplate(rectObj);// Add it to the automation objects of the managerautomationObjects.add(rectAutomationObj);const textAutomationObj = new lt.Annotations.Automation.AnnAutomationObject();textAutomationObj.id = lt.Annotations.Engine.AnnObject.textObjectId;textAutomationObj.name = "Text";textAutomationObj.drawDesignerType = lt.Annotations.Designers.AnnRectangleDrawDesigner;textAutomationObj.editDesignerType = lt.Annotations.Designers.AnnTextEditDesigner;textAutomationObj.runDesignerType = lt.Annotations.Designers.AnnRunDesigner;// Create the object template for it, use the default stroke, fill, text and fontconst textObj = new lt.Annotations.Engine.AnnTextObject();textAutomationObj.objectTemplate = textObj;// Add it to the automation objects of the managerautomationObjects.add(textAutomationObj);}}
<!doctype html><html lang="en"><title>Automation Example | EditText</title><head><script src="https://code.jquery.com/jquery-2.2.4.min.js"integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44=" crossorigin="anonymous"></script><script src="../../LT/Leadtools.js"></script><script src="../../LT/Leadtools.Controls.js"></script><script src="../../LT/Leadtools.Annotations.Engine.js"></script><script src="../../LT/Leadtools.Annotations.Designers.js"></script><script src="../../LT/Leadtools.Annotations.Rendering.Javascript.js"></script><script src="../../LT/Leadtools.Annotations.Automation.js"></script><script src="../../LT/Leadtools.Demos.js"></script><script src="../../LT/Leadtools.Demos.Annotations.Js"></script><style>#imageViewerDiv {border: 1px solid #000000;width: 800px;height: 800px;background-color: #7F7F7F;}</style><!-- All demo files are bundled and appended to the window --><script src="../../bundle.js" type="text/javascript"></script></head><body><p>Either Pan/Zoom or Annotations mode. In annotations mode, draw new objects or edit them.</p><div><select id="currentObjectIdSelect"></select><input type="button" id="exampleButton" value="Example" /><label id="exampleLabel" /></div><div id="imageViewerDiv" /></body><script>window.onload = () => {const example = new window.examples.AnnAutomation.Lock();};</script></html>
Help Collections
Raster .NET | C API | C++ Class Library | HTML5 JavaScript
Document .NET | C API | C++ Class Library | HTML5 JavaScript
Medical .NET | C API | C++ Class Library | HTML5 JavaScript
Medical Web Viewer .NET
Multimedia
Direct Show .NET | C API | Filters
Media Foundation .NET | C API | Transforms
Supported Platforms
.NET, Java, Android, and iOS/macOS Assemblies
Imaging, Medical, and Document
C API/C++ Class Libraries
Imaging, Medical, and Document
HTML5 JavaScript Libraries
Imaging, Medical, and Document
