Esempio n. 1
0
        /// <summary>
        /// This is the method that actually does the work.
        /// </summary>
        /// <param name="DA">The DA object is used to retrieve from inputs and store in outputs.</param>
        protected override void SolveInstance(IGH_DataAccess DA)
        {
            Rhino.Geometry.Mesh inputMesh = null;
            DroidVolume         vol       = null;
            double x = new double();
            double y = new double();

            if (!DA.GetData(0, ref inputMesh))
            {
                return;
            }
            if (!DA.GetData(1, ref vol))
            {
                return;
            }
            if (!DA.GetData(2, ref x))
            {
                return;
            }
            if (!DA.GetData(3, ref y))
            {
                return;
            }

            Vector3d normal  = new Vector3d(0, 0, 1);
            Plane    worldXY = new Plane(Point3d.Origin, normal);

            Vector3d trans = new Vector3d(x, y, 0);

            Rhino.Geometry.Mesh _inputMesh = new Rhino.Geometry.Mesh();

            if (vol.volumeOutline.Length == 2)
            {
                _inputMesh = inputMesh;
                BoundingBox bbx    = _inputMesh.GetBoundingBox(worldXY);
                Point3d     cnr    = bbx.Corner(true, true, true);
                Point3d     center = bbx.Center;
                center.Z = cnr.Z;
                Vector3d toMiddle = new Vector3d((Point3d.Origin - center + trans));
                _inputMesh.Transform(Transform.Translation(toMiddle));
            }
            if (vol.volumeOutline.Length == 6)
            {
                _inputMesh = inputMesh;
                BoundingBox bbx    = _inputMesh.GetBoundingBox(worldXY);
                Point3d     cnr    = bbx.Corner(true, true, true);
                Point3d     center = bbx.Center;
                center.Z = cnr.Z;
                Point3d  middle   = new Point3d((vol.size[0] / 2), (vol.size[1] / 2), 0);
                Vector3d toMiddle = new Vector3d((middle - center + trans));
                _inputMesh.Transform(Transform.Translation(toMiddle));
            }

            DroidMesh dMesh = new DroidMesh(_inputMesh);

            DA.SetData(0, dMesh);
            DA.SetData(1, _inputMesh);
        }
        /// <summary>
        /// This is the method that actually does the work.
        /// </summary>
        /// <param name="DA">The DA object is used to retrieve from inputs and store in outputs.</param>
        protected override void SolveInstance(IGH_DataAccess DA)
        {
            // Declare variables
            Rhino.Geometry.Mesh mesh = null;
            string   name            = "";
            Material material        = null;
            int      decimalAccuracy = 3;

            // Reference the inputs
            DA.GetData(0, ref mesh);
            DA.GetData(1, ref name);
            DA.GetData(2, ref material);
            DA.GetData(3, ref decimalAccuracy);

            // If the meshes have quads, triangulate them
            if (!mesh.Faces.ConvertQuadsToTriangles())
            {
                AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Error triangulating quad meshes. Try triangulating quads before feeding into this component.");
            }
            ;

            // Get the center of the object so the bufferGeometry can be given a local coordinates
            Point3d center = mesh.GetBoundingBox(true).Center;

            /// Add the bufferGeometry
            BufferGeometry geometry = new BufferGeometry(mesh, center, decimalAccuracy, true);

            /// Add the child
            dynamic meshObject = new ExpandoObject();

            meshObject.Uuid = Guid.NewGuid();
            if (name.Length > 0)
            {
                meshObject.name = name;
            }
            meshObject.Type          = "Mesh";
            meshObject.Geometry      = geometry.Uuid;
            meshObject.Matrix        = new Matrix(center).Array;
            meshObject.CastShadow    = true;
            meshObject.ReceiveShadow = true;

            // Create line object
            Object3d object3d = new Object3d(meshObject);

            object3d.AddGeometry(geometry);

            // If there is a material, add the material, textures, and images
            if (material != null)
            {
                meshObject.Material = material.Data.Uuid;

                // Set the material to use vertex colors
                material.Data.vertexColors = 2;
                material.Data.color        = "0xffffff";

                object3d.AddMaterial(material.Data);
                if (material.Textures != null)
                {
                    foreach (dynamic texture in material.Textures)
                    {
                        object3d.AddTexture(texture);
                    }
                }
                if (material.Images != null)
                {
                    foreach (dynamic image in material.Images)
                    {
                        object3d.AddImage(image);
                    }
                }
            }
            else
            {
                Guid uuid = Guid.NewGuid();
                meshObject.Material = uuid;

                // Build the material object
                dynamic meshBasicMaterial = new ExpandoObject();
                meshBasicMaterial.Uuid         = uuid;
                meshBasicMaterial.Type         = "MeshBasicMaterial";
                meshBasicMaterial.vertexColors = 2;
                object3d.AddMaterial(meshBasicMaterial);
            }

            // Set output references
            DA.SetData(0, object3d);
        }