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); }
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(); }
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); }
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; } }
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; }