public void DumpMesh(uint id) { CadFigureMesh fig = GetCadFigureMesh(id); if (fig == null) { ItConsole.println("dumpMesh(id) error: invalid ID"); return; } CadMesh cm = HeModelConverter.ToCadMesh(fig.mHeModel); for (int i = 0; i < cm.VertexStore.Count; i++) { CadVertex v = cm.VertexStore[i]; ItConsole.printf("{0}:{1},{2},{3}\n", i, v.X, v.Y, v.Z); } for (int i = 0; i < cm.FaceStore.Count; i++) { CadFace f = cm.FaceStore[i]; string s = ""; for (int j = 0; j < f.VList.Count; j++) { s += f.VList[j].ToString() + ","; } ItConsole.println(s); } }
private void testTriangulate() { CadFigure tfig = GetTargetFigure(); if (tfig == null || tfig.Type != CadFigure.Types.POLY_LINES) { return; } if (tfig.PointCount < 3) { return; } VertexList vl = tfig.GetPoints(12); CadMesh m = IglW.Triangulate(vl, "a1000q"); HeModel hem = HeModelConverter.ToHeModel(m); CadFigureMesh fig = (CadFigureMesh)Controller.DB.NewFigure(CadFigure.Types.MESH); fig.SetMesh(hem); Controller.CurrentLayer.AddFigure(fig); }
public void Intersection(uint idA, uint idB) { CadFigureMesh figA = GetCadFigureMesh(idA); CadFigureMesh figB = GetCadFigureMesh(idB); if (figA == null || figB == null) { ItConsole.println("invalid ID"); return; } HeModel he_a = figA.mHeModel; HeModel he_b = figB.mHeModel; CadMesh a = HeModelConverter.ToCadMesh(he_a); CadMesh b = HeModelConverter.ToCadMesh(he_b); CadMesh c = CarveW.Intersection(a, b); MeshUtil.SplitAllFace(c); HeModel hem = HeModelConverter.ToHeModel(c); CadFigureMesh fig = (CadFigureMesh)Controller.DB.NewFigure(CadFigure.Types.MESH); fig.SetMesh(hem); CadOpe ope = new CadOpeAddFigure(Controller.CurrentLayer.ID, fig.ID); Session.AddOpe(ope); Controller.CurrentLayer.AddFigure(fig); Session.PostRemakeObjectTree(); }
public CadFigure MesthToFig(CadMesh cm) { HeModel hem = HeModelConverter.ToHeModel(cm); CadFigureMesh fig = (CadFigureMesh)Controller.DB.NewFigure(CadFigure.Types.MESH); fig.SetMesh(hem); return(fig); }
public void CutMesh(uint id) { CadFigureMesh tfig = GetCadFigureMesh(id); if (tfig == null) { ItConsole.println("invalid ID"); return; } (Vector3d p0, Vector3d p1) = InputLine(); if (p0.IsInvalid() || p1.IsInvalid()) { return; } HeModel he = tfig.mHeModel; CadMesh src = HeModelConverter.ToCadMesh(he); Vector3d normal = CadMath.Normal( p1 - p0, (Controller.DC.ViewDir)); (CadMesh m1, CadMesh m2) = MeshUtil.CutMeshWithVector(src, p0, p1, normal); CadFigureMesh fig1 = (CadFigureMesh)Controller.DB.NewFigure(CadFigure.Types.MESH); fig1.SetMesh(HeModelConverter.ToHeModel(m1)); CadFigureMesh fig2 = (CadFigureMesh)Controller.DB.NewFigure(CadFigure.Types.MESH); fig2.SetMesh(HeModelConverter.ToHeModel(m2)); CadOpe ope; ope = new CadOpeAddFigure(Controller.CurrentLayer.ID, fig1.ID); Session.AddOpe(ope); Controller.CurrentLayer.AddFigure(fig1); ope = new CadOpeAddFigure(Controller.CurrentLayer.ID, fig2.ID); Session.AddOpe(ope); Controller.CurrentLayer.AddFigure(fig2); ope = new CadOpeRemoveFigure(Controller.CurrentLayer, tfig.ID); Session.AddOpe(ope); Controller.CurrentLayer.RemoveFigureByID(tfig.ID); Controller.ClearSelection(); Session.PostRemakeObjectTree(); }
private void testAminusB() { List <CadFigure> figList = Controller.DB.GetSelectedFigList(); if (figList.Count < 2) { return; } if (figList[0].Type != CadFigure.Types.MESH) { return; } if (figList[1].Type != CadFigure.Types.MESH) { return; } CadFigureMesh fig_a = (CadFigureMesh)figList[0]; CadFigureMesh fig_b = (CadFigureMesh)figList[1]; if (fig_a.Current) { CadFigureMesh t = fig_a; fig_a = fig_b; fig_b = t; } ItConsole.println("ID:" + fig_a.ID.ToString() + " - ID:" + fig_b.ID.ToString()); HeModel he_a = fig_a.mHeModel; HeModel he_b = fig_b.mHeModel; CadMesh a = HeModelConverter.ToCadMesh(he_a); CadMesh b = HeModelConverter.ToCadMesh(he_b); CadMesh c = CarveW.AMinusB(a, b); HeModel hem = HeModelConverter.ToHeModel(c); CadFigureMesh fig = (CadFigureMesh)Controller.DB.NewFigure(CadFigure.Types.MESH); fig.SetMesh(hem); Controller.CurrentLayer.AddFigure(fig); }
private void test002() { CadMesh cm = MeshMaker.CreateSphere(new Vector3d(0, 0, 0), 20, 16, 16); HeModel hem = HeModelConverter.ToHeModel(cm); CadFigureMesh fig = (CadFigureMesh)Controller.DB.NewFigure(CadFigure.Types.MESH); fig.SetMesh(hem); CadOpe ope = new CadOpeAddFigure(Controller.CurrentLayer.ID, fig.ID); Controller.HistoryMan.foward(ope); Controller.CurrentLayer.AddFigure(fig); Controller.UpdateObjectTree(true); }
private void testLoadOff() { string fname = @"F:\TestFiles\bunny.off"; CadMesh cm = IglW.ReadOFF(fname); HeModel hem = HeModelConverter.ToHeModel(cm); for (int i = 0; i < hem.VertexStore.Count; i++) { hem.VertexStore[i] *= 500.0; } CadFigureMesh fig = (CadFigureMesh)Controller.DB.NewFigure(CadFigure.Types.MESH); fig.SetMesh(hem); Controller.CurrentLayer.AddFigure(fig); }
private void testLoadDxf() { CadDxfLoader loader = new CadDxfLoader(); CadMesh cm = loader.Load(@"F:\work\恐竜.DXF", 20.0); HeModel hem = HeModelConverter.ToHeModel(cm); CadFigureMesh fig = (CadFigureMesh)Controller.DB.NewFigure(CadFigure.Types.MESH); fig.SetMesh(hem); Controller.CurrentLayer.AddFigure(fig); RunOnMainThread(() => { Controller.UpdateObjectTree(true); }); Redraw(); }
public void CutMeshWithVector(CadFigureMesh tfig, Vector3d p0, Vector3d p1, Vector3d normal) { HeModel he = tfig.mHeModel; CadMesh src = HeModelConverter.ToCadMesh(he); (CadMesh m1, CadMesh m2) = MeshUtil.CutMeshWithVector(src, p0, p1, normal); if (m1 == null || m2 == null) { return; } CadFigureMesh fig1 = (CadFigureMesh)Controller.DB.NewFigure(CadFigure.Types.MESH); fig1.SetMesh(HeModelConverter.ToHeModel(m1)); CadFigureMesh fig2 = (CadFigureMesh)Controller.DB.NewFigure(CadFigure.Types.MESH); fig2.SetMesh(HeModelConverter.ToHeModel(m2)); CadOpeList opeRoot = new CadOpeList(); CadOpe ope; ope = new CadOpeAddFigure(Controller.CurrentLayer.ID, fig1.ID); opeRoot.Add(ope); Controller.CurrentLayer.AddFigure(fig1); ope = new CadOpeAddFigure(Controller.CurrentLayer.ID, fig2.ID); opeRoot.Add(ope); Controller.CurrentLayer.AddFigure(fig2); ope = new CadOpeRemoveFigure(Controller.CurrentLayer, tfig.ID); opeRoot.Add(ope); Controller.CurrentLayer.RemoveFigureByID(tfig.ID); Controller.HistoryMan.foward(opeRoot); }
// 押し出し public void Extrude(uint id, Vector3d v, double d, int divide) { CadFigure tfig = Controller.DB.GetFigure(id); if (tfig == null || tfig.Type != CadFigure.Types.POLY_LINES) { return; } v = v.UnitVector(); v *= -d; CadMesh cm = MeshMaker.CreateExtruded(tfig.GetPoints(16), v, divide); HeModel hem = HeModelConverter.ToHeModel(cm); CadFigureMesh fig = (CadFigureMesh)Controller.DB.NewFigure(CadFigure.Types.MESH); fig.RecalcNormal(); fig.SetMesh(hem); CadOpeList root = new CadOpeList(); CadOpe ope; ope = new CadOpeAddFigure(Controller.CurrentLayer.ID, fig.ID); root.Add(ope); ope = new CadOpeRemoveFigure(Controller.CurrentLayer, tfig.ID); root.Add(ope); Session.AddOpe(root); Controller.CurrentLayer.AddFigure(fig); Controller.CurrentLayer.RemoveFigureByID(tfig.ID); Session.PostRemakeObjectTree(); }
private void test003() { CadFigure tfig = GetTargetFigure(); if (tfig == null || tfig.Type != CadFigure.Types.POLY_LINES) { return; } CadMesh cm = MeshMaker.CreateExtruded(tfig.GetPoints(16), Vector3d.UnitZ * -20); HeModel hem = HeModelConverter.ToHeModel(cm); CadFigureMesh fig = (CadFigureMesh)Controller.DB.NewFigure(CadFigure.Types.MESH); fig.SetMesh(hem); CadOpe ope = new CadOpeAddFigure(Controller.CurrentLayer.ID, fig.ID); Controller.HistoryMan.foward(ope); Controller.CurrentLayer.AddFigure(fig); Controller.UpdateObjectTree(true); }
// option: // e.g. // a100q30 max area = 100, min degree = 30 // a100q max area = 100, min degree = default (20) // min degree < 34 // Other options see // https://www.cs.cmu.edu/~quake/triangle.switch.html // public void Triangulate(uint figID, string option) { CadFigure tfig = Controller.DB.GetFigure(figID); if (tfig == null || tfig.Type != Types.POLY_LINES) { return; } if (tfig.PointCount < 3) { return; } CadFigure cfig = FigUtil.Clone(tfig); Vector3d org = cfig.PointList[0].vector; Vector3d dir = Vector3d.UnitZ; Vector3d faceNormal = CadUtil.TypicalNormal(cfig.PointList); Vector3d rotateV = default; double t = 0; if (!faceNormal.EqualsThreshold(dir) && !(-faceNormal).EqualsThreshold(dir)) { rotateV = CadMath.Normal(faceNormal, dir); t = -CadMath.AngleOfVector(faceNormal, dir); CadUtil.RotateFigure(cfig, org, rotateV, t); } //Controller.CurrentLayer.AddFigure(cfig); VertexList vl = cfig.GetPoints(12); CadMesh m = IglW.Triangulate(vl, option); HeModel hem = HeModelConverter.ToHeModel(m); CadFigureMesh fig = (CadFigureMesh)Controller.DB.NewFigure(CadFigure.Types.MESH); fig.SetMesh(hem); for (int i = 0; i < fig.PointCount; i++) { CadVertex v = fig.PointList[i]; v.Z = org.Z; fig.PointList[i] = v; } if (t != 0) { CadUtil.RotateFigure(fig, org, rotateV, -t); } CadOpeList root = new CadOpeList(); CadOpe ope; ope = new CadOpeAddFigure(Controller.CurrentLayer.ID, fig.ID); Session.AddOpe(ope); Controller.CurrentLayer.AddFigure(fig); ope = new CadOpeRemoveFigure(Controller.CurrentLayer, figID); Session.AddOpe(ope); Controller.CurrentLayer.RemoveFigureByID(figID); Controller.CurrentFigure = null; Session.PostRemakeObjectTree(); }