Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пример пояснения..doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
98.82 Кб
Скачать

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)