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); }
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); } }
/// <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); } } }
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); } }
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); }
/// <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))); }
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[] { } }; }
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>[] { } }; }
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)); }
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); } }
/// <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); }
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); } } }
/// <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); } }
/// <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); } } }
/// <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); } }
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++; } }
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)); }
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); } }
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); }
/// <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); }
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)); }
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); } }
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); } }
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); } } }
/// <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; }
/// <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); } } }
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); } }
/// <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); } }
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); } }
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); }
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)); } }
/// <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++; } }
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; }
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); }
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); } }
/// <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); } } }