pyjallib 0.1.0__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.
- pyjallib/__init__.py +17 -0
- pyjallib/max/__init__.py +46 -0
- pyjallib/max/align.py +112 -0
- pyjallib/max/anim.py +594 -0
- pyjallib/max/bip.py +508 -0
- pyjallib/max/bone.py +910 -0
- pyjallib/max/constraint.py +973 -0
- pyjallib/max/header.py +57 -0
- pyjallib/max/helper.py +433 -0
- pyjallib/max/layer.py +262 -0
- pyjallib/max/link.py +78 -0
- pyjallib/max/macro/jal_macro_align.py +155 -0
- pyjallib/max/macro/jal_macro_bone.py +358 -0
- pyjallib/max/macro/jal_macro_constraint.py +140 -0
- pyjallib/max/macro/jal_macro_helper.py +321 -0
- pyjallib/max/macro/jal_macro_link.py +55 -0
- pyjallib/max/macro/jal_macro_select.py +91 -0
- pyjallib/max/mirror.py +388 -0
- pyjallib/max/name.py +521 -0
- pyjallib/max/select.py +278 -0
- pyjallib/max/skin.py +996 -0
- pyjallib/max/twistBone.py +418 -0
- pyjallib/namePart.py +633 -0
- pyjallib/nameToPath.py +113 -0
- pyjallib/naming.py +1066 -0
- pyjallib/namingConfig.py +844 -0
- pyjallib/perforce.py +735 -0
- pyjallib/reloadModules.py +33 -0
- pyjallib-0.1.0.dist-info/METADATA +28 -0
- pyjallib-0.1.0.dist-info/RECORD +32 -0
- pyjallib-0.1.0.dist-info/WHEEL +5 -0
- pyjallib-0.1.0.dist-info/top_level.txt +1 -0
pyjallib/namePart.py
ADDED
@@ -0,0 +1,633 @@
|
|
1
|
+
#!/usr/bin/env python
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
|
4
|
+
"""
|
5
|
+
namePart 모듈 - 이름의 각 부분을 표현하는 기능 제공
|
6
|
+
이름 부분의 사전 정의된 값과 가중치 매핑을 관리하는 클래스 구현
|
7
|
+
"""
|
8
|
+
|
9
|
+
from typing import List, Dict, Any, Optional, Union
|
10
|
+
from enum import Enum, auto
|
11
|
+
|
12
|
+
class NamePartType(Enum):
|
13
|
+
"""
|
14
|
+
이름 부분(name part)의 유형을 정의하는 열거형 클래스.
|
15
|
+
|
16
|
+
- PREFIX: RealName 앞에 오는 부분, 사전 정의 값 필수
|
17
|
+
- SUFFIX: RealName 뒤에 오는 부분, 사전 정의 값 필수
|
18
|
+
- REALNAME: 실제 이름 부분, 자유 텍스트 가능
|
19
|
+
- INDEX: 숫자만 허용되는 부분
|
20
|
+
- UNDEFINED: 정의되지 않은 타입 (기본값)
|
21
|
+
"""
|
22
|
+
PREFIX = auto()
|
23
|
+
SUFFIX = auto()
|
24
|
+
REALNAME = auto()
|
25
|
+
INDEX = auto()
|
26
|
+
UNDEFINED = auto()
|
27
|
+
|
28
|
+
class NamePart:
|
29
|
+
"""
|
30
|
+
이름 부분(name part)을 관리하기 위한 클래스.
|
31
|
+
이름과 해당 부분에 대한 사전 선언된 값들을 관리합니다.
|
32
|
+
"""
|
33
|
+
|
34
|
+
def __init__(self, inName="", inType=NamePartType.UNDEFINED, inPredefinedValues=None, inDescriptions=None, inIsDirection=False, inKoreanDescriptions=None):
|
35
|
+
"""
|
36
|
+
NamePart 클래스 초기화
|
37
|
+
|
38
|
+
Args:
|
39
|
+
inName: 이름 부분의 이름 (예: "Base", "Type", "Side" 등)
|
40
|
+
inPredefinedValues: 사전 선언된 값 목록 (기본값: None, 빈 리스트로 초기화)
|
41
|
+
inType: NamePart의 타입 (NamePartType 열거형 값)
|
42
|
+
inDescriptions: 사전 선언된 값들의 설명 목록 (기본값: None, 빈 리스트로 초기화)
|
43
|
+
inIsDirection: 방향성 여부 (기본값: False)
|
44
|
+
inKoreanDescriptions: 사전 선언된 값들의 한국어 설명 목록 (기본값: None, 빈 리스트로 초기화)
|
45
|
+
"""
|
46
|
+
self._name = inName
|
47
|
+
self._predefinedValues = inPredefinedValues if inPredefinedValues is not None else []
|
48
|
+
self._weights = []
|
49
|
+
self._type = inType
|
50
|
+
self._descriptions = inDescriptions if inDescriptions is not None else [""] * len(self._predefinedValues)
|
51
|
+
self._koreanDescriptions = inKoreanDescriptions if inKoreanDescriptions is not None else [""] * len(self._predefinedValues) # Add korean descriptions
|
52
|
+
self._isDirection = inIsDirection if inIsDirection is True else False # 방향성 여부 (기본값: False)
|
53
|
+
|
54
|
+
# 길이 일치 확인 (Descriptions)
|
55
|
+
if len(self._descriptions) < len(self._predefinedValues):
|
56
|
+
self._descriptions.extend([""] * (len(self._predefinedValues) - len(self._descriptions)))
|
57
|
+
elif len(self._descriptions) > len(self._predefinedValues):
|
58
|
+
self._descriptions = self._descriptions[:len(self._predefinedValues)]
|
59
|
+
|
60
|
+
# 길이 일치 확인 (Korean Descriptions)
|
61
|
+
if len(self._koreanDescriptions) < len(self._predefinedValues):
|
62
|
+
self._koreanDescriptions.extend([""] * (len(self._predefinedValues) - len(self._koreanDescriptions)))
|
63
|
+
elif len(self._koreanDescriptions) > len(self._predefinedValues):
|
64
|
+
self._koreanDescriptions = self._koreanDescriptions[:len(self._predefinedValues)]
|
65
|
+
|
66
|
+
# 타입에 따른 기본 값 설정
|
67
|
+
self._initialize_type_defaults()
|
68
|
+
self._update_weights()
|
69
|
+
|
70
|
+
def _initialize_type_defaults(self):
|
71
|
+
"""타입에 따른 기본 설정을 초기화합니다."""
|
72
|
+
if self._type == NamePartType.INDEX:
|
73
|
+
# Index 타입은 숫자만 처리하므로 predefined values는 사용하지 않음
|
74
|
+
self._predefinedValues = []
|
75
|
+
self._descriptions = []
|
76
|
+
self._koreanDescriptions = [] # Clear korean descriptions
|
77
|
+
self._weights = []
|
78
|
+
elif self._type == NamePartType.REALNAME:
|
79
|
+
# RealName 타입은 predefined values를 사용하지 않음
|
80
|
+
self._predefinedValues = []
|
81
|
+
self._descriptions = []
|
82
|
+
self._koreanDescriptions = [] # Clear korean descriptions
|
83
|
+
self._weights = []
|
84
|
+
|
85
|
+
def _update_weights(self):
|
86
|
+
"""
|
87
|
+
predefined values의 순서에 따라 자동으로 가중치를 설정합니다.
|
88
|
+
값들은 5부터 시작해서 5씩 증가하는 가중치를 갖습니다.
|
89
|
+
"""
|
90
|
+
# REALNAME이나 INDEX 타입인 경우 weights를 사용하지 않음
|
91
|
+
if self._type == NamePartType.REALNAME or self._type == NamePartType.INDEX:
|
92
|
+
self._weights = []
|
93
|
+
return
|
94
|
+
|
95
|
+
self._weights = []
|
96
|
+
# 가중치는 5부터 시작해서 5씩 증가 (순서대로 내림차순 가중치)
|
97
|
+
num_values = len(self._predefinedValues)
|
98
|
+
for i in range(num_values):
|
99
|
+
weight_value = 5 * (i + 1) # 내림차순 가중치
|
100
|
+
self._weights.append(weight_value)
|
101
|
+
|
102
|
+
def set_name(self, inName):
|
103
|
+
"""
|
104
|
+
이름 부분의 이름을 설정합니다.
|
105
|
+
|
106
|
+
Args:
|
107
|
+
inName: 설정할 이름
|
108
|
+
"""
|
109
|
+
self._name = inName
|
110
|
+
|
111
|
+
def get_name(self):
|
112
|
+
"""
|
113
|
+
이름 부분의 이름을 반환합니다.
|
114
|
+
|
115
|
+
Returns:
|
116
|
+
이름 부분의 이름
|
117
|
+
"""
|
118
|
+
return self._name
|
119
|
+
|
120
|
+
def set_type(self, inType):
|
121
|
+
"""
|
122
|
+
이름 부분의 타입을 설정합니다.
|
123
|
+
|
124
|
+
Args:
|
125
|
+
inType: 설정할 타입 (NamePartType 열거형 값)
|
126
|
+
"""
|
127
|
+
self._type = inType
|
128
|
+
self._initialize_type_defaults()
|
129
|
+
self._update_weights()
|
130
|
+
|
131
|
+
def get_type(self):
|
132
|
+
"""
|
133
|
+
이름 부분의 타입을 반환합니다.
|
134
|
+
|
135
|
+
Returns:
|
136
|
+
이름 부분의 타입 (NamePartType 열거형 값)
|
137
|
+
"""
|
138
|
+
return self._type
|
139
|
+
|
140
|
+
def is_prefix(self):
|
141
|
+
"""
|
142
|
+
이름 부분이 PREFIX 타입인지 확인합니다.
|
143
|
+
|
144
|
+
Returns:
|
145
|
+
PREFIX 타입이면 True, 아니면 False
|
146
|
+
"""
|
147
|
+
return self._type == NamePartType.PREFIX
|
148
|
+
|
149
|
+
def is_suffix(self):
|
150
|
+
"""
|
151
|
+
이름 부분이 SUFFIX 타입인지 확인합니다.
|
152
|
+
|
153
|
+
Returns:
|
154
|
+
SUFFIX 타입이면 True, 아니면 False
|
155
|
+
"""
|
156
|
+
return self._type == NamePartType.SUFFIX
|
157
|
+
|
158
|
+
def is_realname(self):
|
159
|
+
"""
|
160
|
+
이름 부분이 REALNAME 타입인지 확인합니다.
|
161
|
+
|
162
|
+
Returns:
|
163
|
+
REALNAME 타입이면 True, 아니면 False
|
164
|
+
"""
|
165
|
+
return self._type == NamePartType.REALNAME
|
166
|
+
|
167
|
+
def is_index(self):
|
168
|
+
"""
|
169
|
+
이름 부분이 INDEX 타입인지 확인합니다.
|
170
|
+
|
171
|
+
Returns:
|
172
|
+
INDEX 타입이면 True, 아니면 False
|
173
|
+
"""
|
174
|
+
return self._type == NamePartType.INDEX
|
175
|
+
|
176
|
+
def add_predefined_value(self, inValue, inDescription="", inKoreanDescription=""):
|
177
|
+
"""
|
178
|
+
사전 선언된 값 목록에 새 값을 추가합니다.
|
179
|
+
|
180
|
+
Args:
|
181
|
+
inValue: 추가할 값
|
182
|
+
inDescription: 추가할 값에 대한 설명 (기본값: 빈 문자열)
|
183
|
+
inKoreanDescription: 추가할 값에 대한 한국어 설명 (기본값: 빈 문자열)
|
184
|
+
|
185
|
+
Returns:
|
186
|
+
추가 성공 여부 (이미 존재하는 경우 False)
|
187
|
+
"""
|
188
|
+
# REALNAME이나 INDEX 타입인 경우 predefined values를 사용하지 않음
|
189
|
+
if self._type == NamePartType.REALNAME or self._type == NamePartType.INDEX:
|
190
|
+
return False
|
191
|
+
|
192
|
+
if inValue not in self._predefinedValues:
|
193
|
+
self._predefinedValues.append(inValue)
|
194
|
+
self._descriptions.append(inDescription)
|
195
|
+
self._koreanDescriptions.append(inKoreanDescription) # Add korean description
|
196
|
+
self._update_weights() # 가중치 자동 업데이트
|
197
|
+
return True
|
198
|
+
return False
|
199
|
+
|
200
|
+
def remove_predefined_value(self, inValue):
|
201
|
+
"""
|
202
|
+
사전 선언된 값 목록에서 값을 제거합니다.
|
203
|
+
|
204
|
+
Args:
|
205
|
+
inValue: 제거할 값
|
206
|
+
|
207
|
+
Returns:
|
208
|
+
제거 성공 여부 (존재하지 않는 경우 False)
|
209
|
+
"""
|
210
|
+
if inValue in self._predefinedValues:
|
211
|
+
index = self._predefinedValues.index(inValue)
|
212
|
+
self._predefinedValues.remove(inValue)
|
213
|
+
self._descriptions.pop(index)
|
214
|
+
self._koreanDescriptions.pop(index) # Remove korean description
|
215
|
+
if index < len(self._weights):
|
216
|
+
self._weights.pop(index)
|
217
|
+
self._update_weights() # 가중치 자동 업데이트
|
218
|
+
return True
|
219
|
+
return False
|
220
|
+
|
221
|
+
def set_predefined_values(self, inValues, inDescriptions=None, inKoreanDescriptions=None):
|
222
|
+
"""
|
223
|
+
사전 선언된 값 목록을 설정합니다.
|
224
|
+
|
225
|
+
Args:
|
226
|
+
inValues: 설정할 값 목록
|
227
|
+
inDescriptions: 설정할 값들의 설명 목록 (기본값: None, 빈 문자열로 초기화)
|
228
|
+
inKoreanDescriptions: 설정할 값들의 한국어 설명 목록 (기본값: None, 빈 문자열로 초기화)
|
229
|
+
"""
|
230
|
+
# REALNAME이나 INDEX 타입인 경우 predefined values를 사용하지 않음
|
231
|
+
if self._type == NamePartType.REALNAME or self._type == NamePartType.INDEX:
|
232
|
+
return
|
233
|
+
|
234
|
+
self._predefinedValues = inValues.copy() if inValues else []
|
235
|
+
|
236
|
+
# 설명 세팅
|
237
|
+
if inDescriptions:
|
238
|
+
self._descriptions = inDescriptions.copy()
|
239
|
+
# 길이 일치 확인
|
240
|
+
if len(self._descriptions) < len(self._predefinedValues):
|
241
|
+
self._descriptions.extend([""] * (len(self._predefinedValues) - len(self._descriptions)))
|
242
|
+
elif len(self._descriptions) > len(self._predefinedValues):
|
243
|
+
self._descriptions = self._descriptions[:len(self._predefinedValues)]
|
244
|
+
else:
|
245
|
+
self._descriptions = [""] * len(self._predefinedValues)
|
246
|
+
|
247
|
+
# 한국어 설명 세팅
|
248
|
+
if inKoreanDescriptions:
|
249
|
+
self._koreanDescriptions = inKoreanDescriptions.copy()
|
250
|
+
# 길이 일치 확인
|
251
|
+
if len(self._koreanDescriptions) < len(self._predefinedValues):
|
252
|
+
self._koreanDescriptions.extend([""] * (len(self._predefinedValues) - len(self._koreanDescriptions)))
|
253
|
+
elif len(self._koreanDescriptions) > len(self._predefinedValues):
|
254
|
+
self._koreanDescriptions = self._koreanDescriptions[:len(self._predefinedValues)]
|
255
|
+
else:
|
256
|
+
self._koreanDescriptions = [""] * len(self._predefinedValues)
|
257
|
+
|
258
|
+
# 가중치 자동 업데이트
|
259
|
+
self._update_weights()
|
260
|
+
|
261
|
+
def get_predefined_values(self):
|
262
|
+
"""
|
263
|
+
사전 선언된 값 목록을 반환합니다.
|
264
|
+
|
265
|
+
Returns:
|
266
|
+
사전 선언된 값 목록
|
267
|
+
"""
|
268
|
+
return self._predefinedValues.copy()
|
269
|
+
|
270
|
+
def contains_value(self, inValue):
|
271
|
+
"""
|
272
|
+
특정 값이 사전 선언된 값 목록에 있는지 확인합니다.
|
273
|
+
|
274
|
+
Args:
|
275
|
+
inValue: 확인할 값
|
276
|
+
|
277
|
+
Returns:
|
278
|
+
값이 존재하면 True, 아니면 False
|
279
|
+
"""
|
280
|
+
# INDEX 타입인 경우 숫자인지 확인
|
281
|
+
if self._type == NamePartType.INDEX:
|
282
|
+
return isinstance(inValue, str) and inValue.isdigit()
|
283
|
+
|
284
|
+
return inValue in self._predefinedValues
|
285
|
+
|
286
|
+
def get_value_at_index(self, inIndex):
|
287
|
+
"""
|
288
|
+
지정된 인덱스의 사전 선언된 값을 반환합니다.
|
289
|
+
|
290
|
+
Args:
|
291
|
+
inIndex: 값의 인덱스
|
292
|
+
|
293
|
+
Returns:
|
294
|
+
값 (인덱스가 범위를 벗어나면 None)
|
295
|
+
"""
|
296
|
+
if 0 <= inIndex < len(self._predefinedValues):
|
297
|
+
return self._predefinedValues[inIndex]
|
298
|
+
return None
|
299
|
+
|
300
|
+
def get_value_count(self):
|
301
|
+
"""
|
302
|
+
사전 선언된 값의 개수를 반환합니다.
|
303
|
+
|
304
|
+
Returns:
|
305
|
+
값 개수
|
306
|
+
"""
|
307
|
+
return len(self._predefinedValues)
|
308
|
+
|
309
|
+
def clear_predefined_values(self):
|
310
|
+
"""
|
311
|
+
모든 사전 선언된 값을 제거합니다.
|
312
|
+
"""
|
313
|
+
# REALNAME이나 INDEX 타입인 경우 아무것도 하지 않음
|
314
|
+
if self._type == NamePartType.REALNAME or self._type == NamePartType.INDEX:
|
315
|
+
return
|
316
|
+
|
317
|
+
self._predefinedValues.clear()
|
318
|
+
self._descriptions.clear()
|
319
|
+
self._koreanDescriptions.clear() # Clear korean descriptions
|
320
|
+
self._weights.clear() # 가중치도 초기화
|
321
|
+
|
322
|
+
# 가중치 매핑 관련 메서드들
|
323
|
+
|
324
|
+
def get_value_by_weight(self, inRank=0):
|
325
|
+
returnStr = ""
|
326
|
+
if len(self._predefinedValues) != len(self._weights) or len(self._predefinedValues) <= 0:
|
327
|
+
return returnStr
|
328
|
+
foundIndex = self._weights.index(inRank)
|
329
|
+
returnStr = self._predefinedValues[foundIndex] if foundIndex >= 0 else self._predefinedValues[0]
|
330
|
+
|
331
|
+
return returnStr
|
332
|
+
|
333
|
+
def get_most_different_weight_value(self, inValue):
|
334
|
+
"""
|
335
|
+
주어진 값의 가중치와 가장 차이가 큰 값을 반환합니다.
|
336
|
+
|
337
|
+
Args:
|
338
|
+
inValue: 기준이 되는 값
|
339
|
+
|
340
|
+
Returns:
|
341
|
+
가중치 차이가 가장 큰 값, 없으면 빈 문자열
|
342
|
+
"""
|
343
|
+
if len(self._predefinedValues) != len(self._weights) or len(self._predefinedValues) <= 0:
|
344
|
+
return ""
|
345
|
+
|
346
|
+
if inValue not in self._predefinedValues:
|
347
|
+
return ""
|
348
|
+
|
349
|
+
# 값의 가중치 가져오기
|
350
|
+
index = self._predefinedValues.index(inValue)
|
351
|
+
currentWeight = self._weights[index]
|
352
|
+
|
353
|
+
maxDiff = -1
|
354
|
+
maxDiffValue = ""
|
355
|
+
|
356
|
+
# 가중치 차이가 가장 큰 값 찾기
|
357
|
+
for i, predValue in enumerate(self._predefinedValues):
|
358
|
+
if predValue == inValue:
|
359
|
+
continue
|
360
|
+
|
361
|
+
predWeight = self._weights[i] if i < len(self._weights) else 0
|
362
|
+
diff = abs(currentWeight - predWeight)
|
363
|
+
if diff > maxDiff:
|
364
|
+
maxDiff = diff
|
365
|
+
maxDiffValue = predValue
|
366
|
+
|
367
|
+
return maxDiffValue
|
368
|
+
|
369
|
+
def get_value_by_min_weight(self):
|
370
|
+
"""
|
371
|
+
가중치가 가장 낮은 값을 반환합니다.
|
372
|
+
|
373
|
+
Returns:
|
374
|
+
가중치가 가장 낮은 값, 없으면 빈 문자열
|
375
|
+
"""
|
376
|
+
if len(self._predefinedValues) != len(self._weights) or len(self._predefinedValues) <= 0:
|
377
|
+
return ""
|
378
|
+
return self._predefinedValues[0]
|
379
|
+
|
380
|
+
def get_value_by_max_weight(self):
|
381
|
+
"""
|
382
|
+
가중치가 가장 높은 값을 반환합니다.
|
383
|
+
|
384
|
+
Returns:
|
385
|
+
가중치가 가장 높은 값, 없으면 빈 문자열
|
386
|
+
"""
|
387
|
+
if len(self._predefinedValues) != len(self._weights) or len(self._predefinedValues) <= 0:
|
388
|
+
return ""
|
389
|
+
return self._predefinedValues[-1]
|
390
|
+
|
391
|
+
def validate_value(self, inValue):
|
392
|
+
"""
|
393
|
+
값이 이 NamePart 타입에 유효한지 검증합니다.
|
394
|
+
|
395
|
+
Args:
|
396
|
+
inValue: 검증할 값
|
397
|
+
|
398
|
+
Returns:
|
399
|
+
유효하면 True, 아니면 False
|
400
|
+
"""
|
401
|
+
# INDEX 타입은 숫자 문자열만 유효
|
402
|
+
if self._type == NamePartType.INDEX:
|
403
|
+
return isinstance(inValue, str) and inValue.isdigit()
|
404
|
+
|
405
|
+
# PREFIX와 SUFFIX 타입은 predefined values 중 하나여야 함
|
406
|
+
if (self._type == NamePartType.PREFIX or self._type == NamePartType.SUFFIX) and self._predefinedValues:
|
407
|
+
return inValue in self._predefinedValues
|
408
|
+
|
409
|
+
# REALNAME 타입은 모든 문자열 유효
|
410
|
+
if self._type == NamePartType.REALNAME:
|
411
|
+
return isinstance(inValue, str)
|
412
|
+
|
413
|
+
# 정의되지 않은 타입이면 기존 동작대로 처리
|
414
|
+
return True
|
415
|
+
|
416
|
+
# 추가: 설명 관련 메서드들
|
417
|
+
|
418
|
+
def set_description(self, inValue, inDescription):
|
419
|
+
"""
|
420
|
+
특정 predefined value의 설명을 설정합니다.
|
421
|
+
|
422
|
+
Args:
|
423
|
+
inValue: 설명을 설정할 값
|
424
|
+
inDescription: 설정할 설명
|
425
|
+
|
426
|
+
Returns:
|
427
|
+
설정 성공 여부 (값이 존재하지 않는 경우 False)
|
428
|
+
"""
|
429
|
+
if inValue in self._predefinedValues:
|
430
|
+
index = self._predefinedValues.index(inValue)
|
431
|
+
self._descriptions[index] = inDescription
|
432
|
+
return True
|
433
|
+
return False
|
434
|
+
|
435
|
+
def get_description_by_value(self, inValue):
|
436
|
+
"""
|
437
|
+
특정 predefined value의 설명을 반환합니다.
|
438
|
+
|
439
|
+
Args:
|
440
|
+
inValue: 설명을 가져올 값
|
441
|
+
|
442
|
+
Returns:
|
443
|
+
해당 값의 설명, 값이 존재하지 않으면 빈 문자열
|
444
|
+
"""
|
445
|
+
if inValue in self._predefinedValues:
|
446
|
+
index = self._predefinedValues.index(inValue)
|
447
|
+
return self._descriptions[index]
|
448
|
+
return ""
|
449
|
+
|
450
|
+
def get_descriptions(self):
|
451
|
+
"""
|
452
|
+
모든 설명을 반환합니다.
|
453
|
+
|
454
|
+
Returns:
|
455
|
+
설명 목록
|
456
|
+
"""
|
457
|
+
return self._descriptions.copy()
|
458
|
+
|
459
|
+
def get_value_by_description(self, inDescription):
|
460
|
+
"""
|
461
|
+
특정 설명에 해당하는 값을 반환합니다.
|
462
|
+
|
463
|
+
Args:
|
464
|
+
inDescription: 찾을 설명
|
465
|
+
|
466
|
+
Returns:
|
467
|
+
해당 설명의 값, 없으면 빈 문자열
|
468
|
+
"""
|
469
|
+
if inDescription in self._descriptions:
|
470
|
+
index = self._descriptions.index(inDescription)
|
471
|
+
return self._predefinedValues[index]
|
472
|
+
return ""
|
473
|
+
|
474
|
+
def get_value_with_description(self, inIndex):
|
475
|
+
"""
|
476
|
+
지정된 인덱스의 값과 설명을 튜플로 반환합니다.
|
477
|
+
|
478
|
+
Args:
|
479
|
+
inIndex: 값의 인덱스
|
480
|
+
|
481
|
+
Returns:
|
482
|
+
(값, 설명) 튜플, 인덱스가 범위를 벗어나면 (None, None)
|
483
|
+
"""
|
484
|
+
if 0 <= inIndex < len(self._predefinedValues):
|
485
|
+
return (self._predefinedValues[inIndex], self._descriptions[inIndex])
|
486
|
+
return (None, None)
|
487
|
+
|
488
|
+
def get_values_with_descriptions(self):
|
489
|
+
"""
|
490
|
+
모든 값과 설명의 튜플 리스트를 반환합니다.
|
491
|
+
|
492
|
+
Returns:
|
493
|
+
(값, 설명) 튜플의 리스트
|
494
|
+
"""
|
495
|
+
return list(zip(self._predefinedValues, self._descriptions))
|
496
|
+
|
497
|
+
# 추가: 한국어 설명 관련 메서드들
|
498
|
+
|
499
|
+
def set_korean_description(self, inValue, inKoreanDescription):
|
500
|
+
"""
|
501
|
+
특정 predefined value의 한국어 설명을 설정합니다.
|
502
|
+
|
503
|
+
Args:
|
504
|
+
inValue: 설명을 설정할 값
|
505
|
+
inKoreanDescription: 설정할 한국어 설명
|
506
|
+
|
507
|
+
Returns:
|
508
|
+
설정 성공 여부 (값이 존재하지 않는 경우 False)
|
509
|
+
"""
|
510
|
+
if inValue in self._predefinedValues:
|
511
|
+
index = self._predefinedValues.index(inValue)
|
512
|
+
self._koreanDescriptions[index] = inKoreanDescription
|
513
|
+
return True
|
514
|
+
return False
|
515
|
+
|
516
|
+
def get_korean_description_by_value(self, inValue):
|
517
|
+
"""
|
518
|
+
특정 predefined value의 한국어 설명을 반환합니다.
|
519
|
+
|
520
|
+
Args:
|
521
|
+
inValue: 설명을 가져올 값
|
522
|
+
|
523
|
+
Returns:
|
524
|
+
해당 값의 한국어 설명, 값이 존재하지 않으면 빈 문자열
|
525
|
+
"""
|
526
|
+
if inValue in self._predefinedValues:
|
527
|
+
index = self._predefinedValues.index(inValue)
|
528
|
+
return self._koreanDescriptions[index]
|
529
|
+
return ""
|
530
|
+
|
531
|
+
def get_korean_descriptions(self):
|
532
|
+
"""
|
533
|
+
모든 한국어 설명을 반환합니다.
|
534
|
+
|
535
|
+
Returns:
|
536
|
+
한국어 설명 목록
|
537
|
+
"""
|
538
|
+
return self._koreanDescriptions.copy()
|
539
|
+
|
540
|
+
def get_value_by_korean_description(self, inKoreanDescription):
|
541
|
+
"""
|
542
|
+
특정 한국어 설명에 해당하는 값을 반환합니다.
|
543
|
+
|
544
|
+
Args:
|
545
|
+
inKoreanDescription: 찾을 한국어 설명
|
546
|
+
|
547
|
+
Returns:
|
548
|
+
해당 설명의 값, 없으면 빈 문자열
|
549
|
+
"""
|
550
|
+
if inKoreanDescription in self._koreanDescriptions:
|
551
|
+
index = self._koreanDescriptions.index(inKoreanDescription)
|
552
|
+
return self._predefinedValues[index]
|
553
|
+
return ""
|
554
|
+
|
555
|
+
def get_value_with_korean_description(self, inIndex):
|
556
|
+
"""
|
557
|
+
지정된 인덱스의 값과 한국어 설명을 튜플로 반환합니다.
|
558
|
+
|
559
|
+
Args:
|
560
|
+
inIndex: 값의 인덱스
|
561
|
+
|
562
|
+
Returns:
|
563
|
+
(값, 한국어 설명) 튜플, 인덱스가 범위를 벗어나면 (None, None)
|
564
|
+
"""
|
565
|
+
if 0 <= inIndex < len(self._predefinedValues):
|
566
|
+
return (self._predefinedValues[inIndex], self._koreanDescriptions[inIndex])
|
567
|
+
return (None, None)
|
568
|
+
|
569
|
+
def get_values_with_korean_descriptions(self):
|
570
|
+
"""
|
571
|
+
모든 값과 한국어 설명의 튜플 리스트를 반환합니다.
|
572
|
+
|
573
|
+
Returns:
|
574
|
+
(값, 한국어 설명) 튜플의 리스트
|
575
|
+
"""
|
576
|
+
return list(zip(self._predefinedValues, self._koreanDescriptions))
|
577
|
+
|
578
|
+
def is_direction(self):
|
579
|
+
"""
|
580
|
+
방향성 여부를 반환합니다.
|
581
|
+
|
582
|
+
Returns:
|
583
|
+
방향성 여부 (True/False)
|
584
|
+
"""
|
585
|
+
return self._isDirection
|
586
|
+
|
587
|
+
def to_dict(self):
|
588
|
+
"""
|
589
|
+
NamePart 객체를 사전 형태로 변환합니다.
|
590
|
+
|
591
|
+
Returns:
|
592
|
+
사전 형태의 NamePart 정보
|
593
|
+
"""
|
594
|
+
return {
|
595
|
+
"name": self._name,
|
596
|
+
"predefinedValues": self._predefinedValues.copy(),
|
597
|
+
"weights": self._weights.copy(), # 가중치를 리스트 형태로 직접 전달
|
598
|
+
"type": self._type.name if hasattr(self._type, 'name') else str(self._type),
|
599
|
+
"descriptions": self._descriptions.copy(),
|
600
|
+
"koreanDescriptions": self._koreanDescriptions.copy(), # Add korean descriptions
|
601
|
+
"isDirection": self._isDirection
|
602
|
+
}
|
603
|
+
|
604
|
+
@staticmethod
|
605
|
+
def from_dict(inData):
|
606
|
+
"""
|
607
|
+
사전 형태의 데이터로부터 NamePart 객체를 생성합니다.
|
608
|
+
|
609
|
+
Args:
|
610
|
+
inData: 사전 형태의 NamePart 정보
|
611
|
+
|
612
|
+
Returns:
|
613
|
+
NamePart 객체
|
614
|
+
"""
|
615
|
+
if isinstance(inData, dict) and "name" in inData:
|
616
|
+
# 타입 변환 (문자열 -> NamePartType 열거형)
|
617
|
+
type_str = inData.get("type", "UNDEFINED")
|
618
|
+
try:
|
619
|
+
part_type = NamePartType[type_str] if isinstance(type_str, str) else NamePartType.UNDEFINED
|
620
|
+
except KeyError:
|
621
|
+
part_type = NamePartType.UNDEFINED
|
622
|
+
|
623
|
+
result = NamePart(
|
624
|
+
inData["name"],
|
625
|
+
part_type, # 두 번째 인자로 타입 전달
|
626
|
+
inData.get("predefinedValues", []), # 세 번째 인자로 predefinedValues 전달
|
627
|
+
inData.get("descriptions", []), # 네 번째 인자로 descriptions 전달
|
628
|
+
inData.get("isDirection", False), # 다섯 번째 인자로 isDirection 전달
|
629
|
+
inData.get("koreanDescriptions", []) # 여섯 번째 인자로 koreanDescriptions 전달
|
630
|
+
)
|
631
|
+
|
632
|
+
return result
|
633
|
+
return NamePart()
|