Hallo Jonapap !
Freut mich, daß Dir mein 'Ansatz' gefällt.
Im Anhang habe ich den Quellcode von Pline2ISO gepostet.
Vielleicht kannst Du damit etwas anfangen...
Die Libraryfunktionen sind nicht kommentiert, da mit einem Packer extrahiert.
Die Bahnkorrektur wird in diesem Programm nicht wirklich berechnet, sondern nur grafisch am Bildschirm abgefragt.
(Auf welcher Seite will der Benutzer die Bahnkorrktur haben)
Die Kernfunktion ist dabei 'is_offset_right'.
- mittels 'grread' wird die Cursorpos. ausgelesen -> givenpt
- 'givenpt' wird mit vlax-curve-getclosestpointto auf die Pline projeziert -> closestpt
- mit vlax-curve-getfirstderiv wird der Steigungsvektor der Pline am Punkt 'closestpt' bestimmt -> 'firstderiv'
- zeigt der Vektor 'closestpt'->'givenpt' nach rechts vom Vektor 'firstderiv' weg -> Bahnkorrektur RECHTS, andernfalls LINKS.
- mit 'grdraw' werden entsprechend der Richtung temporäre Pfeile angezeigt (in der Statuszeile wird zudem LINKS oder RECHTS angezeigt)
- dies wird so lange wiederholt, bis der Benutzer mit der Maus klickt oder eine Taste drückt (dann ist der Rückgabewert von grread kein Code 5 mehr -> siehe Hilfe zu grread)
Das ganze mit der grafischen Auswahl ist aus einer Not heraus entstanden:
Der o.g. Algorithmus hat nämlich einen kleinen Fehler bei scharfkantigen Außenecken.
Liegt der gewählte Punkt in der Nähe einer Außenecke, kann es sein daß rechts und links vertauscht würde.
Deshalb zeige ich die Richtung, die das Programm erkennt mit den Pfeilen an.
So sieht man genau wohin die Bahnkorrektur tatsächlich gesetzt wird (ist sicher und außerdem schick, finde ich).
Die Laufrichtung wird ähnlich abgefragt:
- es wird eine temporäre (dicke) Pline mit einem Segment erstellt.
- mit 'grread' wird der Cursor Punkt ermittelt und wieder auf die Pline projeziert.
- je nachdem, ob der Punkt auf er ersten oder zweiten Hälfte der Pline liegt wird die temporäre Pline auf das erste oder letzte Segment der Kontur 'gelegt'.
- 'grread' wiederholen, bis Klick oder Taste
Mit grread/grdraw kann man tolle Sachen machen, ist aber manchmal etwas aufwändig.
-> Siehe Grread-test.LSP
Bei Fragen helfe ich Dir gerne weiter.
Grüße
Andi
PS:
Den Quellcode habe ich ursprünglich nicht gepostet, da er durch viele Libraryfunktionen sehr lang ist.
Außerdem sind einige Funktionen ziemlich alte 'Gurken' (machmal etwas konfuse Dinger ) und funktionieren nur in 2D/WCS korrekt.
Bin momentan daran die Funktionen zu überarbeiten damit auch WCS/UCS/OCS... korrekt behandelt werden (-> 3D).
Bisher habe ich mich immer gescheut die Dinger zu ändern. (-> never change a winning team )
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP