Esempio n. 1
0
        internal WatchViewModel ProcessThing(MirrorData data, string tag, bool showRawData)
        {
            if (data.IsCollection)
            {
                var list = data.GetElements();

                var node = new WatchViewModel(visualizationManager, list.Count == 0 ? "Empty List" : "List", tag, true);
                foreach (var e in list.Select((element, idx) => new { element, idx }))
                {
                    node.Children.Add(ProcessThing(e.element, tag + ":" + e.idx, showRawData));
                }

                return node;
            }
            
            // MAGN-3494: If "data.Data" is null, then return a "null" string 
            // representation instead of casting it as dynamic (that leads to 
            // a crash).
            if (data.IsNull || data.Data == null)
                return new WatchViewModel(visualizationManager, NULL_STRING, tag);

            //If the input data is an instance of a class, create a watch node
            //with the class name and let WatchHandler process the underlying CLR data
            var classMirror = data.Class;
            if (null != classMirror)
            {
                if (data.Data == null && !data.IsNull) //Must be a DS Class instance.
                    return ProcessThing(classMirror.ClassName, tag, showRawData); //just show the class name.
                return Process(data.Data, tag, showRawData);
            }

            //Finally for all else get the string representation of data as watch content.
            return Process(data.Data, tag, showRawData);
        }
Esempio n. 2
0
        private static void GetGraphicItemsFromMirrorData(MirrorData mirrorData, List <IGraphicItem> graphicItems)
        {
            if (mirrorData == null)
            {
                return;
            }

            if (mirrorData.IsCollection)
            {
                foreach (var el in mirrorData.GetElements())
                {
                    GetGraphicItemsFromMirrorData(el, graphicItems);
                }
            }
            else
            {
                var graphicItem = mirrorData.Data as IGraphicItem;
                if (graphicItem == null)
                {
                    return;
                }

                graphicItems.Add(graphicItem);
            }
        }
Esempio n. 3
0
        /// <summary>
        /// Convert mirror data objects for nodes to Revit types.
        /// </summary>
        /// <param name="data"></param>
        /// <param name="geoms"></param>
        private void RevitGeometryFromMirrorData(MirrorData data, ref List <GeometryObject> geoms)
        {
            if (data.IsCollection)
            {
                foreach (var md in data.GetElements())
                {
                    try
                    {
                        RevitGeometryFromMirrorData(md, ref geoms);
                    }
                    catch (Exception ex)
                    {
                        this.dynamoModel.Logger.Log(ex.Message);
                    }
                }
            }
            else
            {
                try
                {
                    var geom = data.Data as PolyCurve;
                    if (geom != null)
                    {
                        // We extract the curves explicitly rather than using PolyCurve's ToRevitType
                        // extension method.  There is a potential issue with CurveLoop which causes
                        // this method to introduce corrupt GNodes.
                        foreach (var c in geom.Curves())
                        {
                            // Tesselate the curve.  This greatly improves performance when
                            // we're dealing with NurbsCurve's with high knot count, commonly
                            // results of surf-surf intersections.
                            Tesselate(c, ref geoms);
                        }

                        return;
                    }

                    var point = data.Data as Point;
                    if (point != null)
                    {
                        geoms.Add(DocumentManager.Instance.CurrentUIApplication.Application.Create.NewPoint(point.ToXyz()));
                        return;
                    }

                    var curve = data.Data as Curve;
                    if (curve != null)
                    {
                        // Tesselate the curve.  This greatly improves performance when
                        // we're dealing with NurbsCurve's with high knot count, commonly
                        // results of surf-surf intersections.
                        Tesselate(curve, ref geoms);
                        return;
                    }
                }
                catch (Exception ex)
                {
                    this.dynamoModel.Logger.Log(ex.Message);
                }
            }
        }
Esempio n. 4
0
        private void GetRenderPackagesFromMirrorDataImp(
            Guid outputPortId,
            MirrorData mirrorData,
            IRenderPackage package,
            string labelKey)
        {
            if (mirrorData.IsCollection)
            {
                int count = 0;
                foreach (var el in mirrorData.GetElements())
                {
                    if (el.IsCollection || el.Data is IGraphicItem)
                    {
                        string newLabel = labelKey + ":" + count;
                        GetRenderPackagesFromMirrorDataImp(outputPortId, el, package, newLabel);
                    }
                    count += 1;
                }
            }
            else
            {
                if (!(mirrorData.Data is IGraphicItem graphicItem))
                {
                    return;
                }

                GetTessellationDataFromGraphicItem(outputPortId, graphicItem, labelKey, ref package);
            }
        }
Esempio n. 5
0
        public List <Autodesk.DesignScript.Geometry.Mesh> GetMeshes(MirrorData mirrorData)
        {
            List <Autodesk.DesignScript.Geometry.Mesh> meshes = new List <Autodesk.DesignScript.Geometry.Mesh>();

            if (mirrorData.IsCollection)
            {
                IEnumerable <MirrorData> dataList = mirrorData.GetElements();
                foreach (MirrorData md in dataList)
                {
                    if (md.IsCollection)
                    {
                        meshes.AddRange(GetMeshes(md));
                    }
                    else
                    {
                        Autodesk.DesignScript.Geometry.Mesh m = md.Data as Autodesk.DesignScript.Geometry.Mesh;
                        if (m != null)
                        {
                            meshes.Add(m);
                        }
                    }
                }
            }
            else
            {
                Autodesk.DesignScript.Geometry.Mesh m = mirrorData.Data as Autodesk.DesignScript.Geometry.Mesh;
                if (m != null)
                {
                    meshes.Add(m);
                }
            }

            return(meshes);
        }
Esempio n. 6
0
        /// <summary>
        /// Update the watch content from the given MirrorData and returns WatchNode.
        /// </summary>
        /// <param name="data">The Mirror data for which watch content is needed.</param>
        /// <param name="prefix">Prefix string used for formatting the content.</param>
        /// <param name="index">Index of input data if it is a part of a collection.</param>
        /// <param name="isListMember">Specifies if this data belongs to a collection.</param>
        /// <returns>WatchNode</returns>
        public WatchViewModel Process(MirrorData data, string path, bool showRawData = true)
        {
            WatchViewModel node = null;

            if (data == null || data.IsNull)
            {
                node = new WatchViewModel(nullString, path);
            }
            else if (data.IsCollection)
            {
                var list = data.GetElements();

                node = new WatchViewModel(list.Count == 0 ? "Empty List" : "List", path, true);

                foreach (var e in list.Select((x, i) => new { Element = x, Index = i }))
                {
                    node.Children.Add(Process(e.Element, path + ":" + e.Index, showRawData));
                }
            }
            else
            {
                node = dynSettings.Controller.WatchHandler.Process(data as dynamic, path, showRawData);
            }

            return(node ?? (new WatchViewModel("null", path)));
        }
Esempio n. 7
0
 private static T[] Unwrap <T>(MirrorData data)
 {
     if (data?.IsCollection ?? false)
     {
         return(data.GetElements().SelectMany(e =>
         {
             if (e.IsCollection)
             {
                 return Unwrap <T>(e);
             }
             else if (e.Data is T obj)
             {
                 return new T[] { obj }
             }
             ;
             else
             {
                 return new T[] { }
             };
         }).ToArray());
     }
     else if (data?.Data is T obj)
     {
         return new T[] { obj }
     }
     ;
     else
     {
         return new T[] { }
     };
 }
Esempio n. 8
0
 private static AstValue <T>[] UnwrapAstValue <T>(MirrorData data, IdentifierNode idn, params long[] indexes)
 {
     if (data?.IsCollection ?? false)
     {
         return(data.GetElements().SelectMany((e, index) =>
         {
             if (e.IsCollection)
             {
                 return UnwrapAstValue <T>(e, idn, indexes.Concat(new long[] { index }).ToArray());
             }
             else if (e.Data is T obj)
             {
                 return new AstValue <T>[] { new AstValue <T>(idn.Name, obj, indexes.Concat(new long[] { index }).ToArray()) }
             }
             ;
             else
             {
                 return new AstValue <T>[] { }
             };
         }).ToArray());
     }
     else if (data?.Data is T obj)
     {
         return new AstValue <T>[] { new AstValue <T>(idn.Name, obj) }
     }
     ;
     else
     {
         return new AstValue <T>[] { }
     };
 }
Esempio n. 9
0
        private WatchViewModel ProcessThing(MirrorData data, ProtoCore.RuntimeCore runtimeCore, string tag, bool showRawData, WatchHandlerCallback callback)
        {
            if (data.IsCollection)
            {
                var list = data.GetElements();

                var node = new WatchViewModel(!list.Any() ? WatchViewModel.EMPTY_LIST : WatchViewModel.LIST, tag, RequestSelectGeometry, true);
                foreach (var e in list.Select((element, idx) => new { element, idx }))
                {
                    node.Children.Add(ProcessThing(e.element, runtimeCore, tag + ":" + e.idx, showRawData, callback));
                }

                return(node);
            }
            else if (data.IsPointer && data.Data is DesignScript.Builtin.Dictionary)
            {
                var dict   = data.Data as DesignScript.Builtin.Dictionary;
                var keys   = dict.Keys;
                var values = dict.Values;

                var node = new WatchViewModel(keys.Any() ? WatchViewModel.DICTIONARY : WatchViewModel.EMPTY_DICTIONARY, tag, RequestSelectGeometry, true);

                foreach (var e in keys.Zip(values, (key, value) => new { key, value }))
                {
                    node.Children.Add(ProcessThing(e.value, runtimeCore, tag + ":" + e.key.ToString(), showRawData, callback));
                }

                return(node);
            }

            if (data.Data is Enum)
            {
                return(new WatchViewModel(((Enum)data.Data).GetDescription(), tag, RequestSelectGeometry));
            }

            if (data.Data == null)
            {
                // MAGN-3494: If "data.Data" is null, then return a "null" string
                // representation instead of casting it as dynamic (that leads to
                // a crash).
                if (data.IsNull)
                {
                    return(new WatchViewModel(Resources.NullString, tag, RequestSelectGeometry));
                }

                //If the input data is an instance of a class, create a watch node
                //with the class name and let WatchHandler process the underlying CLR data
                var classMirror = data.Class;
                if (null != classMirror)
                {
                    //just show the class name.
                    return(ProcessThing(classMirror.ClassName, runtimeCore, tag, showRawData, callback));
                }
            }

            //Finally for all else get the string representation of data as watch content.
            return(callback(data.Data, runtimeCore, tag, showRawData));
        }
Esempio n. 10
0
        private void AssertCollection(MirrorData data, IEnumerable collection)
        {
            Assert.IsTrue(data.IsCollection);
            List <MirrorData> elements = data.GetElements().ToList();
            int i = 0;

            foreach (var item in collection)
            {
                AssertValue(elements[i++], item);
            }
        }
Esempio n. 11
0
        /// <summary>
        /// Counts the number of all collection items of node output and if specified
        /// it generates appropriate view model for compact preview bubble
        /// </summary>
        /// <param name="mirrorData">Data which represents the value of node output</param>
        /// <param name="generateViewModel">Flag to not create unused view models</param>
        /// <returns><cref name="CompactBubbleViewModel"/> instance
        /// if <paramref name="generateViewModel"/> is specified. Otherwise, null</returns>
        private static CompactBubbleViewModel ProcessThing(MirrorData mirrorData, bool generateViewModel)
        {
            if (mirrorData == null)
            {
                return(generateViewModel ? new CompactBubbleViewModel(Resources.NullString, 0) : null);
            }

            if (mirrorData.IsCollection)
            {
                var list = mirrorData.GetElements();

                foreach (var item in list)
                {
                    ProcessThing(item, false);
                }

                return(generateViewModel
                    ? new CompactBubbleViewModel(true)
                {
                    NodeLabel = list.Any() ? WatchViewModel.LIST : WatchViewModel.EMPTY_LIST
                }
                    : null);
            }

            items++;

            if (!generateViewModel)
            {
                return(null);
            }

            var viewModel = new CompactBubbleViewModel(false);

            if (mirrorData.Data == null && !mirrorData.IsNull && mirrorData.Class != null)
            {
                viewModel.NodeLabel = mirrorData.Class.ClassName;
            }
            else if (mirrorData.Data is Enum)
            {
                viewModel.NodeLabel = ((Enum)mirrorData.Data).GetDescription();
            }
            else
            {
                // Cut StringData so that only the type name remains
                // for example, "Point (Z = 0.000, Y = 0.000, Z = 0.000)" -> "Point"
                viewModel.NodeLabel = string.IsNullOrEmpty(mirrorData.StringData)
                    ? string.Empty
                    : mirrorData.StringData.Split('(')[0];
            }

            return(viewModel);
        }
Esempio n. 12
0
        private void SelectivelyAssertValues(MirrorData data, Dictionary <int, object> selectedValues)
        {
            Assert.IsTrue(data.IsCollection);

            if (data.IsCollection)
            {
                List <MirrorData> elements = data.GetElements().ToList();
                foreach (var pair in selectedValues)
                {
                    AssertValue(elements[pair.Key], pair.Value);
                }
            }
        }
Esempio n. 13
0
 /// <summary>
 /// Validates the watch content with given mirror data.
 /// </summary>
 /// <param name="watch">WatchViewModel of the watch node</param>
 /// <param name="mirrorData">MirrorData to be shown in watch</param>
 private void AssertWatchContent(WatchViewModel watch, MirrorData mirrorData)
 {
     Assert.IsNotNull(mirrorData);
     if (mirrorData.IsCollection)
         AssertWatchTreeBranchContent(watch.Children, mirrorData.GetElements());
     else if (mirrorData.IsNull)
         Assert.AreEqual("null", watch.NodeLabel);
     else
     {
         string nodeLabel = string.Format("{0}", mirrorData.Data);
         Assert.AreEqual(nodeLabel, watch.NodeLabel);
     }
 }
Esempio n. 14
0
        /// <summary>
        /// Counts the number of all collection items of node output and if specified 
        /// it generates appropriate view model for compact preview bubble
        /// </summary>
        /// <param name="mirrorData">Data which represents the value of node output</param>
        /// <param name="generateViewModel">Flag to not create unused view models</param>
        /// <returns><cref name="CompactBubbleViewModel"/> instance 
        /// if <paramref name="generateViewModel"/> is specified. Otherwise, null</returns>
        private static CompactBubbleViewModel ProcessThing(MirrorData mirrorData, bool generateViewModel)
        {
            if (mirrorData == null)
            {
                return generateViewModel ? new CompactBubbleViewModel(Resources.NullString, 0) : null;
            }

            if (mirrorData.IsCollection)
            {
                var list = mirrorData.GetElements();

                foreach (var item in list)
                {
                    ProcessThing(item, false);
                }

                return generateViewModel
                    ? new CompactBubbleViewModel(true)
                    {
                        NodeLabel = list.Any() ? "List" : "Empty List"
                    }
                    : null;
            }

            items++;

            if (!generateViewModel) return null;

            var viewModel = new CompactBubbleViewModel(false);
            if (mirrorData.Data == null && !mirrorData.IsNull && mirrorData.Class != null)
            {
                viewModel.NodeLabel = mirrorData.Class.ClassName;
            }
            else if (mirrorData.Data is Enum)
            {
                viewModel.NodeLabel = ((Enum)mirrorData.Data).GetDescription();
            }
            else
            {
                // Cut StringData so that only the type name remains
                // for example, "Point (Z = 0.000, Y = 0.000, Z = 0.000)" -> "Point"
                viewModel.NodeLabel = string.IsNullOrEmpty(mirrorData.StringData)
                    ? string.Empty
                    : mirrorData.StringData.Split('(')[0];
            }

            return viewModel;
        }
        /// <summary>
        /// Convert mirror data objects for nodes to Revit types.
        /// </summary>
        /// <param name="data"></param>
        /// <param name="geoms"></param>
        private void RevitGeometryFromMirrorData(MirrorData data, ref List <GeometryObject> geoms)
        {
            if (data.IsCollection)
            {
                foreach (var md in data.GetElements())
                {
                    try
                    {
                        RevitGeometryFromMirrorData(md, ref geoms);
                    }
                    catch (Exception ex)
                    {
                        this.dynamoModel.Logger.Log(ex.Message);
                    }
                }
            }
            else
            {
                try
                {
                    var geom = data.Data as PolyCurve;
                    if (geom != null)
                    {
                        geoms.AddRange(geom.ToRevitType());
                        return;
                    }

                    var point = data.Data as Point;
                    if (point != null)
                    {
                        geoms.Add(DocumentManager.Instance.CurrentUIApplication.Application.Create.NewPoint(point.ToXyz()));
                        return;
                    }

                    var curve = data.Data as Curve;
                    if (curve != null)
                    {
                        geoms.Add(curve.ToRevitType());
                        return;
                    }
                }
                catch (Exception ex)
                {
                    this.dynamoModel.Logger.Log(ex.Message);
                }
            }
        }
Esempio n. 16
0
 /// <summary>
 /// Validates the watch content with given mirror data.
 /// </summary>
 /// <param name="watch">WatchViewModel of the watch node</param>
 /// <param name="mirrorData">MirrorData to be shown in watch</param>
 private void AssertWatchContent(WatchViewModel watch, MirrorData mirrorData)
 {
     Assert.IsNotNull(mirrorData);
     if (mirrorData.IsCollection)
     {
         AssertWatchTreeBranchContent(watch.Children, mirrorData.GetElements());
     }
     else if (mirrorData.IsNull)
     {
         Assert.AreEqual("null", watch.NodeLabel);
     }
     else
     {
         string nodeLabel = string.Format("{0}", mirrorData.Data);
         Assert.AreEqual(nodeLabel, watch.NodeLabel);
     }
 }
Esempio n. 17
0
        private void GetRenderPackagesFromMirrorData(MirrorData mirrorData, ref List <string> labelMap, ref int count)
        {
            if (mirrorData.IsNull)
            {
                return;
            }

            if (mirrorData.IsCollection)
            {
                foreach (var el in mirrorData.GetElements())
                {
                    GetRenderPackagesFromMirrorData(el, ref labelMap, ref count);
                }
            }
            else
            {
                var graphicItem = mirrorData.Data as IGraphicItem;
                if (graphicItem == null)
                {
                    return;
                }

                var package = new RenderPackage(isNodeSelected, displayLabels)
                {
                    Tag = labelMap.Count > count ? labelMap[count] : "?",
                };

                try
                {
                    graphicItem.Tessellate(
                        package,
                        tol: -1.0,
                        maxGridLines: maxTesselationDivisions);
                }
                catch (Exception e)
                {
                    System.Diagnostics.Debug.WriteLine(
                        "PushGraphicItemIntoPackage: " + e);
                }

                package.ItemsCount++;
                renderPackages.Add(package);
                count++;
            }
        }
Esempio n. 18
0
        private WatchViewModel ProcessThing(MirrorData data, ProtoCore.RuntimeCore runtimeCore, string tag, bool showRawData, WatchHandlerCallback callback)
        {
            if (data.IsCollection)
            {
                var list = data.GetElements();

                var node = new WatchViewModel(list.Count == 0 ? "Empty List" : "List", tag, true);
                foreach (var e in list.Select((element, idx) => new { element, idx }))
                {
                    node.Children.Add(ProcessThing(e.element, runtimeCore, tag + ":" + e.idx, showRawData, callback));
                }

                return(node);
            }
            if (data.Data is Enum)
            {
                return(new WatchViewModel(((Enum)data.Data).GetDescription(), tag));
            }

            if (data.Data == null)
            {
                // MAGN-3494: If "data.Data" is null, then return a "null" string
                // representation instead of casting it as dynamic (that leads to
                // a crash).
                if (data.IsNull)
                {
                    return(new WatchViewModel(NULL_STRING, tag));
                }

                //If the input data is an instance of a class, create a watch node
                //with the class name and let WatchHandler process the underlying CLR data
                var classMirror = data.Class;
                if (null != classMirror)
                {
                    //just show the class name.
                    return(ProcessThing(classMirror.ClassName, runtimeCore, tag, showRawData, callback));
                }
            }

            //Finally for all else get the string representation of data as watch content.
            return(callback(data.Data, runtimeCore, tag, showRawData));
        }
Esempio n. 19
0
        private static bool IsNodeNull(MirrorData data)
        {
            if (data == null || data.IsNull)
            {
                return(true);
            }

            if (data.IsCollection)
            {
                var elements = data.GetElements();
                foreach (var element in elements)
                {
                    if (IsNodeNull(element))
                    {
                        return(true);
                    }
                }
            }

            return(false);
        }
 // Add labels for each of a mirror data object's inner data object to a label map.
 private static void AddToLabelMap(MirrorData data, List <string> map, string tag)
 {
     if (data.IsCollection)
     {
         var index    = 0;
         var elements = data.GetElements();
         foreach (var element in elements)
         {
             var newTag = string.Format("{0}:{1}", tag, index++);
             AddToLabelMap(element, map, newTag);
         }
     }
     else if (data.Data is IEnumerable)
     {
         AddToLabelMap(data.Data as IEnumerable, map, tag);
     }
     else
     {
         map.Add(tag);
     }
 }
Esempio n. 21
0
        public void CanGetWorksheets()
        {
            string openPath = Path.Combine(GetTestDirectory(), @"core\excel\WorksheetsFromFile.dyn");

            ViewModel.OpenCommand.Execute(openPath);

            var filename = ViewModel.Model.CurrentWorkspace.FirstNodeFromWorkspace <DSCore.File.Filename>();

            // remap the filename as Excel requires an absolute path
            filename.Value = filename.Value.Replace(@"..\..\..\test", GetTestDirectory());

            var watch = ViewModel.Model.CurrentWorkspace.GetDSFunctionNodeFromWorkspace("Excel.GetWorksheetsFromExcelWorkbook");

            ViewModel.HomeSpace.Run();

            MirrorData mirror = watch.CachedValue;

            Assert.IsTrue(mirror.IsCollection);

            Assert.AreEqual(3, mirror.GetElements().Count);
        }
Esempio n. 22
0
        /// <summary>
        /// Helper method to get all items from mirror data as flat list recursively.
        /// </summary>
        /// <param name="data">Input data</param>
        /// <returns>List of objects</returns>
        protected static IEnumerable <object> GetElementsFromMirrorData(MirrorData data)
        {
            if (data == null || data.IsNull)
            {
                yield return(null);
            }

            if (data.IsCollection)
            {
                var elems = data.GetElements();
                foreach (var item in elems)
                {
                    var objs = GetElementsFromMirrorData(item);
                    foreach (var obj in objs)
                    {
                        yield return(obj);
                    }
                }
            }

            yield return(data.Data);
        }
Esempio n. 23
0
        internal WatchViewModel ProcessThing(MirrorData data, string tag, bool showRawData)
        {
            if (data.IsCollection)
            {
                var list = data.GetElements();

                var node = new WatchViewModel(visualizationManager, list.Count == 0 ? "Empty List" : "List", tag, true);
                foreach (var e in list.Select((element, idx) => new { element, idx }))
                {
                    node.Children.Add(ProcessThing(e.element, tag + ":" + e.idx, showRawData));
                }

                return(node);
            }

            // MAGN-3494: If "data.Data" is null, then return a "null" string
            // representation instead of casting it as dynamic (that leads to
            // a crash).
            if (data.IsNull || data.Data == null)
            {
                return(new WatchViewModel(visualizationManager, NULL_STRING, tag));
            }

            //If the input data is an instance of a class, create a watch node
            //with the class name and let WatchHandler process the underlying CLR data
            var classMirror = data.Class;

            if (null != classMirror)
            {
                if (data.Data == null && !data.IsNull)                             //Must be a DS Class instance.
                {
                    return(ProcessThing(classMirror.ClassName, tag, showRawData)); //just show the class name.
                }
                return(Process(data.Data, tag, showRawData));
            }

            //Finally for all else get the string representation of data as watch content.
            return(Process(data.Data, tag, showRawData));
        }
Esempio n. 24
0
 private void AssertMirrorData(MirrorData data1, MirrorData data2)
 {
     if (data1.IsNull)
     {
         Assert.True(data2.IsNull);
     }
     else if (data1.IsCollection)
     {
         Assert.True(data2.IsCollection);
         List <MirrorData> elems1 = data1.GetElements().ToList();
         List <MirrorData> elems2 = data2.GetElements().ToList();
         Assert.AreEqual(elems1.Count, elems2.Count);
         int i = 0;
         foreach (var item in elems1)
         {
             AssertMirrorData(item, elems2[i++]);
         }
     }
     else
     {
         Assert.AreEqual(data1.Data, data2.Data);
     }
 }
Esempio n. 25
0
        private static void GetGraphicItemsFromMirrorData(MirrorData mirrorData, List<IGraphicItem> graphicItems)
        {
            if (mirrorData == null) return;

            if (mirrorData.IsCollection)
            {
                foreach (var el in mirrorData.GetElements())
                {
                    GetGraphicItemsFromMirrorData(el, graphicItems);
                }
            }
            else
            {
                var graphicItem = mirrorData.Data as IGraphicItem;
                if (graphicItem == null) return;

                graphicItems.Add(graphicItem);
            }
        }
Esempio n. 26
0
        private void SelectivelyAssertValues(MirrorData data, Dictionary<int, object> selectedValues)
        {
            Assert.IsTrue(data.IsCollection);

            if (data.IsCollection)
            {
                List<MirrorData> elements = data.GetElements();
                foreach (var pair in selectedValues)
                {
                    AssertValue(elements[pair.Key], pair.Value);
                }
            }
        }
Esempio n. 27
0
        /// <summary>
        /// Helper method to get all items from mirror data as flat list recursively.
        /// </summary>
        /// <param name="data">Input data</param>
        /// <returns>List of objects</returns>
        protected static IEnumerable<object> GetElementsFromMirrorData(MirrorData data)
        {
            if (data == null || data.IsNull)
                yield return null;

            if (data.IsCollection)
            {
                var elems = data.GetElements();
                foreach (var item in elems)
                {
                    var objs = GetElementsFromMirrorData(item);
                    foreach (var obj in objs)
                    {
                        yield return obj;
                    }
                }
            }

            yield return data.Data;
        }
Esempio n. 28
0
        /// <summary>
        /// Convert mirror data objects for nodes to Revit types.
        /// </summary>
        /// <param name="data"></param>
        /// <param name="geoms"></param>
        private void RevitGeometryFromMirrorData(MirrorData data, ref List<GeometryObject> geoms)
        {
            if (data.IsCollection)
            {
                foreach (var md in data.GetElements())
                {
                    try
                    {
                        RevitGeometryFromMirrorData(md, ref geoms);
                    }
                    catch (Exception ex)
                    {
                        this.dynamoModel.Logger.Log(ex.Message);
                    }
                }
            }
            else
            {
                try
                {
                    var geom = data.Data as PolyCurve;
                    if (geom != null)
                    {
                        geoms.AddRange(geom.ToRevitType());
                        return;
                    }

                    var point = data.Data as Point;
                    if (point != null)
                    {
                        geoms.Add(DocumentManager.Instance.CurrentUIApplication.Application.Create.NewPoint(point.ToXyz()));
                        return;
                    }

                    var curve = data.Data as Curve;
                    if (curve != null)
                    {
                        geoms.Add(curve.ToRevitType());
                        return;
                    }
                }
                catch (Exception ex)
                {
                    this.dynamoModel.Logger.Log(ex.Message);
                }
            }
        }
Esempio n. 29
0
        private void GetRenderPackagesFromMirrorData(MirrorData mirrorData, string tag, bool displayLabels, bool isNodeSelectednt)
        {
            if (mirrorData.IsNull)
            {
                return;
            }

            if (mirrorData.IsCollection)
            {
                int count = 0;
                foreach (var el in mirrorData.GetElements())
                {
                    if (el.IsCollection || el.Data is IGraphicItem)
                    {
                        string newTag = tag + ":" + count;
                        GetRenderPackagesFromMirrorData(el, newTag, displayLabels, isNodeSelected);
                    }
                    count = count + 1;
                }
            }
            else
            {
                var graphicItem = mirrorData.Data as IGraphicItem;
                if (graphicItem == null)
                {
                    return;
                }

                var package = factory.CreateRenderPackage();
                var packageWithTransform = package as ITransformable;
                package.Description = tag;

                try
                {
                    graphicItem.Tessellate(package, factory.TessellationParameters);
                    if (package.MeshVertexColors.Count() > 0)
                    {
                        package.RequiresPerVertexColoration = true;
                    }

                    //If the package has a transform that is not the identity matrix
                    //then set requiresCustomTransform to true.
                    if (packageWithTransform != null && packageWithTransform.Transform.SequenceEqual(
                            new double[] { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 }) == false)
                    {
                        (packageWithTransform).RequiresCustomTransform = true;
                    }

                    if (factory.TessellationParameters.ShowEdges)
                    {
                        var topology = graphicItem as Topology;
                        if (topology != null)
                        {
                            var surf = graphicItem as Surface;
                            if (surf != null)
                            {
                                foreach (var curve in surf.PerimeterCurves())
                                {
                                    curve.Tessellate(package, factory.TessellationParameters);
                                    curve.Dispose();
                                }
                            }
                            else
                            {
                                var edges = topology.Edges;
                                foreach (var geom in edges.Select(edge => edge.CurveGeometry))
                                {
                                    geom.Tessellate(package, factory.TessellationParameters);
                                    geom.Dispose();
                                }
                                edges.ForEach(x => x.Dispose());
                            }
                        }
                    }

                    var plane = graphicItem as Plane;
                    if (plane != null)
                    {
                        package.RequiresPerVertexColoration = true;

                        var s = 2.5;

                        var cs = CoordinateSystem.ByPlane(plane);
                        var a  = Point.ByCartesianCoordinates(cs, s, s, 0);
                        var b  = Point.ByCartesianCoordinates(cs, -s, s, 0);
                        var c  = Point.ByCartesianCoordinates(cs, -s, -s, 0);
                        var d  = Point.ByCartesianCoordinates(cs, s, -s, 0);

                        // Get rid of the original plane geometry.
                        package.Clear();

                        package.AddTriangleVertex(a.X, a.Y, a.Z);
                        package.AddTriangleVertex(b.X, b.Y, b.Z);
                        package.AddTriangleVertex(c.X, c.Y, c.Z);

                        package.AddTriangleVertex(c.X, c.Y, c.Z);
                        package.AddTriangleVertex(d.X, d.Y, d.Z);
                        package.AddTriangleVertex(a.X, a.Y, a.Z);

                        package.AddTriangleVertexUV(0, 0);
                        package.AddTriangleVertexUV(0, 0);
                        package.AddTriangleVertexUV(0, 0);
                        package.AddTriangleVertexUV(0, 0);
                        package.AddTriangleVertexUV(0, 0);
                        package.AddTriangleVertexUV(0, 0);

                        // Draw plane edges
                        package.AddLineStripVertex(a.X, a.Y, a.Z);
                        package.AddLineStripVertex(b.X, b.Y, b.Z);
                        package.AddLineStripVertex(b.X, b.Y, b.Z);
                        package.AddLineStripVertex(c.X, c.Y, c.Z);
                        package.AddLineStripVertex(c.X, c.Y, c.Z);
                        package.AddLineStripVertex(d.X, d.Y, d.Z);
                        package.AddLineStripVertex(d.X, d.Y, d.Z);
                        package.AddLineStripVertex(a.X, a.Y, a.Z);

                        // Draw normal
                        package.AddLineStripVertex(plane.Origin.X, plane.Origin.Y, plane.Origin.Z);
                        var nEnd = plane.Origin.Add(plane.Normal.Scale(2.5));
                        package.AddLineStripVertex(nEnd.X, nEnd.Y, nEnd.Z);

                        for (var i = 0; i < package.LineVertexCount / 2; i++)
                        {
                            package.AddLineStripVertexCount(2);
                        }

                        for (var i = 0; i < package.LineVertexCount; i++)
                        {
                            package.AddLineStripVertexColor(MidTone, MidTone, MidTone, 255);
                        }

                        for (var i = 0; i < package.MeshVertexCount; i++)
                        {
                            package.AddTriangleVertexNormal(plane.Normal.X, plane.Normal.Y, plane.Normal.Z);
                        }

                        for (var i = 0; i < package.MeshVertexCount; i++)
                        {
                            package.AddTriangleVertexColor(0, 0, 0, 10);
                        }
                    }

                    // The default color coming from the geometry library for
                    // curves is 255,255,255,255 (White). Because we want a default
                    // color of 0,0,0,255 (Black), we adjust the color components here.
                    if (graphicItem is Curve || graphicItem is Surface || graphicItem is Solid || graphicItem is Point)
                    {
                        if (package.LineVertexCount > 0 && package.LineStripVertexColors.Count() <= 0)
                        {
                            package.ApplyLineVertexColors(CreateColorByteArrayOfSize(package.LineVertexCount, DefR, DefG, DefB, DefA));
                        }

                        if (package.PointVertexCount > 0 && package.PointVertexColors.Count() <= 0)
                        {
                            package.ApplyPointVertexColors(CreateColorByteArrayOfSize(package.PointVertexCount, DefR, DefG, DefB, DefA));
                        }
                    }
                }
                catch (Exception e)
                {
                    Debug.WriteLine(
                        "PushGraphicItemIntoPackage: " + e);
                }

                package.DisplayLabels = displayLabels;
                package.IsSelected    = isNodeSelected;

                renderPackages.Add(package);
            }
        }
Esempio n. 30
0
        /// <summary>
        /// Update the watch content from the given MirrorData and returns WatchNode.
        /// </summary>
        /// <param name="data">The Mirror data for which watch content is needed.</param>
        /// <param name="prefix">Prefix string used for formatting the content.</param>
        /// <param name="index">Index of input data if it is a part of a collection.</param>
        /// <param name="isListMember">Specifies if this data belongs to a collection.</param>
        /// <returns>WatchNode</returns>
        public static WatchViewModel Process(MirrorData data, string path, bool showRawData = true)
        {
            WatchViewModel node = null;

            if (data == null || data.IsNull)
            {
                node = new WatchViewModel(nullString, path);
            }
            else if (data.IsCollection)
            {
                var list = data.GetElements();

                node = new WatchViewModel(list.Count == 0 ? "Empty List" : "List", path, true);

                foreach (var e in list.Select((x, i) => new { Element = x, Index = i }))
                {
                    node.Children.Add(Process(e.Element, path + ":" + e.Index, showRawData));
                }
            }
            else
            {
                node = dynSettings.Controller.WatchHandler.Process(data as dynamic, path, showRawData);
            }

            return node ?? (new WatchViewModel("null", path));
        }
 // Add labels for each of a mirror data object's inner data object to a label map.
 private static void AddToLabelMap(MirrorData data, List<string> map, string tag)
 {
     if (data.IsCollection)
     {
         var index = 0;
         var elements = data.GetElements();
         foreach (var element in elements)
         {
             var newTag = string.Format("{0}:{1}", tag, index++);
             AddToLabelMap(element, map, newTag);
         }
     }
     else if (data.Data is IEnumerable)
     {
         AddToLabelMap(data.Data as IEnumerable, map, tag);
     }
     else
     {
         map.Add(tag);
     }
 }
Esempio n. 32
0
        private void GetRenderPackagesFromMirrorData(MirrorData mirrorData, bool displayLabels, bool isNodeSelected, ref List<string> labelMap, ref int count)
        {
            if (mirrorData.IsNull)
            {
                return;
            }

            if (mirrorData.IsCollection)
            {
                foreach (var el in mirrorData.GetElements())
                {
                    GetRenderPackagesFromMirrorData(el, displayLabels, isNodeSelected, ref labelMap, ref count);
                }
            }
            else
            {
                var graphicItem = mirrorData.Data as IGraphicItem;
                if (graphicItem == null)
                {
                    return;
                }

                var package = factory.CreateRenderPackage();
                package.Description = labelMap.Count > count ? labelMap[count] : "?";

                try
                {
                    graphicItem.Tessellate(package, factory.TessellationParameters);

                    if (factory.TessellationParameters.ShowEdges)
                    {
                        var surf = graphicItem as Surface;
                        if (surf != null)
                        {
                            foreach (var curve in surf.PerimeterCurves())
                            {
                                curve.Tessellate(package, factory.TessellationParameters);
                                curve.Dispose();
                            }
                        }

                        var solid = graphicItem as Solid;
                        if (solid != null)
                        {
                            var edges = solid.Edges;
                            foreach (var geom in edges.Select(edge => edge.CurveGeometry))
                            {
                                geom.Tessellate(package, factory.TessellationParameters);
                                geom.Dispose();
                            }
                            edges.ForEach(x => x.Dispose());
                        }
                    }
                    
                    var plane = graphicItem as Plane;
                    if (plane != null)
                    {
                        package.RequiresPerVertexColoration = true;

                        var s = 2.5;

                        var cs = CoordinateSystem.ByPlane(plane);
                        var a = Point.ByCartesianCoordinates(cs, s, s, 0);
                        var b = Point.ByCartesianCoordinates(cs, -s, s, 0);
                        var c = Point.ByCartesianCoordinates(cs, -s, -s, 0);
                        var d = Point.ByCartesianCoordinates(cs, s, -s, 0);

                        // Get rid of the original plane geometry.
                        package.Clear();

                        package.AddTriangleVertex(a.X, a.Y, a.Z);
                        package.AddTriangleVertex(b.X, b.Y, b.Z);
                        package.AddTriangleVertex(c.X, c.Y, c.Z);

                        package.AddTriangleVertex(c.X, c.Y, c.Z);
                        package.AddTriangleVertex(d.X, d.Y, d.Z);
                        package.AddTriangleVertex(a.X, a.Y, a.Z);

                        package.AddTriangleVertexUV(0, 0);
                        package.AddTriangleVertexUV(0, 0);
                        package.AddTriangleVertexUV(0, 0);
                        package.AddTriangleVertexUV(0, 0);
                        package.AddTriangleVertexUV(0, 0);
                        package.AddTriangleVertexUV(0, 0);

                        // Draw plane edges
                        package.AddLineStripVertex(a.X, a.Y, a.Z);
                        package.AddLineStripVertex(b.X, b.Y, b.Z);
                        package.AddLineStripVertex(b.X, b.Y, b.Z);
                        package.AddLineStripVertex(c.X, c.Y, c.Z);
                        package.AddLineStripVertex(c.X, c.Y, c.Z);
                        package.AddLineStripVertex(d.X, d.Y, d.Z);
                        package.AddLineStripVertex(d.X, d.Y, d.Z);
                        package.AddLineStripVertex(a.X, a.Y, a.Z);

                        // Draw normal
                        package.AddLineStripVertex(plane.Origin.X, plane.Origin.Y, plane.Origin.Z);
                        var nEnd = plane.Origin.Add(plane.Normal.Scale(2.5));
                        package.AddLineStripVertex(nEnd.X, nEnd.Y, nEnd.Z);

                        for (var i = 0; i < package.LineVertexCount / 2; i++)
                        {
                            package.AddLineStripVertexCount(2);
                        }

                        for (var i = 0; i < package.LineVertexCount; i ++)
                        {
                            package.AddLineStripVertexColor(MidTone, MidTone, MidTone, 255);
                        }

                        for (var i = 0; i < package.MeshVertexCount; i++)
                        {
                            package.AddTriangleVertexNormal(plane.Normal.X, plane.Normal.Y, plane.Normal.Z);
                        }

                        for (var i = 0; i < package.MeshVertexCount; i++)
                        {
                            package.AddTriangleVertexColor(0, 0, 0, 10);
                        }
                    }

                    // The default color coming from the geometry library for
                    // curves is 255,255,255,255 (White). Because we want a default
                    // color of 0,0,0,255 (Black), we adjust the color components here.
                    if (graphicItem is Curve || graphicItem is Surface || graphicItem is Solid || graphicItem is Point)
                    {
                        if (package.LineVertexCount > 0)
                        {
                            package.ApplyLineVertexColors(CreateColorByteArrayOfSize(package.LineVertexCount, DefR, DefG, DefB, DefA));
                        }

                        if (package.PointVertexCount > 0)
                        {
                            package.ApplyPointVertexColors(CreateColorByteArrayOfSize(package.PointVertexCount, DefR, DefG, DefB, DefA));
                        }
                    }
                }
                catch (Exception e)
                {
                    Debug.WriteLine(
                        "PushGraphicItemIntoPackage: " + e);
                }

                package.DisplayLabels = displayLabels;
                package.IsSelected = isNodeSelected;

                renderPackages.Add(package);
                count++;
            }
        }
        private void GetRenderPackagesFromMirrorData(MirrorData mirrorData, string tag, bool displayLabels, bool isNodeSelectednt)
        {
            if (mirrorData.IsNull)
            {
                return;
            }

            if (mirrorData.IsCollection)
            {
                int count = 0;
                foreach (var el in mirrorData.GetElements())
                {
                    if (el.IsCollection || el.Data is IGraphicItem)
                    {
                        string newTag = tag + ":" + count;
                        GetRenderPackagesFromMirrorData(el, newTag, displayLabels, isNodeSelected);
                    }
                    count = count + 1;
                }
            }
            else
            {
                var graphicItem = mirrorData.Data as IGraphicItem;
                if (graphicItem == null)
                {
                    return;
                }

                var package = factory.CreateRenderPackage();
                var packageWithTransform = package as ITransformable;
                package.Description = tag;

                try
                {
                    graphicItem.Tessellate(package, factory.TessellationParameters);
                    if (package.MeshVertexColors.Count() > 0)
                    {
                        package.RequiresPerVertexColoration = true;
                    }

                    //If the package has a transform that is not the identity matrix
                    //then set requiresCustomTransform to true.
                    if (packageWithTransform != null && packageWithTransform.Transform.SequenceEqual(
                        new double[] { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 }) == false)
                    {
                        (packageWithTransform).RequiresCustomTransform = true;
                    }

                    if (factory.TessellationParameters.ShowEdges)
                    {
                        var surf = graphicItem as Surface;
                        if (surf != null)
                        {
                            foreach (var curve in surf.PerimeterCurves())
                            {
                                curve.Tessellate(package, factory.TessellationParameters);
                                curve.Dispose();
                            }
                        }

                        var solid = graphicItem as Solid;
                        if (solid != null)
                        {
                            var edges = solid.Edges;
                            foreach (var geom in edges.Select(edge => edge.CurveGeometry))
                            {
                                geom.Tessellate(package, factory.TessellationParameters);
                                geom.Dispose();
                            }
                            edges.ForEach(x => x.Dispose());
                        }
                    }
                    
                    var plane = graphicItem as Plane;
                    if (plane != null)
                    {
                        package.RequiresPerVertexColoration = true;

                        var s = 2.5;

                        var cs = CoordinateSystem.ByPlane(plane);
                        var a = Point.ByCartesianCoordinates(cs, s, s, 0);
                        var b = Point.ByCartesianCoordinates(cs, -s, s, 0);
                        var c = Point.ByCartesianCoordinates(cs, -s, -s, 0);
                        var d = Point.ByCartesianCoordinates(cs, s, -s, 0);

                        // Get rid of the original plane geometry.
                        package.Clear();

                        package.AddTriangleVertex(a.X, a.Y, a.Z);
                        package.AddTriangleVertex(b.X, b.Y, b.Z);
                        package.AddTriangleVertex(c.X, c.Y, c.Z);

                        package.AddTriangleVertex(c.X, c.Y, c.Z);
                        package.AddTriangleVertex(d.X, d.Y, d.Z);
                        package.AddTriangleVertex(a.X, a.Y, a.Z);

                        package.AddTriangleVertexUV(0, 0);
                        package.AddTriangleVertexUV(0, 0);
                        package.AddTriangleVertexUV(0, 0);
                        package.AddTriangleVertexUV(0, 0);
                        package.AddTriangleVertexUV(0, 0);
                        package.AddTriangleVertexUV(0, 0);

                        // Draw plane edges
                        package.AddLineStripVertex(a.X, a.Y, a.Z);
                        package.AddLineStripVertex(b.X, b.Y, b.Z);
                        package.AddLineStripVertex(b.X, b.Y, b.Z);
                        package.AddLineStripVertex(c.X, c.Y, c.Z);
                        package.AddLineStripVertex(c.X, c.Y, c.Z);
                        package.AddLineStripVertex(d.X, d.Y, d.Z);
                        package.AddLineStripVertex(d.X, d.Y, d.Z);
                        package.AddLineStripVertex(a.X, a.Y, a.Z);

                        // Draw normal
                        package.AddLineStripVertex(plane.Origin.X, plane.Origin.Y, plane.Origin.Z);
                        var nEnd = plane.Origin.Add(plane.Normal.Scale(2.5));
                        package.AddLineStripVertex(nEnd.X, nEnd.Y, nEnd.Z);

                        for (var i = 0; i < package.LineVertexCount / 2; i++)
                        {
                            package.AddLineStripVertexCount(2);
                        }

                        for (var i = 0; i < package.LineVertexCount; i ++)
                        {
                            package.AddLineStripVertexColor(MidTone, MidTone, MidTone, 255);
                        }

                        for (var i = 0; i < package.MeshVertexCount; i++)
                        {
                            package.AddTriangleVertexNormal(plane.Normal.X, plane.Normal.Y, plane.Normal.Z);
                        }

                        for (var i = 0; i < package.MeshVertexCount; i++)
                        {
                            package.AddTriangleVertexColor(0, 0, 0, 10);
                        }
                    }

                    // The default color coming from the geometry library for
                    // curves is 255,255,255,255 (White). Because we want a default
                    // color of 0,0,0,255 (Black), we adjust the color components here.
                    if (graphicItem is Curve || graphicItem is Surface || graphicItem is Solid || graphicItem is Point)
                    {
                        if (package.LineVertexCount > 0 && package.LineStripVertexColors.Count() <= 0)
                        {
                            package.ApplyLineVertexColors(CreateColorByteArrayOfSize(package.LineVertexCount, DefR, DefG, DefB, DefA));
                        }

                        if (package.PointVertexCount > 0 && package.PointVertexColors.Count() <= 0)
                        {
                            package.ApplyPointVertexColors(CreateColorByteArrayOfSize(package.PointVertexCount, DefR, DefG, DefB, DefA));
                        }
                    }
                }
                catch (Exception e)
                {
                    Debug.WriteLine(
                        "PushGraphicItemIntoPackage: " + e);
                }

                package.DisplayLabels = displayLabels;
                package.IsSelected = isNodeSelected;

                renderPackages.Add(package);
            }
        }
Esempio n. 34
0
        private WatchViewModel ProcessThing(MirrorData data, ProtoCore.RuntimeCore runtimeCore, string tag, bool showRawData, WatchHandlerCallback callback)
        {
            if (data.IsCollection)
            {
                var list = data.GetElements();

                var node = new WatchViewModel(list.Count == 0 ? "Empty List" : "List", tag, RequestSelectGeometry, true);
                foreach (var e in list.Select((element, idx) => new { element, idx }))
                {
                    node.Children.Add(ProcessThing(e.element, runtimeCore, tag + ":" + e.idx, showRawData, callback));
                }

                return node;
            }
            if (data.Data is Enum)
            {
                return new WatchViewModel(((Enum)data.Data).GetDescription(), tag, RequestSelectGeometry);
            }

            if (data.Data == null)
            {
                // MAGN-3494: If "data.Data" is null, then return a "null" string 
                // representation instead of casting it as dynamic (that leads to 
                // a crash).
                if (data.IsNull)
                    return new WatchViewModel(NULL_STRING, tag, RequestSelectGeometry);
                
                //If the input data is an instance of a class, create a watch node
                //with the class name and let WatchHandler process the underlying CLR data
                var classMirror = data.Class;
                if (null != classMirror)
                {
                    //just show the class name.
                    return ProcessThing(classMirror.ClassName, runtimeCore, tag, showRawData, callback);
                }
            }

            //Finally for all else get the string representation of data as watch content.
            return callback(data.Data, runtimeCore, tag, showRawData);
        }
Esempio n. 35
0
 private void AddToSizeMap(MirrorData data, ICollection<double> map)
 {
     if (data.IsCollection)
     {
         var list = data.GetElements();
         foreach (MirrorData t in list)
         {
             AddToSizeMap(t, map);
         }
     }
     else if (data.Data is IEnumerable)
     {
         var list = data.Data as IEnumerable;
         AddToSizeMap(list, map);
     }
     else
     {
         map.Add(ComputeBBoxDiagonalSize(data.Data));
     }
 }
Esempio n. 36
0
 /// <summary>
 /// Add labels for each of a mirror data object's inner
 /// data object to a label map.
 /// </summary>
 /// <param name="data"></param>
 /// <param name="map"></param>
 /// <param name="tag"></param>
 private void AddToLabelMap(MirrorData data, List<string> map, string tag)
 {
     if (data.IsCollection)
     {
         var list = data.GetElements();
         for (int i = 0; i < list.Count; i++)
         {
             AddToLabelMap(list[i], map, string.Format("{0}:{1}", tag, i));
         }
     }
     else if (data.Data is IEnumerable)
     {
         var list = data.Data as IEnumerable;
         AddToLabelMap(list, map, tag);
     }
     else
     {
         map.Add(tag);
     }
 }
        private void GetRenderPackagesFromMirrorData(MirrorData mirrorData, bool displayLabels, bool isNodeSelected, ref List <string> labelMap, ref int count)
        {
            if (mirrorData.IsNull)
            {
                return;
            }

            if (mirrorData.IsCollection)
            {
                foreach (var el in mirrorData.GetElements())
                {
                    GetRenderPackagesFromMirrorData(el, displayLabels, isNodeSelected, ref labelMap, ref count);
                }
            }
            else
            {
                var graphicItem = mirrorData.Data as IGraphicItem;
                if (graphicItem == null)
                {
                    return;
                }

                var package = factory.CreateRenderPackage();
                package.Description = labelMap.Count > count ? labelMap[count] : "?";

                try
                {
                    graphicItem.Tessellate(package, factory.TessellationParameters);
                    if (package.MeshVertexColors.Count() > 0)
                    {
                        package.RequiresPerVertexColoration = true;
                    }

                    if (factory.TessellationParameters.ShowEdges)
                    {
                        var surf = graphicItem as Surface;
                        if (surf != null)
                        {
                            foreach (var curve in surf.PerimeterCurves())
                            {
                                curve.Tessellate(package, factory.TessellationParameters);
                                curve.Dispose();
                            }
                        }

                        var solid = graphicItem as Solid;
                        if (solid != null)
                        {
                            var edges = solid.Edges;
                            foreach (var geom in edges.Select(edge => edge.CurveGeometry))
                            {
                                geom.Tessellate(package, factory.TessellationParameters);
                                geom.Dispose();
                            }
                            edges.ForEach(x => x.Dispose());
                        }
                    }

                    var plane = graphicItem as Plane;
                    if (plane != null)
                    {
                        package.RequiresPerVertexColoration = true;

                        var s = 2.5;

                        var cs = CoordinateSystem.ByPlane(plane);
                        var a  = Point.ByCartesianCoordinates(cs, s, s, 0);
                        var b  = Point.ByCartesianCoordinates(cs, -s, s, 0);
                        var c  = Point.ByCartesianCoordinates(cs, -s, -s, 0);
                        var d  = Point.ByCartesianCoordinates(cs, s, -s, 0);

                        // Get rid of the original plane geometry.
                        package.Clear();

                        package.AddTriangleVertex(a.X, a.Y, a.Z);
                        package.AddTriangleVertex(b.X, b.Y, b.Z);
                        package.AddTriangleVertex(c.X, c.Y, c.Z);

                        package.AddTriangleVertex(c.X, c.Y, c.Z);
                        package.AddTriangleVertex(d.X, d.Y, d.Z);
                        package.AddTriangleVertex(a.X, a.Y, a.Z);

                        package.AddTriangleVertexUV(0, 0);
                        package.AddTriangleVertexUV(0, 0);
                        package.AddTriangleVertexUV(0, 0);
                        package.AddTriangleVertexUV(0, 0);
                        package.AddTriangleVertexUV(0, 0);
                        package.AddTriangleVertexUV(0, 0);

                        // Draw plane edges
                        package.AddLineStripVertex(a.X, a.Y, a.Z);
                        package.AddLineStripVertex(b.X, b.Y, b.Z);
                        package.AddLineStripVertex(b.X, b.Y, b.Z);
                        package.AddLineStripVertex(c.X, c.Y, c.Z);
                        package.AddLineStripVertex(c.X, c.Y, c.Z);
                        package.AddLineStripVertex(d.X, d.Y, d.Z);
                        package.AddLineStripVertex(d.X, d.Y, d.Z);
                        package.AddLineStripVertex(a.X, a.Y, a.Z);

                        // Draw normal
                        package.AddLineStripVertex(plane.Origin.X, plane.Origin.Y, plane.Origin.Z);
                        var nEnd = plane.Origin.Add(plane.Normal.Scale(2.5));
                        package.AddLineStripVertex(nEnd.X, nEnd.Y, nEnd.Z);

                        for (var i = 0; i < package.LineVertexCount / 2; i++)
                        {
                            package.AddLineStripVertexCount(2);
                        }

                        for (var i = 0; i < package.LineVertexCount; i++)
                        {
                            package.AddLineStripVertexColor(MidTone, MidTone, MidTone, 255);
                        }

                        for (var i = 0; i < package.MeshVertexCount; i++)
                        {
                            package.AddTriangleVertexNormal(plane.Normal.X, plane.Normal.Y, plane.Normal.Z);
                        }

                        for (var i = 0; i < package.MeshVertexCount; i++)
                        {
                            package.AddTriangleVertexColor(0, 0, 0, 10);
                        }
                    }

                    // The default color coming from the geometry library for
                    // curves is 255,255,255,255 (White). Because we want a default
                    // color of 0,0,0,255 (Black), we adjust the color components here.
                    if (graphicItem is Curve || graphicItem is Surface || graphicItem is Solid || graphicItem is Point)
                    {
                        if (package.LineVertexCount > 0 && package.LineStripVertexColors.Count() <= 0)
                        {
                            package.ApplyLineVertexColors(CreateColorByteArrayOfSize(package.LineVertexCount, DefR, DefG, DefB, DefA));
                        }

                        if (package.PointVertexCount > 0 && package.PointVertexColors.Count() <= 0)
                        {
                            package.ApplyPointVertexColors(CreateColorByteArrayOfSize(package.PointVertexCount, DefR, DefG, DefB, DefA));
                        }
                    }
                }
                catch (Exception e)
                {
                    Debug.WriteLine(
                        "PushGraphicItemIntoPackage: " + e);
                }

                package.DisplayLabels = displayLabels;
                package.IsSelected    = isNodeSelected;

                renderPackages.Add(package);
                count++;
            }
        }
Esempio n. 38
0
        private static object MarshalMirrorDataForWatch(MirrorData mirrorData)
        {
            if (mirrorData == null || mirrorData.IsNull)
                return null;

            if (mirrorData.IsCollection)
                return mirrorData.GetElements().Select(MarshalMirrorDataForWatch).ToList();

            return mirrorData.Data;
        }
Esempio n. 39
0
 private void AssertMirrorData(MirrorData data1, MirrorData data2)
 {
     if (data1.IsNull)
         Assert.True(data2.IsNull);
     else if (data1.IsCollection)
     {
         Assert.True(data2.IsCollection);
         List<MirrorData> elems1 = data1.GetElements();
         List<MirrorData> elems2 = data2.GetElements();
         Assert.AreEqual(elems1.Count, elems2.Count);
         int i = 0;
         foreach (var item in elems1)
         {
             AssertMirrorData(item, elems2[i++]);
         }
     }
     else
         Assert.AreEqual(data1.Data, data2.Data);
 }
Esempio n. 40
0
 private void AssertCollection(MirrorData data, IEnumerable collection)
 {
     Assert.IsTrue(data.IsCollection);
     List<MirrorData> elements = data.GetElements();
     int i = 0;
     foreach (var item in collection)
     {
         AssertValue(elements[i++], item);
     }
 }
Esempio n. 41
0
        /// <summary>
        /// Convert mirror data objects for nodes to Revit types.
        /// </summary>
        /// <param name="data"></param>
        /// <param name="geoms"></param>
        private void RevitGeometryFromMirrorData(MirrorData data, ref List<GeometryObject> geoms)
        {
            if (data.IsCollection)
            {
                foreach (var md in data.GetElements())
                {
                    try
                    {
                        RevitGeometryFromMirrorData(md, ref geoms);
                    }
                    catch (Exception ex)
                    {
                        this.dynamoModel.Logger.Log(ex.Message);
                    }
                }
            }
            else
            {
                try
                {
                    var geom = data.Data as PolyCurve;
                    if (geom != null)
                    {
                        // We extract the curves explicitly rather than using PolyCurve's ToRevitType
                        // extension method.  There is a potential issue with CurveLoop which causes
                        // this method to introduce corrupt GNodes.  
                        foreach (var c in geom.Curves())
                        {
                            // Tesselate the curve.  This greatly improves performance when
                            // we're dealing with NurbsCurve's with high knot count, commonly
                            // results of surf-surf intersections.
                            Tesselate(c, ref geoms);
                        }
                        
                        return;
                    }

                    var point = data.Data as Point;
                    if (point != null)
                    {
                        geoms.Add(DocumentManager.Instance.CurrentUIApplication.Application.Create.NewPoint(point.ToXyz()));
                        return;
                    }

                    var curve = data.Data as Curve;
                    if (curve != null)
                    {
                        // Tesselate the curve.  This greatly improves performance when
                        // we're dealing with NurbsCurve's with high knot count, commonly
                        // results of surf-surf intersections.
                        Tesselate(curve, ref geoms);
                        return;
                    }
                }
                catch (Exception ex)
                {
                    this.dynamoModel.Logger.Log(ex.Message);
                }
            }
        }