;;; ============================================================ ;;; TEK DOSYA: Nokta Toplama Paneli v3.2 (Otomatik Kose Eklentisi) ;;; ============================================================ ;;; ============================================================ ;;; furkanozcelik.com.tr ;;; ============================================================ (vl-load-com) ;; Global degiskenler (if (not *nkt-sayac*) (setq *nkt-sayac* 1)) (if (not *nkt-yuksek*) (setq *nkt-yuksek* 0.5)) (if (not *nkt-katman*) (setq *nkt-katman* "NOKTALAR")) (if (not *nkt-liste*) (setq *nkt-liste* '())) (if (not *nkt-prefix*) (setq *nkt-prefix* "")) (if (not *nkt-tip*) (setq *nkt-tip* "point")) (if (not *nkt-cap*) (setq *nkt-cap* 0.1)) (setq *dcl-yol* "") (setq *nkt-dcl-id* nil) (setq *nkt-islem-secili* nil) ;; DCL Dosyasini Olustur (defun nkt-dcl-hazirla ( / f dcl-satirlari) (setq *dcl-yol* (vl-filename-mktemp "nokta_panel.dcl")) (setq f (open *dcl-yol* "w")) (setq dcl-satirlari '( "nokta_ana : dialog {" " label = \"Nokta Toplama Sistemi v3.2\";" " width = 72; fixed_width = true;" " : row {" " : text { label = \" Katman:\"; alignment = left; width = 9; }" " : text { key = \"inf_katman\"; label = \"NOKTALAR\"; alignment = left; width = 15; }" " : text { label = \" Yukseklik:\"; alignment = left; width = 12; }" " : text { key = \"inf_yuksek\"; label = \"0.500\"; alignment = left; width = 7; }" " : text { label = \" Sonraki No:\"; alignment = left; width = 13; }" " : text { key = \"inf_sonraki\"; label = \"1\"; alignment = left; width = 10; }" " }" " : spacer { height = 0.2; }" " : errtile { width = 70; }" " : spacer { height = 0.2; }" " : row {" " : boxed_column {" " label = \" Nokta Listesi \"; width = 40;" " : list_box { key = \"lst_noktalar\"; width = 38; height = 18; multiple_select = false; allow_accept = false; fixed_width = true; }" " : row { : text { key = \"inf_toplam\"; label = \"Toplam: 0 nokta\"; width = 26; alignment = left; } : spacer {} }" " }" " : spacer { width = 0.5; }" " : column {" " width = 28;" " : boxed_column {" " label = \" Nokta Islemleri \";" " : button { key = \"btn_ekle\"; label = \" [+] Ardisik Nokta Ekle (Hizli)\"; width = 25; alignment = centered; }" " : spacer { height = 0.1; }" " : button { key = \"btn_oto\"; label = \" [O] Otomatik Kose Noktasi At\"; width = 25; alignment = centered; }" " : spacer { height = 0.1; }" " : button { key = \"btn_sil\"; label = \" [X] Secili Noktayi Sil\"; width = 25; alignment = centered; }" " : spacer { height = 0.1; }" " : button { key = \"btn_duzenle\"; label = \" [D] Secili Noktayi Duzenle\"; width = 25; alignment = centered; }" " : spacer { height = 0.1; }" " : button { key = \"btn_zoom\"; label = \" [Z] Secili Noktaya Git\"; width = 25; alignment = centered; }" " : spacer { height = 0.1; }" " : button { key = \"btn_tumu_sil\"; label = \" [!] Tum Listeyi Temizle\"; width = 25; alignment = centered; }" " }" " : spacer { height = 0.2; }" " : boxed_column {" " label = \" Numara Yonetimi \";" " : row { : text { label = \"Sonraki No :\"; width = 12; alignment = left; } : edit_box { key = \"edt_sayac\"; width = 7; fixed_width = true; } : button { key = \"btn_sayac\"; label = \"Ayarla\"; width = 8; } }" " : spacer { height = 0.1; }" " : row { : text { label = \"Onek :\"; width = 12; alignment = left; } : edit_box { key = \"edt_prefix\"; width = 7; fixed_width = true; } : button { key = \"btn_prefix\"; label = \"Uygula\"; width = 8; } }" " }" " : spacer { height = 0.2; }" " : boxed_column {" " label = \" Disa Aktarma \";" " : button { key = \"btn_ncn\"; label = \" [N] NCN / Nokta Dosyasi Kaydet\"; width = 25; alignment = centered; }" " : spacer { height = 0.1; }" " : button { key = \"btn_txt\"; label = \" [C] TXT / CSV Kaydet\"; width = 25; alignment = centered; }" " : spacer { height = 0.1; }" " : button { key = \"btn_rapor\"; label = \" [R] Rapor / Ozet Goster\"; width = 25; alignment = centered; }" " }" " : spacer { height = 0.2; }" " : boxed_column {" " label = \" Gorsel Ayarlar \";" " : row { : text { label = \"Yazi Yuk. :\"; width = 12; alignment = left; } : edit_box { key = \"edt_yuksek\"; width = 7; fixed_width = true; } : button { key = \"btn_yuksek\"; label = \"Uygula\"; width = 8; } }" " : spacer { height = 0.1; }" " : row { : text { label = \"Katman :\"; width = 12; alignment = left; } : edit_box { key = \"edt_katman\"; width = 15; fixed_width = true; } }" " : spacer { height = 0.1; }" " : row { : text { label = \"Nokta Tipi :\"; width = 12; alignment = left; } : radio_button { key = \"rad_point\"; label = \"Point\"; value = \"1\"; width = 8; } : radio_button { key = \"rad_daire\"; label = \"Daire\"; width = 8; } }" " : spacer { height = 0.1; }" " : row { : text { label = \"Daire Cap :\"; width = 12; alignment = left; } : edit_box { key = \"edt_cap\"; width = 7; fixed_width = true; } : button { key = \"btn_cap\"; label = \"Uygula\"; width = 8; } }" " }" " }" " }" " : spacer { height = 0.3; }" " : row {" " : button { key = \"btn_yenile\"; label = \"Yenile\"; width = 12; alignment = centered; }" " : spacer {}" " : button { key = \"btn_kapat\"; label = \"Kapat\"; width = 12; is_cancel = true; alignment = centered; }" " }" "}" "nokta_duzenle : dialog {" " label = \"Nokta Duzenle\"; width = 38; fixed_width = true;" " : boxed_column {" " label = \" Koordinatlar \";" " : row { : text { label = \"Nokta Adi :\"; width = 12; alignment = left; } : edit_box { key = \"edt_ad\"; width = 18; } }" " : spacer { height = 0.2; }" " : row { : text { label = \"X :\"; width = 12; alignment = left; } : edit_box { key = \"edt_x\"; width = 18; } }" " : row { : text { label = \"Y :\"; width = 12; alignment = left; } : edit_box { key = \"edt_y\"; width = 18; } }" " : row { : text { label = \"Z :\"; width = 12; alignment = left; } : edit_box { key = \"edt_z\"; width = 18; } }" " }" " : spacer { height = 0.3; } : errtile { width = 34; } : spacer { height = 0.2; }" " : row {" " : button { key = \"btn_kaydet\"; label = \"Kaydet\"; width = 12; is_default = true; }" " : spacer {}" " : button { key = \"btn_iptal\"; label = \"Iptal\"; width = 12; is_cancel = true; }" " }" "}" "nokta_rapor : dialog {" " label = \"Nokta Raporu\"; width = 55; fixed_width = true;" " : list_box { key = \"lst_rapor\"; width = 53; height = 20; fixed_width = true; }" " : spacer { height = 0.3; }" " : row {" " : button { key = \"accept\"; label = \"Kapat\"; width = 12; is_default = true; is_cancel = true; }" " : spacer {}" " : text { key = \"inf_toplam_r\"; label = \"\"; width = 28; alignment = right; }" " }" "}" )) (foreach line dcl-satirlari (write-line line f)) (close f) ) ;; Yardimci Fonksiyonlar (defun nkt-isim (no) (strcat *nkt-prefix* (itoa no))) (defun nkt-bul (isim / r i) (setq r nil i 0) (foreach x *nkt-liste* (if (= (car x) isim) (setq r (list x i))) (setq i (1+ i))) r) (defun nkt-listeden-sil (isim / yeni) (setq yeni '()) (foreach x *nkt-liste* (if (/= (car x) isim) (setq yeni (append yeni (list x))))) (setq *nkt-liste* yeni)) (defun nkt-pad (s n) (while (< (strlen s) n) (setq s (strcat s " "))) (substr s 1 n)) ;; Nokta tekrar kontrolu (Cift nokta onleyici - Tolerans: 0.0001) (defun nkt-nokta-mevcut-mu (pt / tol var_mi) (setq tol 1e-4 var_mi nil) (foreach x *nkt-liste* (if (< (distance (list (car pt) (cadr pt)) (list (cadr x) (caddr x))) tol) (setq var_mi T) ) ) var_mi ) (defun nkt-katman-hazirla () (if (not (tblsearch "LAYER" *nkt-katman*)) (entmake (list '(0 . "LAYER") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbLayerTableRecord") (cons 2 *nkt-katman*) '(70 . 0) '(62 . 2))) ) (setvar "CLAYER" *nkt-katman*) ) (defun nkt-ciz (pt isim / z3 ent-pt ent-txt) (setq z3 (if (caddr pt) (caddr pt) 0.0)) (if (= *nkt-tip* "daire") (setq ent-pt (entmakex (list '(0 . "CIRCLE") (cons 8 *nkt-katman*) (cons 10 (list (car pt) (cadr pt) z3)) (cons 40 *nkt-cap*)))) (setq ent-pt (entmakex (list '(0 . "POINT") (cons 8 *nkt-katman*) (cons 10 (list (car pt) (cadr pt) z3))))) ) (setq ent-txt (entmakex (list '(0 . "TEXT") (cons 8 *nkt-katman*) (cons 10 (list (+ (car pt) (* *nkt-yuksek* 0.4)) (+ (cadr pt) (* *nkt-yuksek* 0.4)) z3)) (cons 40 *nkt-yuksek*) (cons 1 isim) (cons 7 "Standard")))) (list ent-pt ent-txt) ) (defun nkt-cizimdeki-sil (item) (if (and (> (length item) 4) (nth 4 item)) (vl-catch-all-apply 'entdel (list (nth 4 item)))) (if (and (> (length item) 5) (nth 5 item)) (vl-catch-all-apply 'entdel (list (nth 5 item)))) ) (defun nkt-liste-satirlari ( / satirlar item) (setq satirlar '()) (foreach item *nkt-liste* (setq satirlar (append satirlar (list (strcat (nkt-pad (car item) 9) (nkt-pad (rtos (cadr item) 2 3) 16) (nkt-pad (rtos (caddr item) 2 3) 16) (rtos (cadddr item) 2 3)))))) satirlar) (defun nkt-liste-guncelle (dcl-id) (start_list "lst_noktalar") (mapcar 'add_list (nkt-liste-satirlari)) (end_list) (set_tile "inf_toplam" (strcat "Toplam: " (itoa (length *nkt-liste*)) " nokta")) (set_tile "inf_sonraki" (nkt-isim *nkt-sayac*)) (set_tile "inf_katman" *nkt-katman*) (set_tile "inf_yuksek" (rtos *nkt-yuksek* 2 3))) (defun nkt-secili-al ( / idx) (setq idx (get_tile "lst_noktalar")) (if (and idx (/= idx "")) (nth (atoi idx) *nkt-liste*) nil)) (defun nkt-ekle-mod-ardisik ( / pt isim eski ents bitir) (setq eski (getvar "CLAYER")) (nkt-katman-hazirla) (setq bitir nil) (princ "\n--- Ardisik Nokta Atma Modu (Cikmak icin ESC, Enter veya Sag Tik) ---") (while (not bitir) (setq pt (vl-catch-all-apply 'getpoint (list (strcat "\n" (nkt-isim *nkt-sayac*) " numarali noktayi tikla (Bitirmek icin Sag Tik/Enter): ")))) (cond ((vl-catch-all-error-p pt) (setq bitir T)) ((not pt) (setq bitir T)) (T (setq isim (nkt-isim *nkt-sayac*)) (if (nkt-bul isim) (nkt-listeden-sil isim)) (setq ents (nkt-ciz pt isim)) (setq *nkt-liste* (append *nkt-liste* (list (list isim (car pt) (cadr pt) (if (caddr pt) (caddr pt) 0.0) (car ents) (cadr ents))))) (setq *nkt-sayac* (1+ *nkt-sayac*)) ) ) ) (setvar "CLAYER" eski) ) ;; === YENI: OTOMATIK KOSE NOKTASI ATMA === (defun nkt-otomatik-nokta-ekle ( / secim ent_data lay col filt ss i ent etype pts pt isim ents eski_layer eklenen) (setq secim (entsel "\nOrnek bir obje (Kare/Dikdortgen/Cizgi) secin: ")) (if secim (progn (setq ent_data (entget (car secim))) (setq lay (cdr (assoc 8 ent_data))) (setq col (cdr (assoc 62 ent_data))) ;; Secilen objenin layer ve rengine gore filtre olustur (setq filt (list '(0 . "LWPOLYLINE,LINE") (cons 8 lay))) (if col (setq filt (append filt (list (cons 62 col))))) (princ (strcat "\nTaraniyor: Layer=" lay " ...")) (setq ss (ssget "_X" filt)) (if ss (progn (setq pts '() eklenen 0) (setq i 0) ;; Tum uygun objelerin kose koordinatlarini topla (while (< i (sslength ss)) (setq ent (entget (ssname ss i))) (setq etype (cdr (assoc 0 ent))) (if (= etype "LWPOLYLINE") (foreach item ent (if (= (car item) 10) (setq pts (cons (cdr item) pts)))) ) (if (= etype "LINE") (progn (setq pts (cons (cdr (assoc 10 ent)) pts)) (setq pts (cons (cdr (assoc 11 ent)) pts)) ) ) (setq i (1+ i)) ) ;; Listeyi tara ve ayni noktaya 2 kere atmamak sartiyla iskelet olustur (setq eski_layer (getvar "CLAYER")) (nkt-katman-hazirla) (foreach pt pts (if (not (nkt-nokta-mevcut-mu pt)) ;; Eger burada nokta yoksa (progn (setq isim (nkt-isim *nkt-sayac*)) (if (= (length pt) 2) (setq pt (list (car pt) (cadr pt) 0.0))) ;; Z koordinati yoksa sifir at (setq ents (nkt-ciz pt isim)) (setq *nkt-liste* (append *nkt-liste* (list (list isim (car pt) (cadr pt) (if (caddr pt) (caddr pt) 0.0) (car ents) (cadr ents))))) (setq *nkt-sayac* (1+ *nkt-sayac*)) (setq eklenen (1+ eklenen)) ) ) ) (setvar "CLAYER" eski_layer) (alert (strcat "Tarama tamamlandi!\nBulunan objelerden " (itoa eklenen) " adet yeni kose noktasi eklendi.")) ) (alert "Sectiginiz renk ve layer ozelliklerine uygun obje cizimde bulunamadi!") ) ) ) ) (defun nkt-duzenle-dialog-disari (item / dcl-id sonuc eski-ad ents) (setq eski-ad (car item)) (setq dcl-id (load_dialog *dcl-yol*)) (if (not (new_dialog "nokta_duzenle" dcl-id)) (progn (unload_dialog dcl-id) (exit))) (set_tile "edt_ad" (car item)) (set_tile "edt_x" (rtos (cadr item) 2 3)) (set_tile "edt_y" (rtos (caddr item) 2 3)) (set_tile "edt_z" (rtos (cadddr item) 2 3)) (action_tile "btn_kaydet" "(progn (setq *tmp-ad* (get_tile \"edt_ad\") *tmp-x* (atof (get_tile \"edt_x\")) *tmp-y* (atof (get_tile \"edt_y\")) *tmp-z* (atof (get_tile \"edt_z\"))) (if (= *tmp-ad* \"\") (set_tile \"error\" \"Nokta adi bos olamaz!\") (done_dialog 1)))") (action_tile "btn_iptal" "(done_dialog 0)") (setq sonuc (start_dialog)) (unload_dialog dcl-id) (if (= sonuc 1) (progn (nkt-cizimdeki-sil item) (nkt-listeden-sil eski-ad) (nkt-katman-hazirla) (setq ents (nkt-ciz (list *tmp-x* *tmp-y* *tmp-z*) *tmp-ad*)) (setq *nkt-liste* (append *nkt-liste* (list (list *tmp-ad* *tmp-x* *tmp-y* *tmp-z* (car ents) (cadr ents))))) (princ (strcat "\n>> " *tmp-ad* " guncellendi.")) ) ) ) ;; ------------------------------------------------------------- (defun nkt-ncn-kaydet ( / yol dosya item) (if (null *nkt-liste*) (progn (alert "Kaydedilecek nokta yok!") (exit))) (setq yol (getfiled "Nokta Dosyasini Kaydet" "" "ncn" 1)) (if (null yol) (exit)) (setq dosya (open yol "w")) (foreach item *nkt-liste* (write-line (strcat (car item) " " (rtos (cadr item) 2 3) " " (rtos (caddr item) 2 3) " " (rtos (cadddr item) 2 3)) dosya) ) (close dosya) (alert (strcat (itoa (length *nkt-liste*)) " nokta temiz formatta kaydedildi:\n" yol))) ;; ------------------------------------------------------------- (defun nkt-csv-kaydet ( / yol dosya item) (if (null *nkt-liste*) (progn (alert "Kaydedilecek nokta yok!") (exit))) (setq yol (getfiled "CSV Dosyasini Kaydet" "" "csv" 1)) (if (null yol) (exit)) (setq dosya (open yol "w")) (write-line "NoktaAdi,X,Y,Z" dosya) (foreach item *nkt-liste* (write-line (strcat (car item) "," (rtos (cadr item) 2 3) "," (rtos (caddr item) 2 3) "," (rtos (cadddr item) 2 3)) dosya)) (close dosya) (alert (strcat "CSV kaydedildi:\n" yol))) (defun nkt-rapor-goster ( / dcl-id satirlar item) (setq dcl-id (load_dialog *dcl-yol*)) (if (not (new_dialog "nokta_rapor" dcl-id)) (progn (unload_dialog dcl-id) (exit))) (setq satirlar (list " No X Y Z" " -------- -------------- -------------- --------")) (foreach item *nkt-liste* (setq satirlar (append satirlar (list (strcat " " (nkt-pad (car item) 10) (nkt-pad (rtos (cadr item) 2 3) 16) (nkt-pad (rtos (caddr item) 2 3) 16) (rtos (cadddr item) 2 3)))))) (start_list "lst_rapor") (mapcar 'add_list satirlar) (end_list) (set_tile "inf_toplam_r" (strcat "Toplam: " (itoa (length *nkt-liste*)) " nokta")) (start_dialog) (unload_dialog dcl-id)) (defun nkt-zoom-git (item / x y d) (if item (progn (setq x (cadr item) y (caddr item) d (* *nkt-yuksek* 20)) (command "._ZOOM" "_Window" (list (- x d) (- y d)) (list (+ x d) (+ y d)))))) (defun nkt-panel-ac ( / dcl-id sonuc secili) (setq dcl-id (load_dialog *dcl-yol*)) (if (not dcl-id) (progn (alert "DCL menusu yuklenemedi!") (exit))) (if (not (new_dialog "nokta_ana" dcl-id)) (progn (unload_dialog dcl-id) (alert "Dialog acilamadi!") (exit))) (setq *nkt-dcl-id* dcl-id) (set_tile "edt_yuksek" (rtos *nkt-yuksek* 2 3)) (set_tile "edt_katman" *nkt-katman*) (set_tile "edt_sayac" (itoa *nkt-sayac*)) (set_tile "edt_prefix" *nkt-prefix*) (set_tile "edt_cap" (rtos (* *nkt-cap* 2.0) 2 3)) (set_tile "rad_point" (if (= *nkt-tip* "point") "1" "0")) (set_tile "rad_daire" (if (= *nkt-tip* "daire") "1" "0")) (nkt-liste-guncelle dcl-id) (action_tile "btn_ekle" "(done_dialog 100)") (action_tile "btn_oto" "(done_dialog 104)") ;; YENI BUTON AKSIYONU (action_tile "btn_sil" "(progn (setq secili (nkt-secili-al)) (if secili (progn (nkt-cizimdeki-sil secili) (nkt-listeden-sil (car secili)) (nkt-liste-guncelle *nkt-dcl-id*) (set_tile \"error\" (strcat (car secili) \" silindi.\"))) (set_tile \"error\" \"Once listeden bir nokta secin!\")))") (action_tile "btn_duzenle" "(progn (setq *nkt-islem-secili* (nkt-secili-al)) (if *nkt-islem-secili* (done_dialog 103) (set_tile \"error\" \"Once listeden bir nokta secin!\")))") (action_tile "btn_zoom" "(progn (setq *nkt-islem-secili* (nkt-secili-al)) (if *nkt-islem-secili* (done_dialog 200) (set_tile \"error\" \"Once listeden bir nokta secin!\")))") (action_tile "btn_tumu_sil" "(progn (foreach item *nkt-liste* (nkt-cizimdeki-sil item)) (setq *nkt-liste* '()) (setq *nkt-sayac* 1) (nkt-liste-guncelle *nkt-dcl-id*) (set_tile \"error\" \"Tum noktalar ve cizimler silindi.\"))") (action_tile "btn_sayac" "(progn (setq *nkt-sayac* (atoi (get_tile \"edt_sayac\"))) (nkt-liste-guncelle *nkt-dcl-id*) (set_tile \"error\" (strcat \"Sayac ayarlandi: \" (nkt-isim *nkt-sayac*))))") (action_tile "btn_prefix" "(progn (setq *nkt-prefix* (get_tile \"edt_prefix\")) (nkt-liste-guncelle *nkt-dcl-id*) (set_tile \"error\" (strcat \"Onek: \" *nkt-prefix*)))") (action_tile "btn_yuksek" "(progn (setq *nkt-yuksek* (atof (get_tile \"edt_yuksek\"))) (nkt-liste-guncelle *nkt-dcl-id*) (set_tile \"error\" (strcat \"Yazi yuksekligi: \" (rtos *nkt-yuksek* 2 3))))") (action_tile "btn_cap" "(progn (setq *nkt-cap* (/ (atof (get_tile \"edt_cap\")) 2.0)) (set_tile \"error\" (strcat \"Daire capi: \" (rtos (* *nkt-cap* 2.0) 2 3))))") (action_tile "edt_katman" "(setq *nkt-katman* (get_tile \"edt_katman\"))") (action_tile "rad_point" "(setq *nkt-tip* \"point\")") (action_tile "rad_daire" "(setq *nkt-tip* \"daire\")") (action_tile "btn_ncn" "(done_dialog 300)") (action_tile "btn_txt" "(done_dialog 301)") (action_tile "btn_rapor" "(done_dialog 302)") (action_tile "btn_yenile" "(nkt-liste-guncelle *nkt-dcl-id*)") (action_tile "btn_kapat" "(done_dialog 0)") (setq sonuc (start_dialog)) (unload_dialog dcl-id) sonuc) ;; ANA DONGU (defun nkt-calistir ( / sonuc devam) (nkt-dcl-hazirla) (setq devam T) (while devam (setq sonuc (nkt-panel-ac)) (cond ((= sonuc 0) (setq devam nil)) ((= sonuc 100) (nkt-ekle-mod-ardisik)) ((= sonuc 103) (nkt-duzenle-dialog-disari *nkt-islem-secili*)) ((= sonuc 104) (nkt-otomatik-nokta-ekle)) ;; YENI: OTOMATIK TARAMA ((= sonuc 200) (nkt-zoom-git *nkt-islem-secili*)) ((= sonuc 300) (nkt-ncn-kaydet)) ((= sonuc 301) (nkt-csv-kaydet)) ((= sonuc 302) (nkt-rapor-goster)) (T (setq devam nil)))) (if (findfile *dcl-yol*) (vl-file-delete *dcl-yol*)) ) (defun C:NP () (nkt-calistir) (princ)) (defun C:NOKTAPANEL () (C:NP)) (princ "\n+------------------------------------------+") (princ "\n| Nokta Paneli v3.2 (Otomatik Tarama) Yuklendi|") (princ "\n| Baslatmak icin: NP veya NOKTAPANEL yazin |") (princ "\n+------------------------------------------+") (princ) ;;; furkanozcelik.com.tr