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(); }
public void SeparateFigures(CadFigure fig, int pointIdx) { var res = CadFigureCutter.Cut(mDB, fig, pointIdx); if (!res.isValid()) { return; } CadOpeList opeRoot = new CadOpeList(); CadOpe ope; foreach (EditResult.Item ri in res.AddList) { CadLayer layer = mDB.GetLayer(ri.LayerID); ope = new CadOpeAddFigure(ri.LayerID, ri.FigureID); opeRoot.OpeList.Add(ope); layer.AddFigure(ri.Figure); } foreach (EditResult.Item ri in res.RemoveList) { CadLayer layer = mDB.GetLayer(ri.LayerID); ope = new CadOpeRemoveFigure(layer, ri.FigureID); opeRoot.OpeList.Add(ope); layer.RemoveFigureByID(ri.FigureID); } HistoryMan.foward(opeRoot); }
public void AddCentroid() { Centroid cent = PlotterUtil.Centroid(DB.GetSelectedFigList()); if (cent.IsInvalid) { return; } CadFigure pointFig = mDB.NewFigure(CadFigure.Types.POINT); pointFig.AddPoint((CadVertex)cent.Point); pointFig.EndCreate(DC); CadOpe ope = new CadOpeAddFigure(CurrentLayer.ID, pointFig.ID); HistoryMan.foward(ope); CurrentLayer.AddFigure(pointFig); string s = string.Format("({0:0.000},{1:0.000},{2:0.000})", cent.Point.X, cent.Point.Y, cent.Point.Z); ItConsole.println("Centroid:" + s); ItConsole.println("Area:" + (cent.Area / 100).ToString() + "(㎠)"); }
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 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 void FlipAndCopyWithPlane(List <CadFigure> rootFigList, Vector3d p0, Vector3d normal) { List <CadFigure> cpy = PlotterClipboard.CopyFigures(rootFigList); CadOpeList opeRoot = new CadOpeList(); CadLayer layer = Controller.CurrentLayer; foreach (CadFigure fig in cpy) { fig.ForEachFig(f => { FlipWithPlane(f, p0, normal); Controller.DB.AddFigure(f); }); layer.AddFigure(fig); CadOpe ope = new CadOpeAddFigure(layer.ID, fig.ID); opeRoot.OpeList.Add(ope); } Controller.HistoryMan.foward(opeRoot); RunOnMainThread(() => { Controller.Redraw(); Controller.UpdateObjectTree(remakeTree: true); }); }
public static void PasteFiguresAsBin(PlotterController controller) { if (!Clipboard.ContainsData(CadClipBoard.TypeNameBin)) { return; } byte[] bin = (byte[])Clipboard.GetData(CadClipBoard.TypeNameBin); List <CadFigure> figList = BinToFigList(bin); // Pase figures in fig list Vector3d pp = controller.LastDownPoint; MinMax3D mm3d = CadUtil.GetFigureMinMaxIncludeChild(figList); Vector3d d = pp - mm3d.GetMinAsVector(); CadOpeList opeRoot = new CadOpeList(); foreach (CadFigure fig in figList) { PasteFigure(controller, fig, d); controller.CurrentLayer.AddFigure(fig); // 子ObjectはLayerに追加しない CadOpe ope = new CadOpeAddFigure(controller.CurrentLayer.ID, fig.ID); opeRoot.OpeList.Add(ope); } controller.HistoryMan.foward(opeRoot); }
public CadFigure AddRectRectChamferAt(Vector3d p, double w, double h, double c) { Vector3d viewDir = Controller.DC.ViewDir; Vector3d upDir = Controller.DC.UpVector; Vector3d wdir = CadMath.Normal(viewDir, upDir); Vector3d hdir = upDir.UnitVector(); Vector3d wd = wdir * w; Vector3d hd = hdir * h; CadVertex sp = (CadVertex)p; CadVertex tp = sp; Vector3d wc = wdir * c; Vector3d hc = hdir * c; CadFigure fig = Controller.DB.NewFigure(CadFigure.Types.RECT); fig.AddPoint(tp + wc); tp += wd; fig.AddPoint(tp - wc); fig.AddPoint(tp + hc); tp += hd; fig.AddPoint(tp - hc); fig.AddPoint(tp - wc); tp = sp + hd; fig.AddPoint(tp + wc); fig.AddPoint(tp - hc); tp = sp; fig.AddPoint(tp + hc); fig.IsLoop = true; fig.EndCreate(Controller.DC); CadOpe ope = new CadOpeAddFigure(Controller.CurrentLayer.ID, fig.ID); Session.AddOpe(ope); Controller.CurrentLayer.AddFigure(fig); Session.PostRemakeObjectTree(); return(fig); }
public void AddFigure(CadFigure fig) { lock (Controller.DB) { Controller.DB.AddFigure(fig); Controller.CurrentLayer.AddFigure(fig); CadOpe ope = new CadOpeAddFigure(Controller.CurrentLayer.ID, fig.ID); Session.AddOpe(ope); } }
public void Group(List <CadFigure> targetList) { List <CadFigure> list = FilterRootFigure(targetList); if (list.Count < 2) { ItConsole.println( global::KCad.Properties.Resources.error_select_2_or_more ); return; } CadFigure parent = Controller.DB.NewFigure(CadFigure.Types.GROUP); CadOpeList opeRoot = new CadOpeList(); CadOpe ope; foreach (CadFigure fig in list) { int idx = Controller.CurrentLayer.GetFigureIndex(fig.ID); if (idx < 0) { continue; } ope = new CadOpeRemoveFigure(Controller.CurrentLayer, fig.ID); opeRoot.Add(ope); Controller.CurrentLayer.RemoveFigureByIndex(idx); parent.AddChild(fig); } Controller.CurrentLayer.AddFigure(parent); ope = new CadOpeAddChildlen(parent, parent.ChildList); opeRoot.Add(ope); ope = new CadOpeAddFigure(Controller.CurrentLayer.ID, parent.ID); opeRoot.Add(ope); Session.AddOpe(opeRoot); ItConsole.println( global::KCad.Properties.Resources.notice_was_grouped ); Session.PostRemakeObjectTree(); }
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 void ToPolyLine(uint id) { CadFigure fig = Controller.DB.GetFigure(id); if (!(fig is CadFigureMesh)) { return; } CadFigureMesh figMesh = (CadFigureMesh)fig; HeModel hm = figMesh.mHeModel; CadFigure figPoly = Controller.DB.NewFigure(CadFigure.Types.POLY_LINES); hm.ForReachEdgePoint(v => { figPoly.AddPoint(v); }); if (figPoly.PointCount < 1) { return; } figPoly.IsLoop = true; CadOpeList opeRoot = new CadOpeList(); CadOpe ope; ope = new CadOpeAddFigure(Controller.CurrentLayer.ID, figPoly.ID); opeRoot.Add(ope); Controller.CurrentLayer.AddFigure(figPoly); ope = new CadOpeRemoveFigure(Controller.CurrentLayer, fig.ID); opeRoot.Add(ope); Controller.CurrentLayer.RemoveFigureByID(fig.ID); Session.AddOpe(opeRoot); Env.RunOnMainThread(() => { Controller.ClearSelection(); }); Session.PostRemakeObjectTree(); }
public CadFigure AddPoint(Vector3d p) { CadFigure fig = Controller.DB.NewFigure(CadFigure.Types.POINT); fig.AddPoint((CadVertex)p); fig.EndCreate(Controller.DC); CadOpe ope = new CadOpeAddFigure(Controller.CurrentLayer.ID, fig.ID); Session.AddOpe(ope); Controller.CurrentLayer.AddFigure(fig); 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); }
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 AddLine(Vector3d v0, Vector3d v1) { CadFigure fig = Controller.DB.NewFigure(CadFigure.Types.POLY_LINES); fig.AddPoint((CadVertex)v0); fig.AddPoint((CadVertex)v1); fig.EndCreate(Controller.DC); CadOpe ope = new CadOpeAddFigure(Controller.CurrentLayer.ID, fig.ID); Session.AddOpe(ope); Controller.CurrentLayer.AddFigure(fig); 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 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 testMesh() { var figlist = Controller.DB.GetSelectedFigList(); CadOpeList opeRoot = new CadOpeList(); CadOpe ope; for (int i = 0; i < figlist.Count; i++) { CadFigure fig = figlist[i]; if (fig == null) { continue; } if (fig.Type != CadFigure.Types.POLY_LINES) { continue; } CadFigureMesh mesh = (CadFigureMesh)Controller.DB.NewFigure(CadFigure.Types.MESH); mesh.CreateModel(fig); ope = new CadOpeAddFigure(Controller.CurrentLayer.ID, mesh.ID); opeRoot.Add(ope); Controller.CurrentLayer.AddFigure(mesh); ope = new CadOpeRemoveFigure(Controller.CurrentLayer, fig.ID); opeRoot.Add(ope); Controller.CurrentLayer.RemoveFigureByID(fig.ID); } if (opeRoot.OpeList.Count > 0) { Controller.HistoryMan.foward(opeRoot); } Controller.UpdateObjectTree(true); }
public void CutSegment(MarkSegment ms) { if (!ms.Valid) { return; } if (!ms.CrossPoint.IsValid()) { return; } var res = CadSegmentCutter.CutSegment(mDB, ms, ms.CrossPoint); if (!res.isValid()) { return; } CadOpeList opeRoot = new CadOpeList(); CadOpe ope; foreach (EditResult.Item ri in res.AddList) { CadLayer layer = mDB.GetLayer(ri.LayerID); ope = new CadOpeAddFigure(ri.LayerID, ri.FigureID); opeRoot.OpeList.Add(ope); layer.AddFigure(ri.Figure); } foreach (EditResult.Item ri in res.RemoveList) { CadLayer layer = mDB.GetLayer(ri.LayerID); ope = new CadOpeRemoveFigure(layer, ri.FigureID); opeRoot.OpeList.Add(ope); layer.RemoveFigureByID(ri.FigureID); } HistoryMan.foward(opeRoot); }
public void Ungroup(List <CadFigure> targetList) { List <CadFigure> list = FilterRootFigure(targetList); CadOpeList opeList = new CadOpeList(); CadOpe ope; foreach (CadFigure root in list) { root.ForEachFig((fig) => { if (fig.Parent == null) { return; } fig.Parent = null; if (fig.PointCount > 0) { ope = new CadOpeAddFigure(Controller.CurrentLayer.ID, fig.ID); opeList.Add(ope); Controller.CurrentLayer.AddFigure(fig); } }); ope = new CadOpeRemoveFigure(Controller.CurrentLayer, root.ID); opeList.Add(ope); Controller.CurrentLayer.RemoveFigureByID(root.ID); } Session.AddOpe(opeList); ItConsole.println( KCad.Properties.Resources.notice_was_ungrouped ); Session.PostRemakeObjectTree(); }
// 押し出し 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(); }
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 CadFigure AddCircleAt(Vector3d p, double r) { Vector3d viewDir = Controller.DC.ViewDir; Vector3d upDir = Controller.DC.UpVector; CadFigure fig = Controller.DB.NewFigure(CadFigure.Types.CIRCLE); Vector3d p0 = p; Vector3d p1 = p0 + CadMath.Normal(viewDir, upDir) * r; fig.AddPoint((CadVertex)p0); fig.AddPoint((CadVertex)p1); fig.EndCreate(Controller.DC); CadOpe ope = new CadOpeAddFigure(Controller.CurrentLayer.ID, fig.ID); Session.AddOpe(ope); Controller.CurrentLayer.AddFigure(fig); Session.PostRemakeObjectTree(); return(fig); }
public CadFigure AddRectAt(Vector3d p, double w, double h) { Vector3d viewDir = Controller.DC.ViewDir; Vector3d upDir = Controller.DC.UpVector; Vector3d wd = CadMath.Normal(viewDir, upDir) * w; Vector3d hd = upDir.UnitVector() * h; CadVertex p0 = (CadVertex)p; CadVertex p1 = (CadVertex)p; CadFigure fig = Controller.DB.NewFigure(CadFigure.Types.RECT); fig.AddPoint(p0); p1 = p0 + wd; fig.AddPoint(p1); p1 = p0 + wd + hd; fig.AddPoint(p1); p1 = p0 + hd; fig.AddPoint(p1); fig.IsLoop = true; fig.EndCreate(Controller.DC); CadOpe ope = new CadOpeAddFigure(Controller.CurrentLayer.ID, fig.ID); Session.AddOpe(ope); Controller.CurrentLayer.AddFigure(fig); Session.PostRemakeObjectTree(); return(fig); }
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(); }
public void ToMesh(uint id) { CadOpeList opeRoot = new CadOpeList(); CadOpe ope; CadFigure orgFig = Controller.DB.GetFigure(id); if (orgFig == null) { return; } if (orgFig.Type != CadFigure.Types.POLY_LINES) { return; } CadFigureMesh mesh = (CadFigureMesh)Controller.DB.NewFigure(CadFigure.Types.MESH); mesh.CreateModel(orgFig); foreach (CadFigure fig in orgFig.ChildList) { mesh.AddChild(fig); } CadFigure parent = orgFig.Parent; if (parent != null) { int index = orgFig.Parent.ChildList.IndexOf(orgFig); // Remove original poly lines object ope = new CadOpeRemoveChild(parent, orgFig, index); opeRoot.Add(ope); orgFig.Parent.ChildList.Remove(orgFig); // Insert mesh object ope = new CadOpeAddChild(parent, mesh, index); opeRoot.Add(ope); orgFig.Parent.ChildList.Insert(index, mesh); mesh.Parent = parent; } else { // Remove original poly lines object ope = new CadOpeAddFigure(Controller.CurrentLayer.ID, mesh.ID); opeRoot.Add(ope); Controller.CurrentLayer.AddFigure(mesh); // Insert mesh object ope = new CadOpeRemoveFigure(Controller.CurrentLayer, orgFig.ID); opeRoot.Add(ope); Controller.CurrentLayer.RemoveFigureByID(orgFig.ID); } Session.AddOpe(opeRoot); Env.RunOnMainThread(() => { Controller.ClearSelection(); }); Session.PostRemakeObjectTree(); //PrintSuccess(); }