31.12.2009 06:02    

chico1907
merhaba prohibt

ilginiz için saolun tesekkürler.

31.12.2009 19:37    

berferan68
Sayın ProhibiT

Örnek lisp süper oldu yalnız sorun şu ki bazı autocad dosyalarında (ki ben icad isimli bir program kullanıyorum) exceldeki koordinatlardan ilk şeklin koordinatlarını (arada virgüllü ve başında _pline komutu ile) kopyalayıp autocad komut satırına yapıştırıyorum yapıştırıyorum auotocadde çizdirdikten sonra gerekli değişiklikleri yapıyorum.

Burada iki sorunla karşılaşıyorum. Birincisi _pline ile çizdirdiğim ilk koordinatları hafızasından silmiyor. İkincisi ise daha önce bahsettiğim gibi orijin noktasını ben belirlediğim halde koordinatları oradan almıyor. 0,5-12,3 vs gibi koordinat alması gerekirken -4444698,-658325 gibi saçma sapan koordinatlar yazıyor.

Ayrıca ben boş bir sayfaya ilk şekli çizip lispi çalıştırınca koordinatları hala yukarıdaki gibi alıyor.

Bu durumda ne önerirsiniz.

31.12.2009 23:11    

ProhibiT
Merhaba berferan68 :)
"...orijin noktasını ben belirlediğim halde..." demişsiniz.
ucs ile orijin belirleyeceğinizi hiç düşünememiştim. Fonksiyonun aşağıdaki hali bütün problemlerinizi çözecektir umarım.
Kod:

(defun c:NokLs ()
  (setvar "cmdecho" 0)
  (setq cikut (open (getfiled "Nokta Listesi" "" "txt" 1) "w")
        plln (entget (car (entsel "\nPolyline seciniz."))))
  (while (setq nokta (cdr (assoc 10 plln)))
    (setq nokta (list (car nokta) (cadr nokta) (getvar "elevation"))
          nokta (trans nokta (cdr (assoc -1 plln)) 1)
          xko (car nokta) yko (cadr nokta)
          plln  (subst (list 11 (cdr (assoc 10 plln))) (assoc 10 plln) plln))
    (write-Line (strcat (rtos xko 2 2) (chr 9) (rtos yko 2 2)) cikut)
  )
  (close cikut) (princ)
)

Olayın Lisp ve programlama mantığıyla ilgilenen arkadaşlar için kısa bir açıklama vermek istiyorum.
Polyline hangi UCS'de (User Coordinate System) çizilirse çizilsin AutoCAD vertex noktalarını WCS'de (World Coordinate System) tutuyor. Biz programımızda, entget ve assoc 10'larla bu noktaları yakalıyoruz. Bu durumda bulduğumuz noktalar daima WCS de tanımlı oluyorlar.
Bu koordinatları o anki aktif UCS'ye çevirmek için trans komutunu kullanmak gerekiyor. Bu seferde başka bir problemle karşılaşıyoruz. trans komutu x, y ve z den oluşan 3 koordinat alıp gene 3'lü koordinattan oluşan bir nokta üretiyor. Halbuki, Polyline objesi 2 boyutlu bir objedir (3Dpolyline değil) ve vertex noktaları x ve y den oluşan 2'li koordinata sahipler.
trans komutuna parametre olarak girilince hata veriyor. Bunun için o an geçerli elevation değerini bu koordinatlara z değeri olarak ilave ettim. Koordinatları aktif UCS'ye çevirdikten sonra gene ilk iki değeri x ve y olarak aldım.
trans komutunun güzel bir özelliği var; genel formatı (trans point from to ...) burada from parametresi olarak object name kullandım, to parametresi olarak ta 1 (active UCS) kullandım. Polyline hangi koordinat sisteminde çizilirse çizilsin dosyaya yazılırken o anda aktif olan koordinat sitemine göre yazılıyor... İlginç bir deneyimdi benim için, epeyce yeni şeyler öğrendim :)

Selamlar, Sevgiler, Herkese Kolay Gelsin...

ProhibiT (31.12.2009 23:18 GMT)

01.01.2010 20:35    

berferan68
Çok teşekkür ederim süpersiniz

06.01.2010 13:18    

adsari
Merhaba arakadaşlar.
Benim çok açil bir sorunum var. Çözerseniz memnun olacağım.
Katı bir cismin hacmi, ağırlık merkezi gibi sorularıma cevap verecek bir komut vardı bulamıyorum.
Hatırlayan varsa lütfen yardımcı olurmusunuz.

06.01.2010 13:36    

ProhibiT
massprop

08.01.2010 14:28    

cngzklc
Selam Arkadaşlar,

Sizden bir lisp isteğim olacak.
Autocad içerisindeki malzeme listesini ( yada seçili yazıları) yazı olarak başka bir dosyaya (excell,txt veya world dosyası) atabileceğim bir lispe ihiyacım var.
Yardımcı olursanız sevinirim.
Şimdiden yardımcı olan ve olamayan herkese teşekkur ederim.
:)

08.01.2010 15:24    

aslanv
bunun için lispe ihtiyacın olmaması gerek. Kullandığın versiyon ne bilmiyorum ama EATTEXT ile textleri de excel listesine atabilirsin.

08.01.2010 16:05    

cngzklc
AutoCAD 2008'i kullanıyorum.
Çok teşekkur ederim Aslanv. Oldu.
Fakat burada malzemeleri hep alt alta atıyor. Yani

Poz
Miktar
Kesit
En
Boy
Kalite
P/1
2 Ad
25
450
800
S355J0
.... gibi devam ediyor.

Resimde malzeme listesi aşağıdaki gibi gösteriyor ve bu şekilde de atabilirmiyiz.

Poz Miktar Kesit En Boy Kalite
P/1 2 Ad 25 450 800 S355J0

Yardımın için çok teşekkur ederim. İşime yaradı. :)

11.01.2010 06:54    

ec
Bir lispe ihtiyacım var. Eğer yardımcı olabilirseniz çok sevinirim.

Proje içinde çeşitli layerlarda bol miktarda blok mevcut.
Bloklar doğru layerlarda değil.
Ancak projenin içinde tüm bloklardan doğru layerda bulunan 1’er blok topluca bulunmakta.
Bu doğru layerlarda bulunan bloklar baz alınarak proje içindeki tüm blokları layerlarına alan bir lisp.

İlgilenen ve emek veren arkadaşlara şimdiden teşekkürler.

11.01.2010 09:40    

Harbi65
Alıntı
ec :
Bir lispe ihtiyacım var. Eğer yardımcı olabilirseniz çok sevinirim.

Proje içinde çeşitli layerlarda bol miktarda blok mevcut.
Bloklar doğru layerlarda değil.
Ancak projenin içinde tüm bloklardan doğru layerda bulunan 1’er blok topluca bulunmakta.
Bu doğru layerlarda bulunan bloklar baz alınarak proje içindeki tüm blokları layerlarına alan bir lisp.

İlgilenen ve emek veren arkadaşlara şimdiden teşekkürler.



Bu işlemi QSELECT komutuyla yapabilirsiniz...
Aynı isimde ki blok grubunu QSELECT ile seçtirip istediğiniz layera atayabilirsiniz...

11.01.2010 10:01    

miyatu
referans olarak gosterdigin block ile ayni isimdeki blocklari referans block un layer ina atan lisp

Kod:

(defun c:bld ()
  (setq ref_blok (entsel "\n referans blogu sec:"))
  (setq ref_layer (cdr (assoc 8 (entget (car ref_blok)))))
  (setq ref_ad (cdr (assoc 2 (entget (car ref_blok)))))
  (terpri)
  (prompt "tum bloklari sec:")
  (setq sset (ssget  '((0 . "INSERT"))))
  (setq ns (sslength sset))
  (setq ent1 (ssname sset 0))
  (setq ds 0)
  (while (/= ent1 nil)
    (setq liste (entget ent1))
    (setq ad (cdr (assoc 2 liste)))
    (if (= ref_ad ad)
      (progn
    (setq liste (subst (cons 8 ref_layer) (assoc 10 liste) liste ))
    (entmod liste)))
    (setq ds (+ ds 1))
    (setq ent1 (ssname sset ds))))


ins. isinize yarar kolay gelsin

11.01.2010 10:42    

kemalizmir3535
iyi günler. yardımınızı istediğim konu, excell.den aktardığım noktaların numara adlarının görünmemesi, excellden noktaları atıyorum ama, sadece noktalar olarak, bunların numaralarının da görünmesini rica edecektim. bu konuda lsp.niz varsa yardımcı olursanız sevinirim

11.01.2010 10:48    

cngzklc
Alıntı
miyatu :
Alıntı
PLAKTON :
arkadaşlar siteyi inceledim bulamadım autocad deki sectiğimiz yazıları .txt formatına dönüştürebilecek bir lisp elinizde mevcutmudur çok acil


Kod:

;autocad ortamında seçilen textleri seçim sırasına göre alt alta, c nin altındaki miyatu.txt dosyasına yazan lisp
;hazırlayan miyatu
;13 mayıs 2009
;not: dosya içinde daha önceden yazılmış yazılar varsa enson satırdan yazmaya devam edecektir. önceki bilgiler kaybedilmez.
(defun c:txt()
  (setq f (open "c:\\mıyatu.txt" "a"))
  (setq sec_txt (entsel "\n txt dosyasına yazılacak texti sec:"))
  (while (= sec_txt nil)
    (setq sec_txt (entsel "\n txt dosyasına yazılacak texti sec:")))
  (while (/= sec_txt nil)
    (setq txt_al (cdr (assoc 1 (entget (car sec_txt)))))
    (write-line txt_al f)
    (setq sec_txt (entsel "txt dosyasına yazılacak diğer texti sec:")))
  (close f))

inş. işine yarar...

kolay gelsin



Öncelikle paylaştığınız bilgi için teşekkur ederim.
"txt" komutunu çalıştırdığımda "; error: bad argument type: streamp nil" hatasını veriyor ve herhangi bir dosya oluşturmuyor.
Ayrıca text'leri tek tek seçerek işlem ilerliyor. Ben yapacağım işlem malzeme listesini txt veya excel dosyasına atmak.
ASLANV arkadaşım sağolsun EATTEXT komutunu önermişti fakat onda da her kelimeyi alt alta atıyor. Aşağıdaki gibi yapabileceğimiz bir lisp varmı yada komut.

Poz Miktar Kesit En Boy Kalite
P/1 2 Ad 25 450 800 S355J0
P/2 2 Ad 30 350 700 S355J0
P/3 2 Ad 10 250 500 S355J0

11.01.2010 13:14    

ProhibiT
ec arkadaşımızın sorduğu sorunun en sade ve güzel çözümü Harbi65 hocamın verdiği yol bence.
miyatu arkadşımızın verdiği Lisp fonksiyonla da çözülür elbette. Söz konusu Lisp;
Kod:

(defun c:bld ()
  (setq ref_blok  (entget (car (entsel " referans blogu sec:")))
        ref_layer (cdr (assoc 8 ref_blok))
        ref_ad    (cdr (assoc 2 ref_blok))
        sset      (ssget "X" (list (cons 0 "INSERT") (cons 2 ref_ad))))
  (command "change" sset "" "p" "la" ref_layer "")
  (prin1)
)
şeklinde daha kısa da yazılabilir...

cngzklc sizin sorunuza gelince;
aslanv arkadaşımızın size önerdiği komut her attribute objesini ayrı bir satır olarak extract eden bir komut. miyatu arkadaşımız tarafından hazırlanmış lisp fonksiyon ise, text objeler için hazırlanmış. Anladığım kadar sizin objeleriniz Attribute, bu nedenle bad argument hatası veriyor. Fonksiyon text beklerken attribute gösterince hata veriyor yani...

Probleminizi çözebileceğiniz basit bir program yazılabilir elbette.
Biraz daha detaylı bilgiye ihtiyaç var yalnız. Eğer çok acele değilse,
ve bana çalıştığınız dosyayı (hiç olmazsa ilgili metraj tablosunu) mail olarak gönderebilirseniz...
İlk fırsatta yazmaya çalışırım.

Aslında bu konunun kesin ve net çözümü,
C:\Program Files\AutoCAD XXXX\Sample\ActiveX\ExtAttr\ klasöründe bir örnekte verildiği gibi AutoCAD ActiveX özelliğini kullanarak Visual Basic ile Excel altında yazılacak bir program. Daha önce benzer şeyler yazdım ama, duruma özel Visual Basic programlar olarak kaldılar...

Kolay gelsin...

ProhibiT (11.01.2010 13:20 GMT)

11.01.2010 19:01    

miyatu
Alıntı
ProhibiT :
ec arkadaşımızın sorduğu sorunun en sade ve güzel çözümü Harbi65 hocamın verdiği yol bence.
miyatu arkadşımızın verdiği Lisp fonksiyonla da çözülür elbette. Söz konusu Lisp;
Kod:

(defun c:bld ()
  (setq ref_blok  (entget (car (entsel " referans blogu sec:")))
        ref_layer (cdr (assoc 8 ref_blok))
        ref_ad    (cdr (assoc 2 ref_blok))
        sset      (ssget "X" (list (cons 0 "INSERT") (cons 2 ref_ad))))
  (command "change" sset "" "p" "la" ref_layer "")
  (prin1)
)
şeklinde daha kısa da yazılabilir...

cngzklc sizin sorunuza gelince;
aslanv arkadaşımızın size önerdiği komut her attribute objesini ayrı bir satır olarak extract eden bir komut. miyatu arkadaşımız tarafından hazırlanmış lisp fonksiyon ise, text objeler için hazırlanmış. Anladığım kadar sizin objeleriniz Attribute, bu nedenle bad argument hatası veriyor. Fonksiyon text beklerken attribute gösterince hata veriyor yani...

Probleminizi çözebileceğiniz basit bir program yazılabilir elbette.
Biraz daha detaylı bilgiye ihtiyaç var yalnız. Eğer çok acele değilse,
ve bana çalıştığınız dosyayı (hiç olmazsa ilgili metraj tablosunu) mail olarak gönderebilirseniz...
İlk fırsatta yazmaya çalışırım.

Aslında bu konunun kesin ve net çözümü,
C:\Program Files\AutoCAD XXXX\Sample\ActiveX\ExtAttr\ klasöründe bir örnekte verildiği gibi AutoCAD ActiveX özelliğini kullanarak Visual Basic ile Excel altında yazılacak bir program. Daha önce benzer şeyler yazdım ama, duruma özel Visual Basic programlar olarak kaldılar...
Kolay gelsin...





hocam onerınızı bende dusundum ama lısp yazarken ozellıkle block ve textlerde command fonksıyonunu kullanmamaya kararverdım cunku bu nesneler ıcın sıstem ayarlarına gore kullanılan komut farklılık gosterebılıyor

bır dıger konu ıse lıspe yenı baslayan arkadaslar ıcın yazdıgım lısplerın yol gosterıcı olmasını ıstıyorum...

herkese kolay gelsın...

11.01.2010 19:32    

ec
Emeğiniz için teşekkürler.

Bu lispi çoklu seçimle de kullanabilecek duruma getirebilir miyiz.
Her blok için ayrı ayrı bu lispi kullanmak yerine tek seferde bu işlemi yapabilir miyiz.
Çalıştığım dosyalarda doğru layerda bulunan bloklar birarada bulunuyor.
Dolayısıyla daha pratik olacağını düşünüyorum.

12.01.2010 08:47    

chico1907
PROHİBT;

HOCAM BENİM GÖNDRMİŞ OLDUGUM EGZANTRİK REDÜKSİYONLA İLGİLİ RESİMİ İNCELEME ŞANSINIZ OLDUMU ACABA?İYİ ÇALIŞMALAR KOLAY GELSİN...

12.01.2010 09:43    

miyatu
Alıntı
ec :
Emeğiniz için teşekkürler.

Bu lispi çoklu seçimle de kullanabilecek duruma getirebilir miyiz.
Her blok için ayrı ayrı bu lispi kullanmak yerine tek seferde bu işlemi yapabilir miyiz.
Çalıştığım dosyalarda doğru layerda bulunan bloklar birarada bulunuyor.
Dolayısıyla daha pratik olacağını düşünüyorum.



Kod:

(defun c:bld()
  (prompt "referans bloklari sec:")
  (setq ref_blok_set (ssget '((0 . "INSERT"))))
  (setq ns (sslength ref_blok_set))
  (while (< 0 ns)
    (setq ref_ad (cdr (assoc 2 (entget (ssname ref_blok_set ns)))))
    (setq ref_layer (cdr (assoc 8 (entget (ssname ref_blok_set ns)))))
    (setq sset (ssget "X" (list (cons 0 "INSERT") (cons 2 ref_ad))))
    (setq ns1 (sslength sset))
    (setq ent1 (ssname sset 0))
    (while (< 0 ns1)
      (setq liste (entget ent1))
      (setq liste (subst (cons 8 ref_layer) (assoc 10 liste) liste ))
      (entmod liste)
      (setq ns1 (- ns1 1))
      (setq ent1 (ssname sset ns1)))
    (setq ns (- ns 1))))


sanirim bu isini gorur test etmedim herhangi bir hata ile karsilasirsan tekrar denerim...

12.01.2010 12:27    

ec
miyatu teşekkür ederim.

ama çalıştıramadım. sanırım bir hata var.

şu şekilde;

Command: BLD
referans bloklari sec:
Select objects: Specify opposite corner: 6 found

Select objects:
error: bad argument type: lentityp nil

Önceki Sayfa [1] [2] [3] [4] [5] [6] [7] [8] [9] > 10 < [15] [20] [25] [30] [35] [40] [45] [50] [55] [60] [65] [70] [75] [80] [85] [90] [95] [100] Sonraki Sayfa
Copyright © 2004-2022 SQL: 1.384 saniye - Sorgu: 103 - Ortalama: 0.01344 saniye