System.Windows.Media.PolyLineSegment - Działa bardzo wolno.

0

Jestem tu nowy, więc witam wszystkich :)

Pracuje na maszynie CNC, przecinarce plazmowej, która korzysta z kodu Essi. Jest to na tyle stary i mało popularny kod, że w necie nie ma za wiele programów związanych z tym kodem, dlatego postanowiłem napisać własny program do podglądu i drobnej edycji rysunków wykonanych tym kodem. Jednak mam pewien problem.
Kod maszyny opisujący linie jest prosty, zwykłe +/- X +/-Y końca linii, a początkiem linii zawsze jest koniec ostatniej linii lub punkt 0,0, więc do tego wykorzystałem "System.Windows.Shapes.Polyline".
Jednak mam pewną zagwozdkę z łukami ponieważ łuk opisany jest w następujący sposób : +/-X +/-Y +/-Xcenter +/-Ycenter +/-. Tak samo mam współrzędne końca łuku, plus współrzędne środka łuku, a na końcu mam +/- oznaczający czy łuk jest rysowany zgodnie z kierunkiem wskazówek zegara czy odwrotnie.
Najpierw znalazłem DrawArc, ale to rysuję łuk z wykorzystaniem kątów, których nie ma w kodzie maszyny. Mogę bawić się z tym i wyliczać kąty, ale to takie trochę obchodzenie problemu na około i cała masa różnych if-ów. Poszukałem w necie lepszego rozwiązania i trafiłem na "System.Windows.Media.ArcSegment". To pasowałoby mi bardziej, bo po pierwsze operuje na współrzędnych, a po drugie mam opcje wyboru clockwise czy przeciwnie.
Postanowiłem więc zamienić to co już miałem w "System.Windows.Shapes.Polyline" na "System.Windows.Media.PolyLineSegment", żeby pasowało do ArcSegment.
Niestety musiałem coś zrobić nie tak, bo w tym momencie działa to bardzo wolno. Proste rysunki składające się z samych prostych linii wczytują się bardzo długo, nawet 2 sekundy, a przy korzystaniu z "System.Windows.Shapes.Polyline" były to ułamki sekund, wręcz natychmiast.

Pomożecie? :)

internal void Wyswietl(Obiekt[] ksztalt)
        {
            int x = 0;
            int y = 0;

            PathFigure pthFigure = new PathFigure();
            pthFigure.StartPoint = new Point(x, y);

            PolyLineSegment myPolyLineSegment = new PolyLineSegment();
            PointCollection myPointCollection = new PointCollection();
            PathSegmentCollection PthSegmentCollection = new PathSegmentCollection();
            PathFigureCollection pthFigureCollection = new PathFigureCollection();
            PathGeometry pthGeometry = new PathGeometry();

            for (int i = 0; i < 100; i++)    // Pętla przechodząca po obiektach
            {
                if (ksztalt[i].ciecie != 0)   // czy obiekt nie jest pusty. Później będą tu rozróżniane rodzaje cięcia.
                {
                    for (int j = 0; j < 100; j++)    // pętla przechodzi po kolejnych liniach obiektu. 
                    {
                        if (ksztalt[i].linie[j].xend != 0 || ksztalt[i].linie[j].yend != 0)
                        {
                            if (ksztalt[i].linie[j].xbool)    // Sprawdzanie czy X jest dodatni czy ujemny
                                x += ksztalt[i].linie[j].xend;
                            else
                                x -= ksztalt[i].linie[j].xend;

                            if (ksztalt[i].linie[j].ybool)    // Sprawdzanie czy Y jest dodatni czy ujemny
                                y += ksztalt[i].linie[j].yend;
                            else
                                y -= ksztalt[i].linie[j].yend;

                            myPointCollection.Add(new Point(x, y));
                        }
                        myPolyLineSegment.Points = myPointCollection;
                        PthSegmentCollection.Add(myPolyLineSegment);
                    }
                    pthFigure.Segments = PthSegmentCollection;
                    pthFigureCollection.Add(pthFigure);
                    pthGeometry.Figures = pthFigureCollection;
                    rysunek.Data = pthGeometry;
                }
            }
        }

A wyrzucane jest to na :

<Path Name="rysunek" Stroke="White" StrokeThickness="1" Margin="20,20,20,20"></Path>

Choć z programowaniem mam do czynienia od wielu lat to jestem jednak amatorem, a to mój pierwszy program okienkowy. Dotychczas wystarczało mi okienko terminala, nawet ten program początkowo zacząłem pisać w Pascalu, a później podniosłem sobie poprzeczkę i postanowiłem, że czas ogarnąć coś nowego i takim sposobem wybór padł na C# i Visual Studio.

Z góry dzięki za każdą pomoc.

2

(kod skrócony dla potrzeb cytatu)

ZajOnDz napisał(a):
            PolyLineSegment myPolyLineSegment = new PolyLineSegment();
            PointCollection myPointCollection = new PointCollection();
            PathSegmentCollection PthSegmentCollection = new PathSegmentCollection();

            for (100 razy)
            {
                if (coś tam)
                {
                    for (100 razy)
                    {
                        if (coś tam)
                        {
                            myPointCollection.Add(new Point(x, y));
                        }
                        myPolyLineSegment.Points = myPointCollection;
                        PthSegmentCollection.Add(myPolyLineSegment);

Nigdzie nie czyścisz myPointCollection, w związku z tym kumulują się w kolekcji punkty i do PthSegmentCollection trafiają coraz większe kolekcje - zawierające oprócz nowych też powtórzenie wszystkich dotychczasowych punktów.
Możliwe że niżej w kodzie z segmentami dzieje się podobnie, już nie analizowałem.

0

O kurcze, dzięki. Rzeczywiście, nakładało się wszystko na siebie wielokrotnie. Jeszcze raz dzięki za pomoc :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1