Metadata-Version: 2.0
Name: vsptd
Version: 1.2.0
Summary: Работа с ВСПТД
Home-page: https://github.com/become-iron/vsptd/
Author: UNKNOWN
Author-email: UNKNOWN
License: UNKNOWN
Platform: UNKNOWN
Classifier: Natural Language :: Russian

# vsptd — ВСПТД в ООП-стиле

ВСПТД — виртуальное строковое пространство технологических данных — описывает специальный способ организации баз знаний и баз данных. Подробнее узнать о спецификации можно в следующих пособиях:
* _ВИРТУАЛЬНОЕ СТРОКОВОЕ ПРОСТРАНСТВО ТЕХНОЛОГИЧЕСКИХ ДАННЫХ И ЗНАНИЙ. Методы представления данных. Филиппов А. Н._
* _ПРИМЕНЕНИЕ МЕТОДОВ ВИРТУАЛЬНОГО СТРОКОВОГО ПРОСТРАНСТВА ТЕХНОЛОГИЧЕСКИХ ДАННЫХ И ЗНАНИЙ В САПР ТП. А.Н. Филиппов, А.А. Путинцева_

####Зависимости
* Python 3.4+

####Установка
```
pip install vsptd
```

####Обновление
```
pip install vsptd -U
```

## Trp

Класс триплета.

**Принимает:**
* ```prefix``` (str) - префикс триплета
* ```name``` (str) - имя триплета
* ```value``` (str, int, float, Trp, TrpStr) - значение триплета

**Внимание! Случай, когда значение является триплетом или триплексной строкой, не реализован.**

### Примеры работы
####Создание
```python
my_trp = Trp('E', 'NM', 'Сверло')
my_trp2 = Trp('E1', 'NM', 'Зенкер')
```

####Обращение к свойствам
```python
>>> my_trp.prefix
'E'
>>> me_trp.name
'NM'
>>> my_trp.value
'Сверло'
```

####Перевод в строку, вывод
```python
>>> str(my_trp)
"$E.NM='Сверло';"
>>> print(my_trp)
$E.NM='Сверло';
```

####Проверка на равенство
```python
>>> my_trp == my_trp2
False
>>> my_trp != my_trp2
True
```

####Сложение
```python
>>> str(my_trp + my_trp2)
"$E.NM='Сверло';$E1.NM='Зенкер';"  # объект класса TrpStr
```

## TrpStr

Класс триплексной строки

**Принимает:**
* ```*triplets``` (Triplet) - триплеты

### Примеры работы
####Создание
```python
>>> my_trp_str = TrpStr(Trp('E', 'NM', 'Сверло'),  Trp('E1', 'NM', 'Зенкер'))
>>> triplets = [Trp('E2', 'NM', 'Отвёртка'),  Trp('E3', 'NM', 'Топор')]
>>> my_trp_str2 = TrpStr(*triplets)
```

####Длина триплексной строки
```python
>>> len(my_trp_str)
2
```

####Перевод в строку, вывод
```python
>>> str(my_trp_str)
"$E.NM='Сверло';$E1.NM='Зенкер';"
>>> print(my_trp_str)
$E.NM='Сверло';$E1.NM='Зенкер';
```

####Сложение
```python
>>> my_trp = Trp('E4', 'NM', 'Развёртка')
>>> str(my_trp + my_trp_str)
"$E4.NM='Развёртка';$E.NM='Сверло';$E1.NM='Зенкер';"  # объект класса TrpStr
>>> str(my_trp_str + my_trp)
"$E.NM='Сверло';$E1.NM='Зенкер';$E4.NM='Развёртка';"  # объект класса TrpStr
>>> str(my_trp_str + my_trp_str2)
"$E.NM='Сверло';$E1.NM='Зенкер';$E2.NM='Отвёртка';$E3.NM='Топор';"  # объект класса TrpStr
```
Существует метод ```add``` эквивалентный сложению через оператор "+"
```python
>>> str(my_trp_str.add(my_trp_str2))
"$E.NM='Сверло';$E1.NM='Зенкер';$E2.NM='Отвёртка';$E3.NM='Топор';"
```

####Равенство
```python
>>> my_trp_str == my_trp_str2
False
```

####Проверка вхождения триплета в триплексную строку
```python
>>> my_trp = Trp('E4', 'NM', 'Развёртка')
>>> my_trp_str = TrpStr(Trp('E', 'NM', 'Сверло'),  Trp('E1', 'NM', 'Зенкер'))
>>> my_trp in my_trp_str
False
>>> Trp('E', 'NM', 'Сверло') in my_trp_str
True
```

####Итерация, распаковка
```python
>>> for trp in my_trp_str:
	    print(trp)
$E.NM='Сверло';
$E1.NM='Зенкер';
>>> TrpStr(*my_trp_str) == my_trp_str
True
```

####Доступ к элементам триплексной строки по индексу/срезу или по ключу
_Принимает:_
* (str) - ключ
  * ключ формата 'префикс' -> TrpStr с триплетами, имеющими данный префикс
  * ключ формата 'префикс.имя' или '$префикс.имя' -> значение триплета
* иначе - индекс/срез
  * -> TrpStr по заданному индексу/срезу

_Примеры:_
* trpStr[2]
* trpStr[1:5]
* trpStr['E']
* trpStr['E.NM'] или trpStr['$E.NM']


####Удалить триплет из триплексной строки по значениям префикса и имени
```python
>>> my_trp_str = TrpStr(Trp('E', 'NM', 'Сверло'), Trp('E1', 'NM', 'Зенкер'), Trp('E2', 'NM', 'Отвёртка'))
>>> my_trp_str.del_trp('E', 'NM')
>>> print(my_trp_str)
$E1.NM='Зенкер';$E2.NM='Отвёртка';
```

####Удалить из триплексной строки все триплеты с заданным префиксом
```python
>>> my_trp_str = TrpStr(Trp('E', 'NM', 'Сверло'), Trp('E1', 'NM', 'Зенкер'), Trp('Q', 'PI', 3.14))
>>> my_trp_str.del_trp_pref('E')
>>> print(my_trp_str)
$E1.NM='Зенкер';$Q.PI=3.14;
```

## check_condition()

Функция *check_condition* осуществляет проверку истинности условия, включающего в себя триплеты.

Алгоритм заменяет триплеты, указанные в условии соответствующими значениями, затем проверяет истинность условия. Триплеты, указанные без префикса "$", заменяются соответствующими значениями, указанными в параметре trp_str_from_db

**Принимает:**
* ```trp_str``` (str) - триплексная строка
* ```cond``` (str) - условие
* ```trp_str_from_db``` (str) необязательный - триплексная строка по данным из базы данных

**Возвращает:**
* (bool) - результат проверки условия

**Вызывает исключение ValueError, если:**
* триплескная строка или условие не является строкой
* получена пустая строка вместо триплексной строки или условия
* триплет из условия не найден в триплексной строке
* в условии не соблюден баланс скобок

### Примеры работы
**Исходная триплексная строка**
```
$E.NST=1;$E.KRM=1;$E.KTS='211051';$E.VI=35;$Е.NI=1;$L.D=3.5;$L.L=10;$L.KW=12;$L.WOB=27;$M.PGM=3;$O.GRO='20001';$P.SE='221440';$Q.PI=3.14159;$Q.X=0.973;$Q.Y=0.7854;
```

**Триплексная строка по данным из базы**
```
$E.NST=5;$E.KRM=3;$E.KTS=1;$E.VI=325;$Е.NI=1;
```

####Условие I
```
SIN($Q.PI/2)>COS($Q.PI/3)
```
**Результат: True**

####Условие II
```
(SIN($Q.X)*SIN($Q.X)+COS($Q.X)*COS($Q.X))>1
```
**Результат: False**

####Условие III
```
($L.WOB=25 ИЛИ $L.WOB=27) И НЕТ($L.TT)
```
**Результат: True**

####Условие IV
```
$E.KTS='21' И ($O.GRO<>'10000' И $O.GRO<>'10001')
```
**Результат: False**

####Условие V
```
E.NST > 2 И $E.KTS='211051'
```
**Результат: True**

### Особенности работы
####Функции
*Названия данных функций в условии могут быть определены как в нижнем регистре, так и в верхнем.*
* sin
* cos
* tan
* acos
* atan
* sinh
* cosh
* tanh
* sqrt
* exp
* ln
* log
* strcat
* min
* max
* abs
* есть
* нет

####Операторы
*Логические операторы могут быть определены как в нижнем регистре, так и в верхнем. Также они обязательно должны быть обособлены пробелами.*
* Операторы сравнения: `=`, `==`, `<>`, `!=`, `>`, `<`, `>=`, `<=`
* Логические операторы: `и`, `или`, `and`, `or`
* Математические операторы: `^`, `**`, `*`, `/`, `+`, `-`


