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)
 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.AngS = float(lp.line_pair[s].value)
     #End Winkel - Achtung, ist als rad (0-2pi) im dxf
     s = lp.index_code(42, s + 1)
     self.AngE = float(lp.line_pair[s].value)
     #Neuen Startwert für die nächste Geometrie zurückgeben
     caller.start = e
예제 #3
0
    def plot_cut_cor(self, Canvas=None, length=20):
        start, start_ang = self.get_st_en_points(0)

        #BaseEntitie erstellen um auf oberster Ebene zu Fräsen
        BaseEntitie = EntitieContentClass(Nr=-1,
                                          Name='BaseEntitie',
                                          parent=None,
                                          children=[],
                                          p0=PointClass(x=0.0, y=0.0),
                                          pb=PointClass(x=0.0, y=0.0),
                                          sca=[1, 1, 1],
                                          rot=0.0)

        x_ca, y_ca = Canvas.get_can_coordinates(start.x, start.y)

        if self.cut_cor == 41:
            start_ang = start_ang + 90
        else:
            start_ang = start_ang - 90

        dx = cos(radians(start_ang)) * length
        dy = sin(radians(start_ang)) * length

        hdl = Line(Canvas.canvas,
                   x_ca,
                   -y_ca,
                   x_ca + dx,
                   -y_ca - dy,
                   fill='SteelBlue3',
                   arrow='last')
        return hdl
    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
 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)
    def bulge2arc(self,Pa,Pe,bulge):
        c=(1/bulge-bulge)/2
        
        #Berechnung des Mittelpunkts (Formel von Mickes!
        O=PointClass(x=(Pa.x+Pe.x-(Pe.y-Pa.y)*c)/2,\
                     y=(Pa.y+Pe.y+(Pe.x-Pa.x)*c)/2)
                    
        #Abstand zwischen dem Mittelpunkt und PA ist der Radius
        r=O.distance(Pa)
        #Kontrolle ob beide gleich sind (passt ...)
        #r=O.distance(Pe)

        #Unterscheidung für den Öffnungswinkel.
        if bulge>0:
            return ArcGeo(Pa=Pa,Pe=Pe,O=O,r=r)  
        else:
            arc=ArcGeo(Pa=Pe,Pe=Pa,O=O,r=r)
            arc.reverse()
            return arc
    def bulge2arc(self, Pa, Pe, bulge):
        c = (1 / bulge - bulge) / 2

        #Berechnung des Mittelpunkts (Formel von Mickes!
        O=PointClass(x=(Pa.x+Pe.x-(Pe.y-Pa.y)*c)/2,\
                     y=(Pa.y+Pe.y+(Pe.x-Pa.x)*c)/2)

        #Abstand zwischen dem Mittelpunkt und PA ist der Radius
        r = O.distance(Pa)
        #Kontrolle ob beide gleich sind (passt ...)
        #r=O.distance(Pe)

        #Unterscheidung für den Öffnungswinkel.
        if bulge > 0:
            return ArcGeo(Pa=Pa, Pe=Pe, O=O, r=r)
        else:
            arc = ArcGeo(Pa=Pe, Pe=Pa, O=O, r=r)
            arc.reverse()
            return arc
예제 #8
0
    def __init__(self,
                 type="Entitie",
                 Nr=None,
                 Name='',
                 parent=None,
                 children=[],
                 p0=PointClass(x=0.0, y=0.0),
                 pb=PointClass(x=0.0, y=0.0),
                 sca=[1, 1, 1],
                 rot=0.0):

        self.type = type
        self.Nr = Nr
        self.Name = Name
        self.children = children
        self.p0 = p0
        self.pb = pb
        self.sca = sca
        self.rot = rot
        self.parent = parent
    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)

        #Berechnen der Start und Endwerte des Kreises ohne Überschneidung
        s_ang = -3 * pi / 4
        m_ang = s_ang - pi
        e_ang = -3 * pi / 4

        #Berechnen der Start und Endwerte des Arcs
        Pa = PointClass(x=cos(s_ang) * r, y=sin(s_ang) * r) + O
        Pm = PointClass(x=cos(m_ang) * r, y=sin(m_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=Pm, O=O, r=r, s_ang=s_ang, e_ang=m_ang, dir=-1))
        self.geo.append(
            ArcGeo(Pa=Pm, Pe=Pe, O=O, r=r, s_ang=m_ang, e_ang=e_ang, dir=-1))

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

        #Neuen Startwert für die nächste Geometrie zurückgeben
        caller.start = s
    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]
예제 #11
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))

            self.make_start_moves(config)

            #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

            #BaseEntitie erstellen um auf oberster Ebene zu Fräsen
            BaseEntitie = EntitieContentClass(Nr=-1,
                                              Name='BaseEntitie',
                                              parent=None,
                                              children=[],
                                              p0=P0,
                                              pb=PointClass(x=0.0, y=0.0),
                                              sca=sca,
                                              rot=0.0)

            hdls += self.st_move[1].plot2can(CanvasClass.canvas,
                                             BaseEntitie,
                                             tag=self.nr,
                                             col='SteelBlue3')
            hdls += self.st_move[2].plot2can(CanvasClass.canvas,
                                             BaseEntitie,
                                             tag=self.nr,
                                             col='SteelBlue3')
        return hdls
    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)
        #print lp.line_pair[ind].value ####################################################################
        self.BlockName = 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)

        #Rotation
        s_temp = lp.index_code(50, s + 1, e)
        if s_temp != None:
            self.rot = radians(float(lp.line_pair[s_temp].value))

        #Neuen Startwert für die nächste Geometrie zurückgeben
        caller.start = e
예제 #13
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
    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]
예제 #15
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

        #Polyline flag
        s_temp = lp.index_code(70, s + 1, e)
        if s_temp == None:
            PolyLineFlag = 0
        else:
            PolyLineFlag = int(lp.line_pair[s_temp].value)
            s = s_temp

        #print("PolylineFlag: %i" %PolyLineFlag)

        while 1:  #and not(s==None):
            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)

            #Bulge
            bulge = 0

            e_vertex = lp.index_both(0, "VERTEX", s + 1, e)
            if e_vertex == None:
                e_vertex = e

            s_temp = lp.index_code(42, s + 1, e_vertex)
            #print('stemp: %s, e: %s, next 10: %s' %(s_temp,e,lp.index_both(0,"VERTEX",s+1,e)))
            if s_temp != None:
                bulge = float(lp.line_pair[s_temp].value)
                s = s_temp

            #Vertex flag (bit-coded); default is 0; 1 = Closed; 128 = Plinegen
            s_temp = lp.index_code(70, s + 1, e_vertex)
            if s_temp == None:
                VertexFlag = 0
            else:
                VertexFlag = int(lp.line_pair[s_temp].value)
                s = s_temp

            #print("Vertex Flag: %i" %PolyLineFlag)

            #Zuweisen der Geometrien für die Polyline
            if (VertexFlag != 16):
                if type(Pa) != type(None):
                    if next_bulge == 0:
                        self.geo.append(LineGeo(Pa=Pa, Pe=Pe))
                    else:
                        #self.geo.append(LineGeo(Pa=Pa,Pe=Pe))
                        #print bulge
                        self.geo.append(self.bulge2arc(Pa, Pe, next_bulge))

                    #Länge drauf rechnen wenns eine Geometrie ist
                    self.length += self.geo[-1].length

                #Der Bulge wird immer für den und den nächsten Punkt angegeben
                next_bulge = bulge
                Pa = Pe

        #Es ist eine geschlossene Polyline
        if PolyLineFlag == 1:
            #print("sollten Übereinstimmen: %s, %s" %(Pa,Pe))
            if next_bulge == 0:
                self.geo.append(LineGeo(Pa=Pa, Pe=self.geo[0].Pa))
            else:
                self.geo.append(self.bulge2arc(Pa, self.geo[0].Pa, next_bulge))
            #Länge drauf rechnen wenns eine Geometrie ist
            self.length += self.geo[-1].length

        #Neuen Startwert für die nächste Geometrie zurückgeben
        caller.start = e
예제 #16
0
    def Write_GCode(self, config, postpro):

        #Erneutes erstellen der Einlaufgeometrien
        self.make_start_moves(config)

        #Werkzeugdurchmesser in Radius umrechnen
        tool_rad = config.tool_dia.get() / 2

        #BaseEntitie erstellen um auf oberster Ebene zu Fräsen
        BaseEntitie = EntitieContentClass(Nr=-1,
                                          Name='BaseEntitie',
                                          parent=None,
                                          children=[],
                                          p0=PointClass(x=0.0, y=0.0),
                                          pb=PointClass(x=0.0, y=0.0),
                                          sca=[1, 1, 1],
                                          rot=0.0)

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

        #Wenn Output Format DXF dann nur einmal Fräsen
        if postpro.output_type == 'dxf':
            depth = max_slice

        #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(parent=BaseEntitie, postpro=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:

            #Errechnen des Startpunkts ohne Werkzeug Kompensation
            #und einschalten der Kompensation
            start, start_ang = self.get_st_en_points(0)
            postpro.set_cut_cor(self.cut_cor, start)

            self.st_move[1].Write_GCode(parent=BaseEntitie, postpro=postpro)
            self.st_move[2].Write_GCode(parent=BaseEntitie, postpro=postpro)

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

        #Ausschalten der Fräsradiuskorrektur
        if (not (self.cut_cor == 40)) & (postpro.cancel_cc_for_depth == 1):
            ende, en_angle = self.get_st_en_points(1)
            if self.cut_cor == 41:
                pos_cut_out = ende.get_arc_point(en_angle - 90, tool_rad)
            elif self.cut_cor == 42:
                pos_cut_out = ende.get_arc_point(en_angle + 90, tool_rad)
            postpro.deactivate_cut_cor(pos_cut_out)

        #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 einschalten.
            if ((not (self.cut_cor == 40)) &
                (self.closed == 0)) or (postpro.cancel_cc_for_depth == 1):
                #Errechnen des Startpunkts ohne Werkzeug Kompensation
                #und einschalten der Kompensation
                postpro.set_cut_cor(self.cut_cor, start)

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

            #Errechnen des Konturwerte mit Fräsradiuskorrektur und ohne
            ende, en_angle = self.get_st_en_points(1)
            if self.cut_cor == 41:
                pos_cut_out = ende.get_arc_point(en_angle - 90, tool_rad)
            elif self.cut_cor == 42:
                pos_cut_out = ende.get_arc_point(en_angle + 90, tool_rad)

            #Ausschalten der Fräsradiuskorrektur falls benötigt
            if (not (self.cut_cor == 40)) & (postpro.cancel_cc_for_depth == 1):
                postpro.deactivate_cut_cor(pos_cut_out)

        #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())

        #Falls Fräsradius Korrektur noch nicht ausgeschaltet ist ausschalten.
        if (not (self.cut_cor == 40)) & (not (postpro.cancel_cc_for_depth)):
            #Errechnen des Konturwerte mit Fräsradiuskorrektur und ohne
            ende, en_angle = self.get_st_en_points(1)
            postpro.deactivate_cut_cor(ende)

        return 1
    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
        st = lp.index_code(73, s + 1)
        nCPts = int(lp.line_pair[s].value)

        s = st
        #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
        s = st
        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

        #Lesen der Kontrollpunkte
        s = st
        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))

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

        caller.start = e
예제 #18
0
    def get_all_vars(self,pp_file_nr):
        self.parser.read(os.path.join(self.folder,self.postprocessor_files[pp_file_nr]))
        #try:
        self.output_type=self.parser.get('General', 'output_type')  
        self.abs_export=int(self.parser.get('General', 'abs_export'))
        self.cancel_cc_for_depth=int(self.parser.get('General', 'cancel_cc_for_depth'))
        self.export_ccw_arcs_only=int(self.parser.get('General', 'export_ccw_arcs_only')) 
        self.max_arc_radius=int(self.parser.get('General','max_arc_radius'))
        self.gcode_be=self.parser.get('General', 'code_begin')
        self.gcode_en=self.parser.get('General', 'code_end')

        self.pre_dec=int(self.parser.get('Number format','pre_decimals'))
        self.post_dec=int(self.parser.get('Number format','post_decimals'))
        self.dec_sep=self.parser.get('Number format','decimal_seperator')
        self.pre_dec_z_pad=int(self.parser.get('Number format','pre_decimal_zero_padding'))
        self.post_dec_z_pad=int(self.parser.get('Number format','post_decimal_zero_padding'))
        self.signed_val=int(self.parser.get('Number format','signed_values'))

        self.use_line_nrs=int(self.parser.get('Line numbers','use_line_nrs'))
        self.line_nrs_begin=int(self.parser.get('Line numbers','line_nrs_begin'))
        self.line_nrs_step=int(self.parser.get('Line numbers','line_nrs_step'))

        self.tool_ch_str=self.parser.get('Program','tool_change')
        self.feed_ch_str=self.parser.get('Program','feed_change')
        self.rap_pos_plane_str=self.parser.get('Program','rap_pos_plane')
        self.rap_pos_depth_str=self.parser.get('Program','rap_pos_depth')
        self.lin_mov_plane_str=self.parser.get('Program','lin_mov_plane')
        self.lin_mov_depth_str=self.parser.get('Program','lin_mov_depth')
        self.arc_int_cw=self.parser.get('Program','arc_int_cw')
        self.arc_int_ccw=self.parser.get('Program','arc_int_ccw')
        self.cut_comp_off_str=self.parser.get('Program','cutter_comp_off')
        self.cut_comp_left_str=self.parser.get('Program','cutter_comp_left')
        self.cut_comp_right_str=self.parser.get('Program','cutter_comp_right')                        
                        
        self.feed=0
        self.Pe=PointClass( x=self.config.axis1_st_en.get(),
                            y=self.config.axis2_st_en.get())

        self.Pa=PointClass(x=self.config.axis1_st_en.get(),
                            y=self.config.axis2_st_en.get())

        self.lPe=PointClass( x=self.config.axis1_st_en.get(),
                            y=self.config.axis2_st_en.get())
           
        self.IJ=PointClass( x=0.0,y=0.0)    
        self.O=PointClass( x=0.0,y=0.0)    
        self.r=0.0           
        self.a_ang=0.0      
        self.e_ang=0.0         
        self.ze=self.config.axis3_retract.get()   
        self.lz=self.ze
        self.vars={"%feed":'self.iprint(self.feed)',\
                   "%nl":'self.nlprint()',\
                   "%XE":'self.fnprint(self.Pe.x)',\
                   "%-XE":'self.fnprint(-self.Pe.x)',\
                   "%XA":'self.fnprint(self.Pa.x)',\
                   "%-XA":'self.fnprint(-self.Pa.x)',\
                   "%YE":'self.fnprint(self.Pe.y)',\
                   "%-YE":'self.fnprint(-self.Pe.y)',\
                   "%YA":'self.fnprint(self.Pa.y)',\
                   "%-YA":'self.fnprint(-self.Pa.y)',\
                   "%ZE":'self.fnprint(self.ze)',\
                   "%-ZE":'self.fnprint(-self.ze)',\
                   "%I":'self.fnprint(self.IJ.x)',\
                   "%-I":'self.fnprint(-self.IJ.x)',\
                   "%J":'self.fnprint(self.IJ.y)',\
                   "%-J":'self.fnprint(-self.IJ.y)',\
                   "%XO":'self.fnprint(self.O.x)',\
                   "%-XO":'self.fnprint(-self.O.x)',\
                   "%YO":'self.fnprint(self.O.y)',\
                   "%-YO":'self.fnprint(-self.O.y)',\
                   "%R":'self.fnprint(self.r)',\
                   "%AngA":'self.fnprint(degrees(self.a_ang))',\
                   "%-AngA":'self.fnprint(degrees(-self.a_ang))',\
                   "%AngE":'self.fnprint(degrees(self.e_ang))',\
                   "%-AngE":'self.fnprint(degrees(-self.e_ang))'}
예제 #19
0
 def HPt_2_Pt(self, HPt):
     return PointClass(x=HPt[0] / HPt[-1], y=HPt[1] / HPt[-1])
    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)
        #print LWPLClosed

        s = lp.index_code(10, s + 1, e)
        while 1:
            #XWert
            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)
            Pe = PointClass(x=x, y=y)

            #Bulge
            bulge = 0

            s_nxt_x = lp.index_code(10, s + 1, e)
            e_nxt_b = s_nxt_x

            #Wenn am Ende dann Suche bis zum Ende
            if e_nxt_b == None:
                e_nxt_b = e

            s_bulge = lp.index_code(42, s + 1, e_nxt_b)

            #print('stemp: %s, e: %s, next 10: %s' %(s_temp,e,lp.index_code(10,s+1,e)))
            if s_bulge != None:
                bulge = float(lp.line_pair[s_bulge].value)
                s_nxt_x = s_nxt_x

            #Übernehmen des nächsten X Wert als Startwert
            s = s_nxt_x

            #Zuweisen der Geometrien für die Polyline

            if not (type(Pa) == type(None)):
                if next_bulge == 0:
                    self.geo.append(LineGeo(Pa=Pa, Pe=Pe))
                else:
                    #self.geo.append(LineGeo(Pa=Pa,Pe=Pe))
                    #print bulge
                    self.geo.append(self.bulge2arc(Pa, Pe, next_bulge))

                #Länge drauf rechnen wenns eine Geometrie ist
                self.length += self.geo[-1].length

            #Der Bulge wird immer für den und den nächsten Punkt angegeben
            next_bulge = bulge
            Pa = Pe

        if (LWPLClosed == 1) or (LWPLClosed == 129):
            #print("sollten Übereinstimmen: %s, %s" %(Pa,Pe))
            if next_bulge:
                self.geo.append(self.bulge2arc(Pa, self.geo[0].Pa, next_bulge))
            else:
                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