/// <summary> /// Creates an issue marker. It also creates an In-Canvas control on given element's position. /// </summary> /// <param name="document">Document in which the tracked element is.</param> /// <param name="elementId">Tracked element id.</param> /// <returns>IssueMarker created from data</returns> public static IssueMarker Create(Document document, ElementId elementId) { ResourceProvider resourceProvider = ResourceProvider.GetInstance(); // Prepare InCanvasControlData. It needs position and image path. // In this example, all controls will share the same image - though it is possible to create controls with different images, or even change it via an update (see IssueMarkerSelector::SelectMarker). Element elementTracked = document.GetElement(elementId); XYZ elementLocation = new XYZ(); if (elementTracked.Location is LocationPoint pointLoc) { elementLocation = pointLoc.Point; } else if (elementTracked.Location is LocationCurve curveLoc) { elementLocation = curveLoc.Curve.GetEndPoint(0); } InCanvasControlData inCanvasControlData = new InCanvasControlData(resourceProvider.IssueImage, elementLocation); // Create In-Canvas control TemporaryGraphicsManager manager = TemporaryGraphicsManager.GetTemporaryGraphicsManager(document); int controlIndex = manager.AddControl(inCanvasControlData, ElementId.InvalidElementId); return(new IssueMarker(elementId, controlIndex, inCanvasControlData)); }
/// <summary> /// Perform updates on in-canvas controls. /// In this example, the In-Canvas controls will be deleted, or have their positions changed, depending on the changes to related elements. /// </summary> /// <param name="data">Data about changes in the document.</param> public static void Execute(DocumentChangedEventArgs data) { Document doc = data.GetDocument(); TemporaryGraphicsManager temporaryGraphicsManager = TemporaryGraphicsManager.GetTemporaryGraphicsManager(doc); IssueMarkerTracking tracking = IssueMarkerTrackingManager.GetInstance().GetTracking(doc); foreach (ElementId deleted in data.GetDeletedElementIds()) { if (tracking.GetMarkerByElementId(deleted) is IssueMarker marker) { // This is how to delete control temporaryGraphicsManager.RemoveControl(marker.ControlIndex); // Don't forget to clean up your own data tracking.RemoveMarkerByElement(deleted); } } foreach (ElementId updated in data.GetModifiedElementIds()) { if (tracking.GetMarkerByElementId(updated) is IssueMarker marker) { Element element = doc.GetElement(updated); // Since we keep a copy of InCanvasControlData, we can avoid creating a new one. It already has image and position set - and we can just change the position InCanvasControlData controlData = marker.InCanvasControlData; if (element.Location is LocationPoint pointLoc) { controlData.Position = pointLoc.Point; } else if (element.Location is LocationCurve curveLoc) { controlData.Position = curveLoc.Curve.GetEndPoint(0); } marker.InCanvasControlData = controlData; // This is how to set updated data to a control temporaryGraphicsManager.UpdateControl(marker.ControlIndex, marker.InCanvasControlData); } } }
private IssueMarker(ElementId elementId, int controlIndex, InCanvasControlData inCanvasControlData) { this.elementId = elementId; this.controlIndex = controlIndex; inCanvasData = inCanvasControlData; }