;; =========================================================================
;; AutoCAD ➔ Web Canlı Metraj AutoLISP Eklentisi (metraj.lsp)
;; Özellik: Metrajı alınan çizgilerin birebir kopyasını '_METRAJ_SIVA'
;;          katmanında pembe/magenta renkle oluşturur (Metraj İzi Bırakır).
;; Komut: METRAJ veya SIVA
;; =========================================================================

(vl-load-com)

(defun CreateMetrajLayer (layerName colorIndex / acad doc layers lay)
  (setq acad (vlax-get-acad-object))
  (setq doc (vla-get-activedocument acad))
  (setq layers (vla-get-layers doc))
  (if (vl-catch-all-error-p (vl-catch-all-apply 'vla-item (list layers layerName)))
    (progn
      (setq lay (vla-add layers layerName))
      (vla-put-color lay colorIndex) ;; 6 = Magenta (Pembe), 4 = Cyan, 3 = Yeşil
      (princ (strcat "\n[+] '" layerName "' katmanı otomatik oluşturuldu."))
    )
  )
)

(defun c:METRAJ ( / ss i ent copyEnt elen earea totalLen totalArea layer handle entType itemsJson http payload targetLayer)
  (setq targetLayer "_METRAJ_SIVA")
  
  ;; _METRAJ_SIVA katmanını hazırla (Magenta/Pembe renk)
  (CreateMetrajLayer targetLayer 6)

  (prompt (strcat "\n[METRAJ] Sıva metrajı alınacak çizgileri seçin (Kopyaları '" targetLayer "' katmanına işlenecek): "))
  
  (if (setq ss (ssget '((0 . "LINE,LWPOLYLINE,POLYLINE,ARC,CIRCLE,SPLINE,ELLIPSE"))))
    (progn
      (setq totalLen 0.0)
      (setq totalArea 0.0)
      (setq itemsJson "[")
      (setq i 0)

      (while (< i (sslength ss))
        (setq ent (vlax-ename->vla-object (ssname ss i)))
        (setq layer (vlax-get-property ent 'Layer))
        (setq handle (vlax-get-property ent 'Handle))
        (setq entType (vlax-get-property ent 'ObjectName))
        (setq elen 0.0)
        (setq earea 0.0)

        ;; Uzunluk hesapla
        (setq elen (vl-catch-all-apply 'vlax-get-property (list ent 'Length)))
        (if (vl-catch-all-error-p elen)
          (setq elen (vl-catch-all-apply 'vlax-get-property (list ent 'ArcLength)))
        )
        (if (vl-catch-all-error-p elen)
          (setq elen (vl-catch-all-apply 'vlax-get-property (list ent 'Circumference)))
        )
        (if (vl-catch-all-error-p elen)
          (setq elen 0.0)
        )

        ;; Alan hesapla
        (setq earea (vl-catch-all-apply 'vlax-get-property (list ent 'Area)))
        (if (vl-catch-all-error-p earea)
          (setq earea 0.0)
        )

        (setq totalLen (+ totalLen elen))
        (setq totalArea (+ totalArea earea))

        ;; ÇİZGİYİ YERİNDE KOPYALAYIP _METRAJ_SIVA KATMANINA AKTAR
        (setq copyEnt (vl-catch-all-apply 'vla-copy (list ent)))
        (if (not (vl-catch-all-error-p copyEnt))
          (progn
            (vl-catch-all-apply 'vlax-put-property (list copyEnt 'Layer targetLayer))
          )
        )

        ;; JSON öğesi oluştur
        (if (> i 0) (setq itemsJson (strcat itemsJson ",")))
        (setq itemsJson (strcat itemsJson 
          "{\"handle\":\"" handle 
          "\",\"type\":\"" (vl-string-subst "" "AcDb" entType) 
          "\",\"layer\":\"" layer 
          "\",\"length\":" (rtos elen 2 4) 
          ",\"area\":" (rtos earea 2 4) 
          "}"
        ))

        (setq i (1+ i))
      )
      (setq itemsJson (strcat itemsJson "]"))

      ;; JSON Gövdesi
      (setq payload (strcat 
        "{\"count\":" (itoa (sslength ss)) 
        ",\"rawTotalLength\":" (rtos totalLen 2 4) 
        ",\"rawTotalArea\":" (rtos totalArea 2 4) 
        ",\"items\":" itemsJson 
        "}"
      ))

      ;; HTTP POST Gönder (Localhost:8080)
      (setq http (vlax-create-object "MSXML2.ServerXMLHTTP.6.0"))
      (if (null http) (setq http (vlax-create-object "MSXML2.ServerXMLHTTP")))
      
      (if http
        (progn
          (vl-catch-all-apply 'vlax-invoke-method (list http 'open "POST" "http://localhost:8080/api/push" :vlax-false))
          (vl-catch-all-apply 'vlax-invoke-method (list http 'setRequestHeader "Content-Type" "application/json; charset=utf-8"))
          (setq res (vl-catch-all-apply 'vlax-invoke-method (list http 'send payload)))
          (vlax-release-object http)
          
          (if (vl-catch-all-error-p res)
            (princ "\n[!] Web Köprüsüne bağlanılamadı. Lütfen 'Baslat.bat'ın çalıştığından emin olun.")
            (princ (strcat "\n[✓ BAŞARILI] " (itoa (sslength ss)) " nesne '_METRAJ_SIVA' katmanına kopyalandı ve Web Paneline gönderildi!"))
          )
        )
        (princ "\n[!] MSXML2 HTTP bileşeni başlatılamadı.")
      )
    )
    (princ "\n[!] Nesne seçilmedi veya işlem iptal edildi.")
  )
  (princ)
)

;; Kısayol: SIVA komutu
(defun c:SIVA () (c:METRAJ))

(princ "\n=======================================================")
(princ "\n  📐 AutoCAD ➔ Web Canlı Metraj & Katmanlama Yüklendi!  ")
(princ "\n  Komut: 'METRAJ' (Otomatik '_METRAJ_SIVA' katmanı açar) ")
(princ "\n=======================================================\n")
(princ)
