graphics/GraphicCommons.py
changeset 519 722714c04dcd
parent 505 c5aec2269fb3
child 525 e8d5ab0855d3
equal deleted inserted replaced
518:343fa6867322 519:722714c04dcd
   173         return (-v_base[0], -v_base[1])
   173         return (-v_base[0], -v_base[1])
   174     elif dir_product == 0 and product(v_base, dir_target) != 0:
   174     elif dir_product == 0 and product(v_base, dir_target) != 0:
   175         return dir_target
   175         return dir_target
   176     return v_base
   176     return v_base
   177 
   177 
       
   178 SECOND = 1000000
       
   179 MINUTE = 60 * SECOND
       
   180 HOUR = 60 * MINUTE
       
   181 DAY = 24 * HOUR
       
   182 
       
   183 def generate_time(value):
       
   184     microseconds = float(value.days * DAY + value.seconds * SECOND + value.microseconds)
       
   185     negative = microseconds < 0
       
   186     microseconds = abs(microseconds)
       
   187     data = "T#"
       
   188     not_null = False
       
   189     if negative:
       
   190         data += "-"
       
   191     for val, format in [(int(microseconds) / DAY, "%dd"),
       
   192                         ((int(microseconds) % DAY) / HOUR, "%dh"),
       
   193                         ((int(microseconds) % HOUR) / MINUTE, "%dm"),
       
   194                         ((int(microseconds) % MINUTE) / SECOND, "%ds")]:
       
   195         if val > 0 or not_null:
       
   196             data += format % val
       
   197             not_null = True
       
   198     data += "%gms" % (microseconds % SECOND / 1000.)
       
   199     return data
       
   200 
       
   201 TYPE_TRANSLATOR = {"TIME": generate_time}
   178 
   202 
   179 #-------------------------------------------------------------------------------
   203 #-------------------------------------------------------------------------------
   180 #                            Debug Data Consumer Class
   204 #                            Debug Data Consumer Class
   181 #-------------------------------------------------------------------------------
   205 #-------------------------------------------------------------------------------
   182 
   206 
   183 class DebugDataConsumer:
   207 class DebugDataConsumer:
   184     
   208     
   185     def __init__(self):
   209     def __init__(self):
   186         self.LastValue = None
   210         self.LastValue = None
   187         self.Value = None
   211         self.Value = None
       
   212         self.DataType = None
   188         self.LastForced = False
   213         self.LastForced = False
   189         self.Forced = False
   214         self.Forced = False
   190         self.Inhibited = False
   215         self.Inhibited = False
   191     
   216     
   192     def Inhibit(self, inhibit):
   217     def Inhibit(self, inhibit):
   193         self.Inhibited = inhibit
   218         self.Inhibited = inhibit
   194         if not inhibit and self.LastValue is not None:
   219         if not inhibit and self.LastValue is not None:
   195             self.SetForced(self.LastForced)
   220             self.SetForced(self.LastForced)
   196             self.SetValue(self.LastValue)
   221             self.SetValue(self.LastValue)
   197             self.LastValue = None
   222             self.LastValue = None
   198         
   223     
       
   224     def SetDataType(self, data_type):
       
   225         self.DataType = data_type
       
   226     
   199     def NewValue(self, tick, value, forced=False):
   227     def NewValue(self, tick, value, forced=False):
       
   228         value = TYPE_TRANSLATOR.get(self.DataType, lambda x:x)(value)
   200         if self.Inhibited:
   229         if self.Inhibited:
   201             self.LastValue = value
   230             self.LastValue = value
   202             self.LastForced = forced
   231             self.LastForced = forced
   203         else:
   232         else:
   204             self.SetForced(forced)
   233             self.SetForced(forced)
   205             self.SetValue(value)
   234             self.SetValue(value)
   206 
   235     
   207     def SetValue(self, value):
   236     def SetValue(self, value):
   208         self.Value = value
   237         self.Value = value
   209     
   238     
   210     def GetValue(self):
   239     def GetValue(self):
   211         return self.Value
   240         return self.Value
   264         if self.DataProducer is None:
   293         if self.DataProducer is None:
   265             return False
   294             return False
   266         result = self.DataProducer.SubscribeDebugIECVariable(iec_path, consumer) is not None
   295         result = self.DataProducer.SubscribeDebugIECVariable(iec_path, consumer) is not None
   267         if result is not None and consumer != self:
   296         if result is not None and consumer != self:
   268             self.DataConsumers[consumer] = iec_path
   297             self.DataConsumers[consumer] = iec_path
       
   298             consumer.SetDataType(self.GetDataType(iec_path))
   269         return result
   299         return result
   270     
   300     
   271     def RemoveDataConsumer(self, consumer):
   301     def RemoveDataConsumer(self, consumer):
   272         iec_path = self.DataConsumers.pop(consumer, None)
   302         iec_path = self.DataConsumers.pop(consumer, None)
   273         if iec_path is not None:
   303         if iec_path is not None:
  1617         self.StartConnected = None
  1647         self.StartConnected = None
  1618         self.EndConnected = None
  1648         self.EndConnected = None
  1619     
  1649     
  1620     def CreateToolTip(self, pos):
  1650     def CreateToolTip(self, pos):
  1621         if self.Value is not None and self.Value != "undefined" and not isinstance(self.Value, BooleanType):
  1651         if self.Value is not None and self.Value != "undefined" and not isinstance(self.Value, BooleanType):
  1622             if isinstance(self.Value, StringType):
  1652             if isinstance(self.Value, StringType) and self.Value.find("#") == -1:
  1623                 computed_value = "\"%s\""%self.Value
  1653                 computed_value = "\"%s\""%self.Value
  1624             else:
  1654             else:
  1625                 computed_value = str(self.Value)
  1655                 computed_value = str(self.Value)
  1626             self.ToolTip = ToolTip(self.Parent, computed_value)
  1656             self.ToolTip = ToolTip(self.Parent, computed_value)
  1627             self.ToolTip.SetPosition(pos)
  1657             self.ToolTip.SetPosition(pos)
  1787 
  1817 
  1788     def SetValue(self, value):
  1818     def SetValue(self, value):
  1789         if self.Value != value:
  1819         if self.Value != value:
  1790             self.Value = value
  1820             self.Value = value
  1791             if value is not None and not isinstance(value, BooleanType):
  1821             if value is not None and not isinstance(value, BooleanType):
  1792                 if isinstance(value, StringType):
  1822                 if isinstance(value, StringType) and value.find('#') == -1:
  1793                     self.ComputedValue = "\"%s\""%value
  1823                     self.ComputedValue = "\"%s\""%value
  1794                 else:
  1824                 else:
  1795                     self.ComputedValue = str(value)
  1825                     self.ComputedValue = str(value)
  1796                 if self.ToolTip is not None:
  1826                 if self.ToolTip is not None:
  1797                     self.ToolTip.SetTip(self.ComputedValue)
  1827                     self.ToolTip.SetTip(self.ComputedValue)
  2685             if self.SelectedSegment == len(self.Segments) - 1:
  2715             if self.SelectedSegment == len(self.Segments) - 1:
  2686                 dc.DrawPoint(self.Points[-1].x, self.Points[-1].y)
  2716                 dc.DrawPoint(self.Points[-1].x, self.Points[-1].y)
  2687         if self.Value is not None and not isinstance(self.Value, BooleanType) and self.Value != "undefined":
  2717         if self.Value is not None and not isinstance(self.Value, BooleanType) and self.Value != "undefined":
  2688             dc.SetFont(self.Parent.GetMiniFont())
  2718             dc.SetFont(self.Parent.GetMiniFont())
  2689             dc.SetTextForeground(wx.NamedColour("purple"))
  2719             dc.SetTextForeground(wx.NamedColour("purple"))
  2690             width, height = self.ValueSize
  2720             if self.ValueSize is not None:
  2691             if self.BoundingBox[2] > width * 4 or self.BoundingBox[3] > height * 4:
  2721                 width, height = self.ValueSize
  2692                 x = self.Points[0].x + width * (self.StartPoint[1][0] - 1) / 2
  2722                 if self.BoundingBox[2] > width * 4 or self.BoundingBox[3] > height * 4:
  2693                 y = self.Points[0].y + height * (self.StartPoint[1][1] - 1) / 2
  2723                     x = self.Points[0].x + width * (self.StartPoint[1][0] - 1) / 2
  2694                 dc.DrawText(self.ComputedValue, x, y)
  2724                     y = self.Points[0].y + height * (self.StartPoint[1][1] - 1) / 2
  2695                 x = self.Points[-1].x + width * (self.EndPoint[1][0] - 1) / 2
  2725                     dc.DrawText(self.ComputedValue, x, y)
  2696                 y = self.Points[-1].y + height * (self.EndPoint[1][1] - 1) / 2
  2726                     x = self.Points[-1].x + width * (self.EndPoint[1][0] - 1) / 2
  2697                 dc.DrawText(self.ComputedValue, x, y)
  2727                     y = self.Points[-1].y + height * (self.EndPoint[1][1] - 1) / 2
  2698             else:
  2728                     dc.DrawText(self.ComputedValue, x, y)
  2699                 middle = len(self.Segments) / 2 + len(self.Segments) % 2 - 1
  2729                 else:
  2700                 x = (self.Points[middle].x + self.Points[middle + 1].x - width) / 2
  2730                     middle = len(self.Segments) / 2 + len(self.Segments) % 2 - 1
  2701                 y = (self.Points[middle].y + self.Points[middle + 1].y - height) / 2
  2731                     x = (self.Points[middle].x + self.Points[middle + 1].x - width) / 2
  2702                 dc.DrawText(self.ComputedValue, x, y)
  2732                     y = (self.Points[middle].y + self.Points[middle + 1].y - height) / 2
       
  2733                     dc.DrawText(self.ComputedValue, x, y)
  2703             dc.SetFont(self.Parent.GetFont())
  2734             dc.SetFont(self.Parent.GetFont())
  2704             dc.SetTextForeground(wx.BLACK)
  2735             dc.SetTextForeground(wx.BLACK)
  2705 
  2736 
  2706 
  2737 
  2707 #-------------------------------------------------------------------------------
  2738 #-------------------------------------------------------------------------------