public void Test() { CadFigure baseFig = GetTargetFigure(); if (baseFig == null) { return; } if (baseFig.Type != CadFigure.Types.POLY_LINES) { return; } (Vector3d p1, Vector3d p2) = InputLine(); Vector3d org = p1; Vector3d axis = (p2 - p1).Normalized(); CadMesh cm = MeshMaker.CreateRotatingBody(32, org, axis, baseFig.PointList, false, false, MeshMaker.FaceType.QUADRANGLE); CadFigure fig = MesthToFig(cm); CadOpe ope = new CadOpeAddFigure(Controller.CurrentLayer.ID, fig.ID); Session.AddOpe(ope); Controller.CurrentLayer.AddFigure(fig); Session.PostRemakeObjectTree(); }
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); } }
public static HeModel ToHeModel(CadMesh src) { HeModel m = new HeModel(); m.VertexStore = src.VertexStore; Dictionary <uint, HalfEdge> map = new Dictionary <uint, HalfEdge>(); for (int fi = 0; fi < src.FaceStore.Count; fi++) { CadFace f = src.FaceStore[fi]; int vi = f.VList[0]; HalfEdge head = m.CreateHalfEdge(vi); HalfEdge current_he = head; HeFace face = m.CreateFace(head); int faceIndex = m.FaceStore.Add(face); current_he.Face = faceIndex; HalfEdge next_he; for (int pi = 1; pi < f.VList.Count; pi++) { vi = f.VList[pi]; next_he = m.CreateHalfEdge(vi); current_he.Next = next_he; next_he.Prev = current_he; next_he.Face = faceIndex; current_he = next_he; } head.Prev = current_he; current_he.Next = head; HalfEdge c = head; for (; ;) { HeConnector.SetHalfEdgePair(c, map); map[HeConnector.GetHeKey(c)] = c; c = c.Next; if (c == head) { break; } } } m.RecreateNormals(); return(m); }
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 static bool IsPointInTriangle(Vector3d p, CadFace triangle, CadMesh mesh) { if (triangle.VList.Count < 3) { return(false); } Vector3d p0 = mesh.VertexStore[triangle.VList[0]].vector; Vector3d p1 = mesh.VertexStore[triangle.VList[1]].vector; Vector3d p2 = mesh.VertexStore[triangle.VList[2]].vector; Vector3d c1 = CadMath.CrossProduct(p, p0, p1); Vector3d c2 = CadMath.CrossProduct(p, p1, p2); Vector3d c3 = CadMath.CrossProduct(p, p2, p0); double ip12 = CadMath.InnerProduct(c1, c2); double ip13 = CadMath.InnerProduct(c1, c3); // When all corossProduct result's sign are same, Point is in triangle if (ip12 > 0 && ip13 > 0) { return(true); } return(false); }
public static CadMesh CreateSphere(Vector3d pos, double r, int slices1, int slices2) { VertexList vl = new VertexList(slices2); double d = Math.PI / slices2; for (int i = 0; i < slices2; i++) { double a = i * d; double x = Math.Sin(a) * r; double y = Math.Cos(a) * r; vl.Add(CadVertex.Create(x, y, 0)); } vl.Add(CadVertex.Create(0, -r, 0)); CadMesh mesh = CreateRotatingBody( slices1, Vector3d.Zero, Vector3d.UnitY, vl, false, false, FaceType.TRIANGLE); for (int i = 0; i < mesh.VertexStore.Count; i++) { mesh.VertexStore.Ref(i).vector += pos; } return(mesh); }
public static CadMesh CreateFrom(VertexList vl) { if (vl.Count < 2) { return(null); } CadMesh m = new CadMesh(vl.Count, 1); m.VertexStore.AddRange(vl); int i; FlexArray <int> nl = new FlexArray <int>(vl.Count); for (i = 0; i < vl.Count; i++) { nl.Add(i); } CadFace face = new CadFace(nl); m.FaceStore.Add(face); return(m); }
// 単位正八面体作成 public static CadMesh CreateUnitOctahedron() { CadMesh cm = new CadMesh(8, 12); var v0 = new CadVertex(-0.70710678, -0.70710678, 0.00000000); var v1 = new CadVertex(-0.70710678, 0.70710678, 0.00000000); var v2 = new CadVertex(0.70710678, 0.70710678, 0.00000000); var v3 = new CadVertex(0.70710678, -0.70710678, 0.00000000); var v4 = new CadVertex(0.00000000, 0.00000000, -1.00000000); var v5 = new CadVertex(0.00000000, 0.00000000, 1.00000000); cm.VertexStore.Add(v0); cm.VertexStore.Add(v1); cm.VertexStore.Add(v2); cm.VertexStore.Add(v3); cm.VertexStore.Add(v4); cm.VertexStore.Add(v5); cm.FaceStore.Add(new CadFace(0, 1, 4)); cm.FaceStore.Add(new CadFace(0, 4, 3)); cm.FaceStore.Add(new CadFace(0, 3, 5)); cm.FaceStore.Add(new CadFace(0, 5, 1)); cm.FaceStore.Add(new CadFace(1, 2, 4)); cm.FaceStore.Add(new CadFace(1, 5, 2)); cm.FaceStore.Add(new CadFace(2, 3, 4)); cm.FaceStore.Add(new CadFace(2, 5, 3)); return(cm); }
public void MakeRotatingBody(uint baseFigID, Vector3d org, Vector3d axis, bool topCap, bool btmCap) { CadFigure baseFig = GetFigure(baseFigID); if (baseFig == null) { return; } if (baseFig.Type != CadFigure.Types.POLY_LINES) { return; } CadMesh cm = MeshMaker.CreateRotatingBody(32, org, axis, baseFig.PointList, topCap, btmCap, MeshMaker.FaceType.TRIANGLE); CadFigure fig = MesthToFig(cm); CadOpe ope = new CadOpeAddFigure(Controller.CurrentLayer.ID, fig.ID); Session.AddOpe(ope); Controller.CurrentLayer.AddFigure(fig); ope = new CadOpeRemoveFigure(Controller.CurrentLayer, baseFig.ID); Session.AddOpe(ope); Controller.CurrentLayer.RemoveFigureByID(baseFig.ID); Session.PostRemakeObjectTree(); }
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); }
// 全てのFaceを3角形に分割する public static void SplitAllFace(CadMesh mesh) { FlexArray <CadFace> faceStore = new FlexArray <CadFace>(); for (int i = 0; i < mesh.FaceStore.Count; i++) { CadFace face = mesh.FaceStore[i]; if (face.VList.Count < 3) { continue; } if (face.VList.Count == 3) { faceStore.Add(face); continue; } List <CadFace> flist = Split(face, mesh); faceStore.AddRange(flist); } mesh.FaceStore = faceStore; }
public static int FindMaxDistantPointIndex(CadVertex p0, CadFace f, CadMesh mesh) { int ret = -1; int i; CadVertex t; double maxd = 0; for (i = 0; i < f.VList.Count; i++) { CadVertex fp = mesh.VertexStore[f.VList[i]]; t = fp - p0; double d = t.Norm(); if (d > maxd) { maxd = d; ret = i; } } return(ret); }
public static CadMesh ScaleMesh(CadMesh cm, double scale) { for (int i = 0; i < cm.VertexStore.Count; i++) { cm.VertexStore.Ref(i) *= scale; } return(cm); }
public static CadMesh MoveMesh(CadMesh cm, Vector3d mv) { for (int i = 0; i < cm.VertexStore.Count; i++) { cm.VertexStore.Ref(i) += mv; } return(cm); }
public static CadMesh CreateUnitCube(Vector3d wv, Vector3d hv, FaceType faceType = FaceType.TRIANGLE) { Vector3d tv = CadMath.Normal(wv, hv); Vector3d wv2 = wv / 2; Vector3d hv2 = hv / 2; Vector3d tv2 = tv / 2; CadMesh cm = new CadMesh(8, 12); cm.VertexStore.Add(CadVertex.Create(wv2 + hv2 + tv2)); cm.VertexStore.Add(CadVertex.Create(-wv2 + hv2 + tv2)); cm.VertexStore.Add(CadVertex.Create(-wv2 - hv2 + tv2)); cm.VertexStore.Add(CadVertex.Create(wv2 - hv2 + tv2)); cm.VertexStore.Add(CadVertex.Create(wv2 + hv2 - tv2)); cm.VertexStore.Add(CadVertex.Create(-wv2 + hv2 - tv2)); cm.VertexStore.Add(CadVertex.Create(-wv2 - hv2 - tv2)); cm.VertexStore.Add(CadVertex.Create(wv2 - hv2 - tv2)); if (faceType == FaceType.QUADRANGLE) { cm.FaceStore.Add(new CadFace(0, 1, 2, 3)); cm.FaceStore.Add(new CadFace(7, 6, 5, 4)); cm.FaceStore.Add(new CadFace(0, 4, 5, 1)); cm.FaceStore.Add(new CadFace(1, 5, 6, 2)); cm.FaceStore.Add(new CadFace(2, 6, 7, 3)); cm.FaceStore.Add(new CadFace(3, 7, 4, 0)); } else { cm.FaceStore.Add(new CadFace(0, 1, 2)); cm.FaceStore.Add(new CadFace(2, 3, 0)); cm.FaceStore.Add(new CadFace(7, 6, 5)); cm.FaceStore.Add(new CadFace(5, 4, 7)); cm.FaceStore.Add(new CadFace(0, 4, 5)); cm.FaceStore.Add(new CadFace(5, 1, 0)); cm.FaceStore.Add(new CadFace(1, 5, 6)); cm.FaceStore.Add(new CadFace(6, 2, 1)); cm.FaceStore.Add(new CadFace(2, 6, 7)); cm.FaceStore.Add(new CadFace(7, 3, 2)); cm.FaceStore.Add(new CadFace(3, 7, 4)); cm.FaceStore.Add(new CadFace(4, 0, 3)); } return(cm); }
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 static CadMesh CreateCylinder(Vector3d pos, int circleDiv, int slices, double r, double len) { CadMesh mesh = CreateCylinder(circleDiv, slices, r, len); for (int i = 0; i < mesh.VertexStore.Count; i++) { mesh.VertexStore.Ref(i) += pos; } return(mesh); }
public static CadMesh CreateBox(Vector3d pos, Vector3d sizeV, FaceType faceType = FaceType.TRIANGLE) { CadMesh cm = CreateUnitCube(faceType); for (int i = 0; i < cm.VertexStore.Count; i++) { cm.VertexStore.Ref(i) *= sizeV; cm.VertexStore.Ref(i) += pos; } return(cm); }
public static CadMesh CreateOctahedron(Vector3d pos, Vector3d sizeV) { CadMesh cm = CreateUnitOctahedron(); for (int i = 0; i < cm.VertexStore.Count; i++) { cm.VertexStore.Ref(i) *= sizeV; cm.VertexStore.Ref(i) += pos; } return(cm); }
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(); }
// 単位立方体作成 public static CadMesh CreateUnitCube(FaceType faceType = FaceType.TRIANGLE) { CadMesh cm = new CadMesh(8, 12); cm.VertexStore.Add(CadVertex.Create(+0.5, +0.5, +0.5)); cm.VertexStore.Add(CadVertex.Create(-0.5, +0.5, +0.5)); cm.VertexStore.Add(CadVertex.Create(-0.5, -0.5, +0.5)); cm.VertexStore.Add(CadVertex.Create(+0.5, -0.5, +0.5)); cm.VertexStore.Add(CadVertex.Create(+0.5, +0.5, -0.5)); cm.VertexStore.Add(CadVertex.Create(-0.5, +0.5, -0.5)); cm.VertexStore.Add(CadVertex.Create(-0.5, -0.5, -0.5)); cm.VertexStore.Add(CadVertex.Create(+0.5, -0.5, -0.5)); if (faceType == FaceType.QUADRANGLE) { cm.FaceStore.Add(new CadFace(0, 1, 2, 3)); cm.FaceStore.Add(new CadFace(7, 6, 5, 4)); cm.FaceStore.Add(new CadFace(0, 4, 5, 1)); cm.FaceStore.Add(new CadFace(1, 5, 6, 2)); cm.FaceStore.Add(new CadFace(2, 6, 7, 3)); cm.FaceStore.Add(new CadFace(3, 7, 4, 0)); } else { cm.FaceStore.Add(new CadFace(0, 1, 2)); cm.FaceStore.Add(new CadFace(2, 3, 0)); cm.FaceStore.Add(new CadFace(7, 6, 5)); cm.FaceStore.Add(new CadFace(5, 4, 7)); cm.FaceStore.Add(new CadFace(0, 4, 5)); cm.FaceStore.Add(new CadFace(5, 1, 0)); cm.FaceStore.Add(new CadFace(1, 5, 6)); cm.FaceStore.Add(new CadFace(6, 2, 1)); cm.FaceStore.Add(new CadFace(2, 6, 7)); cm.FaceStore.Add(new CadFace(7, 3, 2)); cm.FaceStore.Add(new CadFace(3, 7, 4)); cm.FaceStore.Add(new CadFace(4, 0, 3)); } return(cm); }
public CadFigure AddCylinder(Vector3d pos, int circleDiv, int slices, double r, double len) { CadMesh cm = MeshMaker.CreateCylinder(pos, circleDiv, slices, r, len); CadFigure fig = MesthToFig(cm); CadOpe ope = new CadOpeAddFigure(Controller.CurrentLayer.ID, fig.ID); Session.AddOpe(ope); Controller.CurrentLayer.AddFigure(fig); Session.PostRemakeObjectTree(); return(fig); }
public CadFigure AddSphere(Vector3d pos, int slices, double r) { CadMesh cm = MeshMaker.CreateSphere(pos, r, slices, slices); CadFigure fig = MesthToFig(cm); CadOpe ope = new CadOpeAddFigure(Controller.CurrentLayer.ID, fig.ID); Session.AddOpe(ope); Controller.CurrentLayer.AddFigure(fig); Session.PostRemakeObjectTree(); return(fig); }
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); }
public CadMesh CreateCadMesh(List <CadVertex> plist, List <CadFace> flist) { CadMesh cm = new CadMesh(plist.Count, flist.Count); foreach (CadVertex p in plist) { cm.VertexStore.Add(p); } foreach (CadFace f in flist) { cm.FaceStore.Add(f); } return(cm); }
public CadFigure AddOctahedron(Vector3d pos, double x, double y, double z) { CadMesh cm = MeshMaker.CreateOctahedron(pos, new Vector3d(x, y, z)); CadFigure fig = MesthToFig(cm); CadOpe ope = new CadOpeAddFigure(Controller.CurrentLayer.ID, fig.ID); Session.AddOpe(ope); Controller.CurrentLayer.AddFigure(fig); Session.PostRemakeObjectTree(); return(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); }
public static (CadMesh m1, CadMesh m2) CutMeshWithVector( CadMesh src, Vector3d p0, Vector3d p1, Vector3d normal) { Vector3d wv = (p1 - p0).UnitVector(); Vector3d hv = normal; CadMesh cubeA = MeshMaker.CreateUnitCube(wv, hv, MeshMaker.FaceType.QUADRANGLE); MoveMesh(cubeA, -hv / 2); ScaleMesh(cubeA, 10000); MoveMesh(cubeA, (p1 - p0) / 2 + p0); CadMesh cubeB = MeshMaker.CreateUnitCube(wv, hv, MeshMaker.FaceType.QUADRANGLE); MoveMesh(cubeB, hv / 2); ScaleMesh(cubeB, 10000); MoveMesh(cubeB, (p1 - p0) / 2 + p0); CadMesh m1; try { m1 = CarveW.AMinusB(src, cubeA); } catch (Exception e) { return(null, null); } MeshUtil.SplitAllFace(m1); CadMesh m2; try { m2 = CarveW.AMinusB(src, cubeB); } catch (Exception e) { return(null, null); } MeshUtil.SplitAllFace(m2); return(m1, m2); }
public static CadMesh ToCadMesh(HeModel hem) { CadMesh cm = new CadMesh(); cm.VertexStore = new VertexList(hem.VertexStore); cm.FaceStore = new FlexArray <CadFace>(); for (int i = 0; i < hem.FaceStore.Count; i++) { CadFace cf = ToCadFace(hem.FaceStore[i]); if (cf != null) { cm.FaceStore.Add(cf); } } return(cm); }
private void AddFace(CadMesh mesh, VertexList plist) { if (plist.Count == 0) { return; } int pidx; CadFace f = new CadFace(); for (int i = 0; i < plist.Count; i++) { pidx = mesh.VertexStore.Add(plist[i]); f.VList.Add(pidx); } mesh.FaceStore.Add(f); }