12.09.2008 10:01    

miyatu
Alıntı
ehya :
miyatu yukarıda verdiğim kod seçim setine göreydi. Az düşünseydin secilen nesnenin çıkarılmasını da yapabilirdin.

Neyse, örnek kod aşağıdadır.
Verdiğim kod seçim setinden tek nesne çıkarmak içindir. Çoklusu lazım ise yapabilirsin sanırım...

Kod:

(setq ss (ssget))
(setq ent (entsel))
(setq ss (ssdel (car ent) ss))




yardımların ve önerilerin için teşekkürler...

benim silmeye daha doğrusu sildirtmeye çalıştığım nesne ssget ile oluşturulmuş bir seçim seti içinde işlem gören elemanı tekrar işlem görmesin diye listeden silmek...

ilk verdiğin örnekte sıra numarası vererek silmeyle ilgiliydi...
ya ben yanlış bişey yaptım yada fonksiyon bu şekilde çalışmıyor...
sıra numarasını verdiğimde hata oluştu...
biraz araştırdım silmek istediğin nesnenin adını verirsen listeden silindiğini öğrendim...

son verdiğin yukardaki örnekte listeden çıkarılması istenen nesne kullanıcı tarafından belirlenip seçilmesi gerekiyor...
yazmaya çalıştığım projede yapı bir ağaca benzediği için ve çok sayıda nesne olduğundan dolayı ilgili nesneyi bulup seçmek bira zaman alacaktır...

tekrar yardımların ve desteğin için teşekkür ederim...

12.09.2008 11:03    

ehya
yukarıda yazdığım kodların hepsinn testini yaptım. Hiçbir sorun yok.
Sanırım bi yerde hata yaptın. Eğer bu bölümle ilgili kodlamanı eklersen kontrol edebiliriz.

12.09.2008 11:11    

miyatu
(defun c:dd ()
(prompt "\nnesneleri seç:")
(setq set1 (ssget (list (cons 0 "LINE"))))
(setq set2 set1)
(setq ref_nkt (getpoint "\nbaşlangıç noktasını seç:"))
(setq sıra (list ref_nkt))
(princ sıra)
(setq index (sslength set1))
(setq n 0)
(setq sn 0)
(while (/= index nil)
(setq list1 (entget (ssname set1 n)))
(setq str_nkt (cdr (assoc 10 list1)))
(terpri)
(princ str_nkt)
(setq fns_nkt (cdr (assoc 11 list1)))
(terpri)
(princ fns_nkt)
(if (/= (equal str_nkt ref_nkt) nil)
(progn
(setq kd 1)
(setq isim (ssname set1 n))
(setq set1 (ssdel isim set1))
(setq sıra (cons fns_nkt sıra))
(setq sn (+ sn 1))
(command "text" str_nkt "50" "0" sn)
(setq n -1)
(terpri)
(princ sıra)
)
)
(if (/= (equal fns_nkt ref_nkt) nil)
(progn
(setq kd 2)
(setq isim (ssname set1 n))
(setq set1 (ssdel isim set1))
(setq sıra (cons str_nkt sıra))
(setq sn (+ sn 1))
(command "text" str_nkt "50" "0" sn)
(setq n -1)
(terpri)
(princ sıra)
)
)

(cond
((= kd 1)
(setq ref_nkt fns_nkt)
(setq kd 0)
)
((= kd 2)
(setq ref_nkt str_nkt)
(setq kd 0)
)
)
(if (= index n)
(progn
(setq kd 0)
(setq fd 0)
(setq n1 0)
(setq n -1)
(setq ref_ger_nkt (nth fd sıra))
(princ ref_ger_nkt)
(setq index (sslength set1))
(while (/= ref_ger_nkt nil)
(setq fd (+ fd 1))
(while (/= n1 index)
(setq list1 (entget (ssname set1 n1)))
(setq str_nkt (cdr (assoc 10 list1)))
(setq fns_nkt (cdr (assoc 11 list1)))
(if (/= (equal str_nkt ref_ger_nkt) nil)
(progn
(setq kd 1)
)
)
(if (/= (equal fns_nkt ref_ger_nkt) nil)
(progn
(setq kd 2)
)
)
(cond
((= kd 1)
(setq ref_nkt str_nkt)
(setq kd 0)
(setq n1 index)
(setq fd index)
)
((= kd 2)
(setq ref_nkt fns_nkt)
(setq kd 0)
(setq n1 index)
(setq fd index)
)
)
(setq n1 (+ n1 1))
)
(setq n1 0)
(setq ref_ger_nkt (nth fd sıra))
)
)
)


(setq n (+ n 1))
(princ)
)
)

kırmızı kısımda isim değişkenini kullanmadan sıra numarası vererek nasıl yapabilirim...

not:
kodlar son hali değil

13.09.2008 09:52    

fatih107
Merhaba arkadaşlar. İzninizle bikaç şey sormak istiyorum gene.
Öncelikle Ehya autolisp kitabın için çok teşekkürler çok işime yarıyor. Özellikle spline eğrisinin baş son noktalarını bulmak için kitabındaki döngüyü kullanıyorum.

Kod:

(setq sh1(entsel "\n su hattını seçin:"))

   (setq nokta_sayisi (cdr (assoc 73 (entget (car sh1)))))
   (setq plist_data (entget (car sh1)))
   (setq yeni_list '())
   (repeat nokta_sayisi
   (setq list_10-11 (assoc 10 plist_data))
   (setq yeni_list (cons (cdr list_10-11) yeni_list))
   (setq plist_data (cdr (member list_10-11 plist_data))))
   (setq sh1n2 (car yeni_list))
   (setq sh1n1 (nth (- nokta_sayisi 1)  yeni_list))



Yanlız o kodla ilgili küçük bir sorun yaşıyorum. spline entsel ile secersem hiç bir sorun yok. Lakin seçtiğim spline move ile (z yönünde) ilerletip yeniden noktaları bulmak için spline "entlast" ile seçince hata veriyor.

Birde bu while döngüsünün mantğını tam olarak anlmakta (daha doğrusu uygulamakta) zorluk çekiyorum.While döngüsünü kullanarak sürekli (kullanıcı bitirine kadar) su hattı seçip bunları seçim setine atmaya çalıştım malesef beceremedim. Bir tane seçebiliyorum ondan sonra command satırında error: bad argument type: yazıyor .

Kod:

(setq ent 1)

(while (/= ent nil)
  (setq ent (entsel)                                           
        secim (ssadd)                           
        secim (ssadd ent secim) 
   )


Daha sonra amacım bu seçim setindeki her spline "ssname" ile ayrı bir değişkene atayıp,

(setq sh1 (ssname secim 0)) gibi

tekrar spline baş-son nokta döngüsüne sokup seçilen her spline'nın baş-son noktalarını bulmaya çalışacağım. Acaba baş-son nokta döngüsü ssname ile seçilen spline'da da hata verir mi?

Umarım sorularımı anlatabilmişimdir. Şimdiden çok teşekkür ederim

ehya (02.02.2012 14:28 GMT)

13.09.2008 10:06    

miyatu
Alıntı
fatih107 :

Birde bu while döngüsünün mantğını tam olarak anlmakta (daha doğrusu uygulamakta) zorluk çekiyorum.While döngüsünü kullanarak sürekli (kullanıcı bitirine kadar) su hattı seçip bunları seçim setine atmaya çalıştım malesef beceremedim. Bir tane seçebiliyorum ondan sonra command satırında error: bad argument type: yazıyor .

(setq ent 1)

(while (/= ent nil)
(setq ent (entsel)
secim (ssadd)
secim (ssadd ent secim)
)





while döngüsü sart sağlandığı sürece aynı işlemleri yapma mantığı ile çalışır...

senin sorunun sanırım while ile değilde ssadd ile ilgili...

entsel ile seçim yapılmadığı için ssadd yorumlanamıyor olabilir...

tavsiyem

(setq ent (entsel))
(while (/= ent nil)
(setq secim (ssadd)
secim (ssadd ent secim) )
(setq ent (entsel))

seklinde bir dene çözüm olacağını umuyorum...

kolay gelsin...

13.09.2008 10:40    

ehya
spline konusunda, ssname ile seçim yapılması birşey değiştirmez. Eğer ssname ile yapılan seçim spline ise aynı işlemleri uygulayabilirsin. Burada yapman gereken kontrol mekanizmasını hazırlamalısın. Yani ssname ile seçildiğinde seçilen nesnenin spline olup olmadığını kontrol ettirmelisin.

14.09.2008 15:09    

fatih107
Miyatu ve ehya ilgilendiğiniz için çok teşekür ederim.

Miyatu senin verdiği kodu denedim hatta sadece onu yazıp denedim lakin ne zaman ilk spline seceyim

; error: bad argument type: lentityp (<Entity name: 7efa1400>
(1443.85 1324.56 0.0))

bu hatayı veriyor.


Bu arada bir şey daha sormak istiyorum polyline, rectangular ve çokgenler(5 gen 6gen) bunların hepsinin Entity lerinde lwpolyline olarak tanıyor. Acaba bunların farklı çizim oluğunu bildiren farklı bir kodu varmı Entity listesi içinde.

14.09.2008 15:29    

ehya
seçim ekleme yaparken

(setq ent (entsel)) satırını (setq ent (car (entsel)))
yaparak çözebilirsin.

söylemiş olduğun nesnelerin tamamı polyline'dan üretiliyor. Yani ayrı bir nesne değil. Bunları ayırtedemezsin.

14.09.2008 16:49    

ehya
bunu nasıl yapacaksın?
fikir beyan edersen üzerinde yorumlayabiliriz...

14.09.2008 18:18    

ehya
ne demek istediğini anladım..
ama yaz bi kod'da görelim :)

15.09.2008 15:58    

fatih107
ARkadaşlar kusura bakmayın devamlı bu konuda rahatsız ediyorum ama malesef bi yürlü hepsini seçmeyi başaramadım. Kodları açık şekilde yazayım buraya

Kod:

(defun c:gvtx ()
  (setq osx (getvar "osmode"))
  (setvar "osmode" 0)

  (setq ent (entsel))
  (while (/= ent nil)
         (setq secim (ssadd)
               secim (ssadd ent secim) )
         (setq ent (car (entsel)))
    )
  (setvar "osmode" 4647)
  )



BUnunla seçim yapmaya çalıştığımda

Command: gvtx
Select object: ; error: bad argument type: lentityp (<Entity name: 7efa1428>
(1323.43 1301.3 0.0))

Bu Hatayla karşılaşıyorum

2))

Kod:

(defun c:gvtx ()
  (setq osx (getvar "osmode"))
  (setvar "osmode" 0)

(setq ent 1)
(while (/= ent nil)
  (setq ent   (entsel)                             
        ename (car ent)                       
        secim (ssadd)                             
        secim (ssadd ename secim)))

  (setq l1 (ssname secim 0)
l2 (ssname secim 1)
l3 (ssname secim 2))

  (setvar "osmode" 4647)
  )



bunu yazdığım zaman 3 tene deneme için yaptığım polyline secebiliyorum (enson boş entere bastığımzaman yine ; error: bad argument type: lentityp nil hatası veriyor gerçi). Lakin bu seferde l1 l2 l3 nil olarak gösteriyor.


Belki benim düşünce tarzım yanlıştır o yüzden size yapmak istediğimi anlatayım. Kullanıcının seçeceği polyline ları (sayısı belli olmayan) ayrı bir değişkene atamak istiyorum.

Yardımlarınız vede ilgilendiğiiz için tekrar teşekkür ederim.

ehya (02.02.2012 14:27 GMT)

16.09.2008 06:07    

ehya
Yazdıklarını düzelteyim dedim ama, düzeltmektense yazmayı tercih ederim. Kod isimlerini senin yazdıklarınla aynı olmasına dikkat ettim.
Birkaç ekleme yaptım. Bu yazdığımı incelersen hatalarının nerde olduğunu görürsün.


Kod:

(defun c:gvtx ()
(setq osx (getvar "osmode"))
  (setvar "osmode" 0)
(setq nnil nil)
  (setq secim (ssadd))
  (while (= nnil nil)
    (setq ent (car (entsel "\nNesneyi seç:")))
    (if (= ent nil)
      (progn
(setq nnil t)
)
(progn
(setq secim (ssadd ent secim))
  (setq nnil nil)))
  )
  (sssetfirst nil secim)
(setvar "osmode" 4647)
  (princ))

17.09.2008 12:10    

özkan-wien
Mrb arkadaslar bi listenin icindeki elemanlari sirayla nasil alabiliriz.
sadece car cadr ile mi? Bu isin baska bi yolu varmi? Ben ilk bes elemani almaya calistim ama sacma bi sey oldu.
Repeat ile otomatige baglama yolunu denedim olmuyor.
Kisaca lispden bahsedeyim; önceden tanimlanmis bir layerdaki,belli bir isimdeki bloklari seciyor. O secim setinden insertpoint kordinatlari alip bi liste yapiyor. Sonra bu listeyi kücükten büyüge diziyo. En son olarak da listenin 1.elemaninin x si ve y si ile 2. elemanin x ve y si,2.ile 3.,3. ile 4. ile islem yapip sartlara göre 1 ekliyor veya eklemiyor. Ama 1. ve 2. den sonra yapmiyor.
Yardimlariniz icin tesekkürler. Ben sadece döngünün oldugu yeri yaziyorum.



Kod:

(repeat ssl
  (setq nth 1)
  (setq nth1 2)
  (setq lager 2)
  (if (= nth 1) 
     (setq inci car))
  (if (= nth 2)
     (setq inci cadr))
  (if (= nth 3)
     (setq inci caddr))
  (if (= nth 4)
     (setq inci cadddr))
  (if (= nth 5)
     (setq inci caddddr)) ;************************************************************************
  (if (= nth1 2)
    (setq inci1 cadr))
  (if (= nth1 3)
     (setq inci1 caddr))
  (if (= nth1 4)
     (setq inci1 cadddr))
  (if (= nth1 5)
     (setq inci caddddr))
  (if (= nth1 6)
     (setq inci1 cadddddr))
  (setq ele_1x (car (inci ls)))
  (setq ele_1y (cadr (inci ls)))
  (setq ele_2x (car (inci1 ls)))
  (setq ele_2y (cadr (inci1 ls)))
  (if (and
      (= (- ele_1x ele_2x) 0)
      (<= (- ele_1y ele_2y) 126))
     (progn
       (setq lager (+ lager 1))
     ) ;progn
     (progn
       (setq lager (+ lager 0))
     ) ;progn
  ) ;if
  (setq nth (+ nth 1))
  (setq nth1 (+ nth1 1))
) ;repeat

ehya (17.09.2008 13:01 GMT)

17.09.2008 13:23    

ehya
özkan-wien

bir de "nth" bir komuttur. Buna bir değer veremezsin. Hatan burdan kaynaklanıyor.

17.09.2008 13:35    

ehya
İleride düzelirsin merak etme :D

17.09.2008 13:36    

özkan-wien
tesekkürler wolf ve ehya. Süper hizli cevaplar geldi. Ehya pardon senin gibi ustaya böyle basit hatali sorular sorulmaz gerci. nth gözümden kacmis. idare et artik. :-)

17.09.2008 13:46    

ehya
estf. ustalık ne haddime..
sadece dikkatimi çekti.. hem car, cadr haricinde varmı demisşin hemde kodlarda nth görünce,dikkatimi çekti..
tavsiyem, lispi yazarken visuallisp editöründe yaz. Mavi renkli olanlara değer vermezsin. Bir daha sıkıntı çekmezsin...

17.09.2008 14:24    

özkan-wien
Arkadaslar slm Lisp asagida ama hata veriyo. Lispin tamami asagidaki gibi. Listeyi secim setinden olusturdum ve siraya soktum gerisi gelmiyo. Tesekkürler. Ehya sana usta diye bosuna demiyoruz bak yine tikandik.


Kod:

(defun c:oz ()
(setq ss (ssget "x" '((0 . "insert") (2 . "isim") (8 . "katman"))))
(setq ssl (sslength ss))
(setq cnt 0)
(repeat ssl
(setq ssn (ssname ss cnt))
(setq sse (entget ssn))
(setq ctr (cdr (assoc 10 sse)))
(setq lst_ctr (append lst_ctr (list ctr)))
(setq ls (vl-sort ;<-- results in ls
lst_ctr ;<--- list as you want.
'(lambda (x y)
(or
(> (car x)(car y))
(and
(= (cadr x)(cadr y))
(> (car x)(car y))
)))))
(setq cnt (1+ cnt))
); repeat
(setq lnth 1)
(setq lnth1 2)
(setq lager 2)
(setq con 0)
(while
(< con ssl)
(setq cek (nth lnth ls))
(setq cek2 (nth lnth1 ls))
(setq ele_1x (car cek))
(setq ele_1y (cadr cek))
(setq ele_2x (car cek2))
(setq ele_2y (cadr cek2))
(if (and(= (- ele_1x ele_2x) 0)(<= (- ele_1y ele_2y) 126))
(progn
(setq lager (+ lager 1))
) ;progn
(progn
(setq lager (+ lager 0))
) ;progn
) ;if
(setq lnth (+ lnth 1))
(setq lnth1 (+ nth1 1))
(setq con (+ con 1))
);while
(princ lager)
(princ)
) ; defun

ehya (17.09.2008 16:55 GMT)

17.09.2008 17:03    

ehya
Yazılımda bir yerde hata veriyor. Ancak bu lispin ne işe yaradığını anlamadım. Sanırım daha geliştirme aşamasındasın..

Hatalı satır : (setq lnth1 (+ nth1 1))

Düzgün hali : (setq lnth1 (+ lnth1 1))

18.09.2008 06:24    

özkan-wien
Tesekkürler Ehya, lisp daha bitmedi . Hata listeden eleman cekerken oluyo. Hata surada, döngünün icindeki ikinci sayac calismiyo. Sebebini anlayamadim. "ckcon" listenin 2.elemaninda takili kaliyo. "con" da ise bi sorun yok.
Bu isin baska bi yolu varmi, ayni döngüde birden fazla sayaca calismiyo mu yoksa? (setq ckcon (+ ckcon 1) parantezi döngünün icindeyken hata veriyo ama ikinci kez enter yapinca lisp calisiyo. Ama yine hep listenin ikinci elemanini aliyo. Sayac calismiyo. "ckcon" sayac artirmayi döngünün icinden cikarinca hata vermiyor.
konuyla ilgilenen arkadaslara simdiden tesekkürler.

Kod:

(setq lager 2)
(setq ckcon 1)
(setq con 0)


(while
(< con ssl)

(setq cek (nth con ls))
(setq ele_1x (nth 0 cek))
(setq ele_1y (nth 1 cek))

(setq cek2 (nth ckcon ls))
(setq ele_2x (nth  0 cek2))
(setq ele_2y (nth 1 cek2))

(if  (and
(= (- ele_2x ele_1x) 0)

( = (- ele_2y ele_1y) 126)
)

(progn
(setq lager (+ lager 1))
) ;progn
(progn
(setq lager (+ lager 2))

) ;progn

) ;if


(setq con (+ con 1))
(setq ckcon (+ ckcon 1)
);while


Sorun halledildi. döngü "ckcon" a göre olunca sorunsuz calisiyor.

ehya (02.02.2012 14:27 GMT)

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