pyjallib 0.1.16__py3-none-any.whl → 0.1.17__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.
@@ -0,0 +1,254 @@
1
+ """
2
+ 템플릿 처리를 위한 유틸리티 모듈
3
+ UE5 익스포트 시 파이썬 스크립트 템플릿을 실제 코드로 변환하는 기능을 제공합니다.
4
+ """
5
+
6
+ import os
7
+ from pathlib import Path
8
+ from typing import Dict, Any, Optional
9
+ from .logger import ue5_logger
10
+ from .templates import (
11
+ get_template_path,
12
+ get_all_template_paths,
13
+ get_available_templates,
14
+ ANIM_IMPORT_TEMPLATE,
15
+ SKELETON_IMPORT_TEMPLATE,
16
+ SKELETAL_MESH_IMPORT_TEMPLATE
17
+ )
18
+
19
+
20
+ class TemplateProcessor:
21
+ """템플릿 처리를 위한 확장된 클래스"""
22
+
23
+ def __init__(self):
24
+ """TemplateProcessor 초기화"""
25
+ ue5_logger.debug("TemplateProcessor 초기화")
26
+ self._default_output_dir = Path.cwd() / "temp_scripts"
27
+
28
+ def process_template(self, inTemplatePath: str, inTemplateOutPath: str, inTemplateData: Dict[str, Any]) -> str:
29
+ """
30
+ 템플릿을 처리하여 실제 코드로 변환 (기존 메서드 유지)
31
+
32
+ Args:
33
+ inTemplatePath (str): 템플릿 파일 경로
34
+ inTemplateOutPath (str): 출력 파일 경로
35
+ inTemplateData (Dict[str, Any]): 템플릿에서 치환할 데이터
36
+
37
+ Returns:
38
+ str: 처리된 템플릿 내용
39
+
40
+ Raises:
41
+ FileNotFoundError: 템플릿 파일이 존재하지 않는 경우
42
+ PermissionError: 파일 읽기/쓰기 권한이 없는 경우
43
+ OSError: 디렉토리 생성 실패 등 파일 시스템 오류
44
+ UnicodeDecodeError: 파일 인코딩 오류
45
+ """
46
+ # 템플릿 파일 존재 확인
47
+ templatePath = Path(inTemplatePath)
48
+ if not templatePath.exists():
49
+ ue5_logger.error(f"템플릿 파일을 찾을 수 없습니다: {inTemplatePath}")
50
+ raise FileNotFoundError(f"템플릿 파일을 찾을 수 없습니다: {inTemplatePath}")
51
+
52
+ # 템플릿 파일 읽기 권한 확인
53
+ if not os.access(templatePath, os.R_OK):
54
+ ue5_logger.error(f"템플릿 파일 읽기 권한이 없습니다: {inTemplatePath}")
55
+ raise PermissionError(f"템플릿 파일 읽기 권한이 없습니다: {inTemplatePath}")
56
+
57
+ # 템플릿 파일 읽기
58
+ with open(templatePath, 'r', encoding='utf-8') as file:
59
+ templateContent = file.read()
60
+
61
+ # 템플릿 데이터로 플레이스홀더 치환
62
+ processedContent = templateContent
63
+ for key, value in inTemplateData.items():
64
+ placeholder = f'{{{key}}}'
65
+ if placeholder in processedContent:
66
+ processedContent = processedContent.replace(placeholder, str(value))
67
+
68
+ # 출력 디렉토리 생성 (존재하지 않는 경우)
69
+ outputPath = Path(inTemplateOutPath)
70
+ outputPath.parent.mkdir(parents=True, exist_ok=True)
71
+
72
+ # 출력 파일 쓰기 권한 확인 (기존 파일이 있는 경우)
73
+ if outputPath.exists() and not os.access(outputPath, os.W_OK):
74
+ ue5_logger.error(f"출력 파일 쓰기 권한이 없습니다: {inTemplateOutPath}")
75
+ raise PermissionError(f"출력 파일 쓰기 권한이 없습니다: {inTemplateOutPath}")
76
+
77
+ # 처리된 내용을 파일로 출력
78
+ with open(outputPath, 'w', encoding='utf-8') as file:
79
+ file.write(processedContent)
80
+
81
+ ue5_logger.info(f"템플릿 처리 완료: {inTemplatePath} -> {inTemplateOutPath}")
82
+ return processedContent
83
+
84
+ # === 새로운 템플릿 경로 관리 메서드 ===
85
+ def get_template_path(self, template_name: str) -> str:
86
+ """
87
+ 템플릿 파일 경로를 간단하게 가져오기
88
+
89
+ Args:
90
+ template_name (str): 'animImport', 'skeletonImport', 'skeletalMeshImport' 중 하나
91
+
92
+ Returns:
93
+ str: 템플릿 파일의 절대 경로
94
+ """
95
+ return get_template_path(template_name)
96
+
97
+ def get_all_template_paths(self) -> Dict[str, str]:
98
+ """모든 템플릿 경로를 딕셔너리로 반환"""
99
+ return get_all_template_paths()
100
+
101
+ def get_available_templates(self) -> list:
102
+ """사용 가능한 템플릿 목록 반환"""
103
+ return get_available_templates()
104
+
105
+ # === 타입별 특화 처리 메서드 ===
106
+ def process_animation_import_template(self,
107
+ inTemplateData: Dict[str, Any],
108
+ inOutputPath: Optional[str] = None) -> str:
109
+ """
110
+ 애니메이션 임포트 전용 템플릿 처리
111
+
112
+ Args:
113
+ inTemplateData (Dict[str, Any]): 템플릿 데이터
114
+ 필수 키:
115
+ - inExtPackagePath: 외부 패키지 경로
116
+ - inAnimFbxPath: 애니메이션 FBX 경로
117
+ - inSkeletonFbxPath: 스켈레톤 FBX 경로
118
+ - inContentRootPrefix: Content 루트 경로
119
+ - inFbxRootPrefix: FBX 루트 경로
120
+ inOutputPath (Optional[str]): 출력 파일 경로. None인 경우 기본 경로 사용
121
+
122
+ Returns:
123
+ str: 처리된 템플릿 내용
124
+ """
125
+ # 필수 키 검증
126
+ required_keys = ['inExtPackagePath', 'inAnimFbxPath', 'inSkeletonFbxPath',
127
+ 'inContentRootPrefix', 'inFbxRootPrefix']
128
+ if not self.validate_template_data(ANIM_IMPORT_TEMPLATE, inTemplateData, required_keys):
129
+ raise ValueError(f"애니메이션 템플릿에 필요한 키가 누락되었습니다: {required_keys}")
130
+
131
+ template_path = get_template_path(ANIM_IMPORT_TEMPLATE)
132
+
133
+ if inOutputPath is None:
134
+ inOutputPath = self.get_default_output_path(ANIM_IMPORT_TEMPLATE, "animImportScript")
135
+
136
+ return self.process_template(template_path, inOutputPath, inTemplateData)
137
+
138
+ def process_skeleton_import_template(self,
139
+ inTemplateData: Dict[str, Any],
140
+ inOutputPath: Optional[str] = None) -> str:
141
+ """
142
+ 스켈레톤 임포트 전용 템플릿 처리
143
+
144
+ Args:
145
+ inTemplateData (Dict[str, Any]): 템플릿 데이터
146
+ 필수 키:
147
+ - inExtPackagePath: 외부 패키지 경로
148
+ - inSkeletonFbxPath: 스켈레톤 FBX 경로
149
+ - inContentRootPrefix: Content 루트 경로
150
+ - inFbxRootPrefix: FBX 루트 경로
151
+ inOutputPath (Optional[str]): 출력 파일 경로. None인 경우 기본 경로 사용
152
+
153
+ Returns:
154
+ str: 처리된 템플릿 내용
155
+ """
156
+ # 필수 키 검증
157
+ required_keys = ['inExtPackagePath', 'inSkeletonFbxPath',
158
+ 'inContentRootPrefix', 'inFbxRootPrefix']
159
+ if not self.validate_template_data(SKELETON_IMPORT_TEMPLATE, inTemplateData, required_keys):
160
+ raise ValueError(f"스켈레톤 템플릿에 필요한 키가 누락되었습니다: {required_keys}")
161
+
162
+ template_path = get_template_path(SKELETON_IMPORT_TEMPLATE)
163
+
164
+ if inOutputPath is None:
165
+ inOutputPath = self.get_default_output_path(SKELETON_IMPORT_TEMPLATE, "skeletonImportScript")
166
+
167
+ return self.process_template(template_path, inOutputPath, inTemplateData)
168
+
169
+ def process_skeletal_mesh_import_template(self,
170
+ inTemplateData: Dict[str, Any],
171
+ inOutputPath: Optional[str] = None) -> str:
172
+ """
173
+ 스켈레탈 메시 임포트 전용 템플릿 처리
174
+
175
+ Args:
176
+ inTemplateData (Dict[str, Any]): 템플릿 데이터
177
+ 필수 키:
178
+ - inExtPackagePath: 외부 패키지 경로
179
+ - inSkeletalMeshFbxPath: 스켈레탈 메시 FBX 경로
180
+ - inSkeletonFbxPath: 스켈레톤 FBX 경로
181
+ - inContentRootPrefix: Content 루트 경로
182
+ - inFbxRootPrefix: FBX 루트 경로
183
+ inOutputPath (Optional[str]): 출력 파일 경로. None인 경우 기본 경로 사용
184
+
185
+ Returns:
186
+ str: 처리된 템플릿 내용
187
+ """
188
+ # 필수 키 검증
189
+ required_keys = ['inExtPackagePath', 'inSkeletalMeshFbxPath', 'inSkeletonFbxPath',
190
+ 'inContentRootPrefix', 'inFbxRootPrefix']
191
+ if not self.validate_template_data(SKELETAL_MESH_IMPORT_TEMPLATE, inTemplateData, required_keys):
192
+ raise ValueError(f"스켈레탈 메시 템플릿에 필요한 키가 누락되었습니다: {required_keys}")
193
+
194
+ template_path = get_template_path(SKELETAL_MESH_IMPORT_TEMPLATE)
195
+
196
+ if inOutputPath is None:
197
+ inOutputPath = self.get_default_output_path(SKELETAL_MESH_IMPORT_TEMPLATE, "skeletalMeshImportScript")
198
+
199
+ return self.process_template(template_path, inOutputPath, inTemplateData)
200
+
201
+ # === 유틸리티 메서드 ===
202
+ def validate_template_data(self, template_type: str, template_data: Dict[str, Any], required_keys: list = None) -> bool:
203
+ """
204
+ 템플릿 데이터 유효성 검사
205
+
206
+ Args:
207
+ template_type (str): 템플릿 타입
208
+ template_data (Dict[str, Any]): 검사할 템플릿 데이터
209
+ required_keys (list, optional): 필수 키 목록. None인 경우 기본 검사만 수행
210
+
211
+ Returns:
212
+ bool: 유효한 데이터면 True, 그렇지 않으면 False
213
+ """
214
+ if not isinstance(template_data, dict):
215
+ ue5_logger.error(f"템플릿 데이터가 딕셔너리가 아닙니다: {type(template_data)}")
216
+ return False
217
+
218
+ if required_keys:
219
+ missing_keys = [key for key in required_keys if key not in template_data]
220
+ if missing_keys:
221
+ ue5_logger.error(f"템플릿 데이터에 필수 키가 누락되었습니다: {missing_keys}")
222
+ return False
223
+
224
+ return True
225
+
226
+ def get_default_output_path(self, template_type: str, base_name: str = None) -> str:
227
+ """
228
+ 기본 출력 경로 생성
229
+
230
+ Args:
231
+ template_type (str): 템플릿 타입
232
+ base_name (str, optional): 기본 파일명. None인 경우 템플릿 타입으로 생성
233
+
234
+ Returns:
235
+ str: 기본 출력 파일 경로
236
+ """
237
+ if base_name is None:
238
+ base_name = f"{template_type}Script"
239
+
240
+ # 기본 출력 디렉토리 생성
241
+ self._default_output_dir.mkdir(parents=True, exist_ok=True)
242
+
243
+ output_path = self._default_output_dir / f"{base_name}.py"
244
+ return str(output_path)
245
+
246
+ def set_default_output_directory(self, directory_path: str):
247
+ """
248
+ 기본 출력 디렉토리 설정
249
+
250
+ Args:
251
+ directory_path (str): 새로운 기본 출력 디렉토리 경로
252
+ """
253
+ self._default_output_dir = Path(directory_path)
254
+ ue5_logger.info(f"기본 출력 디렉토리가 변경되었습니다: {directory_path}")
@@ -0,0 +1,106 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+
4
+ """
5
+ UE5 템플릿 관리 모듈
6
+ 템플릿 파일 경로를 쉽게 가져올 수 있는 기능 제공
7
+ """
8
+
9
+ import os
10
+ from pathlib import Path
11
+ from typing import Dict, Optional
12
+
13
+ # 템플릿 이름 상수
14
+ ANIM_IMPORT_TEMPLATE = "animImport"
15
+ SKELETON_IMPORT_TEMPLATE = "skeletonImport"
16
+ SKELETAL_MESH_IMPORT_TEMPLATE = "skeletalMeshImport"
17
+
18
+ # 템플릿 파일 매핑
19
+ _TEMPLATE_FILE_MAP = {
20
+ ANIM_IMPORT_TEMPLATE: "animImportTemplate.py",
21
+ SKELETON_IMPORT_TEMPLATE: "skeletonImportTemplate.py",
22
+ SKELETAL_MESH_IMPORT_TEMPLATE: "skeletalMeshImportTemplate.py"
23
+ }
24
+
25
+ def get_template_path(template_name: str) -> str:
26
+ """
27
+ 템플릿 이름으로 템플릿 파일 경로 반환
28
+
29
+ Args:
30
+ template_name (str): 'animImport', 'skeletonImport', 'skeletalMeshImport' 중 하나
31
+
32
+ Returns:
33
+ str: 템플릿 파일의 절대 경로
34
+
35
+ Raises:
36
+ ValueError: 지원하지 않는 템플릿 이름인 경우
37
+ FileNotFoundError: 템플릿 파일이 존재하지 않는 경우
38
+ """
39
+ if template_name not in _TEMPLATE_FILE_MAP:
40
+ supported_templates = list(_TEMPLATE_FILE_MAP.keys())
41
+ raise ValueError(f"지원하지 않는 템플릿 이름: {template_name}. 지원되는 템플릿: {supported_templates}")
42
+
43
+ template_filename = _TEMPLATE_FILE_MAP[template_name]
44
+ templates_dir = Path(__file__).parent
45
+ template_path = templates_dir / template_filename
46
+
47
+ if not template_path.exists():
48
+ raise FileNotFoundError(f"템플릿 파일을 찾을 수 없습니다: {template_path}")
49
+
50
+ return str(template_path.resolve())
51
+
52
+ def get_all_template_paths() -> Dict[str, str]:
53
+ """
54
+ 모든 템플릿 경로를 딕셔너리로 반환
55
+
56
+ Returns:
57
+ Dict[str, str]: 템플릿 이름을 키로 하고 파일 경로를 값으로 하는 딕셔너리
58
+ """
59
+ template_paths = {}
60
+ for template_name in _TEMPLATE_FILE_MAP.keys():
61
+ try:
62
+ template_paths[template_name] = get_template_path(template_name)
63
+ except (ValueError, FileNotFoundError):
64
+ # 존재하지 않는 템플릿은 건너뛰기
65
+ continue
66
+
67
+ return template_paths
68
+
69
+ def get_available_templates() -> list:
70
+ """
71
+ 사용 가능한 템플릿 목록 반환
72
+
73
+ Returns:
74
+ list: 사용 가능한 템플릿 이름 목록
75
+ """
76
+ available = []
77
+ templates_dir = Path(__file__).parent
78
+
79
+ for template_name, filename in _TEMPLATE_FILE_MAP.items():
80
+ template_path = templates_dir / filename
81
+ if template_path.exists():
82
+ available.append(template_name)
83
+
84
+ return available
85
+
86
+ def validate_template_name(template_name: str) -> bool:
87
+ """
88
+ 템플릿 이름이 유효한지 확인
89
+
90
+ Args:
91
+ template_name (str): 확인할 템플릿 이름
92
+
93
+ Returns:
94
+ bool: 유효한 템플릿 이름이면 True, 그렇지 않으면 False
95
+ """
96
+ return template_name in _TEMPLATE_FILE_MAP
97
+
98
+ __all__ = [
99
+ 'get_template_path',
100
+ 'get_all_template_paths',
101
+ 'get_available_templates',
102
+ 'validate_template_name',
103
+ 'ANIM_IMPORT_TEMPLATE',
104
+ 'SKELETON_IMPORT_TEMPLATE',
105
+ 'SKELETAL_MESH_IMPORT_TEMPLATE'
106
+ ]
@@ -0,0 +1,22 @@
1
+ import sys
2
+ import os
3
+ from pathlib import Path
4
+
5
+ # 프로젝트 루트 디렉토리 추가 (PyJalLib 디렉토리)
6
+ extPackagePath = r'{inExtPackagePath}'
7
+
8
+ if extPackagePath not in sys.path:
9
+ sys.path.insert(0, extPackagePath)
10
+
11
+ import pyjallib
12
+ from pyjallib.ue5.inUnreal.animationImporter import AnimationImporter
13
+
14
+ fbxPath = r'{inAnimFbxPath}'
15
+ skeletonPath = r'{inSkeletonFbxPath}'
16
+
17
+ contentRootPrefix = r'{inContentRootPrefix}'
18
+ fbxRootPrefix = r'{inFbxRootPrefix}'
19
+
20
+ animImporter = AnimationImporter(inContentRootPrefix=contentRootPrefix, inFbxRootPrefix=fbxRootPrefix)
21
+
22
+ result = animImporter.import_animation(fbxPath, skeletonPath)
@@ -0,0 +1,22 @@
1
+ import sys
2
+ import os
3
+ from pathlib import Path
4
+
5
+ # 프로젝트 루트 디렉토리 추가 (PyJalLib 디렉토리)
6
+ extPackagePath = r'{inExtPackagePath}'
7
+
8
+ if extPackagePath not in sys.path:
9
+ sys.path.insert(0, extPackagePath)
10
+
11
+ import pyjallib
12
+ from pyjallib.ue5.inUnreal.skeletalMeshImporter import SkeletalMeshImporter
13
+
14
+ fbxPath = r'{inSkeletalMeshFbxPath}'
15
+ skeletonPath = r'{inSkeletonFbxPath}'
16
+
17
+ contentRootPrefix = r'{inContentRootPrefix}'
18
+ fbxRootPrefix = r'{inFbxRootPrefix}'
19
+
20
+ skeletalMeshImporter = SkeletalMeshImporter(inContentRootPrefix=contentRootPrefix, inFbxRootPrefix=fbxRootPrefix)
21
+
22
+ result = skeletalMeshImporter.import_skeletal_mesh(fbxPath, skeletonPath)
@@ -0,0 +1,21 @@
1
+ import sys
2
+ import os
3
+ from pathlib import Path
4
+
5
+ # 프로젝트 루트 디렉토리 추가 (PyJalLib 디렉토리)
6
+ extPackagePath = r'{inExtPackagePath}'
7
+
8
+ if extPackagePath not in sys.path:
9
+ sys.path.insert(0, extPackagePath)
10
+
11
+ import pyjallib
12
+ from pyjallib.ue5.inUnreal.skeletonImporter import SkeletonImporter
13
+
14
+ fbxPath = r'{inSkeletonFbxPath}'
15
+
16
+ contentRootPrefix = r'{inContentRootPrefix}'
17
+ fbxRootPrefix = r'{inFbxRootPrefix}'
18
+
19
+ animImporter = SkeletonImporter(inContentRootPrefix=contentRootPrefix, inFbxRootPrefix=fbxRootPrefix)
20
+
21
+ result = animImporter.import_skeleton(fbxPath)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyjallib
3
- Version: 0.1.16
3
+ Version: 0.1.17
4
4
  Summary: A utility library for 3D game character development pipelines.
5
5
  Author-email: Dongseok Kim <jalnagakds@gmail.com>
6
6
  Requires-Python: >=3.10
@@ -1,9 +1,11 @@
1
- pyjallib/__init__.py,sha256=x9MQjDWegE6dAs6jPCgRy9ymBM8DqQ2XpSqGgmLY-tA,509
1
+ pyjallib/__init__.py,sha256=0teYtsIkKouYZnPgW_8vOGF7nGrX7fLD0_vCFT_PpNU,595
2
+ pyjallib/logger.py,sha256=7NoSQnSuc6PGnCVzQsJGOkUfsPNIrrkGelQ2Tm_KFbQ,8249
2
3
  pyjallib/namePart.py,sha256=lKIiOVkWrtAW-D3nuv--vHmdAnlQeVPaXLYUDhcr8QU,24177
3
4
  pyjallib/nameToPath.py,sha256=aBeezepLYdpv3VYxnQ2c4ZWzz2WjticXjkdbAIlVa1k,4676
4
- pyjallib/naming.py,sha256=b2C-P9VWV4Q2StqkizEwABblYOC5g6sXHzN0KpOZ_Ys,37419
5
+ pyjallib/naming.py,sha256=-2M_VL-Yt0EJLi98FBWW8KLxyHOsvqrLVGYuU8tqPBk,37518
5
6
  pyjallib/namingConfig.py,sha256=QGpK5mCnRiclKqNKz3GJ2PeJO8fbVitAEdqWwnwo8oA,34127
6
- pyjallib/perforce.py,sha256=VQswiyQ6CHCAgFJO5MjC2Su1qNU4yfAQmFZGapNR6_g,57329
7
+ pyjallib/perforce.py,sha256=O3TAquMrAuduax2zvUVpsl23I_QV452r9al51vwwlms,47981
8
+ pyjallib/progressEvent.py,sha256=pDniS5RTwfh36kWO0FfAL16Xh_1APCXLHKZNCAV9OeE,2468
7
9
  pyjallib/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
10
  pyjallib/reloadModules.py,sha256=RAEG3IxzJ0TlsjvnZwJt56JOkc2j8voqAnRbfQuZ44g,1151
9
11
  pyjallib/ConfigFiles/namingConfig.json,sha256=Ov4bbVJb6qodPaooU63e11YUMGXXPWFAA4AQq1sLBYU,1486
@@ -11,7 +13,7 @@ pyjallib/max/__init__.py,sha256=D5yORjy_n4b2MPq6suG3Wj7oq7hROr8jWUoUu8JSCtU,1771
11
13
  pyjallib/max/align.py,sha256=HKjCViQCuicGmtvHB6xxVv4BEGEBGtV2gO3NvR_6R2A,5183
12
14
  pyjallib/max/anim.py,sha256=scfxLSSXfFAlxgFi_qePrbONYc4mpKB8mXIxtYtFtl0,29032
13
15
  pyjallib/max/autoClavicle.py,sha256=m5rs313-qkaHfs9TUr98HYRVFdB25E_fW-YiY4o9zhE,9559
14
- pyjallib/max/bip.py,sha256=uhnNwt9EOP1ezPEBf7uIAqveBh3afzXbgr2ydJzTo0U,31471
16
+ pyjallib/max/bip.py,sha256=8BkJPZRDCCtdTIF-uripPuLp-RqHDh-PW3G6_uc3RQ8,30215
15
17
  pyjallib/max/bone.py,sha256=ImFUqdUoKeXD44rYsccJdgLClbqazraGmsv66I-tyGI,52923
16
18
  pyjallib/max/boneChain.py,sha256=qTvbnJVuBchOdOBhi8wPxPClQ-5Wbkhc7Y2H47nUjCc,5740
17
19
  pyjallib/max/constraint.py,sha256=93g-X0aZHtZMKXVKr8xMjIhbKou61yc2b3ubQKJquBs,40589
@@ -44,6 +46,21 @@ pyjallib/max/macro/jal_macro_helper.py,sha256=hd8e5x56aq7Qt0g-hP5bY0p-njVy8ja77_
44
46
  pyjallib/max/macro/jal_macro_link.py,sha256=E8i3z2xsrQiGDEz4Qoxc75hkpalzS95mOMcIic0J-Fc,1193
45
47
  pyjallib/max/macro/jal_macro_select.py,sha256=jeSFR_mqqudTTrZE1rU6qifJ4g441cYxXWcHPTWh1CU,2289
46
48
  pyjallib/max/ui/Container.py,sha256=QSk3oCqhfiR4aglSSkherRGAyPFqMRUt83L-0ENBz-s,5571
47
- pyjallib-0.1.16.dist-info/METADATA,sha256=zPdi6nX3h5VvUBW371qgdfefTHTdBY-oB4ge8nYVzQs,870
48
- pyjallib-0.1.16.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
49
- pyjallib-0.1.16.dist-info/RECORD,,
49
+ pyjallib/ue5/__init__.py,sha256=BPAnbCgyZNDtpIxMXtaWLXq47Ole0HqMMjZK5oyLizU,5189
50
+ pyjallib/ue5/disableInterchangeFrameWork.py,sha256=WHcdFP-pig0ONrYdvdNMDajfo4y-N4FUJnIOeOeQgJE,2525
51
+ pyjallib/ue5/logger.py,sha256=TMYnR6rpRjGTdwUDHPL9vtJIarFyhVmPkKWulT28lDU,7100
52
+ pyjallib/ue5/templateProcessor.py,sha256=eQMZsGPwwfC_dDjt-WDiLMZk-QqZgNKX7xA-xaNNhTU,11524
53
+ pyjallib/ue5/ConfigFiles/UE5NamingConfig.json,sha256=DHJj0pps-zfMHcUP3e-_TLv8cnyNWE2yMEyth4bF78Y,13185
54
+ pyjallib/ue5/inUnreal/__init__.py,sha256=TreHDrmgE5R6DAJm3v7e_Sdgi26XGAkuT1JzdxDRd0c,3249
55
+ pyjallib/ue5/inUnreal/animationImporter.py,sha256=3NKWf7v39sf91iVX5nus_maKt0xUEV7NQUGPnKYxhIA,5122
56
+ pyjallib/ue5/inUnreal/baseImporter.py,sha256=YYi4fliO7u3OohOimWYZHhHZ85EuFQ99h2P2ON9rflM,8088
57
+ pyjallib/ue5/inUnreal/importerSettings.py,sha256=HHeDLMy7S80S3dg48_41B8tRZTjwi9jz3lzDNvwzKmU,10065
58
+ pyjallib/ue5/inUnreal/skeletalMeshImporter.py,sha256=hVklrkmcFSTEp4gcq2TNDFMomXsyM6twI26ySqid_nE,5094
59
+ pyjallib/ue5/inUnreal/skeletonImporter.py,sha256=47-icER1WxcvnVxEizlSsk6KUP7Sd-QfVTO_auz4AB0,4675
60
+ pyjallib/ue5/templates/__init__.py,sha256=Y1lIG7NJQtytFVNDlXkW8kdxctO3C_1p39IXVhZIJw4,3346
61
+ pyjallib/ue5/templates/animImportTemplate.py,sha256=bmCSKwEYceh-oqdgz2f91JA8eezT4CyyAtyEQW5qyBQ,652
62
+ pyjallib/ue5/templates/skeletalMeshImportTemplate.py,sha256=9dKYoT9d5YbMfGmE-8FZKY5n0G8Taue0f0eme9e4Lks,689
63
+ pyjallib/ue5/templates/skeletonImportTemplate.py,sha256=23JCbXZhhwga2a4ylML8euMLcID9nWiWEVgq-2NDJkw,599
64
+ pyjallib-0.1.17.dist-info/METADATA,sha256=qh1lsR0oSdacOIkL1noz_HOSBr3X7dkxazjVGmzbpDo,870
65
+ pyjallib-0.1.17.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
66
+ pyjallib-0.1.17.dist-info/RECORD,,