virtual public bool OnCommand(string MenuId) { switch (MenuId) { case "MenuId.Reverse": (path as ICurve).Reverse(); if (propertyPage != null) { propertyPage.Refresh(this); } return(true); case "MenuId.CurveSplit": Frame.SetAction(new ConstrSplitCurve(path)); return(true); case "MenuId.Approximate": if (Frame.ActiveAction is SelectObjectsAction) { Curves.Approximate(Frame, path); } return(true); case "MenuId.Explode": if (Frame.ActiveAction is SelectObjectsAction) { using (Frame.Project.Undo.UndoFrame) { IGeoObjectOwner addTo = path.Owner; if (addTo == null) { addTo = Frame.ActiveView.Model; } ICurve[] pathCurves = path.Curves; GeoObjectList toSelect = path.Decompose(); addTo.Remove(path); for (int i = toSelect.Count - 1; i >= 0; --i) { if (!toSelect[i].HasValidData()) { toSelect.Remove(i); } } for (int i = 0; i < toSelect.Count; i++) { addTo.Add(toSelect[i]); } SelectObjectsAction soa = Frame.ActiveAction as SelectObjectsAction; soa.SetSelectedObjects(toSelect); // alle Teilobjekte markieren } } return(true); case "MenuId.Aequidist": Frame.SetAction(new ConstructAequidist(path)); return(true); case "MenuId.Reduce": if (path.GetPlanarState() == PlanarState.Planar) { Plane pln = path.GetPlane(); Path2D p2d = path.GetProjectedCurve(pln) as Path2D; if (p2d != null) { p2d.ForceConnected(); Reduce2D r2d = new Reduce2D(); r2d.Precision = Settings.GlobalSettings.GetDoubleValue("Approximate.Precision", 0.01); r2d.Add(p2d.SubCurves); r2d.OutputMode = Reduce2D.Mode.Paths; ICurve2D[] red = r2d.Reduced; if (red.Length == 1) { using (Frame.Project.Undo.UndoFrame) { IGeoObjectOwner addTo = path.Owner; if (addTo == null) { addTo = Frame.ActiveView.Model; } addTo.Remove(path); Path redpath = red[0].MakeGeoObject(pln) as Path; if (redpath != null) { SelectObjectsAction soa = Frame.ActiveAction as SelectObjectsAction; soa.SetSelectedObjects(new GeoObjectList(redpath)); } } } } } return(true); } return(false); }
private void AddSplittedFace(Face face) { List <ICurve> edgeCurves = new List <ICurve>(); List <ICurve2D> curves2d = new List <ICurve2D>(); #if DEBUG Vertex[] vtx = face.Vertices; bool[] outside = new bool[vtx.Length]; Polyline pln = Polyline.Construct(); for (int i = 0; i < vtx.Length; i++) { outside[i] = outsideVertices.Contains(vtx[i]); pln.AddPoint(vtx[i].Position); } DebuggerContainer dc = new DebuggerContainer(); #endif Edge[] edges = face.AllEdges; // sollte keine Löcher haben for (int i = 0; i < edges.Length; i++) { List <double> positions; if (splitedEdges.TryGetValue(edges[i], out positions)) { List <double> pos = new List <double>(positions); pos.Add(0.0); pos.Add(1.0); pos.Sort(); int startj; Vertex startVertex; ICurve2D c2d = edges[i].Curve2D(face); #if DEBUG dc.Add(c2d, System.Drawing.Color.Red, i); #endif if ((face.Surface.PointAt(c2d.StartPoint) | edges[i].Vertex1.Position) < (face.Surface.PointAt(c2d.StartPoint) | edges[i].Vertex2.Position)) { startVertex = edges[i].Vertex1; } else { startVertex = edges[i].Vertex2; // die Kurve geht andersrum als die Kante, also Kantenschnittpunkte umdrehen pos.Reverse(); } if (outsideVertices.Contains(startVertex)) { startj = 1; } else { startj = 0; } for (int j = startj; j < pos.Count - 1; j += 2) { double pos1 = c2d.PositionOf(face.Surface.PositionOf(edges[i].Curve3D.PointAt(pos[j]))); double pos2 = c2d.PositionOf(face.Surface.PositionOf(edges[i].Curve3D.PointAt(pos[j + 1]))); if (pos2 < pos1) { double tmp = pos1; pos1 = pos2; pos2 = tmp; } ICurve2D trimmed = c2d.Trim(pos1, pos2); curves2d.Add(trimmed); #if DEBUG dc.Add(trimmed, System.Drawing.Color.Blue, i); #endif } } else { if (!outsideVertices.Contains(edges[i].Vertex1)) { #if DEBUG dc.Add(edges[i].Curve2D(face), System.Drawing.Color.Green, i); #endif curves2d.Add(edges[i].Curve2D(face)); } } } List <ICurve2D> lc2d; if (all2DCurves.TryGetValue(face, out lc2d)) { for (int i = 0; i < lc2d.Count; i++) { #if DEBUG dc.Add(lc2d[i], System.Drawing.Color.HotPink, i); #endif // die folgende Kurve mit Start- und Endpunkt anpassen, denn sie ist evtl ungenau... curves2d.Add(lc2d[i]); } } // alle zuletzt hinzugefügten Kurven magnetisch einschnappen lassen for (int i = all2DCurves.Count - lc2d.Count; i < all2DCurves.Count; i++) { AddAndAdjust2DCurve(curves2d, i); } // eigentlich wäre mehr Information vorhanden, als dass man diese Kurven völlig neu sortieren müsste // aber so ist es nun mal einfacher ICurve2D[] acsd = new ICurve2D[curves2d.Count]; for (int i = 0; i < acsd.Length; i++) { acsd[i] = curves2d[i].Clone(); } Reduce2D r2d = new Reduce2D(); r2d.Add(acsd); r2d.OutputMode = Reduce2D.Mode.Paths; ICurve2D[] red = r2d.Reduced; if (red.Length == 1) { Border bdr = new Border(red[0]); SimpleShape ss = new SimpleShape(bdr); Face splitted = Face.MakeFace(face.Surface, ss); resultingFaces.Add(splitted); } //CompoundShape cs = CompoundShape.CreateFromList(acsd, Precision.eps); //if (cs != null && cs.SimpleShapes.Length == 1) //{ // SimpleShape ss = cs.SimpleShapes[0]; // Face splitted = Face.MakeFace(face.Surface, ss); // resultingFaces.Add(splitted); //} //else //{ //} }