* E Posta Adresiniz:
* Kodu Girin:

> 1 <
İleti Yazar
10.11.2017 00:11
85672    
admin

[99] Üst Yönetici

Online Durumu

535 ileti
AutoCAD, 3ds Max, V-Ray Eğitmeni
İstanbul, İzmir

Forumumuzda yükselen çıta nedeniyle acemi kullanıcıların soru sormaya çekindiğini fark ettik ve sizlere daha iyi destek verebilmek için acemi kullanıcı bölümlerini açtık.

İşte bunlardan biri:
AutoLISP kodlamaya yeni başlayanların kolay ya da zor her türlü soruyu çekinmeden sorabilecekleri forum bölümüdür.

Lütfen sorularınızı çekinmeden yazın! Size cevap vermek bizim için bir keyif.

 

Çizim Okulu Ekibi

23.06.2018 12:16
86421    
turgaygirgin

[2] Girişimci

Online Durumu

11 ileti

acemi forum kullanıcılarına yol gösterecek bi bölüm de olsa keşke.

23.06.2018 13:21
86422    
turgaygirgin

[2] Girişimci

Online Durumu

11 ileti

Selamlar,
Daha önce forumda hiç yazmadım.O nedenle de ne nereden yazılır nasıl mesaj gönderilir, dosya nasıl yüklenir vs... gibi konularda cahilim.
Bi konuda takıldım.Soru sormak için ararken Ehya arkadaşımıza özelden yazdım.Rahatsızlık vermişsem kusura bakmasın lütfen.Bilgisizliğime saysın.
Şimdi de buraya yazıyorum ama doğru yere mi yazıyorum haala da emin değilim.
Autolisp öğrenmeye yeni başlıyorum 2-3 aydır.gerek forumları gerek videoları izlemeye kodları okumaya çalışıyorum.Mehmet Şahin GÜVERCİN hocamızın kitabını da aldım.Bu siteden çok yararlanıyorum.emeği geçen herkese teşekkür ederim.Allah gönlünüzdekini hayırlıysa versin.
Daha önce bu sitede okudum diye hatırladığım bir konu idi.listelerin işlenmesi ile ilgili.Autolisp ile oluşturulmuş listeyi visual lisp ile işleme almak.ve sonrasında tekrar autolisp ile kullanmak için ne yapmak gerekiyor.

yani ;

diyelimki bir çizim dosyamız var ve içinde de line ile, komut bitirilmeden oluşturulmuş line lar var.yani ilk line objesinin start pointine a endpointine b dersek, 1. çizgimiz a dan b ye, 2. çizgimiz b den c ye,3. çizgimiz c den d ye 4.d den ......vs

autolisp ile işleme alıp bütün line objelerinin koordinatlarını (assoc 10 - 11 ) bir liste yaptığımızı varsayarak listemiz;
(setq lpoints '( a b b c c d d e) olsun.

subfonksiyon da şu şekilde:

(defun test (l / x c r)
(setq x (car l)
-
-
ve şöyle bir işlev vardı
l (vl-remove x (cdr l))
r (cons (cons x (- c (length l))) r )

ana fonksiyonun içinde (vl-load-com) yüklemesini de yaptım.

(setq dene ( test lpoints)) ile subfonksiyonu çağırdım.

ana fonksiyonu yukleyip lisp i test edince şöyle bir uyarı alıyorum:

Select objects: ; error: no function definition: test

lisp editör içinde test işlevini inspect dedikten sonra, ( test point_list ) inspect yapınca liste benim istediğim gibi düzenleniyor.

vl-remove listeden eleman silmek için kullanılıyor,o halde autolispte (setq l (member (cdr l) l)) yaparsam çalışacaktır diye düşünmüştüm ki
olmadı. Öğrendim ki fonksiyonda kullanılan r de visual lisp ile ilgiliymiş.
Autolisp i pekiştirmeden Visual lisp ile ilgilenmek istemiyorum.bilgi karışıklığı olmasın diye.

Şimdi :
benim sizden yardımınızı istediğim anlatmanızı rica edeceğim konular şunlar;

S-1; hatanın nedeni autolisp ile oluşturulan listenin visual lisp komutları ile işlenmeye çalışılıyor olması mı?

S-2 ; eğer sorun bu ise listeyi visual lisp ile işlemek için ne yapmalıyım?

S-3; ve daha sonra bu listeyi autolisp ile işlemek için ne yapmalıyım?

Yardımlarınız için şimdiden çok teşekkür eder,

Esenlikler dilerim.Dostça Kalın.

24.06.2018 09:21
86424    
Travaci

[70] Editör

Online Durumu

2081 ileti
Teknik Ressam
Konstantinopol

Turgay sorunu bir çok kez okumamama rağmen birşey anlamadım : ) Madem (assoc 10-11) leri listeliyorsun neden remove a gerek duyuyorsun ?Birinci nesnenin sonu ile ikinci nesnenin başı aynı deği mi ! Yazmaya çalıştığın fonksiyonu paylaşırsan daha iyi anlaşılır. Autolisp ve visual lisp beraber kullanılabilir, bundan dolayı bir hata almazsın.

25.06.2018 00:57
86426    
turgaygirgin

[2] Girişimci

Online Durumu

11 ileti

yani ilk line objesinin start pointine a endpointine b dersek, 1. çizgimiz a dan b ye, 2. çizgimiz b den c ye,3. çizgimiz c den d ye 4.d den ......vs

autolisp ile işleme alıp bütün line objelerinin koordinatlarını (assoc 10 - 11 ) bir liste yaptığımızı varsayarak listemiz;

(setq lpoints '( a b b c c d d e) olsun.

burda sorun yok. bu listeyi oluşturuyorum ve vl- remove ile ilgili sorum da burda değil. burda anlatmak istediğim bu listeyi autolisp ile yapabiliyorum. onu anlatmaya çalıştım. lpoints listesini defun test ile başlayan fonksiyon ile işlemeye çalışıyorum.

(defun test (l / x c r)
(setq x (car l)
-
-
-
l (vl-remove x (cdr l))
r (cons (cons x (- c (length l))) r )
)

böyle bir alt fonksiyon var içinde de visual lisp işlemleri var.

lisp editör içinde test işlevini inspect dedikten sonra,

( test lpoints ) inspect yapınca

liste benim istediğim gibi

((a.1) (b.2) (c.2) (d.2) (e.1))

şeklinde düzenleniyor.

ama lisp i bütün olarak çalıştırınca: komut satırında

Select objects: ; error: no function definition: test

hatası alıyorum.
nedeni ne olabilir onu sormuştum.

Assoc 10 ve 11 listesini visuallisp te vlax-ename->vla-object sonra da safearray oluşturup sonra safearray fill ile alıp
vlax-safearray->list diyerek oluşturuluyor diye biliyorum. sonra bu listeyi autolisp ile işlemek için bi dönüşüm yapılması gerekmiyormuydu?

herneyse.önceki mesajımda da belirttiğim gibi visuallisp e daha sonra bakacağım. önce autolisp konusunda gelişmek istiyorum.

(setq lpoints '( a b b c c d d e) listemiz. bu liste içinde a 1 adet b 2 adet c 2 adet d 2 adet e 1 adet ,,

autolisp te ((a.1) (b.2) (c.2) (d.2) (e.1)) olarak nasıl sıralarız? visual lisp kodu kullanmadan?

lpoints listesi burada sıralı. halbuki liste '( a b b c c d b e e f e h) şeklinde de olabilirdi? remove bu durum için gerekiyordu.
1. elemanı (setq x (car lpoints)) ile belirleyip
(setq lpoints (cdr lpoints)) ile 1.elemanı bu listeden çıkartarak listeyi yeniden oluşturup
1.elemanı yeni listede arayıp bulunca da silersem.
Sildiğim kadar eleman sayısı +1
o elemanın sayısını vermez mi ? haliyle
( cons x n ) noktalı liste olmaz mı?
yanlış mantık mı kuruyorum?

değerlendirmenizi rica ederim.

Teşekkürler.

25.06.2018 09:49
86427    
Travaci

[70] Editör

Online Durumu

2081 ileti
Teknik Ressam
Konstantinopol

...
(setq ls nil)
(setq ss (ssget (list (cons 0 "Line"))))
...
(repeat (setq n (sslength ss))
(setq ls (append (list (cdr (assoc 10 (entget (ssname ss (setq n (1- n))))))) ls))
)
...
Şeklinde 10 ve 11 noktalarını listeye aldıktan sonra aşağıdaki gibi listedeki benzer elemanları listeden çıkararak ilk ve son hali arasındaki farka bakarak tekrar iki listenin elemanlarını yukarıdaki gibi birleştiriceksin.

(defun itemcount (lst /)
(if lst (cons (- (length lst) (length (setq lst (vl-remove (car lst) lst)))) (itemcount lst)))
)

25.06.2018 12:07
86428    
turgaygirgin

[2] Girişimci

Online Durumu

11 ileti

Çok teşekkür ederim.

Sayenizde çok şeyler öğreniyorum. itemcount listedeki eleman larin adetlerini veriyor. Ben hangi elemandan kaç adet var onu bulmaya çalışıyorum. Adet listesi tamam da noktalı liste olarak nasıl olacak.?

(defun c:test (/ ss n)
(setq ls nil)
(setq ss (ssget (list (cons 0 "Line"))))
(repeat (setq n (sslength ss))
(setq ls (append (list (cdr (assoc 10 (entget (ssname ss (setq n (1- n))))))) ls))
)
(repeat (setq n (sslength ss))
(setq ls (append (list (cdr (assoc 11 (entget (ssname ss (setq n (1- n))))))) ls))
)
(setq nokta_adet (itemcount ls))


(defun itemcount (lst /)
(if lst (cons (- (length lst) (length (setq lst (vl-remove (car lst) lst)))) (itemcount lst)))
)

)

nokt_adet --- (1 1 2 3 1) olarak listeliyor.
istediğim bu değil.

ls listesindeki koordinatları ((1404.49 1428.01 0.0) (1870.09 1983.99 0.0) (1870.09 1654.94 0.0) (1404.49 1654.94 0.0)
(1404.49 1654.94 0.0) (1870.09 1654.94 0.0) (1404.49 1654.94 0.0) (876.434 1654.94 0.0))

nokt_adet --- (((1404.49 1428.01 0.0) . 1) ((1870.09 1983.99 0.0) . 1) ((1870.09 1654.94 0.0) . 2) ((1404.49 1654.94 0.0) . 3 ) ((876.434 1654.94 0.0) . 1)) şeklinde görmek istiyorum.

Umarım bu defa anlatabilmişimdir.

error: no function definition: test kodunun nedenleri nedir?neden olur?

Saygılarımla

25.06.2018 14:06
86429    
turgaygirgin

[2] Girişimci

Online Durumu

11 ileti

tamam hatamı buldum.

yazdığım lisp te

test 1 olarak tanımladığım altfonksiyonu ana fonksiyonun içinde tanımlıyormuşum.

(defun c: test (/)

(setq a (liste sırala))


(defun sırala ()

) ;sırala defun parantezi
) ;defun test parantezi

oysa olması gereken;

(defun c: test (/)

(setq a (liste sırala))

) ;defun test parantezi

(defun sırala ()
) ;sırala defun parantezi idi. gözden kaçırdım demekki.

25.06.2018 14:09
86430    
turgaygirgin

[2] Girişimci

Online Durumu

11 ileti

Parantez kapanışlarından sonra açıklama yazacağım artık. Karışmasın diye

12.07.2018 13:51
86461    
turgaygirgin

[2] Girişimci

Online Durumu

11 ileti

Selamlar,
Yine takıldım bi yerde, 2-3 gündür uğraşıyorum. Yardımcı olursanız,sevinirim. Özelliklede aşağıda yazdığım işlemde hatamın ne olduğunu söylerseniz daha çok memnun olurum.
aşağıdaki " l " listesini
'((a b) (b c ) (c d) (d e)) şeklinde sıralamak istiyorum.

teşekkür ederim.


(setq l '((a b) (e d) (c b) (d c)))
(setq sirlis nil
indx 1)

(while (/= l nil)
(setq elm1 (car l)
elm2 (nth indx l)
elm1_1 (cadr elm1)
elm2_1 (car elm2)
elm2_2 (cadr elm2))

(if (/= elm1_1 (or elm2_1 elm2_2))
(setq indx (1+ indx))) ;if sonu
(if (= elm1_1 elm2_1)
(setq sirlis (cons elm1 sirlis)
l (vl-remove elm1 l))) ;if sonu
(if (= elm1_1 elm2_2)
(setq elm2 (vl-remove elm2_1 elm2)
elm2 (cons elm2_1 elm2)
sirlis (cons elm1 sirlis)
l (vl-remove elm1 l)
l (vl-remove elm2 l)
l (cons elm2 l))) ; if sonu
(if (= elm2 nil)
(setq sirlis (cons elm1 sirlis)
l (vl-remove elm1 l))) ;if sonu
)

12.07.2018 15:57
86463    
ehya

[90] Yönetici

Online Durumu

3187 ileti
Teknik Ressam
Ankara

turgaygirgin




bu şekilde yarım kodu test etmek zor.

Mevcut listeniz (a b c d e f) şeklinde midiri?

12.07.2018 16:48
86465    
turgaygirgin

[2] Girişimci

Online Durumu

11 ileti

Hayır mevcut listem (setq l '((a b) (e d) (c b) (d c)))

ve ben bu listeyi ((a b) (b c ) (c d) (d e)) olarak sıralamak istiyorum.Alt listedeki elemanların son elemanı bir sonraki alt listenin ilk elemanı olmalı.

while ile başlayan kısmı defun içine koydum olmadı. cond ile yapayım olmadı. işlemleri tek tek yapınca oluyor. Nerde hata Yapıyorum anlayamadım.

teşekkürler.

12.07.2018 16:57
86466    
turgaygirgin

[2] Girişimci

Online Durumu

11 ileti

(setq lii1 '((a b) (e d) (c b) (d c)))

(setq a (test lii1))

(defun test ( l / )
(setq indx 1)
(while (/= l nil)

(setq elm1 (car l))
(setq elm2 (nth indx l))
(setq elm11 (cadr elm1))
(setq elm21 (car elm2))
(setq elm22 (cadr elm2))

(if (= elm11 elm21)
(progn
(setq sirlis (cons elm1 sirlis))
(setq l (vl-remove elm1 l))
(setq indx 1)))

(if (= elm11 elm22)
(progn
(setq l (vl-remove elm2 l))
(setq elm2 (vl-remove elm22 elm2))
(setq elm2 (cons elm22 elm2))
(setq l (cons elm2 l))
(setq sirlis (cons elm1 sirlis))
(setq l (vl-remove elm1 l))
(setq indx 1)))

(if (= elm2 nil)
(progn
(setq sirlis (cons elm1 sirlis))
(setq l (vl-remove elm1 l))))

(if (and (/= elm11 elm21) (/= elm11 elm22))
(setq indx (1+ indx)))
)
(reverse sirlis)
)

(setq a (test lii1)) ile çağırınca liste ((a b) (b c ) (c d) (d e)) olsun istiyorum.

Acemiyim autolisp i pekiştirmeden visual lisp e geçmek istemiyorum. fonksiyonlar çok ilkel biliyorum.ama mantığını pekiştirmeye çalışıyorum.

12.07.2018 16:58
86467    
turgaygirgin

[2] Girişimci

Online Durumu

11 ileti

En son bu noktaya geldim. burada da test fonksiyonuna ulaşılamıyor hatası alıyorum.

13.07.2018 12:55
86470    
ehya

[90] Yönetici

Online Durumu

3187 ileti
Teknik Ressam
Ankara

Mevcut listen (setq l '((a b) (e d) (c b) (d c))) ise bunu '((a b) (b c ) (c d) (d e)) yaparken bir kuralı olmalı.
Aslında sizin ilk listenizi a b c d e şeklinde düzenleyip bunu sıraladıktan sonra istediğiniz listeyi rahatça kurgulayabiliriz.

Söylediklerim konusunda hem fikir iseniz bununla ilgili basitçe bir örnek fonksiyon hazırlarım

13.07.2018 14:31
86471    
turgaygirgin

[2] Girişimci

Online Durumu

11 ileti

Öncelikle İlgi ve alakanız için çok teşekkür ederim.

bi lisp programı yazmaya çalışıyorum. ve yukarıda takıldığım konuda bu programın bir parçası olacak.Aslında liste harflerden oluşmuyor. Sorumu basitleştirmek ve örneklemek için harflerden oluşan listeyi örnek olarak yazdım. birbirlerine bağlı çizgilerin uç noktalarını temsil ediyor.kullanıcı sürekli olarak birbiri ardına çizgiler çizmeyebilir. Haliyle liste karışık olabilir.Bunu düşünerek

birbirlerine uç noktalarından baglı olan çizgileri sıraya koymaya çalışıyorum.İlk çizgi daima start point end point olarak başlayacak . sonraki çizgi birinci çizginin end pointine bağlı olacak. Kullanıcı 3. çizgiyi farklı bir noktadan başlatıp 2. çizginin end pointinde bitirirse?

yani o zaman;
1. çizginin koordinatları start point a end point b
2.çizginin koordinatları start point b end point c
3.çizginin koordinatları start point d end point c olacak.

listelediğimizde : '((a b) (b c) (d c)) olacaktır. ben bu listeyi '((a b) (b c) (c d)) yapmaya çalışıyorum.

Umarım derdimi anlatabilmişimdir.

while komutu;
test ifadesi doğru olduğu sürece;
verilen ifadeleri yapması gerekiyor değil mi ?

yukarıda yazdığım işlevde

l listesi boş olmadığı sürece koşul saglanıyorsa bunu yap sağlanmıyorsa bunu yap demek istedim ama başaramadım.
yada kurgum yanlış bilemedim.

***********************************************
Mevcut listen (setq l '((a b) (e d) (c b) (d c))) ise bunu '((a b) (b c ) (c d) (d e)) yaparken bir kuralı olmalı.
Aslında sizin ilk listenizi a b c d e şeklinde düzenleyip bunu sıraladıktan sonra istediğiniz listeyi rahatça kurgulayabiliriz.
***********************************************
Yöntemini öğrenmek için, neyin nasıl yapıldığını anlamak için örnek fonksiyonu görmek isterim.

Esenlikle kalın
Sağolun varolun.

14.07.2018 17:05
86475    
ehya

[90] Yönetici

Online Durumu

3187 ileti
Teknik Ressam
Ankara

Örnek kod aşağıdadır. Belirtilen listeyi istediğiniz gibi sıralar..

Kod:

(setq l '((a b) (e d) (c b) (d c)))

(mapcar '(lambda (x)
             (if (> (vl-symbol-name (car x)) (vl-symbol-name (cadr x)))
                 (reverse x)
                 x
             )
         )
        (vl-sort
            (vl-sort l
                     '(lambda (x1 x2)
                          (< (vl-symbol-name (car x1)) (vl-symbol-name (car x2)))
                      )
            )
            '(lambda (x1 x2)
                 (< (vl-symbol-name (cadr x1)) (vl-symbol-name (cadr x2)))
             )
        )
)

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