예제 #1
0
        public static List <PLine> splitSelfIntersectionPline(PLine pline)
        {
            List <PLine> r  = new List <PLine>();
            PLine        pl = new PLine();

            for (int i = 0; i < pline.Count; i++)
            {
                pl.CADData = pline.CADData;
                Edge e = pline[i];
                pl.Add(e);
                int index = pline.findSelfInterPoint(e.EndPoint);
                if (index >= 0)
                {
                    r.Add(pl);
                    pl = new PLine();
                }
            }
            if (pl.Count > 0)
            {
                r.Add(pl);
            }
            return(r);
        }
예제 #2
0
        public static List <PLine> ConstructFromUnorderedSegments(List <Edge> unorderedEdges, int relevantDecimals, ref int numberOfPLines, ref int numberOfSegments, ref int zeroLength, bool writeDatabase, bool useProgressMeter, bool eliminateZeroLengthSegments)
        {
            Editor        ed            = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
            ProgressMeter progressMeter = new ProgressMeter();
            MessageFilter messageFilter = new MessageFilter();

            System.Windows.Forms.Application.AddMessageFilter(messageFilter);
            List <PLine> list = new List <PLine>();

            PLine.edgeVertexList = new EdgeVertexList();
            if (useProgressMeter)
            {
                ProgressMeter arg_44_0 = progressMeter;
                int           arg_44_1 = unorderedEdges.Count;
                //int arg_43_0 = unorderedEdges.Count;
                arg_44_0.SetLimit(arg_44_1);
            }
            if (useProgressMeter)
            {
                progressMeter.Start("Processing lines");
            }
            List <PLine> result;

            try
            {
                //"0." + "".PadLeft(relevantDecimals, '0');
                for (int i = 0; i < unorderedEdges.Count; i++)
                {
                    if (useProgressMeter && i % 100 == 0)
                    {
                        progressMeter.MeterProgress();
                    }
                    Edge edge = unorderedEdges[i];
                    edge.Round(relevantDecimals);
                    PLine.edgeVertexList.Add(edge);
                }
                for (int j = 0; j < unorderedEdges.Count; j++)
                {
                    if (useProgressMeter)
                    {
                        progressMeter.MeterProgress();
                    }
                    messageFilter.CheckMessageFilter((long)j, 100);
                    if (unorderedEdges[j].Status == Edge.EdgeStatus.NotDefined)
                    {
                        PLine pLine = new PLine();
                        pLine.caddata = unorderedEdges[j].CADData;
                        List <Edge> list2 = PLine.smethod_0(unorderedEdges[j], pLine);
                        pLine.AddRange(list2);
                        pLine.Add(unorderedEdges[j]);
                        unorderedEdges[j].Status = Edge.EdgeStatus.NotDefined;
                        List <Edge> list3 = PLine.smethod_1(unorderedEdges[j], pLine);
                        pLine.AddRange(list3);
                        double num  = Math.Pow(10.0, (double)(-(double)relevantDecimals));
                        int    num2 = 0;
                        if (pLine.Count == 1 && pLine[0].Length < num)
                        {
                            zeroLength++;
                            num2++;
                            if (eliminateZeroLengthSegments)
                            {
                                //goto IL_231;
                                continue;
                            }
                        }
                        else
                        {
                            for (int k = pLine.Count - 2; k >= 0; k--)
                            {
                                if (pLine[k].Length < num)
                                {
                                    if (eliminateZeroLengthSegments)
                                    {
                                        pLine[k + 1].StartPoint = pLine[k].StartPoint;
                                        pLine.RemoveAt(k);
                                    }
                                    zeroLength++;
                                    num2++;
                                }
                            }
                        }
                        if (pLine.Count != 0)
                        {
                            List <PLine> pllist = PLine.splitSelfIntersectionPline(pLine);
                            for (int ii = 0; ii < pllist.Count; ii++)
                            {
                                list.Add(pllist[ii]);
                                if (writeDatabase)
                                {
                                    PLine.WriteInDatabase(pllist[ii]);
                                }
                            }
                            //list.Add(pLine);
                            if (!eliminateZeroLengthSegments)
                            {
                                num2 = 0;
                            }
                            numberOfSegments += list2.Count + list3.Count - num2 + 1;
                            numberOfPLines++;

                            /*if (writeDatabase)
                             * {
                             *      PLine.WriteInDatabase(pLine);
                             * }*/
                        }
                    }
                    //IL_231:;
                }
                if (useProgressMeter)
                {
                    progressMeter.Stop();
                }
                result = list;
            }
            catch (System.Exception ex)
            {
                if (useProgressMeter)
                {
                    progressMeter.Stop();
                }
                throw;
            }
            return(result);
        }