* E Posta Adresiniz:
* Kodu Girin:

İleti Yazar
30.12.2011 23:31
67230    
akcan

[2] Girişimci

Online Durumu

9 ileti
öğretmen
anamur-mersin

Lisp kodlarını daha yeni öğrenirken aklıma gelen bir uygulama üzerinde çalıştım
Oluşan kodlar aşağıda. İnternette bu işi yapan bir kod bulamadım.

Aşağıdaki kodları inceleyip yorumlarsanız sevinirim
Kod:

; Yarıçapı verilen ve merkezi belirtilen noktaya Yıldız çizer
; Mesut Akcan
; www.akcansoft.com
; 30/12/2011

(defun c:yildiz ()
  (setq r (getreal "\nYarıçapı giriniz :"))
  (setq k1 (* r 1.9021))
  (setq k (rtos k1 2 2)) 
  (setq c (getpoint "\nYıldız merkezini seçiniz : "))

  (command "line" "_from" c)
  (setq p (STRCAT "@" (rtos r 2 2) "<-126"))
  (command p) 
  (setq p (STRCAT "@" k "<36"))
  (command p)
  (setq p (STRCAT "@" k "<180"))
  (command p)
  (setq p (STRCAT "@" k "<-36"))
  (command p)
  (setq p (STRCAT "@" k "<108"))
  (command p) 
  (command "c")
  (princ)
)



admin (13.06.2018 12:03 GMT)

______________________
youtube.com/mesutakcan - www.akcansoft.com

31.12.2011 04:08
67233    
ProhibiT

[80] Yetkili

Online Durumu

1469 ileti
İnşaat Mühendisi
Ankara

Bu yazılan AutoLisp'ten çok Script olmuş...

Sizin mantığınızı koruyarak;
Kod:

(defun c:yildiz (/ c r k p)
  (setvar "cmdecho" 0) (command "undo" "group")
  (setq c (getpoint "\nYıldız merkezini seçiniz : ")
        r (getreal "\nYarıçapı giriniz :")
        k (* 1.9021 r))
  (command "_.pLine"
           (setq p (polar c 4.08407 r))
           (setq p (polar p 0.628319 k))
           (setq p (polar p pi k))
           (setq p (polar p 5.65487 k))
           (polar p 1.88496 k) "c")
  (command "undo" "e") (prin1)
)
şeklinde yazmak daha doğru olurdu. Burada pLine yerine Line'da kullanılabilir. command gurubunun dışındaki ve içindeki setq direktifleri arasındaki farka dikkat çekmek isterim.

AutoLisp ruhuna daha da uygun olması için;
Kod:

(defun c:yildiz (/ c r k p)
  (setvar "cmdecho" 0) (command "undo" "group")
  (setq c (getpoint "\nYıldız merkezini seçiniz : ")
        r (getreal "\nYarıçapı giriniz :")
        k (* 1.9021 r))
  (entmake
    (list
      (cons 0 "LWPOLYLINE") (cons 100 "AcDbEntity") (cons 67 0)
      (cons 100 "AcDbPolyline") (cons 90 4) (cons 70 1) (cons 43 0.0)
      (cons 38 0.0) (cons 39 0.0)
      (cons 10 (list (car (setq p (polar c 4.08407 r))) (cadr p)))
      (cons 40 0.0) (cons 41 0.0) (cons 42 0.0) (cons 91 0)
      (cons 10 (list (car (setq p (polar p 0.628319 k))) (cadr p)))
      (cons 40 0.0) (cons 41 0.0) (cons 42 0.0) (cons 91 0)
      (cons 10 (list (car (setq p (polar p pi k))) (cadr p)))
      (cons 40 0.0) (cons 41 0.0) (cons 42 0.0) (cons 91 0)
      (cons 10 (list (car (setq p (polar p 5.65487 k))) (cadr p)))
      (cons 40 0.0) (cons 41 0.0) (cons 42 0.0) (cons 91 0)
      (cons 10 (list (car (setq p (polar p 1.88496 k))) (cadr p)))
      (cons 40 0.0) (cons 41 0.0) (cons 42 0.0) (cons 91 0)))
    (command "undo" "e") (prin1)
)
şeklinde yazılırsa daha dengeli bir fonksiyon olur.

Bunun biraz farklı bir şeklini daha önce yazmıştım.

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

linkine bir göz atmanızı tavsiye ederim.

Where there is a will, there is a way... Beğenmek için anlamak lazım...

31.12.2011 15:09
67243    
akcan

[2] Girişimci

Online Durumu

9 ileti
öğretmen
anamur-mersin

kodlar için teşekkür ederim
bu kadar ileri seviye lisp bilmiyorum.
başlangıç olarak öğrendiğim temel bilgilerle oluşturduğum kodlardı onlar.

ayrıca kafa takılan bir nokta
command yanında bir değişkeni nasıl kullanacağım?
örneğin
(command "line @" r "<30")
yada
(command "line" "@" r "<30")
gibi satırlar hata veriyor.

______________________
youtube.com/mesutakcan - www.akcansoft.com

31.12.2011 16:04
67246    
ehya

[90] Yönetici

Online Durumu

3197 ileti
Teknik Ressam
Ankara

şahin hocam yok. Ben cevaplayayım.

Comman içinde bir değer girilecek ise öncelikle sayısal değer string olmalı. Eğer değil ise string'e çevirilmeli.

string dediğim sayı tırnak içinde olmalıdır.

örneğin : (setq r "150")

eğer değil ise bunu string'e çevireceksiniz.. bunun için rtos komutu kullanılır. Bununla ilgili örneği yukarıda yazdığınız örnek kod ile cevaplayayım.
Ek olarak bir değer girilecek ise bu değerler birleştirilmeli. Sizin yazdığınız gibi tek tek verilemez.

(command "_.line" (strcat "@" (rtos r 2 2) "<30"))

Bu satırdaki farklılıkları açıklacak olursak
Strcat komutu stringleri birleştirmek için kullanılır.
Rtos komutu sayıyı string'e çevirir. Sonundaki 2 2 değeri ise, birinci 2 değeri sonucun "Decimal" yani ondalıklı sonuç vermesini istediğimizi, ikincisi ise virgülden sonra 2 basamak küsürat kullanmasını istediğimizi belirtir.

31.12.2011 19:00
67248    
ProhibiT

[80] Yetkili

Online Durumu

1469 ileti
İnşaat Mühendisi
Ankara

Teşekkür ederim Mehmet hocam

akcan arkadaşımızın çabalarında destek vermek, gelişimine katkıda bulunmak adına, "Command yanında değişken kullanmak" kavramına biraz daha açıklık getirmek gerekiyor sanıyorum.

Command ile beraber kullanılan AutoCAD komutunun bekledikleri (parametreleri) vardır.
(command "_.Line".... örneğini ele alırsak, parametreleri; from point, to point,...
Command'in parametreleri ille de komut satırından girdiğimiz formatta olmak zorunda değil, hatta o formatta olmamalıdır.
bu parametreleri Command dışında hazırlamak daha doğrudur.
(setq frpt (polar (getpoint) 30 r))
(command "_.Line" frpt (getpoint) "") şeklinde kullanılabilir.
derli toplu yazarsak; (command "_.Line" (polar (getpoint) 30 r)) (getpoint) "") şekline gelir.

Sonuç olarak, AutoLisp içinde kullandığınız command formatı, komut satırından girdiğinizle aynı değildir. Aksi halde yazdığımız fonksiyon olmaz, ilk mesajımda yazdığım gibi script olur.

AutoLisp sözdizimi (syntax) ve mantığı konusunu iyice hazmetmekte fayda var. Aksi halde, elle yapılan işlemleri, gurup komutları olarak AutoLisp (aslında DIESEL expression) ile yaptırmaktan ileri gidilemez, gelişme sağlanamaz.

Bu kapsamda, örnek olarak ele aldığımız yildiz çizdirme fonksiyonunda, sizin kurduğunuz algoritma üzerinden giderek açıklamaya çalıştığım. Böyle olunca da çizilen yıldız aslında kusursuz değil. Programa başlangıçta bazı katsayılar verdiğimizde, eninde sonunda reel sayıların ondalık hassasiyetinden kaynaklanan hatalar olur.

Öncelikle el ile çiziyormuş mantığını unutup, programatik mantıkla algoritma iyi kurulmalı.
Bu yazdıklarımı örneklemek gerekirse;
Kod:

(defun c:yildiz (/ a1 a2 m1 m2 m3 m4 p0 n r p dx dy)
  (setvar "cmdecho" 0) (command "undo" "group") (vl-load-com)
  (setq a1 (* (/ 18.0 180) pi) a2 (* 4 a1) a1 (- a1 a2) n nil m nil
        m1 '(40 . 0.0) m2 '(41 . 0.0) m3 '(42 . 0.0) m4 '(91 . 0) p0 '(0 0)
        r (getreal "\n Yarıçap: "))
  (repeat 5 (setq n (append n (list (polar '(0 0) (setq a1 (+ a1 a2)) r)))))
  (entmake
    (list (cons 0 "LWPOLYLINE") (cons 100 "AcDbEntity")(cons 67 0)(cons 39 0.0)
    (cons 100 "AcDbPolyline") (cons 90 10) (cons 70 1)(cons 43 0.0)(cons 38 0.0)
    (cons 10 (nth 0 n)) m1 m2 m3 m4
    (cons 10 (nth 2 n)) m1 m2 m3 m4
    (cons 10 (nth 4 n)) m1 m2 m3 m4
    (cons 10 (nth 1 n)) m1 m2 m3 m4
    (cons 10 (nth 3 n)) m1 m2 m3 m4))
  (while (/= (car (setq p (grread T 1))) 3)
    (setq p (cadr p) dx (- (car p) (car p0)) dy (- (cadr p) (cadr p0)))
    (vla-transformby
      (vlax-ename->vla-object (entlast))
      (vlax-tmatrix
        (list (list 1 0 0 dx) (list 0 1 0 dy) '(0 0 1 0) '(0 0 0 1))))
    (setq p0 p) (redraw (entlast) 3))
  (redraw (entlast) 4) (command "undo" "e") (prin1)
)
şeklinde yazılırsa yıldızımız hatasız çizilmiş olur.

Bir adım daha ilerlersek;
Kod:

(defun c:yildiz (/ a1 a2 m1 m2 m3 m4 p0 n m r p dx dy)
  (setvar "cmdecho" 0) (command "undo" "group") (vl-load-com)
  (setq a1 (* (/ 18.0 180) pi) a2 (* 4 a1) a1 (- a1 a2) n nil m nil
        m1 '(40 . 0.0) m2 '(41 . 0.0) m3 '(42 . 0.0) m4 '(91 . 0) p0 '(0 0)
        r (getreal "\n Yarıçap: "))
  (repeat 5 (setq n (append n (list (polar '(0 0) (setq a1 (+ a1 a2)) r)))))
  (setq m (append m (list (inters (nth 0 n) (nth 2 n) (nth 1 n) (nth 4 n))))
        m (append m (list (inters (nth 1 n) (nth 3 n) (nth 2 n) (nth 0 n))))
        m (append m (list (inters (nth 2 n) (nth 4 n) (nth 3 n) (nth 1 n))))
        m (append m (list (inters (nth 3 n) (nth 0 n) (nth 4 n) (nth 2 n))))
        m (append m (list (inters (nth 4 n) (nth 1 n) (nth 0 n) (nth 3 n)))))
  (entmake
    (list (cons 0 "LWPOLYLINE") (cons 100 "AcDbEntity")(cons 67 0)(cons 39 0.0)
    (cons 100 "AcDbPolyline") (cons 90 10) (cons 70 1)(cons 43 0.0)(cons 38 0.0)
    (cons 10 (nth 0 n)) m1 m2 m3 m4 (cons 10 (nth 0 m)) m1 m2 m3 m4
    (cons 10 (nth 1 n)) m1 m2 m3 m4 (cons 10 (nth 1 m)) m1 m2 m3 m4
    (cons 10 (nth 2 n)) m1 m2 m3 m4 (cons 10 (nth 2 m)) m1 m2 m3 m4
    (cons 10 (nth 3 n)) m1 m2 m3 m4 (cons 10 (nth 3 m)) m1 m2 m3 m4
    (cons 10 (nth 4 n)) m1 m2 m3 m4 (cons 10 (nth 4 m)) m1 m2 m3 m4))
  (while (/= (car (setq p (grread T 1))) 3)
    (setq p (cadr p) dx (- (car p) (car p0)) dy (- (cadr p) (cadr p0)))
    (vla-transformby
      (vlax-ename->vla-object (entlast))
      (vlax-tmatrix
        (list (list 1 0 0 dx) (list 0 1 0 dy) '(0 0 1 0) '(0 0 0 1))))
    (setq p0 p) (redraw (entlast) 3))
  (redraw (entlast) 4) (command "undo" "e") (prin1)
)
şeklinde yazarak yıldızımız kusursuz şekilde çizilmiş olur.

Kolay gelsin.

Where there is a will, there is a way... Beğenmek için anlamak lazım...

01.01.2012 12:44
67254    
akcan

[2] Girişimci

Online Durumu

9 ileti
öğretmen
anamur-mersin

detaylı açıklamalarda bulunan arkadaşlara çok çok teşekkür ederim.
son verilen kodlar çok iyi. daha hoş olmuş.
tabi benim bu kodları anlamam için biraz daha ekmek yemem gerekiyor

______________________
youtube.com/mesutakcan - www.akcansoft.com

01.01.2012 17:20
67255    
ProhibiT

[80] Yetkili

Online Durumu

1469 ileti
İnşaat Mühendisi
Ankara

O kadar karmaşık değiller, ekmek yemeyle de ilgileri yok. Kodlama ve sözdizim detaylarını geçer, işin özüne gelirsek;
- İlk örnekte, yıldızımız 5 bacaklı olduğuna göre, yıldızın uç noktaları arasında, 360/5=72 derecelik açılar olacaktır.
- Yıldızımızın bir köşesinin tam üstte (90 derecede) olmasını öngördüğümüze göre, ilk köşe, 90-72=18 dereceden başlamalıdır.
- 72'şer derecelik artışlarla, 18, 90, 162, 234 ve 306 dereceleri kullanarak, merkezden bu doğrultularda yarıçap uzunluğunda mesafelerde olan 5 nokta belirlendikten sonra, 0-2-4-1-3-0 sırasıyla noktalarımızı birleştirdiğimizde yıldız ortaya çıkıyor.

- ikinci örnekte de, yıldızın dış köşelerini ilk örnekteki gibi oluşturduktan sonra, 0-2 ile 4-1 noktalarıyla tanımlı doğruların kesişim (intersection) noktaları iç köşeleri verecektir. Sıralı olarak, dış-iç-dış-,ic-... şeklinde başladığımız noktaya kadar birleştirdiğimizde yıldızımız ortaya çıkacaktır.

- Burada örnek olması bakımından, 0,0,0 noktasını merkez alıp, girilen çapta yıldızı oluşturduktan sonra, cursor koordinatlarını okutup, transformation matrix kullanarak, sürükle-bırak türü bir işlem ile yıldızı son yerine yerleştiriyoruz.

Görüldüğü gibi doğru bir algoritma kurulunca kodlaması angarya artık...

Where there is a will, there is a way... Beğenmek için anlamak lazım...

10.06.2018 16:22
86391    
akcan

[2] Girişimci

Online Durumu

9 ileti
öğretmen
anamur-mersin

transformation matrix 'in autocad VBA da karşılığı var mıdır

______________________
youtube.com/mesutakcan - www.akcansoft.com

11.06.2018 10:53
86392    
ehya

[90] Yönetici

Online Durumu

3197 ileti
Teknik Ressam
Ankara

akcan






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

> 1 <
Copyright © 2004-2018 | Tüm Hakları Saklıdır | 1931 | Site haritası | İstatistikler | Hakkımızda | Kadromuz | Gizlilik | Reklam