AUTOCAD 2015
%30 İndirimli

SOLIDWORKS 2014
%30 İndirimli

V-RAY
%26 İndirimli (1)
 Üye Ol 
Ücretsiz Kullanıcı Adı Şifre Beni Hatırla Şifremi unuttum
Online
Eski Galeri  
> 1 < [2] [3] [4] [5] Sonraki Sayfa

İleti Yazar
13.03.2010 21:34 GMT
56109      




ProhibiT

[70] Editör

Online Durumu

1461 ileti
İnşaat Mühendisi
Ankara

Merhaba arkadaşlar...
AutoCAD ortamında hazırlanmış, Line ve Text objelerinden oluşan tabloyu Excel'e aktaran bir AutoLisp program paylaşmak istiyorum. Bu programı forumdan cngzklc arkadaşımızın isteğiyle yazmaya başlamıştım. Ben vakit bulup bitiremeden cngzklc yabancı kaynaklı bir Lisp bulup problemini çözmüştü Ancak fırsat bulup programı bitirebildim.
Buna benzer işlemleri yapan pek çok Lisp bulabilirsiniz.
Algoritma ve Programlama Mantığı bakımından çok ilginç geldiği için program yazan arkadaşlarımızın ilgisini çekebilir düşüncesiyle paylaşmak istedim.
Tablonun Satır ve Sütun sınırlarını belirleyen objelerin "LINE", hücrelerin içindeki objelerin de "TEXT" veya MTEXT olduğu kabulüne göre yazılmıştır. Bir hücre içinde (tek satır halinde olmak şartıyla) birden fazla Text objesi bulunabilir.
Fonksiyon çalıştırılınca Excel'e aktarmak istediğiniz tabloyu Window ile seçmenizi ister.
Bundan sonra çıkışların nerede ve hangi isimli dosyaya kaydedileceğini belirlemek için bir diyalog kutusu açılır. Çıkış dosyasının standart uzantısı -.csv otomatik olarak verilir.
Kod: (Seç)

(defun c:mtlst ()
  (setvar "cmdecho" 0) (command "undo" "group") (setvar "modemacro" "MehmetSahinGuvercin")
  (princ "Excel'e aktarmak istediğiniz tabolyu seçiniz\n")
  (while (/= 3 (car (setq ll (grread T 4 0)))) (setq ll (cadr ll)))
  (setq ll (list (caadr ll) (cadadr ll)) x1 (car ll) y1 (cadr ll) pp1 nil)
  (while (/= 3 (car (setq ur (grread T 4 1))))
    (setq ur (list (caadr ur) (cadadr ur)) x2 (car ur) y2 (cadr ur)
          pp1 (list x1 y1) pp2 (list x2 y1) pp3 (list x2 y2) pp4 (list x1 y2))
    (redraw) (grvecs (list 252 pp1 pp2 pp2 pp3 pp3 pp4 pp4 pp1))) (redraw)
  (setq ur (list (caadr ur) (cadadr ur)) dst (/ (distance ur ll) 50.0)
        tblcz (ssget "c" ur ll (list (cons 0 "LINE")))
        l (sslength tblcz) n 0 xler nil yler nil
        f (getfiled "Çıkış Kütüğü" "" "csv" 9) fo (open f "w"))
  (while (< n l)
    (setq pvt (entget (ssname tblcz n)) n (1+ n)
          xler (append (list (cadr (assoc 10 pvt))) xler)
          xler (append (list (cadr (assoc 11 pvt))) xler)
          yler (append (list (caddr (assoc 10 pvt))) yler)
          yler (append (list (caddr (assoc 11 pvt))) yler)))
  (setq xler (vl-sort xler '<) yler (vl-sort yler '<)
        xmin (nth 0 xler) xmax (nth (- (length xler) 1) xler)
        ymin (nth 0 yler) ymax (nth (- (length yler) 1) yler)
        p11 (list (- xmin dst) ymin) p12 (list (+ xmax dst) ymax)
        p21 (list xmin (- ymin dst)) p22 (list xmax (+ ymax dst)) n 0 xler nil yler nil)
  (while (< n l)
    (setq pvt (entget (ssname tblcz n))
          p3 (list (cadr (assoc 10 pvt)) (caddr (assoc 10 pvt)))
          p4 (list (cadr (assoc 11 pvt)) (caddr (assoc 11 pvt)))
          dx (abs (- (car p3) (car p4))) dy (abs (- (cadr p3) (cadr p4)))
          intx (inters p11 p12 p3 p4) inty (inters p21 p22 p3 p4))
    (if intx (if (< dx dy) (setq xler (append (list (car intx)) xler))))
    (if inty (if (< dy dx) (setq yler (append (list (cadr inty)) yler))))
    (setq n (1+ n)))
  (setq xler (vl-sort xler '<) yler (vl-sort yler '>)
        yler (append yler (list (- (nth (- (length yler) 1) yler)
               (- (nth (- (length yler) 2) yler) (nth (- (length yler) 1) yler)))))
        row (- (length yler) 1) clm (- (length xler) 1) n 0 m 0)
  (while (< n row)
    (setq satir (strcat) mmbr (strcat))
    (while (< m clm)
      (setq p1 (list (nth m xler) (nth n yler)) p2 (list (nth (1+ m) xler) (nth (1+ n) yler))
            cell (ssget "c" p1 p2 (list (cons 0 "TEXT")))
            cellm (ssget "c" p1 p2 (list (cons 0 "MTEXT"))))
      (if cellm (progn
          (if (not cell) (setq cell (ssadd)))
          (setq ml (sslength cellm) lm 0)
          (while (< lm ml) (setq cell (ssadd (ssname cellm lm) cell) lm (1+ lm)))))
      (if cell (progn (setq len (sslength cell) o 0 val (strcat))
          (if (> len 1) (progn
              (setq grpp (entget (ssname cell o))
                    grp (list (cadr (assoc 10 grpp)) (cdr (assoc 1 grpp))))
              (while (< (setq o (1+ o)) len)
                (setq grpp (entget (ssname cell o))
                      grp (append grp (list (cadr (assoc 10 grpp)) (cdr (assoc 1 grpp))))))
              (setq o -1)
              (while (< (setq o (1+ o)) (1- len))
                (setq p o)
                (while (< (setq p (1+ p)) len)
                  (setq x1 (nth (* 2 o) grp) a1 (nth (+ (* 2 o) 1) grp)
                        x2 (nth (* 2 p) grp) a2 (nth (+ (* 2 p) 1) grp))
                  (if (> x1 x2)
                    (setq grp (subst "xx" x2 grp) grp (subst "aa" a2 grp)
                          grp (subst x2 x1 grp) grp (subst a2 a1 grp)
                          grp (subst x1 "xx" grp) grp (subst a1 "aa" grp)))))
              (setq o -1)
              (while (< (setq o (1+ o)) len)
                (setq val (strcat val (nth (+ (* 2 o) 1) grp) " "))))
            (setq val (cdr (assoc 1 (entget (ssname cell 0))))))
          (setq l1 (strlen val) l2 (strlen mmbr) syc 1 cnt T)
          (if (> l1 1)
            (while (< syc l2)
              (if (wcmatch val (substr mmbr syc l1)) (setq cnt nil)) (setq syc (1+ syc))))
          (if cnt (setq satir (strcat satir val) mmbr (strcat mmbr " " val)))
          (if (/= m (1- clm)) (setq satir (strcat satir ";"))))
        (setq satir (strcat satir ";"))) (setq m (1+ m)))
    (write-line satir fo) (setq n (1+ n) m 0))
  (close fo)
  (princ (strcat "\n\nSeçilen Tablo " f " dosyasına yazıldı..."))
  (setvar "modemacro" "") (command "undo" "e") (prin1)
)
Algoritma ile ilgilenen arkadaşlarımız için;
- Window ile seçilen objeler içinden Line objeleri ele alınarak tablonun Sol Alt Köşe (minimum) ve Sağ Üst Köşe (maksimum) koordinatları belirlenir. Bu noktalara sırasıyla P1 ve P2 diyelim.
- Aşağıda şekilde görüldüğü gibi, P1 ve P2 den türetilen P3 ve P4 noktalarını birleştiren çizgi ile tabloda yer alan yatay çizgilerin kesişim noktaları, tablomuzun satırlarını tanımlar.
- Gene P1 ve P2 den türetilen P5 ve P6 noktalarını birleştiren çizgi ile Tabloda yer alan dikey çizgilerin kesişim noktaları da, tablomuzun sütunlarını tanımlar.
- Satır ve Sütun sınırları bilindiğine göre, bu hücre sınırları içinde kalan Text objeleri belirlenerek Çıkış kütüğüne uygun formatta yazılırlar.
- Bir hücre içinde (tek satırdan oluşmak kaydıyla) birden fazla Text objesi bulunabilir. Bu durumda seçilen text objeleri X koordinatlarına göre sıralanırlar.

Herkese Kolay Gelsin...


Bu mesaj ProhibiT tarafından düzenlendi (08.01.2011 19:40 GMT, --- önce)

Where there is a will, there is a way... Beğenmek için anlamak lazım...

14.03.2010 11:39 GMT
56114      




ehya

[80] Yetkili

Online Durumu

2675 ileti
Teknik Ressam
Ankara

hocam eline sağlık. böyle bir lispi açık kod vererek birçok kişinin öğrenmesine vesile oluyorsunuz. Daha ne denilebilir ki

hocam lispi deneyeyim dedim. sadece yazıları excel'e attı. mesajınızda line olan nesneleri de attığını söylemişsiniz. nerde hata yapıyorum

algoritmasını anlatmışsınız. özellikle bu harika olmuş. resimi inceleyeyim dedim ancak resim boyutu 150x121 olunca hiçbişi göremedim

14.03.2010 14:48 GMT
56116      




ProhibiT

[70] Editör

Online Durumu

1461 ileti
İnşaat Mühendisi
Ankara

Teşekkür ederim ehya hocam Resmi büyüttüm, takip edilebilir hale geldi.
Line konusuna gelince; Eksik ifade etmişim. Seçilen bölgedeki AutoCAD Line objelerini algılayıp, hücre sınırlarını buluyor. Yani Tablo içinde PolyLine kullanılmışsa bunları seçmiyor. Anlatmak istediğim buydu. Yoksa AutoCAD ortamındaki tablo çizgilerini, Excel'de kenarlık gibi kullanmıyor. Bu Fonksiyon, Excel içinde herhangi bir işlem yapmıyor. Yalnızca -.csv (Comma Separated Value) türünde Excel'in açabileceği bir dosya oluşturuyor.

Yukarıda bahsettiğim gibi cngzklc arkadaşımızın isteği üzerine başlamıştım yazmaya. Arkadaşımızın bana gönderdiği örnek AutoCAD Drawing dosyasındaki tabloda hemen başta 3 problem yaşadım.

    • Sütun sınırlarını belirleyen dikey çizgiler, her satır için ayrı ayrı çizilmişti. Bu dikey çizgilerden biri birinin devamı olan çizgilerin X koordinatları arasında, Ekranda ve Kağıt üzerine çıktı alındığında gözle fark edilmeyen, ama AutoCAD'in göz ardı edemeyeceği küçük farklılıklar vardı. Seçilen bölgedeki bütün dikey çizgileri alıp, X koordinatlarını peş peşe sıraladığımda, hataya sebep oluyor, fazladan minicik genişliğe sahip sütun genişlikleri algılanıyordu. Bunun yanında, Dikey çizgilerin başlangıç ve bitiş X koordinatları ve Yatay çizgilerin başlangıç ve bitiş Y koordinatları arasında çok küçükte olsa farklılıklar vardı. Bunu aşmak için yukarıda açıkladığım algoritmayı kullandım.

    • Bazı hücrelerde birden çok Text objesi vardı. Üstelik bu Text objeleri (ssget ... ile aldığımda X koordinatlarına göre değil, oluşturulma sıralarına göre sondan başa doğru sıralanıyorlardı. Bu problemi aşmak için de; Hücre içinde birden fazla Text objesi varsa, bunları X koordinatlarına göre sıralayıp, Text içeriklerini bu sıralama içinde (strcat ... ile birleştirerek çıkış kütüğüne yazdırdım.

    • Benzer şekilde, genellikle ilk satırda bulunan ve bir kaç sütun genişliğe yayılan başlığı oluşturan Text objesi varsa, (ssget "w"... seçeneği kullanılınca bir kaç sütun üzerine yayılan bu başlığın tamamı hiç bir hücrenin içine sığmadığı için, (ssget "c"... seçeneğini kullandım. Bu durumda aynı obje devam ettiği bütün hücrelerde tekrar tekrar okunduğu için bunun da kontrol edilmesi ve aynı objenin aynı satırda birden fazla hücrede tekrarlanmamasını sağladım.

Kolay gelsin...


Bu mesaj ProhibiT tarafından düzenlendi (05.01.2011 14:53 GMT, --- önce)

Where there is a will, there is a way... Beğenmek için anlamak lazım...

02.04.2010 06:54 GMT
56531      




cngzklc

[3] Kıdemli

Online Durumu

47 ileti
İş Hazırlama Teknisyeni
Bursa

Prohibit Hocam;

Elinize sağlık. Çok sağlam bir lisp olmuş.Size göndermiş olduğum lisp programından daha pratik.

Çok teşekkur ederim. İyi çalışmalar.

02.04.2010 07:26 GMT
56535      




ProhibiT

[70] Editör

Online Durumu

1461 ileti
İnşaat Mühendisi
Ankara

Teşekkür ederim cngzklc Beğenmenize sevindim.
Bana o programı gönderdiğinizde, "Birileri yazmış, güzel yazmış. Amerika'yı yeniden keşfetmenin anlamı kalmadı" diye yazmıştım. Sonra biraz kafa yorunca Amerika'nın henüz pek iyi keşfedilmemiş olduğunu düşünerek bir keşif gezisine çıktım, fikr-i firar ettim. Ortaya böyle bir Lisp çıktı.

Kolay Gelsin...

Where there is a will, there is a way... Beğenmek için anlamak lazım...

02.04.2010 07:50 GMT
56540      




cngzklc

[3] Kıdemli

Online Durumu

47 ileti
İş Hazırlama Teknisyeni
Bursa

Dediğim gibi, size göndermiş olduğum lispten daha pratik işimi görebiliyorum.O lispten farklı Autocad dosyalarından sırası ile liste alamıyordum. Aldığım listeyi kaydettikten sonra bir başka Autocad sayfasının malzeme listesini excele atabiliyordum.
Ama sizin gönderdiğiniz lisp kendi kaydediyor ve çok pratik. Seri şekilde işimi ürütebiliyorum.

Birkez daha çok teşekkur ederim.
İyi çalışmalar.

25.05.2010 09:02 GMT
57618      




haydogdu2

[2] Acemi

Online Durumu

4 ileti
inşaat mühendisi
istanbul

birde sadece y koordinatlarını almasını istiyorum ben bunu düzenleyebilirmisiniz ?
aldıgı koordinatları çizebilen bir program var mı ?
yani enkesitler üzerinden boy kesiti çıkartacak ?
enkesit üzerine noktaları işaretleyip tabloyu yapacak sonrada bunları noktasal olarak ekranda belırtecek aralarından pollyline ile cizgi gecip boy kesiti olusturacagız eger bu mumkun olursa mukemmel bir kolaylık saglayacak bize ehya cok rıca edıyorum sana.

17.10.2010 07:22 GMT
60155      




aozanp

[1] Yeni üye

Online Durumu

14 ileti
HARITA
HATAY

S.A Allah razı olsun emegınıze saglık hocam..

Rabbim ilmimizi arttırsın inşaallah. TÜM ARKADAŞLARA BAŞARILAR..SELAMETLE

09.11.2010 07:10 GMT
60575      




bud_0782

[10] Üstad

Online Durumu

282 ileti
Yapı Öğr.+Teknik Res.
Antalya

emeğinize sağlık prohibit hocam.çok işime yaradı.ancak bazı satırlarda aynı satıra gelen tüm hücreleri sola dayalı olarak tek hücreye sıkıştırmış durumda.örneğin x ve y koordinatları yazan bir tabloda bazı satırlardaki y koordinatlarını, x koordinatlarıyla aynı hücreye atmış.
ondalıklı sayılarda nokta yerine virgül kullanmak gerekiyor.tabloyu hazırlarken buna benzer dikkat edilmesi gereken bişiler mi var?

~~~~~~~~~~~~~~~~~~~~~~~~
Düşün , hisset, uygula… İşte hepsi bu…
~~~~~~~~~~~~~~~~~~~~~~~~

09.11.2010 08:35 GMT
60579      




ProhibiT

[70] Editör

Online Durumu

1461 ileti
İnşaat Mühendisi
Ankara

Merhaba bud_0782,

Bu fonksiyonu cngzklc arkadaşımızın isteği üzerine yazmıştım. Uçanı, kaçanı, her türlü Tablouyu Excel'e atar diye bir iddiası da yok açıkçası. Algoritma ve işleyiş mantığı bakımından iyi bir örnek olarak gördüğüm için, Lisp Yazan arkadaşlarımıza bir kıvılcım olabilir düşüncesiyle burada paylaşmış, ve paylaşırken de, fonksiyonun sınırlarını detaylı olarak açıklamıştım.

Yukarıda, Program Kodunun altında algoritmayı açıklayan bir şekil verdim. Bu şekli ve şekildeki tabloyu inceleyip, devamında da yaptığım açıklamaları takip ederseniz...
Alıntı
ProhibiT :

    • ...
    • ...
    • Benzer şekilde, genellikle ilk satırda bulunan ve bir kaç sütun genişliğe yayılan başlığı oluşturan Text objesi varsa, (ssget "w"... seçeneği kullanılınca bir kaç sütun üzerine yayılan bu başlığın tamamı hiç bir hücrenin içine sığmadığı için, (ssget "c"... seçeneğini kullandım. Bu durumda aynı obje devam ettiği bütün hücrelerde tekrar tekrar okunduğu için bunun da kontrol edilmesi ve aynı objenin aynı satırda birden fazla hücrede tekrarlanmamasını sağladım.



Bazı değerlerin neden tek hücrede toplandığını görebilir ve belkide tablodaki basit bir değişiklikle problemi çözebilirsiniz. Yani tablonun en üst satırında, tablo genişliğine yayılan tek bir hücre gibi düşünüp, o satırdaki bütün değerleri tek hücreye topluyor olabilir.

Ondalık nokta olarak Nokta veya virgül kullanımıyla ilgili

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

linkinde detaylı bir açıklama paylaşmıştım;
Alıntı
ProhibiT :
- AutoCAD ve AutoLisp ortamında ondalık ayıracı (decimal separator) Ülke ve dil seçeneklerinden bağımsız olarak daima noktadır. Hatta, hemen bütün Programlama dillerinde bu bir standarttır.
- Windows ve Office ortamlarında ise, Ülke ve dil özelliklerine göre nokta veya virgül kullanılıyor.

Rakamlarla ve sayılarla uğraşmalarına rağmen Matematik ve Bilimle ilgisi olmayan bazı meslek guruplarının baskın çıkmalarıyla yerleşen bir kötü alışkanlık. Bizler, teknik elemanlar olarak "Galat-ı meşhur, Lugat-ı fasihten evladır" diyip ses çıkarma gereği görmeyince böyle bir anarşi doğmuş oldu
592.318,74 gibi bir gösterim bizim dışımızda ülkelerde pek kullanımayan bir yöntem. Bunun yerine 592,318.74 şeklinde kullanılması hem daha yaygın hemde mantıklı

AutoLisp ile yazdığımız fonksiyonlarda, nokta yerine virgül yazdırmak programa fazladan eklemeler yapmak anlamına geliyor. Üstüne üstlük Fonksiyonlarımızı genel yazmak zorundayız. Yukarıda yazdığım fonksiyonda ondalık ayıracı olarak virgül kullansaydım. Bu seferde nokta kullanan arkdaşlarımız problem yaşayacaklardı. Bunun için bu konuda AutoCAD'in ondalık ayracını esas alıp ilave bir işlem yapmamayı tercih ediyoruz.


Tekrar etmek gerekirse, ondalık ayıracı olarak virgül kullanmak genel geçer bir standart değildir! Tam tersine Genel Geçer ondalık ayıracı Noktadır, virgül kullanılması özel bir haldir. Program yazarken de, sayısal değerleri (rtos ...) (Real to String) fonksiyonuyla çevirdiğimiz değeri doğrudan çıkış kütüğüne yazdırıyoruz. Yukarıda da açıklamaya çalıştığım gibi, burada paylaştığımız fonksiyonlar, en başta Lisp Yazan arkadaşlarımızla algoritmik ve programatik detayların paylaşımıdır. Her nokta virgül farkını dikkate alarak yazmaya kalkarsak evin yolunu bulamıyoruz

Sonuç olarak böyle bir ondalık ayıracı kullanma alışkanlığınız ve mecburiyetiniz varsa. (Ben böyle bir mecburiyete ve alışkanlığa katılmıyorum) Fonksiyonun oluşturduğu -.csv uzantılı Excel dosyasını (Birlikte aç seçeneğini kullanarak) Notpad ile açıp, Noktaları virgül yapmanızı tavsiye ederim. Benim tavsiyem "Windows'da Ülke ve Dil seçenekleri bölümünde ondalık ayıracının Nokta olarak belirlenmesi" dir.

Kolay gelsin...


Bu mesaj ProhibiT tarafından düzenlendi (03.01.2011 17:15 GMT, --- önce)

Where there is a will, there is a way... Beğenmek için anlamak lazım...

> 1 < [2] [3] [4] [5] Sonraki Sayfa
Yukarı Çık
Copyright © 2004-2014 | Tüm Hakları Saklıdır | 150 | Site haritası | İstatistikler | Hakkımızda | Kadromuz | Gizlilik | Reklam
AKPINAR Eğitim ve Yazılım Merkezi