Add files via upload
This commit is contained in:
commit
7663abb2ee
7 changed files with 2152 additions and 0 deletions
1548
Cargo.lock
generated
Normal file
1548
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load diff
12
Cargo.toml
Normal file
12
Cargo.toml
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
[package]
|
||||
name = "fsa"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
svg = "0.18.0"
|
||||
serde = { version = "1.0", features = ["derive"] }
|
||||
serde_json = "1.0"
|
||||
futures-util = "0.3"
|
||||
actix-web = "4.9.0"
|
||||
actix-cors = "0.6"
|
||||
49
src/main.rs
Normal file
49
src/main.rs
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
mod types;
|
||||
use types::{as_svg::AsSVG, Объект};
|
||||
use actix_web::{web, App, HttpServer, get, post, HttpResponse};
|
||||
use actix_cors::Cors;
|
||||
|
||||
use std::sync::RwLock;
|
||||
type ObjectStore = RwLock<Vec<Объект>>;
|
||||
|
||||
#[post("/add_object")]
|
||||
async fn add_object(
|
||||
data: web::Json<Объект>,
|
||||
store: web::Data<ObjectStore>,
|
||||
) -> HttpResponse {
|
||||
let obj = data.into_inner();
|
||||
let out = obj.to_svg(0.0, 0.0).to_string();
|
||||
let mut objects = store.write().unwrap();
|
||||
objects.push(obj);
|
||||
|
||||
HttpResponse::Ok().content_type("image/svg+xml").body(out)
|
||||
}
|
||||
|
||||
#[get("/svg")]
|
||||
async fn get_svg(store: web::Data<ObjectStore>) -> HttpResponse {
|
||||
use types::as_svg::wrap_document;
|
||||
use crate::types::as_svg::AsSVG;
|
||||
let obj = store.read().unwrap();
|
||||
let groups = obj.iter().map(|x| x.to_svg(0.0, 0.0)); // TODO 0.0, 0.0
|
||||
let send_this = wrap_document(groups).to_string();
|
||||
HttpResponse::Ok().content_type("image/svg+xml").body(send_this)
|
||||
}
|
||||
|
||||
#[actix_web::main]
|
||||
async fn main() -> std::io::Result<()> {
|
||||
let store = web::Data::new(RwLock::new(Vec::<Объект>::new()));
|
||||
|
||||
HttpServer::new(move || {
|
||||
App::new()
|
||||
.app_data(store.clone())
|
||||
.service(add_object)
|
||||
.service(get_svg)
|
||||
.wrap(Cors::default()
|
||||
.allow_any_origin() // Или укажите конкретные источники
|
||||
.allow_any_method()
|
||||
.allow_any_header())
|
||||
})
|
||||
.bind("127.0.0.1:8080")?
|
||||
.run()
|
||||
.await
|
||||
}
|
||||
120
src/types.rs
Normal file
120
src/types.rs
Normal file
|
|
@ -0,0 +1,120 @@
|
|||
pub mod to_letter;
|
||||
pub mod as_svg;
|
||||
pub mod display;
|
||||
use serde::{Serialize, Deserialize};
|
||||
|
||||
#[derive(Debug, PartialEq, Serialize, Deserialize)]
|
||||
pub enum ОсновнаяВеличина {
|
||||
АнализКачество,
|
||||
ПламяГорение,
|
||||
CДополнительный,
|
||||
DДополнительный,
|
||||
Напряжение,
|
||||
Расход,
|
||||
GДополнительный,
|
||||
РучноеВоздействие,
|
||||
Ток,
|
||||
Мощность,
|
||||
Время,
|
||||
Уровень,
|
||||
MДополнительный,
|
||||
NДополнительный,
|
||||
OДополнительный,
|
||||
Давление,
|
||||
Количество,
|
||||
Радиоактивность,
|
||||
СкоростьЧастота,
|
||||
Температура,
|
||||
Разнородные, // несколько величин ТОЛЬКО здесь
|
||||
Вибрация,
|
||||
Вес,
|
||||
Нерекомендовано,
|
||||
Событие,
|
||||
Размер,
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq, Serialize, Deserialize)]
|
||||
pub enum УточнениеВеличины {
|
||||
РазностьПерепад,
|
||||
СоотношениеДоляДробь,
|
||||
АвтоматическоеПереключениеОбегание,
|
||||
ИнтегрированиеСуммированиеПоВремени,
|
||||
СамосрабатывающееУБ,
|
||||
СистемаИнструментальнойБезопасности
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq, Serialize, Deserialize)]
|
||||
pub enum ВыполняемаяФункция {
|
||||
Сигнализация,
|
||||
АвтоматическоеРегулирование,
|
||||
ВеличинаОтклоненияОтЗаданной,
|
||||
Регистрация
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq, Serialize, Deserialize)]
|
||||
pub enum ФункциональныйПризнак {
|
||||
ЧувствительныйЭлемент,
|
||||
ПервичныйПоказывающийПрибор,
|
||||
ВторичныйПоказывающийПрибор,
|
||||
СтанцияУправления,
|
||||
QДополнительный,
|
||||
ВключениеОтключениеПереключение,
|
||||
Преобразование,
|
||||
VДополнительный,
|
||||
ВспомогательныеКомпьютерныеУстройства,
|
||||
ВспомогательныеВычислительноеУстройство,
|
||||
ZДополнительный
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq, Serialize, Deserialize)]
|
||||
pub enum ДополнительныеОбозначения {
|
||||
ВерхнийПределИзмеряемойВеличины,
|
||||
НижнийПределИзмеряемойВеличины,
|
||||
ВеличинаИлиСреднееПоложение,
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq, Serialize, Deserialize)]
|
||||
pub enum Ф {
|
||||
ВыполняемаяФункция(ВыполняемаяФункция),
|
||||
ФункциональныйПризнак(ФункциональныйПризнак),
|
||||
ДополнительноеОбозначение(ДополнительныеОбозначения), // уточнить, не option ли это
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq, Serialize, Deserialize)]
|
||||
pub enum Направление {
|
||||
Открывается,
|
||||
Закрывается,
|
||||
ОстаётсяНаМесте
|
||||
}
|
||||
|
||||
|
||||
#[derive(Debug, PartialEq, Serialize, Deserialize)]
|
||||
pub enum Фиксация {
|
||||
НаМесте,
|
||||
НаЩите,
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq, Serialize, Deserialize)]
|
||||
pub enum ТипПрибора {
|
||||
Величина {
|
||||
величина: ОсновнаяВеличина,
|
||||
уточнение: Option<УточнениеВеличины>,
|
||||
функции: Vec<Ф>
|
||||
},
|
||||
Мультивеличина {
|
||||
список: Vec<crate::types::ТипПрибора> // FIXME
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq, Serialize, Deserialize)]
|
||||
pub enum Объект {
|
||||
Прибор {
|
||||
фиксация: Фиксация,
|
||||
тип_прибора: ТипПрибора,
|
||||
является_паз: bool,
|
||||
},
|
||||
ИсполнительныйМеханизм {
|
||||
имеет_ручной: bool,
|
||||
направление: Option<Направление>,
|
||||
},
|
||||
}
|
||||
218
src/types/as_svg.rs
Normal file
218
src/types/as_svg.rs
Normal file
|
|
@ -0,0 +1,218 @@
|
|||
use svg::{Document, Node};
|
||||
use crate::types::*;
|
||||
use svg::node::element::{Circle, Line, Group, Rectangle, Text, Marker, Path, Definitions};
|
||||
use svg::node::element::Polygon;
|
||||
|
||||
const PRIMARY_COLOR: &str = "CanvasText";
|
||||
const SECONDARY_COLOR: &str = "Canvas";
|
||||
const TRANSPARENT_COLOR: &str = "transparent"; // used to be transparent
|
||||
const HIGHLIGHT_COLOR: &str = "highlight"; // use to be red
|
||||
|
||||
macro_rules! svg {
|
||||
($obj:expr, $($key:ident: $value:expr),* $(,)?) => {{
|
||||
let mut obj = $obj;
|
||||
$(
|
||||
obj = obj.set(stringify!($key), $value);
|
||||
)*
|
||||
obj
|
||||
}};
|
||||
}
|
||||
|
||||
macro_rules! create_if {
|
||||
($condition:expr, $create:expr, $($key:ident: $value:expr),*) => {{
|
||||
if $condition {
|
||||
svg!($create, $($key: $value),*)
|
||||
} else {
|
||||
$create
|
||||
}
|
||||
}};
|
||||
|
||||
($condition:expr, $create:expr) => {{
|
||||
if $condition {
|
||||
$create
|
||||
} else {
|
||||
$create
|
||||
}
|
||||
}};
|
||||
}
|
||||
|
||||
pub trait AsSVG {
|
||||
fn to_svg(&self, left_x:f32, top_y:f32) -> Group;
|
||||
}
|
||||
|
||||
pub fn make_main_letters(тип: &ТипПрибора) -> String {
|
||||
use crate::types::to_letter::ToLetter;
|
||||
|
||||
match тип {
|
||||
ТипПрибора::Величина {
|
||||
величина,
|
||||
уточнение,
|
||||
функции
|
||||
} => {
|
||||
let str1 = функции.iter()
|
||||
.map(|x|
|
||||
match x {
|
||||
Ф::ВыполняемаяФункция(л) => л.to_letter(),
|
||||
Ф::ФункциональныйПризнак(л) => л.to_letter(),
|
||||
Ф::ДополнительноеОбозначение(_) => ' '
|
||||
})
|
||||
.filter(|&x| x != ' ').collect::<String>();
|
||||
|
||||
let c =
|
||||
if let Some(x) = уточнение { x.to_letter() } else { ' ' };
|
||||
|
||||
let str2:String = vec!(величина.to_letter(), c)
|
||||
.into_iter()
|
||||
.filter(|&x| x != ' ')
|
||||
.collect();
|
||||
|
||||
str2+&str1
|
||||
},
|
||||
_ => "U".to_owned() // TODO !!!
|
||||
}
|
||||
}
|
||||
|
||||
impl AsSVG for Объект {
|
||||
fn to_svg(&self, left_x: f32, top_y: f32) -> Group {
|
||||
let mut group = Group::new().set("class", "draggable-group");
|
||||
match self {
|
||||
Объект::Прибор {
|
||||
фиксация,
|
||||
является_паз,
|
||||
тип_прибора
|
||||
} => {
|
||||
if ! *является_паз {
|
||||
group.append(Circle::new()
|
||||
.set("cx", left_x + 5.0)
|
||||
.set("cy", top_y + 4.0)
|
||||
.set("r", 5)
|
||||
.set("stroke", PRIMARY_COLOR)
|
||||
.set("fill", SECONDARY_COLOR));
|
||||
} else {
|
||||
group.append(
|
||||
diamond(10.0, 10.0, left_x, top_y)
|
||||
.set("fill", SECONDARY_COLOR));
|
||||
group.append(
|
||||
Rectangle::new()
|
||||
.set("x", left_x)
|
||||
.set("y", top_y)
|
||||
.set("width", 10)
|
||||
.set("height", 10)
|
||||
.set("stroke", PRIMARY_COLOR)
|
||||
.set("fill", TRANSPARENT_COLOR)
|
||||
);
|
||||
}
|
||||
|
||||
group.add(svg!(
|
||||
Text::new(make_main_letters(тип_прибора)),
|
||||
x: left_x + 5.0, y: top_y + 4.0,
|
||||
stroke: "none", fill: PRIMARY_COLOR
|
||||
)
|
||||
.set("alignment-baseline", "baseline")
|
||||
.set("font-size", "1mm")
|
||||
.set("text-anchor", "middle"))
|
||||
.add(create_if!(*фиксация == Фиксация::НаЩите,
|
||||
Line::new(),
|
||||
x1: left_x, y1: top_y + 5.0,
|
||||
x2: left_x + 10.0, y2: top_y + 5.0,
|
||||
stroke: PRIMARY_COLOR)
|
||||
.set("stroke-width", "0.075mm"))
|
||||
}
|
||||
|
||||
Объект::ИсполнительныйМеханизм {
|
||||
имеет_ручной,
|
||||
направление,
|
||||
} => {
|
||||
let d = 5.0;
|
||||
let r = d / 2.0;
|
||||
|
||||
group.append(
|
||||
Circle::new()
|
||||
.set("cx", left_x + 2.5)
|
||||
.set("cy", top_y + 2.5)
|
||||
.set("r", 2.5)
|
||||
.set("stroke", PRIMARY_COLOR)
|
||||
.set("fill", SECONDARY_COLOR));
|
||||
|
||||
let basic_line = svg!(Line::new(),
|
||||
x1: left_x + r, y1: top_y + d,
|
||||
x2: left_x + r, y2: top_y + d + 10.0,
|
||||
stroke: PRIMARY_COLOR);
|
||||
|
||||
let arrow = match направление {
|
||||
Some(Направление::Открывается) => basic_line.set("marker-start", "url(#arrow)"),
|
||||
Some(Направление::Закрывается) => basic_line.set("marker-end", "url(#arrow)"),
|
||||
Some(Направление::ОстаётсяНаМесте) => basic_line.set("marker-start", "url(#arrow)").set("marker-end", "url(#arrow)"),
|
||||
None => basic_line
|
||||
};
|
||||
|
||||
if *имеет_ручной {
|
||||
let h: Text = svg!(Text::new("H"),
|
||||
x: left_x + r,
|
||||
y: top_y + r,
|
||||
fill: PRIMARY_COLOR,
|
||||
stroke: "none")
|
||||
.set("text-align", "center")
|
||||
.set("font-size", "1mm")
|
||||
.set("text-anchor", "middle")
|
||||
.set("dominant-baseline", "middle");
|
||||
group.append(h);
|
||||
}
|
||||
|
||||
group.add(arrow)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn diamond(width: f32, height: f32, left_x: f32, top_y: f32) -> Polygon {
|
||||
let pw = width / 2.0;
|
||||
let w = width;
|
||||
let h = height;
|
||||
let ph = height / 2.0;
|
||||
let points = format!(
|
||||
"{},{} {},{} {},{} {},{}",
|
||||
left_x + pw,
|
||||
top_y - ph,
|
||||
left_x + w + pw,
|
||||
top_y + ph,
|
||||
left_x + pw,
|
||||
top_y + h + ph,
|
||||
left_x - pw,
|
||||
top_y + ph
|
||||
);
|
||||
|
||||
Polygon::new().set("points", points)
|
||||
.set("stroke", PRIMARY_COLOR)
|
||||
.set("fill", TRANSPARENT_COLOR)
|
||||
}
|
||||
|
||||
pub fn wrap_document<I>(ls: I) -> Document
|
||||
where
|
||||
I: IntoIterator<Item = Group>, // Обобщаем входной тип через IntoIterator
|
||||
{
|
||||
let marker = Marker::new()
|
||||
.set("id", "arrow")
|
||||
.set("viewBox", "0 0 297 210")
|
||||
.set("refX", "9")
|
||||
.set("refY", "5")
|
||||
.set("fill", PRIMARY_COLOR)
|
||||
.set("markerWidth", "6")
|
||||
.set("markerHeight", "6")
|
||||
.set("orient", "auto-start-reverse")
|
||||
.add(Path::new().set("d", "M 0 0 L 10 5 L 0 10 z"));
|
||||
|
||||
let mut doc = Document::new()
|
||||
.set("xmlns", "http://www.w3.org/2000/svg")
|
||||
.set("width", "297mm")
|
||||
.set("height", "210mm")
|
||||
.set("viewBox", (0, 0, 297, 210))
|
||||
.set("stroke", PRIMARY_COLOR)
|
||||
.set("stroke-width", "0.125mm")
|
||||
.set("fill", TRANSPARENT_COLOR)
|
||||
.add(Definitions::new().add(marker));
|
||||
for el in ls {
|
||||
doc.append(el);
|
||||
}
|
||||
doc
|
||||
}
|
||||
110
src/types/display.rs
Normal file
110
src/types/display.rs
Normal file
|
|
@ -0,0 +1,110 @@
|
|||
use std::fmt::Display;
|
||||
use crate::types::*;
|
||||
|
||||
impl Display for ОсновнаяВеличина {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
use crate::types::ОсновнаяВеличина::*;
|
||||
let str = match self {
|
||||
АнализКачество => "Анализ, качество",
|
||||
ПламяГорение => "Пламя, горение",
|
||||
CДополнительный => "Дополнительная величина",
|
||||
DДополнительный => "Дополнительная величина",
|
||||
Напряжение => "Напряжение",
|
||||
Расход => "Расход",
|
||||
GДополнительный => "Дополнительная величина",
|
||||
РучноеВоздействие => "Ручное воздействие",
|
||||
Ток => "Ток",
|
||||
Мощность => "Мощность",
|
||||
Время => "Время",
|
||||
Уровень => "Уровень",
|
||||
MДополнительный => "Дополнительная величина",
|
||||
NДополнительный => "Дополнительная величина",
|
||||
OДополнительный => "Дополнительная величина",
|
||||
Давление => "Давление",
|
||||
Количество => "Количество",
|
||||
Радиоактивность => "Радиоактивность",
|
||||
СкоростьЧастота => "Скорость, частота",
|
||||
Температура => "Температура",
|
||||
Разнородные => "Разнородные величины", // несколько величин ТОЛЬКО здесь
|
||||
Вибрация => "Вибрация",
|
||||
Вес => "Вес",
|
||||
Нерекомендовано => "Дополнительная величина (нерекомендованная буква)",
|
||||
Событие => "Событие",
|
||||
Размер => "Размер"
|
||||
}.to_owned();
|
||||
write!(f, "{}", str)
|
||||
}
|
||||
}
|
||||
|
||||
impl Display for УточнениеВеличины {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
use crate::types::УточнениеВеличины::*;
|
||||
let str = match self {
|
||||
РазностьПерепад => "Разность, перепад",
|
||||
СоотношениеДоляДробь => "Соотношение, доля, дробь",
|
||||
АвтоматическоеПереключениеОбегание => "Автоматическое переключение, обегание",
|
||||
ИнтегрированиеСуммированиеПоВремени => "Интегрирование, суммирование по времени",
|
||||
СамосрабатывающееУБ => "Самосрабаывающее устройство безопасности",
|
||||
СистемаИнструментальнойБезопасности => "Система инструментальной безопасности",
|
||||
}.to_owned();
|
||||
write!(f, "{}", str)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
impl Display for ВыполняемаяФункция {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
use crate::types::ВыполняемаяФункция::*;
|
||||
let str = match self {
|
||||
Сигнализация => "Сигнализация",
|
||||
АвтоматическоеРегулирование => "Автоматическое регулирование",
|
||||
ВеличинаОтклоненияОтЗаданной => "Величина отклонения от заданной",
|
||||
Регистрация => "Регистрация"
|
||||
}.to_owned();
|
||||
write!(f, "{}", str)
|
||||
}
|
||||
}
|
||||
|
||||
impl Display for ФункциональныйПризнак {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
use crate::types::ФункциональныйПризнак::*;
|
||||
let str = match self {
|
||||
ЧувствительныйЭлемент => "Чувтсвительный эе",
|
||||
ПервичныйПоказывающийПрибор => "Первичный показывающий прибор",
|
||||
ВторичныйПоказывающийПрибор => "Вторичный показывающий прибор",
|
||||
СтанцияУправления => "Станция управления",
|
||||
QДополнительный => "Дополнительный функциональный признак",
|
||||
ВключениеОтключениеПереключение => "Включение, отключение, переключение",
|
||||
Преобразование => "Преобразование",
|
||||
VДополнительный => "Дополнительный функциональный признак",
|
||||
ВспомогательныеКомпьютерныеУстройства => "Вспомогательные компьютерные устройства",
|
||||
ВспомогательныеВычислительноеУстройство => "Вспомогательные вычислительные устройства",
|
||||
ZДополнительный => "Дополнительный функциональный признак"
|
||||
}.to_owned();
|
||||
write!(f, "{}", str)
|
||||
}
|
||||
}
|
||||
|
||||
impl Display for Направление {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
use crate::types::Направление::*;
|
||||
let str = match self {
|
||||
Открывается => "открывается",
|
||||
Закрывается => "закрывается",
|
||||
ОстаётсяНаМесте => "остаётся на месте"
|
||||
}.to_owned();
|
||||
write!(f, "{}", str)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
impl Display for Фиксация {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
use crate::types::Фиксация::*;
|
||||
let str = match self {
|
||||
НаМесте => "на месте",
|
||||
НаЩите => "на щите"
|
||||
}.to_owned();
|
||||
write!(f, "{}", str)
|
||||
}
|
||||
}
|
||||
95
src/types/to_letter.rs
Normal file
95
src/types/to_letter.rs
Normal file
|
|
@ -0,0 +1,95 @@
|
|||
use crate::types;
|
||||
|
||||
pub trait ToLetter {
|
||||
fn to_letter(&self) -> char;
|
||||
}
|
||||
|
||||
impl ToLetter for types::ОсновнаяВеличина {
|
||||
fn to_letter(&self) -> char {
|
||||
use types::ОсновнаяВеличина::*;
|
||||
match self {
|
||||
АнализКачество => 'A',
|
||||
ПламяГорение => 'B',
|
||||
CДополнительный => 'C',
|
||||
DДополнительный => 'D',
|
||||
Напряжение => 'E',
|
||||
Расход => 'F',
|
||||
GДополнительный => 'G',
|
||||
РучноеВоздействие => 'H',
|
||||
Ток => 'I',
|
||||
Мощность => 'J',
|
||||
Время => 'K',
|
||||
Уровень => 'L',
|
||||
MДополнительный => 'M',
|
||||
NДополнительный => 'N',
|
||||
OДополнительный => 'O',
|
||||
Давление => 'P',
|
||||
Количество => 'Q',
|
||||
Радиоактивность => 'R',
|
||||
СкоростьЧастота => 'S',
|
||||
Температура => 'T',
|
||||
Разнородные => 'U',
|
||||
Вибрация => 'V',
|
||||
Вес => 'W',
|
||||
Нерекомендовано => 'X',
|
||||
Событие => 'Y',
|
||||
Размер => 'Z',
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl ToLetter for types::УточнениеВеличины {
|
||||
fn to_letter(&self) -> char {
|
||||
use types::УточнениеВеличины::*;
|
||||
match self {
|
||||
РазностьПерепад => 'D',
|
||||
СоотношениеДоляДробь => 'F',
|
||||
АвтоматическоеПереключениеОбегание => 'J',
|
||||
ИнтегрированиеСуммированиеПоВремени => 'Q',
|
||||
СамосрабатывающееУБ => 'S',
|
||||
СистемаИнструментальнойБезопасности => 'Z',
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl ToLetter for types::ВыполняемаяФункция {
|
||||
fn to_letter(&self) -> char {
|
||||
use types::ВыполняемаяФункция::*;
|
||||
match self {
|
||||
Сигнализация => 'A',
|
||||
АвтоматическоеРегулирование => 'C',
|
||||
ВеличинаОтклоненияОтЗаданной => 'D',
|
||||
Регистрация => 'R',
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl ToLetter for types::ФункциональныйПризнак {
|
||||
fn to_letter(&self) -> char {
|
||||
use types::ФункциональныйПризнак::*;
|
||||
match self {
|
||||
ЧувствительныйЭлемент => 'E',
|
||||
ПервичныйПоказывающийПрибор => 'G',
|
||||
ВторичныйПоказывающийПрибор => 'I',
|
||||
СтанцияУправления => 'K',
|
||||
ВключениеОтключениеПереключение => 'S',
|
||||
Преобразование => 'T',
|
||||
ВспомогательныеКомпьютерныеУстройства => 'X',
|
||||
ВспомогательныеВычислительноеУстройство => 'Y',
|
||||
QДополнительный => 'Q',
|
||||
VДополнительный => 'V',
|
||||
ZДополнительный => 'Z'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl ToLetter for types::ДополнительныеОбозначения {
|
||||
fn to_letter(&self) -> char {
|
||||
use types::ДополнительныеОбозначения::*;
|
||||
match self {
|
||||
ВерхнийПределИзмеряемойВеличины => 'H',
|
||||
НижнийПределИзмеряемойВеличины => 'L',
|
||||
ВеличинаИлиСреднееПоложение => 'M',
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue