23.04.2021 18:49    

Travaci
Kod:

(if (setq fl (getfiled "Select csv file" "" "csv" 1) )
  (setq fl (open fl "r"))

Bu şekilde mi ?

24.04.2021 07:46    

BLack|E
Alıntı
Travaci :


Hayır hocam ben klasörü seçeceğim klasörün içinde
örneğin 5 adet csv uzantılı dosyalar var
isimleri 2A1, 2A2, 2A3, 2A4, 2A5 olsun
klasör seçiminden sonra bu 5 dosyayı tek tek açtırıp lispin içinde işlem yaptıracağım.
normal açmaktan bahsetmiyorum yanlış anlaşılmasın. Dosyayı lispin içinde açtırıp bir veri alacağım geri kapatacağım
dosyaları tek tek seçmek yerine klasör seçerek bu işlemi tamamlamak istiyorum.
mantık olarak bakıldığında yüzlerce dosya olduğunu düşünürsek kullanıcının bunu tek tek seçmesi mantıklı değil.
umarım kendimi ifade edebilmişimdir Erkan hocam

Aşağıdaki kod ile D klasöründe MEK klasöründe yer alan GRM.TXT dosyasından içindeki istediğim verileri çekebiliyorum
fakat ismi farklı olan onlarca belki yüzlerce txt uzantılı dosyalarım var, ona nasıl bir kod yazacağımı bulamadım

Kod:

(setq bl (open "D:\\MEK\\GRM.txt" "r"))
(if bl
(progn
(setq BLTLIS (append (LIST (LIST "blt"))))
(setq A (read-line bl))
(setq A (read-line bl))

(while A
  (setq BOL1 (vl-string-right-trim " " (substr A 1 30)))
  (setq BOL2 (vl-string-right-trim " " (substr A 31 10)))
  (setq BOL3 (vl-string-right-trim " " (substr A 50 10)))
  (setq BOL4 (vl-string-right-trim " " (substr A 71 10)))
  (setq BOL5 (vl-string-right-trim " " (substr A 91 10)))
   (setq BLTLIS (append (list (list BOL1 BOL2 BOL3 BOL4 BOL5)) BLTLIS))
   (setq A (read-line bl))
  )
     )
  (alert "DOSYA D:\\MEK\\GRM.txt KONUMUNDA BULUNAMADI")
     )
  (setq BLTLIS (reverse BLTLIS))
(close bl)

BLack|E (24.04.2021 07:57 GMT)

24.04.2021 17:56    

Travaci
Kod:

(foreach x (vl-directory-files "c:/Lisplerim" "*.lsp" 1) (print x))

Bu şekilde listeye alıp listedekilere istediğin işlemleri yapabilirsin.

Kod:

(vl-directory-files "c:/MEK" "*.txt" 1)

27.04.2021 20:14    

BLack|E
Teşekkür ederim Travaci Hocam.
Beni şaşırtan şu oldu foreach 'ın sayac gibi davranıp listedekileri tek tek işlem yaptığını bilmiyordum.
Kod:

vl-directory-files
ise uzun zamandır aradığım bir özellikti.

03.05.2021 19:27    

sekaraman
Herkese Selamlar. Bir konuda yardıma ihtiyacım var.
Kanalizasyon lisp yaparken baslangıc ile bitis noktasına line ciziyorum. Hatta başlangıc noktasına daire atıyorum.
ama daire yerine Kare şeklinde blok attığım zaman açı otomatik olarak 0 geliyor. Bu rogar açısını kanal çizerken kanal açısına uygun olarak nasıl yerleştirebilirim?

(command "LAYER" "M" "BACA" "")
(command "insert" "BACA" uc1 1.0 1.0 "" )
(setq aci10 (angle UC1 uc2))
(setq pucilk (polar UC1 aci10 0.40))
(setq puc (polar uc2 aci10 -1.4625))

(command "LAYER" "M" "HATINCE" "")
(if (and (>= mesafe 0.50) (/= mesafe nil))
(command "LINE" ucilk uc "")
)

(command "LAYER" "M" "HAT" "")
(if (and (>= mesafe 0.50) (/= mesafe nil))
(command "LINE" pucilk puc "")
) ;kanallar çizildi

Şimdiden çok teşekkür ederim

16.12.2021 08:22    

BLack|E
Herkese merhaba;
daha önce AutoCAD ortamında çalışan lisp
iş yerinin program değişikliğine gidilmesi sebebiyle (BricsCAD) aşağıda belirteceğim
sıkıntı ile karşı karşıya kalmaktayım.
"Seçilen text ve mtext'leri seçilen çizginin açısına göre çeviren lisp"
Bu lisp artık (BricsCAD'te) text'lerde işlevini yitirmiştir.
Hangi kod satırı güncellememiz gerekecek yardımcı olursanız sevinirim.
Kod:

(defun rt_hata (s)
  (if (/= s "Function cancelled")
    (princ (strcat "
Error: " s))
  )
  (setq *error* olderr)               
(princ))
(defun rt_uygula ()
  (setq rt_sec_say (sslength rt_sec))
  (setq c 0)
  (while (> rt_sec_say c)
    (setq e_rt_sec (ssname rt_sec c))
    (setq ee_rt_sec (entget e_rt_sec))
    (setq ee_rt_sec (append ee_rt_sec (list (cons 50 secim_aci))))
    (entmod ee_rt_sec)
    (setq c (+ c 1))
    (setq rt_e t)
  )
)
(defun c:rty ()
(setq olderr *error*
      *error* rt_hata)
  (setq
    rt_sec (ssget
     '((-4 . "<OR") (0 . "TEXT,MTEXT) (-4 . "OR>"))
   )
  )
  (if (= rt_sec nil)
    (progn
      (princ)
    )
    (progn
      (setq rt_e nil)
      (setvar "errno" 0)
      (while (= rt_e nil)
(setq rt_ent (entsel "
Referans nesneyi seçiniz:"))
(if (= rt_ent nil)
  (progn
    (if (= (getvar "errno") 7)
      (progn
(setq rt_e nil)
(setvar "errno" 0)
      )
    )
    (if (= (getvar "errno") 52)
      (progn (setq rt_e t) (setvar "errno" 0))
    )
  )
  (progn
    (command "select" rt_sec "")
    (setq rt_ent_tan (cdr (assoc 0 (entget (car rt_ent)))))
    (if (and (/= rt_ent_tan "LINE")
     (/= rt_ent_tan "XLINE")
     (/= rt_ent_tan "RAY")
     (/= rt_ent_tan "TEXT")
(/= rt_ent_tan "MTEXT")
)
      (progn
(princ
  "
Bu komut seçtiginiz nesne türü için geçerli degildir..."
)
(setq rt_e t)
      )
    )
    (if (or (= rt_ent_tan "TEXT")(= rt_ent_tan "MTEXT"))
      (progn
(setq secim_aci (cdr (assoc 50 (entget (car rt_ent)))))
(rt_uygula)
      )
    )
    (if (or (= rt_ent_tan "LINE")
    (= rt_ent_tan "XLINE")
    (= rt_ent_tan "RAY")
)
      (progn
(setq secim_bas (cdr (assoc 10 (entget (car rt_ent))))
      secim_son (cdr (assoc 11 (entget (car rt_ent))))
)
(setq secim_aci (angle secim_bas secim_son))
(if (and (> secim_aci (angtof "0.0000"))
(< secim_aci (angtof "90.0000"))
    )
  (setq secim_aci secim_aci)
)
(if (and (> secim_aci (angtof "91.0000"))
(< secim_aci (angtof "180.0000"))
    )
  (setq secim_aci (+ secim_aci (angtof "180.0000")))
)
(if (and (> secim_aci (angtof "181.0000"))
(< secim_aci (angtof "270.0000"))
    )
  (setq secim_aci (+ secim_aci (angtof "180.0000")))
)
(if (and (> secim_aci (angtof "271.0000"))
(< secim_aci (angtof "360.0000"))
    )
  (setq secim_aci secim_aci)
)
(rt_uygula)
(setq rt_e t)
      )
    )
  )
)
      )
    )
  )
  (princ)
)
(princ)

18.12.2021 03:29    

ProhibiT
Visual Lisp Editor ile bakar bakmaz hata görünüyor.
'((-4 . "<OR") (0 . "TEXT,MTEXT) (-4 . "OR>")) satırında tırnak işareti açık (eksik) kalmış.
'((-4 . "<OR") (0 . "TEXT,MTEXT") (-4 . "OR>")) şeklinde düzeltilince çalışacaktır.

Bu basit hatayı bulunca bir şey dikkatimi çekti. Bu satırda OR (veya) demeye gerek yok ki! Veya şeklinde bir kıyaslama yapabilmek için birden çok parametre gerekir halbuki bizde bir tane "TEXT,MTEXT". Bu durumda ilgili satırımız,
'(0 . "TEXT,MTEXT) şeklinde yazılsa yerli olur, derken... başka şeyler dikkatimi çekti.
Kod:

(if (= rt_sec nil)
    (progn
      (princ)
    )
    (progn
      (setq rt_e nil)
      .
      .

şeklindeki ifadede soruyu sorarken olumsuz sorsak ta,
(if (= rt_sec nil) yerine (if (/= rt_sec nil) yazsak... hatta (if rt_sec yazarak ifademizi değiştirerek doğrudan hedefe yönelsek, rt_sec'in değerinin nil olması durumunu (progn (princ)) gibi boş, kukla satırlar yazmadan... benden ırak cehenneme direk diyerek baştan elsek daha doğru olmaz mı?.. İşin gerçeği, bu tarz çalışma mantığı hiç yabancı gelmedi bana.

Bu kadar konuya girince başka şeyler de dikkatimi çekti, algoritmada da bazı aksaklıklar var. Zaten kodlar taksit taksit konunun canını çıkarırken, birde oradan oraya (AutoCAD'den başka ortamlara) taşınan kodlar epeyce yorulmuşlar. Belli ki bunu ilk yazan değerli dostumuz da bu amaçla yazmamış, zaman içinde yamalı bohçaya dönmüş. Bu fonksiyon bu haliyle referans olarak XLINE nesnesi seçilince çalışmaz. LINE nesnelerinde (assoc 10 başlangıç noktası ve (assoc 11 bitim noktasıyken, XLINE nesnesinde (assoc 10 tanım noktası, (assoc 11 ise doğrultu vektörüdür... yani, bu yolla XLINE nesnesinin açısı bulunamaz.

Algoritmada bazı aksaklılar demiştim... hata (error) fonksiyonunun böyle kullanılması her an belirsiz durumların ortaya çıkmasına neden olabilir.

Bunca laf kalabalığının özeti, isterseniz en başta söylediğim tırnak işaretini ekleyerek aksaklığı giderip, nasılsa işimi görüyor, diyerek devam edebilirsiniz. İsterseniz de...
Kod:

(defun c:rty (/ *error* sec ref aci snes)
  (setq ocmd (getvar "cmdecho")) (setvar "cmdecho" 0) (command "_.undo" "group")
  (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))
  (princ "\nİşlenecek nesneleri seçiniz.")
  (while (not (setq sec (ssget (list (cons 0 "TEXT,MTEXT")))))
    (princ "\nSeçilen nesneler TEXT veya MTEXT olmalıdır."))
  (princ "\nReferans nesne (LINE, XLINE, TEXT, MTEXT veya RAY) seçiniz.")
  (while
    (not (setq ref (ssget ":s" (list (cons 0 "LINE,XLINE,TEXT,MTEXT,RAY")))))
    (princ "\nUygun Referans Nesne seçiniz.")) (setq ref (ssname ref 0))
  (if (or (= (cdr (assoc 0 (entget ref))) "TEXT")
          (= (cdr (assoc 0 (entget ref))) "MTEXT"))
    (setq aci (cdr (assoc 50 (entget ref))))
    (if (= (cdr (assoc 0 (entget ref))) "LINE")
      (setq aci (angle (cdr (assoc 10 (entget ref)))
                             (cdr (assoc 11 (entget ref)))))
      (setq aci (atan (/ (caddr (assoc 11 (entget ref)))
                               (cadr (assoc 11 (entget ref))))))))
  (if (and (> aci (/ pi 2)) (<= (* 1.5 pi)))
    (setq aci (+ pi aci)))
  (if (> aci (* 2 pi)) (setq aci (- aci pi))) (setq n -1)
  (while (setq snes (ssname sec (setq n (1+ n))))
    (setq snes (subst (cons 50 aci) (assoc 50 (entget snes))
                          (entget snes))
          snes (cdr (assoc -1 (entmod snes)))))
  (if (= (logand (getvar "undoctl") 8) 8) (command-s "_.undo" "e"))
  (if ocmd (setvar "cmdecho" ocmd)) (prin1))

fonksiyonunu kullanabilirsiniz. "Hah tamam bu da işimi görüyor" da diyebilirsiniz. Ama işin aslını faslını biraz merak eden (merak etmesi gereken) arkadaşlarımız, kös dinlemeyip, anlatılanlara biraz kulak assalar fena olmaz doğrusu.

Bazı paylaşımlarımda açık kaynak kod vermediğim için bana sitem eden, kırgınlıklarını ifade eden arkadaşlarımıza bir kere daha hatırlatmak isterim ki, işte açık kod... işin bu kısmını çözüp hazmetmemiş arkadaşlarımıza daha karmaşık konularda açık kod vermenin bir sanat değeri olmadığına inanıyorum hala.

Herkese kolaylıklar dilerim.

20.12.2021 07:52    

BLack|E
Teşekkür ederim hocam verdiğiniz bu güzel bilgiler için... Saygılar.

06.06.2022 05:37    

LEYLO
İyi günler,
Rusça panel isimlerini Export Attribute information komutu ile excele veri aktardığımda "u/0429" gibi unicode karşılıkları yazılıyor. Tüm kod karşılıklarını rusça karaktere çeviren autolisp var mı?

14.06.2022 14:16    

kasim78
Exception occurred: 0xC0000005 (Access Violation) hatası alıyorum. Lisp yazılım ile çalışan programım çalışmaz oldu...Programı kaldırıp kurdum, hatta Autocad'i kaldırıp kurdum, faydalı olmadı. Autocadv 2022 kullanıyorum... Versiyondan kaynaklanıyo olabilir mi?? Bu konuda yardımcı olabilir misiniz? Şimdiden çok teşekkürler

kasim78 (16.06.2022 11:18 GMT)

14.06.2022 16:36    

mttlp
Alıntı
kasim78 :
Exception occurred: 0xC0000005 (Access Violation) hatası alıyorum. Lisp yazılım ile çalışan programım çalışmaz oldu...Programı kaldırıp kurdum, hatta Autocad'i kaldırıp kurdum, faydalı olmadı. Autocadv 2022 kullanıyorum... Versiyondan kaynaklanıyo olabilir mi?? Bu konuda yardımcı olabilir misiniz? Şimdiden çok teşekkürler



Merhaba yapmış olduğum çeviri programı mevcuttur autocadde
Kullanabilirsiniz istediğiniz dile çevirme seçeneği mevcuttur
mty@mtycad.com

14.06.2022 16:37    

mttlp
Alıntı
kasim78 :
Exception occurred: 0xC0000005 (Access Violation) hatası alıyorum. Lisp yazılım ile çalışan programım çalışmaz oldu...Programı kaldırıp kurdum, hatta Autocad'i kaldırıp kurdum, faydalı olmadı. Autocadv 2022 kullanıyorum... Versiyondan kaynaklanıyo olabilir mi?? Bu konuda yardımcı olabilir misiniz? Şimdiden çok teşekkürler



Excelde acces için versiyonu kontrol ediniz
mty@mtycad.com

05.07.2022 08:16    

thrcr
Arkadaşlar, Autocad için alan lispi lazım. Sitede ve internette arattığımda genellikle tüm alanları topluyor. Ben bunu çıkartmalı olarak yani profil çiziminde et kalınlıklarına göre alan istiyorum. Autocad kendi içerisinde var ama uğraştırıyor. Daha pratik olması açısından. Yazabilecek olan varsa yardımcı olabilir mi?
Şimdiden herkese teşekkür ederim.

17.05.2024 10:02    

asamet
Merhaba, öncelikle bu işte çok amatörüm yanlış ilerlediğim kısmı düzeltin lütfen.
Yaptırmak istediğim bloklardaki ATT lere tıkladığımda sırasıyla L1 L2 ve L3 yazması. Bunu daha önce text olarak yazan olmuştu ama benim amacım bloktaki ATT ye tıkladığımda metnin değişmesi:

(defun C:FF ()
;; Kullanıcıdan başlangıç faz numarasını alıyoruz
(setq start-faz (getint "\nBaşlangıç faz numarasını girin (1, 2 veya 3): "))

;; Geçerli bir başlangıç faz numarası olup olmadığını kontrol ediyoruz
(if (not (member start-faz '(1 2 3)))
;; Geçersiz ise, kullanıcıya mesaj gösteriyoruz
(prompt "\nGeçersiz başlangıç faz numarası. Lütfen 1, 2 veya 3 girin.")

;; Geçerli ise, işlemleri gerçekleştiriyoruz
(progn
;; Faz numaraları listesini oluşturuyoruz
(setq faz-list '("L1" "L2" "L3"))
;; Başlangıç faz numarasına göre faz indeksini ayarlıyoruz
(setq faz-index (- start-faz 1))

;; Kullanıcı attribute nesnesi seçene kadar döngüye giriyoruz
(while (setq sel (car (entsel "\nFaz numarasını değiştirmek istediğiniz attribute'ı seçin: ")))
;; Seçilen nesneyi alıyoruz
(setq ent (car (nentselp (cdr sel))))
;; Seçilen nesnenin verilerini alıyoruz
(setq ent-data (entget ent))

;; Seçilen nesnenin attribute olup olmadığını kontrol ediyoruz
(if (eq (cdr (assoc 0 ent-data)) "ATTRIB")
;; Attribute ise, faz indeksini artırıyoruz ve yeni faz değerini ayarlıyoruz
(progn
(setq faz-index (% (+ faz-index 1) 3))
(setq new-value (nth faz-index faz-list))
;; Attribute verilerini güncelliyoruz
(setq ent-data (subst (cons 1 new-value) (assoc 1 ent-data) ent-data))
(entmod ent-data)
(entupd ent)
)
;; Seçilen nesne attribute değilse, kullanıcıya mesaj gösteriyoruz
(prompt "\nSeçilen nesne bir attribute değil.")
)
)
)
)
;; Çıkış
(princ)
)

17.05.2024 11:31    

Travaci
Alıntı
asamet :

Açıkçası kodlara bakarak ne yapmak istediğinizi tam anlayamadım. Daha detaylı bir şekilde anlatır mısınız ?
L1 seçildiğinde sırasıyla tıklanan attrib lere L1 L2 ve L3
L2 seçildiğinde sırasıyla L2 ve L3 mü yazmak istiyorsunuz.

21.05.2024 14:41    

asamet
407838-drawing1.dwg

Daha iyi anlatabilmek için örnek proje attım.

22.05.2024 06:15    

Travaci
Alıntı
asamet :


;; faz numaraları için liste oluşturun.
(setq ls '("L1" "L2" "L3"))

;; initget kullanarak seçimi sınırlandırın böylelikle kontrole gerek kalmaz.
(initget "1 2 3")
(setq pn (getkword "\nPhase number: [1/2/3]:"))

;; Seçilen sayının 1 eksiği listenin karşılığı olucaktır.
(setq pn (atoi pn))
(setq ln (nth (- pn 1) ls))

;; seçim ve işlemleri yaptırın.
;; her işlemden sonra liste numarasını döngüye sokun.
(setq pn (1+ pn))

;; listenin dışına çıkmamak ve listenin başına dönmek için kontrolcü ekleyelim.
(if (= pn 3) (setq pn 0))

Yapılan hata başlangıcı burası
(cdr sel)

Seçim yapmayı bu şekilde başlatırsak direk nesneyi seçer alt seçimlere gitmekle uğraşmayız.
(setq ss (nentsel "\nSelect attribute:"))

Bu şekilde kodlarınızı düzenleyin tekrar bakalım ve tavsiyem başlangıç seviyesi için önce ana kısmını tamamlayın, daha sonra kullanıcı mesajlarını ekleyin.

Travaci (22.05.2024 06:46 GMT)

22.05.2024 07:05    

asamet
Anladım çok teşekkürler. Amatör ilerliyorum şuan. Bir şeyler çıkarmayı deniyorum; örnek yazılımlardan ve kitaptan takip ettiğim kadarıyla yorumluyorum. Fakat basit şeyler hariç çalıştıramıyorum yazdığım lispleri. Sizin yaptığınız yorumlara göre şu şekilde düzenledim yine çalışmadı. Kontrolünüz için iletiyorum:

(defun C:FZ ()
;; Faz numaraları için liste oluşturuyoruz.
(setq faz-list '("L1" "L2" "L3"))

;; initget kullanarak seçimi sınırlandırdık.
(initget "1 2 3")
(setq start-faz (atoi (getkword "\nBaşlangıç faz numarasını girin (1, 2 veya 3):")))

;; Seçilen sayının 1 eksiği listenin karşılığı olacaktır.
(setq faz-index (- start-faz 1))

;; Kullanıcı attribute nesnesi seçene kadar döngüye giriyoruz.
(while (setq sel (nentsel "\nFaz numarasını değiştirmek istediğiniz attribute'ı seçin: "))
;; Seçilen nesneyi alıyoruz
(setq ent (car sel))
;; Seçilen nesnenin verilerini alıyoruz
(setq ent-data (entget ent))

;; Seçilen nesnenin attribute olup olmadığını kontrol ediyoruz.
(if (eq (cdr (assoc 0 ent-data)) "ATTRIB")
;; Attribute ise, faz indeksini artırıyoruz ve yeni faz değerini ayarlıyoruz.
(progn
(setq faz-index (% (+ faz-index 1) 3))
(setq new-value (nth faz-index faz-list))
;; Attribute verilerini güncelliyoruz
(setq ent-data (subst (cons 1 new-value) (assoc 1 ent-data) ent-data))
(entmod ent-data)
(entupd ent)
)
;; Seçilen nesne attribute değilse, kullanıcıya mesaj gösteriyoruz.
(prompt "\nSeçilen nesne bir attribute değil.")
)
)
;; Çıkış
(princ)
)

22.05.2024 07:17    

Travaci
Kod:

(% (+ faz-index 1) 3)


Nedir bu işlem ?

22.05.2024 09:56    

asamet
Mantığı şu şekilde kurmaya çalıştım. (+ faz-index 1) kısmında, mevcut faz indeksine 1 eklemesi içindi. (% ... 3) kısmında ise önceki toplamın 3'e göre modunu almasını ve kalanı vermesini hedefledim. Döngüsel artış için. Mesela 3 ise değeri % 3 = 0 olduğu için döngü başa dönecek, yani 0 değerini alırız diye düşündüm.

Önceki Sayfa [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [15] [20] [25] [30] [35] [40] > 42 < [43] Sonraki Sayfa
Copyright © 2004-2022 SQL: 1.724 saniye - Sorgu: 101 - Ortalama: 0.01707 saniye