05.11.2010 11:45    

Harbi65
Komutu girip çalışan lispin dosya yada klasör yolunu nasıl bulabiliriz?

05.11.2010 13:01    

bud_0782
sanırım aklınıza gelmiştir ama bilgisayarda aratmak işe yaramaz mı?

05.11.2010 13:21    

Harbi65
Alıntı
bud_0782 :
sanırım aklınıza gelmiştir ama bilgisayarda aratmak işe yaramaz mı?



Lisp içinde kullanacağım. Kendisi bulması lazım...

18.11.2010 21:32    

yazgunesi
Harbi65 , aşağıdaki kodlama örneklerini incelemeni öneriyorum..

Kod:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Harbi65

;; Komutu girip çalışan lispin dosya yada klasör yolunu nasıl bulabiliriz?
;; Lisp içinde kullanacağım.
;; Kendisi (dosya yolunu // çalışma dizinini ) bulması lazım...
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;; Dosya arama fonksiyonu için örnekler :


; Örnek kod no 1:
(findfile "3darray.lsp")
; Sonuç : "C:\\Program Files\\AutoCAD 2007\\support\\3darray.lsp"

; Yukarıdaki örnekte Autocad aranan dosyanın
; kendi çalışma dizini altında dosyayı arayıp bize
; çalışma dizinini belirtiyor..

; Autocad'in çalışma dizini genellikle support klasörüdür.
; Support klasörü dışında kullanıcı ayrı bir çalışma dizini
; tanımlayarak, oluşturduğu program dosyalarını buraya koyabilir.
; Bu durumda yeni örneğimize göz atalım :



; Örnek kod no 2:
(findfile "dosyabul.lsp")
; Sonuç : "C:\\Lispbase\\dosyabul.lsp"

; Yukarıdaki örnekte Autocad aranan dosyayı
; bulup çalışma dizinini görüntülüyor.
; Burada en önemli nokta çalışma dizinin
; C:\Lispbase\  şeklinde olup,
; aranan dosyanın dosyabul.lsp olmasıdır..



; Örnek kod no 3:
(findfile "C:\\Lispbase\\dosyabul.lsp")
; Sonuç  "C:\\Lispbase\\dosyabul.lsp"

; Yukarıdaki örnekte 'dosya yolu'
; kodlama ile tam olarak belirtilmiştir..



; Örnek kod no 4:
(findfile "dialog.dcl")
; Sonuç : "C:\\Lispbase\\dialog.dcl"

; Yukarıdaki örnekte Autocad DCL uzantılı dosyayı
; bulup çalışma dizinini görüntülüyor..
; Bu örnek farklı bir dosya uzantısını arayıp buldu.



; Örnek kod no 5:
(findfile "dosyabul2.lsp")
; sonuç :  nil

; Yukarıdaki örnekte Autocad dosya aradı
; fakat böyle bir dosya olmadığı için
; bize sonucu nil olarak belirtti..



; Şimdi aradığımız dosyayı bir değişkene kaydedelim :


; Örnek kod no 6:
(setq aranandosya (findfile "dosyabul.lsp") )
; Sonuç : "C:\\Lispbase\\dosyabul.lsp"

; Bulunan sonuç yine aynı,
; sadece bir değişkene
; çalışma dizinini atadık..


; Örnek kod no 7:

(setq dosyayolu "C:\\Lispbase\\dosyabul.lsp") ; çalışma dizini tanımlandı
(setq aranandosya (findfile "dosyabul.lsp") ) ; hedef dosya aratıldı


(if (= dosyayolu aranandosya )
   (progn
     (princ "\n Dosya çalışma dizininde değişiklik yoktur !!!")
     (princ)
    )
  )


; Yukarıdaki örnekte ilk önce değişkenlerimizi tanımladık.
; Ardından kontrol mekanizması oluşturuldu..
; Sonuç : Eğer tanımlanan dosya yolu eşit ise aranan dosya'ya
; ilgili uyarı mesajını görüntüle.



; Örnek kod no 8:

(setq dosyayolu "C:\\Lispbase\\dosyabul.lsp") ; çalışma dizini tanımlandı
(setq aranandosya (findfile "dosyabul.lsp") ) ; hedef dosya aratıldı


(if (/= dosyayolu aranandosya )
   (progn
     (princ "\n Dosya çalışma dizininde değişiklik mevcuttur !!!")
     (princ)
    )
  )


; Yukarıdaki örnekte ilk önce değişkenlerimizi tanımladık.
; Ardından kontrol mekanizması oluşturuldu..
; Sonuç : Eğer tanımlanan dosya yolu 
; farklı ise aranan dosya'ya göre     
; ilgili olumsuz uyarı mesajını görüntüle.

; Yukarıdaki verilen örnekte aranan dosyamız
; eğer silindiyse yada yer değiştirdiyse
; kullanıcıya bilgi mesajı verecektir.



; Bu kadar kod örneğinden sonra örnek bir program yazalım :


; A) dsyctr.lsp    >> Çalıştırılan dosya kontrol programı 
; B) cizgiciz.lsp  >> Örnek bir autolisp programı   

; Eğer cizgiciz.lsp dosyamız yer değiştirse yada ismi değişirse
; (ilgili çalışma dizininde yok ise eğer)
; ekranda uyarı mesajı görünecektir..

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defun dsyctr (/ dosyayolu aranandosya) 

(setq dosyayolu "C:\\Lispbase\\cizgiciz.lsp") ; çalışma dizini tanımlandı
(setq aranandosya (findfile "cizgiciz.lsp") ) ; hedef dosya aratıldı

 
(if (/= dosyayolu aranandosya )
   (progn
     (princ "\n Dosya çalışma dizininde değişiklik mevcuttur !!!")
     (exit)
     (princ)
    )
  )

 
(if (= dosyayolu aranandosya )
   (progn
   (princ)
    )
  )
 
(princ)
)

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


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


(defun c:cizgiciz (/ yr1 yr2)
 
(dsyctr) ; İlk önce kontrol programını çalıştıralım.
 
(setq osm (getvar "osmode"))
(setvar "osmode" 0 )

(setq yr1 (getpoint "\n Çizgi başlıngıç noktası için Tıkla ?! : "))
(setq yr2 (getpoint "\n Çizgi bitiş noktası için Tıkla ?! : "))

(command  "line"  yr1 yr2 "")

 
(setvar "osmode" osm )
(princ)
)

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


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;  ************* Önemli bir bilgi **********************


;; Eğer harici bir program çalıştırırsanız  (dsyctr) kodlaması ile ,
;; Programınızın ilk satırı (defun dsyctr ()  şeklinde olması gerekiyor.


;; Eğer harici bir program çalıştırırsanız  (c:dsyctr) kodlaması ile ,
;; Programınızın ilk satırı (defun c:dsyctr () şeklinde olması gerekiyor.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


Yapılan kodlama örneği ile ilgili hazır dosya download linki :

3562-findfile_örnegi.rar ( 3 adet Autolisp dosyası)

yazgunesi (18.11.2010 21:41 GMT)

18.11.2010 21:52    

Harbi65
yazgunesi;

Sanırım beni yanlış anladın. Sorumu tekrar açıklıyayım.
Bir lispi Load yapıp komutu girip çalıştırdık. Bu çalıştırdığımız lispin dosya veya klasör yolunu çalıştırdığımız lisp kodu içinde bulması lazım.. Yani kendi yolunu bulacak...
findfile komutu ile Support file Search Path de tanımlanmış klasörlerde buluyor... Biz lispimizi örneğin D:\ de herhangi bir klasörden load ettikse nasıl bulacağız?
Bunu denedin mi bu kodlarla...?

18.11.2010 22:09    

yazgunesi
Ne demek istediğini anladım sayın arkadaşım.Bu konu hakkında hazır bir iki örnek vereyim dedim kodlama için yardımcı olmak maksadıyla.. İsteğin dorultusunda yeni örnekler (hazır çalışan örnek program) buraya eklerim en kısa zamanda.

Aslında findfile kullanmak dışında, Support file Search Path olarak bildiğimiz çalışma dizini manuel olarak değil de Autolisp kodlaması ile tanımlayabiliriz.Verdiğim örneklerin bir benzerlerini birçok lispimde kullanıyorum hatta dosyaya bilgi kayddedip okutuyorum sonra kontrol işlemi yaptırıp çalıştırılan programlara karar verme yetkisi veriyorum ne yapması gerektiğine dair... :D

Bu konuda biraz çalışayım, elimden geldiğince yardımcı olurum. uur8)

Google'den bir örnek buldum :



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



(Aşağıdaki kodlama sayfa no 5'te )

Kod:

(setq lisp_path “X:\\AUTOLISP\\”) ; sets the path
(if (findfile (strcat lisp_path "utils1.lsp"))
(load (strcat lisp_path "utils1.lsp"))
)
(if (findfile (strcat lisp_path "utils2.lsp"))
(load (strcat lisp_path "utils2.lsp"))
)

yazgunesi (18.11.2010 22:22 GMT)

18.11.2010 23:08    

ProhibiT
Merhaba :)

Harbi65 hocam sorunuzu doğru anladığımı sanıyorum, damdan düşeni bir başka damdan düşen anlarmış. Virüslerle boğuşurken tüm sistemin taranması için kullandığım yöntemden bahsetmek isterim. Biraz uzun ve dolambaçlı gibi görünebilir ama kesin ve net çözüm...

Bu tür işlemlerde, Shell ile çıkıp, DOS komutlarıyla aramayı yaptırıyorum.
(Command "_.Shell") ile Dos ortamında elde edilen bilginin AutoLisp'e doğrudan aktarımı sağlanmıyor. Ben de bunun için Dos komutlarının sonuçlarını bir dosyaya yazdırıp, AutoLisp içinden o dosyayı okutuyorum :)

Eğer yüklenen dosya adını biliyorsak;
Öncelikle sistemimizde mevcut sürücüleri bulup listelememiz gerekiyor. Bunun için;
DOS 2.0'dan beri A: ve B: daima Floppy Drives (disket sürücüler) için kullanılıyor.
İlk sabit disk C: olarak isimlendiriliyor. C'nin ascii kodu 67'dir...
Kod:

(setq DrvLst "" src 66)
  (while (vl-directory-files (setq Surucu (strcat (chr (setq Src (1+ Src))) ":\\")) nil -1)
      (setq DrvLsT (strcat DrvLsT Surucu "BilinenDosyaAdi.Lsp" ))
  )

C'den başlayarak artan bir düzen içinde Sürücü adlarında Directory Listeliyorum, bu işlem nil döndüğünde sabir sürücüler tükendi demektir.
Bu yöntemle, sistemdeki Flash Disk'ler ve CD Rom'lar da dahil (Hatta Network üzerinde Sürücü olarak assign edilmiş bölümler de dahil) Bütün sürücüleri listelemiş oluyoruz.
Böyle bir while loop, "c:\\BilinenDosyaAdi.Lsp d:\\BilinenDosyaAdi.Lsp e:\\BilinenDosyaAdi.Lsp f:\\BilinenDosyaAdi.Lsp" şeklinde bir liste oluşturuyor.

Bu noktada Dos'un DIR komutunun bir detayına dikkat çekmek istiyorum.
Bu komutun genel formatı: DIR [Driver:][Path][File Name] (Türkçe işletim sisteminde DIR [Sürücü:][Yol][DosyaAdı])
Hiç bir yerde yazılı olarak bulamayacağınızı sandığım bir özellik var (ben dinazorlar devrinden kaldığım için biliyorum :))
Bu genel formatta [Driver:][Path][File Name] gurubunu aralarında birer boşluk bırakarak istediğiniz kadar tekrarlayabilirsiniz.
DIR c:\*.lsp d:\*.lsp e:\*.lsp komutu geçerlidir ve C, D ve E sürücülerindeki *.lsp dosyalarını listeler.

Gene Dır komutunda kullanılan 2 switch'ten bahsetmek istiyorum
/S : Alt Klsörlerdeki (Sub Directories) dosyalar listelenir.
/B Dır komutu ile dosyaları listelerken, yalnızca Sürücü, Yol ve dosya adını yazar. Diğer dosya bilgilerini yazmaz...

Sonuç olarak DIR komutumuzu;
"Dır c:\\BilinenDosyaAdi.Lsp d:\\BilinenDosyaAdi.Lsp e:\\BilinenDosyaAdi.Lsp f:\\BilinenDosyaAdi.Lsp /s /b"
şeklinde kullanarak sistemimizdeki sürücü ve yollarda aradığımız dosyayı bulup listeleyebiliyoruz.

Gene DOS'un en eski versiyonlarından beri var olan bir özellik kullanmamız gerekiyor; Piping and Redirection. Yani kavram olarak Dos komut ve programlarına girişlerin ve çıkışların yönlendirilmesi diyebiliriz.
DIR c:\*.lsp /s /b > c:\Liste.txt şeklinde bir komut uygularsak, Dir komutunun çıkışlarını yönlendirip Liste.txt adlı dosyaya yazdırmış oluruz.

Yukarında verdiğim AutoLisp kodunun devamında
Kod:

(command "_.shell" (strcat "dir " DrvLsT " /s /b " > c:\\DosyaListesi.txt")))
şeklinde bir kod ile, adını bildiğimiz AutoLisp dosyasını bütün sistemde aratmış ve sonuçlarını C:\DosyaListesi.txt dosyasına yazdırmış oluruz. Bu dosyanın AutoLisp içinden açılıp listenin okunması da basit bir işlem sonuçta :)

Yüklenen dosya adını bilmiyorsak, yalnızca kullandığımız komut adı belli ise;
(defun c:MyFunction şeklinde fonksiyon adını biliyoruz demektir. Bu durumda da gene yukarıda açıklamaya çalıştığım mantık geçerli. Ama DIR DOS komutu yerine FIND veya FINDSTR DOS komutlarını kullanarak dosyaların içinde bildiğimiz text gurubunu aratmamız gerekiyor.

Kolay gelsin...

ProhibiT (19.11.2010 08:23 GMT)

18.11.2010 23:37    

Harbi65
ProhibiT hocam; öncelikle 20 sene evveline götürüp nostalji yaşattığınız için teşekkür ederim. Computer'le tanıştığım günleri ve DOS işletim sisteminde ACAD yazarak Autocad10 kullandığım günleri hatırladım. Bu vesileyle unuttuğumuz DOS komutlarını tekrar etmiş gibi oldum. Teşekkür ederim.:)

Evet biraz karmaşık görünmekle birlikte bu mantıkla bunu bulabiliriz.. Bahsettiğiniz virüs lispi gibi bir kodlama için bu kadar uğraşa değer elbette ve gerekli de. Ancak basit bir lisp için o kadar işlemi yaptırmak gereksiz geldi... Tabi illa böyle bişeye ihtiyaç varsa elbette değer uğraşmaya... Ve gösteridiğiniz yöntem için de teşekkür ederim..

Sorum açısından basit olabileceğini düşündüğüm bir yöntem olmalı diye düşünüyorum. Ve bu bilgiler de biyerde saklanıyor... Load Application penceresinde yüklü olan lispleri ve yollarını gösteriyor. Dolayısıyla bunlar biyerde kayıtlı. Burda ki listeye ulaşabilirsek benim istediğim daha kolay ve pratik çözülecek ancak burda ki verilere nasıl ulaşırız onu bulamadım...:con

24.11.2010 12:10    

yazgunesi
Autocad birçok program gibi ilgili bilgileri kaydeder, gerektiğinde kontrol ederek gerekli işlemleri yapar... Bu bilgiler program tarafından dosyaya da kaydedilebilir yada regedit'te bulunur.

Harbi65 arkadaşımızın isteği için regedit'i okuyup ihtiyaç olan bilgileri görüntüleyeceğiz. Bu arada belirtmek isterim ki regedit bilgisayarımız için oldukça hassas bir konudur ! Kazayla yanlış bilgi silerseniz hiç te iyi olmaz..

Bu sebepten dolayı sadece regedit'te bulunan Autocad ile ilgili bazı bilgileri görüntüleyeceğiz.

İlk önce Autocad içinde bir ayar yapmamız gerekecek :

Konu dosya yükleme olduğuna göre ; appload komutunu çalıştırarak ekranda gözüken dialogta Add to History seçeneğini ektif edelim.Bu dosya yükleme (load yaptığımız) dialogunda History list tabında load yaptığımız tüm dosyaları liste halinde alt alta göreceğiz.

Aşağıda kodları gözüken programı test edebilmek için bilgisayrımızdaki 4 adet Autolisp programını
farklı dizinlerden load yapalım.. Bu arada listede gözüken bu program dosyaları (load yaptığımız) Autocad açıp kapanınca listede kalır fakat tekrardan çalışmaz..





Kod:

(defun c:historyoku (/ regpath re-version version profile-name reg_path_new dosyano1
               dosyano2 dosyano3 dosyano4 myfile1 myfile2 myfile3 myfile4 )

; ilk önce regedit'te bulunan bilgiyi tanımlayalım..

(setq regpath "HKEY_CURRENT_USER\\Software\\Autodesk\\AutoCAD")
; "HKEY_CURRENT_USER\\Software\\Autodesk\\AutoCAD"
 
(setq re-version (vl-registry-read regpath "CurVer")) ; "R versiyon numarası"
 
(setq version (vl-registry-read (setq regpath (strcat regpath "" re-version)) "CurVer")) ; "Autocad versiyonu"
 
(setq profile-name (vl-registry-read (setq regpath (strcat regpath "" version "\\Profiles")))) ; "<<Unnamed Profile>> Autocad'te kullanılan aktif profil ismi"
 
(setq reg_path_new (strcat regpath "" profile-name "\\Dialogs\\Appload\\History"))
; "HKEY_CURRENT_USER\\Software\\Autodesk\\AutoCAD\\Rxx.x\\ACAD-xxxxxxx
; \\Profiles\\<<Unnamed Profile>>\\Dialogs\\Appload\\History"
 
(setq dosyano1 1
       dosyano2 2
       dosyano3 3
       dosyano4 4 )
 
(setq myfile1 (vl-registry-read reg_path_new (strcat (itoa dosyano1) "History")))
; "C:\\koni_acılımı.lsp"   
(setq myfile2 (vl-registry-read reg_path_new (strcat (itoa dosyano2) "History")))
; "D:\\civata.lsp"   
(setq myfile3 (vl-registry-read reg_path_new (strcat (itoa dosyano3) "History")))
; "E:\\pafta2010.lsp"   
(setq myfile4 (vl-registry-read reg_path_new (strcat (itoa dosyano4) "History")))
; "C:\\Lispbase\\dirsek.fas"

(textscr)
(princ (strcat "\n" myfile1)) ; 1. dosya // Dosyaların çalışma dizinlerini
(princ (strcat "\n" myfile2)) ; 2. dosya // alt alta liste şeklinde
(princ (strcat "\n" myfile3)) ; 3. dosya // ekranda gösterelim..
(princ (strcat "\n" myfile4)) ; 4. dosya //
 
(princ)
)

(Princ "\n Lisp'in komutu >> historyoku << yazınız!")



Harbi65
, bu örnekten sonra sanırım yapman gereken program içinde bir döngü, liste oluşturup, bu listeye en son load edilen program değişkenini yüklemek ve bu liste içinden en son eklenen elemanı çekmektir... Çünkü her load yaptığında history ye yeni bilgi eklenecektir..

yazgunesi (24.11.2010 12:20 GMT)

24.11.2010 12:50    

Harbi65
Yazgunesi teşekkür ederim.
Load ettiğimiz lispleri nerde kaydediyor diye arayıp durdum. Regedite kaydedeceğine ihtimal vermemiştim.. Bunu öğrenmek çok iyi oldu...
Ancak senin kurduğun mantık da anlamadığım neden History e kaydederek çekiyorsun? Aynı yerde Startup altında load edilen dosyaların tamamını kaydediyor. Burdaki dosyaları çeksek Historyi aktif etmeye de gerek kalmaz diye düşünüyorum...

Her nasıl olursa olsun bu kayıt yerini sayende bulduk ya sorun yok.. :)
Tekrar çok teşekkür ederim...

26.11.2010 09:39    

yazgunesi
Konu load yapmakla ilgili olduğu için Startup Suite ile ilgilenmedim..

Çünkü Startup Suite dosya load yapmak değildir, Autocad açıldığında otomatikman load edilecek dosyalar demektir.. Bir taraftan da haklısın bu history tabındaki listeye de ekleme yapıyor startup suite. Ne var ki startup suite'ye dosya eklersek eğer Autolisp programı çalıştırabilmemiz için ya Autocad'i kapatıp yeniden açacağız yada dosyayı load yapacağız. Bence history tabındaki listeden bilgi almak daha mantıklı.. Load yaparsak dosya listesi History List tabında listelenir , Startup Suite'ye dosya eklersek hem Startup Suite listesinde hem de History List babındaki listede de dosya isimleri listelenir..

Eğer Startup Suite de bulunan dosyaların dizin bilgisi almak istiyorum dersen yukarıda kodları verilen autolisp programda History yazan tüm yerlere Startup yazıver.

yazgunesi (26.11.2010 09:54 GMT)

> 1 <
Copyright © 2004-2022 SQL: 1.004 saniye - Sorgu: 73 - Ortalama: 0.01376 saniye