13.01.2011 14:20    

ehya
nil değerinin bir anlamı yoktur. Eğer istemiyorsanız programın sonundaki ) işaretinden önce (princ) satırını ekleyin. Bir daha uyarı vermeyecektir.

Programı başka bir programın içine koymanıza rağmen işlem yapmıyorsa incelemek lazım. Ezbere birşey söylemek olmaz...

14.01.2011 06:41    

yoldasgokhan
teşekkürler.nil yzısı gitti.fakat diğerr programa koyduğumda dirsek seçeneği seçildiğinde "D,N1,ang11,ang21 değerleri girildikten sonra alttaki mesjı veriyor ve tekbir çizgi çiziyor.

"Radius must be non-zero."
; error: Function cancelled
*Invalid*

program aşağıdadır.lisple yeni ilgilenmeye başladım o yüzden basit hatalar olabilir.


(defun c:dnm(/ D A R L karar ang11 ang21 ang5 N1 N2 N3 N4 N5 N6 N7 k1 k2 k3 k4 k5 k6)
(setvar "cmdecho" 0)
(setq D (getreal "\n boru capını giriniz:"))
(setq A (/ 2 D))
(setq R (* A 3))
(initget 1 "b d")
(setq karar (getkword "\ndirsek mi boru mu calıssın ?<d/b>: "))
(if (= karar "d")
(progn
(setq N1 (getpoint "\n baslangıç noktası:"))
(setq ang11 (getreal "\n başlangıç açı değeri nedir?:"))
(setq ang21 (getreal "\n bitiş açı değeri nedir?:"))
(setq N2 (polar N1 (/(* ang11 pi) 180) (- R A)))
(setq N3 (polar N1 (/(* ang11 pi) 180) R))
(setq N4 (polar N3 (/(* ang11 pi) 180) A))
(setq N5 (polar N1 (/(* (+ ang11 ang21) pi) 180) (- R A)))
(setq N6 (polar N1 (/(* (+ ang11 ang21) pi) 180) R))
(setq N7 (polar N1 (/(* (+ ang11 ang21) pi) 180) (+ R A)))
(setvar "cmdecho" 1)
(command "line" N2 N3 N4 "")
(command "line" N5 N6 N7 "")
(command "arc" N2 "c" N1 "a" ang21)
(command "arc" N3 "c" N1 "a" ang21)
(command "arc" N4 "c" N1 "a" ang21)
(princ)
)

(progn
(setvar "cmdecho" 0)
(setq k5 (getpoint "\n 1.baslangıc noktası nedir?:"))
(setq ang5 (getreal "\n açı degeri nedir?:"))
(setq L (getreal "\n boru boyu nedir?:"))
(setq k6 (polar k5 (/(* ang5 pi) 180) L))
(setq k1 (polar k5 (+ (/(* ang5 pi) 180) (/(* 90 pi) 180)) (/ D 2)))
(setq k2 (polar k5 (+ (/(* ang5 pi) 180) (/(* 270 pi) 180)) (/ D 2)))
(setq k3 (polar k1 (/(* ang5 pi) 180) L))
(setq k4 (polar k2 (/(* ang5 pi) 180) L))
(setvar "dcmedho" 1)
(command "line" k2 k4 "")
(command "line" k5 k6 "")
(command "line" k1 k3 "")
(command "line" k3 k4 "")
(command "line" k1 k2 "")
)
)
)

ayrıca "cmdecho" tam olarak ne işe yarıyor.örneklerde gördüğüm için koydum.detaylı olarak anlatırsanız sevinirim.

yoldasgokhan (14.01.2011 07:14 GMT)

14.01.2011 07:17    

ehya
öncelikle (setvar "dcmedho" 1) satırını (setvar "cmdecho" 1) olarak değiştirmelisin.

Bu hatana gelince, boruyu dirsekten çizdirmek istediğinde başlangıç ve bitiş açı değerleri aynı olunca bu hatayı veriyor. Ne çizimi olduğunu bilmediğim için sorunun çözümü konusunda net birşey söyleyemem...

14.01.2011 07:53    

yoldasgokhan
resim nasıl yapıştırıyoz bi türlü resim ekleyemedim.

yoldasgokhan (14.01.2011 08:08 GMT)

14.01.2011 08:28    

ehya
www.imageshack.us sitesine resmi upload edin. Verdiği linki mesajınıza ekleyin.

14.01.2011 08:38    

yoldasgokhan


Linkleri görebilmek için ÜYE olmalısınız.



linkteki dirsek resmi buradan programın nasıl olduğunu daha iyi anlayabilirsin.


(defun c:dnm(/ D A R L karar ang11 ang21 ang5 N1 N2 N3 N4 N5 N6 N7 k1 k2 k3 k4 k5 k6)
(setvar "cmdecho" 0)
(setq D (getreal "\n boru capını giriniz:"))
(setq A (/ 2 D))
(setq R (* A 3))
(initget 1 "b d")
(setq karar (getkword "\ndirsek mi boru mu calıssın ?<d/b>: "))
(if (= karar "d")
(progn
(setq N1 (getpoint "\n baslangıç noktası:"))
(setq ang11 (getreal "\n başlangıç açı değeri nedir?:"))
(setq ang21 (getreal "\n bitiş açı değeri nedir?:"))
(setq N2 (polar N1 (/(* ang11 pi) 180) (- R A)))
(setq N3 (polar N1 (/(* ang11 pi) 180) R))
(setq N4 (polar N3 (/(* ang11 pi) 180) A))
(setq N5 (polar N1 (/(* (+ ang11 ang21) pi) 180) (- R A)))
(setq N6 (polar N1 (/(* (+ ang11 ang21) pi) 180) R))
(setq N7 (polar N1 (/(* (+ ang11 ang21) pi) 180) (+ R A)))
(setvar "cmdecho" 1)
(command "line" N2 N3 N4 "")
(command "line" N5 N6 N7 "")
(command "arc" N2 "c" N1 "a" ang21)
(command "arc" N3 "c" N1 "a" ang21)
(command "arc" N4 "c" N1 "a" ang21)
(princ)
)

(progn
(setvar "cmdecho" 0)
(setq k5 (getpoint "\n 1.baslangıc noktası nedir?:"))
(setq ang5 (getreal "\n açı degeri nedir?:"))
(setq L (getreal "\n boru boyu nedir?:"))
(setq k6 (polar k5 (/(* ang5 pi) 180) L))
(setq k1 (polar k5 (+ (/(* ang5 pi) 180) (/(* 90 pi) 180)) (/ D 2)))
(setq k2 (polar k5 (+ (/(* ang5 pi) 180) (/(* 270 pi) 180)) (/ D 2)))
(setq k3 (polar k1 (/(* ang5 pi) 180) L))
(setq k4 (polar k2 (/(* ang5 pi) 180) L))
(setvar "cmdecho" 1)
(command "line" k2 k4 "")
(command "line" k5 k6 "")
(command "line" k1 k3 "")
(command "line" k3 k4 "")
(command "line" k1 k2 "")
)
)
)

14.01.2011 08:40    

ProhibiT
Merhaba ehya hocam,

Bu mesajı dün görmüştüm ama cevap yazma fırsatı bulamamıştım. Arkadaşımıza bazı tavsiyelerim olacak, umarım geç kalmamışımdır :)

Öncelikle, bazı kavramları ifade edişinizi mutlaka düzenlemenizi tavsiye ederim. İnsanlar konuştukları gibi yazar, yazdıkları gibi düşünürler. Size garip gelmesin, "Ben AutoLisp sordum, Türkçe dersi gibi cevap yazmış" diye düşünmeyin. Dikkat edince bana hak vereceksiniz.

- Cümlelerinize büyük harfle başlayınız.
- Cümle sonundaki noktadan sonra yeni cümleyi yazmaya başlamadan önce bir boşluk bırakınız.
- Devrik cümle kurmak edebi sanatlar bakımından hoş olabilir. Ama tehlikelidir, burada devrik cümlelerde anlamı kaybediyorsunuz.
- autolisp'te bir program yazılmaz, AutoLisp ile bir program yazılır.
- "çizimi çizmek" nedir?
- Program bir fonksiyonlar bütünüdür. "Burada bir program yazdım, başka bir programın içine koyunca..." ifadesinin bir anlamı yok.
- Yazılan fonksiyonun kodunu başka bir fonksiyon ya da program içine olduğu gibi kopyalamaktan mı bahsediyoruz?
- Yoksa; bahsedilen fonksiyonun başka bir fonksiyon ya da program dan çağırılmasından mı?

Son mesajınızdaki sorunuzun cevabı "başka bir programın içine koyunca" ifadesinden neyi kasdettiğinize göre değişir. Bununla beraber, tahmin yürüterek size bi ipucu vermek isterim.

defun fonksiyonunun temel ifadesi; (defun sym ([arguments] [/ variables...]) expr...) şeklindedir. Sizin fonksiyonunuzda;
sym=c:dnm
arguments=kullanılmamış
variables=D A R L karar ang11 ang21 ang5 N1 N2 N3 N4 N5 N6 N7 k1 k2 k3 k4 k5 k6

Arguments bölümüne fonksyionun beklediği değişken isimlerini yazılır.
Variables bölümüne yazılan değişken isimleri, Yerel Değişkenler (local variables) olarak tanımlanmış olurlar.

Bunları örnekleyerek açıklamak gerekirse;

(defun c:Ax (/ xx1) (setq xx1 (getreal "\nSayı giriniz: ")))
Tanımlanan Ax isimli fonksiyonu çalıştırıp, xx1 değişkenine bir değer girdiğimizde; söz konusu xx1 değişkeni Local Variable olarak tanımlamdığından, başka bir fonksiyon tarafından ulaşılamaz. Fonksiyonu çalıştırıp, AutoCAD komut satırından (list xx1) girdiğimizde nil dönecektir.

(defun c:Ay () (princ xx1))
(defun c:Ax (/ xx1) (setq xx1 (getreal "\nSayı giriniz: ")))
Şeklinde 2 fonkksiyon tanımlayıp, Herhangi bir şekilde Ay'yi çağırdığımızda, mesela AutoCAD komut satırından;
Command: Ay girdiğimizde
nilnil Ay fonksiyonu xx1 değişkeninin değerini yazamayacak ve nil dönecektir.
Çünki; xx1 değişkeni Ax fonksiyonunda Local olarak tanımlanmış ve Ay fonksyionunun Arguments listesinde de yer almamaktadır.

Hedeflediğimiz işlemi sağlıklı olarak gerçekleştirmek için bir kaç yol var:

xx1 değişkenini Local olarak tanımlamamak:
(defun c:Ay () (princ xx1))
(defun c:Ax () (setq xx1 (getreal "\nSayı giriniz: ")))
bu durumda Ay fonksiyonu xx1 değişkeninin değerini yazdırabilecektir.

Ay fonksyionun Ax fonksyionunun içinden çağırmak ve xx1 değişkenini Ay fonksiyonunun Arguments listesine koymak:
(defun Ay (xx1 / ) (princ xx1))
(defun c:Ax (/ xx1) (setq xx1 (getreal "\nSayı giriniz: ")) (Ay))

Son örneğimizi, biraz daha farklı yazmak ta mümkün;
(defun Ay (yy1 / ) (princ xx1))
(defun c:Ax (/ xx1) (setq xx1 (getreal "\nSayı giriniz: ")) (Ay (xx1)))
Argument listesindeki yy1'in xx1'in değerini aldığına dikkat ediniz.

Gelelim burada paylaştığınız AutoLisp fonksiyon koduna;

ehya hocamın bahsettiği (princ) komutunu IF-THEN-ELSE blokunun THEN bölümünün sonuna koymuşsunuz. IF blokundan çıktıktan sonra en sona koymanız gerekirdi.

Girişte sıfırladığınız cmdecho değişkeninin değerini, bazı yerlerde neden açıp kapatma gereği duyuyoruz ki?

IF-THEN-ELSE blokunun ELSE kısmında cmdecho yerine cdmecho yazmışsınız (ehya hocam yazmış, düzeltmişsiniz)

Peşpeşe çok sayıda setq kullanacağınız zaman, her biri için ayrı setq kullanmayın, bütün değer atamaları bir tek setq altında toplayabilirsiniz. Bu hem takip edilebilirliği kolaylaştırır, hem de karmaşık fonksiyonlarda işlemciyi hırpalamaz.

Burada belirlediğimiz presipler doğrultusunda fonksiyonunuzu;
Kod:

(defun c:dnm (/ D A R L karar ang11 ang21 ang5 N1 N2 N3 N4 N5 N6 N7 k1 k2 k3 k4 k5 k6)
  (setvar "cmdecho" 0)
  (setq D (getreal "\n boru capını giriniz:") A (/ 2 D) R (* A 3))
  (initget 1 "b d")
  (setq karar (getkword "\ndirsek mi boru mu calıssın ?<d/b>: "))
  (if (= karar "d")
    (progn
      (setq N1 (getpoint "\n baslangıç noktası:")
            ang11 (getreal "\n başlangıç açı değeri nedir?:")
            ang21 (getreal "\n bitiş açı değeri nedir?:")
            N2 (polar N1 (/ (* ang11 pi) 180) (- R A))
            N3 (polar N1 (/ (* ang11 pi) 180) R)
            N4 (polar N3 (/ (* ang11 pi) 180) A)
            N5 (polar N1 (/ (* (+ ang11 ang21) pi) 180) (- R A))
            N6 (polar N1 (/ (* (+ ang11 ang21) pi) 180) R)
            N7 (polar N1 (/ (* (+ ang11 ang21) pi) 180) (+ R A)))
      (command "line" N2 N3 N4 "")
      (command "line" N5 N6 N7 "")
      (command "arc" N2 "c" N1 "a" ang21)
      (command "arc" N3 "c" N1 "a" ang21)
      (command "arc" N4 "c" N1 "a" ang21))
    (progn
      (setq k5 (getpoint "\n 1.baslangıc noktası nedir?:")
            ang5 (getreal "\n açı degeri nedir?:")
            L (getreal "\n boru boyu nedir?:")
            k6 (polar k5 (/ (* ang5 pi) 180) L)
            k1 (polar k5 (+ (/ (* ang5 pi) 180) (/ (* 90 pi) 180)) (/ D 2))
            k2 (polar k5 (+ (/ (* ang5 pi) 180) (/ (* 270 pi) 180)) (/ D 2))
            k3 (polar k1 (/ (* ang5 pi) 180) L)
            k4 (polar k2 (/ (* ang5 pi) 180) L))
      (command "line" k2 k4 "")
      (command "line" k5 k6 "")
      (command "line" k1 k3 "")
      (command "line" k3 k4 "")
      (command "line" k1 k2 "")))
  (princ)
)
şeklinde yazmak daha doğru olmaz mı?

Kolay gelsin...

ProhibiT (14.01.2011 09:11 GMT)

14.01.2011 09:02    

yoldasgokhan
Arguments kullanmadığım halde sadece dirsek çizimi yapıldığında çizimi sorunsuz nil yazmadan çiziyor.
Hem dirsek hem boru çizimi yapılmak istendiğinde dirsekte sorun veriyor fakat boru çizimi gerçekleşiyor.Sorun arguments larda olsaydı ikisinide çizmemesi gerekmezmiydi?

14.01.2011 09:18    

ProhibiT
Mesajımda bahsettiğim gibi, ehya hocamın fonksyiondan temiz çıkışla ilgili tavsiye ettiği (princ) komutunu, if-then-else blokunun içinde kullanmışsınız. (= karar "d") ise (princ) uygulanıyor, değilse uygulanmıyor. Bütün problem bu.
.
.
.
(command "arc" N2 "c" N1 "a" ang21)
(command "arc" N3 "c" N1 "a" ang21)
(command "arc" N4 "c" N1 "a" ang21)
(princ) ;;; bu komutu buradan kaldırıp...
)

(progn
(setvar "cmdecho" 0)
(setq k5 (getpoint "\n 1.baslangıc noktası nedir?:"))
(setq ang5 (getreal "\n açı degeri nedir?:"))
(setq L (getreal "\n boru boyu nedir?:"))
(setq k6 (polar k5 (/(* ang5 pi) 180) L))
(setq k1 (polar k5 (+ (/(* ang5 pi) 180) (/(* 90 pi) 180)) (/ D 2)))
(setq k2 (polar k5 (+ (/(* ang5 pi) 180) (/(* 270 pi) 180)) (/ D 2)))
(setq k3 (polar k1 (/(* ang5 pi) 180) L))
(setq k4 (polar k2 (/(* ang5 pi) 180) L))
(setvar "cmdecho" 1)
(command "line" k2 k4 "")
(command "line" k5 k6 "")
(command "line" k1 k3 "")
(command "line" k3 k4 "")
(command "line" k1 k2 "")
)
)
(princ) ;;;buraya koyarsanız
)

bahsettiğiniz problem çözülmüş olacaktır. defun fonksiyonu ve bahsettiğim arguments kavramının bu hata ile ilgisi yok.

Kolay gelsin.

ProhibiT (14.01.2011 09:55 GMT)

04.02.2011 17:47    

miyatu
Kod:

(defun c:aa ()
  (while (or (= (car (setq #grread (grread t 5 0))) 5)
     (= (car (setq #grread (grread t 5 0))) 2)
)
    (setq p1 (cadr #grread)
  p2 (polar p1 (* pi (/ 270 180.  0)) 110)
  p3 (polar p2 0.  0 110)
  p4 (polar p3 (/ pi 2) 220)
  p5 (polar p4 pi 220)
  p6 (polar p5 (* pi (/ 270 180.  0)) 220))
    (grdraw p6 p3 1 1)
    (grdraw p3 p4 1 1)
    (grdraw p4 p5 1 1)
    (grdraw p5 p6 1 1)
    (redraw)
    )
  )



benim sorunum (radraw) satırını kaldırınca cizimde sürekli kareler ciziliyor
koyarsamda simulasyanu göremiyorum.



şimdiden teşekkürler. . .

çözüldü
Kod:

(defun c:aa ()
  (while (or (= (car (setq #grread (grread t 5 0))) 5)
     (= (car (setq #grread (grread t 5 0))) 2)
)
    (redraw)
    (setq p1 (cadr #grread)
  p2 (polar p1 (* pi (/ 270 180.  0)) 110)
  p3 (polar p2 0.  0 110)
  p4 (polar p3 (/ pi 2) 220)
  p5 (polar p4 pi 220)
  p6 (polar p5 (* pi (/ 270 180.  0)) 220))
    (grdraw p6 p3 1 1)
    (grdraw p3 p4 1 1)
    (grdraw p4 p5 1 1)
    (grdraw p5 p6 1 1)
    )
    (redraw)
  )


seklinde yazınca sorun ortadan kalkıyor. . .

miyatu (04.02.2011 20:09 GMT)

05.02.2011 06:53    

oguz_z
Merhaba arkadaşlar

sitede line ları toplu polyline yapan lisp aşağıda verilmiş.


Kod:

(defun lka( / )
  (princ "elemanlari seçiniz: ")
  (setq sset (ssget))
  ; (setq sset (ssget "x" (list (cons 0 "lıne"))))
  (setq adet (sslength sset))
  (setq syc 0)
  (repeat adet
     (setq eleman (ssname sset syc))
     (setq elmblg (entget eleman))
     (if (= (cdr(assoc 0 elmblg)) "lıne")
       (progn
          (command "_pedıt" eleman "y" "joın" "all" "" "x")
       )
     )
     (setq syc (1+ syc))
  )
  (princ)
)


benim yapmak istediğim verilen 4 koordinat arasında ki bütün line ları seçip toplu polyline yapmak.
dörtgen içini bu kodlarla seçtirmeye çalışıyorum fakat olmuyor. yardımcı olabilir misiniz ?

Kod:

(defun c:1()

   (setq p1 (getpoint        "\n 1" ))
   (setq p2 (getpoint  "\n 2" ))
    (setq p3 (getpoint  "\n 3" ))
(setq p4 (getpoint  "\n 4" ))

   (setq s1 (ssget "w" p1  p2  )),
   (setq s1 (ssget "w" p2  p3  ))
   (setq s1 (ssget "w" p3  p4  ))
   (setq s2 (ssget "w" p4  p1  ))
)

05.02.2011 07:37    

ehya
Oguz_z

(defun c:1 ()
(setq p1 (getpoint "\n1. nokta:")
p2 (getpoint p1 "\n2. nokta:")
p3 (getpoint p2 "\n3. nokta:")
p4 (getpoint p3 "\n3. nokta:"))
(setq korlist (list p1 p2 p3 p4))
(setq secim (ssget "wp" korlist))
(sssetfirst nil secim)(princ))

05.02.2011 08:19    

oguz_z
Alıntı
ehya :
oguz_z

(defun c:1 ()
(setq p1 (getpoint "\n1. nokta:")
p2 (getpoint p1 "\n2. nokta:")
p3 (getpoint p2 "\n3. nokta:")
p4 (getpoint p3 "\n3. nokta:"))
(setq korlist (list p1 p2 p3 p4))
(setq secim (ssget "wp" korlist))
(sssetfirst nil secim)(princ))




ehya hocam bu yazdığınız kodu
Kod:

(defun lka( / )
  (princ "elemanlari seçiniz: ")
  (setq sset (ssget))
  ; (setq sset (ssget "x" (list (cons 0 "lıne"))))
  (setq adet (sslength sset))
  (setq syc 0)
  (repeat adet
     (setq eleman (ssname sset syc))
     (setq elmblg (entget eleman))
     (if (= (cdr(assoc 0 elmblg)) "lıne")
       (progn
          (command "_pedıt" eleman "y" "joın" "all" "" "x")
       )
     )
     (setq syc (1+ syc))
  )
  (princ)
)


bu program için nasıl uyarlayabiliriz ?

05.02.2011 09:06    

ehya
Kod:

(defun c:1 ()
(setq p1 (getpoint "\n1.  nokta:")
      p2 (getpoint p1 "\n2.  nokta:")
      p3 (getpoint p2 "\n3.  nokta:")
      p4 (getpoint p3 "\n3.  nokta:"))
(setq korlist (list p1 p2 p3 p4))
(setq secim (ssget "wp" korlist))
  (setq adet (sslength secim))
  (setq syc 0)
  (repeat adet
  (setq eleman (ssname secim syc))
     (setq elmblg (entget eleman))
     (if (= (cdr(assoc 0 elmblg)) "lıne")
       (progn
          (command "_pedit" eleman "y" "join" "all" "" "x")
       )
     )
     (setq syc (1+ syc))
  )
  (princ)
)



kod'un içindeki küçük harfle yazılmış line kelimesini büyük harfe çevir. sitedeki bir düzenlemeden dolayı doğru çıkmıyor.

05.02.2011 09:22    

oguz_z
Kodu line lar düzelttim ama yinede şöyle bir sorun çıkıyor

; error: bad argument type: lselsetp nil

Kod:

(defun c:1 ()
(setq p1 (getpoint     "\n1.   nokta:")
      p2 (getpoint p1  "\n2.   nokta:")
      p3 (getpoint p2  "\n3.   nokta:")
      p4 (getpoint p3  "\n4.   nokta:"))
 
(setq korlist (list p1 p2 p3 p4))
(setq secim (ssget "wp" korlist))
  (setq adet (sslength secim))
  (setq syc 0)
  (repeat adet
  (setq eleman (ssname secim syc))
     (setq elmblg (entget eleman))
     (if (= (cdr(assoc 0 elmblg)) "lıne")
       (progn
          (command "_pedıt" eleman "y" "joın" "all" "" "x")
       )
     )
     (setq syc (1+ syc))
  )
  (princ)
)

05.02.2011 09:38    

ehya
Hata olmaması gerek. denemesini yaptım. copy-paste yaparken küçük harfle "ı" harfinin olmamasına dikkat et. hepsi "i" olsun. line kelimesi ise büyük harfle olsun. .

05.02.2011 09:40    

oguz_z
Alıntı
oguz_z :
kodu line lar düzelttim ama yinede şöyle bir sorun çıkıyor

; error: bad argument type: lselsetp nil

Kod:

(defun c:1 ()
(setq p1 (getpoint     "\n1.    nokta:")
      p2 (getpoint p1  "\n2.    nokta:")
      p3 (getpoint p2  "\n3.    nokta:")
      p4 (getpoint p3  "\n4.    nokta:"))
 
(setq korlist (list p1 p2 p3 p4))
(setq secim (ssget "wp" korlist))
  (setq adet (sslength secim))
  (setq syc 0)
  (repeat adet
  (setq eleman (ssname secim syc))
     (setq elmblg (entget eleman))
     (if (= (cdr(assoc 0 elmblg)) "lıne")
       (progn
          (command "_pedıt" eleman "y" "joın" "all" "" "x")
       )
     )
     (setq syc (1+ syc))
  )
  (princ)
)





tamam hocam çözdüm sorunu

(setq secim (ssget "wp" korlist)) >>> (setq secim (ssget "cp" korlist))

olarak değiştirdim.

teşekkürler yardımın için.

05.02.2011 10:25    

ehya
"wp" (window polygon) "cp" ise (cross polygon) demektir. bunu bu şekilde yazmak sorunu çözmek değil sadece alternatiftir. .

05.02.2011 18:10    

ProhibiT
Merhaba,
gerçekten uğraşmış, emek vermiş belli kavramları çözmüş arkadaşlarımızın takıldığı yerlerde sordukları gerçekten incelikli sorular, bu ortamdaki yazar arkadaşlara keyif veriyor, bunu yakından biliyorum. Bununla birlikte, işin abc'sini atlamış arkadaşlarımızın, konunun ortalığından dalmaları da, en iyimser ihtimalle doğru cevap alamamaları sonucunu doğuruyor.

ehya hocamın ". . . Sorunu çözmek değil. . . " ifadesini biraz açmak istiyorum. Densizlikten değil yersizliktendir biline :)

- 4 nokta seçtiğimize göre, (neden 3 ya da 5 değil) buradaki asıl amaç, crossing ile dikdörtgen bir bölgenin seçilmesi gibi geldi bana. Hal böyle iken, ilk köşeyi getpoint ile seçtikten sonra diğer köşe getcorner ile seçilse. . . (bana göre) fazladan 2 nokta girilmemiş olur. Hemde kullanıcı seçtiği bölgeyi net olarak görür.
(setq p1 (getpoint "\n birinci köşe:") p2 (getcorner p1 "\n ikinci köşe")

- pedit komutunun kullanılışı doğru değil.

- bir kere seçim setindeki her objenin repeat ile loop oluşturulup teker teker işleme alınmasına gerek yok. Pedit komutunun "multiple" özelliğini kullanmak daha sağlam bir yol olurdu.

- ikinci problem, sırası gelen obje, daha önceki bir obje ile uç-uca teması varsa zaten join edilmiştir. Tekrar ele alınıp join işlemine tabi tutulmasının bir anlamı da yoktur. Bazı durumlarda hataya da sebep olur. Seçim seti içindeki obje aynı zamanda "all" seçim setine aittir.

- pedit komutunun içinde "join" "all" seçildiğinde; ilgili objenin çizim içindeki tüm line, polyline, lwpolyline ve spline objeleriyle ilişkisi araştırılır. Çok yüklü drawing dosyalarında, autocad'in cevapsız (not responding) duruma düşmesine bile sebep olabilir. Bahse konu join edilecek obje seçim setinin dışında kalmış bile olsa, join edilir. Bu istenen bir şey midir?

- ssget komutunun parametrelerinden olan object type list kullanılmadığı için, seçilen bölgede text, block, vb. Objeler varsa onlar da seçilmiş olacak, loop içinde sırası geldiğinde tekrar bir kontrol yapılmakta line olup olmadığına bakılmakta. Gereksiz yere uzatıyoruz.

- ve son olarak ta; pedit komutu kullanılırken, alternatifsiz olarak "convert lines, arcs and splines to polylines [yes/no]?" sorusuna yes cevabı veriliyor. Benim gibi aklıevvelin biri çıkar "peditaccept" sistem değişkeninin değerini 1 yapar. Bu durumda böyle bir soru sorulmayacağından yes cevabı hataya sebep olur.

bütün bunların özeti, bu fonksiyon:
Kod:

(defun c:1 ()
  (setq p1 (getpoint "\n birinci köşe:")
        p2 (getcorner p1 "\n  ikinci köşe")
        secim (ssget "c" p1 p2 (list (cons 0 "*line,arc,spline"))))
  (if (= (getvar "peditaccept") 0)
    (command "_pedit" "m" secim "" "y" "j" "" "")
    (command "_pedit" "m" secim "" "j" "" ""))
  (princ)
)
şeklinde yazılarak, yazılan kod son derece sade hale geldiği gibi, hatalardan da arındırılmış olacaktır.

hatta crossing ile seçmek için iki noktayı peşinen girmenin de bence bir gereği yok. Fonksiyonu
Kod:

(defun c:1 ()
  (setq secim (ssget (list (cons 0 "*line,arc,spline"))))
  (if (= (getvar "peditaccept") 0)
    (command "_pedit" "m" secim "" "y" "j" "" "")
    (command "_pedit" "m" secim "" "j" "" ""))
  (princ)
)
şeklinde yazıp, kullanıcıya ister crossing, ister window ve istersen tekli obje seçmek şeklinde esneklik tanımak daha doğru değil mi?

herkese kolay gelsin.

ProhibiT (06.02.2011 00:38 GMT)

10.03.2011 13:20    

nesli34
Merhabalar .
autocad de yazılan nesne numaralarını otomatik olarak istediğimiz sayıdan başlatıp devam ettiren bir lisp var mı?? yardımcı olursanız sevinirim şimdiden teşekkürler...

Önceki Sayfa [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] > 12 < [15] [20] [25] [30] [35] [40] [42] Sonraki Sayfa
Copyright © 2004-2022 SQL: 1.56 saniye - Sorgu: 99 - Ortalama: 0.01576 saniye