CMS 3D CMS Logo

List of all members | Public Member Functions | Public Attributes | Static Public Attributes
svgfig.Poly Class Reference

Public Member Functions

def __init__ (self, d=[], mode="L", loop=False, attr)
 
def __repr__ (self)
 
def Path (self, trans=None, local=False)
 
def SVG (self, trans=None)
 

Public Attributes

 attr
 
 d
 
 loop
 
 mode
 

Static Public Attributes

dictionary defaults = {}
 

Detailed Description

Draws a curve specified by a sequence of points. The curve may be
piecewise linear, like a polygon, or a Bezier curve.

Poly(d, mode, loop, attribute=value)

d                       required        list of tuples representing points
                                        and possibly control points
mode                    default="L"   "lines", "bezier", "velocity",
                                        "foreback", "smooth", or an abbreviation
loop                    default=False   if True, connect the first and last
                                        point, closing the loop
attribute=value pairs   keyword list    SVG attributes

The format of the tuples in d depends on the mode.

"lines"/"L"         d=[(x,y), (x,y), ...]
                                        piecewise-linear segments joining the (x,y) points
"bezier"/"B"        d=[(x, y, c1x, c1y, c2x, c2y), ...]
                                        Bezier curve with two control points (control points
                                        preceed (x,y), as in SVG paths). If (c1x,c1y) and
                                        (c2x,c2y) both equal (x,y), you get a linear
                                        interpolation ("lines")
"velocity"/"V"      d=[(x, y, vx, vy), ...]
                                        curve that passes through (x,y) with velocity (vx,vy)
                                        (one unit of arclength per unit time); in other words,
                                        (vx,vy) is the tangent vector at (x,y). If (vx,vy) is
                                        (0,0), you get a linear interpolation ("lines").
"foreback"/"F"      d=[(x, y, bx, by, fx, fy), ...]
                                        like "velocity" except that there is a left derivative
                                        (bx,by) and a right derivative (fx,fy). If (bx,by)
                                        equals (fx,fy) (with no minus sign), you get a
                                        "velocity" curve
"smooth"/"S"        d=[(x,y), (x,y), ...]
                                        a "velocity" interpolation with (vx,vy)[i] equal to
                                        ((x,y)[i+1] - (x,y)[i-1])/2: the minimal derivative

Definition at line 1680 of file svgfig.py.

Constructor & Destructor Documentation

◆ __init__()

def svgfig.Poly.__init__ (   self,
  d = [],
  mode = "L",
  loop = False,
  attr 
)

Definition at line 1722 of file svgfig.py.

1722  def __init__(self, d=[], mode="L", loop=False, **attr):
1723  self.d = list(d)
1724  self.mode = mode
1725  self.loop = loop
1726 
1727  self.attr = dict(self.defaults)
1728  self.attr.update(attr)
1729 
def __init__(self, dataset, job_number, job_id, job_name, isDA, isMC, applyBOWS, applyEXTRACOND, extraconditions, runboundary, lumilist, intlumi, maxevents, gt, allFromGT, alignmentDB, alignmentTAG, apeDB, apeTAG, bowDB, bowTAG, vertextype, tracktype, refittertype, ttrhtype, applyruncontrol, ptcut, CMSSW_dir, the_dir)
#define update(a, b)

Member Function Documentation

◆ __repr__()

def svgfig.Poly.__repr__ (   self)

Definition at line 1719 of file svgfig.py.

References svgfig.SVG.attr, svgfig.Path.attr, svgfig.Curve.attr, svgfig.Poly.attr, svgfig.Fig.d, svgfig.Plot.d, svgfig.Frame.d, svgfig.Path.d, svgfig.Poly.d, svgfig.Curve.loop, svgfig.Poly.loop, and svgfig.Poly.mode.

Referenced by data_sources.json_file.__str__(), and datamodel.Object.__str__().

1719  def __repr__(self):
1720  return "<Poly (%d nodes) mode=%s loop=%s %s>" % (len(self.d), self.mode, repr(self.loop), self.attr)
1721 

◆ Path()

def svgfig.Poly.Path (   self,
  trans = None,
  local = False 
)
Apply the transformation "trans" and return a Path object in
global coordinates.  If local=True, return a Path in local coordinates
(which must be transformed again).

Definition at line 1734 of file svgfig.py.

References svgfig.SVG.attr, svgfig.Path.attr, svgfig.Curve.attr, svgfig.Poly.attr, svgfig.Fig.d, svgfig.Plot.d, svgfig.Frame.d, svgfig.Path.d, svgfig.Poly.d, svgfig.Curve.loop, svgfig.Poly.loop, svgfig.Poly.mode, isotrackApplyRegressor.range, and svgfig.totrans().

Referenced by svgfig.Poly.SVG().

1734  def Path(self, trans=None, local=False):
1735  """Apply the transformation "trans" and return a Path object in
1736  global coordinates. If local=True, return a Path in local coordinates
1737  (which must be transformed again)."""
1738  if isinstance(trans, str): trans = totrans(trans)
1739 
1740  if self.mode[0] == "L" or self.mode[0] == "l": mode = "L"
1741  elif self.mode[0] == "B" or self.mode[0] == "b": mode = "B"
1742  elif self.mode[0] == "V" or self.mode[0] == "v": mode = "V"
1743  elif self.mode[0] == "F" or self.mode[0] == "f": mode = "F"
1744  elif self.mode[0] == "S" or self.mode[0] == "s":
1745  mode = "S"
1746 
1747  vx, vy = [0.]*len(self.d), [0.]*len(self.d)
1748  for i in range(len(self.d)):
1749  inext = (i+1) % len(self.d)
1750  iprev = (i-1) % len(self.d)
1751 
1752  vx[i] = (self.d[inext][0] - self.d[iprev][0])/2.
1753  vy[i] = (self.d[inext][1] - self.d[iprev][1])/2.
1754  if not self.loop and (i == 0 or i == len(self.d)-1):
1755  vx[i], vy[i] = 0., 0.
1756 
1757  else:
1758  raise ValueError("mode must be \"lines\", \"bezier\", \"velocity\", \"foreback\", \"smooth\", or an abbreviation")
1759 
1760  d = []
1761  indexes = list(range(len(self.d)))
1762  if self.loop and len(self.d) > 0: indexes.append(0)
1763 
1764  for i in indexes:
1765  inext = (i+1) % len(self.d)
1766  iprev = (i-1) % len(self.d)
1767 
1768  x, y = self.d[i][0], self.d[i][1]
1769 
1770  if trans == None: X, Y = x, y
1771  else: X, Y = trans(x, y)
1772 
1773  if d == []:
1774  if local: d.append(("M", x, y, False))
1775  else: d.append(("M", X, Y, True))
1776 
1777  elif mode == "L":
1778  if local: d.append(("L", x, y, False))
1779  else: d.append(("L", X, Y, True))
1780 
1781  elif mode == "B":
1782  c1x, c1y = self.d[i][2], self.d[i][3]
1783  if trans == None: C1X, C1Y = c1x, c1y
1784  else: C1X, C1Y = trans(c1x, c1y)
1785 
1786  c2x, c2y = self.d[i][4], self.d[i][5]
1787  if trans == None: C2X, C2Y = c2x, c2y
1788  else: C2X, C2Y = trans(c2x, c2y)
1789 
1790  if local: d.append(("C", c1x, c1y, False, c2x, c2y, False, x, y, False))
1791  else: d.append(("C", C1X, C1Y, True, C2X, C2Y, True, X, Y, True))
1792 
1793  elif mode == "V":
1794  c1x, c1y = self.d[iprev][2]/3. + self.d[iprev][0], self.d[iprev][3]/3. + self.d[iprev][1]
1795  c2x, c2y = self.d[i][2]/-3. + x, self.d[i][3]/-3. + y
1796 
1797  if trans == None: C1X, C1Y = c1x, c1y
1798  else: C1X, C1Y = trans(c1x, c1y)
1799  if trans == None: C2X, C2Y = c2x, c2y
1800  else: C2X, C2Y = trans(c2x, c2y)
1801 
1802  if local: d.append(("C", c1x, c1y, False, c2x, c2y, False, x, y, False))
1803  else: d.append(("C", C1X, C1Y, True, C2X, C2Y, True, X, Y, True))
1804 
1805  elif mode == "F":
1806  c1x, c1y = self.d[iprev][4]/3. + self.d[iprev][0], self.d[iprev][5]/3. + self.d[iprev][1]
1807  c2x, c2y = self.d[i][2]/-3. + x, self.d[i][3]/-3. + y
1808 
1809  if trans == None: C1X, C1Y = c1x, c1y
1810  else: C1X, C1Y = trans(c1x, c1y)
1811  if trans == None: C2X, C2Y = c2x, c2y
1812  else: C2X, C2Y = trans(c2x, c2y)
1813 
1814  if local: d.append(("C", c1x, c1y, False, c2x, c2y, False, x, y, False))
1815  else: d.append(("C", C1X, C1Y, True, C2X, C2Y, True, X, Y, True))
1816 
1817  elif mode == "S":
1818  c1x, c1y = vx[iprev]/3. + self.d[iprev][0], vy[iprev]/3. + self.d[iprev][1]
1819  c2x, c2y = vx[i]/-3. + x, vy[i]/-3. + y
1820 
1821  if trans == None: C1X, C1Y = c1x, c1y
1822  else: C1X, C1Y = trans(c1x, c1y)
1823  if trans == None: C2X, C2Y = c2x, c2y
1824  else: C2X, C2Y = trans(c2x, c2y)
1825 
1826  if local: d.append(("C", c1x, c1y, False, c2x, c2y, False, x, y, False))
1827  else: d.append(("C", C1X, C1Y, True, C2X, C2Y, True, X, Y, True))
1828 
1829  if self.loop and len(self.d) > 0: d.append(("Z",))
1830 
1831  return Path(d, **self.attr)
1832 
def totrans(expr, vars=("x", "y"), globals=None, locals=None)
Definition: svgfig.py:598

◆ SVG()

def svgfig.Poly.SVG (   self,
  trans = None 
)
Apply the transformation "trans" and return an SVG object.

Definition at line 1730 of file svgfig.py.

References SiStripHistoPlotter::PlotParameter.Path, jsoncollector::Json::PathArgument.Path, svgfig.Curve.Path(), and svgfig.Poly.Path().

1730  def SVG(self, trans=None):
1731  """Apply the transformation "trans" and return an SVG object."""
1732  return self.Path(trans).SVG()
1733 

Member Data Documentation

◆ attr

svgfig.Poly.attr

◆ d

svgfig.Poly.d

◆ defaults

dictionary svgfig.Poly.defaults = {}
static

Definition at line 1717 of file svgfig.py.

Referenced by tree.Tree.reset(), and tree.Tree.var().

◆ loop

svgfig.Poly.loop

Definition at line 1725 of file svgfig.py.

Referenced by svgfig.Poly.__repr__(), and svgfig.Poly.Path().

◆ mode

svgfig.Poly.mode

Definition at line 1724 of file svgfig.py.

Referenced by svgfig.Poly.__repr__(), and svgfig.Poly.Path().