bluer-ugv 7.262.1__py3-none-any.whl → 7.291.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- bluer_ugv/README/build.py +32 -26
- bluer_ugv/README/releases.py +8 -0
- bluer_ugv/README/ugvs/comparison/build.py +135 -0
- bluer_ugv/README/ugvs/comparison/features/DYI.py +8 -0
- bluer_ugv/README/ugvs/comparison/features/__init__.py +0 -0
- bluer_ugv/README/ugvs/comparison/features/classes.py +138 -0
- bluer_ugv/README/ugvs/comparison/features/concealment.py +8 -0
- bluer_ugv/README/ugvs/comparison/features/control.py +30 -0
- bluer_ugv/README/ugvs/comparison/features/cost.py +30 -0
- bluer_ugv/README/ugvs/comparison/features/db.py +36 -0
- bluer_ugv/README/ugvs/comparison/features/payload.py +21 -0
- bluer_ugv/README/ugvs/comparison/features/ps.py +8 -0
- bluer_ugv/README/ugvs/comparison/features/range.py +14 -0
- bluer_ugv/README/ugvs/comparison/features/sanction_proof.py +8 -0
- bluer_ugv/README/ugvs/comparison/features/size.py +32 -0
- bluer_ugv/README/ugvs/comparison/features/speed.py +10 -0
- bluer_ugv/README/ugvs/comparison/features/swarm.py +8 -0
- bluer_ugv/README/ugvs/comparison/features/uv_delivery.py +8 -0
- bluer_ugv/README/ugvs/comparison/references/__init__.py +1 -0
- bluer_ugv/README/ugvs/comparison/references/classes.py +27 -0
- bluer_ugv/README/ugvs/comparison/references/db.py +344 -0
- bluer_ugv/README/ugvs/comparison/ugvs/__init__.py +0 -0
- bluer_ugv/README/ugvs/comparison/ugvs/classes.py +118 -0
- bluer_ugv/README/ugvs/comparison/ugvs/db.py +411 -0
- bluer_ugv/__init__.py +1 -1
- bluer_ugv/assets/comparison.html +33 -0
- {bluer_ugv-7.262.1.dist-info → bluer_ugv-7.291.1.dist-info}/METADATA +2 -2
- {bluer_ugv-7.262.1.dist-info → bluer_ugv-7.291.1.dist-info}/RECORD +31 -10
- bluer_ugv/README/ugvs/comparison/db.py +0 -15
- bluer_ugv/README/ugvs/comparison/features.py +0 -55
- bluer_ugv/README/ugvs/comparison/ugvs.py +0 -43
- {bluer_ugv-7.262.1.dist-info → bluer_ugv-7.291.1.dist-info}/WHEEL +0 -0
- {bluer_ugv-7.262.1.dist-info → bluer_ugv-7.291.1.dist-info}/licenses/LICENSE +0 -0
- {bluer_ugv-7.262.1.dist-info → bluer_ugv-7.291.1.dist-info}/top_level.txt +0 -0
bluer_ugv/README/build.py
CHANGED
|
@@ -15,37 +15,43 @@ from bluer_ugv.README import (
|
|
|
15
15
|
shield,
|
|
16
16
|
arzhang,
|
|
17
17
|
rangin,
|
|
18
|
+
releases,
|
|
18
19
|
swallow,
|
|
19
20
|
)
|
|
20
21
|
from bluer_ugv.README.ugvs import docs as ugvs
|
|
22
|
+
from bluer_ugv.README.ugvs.comparison.build import build as build_comparison
|
|
21
23
|
|
|
22
24
|
|
|
23
25
|
def build() -> bool:
|
|
24
|
-
return
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
tokens
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
26
|
+
return (
|
|
27
|
+
all(
|
|
28
|
+
README.build(
|
|
29
|
+
items=readme.get("items", []),
|
|
30
|
+
path=os.path.join(file.path(__file__), readme["path"]),
|
|
31
|
+
cols=readme.get("cols", 3),
|
|
32
|
+
ICON=ICON,
|
|
33
|
+
NAME=NAME,
|
|
34
|
+
VERSION=VERSION,
|
|
35
|
+
REPO_NAME=REPO_NAME,
|
|
36
|
+
help_function=lambda tokens: get_help(
|
|
37
|
+
tokens,
|
|
38
|
+
help_functions,
|
|
39
|
+
mono=True,
|
|
40
|
+
),
|
|
41
|
+
macros=readme.get("macros", {}),
|
|
42
|
+
)
|
|
43
|
+
for readme in root.docs
|
|
44
|
+
+ alias.docs
|
|
45
|
+
+ arzhang.docs
|
|
46
|
+
+ beast.docs
|
|
47
|
+
+ eagle.docs
|
|
48
|
+
+ fire.docs
|
|
49
|
+
+ rangin.docs
|
|
50
|
+
+ ravin.docs
|
|
51
|
+
+ releases.docs
|
|
52
|
+
+ shield.docs
|
|
53
|
+
+ ugvs.docs
|
|
54
|
+
+ swallow.docs
|
|
39
55
|
)
|
|
40
|
-
|
|
41
|
-
+ beast.docs
|
|
42
|
-
+ eagle.docs
|
|
43
|
-
+ fire.docs
|
|
44
|
-
+ ravin.docs
|
|
45
|
-
+ shield.docs
|
|
46
|
-
+ arzhang.docs
|
|
47
|
-
+ swallow.docs
|
|
48
|
-
+ alias.docs
|
|
49
|
-
+ ugvs.docs
|
|
50
|
-
+ rangin.docs
|
|
56
|
+
and build_comparison()
|
|
51
57
|
)
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import os
|
|
2
|
+
from typing import List, Union
|
|
3
|
+
from functools import reduce
|
|
4
|
+
|
|
5
|
+
from blueness import module
|
|
6
|
+
from bluer_objects import file
|
|
7
|
+
|
|
8
|
+
from bluer_ugv import NAME
|
|
9
|
+
from bluer_ugv.README.ugvs.comparison.ugvs.db import list_of_ugvs
|
|
10
|
+
from bluer_ugv.README.ugvs.comparison.references.db import list_of_references
|
|
11
|
+
from bluer_ugv.logger import logger
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
NAME = module.name(__file__, NAME)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def build(
|
|
18
|
+
log: bool = True,
|
|
19
|
+
reference_ugv_name: str = "arzhang",
|
|
20
|
+
) -> bool:
|
|
21
|
+
reference_ugv = list_of_ugvs.get(reference_ugv_name)
|
|
22
|
+
if reference_ugv is None:
|
|
23
|
+
logger.error(f"{reference_ugv_name}: reference ugv not found.")
|
|
24
|
+
return False
|
|
25
|
+
|
|
26
|
+
logger.info(f"{NAME}.build")
|
|
27
|
+
|
|
28
|
+
success, contents = file.load_text(
|
|
29
|
+
file.absolute(
|
|
30
|
+
"../../../assets/comparison.html",
|
|
31
|
+
reference_path=file.path(__file__),
|
|
32
|
+
),
|
|
33
|
+
log=log,
|
|
34
|
+
)
|
|
35
|
+
if not success:
|
|
36
|
+
return success
|
|
37
|
+
|
|
38
|
+
try:
|
|
39
|
+
content_index = [line.strip() for line in contents].index("contents:::")
|
|
40
|
+
except Exception as e:
|
|
41
|
+
logger.error(f"contents::: not found: {e}")
|
|
42
|
+
return False
|
|
43
|
+
|
|
44
|
+
contents = (
|
|
45
|
+
contents[:content_index]
|
|
46
|
+
+ row_of(
|
|
47
|
+
[
|
|
48
|
+
"رديف",
|
|
49
|
+
"نام محصول مشابه",
|
|
50
|
+
"مشابهت و تفاوت ها محصول شما با آنها ",
|
|
51
|
+
],
|
|
52
|
+
header=True,
|
|
53
|
+
)
|
|
54
|
+
+ reduce(
|
|
55
|
+
lambda x, y: x + y,
|
|
56
|
+
[
|
|
57
|
+
row_of(
|
|
58
|
+
[
|
|
59
|
+
str(index + 1),
|
|
60
|
+
ugv.description,
|
|
61
|
+
reference_ugv.compare(ugv),
|
|
62
|
+
]
|
|
63
|
+
)
|
|
64
|
+
for index, ugv in enumerate(
|
|
65
|
+
[
|
|
66
|
+
ugv_
|
|
67
|
+
for ugv_ in reversed(
|
|
68
|
+
sorted(
|
|
69
|
+
list_of_ugvs.db,
|
|
70
|
+
key=lambda ugv: ugv.name,
|
|
71
|
+
)
|
|
72
|
+
)
|
|
73
|
+
if ugv_.nickname not in [reference_ugv_name, "template"]
|
|
74
|
+
]
|
|
75
|
+
)
|
|
76
|
+
],
|
|
77
|
+
[],
|
|
78
|
+
)
|
|
79
|
+
+ contents[content_index + 1 :]
|
|
80
|
+
+ ['<ol dir="rtl" style="text-align:right;">']
|
|
81
|
+
+ [
|
|
82
|
+
'<li dir="rtl" style="text-align:{};"><a href="{}">{} - {}</a></li>'.format(
|
|
83
|
+
"right" if reference.is_in_farsi else "left",
|
|
84
|
+
reference.url,
|
|
85
|
+
reference.title,
|
|
86
|
+
reference.url,
|
|
87
|
+
)
|
|
88
|
+
for reference in reversed(
|
|
89
|
+
sorted(
|
|
90
|
+
list_of_references.db,
|
|
91
|
+
key=lambda reference: reference.title,
|
|
92
|
+
)
|
|
93
|
+
)
|
|
94
|
+
if reference.title != "template"
|
|
95
|
+
]
|
|
96
|
+
+ ['</ol dir="rtl" style="text-align:right;">']
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
return file.save_text(
|
|
100
|
+
file.absolute(
|
|
101
|
+
"../../../docs/UGVs/comparison.html",
|
|
102
|
+
reference_path=file.path(__file__),
|
|
103
|
+
),
|
|
104
|
+
contents,
|
|
105
|
+
log=log,
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def row_of(
|
|
110
|
+
row: Union[List[str], List[List[str]]],
|
|
111
|
+
header: bool = False,
|
|
112
|
+
) -> List[str]:
|
|
113
|
+
return (
|
|
114
|
+
["{}<tr>".format(8 * "")]
|
|
115
|
+
+ reduce(
|
|
116
|
+
lambda x, y: x + y,
|
|
117
|
+
[
|
|
118
|
+
[
|
|
119
|
+
"{}<{}>".format(
|
|
120
|
+
12 * " ",
|
|
121
|
+
"th" if header else "td",
|
|
122
|
+
)
|
|
123
|
+
]
|
|
124
|
+
+ ([item] if isinstance(item, str) else list(item))
|
|
125
|
+
+ [
|
|
126
|
+
"</{}>".format(
|
|
127
|
+
"th" if header else "td",
|
|
128
|
+
)
|
|
129
|
+
]
|
|
130
|
+
for item in row
|
|
131
|
+
],
|
|
132
|
+
[],
|
|
133
|
+
)
|
|
134
|
+
+ ["{}</tr>".format(8 * "")]
|
|
135
|
+
)
|
|
File without changes
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
from typing import List, Any, Union, Tuple, Dict
|
|
2
|
+
from enum import Enum, auto
|
|
3
|
+
|
|
4
|
+
from bluer_ugv.logger import logger
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class Feature_Enum(Enum):
|
|
8
|
+
@property
|
|
9
|
+
def as_str(self):
|
|
10
|
+
return self.name
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class Feature_Comparison(Feature_Enum):
|
|
14
|
+
SIMILAR = auto()
|
|
15
|
+
HIGHER = auto()
|
|
16
|
+
LOWER = auto()
|
|
17
|
+
|
|
18
|
+
UNKNOWN = auto()
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class Feature:
|
|
22
|
+
nickname: str
|
|
23
|
+
long_name: str
|
|
24
|
+
|
|
25
|
+
comparison_as_str: Dict[Feature_Comparison, str] = {
|
|
26
|
+
Feature_Comparison.HIGHER: "بیشتر",
|
|
27
|
+
Feature_Comparison.LOWER: "کمتر",
|
|
28
|
+
Feature_Comparison.SIMILAR: "مشابه",
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
def __init__(
|
|
32
|
+
self,
|
|
33
|
+
score: Any,
|
|
34
|
+
):
|
|
35
|
+
self.score = score
|
|
36
|
+
|
|
37
|
+
def compare(
|
|
38
|
+
self,
|
|
39
|
+
feature: Union["Feature", None],
|
|
40
|
+
ugv_name: str,
|
|
41
|
+
log: bool = False,
|
|
42
|
+
) -> Tuple[Feature_Comparison, str]:
|
|
43
|
+
comparison: Feature_Comparison = Feature_Comparison.HIGHER
|
|
44
|
+
if feature is None:
|
|
45
|
+
if isinstance(self.score, bool):
|
|
46
|
+
comparison = (
|
|
47
|
+
Feature_Comparison.HIGHER
|
|
48
|
+
if self.score
|
|
49
|
+
else Feature_Comparison.LOWER
|
|
50
|
+
)
|
|
51
|
+
else:
|
|
52
|
+
comparison = Feature_Comparison.UNKNOWN
|
|
53
|
+
elif feature.score is Ellipsis:
|
|
54
|
+
comparison = Feature_Comparison.UNKNOWN
|
|
55
|
+
elif self.score_index == feature.score_index:
|
|
56
|
+
comparison = Feature_Comparison.SIMILAR
|
|
57
|
+
elif self.score_index < feature.score_index:
|
|
58
|
+
comparison = Feature_Comparison.LOWER
|
|
59
|
+
|
|
60
|
+
if log:
|
|
61
|
+
logger.info(
|
|
62
|
+
"{}: {} ({}) vs. {} ({}): {}".format(
|
|
63
|
+
self.__class__.__name__,
|
|
64
|
+
self.score,
|
|
65
|
+
self.score_index,
|
|
66
|
+
"-" if feature is None else feature.score,
|
|
67
|
+
"-" if feature is None else feature.score_index,
|
|
68
|
+
comparison.name,
|
|
69
|
+
)
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
return comparison, self.describe_status(
|
|
73
|
+
comparison,
|
|
74
|
+
ugv_name,
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
def describe_status(
|
|
78
|
+
self,
|
|
79
|
+
comparison: Feature_Comparison,
|
|
80
|
+
ugv_name: str,
|
|
81
|
+
) -> str:
|
|
82
|
+
return "{} {}{}{}".format(
|
|
83
|
+
self.long_name,
|
|
84
|
+
self.__class__.comparison_as_str.get(comparison, ""),
|
|
85
|
+
(
|
|
86
|
+
" در {} ".format(ugv_name)
|
|
87
|
+
if comparison != Feature_Comparison.SIMILAR
|
|
88
|
+
else ""
|
|
89
|
+
),
|
|
90
|
+
(lambda info: f" ({info})" if info else "")(self.score_as_str()),
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
@property
|
|
94
|
+
def description(self) -> str:
|
|
95
|
+
return "{} {}".format(
|
|
96
|
+
self.long_name,
|
|
97
|
+
self.score_as_str(force=True),
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
def score_as_str(
|
|
101
|
+
self,
|
|
102
|
+
force: bool = False,
|
|
103
|
+
) -> str:
|
|
104
|
+
return (
|
|
105
|
+
self.score.as_str
|
|
106
|
+
if isinstance(self.score, Feature_Enum) and force
|
|
107
|
+
else self.score_as_str_
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
@property
|
|
111
|
+
def score_as_str_(self) -> str:
|
|
112
|
+
return ""
|
|
113
|
+
|
|
114
|
+
@property
|
|
115
|
+
def score_index(self):
|
|
116
|
+
return (
|
|
117
|
+
int(self.score)
|
|
118
|
+
if isinstance(self.score, bool)
|
|
119
|
+
else self.score.value if isinstance(self.score, Enum) else self.score
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
class FeatureList:
|
|
124
|
+
def __init__(self):
|
|
125
|
+
self.db: List[Feature] = []
|
|
126
|
+
|
|
127
|
+
def add(self, feature: Feature):
|
|
128
|
+
self.db.append(feature)
|
|
129
|
+
|
|
130
|
+
def get(
|
|
131
|
+
self,
|
|
132
|
+
feature_name: str,
|
|
133
|
+
) -> Union[Feature, None]:
|
|
134
|
+
for feature in self.db:
|
|
135
|
+
if feature_name == feature.nickname:
|
|
136
|
+
return feature
|
|
137
|
+
|
|
138
|
+
return None
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
from enum import Enum
|
|
2
|
+
|
|
3
|
+
from bluer_ugv.README.ugvs.comparison.features.classes import (
|
|
4
|
+
Feature,
|
|
5
|
+
Feature_Enum,
|
|
6
|
+
Feature_Comparison,
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class UGV_Control(Feature_Enum):
|
|
11
|
+
AI = 2
|
|
12
|
+
RC = 1
|
|
13
|
+
|
|
14
|
+
@property
|
|
15
|
+
def as_str(self):
|
|
16
|
+
return {
|
|
17
|
+
UGV_Control.AI: "هوش مصنوعی",
|
|
18
|
+
UGV_Control.RC: "رادیویی",
|
|
19
|
+
}[self]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class ControlFeature(Feature):
|
|
23
|
+
nickname = "control"
|
|
24
|
+
long_name = "سامانهی کنترلی"
|
|
25
|
+
|
|
26
|
+
comparison_as_str = {
|
|
27
|
+
Feature_Comparison.HIGHER: "هوش مصنوعی",
|
|
28
|
+
Feature_Comparison.LOWER: "رادیویی",
|
|
29
|
+
Feature_Comparison.SIMILAR: "مشابه",
|
|
30
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
from bluer_ugv.README.ugvs.comparison.features.classes import (
|
|
2
|
+
Feature,
|
|
3
|
+
Feature_Comparison,
|
|
4
|
+
Feature_Enum,
|
|
5
|
+
)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class UGV_Cost(Feature_Enum):
|
|
9
|
+
LOW = 100 # < 100 mT ~= $100
|
|
10
|
+
MEDIUM = 10 # < 1 MT ~= $10k
|
|
11
|
+
HIGH = 1 #
|
|
12
|
+
|
|
13
|
+
@property
|
|
14
|
+
def as_str(self):
|
|
15
|
+
return {
|
|
16
|
+
UGV_Cost.LOW: "کم",
|
|
17
|
+
UGV_Cost.MEDIUM: "متوسط",
|
|
18
|
+
UGV_Cost.HIGH: "زیاد",
|
|
19
|
+
}[self]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class CostFeature(Feature):
|
|
23
|
+
nickname = "cost"
|
|
24
|
+
long_name = "هزینه"
|
|
25
|
+
|
|
26
|
+
comparison_as_str = {
|
|
27
|
+
Feature_Comparison.HIGHER: "پایینتر",
|
|
28
|
+
Feature_Comparison.LOWER: "بالاتر",
|
|
29
|
+
Feature_Comparison.SIMILAR: "مشابه",
|
|
30
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
from typing import Dict, Type, List
|
|
2
|
+
|
|
3
|
+
from bluer_ugv.README.ugvs.comparison.features.classes import Feature
|
|
4
|
+
from bluer_ugv.README.ugvs.comparison.features.concealment import ConcealmentFeature
|
|
5
|
+
from bluer_ugv.README.ugvs.comparison.features.control import ControlFeature
|
|
6
|
+
from bluer_ugv.README.ugvs.comparison.features.cost import CostFeature
|
|
7
|
+
from bluer_ugv.README.ugvs.comparison.features.DYI import DYIFeature
|
|
8
|
+
from bluer_ugv.README.ugvs.comparison.features.payload import PayloadFeature
|
|
9
|
+
from bluer_ugv.README.ugvs.comparison.features.ps import PSFeature
|
|
10
|
+
from bluer_ugv.README.ugvs.comparison.features.range import RangeFeature
|
|
11
|
+
from bluer_ugv.README.ugvs.comparison.features.sanction_proof import (
|
|
12
|
+
SanctionProofFeature,
|
|
13
|
+
)
|
|
14
|
+
from bluer_ugv.README.ugvs.comparison.features.size import SizeFeature
|
|
15
|
+
from bluer_ugv.README.ugvs.comparison.features.speed import SpeedFeature
|
|
16
|
+
from bluer_ugv.README.ugvs.comparison.features.swarm import SwarmFeature
|
|
17
|
+
from bluer_ugv.README.ugvs.comparison.features.uv_delivery import UVDeliveryFeature
|
|
18
|
+
|
|
19
|
+
list_of_feature_classes: List[Type[Feature]] = [
|
|
20
|
+
ConcealmentFeature,
|
|
21
|
+
ControlFeature,
|
|
22
|
+
CostFeature,
|
|
23
|
+
DYIFeature,
|
|
24
|
+
PayloadFeature,
|
|
25
|
+
PSFeature,
|
|
26
|
+
RangeFeature,
|
|
27
|
+
SanctionProofFeature,
|
|
28
|
+
SizeFeature,
|
|
29
|
+
SpeedFeature,
|
|
30
|
+
SwarmFeature,
|
|
31
|
+
UVDeliveryFeature,
|
|
32
|
+
]
|
|
33
|
+
|
|
34
|
+
dict_of_feature_classes: Dict[str, Type[Feature]] = {
|
|
35
|
+
feature_class.nickname: feature_class for feature_class in list_of_feature_classes
|
|
36
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from typing import Any
|
|
2
|
+
|
|
3
|
+
from bluer_ugv.README.ugvs.comparison.features.classes import (
|
|
4
|
+
Feature,
|
|
5
|
+
Feature_Comparison,
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class PayloadFeature(Feature):
|
|
10
|
+
nickname = "payload"
|
|
11
|
+
long_name = "توان حمل بار"
|
|
12
|
+
|
|
13
|
+
comparison_as_str = {
|
|
14
|
+
Feature_Comparison.HIGHER: "بیشتر",
|
|
15
|
+
Feature_Comparison.LOWER: "کمتر",
|
|
16
|
+
Feature_Comparison.SIMILAR: "مشابه",
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
@property
|
|
20
|
+
def score_as_str_(self) -> str:
|
|
21
|
+
return f"{self.score} کیلوگرم"
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
from typing import Any
|
|
2
|
+
|
|
3
|
+
from bluer_ugv.README.ugvs.comparison.features.classes import Feature
|
|
4
|
+
|
|
5
|
+
unlimited_range: int = 999
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class RangeFeature(Feature):
|
|
9
|
+
nickname = "range"
|
|
10
|
+
long_name = "شعاع عملکرد عملیاتی"
|
|
11
|
+
|
|
12
|
+
@property
|
|
13
|
+
def score_as_str_(self) -> str:
|
|
14
|
+
return f"{self.score} کیلومتر" if self.score != unlimited_range else "نامحدود"
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
from enum import Enum
|
|
2
|
+
|
|
3
|
+
from bluer_ugv.README.ugvs.comparison.features.classes import (
|
|
4
|
+
Feature,
|
|
5
|
+
Feature_Comparison,
|
|
6
|
+
Feature_Enum,
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class UGV_Size(Feature_Enum):
|
|
11
|
+
SMALL = 100 # < 5 kg
|
|
12
|
+
MEDIUM = 10 # < 50 kg
|
|
13
|
+
LARGE = 1
|
|
14
|
+
|
|
15
|
+
@property
|
|
16
|
+
def as_str(self):
|
|
17
|
+
return {
|
|
18
|
+
UGV_Size.SMALL: "کوچک",
|
|
19
|
+
UGV_Size.MEDIUM: "متوسط",
|
|
20
|
+
UGV_Size.LARGE: "بزرگ",
|
|
21
|
+
}[self]
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class SizeFeature(Feature):
|
|
25
|
+
nickname = "size"
|
|
26
|
+
long_name = "اندازه"
|
|
27
|
+
|
|
28
|
+
comparison_as_str = {
|
|
29
|
+
Feature_Comparison.HIGHER: "کوچکتر",
|
|
30
|
+
Feature_Comparison.LOWER: "بزرگتر",
|
|
31
|
+
Feature_Comparison.SIMILAR: "مشابه",
|
|
32
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
from typing import List
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class Reference:
|
|
5
|
+
def __init__(
|
|
6
|
+
self,
|
|
7
|
+
title: str,
|
|
8
|
+
url: str,
|
|
9
|
+
list_of_ugvs: List[str] = [],
|
|
10
|
+
is_in_farsi: bool = False,
|
|
11
|
+
):
|
|
12
|
+
self.title = title
|
|
13
|
+
self.url = url
|
|
14
|
+
self.list_of_ugvs = list_of_ugvs
|
|
15
|
+
self.is_in_farsi = is_in_farsi
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class List_of_References:
|
|
19
|
+
def __init__(self):
|
|
20
|
+
self.db: List[Reference] = []
|
|
21
|
+
|
|
22
|
+
def add(
|
|
23
|
+
self,
|
|
24
|
+
**kw_args,
|
|
25
|
+
):
|
|
26
|
+
ugv = Reference(**kw_args)
|
|
27
|
+
self.db.append(ugv)
|