bool compute_outer_wall()
        {
            SocketMesh       = new DMesh3(InnerMesh);
            LastInnerGroupID = SocketMesh.AllocateTriangleGroup();
            FaceGroupUtil.SetGroupID(SocketMesh, LastInnerGroupID);

            if (DebugStep <= 1)
            {
                return(true);
            }

            double          use_thickness = thickness;
            MeshExtrudeMesh extrude       = new MeshExtrudeMesh(SocketMesh);

            extrude.ExtrudedPositionF = (v, n, vid) => {
                return(v + use_thickness * (Vector3d)n);
            };
            if (extrude.Extrude() == false)
            {
                return(false);
            }

            LastExtrudeOuterGroupID = extrude.OffsetGroupID;
            LastStitchGroupID       = extrude.StitchGroupIDs[0];

            return(true);
        }
Пример #2
0
        public virtual void Update()
        {
            base.begin_update();

            if (MeshSource == null)
            {
                throw new Exception("ExtrudeMeshOp: must set valid MeshSource to compute!");
            }

            IMesh meshIn = MeshSource.GetIMesh();

            //ISpatial spatialIn = MeshSource.GetSpatial();

            ExtrudedMesh = new DMesh3(meshIn, MeshHints.None);

            MeshExtrudeMesh extrude = new MeshExtrudeMesh(ExtrudedMesh);

            extrude.ExtrudedPositionF = (v, n, vid) => {
                return(v + extrude_dist * (Vector3d)n);
            };
            extrude.Extrude();

            ApplyModifiers(ExtrudedMesh);

            base.complete_update();
        }
Пример #3
0
        protected override void SolveInstance(IGH_DataAccess DA)
        {
            DMesh3_goo goo  = null;
            double     dist = 1;

            DA.GetData(0, ref goo);
            DA.GetData(1, ref dist);

            DMesh3 mesh = new DMesh3(goo.Value);

            MeshExtrudeMesh extruder = new MeshExtrudeMesh(mesh);

            extruder.ExtrudedPositionF = (pos, normal, idx) => { return(pos + normal.Multiply(dist)); };

            if (dist < 0)
            {
                extruder.IsPositiveOffset = false;
            }

            extruder.Extrude();

            DA.SetData(0, extruder.Mesh);
        }
Пример #4
0
        virtual public void PreRender()
        {
            if (in_shutdown())
            {
                return;
            }

            if (parameters_dirty)
            {
                // offset
                List <GeneralPolygon2d> offset = ClipperUtil.RoundOffset(combined_all, offset_distance);
                // aggressively simplify after round offset...
                foreach (var poly in offset)
                {
                    poly.Simplify(path_width);
                }

                // subtract initial and add tiny gap so these don't get merged by slicer
                if (SubtractSolids)
                {
                    offset = ClipperUtil.Difference(offset, combined_solid);
                    offset = ClipperUtil.MiterOffset(offset, -path_width * 0.1);
                }

                offset = CurveUtils2.FilterDegenerate(offset, 0.001);
                foreach (var poly in offset)
                {
                    poly.Simplify(path_width * 0.02);
                }

                DMesh3     mesh   = new DMesh3();
                MeshEditor editor = new MeshEditor(mesh);
                foreach (var poly in offset)
                {
                    TriangulatedPolygonGenerator polygen = new TriangulatedPolygonGenerator()
                    {
                        Polygon = poly
                    };
                    editor.AppendMesh(polygen.Generate().MakeDMesh());
                }
                MeshTransforms.ConvertZUpToYUp(mesh);

                if (mesh.TriangleCount > 0)
                {
                    MeshExtrudeMesh extrude = new MeshExtrudeMesh(mesh);
                    extrude.ExtrudedPositionF = (v, n, vid) => {
                        return(v + Layers * layer_height * Vector3d.AxisY);
                    };
                    extrude.Extrude();
                    MeshTransforms.Translate(mesh, -mesh.CachedBounds.Min.y * Vector3d.AxisY);
                }

                PreviewSO.ReplaceMesh(mesh, true);

                //Vector3d translate = scene_bounds.Point(1, -1, 1);
                //translate.x += spiral.Bounds.Width + PathWidth;
                //Frame3f sceneF = Frame3f.Identity.Translated((Vector3f)translate);
                //PreviewSO.SetLocalFrame(sceneF, CoordSpace.SceneCoords);

                parameters_dirty = false;
            }
        }
Пример #5
0
        protected virtual void compute_shell_extrude()
        {
            DMesh3 mesh = new DMesh3(MeshSource.GetDMeshUnsafe());

            MeshNormals.QuickCompute(mesh);

            if (shell_direction == ShellDirections.Symmetric)
            {
                double thickness = shell_thickness * 0.5;

                DMesh3          outerMesh    = new DMesh3(mesh);
                MeshExtrudeMesh outerExtrude = new MeshExtrudeMesh(outerMesh);
                outerExtrude.ExtrudedPositionF = (v, n, vid) => {
                    return(v + thickness * (Vector3d)n);
                };
                if (outerExtrude.Extrude() == false)
                {
                    throw new Exception("MeshShellOp.compute_shell_extrude: outer Extrude() returned false!");
                }
                MeshEditor.RemoveTriangles(outerMesh, outerExtrude.InitialTriangles);

                MeshExtrudeMesh innerExtrude = new MeshExtrudeMesh(mesh);
                innerExtrude.IsPositiveOffset  = false;
                innerExtrude.ExtrudedPositionF = (v, n, vid) => {
                    return(v - thickness * (Vector3d)n);
                };
                if (innerExtrude.Extrude() == false)
                {
                    throw new Exception("MeshShellOp.compute_shell_extrude: inner Extrude() returned false!");
                }
                MeshEditor.RemoveTriangles(mesh, innerExtrude.InitialTriangles);

                MeshEditor.Append(mesh, outerMesh);

                if (cached_is_closed == false)
                {
                    // cheating!
                    MergeCoincidentEdges merge = new MergeCoincidentEdges(mesh);
                    merge.Apply();
                }
            }
            else
            {
                double thickness = (shell_direction == ShellDirections.Outer) ?
                                   shell_thickness : -shell_thickness;

                MeshExtrudeMesh extrude = new MeshExtrudeMesh(mesh);
                extrude.IsPositiveOffset = (shell_direction == ShellDirections.Outer);

                extrude.ExtrudedPositionF = (v, n, vid) => {
                    return(v + thickness * (Vector3d)n);
                };

                if (extrude.Extrude() == false)
                {
                    throw new Exception("MeshShellOp.compute_shell_extrude: Extrude() returned false!");
                }

                if (shell_surface_only && cached_is_closed)
                {
                    MeshEditor.RemoveTriangles(mesh, extrude.InitialTriangles);
                    if (shell_direction == ShellDirections.Inner)
                    {
                        mesh.ReverseOrientation();
                    }
                    if (shell_direction == ShellDirections.Inner || shell_direction == ShellDirections.Outer)
                    {
                        mesh.AttachMetadata("is_partial", new object());
                    }
                }
            }

            if (is_invalidated())
            {
                return;
            }

            ResultMesh = mesh;
        }