CNC-koneeseeni tarvisin kaarikomentoa varten laskea kaaren loppupisteen koordinaatit.
Tein python-skriptin joka tuon tekee, mutta jostakin syystä koordinaatit menee päin seiniä
Saan alkuarvoiksi ympyrän keskipisteen, kaaren alkupisteen ja kaaren keskipisteen koordinaatit. Lisäksi tulee kaaren kulma, säteen ja pituus
ARCSTARTX 150.000,
ArcStartY 50.000,
ArcMidX 130.116,
ArcMidY 80.116,
ANGLE 46.262,
ARCCENTREX 66.477,
ARCCENTERY 16.476
Radius 90
Seuraava komento on uuden viivan alkupiste (tämä on siis oikeasti kaaren loppupiste)
S 100.000000, 50.000000
Koitin laskea tuota mutta se koordinaatti tuntuu heittävän aina vaan, ilmeisesti pitäs huomioida yksikköympyrän kulmat jotenkin eri tavalla, kun näyttää että loppupistettä ei saa asettumaan tuohon 100,50-pisteeseen..
Antamissasi luvuissa täytyy olla jotain vikaa, koska ympyrän keskipisteen etäisyys antamastasi kaaren loppupisteestä (100, 50) ei ole 90 vaan noin 47. Muutenkin tiedoissa on parannettavaa: nimien kirjoitusasu vaihtelee eikä ole edes täysin selvää, kumpi keskipiste on ympyrän keskipiste. Sitä paitsi kaaren keskikohta ja ympyrän säde ovat laskujen kannalta tarpeettomia.
Tässä ovat vielä oikeat laskut päätepisteen selvittämiseksi:
import math # Ympyrän keskipiste. xk, yk = 66.477, 16.476 # Kaaren alkupiste. x0, y0 = 150, 50 # Kaaren kulma, 0.8074242185576167. dt = math.radians(46.262) # Säde esitietojen perusteella, 89.99972280512868, noin 90. r = math.hypot(y0 - yk, x0 - xk) # Alkupisteen kulma, 0.3816907046381504, noin 22 astetta. t0 = math.atan2(y0 - yk, x0 - xk) # Loppupisteen kulma, 1.1891149231957672, noin 68 astetta. t1 = t0 + dt # Loppupiste, (100.0002231478678, 99.99931180441938), noin (100, 100). x1, y1 = xk + math.cos(t1) * r, yk + math.sin(t1) * r
Jep, otin alkuarvot vain dumppina cam-työkalun postprosessorilta, ne saa kaikki ulos kaarikomennon mukana. Nimesin ne vain hätäisesti debuggausta varten. Skripti käy siis läpi output-filen ja laskee uusiksi nuo kaarikomennot työstöohjelmaa varten.
Varsinaisesta python-koodista ei ollutkaan tuossa mitään, sekin pitää siistiä kuntoon. Python vaikuttaa ihan kätevältä tuommosten filujen muokkaamiseen ja toimii vaikka eri alustoillakin tarvittaessa.
Kylläpä foorumi näytti voimansa, Iso Käsi! ;)
Toimii!
Mitä pitäs tehdä jos haluaakin myötäpäivään kiertämään tuon kaaren?
Riittääkö pelkät kulmien vähentämiset vai pitääköhän vaihtaa sin/cos-funktioita?
Riittää tietenkin kulman (dt) muuttaminen negatiiviseksi.
koko roska tulemaan, aluksi lähdefile, jossa siis YK- ja YKV-riveillä kolmas parametri on ympyrän keskipisteen x, neljäs parametri on ympyrän keskipisteen y.
niiden tilalle pitäs laskea kaaren loppupisteen x (kolmas parametri) ja loppupisteen y (neljäs parametri)
myötäpäivään menevillä ympyrän kaarilla eli YK-komennoilla tulee tuo neljäs parametri väärin, siihen tulee takaisin se keskipisteen Y, vaikka miten tekisin.
kulma on kerrottu -1:llä, onkohan mun kehittymätön trigonometria haitaksi?
sourcefile, josta nuo rivit luetaan ja kirjoitetaan takaisin uusin arvoin:
%File Name: Profile 1_1 %--- %FEED_RATE_CHANGE YK 33.000,74.834,33.000,84.334,9.500,90.000 %FIRST_CW_ARC_MOVE %ARCSTARTX 33.000, ArcStartY 74.834, ArcMidX 26.282, ArcMidY 77.616, ANGLE 90.000, ARCCENTREX 33.000, ARCCENTERY 84.334 S 23.499769, 107.410538 YK 23.500,107.411,33.000,107.411,9.500,90.000 %FIRST_CW_ARC_MOVE %ARCSTARTX 23.500, ArcStartY 107.411, ArcMidX 26.282, ArcMidY 114.128, ANGLE 90.000, ARCCENTREX 33.000, ARCCENTERY 107.411 S 90.538231, 116.910538 YK 90.538,116.911,90.538,107.411,9.500,90.000 %FIRST_CW_ARC_MOVE %ARCSTARTX 90.538, ArcStartY 116.911, ArcMidX 97.256, ArcMidY 114.128, ANGLE 90.000, ARCCENTREX 90.538, ARCCENTERY 107.411 S 100.038231, 84.333618 YK 100.038,84.334,90.538,84.334,9.500,90.000 %FIRST_CW_ARC_MOVE %ARCSTARTX 100.038, ArcStartY 84.334, ArcMidX 97.256, ArcMidY 77.616, ANGLE 90.000, ARCCENTREX 90.538, ARCCENTERY 84.334 S 32.999771, 74.833618 S-NOPEUS72 %FEED_RATE_CHANGE S 32.999771, 74.833618 %RAPID_MOVE
koodi
import re import math fin = open("C:/temp/oldkone/NUMO/Profile 1_1.AJO","r") fout = open("C:/temp/oldkone/NUMO/koe.ajo", "wt") for line in fin: if 'YK' in line or 'YKv' in line: #cols = line.split(',') print(line + 'original') cols = re.split('[ ,]', line) print ('|0| '+cols[0]+' |1| '+cols[1]+' |2| '+cols[2]+' |3| '+cols[3]+' |4| '+cols[4]+' |5| '+cols[5]+' |6| '+cols[5]+'|') #print ('xk '+ str(xk) + ' yk '+ str(yk) + ' x0 '+ str(x0) +' y0 '+ str(y0)+ ' dt '+ str(dt) + ' r ' + str(r) +' x2 '+ str(x2) +' y2 '+ str(y2) + ' x1 '+ str(x1) +' y1 '+ str(y1) +' t0 '+ str(t0)+' t1 '+ str(t1)+' t2 '+ str(t2) + ' t2deg ' + str(math.degrees(t2)) + ' t1deg ' + str(math.degrees(t1)) ) if cols[0] == 'YK': # kulma asteina ANGLE = float(cols[6]) # keskipiste xk, yk = float(cols[3]), float(cols[4]) # alkupiste x0, y0 = float(cols[1]), float(cols[2]) # alkukulma rad, kaanteisluku dt = math.radians(-1*ANGLE)) # radian r = math.hypot(y0 - yk, x0 - xk) # alkupisteen kulma t0 = math.atan2(y0 - yk, x0 - xk) # loppupisteen kulma t2 = t0 + dt # sijoitetaan takaisin rivin soluihin cols[3], cols[4] = str(xk + math.cos(t2) * r), str(yk + math.sin(t2) * r) if cols[0] == 'YKv': # kulma asteina ANGLE = float(cols[6]) # keskipiste xk, yk = float(cols[3]), float(cols[4]) # alkupiste x0, y0 = float(cols[1]), float(cols[2]) # alkukulma rad dt = math.radians(float(ANGLE)) # radius r = math.hypot(y0 - yk, x0 - xk) # alkupisteen kulma t0 = math.atan2(y0 - yk, x0 - xk) # loppupisteen kulma t1 = t0 + dt cols[3], cols[4] = str(xk + math.cos(t1) * r), str(yk + math.sin(t1) * r) if ANGLE <180: cols[6]='0' #for small curves else: cols[6]='1' fout.write(cols[0]+' '+','.join(cols[1:7])) fout.write('\n') #log print (cols[0]+' '+','.join(cols[1:7])+'\n') else: fout.write(line) fin.close() fout.close() print('C:/temp/oldkone/NUMO/koe.ajo')
Sitte tulokset:
input:
YK 33.000,74.834,33.000,84.334,9.500,90.000
output:
YK 33.000,74.834,23.5,84.334,9.500,0
Neljäs parametri näyttää pysyvän samana, vaikkakin se pitäis olla ympyrän keskipisteen y + sin(-alkukulma) * r
Seuraava komento jatkaa: S 23.499769, 107.410538
oikea kaaren lopun y-koordinaatti on siis reilut 107 eikä tuo n. 84 joka on keskipisteen y-koordinaatti.
yk + math.sin(t2) * r
Aihe on jo aika vanha, joten et voi enää vastata siihen.