mahal-alan-etiketi
by Cihad Paksoy
mimarikat-planialanmahalnotasyon
Description
Mahallerin net iç alanını mahal adının ALTINA, ada ORTALANMIŞ m² etiketi olarak yazar. Birim kalibrasyonu (cm/mm ayrımı — yanlışsa alan 10 000 kat şaşar), mahal tespiti, stilin mevcut bir etiketten okunması ve tek batch çizim kalıbı içerir. "Mahallerin alanlarını yaz", "mahal adlarının altına m2 ekle" dendiğinde kullan.
Example prompts
- /mahal-alan-etiketi Her mahalin alanını adının altına yaz.
- /mahal-alan-etiketi İşaretlediğim bölgedeki mahallerin alanlarını M2 katmanına ekle.
- /mahal-alan-etiketi Mahal alanlarını etiketle — iki ondalık, mahal adına ortalanmış olsun.
- /mahal-alan-etiketi Her odanın net alanını hesapla ve plana işle.
Full content
---
name: mahal-alan-etiketi
description: Mahallerin net iç alanını mahal adının ALTINA, ada ORTALANMIŞ m² etiketi olarak yazar. Birim kalibrasyonu (cm/mm ayrımı — yanlışsa alan 10 000 kat şaşar), mahal tespiti, stilin mevcut bir etiketten okunması ve tek batch çizim kalıbı içerir. "Mahallerin alanlarını yaz", "mahal adlarının altına m2 ekle" dendiğinde kullan.
tags: [mimari, kat-plani, alan, mahal, notasyon]
---
Kullanıcı "mahallerin alanlarını yaz" dediğinde bu prosedürü izle. Bu bir **yazma** işidir:
önizleme → onay → commit zinciri geçerlidir.
Prosedür **çizimden ölçer, sabit varsaymaz.** Aşağıdaki her değer (katman adı, punto, offset,
biçim) o çizimden okunur; başka bir ofisin çiziminde başka çıkar.
## Örnek prompt'lar
- "Her mahalin alanını adının altına yaz."
- "İşaretlediğim bölgedeki mahallerin alanlarını M2 katmanına ekle."
- "Mahal alanlarını etiketle — iki ondalık, mahal adına ortalanmış olsun."
- "Her odanın net alanını hesapla ve plana işle."
## 0. 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.
## 1. Birimi KALİBRE et — bunu atlarsan her şey 10 000 kat yanlış olur
`get_overview` `units_assumed: true` döndürüyorsa çizimde birim bilgisi **yoktur**; "mm"
yazması bir varsayımdır. Alan yazmadan önce birimi geometriden çıkar:
- **Duvar kalınlıkları**: paralel duvar yüzleri arası mesafe. 8–30 aralığındaysa **cm**,
80–300 aralığındaysa **mm**.
- **Kapı boşlukları**: 70–120 ⇒ cm, 700–1200 ⇒ mm.
- Çizimdeki bir kapı/pencere etiketi ("90/210", "140") zaten **cm** konuşuyordur.
Alan çizim biriminin karesidir: cm ise **/10 000**, mm ise **/1 000 000** → m². Uzunluk hatası
2 katsa alan hatası 4 kattır; birim hatası 10 katsa alan **100 kat** şaşar. Vardığın sonucu
**cevabında beyan et** ("birimi cm kabul ettim, çünkü duvarlar 10/20/25 çıktı"). Emin
olamazsan yazma — kullanıcıya sor.
## 2. Mahalleri bul ve `hint`'i OKU
`find_spaces`'i çizimden ölçtüğün değerlerle çağır — yuvarlak sayı uydurma:
- `boundary_layers`: **yalnız yapısal/bölücü** katmanlar — duvar, kolon, perde, korkuluk/parapet
(balkonlar aksi hâlde bulunamaz). Mobilya/ekipman/armatür katmanını sınır YAPMA: o zaman
ekipmanın dış hattı "mahal" gibi poligonize olur ve sen mahalin değil ekipmanın alanını
yazarsın.
- `max_bridge_gap`: en geniş kapı/geçiş boşluğu kadar
- `min_face_width`: en kalın duvardan biraz büyük
- `name_layers`: mahal adlarının katmanı
Sonuçtaki `hint` doluysa **düzeltip tekrar çağır** (bir-iki tur): `missing_boundary_layers`
eksik katmanın adını verir → yapısal bir katmansa ekle, ekipman katmanıysa EKLEME.
`merged_labels` hangi mahallerin tek yüzde birleştiğini söyler → ayıramıyorsan o mahalleri
etiketleme, cevabında **beyan et**.
## 3. Hangi yüz alan alır, hangisi almaz
Etiketlenecek mahal, **adı olan ve gerçekten hacim olan** yüzdür. Şunlara alan YAZMA:
- **Şaft/kuyu türü hacimler** — asansör kuyusu, ışıklık, baca, tesisat şaftı. Bunlar mahal
değildir; ayrıca içlerindeki ekipman çizimi (kabin, kanal) yüz olarak çıkabilir, o zaman
yazacağın sayı hacmin değil ekipmanın alanı olur.
- **Niş/kovuk gibi çok küçük yüzler** — dolap nişi, vestiyer girintisi. Pratikte ~1 m² altı
yüzler etiketlenmez; hem etiket sığmaz hem cetvelde anlamsızdır.
- **Mahal adı olmayan metinler** — pafta başlığı, kapı/pencere pozu ("SÜRGÜLÜ KAPI 90/210"),
kot notu. Bunlar mahal adı değildir; `find_spaces` bunları ad sanmışsa etiketleme.
Atladığın her yüzü ve nedenini **beyan et** — ofis geleneği farklıysa kullanıcı düzeltsin.
## 4. Stili MEVCUT bir etiketten oku
Çizimde zaten alan etiketi varsa (başka bir kat, başka bir blok, başka bir pafta) `read_texts`
ile onu bul ve katmanını, puntosunu, biçimini, mahal adına göre offsetini **ondan** al — yeni
bir stil icat etme. Yoksa şu varsayılanlar makul, ama kullanıcıya **teyit ettir**:
| Ne | Varsayılan |
|---|---|
| Punto | mahal adı yüksekliğinin **2/3**'ü |
| Konum | mahal adının **1.1 × ad yüksekliği** kadar ALTI |
| Hiza | mahal adına **ORTALANMIŞ** (aşağıya bak) |
| Biçim | `X.XX m2` (iki ondalık, sayı ile birim arası boşluk) |
| Katman | kullanıcının verdiği (yoksa mevcut etiketlerin katmanı, o da yoksa sor) |
### Ortalama — iki tuzağı var
Etiket, mahal adının **altına ortalanır**. Adın sol köşesine hizalamak yeterli değil: ad ve
etiket farklı uzunlukta olduğu için "MUTFAK / 16.93 m2" çifti sola kaçık görünür.
**Tuzak 1 — adın gerçek genişliği `cad.texts()`'te YOKTUR.** O yalnız yerleşim noktasını verir
(sol-alt köşe). Gerçek glif kutusu `cad.entities([handle])` çıktısındadır:
`bbox: {min:[x,y], max:[x,y]}` — düz dizi değil, dikdörtgen. Adın ortası:
```
cx = (bbox.min[0] + bbox.max[0]) / 2
```
**Tuzak 2 — `align:'center'` dikey çıpayı da değiştirir.** Verdiğin nokta metnin ORTA noktası
olur (yatayda merkez, DİKEYDE ortası) — sol hizada ise taban çizgisidir. Aynı `y`'yi verirsen
etiket yarım punto yukarı kayar. Düzeltmesi:
```
y = ad.pos[1] - (1.1 * adYüksekliği - etiketYüksekliği / 2)
```
## 5. Tek batch çiz
Çok elemanlı hesapla-ve-çiz işi → `run_script`. Kalıp (`cad.schema()` / `cad.help('spaces')`
ile anahtar adlarını doğrulayabilirsin):
```javascript
// ---- çizimden ölçtüğün değerler ----
const DIV = 10000; // cm² → m² (mm ise 1000000)
const MIN_M2 = 1.0; // bunun altındaki yüzler niş sayılır, etiketlenmez
const LAYER = 'M2'; // etiketin gideceği katman
const NAME_LAYER = 'YAZI'; // mahal adlarının katmanı
const SKIP = /asansör|ışıklık|şaft|baca|kuyu/i; // hacim değil, şaft
const OPT = { boundary_layers: ['DUVAR','KOLON','MY'], max_bridge_gap: 160,
min_face_width: 30, name_layers: [NAME_LAYER] };
const spaces = cad.spaces(OPT).filter((s) => s.name);
const texts = cad.texts({ layer: NAME_LAYER });
// Adların GERÇEK kutuları — ortalamak için şart. cad.texts yalnız yerleşim noktasını verir.
const box = {};
for (const e of cad.entities(texts.map((t) => t.handle))) box[e.handle] = e.bbox;
const labels = [], skipped = [];
for (const s of spaces) {
const m2 = s.area / DIV;
if (m2 < MIN_M2 || SKIP.test(s.name)) { skipped.push([s.name, m2]); continue; }
// Mahalin ADI: bu yüzün içindeki, adıyla eşleşen metin. Etiketi onun ALTINA koy —
// mahal bbox'ının merkezine değil; ad ile etiket bir çift olarak okunur.
const name = texts.find((t) => t.content === s.name && s.contained.includes(t.handle));
const b = name && box[name.handle];
if (!name || !b) { skipped.push([s.name, 'adı yerleştirilemedi']); continue; }
const h = name.height;
const lh = Math.round((h * 2) / 3);
labels.push({
type: 'text', layer: LAYER,
params: {
// x: adın kutusunun ORTASI. y: align:'center' çıpayı metnin ortasına aldığı için
// taban-çizgisi offsetinden yarım punto geri al.
insertion: [(b.min[0] + b.max[0]) / 2, name.pos[1] - (1.1 * h - lh / 2)],
content: m2.toFixed(2) + ' m2',
height: lh,
align: 'center',
},
});
}
const w = cad.draw(labels); // TEK batch
result = { labeled: labels.length, skipped, op_id: w.op_id };
```
## 6. Denetle — sonra önizlet
`render_and_verify` ile bak. Kalabalık bir planda tek bir toplu görüntüde etiketler okunmaz;
şüphelendiğin mahalleri **tek tek** (mahalin bbox'ı + pay) render et. Aradığın kusurlar:
- Etiket ada göre **ortalanmamış** (sola/sağa kaçık). Sebebi genelde adın kutusu yerine
yerleşim noktasının kullanılmasıdır — `cad.entities`'ten gelen `bbox`'ı kullandığından emin ol.
- Etiket mahal adının altında değil, üstünde/üstüne binmiş (dikey düzeltmeyi atlamış olabilirsin).
- Etiket mahalin dışına, komşu mahale taşmış (dar mahallerde olur → puntoyu küçült ya da o
mahali atla ve beyan et).
- Aynı mahalde iki etiket (aynı ad iki yüze eşleşmiş).
- Sayı gözle tutmuyor: bir mahalin eni × boyu ile karşılaştır. 100 kat sapma birim hatasıdır,
geri dön adım 1'e.
Sonra `create_preview` → DUR ve kullanıcının onayını bekle → `commit_changes`.
## Cevabında beyan et
- Birim varsayımın ve gerekçesi.
- Kaç mahal etiketlendi.
- Atlanan her yüz ve nedeni (şaft / çok küçük / adı yerleştirilemedi / birleşmiş).
- Stili nereden aldığın (mevcut etiketten mi, varsayılandan mı).
## Bilinen sınır
`draw`'ın `text` op'unda **text style parametresi yoktur**; etiket çizimin AKTİF text style'ıyla
doğar. Mevcut alan etiketleri başka bir stildeyse (ör. adlar `YAZI`, alanlar `POZ`) font farkı
kalır. Kullanıcı isterse commit sonrası stili AutoCAD'de topluca değiştirebilir; sen punto ve
konumu doğru ver.
## Example prompts
- /mahal-alan-etiketi Her mahalin alanını adının altına yaz.
- /mahal-alan-etiketi İşaretlediğim bölgedeki mahallerin alanlarını M2 katmanına ekle.
- /mahal-alan-etiketi Mahal alanlarını etiketle — iki ondalık, mahal adına ortalanmış olsun.
- /mahal-alan-etiketi Her odanın net alanını hesapla ve plana işle.