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.