示例#1
0
        private void onFilePreSave(Object sender, SystemNotificationObjectEventArgs e)
        {
#if DEBUG
            MaxListener.PrintToListener("onFilePreSave");
#endif
            MaxIO.SaveData(ListView, NodeControl);
        }
示例#2
0
        private void onSystemPreReset(Object sender, SystemNotificationObjectEventArgs e)
        {
#if DEBUG
            MaxListener.PrintToListener("onSystemPreReset");
#endif
            NodeControl.Destroy.ClearSceneTree();
        }
示例#3
0
        private void onSystemPostReset(Object sender, SystemNotificationObjectEventArgs e)
        {
#if DEBUG
            MaxListener.PrintToListener("onSystemPostReset");
#endif
            try
            {
                ListView.BeginUpdate();
                NodeControl.Create.BuildSceneTree();
            }
            catch
            {
                throw new Exception();
            }
            finally
            {
                ListView.EndUpdate();
            }
        }
示例#4
0
        private void onSystemPostMerge(Object sender, SystemNotificationObjectEventArgs e)
        {
#if DEBUG
            MaxListener.PrintToListener("onSystemPostMerge");
#endif
            try
            {
                ListView.BeginUpdate();

                // Collect existing layer and folder nodes.
                IEnumerable <FolderTreeNode> existingFolderNodes = NodeControl.Query.FolderNodes;
                IEnumerable <LayerTreeNode>  existingLayerNodes  = NodeControl.Query.LayerNodes;

                // Unfortunately no event is fired for nodes that are added to layers that already exist.
                // For this reason we need to refresh the children in every layer.
                NodeControl.Create.AddMissingChildObjects(existingLayerNodes);
                ListView.RefreshObjects(existingLayerNodes.ToList());

                // After merge, get all new layers that need to be added to NLM.
                // Old layers are collected because no notification happens for nodes added to existing layers :/
                List <IILayer> newLayers = new List <IILayer>();
                foreach (IILayer layer in MaxLayers.Layers)
                {
                    UIntPtr handle = MaxAnimatable.GetHandleByAnim(layer as IAnimatable);
                    if (!NodeControl.HandleMap.ContainsHandle(handle))
                    {
                        newLayers.Add(layer);
                    }
                }

                // Check each new layer for any folder data saved on the attribute.
                // If any data exists, append it ot folderDataList.
                List <BaseTreeNode> treeNodeList   = new List <BaseTreeNode>();
                List <FolderData>   folderDataList = new List <FolderData>();
                foreach (IILayer layer in newLayers)
                {
                    List <FolderData> parentFolders = MaxIO.LoadParentFolderData(layer as IAnimatable, ListView);
                    if (parentFolders != null)
                    {
                        foreach (FolderData folderData in parentFolders)
                        {
                            if (!folderDataList.Contains(folderData))
                            {
                                folderDataList.Add(folderData);
                            }
                        }
                    }
                }

                // We only add new folders, so build a hashtable of already existing folder nodes.
                // This hashtable is passed to the Build methods, which checks before creating a new node.
                Hashtable folderNodeIdMap = new Hashtable();
                foreach (FolderTreeNode folderNode in existingFolderNodes)
                {
                    folderNodeIdMap.Add(folderNode.ID, folderNode);
                }

                // Build new folder and layer nodes, and append them to the treeNodeList.
                NodeControl.Create.BuildFolderNodes(treeNodeList, folderDataList, folderNodeIdMap);
                NodeControl.Create.BuildLayerAndObjectNodes(treeNodeList, newLayers, folderNodeIdMap);

                // Finally, add the new objects.
                ListView.AddObjects(treeNodeList);
            }
            catch
            {
                throw new Exception();
            }
            finally
            {
                ListView.EndUpdate();
            }
        }