12.12.2019 06:17    

ehya
agaa




Autocad ortamında iken VLIDE komutunu çalıştırıp Lisp Editorünü açın.
File sekmesinden DCL dosyasını açın.
Tools --> Interface Tools --> Preview DCL in Editor çalıştırın.

12.12.2019 10:44    

agaa
Alıntı
ehya :
agaa




Autocad ortamında iken VLIDE komutunu çalıştırıp Lisp Editorünü açın.
File sekmesinden DCL dosyasını açın.
Tools --> Interface Tools --> Preview DCL in Editor çalıştırın.




ÇOK TEŞEKKÜR EDERİM.

25.12.2019 08:57    

turgaygirgin
Selamlar Herkese,
Dcl Konusunda yardımlarınıza ihtiyacım var,

Dcl Kodu:

test : dialog {
label = "Deneme" ;
: column {
: row {
: column {
height = 26;
width = 8;

: text { value = "Etiket1"; alignment = left;}
: text { value = "Etiket2"; alignment = left;}
: text { value = "Etiket3"; alignment = left;}
: text { value = "Etiket4"; alignment = left;}
: text { value = "Etiket5"; alignment = left;}
: text { value = "Etiket6"; alignment = left;}
: text { value = "Etiket7"; alignment = left;}
: text { value = "Etiket8"; alignment = left;}
: text { value = "Etiket9"; alignment = left;}
: text { value = "Etiket10"; alignment = left;}
: text { value = "Etiket11"; alignment = left;}
: text { value = "Etiket12"; alignment = left;}
: text { value = "Etiket13"; alignment = left;}
: text { value = "Etiket14"; alignment = left;}
: text { value = "Etiket15"; alignment = left;}
: text { value = "Etiket16"; alignment = left;}
: text { value = "Etiket17"; alignment = left;}
: text { value = "Etiket18"; alignment = left;}
: text { value = "Etiket19"; alignment = left;}
}
: column {
: list_box { key = "mylist1";
height = 26;
width = 6;
multiple_select = false;
fixed_width_font = true;
horizontal_margin = none;
}
}
: column {
: list_box { key = "mylist2";
height = 26;
width = 6;
multiple_select = false;
fixed_width_font = true;
horizontal_margin = none;
}
}
}
ok_only ;
}
}
Lisp kodu:

(defun c:test (/)
(setq L '(("A1" "A2" "A3" "A4" "A5" "A6" "A7" "A8" "A9" "A10" "A11" "A12" "A13" "A14" "A15" "A16" "A17" "A18" "A19")
("B1" "B2" "B3" "B4" "B5" "B6" "B7" "B8" "B9" "B10" "B11" "B12" "B13" "B14" "B15" "B16" "B17" "B18" "B19")
))
(if(not(setq dcl_idt (load_dialog "test.DCL")))(exit)
(progn
(if (not(new_dialog "test" dcl_idt))(exit)
(progn
(setq indx 0
List1 (nth indx L)
List2 (nth (1+ indx) L)
)
(start_list "mylist1" 3)(mapcar '(lambda (x) (add_list x)) List1)(end_list)
(start_list "mylist2" 3)(mapcar '(lambda (x) (add_list x)) List2)(end_list)

(action_tile "accept" "(done_dialog 1)")
(action_tile "cancel" "(done_dialog 0)")

(setq ddiag (start_dialog))
(unload_dialog dcl_idt)

(if (= ddiag 1)
(princ "\n OK!")
)
(if (= ddiag 1)
(princ "\n Cancel!")
)
)
)
)
)
(princ)
)

olan bir fonksiyonum var.

listedeki elemanların değerini gösteren etiketler Dcl de sol sütunda,orta ve sağ sütunda da iki liste kutusu var.
Etiket1 , A1 , B1
Etiket2 , A2 , B2
Etiket3 , A3 , B3
.
.
Şeklinde.
Sorunum da şu:
Dcl görünümünde Etiket ve liste elemanlarını hizalamayı başaramadım.
Liste görünümünde elemalar arasındaki açıklığı (A1 A2 A3 arasında) arttırmanın bir yolu yok sanırım.
Etiketler arasında ki açıklığı ayarlamanın yolu nedir?Nasıl ayarlayabilirim?
Spacer0 , Spacer1, Spacer_width hepsini denedim.


Yardımcı olursanız sevinirim.Saygılar.

07.02.2021 21:08    

Chatintash
Merhabalar,

x ekseninde + yönünde (sağa doğru) kendi belirleyeceğim başlangıç noktası, mesafe ve eğimde line çizdirmek istiyorum. Ayrıca çizilen line ın orta noktasına belirlediğim eğim değerinin de label olarak otomatik atılmasını istiyorum. Yatay eksende 1/1000 ölçek, düşey eksende ise 1/100 ölçek olmasını istiyorum.

Yardımcı olursanız sevinirim.

Saygılar.

07.03.2021 19:54    

BLack|E
Kod:

(defun c:mov ()
(setq sec (ssget))
(setq nk1 (getpoint "\n Objenin baslangic noktası...:"))
(setq xmes (getreal "\nX MESAFESI....... ")) ;50 olsun
(setq ymes (getreal "\nY MESAFESI....... ")) ;20 olsun
(setq zmes (getreal "\nZ MESAFESI....... ")) ;0 olsun
(command "move" sec "" nk1 "@50,20,0" )
(princ)
)


"@50,20,0" yerine nasıl xmes, ymes, zmes kayıtlıları kullanabilirim, yardımcı olursanız sevinirim.

07.03.2021 21:51    

alumina
Alıntı
BLack|E :

Kod:

(command "move" sec "" nk1 (mapcar '+ nk1 (list xmes ymes zmes)))

08.03.2021 10:05    

BLack|E
Alıntı
alumina :
Alıntı
BLack|E :

Kod:

(command "move" sec "" nk1 (mapcar '+ nk1 (list xmes ymes zmes)))



Hocam neler düşündüm ve uyguladım ama sizin kadar kısa ve pratik düşünemiyoruz. mapcar yöntemi harika, Çok Teşekkür ettim.

24.04.2021 11:25    

BLack|E
Herkese iyi hafta sonları dileklerim,
Mehmet Şamil (EhYa) hocamın emek verip bizler için oluşturduğu AUTOLISP pdf dokümanındaki örnekleri
uygulayıp öğrenmeye çalışıyorum,
aşağıdaki örnekte kullanıcı tarafından belirtilen iki noktaya daire çizip bu iki nokta arasına line çizmek
ve bu line çizgisinin ortasına çizginin boyunu yazmak lispini görüyorsunuz.
benim sorum şöyle bu daireleri komut bittikten sonra görebiliyorum, komut devam ederken
bu dairelerin ön izlemesini görmek istiyorum. Düşündüm fakat bulamadım.

Kod:

(defun c:ccl()
  (setq os (getvar "osmode"))
  (setq ycap (getdist "\nDaire Yaricapi...:"))
  (setq ref-1 (getpoint "\n1.Nokta...:"))
  (setq ref-2 (getpoint ref-1 "\n2.Nokta...:"))
  (setvar "osmode" 0)
  (command "._line" ref-1 ref-2 "")
  (command "._circle" ref-1 ycap)
  (command "._circle" ref-2 ycap)
  (setq aci (angle ref-1 ref-2))
  (setq mesafe (distance ref-1 ref-2))
  (setq orta-nokta (polar ref-1 aci (/ mesafe 2.00)))
  (if (and (> aci (angtof "90.00"))(<= aci (angtof "270.00")))
    (progn
      (setq aci (+ aci pi))
      )
    )
    (setq yazi_data_olustur (list
   (cons 0 "TEXT")
   (cons 8 "0")
   (cons 100 "AcDbEntity")
   (cons 100 "AcDbText")
   (cons 10 orta-nokta)
   (cons 11 orta-nokta)
   (cons 40 10)
   (cons 50 aci)
   (cons 7 "Standard")
   (cons 71 0)
   (cons 72 1)
   (cons 73 1)
   (cons 1 (rtos mesafe 2 2)))) 
(entmake yazi_data_olustur)
(setvar "osmode" os)
(princ)
)

26.04.2021 08:38    

ehya
Merhaba Ertan,
Bu istemiş olduğun biraz karmaşık ama aslında eğlenceli bir konu.
İş yoğunluğum var. Eğer fırsat bulabilirsem yazmaya çalışırım.
Travaci ve Alumina'nın da eminim dikkatini çekmiştir. Hatta yazmaya başlamışlardır :)

26.04.2021 13:18    

ehya
Kimseden ses çıkmayınca yazayım dedim. :)
Umarım örnek bir kod olur.


Kod:

(defun c:CCL (/ *error* undo_fl)
(defun *error* (msg) (if undo_fl (progn (vla-EndUndoMark undo_fl)(command-s ".undo" 1))) (princ))
(setq zv (trans '(0 0 1) 1 0 t)) (setvar 'cmdecho 0)
(if (= dcap nil)(setq dcap 10.0))
  (setq dc  (getdist (strcat "\nDaire Yarıçapı < " (rtos dcap 2 2) " >:")))
  (if (= dc nil)(setq dc dcap))(setq dcap dc)
(if (setq pt1 (getpoint "\n1.nokta:"))
  (progn
  (vla-startundomark (setq undo_fl (vla-get-activedocument (vlax-get-acad-object))))
  (entmake (list (cons 0 "CIRCLE")(cons 10 (trans pt1 1 zv))(cons 40 dcap)(cons 210 zv)))

(setq cc (entget (entmakex (list
(cons 0 "CIRCLE")
(cons 10 (trans pt1 1 zv))
(cons 40 dcap)
(cons 210 zv)))))
(setq ll (entget (entmakex (list
(cons 0 "LINE")
(cons 10 (trans pt1 1 zv))
(cons 11 (trans pt1 1 zv))
(cons 210 zv)))))
(setq tt (entget (entmakex (list
(cons 0 "TEXT")
(cons 10 (trans pt1 1 zv))
(cons 11 (trans pt1 1 zv))
(cons 40 dcap) 
(cons 1 "0")   
(cons 50 0)     
(cons 71 0)
(cons 72 1)
(cons 73 1)))))
    (while (= 5 (car (setq gr (grread t 13 0))))
      (princ "\n2.noktayı gösterin:")
    (entmod (subst (cons 10 (cadr gr))(assoc 10 cc) cc))
    (entmod (subst (cons 11 (cadr gr))(assoc 11 ll) ll))
   (setq aa (subst (cons 50 (angle pt1 (cadr gr)))(assoc 50 tt) tt)
         aa (subst (cons 10 (polar pt1 (angle pt1 (cadr gr))(/ (distance pt1 (cadr gr)) 2.0)))(assoc 10 aa) aa)
         aa (subst (cons 11 (polar pt1 (angle pt1 (cadr gr))(/ (distance pt1 (cadr gr)) 2.0)))(assoc 11 aa) aa)   
         aa (subst (cons 1 (rtos (distance pt1 (cadr gr)) 2 2))(assoc 1 aa) aa))
  (entmod aa)
      )
(vla-EndUndoMark undo_fl) (setq undo_fl nil)
  ))
(princ))

ehya (27.04.2021 09:17 GMT)

27.04.2021 19:58    

BLack|E
Hocam ellerinize sağlık, eğitici ve örnek bir kod olmuş,
entmakex , trans ve entmod hiç kullanmamıştım.
grread ise çok enteresan lispin farklı bir boyutu, mausenin hareketinin bile data olarak anlık geri dönmesi şaşırttı beni.

Aşağıdaki kodun ne işe yaradığını da uzun zamandır araştırıyorum çözemedim. ProhibiT hocamın kitabında da defalarca bakmama rağmen bununla ilgili bir bilgiyle karşılaşmadım maalesef.
Kod:

(vla-startundomark (setq undo_fl (vla-get-activedocument (vlax-get-acad-object))))

28.04.2021 05:34    

Travaci
Alıntı
BLack|E :

Kod:

(command "_.undo" "be")

23.12.2021 17:05    

turgaygirgin
Slm.
Elimde Mehmet Şahin Güvercin hocamızın,Kodlab yayınlarının1.baskısı Autolisp & Visuallisp kitabı var.Kitabın 429-460 arası sayfalar yok.461-492 arası sayfalar tekrarlanmış. Yalnız benim elimdeki kitaptamı böyle yoksa, aynı sorun başka arkadaşlarda da var mı ?

24.12.2021 06:48    

ehya
turgaygirgin



Bendeki kitabı kontrol ettiğimde herhangi bir sıkıntı yok. Şanssızlık maalesef sizin kitabınızda..

24.12.2021 16:57    

yazgunesi
Alıntı
turgaygirgin :


Kitabı satın aldığınız yerden ''aynı kitabı'' değişim yapmayı isteyebilirsiniz, eğer satın alma işlemi çok geçmediyse.. Görünen o ki matbaa basım hatası oluşmuş gibi. :-)

25.12.2021 21:43    

ProhibiT
Merhaba arkadaşlar,

Elimde kitabın basılı kopyası olmadığı için kontrol edememiştim.
Mehmet Hocamın açıklamasından sonra turgaygirgin arkadaşımıza özel mesaj yazarak çözüm teklifinde bulunmuştum. Arkadaşımız kabul edip mail adresini bana göndermiş. Mesajının devamında da, "Affınıza sığınarak birde ricam olacak sizden. Nasıl olur bilmiyorum, forumda vlax-make-safearray, variant oluşturulması bunların doldurulması ve kullanılması ile ilgili bir kaç örnek yapılsa. Sizin sitede ara ara yaptığınız makale gibi açıklamalarınız çok faydalı oluyor. Çok şeyler öğreniyoruz sayenizde, çok sağ olun. Mümkün müdür?" demiş.

Bu mesaj beni iki bakımdan memnun etti. Birincisi, açık ve net, hedefi ve amacı belli bir soru sorulması; ikincisi ise, zaman zaman yaptığım, uzunca paylaşımların (ki, bu makale gibi benzetmesi Mehmet hocama aittir) gerçek muhataplarından biri tarafından faydalı ve öğretici olduğunun ifade edilmesi benim için ayrıca değerli. Forumda yazdıklarıyla, özel mesajlarımızda ve telefon görüşmelerimizde Mehmet hocam sağ olsun "makale gibi" deyimini kullanarak iltifat ediyor. Ben de, hocam nezaketinden öyle söylüyorsun, geri dönüşlerden (hatta dönmeyişlerden) ben pek te öyle algılamıyorum... diyorum. Kullandığım üslup nedeniyle kırılanların olduğunu da düşünüyorum açıkçası.

Bilenler bilir ki, günlük hayatımda, bulunduğum çeşitli ortamlarda (hatta sahnede bile :)) ben bu dili ve üslubu kullanıyorum. Bilenler bilir... diyemeyeceğim, çok az bilinen bir şey daha var, başta anadilim Türkçe olmak üzere bir kaç dilde daha fonetik uzmanı, (diksiyon/pronunciation) eğitmeniyim (MEB onaylı sertifika verme yetkim var).

Kullandığım Türkçe'ye özen gösterir, muhatabımdan da bunu beklerim açıkçası. Ana dilini iyi (bihakkın) bilmeyen matematiği öğrenemez, sanıldığının tersine matematiği bilmeyen (analitik düşünemeyen) sosyal bilimleri de öğrenemez. Burada kast ettiğim eğitim ve öğretim kurumlarının müfredatınki matematik veya bazılarının sandığı gibi aritmetik değil elbette. Eğitim sistemimizde önce kolay olan matematik zorlaştırılır (öğretenler iyi yetişmemiş çünki) sonra da (örneğin) bir tek türev formülünden 50 tane türetilip bunların ezberletilmesi yoluna gidilir... sonuçta öğrenci soğutulur. Devamında da, sen sosyalci olacaksın matematikle ne işin olur, veya tersine fen bilimlerine yöneleceksin, edebiyatla (dil ile, Türkçe ile) ne işin olur! şeklindeki yanlış yönlendirmelerle büyük hatalar yapılır. Anlatamadığın (ifade edemediğin) şeyi bilmiyorsun demektir! Bilsen anlatırsın... dediğimde çok kırılan oluyor. Ama bu böyle, elden bir şey gelmez.

Bu konularla ilgili yaşanmış ilginç (sevindirici veya üzücü olmaktan çok benim açımdan düşündürücü) bir olayı paylaşmak isterim. İki yıl kadar önceydi, oğlum (İç Mimardır ve Mehmet hocamın da katkılarıyla iyi bir AutoCAD kullanıcısıdır) çalıştığı firmanın görevlendirmesiyle bir şantiyede gitti. Telefon konuşmamızda, "Baba bir proje müdürümüz var Yavuz Bey, AutoCAD ve hatta Lisp ile çok ilgili, benim için çok verimli olacak burası..." demişti. Söylediği isim, Yavuz Çal hiç yabancı gelmiyor bana, kısaca hafızamı yokladım, eşe dosta sorunca çıkardım. "Yavuz bey efsane bir proje müdürüdür, kendisiyle hiç karşılaşmadık ama onunla çalışan arkadaşlarımız çok övgüyle bahsederler. Kıymetini bil..." demiştim. Aradan belki altı ay kadar zaman geçmişti, bir gün Yavuz bey, "Ya sizin bu soyadı pek yaygın değil ama Mehmet Şahin Güvercin ile bir akrabalığın var mı senin?" Diye sorunca. Oğlum da "Babam olur," demiş. "Yapma ya! yaşı o kadar var mı? Ben onun sıkı bir takipçisiyim, hatta bir keresinde özel mesaj yazmayı düşündüm... bu gençler belli olmaz, bunun da biraz dili sivri, ters bir cevap verir... bu yaşta kaldıramam, diye vaz geçtim" demiş. Daha sonra Yavuz Bey ile telefonda konuştuk, yanlış anlamayı ve algılamayı düzeltmeye çalıştım, ama bu yaşanan olay kullandığım üslup konusunda beni düşünmeye sevk etti. Bu vesileyle Yavuz Bey'in de kulaklarını çınlatmış olduk, selam ve saygılarla...

turgaygirgin arkadaşımıza da sözüm olsun, vlax-make-safearray, variant konusunu en kısa zamanda hazırlayıp buradan paylaşacağım.

Selam ve saygılarımla herkese kolaylıklar dilerim.

10.01.2022 12:08    

mesuttasar
Forumda bulunan tüm arkadaşlara selamlar, sayenizde yeni bilgiler edinmeye devam ediyoruz. Bir konuda soru soracaktım, daha önce sorulduysa ve tekrara girdiyse şimdiden affımı istiyorum. Autolisp komutlarıyla genel anlamda istediklerimi yapabilecek ölçüde bilgi sahibiyim, ancak şu vl, vla, vlx ile başlayan komutların (ki sanırım bunlar visual lisp komutları) ne işe yaradığını , mevcut lispleri incelememe rağmen ne yazıkki hiç anlamıyorum. Bu konu ile ilgili nereden bilgi alabiliriz, elimde 2 adet lisp kitabı var ama daha o bölüme kadar gelemedim.
AutoLisp ile Vlisp arasındaki farkları gösteren bir video olsaydı müthiş olurdu. Tekrardan hepinize iyi günler diliyorum, iyi ki varsınız. Selamlar,

11.01.2022 05:06    

BLack|E
Merhaba, müsadeniz olursa bende bu konu hakkında fikrimi beyan etmek isterim, benim de yıllardır kanayan yaramdır "vl, vla, vlx" ile başlayan kodlar, bu kodları anlamamakla birlikte çözümünü de bulamadım, satın aldığımız kitap/kitaplarda da çok nadir bilgi oluyor "vl, vla, vlx " ile ilgili. Sitede yazarlık yapan hocalarımızın yazdıkları vl, vla, vlx başlayan kodlar hakkında ne işe yaradığına dair bir sonuca varamıyorum. Sıkışıp kalmışım gibi hissettiriyor bana bu durum. Değerli paylaşımlarınız için minnettarız. Selam ve saygılarımla.

27.01.2022 12:41    

ProhibiT
Merhaba Arkadaşlar,
Daha önce turgaygirgin arkadaşımızın isteği vardı, onu açıklamaya fırsat olmadan, vl-, vla- ve vlax- ile ilgili sorularınızı görünce tek seferde tümüne cevap vermek daha uygun olur diye düşündüm. Konuyu en başından ele alıp, ayrıtılarıyla anlatmaya çalışacağım. Biraz uzun olacak, ama okuma zahmetine katlanamayan arkadaşlarımızın, zaten anlattığımız konular hakkındaki sorularına cevap vermeyeceğimi şimdiden söylemek isterim.
Konuya kitabımızın Önsöz'ünden bir alıntı yaparak başlayalım.
"Yapay Zekâ uygulamaları için geliştirilen Genel LISP (Generic List Processing) halen kullanılmaya devam eden en eski programlama dillerinden biridir. Genel LISP programlama diline AutoCAD® ortamına has yeni kavramlar eklenmesiyle AutoLISP geliştirilmiştir. Başlangıç seviyesinde bile basit ama verimli fonksiyonlar yazılabilmesinin yanında, ustalaşması ve derinleşmesi yıllar sürebilecek güçlü bir programlama dildir. AutoCAD®’in özelleştirilmesinde ve geliştirilmesinde kullanıcılar tarafından başarıyla kullanılan AutoLISP™ zaman içinde profesyonel program geliştiricilerin de ihtiyacına cevap verecek şekilde, komut setinin genişletilmesi, düzenleyici (editor) ve derleyici (compiler) eklenmesiyle VisualLISP™ olarak geliştirildi."
Kitabımızın Basın bülteninde yer alan bir açıklamayı tekrar hatırlayalım.
"... AutoLISP ile yazılmış kodlarını görünce, başka bir programlama diline benzediği şeklinde bir yanlışa düşmemek gerek. İşin doğrusu, benzer diye düşünülen programlama dillerinin Lisp'e benzer olmalarıdır. Genel Lisp (Generic Lisp), halen kullanılmakta olan Yüksek Seviyeli Programlama Dilleri'nin en eski ikincisi (ki, Fortran'dan 1 yıl sonra kullanılmaya başlamıştır) ve en gelişmişidir. 1958 yılında yapay zeka (Artificial Intelligence) alanında çalışan bir grup bilim insanı tarafından oluşturulmuş, zaman içinde pek çok kişinin katkılarıyla geliştirilmiştir. Lisp Programlama Dili, açık kaynak kodlu pek çok programda halen yaygın olarak kullanılmaktadır. Kendinden sonra geliştirilen programlama dillerinden eksiği yok, fazlası vardır. AutoDesk firması, AutoCAD programının ilk sürümlerinden beri Genel Lisp programını kendi platformuna uyarlayıp, bir çevirici (Interpreter) ve değerlendirici (Evulator) ile birlikte AutoLISP adı altında kullanıcılarına sundu. Başlangıçta, yani 80'li yılların başlarında, Lisp'in bu amaçla seçilmesindeki neden, anonim olması, yani herhangi bir sahibinin bulunmayışı idi. Genel Lisp dilini bilenler tarafından çok sevildi, yeni kullanıcılar tarafından da kolayca öğrenildi. AutoCAD programının geliştirilmesinde çok katkısı oldu. ..."
Buraya kadar bir sıkıntı yok, herkes mutlu. Bundan sonrasını gene basın bültenimizden takip edelim.
"AutoCAD'in sonraki sürümlerinde C dilini esas alan, MDL (Microstation Development Language, ki o zamanlar Microstation, Intergraph firmasının sahibi olduğu, AutoCAD'in rakibi, işin gerçeği daha gelişmiş bir programdı. AutoCAD 2 Boyutlu iken, Microstation 3 Boyutlu idi, hatta stereoskopik görüntü üretebiliyordu...) dilinden esinlenerek, kullanıcıların programlarını C diliyle yazabilecekleri bir altyapı oluşturuldu. C programlama dilini bilen, ama AutoCAD kavramlarına çok yabancı insanlar uygulamalar yazmaya başladılar. Kullanıcı ve yazarlar arasındaki uzun ve dolambaçlı bilgi aktarımı ve iletişim süreçlerindeki aşınma ve kayıplar nedeniyle başarılı olunamadı."
Bundan sonra AutoDesk, (en ciddi rakibi olan) Intergraph firmasını satın alarak bünyesine kattı. Bu noktada görüldü ki, AutoCAD için C diliyle uygulama programları yazmak için bir derleyiciye (C Compiler) gerek vardı ve sahibi de bedava vermiyordu. Söz açılmışken, Intergaph'ın Microstation programını kullanmışlığım, MDL ile Microstation ve C ile AutoCAD için epeyce uygulama yazmışlığım da var.
Gene basın bültenmizdeki hikayeye devam edelim.
"Sonraki dönemlerde AutoDesk, kullanıcılarına daha geniş ve esnek alanlar sağlayabilmek için Visual Basic'e yöneldi. Microsfot Firması tarafından sağlanan Visual Basic for Application (yani VBA) kullanıma sunuldu. MDL ve C dillerinde olduğu gibi VBA alanında da pek başarılı sonuçlar alınamadı. Üstüne üstlük Microsoft, VBA'den desteğini çekince de boşlukta kaldı. AutoDesk kullanıcıya karşı sorumluluğundan dolayı her yeni sürümle birlikte VBA Enabler adlı bir yamayı vermeye devam etmektedir."
Buraya kadar olan gelişmelerden açıkça görüleceği gibi AutoDesk kullanıcısına yeni alanlar açmak için hiç bir fedakarlıktan kaçınmıyor, kendi platformunda kapılar pencereler açıyor. İyi güzel de, o hizmeti sağlayan platformlar (genelde işletim sistemleri) başka bir yerlere savrulduklarında o kapılar pencereler açık kalıyor, AutoCAD'in özellikle de AutoLisp'in içinde rüzgarlar esiyor. AutoDesk bu duruma bir son vermek, kullanıcısını ona-buna muhtaç etmemek için AutoLISP komut setine yenilerini (özellikle de işletim sistemiyle ilgili fonksiyonları) ekleyip, bir de düzenleyici (editor) sundu kullanıcısına, adına da Visual LISP dendi. Bu düzenleyiciye, VLIDE (Visual Lisp Integrated Development Environment) adı verildi. AutoLISP komutları bazı eklemelerle aynen muhafaza edilirken, yeni eklenen bazı fonksiyonlar da ayırt edilmesi için vl- ön ekiyle başlıyordu. Yeni fonksiyonların (komutların) kullanılabilmesi için özel bir işlem gerekmiyor, aynı AutoLisp fonksiyonlarında olduğu gibi kullanılıyordu. Visual Lisp Editor'de iken, vl- yazdıktan sonra Shift+Ctrl+Space tuşlarına birlikte basarak açılan "Apropos" penceresinde vl- ile başlayan tüm komutları görebilir, ilgili komut seçildikten sonra "?" butonuna basarak o komutla ilgili detaylı yardıma (help) ulaşabilirsiniz. Ne yazık ki İngilizce. Ama konuya bu kadar girmiş, buraya kadar gelmiş biri için lisan o kadar sıkıntı yaratmasa gerek.


Buraya kadar gene her şey yolunda, kimsenin bir sıkıntısı yok. Tam bu arada AutoDesk gene kullanıcılarının özellikle Windows ortamındaki Office programlarıyla irtibat kurabilmelerini sağlamak için Microsoft'un sağladığı ActiveX platformuna kapı araladı. ActiveX ile bağlantı kurabilmek için eklenen yeni komutlar vla- ile başlıyordu. AutoCAD (Lisp) tarafında işlem yaparken problem yok veri tipleri (data types) alıştığımız gibi; Integer (tamsayı), real (gerçeksayı), string (karakter dizisi) ve list (liste) türündeki veriler, ActiveX'in muhatap olduğu Office programlarına (örneğin Excel) gönderilirken Lisp Evulator tarafından çevriliyordu. Ama Ofis programından AutoCAD (Lisp) ortamına gelen veriler ActiveX formatında (variant ve safearray) geldiği için Lisp ile işlenebilmeleri için çevrilmeleri gerekiyordu. İşte tam burada AutoDesk gene tüm iyi niyetiyle bir kapı daha açtı, vlax- ile başlayan yeni komutlar ekledi. Yeni komutlar genellikle ActiveX veri türlerinin karşılıklı çevrilmesi amacıyla getirilen komutlardı... bunların yanında inanılmaz faydalı (vlax-curve-...) (adındaki curve ifadesine takılmayın, doğru nesnesi de bombesi sıfır olan eğri olarak düşünüldüğünde bu grup komutlar, eğri/doğru her nesneye uygulanabilir), (vlr-...) (reaktör fonksiyonları) ve (vlax-tmatrix ...) gibi olağanüstü faydalı bazı yenilikler de vlax- komut grubuna eklendi. Neyse ki, .NET konusunda AutoDesk öyle kapı pencere açmadı, tek yönlü olarak .NET'ciler için erişim sağlandı. Zaten Object ARX türü uygulamalar yazmayacaksanız (ne kadar gerekli olduğu da tartışılır) bu yan kapılara da hiç ihtiyacınız olmayacaktır.
vla- türündeki komutlarla ilgili olarak, aynı vl- komutlarında olduğu gibi, vla- yazdıktan sonra Shift+Ctrl+Space tuş grubuna birlikte basarak "Apropos" penceresinde tüm komutları görebilirsiniz. İşte iplerin koptuğu nokta burası! Burada seçtiğiniz komutun "?" butonuna bastığınızda komutla ilgili herhangi bir yardım menüsüne ulaşamazsınız.

"Apropos" penceresinde görülen komutların tümü seçildiklerinde ve uygun (giriş ve çıkış) parametreleriyle kullanıldığında çalışırlar. Ama komut formatı, giren ve üretilen değerlerle ilgili hiç bir yerde (AutoCAD'in kendi dokümanları da dahil) bilgiye ulaşamazsınız... Belki çok eski AutoCAD sürümleri eksiksiz dokümanları (-.chm uzantılı derlenmiş help dosyaları) ile birlikte eski bir bilgisayarınızda kurulu ise ancak oradan ulaşabilirsiniz. Internet'te bile pek şansınız yok açıkçası.
Bu neden böyle peki? AutoDesk zaman zaman bazı komutlar (veya sistem değişkenleri) konusundaki Help'in altına, "Bu komut sonraki sürümlerde geçerli olmayacaktır" notu düşüyor... sonraki sürümlerde bu komut veya özellik çalışmakla birlikte dokümantasyonu yoktur. vla- komutlarında da (yerine aynı işlemi yapan vlax- komutları geldikten sonra) durum böyledir. Örneğin, (vla-put-StartPoint ...) komutunu kullanarak bir nesnenin Başlangıç Noktası'nı değiştirebilirsiniz, ama bu komutun detaylarını hiç bir yerde bulamazsınız. Çünkü bu komut (kim bilir hangi sürümde) "obsolote" olarak duyurulmuş, onun yerine (vlax-put-property VLA-Object-ID 'StartPoint BaşlangıçNoktası) getirilmiştir. Her ikisi de çalışır, ama ilkinin formatını bilmek lazım. AutoLisp komut yapısını hazmetmiş yazarlar bir yerde hissi olarak komut ve veri formatını çözebilir. Çoğu zaman, eskiden şöyle/böyle yapıyorduk diye karine ile çıkarıyor veya yazdığımız eski kodlardan bularak hatırlayabiliyoruz.
Bir üzücü haber daha:

AutoCad help dosyasında görülen not'ta vla-, vlax- ve vlr- grubu komutların Mac OS işletim sisteminde geçerli değildir... deniyor. Kimi ne kadar ilgilendirir bilmiyorum ama, Windows işetim sistemi dışında da yazdığımdan, benim için önemli bir detay.
vla-, vlax- ve vlr- komutlarını kullanabilmek için (vl-load-com) kullanarak, AutoLisp Extension özelliğini yüklemek gerekir.
Şimdi gelelim turgaygirgin arkadaşımızın sorusuna. Arkadaşımız nerede ne zaman variant ve safearray türü veriler (parametreler) kullanacağımızı sormuştu. Her şeyden önce bir şeyi tespit edip bir kenara koyalım: Variant ve safearray türü veri tipleri ActiveX ortamının veri türleridir. Yani ActiveX ortamına gönderilen veriler (istisnaları olmakla birlikte) variant ve safearray türünde olacaklardır. Tersi de geçerlidir, ActiveX ortamından (örneğin Excel'den) gelen değerler de, (gene istisnaları var,) variant ve safearray türünde olacaklarından, Lisp ortamında erişip kullanabilmek için çevrilmeleri gerekir. Bu çevirme işlemleri kitabımızın 370. sayfasında, "ActiveX Data Conversion Functions / ActiveX Veri Çevirme işlevleri" bölümünde ayrıntılarıyla verilmiştir.
______________________________________
Burada (epeyce istisnaları olsa da) bir kurnazlıktan söz etmekte fayda var: Kullandığınız komut vla- ile başlıyorsa parametreleri (özellikle giriş ve bazen de çıkış değerleri) Lisp'e uygumlu veri türündedir; kullanılan komut vlax- ile başlıyorsa, (giriş ve çıkış) parametreleri ActiveX (yani variant ve safearray) türündedir. Yukarıda verdiğimiz örneği ele alırsak, (vla-put-StartPoint ...) komutunu kullanırken beklenen başlangıç noktası parametresi x, y ve z koordinatlarını ifade eden 3 tane real'dan oluşan (3.6 2.0 0.0) gibi bir nokta listesidir. Aynı işlemi (vlax-put-property ...) komutuyla yaparken, nokta listesini (vlax-3d-point '(3.6 2.0 0.0)) işlemiyle ActiveX verisine çevirmemiz gerekir. İşin açıkçası bu durumlar sizin ferasetinize kalmış, belki de deneyip yanılarak bulacaksınız.
______________________________________
Bu bölüm Adem Ercan (alumina) arkadaşımızın özel mesajla uyarması üzerine aşağıdaki şekilde değiştirilmiştir.
______________________________________
AutoLISP ortamında temel olarak iki tür veri vardır, Listeler ve Atomlar (Lists and Atoms).
Bir Atom, içinde başka bir alt veri bulundurmayan tekil bir veri türüdür.
(getpoint... işleviyle ekranımızdan okuttuğumuz veriler, noktanın x, y ve z koordinatlarından oluşan bir Liste’dir. AutoCAD komut satırından (atom (getpoint)) şeklinde AutoLISP çeviriciye bu bir atom mudur? Diye sorduğumuzda olumsuz karşılık (nil) alırız.
(atom (car (getpoint))) şeklinde, bu liste içinden ilk veriyi (x koordinatını) alıp, aynı soruyu sorduğumuzda, T (True=Doğru) cevabını alırız.
İlk elde ettiğimiz değer, 3 tane gerçeksayı’dan oluşan Liste türünde bir veridir. Alt verileri olduğu için Atom değildir. İkinci elde ettiğimiz (listenin ilk elamanı, yani x koordinatı) değer ise, yalnızca bir tek gerçeksayı’dan oluştuğu için bir Atom’dur.
Bu bakış açısıyla, Semboller ve Sembol Adlarıyla tanımlı AutoLISP işlevleri de, tek bir veri olarak işlenebildiklerinden birer atom’dur. Böylece, genel olarak atomlar ya bir sayısal değerdir, ya da bir semboldür.
Sonuç olarak (vla- ve (vlax komutlarını kullanırken, giren ve çıkan (üretilen) veri türü Atom ise, hem AutoLisp tarafında hemde ActiveX tarafında olduğu gibi kullanılır, çevirme işlemine gerek yoktur. Giren ve çıkan veri türü Atom değilse (yani genel anlamda list ise,) ActiveX'e gönderilirken Variant ve Safearray türüne çevirilmeli, ActiveX'ten gelen veriler ise Variant ve Safearray türünden çevirilmelidir.
______________________________________
vl-, vla, vlax ve vlr- fonksiyonlarının tam bir listesini 174410-vl-vla-vlax-vlr.txt linkinden indirebilirsiniz. Bu -.txt dosyasında yer alan komutların çoğu için doküman bulamayacaksınız. Bununla birlikte, yukarıda açıklandığı gibi temel prensipler çerçevesinde çözülebilir diye düşünüyorum. Dosyada yer alan fonksiyonlara göz atıldığında dikkatinizi çekecektir ki, vla-get- ... ve vla-put- ... biçimindekilerin çoğu işletim sistemi ve AutoCAD sistem değikenleri ile ilgilidir ve bunların formatını çözmek o kadar da zor olmasa gerek.
mesuttasar ve BLack|E arkadaşlarımızın sorularına gelince. Hevesinizi kırmak gibi olmasın da... bir Lisp koduna baktığımda, gereksiz yere kullanılmış vl-, vla- ve vlax- türü komutlar gördüğümde saygım azalıyor. Bana sorarsanız gözünüzde büyütüyorsunuz. Paylaştığım Lisp'lerde, ActiveX bağlantısı (Excel gibi) kullanıyorsam, (vlax-curve- ...) türü fonksiyonlarla türev gibi işlemler yapıyorsam, Dönüşüm matrisi (Tansformation Matrix) kullanıyorsam ve elbette Reactor kullanıyorsam... bahsettiğiniz komutları kullanırım. Aksi halde uzak dururum. Belki yazar arkadaşlara örnek olması bakımından yazdığımız istisnalar dışında safkan AutoLISP komutlarını tercih ediyorum her zaman.
Bazı arkadaşlar bana kızıyor, alınıyor... (biliyorum gene kızacaklar.)
Kod:

(setq dici (vla-get-ActiveDocument (vlax-get-acad-object))

biçiminde (Haşşşırt to the blackboard!) Aktif AutoCAD dosyasını doküman olarak tanımlamak ne (kel) alaka! Böyle bir tanımlamanın Lisp içinde olmasının hiç bir boyutta anlamı olamaz! AutoCAD dosyası (doküman) Collection olarak tanımlanacaksa, Aktif Doküman ActiveX türü bir doküman olmalıdır. Örneğin Excel'de yazılan bir uygulama (ki o da Lisp değildir) yazılırken Drawing dosyası collection olarak tanımlanabilir. Belki bir AutoCAD dosyası aktifken, bir başka AutoCAD dosyası açılmadan ulaşılması amacıyla kullanılırsa bunu anlamak ve kabul etmek te mümkün. Bu saydığımız durumlarla ilgisi olmayan en basit işlemlerde bile yukarıdaki gibi (nereden kopyalama yoluyla iktibas edildiyse,) Tüm AutoCAD dokumanını Object (aslında collection) olarak tanımlanmasının gereksizliğini ifade ettiğimde, "Ne zararı var ki?" deniyor... ben de diyorum ki, "Ne gereği var ki!"
Anlaşılıyorki, soru sahibi arkadaşlarımızın aslında kast ettikleri vl-, vla, ve vlax- komutlarının kendisi değil elbette. O komutlarla yapılabilen matematik ve geometrik işlemler. AutoCAD kullanıcısı kurnazdır; Lisp okuru (yazılmış Lisp fonksyionları alıp, yükleyip kullanabilenlere "okur" diyoruz) zekidir; yazar (Lisp ile kendi fonksiyonlarını yazabilenlere "yazar" diyoruz) hem kurnaz hem de zekidir, yani akıllıdır. Kitabımızın ilgili bölümlerinde detaylı örneklerle anlattıklarımıza bir kere daha dikkatinizi çekmek isterim. Pek çok yazımda sözünü ettiğim bir konu var: Türev; fonksiyonu verilmiş bir eğrinin (yukarıda doğrunun da bombesi sıfır olan bir eğri olduğundan söz etmiştik), verilen bir noktadaki Teğetinin Eğimi'dir. Öyle okullarda öğretildiği gibi 50 tane de türev formülü yoktur! Türev formülü bir ve yalnız bir tanedir... gerisi türev'in geometrik anlamından kendiliğinden çıkar. Kitapta ve paylaştığımız pek çok Lisp fonksiyonda pek çok örneğini verdik. Elimizde AutoCAD ve Lisp gibi bir silah olduğu sürece eğrinin (doğrunun veya genel olarak çizim nesnesinin) fonksiyonunu da, hatta türev formülünü bile bilmek zorunda değiliz, nasılsa (vlax-curve-... türü komutlarla buna ulaşabiliyoruz. "Ulaştık ta ne oldu!" diyenler çıkacaktır. (vlax-curve-getFirstDeriv ...) ile bulduğumuz birinci türev, matematikte (yukarıda açıklandığı gibi) işleme alınan eğrinin (aslında genel AutoCAD nesnesinin) belirlenen noktadaki teğetinin eğimidir, (yani tanjant α dır). AutoCAD ortamında (Lisp'te) ise; belirlenen noktayı orijin alan teğet doğrusunun vektörüdür (yani deltaX, deltaY ve deltaZ'den oluşan bir listedir). Gerek (vlax-curve, gerek (vlax-tmatrix ve gerekse (vlr- ile ilgili sitemizde ve kitabımızda yeteri kadar örnek olduğundan, burada detaya girmeyi gereksiz görüyorum. Akıllı arkadaşlar buradan gerekeni alacaklardır.
mesuttasar arkadaşımızın başka bir başlık altında paylaştığı bir Lisp kodundan yola çıkarak anlattıklarımızı daha elle tutulur hale getirelim. Örneğimize geçmeden pek çok defa, pek çok yerde anlatmaya çalıştığım bir prensip var, "2 kereden fazla kullanmayacağın hiç bir değeri değişkene atayıp tutma! setq'ları israf etme! bir değeri 2 defa kullancaksan, 1.'de kullandığın ifadeyi doğrudan 2.'de yerine koy. Böylelikle kendine, bilgisayarına ve Lisp'e eziyet çektirmemiş olursun."
Kod:

(defun c:aby (/ yay cap n PvArc)
  (vl-load-com)
  (setq yay (ssget (list (cons 0 "ARC")))
        cap (getreal "\nÇember Yarıçapı: ") n -1)
  (while (setq PvArc (ssname yay (setq n (1+ n))))
    (entmake
      (list (cons 0 "CircLe") (cons 40 cap)
            (cons 10 (vlax-safearray->list
                       (vlax-variant-value
                         (vlax-get-property
                           (vlax-ename->vla-object PvArc) 'StartPoint))))))
    (entmake
      (list (cons 0 "CircLe") (cons 40 cap)
            (cons 10 (vlax-safearray->list
                       (vlax-variant-value
                         (vlax-get-property
                           (vlax-ename->vla-object PvArc) 'EndPoint)))))))
  (princ))

Dilimiz Türkçe'nin değerini bilelim. Daire bir yüzedir, Çember ise çizgi. Birinin yerine diğerini kullanmayı alışkanlık edinirsek, kavramlar birbirine karışır, düşünce sistemimizde de aksaklıklar başlar.
Yukarıda verilen örnek Lisp kodunda, tek bir setq işlevi ile yay, cap ve n değişkenlerine değer atadığına dikkat ediniz. Peş peşe sürüler halinde setq yerine böyle sade bir kullanım şeklini hararetle tavsiye ederim.
Kodlarda dikkat çekmek istediğim bir diğer konu da; (setq PvArc (ssname yay (setq n (1+ n)))) ifadesinde görüldüğü gibi setq içinde setq kullanmak ta mümkündür. Akışı izlersek, while döngüsünü kuraraken seçim setindeki eleman sayısını bilmeye gerek kalmadan, amiyane tabirle, "tükeninceye kadar dön" diyoruz. Seçim setindeki elemanlar tükenince de zaten döngünün şartı nil olacağından döngü devam etmez sonlanır.
Açıklayıcı örnek olarak verdiğim bu kod sürekli kullanılacaksa mutlaka undo-group, cmdecho kapatılması ve hata yakalama (error trap) fonksyionları eklenerek kullanılmalıdır.
Kod:

(defun c:aby (/ *error* ocmd yay cap n PvArc)
  (vl-load-com) (setq ocmd (getvar "cmdecho"))
  (defun *error* (er / )
    (if (member er '("Function cancelled" "quit/exit abort"))
      (princ (strcat "\n\t*error* " er)))
    (if (= (logand (getvar "undoctl") 8) 8) (command-s "_.undo" "e"))
    (if ocmd (setvar "cmdecho" ocmd)) (prin1))
  (command "_.undo" "group") (setvar "cmdecho" 0)
  (setq yay (ssget (list (cons 0 "ARC")))
        cap (getreal "\nÇember Yarıçapı: ") n -1)
  (while (setq PvArc (ssname yay (setq n (1+ n))))
    (entmake (list (cons 0 "CircLe") (cons 40 cap)
                   (cons 10 (vlax-safearray->list (vlax-variant-value
                              (vlax-get-property
                                (vlax-ename->vla-object PvArc) 'StartPoint))))))
    (entmake (list (cons 0 "CircLe") (cons 40 cap)
                   (cons 10 (vlax-safearray->list (vlax-variant-value
                              (vlax-get-property
                                (vlax-ename->vla-object PvArc) 'EndPoint)))))))
  (if (= (logand (getvar "undoctl") 8) 8) (command "_.undo" "e"))
  (if ocmd (setvar "cmdecho" ocmd)) (prin1))

Bu örnek kod ile hem alpaygirgin hemde mesuttasar arkadaşlarımızın sorularına belli ölçüde cevap vermiş olduğumuzu düşünüyorum. Bu tür kodlar yazarken, ele aldığımız nesne türünün (örneğimizde Arc) özelliklerinin neler olduğunu onlara nasıl erişeceğimizi bulmak için basit bir yol göstermek isterim. AutoCad komut satırından (vlax-dump-object (vlax-ename->vla-object (car (entsel)))) Lisp ifadesini girdiğimizde.

Resimde görüldüğü gibi AutoCAD Text ekranında bir liste elde ederiz. İhtiyacımız olan StartPoint ve Endpoint. Başlangıç ve Bitiş Noktalarımızı elde etmek için (vla-get-StartPoint VLA-Object) veya (vlax-get-property VLA-Pbject 'StartPoint) komutlarından birini kullanabiliriz. Yukarıda sözünü ettiğim istisna durumlardan biri burada karşımıza çıkıyor, hem vla- hem de vlax- komutlarıyla elde ettiğimiz değerin türü variant oluyor.
Başlangıç ve Bitiş Noktalarının koordinatlarını entmake ile kullanabilmek için önce (vlax-variant-value ...) ile safe array'e, elde ettiğimiz safearray'i de (vlax-safearray->list ...) ile nokta koordinat listesine çevirdik. Bu ve benzeri durumlarda Lisp ifademizin ürettiği değerin türü (data type) emin olamazsak, komut satırından (type (vla-get-StartPoint (vlax-ename->vla-object (car (entsel))))) ifadesiyle kontrol edebiliriz. Örneğimizde, ifadeyi girip bir arc nesnesi seçtiğimizde, variant elde ederiz.
Selam ve saygılarımla herkese kolaylıklar dilerim.

alumina (29.01.2022 12:46 GMT)

28.01.2022 06:30    

ehya
Değerli Hocam ellerinize, aklınıza, bilginize sağlık. Yine ve her zamanki gibi çok güzel bir yazı hazırlamışsınız.
Bu konu ile ilgili akılda soru işareti kalmayacağını umuyorum.

Şahsım adına bu değerli bilgiler için çok teşekkür ederim.

Copyright © 2004-2022 SQL: 1.627 saniye - Sorgu: 109 - Ortalama: 0.01493 saniye