# python3
import math
import numbers
import tikzpy.obj_data as obj_data
import copy
import tikzpy.plots.cls_racime as asse_rac
import tikzpy.plots.cls_bars_vertical as bars_vertical
import tikzpy.plots.cls_arrow_vertical as arrow_vertical
def log(txt):
print(txt)
[docs]class _plots(object):
"""**Plots class:**
.. _plots_cls:
:platform: Unix, Windows
:synopsis: buld-in plots based on tikzpy
:Available plots:
* Racime
* Vertical bars plots
**Chracteristics of a plot object**
* Each plot object has different properties depending on the nature of the plot.
"""
def __init__(self, parent):
self.parent = parent
### Counters
self.counters = obj_data._clsdata(type = int(0))
### Dictionary of lines
self.assemblys = obj_data._clsdata(type = {})
self.counters["assemblys"] = 0
def __getitem__(self, key):
return self.getitem(key)
def keys(self):
return self.assemblys.keys
def getitem(self, key):
### Give a point
_key = str(key)
if self.assemblys[_key]:
return _assembly(self,_key, self.assemblys[_key]["action"])
else:
return None
##########################################
[docs] def racime(self, group = 0):
"""
.. _racime_plot:
**Synopsis:**
* Returns a racime plot object
**Args:**
* None
**Optional parameters:**
* group = 0: group id
**Returns:**
* A racime plot object
**Usage**
* See :doc:`plots examples </_examples/tikzpy_plots/test_gen>`, :ref:`example 1 <ex_plots_racime_1>`, :ref:`example 2 <ex_plots_racime_2>`
"""
rac = self._additem("racime", group = group)
rac._handler.load_data_ini(rac)
return rac
[docs] def bars_vertical(self, group = 0):
"""
.. _bars_vertical_plot:
**Synopsis:**
* Returns a vertical bars plot object
**Args:**
* None
**Optional parameters:**
* group = 0: group id
**Returns:**
* A vertical bars plot object
**Usage**
* See :doc:`plots examples </_examples/tikzpy_plots/test_gen>`, :ref:`example 3 <ex_plots_bars_vertical_1>`, :ref:`example 4 <ex_plots_bars_vertical_2>`
* See :ref:`vertical plot object <bars_vertical_cls>`
"""
rac = self._additem("bars_vertical", group = group)
rac._handler.load_data_ini(rac)
return rac
[docs] def arrow_vertical(self, group = 0):
"""
.. _arrow_vertical_plot:
**Synopsis:**
* Returns a vertical arrow plot object
**Args:**
* None
**Optional parameters:**
* group = 0: group id
**Returns:**
* A vertical arrow plot object
**Usage**
* See :doc:`plots examples </_examples/tikzpy_plots/test_gen>`, :ref:`example 1 <ex_plots_arrow_vertical_1>`
* See :ref:`vertical plot object <arrow_vertical_cls>`
"""
rac = self._additem("arrow_vertical", group = group)
rac._handler.load_data_ini(rac)
return rac
##########################################
def _additem(self, type, group = 0):
# Create auto new
_key = "rac#%i" % self.counters["assemblys"]
self.counters["assemblys"] = self.counters["assemblys"] + 1
self.assemblys[_key] = {}
lline = _assembly(self,_key, type)
lline.group = group
lline.action = type
lline.addlabel = "default"
lline.group_label = "##group##" + _key
return lline
#########################
@property
def labels(self):
return self.parent.lbl.labels
@property
def addlabel(self):
return self.labels
@addlabel.setter
def addlabel(self, value):
self.parent.lbl.addlabel = value
def dellabel(self, value):
if value in self.labels:
### Delete from all the assemblys
for key in self.keys():
shp = self.getitem(key)
shp.dellabel(value)
### Remake list
self.parent.lbl._dellabel(value)
return True
else:
#log("The label %s has not been previously declared" % value)
return False
def rename_label(self, name_old, name_new):
if name_old != name_new:
### Add new name
self.addlabel=name_new
### Delete from all the assemblys
for key in self.keys():
shp = self.getitem(key)
if name_old in self.assemblys[key]["labels"]:
shp.dellabel(name_old)
shp.addlabel=name_new
### Remake list
self.parent.lbl._dellabel(name_old)
return True
else:
#log("Inconsistent")
return False
[docs]class _assembly(object):
def __init__(self, parent, key, type):
self.parent = parent
self._key = key
if not self.parent.assemblys[key]:
self.parent.assemblys[self._key]["action"] = ""
self.parent.assemblys[self._key]["group"] = 0
self.parent.assemblys[self._key]["z-order"] = 0.
self.parent.assemblys[self._key]["labels"] = []
self.parent.assemblys[self._key]["group_label"] = ""
self.parent.assemblys[self._key]["mpto"] = None
self.parent.assemblys[self._key]["_draw"] = False
if type == "racime":
self._handler = asse_rac._racime(self.parent)
elif type == "bars_vertical":
self._handler = bars_vertical._bars_vertical(self.parent)
elif type == "arrow_vertical":
self._handler = arrow_vertical._arrow_vertical(self.parent)
else:
raise Error
#Setter and getter properties dynamically add
for ele in self._handler.lst_data_conf:
self.addProperty(ele)
#Add methods
#self._handler.load_methods(self,key)
def addProperty(self, attribute):
# create local setter and getter with a particular attribute name
getter = lambda self: self._getProperty(attribute)
setter = lambda self, value: self._setProperty(attribute, value)
# construct property attribute and add it to the class
setattr(self.__class__, attribute, property(fget=getter, \
fset=setter, \
doc="Auto-generated method"))
def _setProperty(self, attribute, value):
#print "Setting: %s = %s" %(attribute, value)
#self.parent.assemblys[self._key][attribute] = value
self._handler.set_property(attribute, value, self._key)
def _getProperty(self, attribute):
#print "Getting: %s" %attribute
#return self.parent.assemblys[self._key][attribute]
return self._handler.get_property(attribute, self._key)
#############################################
def copy(self):
### To change
shp = self.parent._additem(self.action, group = self.group)
for key in self.parent.assemblys[self.id].keys():
self.parent.assemblys[shp.id][key] = copy.deepcopy(self.parent.assemblys[self.id][key])
def move(self, mpto):
### Move function
self.parent.assemblys[self._key]["mpto"] = mpto.copy()
def draw_group_elements(self, asse, units = ""):
shps = self._handler.draw_group_elements(units, asse)
if type(shps) != type([]):
log("Error draw_group_elements function definition")
### Common practices
for shp in shps:
# Edit zorder
zorder = shp.zorder
zorder = (zorder / 10000.) + self.parent.assemblys[self._key]["z-order"]
shp.zorder = zorder
# Add common group label
shp.group_label = self.parent.assemblys[self._key]["group_label"]
# Add labels
for lbl in self.parent.assemblys[self._key]["labels"]:
shp.addlabel = lbl
### Move
mpto = self.parent.assemblys[self._key]["mpto"]
if mpto:
#self.parent.parent.move_list_shapes( mpto, shps)
self.parent.parent.shp.translate(shps, x=mpto.x, y=mpto.y, z=mpto.z)
# Add labels
for lbl in self.parent.assemblys[self._key]["labels"]:
self.parent.parent.add_label_to_list_shapes(shps, lbl)
############# declared methods functions
def add_element(self, *args, **kwargs):
return self._handler.add_element(*args+(self,), **kwargs)
[docs] def load_data_buffer(self, data_buff):
"""
.. _assem_load_load_data_buffer:
**Synopsis:**
* Loads a data buffer file into the plot to be plot in case is required
**Args:**
* data_buff object (see :ref:`Data buffer class <dbuffer_cls>`)
**Optional parameters:**
* units = None (by default the tikzpy units will be use)
**Returns:**
* None
**Usage**
* See :ref:`example 3 <ex_plots_bars_vertical_1>`
"""
self._handler.load_data_buffer(self, data_buff)
[docs] def draw_plot(self, units = None):
"""
.. _assem_draw_plot:
**Synopsis:**
* Draw / load the plot. The elements that compose the plot become accessible. Once is draw it can not be draw again.
**Args:**
* None
**Optional parameters:**
* units = None (by default the tikzpy units will be use)
**Returns:**
* None
**Usage**
* See :ref:`example 3 <ex_plots_bars_vertical_1>`
"""
if self.parent.assemblys[self._key]["_draw"] == False:
plots = self.parent.parent.plots.getitem(self._key)
if units is None: units = self.parent.parent.units
plots.draw_group_elements(plots, units = units)
self.parent.assemblys[self._key]["_draw"] = True
#def _add_element(self, text, thickness = "thin", separation = None):
# print self.element
# #self.parent.assemblys[self._key]["element"].append([text, thickness, separation])
# self.element.append([text, thickness, separation])
# print self.element
#############################################
@property
def id(self):
return self._key
@property
def action(self):
return self.parent.assemblys[self._key]["action"]
@action.setter
def action(self, value):
self.parent.assemblys[self._key]["action"] = value
@property
def group(self):
return self.parent.assemblys[self._key]["group"]
@group.setter
def group(self, value):
self.parent.assemblys[self._key]["group"] = int(value)
@property
def zorder(self):
return self.parent.assemblys[self._key]["z-order"]
@zorder.setter
def zorder(self, value):
self.parent.assemblys[self._key]["z-order"] = float(value)
@property
def _labels(self):
return self.parent.assemblys[self._key]["labels"]
@property
def labels(self):
return copy.deepcopy(self.parent.assemblys[self._key]["labels"])
@property
def addlabel(self):
return self.labels
@addlabel.setter
def addlabel(self, value):
if type(value) is type([]):
for val in value:
self.addlabel = val
else:
if value in self.parent.labels:
if not value in self.parent.assemblys[self._key]["labels"]:
self.parent.assemblys[self._key]["labels"].append(value)
return True
else:
self.parent.addlabel = value
if not value in self.parent.assemblys[self._key]["labels"]:
self.parent.assemblys[self._key]["labels"].append(value)
return True
def dellabel(self, value):
if value in self.parent.labels:
if value in self.parent.assemblys[self._key]["labels"]:
newlst = [x for x in self.labels if x != value]
self.parent.assemblys[self._key]["labels"] = newlst
return True
else:
#log("The label %s has not been added before" % value)
return False
else:
#log("The label %s has not been previously declared" % value)
return False
def __repr__(self):
return self.__class__
def __str__(self):
return "assembly key:%s group=%i Num assemblys:%i" % (self.id, self.group, len(self.parent.assemblys))
@property
def grouplabel(self):
return self.parent.assemblys[self._key]["group_label"]
@group.setter
def grouplabel(self, value):
self.parent.assemblys[self._key]["group_label"] = int(value)
#############################################