
Instance_pairs.Get_pair(matr)
После вызова в атрибут класса .pairs будет записано новое значение итогового закрепления, которое можно получить явным вызовом атрибута экземпляра класса.
pairs.Analisys
__init__()
Специальный метод класса. Задачи:
Конструктор
экземпляра класса.
__call__()
Специальный метод класса. Задачи:
Вызов экземпляра класса как функцию.
.get_pair()
Метод экземпляра
класса.
Задачи: Получение пар неопределенности
из ядра противоречий.
Реализует функции с использованием
класса: pairs.Pair
Использует атрибуты: .data_in
Изменяет атрибуты: .pairs
.get_klaster()
Метод экземпляра
класса.
Задачи: Получение итоговых кластеров
неопределенности из пар неопределенности.
Реализует функции с использованием
класса: pairs.Intersection
Использует атрибуты: .pairs
Изменяет атрибуты: .intsc
.open_close()
Метод экземпляра
класса.
Задачи: Сохранение исходных данных
и результатов в файлы, а также получение
исходных данных из файлов.
Рисунок 1.3 Структура класса Analisys
Для вышеприведенного примера получаем
print instance_pairs.pairs
Для проведения автоматического расчета всех этапов необходимо создавать экземпляр класса с исходными данными, т.е. с передачей матрицы описывающей ядро противоречий (“matr”)
instance_pairs= pairs.Analisys(matr)
Класс автоматически проделает все операции с исходными данными и заполнит все атрибуты экземпляра класса. В результате возможен вызов всех атрибутов экземпляра класса через их явное указание
print instance_pairs.data_in
print instance_auto.pairs
print instance_auto.intsc
2 Листинг с пояснениями
# -*- coding: utf-8 -*-
u"""Универсальный фото конвертер."""
import os
import re
import math
import Image
import ImageTk
import ImageDraw
import ImageFont
class FotoError(Exception):
u"""Обработка исключений."""
def __init__(self, *arg):
Exception.__init__(self)
def __str__(self):
return self.error
class FileOpenError(FotoError):
u"""Открытие, закрытие, имя ошибке перехватчик."""
def __init__(self, *argv):
FotoError.__init__(self, *argv)
if argv[0] == "path":
self.error = ("Path '%s' is not exists. " %(argv[1]) +
"Maybe need '\\\\' instead '\\'.")
if argv[0] == "file":
self.error = ("File '%s' is not exists." % (argv[1]))
if argv[0] == "format":
self.error = ("Supported foto " +
"format is: %s. " % (", ".join(argv[1])) +
"Received foto format is: '%s'." % (argv[2]))
class StackError(FotoError):
u"""Позиции или len ошибке перехватчик."""
def __init__(self, *argv):
FotoError.__init__(self)
if argv[0] == "empty":
self.error = "The len of stek foto is empty."
if argv[0] == "position":
self.error = ("Maximal position is equal '%s'. " % argv[1] +
"Recived '%s'!." % argv[2])
if argv[0] == "name":
self.error = "No foto named '%s'." % argv[1]
class ArgumentError(FotoError):
u"""Перехватчиков ошибка аргументаr."""
def __init__(self, *argv):
FotoError.__init__(self)
if argv[0] == "type":
temp = re.compile(r"'([a-zA-Z]+\.?[a-zA-Z]+)'")
type_ = temp.findall(str(argv[2]))[0]
possible = [temp.findall(str(tps))[0] for tps in argv[1]]
self.error = ("Expected type " +
"of argument is: %s. " % (", ".join(possible)) +
"Received type of argument is: '%s'." % (type_))
if argv[0] == "equal":
self.error = ("Len argument must be equal '%s'. " % (argv[1]) +
"Actual argument len's is '%s'." % (argv[2]) )
if argv[0] == "root":
self.error = ("Root tk is not aviable. " +
"Start this function with active root.")
class Foto(object):
u"""Активное фото объекта"""
def __init__(self, path):
object.__init__(self)
# Atributes
self.file = Image.open(path)
self.path, self.name = os.path.split(path)
self.sname = "".join(self.name.split(".")[:-1])
self.format = self.file.format
self.mode = self.file.mode
self.width = self.file.size[0]
self.height = self.file.size[1]
# Methods
self.show = self.file.show
self.save = self.file.save
self.resize = self.file.thumbnail
self.convert = self.file.convert
def __str__(self):
full_nm = (u"""[FILE NAME: %s]\n""" % (self.name) +
u"""Path: %s;\n""" % (self.path) +
u"""Format: %s;\n""" % (self.format)+
u"""Mode: %s;\n""" % (self.mode) +
u"""Size\n""" +
u""" Width: %s\n""" % (str(self.width)) +
u""" Height: %s.""" % (str(self.height)))
return full_nm
def __repr__(self):
return self.name
class UFC(list):
u"""Генератор команд универсального фото корвентера."""
def __init__(self, path=None):
list.__init__(self)
if path is not None:
self.add_foto(path)
def analisys_path(self, path):
u"""Анализирование пути открытия или создание фото."""
pathtofile, file_ = os.path.split(path)
format_fact = file_.split(".")[-1].lower()
format_ = ["bmp", "dib", "cur", "dcx", "fli", "flc", "fpx", "gbr",
"gd", "gif", "ico", "im", "imt", "jpg", "jpe", "jpeg",
"mic", "msp", "pcd", "pcx", "pdf", "png", "pbm", "pgm",
"ppm", "psd", "bw", "rgb", "cmyk", "ras", "tga", "tif",
"tiff", "xbm", "xpm"]
if os.path.exists(path) is False:
if os.path.exists(pathtofile):
if format_fact in format_:
raise FileOpenError, ("file", file_)
else:
raise FileOpenError, ("format", format_, format_fact)
else:
raise FileOpenError, ("path", pathtofile)
else:
if not format_fact in format_:
raise FileOpenError, ("format", format_, format_fact)
def add_foto(self, path):
u"""
Open file. Supported format:
- BMP: *.bmp, *.dib;
- CUR: *.cur;
- DCX: *.dcx;
- FLI, FLC: *.fli, *.flc;
- FPX: *.fpx;
- GBR: *.gbr;
- GD: *.gd;
- GIF: *.gif;
- ICO: *.ico;
- IM: *.im;
- IMT: *.imt;
- JPEG: *.jpg, *.jpe, *.jpeg;
- MIC: *.mic;
- MSP: *.msp;
- PCD: *.pcd;
- PCX: *.pcx;
- PDF: *.pdf;
- PNG: *.png;
- PPM: *.pbm, *.pgm, *.ppm;
- PSD: *.psd;
- SGI: *.bw, *.rgb, *.cmyk;
- SUN: *.ras;
- TGA: *.tga;
- TIFF: *.tif, *.tiff;
- XBM: *.xbm;
- XPM: *.xpm.*
"""
possible = [str]
if type(path) in possible:
self.analisys_path(path)
self.append(Foto(path))
else:
raise ArgumentError, ("type", [str], type(path))
def del_foto(self, pos_name):
u"""Удаление формата фото."""
if self:
if isinstance(pos_name, int):
if pos_name <= len(self) - 1:
self.pop(pos_name)
else:
raise StackError, ("position", len(self) - 1, pos_name)
elif isinstance(pos_name, str):
foto = [pole.name for pole in self]
if pos_name in foto:
self.pop(foto.index(pos_name))
else:
raise StackError, ("name", pos_name)
else:
raise ArgumentError, ("type", [int, str], type(pos_name))
else:
raise StackError, ("empty")
def convert_to(self, format_fact, needtodelete=False):
u"""
Convert file. Supported format:
- BMP: *.bmp, *.dib;
- GIF: *.gif;
- IM: *.im;
- JPEG: *.jpg, *.jpe, *.jpeg;
- MSP: *.msp;
- PCX: *.pcx;
- PNG: *.png;
- PPM: *.pbm, *.pgm, *.ppm;
- TIFF: *.tif, *.tiff;
- XBM: *.xbm.
"""
possible = [str]
format_ = ["bmp", "dib", "gif", "im", "jpg", "jpe", "jpeg", "msp",
"pcx", "png", "pbm", "pgm", "ppm", "tif", "tiff", "xbm"]
if self:
if type(format_fact) in possible:
format_fact = format_fact.lower()
if format_fact in format_:
path = []
for foto in self:
fotoname = foto.sname + "." + format_fact
path.append(os.path.join(foto.path, fotoname))
self.save(path, needtodelete)
else:
raise FileOpenError, ("format", format_, format_fact)
else:
raise ArgumentError, ("type", possible, type(format_fact))
else:
raise StackError, ("empty")
def save(self, path, needtodelete=False):
u"""Сохранение нового файла."""
possible = [list, tuple, str]
if type(path) not in possible:
raise ArgumentError, ("type", possible, type(path))
if not (len(path) == len(self) and not isinstance(path, str)):
raise ArgumentError, ("equal", len(self), len(path))
elif isinstance(path, str) and not len(self) == 1:
raise ArgumentError, ("equal", len(self), 1)
else:
for pos in xrange(len(self)):
self[pos].save(path[pos])
if needtodelete:
path_old = os.path.join(self[pos].path, self[pos].name)
self.add_foto(path[pos])
os.remove(path_old)
self[pos] = self.pop(-1)
def resize(self, box, addtext="_th_", needtodelete=False):
u"""Изменение размеров фото."""
possible = [list, tuple]
if type(box) in possible:
if len(box) != 2:
raise ArgumentError, ("equal", 2, len(box))
else:
raise ArgumentError, ("type", possible, type(box))
path = []
for foto in self:
foto.resize(tuple(box))
name = "%s%s%sX%s.%s" % (foto.sname, addtext,
box[0], box[1], foto.format)
path.append(os.path.join(foto.path, name))
self.save(path, needtodelete)
def create_tk(self):
u"""Foto for Tkinter"""
try:
for pos in xrange(len(self)):
self[pos] = ImageTk.PhotoImage(self[pos].file)
except RuntimeError:
raise ArgumentError, ("root")
def add_text(self, text, pathfont=None, addtext="_w", needtodelete=False):
u"""Нанесение текста"""
possible = [str]
for data in [text, pathfont, addtext]:
if type(data) != possible:
raise ArgumentError, ("type", possible, type(data))
if pathfont is None:
pathfont = "arial.ttf"
path = []
for foto in self:
name = "%s%s.%s" % (foto.sname, addtext, foto.format)
path.append(os.path.join(foto.path, name))
foto.convert("RGB")
wattext = Image.new("RGBA", (foto.width, foto.height))
draw = ImageDraw.ImageDraw(wattext, "RGBA")
size = 0
while True:
size += 1
altfont = ImageFont.truetype(pathfont, size)
textwd, textht = altfont.getsize(text)
if textwd+textht/2.5 > wattext.size[0]:
break
font = altfont
textwidth, textht = textwd, textht
draw.setfont(font)
draw.text(((wattext.size[0] - textwidth) / 2,
(wattext.size[1] - textht) / 2), text)
angle = math.degrees(math.atan(foto.height / float(foto.width)))
wattext = wattext.rotate(angle, Image.CUBIC)
upfoto = wattext.convert("L").point(lambda x: min(x, 50))
wattext.putalpha(upfoto)
foto.file.paste(wattext, None, wattext)
self.save(path, needtodelete)
def get_param(self):
u"""Возвращение файла на диск сновыми параметрами."""
for foto in self:
print foto
if __name__ == "__main__":
Bufer = UFC()
Bufer = UFC(r"c:\Python27\foto1.jpg")
Bufer.add_foto(r"c:\Python27\foto2.jpg")
Bufer.add_foto(r"c:\Python27\foto3.jpg")
Bufer.get_param()
Bufer.add_text("new text")
Bufer.resize([600, 600])
Bufer.convert_to("bmp")
Bufer[0].show()
#Bufer.create_tk()
del(Bufer)