void ProcessLinkedDocuments()
        {
            List <string> LinkedDocumentsToRemove = new List <string>();

            // Check for modified linked documents.
            foreach (var LinkedDocEntry in RootCache.LinkedDocumentsCache)
            {
                // Check if the link was removed.
                string LinkedDocPath = LinkedDocEntry.Key;
                if (!ExportedLinkedDocuments.ContainsKey(LinkedDocPath))
                {
                    LinkedDocumentsToRemove.Add(LinkedDocPath);
                    continue;
                }

                // Check if the link was modified.
                FCachedDocumentData LinkedDocCache = LinkedDocEntry.Value;
                if (ModifiedLinkedDocuments.Contains(LinkedDocCache.SourceDocument))
                {
                    LinkedDocCache.Purge(DatasmithScene, true);
                }
                LinkedDocCache.ExportedElements.Clear();
            }

            foreach (var LinkedDoc in LinkedDocumentsToRemove)
            {
                RootCache.LinkedDocumentsCache[LinkedDoc].Purge(DatasmithScene, true);
                RootCache.LinkedDocumentsCache.Remove(LinkedDoc);
            }
        }
 public void OnBeginLinkedDocument(Document InDocument)
 {
     if (!CurrentCache.LinkedDocumentsCache.ContainsKey(InDocument.PathName))
     {
         CurrentCache.LinkedDocumentsCache[InDocument.PathName] = new FCachedDocumentData(InDocument);
     }
     CacheStack.Push(CurrentCache.LinkedDocumentsCache[InDocument.PathName]);
     CurrentCache = CurrentCache.LinkedDocumentsCache[InDocument.PathName];
 }
        private void Destroy(Application InApp)
        {
            StopMetadataExport();

            InApp.DocumentChanged -= DocumentChangedHandler;
            DocumentChangedHandler = null;

            DatasmithDirectLink = null;
            DatasmithScene      = null;
            RootCache           = null;
            ModifiedLinkedDocuments.Clear();
        }
        private FDirectLink(Document InDocument)
        {
            RootCache    = new FCachedDocumentData(InDocument);
            CurrentCache = RootCache;

            DatasmithScene = new FDatasmithFacadeScene(
                FDatasmithRevitExportContext.HOST_NAME,
                FDatasmithRevitExportContext.VENDOR_NAME,
                FDatasmithRevitExportContext.PRODUCT_NAME,
                InDocument.Application.VersionNumber);

            SceneName = Path.GetFileNameWithoutExtension(RootCache.SourceDocument.PathName);

            string SceneLabel = Path.GetFileNameWithoutExtension(InDocument.PathName);

            DatasmithScene.SetLabel(SceneLabel);

            DocumentChangedHandler = new EventHandler <DocumentChangedEventArgs>(OnDocumentChanged);
            InDocument.Application.DocumentChanged += DocumentChangedHandler;
        }
 public void OnEndLinkedDocument()
 {
     CacheStack.Pop();
     CurrentCache = CacheStack.Count > 0 ? CacheStack.Peek() : RootCache;
 }