def Read(self, caller):
        #Kürzere Namen zuweisen
        lp = caller.line_pairs

        #Layer zuweisen
        s = lp.index_code(8, caller.start + 1)
        self.Layer_Nr = caller.Get_Layer_Nr(lp.line_pair[s].value)
        #XWert
        s = lp.index_code(10, s + 1)
        x0 = float(lp.line_pair[s].value)
        #YWert
        s = lp.index_code(20, s + 1)
        y0 = float(lp.line_pair[s].value)
        #XWert2
        s = lp.index_code(11, s + 1)
        x1 = float(lp.line_pair[s].value)
        #YWert2
        s = lp.index_code(21, s + 1)
        y1 = float(lp.line_pair[s].value)

        Pa = PointClass(x0, y0)
        Pe = PointClass(x1, y1)

        #Anhängen der LineGeo Klasse für die Geometrie
        self.geo.append(LineGeo(Pa=Pa, Pe=Pe))

        #Länge entspricht der Länge des Kreises
        self.length = self.geo[-1].length

        #Neuen Startwert für die nächste Geometrie zurückgeben
        caller.start = s
Esempio n. 2
0
 def Read(self, caller):
     #Kürzere Namen zuweisen
     lp = caller.line_pairs
     e = lp.index_code(0, caller.start + 1)
     #Layer zuweisen
     s = lp.index_code(8, caller.start + 1)
     self.Layer_Nr = caller.Get_Layer_Nr(lp.line_pair[s].value)
     #XWert, YWert Center
     s = lp.index_code(10, s + 1)
     x0 = float(lp.line_pair[s].value)
     s = lp.index_code(20, s + 1)
     y0 = float(lp.line_pair[s].value)
     self.center = PointClass(x0, y0)
     #XWert, YWert. Vektor, relativ zum Zentrum, Große Halbachse
     s = lp.index_code(11, s + 1)
     x1 = float(lp.line_pair[s].value)
     s = lp.index_code(21, s + 1)
     y1 = float(lp.line_pair[s].value)
     self.vector = PointClass(x1, y1)
     #Ratio minor to major axis
     s = lp.index_code(40, s + 1)
     self.ratio = float(lp.line_pair[s].value)
     #Start Winkel - Achtung, ist als rad (0-2pi) im dxf
     s = lp.index_code(41, s + 1)
     self.Start_Ang = float(lp.line_pair[s].value)
     #End Winkel - Achtung, ist als rad (0-2pi) im dxf
     s = lp.index_code(42, s + 1)
     self.End_Ang = float(lp.line_pair[s].value)
     #Neuen Startwert für die nächste Geometrie zurückgeben
     caller.start = e
Esempio n. 3
0
    def __init__(self, Nr=0, caller=None):
        self.Typ = 'Ellipse'
        self.Nr = Nr
        #Initialisieren der Werte
        self.Layer_Nr = 0
        self.center = PointClass(0, 0)  #Mittelpunkt der Geometrie
        self.vector = PointClass(
            1, 0)  #Vektor A = große Halbachse a, = Drehung der Ellipse
        # http://de.wikipedia.org/wiki/Gro%C3%9Fe_Halbachse
        self.ratio = 1  #Verhältnis der kleinen zur großen Halbachse (b/a)
        self.AngS = 0  #Startwinkel beim zeichnen eines Ellipsensegments
        self.AngE = radians(360)  #Endwinkel (Winkel im DXF als Radians!)
        #Die folgenden Grundwerte werden später ein mal berechnet

        self.length = 0
        self.Points = []
        self.Points.append(self.center)
        #Lesen der Geometrie
        self.Read(caller)

        #Zuweisen der Toleranz fürs Fitting
        tol = caller.config.fitting_tolerance.get()

        #Errechnen der Ellipse
        self.Ellipse_Grundwerte()
        self.Ellipse_2_Arcs(tol)
Esempio n. 4
0
    def plot_cut_info(self, CanvasClass, config):
        hdls = []
        hdls.append(self.plot_start(CanvasClass))
        hdls.append(self.plot_end(CanvasClass))
        if self.cut_cor > 40:
            hdls.append(self.plot_cut_cor(CanvasClass))

            #Versatz des Zeichnens durch Position
            P0=PointClass(x=-CanvasClass.dx*CanvasClass.scale,\
                          y=-CanvasClass.dy*CanvasClass.scale-CanvasClass.canvas.winfo_height())

            #Korrektur der Skalierung
            sca = [CanvasClass.scale] * 3

            self.make_start_moves(config)
            hdls += self.st_move[1].plot2can(CanvasClass.canvas,
                                             P0,
                                             sca,
                                             tag=self.nr,
                                             col='SteelBlue3')
            hdls += self.st_move[2].plot2can(CanvasClass.canvas,
                                             P0,
                                             sca,
                                             tag=self.nr,
                                             col='SteelBlue3')
        return hdls
Esempio n. 5
0
    def Read(self, caller):

        #Kürzere Namen zuweisen
        lp = caller.line_pairs
        e = lp.index_code(0, caller.start + 1)

        #Layer zuweisen
        s = lp.index_code(8, caller.start + 1)
        self.Layer_Nr = caller.Get_Layer_Nr(lp.line_pair[s].value)

        #Spline Flap zuweisen
        s = lp.index_code(70, s + 1)
        self.Spline_flag = int(lp.line_pair[s].value)

        #Spline Ordnung zuweisen
        s = lp.index_code(71, s + 1)
        self.degree = int(lp.line_pair[s].value)

        #Number of CPts
        s = lp.index_code(73, s + 1)
        nCPts = int(lp.line_pair[s].value)

        #Lesen der Knoten
        while 1:
            #Knoten Wert
            sk = lp.index_code(40, s + 1, e)
            if sk == None:
                break
            self.Knots.append(float(lp.line_pair[sk].value))
            s = sk

        #Lesen der Gewichtungen
        while 1:
            #Knoten Gewichtungen
            sg = lp.index_code(41, s + 1, e)
            if sg == None:
                break
            self.Weights.append(float(lp.line_pair[sg].value))
            s = sg

        if len(self.Weights) == 0:
            for nr in range(nCPts):
                self.Weights.append(1)

        #Lesen der Kontrollpunkte
        while 1:
            #XWert
            s = lp.index_code(10, s + 1, e)
            #Wenn kein neuer Punkt mehr gefunden wurde abbrechen ...
            if s == None:
                break

            x = float(lp.line_pair[s].value)
            #YWert
            s = lp.index_code(20, s + 1, e)
            y = float(lp.line_pair[s].value)

            self.CPoints.append(PointClass(x, y))

        caller.start = e
Esempio n. 6
0
    def Read(self, caller):
        #Kürzere Namen zuweisen        
        lp=caller.line_pairs
        e=lp.index_both(0,"SEQEND",caller.start+1)+1

        #Layer zuweisen        
        s=lp.index_code(8,caller.start+1)
        self.Layer_Nr=caller.Get_Layer_Nr(lp.line_pair[s].value)

        #Pa=None für den ersten Punkt
        Pa=None
        
        while 1:
            s=lp.index_both(0,"VERTEX",s+1,e)
            if s==None:
                break
            
            #XWert
            s=lp.index_code(10,s+1,e)
            x=float(lp.line_pair[s].value)
            #YWert
            s=lp.index_code(20,s+1,e)
            y=float(lp.line_pair[s].value)
            Pe=PointClass(x=x,y=y)

            #Zuweisen der Geometrien für die Polyline
            if not(type(Pa)==type(None)):
                self.geo.append(LineGeo(Pa=Pa,Pe=Pe))
                self.length+=self.geo[-1].length

            Pa=Pe

                   
        #Neuen Startwert für die nächste Geometrie zurückgeben        
        caller.start=e
Esempio n. 7
0
    def analyse_and_opt(self):
        summe=0

        #Richtung in welcher der Anfang liegen soll (unten links)        
        Popt=PointClass(x=-1e3,y=-1e6)
        
        #Berechnung der Fläch nach Gauß-Elling Positive Wert bedeutet CW
        #negativer Wert bedeutet CCW geschlossenes Polygon            
        for Line in self.geo:
            summe+=(Line.Pa.x*Line.Pe.y-Line.Pe.x*Line.Pa.y)/2
        
        if summe>0.0:
            self.reverse()

                
        #Suchen des kleinsten Startpunkts von unten Links X zuerst (Muss neue Schleife sein!)
        min_distance=self.geo[0].Pa.distance(Popt)
        min_geo_nr=0
        for geo_nr in range(1,len(self.geo)):
            if (self.geo[geo_nr].Pa.distance(Popt)<min_distance):
                min_distance=self.geo[geo_nr].Pa.distance(Popt)
                min_geo_nr=geo_nr

        #Kontur so anordnen das neuer Startpunkt am Anfang liegt
        self.geo=self.geo[min_geo_nr:len(self.geo)]+self.geo[0:min_geo_nr]
    def Read(self, caller):
        #Kürzere Namen zuweisen
        lp = caller.line_pairs
        e = lp.index_code(0, caller.start + 1)

        #Block Name
        ind = lp.index_code(2, caller.start + 1, e)
        self.Block = caller.Get_Block_Nr(lp.line_pair[ind].value)
        #Layer zuweisen
        s = lp.index_code(8, caller.start + 1, e)
        self.Layer_Nr = caller.Get_Layer_Nr(lp.line_pair[s].value)
        #XWert
        s = lp.index_code(10, s + 1, e)
        x0 = float(lp.line_pair[s].value)
        #YWert
        s = lp.index_code(20, s + 1, e)
        y0 = float(lp.line_pair[s].value)
        self.Point = PointClass(x0, y0)

        #XScale
        s_temp = lp.index_code(41, s + 1, e)
        if s_temp != None:
            self.Scale[0] = float(lp.line_pair[s_temp].value)
        #YScale
        s_temp = lp.index_code(42, s + 1, e)
        if s_temp != None:
            self.Scale[1] = float(lp.line_pair[s_temp].value)
        #ZScale
        s_temp = lp.index_code(43, s + 1, e)
        if s_temp != None:
            self.Scale[2] = float(lp.line_pair[s_temp].value)

        #Neuen Startwert für die nächste Geometrie zurückgeben
        caller.start = e
Esempio n. 9
0
 def Ellipse_Point(self, alpha=0):  #PointClass(0,0)
     #große Halbachse, kleine Halbachse, rotation der Ellipse (rad), Winkel des Punkts in der Ellipse (rad)
     Ex = self.a * cos(alpha) * cos(
         self.rotation) - self.b * sin(alpha) * sin(self.rotation)
     Ey = self.a * cos(alpha) * sin(
         self.rotation) + self.b * sin(alpha) * cos(self.rotation)
     return PointClass(self.center.x + Ex, self.center.y + Ey)
Esempio n. 10
0
    def Read(self, caller):
        Old_Point = PointClass(0, 0)
        #Kürzere Namen zuweisen
        lp = caller.line_pairs
        e = lp.index_code(0, caller.start + 1)

        #Layer zuweisen
        s = lp.index_code(8, caller.start + 1)
        self.Layer_Nr = caller.Get_Layer_Nr(lp.line_pair[s].value)

        #Pa=None für den ersten Punkt
        Pa = None

        #Number of vertices
        s = lp.index_code(90, s + 1, e)
        NoOfVert = int(lp.line_pair[s].value)

        #Polyline flag (bit-coded); default is 0; 1 = Closed; 128 = Plinegen
        s = lp.index_code(70, s + 1, e)
        LWPLClosed = int(lp.line_pair[s].value)

        for i in range(1, NoOfVert):
            #XWert
            s = lp.index_code(10, s + 1, e)
            x = float(lp.line_pair[s].value)
            #YWert
            s = lp.index_code(20, s + 1, e)
            y = float(lp.line_pair[s].value)
            Pe = PointClass(x=x, y=y)

            #Zuweisen der Geometrien für die Polyline
            if not (type(Pa) == type(None)):
                self.geo.append(LineGeo(Pa=Pa, Pe=Pe))
                self.length += self.geo[-1].length
            Pa = Pe

        if (LWPLClosed == 1):
            self.geo.append(LineGeo(Pa=Pa, Pe=self.geo[0].Pa))
            self.length += self.geo[-1].length

        #Neuen Startwert für die nächste Geometrie zurückgeben
        caller.start = e
Esempio n. 11
0
 def __init__(self,nr='None',ent_nr='None',ent_cnr='None',closed=0,\
              p0=PointClass(x=0,y=0),sca=[],cut_cor=40,length=0.0,geos=[],geos_hdls=[]):
     self.nr = nr
     self.ent_nr = ent_nr
     self.ent_cnr = ent_cnr
     self.closed = closed
     self.p0 = p0
     self.sca = sca
     self.cut_cor = 40
     self.length = length
     self.geos = geos
     self.geos_hdls = geos_hdls
Esempio n. 12
0
    def analyse_and_opt(self):
        #Richtung in welcher der Anfang liegen soll (unten links)
        Popt = PointClass(x=-1e3, y=-1e6)

        #Suchen des kleinsten Startpunkts von unten Links X zuerst (Muss neue Schleife sein!)
        min_distance = self.geo[0].Pa.distance(Popt)
        min_geo_nr = 0
        for geo_nr in range(1, len(self.geo)):
            if (self.geo[geo_nr].Pa.distance(Popt) < min_distance):
                min_distance = self.geo[geo_nr].Pa.distance(Popt)
                min_geo_nr = geo_nr

        #Kontur so anordnen das neuer Startpunkt am Anfang liegt
        self.geo = self.geo[min_geo_nr:len(self.geo)] + self.geo[0:min_geo_nr]
Esempio n. 13
0
    def Read(self, caller):
        #Kürzere Namen zuweisen
        lp = caller.line_pairs

        #Layer zuweisen
        s = lp.index_code(8, caller.start + 1)
        self.Layer_Nr = caller.Get_Layer_Nr(lp.line_pair[s].value)
        #XWert
        s = lp.index_code(10, s + 1)
        x0 = float(lp.line_pair[s].value)
        #YWert
        s = lp.index_code(20, s + 1)
        y0 = float(lp.line_pair[s].value)
        O = PointClass(x0, y0)
        #Radius
        s = lp.index_code(40, s + 1)
        r = float(lp.line_pair[s].value)
        #Start Winkel
        s = lp.index_code(50, s + 1)
        s_ang = radians(float(lp.line_pair[s].value))
        #End Winkel
        s = lp.index_code(51, s + 1)
        e_ang = radians(float(lp.line_pair[s].value))

        #Berechnen der Start und Endwerte des Arcs
        Pa = PointClass(x=cos(s_ang) * r, y=sin(s_ang) * r) + O
        Pe = PointClass(x=cos(e_ang) * r, y=sin(e_ang) * r) + O

        #Anhängen der ArcGeo Klasse für die Geometrie
        self.geo.append(
            ArcGeo(Pa=Pa, Pe=Pe, O=O, r=r, s_ang=s_ang, e_ang=e_ang, dir=1))

        #Länge entspricht der Länge des Kreises
        self.length = self.geo[-1].length

        #Neuen Startwerd für die nächste Geometrie zurückgeben
        caller.start = s
Esempio n. 14
0
    def calc_curve(self, n=0, cpts_nr=20):

        #Anfangswerte für Step und u
        u = 0
        step = float(self.Knots[-1]) / (cpts_nr - 1)
        Points = []

        #Wenn die erste Ableitung oder höher errechnet wird die ersten
        #Ableitung in dem tan als Winkel in rad gespeichert
        tang = []

        while u <= self.Knots[-1]:
            CK = self.bspline_ders_evaluate(n=n, u=u)

            #Den Punkt in einem Punkt List abspeichern
            Points.append(PointClass(x=CK[0][0], y=CK[0][1]))

            #Für die erste Ableitung wird den Winkel der tangente errechnet
            if n >= 1:
                tang.append(atan2(CK[1][1], CK[1][0]))
            u += step

        return Points, tang
Esempio n. 15
0
    def Write_GCode(self, config, postpro):

        #Erneutes erstellen der Einlaufgeometrien
        self.make_start_moves(config)

        depth = config.axis3_mill_depth.get()
        max_slice = config.axis3_slice_depth.get()

        #Scheibchendicke bei Frästiefe auf Frästiefe begrenzen
        if -abs(max_slice) <= depth:
            mom_depth = depth
        else:
            mom_depth = -abs(max_slice)

        #Positionieren des Werkzeugs über dem Anfang und Eintauchen
        self.st_move[0].Write_GCode([1,1,1],\
                                    PointClass(x=0,y=0),\
                                    postpro)

        postpro.rap_pos_z(config.axis3_safe_margin.get())
        postpro.chg_feed_rate(config.F_G1_Depth.get())
        postpro.lin_pol_z(mom_depth)
        postpro.chg_feed_rate(config.F_G1_Plane.get())

        #Wenn G41 oder G42 an ist Fräsradiuskorrektur
        if self.cut_cor != 40:
            postpro.set_cut_cor(self.cut_cor)
            self.st_move[1].Write_GCode([1,1,1],\
                                        PointClass(x=0,y=0),\
                                        postpro)

            self.st_move[2].Write_GCode([1,1,1],\
                                        PointClass(x=0,y=0),\
                                        postpro)

        #Schreiben der Geometrien für den ersten Schnitt
        for geo in self.geos:
            geo.Write_GCode(self.sca, self.p0, postpro)

        #Zählen der Schleifen
        snr = 0
        #Schleifen für die Anzahl der Schnitte
        while mom_depth > depth:
            snr += 1
            mom_depth = mom_depth - abs(max_slice)
            if mom_depth < depth:
                mom_depth = depth

            #Erneutes Eintauchen
            postpro.chg_feed_rate(config.F_G1_Depth.get())
            postpro.lin_pol_z(mom_depth)
            postpro.chg_feed_rate(config.F_G1_Plane.get())

            #Falls es keine geschlossene Kontur ist
            if self.closed == 0:
                self.reverse()
                self.switch_cut_cor()

                #Falls cut correction eingeschaltet ist diese umdrehen.
                if not (self.cut_cor == 40):
                    postpro.set_cut_cor(self.cut_cor)

            for geo_nr in range(len(self.geos)):
                self.geos[geo_nr].Write_GCode(self.sca, self.p0, postpro)

        #Anfangswert für Direction wieder herstellen falls nötig
        if (snr % 2) > 0:
            self.reverse()
            self.switch_cut_cor()

        #Fertig und Zurückziehen des Werkzeugs
        postpro.lin_pol_z(config.axis3_safe_margin.get())
        postpro.rap_pos_z(config.axis3_retract.get())
        postpro.set_cut_cor(40)

        return 1
Esempio n. 16
0
 def HPt_2_Pt(self, HPt):
     return PointClass(x=HPt[0] / HPt[-1], y=HPt[1] / HPt[-1])