bool ICommandHandler.OnCommand(string MenuId) { switch (MenuId) { case "MenuId.Fillet.ChangeRadius": ParametricsRadius pr = new ParametricsRadius(involvedFaces, selectActionContextMenu.soa.Frame, true); selectActionContextMenu.soa.Frame.SetAction(pr); return(true); case "MenuId.Fillet.Remove": Shell orgShell = involvedFaces[0].Owner as Shell; if (orgShell != null) { RemoveFillet rf = new RemoveFillet(involvedFaces[0].Owner as Shell, new HashSet <Face>(involvedFaces)); Shell sh = rf.Result(); if (sh != null) { using (selectActionContextMenu.soa.Frame.Project.Undo.UndoFrame) { sh.CopyAttributes(orgShell); IGeoObjectOwner owner = orgShell.Owner; owner.Remove(orgShell); owner.Add(sh); } } } return(true); } return(false); }
private List <MenuWithHandler> GetFacesSubmenus(Face face) { List <MenuWithHandler> res = new List <MenuWithHandler>(); if (face.IsFillet()) { HashSet <Face> connectedFillets = new HashSet <Face>(); CollectConnectedFillets(face, connectedFillets); FeatureCommandHandler fch = new FeatureCommandHandler(connectedFillets.ToArray(), this, "MenuId.Fillet"); MenuWithHandler fr = new MenuWithHandler("MenuId.Fillet.ChangeRadius"); fr.OnCommand = (menuId) => { ParametricsRadius pr = new ParametricsRadius(connectedFillets.ToArray(), soa.Frame, true); soa.Frame.SetAction(pr); return(true); }; fr.OnSelected = (mh, selected) => { currentMenuSelection.Clear(); currentMenuSelection.AddRange(connectedFillets.ToArray()); currentView.Invalidate(PaintBuffer.DrawingAspect.Select, currentView.DisplayRectangle); }; MenuWithHandler fd = new MenuWithHandler("MenuId.Fillet.Remove"); fd.OnCommand = (menuId) => { Face[] involvedFaces = connectedFillets.ToArray(); Shell orgShell = involvedFaces[0].Owner as Shell; if (orgShell != null) { RemoveFillet rf = new RemoveFillet(involvedFaces[0].Owner as Shell, new HashSet <Face>(involvedFaces)); Shell sh = rf.Result(); if (sh != null) { using (soa.Frame.Project.Undo.UndoFrame) { sh.CopyAttributes(orgShell); IGeoObjectOwner owner = orgShell.Owner; owner.Remove(orgShell); owner.Add(sh); } } } soa.ResetMode(); return(true); }; fd.OnSelected = (mh, selected) => { currentMenuSelection.Clear(); currentMenuSelection.AddRange(connectedFillets.ToArray()); currentView.Invalidate(PaintBuffer.DrawingAspect.Select, currentView.DisplayRectangle); }; fch.SubMenus = new MenuWithHandler[] { fr, fd }; res.Add(fch); } IEnumerable <Face> connected = face.GetSameSurfaceConnected(); // if (connected.Any()) { List <Face> lconnected = new List <Face>(connected); lconnected.Add(face); BoundingCube ext = BoundingCube.EmptyBoundingCube; foreach (Face fc in connected) { ext.MinMax(fc.GetExtent(0.0)); } // maybe a full sphere, cone, cylinder or torus: // except for the sphere: position axis // except for the cone: change radius or diameter // for the cone: smaller and larger diameter // for cone and cylinder: total length if (face.Surface is CylindricalSurface || face.Surface is CylindricalSurfaceNP || face.Surface is ToroidalSurface) { MenuWithHandler mh = new MenuWithHandler("MenuId.FeatureDiameter"); mh.OnCommand = (menuId) => { ParametricsRadius pr = new ParametricsRadius(lconnected.ToArray(), soa.Frame, false); soa.Frame.SetAction(pr); return(true); }; mh.OnSelected = (menuId, selected) => { currentMenuSelection.Clear(); currentMenuSelection.AddRange(lconnected.ToArray()); currentView.Invalidate(PaintBuffer.DrawingAspect.Select, currentView.DisplayRectangle); }; res.Add(mh); } if (face.Surface is CylindricalSurface || face.Surface is CylindricalSurfaceNP || face.Surface is ConicalSurface) { Line axis = null; if (face.Surface is ICylinder cyl) { axis = cyl.Axis.Clip(ext); } if (face.Surface is ConicalSurface cone) { axis = cone.AxisLine(face.Domain.Bottom, face.Domain.Top); } MenuWithHandler mh = new MenuWithHandler("MenuId.AxisPosition"); mh.OnCommand = (menuId) => { ParametricsDistanceActionOld pd = new ParametricsDistanceActionOld(lconnected, axis, soa.Frame); soa.Frame.SetAction(pd); return(true); }; mh.OnSelected = (menuId, selected) => { currentMenuSelection.Clear(); currentMenuSelection.AddRange(lconnected.ToArray()); currentView.Invalidate(PaintBuffer.DrawingAspect.Select, currentView.DisplayRectangle); }; res.Add(mh); } } if (face.Surface is PlaneSurface pls) { // try to find parallel outline edges to modify the distance Edge[] outline = face.OutlineEdges; for (int j = 0; j < outline.Length - 1; j++) { for (int k = j + 1; k < outline.Length; k++) { if (outline[j].Curve3D is Line l1 && outline[k].Curve3D is Line l2) { if (Precision.SameDirection(l1.StartDirection, l2.StartDirection, false)) { // two parallel outline lines, we could parametrize the distance Edge o1 = outline[j]; Edge o2 = outline[k]; // outline[i] is not captured correctly for the anonymous method. I don't know why. With local copies, it works. double lmin = double.MaxValue; double lmax = double.MinValue; double p = Geometry.LinePar(l1.StartPoint, l1.EndPoint, l2.StartPoint); lmin = Math.Min(lmin, p); lmax = Math.Max(lmax, p); p = Geometry.LinePar(l1.StartPoint, l1.EndPoint, l2.EndPoint); lmin = Math.Max(Math.Min(lmin, p), 0); lmax = Math.Min(Math.Max(lmax, p), 1); GeoPoint p1 = Geometry.LinePos(l1.StartPoint, l1.EndPoint, (lmin + lmax) / 2.0); GeoPoint p2 = Geometry.DropPL(p1, l2.StartPoint, l2.EndPoint); if ((p1 | p2) > Precision.eps) { MenuWithHandler mh = new MenuWithHandler("MenuId.EdgeDistance"); Line feedback = Line.TwoPoints(p1, p2); GeoObjectList feedbackArrow = currentView.Projection.MakeArrow(p1, p2, pls.Plane, Projection.ArrowMode.circleArrow); mh.OnCommand = (menuId) => { ParametricsDistanceActionOld pd = new ParametricsDistanceActionOld(o1, o2, feedback, pls.Plane, soa.Frame); soa.Frame.SetAction(pd); return(true); }; mh.OnSelected = (m, selected) => { currentMenuSelection.Clear(); currentMenuSelection.AddRange(feedbackArrow); currentMenuSelection.Add(o1.OtherFace(face)); currentMenuSelection.Add(o2.OtherFace(face)); currentView.Invalidate(PaintBuffer.DrawingAspect.Select, currentView.DisplayRectangle); }; res.Add(mh); } } } } } } if (res.Count > 6) { List <MenuWithHandler> lm = new List <MenuWithHandler>(); for (int i = 4; i < res.Count; i++) { lm.Add(res[i]); } res.RemoveRange(4, lm.Count); MenuWithHandler subMenu = new MenuWithHandler("MenuId.More"); subMenu.SubMenus = lm.ToArray(); res.Add(subMenu); } return(res); }