10.03.2009 08:45    

yazgunesi
Arkadaşlar ; benim bir derdim var daire çizdirmek konusunda biraz dertliyim... Lisp yazarken direnin çap değerini soruyorum , çizim anında belirlenen değerin 2 katı olarak çizim yapıyor yazdığım programda.Yani çap ve radüs değeri arasında büyük fark oluyor. Ben programda çap nedir diye sorduğumda daireyi çap olarak çizse nasıl olur acaba?

Bu konu ile ilgili 2 adet örnek veriyorum.. Daha önce modül dişli çizim lispi yapmıştım , onda da bu problemi yaşadım..


Kod:

; Etli boru yandan bakış çizim lispi

(defun c:boru1 ()

   
  (setq yr1 (getpoint "\n Yerlestirme noktasi için TIKLA :"))
  (setq cap (getreal "\n Borunun DIŞ ÇAPI nedir ? :"))
  (setq et1 (getreal "\n Borunun ET KALINLIĞI nedir ? :"))

  (setq discap (* cap 1))            ; Dış çap değerini özel değişkene atadık
  (setq ortacap (- discap et1))   ; Borunun orta çapını tanımladık
  (setq iccap (- ortacap et1))     ; İç çap hesabını yaptık

  (command "circle" yr1 (/ discap 2))  ; iki kat fazla çıkan değeri
  (command "circle" yr1 (/ ortacap 2)) ; çizdirme işlemi anında
  (command "circle" yr1 (/ iccap 2))    ; matematik işlemi ile halletik
   
  (princ) 
) ; program sonu.
 

(Princ "Lisp'i çalıştırmak için > boru1 < yazınız! ")




Kod:

; Etli boru yandan bakış çizim lispi

(defun c:boru2 ()

   
  (setq yr1 (getpoint "\n Yerlestirme noktasi için TIKLA :"))
  (setq cap (getreal "\n Borunun DIŞ ÇAPI nedir ? :"))
  (setq et1 (getreal "\n Borunun ET KALINLIĞI nedir ? :"))

  (setq discap (* cap 1))          ; Dış çap değerini özel değişkene atadık
  (setq ortacap (- discap et1))    ; Borunun orta çapını tanımladık
  (setq iccap (- ortacap et1))     ; İç çap hesabını yaptık

  (setq discapyeni (/ discap 2))   ; değer 2 kat fazla çıktığı için 2 ye böldük...
  (setq ortacapyeni (/ ortacap 2)) ; değer 2 kat fazla çıktığı için 2 ye böldük...
  (setq iccapyeni (/ iccap 2))     ; değer 2 kat fazla çıktığı için 2 ye böldük...


  (command "circle" yr1 discapyeni)  ; çizim işlemi başladı...
  (command "circle" yr1 ortacapyeni)
  (command "circle" yr1 iccapyeni)
   
  (princ) 
) ; program sonu.
 

(Princ "Lisp'i çalıştırmak için > boru2 < yazınız! ")

10.03.2009 08:49    

ehya
Lisple ilgili bir sorun yok. Değerleri kontrol ettim. verilen değeri çap olarak algılıyor. Zaten kodlamada da aynı şekilde yapmışsın.
Bu tür çizimlerde yapman gereken, komut işlemi başmadan önce OSNAP seçeneklerini kapatıp, çizim işlemleri bittiğinde tekrar açmalısın.

10.03.2009 09:01    

yazgunesi
Aslında lispin problemli halini ilk önce yazmalıydım.Yukarıdaki lispler düzgün çalışıyor, çünkü çap değeri konusunda müdahalelerde bulundum. Aşağıdak kod da lispin orjinal hali ( problem teşkil eden) , bu arada osnap modunu da denedim işe yaramadı galiba.. Problem konusunda özetle çap sorulursa çap çizsin istiyorum , 2 kat büyük değil..

Kod:

; Etli boru yandan bakış çizim lispi

(defun c:boru3 ()
 
  (setq osmode_eski (getvar "osmode")) ; mevcut osnap ayarını kaydet
  (setvar "osmode" 0)  ; osnap modunu sıfırlayalım..
   
  (setq yr1 (getpoint "\n Yerlestirme noktasi için TIKLA :"))
  (setq cap (getreal "\n Borunun DIŞ ÇAPI nedir ? :"))
  (setq et1 (getreal "\n Borunun ET KALINLIĞI nedir ? :"))

  (setq discap (* cap 1))          ; Dış çap değerini özel değişkene atadık
  (setq ortacap (- discap et1))    ; Borunun orta çapını tanımladık
  (setq iccap (- ortacap et1))     ; İç çap hesabını yaptık

 
  (command "circle" yr1 discap)  ; çizim işlemi başladı...
  (command "circle" yr1 ortacap)
  (command "circle" yr1 iccap)
 
  (setvar "osmode" osmode_eski) ; osnap ayarlarını geri çağralım..
  (princ) 
) ; program sonu.
 

(Princ "Lisp'i çalıştırmak için > boru3 < yazınız! ")


Aslında bu çap değeri meselesi hiç problem değil.Matamatiksel olarak hallediyorum ama dairenin 2 kat fazla çizilmesi gıcık ediyor beni. Yukarıdaki kodları basit bir örnek olarak yaptım.Şu anda 80 satırdan fazla çok büyük lispler yazıyorum ve bazı kodları ''örnek kodlama'' olarak başka lisplere adapte ediyorum.. Bu da büyük lisplerde test anında daha fazla problem çıkarıyo.Her defasında çap değeri için ayrı bir hesaplama işlemi yapmak istemiyorum..

yazgunesi (10.03.2009 09:22 GMT)

10.03.2009 09:32    

ehya
kendi lispinde dikkat edersen circle komutu ile ilgili satırda verilen değeri aynen kabul etmişsin. verilen değer de circle komutunda yarıçap olarak geçer. Bunun için verilen değeri iki ye bölmüşsün.

Değişiklikleri aşağıya yazıyorum. Aynı şekilde değiştirirsen sorun kalmaz.

Kod:

(command "circle" yr1 (/ discap 2.0)) 
(command "circle" yr1 (/ ortacap 2.0))
(command "circle" yr1 (/ iccap 2.0))

10.03.2009 09:37    

yazgunesi
Teşekür ederim ehya. Ben biraz farklı düşünerek çözüm bulmaya uğraştım. Yeni bir kodlama örneği oluştu.

Kod:

; Etli boru yandan bakış çizim lispi

(defun c:boru4 ()
 
  (setq yr1 (getpoint "\n Yerlestirme noktasi için TIKLA :"))
  (setq cap (getreal "\n Borunun DIŞ ÇAPI nedir ? :"))
  (setq et1 (getreal "\n Borunun ET KALINLIĞI nedir ? :"))

  (setq discap (* cap 1))          ; Dış çap değerini özel değişkene atadık
  (setq ortacap (- discap et1))    ; Borunun orta çapını tanımladık
  (setq iccap (- ortacap et1))     ; İç çap hesabını yaptık
   
  (command "circle" yr1 "d" discap)  ; çizim işlemi başladı...
  (command "circle" yr1 "d" ortacap)
  (command "circle" yr1 "d" iccap)

  (princ) 
) ; program sonu.
 

(Princ "Lisp'i çalıştırmak için > boru4 < yazınız! ")


Diameter olarak algılanması için (command "circle" yr1 "d" iccap) dedim.
Radüs olarak denedim "r" olarak kabul etmedi. Olsun problemi halletim.

10.03.2009 09:46    

ehya
diameter seçeneğini kullanırsan, merkez noktasından tutmuş olmazsın. Oluşacak dairenin sol quadrant noktası, belirtmiş olduğun merkez noktası olacak geçecektir. Bu işlem ise hatalı bir işlem olacaktır.

10.03.2009 09:51    

yazgunesi
Yukarıdaki en son kod çok güzel çalışıyor.. Bu konuyu biraz daha inceleyeceğim.Şu anda problem yok gözüküyor , istediğim gibi oldu kodlama yapısı.

(command "circle" yr1 "d" discap)

> 1 <
Copyright © 2004-2022 SQL: 1.022 saniye - Sorgu: 60 - Ortalama: 0.01703 saniye