11.06.2011 21:53    

pitsss
Iyi geceler arkadaşlar. autolisp ile uğraşmaya devam ediyorum. hazır kodlardan derlediğim bi lisp dosyam var ancak. itediğimi tam olarak yapamadım yardımcı olursanız sevinirim. sorunumşu; txt dosyasından verileri satır satır almak istiyorum ancak bunu yapamadım. yardımcı olursanız sevinirim. sadece ilk satırı alıyor diğer satırları almıyor maalesef. bu sorunu nasıl çözebilirim acaba . ya da bu kodlaardan daha kısa ve kullanışlı bi kod vaarmıdır. ( kodlamayı kendi mantığıma göre yaptım )
her boşluk için ayrım yapıyor. benim ef fazla boşluk sayım 6 ya da 7 olur. o yüzden cond fonksiyonunu kullandım. Sizce uygun mu?


Kod:

(defun c:dby ()
  (setq mtr 1)
  (setq ayraçsay 0)
  (setq dosyaadi (strcat (getvar "dwgprefix")))
  (setq da (getfiled "txt dosyası seçiniz" dosyaadi "txt" 0))
  (setq dosya (open da "r"))
  (while
    (setq satır (read-line dosya))
      (setq liste nil)
      (if (/= satır nil)
        (progn
          (while (< mtr (strlen satır))

   
            (setq ayraç (substr satır mtr 1))
            (if (= ayraç " ")
              (progn
(setq ayraçsay (+ 1 ayraçsay))



(cond
((= ayraçsay 1)
(setq ayraç1son (- mtr 1))
(setq x (substr satır 1 ayraç1son))
(setq ayraç1tut  mtr)
);ayraçsay1 end

((= ayraçsay 2)
(setq y (substr satır (+ 1 ayraç1tut) (- mtr ayraç1tut 1)))
(setq ayraç2tut mtr)
);ayraçsay2 end


((= ayraçsay 3)
(setq z (substr satır (+ 1 ayraç2tut) (- mtr ayraç2tut 1)))
(setq ayraç3tut  mtr)
);ayraçsay3 end


((= ayraçsay 4)
(setq a (substr satır (+ 1 ayraç3tut) (- mtr ayraç3tut 1)))
(setq ayraç4tut  mtr)
);ayraçsay3 end
); COND END
             )
           )
           (setq mtr (+ 1 mtr))
         )
                   )
         )
       )
  (close dosya)
)

12.06.2011 11:15    

ProhibiT
"hazır kodlardan derlenen lisp" ne demek? bunu anlamak mümkün değil. başka amaçlar için yazılmış kodlardan, birer parça alarak bir şey yazılmaz. bunu yapmaya zorlarsanız da, söğütte bir kavakta iki öten, ilgisiz alakasız bir şey ortaya çıkar. bundan önceki yorumumda yazdıklarımı okumadığınızı düşünüyorum. bir kere ne yapmak istediğinizi, her adımda nasıl yapılacağını tüm detaylarıyla analiz edip netleştirmeden işe başlamayın. hazır kodlar diye bahsettiğiniz yerlerden (ç)alıntı (aslında kimseye yar olmaz) yaparak başlamayın. fonksiyonun bütününü zihninizde oluşturup, tam bir algoritma oluşturun. bundan sonra başkalarının yazdığı kodlara bakın elbette. ama oradan asla aynen almayın, orada kullanılan mantığı ve tekniği kavramaya çalışın. aksi halde yukarıdaki örnekte olduğu gibi, biri biriyle ilgisiz bek çok satırdan oluşan, kimsenin içinden çıkamayacağı bir karmaşa yaratmış olursunuz.

daha önceki yorumumda da bahsetmiştim;
- değişken adlarında asla türkçe karakter kullanmayın, eninde sonunda ayağınıza dolanır.
- hiç bir yerde kullanılmayan anlamsız değişkenler tutmayın. kod ne kadar kalabalık olursa, kendi hatalarınızı bulmanız o kadar zorlaşır.
- özellikle sayaç değişkenlerini kullanırken nerede sıfırladığınıza, sınır değeri nerede kontrol ettiğinize dikkat edin.
- autolisp'te fonksiyonlar, sıra sayılarını farklı kullanırlar, öyle basic'te olduğu gibi "option base 1" diyemezsiniz. hangilerinin 1'den, hangilerinin 0'dan başladıklarına dikkat edin.
- illede bir yerlerden alıntı yapacaksanız, kullanılan komutu, parametrelerini ve çalışma mantığını anlamadan asla almayın.
- hiç bir programlama dilinde, "ya tuttururum, ya da yuttururum" diye bir şeyler yazılmaz.

Bütün bunları göz önüne aldığımızda, bahsedilen işlem, tamamen sizin mantığınızla yazılırsa;
Kod:

(defun c:dby (/ dsy mtr syrsy str ayr1 ayr2 ayr3)
  (setq dsy (open (getfiled "Dosya seçiniz" (getvar "dwgprefix") "txt" 0) "r"))
  (while (setq mtr 0 ayrsy 0 str (read-line dsy))
    (while (< (setq mtr (1+ mtr)) (strlen str))
      (if (= (setq ayr (substr str mtr 1)) " ") (progn
          (setq ayrsy (1+ ayrsy))
          (cond ((= ayrsy 1) (setq x (substr str 1 (1- mtr)) ayr1 (1+ mtr)))
                ((= ayrsy 2) (setq y (substr str ayr1 (- mtr ayr1)) ayr2 (1+ mtr)))
                ((= ayrsy 3) (setq z (substr str ayr2 (- mtr ayr2)) ayr3 (1+ mtr)))))))
    (setq a (substr str ayr3)))
  (close dsy) (princ)
)
Şeklinde çözülebilir. işin aslı bir dosyadan okunan, ve boşluklarla ayrılmış bölümleri, değişkenlere atama işi çok daha kısa, bir kaç satır yazılarak çözülebilir.

kolay gelsin.

ProhibiT (12.06.2011 11:34 GMT)

13.06.2011 19:07    

pitsss
Merhaba prohibit. eleştirilerini dikkatle okudum. ve bu eleştiriler doğrultusunda hareket etmeye karar verdim. her zaman amacım kodları özümsemek olmuştur. kopyala yapıştır pek işe yaramıyor. en azından yarasa bile, herhangi bir sorunda ne yapacağımızı bilemiyoruz. bu yüzden daha dikkatli olacağım.Amacım öğrenmek. öğrenme sürecinde sizlerden çok büyük destek alıyoruz. sonsuz teşekkürlerimi sunuyorum. hiçbir çıkarınız olmadığı halde oturup bize zaman ayırıp sorularımızı cevaplıyorsunuz. çok teşekkürler.
bu arada kodunuzu çalıştırdım. yavaş yavaş eklemeler yapıyorum. teşekkürler. :)

> 1 <
Copyright © 2004-2022 SQL: 0.732 saniye - Sorgu: 49 - Ortalama: 0.01494 saniye