Beispiel #1
0
        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
            //{
            //}
        }