Semapp 1.0.0__tar.gz → 1.0.1__tar.gz
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.
Potentially problematic release.
This version of Semapp might be problematic. Click here for more details.
- {semapp-1.0.0 → semapp-1.0.1}/PKG-INFO +8 -9
- {semapp-1.0.0 → semapp-1.0.1}/SEMapp.egg-info/PKG-INFO +8 -9
- semapp-1.0.1/SEMapp.egg-info/requires.txt +6 -0
- {semapp-1.0.0 → semapp-1.0.1}/pyproject.toml +8 -9
- {semapp-1.0.0 → semapp-1.0.1}/semapp/Plot/frame_attributes.py +23 -24
- {semapp-1.0.0 → semapp-1.0.1}/semapp/Processing/processing.py +0 -1
- {semapp-1.0.0 → semapp-1.0.1}/semapp/main.py +1 -1
- semapp-1.0.0/SEMapp.egg-info/requires.txt +0 -6
- {semapp-1.0.0 → semapp-1.0.1}/LICENSE +0 -0
- {semapp-1.0.0 → semapp-1.0.1}/README.md +0 -0
- {semapp-1.0.0 → semapp-1.0.1}/SEMapp.egg-info/SOURCES.txt +0 -0
- {semapp-1.0.0 → semapp-1.0.1}/SEMapp.egg-info/dependency_links.txt +0 -0
- {semapp-1.0.0 → semapp-1.0.1}/SEMapp.egg-info/entry_points.txt +0 -0
- {semapp-1.0.0 → semapp-1.0.1}/SEMapp.egg-info/top_level.txt +0 -0
- {semapp-1.0.0 → semapp-1.0.1}/semapp/Layout/__init__.py +0 -0
- {semapp-1.0.0 → semapp-1.0.1}/semapp/Layout/create_button.py +0 -0
- {semapp-1.0.0 → semapp-1.0.1}/semapp/Layout/main_window_att.py +0 -0
- {semapp-1.0.0 → semapp-1.0.1}/semapp/Layout/settings.py +0 -0
- {semapp-1.0.0 → semapp-1.0.1}/semapp/Layout/styles.py +0 -0
- {semapp-1.0.0 → semapp-1.0.1}/semapp/Plot/__init__.py +0 -0
- {semapp-1.0.0 → semapp-1.0.1}/semapp/Plot/styles.py +0 -0
- {semapp-1.0.0 → semapp-1.0.1}/semapp/Plot/utils.py +0 -0
- {semapp-1.0.0 → semapp-1.0.1}/semapp/Processing/__init__.py +0 -0
- {semapp-1.0.0 → semapp-1.0.1}/semapp/__init__.py +0 -0
- {semapp-1.0.0 → semapp-1.0.1}/setup.cfg +0 -0
|
@@ -1,21 +1,20 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: Semapp
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.1
|
|
4
4
|
Summary: Package for SEM visualization
|
|
5
5
|
Author-email: Thibaut Meyer <thibaut.meyer3@gmail.com>
|
|
6
|
-
License-Expression:
|
|
7
|
-
Project-URL: Homepage, https://github.com/
|
|
8
|
-
Project-URL: Issues, https://github.com/pypa/sampleproject/issues
|
|
6
|
+
License-Expression: GPL-3.0-or-later
|
|
7
|
+
Project-URL: Homepage, https://github.com/thi-mey/SEMapp
|
|
9
8
|
Keywords: SEM,GUI
|
|
10
9
|
Classifier: Programming Language :: Python :: 3
|
|
11
10
|
Classifier: Operating System :: OS Independent
|
|
12
11
|
Requires-Python: >=3.9
|
|
13
12
|
Description-Content-Type: text/markdown
|
|
14
13
|
License-File: LICENSE
|
|
15
|
-
Requires-Dist: matplotlib==3.
|
|
16
|
-
Requires-Dist: numpy
|
|
17
|
-
Requires-Dist: pandas
|
|
18
|
-
Requires-Dist: Pillow
|
|
14
|
+
Requires-Dist: matplotlib==3.10.3
|
|
15
|
+
Requires-Dist: numpy==2.2.5
|
|
16
|
+
Requires-Dist: pandas==2.2.3
|
|
17
|
+
Requires-Dist: Pillow==11.2.1
|
|
19
18
|
Requires-Dist: PyQt5==5.15.11
|
|
20
|
-
Requires-Dist: PyQt5_sip
|
|
19
|
+
Requires-Dist: PyQt5_sip==12.17.0
|
|
21
20
|
Dynamic: license-file
|
|
@@ -1,21 +1,20 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: Semapp
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.1
|
|
4
4
|
Summary: Package for SEM visualization
|
|
5
5
|
Author-email: Thibaut Meyer <thibaut.meyer3@gmail.com>
|
|
6
|
-
License-Expression:
|
|
7
|
-
Project-URL: Homepage, https://github.com/
|
|
8
|
-
Project-URL: Issues, https://github.com/pypa/sampleproject/issues
|
|
6
|
+
License-Expression: GPL-3.0-or-later
|
|
7
|
+
Project-URL: Homepage, https://github.com/thi-mey/SEMapp
|
|
9
8
|
Keywords: SEM,GUI
|
|
10
9
|
Classifier: Programming Language :: Python :: 3
|
|
11
10
|
Classifier: Operating System :: OS Independent
|
|
12
11
|
Requires-Python: >=3.9
|
|
13
12
|
Description-Content-Type: text/markdown
|
|
14
13
|
License-File: LICENSE
|
|
15
|
-
Requires-Dist: matplotlib==3.
|
|
16
|
-
Requires-Dist: numpy
|
|
17
|
-
Requires-Dist: pandas
|
|
18
|
-
Requires-Dist: Pillow
|
|
14
|
+
Requires-Dist: matplotlib==3.10.3
|
|
15
|
+
Requires-Dist: numpy==2.2.5
|
|
16
|
+
Requires-Dist: pandas==2.2.3
|
|
17
|
+
Requires-Dist: Pillow==11.2.1
|
|
19
18
|
Requires-Dist: PyQt5==5.15.11
|
|
20
|
-
Requires-Dist: PyQt5_sip
|
|
19
|
+
Requires-Dist: PyQt5_sip==12.17.0
|
|
21
20
|
Dynamic: license-file
|
|
@@ -4,7 +4,7 @@ build-backend = 'setuptools.build_meta'
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "Semapp"
|
|
7
|
-
version = "1.0.
|
|
7
|
+
version = "1.0.1"
|
|
8
8
|
authors = [
|
|
9
9
|
{ name="Thibaut Meyer", email="thibaut.meyer3@gmail.com" },
|
|
10
10
|
]
|
|
@@ -16,23 +16,22 @@ keywords = [
|
|
|
16
16
|
"GUI",
|
|
17
17
|
]
|
|
18
18
|
dependencies = [
|
|
19
|
-
"matplotlib==3.
|
|
20
|
-
"numpy
|
|
21
|
-
"pandas
|
|
22
|
-
"Pillow
|
|
19
|
+
"matplotlib==3.10.3",
|
|
20
|
+
"numpy==2.2.5",
|
|
21
|
+
"pandas==2.2.3",
|
|
22
|
+
"Pillow==11.2.1",
|
|
23
23
|
"PyQt5==5.15.11",
|
|
24
|
-
"PyQt5_sip
|
|
24
|
+
"PyQt5_sip==12.17.0",
|
|
25
25
|
]
|
|
26
26
|
classifiers = [
|
|
27
27
|
"Programming Language :: Python :: 3",
|
|
28
28
|
"Operating System :: OS Independent",
|
|
29
29
|
]
|
|
30
|
-
license = "
|
|
30
|
+
license = "GPL-3.0-or-later"
|
|
31
31
|
license-files = ["LICENSE*"]
|
|
32
32
|
|
|
33
33
|
[project.gui-scripts]
|
|
34
34
|
Semapp = "semapp.main:main"
|
|
35
35
|
|
|
36
36
|
[project.urls]
|
|
37
|
-
Homepage = "https://github.com/
|
|
38
|
-
Issues = "https://github.com/pypa/sampleproject/issues"
|
|
37
|
+
Homepage = "https://github.com/thi-mey/SEMapp"
|
|
@@ -114,41 +114,41 @@ class PlotFrame(QWidget):
|
|
|
114
114
|
dans_defect_list = False
|
|
115
115
|
|
|
116
116
|
with open(filepath, "r", encoding="utf-8") as f:
|
|
117
|
-
for
|
|
118
|
-
|
|
117
|
+
for line in f:
|
|
118
|
+
line = line.strip()
|
|
119
119
|
|
|
120
|
-
if
|
|
121
|
-
match = re.search(r"SampleSize\s+1\s+(\d+)",
|
|
120
|
+
if line.startswith("SampleSize"):
|
|
121
|
+
match = re.search(r"SampleSize\s+1\s+(\d+)", line)
|
|
122
122
|
if match:
|
|
123
123
|
data["SampleSize"] = int(match.group(1))
|
|
124
124
|
|
|
125
|
-
elif
|
|
126
|
-
match = re.search(r"DiePitch\s+([0-9.]+)\s+([0-9.]+);",
|
|
125
|
+
elif line.startswith("DiePitch"):
|
|
126
|
+
match = re.search(r"DiePitch\s+([0-9.]+)\s+([0-9.]+);", line)
|
|
127
127
|
if match:
|
|
128
128
|
data["DiePitch"]["X"] = float(match.group(1))
|
|
129
129
|
data["DiePitch"]["Y"] = float(match.group(2))
|
|
130
130
|
|
|
131
|
-
elif
|
|
132
|
-
match = re.search(r"DieOrigin\s+([0-9.]+)\s+([0-9.]+);",
|
|
131
|
+
elif line.startswith("DieOrigin"):
|
|
132
|
+
match = re.search(r"DieOrigin\s+([0-9.]+)\s+([0-9.]+);", line)
|
|
133
133
|
if match:
|
|
134
134
|
data["DieOrigin"]["X"] = float(match.group(1))
|
|
135
135
|
data["DieOrigin"]["Y"] = float(match.group(2))
|
|
136
136
|
|
|
137
|
-
elif
|
|
138
|
-
match = re.search(r"SampleCenterLocation\s+([0-9.]+)\s+([0-9.]+);",
|
|
137
|
+
elif line.startswith("SampleCenterLocation"):
|
|
138
|
+
match = re.search(r"SampleCenterLocation\s+([0-9.]+)\s+([0-9.]+);", line)
|
|
139
139
|
if match:
|
|
140
140
|
data["SampleCenterLocation"]["X"] = float(match.group(1))
|
|
141
141
|
data["SampleCenterLocation"]["Y"] = float(match.group(2))
|
|
142
142
|
|
|
143
|
-
elif
|
|
143
|
+
elif line.startswith("DefectList"):
|
|
144
144
|
dans_defect_list = True
|
|
145
145
|
continue
|
|
146
146
|
|
|
147
147
|
elif dans_defect_list:
|
|
148
|
-
if re.match(r"^\d+\s",
|
|
149
|
-
|
|
150
|
-
if len(
|
|
151
|
-
defect = {f"val{i+1}": float(val) for i, val in enumerate(
|
|
148
|
+
if re.match(r"^\d+\s", line):
|
|
149
|
+
value = line.split()
|
|
150
|
+
if len(value) >= 18:
|
|
151
|
+
defect = {f"val{i+1}": float(val) for i, val in enumerate(value[:18])}
|
|
152
152
|
data["Defects"].append(defect)
|
|
153
153
|
|
|
154
154
|
pitch_x = data["DiePitch"]["X"]
|
|
@@ -204,15 +204,15 @@ class PlotFrame(QWidget):
|
|
|
204
204
|
folder_path = os.path.join(self.button_frame.folder_var_changed(),
|
|
205
205
|
str(self.selected_wafer))
|
|
206
206
|
|
|
207
|
-
|
|
207
|
+
# Find the first .001 file in the selected folder
|
|
208
208
|
matching_files = glob.glob(os.path.join(folder_path, '*.001'))
|
|
209
209
|
|
|
210
|
-
#
|
|
210
|
+
# Sort the files to ensure consistent ordering
|
|
211
211
|
if matching_files:
|
|
212
212
|
recipe_path = matching_files[0]
|
|
213
213
|
else:
|
|
214
|
-
recipe_path = None
|
|
215
|
-
|
|
214
|
+
recipe_path = None
|
|
215
|
+
|
|
216
216
|
self.coordinates = self.extract_positions(recipe_path)
|
|
217
217
|
|
|
218
218
|
tiff_path = os.path.join(folder_path, "data.tif")
|
|
@@ -223,9 +223,8 @@ class PlotFrame(QWidget):
|
|
|
223
223
|
return
|
|
224
224
|
|
|
225
225
|
self._load_tiff(tiff_path)
|
|
226
|
-
self._update_plot()
|
|
226
|
+
self._update_plot()
|
|
227
227
|
|
|
228
|
-
# Pop-up stylisé
|
|
229
228
|
msg = QMessageBox()
|
|
230
229
|
msg.setIcon(QMessageBox.Information)
|
|
231
230
|
msg.setText(f"Wafer {self.selected_wafer} opened successfully")
|
|
@@ -304,7 +303,7 @@ class PlotFrame(QWidget):
|
|
|
304
303
|
x_coords = self.coordinates.iloc[:, 0]
|
|
305
304
|
y_coords = self.coordinates.iloc[:, 1]
|
|
306
305
|
|
|
307
|
-
#
|
|
306
|
+
# Calculate the maximum value for scaling
|
|
308
307
|
max_val = max(abs(x_coords).max(), abs(y_coords).max())
|
|
309
308
|
|
|
310
309
|
if max_val <= 5:
|
|
@@ -316,14 +315,14 @@ class PlotFrame(QWidget):
|
|
|
316
315
|
elif max_val <= 15:
|
|
317
316
|
radius = 15
|
|
318
317
|
else:
|
|
319
|
-
radius = max_val # fallback
|
|
318
|
+
radius = max_val # fallback for > 15
|
|
320
319
|
|
|
321
320
|
self.radius = radius
|
|
322
321
|
|
|
323
322
|
ax.scatter(x_coords, y_coords, color='blue', marker='o',
|
|
324
323
|
s=100, label='Positions')
|
|
325
324
|
|
|
326
|
-
|
|
325
|
+
# Set limits based on the radius
|
|
327
326
|
ax.set_xlim(-radius - 1, radius + 1)
|
|
328
327
|
ax.set_ylim(-radius - 1, radius + 1)
|
|
329
328
|
|
|
@@ -217,7 +217,6 @@ class Process:
|
|
|
217
217
|
def clean(self):
|
|
218
218
|
"""
|
|
219
219
|
Clean up the output directory by deleting any non-conforming TIFF files.
|
|
220
|
-
|
|
221
220
|
This method deletes any files that do not follow the expected naming
|
|
222
221
|
conventions (files not starting with "data" or
|
|
223
222
|
containing the word "page").
|
|
@@ -52,7 +52,7 @@ class MainWindow(QWidget): # pylint: disable=R0903
|
|
|
52
52
|
Configures the main layout, creates frames for different sections,
|
|
53
53
|
and initializes the update timer.
|
|
54
54
|
"""
|
|
55
|
-
self.setWindowTitle("
|
|
55
|
+
self.setWindowTitle("SEMapp")
|
|
56
56
|
self.setStyleSheet(f"background-color: {BACKGROUND_COLOR};")
|
|
57
57
|
|
|
58
58
|
# Create the main layout (canvas_layout)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|