private static void AddMetadataToDatasmithActor(FDatasmithFacadeActor InDatasmithActor, RhinoSceneHierarchyNode InNode, FDatasmithFacadeScene InDatasmithScene)
        {
            if (!InNode.Info.bHasRhinoObject)
            {
                return;
            }

            RhinoObject         NodeObject  = InNode.Info.RhinoModelComponent as RhinoObject;
            NameValueCollection UserStrings = NodeObject.Attributes.GetUserStrings();

            if (UserStrings != null && UserStrings.Count > 0)
            {
                string[] Keys = UserStrings.AllKeys;
                FDatasmithFacadeMetaData DatasmithMetaData = new FDatasmithFacadeMetaData(InDatasmithActor.GetName() + "_DATA");
                DatasmithMetaData.SetLabel(InDatasmithActor.GetLabel());
                DatasmithMetaData.SetAssociatedElement(InDatasmithActor);

                for (int KeyIndex = 0; KeyIndex < Keys.Length; ++KeyIndex)
                {
                    string CurrentKey     = Keys[KeyIndex];
                    string EvaluatedValue = FDatasmithRhinoUtilities.EvaluateAttributeUserText(InNode, UserStrings.Get(CurrentKey));

                    DatasmithMetaData.AddPropertyString(CurrentKey, EvaluatedValue);
                }

                InDatasmithScene.AddMetaData(DatasmithMetaData);
            }
        }
 private static void AddTagsToDatasmithActor(FDatasmithFacadeActor InDatasmithActor, RhinoSceneHierarchyNode InNode)
 {
     if (!InNode.bIsRoot && InNode.Info.Tags != null)
     {
         foreach (string CurrentTag in InNode.Info.Tags)
         {
             InDatasmithActor.AddTag(CurrentTag);
         }
     }
 }
Example #3
0
        public void SetDatasmithActor(FDatasmithFacadeActor InActor)
        {
            if (bIsRoot || DatasmithActor != null)
            {
                RhinoApp.WriteLine(string.Format("Error: Generating a datasmith actor for a Hierarchy node that doesn't need one!"));
                return;
            }

            DatasmithActor = InActor;
        }
 private static void AddActorToParent(FDatasmithFacadeActor InDatasmithActor, RhinoSceneHierarchyNode InNode, FDatasmithFacadeScene InDatasmithScene)
 {
     if (InNode.Parent.bIsRoot)
     {
         InDatasmithScene.AddActor(InDatasmithActor);
     }
     else
     {
         InNode.Parent.DatasmithActor.AddChild(InDatasmithActor);
     }
 }
        private static FDatasmithFacadeActor ParseEmptyActor(RhinoSceneHierarchyNode InNode)
        {
            string HashedName = FDatasmithFacadeElement.GetStringHash(InNode.Info.Name);
            FDatasmithFacadeActor DatasmithActor = new FDatasmithFacadeActor(HashedName);

            DatasmithActor.SetLabel(InNode.Info.Label);

            float[] MatrixArray = InNode.Info.WorldTransform.ToFloatArray(false);
            DatasmithActor.SetWorldTransform(MatrixArray);

            return(DatasmithActor);
        }
        private static void ExportHierarchyNode(FDatasmithFacadeScene DatasmithScene, RhinoSceneHierarchyNode Node, DatasmithRhinoSceneParser SceneParser)
        {
            FDatasmithFacadeActor ExportedActor = null;

            if (Node.Info.bHasRhinoObject)
            {
                RhinoObject CurrentObject = Node.Info.RhinoModelComponent as RhinoObject;

                if (CurrentObject.ObjectType == ObjectType.InstanceReference ||
                    CurrentObject.ObjectType == ObjectType.Point)
                {
                    // The Instance Reference node is exported as an empty actor under which we create the instanced block.
                    // Export points as empty actors as well.
                    ExportedActor = ParseEmptyActor(Node);
                }
                else if (CurrentObject.ObjectType == ObjectType.Light)
                {
                    ExportedActor = ParseLightActor(Node);
                }
                else if (SceneParser.ObjectIdToMeshInfoDictionary.TryGetValue(CurrentObject.Id, out DatasmithMeshInfo MeshInfo))
                {
                    // If the node's object has a mesh associated to it, export it as a MeshActor.
                    ExportedActor = ParseMeshActor(Node, SceneParser, MeshInfo);
                }
                else
                {
                    //#ueent_todo Log non-exported object in DatasmithExport UI (Writing to Rhino Console is extremely slow).
                }
            }
            else
            {
                // This node has no RhinoObject (likely a layer), export an empty Actor.
                ExportedActor = ParseEmptyActor(Node);
            }

            if (ExportedActor != null)
            {
                // Add common additional data to the actor, and add it to the hierarchy.
                Node.SetDatasmithActor(ExportedActor);
                AddTagsToDatasmithActor(ExportedActor, Node);
                AddMetadataToDatasmithActor(ExportedActor, Node, DatasmithScene);
                ExportedActor.SetLayer(GetDatasmithActorLayers(Node, SceneParser));

                AddActorToParent(ExportedActor, Node, DatasmithScene);
            }
        }
        private static FDatasmithFacadeActor ParseLightActor(RhinoSceneHierarchyNode InNode)
        {
            LightObject RhinoLightObject = InNode.Info.RhinoModelComponent as LightObject;

            FDatasmithFacadeActor ParsedDatasmithActor = SetupLightActor(InNode.Info, RhinoLightObject.LightGeometry);

            if (ParsedDatasmithActor != null)
            {
                float[] MatrixArray = InNode.Info.WorldTransform.ToFloatArray(false);
                ParsedDatasmithActor.SetWorldTransform(MatrixArray);
            }
            else
            {
                // #ueent_todo: Log non supported light type.
                ParsedDatasmithActor = ParseEmptyActor(InNode);
            }

            return(ParsedDatasmithActor);
        }
        private static FDatasmithFacadeActor ParseMeshActor(RhinoSceneHierarchyNode InNode, DatasmithRhinoSceneParser InSceneParser, DatasmithMeshInfo InMeshInfo)
        {
            string HashedActorName = FDatasmithFacadeActor.GetStringHash("A:" + InNode.Info.Name);
            FDatasmithFacadeActorMesh DatasmithActorMesh = new FDatasmithFacadeActorMesh(HashedActorName);

            DatasmithActorMesh.SetLabel(InNode.Info.Label);

            Transform OffsetTransform = Transform.Translation(InMeshInfo.PivotOffset);
            Transform WorldTransform  = Transform.Multiply(InNode.Info.WorldTransform, OffsetTransform);

            DatasmithActorMesh.SetWorldTransform(WorldTransform.ToFloatArray(false));

            string MeshName = FDatasmithFacadeElement.GetStringHash(InMeshInfo.Name);

            DatasmithActorMesh.SetMesh(MeshName);

            if (InNode.Info.bOverrideMaterial)
            {
                RhinoMaterialInfo MaterialInfo = InSceneParser.GetMaterialInfoFromMaterialIndex(InNode.Info.MaterialIndex);
                DatasmithActorMesh.AddMaterialOverride(MaterialInfo.Name, 0);
            }

            return(DatasmithActorMesh);
        }
        void ExportMetadata()
        {
            int DelayExport      = 2000;                // milliseconds
            int ExportBatchSize  = 1000;                // After each batch is exported, the process will wait for DelayExport and resume (unless cancelled)
            int CurrentBatchSize = 0;

            Func <FCachedDocumentData, bool> AddElements = (FCachedDocumentData CacheData) =>
            {
                while (CacheData.ElementsWithoutMetadata.Count > 0)
                {
                    if (CurrentBatchSize == ExportBatchSize)
                    {
                        // Add some delay before exporting next batch.
                        CurrentBatchSize = 0;

                        // Send metadata to DirectLink.
                        DatasmithScene.BuildScene(SceneName);
                        DatasmithDirectLink.UpdateScene(DatasmithScene);

                        MetadataEvent.WaitOne(DelayExport);
                    }

                    if (MetadataCancelToken.IsCancellationRequested)
                    {
                        return(false);
                    }

                    var Entry = CacheData.ElementsWithoutMetadata.Dequeue();

                    // Handle the case where element might be deleted in the main export path.
                    if (!CacheData.CachedElements.ContainsKey(Entry.Key))
                    {
                        continue;
                    }

                    Element RevitElement = CacheData.SourceDocument.GetElement(Entry.Key);

                    if (RevitElement == null)
                    {
                        continue;
                    }

                    FDocumentData.FBaseElementData ElementData = Entry.Value;
                    FDatasmithFacadeActor          Actor       = ElementData.ElementActor;

                    ElementData.ElementMetaData = new FDatasmithFacadeMetaData(Actor.GetName() + "_DATA");
                    ElementData.ElementMetaData.SetLabel(Actor.GetLabel());
                    ElementData.ElementMetaData.SetAssociatedElement(Actor);

                    FDocumentData.AddActorMetadata(RevitElement, ElementData.ElementMetaData);

                    ++CurrentBatchSize;

#if DEBUG
                    Debug.WriteLine($"metadata batch element {CurrentBatchSize}, remain in Q {CacheData.ElementsWithoutMetadata.Count}");
#endif
                }

                return(true);
            };

            List <FCachedDocumentData> CachesToExport = new List <FCachedDocumentData>();

            Action <FCachedDocumentData> GetLinkedDocuments = null;

            GetLinkedDocuments = (FCachedDocumentData InParent) =>
            {
                CachesToExport.Add(InParent);
                foreach (var Cache in InParent.LinkedDocumentsCache.Values)
                {
                    GetLinkedDocuments(Cache);
                }
            };

            GetLinkedDocuments(RootCache);

            foreach (var Cache in CachesToExport)
            {
                bool Success = AddElements(Cache);
                if (!Success)
                {
#if DEBUG
                    Debug.WriteLine("metadata cancelled");
#endif
                    return;                     // Metadata export was cancelled.
                }
            }

            if (CurrentBatchSize > 0)
            {
                // Send remaining chunk of metadata.
                DatasmithScene.BuildScene(SceneName);
                DatasmithDirectLink.UpdateScene(DatasmithScene);
            }

#if DEBUG
            Debug.WriteLine("metadata exported");
#endif
        }
 internal static global::System.Runtime.InteropServices.HandleRef getCPtr(FDatasmithFacadeActor obj)
 {
     return((obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr);
 }
 public void AddChild(FDatasmithFacadeActor InChildActorPtr)
 {
     DatasmithFacadeCSharpPINVOKE.FDatasmithFacadeActor_AddChild(swigCPtr, FDatasmithFacadeActor.getCPtrAndDisown(InChildActorPtr));
 }
 public void AddActor(FDatasmithFacadeActor InActorPtr)
 {
     DatasmithFacadeCSharpPINVOKE.FDatasmithFacadeScene_AddActor(swigCPtr, FDatasmithFacadeActor.getCPtr(InActorPtr));
 }
 public void RemoveActor(FDatasmithFacadeActor InActorPtr)
 {
     DatasmithFacadeCSharpPINVOKE.FDatasmithFacadeScene_RemoveActor__SWIG_1(swigCPtr, FDatasmithFacadeActor.getCPtr(InActorPtr));
 }
 public void RemoveActor(FDatasmithFacadeActor InActorPtr, FDatasmithFacadeScene.EActorRemovalRule RemovalRule)
 {
     DatasmithFacadeCSharpPINVOKE.FDatasmithFacadeScene_RemoveActor__SWIG_0(swigCPtr, FDatasmithFacadeActor.getCPtr(InActorPtr), (int)RemovalRule);
 }
Example #15
0
 public void RemoveChild(FDatasmithFacadeActor InChild)
 {
     DatasmithFacadeCSharpPINVOKE.FDatasmithFacadeActor_RemoveChild(swigCPtr, FDatasmithFacadeActor.getCPtr(InChild));
 }