04.02.2011 12:35    

TR-hathor
Iyi günler. . sitedede aradım ama bulamadım. seçtiğimiz birden çok textin içinde sadece sayıları bulup. bunlardan küsüratlıları (23233. 7) ayırıp sadece tam sayıları (23233) seçip otomatik sonuna . 0 ekleyen lisp varmı? (23233. 0)

04.02.2011 13:27    

ehya
Yazılardan kastınız nedir?
bu yazıların içinde kaç tane yazı var?
farklı olma durumları varmı?

bu tür lispler özel lisplerdir. genele hitap etmediği için özel yazılır. . . !!!

08.02.2011 07:15    

TR-hathor
Yazılardan kastım. . bi çizmdeki metraj tablosundaki rakamlar. . . küsüratlı olanlar zaten otomatik 23233. 7 olarak çıkıyor. fakat tam sayılar için 23233 sonlarına . 0 eklenebilir mi? 23233. 0 şeklinde textleri seçtigim zaman tam sayıların sonuna . 0 eklemek isitiyordum. yardımcı olursanız sevinirim.

08.02.2011 07:30    

ehya
Komut adı yzd

Kod:

(defun c:yzd ()
  (setq dmz (getvar "dimzin"))
  (setq ss (ssget (list (cons 0 "text"))))
  (if (= ss nil)
    (progn
      )
    (progn
      (setq c 0)
      (setq ss-s (sslength ss))
      (setvar "dimzin" 0)
      (while (< c ss-s)
(setq ss-tek (ssname ss c)
      icerik (cdr (assoc 1 (entget ss-tek)))
      data (entget ss-tek))
(setq data (subst (cons 1 (rtos (atoi icerik) 2 1)) (assoc 1 data)data))
(entmod data)
(setq c (+ c 1)))))
        (setvar "dimzin" dmz)
        (princ))

08.02.2011 15:17    

ProhibiT
Bu soruyu okuduğumda, istenen işi yapacak fonksiyon karmaşık ve uzun diye cevap yazmaktan vazgeçmiştim. ehya hocam gerçekten çözüm mantığınız çok hoşuma gitti, dimzin hiç aklıma gelmemişti. fonksiyon çok hoşuma gittiği için biraz kurcaladım. bu fonksiyonla text'lerle birlikte mtext objelerini de aynı şekilde işleyebilir diye düşündüm :) bu fikir uçuşması arasında sizin fonksiyonunuz;
Kod:

(defun c:yzd ()
  (setq dmz (getvar "dimzin"))
  (if (not (setq ss (ssget (list (cons 0 "*text"))))) (exit))
  (setq c -1 ss-s (sslength ss))
  (setvar "dimzin" 0)
  (while (< (setq c (1+ c)) ss-s)
    (setq ss-tek (ssname ss c) data (entget ss-tek)
          icerik (rtos (atoi (cdr (assoc 1 data))) 2 1)
          data (subst (cons 1 icerik) (assoc 1 data) data))
    (entmod data))
  (setvar "dimzin" dmz) (princ)
)
şeklinde yazılsa diye düşündüm. text objeleriyle beraber mtext objelerini de işeyebilir. sizin yazdığınız haliyle de, bu haliyle de, seçilen objeler içinde nümerik olmayanlar (mesela "ali" diye bir text) varsa 0. 0 olarak değiştiriyor.

daha önce yazdığım, kotk fonksiyonu içinde kot değerlerini belli bir düzen içinde yazdırmak için kullandığım bir fonksiyonu, benzer konularda çözüm arayan bazı arkadaşlarımızın işine yarayabilir düşüncesiyle düzenleyerek paylaşmak istiyorum.
Kod:

(defun c:ddr ()
  (if (= edpp nil) (setq edpp 2))
  (if (not (setq dpp (getint (strcat "\nondalık basamak sayısı: [" (itoa edpp) "]: "))))
    (setq dpp edpp) (setq edpp dpp))
  (princ "\n  basamak sayısı ayarlanacak text veya mtext objelerinizi seçiniz")
  (setq objs (ssget (list (cons 0 "*text"))) l (sslength objs) n -1)
  (while (< (setq n (1+ n)) l)
    (setq pvt (entget (ssname objs n)) ynt (cdr (assoc 1 pvt)) m (strlen ynt) o 0 isnm t)
    (while (<= (setq o (1+ o)) m)
      (if (or (< (ascii (substr ynt o 1)) 40) (> (ascii (substr ynt o 1)) 57))
        (setq isnm nil)))
    (if (not isnm) (exit)) (setq ynt (rtos (atof ynt) 2 dpp) sr 0)
    (if (= (substr ynt 1 1) (chr 46)) (setq ynt (strcat (chr 48) ynt)))
    (setq m (strlen ynt))
    (while (and (< (setq sr (1+ sr)) m) (/= (substr ynt sr 1) (chr 46))))
    (setq yer (- m sr) frk (- dpp yer -1))
    (if (and (= yer 0) (/= dpp 0)) (setq ynt (strcat ynt (chr 46))))
    (while (> (setq frk (1- frk)) 0) (setq ynt (strcat ynt (chr 48))))
    (setq pvt (subst (cons 1 ynt) (assoc 1 pvt) pvt))
    (entmod pvt) (entupd (cdr (assoc -1 pvt))))
)
seçilen obje gurubu içinde alfanümerik olanlar varsa bunları gözardı eder, işleme almaz. ondalık noktasından sonra istediğiniz kadar basamak seçebilirsiniz. ondalık basamak sayısını 0 girerseniz de seçilen sayiları tamsayıya çevirmiş olur. bu fonksiyonun da en önemli kusuru, veya eksiği; ondalık basamakları kırparken bir üst değerli basamağa simetrik yuvarlama yapmaz. yani; 12. 890 gibi bir sayıyı, ondalık basamak sayısını 1 girerek işleme alırsak: 12. 8 şeklinde değiştirir.

kolay gelsin.

08.02.2011 15:53    

ehya
Şahin hocam,
denemeleri sadece sayı üzerinde uyguladığım için yazılarda denemek hiç aklıma gelmemişti. bu da bana ders olsun :)
yapmış olduğunuz yeni düzenlemede * karakterinin nesne adında joker olarak kullanıldığını bilmiyordum. sayenizde yeni birşey daha öğrenmiş oldum. teşekkürler :yes

yeni yazmış olduğunuz kodlamada aşmışsınız yine.
şunu artık çok iyi anlıyorum ki, lisp bilen kişiler artık tembelleşiyor :)
sıkıya geldiğimizde hemen bir kod yazarak ne kadar çabuk iş bitireceğimizi hesaplıyoruz. . . :)

08.02.2011 17:59    

ProhibiT
Mehmet hocam :) dimzin'in bu şekilde kullanıabileceğini de ben sizden öğrenmiş oldum. bir tek bu değil elbette sizden öğrendiğim :)

ssget komutu altındaki listede ben bu * jokerini çok kullanıyorum :)
mesela: (ssget "x" (list (cons 0 "*polylıne"))) kullanarak, tek hamlede hem polylıne'ları hem de lwpolylıne'ları seçiyorum.

gene sevdiğim bir seçim şekli de; (ssget ":s" bu şeklide tıpkı (entsel gibi tek bir obje seçebiliyoruz (single selection). (car (entsel'de entity name dönerken, (ssget ":s"'te tek objeden olan bir seçim seti dönüyor.
(nth ss 0) ile o tek objenin entity name'ine dönüveriyorum. faydası ne derseniz, önce entity seçtitip sonra entity type kontrol ettireceğime, daha baştan kontrollü seçmiş oluyorum.

lisp bilmeyle ilgili yazdıklarınıza katılıyorum. tamam lisp yazarların ufku daha geniş oluyor da, o geniş ufuklara bakarken bazen burnumuzun ucuna bakmayı unuttuğumuz da oluyor. kendi adıma, kim bilir amerika'yı kaç bin kere yeniden keşfettim. ama olsun :)

kolay gelsin.

08.02.2011 22:06    

ehya
Hocam ben bu dimzin işini sırf zorda kaldığım zamanda öğrendim. hani sıkışınca ne yapacağını bilemezsiniz. bi şekilde istediğinizin olmasını istersiniz. işte bu inadım bana bunları öğretti :)

hocam benim sizin gibi üstatlara öğretebileceğim birşey olmasa gerek. siteye gelmenizle beraber yazdığınız kodlamalarla algoritma kurmayı daha iyi öğrendim. ben daha önceden odunu balta ile yontuyormuşum. asıl ben sayenizde çok şey öğrendim.

ssget :s fonksiyonu benimde çok hoşuma giden bir fonksiyon. ama bunu yazdığımda diğer kullanıcılar pek alışamadı. o yüzden entsel komutuna devam :) halbuki matchprop komutunu rahatlıkla kullanabiliyorlar :)

hocam bu amerika'yı keşfetme konusunda haklısınız ancak amerika çok uzakta. her defasında uzağa gitmek yerine yanı başımıza alıyoruz. daha rahat oluyor :)

09.02.2011 08:08    

TR-hathor
Eyha ve prohibit yardımlarız için çok teşekkür edrim. (fikir fırtınası yaşanmış burda:) )lispi denedim. tam sayıları isdegim gibi sonlarına . 0 koyuyor. fakat mevcut küsüratlı sayılarıda (ör: 2541. 4) bunlarıda tam sayıya yuvarlıyor. (2542. 0) mervcut küsüratlı sayıları oldugu gibi bırakıp sadece tam sayıların sonuna . 0 koymaktı benim amacım. baya ugraşmışsınız emeginiz için çok teşekkür ederim. bassettigim gibi bu şekilde sadece tamsayıların sonuna . 0 koycak şekilde lispi degiştirebilirmiyiz??

09.02.2011 09:02    

ehya
Şahin hocamın yazı uyarısını da dikkate alarak düzenlemeyi yaptım. ancak sizin söylemiş olduğunuz gibi sayıyı bi üst sayıya yuvarlamaz. yine de emin olmak için küçük bir değişiklik daha yaptım. bu şekilde kullanabilirsiniz.



Kod:

(defun c:yzd ()
  (setq dmz (getvar "dimzin"))
  (setq ss (ssget (list (cons 0 "*text"))))
  (if (= ss nil)
    (progn
      )
    (progn
      (setq c 0)
      (setq ss-s (sslength ss))
      (setvar "dimzin" 0)
      (while (< c ss-s)
(setq ss-tek (ssname ss c)
      icerik (cdr (assoc 1 (entget ss-tek)))
      data (entget ss-tek))
(if (/= (numberp (distof icerik)) nil)
  (progn
(setq data (subst (cons 1 (rtos (fix(distof icerik)) 2 1)) (assoc 1 data)data))
(entmod data))
  (progn))
(setq c (+ c 1)))))
        (setvar "dimzin" dmz)
        (princ))

09.02.2011 12:45    

TR-hathor
Virgüllü sayıyı oldugu gibi birakmaması kötü oldu ama işimi görür sanırım. emeğinize tekrar teşekkür ederim. saolun.

09.02.2011 13:11    

ehya
Virgüllü sayı değer olarak sayı değildir. autolisp derleyicisi ayraç olarak sisteme bağlı olarak noktayı tanır. bunun haricindeki değerleri kabul etmez.

10.02.2011 09:42    

TR-hathor
Ehya hocam ben yanlış belirttim özürdilerim. tamam dediginiz gibi benimde kullandığım ayraç sembolü (.) nokta ve text mtext yazlarında da (,) virgül degil. bassetmiş oldugunuz gibi (.)noktadan sonrasını oldugu gibi bırakabilme şansımız var mı? teşekkürler. sadece tam sayılarda (nokta falan yok) direk tam sayılarda sonuna .0 koyamazmıyız? noktalı mevcut sayıları aşşağı yada yukarı yuvarlamasını istemiyorum, oldugu gibi bıraksın onları.

10.02.2011 12:15    

ProhibiT
Ehya hocamın fonksiyonunu;
Kod:

(defun c:yzd ()
  (setq dmz (getvar "dimzin"))
  (setq ss (ssget (list (cons 0 "*text"))))
  (if (/= ss nil)
    (progn
      (setq c -1 ss-s (sslength ss))
      (setvar "dimzin" 0)
      (while (< (setq c (1+ c)) ss-s)
        (setq ss-tek (ssname ss c)
              data   (entget ss-tek)
              icerik (cdr (assoc 1 data)))
        (if (distof icerik)
          (progn
            (setq
              data (subst (cons 1 (rtos (distof icerik) 2 1))
                          (assoc 1 data) data))
            (entmod data))))))
  (setvar "dimzin" dmz)
  (princ)
)
şekline getirirsek, tam da istediğinizi yapar.

mehmet hocam, prensip olarak bir tek fix fonksiyonunu kaldırdım. :)

10.02.2011 12:43    

ehya
Hocam ben vakit bulup yazamamıştım. ellerinize sağlık. ancak küçük bir hata var. noktadan sonraki basamak sayısı 1'den fazla ise onlara da müdahale ediyor.

benim aklımdan geçen fonksiyon seçilen yazı öncelikle sayı mı? sayı ise içinde nokta aratmak. nokta yok ise devam et var ise işlemi uygula şeklinde. olacaktı.




düzenleme : 10.02.2011 15:36

hocam arada fırsat bulunca yukarıdaki fonsksiyonu yazayım dedim. sanırım bir komut için bu kadar kodlama yeter artık. tadında bırakalım :)

Kod:

(defun c:yzd ()
  (vl-load-com)
  (setq dmz (getvar "dimzin"))
  (setq ss (ssget (list (cons 0 "*text"))))
  (if (= ss nil)
    (progn
      )
    (progn
      (setq c 0)
      (setq ss-s (sslength ss))
      (setvar "dimzin" 0)
      (while (< c ss-s)
(setq ss-tek (ssname ss c)
      icerik (cdr (assoc 1 (entget ss-tek)))
      data (entget ss-tek))
(if (= (numberp (distof icerik)) nil)
  (progn)
  (progn
    (setq nokara (vl-string-search "." icerik))
    (if (/= nokara nil)
      (progn)
      (progn
(setq data (subst (cons 1 (rtos (fix(distof icerik)) 2 1)) (assoc 1 data)data))
(entmod data))
  )))
(setq c (+ c 1)))))
        (setvar "dimzin" dmz)
        (princ))

ehya (10.02.2011 13:38 GMT)

15.02.2011 11:17    

TR-hathor
Tamam işte. tamda istediğim de buydu :) . çok teşekkür ederim. saolun tekrar.

> 1 <
Copyright © 2004-2022 SQL: 1.157 saniye - Sorgu: 86 - Ortalama: 0.01345 saniye