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 + # -------------------------------------------