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, FastTimerService_cff.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, 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().