/// <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> /// Changes selected issue marker in given document's tracking /// </summary> /// <param name="document">A Revit document</param> /// <param name="controlIndex">Id of the clicked In-Canvas control</param> public static void SelectMarker(Document document, int controlIndex) { TemporaryGraphicsManager tempGraphicsManager = TemporaryGraphicsManager.GetTemporaryGraphicsManager(document); IssueMarkerTracking issueMarkerTracking = IssueMarkerTrackingManager.GetInstance().GetTracking(document); ResourceProvider provider = ResourceProvider.GetInstance(); // Check if the new selection is valid IssueMarker newSelectedMarker = issueMarkerTracking.GetMarkerByIndex(controlIndex); if (newSelectedMarker == null) { return; } // clear previous selection IssueMarker selectedMarker = issueMarkerTracking.GetMarkerByIndex(issueMarkerTracking.GetSelected()); if (selectedMarker != null) { selectedMarker.InCanvasControlData.ImagePath = provider.IssueImage; // This is how to set updated data to a control tempGraphicsManager.UpdateControl(selectedMarker.ControlIndex, selectedMarker.InCanvasControlData); issueMarkerTracking.SetSelected(-1); } if (newSelectedMarker != selectedMarker) { newSelectedMarker.InCanvasControlData.ImagePath = provider.SelectedIssueImage; // This is how to set updated data to a control tempGraphicsManager.UpdateControl(newSelectedMarker.ControlIndex, newSelectedMarker.InCanvasControlData); issueMarkerTracking.SetSelected(controlIndex); } }