tr-yangin 0.1.0__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.
Files changed (33) hide show
  1. tr_yangin-0.1.0/CHANGELOG.md +25 -0
  2. tr_yangin-0.1.0/CITATION.cff +20 -0
  3. tr_yangin-0.1.0/LICENSE +21 -0
  4. tr_yangin-0.1.0/MANIFEST.in +9 -0
  5. tr_yangin-0.1.0/PKG-INFO +307 -0
  6. tr_yangin-0.1.0/README.md +270 -0
  7. tr_yangin-0.1.0/examples/quickstart.py +78 -0
  8. tr_yangin-0.1.0/pyproject.toml +110 -0
  9. tr_yangin-0.1.0/setup.cfg +4 -0
  10. tr_yangin-0.1.0/src/tr_yangin/__init__.py +74 -0
  11. tr_yangin-0.1.0/src/tr_yangin/__main__.py +7 -0
  12. tr_yangin-0.1.0/src/tr_yangin/_version.py +1 -0
  13. tr_yangin-0.1.0/src/tr_yangin/assess.py +1109 -0
  14. tr_yangin-0.1.0/src/tr_yangin/calc.py +228 -0
  15. tr_yangin-0.1.0/src/tr_yangin/cli.py +235 -0
  16. tr_yangin-0.1.0/src/tr_yangin/data/ornek_bina.json +58 -0
  17. tr_yangin-0.1.0/src/tr_yangin/data/yonetmelik.json +161 -0
  18. tr_yangin-0.1.0/src/tr_yangin/errors.py +17 -0
  19. tr_yangin-0.1.0/src/tr_yangin/models.py +273 -0
  20. tr_yangin-0.1.0/src/tr_yangin/py.typed +0 -0
  21. tr_yangin-0.1.0/src/tr_yangin/report.py +190 -0
  22. tr_yangin-0.1.0/src/tr_yangin/tables.py +183 -0
  23. tr_yangin-0.1.0/src/tr_yangin.egg-info/PKG-INFO +307 -0
  24. tr_yangin-0.1.0/src/tr_yangin.egg-info/SOURCES.txt +31 -0
  25. tr_yangin-0.1.0/src/tr_yangin.egg-info/dependency_links.txt +1 -0
  26. tr_yangin-0.1.0/src/tr_yangin.egg-info/entry_points.txt +2 -0
  27. tr_yangin-0.1.0/src/tr_yangin.egg-info/requires.txt +6 -0
  28. tr_yangin-0.1.0/src/tr_yangin.egg-info/top_level.txt +1 -0
  29. tr_yangin-0.1.0/tests/conftest.py +28 -0
  30. tr_yangin-0.1.0/tests/test_assess.py +487 -0
  31. tr_yangin-0.1.0/tests/test_calc.py +205 -0
  32. tr_yangin-0.1.0/tests/test_models_tables.py +243 -0
  33. tr_yangin-0.1.0/tests/test_report_cli.py +156 -0
@@ -0,0 +1,25 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ ## [Unreleased]
6
+
7
+ ## [0.1.0] - 2026-11-09
8
+ ### Added
9
+ - `assess()` early-design check of a building/storey description against the
10
+ *Binaların Yangından Korunması Hakkında Yönetmelik* (BKK 2007/12937, consolidated
11
+ text as amended up to CK 10026, 30/6/2025), producing a Turkish `Report` with
12
+ article references (text, Markdown, JSON).
13
+ - Checks: use classes and high-rise definition (Madde 4, 8-18); occupant load from
14
+ Ek-5/A (Madde 32); number of exits (Madde 39, 32(8), 48, 50, 52); exit, stair,
15
+ door and corridor widths from 50 cm units and Ek-5/B capacities (Madde 33, 47, 49);
16
+ travel distances and dead ends (Ek-5/B, Madde 48(2), 50(3)); escape stair count,
17
+ protected stairs, fire safety lobbies, pressurisation and emergency lifts
18
+ (Madde 34, 38-48, 63, 89); sprinkler (Madde 96), automatic detection (Madde 75,
19
+ Ek-7, with the Danıştay annulment noted), call points (Madde 75(2)), standpipes and
20
+ hose reels (Madde 94) and fire-brigade inlets (Madde 97).
21
+ - Calculation helpers `occupant_count`, `min_exit_count`, `exit_widths`,
22
+ `max_travel_distance`, `max_dead_end`, `min_exit_separation`, `is_high_rise`.
23
+ - All numeric values in one packaged JSON file, overridable with `load_tables()`.
24
+ - `tr-yangin` command line tool (`rapor`, `ornek`, `kullanici-yuku`, `genislik`,
25
+ `uzaklik`, `tablolar`) with Turkish help and output.
@@ -0,0 +1,20 @@
1
+ cff-version: 1.2.0
2
+ message: "If you use this software, please cite it as below."
3
+ authors:
4
+ - family-names: "Eminoğlu"
5
+ given-names: "Yusuf"
6
+ email: "geospacephilo@gmail.com"
7
+ orcid: "https://orcid.org/0009-0005-6000-2934"
8
+ title: "tr-yangin"
9
+ version: "0.1.0"
10
+ date-released: "2026-11-09"
11
+ license: "MIT"
12
+ repository-code: "https://github.com/YusufEminoglu/tr_yangin_sdk"
13
+ url: "https://pypi.org/project/tr-yangin/"
14
+ abstract: "Early-design fire-safety checks under the Turkish Regulation on the Fire Protection of Buildings (Binaların Yangından Korunması Hakkında Yönetmelik): occupant load, exits, escape widths, travel distances, stairs, and sprinkler and detection triggers, with a structured Turkish compliance report referencing the articles."
15
+ keywords:
16
+ - fire safety
17
+ - building regulations
18
+ - egress
19
+ - occupant load
20
+ - Turkey
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Yusuf Eminoğlu
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,9 @@
1
+ include LICENSE
2
+ include README.md
3
+ include CHANGELOG.md
4
+ include CITATION.cff
5
+ include pyproject.toml
6
+ include src/tr_yangin/py.typed
7
+ recursive-include src/tr_yangin *.py *.json
8
+ recursive-include tests *.py
9
+ recursive-include examples *.py *.json
@@ -0,0 +1,307 @@
1
+ Metadata-Version: 2.4
2
+ Name: tr-yangin
3
+ Version: 0.1.0
4
+ Summary: Early-design fire-safety checks under the Turkish fire protection regulation (Binaların Yangından Korunması Hakkında Yönetmelik): occupant load, exits, escape widths, travel distances, stairs, sprinkler and detection triggers, with a Turkish compliance report.
5
+ Author-email: Yusuf Eminoğlu <geospacephilo@gmail.com>
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/YusufEminoglu/tr_yangin_sdk
8
+ Project-URL: Repository, https://github.com/YusufEminoglu/tr_yangin_sdk
9
+ Project-URL: Issues, https://github.com/YusufEminoglu/tr_yangin_sdk/issues
10
+ Project-URL: Changelog, https://github.com/YusufEminoglu/tr_yangin_sdk/blob/main/CHANGELOG.md
11
+ Keywords: fire-safety,fire-protection,building-regulations,egress,occupant-load,travel-distance,turkey,yangin,yangin-yonetmeligi,kacis-yolu,architecture,urban-planning,compliance
12
+ Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.9
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Operating System :: OS Independent
20
+ Classifier: Environment :: Console
21
+ Classifier: Natural Language :: Turkish
22
+ Classifier: Topic :: Scientific/Engineering
23
+ Classifier: Topic :: Utilities
24
+ Classifier: Intended Audience :: Science/Research
25
+ Classifier: Intended Audience :: Developers
26
+ Classifier: Intended Audience :: Other Audience
27
+ Classifier: Typing :: Typed
28
+ Requires-Python: >=3.9
29
+ Description-Content-Type: text/markdown
30
+ License-File: LICENSE
31
+ Provides-Extra: dev
32
+ Requires-Dist: pytest>=7.0.0; extra == "dev"
33
+ Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
34
+ Requires-Dist: ruff>=0.1.0; extra == "dev"
35
+ Requires-Dist: mypy>=1.0.0; extra == "dev"
36
+ Dynamic: license-file
37
+
38
+ # tr-yangin
39
+
40
+ [![PyPI version](https://img.shields.io/pypi/v/tr-yangin.svg)](https://pypi.org/project/tr-yangin/)
41
+ [![Python versions](https://img.shields.io/pypi/pyversions/tr-yangin.svg)](https://pypi.org/project/tr-yangin/)
42
+ [![CI](https://github.com/YusufEminoglu/tr_yangin_sdk/actions/workflows/ci.yml/badge.svg)](https://github.com/YusufEminoglu/tr_yangin_sdk/actions/workflows/ci.yml)
43
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/YusufEminoglu/tr_yangin_sdk/blob/main/LICENSE)
44
+
45
+ **English summary.** `tr-yangin` runs early-design fire-safety checks under the
46
+ Turkish *Regulation on the Fire Protection of Buildings* (Binaların Yangından
47
+ Korunması Hakkında Yönetmelik, BKK 2007/12937, consolidated text as amended up to
48
+ 30/6/2025): occupant load, number and width of exits, travel distances, stair
49
+ types, and the height/use triggers for protected stairs, fire lobbies,
50
+ pressurisation, sprinklers and fire detection. A building/storey description goes
51
+ in, a structured Turkish compliance report with article references comes out (text,
52
+ Markdown or JSON, also via a CLI). It is a preliminary design aid and does not
53
+ replace fire-brigade (itfaiye) approval.
54
+
55
+ ---
56
+
57
+ **Binaların Yangından Korunması Hakkında Yönetmelik'e göre erken tasarım kontrolleri.**
58
+
59
+ `tr-yangin`, mimari ve kentsel tasarımın ilk aşamasında bir bina veya kat
60
+ tanımını alır ve Yönetmelik'in kaçış ve aktif korunma hükümlerine göre madde
61
+ numaralı, yapılandırılmış bir Türkçe uygunluk raporu üretir:
62
+
63
+ - **Bina sınıfı ve yükseklik:** kullanım sınıfları (Madde 8-18), *bina yüksekliği*,
64
+ *yapı yüksekliği* ve *yüksek bina* tanımları (Madde 4).
65
+ - **Kullanıcı yükü:** Ek-5/A katsayılarıyla mekân ve kat kişi sayısı (Madde 32(1)).
66
+ - **Çıkış sayısı:** Madde 39 (50 / 500 / 1000 kişi eşikleri; yüksek tehlikede 25),
67
+ Madde 32(8), 48, 50, 52 istisnaları.
68
+ - **Kaçış genişlikleri:** 50 cm birim genişlik ve Ek-5/B birim kapasiteleriyle
69
+ kapı, merdiven, koridor/rampa toplam genişlikleri; 80 / 100 / 150 / 200 cm ve
70
+ yüksek binada 120 cm alt sınırları (Madde 32-33, 47, 49).
71
+ - **Kaçış uzaklıkları:** tek yön / iki yön, yağmurlamalı / yağmurlamasız ve
72
+ çıkmaz koridor sınırları (Ek-5/B), konut daire içi (Madde 48(2)) ve otel odası
73
+ (Madde 50(3)) sınırları.
74
+ - **Merdivenler:** gerekli kaçış merdiveni sayısı, korunumlu merdiven, yangın
75
+ güvenlik holü, basınçlandırma, acil durum asansörü, dengelenmiş ve dış açık
76
+ merdiven yasakları (Madde 34, 38-48, 63, 89).
77
+ - **Aktif sistemler:** yağmurlama (Madde 96), otomatik algılama (Madde 75, Ek-7),
78
+ yangın uyarı butonları (Madde 75(2)), itfaiye su alma hattı ve yangın dolapları
79
+ (Madde 94), itfaiye su verme bağlantısı (Madde 97).
80
+
81
+ Bütün sayısal değerler **tek bir JSON veri dosyasında** durur ve kullanıcı
82
+ tarafından kısmen geçersiz kılınabilir. Paketin çalışması için yalnızca Python
83
+ standart kütüphanesi yeterlidir.
84
+
85
+ > **Uyarı.** Bu paket bir **ön tasarım yardımcısıdır**. İtfaiye onayının, yangın
86
+ > danışmanının veya proje müellifinin incelemesinin ve ilgili idarenin kararının
87
+ > yerine geçmez. Yönetmelik metninin güncel hâlini ve yerel itfaiye uygulamalarını
88
+ > mutlaka kontrol edin.
89
+
90
+ ## Kurulum
91
+
92
+ ```bash
93
+ pip install tr-yangin
94
+ ```
95
+
96
+ Python 3.9 veya üstü gerekir. Bağımlılık yoktur.
97
+
98
+ ## Hızlı başlangıç (komut satırı)
99
+
100
+ ```bash
101
+ tr-yangin ornek -o bina.json # örnek bina tanımı
102
+ tr-yangin rapor bina.json # Türkçe metin raporu
103
+ tr-yangin rapor bina.json --bicim md -o rapor.md
104
+ tr-yangin rapor bina.json --bicim json --siki # uygunsuzlukta çıkış kodu 1
105
+
106
+ tr-yangin kullanici-yuku --kullanim ofis --alan 1200 # 120 kişi
107
+ tr-yangin genislik --kisi 300 --sinif buro # gerekli genişlikler
108
+ tr-yangin uzaklik --sinif buro --iki-yon --yagmurlama # 75 m
109
+ tr-yangin tablolar # sınıf ve Ek-5/A anahtarları
110
+ tr-yangin --tablolar benim_tablom.json rapor bina.json # tablo geçersiz kılma
111
+ ```
112
+
113
+ Bina tanımı (Türkçe veya İngilizce anahtarlar kabul edilir):
114
+
115
+ ```json
116
+ {
117
+ "ad": "Örnek büro binası",
118
+ "kullanim_sinifi": "buro",
119
+ "bina_yuksekligi_m": 18.6,
120
+ "yapi_yuksekligi_m": 22.4,
121
+ "yanmaz_yapim": true,
122
+ "katlar": [
123
+ {
124
+ "kat": 1,
125
+ "mekanlar": [
126
+ {"ad": "Açık ofis", "kullanim": "ofis", "alan_m2": 520},
127
+ {"ad": "Toplantı salonu", "kullanim": "toplanti_salonu", "alan_m2": 60}
128
+ ],
129
+ "cikis_sayisi": 2, "merdiven_sayisi": 2, "merdiven_genisligi_m": 1.2,
130
+ "kapi_genisligi_m": 0.9, "koridor_genisligi_m": 1.4,
131
+ "kacis_uzakligi_m": 41, "iki_yonlu": true, "cikmaz_koridor_m": 9
132
+ }
133
+ ]
134
+ }
135
+ ```
136
+
137
+ Rapordan bir kesit:
138
+
139
+ ```text
140
+ KULLANICI YÜKÜ
141
+ --------------
142
+ [BİLGİ] [1. kat] Kat kullanıcı yükü 92 kişi. Açık ofis: 520 m² brüt / 10 m²/kişi = 52 kişi (Ek-5/A satır 11); Toplantı salonu: 60 m² net / 1.5 m²/kişi = 40 kişi (Ek-5/A satır 1)
143
+
144
+ ÇIKIŞ SAYISI VE KAÇIŞ GENİŞLİKLERİ
145
+ ----------------------------------
146
+ [UYGUN DEĞİL] [1. kat] Çıkış kapısı temiz genişliği (yükseklik en az 200 cm); en az genişlik: 92 kişilik kat için 100 cm (Madde 33(1) kişi bandı).
147
+ gereken: ≥ 1.00 m | mevcut: 0.90 m | dayanak: Madde 33(1), (5)(b); Madde 47(1)
148
+ ```
149
+
150
+ Durumlar: `UYGUN`, `UYGUN DEĞİL`, `GEREKLİ`, `GEREKLİ DEĞİL`, `BİLGİ`, `VERİ YOK`
151
+ (eksik veri bir uygunsuzluk sayılmaz, ayrıca raporlanır).
152
+
153
+ ## Hızlı başlangıç (Python)
154
+
155
+ ```python
156
+ from tr_yangin import Building, Storey, Space, assess, occupant_count, exit_widths
157
+
158
+ occupant_count("ofis", 1200) # 120 (Ek-5/A: 10 m²/kişi, brüt)
159
+ w = exit_widths(300, "buro") # Madde 33(1), Ek-5/B
160
+ w.stair_total_m, w.min_single_exit_m # (2.5, 1.0) -> 300/60 x 0.50 m
161
+
162
+ bina = Building(
163
+ use_class="buro", building_height_m=18.6, structure_height_m=22.4,
164
+ noncombustible_construction=True,
165
+ storeys=[
166
+ Storey(level=0, spaces=[Space(use="ofis", area_m2=600)], exits=2,
167
+ door_width_m=1.0, travel_distance_m=30, two_way=True),
168
+ Storey(level=1, spaces=[Space(use="ofis", area_m2=600)], exits=2, stairs=2,
169
+ stair_width_m=1.2, travel_distance_m=41, two_way=True),
170
+ ],
171
+ )
172
+ rapor = assess(bina)
173
+ print(rapor.to_text()) # veya to_markdown(), to_json(), to_dict()
174
+ rapor.ok, len(rapor.failures), [f.reference for f in rapor.requirements]
175
+ ```
176
+
177
+ Daha uzun bir örnek için `examples/quickstart.py` dosyasına bakın.
178
+
179
+ ## API özeti
180
+
181
+ | Nesne | Açıklama |
182
+ |---|---|
183
+ | `assess(bina, tables=None) -> Report` | Bütün kontrolleri çalıştırır. `bina` bir `Building` veya sözlük olabilir. |
184
+ | `Building`, `Storey`, `Space` | Girdi modeli; `Building.from_dict` Türkçe anahtarları da kabul eder. |
185
+ | `Report` | `findings`, `failures`, `requirements`, `ok`, `counts()`, `to_text()`, `to_markdown()`, `to_json()`, `to_dict()`. |
186
+ | `Finding`, `Status` | Bir bulgu: konu, kat, durum, açıklama, gereken, mevcut, dayanak (madde). |
187
+ | `occupant_count(kullanim, alan, beyan=None)` | Ek-5/A kullanıcı yükü (yukarı yuvarlanır; beyan büyükse o esas). |
188
+ | `min_exit_count(kisi, yuksek_tehlike=False)` | Madde 39(2) çıkış sayısı. |
189
+ | `exit_widths(kisi, sinif, yuksek_bina=False)` | Madde 32-33 ve Ek-5/B genişlikleri (`ExitWidths`). |
190
+ | `max_travel_distance(sinif, iki_yon, yagmurlama, dusuk_alevlenir=False)` | Ek-5/B en fazla kaçış uzaklığı. |
191
+ | `max_dead_end`, `min_exit_separation`, `is_high_rise` | Çıkmaz koridor, Madde 39(3) çıkışlar arası uzaklık, yüksek bina testi. |
192
+ | `load_tables(override)` / `Tables` | Veri dosyasını yükler; sözlük veya JSON dosyasıyla derin birleştirme yapar. |
193
+ | `example_building()` | Paketle gelen örnek bina tanımı. |
194
+
195
+ ### Kullanım sınıfları (`kullanim_sinifi`)
196
+
197
+ `konut`, `otel`, `yurt`, `egitim`, `saglik` (yataklı), `ayakta_tedavi`, `buro`,
198
+ `ticaret`, `endustri`, `toplanma`, `depo`, `otopark`, `yuksek_tehlike`.
199
+ Her sınıf bir Ek-5/B satırına ve (varsa) bir Ek-7 satırına bağlıdır.
200
+ Karışık kullanımlı binalarda Madde 18 gereği daha sıkı sınıfı seçin veya
201
+ yangın bölmesiyle ayrılmış bölümleri ayrı ayrı değerlendirin.
202
+
203
+ ### Ek-5/A mekân kullanımları (`kullanim`)
204
+
205
+ `toplanti_salonu` (1.5, net), `dans_oturma` (1.0, net), `dans_ayakta` (0.5, net),
206
+ `sergi_studyo` (1.5, net), `terminal_bekleme` (3, net), `derslik` (1.5),
207
+ `resepsiyon` (3), `spor` (3), `magaza` (5), `galeri_muze` (5), `fitness_okuma` (5),
208
+ `ofis` (10), `ogrenci_yatak` (10), `uretim` (10), `hastane_yatak` (20),
209
+ `mutfak` (10), `otel_yatak` (20), `hastane_lab` (20), `muayene` (5), `depo` (30),
210
+ `otopark` (30) m²/kişi. Ek-5/A'da konut satırı yoktur: konutlarda kişi sayısını
211
+ `kisi` alanıyla verin veya tabloya kendi varsayımınızı ekleyin.
212
+
213
+ ### Tabloları geçersiz kılma
214
+
215
+ ```python
216
+ from tr_yangin import load_tables, assess
217
+
218
+ tb = load_tables({
219
+ "thresholds": {"high_rise_rule": "and"}, # yüksek bina: iki şart birlikte
220
+ "occupant_load_factors": {"konut": {"row": "-", "label": "Konut (varsayım)",
221
+ "m2_per_person": 20, "area_basis": "brut"}},
222
+ })
223
+ rapor = assess(bina, tb)
224
+ ```
225
+
226
+ Komut satırında aynı yapı `--tablolar dosya.json` ile verilir. Bütün tablo
227
+ `tr-yangin tablolar --json` ile görülebilir.
228
+
229
+ ## Yöntem ve kaynaklar
230
+
231
+ Birincil kaynak, mevzuat.gov.tr'deki derlenmiş metindir:
232
+ *Binaların Yangından Korunması Hakkında Yönetmelik*, Bakanlar Kurulu Kararı
233
+ 27/11/2007 No 2007/12937, Resmî Gazete 19/12/2007 No 26735; değişiklikler
234
+ 2009/15316, 2012/2958, 2015/7401, 2017/10459, 2018/11347, CK 3167 (2020),
235
+ CK 4825 (2021) ve CK 10026 (30/6/2025, Geçici Madde 4).
236
+ <https://www.mevzuat.gov.tr/mevzuat?MevzuatNo=200712937&MevzuatTur=21&MevzuatTertip=5>
237
+ (metin 9 Kasım 2026'da kontrol edildi).
238
+
239
+ Kullanılan hükümler: Madde 4 (tanımlar), 8-18 (kullanım sınıfları), 31-33
240
+ (kaçış yolları, kullanıcı yükü, çıkış genişliği), 34 (yangın güvenlik holü),
241
+ 38-48 (kaçış merdivenleri, çıkış sayısı, kapılar, konutlar), 49-52 (sağlık,
242
+ oteller, toplanma, büro/mağaza/fabrika), 63 (acil durum asansörü), 75 ve 81
243
+ (algılama ve uyarı), 89 (basınçlandırma), 94 (itfaiye su alma hattı, yangın
244
+ dolapları), 96 (yağmurlama), 97 (itfaiye su verme bağlantısı); Ek-5/A, Ek-5/B,
245
+ Ek-7. Ek-5/B'nin hastaneler satırındaki merdiven kapasitesi değişiklikle
246
+ 30 kişidir. Ek-7'nin kurumsal, ticaret, endüstri ve toplanma satırları Danıştay
247
+ 10. Dairesinin 28/12/2021 tarihli E.2019/261 K.2021/5537 sayılı kararıyla iptal
248
+ edilmiştir (İDDK 22/2/2023 onama); bu sınıflar için rapor bunu belirtir.
249
+
250
+ Hesap kuralları:
251
+
252
+ - Kişi sayısı = ⌈alan / katsayı⌉; beyan edilen kişi sayısı büyükse o esas alınır
253
+ (Ek-5/A notu). Ek-5/A'nın 1-4. satırları net, diğerleri brüt alanla çalışır.
254
+ - Toplam gerekli genişlik = kişi / birim kapasite × 0.50 m (Madde 33(1)).
255
+ Değer, 50 cm'lik tam birimlere yuvarlanmaz.
256
+ - Merdiven genişliği kat bazında, o katın kullanıcı yüküyle kontrol edilir;
257
+ iki çıkış gereken durumda her merdiven yükün yarısını taşımalıdır (Madde 33(4)).
258
+ - Yağmurlama durumu verilmezse, sistem yalnızca Madde 96'nın zorunlu kıldığı
259
+ durumda var kabul edilir ve kaçış uzaklıkları buna göre seçilir.
260
+
261
+ ## Sınırlamalar ve yorumlar
262
+
263
+ - **Yüksek bina tanımı** ("bina yüksekliği 21.50 m'den, yapı yüksekliği 30.50
264
+ m'den fazla") iki şartın birlikte mi ayrı ayrı mı arandığını açıkça söylemez.
265
+ Varsayılan ihtiyatlı yorum "**veya**"dır; `high_rise_rule: "and"` ile değiştirilebilir.
266
+ - **Sınır değerler:** Madde 48(5)'teki 21.50 / 30.50 / 51.50 m eşiklerine tam
267
+ eşit yükseklikler bir üst (daha sıkı) banda alınır; Madde 47(3)'te tam 4 kat
268
+ 90 dk kapı ister; Madde 50'de tam 20 yatak iki çıkış ister.
269
+ - **Madde 96(2)(d)**'deki "katlı" şartı ihtiyaten aranmaz; toplanma sınıfı
270
+ "eğlence yeri" olarak bu bende dahil edilir.
271
+ - **Madde 89(1)** merdiven kovası yüksekliğini esas alır; paket yapı
272
+ yüksekliğini vekil değer olarak kullanır. Madde 48(7)-(8) uyarınca bodrum veya
273
+ çatı arası hariç tutulacaksa `konut_merdiven_yuksekligi_m` alanını kullanın.
274
+ - **Madde 75(2)** kat sayısı bodrumlar dahil sayılır.
275
+ - Geometri (kaçış uzaklığı, köşegen, genişlikler) kullanıcı tarafından ölçülüp
276
+ girilir; paket plan çizimi okumaz ve yol bulma yapmaz.
277
+ - Kapsam dışı: yapı elemanlarının yangın dayanımları (Ek-3), kompartıman alanları
278
+ (Ek-4), malzeme sınıfları (Ek-2), koltuk sıraları (Ek-6), su deposu ve pompa
279
+ hesapları (Ek-8), tehlikeli maddeler (Sekizinci Kısım), mevcut yapılara özel
280
+ hükümler (Onuncu Kısım), cezaevleri, açık otoparklar.
281
+ - Yönetmelik değişebilir. Tablo dosyası güncel değilse `load_tables` ile düzeltin.
282
+
283
+ ## Geliştirme
284
+
285
+ ```bash
286
+ pip install -e ".[dev]"
287
+ python -m pytest
288
+ python -m ruff check . && python -m ruff format --check src tests
289
+ python -m mypy src
290
+ ```
291
+
292
+ ## Akademik atıf
293
+
294
+ ```bibtex
295
+ @software{eminoglu_tr_yangin,
296
+ author = {Eminoğlu, Yusuf},
297
+ title = {tr-yangin},
298
+ year = {2026},
299
+ version = {0.1.0},
300
+ url = {https://github.com/YusufEminoglu/tr_yangin_sdk}
301
+ }
302
+ ```
303
+
304
+ ## Lisans
305
+
306
+ MIT. Ayrıntılar için [LICENSE](LICENSE) dosyasına bakın. İletişim:
307
+ geospacephilo@gmail.com
@@ -0,0 +1,270 @@
1
+ # tr-yangin
2
+
3
+ [![PyPI version](https://img.shields.io/pypi/v/tr-yangin.svg)](https://pypi.org/project/tr-yangin/)
4
+ [![Python versions](https://img.shields.io/pypi/pyversions/tr-yangin.svg)](https://pypi.org/project/tr-yangin/)
5
+ [![CI](https://github.com/YusufEminoglu/tr_yangin_sdk/actions/workflows/ci.yml/badge.svg)](https://github.com/YusufEminoglu/tr_yangin_sdk/actions/workflows/ci.yml)
6
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/YusufEminoglu/tr_yangin_sdk/blob/main/LICENSE)
7
+
8
+ **English summary.** `tr-yangin` runs early-design fire-safety checks under the
9
+ Turkish *Regulation on the Fire Protection of Buildings* (Binaların Yangından
10
+ Korunması Hakkında Yönetmelik, BKK 2007/12937, consolidated text as amended up to
11
+ 30/6/2025): occupant load, number and width of exits, travel distances, stair
12
+ types, and the height/use triggers for protected stairs, fire lobbies,
13
+ pressurisation, sprinklers and fire detection. A building/storey description goes
14
+ in, a structured Turkish compliance report with article references comes out (text,
15
+ Markdown or JSON, also via a CLI). It is a preliminary design aid and does not
16
+ replace fire-brigade (itfaiye) approval.
17
+
18
+ ---
19
+
20
+ **Binaların Yangından Korunması Hakkında Yönetmelik'e göre erken tasarım kontrolleri.**
21
+
22
+ `tr-yangin`, mimari ve kentsel tasarımın ilk aşamasında bir bina veya kat
23
+ tanımını alır ve Yönetmelik'in kaçış ve aktif korunma hükümlerine göre madde
24
+ numaralı, yapılandırılmış bir Türkçe uygunluk raporu üretir:
25
+
26
+ - **Bina sınıfı ve yükseklik:** kullanım sınıfları (Madde 8-18), *bina yüksekliği*,
27
+ *yapı yüksekliği* ve *yüksek bina* tanımları (Madde 4).
28
+ - **Kullanıcı yükü:** Ek-5/A katsayılarıyla mekân ve kat kişi sayısı (Madde 32(1)).
29
+ - **Çıkış sayısı:** Madde 39 (50 / 500 / 1000 kişi eşikleri; yüksek tehlikede 25),
30
+ Madde 32(8), 48, 50, 52 istisnaları.
31
+ - **Kaçış genişlikleri:** 50 cm birim genişlik ve Ek-5/B birim kapasiteleriyle
32
+ kapı, merdiven, koridor/rampa toplam genişlikleri; 80 / 100 / 150 / 200 cm ve
33
+ yüksek binada 120 cm alt sınırları (Madde 32-33, 47, 49).
34
+ - **Kaçış uzaklıkları:** tek yön / iki yön, yağmurlamalı / yağmurlamasız ve
35
+ çıkmaz koridor sınırları (Ek-5/B), konut daire içi (Madde 48(2)) ve otel odası
36
+ (Madde 50(3)) sınırları.
37
+ - **Merdivenler:** gerekli kaçış merdiveni sayısı, korunumlu merdiven, yangın
38
+ güvenlik holü, basınçlandırma, acil durum asansörü, dengelenmiş ve dış açık
39
+ merdiven yasakları (Madde 34, 38-48, 63, 89).
40
+ - **Aktif sistemler:** yağmurlama (Madde 96), otomatik algılama (Madde 75, Ek-7),
41
+ yangın uyarı butonları (Madde 75(2)), itfaiye su alma hattı ve yangın dolapları
42
+ (Madde 94), itfaiye su verme bağlantısı (Madde 97).
43
+
44
+ Bütün sayısal değerler **tek bir JSON veri dosyasında** durur ve kullanıcı
45
+ tarafından kısmen geçersiz kılınabilir. Paketin çalışması için yalnızca Python
46
+ standart kütüphanesi yeterlidir.
47
+
48
+ > **Uyarı.** Bu paket bir **ön tasarım yardımcısıdır**. İtfaiye onayının, yangın
49
+ > danışmanının veya proje müellifinin incelemesinin ve ilgili idarenin kararının
50
+ > yerine geçmez. Yönetmelik metninin güncel hâlini ve yerel itfaiye uygulamalarını
51
+ > mutlaka kontrol edin.
52
+
53
+ ## Kurulum
54
+
55
+ ```bash
56
+ pip install tr-yangin
57
+ ```
58
+
59
+ Python 3.9 veya üstü gerekir. Bağımlılık yoktur.
60
+
61
+ ## Hızlı başlangıç (komut satırı)
62
+
63
+ ```bash
64
+ tr-yangin ornek -o bina.json # örnek bina tanımı
65
+ tr-yangin rapor bina.json # Türkçe metin raporu
66
+ tr-yangin rapor bina.json --bicim md -o rapor.md
67
+ tr-yangin rapor bina.json --bicim json --siki # uygunsuzlukta çıkış kodu 1
68
+
69
+ tr-yangin kullanici-yuku --kullanim ofis --alan 1200 # 120 kişi
70
+ tr-yangin genislik --kisi 300 --sinif buro # gerekli genişlikler
71
+ tr-yangin uzaklik --sinif buro --iki-yon --yagmurlama # 75 m
72
+ tr-yangin tablolar # sınıf ve Ek-5/A anahtarları
73
+ tr-yangin --tablolar benim_tablom.json rapor bina.json # tablo geçersiz kılma
74
+ ```
75
+
76
+ Bina tanımı (Türkçe veya İngilizce anahtarlar kabul edilir):
77
+
78
+ ```json
79
+ {
80
+ "ad": "Örnek büro binası",
81
+ "kullanim_sinifi": "buro",
82
+ "bina_yuksekligi_m": 18.6,
83
+ "yapi_yuksekligi_m": 22.4,
84
+ "yanmaz_yapim": true,
85
+ "katlar": [
86
+ {
87
+ "kat": 1,
88
+ "mekanlar": [
89
+ {"ad": "Açık ofis", "kullanim": "ofis", "alan_m2": 520},
90
+ {"ad": "Toplantı salonu", "kullanim": "toplanti_salonu", "alan_m2": 60}
91
+ ],
92
+ "cikis_sayisi": 2, "merdiven_sayisi": 2, "merdiven_genisligi_m": 1.2,
93
+ "kapi_genisligi_m": 0.9, "koridor_genisligi_m": 1.4,
94
+ "kacis_uzakligi_m": 41, "iki_yonlu": true, "cikmaz_koridor_m": 9
95
+ }
96
+ ]
97
+ }
98
+ ```
99
+
100
+ Rapordan bir kesit:
101
+
102
+ ```text
103
+ KULLANICI YÜKÜ
104
+ --------------
105
+ [BİLGİ] [1. kat] Kat kullanıcı yükü 92 kişi. Açık ofis: 520 m² brüt / 10 m²/kişi = 52 kişi (Ek-5/A satır 11); Toplantı salonu: 60 m² net / 1.5 m²/kişi = 40 kişi (Ek-5/A satır 1)
106
+
107
+ ÇIKIŞ SAYISI VE KAÇIŞ GENİŞLİKLERİ
108
+ ----------------------------------
109
+ [UYGUN DEĞİL] [1. kat] Çıkış kapısı temiz genişliği (yükseklik en az 200 cm); en az genişlik: 92 kişilik kat için 100 cm (Madde 33(1) kişi bandı).
110
+ gereken: ≥ 1.00 m | mevcut: 0.90 m | dayanak: Madde 33(1), (5)(b); Madde 47(1)
111
+ ```
112
+
113
+ Durumlar: `UYGUN`, `UYGUN DEĞİL`, `GEREKLİ`, `GEREKLİ DEĞİL`, `BİLGİ`, `VERİ YOK`
114
+ (eksik veri bir uygunsuzluk sayılmaz, ayrıca raporlanır).
115
+
116
+ ## Hızlı başlangıç (Python)
117
+
118
+ ```python
119
+ from tr_yangin import Building, Storey, Space, assess, occupant_count, exit_widths
120
+
121
+ occupant_count("ofis", 1200) # 120 (Ek-5/A: 10 m²/kişi, brüt)
122
+ w = exit_widths(300, "buro") # Madde 33(1), Ek-5/B
123
+ w.stair_total_m, w.min_single_exit_m # (2.5, 1.0) -> 300/60 x 0.50 m
124
+
125
+ bina = Building(
126
+ use_class="buro", building_height_m=18.6, structure_height_m=22.4,
127
+ noncombustible_construction=True,
128
+ storeys=[
129
+ Storey(level=0, spaces=[Space(use="ofis", area_m2=600)], exits=2,
130
+ door_width_m=1.0, travel_distance_m=30, two_way=True),
131
+ Storey(level=1, spaces=[Space(use="ofis", area_m2=600)], exits=2, stairs=2,
132
+ stair_width_m=1.2, travel_distance_m=41, two_way=True),
133
+ ],
134
+ )
135
+ rapor = assess(bina)
136
+ print(rapor.to_text()) # veya to_markdown(), to_json(), to_dict()
137
+ rapor.ok, len(rapor.failures), [f.reference for f in rapor.requirements]
138
+ ```
139
+
140
+ Daha uzun bir örnek için `examples/quickstart.py` dosyasına bakın.
141
+
142
+ ## API özeti
143
+
144
+ | Nesne | Açıklama |
145
+ |---|---|
146
+ | `assess(bina, tables=None) -> Report` | Bütün kontrolleri çalıştırır. `bina` bir `Building` veya sözlük olabilir. |
147
+ | `Building`, `Storey`, `Space` | Girdi modeli; `Building.from_dict` Türkçe anahtarları da kabul eder. |
148
+ | `Report` | `findings`, `failures`, `requirements`, `ok`, `counts()`, `to_text()`, `to_markdown()`, `to_json()`, `to_dict()`. |
149
+ | `Finding`, `Status` | Bir bulgu: konu, kat, durum, açıklama, gereken, mevcut, dayanak (madde). |
150
+ | `occupant_count(kullanim, alan, beyan=None)` | Ek-5/A kullanıcı yükü (yukarı yuvarlanır; beyan büyükse o esas). |
151
+ | `min_exit_count(kisi, yuksek_tehlike=False)` | Madde 39(2) çıkış sayısı. |
152
+ | `exit_widths(kisi, sinif, yuksek_bina=False)` | Madde 32-33 ve Ek-5/B genişlikleri (`ExitWidths`). |
153
+ | `max_travel_distance(sinif, iki_yon, yagmurlama, dusuk_alevlenir=False)` | Ek-5/B en fazla kaçış uzaklığı. |
154
+ | `max_dead_end`, `min_exit_separation`, `is_high_rise` | Çıkmaz koridor, Madde 39(3) çıkışlar arası uzaklık, yüksek bina testi. |
155
+ | `load_tables(override)` / `Tables` | Veri dosyasını yükler; sözlük veya JSON dosyasıyla derin birleştirme yapar. |
156
+ | `example_building()` | Paketle gelen örnek bina tanımı. |
157
+
158
+ ### Kullanım sınıfları (`kullanim_sinifi`)
159
+
160
+ `konut`, `otel`, `yurt`, `egitim`, `saglik` (yataklı), `ayakta_tedavi`, `buro`,
161
+ `ticaret`, `endustri`, `toplanma`, `depo`, `otopark`, `yuksek_tehlike`.
162
+ Her sınıf bir Ek-5/B satırına ve (varsa) bir Ek-7 satırına bağlıdır.
163
+ Karışık kullanımlı binalarda Madde 18 gereği daha sıkı sınıfı seçin veya
164
+ yangın bölmesiyle ayrılmış bölümleri ayrı ayrı değerlendirin.
165
+
166
+ ### Ek-5/A mekân kullanımları (`kullanim`)
167
+
168
+ `toplanti_salonu` (1.5, net), `dans_oturma` (1.0, net), `dans_ayakta` (0.5, net),
169
+ `sergi_studyo` (1.5, net), `terminal_bekleme` (3, net), `derslik` (1.5),
170
+ `resepsiyon` (3), `spor` (3), `magaza` (5), `galeri_muze` (5), `fitness_okuma` (5),
171
+ `ofis` (10), `ogrenci_yatak` (10), `uretim` (10), `hastane_yatak` (20),
172
+ `mutfak` (10), `otel_yatak` (20), `hastane_lab` (20), `muayene` (5), `depo` (30),
173
+ `otopark` (30) m²/kişi. Ek-5/A'da konut satırı yoktur: konutlarda kişi sayısını
174
+ `kisi` alanıyla verin veya tabloya kendi varsayımınızı ekleyin.
175
+
176
+ ### Tabloları geçersiz kılma
177
+
178
+ ```python
179
+ from tr_yangin import load_tables, assess
180
+
181
+ tb = load_tables({
182
+ "thresholds": {"high_rise_rule": "and"}, # yüksek bina: iki şart birlikte
183
+ "occupant_load_factors": {"konut": {"row": "-", "label": "Konut (varsayım)",
184
+ "m2_per_person": 20, "area_basis": "brut"}},
185
+ })
186
+ rapor = assess(bina, tb)
187
+ ```
188
+
189
+ Komut satırında aynı yapı `--tablolar dosya.json` ile verilir. Bütün tablo
190
+ `tr-yangin tablolar --json` ile görülebilir.
191
+
192
+ ## Yöntem ve kaynaklar
193
+
194
+ Birincil kaynak, mevzuat.gov.tr'deki derlenmiş metindir:
195
+ *Binaların Yangından Korunması Hakkında Yönetmelik*, Bakanlar Kurulu Kararı
196
+ 27/11/2007 No 2007/12937, Resmî Gazete 19/12/2007 No 26735; değişiklikler
197
+ 2009/15316, 2012/2958, 2015/7401, 2017/10459, 2018/11347, CK 3167 (2020),
198
+ CK 4825 (2021) ve CK 10026 (30/6/2025, Geçici Madde 4).
199
+ <https://www.mevzuat.gov.tr/mevzuat?MevzuatNo=200712937&MevzuatTur=21&MevzuatTertip=5>
200
+ (metin 9 Kasım 2026'da kontrol edildi).
201
+
202
+ Kullanılan hükümler: Madde 4 (tanımlar), 8-18 (kullanım sınıfları), 31-33
203
+ (kaçış yolları, kullanıcı yükü, çıkış genişliği), 34 (yangın güvenlik holü),
204
+ 38-48 (kaçış merdivenleri, çıkış sayısı, kapılar, konutlar), 49-52 (sağlık,
205
+ oteller, toplanma, büro/mağaza/fabrika), 63 (acil durum asansörü), 75 ve 81
206
+ (algılama ve uyarı), 89 (basınçlandırma), 94 (itfaiye su alma hattı, yangın
207
+ dolapları), 96 (yağmurlama), 97 (itfaiye su verme bağlantısı); Ek-5/A, Ek-5/B,
208
+ Ek-7. Ek-5/B'nin hastaneler satırındaki merdiven kapasitesi değişiklikle
209
+ 30 kişidir. Ek-7'nin kurumsal, ticaret, endüstri ve toplanma satırları Danıştay
210
+ 10. Dairesinin 28/12/2021 tarihli E.2019/261 K.2021/5537 sayılı kararıyla iptal
211
+ edilmiştir (İDDK 22/2/2023 onama); bu sınıflar için rapor bunu belirtir.
212
+
213
+ Hesap kuralları:
214
+
215
+ - Kişi sayısı = ⌈alan / katsayı⌉; beyan edilen kişi sayısı büyükse o esas alınır
216
+ (Ek-5/A notu). Ek-5/A'nın 1-4. satırları net, diğerleri brüt alanla çalışır.
217
+ - Toplam gerekli genişlik = kişi / birim kapasite × 0.50 m (Madde 33(1)).
218
+ Değer, 50 cm'lik tam birimlere yuvarlanmaz.
219
+ - Merdiven genişliği kat bazında, o katın kullanıcı yüküyle kontrol edilir;
220
+ iki çıkış gereken durumda her merdiven yükün yarısını taşımalıdır (Madde 33(4)).
221
+ - Yağmurlama durumu verilmezse, sistem yalnızca Madde 96'nın zorunlu kıldığı
222
+ durumda var kabul edilir ve kaçış uzaklıkları buna göre seçilir.
223
+
224
+ ## Sınırlamalar ve yorumlar
225
+
226
+ - **Yüksek bina tanımı** ("bina yüksekliği 21.50 m'den, yapı yüksekliği 30.50
227
+ m'den fazla") iki şartın birlikte mi ayrı ayrı mı arandığını açıkça söylemez.
228
+ Varsayılan ihtiyatlı yorum "**veya**"dır; `high_rise_rule: "and"` ile değiştirilebilir.
229
+ - **Sınır değerler:** Madde 48(5)'teki 21.50 / 30.50 / 51.50 m eşiklerine tam
230
+ eşit yükseklikler bir üst (daha sıkı) banda alınır; Madde 47(3)'te tam 4 kat
231
+ 90 dk kapı ister; Madde 50'de tam 20 yatak iki çıkış ister.
232
+ - **Madde 96(2)(d)**'deki "katlı" şartı ihtiyaten aranmaz; toplanma sınıfı
233
+ "eğlence yeri" olarak bu bende dahil edilir.
234
+ - **Madde 89(1)** merdiven kovası yüksekliğini esas alır; paket yapı
235
+ yüksekliğini vekil değer olarak kullanır. Madde 48(7)-(8) uyarınca bodrum veya
236
+ çatı arası hariç tutulacaksa `konut_merdiven_yuksekligi_m` alanını kullanın.
237
+ - **Madde 75(2)** kat sayısı bodrumlar dahil sayılır.
238
+ - Geometri (kaçış uzaklığı, köşegen, genişlikler) kullanıcı tarafından ölçülüp
239
+ girilir; paket plan çizimi okumaz ve yol bulma yapmaz.
240
+ - Kapsam dışı: yapı elemanlarının yangın dayanımları (Ek-3), kompartıman alanları
241
+ (Ek-4), malzeme sınıfları (Ek-2), koltuk sıraları (Ek-6), su deposu ve pompa
242
+ hesapları (Ek-8), tehlikeli maddeler (Sekizinci Kısım), mevcut yapılara özel
243
+ hükümler (Onuncu Kısım), cezaevleri, açık otoparklar.
244
+ - Yönetmelik değişebilir. Tablo dosyası güncel değilse `load_tables` ile düzeltin.
245
+
246
+ ## Geliştirme
247
+
248
+ ```bash
249
+ pip install -e ".[dev]"
250
+ python -m pytest
251
+ python -m ruff check . && python -m ruff format --check src tests
252
+ python -m mypy src
253
+ ```
254
+
255
+ ## Akademik atıf
256
+
257
+ ```bibtex
258
+ @software{eminoglu_tr_yangin,
259
+ author = {Eminoğlu, Yusuf},
260
+ title = {tr-yangin},
261
+ year = {2026},
262
+ version = {0.1.0},
263
+ url = {https://github.com/YusufEminoglu/tr_yangin_sdk}
264
+ }
265
+ ```
266
+
267
+ ## Lisans
268
+
269
+ MIT. Ayrıntılar için [LICENSE](LICENSE) dosyasına bakın. İletişim:
270
+ geospacephilo@gmail.com