_

Odwracanie kolejności polilinii

Forum poświęcone flagowemu produktowi oraz aplikacjom pochodnym Autodesku. To jedyne forum mające w tytule nazwę programu, a to ze względu na jego olbrzymią popularność w Polsce. Można tutaj umieszczać również posty z ogólnie pojętej tematyki "Kreślarskie 2D".

Odwracanie kolejności polilinii

Postprzez badziewiak » lut 07, 2017 12:02

Witam
Miałem ostatnio potrzebę odwrócenia kolejności polilinii, ale programowo. Moje narzędzie wykrywa, że kolejność elementów w zbiorze wskazań (wybór przez fence) jest odwrotna, więc póki jest szansa poprawić to, pyta użytkownika o zgodę na odwrócenie jej. Wiem że mogłem popatrzeć sobie w necie jak to robią inni, ale przecież bym nie był badziewiakiem, gdybym najpierw nie spróbował sam. Zamieszczam swoje rozwiązanie jako ciekawostkę przyrodniczą. Metodologia łopatologiczna:

Wszystko niżej opisane należy skopiować do nowej polilinii w kolejności odwrotnej względem polilinii źródłowej.
1. Skopiować współrzędne wierzchołków polilinii starej do nowej - to oczywiste.
2. Skopiować bulge ze znakiem przeciwnym.
3. Skopiować startWidth do endWidth i endWidth do startWidth.

Wszystko prawie dobrze, ale jedno zastrzeżenie: Trzeba przesunąć bulge i width o jedną pozycję do tyłu w stos. do położenia w liscie współrzędnych punktów. Działający przykład w C#:

Kod: Zaznacz cały
                        //Utworzyć nową polilinię
                        Polyline plnNowa = new Polyline();
                        //W odwrotnej kolejności dodawać wierzchołki, ale z przeciwnym bulge
                        int pozBulgeZrod = plnOdwr.NumberOfVertices - 1;
                        for( int i = plnOdwr.NumberOfVertices - 1; i >= 0; i-- )
                        {
                           //Bulge i width jest przesunięty o jedną pozycję, pobierać od przedostatniego.
                           pozBulgeZrod--;
                           if( pozBulgeZrod < 0 )
                           {
                              pozBulgeZrod = plnOdwr.NumberOfVertices - 1;
                           }   //if( pozBulgeZrod < 0 )
                           plnNowa.AddVertexAt( plnNowa.NumberOfVertices, plnOdwr.GetPoint2dAt( i ), -plnOdwr.GetBulgeAt( pozBulgeZrod ), plnOdwr.GetEndWidthAt( pozBulgeZrod ), plnOdwr.GetStartWidthAt( pozBulgeZrod ) );
                        }   //for( int i = plnOdwrKlon.NumberOfVertices - 1; i >=0; i-- )
badziewiak

WARTO WIEDZIEĆ: https://www.dropbox.com/s/qarh4io79f6okzy/IslamPowerX.pps?dl=1
Avatar użytkownika
badziewiak
 
Posty: 2260
Dołączył(a): paź 15, 2008 09:08
Lokalizacja: Chrząszczyżewoszyce powiat Łękołody :D

Re: Odwracanie kolejności polilinii

Postprzez kojacek » lut 07, 2017 12:28

badziewiak napisał(a):Witam
Miałem ostatnio potrzebę odwrócenia kolejności polilinii, ale programowo. Moje narzędzie wykrywa, że kolejność elementów w zbiorze wskazań (wybór przez fence) jest odwrotna, więc póki jest szansa poprawić to, pyta użytkownika o zgodę na odwrócenie jej. Wiem że mogłem popatrzeć sobie w necie jak to robią inni, ale przecież bym nie był badziewiakiem, gdybym najpierw nie spróbował sam. Zamieszczam swoje rozwiązanie jako ciekawostkę przyrodniczą. Metodologia łopatologiczna:

Wszystko niżej opisane należy skopiować do nowej polilinii w kolejności odwrotnej względem polilinii źródłowej.
1. Skopiować współrzędne wierzchołków polilinii starej do nowej - to oczywiste.
2. Skopiować bulge ze znakiem przeciwnym.
3. Skopiować startWidth do endWidth i endWidth do startWidth.

Wszystko prawie dobrze, ale jedno zastrzeżenie: Trzeba przesunąć bulge i width o jedną pozycję do tyłu w stos. do położenia w liscie współrzędnych punktów. Działający przykład w C#:

Kod: Zaznacz cały
                        //Utworzyć nową polilinię
                        Polyline plnNowa = new Polyline();
                        //W odwrotnej kolejności dodawać wierzchołki, ale z przeciwnym bulge
                        int pozBulgeZrod = plnOdwr.NumberOfVertices - 1;
                        for( int i = plnOdwr.NumberOfVertices - 1; i >= 0; i-- )
                        {
                           //Bulge i width jest przesunięty o jedną pozycję, pobierać od przedostatniego.
                           pozBulgeZrod--;
                           if( pozBulgeZrod < 0 )
                           {
                              pozBulgeZrod = plnOdwr.NumberOfVertices - 1;
                           }   //if( pozBulgeZrod < 0 )
                           plnNowa.AddVertexAt( plnNowa.NumberOfVertices, plnOdwr.GetPoint2dAt( i ), -plnOdwr.GetBulgeAt( pozBulgeZrod ), plnOdwr.GetEndWidthAt( pozBulgeZrod ), plnOdwr.GetStartWidthAt( pozBulgeZrod ) );
                        }   //for( int i = plnOdwrKlon.NumberOfVertices - 1; i >=0; i-- )



Nie rozumiem, coś mówisz o wyborze _FENCE, a teraz o polilinii. Co "odwracasz" i po co?
Avatar użytkownika
kojacek
 
Posty: 5293
Dołączył(a): paź 03, 2005 20:17

Re: Odwracanie kolejności polilinii

Postprzez badziewiak » lut 07, 2017 13:18

No tak, wyrwałem coś z kontekstu. Chodzi o to, że określone polilinie są zbierane z rysunków i wg współrzędnych punktów ich załamań są wybierane elementy przez fence. Najpierw trzeba jednak dokonać przypisania tych polilinii do logicznej struktury projektu, a dokonuje się tego przez wskazanie pojedynczych polilinii. Po wskazaniu wykonuje się pobranie fence wzdłuż wierzchołków i wybrane elementy są poddawane analizie pod względem poprawności ułożenia na niej elementów oraz ich prawidłowego doboru. Jeśli w trakcie tej analizy stwierdzono, że w zasadzie wszystko by było ok, tylko elementy są ułożone na tej polilinii w kolejności odwrotnej, to po prostu trzeba tak przekształcić polilinię, aby zachować jej geometrię, tylko zamienić jej początek z końcem. To zapewni zebranie elementów z rysunku w kolejności prawidłowej podczas wsadowego przetwarzania rysunków.
badziewiak

WARTO WIEDZIEĆ: https://www.dropbox.com/s/qarh4io79f6okzy/IslamPowerX.pps?dl=1
Avatar użytkownika
badziewiak
 
Posty: 2260
Dołączył(a): paź 15, 2008 09:08
Lokalizacja: Chrząszczyżewoszyce powiat Łękołody :D

Re: Odwracanie kolejności polilinii

Postprzez kojacek » lut 07, 2017 14:09

badziewiak napisał(a):No tak, wyrwałem coś z kontekstu. Chodzi o to, że określone polilinie są zbierane z rysunków i wg współrzędnych punktów ich załamań są wybierane elementy przez fence. Najpierw trzeba jednak dokonać przypisania tych polilinii do logicznej struktury projektu, a dokonuje się tego przez wskazanie pojedynczych polilinii. Po wskazaniu wykonuje się pobranie fence wzdłuż wierzchołków i wybrane elementy są poddawane analizie pod względem poprawności ułożenia na niej elementów oraz ich prawidłowego doboru. Jeśli w trakcie tej analizy stwierdzono, że w zasadzie wszystko by było ok, tylko elementy są ułożone na tej polilinii w kolejności odwrotnej, to po prostu trzeba tak przekształcić polilinię, aby zachować jej geometrię, tylko zamienić jej początek z końcem. To zapewni zebranie elementów z rysunku w kolejności prawidłowej podczas wsadowego przetwarzania rysunków.


Ja całkiem niedawno robiłem (lispowo) coś dla instalacji SAP-a, i też bawiłem się w wybieranie czujek (bloków) _Fence'm, przy czym kolejność która mnie interesowała, wynikała ze wskazania polilinii (z jednej lub z drugiej strony pętli). Przy czym krawędziowy zbiór wskazań, robiłem po polilinii, takiej jaka jest, a odwrócenie (jeśli było konieczne), wykonywałem już na liście elementów powstałej z ssget. Wybrana polilinia nie była w ogóle edytowana.
Avatar użytkownika
kojacek
 
Posty: 5293
Dołączył(a): paź 03, 2005 20:17

Re: Odwracanie kolejności polilinii

Postprzez badziewiak » lut 07, 2017 15:17

Ja właśnie też robię coś takiego i o tym samym piszę. Moje narzędzie najpierw napisałem w VBA (przed rokiem 2010) a potem przeszedłem na C#. Rozwój narzędzia odłożyłem na kilka lat, teraz do tego wracam. Robiłeś to dla firmy Schrack-Seconet?
badziewiak

WARTO WIEDZIEĆ: https://www.dropbox.com/s/qarh4io79f6okzy/IslamPowerX.pps?dl=1
Avatar użytkownika
badziewiak
 
Posty: 2260
Dołączył(a): paź 15, 2008 09:08
Lokalizacja: Chrząszczyżewoszyce powiat Łękołody :D

Re: Odwracanie kolejności polilinii

Postprzez kojacek » lut 07, 2017 15:22

badziewiak napisał(a):Ja właśnie też robię coś takiego i o tym samym piszę. Moje narzędzie najpierw napisałem w VBA (przed rokiem 2010) a potem przeszedłem na C#. Rozwój narzędzia odłożyłem na kilka lat, teraz do tego wracam. Robiłeś to dla firmy Schrack-Seconet?

Nie. To co robiłem to prościutkie makro., lekkim LISP-em. Żadne tam halo - parę linijek. Coś tam jeszcze parę rzeczy muszę w nim usprawnić.
Avatar użytkownika
kojacek
 
Posty: 5293
Dołączył(a): paź 03, 2005 20:17

Re: Odwracanie kolejności polilinii

Postprzez Lukaszs85 » mar 18, 2017 17:47

Jeśli dobrze rozumiem poruszone zagadnienie to jest na to gotowa funkcja autocada dostępna z poziomu edycji polilinii bądź z komendy ODWRÓĆ. Zamienia ona nr wierzchołków polilinii bez jej zmiany. W przypadku zamkniętych zmienia kierunek numeracji wierzchołków.
Sam odkryłem to w sumie przypadkiem:) a zdarza mi sie korzystać bo w CNC kierunki polilinii również mają zastosowanie.
Lukaszs85
 
Posty: 21
Dołączył(a): lut 24, 2017 00:24

Re: Odwracanie kolejności polilinii

Postprzez badziewiak » mar 18, 2017 21:02

Potrzebowałem zrobić to programowo, nie bezpośrednio z autocada.
badziewiak

WARTO WIEDZIEĆ: https://www.dropbox.com/s/qarh4io79f6okzy/IslamPowerX.pps?dl=1
Avatar użytkownika
badziewiak
 
Posty: 2260
Dołączył(a): paź 15, 2008 09:08
Lokalizacja: Chrząszczyżewoszyce powiat Łękołody :D


Powrót do AutoCAD

Kto przegląda forum

Użytkownicy przeglądający ten dział: Majestic-12 [Bot]