All community skills

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.
mahal-ic-olcu — Cizgen community skill