kececilayout 0.2.7__tar.gz → 0.2.9__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.
- {kececilayout-0.2.7/kececilayout.egg-info → kececilayout-0.2.9}/PKG-INFO +406 -5
- {kececilayout-0.2.7 → kececilayout-0.2.9}/README.md +399 -0
- {kececilayout-0.2.7 → kececilayout-0.2.9}/kececilayout/__init__.py +3 -1
- {kececilayout-0.2.7 → kececilayout-0.2.9}/kececilayout/_version.py +3 -1
- {kececilayout-0.2.7 → kececilayout-0.2.9/kececilayout.egg-info}/PKG-INFO +406 -5
- {kececilayout-0.2.7 → kececilayout-0.2.9}/kececilayout.egg-info/requires.txt +5 -3
- {kececilayout-0.2.7 → kececilayout-0.2.9}/setup.py +14 -8
- {kececilayout-0.2.7 → kececilayout-0.2.9}/LICENSE +0 -0
- {kececilayout-0.2.7 → kececilayout-0.2.9}/MANIFEST.in +0 -0
- {kececilayout-0.2.7 → kececilayout-0.2.9}/kececilayout/kececi_layout.py +0 -0
- {kececilayout-0.2.7 → kececilayout-0.2.9}/kececilayout.egg-info/SOURCES.txt +0 -0
- {kececilayout-0.2.7 → kececilayout-0.2.9}/kececilayout.egg-info/dependency_links.txt +0 -0
- {kececilayout-0.2.7 → kececilayout-0.2.9}/kececilayout.egg-info/top_level.txt +0 -0
- {kececilayout-0.2.7 → kececilayout-0.2.9}/pyproject.toml +0 -0
- {kececilayout-0.2.7 → kececilayout-0.2.9}/setup.cfg +0 -0
- {kececilayout-0.2.7 → kececilayout-0.2.9}/tests/test_sample.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: kececilayout
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.9
|
|
4
4
|
Summary: A deterministic node placement algorithm used in graph visualization. In this layout, nodes are arranged sequentially along a defined primary axis. Each subsequent node is then alternately offset along a secondary, perpendicular axis, typically moving to one side of the primary axis and then the other. Often, the magnitude of this secondary offset increases as nodes progress along the primary axis, creating a characteristic zig-zag or serpentine pattern.
|
|
5
5
|
Home-page: https://github.com/WhiteSymmetry/kececilayout
|
|
6
6
|
Author: Mehmet Keçeci
|
|
@@ -16,12 +16,13 @@ Description-Content-Type: text/markdown
|
|
|
16
16
|
License-File: LICENSE
|
|
17
17
|
Requires-Dist: networkx
|
|
18
18
|
Requires-Dist: numpy
|
|
19
|
-
Requires-Dist: rustworkx
|
|
20
|
-
Requires-Dist: igraph
|
|
21
|
-
Requires-Dist: networkit
|
|
22
|
-
Requires-Dist: graphillion
|
|
23
19
|
Requires-Dist: pycairo
|
|
24
20
|
Requires-Dist: cairocffi
|
|
21
|
+
Provides-Extra: all
|
|
22
|
+
Requires-Dist: igraph; extra == "all"
|
|
23
|
+
Requires-Dist: networkit; extra == "all"
|
|
24
|
+
Requires-Dist: rustworkx; extra == "all"
|
|
25
|
+
Requires-Dist: graphillion; extra == "all"
|
|
25
26
|
Dynamic: author
|
|
26
27
|
Dynamic: author-email
|
|
27
28
|
Dynamic: classifier
|
|
@@ -32,6 +33,7 @@ Dynamic: license
|
|
|
32
33
|
Dynamic: license-file
|
|
33
34
|
Dynamic: maintainer
|
|
34
35
|
Dynamic: maintainer-email
|
|
36
|
+
Dynamic: provides-extra
|
|
35
37
|
Dynamic: requires-dist
|
|
36
38
|
Dynamic: requires-python
|
|
37
39
|
Dynamic: summary
|
|
@@ -52,6 +54,403 @@ Dynamic: summary
|
|
|
52
54
|
[](https://anaconda.org/bilgi/kececilayout)
|
|
53
55
|
[](https://anaconda.org/bilgi/kececilayout)
|
|
54
56
|
|
|
57
|
+
[](https://opensource.org/)
|
|
58
|
+
[](https://kececilayout.readthedocs.io/en/latest)
|
|
59
|
+
|
|
60
|
+
[](https://www.bestpractices.dev/projects/10531)
|
|
61
|
+
|
|
62
|
+
[](https://github.com/WhiteSymmetry/kececilayout/actions/workflows/python_ci.yml)
|
|
63
|
+
[](https://codecov.io/gh/WhiteSymmetry/kececilayout)
|
|
64
|
+
[](https://terrarium.evidencepub.io/v2/gh/WhiteSymmetry/kececilayout/HEAD)
|
|
65
|
+
[](https://pepy.tech/projects/kececilayout)
|
|
66
|
+
[](CODE_OF_CONDUCT.md)
|
|
67
|
+
[](https://github.com/WhiteSymmetry/kececilayout/actions/workflows/ci-cd.yml)
|
|
68
|
+
[](https://github.com/astral-sh/ruff)
|
|
69
|
+
|
|
70
|
+
| **Documentation** | **Paper** |
|
|
71
|
+
|:-----------------:|:---------:|
|
|
72
|
+
| [](https://kececilayout.readthedocs.io/) | [](https://doi.org/10.5281/zenodo.15314328) |
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## 🌐 English
|
|
77
|
+
|
|
78
|
+
### Kececi Layout (Keçeci Yerleşimi)
|
|
79
|
+
|
|
80
|
+
**KececiLayout** is a deterministic graph layout algorithm designed for visualizing linear or sequential structures with a characteristic "zig-zag" or "serpentine" pattern.
|
|
81
|
+
|
|
82
|
+
*Python implementation of the Keçeci layout algorithm for graph visualization.*
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
### Description
|
|
87
|
+
|
|
88
|
+
This algorithm arranges nodes sequentially along a primary axis and offsets them alternately along a secondary axis. It's particularly useful for path graphs, chains, or showing progression.
|
|
89
|
+
|
|
90
|
+
**Key Features:**
|
|
91
|
+
* **Linear Focus:** Ideal for visualizing paths, chains, or ordered processes.
|
|
92
|
+
* **Deterministic:** Produces identical results for the same input.
|
|
93
|
+
* **Overlap Reduction:** Prevents node collisions by spreading them across axes.
|
|
94
|
+
* **Parametric:** Fully customizable with parameters like `primary_spacing`, `secondary_spacing`, `primary_direction`, and `secondary_start`.
|
|
95
|
+
|
|
96
|
+
=> **v0.2.7**: Curved, transparent, 3D, and `expanding=True` styles supported.
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
### Installation
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
conda install bilgi::kececilayout -y
|
|
104
|
+
pip install kececilayout
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
🔗 [PyPI](https://pypi.org/project/kececilayout/) | [Conda](https://anaconda.org/bilgi/kececilayout) | [GitHub](https://github.com/WhiteSymmetry/kececilayout)
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
### Usage
|
|
112
|
+
|
|
113
|
+
#### Example with NetworkX
|
|
114
|
+
|
|
115
|
+
```python
|
|
116
|
+
import networkx as nx
|
|
117
|
+
import matplotlib.pyplot as plt
|
|
118
|
+
import kececilayout as kl
|
|
119
|
+
|
|
120
|
+
G = nx.path_graph(10)
|
|
121
|
+
pos = kl.kececi_layout_v4(
|
|
122
|
+
G,
|
|
123
|
+
primary_spacing=1.0,
|
|
124
|
+
secondary_spacing=0.5,
|
|
125
|
+
primary_direction='top-down',
|
|
126
|
+
secondary_start='right'
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
plt.figure(figsize=(6, 8))
|
|
130
|
+
nx.draw(G, pos=pos, with_labels=True, node_color='skyblue', node_size=500)
|
|
131
|
+
plt.title("Kececi Layout with NetworkX")
|
|
132
|
+
plt.axis('equal')
|
|
133
|
+
plt.show()
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+

|
|
137
|
+
|
|
138
|
+
#### Example with iGraph
|
|
139
|
+
|
|
140
|
+
```python
|
|
141
|
+
import igraph as ig
|
|
142
|
+
import matplotlib.pyplot as plt
|
|
143
|
+
from kececilayout import kececi_layout_v4_igraph
|
|
144
|
+
|
|
145
|
+
G = ig.Graph.Ring(10, circular=False)
|
|
146
|
+
pos_list = kececi_layout_v4_igraph(G, primary_direction='left-to-right', secondary_start='up')
|
|
147
|
+
layout = ig.Layout(pos_list)
|
|
148
|
+
|
|
149
|
+
fig, ax = plt.subplots(figsize=(8, 6))
|
|
150
|
+
ig.plot(G, target=ax, layout=layout, vertex_label=[f"N{i}" for i in range(10)])
|
|
151
|
+
ax.set_aspect('equal')
|
|
152
|
+
plt.show()
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+

|
|
156
|
+
|
|
157
|
+
#### Example with RustworkX
|
|
158
|
+
|
|
159
|
+
```python
|
|
160
|
+
import rustworkx as rx
|
|
161
|
+
import kececilayout as kl
|
|
162
|
+
import matplotlib.pyplot as plt
|
|
163
|
+
|
|
164
|
+
G = rx.generators.path_graph(10)
|
|
165
|
+
pos = kl.kececi_layout_v4(G, primary_direction='bottom-up')
|
|
166
|
+
# Use matplotlib for drawing (see full example in repo)
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+

|
|
170
|
+
|
|
171
|
+
#### Example with Networkit
|
|
172
|
+
|
|
173
|
+
```python
|
|
174
|
+
import networkit as nk
|
|
175
|
+
import kececilayout as kl
|
|
176
|
+
import matplotlib.pyplot as plt
|
|
177
|
+
|
|
178
|
+
G = nk.graph.Graph(10)
|
|
179
|
+
for i in range(9):
|
|
180
|
+
G.addEdge(i, i+1)
|
|
181
|
+
pos = kl.kececi_layout_v4(G)
|
|
182
|
+
# Draw with matplotlib
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+

|
|
186
|
+
|
|
187
|
+
#### Example with Graphillion
|
|
188
|
+
|
|
189
|
+
```python
|
|
190
|
+
import graphillion as gg
|
|
191
|
+
import kececilayout as kl
|
|
192
|
+
import matplotlib.pyplot as plt
|
|
193
|
+
|
|
194
|
+
universe = [(i, i+1) for i in range(1, 10)]
|
|
195
|
+
gg.GraphSet.set_universe(universe)
|
|
196
|
+
gs = gg.GraphSet()
|
|
197
|
+
pos = kl.kececi_layout_v4(gs)
|
|
198
|
+
# Draw with matplotlib
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+

|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
### Supported Backends
|
|
206
|
+
|
|
207
|
+
- **NetworkX**
|
|
208
|
+
- **igraph**
|
|
209
|
+
- **Rustworkx**
|
|
210
|
+
- **Networkit**
|
|
211
|
+
- **Graphillion**
|
|
212
|
+
|
|
213
|
+
*Note: All backends are supported via unified `kececi_layout_v4` function.*
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
### Advanced Drawing Styles
|
|
218
|
+
|
|
219
|
+
Use `draw_kececi` for enhanced visualizations:
|
|
220
|
+
|
|
221
|
+
```python
|
|
222
|
+
kl.draw_kececi(G, style='curved') # Smooth curved edges
|
|
223
|
+
kl.draw_kececi(G, style='transparent') # Opacity based on edge length
|
|
224
|
+
kl.draw_kececi(G, style='3d') # 3D helix layout
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
---
|
|
228
|
+
|
|
229
|
+
### License
|
|
230
|
+
|
|
231
|
+
MIT License. See [LICENSE](LICENSE) for details.
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
### Citation
|
|
236
|
+
|
|
237
|
+
If this library was useful in your research, please cite:
|
|
238
|
+
|
|
239
|
+
```bibtex
|
|
240
|
+
@misc{kececi_2025_15313946,
|
|
241
|
+
author = {Keçeci, Mehmet},
|
|
242
|
+
title = {kececilayout},
|
|
243
|
+
month = may,
|
|
244
|
+
year = 2025,
|
|
245
|
+
publisher = {Zenodo},
|
|
246
|
+
version = {0.2.7},
|
|
247
|
+
doi = {10.5281/zenodo.15313946},
|
|
248
|
+
url = {https://doi.org/10.5281/zenodo.15313946}
|
|
249
|
+
}
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
---
|
|
253
|
+
|
|
254
|
+
## 🇹🇷 Türkçe
|
|
255
|
+
|
|
256
|
+
### Keçeci Yerleşimi (Kececi Layout)
|
|
257
|
+
|
|
258
|
+
**KececiLayout**, doğrusal veya ardışık yapıları görselleştirmek için tasarlanmış, karakteristik bir "zıgzag" veya "yılanvari" desen oluşturan deterministik bir graf yerleşim algoritmasıdır.
|
|
259
|
+
|
|
260
|
+
*Graf görselleştirme için Keçeci yerleşim algoritmasının Python uygulaması.*
|
|
261
|
+
|
|
262
|
+
---
|
|
263
|
+
|
|
264
|
+
### Açıklama
|
|
265
|
+
|
|
266
|
+
Bu algoritma, düğümleri birincil eksen boyunca sıralı olarak yerleştirir ve ikincil eksen boyunca dönüşümlü olarak kaydırır. Yol grafları, zincirler veya ilerlemeyi göstermek için özellikle kullanışlıdır.
|
|
267
|
+
|
|
268
|
+
**Temel Özellikler:**
|
|
269
|
+
* **Doğrusal Odak:** Yollar, zincirler veya sıralı süreçler için idealdir.
|
|
270
|
+
* **Deterministik:** Aynı giriş için her zaman aynı çıktıyı üretir.
|
|
271
|
+
* **Çakışmayı Azaltma:** Düğümleri eksenler boyunca yayarak çakışmaları önler.
|
|
272
|
+
* **Parametrik:** `primary_spacing`, `secondary_spacing`, `primary_direction`, `secondary_start` gibi parametrelerle özelleştirilebilir.
|
|
273
|
+
|
|
274
|
+
=> **v0.2.7**: Eğri, şeffaf, 3B ve `expanding=True` stilleri desteklenir.
|
|
275
|
+
|
|
276
|
+
---
|
|
277
|
+
|
|
278
|
+
### Kurulum
|
|
279
|
+
|
|
280
|
+
```bash
|
|
281
|
+
conda install bilgi::kececilayout -y
|
|
282
|
+
pip install kececilayout
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
🔗 [PyPI](https://pypi.org/project/kececilayout/) | [Conda](https://anaconda.org/bilgi/kececilayout) | [GitHub](https://github.com/WhiteSymmetry/kececilayout)
|
|
286
|
+
|
|
287
|
+
---
|
|
288
|
+
|
|
289
|
+
### Kullanım
|
|
290
|
+
|
|
291
|
+
#### NetworkX ile Örnek
|
|
292
|
+
|
|
293
|
+
```python
|
|
294
|
+
import networkx as nx
|
|
295
|
+
import matplotlib.pyplot as plt
|
|
296
|
+
import kececilayout as kl
|
|
297
|
+
|
|
298
|
+
G = nx.path_graph(10)
|
|
299
|
+
pos = kl.kececi_layout_v4(
|
|
300
|
+
G,
|
|
301
|
+
primary_spacing=1.0,
|
|
302
|
+
secondary_spacing=0.5,
|
|
303
|
+
primary_direction='top-down',
|
|
304
|
+
secondary_start='right'
|
|
305
|
+
)
|
|
306
|
+
|
|
307
|
+
plt.figure(figsize=(6, 8))
|
|
308
|
+
nx.draw(G, pos=pos, with_labels=True, node_color='skyblue', node_size=500)
|
|
309
|
+
plt.title("Kececi Layout with NetworkX")
|
|
310
|
+
plt.axis('equal')
|
|
311
|
+
plt.show()
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+

|
|
315
|
+
|
|
316
|
+
#### iGraph ile Örnek
|
|
317
|
+
|
|
318
|
+
```python
|
|
319
|
+
import igraph as ig
|
|
320
|
+
import matplotlib.pyplot as plt
|
|
321
|
+
from kececilayout import kececi_layout_v4_igraph
|
|
322
|
+
|
|
323
|
+
G = ig.Graph.Ring(10, circular=False)
|
|
324
|
+
pos_list = kececi_layout_v4_igraph(G, primary_direction='left-to-right', secondary_start='up')
|
|
325
|
+
layout = ig.Layout(pos_list)
|
|
326
|
+
|
|
327
|
+
fig, ax = plt.subplots(figsize=(8, 6))
|
|
328
|
+
ig.plot(G, target=ax, layout=layout, vertex_label=[f"N{i}" for i in range(10)])
|
|
329
|
+
ax.set_aspect('equal')
|
|
330
|
+
plt.show()
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+

|
|
334
|
+
|
|
335
|
+
#### RustworkX ile Örnek
|
|
336
|
+
|
|
337
|
+
```python
|
|
338
|
+
import rustworkx as rx
|
|
339
|
+
import kececilayout as kl
|
|
340
|
+
import matplotlib.pyplot as plt
|
|
341
|
+
|
|
342
|
+
G = rx.generators.path_graph(10)
|
|
343
|
+
pos = kl.kececi_layout_v4(G, primary_direction='bottom-up')
|
|
344
|
+
# Matplotlib ile çizim yapılabilir
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+

|
|
348
|
+
|
|
349
|
+
#### Networkit ile Örnek
|
|
350
|
+
|
|
351
|
+
```python
|
|
352
|
+
import networkit as nk
|
|
353
|
+
import kececilayout as kl
|
|
354
|
+
import matplotlib.pyplot as plt
|
|
355
|
+
|
|
356
|
+
G = nk.graph.Graph(10)
|
|
357
|
+
for i in range(9):
|
|
358
|
+
G.addEdge(i, i+1)
|
|
359
|
+
pos = kl.kececi_layout_v4(G)
|
|
360
|
+
# Matplotlib ile çizim
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+

|
|
364
|
+
|
|
365
|
+
#### Graphillion ile Örnek
|
|
366
|
+
|
|
367
|
+
```python
|
|
368
|
+
import graphillion as gg
|
|
369
|
+
import kececilayout as kl
|
|
370
|
+
import matplotlib.pyplot as plt
|
|
371
|
+
|
|
372
|
+
universe = [(i, i+1) for i in range(1, 10)]
|
|
373
|
+
gg.GraphSet.set_universe(universe)
|
|
374
|
+
gs = gg.GraphSet()
|
|
375
|
+
pos = kl.kececi_layout_v4(gs)
|
|
376
|
+
# Matplotlib ile çizim
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+

|
|
380
|
+
|
|
381
|
+
---
|
|
382
|
+
|
|
383
|
+
### Desteklenen Kütüphaneler
|
|
384
|
+
|
|
385
|
+
- **NetworkX**
|
|
386
|
+
- **igraph**
|
|
387
|
+
- **Rustworkx**
|
|
388
|
+
- **Networkit**
|
|
389
|
+
- **Graphillion**
|
|
390
|
+
|
|
391
|
+
*Not: Tüm kütüphaneler `kececi_layout_v4` fonksiyonu ile desteklenir.*
|
|
392
|
+
|
|
393
|
+
---
|
|
394
|
+
|
|
395
|
+
### Gelişmiş Çizim Stilleri
|
|
396
|
+
|
|
397
|
+
`draw_kececi` ile gelişmiş görselleştirmeler:
|
|
398
|
+
|
|
399
|
+
```python
|
|
400
|
+
kl.draw_kececi(G, style='curved') # Eğri kenarlar
|
|
401
|
+
kl.draw_kececi(G, style='transparent') # Kenar uzunluğuna göre şeffaflık
|
|
402
|
+
kl.draw_kececi(G, style='3d') # 3B heliks yerleşimi
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
---
|
|
406
|
+
|
|
407
|
+
### Lisans
|
|
408
|
+
|
|
409
|
+
MIT Lisansı. Detaylar için [LICENSE](LICENSE) dosyasına bakın.
|
|
410
|
+
|
|
411
|
+
---
|
|
412
|
+
|
|
413
|
+
### Atıf
|
|
414
|
+
|
|
415
|
+
Araştırmanızda bu kütüphaneyi kullandıysanız, lütfen aşağıdaki gibi atıf yapın:
|
|
416
|
+
|
|
417
|
+
```bibtex
|
|
418
|
+
@misc{kececi_2025_15313946,
|
|
419
|
+
author = {Keçeci, Mehmet},
|
|
420
|
+
title = {kececilayout},
|
|
421
|
+
month = may,
|
|
422
|
+
year = 2025,
|
|
423
|
+
publisher = {Zenodo},
|
|
424
|
+
version = {0.2.7},
|
|
425
|
+
doi = {10.5281/zenodo.15313946},
|
|
426
|
+
url = {https://doi.org/10.5281/zenodo.15313946}
|
|
427
|
+
}
|
|
428
|
+
```
|
|
429
|
+
|
|
430
|
+
---
|
|
431
|
+
|
|
432
|
+
## 📚 Documentation
|
|
433
|
+
|
|
434
|
+
For full documentation, visit:
|
|
435
|
+
[**https://kececilayout.readthedocs.io**](https://kececilayout.readthedocs.io)
|
|
436
|
+
|
|
437
|
+
---
|
|
438
|
+
# KececiLayout
|
|
439
|
+
|
|
440
|
+
[](https://badge.fury.io/py/kececilayout)
|
|
441
|
+
[](https://opensource.org/licenses/MIT)
|
|
442
|
+
|
|
443
|
+
[](https://doi.org/10.5281/zenodo.15313946)
|
|
444
|
+
[](https://doi.org/10.5281/zenodo.15314328)
|
|
445
|
+
[](https://doi.org/10.5281/zenodo.15353535)
|
|
446
|
+
|
|
447
|
+
[](https://doi.org/10.48546/workflowhub.datafile.17.1)
|
|
448
|
+
|
|
449
|
+
[](https://anaconda.org/bilgi/kececilayout)
|
|
450
|
+
[](https://anaconda.org/bilgi/kececilayout)
|
|
451
|
+
[](https://anaconda.org/bilgi/kececilayout)
|
|
452
|
+
[](https://anaconda.org/bilgi/kececilayout)
|
|
453
|
+
|
|
55
454
|
[](https://opensource.org/)
|
|
56
455
|
[](https://kececilayout.readthedocs.io/en/latest)
|
|
57
456
|
|
|
@@ -820,3 +1219,5 @@ Keçeci, Mehmet. "Keçeci Layout". Open Science Articles (OSAs), Zenodo, 2025. h
|
|
|
820
1219
|
|
|
821
1220
|
|
|
822
1221
|
|
|
1222
|
+
|
|
1223
|
+
|