mahal-ic-olcu
by Cihad Paksoy
mimarikat-planiolculendirmemahalnotasyon
Description
Kat planındaki mahallerin iç ölçülerini (en/boy) mahalin içine, BANT BANT HİZALI olarak çizer. Ölçüyü mahalin bbox'ından değil, ölçü çizgisinin geçtiği hattaki gerçek duvar yüzlerinden alır; L/T biçimli mahallerde ucun yan mahale taşmasını ve ölçü çizgisinin mahal adının üstünden geçmesini önler. "Mahallerin iç ölçülerini çiz", "odaların en ve boyunu ölçülendir" dendiğinde kullan.
Example prompts
- /mahal-ic-olcu İşaretlediğim bölgedeki her mahalin iç ölçülerini — eni ve boyu — ölçülendir.
- /mahal-ic-olcu Bu daireye iç ölçü ver, ölçüler OL katmanına gitsin.
- /mahal-ic-olcu Odaların en ve boyunu mahalin içine, sıra sıra hizalı olacak şekilde ölçülendir.
- /mahal-ic-olcu Mahalleri ölçülendir, aralarındaki duvar kalınlıklarını da yaz.
Full content
---
name: mahal-ic-olcu
description: Kat planındaki mahallerin iç ölçülerini (en/boy) mahalin içine, BANT BANT HİZALI olarak çizer. Ölçüyü mahalin bbox'ından değil, ölçü çizgisinin geçtiği hattaki gerçek duvar yüzlerinden alır; L/T biçimli mahallerde ucun yan mahale taşmasını ve ölçü çizgisinin mahal adının üstünden geçmesini önler. "Mahallerin iç ölçülerini çiz", "odaların en ve boyunu ölçülendir" dendiğinde kullan.
tags: [mimari, kat-plani, olculendirme, mahal, notasyon]
---
Bir kat planında mahallerin iç ölçüsünü çizerken amaç yalnızca "doğru sayı" değil, **okunur bir
pafta**: ölçüler yan yana hizalı, yazıların üstünden geçmeyen, uçları kendi mahalinde biten
ölçülerdir. Aşağıdaki akış bunu üretir.
## Örnek prompt'lar
- "İşaretlediğim bölgedeki her mahalin iç ölçülerini — eni ve boyu — ölçülendir."
- "Bu daireye iç ölçü ver, ölçüler OL katmanına gitsin."
- "Odaların en ve boyunu mahalin içine, sıra sıra hizalı olacak şekilde ölçülendir."
- "Mahalleri ölçülendir, aralarındaki duvar kalınlıklarını da yaz."
## Kapsam: "işaretlediğim bölge" nerede?
Kullanıcı bir alana işaret ettiğinde kapsamı KENDİN uydurma: mesaja **iliştirilmiş** bir bölge
varsa (etiketinde bbox yazar) o önceliklidir; yoksa kullanıcı AutoCAD'de **CIZGENREGION** ile
işaretlemiş olabilir → `get_marked_region` çağır, dönen bbox kapsamdır. Hiçbiri yoksa
CIZGENREGION'ı çalıştırmasını söyle; zaten gösterdiği yeri yeniden seçtirme.
## Temel ilke: ölçünün SINIRI `find_spaces` bbox'ıdır
Planlarda duvarlar çoğunlukla **çift çizgilidir**: bir duvar iki paralel çizgidir ve mahalin
yüzü bunlardan **içte** olanıdır. Dış çizgiyi ölçersen duvar kalınlığını da ölçmüş olursun —
sayı büyür, ölçü mahalin dışına taşar. Bu en sık yapılan hatadır.
**`find_spaces`'in döndürdüğü `bbox` zaten İÇ YÜZLERİN üzerindedir.** Kapalı yüzü poligonize
ederken duvarın iç çizgisini sınır alır. Yani:
> **Duvar çizgilerinden yüz avlamaya kalkma. Mahalin net ölçüsü zaten `bbox`'tadır.**
**Doluluk testi** — her mahal için:
```
fill = area / ((bbox[2]-bbox[0]) * (bbox[3]-bbox[1]))
```
- `fill ≥ 0.97` → mahal dikdörtgen. Net en = `bbox[2]-bbox[0]`, net boy = `bbox[3]-bbox[1]`.
**Başka hiçbir hesap yapma**; duvar çizgisi okuma, yüz arama. Bitti.
- `fill < 0.97` → mahal dikdörtgen DEĞİL (L/T/çıkıntılı). bbox'ın DIŞ ölçüsü hâlâ doğrudur ama
köşelerin hepsi gerçek yüz değildir; bbox'ı köşeden köşeye ölçersen ölçünün ucu yan mahalin
ortasında biter. Bunlarda adım 4'ü uygula.
**Bozulamaz kural (her iki durumda da):** ölçülen değer, mahalin o eksendeki bbox boyunu
**ASLA geçemez**. `en > bbox genişliği` ya da `boy > bbox yüksekliği` çıktıysa yanlış yüzü
seçmişsindir (duvarın dışına taşmışsındır) — o ölçüyü çizme, yeniden hesapla.
Doluluğu her mahal için hesapla ve düşük olanları kendine not et — bunlar dikkat isteyen
mahallerdir.
## Akış
### 1. Mahalleri çıkar
`find_spaces` çağır; `boundary_layers`'a duvarı oluşturan TÜM katmanları ver (duvar + kolon +
varsa mahal ayırıcı çizgiler). Zarftaki geri bildirimi **oku ve uygula**:
- `missing_boundary_layers` → o katmanları `boundary_layers`'a ekle, tekrar çağır.
- `merged_labels` → iki mahal tek yüzde birleşmiş; `max_bridge_gap`'i değiştirip dene.
Kapanmıyorsa TEK mahal olarak beyan et, varsayarak bölme.
- `multi_label_faces = 0` olana kadar (ya da ilerlemeyi kesene kadar) iterasyona devam et.
**`boundary_layers`'a YALNIZ yapısal/bölücü katmanları koy** — duvar, kolon, perde, mahal ayırıcı.
Mobilya/ekipman/armatür katmanını sınır yapma: o zaman ekipmanın dış hattı "mahal" gibi
poligonize olur ve sen mahali değil ekipmanı ölçersin. `missing_boundary_layers` bir ekipman
katmanını öneriyorsa ekleme; o etiketi adım 1b'ye bırak.
**Yalnız ADI OLAN yüzleri ölçülendir.** Adsız küçük yüzler kapı/duvar kovuğu artığıdır. Kaçını
atladığını cevabında BEYAN et.
### 1b. Şaft/kuyu türü yüzleri ayır
Asansör kuyusu, ışıklık, baca, tesisat şaftı gibi hacimler **mahal değildir** ve içlerinde
ekipman çizimi bulunur (asansör kabini, merdiven, kanal). `find_spaces` ekipmanın dış hattını
yüz olarak verebilir — bunu ölçersen kuyunun net açıklığını değil, kabinin boyutunu ölçmüş
olursun.
Bir yüzü şüpheli say: adı bu tür bir hacmi anlatıyorsa (asansör / ışıklık / şaft / baca / kuyu
benzeri), **ya da** yüz bir başka yüzün içine gömülüyse, **ya da** sınırında duvar katmanından
çizgi yok.
Böyle bir hacimde ölçülecek şey **yapısal net açıklıktır**: çevreleyen DUVAR yüzleri arası.
Ekipman hattını değil, o hacmi saran duvarların iç yüzlerini ölç (`cad.query` ile hacmin
etrafındaki duvar çizgilerini al, hacmi saran en yakın iç yüzleri bul). Bu hacimlerde ekipman
çizgisini asla ölçü ucu yapma. Hangi hacimleri böyle ölçtüğünü BEYAN et.
### 2. Ölçü katmanını belirle
Kullanıcı söylediyse onu kullan. Söylemediyse çizimdeki MEVCUT ölçülerin katmanını al
(`aggregate` ya da `query` ile Dimension'ları say, en kalabalık katman) — yeni bir katman adı
UYDURMA. Hiç ölçü yoksa kullanıcıya sor.
### 3. Bantları kur — hizalama burada kazanılır
Tek tek "her odaya iki ölçü" atmak teknik olarak doğru ama pafta dağınık görünür. Mimar
pratiği: **aynı sıradaki mahallerin ölçüleri aynı hizada durur.**
- **Yatay ölçüler (en):** Y aralıkları örtüşen mahalleri bir **bant** yap. Bant için TEK bir
ölçü çizgisi Y'si seç; bandın her mahalinde bu Y mahalin içinde kalmalı.
- **Düşey ölçüler (boy):** X aralıkları örtüşen mahalleri bir **sütun** yap, TEK bir X seç.
Bir mahal birden çok banda girebilir; her mahal en az bir yatay + bir düşey ölçü almalı.
**Bant Y'sini seçerken** (aynısı sütun X'i için):
1. Adayları bandın ortak iç aralığından üret.
2. Her adayı puanla: bandın mahallerindeki YAZILARIN kutusundan geçmeyen aday kazanır
(yazıları `read_texts` ile mahal bbox'ında oku; `height` alanını kullan, punto uydurma —
yazı bandı yaklaşık `[pos_y - height, pos_y + 2×height]`).
3. Eşitlik varsa kapı bloklarından uzak olanı seç (kapı önü boş kalsın).
**Öncelik kuralı:** hizalama, tek bir mahaldeki çakışmadan daha değerlidir. Bandın tamamı için
temiz bir Y bulunamıyorsa, adı uzun olan bir-iki mahalde yazıyla kesişmeyi KABUL ET; bandı
bozup her odaya ayrı yükseklik verme. (Bunu cevabında belirt.)
### 4. YALNIZ dikdörtgen olmayan mahaller için: hattı bbox içinde kırp
`fill ≥ 0.97` olan mahallerde bu adım YOK — ölçün zaten bbox'tan geldi, doğrudan adım 5'e geç.
`fill < 0.97` olan mahalde, seçtiğin bant Y'sinde mahalin bir bölümü daha dardır. Yapılacak iş
yeni bir yüz aramak değil, **bbox kenarını içeri çekmek**:
1. Duvar katmanındaki çizgileri topla (`cad.query(bbox, {layer, handles:true})` →
`cad.entities(handles)`). Aramayı mahalin **kendi bbox'ıyla** sınırla.
2. Yatay ölçü için: **düşey** çizgilerden (|x₂−x₁| ≈ 0), Y aralığı bant Y'sini içerenleri al.
Yalnız `bbox[0] < x < bbox[2]` aralığına düşenler işine yarar — bbox kenarındaki ya da
dışındaki çizgiler ELENİR (dışarıdakiler duvarın dış çizgisidir, onları ölçersen kalınlık
ölçüye girer).
3. Mahalin o hattaki bir iç noktasını referans al. Sol sınır = referansın solundaki böyle bir
çizgi varsa onun X'i, yoksa `bbox[0]`. Sağ sınır = sağdaki varsa onun X'i, yoksa `bbox[2]`.
4. Düşey ölçü aynısının 90° dönmüşü (yatay çizgiler, `bbox[1] < y < bbox[3]`).
Sonuç her zaman bbox'a eşit ya da ondan KÜÇÜK çıkar. Büyük çıktıysa 2. maddedeki eleme
uygulanmamıştır.
### 5. Duvar kalınlıklarını da ekle
Ölçüler zaten aynı hizadaysa, komşu iki mahal arasındaki duvar da aynı hatta ölçülür: A'nın sağ
yüzü ile B'nin sol yüzü arası. Bu, zincir görünümünü tamamlayan şeydir; atlama. (Değerler
tipik olarak birbirini tekrar eder — 10/20/25 gibi; bu normaldir, mimar da böyle çizer.)
### 6. Çizmeden önce her ölçüyü DENETLE
Çizmeden önce, her planladığın ölçü için şu beşini kontrol et. Biri bile geçmiyorsa o ölçüyü
düzelt — çizip sonra bakma:
1. **Ölçü bbox'ı aşıyor mu?** `en ≤ bbox genişliği` ve `boy ≤ bbox yüksekliği` OLMAK ZORUNDA.
Aşıyorsa duvarın dış çizgisini seçmişsindir, kalınlık ölçüye girmiştir — çizme, yeniden
hesapla. Dikdörtgen mahalde (`fill ≥ 0.97`) değer bbox'a **eşit** olmalı; küçükse de
yanlıştır.
2. **Uçlar kendi mahalinde mi?** Her iki uç noktası da mahalin gerçek sınırında olmalı. Ucun
yan mahale taştığı bir ölçü hatalıdır (dikdörtgen olmayan mahalde adım 4'ü uygulamadıysan
tipik hata budur).
3. **Ölçü çizgisi bir yazının üstünden geçiyor mu?** Geçiyorsa hattı kaydır (adım 3'ün öncelik
kuralı saklı).
4. **Ölçü metni sığıyor mu?** Ölçülen uzunluk yazı yüksekliğinin ~3 katından küçükse metin
çizginin üstüne sığmaz. Böyle bir mahalde ölçüyü mahalin DIŞINA al ya da atla ve BEYAN et
(dolap nişi gibi çok dar yüzler).
5. **Aynı bandın ölçüleri aynı koordinatta mı?**
### 7. Çiz
Ölçülerin tamamını **tek `run_script`** ile `cad.draw` üzerinden üret (`dimension` tipi:
`{kind:'linear', p1, p2, line, rotation}`; yatay için `rotation: 0`, düşey için `Math.PI/2`).
Tek tek `draw` çağırma.
### 8. MAHAL MAHAL denetle — bu adımı atlama
Toplu bir render'a bakıp "temiz" demek YETMEZ: bütün mahaller tek bir küçük görüntüye sığdığı
için üst üste binen yazılar görünmez, `draw_lint` de yerleşimi denetlemez (o geometri denetler).
Bu yüzden mahalleri **tek tek** gez. Her mahal için sırayla:
**8a. Çakışmayı ÖNCE sayıyla bul — gözle değil.** Yazıların gerçek kutusu `get_objects_in_region`
çıktısındaki `BoundingBox` alanındadır (DBText/MText için gerçek glif sınırları; tahmin etme,
harf sayısından genişlik uydurma). O mahaldeki her yazı kutusu ile şunları kes:
- ölçü çizgisinin bandı,
- ölçünün kendi metninin oturacağı yer (ölçü çizgisinin ortası),
- diğer ölçülerin çizgileri.
Kesişme varsa ölçü hattını mahal içinde kaydır ve testi TEKRARLA. Kaydırma yönü: yazıdan uzağa,
mahalin daha boş tarafına (yazı sola yakınsa ölçüyü sağa, aşağıdaysa yukarı). Bandın tamamı için
temiz bir koordinat kalmadıysa adım 3'ün öncelik kuralı geçerlidir: hizayı koru, kesişmeyi kabul
et ve BEYAN et.
**8b. Eksik duvar ölçüsü var mı?** Bu mahalin sağındaki/üstündeki komşusuyla arasında, aynı
bantta bir duvar kalınlığı ölçüsü olmalı (adım 5). Yoksa şimdi ekle. Bu adım en çok atlanan
adımdır — her mahal için ayrı ayrı sor.
**8c. Sonra o mahali TEK BAŞINA render et.** `render_and_verify`'a mahalin bbox'ını (biraz pay
ekleyerek) ver — bütün bölgeyi değil. Yakınlaştırılmış görüntüde üst üste binme, mahal adını
kesen çizgi, yan mahale taşan uç görünür hale gelir. Gördüğünü düzelt, o mahali yeniden render
et; temizlenene kadar bir sonraki mahale GEÇME.
Her mahal için sonucu bir satır olarak biriktir (adım 9'daki tablo).
### 9. Onaya sun
Bütün mahaller temizlendikten sonra `create_preview` → kullanıcı onayı → `commit_changes`.
Denetimi tamamlamadan önizleme sunma.
## Cevabında beyan et
Adım 8'de biriktirdiğin satırlardan **mahal başına bir satırlık tablo** ver. Tabloda EKSİK satır
bırakma — bir mahali denetlemediysen bunu yazmak, sessizce atlamaktan iyidir:
| mahal | en × boy | bbox | çakışma | komşu duvar ölçüsü |
|---|---|---|---|---|
| ODA | 280 × 430 | 280 × 430 ✓ | yok | var (10) |
| MUTFAK | 280 × 536 | 440 × 536 (L) | yok | var (25) |
- `en × boy` bbox'tan BÜYÜKSE duvar kalınlığı ölçüye karışmıştır — kullanıcı hatayı çizime
bakmadan bu sütunda yakalar.
- Ayrıca kısaca: kaç adsız yüz atlandı; şaft/kuyu olarak duvardan ölçülen hacimler; dar olduğu
için ölçüsü dışarı alınan/atlanan mahaller; hizalama uğruna kabul edilen kesişmeler.
## Bilinen sınır
`auto_dimension` zinciri seçimin **dışına** koyar (`edge` + `offset`); plan İÇİNDEN geçen bir
zincir hattı yerleştiremez. Bu yüzden yukarıdaki akış hizalamayı bant seçimiyle kendi elleriyle
kurar. Kullanıcı planın dış çevresine ölçü isterse orada `auto_dimension` doğru araçtır.
## Example prompts
- /mahal-ic-olcu İşaretlediğim bölgedeki her mahalin iç ölçülerini — eni ve boyu — ölçülendir.
- /mahal-ic-olcu Bu daireye iç ölçü ver, ölçüler OL katmanına gitsin.
- /mahal-ic-olcu Odaların en ve boyunu mahalin içine, sıra sıra hizalı olacak şekilde ölçülendir.
- /mahal-ic-olcu Mahalleri ölçülendir, aralarındaki duvar kalınlıklarını da yaz.