AutoCAD • AutoLISP • Programlama • Püfler • Komutlar • Terimler • Eğitim
aLd • TCad • FacadeCAD • Cephe Kot • HQ Library • FreeMUST • Pasdoc.A
19.07.2011 18:33    

pitsss
Iyi akşamlar arkadaşlar. aşağıdaki kodlarda ilk döngüde sonsuz döngü oluşturdum. hemen ardından text seçmesini istiyorum ve ardından kendi isteğine göre noktalar seçmesini istiyorum. mesela 1. noktayı seçecek ardından 2. noktayı seçecek. böyle istediği kadar nokta çifti seçecek. eğer sağ tuş tıklar ise nokta döngüsünden çıkıp başa dönecek ve text seçmesini isteyecek ardından yine noktaları seçmesini isteyecek. ancak bunu bi türlü başaramadım. nokta döngüsünden sağ tıklasam da çıkmıyor maalesef. bu sorunu nasıl aşabilirim. teşekkürler...

Kod:

( c:dnm ()

(setq dnil nil)
  (while (= dnil nil)
(setq dm (entsel "\n TEXT İ SEÇİNİZ:"))
(setq anil nil)
    (while (= anil nil)
       (setq ay (getpoint "n birinci nokta: "))
    (setq ab (getpoint "n ikinci nokta : "))
      (if (= ay nil)
(progn
  (if (= (getvar "errno") 52)
    (progn
      (setq anil t)
      (setvar "errno" 0)
      )))))))

19.07.2011 19:28    

ProhibiT
Bu kadar uzun ve karmaşık işleme gerek yok ki;
Kod:

(defun c:dnm (/ dm ay ab)
  (while (setq dm (entsel "\n Text'i seçiniz: "))
    (while
      (and (setq ay (getpoint "\n Birinci Nokta: "))
           (setq ab (getpoint "\n  Ä°kinci Nokta: ")))
      (princ "\n Seçilen 2 nokta ve Text iÅŸlendi...")
    )
    (princ "\n    Nokta seçimi sonlandı, yeni Text seçilecek...")
  )
  (princ "\n      Yeni text seçilmediÄŸi için iÅŸlem tamamlandı...")
)

Ne yapılmak istendiğini tam anlamamakla birlikte, ben olsam;

- Text seçimini kontrollü yapıp, seçilmeye çalışan obje Text değilse
veya Enter girilip text seçilmemişse, temiz çıkış için...
- birinci nokta seçildikten sonra elastik bant (rubber band) kullanılarak,
ikinci noktanın seçiminin boşlukta kalmaması, yeni noktanın
mouse ile doğrultu belirlenip, klavyeden nümerik olarak ta girilebilmesi için.

Şu şekilde yazardım
Kod:

(defun c:dnm (/ dm ay ab)
  (princ "\n Text'i Seçiniz: ")
  (while (setq dm (ssget ":s" (list (cons 0 "*text"))))
    (setq dm (ssname dm 0))
    (while (and (setq ay (getpoint "\n Birinci Nokta: "))
                (setq ab (getpoint ay "\n  Ä°kinci Nokta: ")))
      (princ "\n Yeni nokta çifti iÅŸlendi...")))
)

ProhibiT (20.07.2011 21:22 GMT)

19.07.2011 20:10    

pitsss
@prohibit
hocam gerçekten çok teşekkür ederim. iki kodda tam istediğim gibi olmuş. harikasınız. ben niçin düşünemiyorum böyle acaba :)
ayrıca. while olayını tam çözemedim ben daha. birinci kodlamınızdaki while olaylarını biraz anlatabilir misiniz? text seçildiği sürece döngüde mi kal diyorsunuz? ayrıca pointler seçildiği sürece döngüde mi kal diyorsunuz. buradaki while lardan bu sonuçları mı çıkarmalıyım ?

19.07.2011 21:52    

ProhibiT
Herşeyden önce, lisp dilini iyi anlamak lazım. fortran 2d'den başlayarak, assembly'de dahil aklınıza gelebilecek hemen tüm programlama dillerini kullandım. halen de kullanıyorum. bu bakımdan karşılaştırma şansı olan biri olarak söyleyebilirim ki; lisp bambaşka bir dil. zaten suni zeka (artificial intelligence) çalışmaları sırasında ortaya çıkan bir dil. insanların çoğu farkında değil ama, açık kaynak kodlu (open source) programların pek çoğu da lisp dilinde yazılmıştır. daha önce de bahsetmiştim. açık kaynak kodlu, stüdyo ses kayıt programlarının zirvelerinden biri olan audacity de lisp ile yazılmıştır. cad'çiler arasında, bir tek autolisp ve visuallisp var sanılıyor. halbuki autolisp ve visual lisp genel lisp programlama dilinin yalnızca özel lehçeleridir.

lisp in bu son derece kendine has özelliklerini kavrayıp alıştıktan sonra, düşüncelerinizin akışına bırakın kendinizi, akıp giden düşünce silsilesinde yazın. çünki lisp düşünceler gibi akıcıdır.

While döngüsü olayına gelince;

(while (Test) (iÅŸlemler) )
Test işleminin sonucu True olduğu sürece işlemler tekrarlanacaktır.

sizin örneğinizde, ilk while loop ta, test işlemi = seçilen obje text mi?
ben genelde, burada olduğu gibi, obje seçimini test bölümünde yapıyorum.
başka bazı dillerdeki mantıkla yazsaydık; while loop'a girmeden bir obje seçmemiz,
test bölümünde kontrol etmemiz, while loop'un içinde ama sonunda tekrar obje seçmemiz gerekecekti.

yukarıda verdiğim 2. örnekte, text objesinin seçimini entsel ile değil de ssget ile yapıyorum.
ssget'in ":s" özelliğini kullanarak tek obje seçiyorum. gene ssget'in filters özelliğini kullanarak yapnızca "text" objesi seçiyorum. ssget ile bu işlemi yaparken bahsettiğim kolaylıklarının yanında bazı problemleri de oluyor. fonksiyon object name olarak değil selection set olarak dönüyor. bunun için de tek objelik seçim setinden, (ssname ss 0) ile object name'e dönüyorum.

burada paylaştığım pek çok fonksiyonda, dikkat edilince görülebilecek bir uygulamamdan bahsedeyim; bir obje gurubu seçeceğiz ve bu selection set içindeki her bir objeyi sırasıyla işleme alacağız. çok karşılaştığımız bir işlem şekli.

lisp'in akıcılığını yakalayamış bir yazar bunu şöyle yazıyor.
(setq ss (ssget)) ;;; obje grubumuzu seçiyoruz.
(setq l (sslength ss) ;;; gurup içinde kaç obje olduğunu buluyoruz.
(setq n 0) ;;; sayaç olarak kullanacağımız n değerini sıfırlıyoruz.
(while (< n l) ;;; döngüye girdik, n sayacı l'den küçük olduğu sürece tekrarlanacak.
(..... iÅŸlemler....)
(setq n (+ n 1) ;;; sayaç değişkenimizin değerini 1 artırıyoruz.
)

ben buna benzer iÅŸlemi;
(setq l (sslength (setq ss (ssget))) n -1) ;;; burada setq içinde setq kullanımına dikkat.
(while (< (setq n (1+ n)) l)
(....IÅŸlemler...))


şeklinde, çoğu zaman da tek satırda yapıp bitiriyorum. daha derli toplu (compact) kod algoritmayı ıskalama riskimizi azaltıyor

gene sizin örneğinize dönersek;
ilk while loop'un içindeki işlem: her seferinde bir çift nokta seçimi yapıldığı sürece nokta seçmeye devam edeceğiz.
bir while loop daha kuruyoruz, burada test bölümü, iki nokta seçiminin de true dönmesi.
bu sebeple (and (setq ay (getpoint)) (setq ab (getpoint))) ÅŸeklinde bir test kuruyoruz.
bunun bir alternatifi de; (setq ay (getpoint) ab (getpoint)) olabilirdi.
ilkinde noktalardan herhangi biri nil döndüğünde döngü sonlanırken.
ikincisinde döngünün sonlanması için mutlaka ab değerinin nil dönmesi gerekirdi.
ay=nil ab=true durumunda döngüden çıkılamazdı.
iç while döngüsünden çıkınca, işlem dış döngünün obje (text) seçimiyle devam ediyor.

kolay gelsin...

ProhibiT (20.07.2011 05:11 GMT)

20.07.2011 20:10    

pitsss
@prohibit
hocam tekrar teşekkür ederim. çok güzel ve açıklayıcı bilgiler olmuş. while olayı ile ilgili bilgilerim arttı. iyi çalışmalar diliyorum... akıcı bir şekilde lisp yazmayı öğrenebilirim inşallah.

> 1 <
Copyright © 2004-2022 SQL: 1.078 saniye - Sorgu: 59 - Ortalama: 0.01828 saniye