All pastes #1299036 Raw Edit

meter.patch

public diff v1 · immutable
#1299036 ·published 2009-01-03 16:47 UTC
rendered paste body
? meter.patch? configs/SherlineLathe/core_stepper.hal? configs/SherlineLathe/emc.nmlIndex: lib/python/pyvcp_widgets.py===================================================================RCS file: /cvs/emc2/lib/python/pyvcp_widgets.py,vretrieving revision 1.42diff -u -r1.42 pyvcp_widgets.py--- lib/python/pyvcp_widgets.py	30 Dec 2008 10:53:52 -0000	1.42+++ lib/python/pyvcp_widgets.py	3 Jan 2009 16:25:45 -0000@@ -290,15 +290,21 @@             [ <size>300</size> ]             [ <halpin>"mymeter"</halpin> ]             [ <text>"My Voltage"</text> ]+            [ <subtext>"Volts"</subtext>             [ <min_>-22</min_> ]             [ <max_>123</max_> ]+            [ <majorscale>10</majorscale> ]+            [ <minorscale>5</minorscale> ]+            [ <region1>(70,80,"green")</region1> ]+            [ <region2>(80,100,"orange")</region2> ]+            [ <region3>(100,123,"red")</region3> ]         </meter>     """     # FIXME: logarithmic scale option     n=0-    def __init__(self,root,pycomp,halpin=None,-                        size=200,text=None,min_=0,max_=100,**kw):-        pad=10+    def __init__(self,root,pycomp,halpin=None, size=200,text=None,subtext=None,min_=0,max_=100,majorscale=None, minorscale=None,region1=None,region2=None,region3=None,**kw):+        self.size = size+        self.pad=10         Canvas.__init__(self,root,width=size,height=size)         self.halpin=halpin         self.min_=min_@@ -306,64 +312,92 @@         range_=2.5         self.min_alfa=-math.pi/2-range_         self.max_alfa=-math.pi/2+range_-        self.circle=self.create_oval(pad,pad,size-pad,size-pad)+        self.circle=self.create_oval(self.pad,self.pad,size-self.pad,size-self.pad, width=2)         self.itemconfig(self.circle,fill="white")         self.mid=size/2-        self.r=(size-2*pad)/2+        self.r=(size-2*self.pad)/2         self.alfa=0-        self.line = self.create_line([self.mid,self.mid, \-                            self.mid+0.8*self.r*math.cos(self.alfa), \-                            self.mid+0.8*self.r*math.sin(self.alfa)],fill="red")-        self.itemconfig(self.line,width=3)-        if text!=None:-            t=self.create_text([self.mid,self.mid-20])-            self.itemconfig(t,text=text)-            self.itemconfig(t,font=('Arial',20))-+        if minorscale==None: +            self.minorscale=0+        else:+            self.minorscale=minorscale+        if majorscale==None: +            self.majorscale=float((self.max_-self.min_)/10)+        else: +            self.majorscale=majorscale+        if text!=None: t=self.create_text([self.mid,self.mid-size/12],font="Arial %d bold" % (size/10),text=text)+        if subtext!=None: t=self.create_text([self.mid,self.mid+size/12],font="Arial %d" % (size/30+5),text=subtext)+        if region1!=None: self.draw_region(region1)+        if region2!=None: self.draw_region(region2)+        if region3!=None: self.draw_region(region3)         self.draw_ticks() +        self.line = self.create_line([self.mid,self.mid, self.mid+self.r*math.cos(self.alfa), self.mid+self.r*math.sin(self.alfa)],fill="red", arrow="last", arrowshape=(0.9*self.r,self.r,self.r/20))+        self.itemconfig(self.line,width=3)+         # create the hal pin         if halpin == None:             self.halpin = "meter."+str(pyvcp_meter.n)+".value"         pyvcp_meter.n += 1         pycomp.newpin(self.halpin, HAL_FLOAT, HAL_IN)         self.value = pycomp[self.halpin]+    +    def rad2deg(self, rad): return rad*180/math.pi++    def value2angle(self, value):+            #returns angle for a given value+            scale = (self.max_-self.min_)/(self.max_alfa-self.min_alfa)+            alfa = self.min_alfa + (value-self.min_)/scale+            if alfa > self.max_alfa:+                alfa = self.max_alfa+            elif alfa < self.min_alfa:+                alfa = self.min_alfa            +            return alfa+    +    def p2c(self, radius, angle): +        #returns the cathesian coordinates (x,y) for given polar coordinates +        #radius in percent of self.r; angle in radians+        return self.mid+radius*self.r*math.cos(angle), self.mid+radius*self.r*math.sin(angle)      def update(self,pycomp):         self.value = pycomp[self.halpin]-        scale=(self.max_-self.min_)/(self.max_alfa-self.min_alfa)-        self.alfa=self.min_alfa + (self.value-self.min_)/scale-        if self.alfa > self.max_alfa:-            self.alfa = self.max_alfa-        elif self.alfa < self.min_alfa:-            self.alfa = self.min_alfa--        self.coords(self.line, self.mid,self.mid, \-                            self.mid+0.8*self.r*math.cos(self.alfa), \-                            self.mid+0.8*self.r*math.sin(self.alfa))   +        self.alfa = self.value2angle(self.value)+        x,y = self.p2c(0.8, self.alfa)+        self.coords(self.line,self.mid,self.mid,x,y)++    def draw_region(self, (start, end, color)):+            #Draws a colored region on the canvas between start and end+            start = self.value2angle(start)+            start = -self.rad2deg(start)+            end = self.value2angle(end)+            end = -self.rad2deg(end)+            extent = end-start+            halfwidth = math.floor(0.1*self.r/2)+1+            xy = self.pad+halfwidth, self.pad+halfwidth, self.size-self.pad-halfwidth, self.size-self.pad-halfwidth+            self.create_arc(xy, start=start, extent=extent, outline=color, width=(halfwidth-1)*2, style="arc")      def draw_ticks(self):-        d_alfa = float((self.max_alfa-self.min_alfa))/10-        d_value = float((self.max_-self.min_))/10-        for n in range(0,11):-            startx=self.mid+self.r*math.cos(self.min_alfa + n*d_alfa)-            starty=self.mid+self.r*math.sin(self.min_alfa + n*d_alfa)-            stopx=self.mid+0.85*self.r*math.cos(self.min_alfa + n*d_alfa)-            stopy=self.mid+0.85*self.r*math.sin(self.min_alfa + n*d_alfa)-            textx=stopx - 0.1*self.r*math.cos(self.min_alfa + n*d_alfa)-            texty=stopy - 0.1*self.r*math.sin(self.min_alfa + n*d_alfa)-            self.create_line([startx,starty,stopx,stopy])-            t=self.create_text([textx,texty])-            self.itemconfig(t,text=str(self.min_+d_value*n))-            for m in range(1,5):-                if n != 10:-                    startx=self.mid+self.r*math.cos(self.min_alfa + (n+float(m)/5)*d_alfa)-                    starty=self.mid+self.r*math.sin(self.min_alfa + (n+float(m)/5)*d_alfa)-                    stopx=self.mid+0.90*self.r*math.cos(self.min_alfa + (n+float(m)/5)*d_alfa)-                    stopy=self.mid+0.90*self.r*math.sin(self.min_alfa + (n+float(m)/5)*d_alfa)-                    self.create_line([startx,starty,stopx,stopy])-+        value = self.min_+        while value <= self.max_:+            alfa = self.value2angle(value)+            xy1 = self.p2c(1,alfa)+            xy2 = self.p2c(0.85,alfa)+            xytext = self.p2c(0.75,alfa)+            self.create_text(xytext,font="Arial %d" % (self.size/30+5), text="%g" % value)+            self.create_line(xy1, xy2, width=2)+            value = value + self.majorscale+        #minor ticks+        value = self.min_+        if self.minorscale > 0:+            while value <= self.max_:+                if (value % self.majorscale) != 0:+                    alfa = self.value2angle(value)+                    xy1 = self.p2c(1,alfa)+                    xy2 = self.p2c(0.9,alfa)+                    self.create_line(xy1, xy2)+                value = value + self.minorscale +              # -------------------------------------------