14.05.2011 17:24    

afrasiyab45
Kendim yazmaya çalıştım ama beceremedim. elimde sadece line objelerinden oluşmuş bir çizim var. bu line objelerinin başlangıç ve bitiş noktalarına birer point objesi koymayı istiyorum ve bunu bir kerede yapmak istiyorum. bütün line objelerini tek seferde seçip point objeleri oluşsun istiyorum.

14.05.2011 18:43    

ProhibiT
Merhaba afrasiyab45 kardeşim :)

özel mesajla yazıp göndermiştim sana. başka arkadaşlar için de örnek olabilir düşüncesiyle buradan da paylaşmak istedim.

Kod:

(defun c:Nokta (/ Lns L n obje obdb Sp Ep) ;;; Fonksiyonumuzun adı "Nokta"
  ;;; AutoCAD komut satırından "Nokta" girerek çalıştırabiliyoruz.
  ;;; (defun Nokta () şeklinde yazsaydık komut satırından çaığramazdık.
  ;;; Parantez içinde / işaretinden sonra, fonksiyon içinde kullanacağımız
  ;;; değişkenleri Local olarak tanımlıyoruz ki;
  ;;; fonksyion çıkşında, hafıza temizlensin, ve aynı isimli değişkenler,
  ;;; başka fonksyionlar tarafında da kullanılabilsin.
  (setvar "cmdecho" 0) ;;; Aslında fonksiyon içinde AutoCAD Command kullanmadığımız için buna gerek yok.
  ;;; Mesela, (command "_.Line"... gibi command kullansaydık,
  ;;; bu komutun gereksiz mesajlarının (echo'larının) ekranda görünmesini engellemek
  ;;; için kullanıyoruz aslında.
  (command "undo" "group") ;;; AutoCAD'den Undo yaptığımızda fonksiyonumuzun işlemlerini tek adımda
  ;;; geri döndürmek için Undo Group oluşturuyoruz.
  (setq Lns (ssget "x" (list (cons 0 "LINE")))) ;;; Çizim içindeki tün LINE objelerini seçerek oluşturduğumuz
  ;;; Seçim setini (selection set) Lns değişkenine atadık.
  (setq L (sslength Lns)) ;;; Seşim setinin eleman sayısını (Lns değişkeninin uzunluğu)
  ;;; L değişkenine atadık.
  (setq n 0) ;;; n değişkeninin değeririni sıfırladık.
  (while (< n L) ;;; n değeri L'den küçük olduğu sürece tekrarlanacak bir döngü kuruyoruz.
    ;;; yani seçim setinde yer alan Line objesi sayısı kadar tekralanacak bir işlem gurubu.
    (setq obje (ssname Lns n)) ;;; Lns seçim setinin n'inci objesinin adını "Entity Name" obje değişkenine atadık.
    (setq obdb (entget obje)) ;;; obje'nin database listesini obdd değişkenine atadık.
    (setq Sp (assoc 10 obdb)) ;;; Listeden 10 ile anahtarlanmış başlangıç noktası (Start Point) koordinatını
    ;;; alıp Sp değişkenine atadık. bu değer (10 X Y Z) formatındadır.
    ;;; X, Y ve Z noktanın koordinatlarını tanımlayan real sayılardır.
    (setq Sp (cdr Sp)) ;;; Sp'yi gerçek nokta koordinatı haline getirmek için başındaki 10'u attık.
    ;;; (cdr... ilk elaman hariç listenin geri kalanı demek.
    ;;; Line objesinin End Point'i 11 ile anahtarlıdır.
    (setq Ep (cdr (assoc 11 obdb))) ;;; aynı işlemleri doğrunu bitiş noktası (End Point) için yaptık.
  ;;; bu sefer, assoc ve cdr yi birlikte kullanıp, tek adımda işemi tamamladık.
    (entmake ;;; obje (Entity) oluşturuyoruz
      (list (cons 0 "POINT") ;;; Oluşturulan objenin türü POINT
   (cons 8 "KoseNokta") ;;; KoseNoktası Layer'ında oluşturulacak
   (cons 10 Sp) ;;; Sp ile tanımlı koordinatlarda oluşturulacak
)
    )
    (entmake (list (cons 0 "POINT") (cons 8 "KoseNokta") (cons 10 Ep)))
    ;;; Doğrunun bitiş noktasında da bir point objesi oluşturduk
    (setq n (+ n 1)) ;;; Loop sayacımızı bir artırıp,
    ;;; seçim setindeki bir sonraki obje için aynı işlemleri tekrarlıyoruz
  ) ;;; Loop sonu 
  (command "undo" "e") ;;; Undo gurubunu sonlandırıyoruz.
  ;;; AutoCAD komut satırından, "U" girince gurubun başlangıcını tanımladığımız
  ;;; noktaya kadar tek komutla geri dönebileceğiz.
  (prin1) ;;; Fonksiyondan, sessiz ve temiz bir çıkış için boş bir satır yazdırıyoruz.
  ;;; Aksi halde son kullanılan AutoLisp fonksiyonunun ürettiği değer ekrana yazılacaktır.
) ;;; Fonksiyon sonu.

Bu fonksiyon aslında şöyle yazılsa daha doğru olur;
Kod:

(defun c:NoktaS (/ Lns L n)
  (setvar "cmdecho" 0) (command "undo" "group")
  (setq Lns (ssget "x" (list (cons 0 "LINE"))) L (sslength Lns) n -1)
  (while (< (setq n (1+ n)) L)
    (emk (cdr (assoc 10 (entget (ssname Lns n)))))
    (emk (cdr (assoc 11 (entget (ssname Lns n))))))
  (command "undo" "e") (prin1)
)
(defun emk (coor /) (entmake (list (cons 0 "POINT") (cons 8 "KoseNokta") (cons 10 coor))))

Kolay gelsin.

16.05.2011 16:33    

afrasiyab45
Çok sağolun prohibit abi emeğinize sağlık

> 1 <
Copyright © 2004-2022 SQL: 0.924 saniye - Sorgu: 47 - Ortalama: 0.01966 saniye