Exemplo n.º 1
0
        private void DrawGeometryObject(NodeModel node, object obj, string tag, RenderDescription rd, Octree.OctreeSearch.Octree octree)
        {
            if (obj == null)
            {
                return;
            }

            if (obj is XYZ)
            {
                DrawXyz(node, obj, tag, rd, octree);
            }
            if (obj is Curve)
            {
                DrawCurve(node, obj, tag, rd, octree);
            }
            else if (obj is Solid)
            {
                DrawSolid(node, obj, tag, rd, octree);
            }
            else if (obj is Face)
            {
                DrawFace(node, obj, rd, octree);
            }
            else
            {
                DrawUndrawable(node, obj, rd, octree);
            }
        }
Exemplo n.º 2
0
        private void DrawFace(NodeModel node, object obj, RenderDescription rd, Octree.OctreeSearch.Octree octree)
        {
            var face = obj as Face;

            if (face == null)
            {
                return;
            }

            var mesh = face.Triangulate(0.2);

            if (mesh == null)
            {
                Debug.WriteLine("Mesh could not be computed from face.");
                return;
            }

            if (node.IsSelected)
            {
                rd.SelectedMeshes.Add(RevitMeshToHelixMesh(mesh, octree, node));
            }
            else
            {
                rd.Meshes.Add(RevitMeshToHelixMesh(mesh, octree, node));
            }
        }
Exemplo n.º 3
0
        private void DrawXyz(NodeModel node, object obj, string tag, RenderDescription rd, Octree.OctreeSearch.Octree octree)
        {
            var point = obj as XYZ;

            if (point == null)
            {
                return;
            }

            var pt = new Point3D(point.X, point.Y, point.Z);

            if (node.IsSelected)
            {
                rd.SelectedPoints.Add(pt);
            }
            else
            {
                rd.Points.Add(pt);
            }

            if (node.DisplayLabels)
            {
                rd.Text.Add(new BillboardTextItem {
                    Text = tag, Position = pt
                });
            }
        }
Exemplo n.º 4
0
        private void DrawTransform(NodeModel node, object obj, string tag, RenderDescription rd, Octree.OctreeSearch.Octree octree)
        {
            var t = obj as Transform;

            if (t == null)
            {
                return;
            }

            var origin = new Point3D(t.Origin.X, t.Origin.Y, t.Origin.Z);
            XYZ x1     = t.Origin + t.BasisX.Normalize();
            XYZ y1     = t.Origin + t.BasisY.Normalize();
            XYZ z1     = t.Origin + t.BasisZ.Normalize();
            var xEnd   = new Point3D(x1.X, x1.Y, x1.Z);
            var yEnd   = new Point3D(y1.X, y1.Y, y1.Z);
            var zEnd   = new Point3D(z1.X, z1.Y, z1.Z);

            rd.XAxisPoints.Add(origin);
            rd.XAxisPoints.Add(xEnd);

            rd.YAxisPoints.Add(origin);
            rd.YAxisPoints.Add(yEnd);

            rd.ZAxisPoints.Add(origin);
            rd.ZAxisPoints.Add(zEnd);
        }
Exemplo n.º 5
0
        private void DrawCurve(NodeModel node, object obj, RenderDescription rd, Octree.OctreeSearch.Octree octree)
        {
            var curve = obj as Curve;

            if (curve == null)
            {
                return;
            }

            IList <XYZ> points = curve.Tessellate();

            bool selected = node.IsSelected;

            for (int i = 0; i < points.Count; ++i)
            {
                XYZ xyz = points[i];

                rd.Lines.Add(new Point3D(xyz.X, xyz.Y, xyz.Z));

                if (i == 0 || i == (points.Count - 1))
                {
                    continue;
                }

                if (selected)
                {
                    rd.SelectedLines.Add(new Point3D(xyz.X, xyz.Y, xyz.Z));
                }
                else
                {
                    rd.Lines.Add(new Point3D(xyz.X, xyz.Y, xyz.Z));
                }
            }
        }
Exemplo n.º 6
0
        private void DrawTriangleFace(NodeModel node, object obj, string tag, RenderDescription rd, Octree.OctreeSearch.Octree octree)
        {
            var face = obj as TriangleFace;

            if (face == null)
            {
                return;
            }

            var builder = new MeshBuilder();

            builder.Positions.Add(face.Vertices[1].ToPoint3D());
            builder.Positions.Add(face.Vertices[0].ToPoint3D());
            builder.Positions.Add(face.Vertices[2].ToPoint3D());
            builder.TriangleIndices.Add(builder.Positions.Count - 1);
            builder.TriangleIndices.Add(builder.Positions.Count - 2);
            builder.TriangleIndices.Add(builder.Positions.Count - 3);
            builder.TextureCoordinates.Add(new System.Windows.Point(0, 0));
            builder.TextureCoordinates.Add(new System.Windows.Point(0, 0));
            builder.TextureCoordinates.Add(new System.Windows.Point(0, 0));

            if (node.IsSelected)
            {
                rd.SelectedMeshes.Add(builder.ToMesh(true));
            }
            else
            {
                rd.Meshes.Add(builder.ToMesh(true));
            }
        }
Exemplo n.º 7
0
        /// <summary>
        /// Aggregates all upstream geometry for the given node then sends
        /// a message that a visualization is ready
        /// </summary>
        /// <param name="node">The node whose upstream geometry you need.</param>
        /// <returns>A render description containing all upstream geometry.</returns>
        public void RenderUpstream(NodeModel node)
        {
            var rd = new RenderDescription();

            //send back just what the node needs
            var watch = new Stopwatch();

            watch.Start();

            if (node == null)
            {
                //send back everything
                rd = AggregateRenderDescriptions();

                OnResultsReadyToVisualize(this, new VisualizationEventArgs(rd, string.Empty));
            }
            else
            {
                //send back renderables for the branch
                var drawables = GetUpstreamDrawableIds(node.Inputs);

                var ids = from viz in dynSettings.Controller.VisualizationManager.Visualizations
                          where drawables.Contains(viz.Key)
                          select viz;

                var keyValuePairs = ids as KeyValuePair <string, RenderDescription>[] ?? ids.ToArray();

                var pts       = keyValuePairs.SelectMany(x => x.Value.Points);
                var lines     = keyValuePairs.SelectMany(x => x.Value.Lines);
                var meshes    = keyValuePairs.SelectMany(x => x.Value.Meshes);
                var xs        = keyValuePairs.SelectMany(x => x.Value.XAxisPoints);
                var ys        = keyValuePairs.SelectMany(x => x.Value.YAxisPoints);
                var zs        = keyValuePairs.SelectMany(x => x.Value.ZAxisPoints);
                var pts_sel   = keyValuePairs.SelectMany(x => x.Value.SelectedPoints);
                var lines_sel = keyValuePairs.SelectMany(x => x.Value.SelectedLines);
                var mesh_sel  = keyValuePairs.SelectMany(x => x.Value.SelectedMeshes);

                rd.Points.AddRange(pts);
                rd.Lines.AddRange(lines);
                rd.Meshes.AddRange(meshes);
                rd.XAxisPoints.AddRange(xs);
                rd.YAxisPoints.AddRange(ys);
                rd.ZAxisPoints.AddRange(zs);
                rd.SelectedPoints.AddRange(pts_sel);
                rd.SelectedLines.AddRange(lines_sel);
                rd.SelectedMeshes.AddRange(mesh_sel);

                OnResultsReadyToVisualize(this, new VisualizationEventArgs(rd, node.GUID.ToString()));
            }

            watch.Stop();
            Debug.WriteLine(String.Format("{0} ellapsed for aggregating geometry for watch.", watch.Elapsed));

            //LogVisualizationUpdateData(rd, watch.Elapsed.ToString());
        }
Exemplo n.º 8
0
        private void DrawFacet(NodeModel node, object obj, string tag, RenderDescription rd,
                               Octree.OctreeSearch.Octree octree)
        {
            var facet = obj as Facet;

            if (facet == null)
            {
                return;
            }

            var builder = new MeshBuilder();
            var points  = new Point3DCollection();
            var tex     = new PointCollection();
            var norms   = new Vector3DCollection();
            var tris    = new List <int>();

            var a = facet.Points[0];
            var b = facet.Points[1];
            var c = facet.Points[2];

            var side1 = (b - a).Normalize();
            var side2 = (c - a).Normalize();
            var norm  = side1.CrossProduct(side2);

            int count = 0;

            foreach (var pt in facet.Points)
            {
                points.Add(new Point3D(pt.X, pt.Y, pt.Z));
                tex.Add(new System.Windows.Point(0, 0));
                tris.Add(count);
                norms.Add(new Vector3D(norm.X, norm.Y, norm.Z));
                count++;
            }

            builder.Append(points, tris, norms, tex);

            if (node.IsSelected)
            {
                rd.SelectedMeshes.Add(builder.ToMesh(true));
            }
            else
            {
                rd.Meshes.Add(builder.ToMesh(true));
            }

            if (node.DisplayLabels)
            {
                var cp = (a + b + c) / 3;
                rd.Text.Add(new BillboardTextItem {
                    Text = tag, Position = new Point3D(cp.X, cp.Y, cp.Z)
                });
            }
        }
Exemplo n.º 9
0
        private void DrawForm(NodeModel node, object obj, string tag, RenderDescription rd, Octree.OctreeSearch.Octree octree)
        {
            var form = obj as Form;

            if (form == null)
            {
                return;
            }

            DrawGeometryElement(node, form.get_Geometry(new Options()), tag, rd, octree);
        }
Exemplo n.º 10
0
        private void DrawCurveElement(NodeModel node, object obj, string tag, RenderDescription rd, Octree.OctreeSearch.Octree octree)
        {
            var elem = obj as CurveElement;

            if (elem == null)
            {
                return;
            }

            DrawCurve(node, elem.GeometryCurve, tag, rd, octree);
        }
Exemplo n.º 11
0
        internal void VisualizeGeometry(NodeModel node, object geom, string tag, RenderDescription rd)
        {
            var t = geom.GetType();

            var viz = Visualizers.FirstOrDefault(x => x.Key == t || x.Key.IsAssignableFrom(t));

            //draw what's in the container
            if (viz.Value != null)
            {
                viz.Value.Invoke(node, geom, tag, rd, octree);
            }
        }
Exemplo n.º 12
0
        private void DrawCurveLoop(NodeModel node, object obj, string tag, RenderDescription rd, Octree.OctreeSearch.Octree octree)
        {
            var cl = obj as Autodesk.Revit.DB.CurveLoop;

            if (cl == null)
            {
                return;
            }

            foreach (var crv in cl)
            {
                DrawCurve(node, crv, tag, rd, octree);
            }
        }
Exemplo n.º 13
0
        private void DrawGeometryElement(NodeModel node, object obj, string tag, RenderDescription rd, Octree.OctreeSearch.Octree octree)
        {
            try
            {
                var gelem = obj as GeometryElement;

                foreach (GeometryObject go in gelem)
                {
                    DrawGeometryObject(node, go, tag, rd, octree);
                }
            }
            catch (Exception ex)
            {
                DynamoLogger.Instance.Log(ex.Message);
                DynamoLogger.Instance.Log(ex.StackTrace);
            }
        }
Exemplo n.º 14
0
        private void DrawParticleSystem(NodeModel node, object obj, string tag, RenderDescription rd, Octree.OctreeSearch.Octree octree)
        {
            var ps = obj as ParticleSystem;

            if (ps == null)
            {
                return;
            }

            for (int i = 0; i < ps.numberOfParticles(); i++)
            {
                Particle p   = ps.getParticle(i);
                XYZ      pos = p.getPosition();
                if (i < rd.Points.Count)
                {
                    rd.Points[i] = new Point3D(pos.X, pos.Y, pos.Z);
                }
                else
                {
                    var pt = new Point3D(pos.X, pos.Y, pos.Z);
                    rd.Points.Add(pt);
                }
            }

            for (int i = 0; i < ps.numberOfSprings(); i++)
            {
                ParticleSpring spring = ps.getSpring(i);
                XYZ            pos1   = spring.getOneEnd().getPosition();
                XYZ            pos2   = spring.getTheOtherEnd().getPosition();

                if (i * 2 + 1 < rd.Lines.Count)
                {
                    rd.Lines[i * 2]     = new Point3D(pos1.X, pos1.Y, pos1.Z);
                    rd.Lines[i * 2 + 1] = new Point3D(pos2.X, pos2.Y, pos2.Z);
                }
                else
                {
                    var pt1 = new Point3D(pos1.X, pos1.Y, pos1.Z);
                    var pt2 = new Point3D(pos2.X, pos2.Y, pos2.Z);

                    rd.Lines.Add(pt1);
                    rd.Lines.Add(pt2);
                }
            }
        }
Exemplo n.º 15
0
        private void DrawXyz(NodeModel node, object obj, RenderDescription rd, Octree.OctreeSearch.Octree octree)
        {
            var point = obj as XYZ;

            if (point == null)
            {
                return;
            }

            if (node.IsSelected)
            {
                rd.SelectedPoints.Add(new Point3D(point.X, point.Y, point.Z));
            }
            else
            {
                rd.Points.Add(new Point3D(point.X, point.Y, point.Z));
            }
        }
Exemplo n.º 16
0
        /// <summary>
        /// Log visualization update timing and geometry data.
        /// </summary>
        /// <param name="rd">The aggregated render description for the model.</param>
        /// <param name="ellapsedTime">The ellapsed time of visualization as a string.</param>
        protected void LogVisualizationUpdateData(RenderDescription rd, string ellapsedTime)
        {
            var renderDict = new Dictionary <string, object>();

            renderDict["points"]        = rd.Points.Count;
            renderDict["line_segments"] = rd.Lines.Count / 2;
            renderDict["mesh_facets"]   = rd.Meshes.Any()
                                            ? rd.Meshes.Select(x => x.TriangleIndices.Count / 3).Aggregate((a, b) => a + b)
                                            : 0;
            renderDict["time"]         = ellapsedTime;
            renderDict["manager_type"] = this.GetType().ToString();

            var renderData = JsonConvert.SerializeObject(renderDict);

            InstrumentationLogger.LogInfo("Perf-Latency-RenderGeometryGeneration", renderData);

            //Debug.WriteLine(renderData);
        }
Exemplo n.º 17
0
        private void DrawElement(NodeModel node, object obj, string tag, RenderDescription rd, Octree.OctreeSearch.Octree octree)
        {
            if (obj == null)
            {
                return;
            }

            if (obj is CurveElement)
            {
                DrawCurveElement(node, obj, tag, rd, octree);
            }
            else if (obj is ReferencePoint)
            {
                DrawReferencePoint(node, obj, rd, octree);
            }
            else if (obj is Form)
            {
                DrawForm(node, obj, tag, rd, octree);
            }
            else if (obj is GeometryElement)
            {
                DrawGeometryElement(node, obj, tag, rd, octree);
            }
            else if (obj is GeometryObject)
            {
                DrawGeometryObject(node, obj, tag, rd, octree);
            }
            else
            {
                var elem = obj as Element;
                if (elem != null)
                {
                    var o = new Options {
                        DetailLevel = ViewDetailLevel.Medium
                    };
                    GeometryElement geom = elem.get_Geometry(o);

                    if (geom != null)
                    {
                        DrawGeometryObject(node, geom, tag, rd, octree);
                    }
                }
            }
        }
Exemplo n.º 18
0
        public RenderDescription AggregateRenderDescriptions()
        {
            var descriptions = Visualizations.Values;

            var rd = new RenderDescription
            {
                Points         = descriptions.SelectMany(x => x.Points).ToThreadSafeList(),
                Lines          = descriptions.SelectMany(x => x.Lines).ToThreadSafeList(),
                SelectedPoints = descriptions.SelectMany(x => x.SelectedPoints).ToThreadSafeList(),
                SelectedLines  = descriptions.SelectMany(x => x.SelectedLines).ToThreadSafeList(),
                XAxisPoints    = descriptions.SelectMany(x => x.XAxisPoints).ToThreadSafeList(),
                YAxisPoints    = descriptions.SelectMany(x => x.YAxisPoints).ToThreadSafeList(),
                ZAxisPoints    = descriptions.SelectMany(x => x.ZAxisPoints).ToThreadSafeList(),
                Meshes         = descriptions.SelectMany(x => x.Meshes).ToThreadSafeList(),
                SelectedMeshes = descriptions.SelectMany(x => x.SelectedMeshes).ToThreadSafeList()
            };

            return(rd);
        }
Exemplo n.º 19
0
        private void DrawSolid(NodeModel node, object obj, string tag, RenderDescription rd, Octree.OctreeSearch.Octree octree)
        {
            var solid = obj as Solid;

            if (solid == null)
            {
                return;
            }

            foreach (Face f in solid.Faces)
            {
                DrawFace(node, f, rd, octree);
            }

            foreach (Edge edge in solid.Edges)
            {
                DrawCurve(node, edge.AsCurve(), tag, rd, octree);
            }
        }
Exemplo n.º 20
0
        private void DrawCurve(NodeModel node, object obj, string tag, RenderDescription rd, Octree.OctreeSearch.Octree octree)
        {
            var curve = obj as Curve;

            if (curve == null)
            {
                return;
            }

            IList <XYZ> points = curve.Tessellate();

            bool selected = node.IsSelected;

            for (int i = 0; i < points.Count - 1; ++i)
            {
                XYZ start = points[i];
                XYZ end   = points[i + 1];

                var startPt = new Point3D(start.X, start.Y, start.Z);
                var endPt   = new Point3D(end.X, end.Y, end.Z);

                //draw a label at the start of the curve
                if (node.DisplayLabels && i == 0)
                {
                    rd.Text.Add(new BillboardTextItem {
                        Text = tag, Position = startPt
                    });
                }

                if (selected)
                {
                    rd.SelectedLines.Add(startPt);
                    rd.SelectedLines.Add(endPt);
                }
                else
                {
                    rd.Lines.Add(startPt);
                    rd.Lines.Add(endPt);
                }
            }
        }
Exemplo n.º 21
0
        private void DrawReferencePoint(NodeModel node, object obj, RenderDescription rd, Octree.OctreeSearch.Octree octree)
        {
            var point = obj as ReferencePoint;

            if (point == null)
            {
                return;
            }

            if (node.IsSelected)
            {
                rd.SelectedPoints.Add(new Point3D(point.GetCoordinateSystem().Origin.X,
                                                  point.GetCoordinateSystem().Origin.Y,
                                                  point.GetCoordinateSystem().Origin.Z));
            }
            else
            {
                rd.Points.Add(new Point3D(point.GetCoordinateSystem().Origin.X,
                                          point.GetCoordinateSystem().Origin.Y,
                                          point.GetCoordinateSystem().Origin.Z));
            }
        }
Exemplo n.º 22
0
        private void DrawContainers(Value val, RenderDescription rd)
        {
            if (val.IsList)
            {
                foreach (Value v in ((Value.List)val).Item)
                {
                    DrawContainers(v, rd);
                }
            }
            if (val.IsContainer)
            {
                var drawable = ((Value.Container)val).Item;

                if (drawable is XYZ)
                {
                    dynRevitTransactionNode.DrawXYZ(rd, drawable);
                }
                else if (drawable is GeometryObject)
                {
                    dynRevitTransactionNode.DrawGeometryObject(rd, drawable);
                }
            }
        }
Exemplo n.º 23
0
 public VisualizationEventArgs(RenderDescription description, string viewId)
 {
     Description = description;
     Id          = viewId;
 }
Exemplo n.º 24
0
        public static void DrawLibGGraphicItem(NodeModel node, object geom, RenderDescription rd, Octree.OctreeSearch.Octree octree)
        {
            var selected = DynamoSelection.Instance.Selection.Contains(node);
            var g        = geom as GraphicItem;

            if (g is CoordinateSystem)
            {
                #region draw coordinate systems

                var line_strip_vertices = g.line_strip_vertices_threadsafe();

                for (int i = 0; i < line_strip_vertices.Count; i += 6)
                {
                    var p1 = new Point3D(
                        line_strip_vertices[i],
                        line_strip_vertices[i + 1],
                        line_strip_vertices[i + 2]);

                    var p2 = new Point3D(
                        line_strip_vertices[i + 3],
                        line_strip_vertices[i + 4],
                        line_strip_vertices[i + 5]);

                    if (i < 6)
                    {
                        rd.XAxisPoints.Add(p1);
                        rd.XAxisPoints.Add(p2);
                    }
                    else if (i >= 6 && i < 12)
                    {
                        rd.YAxisPoints.Add(p1);
                        rd.YAxisPoints.Add(p2);
                    }
                    else
                    {
                        rd.ZAxisPoints.Add(p1);
                        rd.ZAxisPoints.Add(p2);
                    }
                }

                #endregion
            }
            else
            {
                #region draw points

                var point_vertices = g.point_vertices_threadsafe();

                for (int i = 0; i < point_vertices.Count; i += 3)
                {
                    if (selected)
                    {
                        rd.SelectedPoints.Add(new Point3D(point_vertices[i],
                                                          point_vertices[i + 1], point_vertices[i + 2]));
                    }
                    else
                    {
                        rd.Points.Add(new Point3D(point_vertices[i],
                                                  point_vertices[i + 1], point_vertices[i + 2]));
                    }
                }

                #endregion

                #region draw lines

                SizeTList num_line_strip_vertices = g.num_line_strip_vertices_threadsafe();
                FloatList line_strip_vertices     = g.line_strip_vertices_threadsafe();

                int counter = 0;

                foreach (uint num_verts in num_line_strip_vertices)
                {
                    for (int i = 0; i < num_verts; ++i)
                    {
                        var p = new Point3D(
                            line_strip_vertices[counter],
                            line_strip_vertices[counter + 1],
                            line_strip_vertices[counter + 2]);

                        if (selected)
                        {
                            rd.SelectedLines.Add(p);
                        }
                        else
                        {
                            rd.Lines.Add(p);
                        }

                        counter += 3;

                        if (i == 0 || i == num_verts - 1)
                        {
                            continue;
                        }

                        if (selected)
                        {
                            rd.SelectedLines.Add(p);
                        }
                        else
                        {
                            rd.Lines.Add(p);
                        }
                    }
                }

                #endregion

                #region draw surface

                //var sw = new Stopwatch();
                //sw.Start();

                var builder = new MeshBuilder();
                var points  = new Point3DCollection();
                var tex     = new PointCollection();
                var norms   = new Vector3DCollection();
                var tris    = new List <int>();

                FloatList triangle_vertices = g.triangle_vertices_threadsafe();
                FloatList triangle_normals  = g.triangle_normals_threadsafe();

                for (int i = 0; i < triangle_vertices.Count; i += 3)
                {
                    var new_point = new Point3D(triangle_vertices[i],
                                                triangle_vertices[i + 1],
                                                triangle_vertices[i + 2]);

                    var normal = new Vector3D(triangle_normals[i],
                                              triangle_normals[i + 1],
                                              triangle_normals[i + 2]);

                    //find a matching point
                    //compare the angle between the normals
                    //to discern a 'break' angle for adjacent faces
                    //int foundIndex = -1;
                    //for (int j = 0; j < points.Count; j++)
                    //{
                    //    var testPt = points[j];
                    //    var testNorm = norms[j];
                    //    var ang = Vector3D.AngleBetween(normal, testNorm);

                    //    if (new_point.X == testPt.X &&
                    //        new_point.Y == testPt.Y &&
                    //        new_point.Z == testPt.Z &&
                    //        ang > 90.0000)
                    //    {
                    //        foundIndex = j;
                    //        break;
                    //    }
                    //}

                    //if (foundIndex != -1)
                    //{
                    //    tris.Add(foundIndex);
                    //    continue;
                    //}

                    tris.Add(points.Count);
                    points.Add(new_point);
                    norms.Add(normal);
                    tex.Add(new System.Windows.Point(0, 0));

                    octree.AddNode(new_point.X, new_point.Y, new_point.Z, node.GUID.ToString());
                }

                //builder.AddTriangles(points, norms, tex);
                builder.Append(points, tris, norms, tex);

                //sw.Stop();
                //Debug.WriteLine(string.Format("{0} elapsed for drawing geometry.", sw.Elapsed));

                //don't add empty meshes
                if (builder.Positions.Count > 0)
                {
                    if (selected)
                    {
                        rd.SelectedMeshes.Add(builder.ToMesh(true));
                    }
                    else
                    {
                        rd.Meshes.Add(builder.ToMesh(true));
                    }
                }

                #endregion
            }
        }
Exemplo n.º 25
0
 public Visualization()
 {
     RequiresUpdate = false;
     Description    = new RenderDescription();
     Geometry       = new List <object>();
 }
Exemplo n.º 26
0
 private void DrawUndrawable(NodeModel node, object obj, RenderDescription rd, Octree.OctreeSearch.Octree octree)
 {
     //TODO: write a message, throw an exception, draw a question mark
 }
Exemplo n.º 27
0
 void DrawPython(Value val, RenderDescription rd)
 {
     DrawContainers(val, rd);
 }