Gets an object that contains the current undo/redo object data.
AnnAutomation.prototype.getUndoRedoObject = function() getUndoRedoObject(): AnnAutomationUndoRedoObject;
AnnAutomationUndoRedoObject object that contains the current undo/redo object data.
Use this method along with AttachContainer to re-attach a container to this AnnAutomation object.
import { AutomationHelper } from "../utilities/AutomationHelper";export class AnnAutomation_BeginUndoExample {private automation: lt.Annotations.Automation.AnnAutomation = null;constructor() {const helper = new AutomationHelper();helper.run(this.updateAutomation);document.getElementById('exampleButton').onclick = () => this.run(this.automation);}private updateAutomation = (automation) => this.automation = automation;private run = (automation: lt.Annotations.Automation.AnnAutomation) => {automation.beginUndo();try {// add a new rectangle objectconst 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);// Invalidate itautomation.invalidate(lt.LeadRectD.get_empty());// Select this objectautomation.selectObject(rectObj);// commit the undo nodeautomation.endUndo();}catch (ex) {// in case of errors, cancel the undo nodeautomation.cancelUndo();alert(ex.message);return;}alert("Object has been added as is now selected. Next will call //Undo// to undo the operation");automation.undo();alert("Operation has been undone. Next will call //Redo// to redo the operation");automation.redo();alert("Object should be back and selected");}}
export class AutomationHelper {private automation: lt.Annotations.Automation.AnnAutomation = null;constructor() {lt.RasterSupport.setLicenseUri("https://demo.leadtools.com/licenses/js/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_BeginUndoExample {automation = null;constructor() {const helper = new AutomationHelper();helper.run(this.updateAutomation);document.getElementById('exampleButton').onclick = () => this.run(this.automation);}updateAutomation = (automation) => this.automation = automation;run = (automation) => {automation.beginUndo();try {// add a new rectangle objectconst 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);// Invalidate itautomation.invalidate(lt.LeadRectD.get_empty());// Select this objectautomation.selectObject(rectObj);// commit the undo nodeautomation.endUndo();}catch (ex) {// in case of errors, cancel the undo nodeautomation.cancelUndo();alert(ex.message);return;}alert("Object has been added as is now selected. Next will call //Undo// to undo the operation");automation.undo();alert("Operation has been undone. Next will call //Redo// to redo the operation");automation.redo();alert("Object should be back and selected");}}
export class AutomationHelper {automation = null;constructor() {lt.RasterSupport.setLicenseUri("https://demo.leadtools.com/licenses/js/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.BeginUndo();};</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
