From ce671aa6ba30cdd97314dc3cd5c74cd3bac4832a Mon Sep 17 00:00:00 2001
From: Anders Wallin <anders.e.e.wallin@gmail.com>
Date: Mon, 24 Dec 2012 15:07:36 +0200
Subject: [PATCH 2/2] dual-needle meter, use with <halpin2>"meter2"</halpin2>

---
 lib/python/pyvcp_widgets.py |   74 +++++++++++++++++++++++++++++--------------
 1 file changed, 50 insertions(+), 24 deletions(-)

diff --git a/lib/python/pyvcp_widgets.py b/lib/python/pyvcp_widgets.py
index acf190d..f17e588 100644
--- a/lib/python/pyvcp_widgets.py
+++ b/lib/python/pyvcp_widgets.py
@@ -329,27 +329,32 @@ class pyvcp_meter(Canvas):
         <meter>
             [ <size>300</size> ]
             [ <halpin>"mymeter"</halpin> ]
+            [ <halpin2>"mymeter2"</halpin2> ]           (secondary needle)
             [ <text>"My Voltage"</text> ]
             [ <subtext>"Volts"</subtext>
             [ <min_>-22</min_> ]
             [ <max_>123</max_> ]
-            [ <majorscale>10</majorscale> ]
-            [ <minorscale>5</minorscale> ]
-            [ <region1>(70,80,"green")</region1> ]
+            [ <majorscale>10</majorscale> ]              (major tick-marks with numbers are placed at this interval)
+            [ <minorscale>5</minorscale> ]               (minor tick-marks are placed at this interval)
+            [ <region1>(70,80,"green")</region1> ]       (values between 70 and 80 are colored green along the edge of the meter)
             [ <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,subtext=None,min_=0,max_=100,majorscale=None, minorscale=None,region1=None,region2=None,region3=None,**kw):
+    # (self,root,pycomp,halpin=None,size=200,cpr=40,**kw):
+    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,halpin2=None,**kw):
+        print "meter"
         self.size = size
         self.pad=10
         Canvas.__init__(self,root,width=size,height=size)
         self.halpin=halpin
         self.min_=min_
         self.max_=max_
-        range_=2.5
+        range_=2.5 # the angular-range of needle-movement, in radians.
         self.min_alfa=-math.pi/2-range_
         self.max_alfa=-math.pi/2+range_
         self.circle=self.create_oval(self.pad,self.pad,size-self.pad,size-self.pad, width=2)
@@ -371,8 +376,11 @@ class pyvcp_meter(Canvas):
         if region2!=None: self.draw_region(region2)
         if region3!=None: self.draw_region(region3)
         self.draw_ticks()
+        
+        # draw the needle
+        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.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
@@ -381,7 +389,20 @@ class pyvcp_meter(Canvas):
             pyvcp_meter.n += 1
         pycomp.newpin(self.halpin, HAL_FLOAT, HAL_IN)
         self.value = pycomp[self.halpin]
-    
+        
+        print halpin2
+        self.halpin2=None
+        if halpin2 != None:
+            self.halpin2=halpin2
+            print "creating halpin2:", self.halpin2
+            pycomp.newpin(self.halpin2, HAL_FLOAT, HAL_IN)
+            self.value2 = pycomp[self.halpin2]
+            
+            # a second needle
+            self.line2 = self.create_line([self.mid,self.mid, self.mid+self.r*math.cos(self.alfa), self.mid+self.r*math.sin(self.alfa)], \
+                fill="blue", arrow="last", arrowshape=(0.9*self.r,self.r,self.r/20))
+            self.itemconfig(self.line2,width=3)
+            
     def rad2deg(self, rad): return rad*180/math.pi
 
     def value2angle(self, value):
@@ -394,7 +415,7 @@ class pyvcp_meter(Canvas):
                 alfa = self.min_alfa            
             return alfa
     
-    def p2c(self, radius, angle): 
+    def polar2cartesian(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)
@@ -402,27 +423,32 @@ class pyvcp_meter(Canvas):
     def update(self,pycomp):
         self.value = pycomp[self.halpin]
         self.alfa = self.value2angle(self.value)
-        x,y = self.p2c(0.8, self.alfa)
+        x,y = self.polar2cartesian(0.8, self.alfa)
         self.coords(self.line,self.mid,self.mid,x,y)
-
+        if self.halpin2!=None:
+            self.value2 = pycomp[self.halpin2]
+            self.alfa2 = self.value2angle(self.value2)
+            x,y = self.polar2cartesian(0.8, self.alfa2)
+            self.coords(self.line2,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")
+        #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):
         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)
+            xy1 = self.polar2cartesian(1,alfa)
+            xy2 = self.polar2cartesian(0.85,alfa)
+            xytext = self.polar2cartesian(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
@@ -432,8 +458,8 @@ class pyvcp_meter(Canvas):
             while value <= self.max_:
                 if (value % self.majorscale) != 0:
                     alfa = self.value2angle(value)
-                    xy1 = self.p2c(1,alfa)
-                    xy2 = self.p2c(0.9,alfa)
+                    xy1 = self.polar2cartesian(1,alfa)
+                    xy2 = self.polar2cartesian(0.9,alfa)
                     self.create_line(xy1, xy2)
                 value = value + self.minorscale
 
-- 
1.7.10.4

