05.01.2012 14:20    

poli
merhaba arkadaşlar,
Benim ihtiyacım olan şey şu bir kare dikdortgen yada 3 gen altıgen yedı gen farketmez bu uzayıp gıdebılırde kapalı olan alan düşünün bu alanın içine bir eleman eklediğimde benim o alanın layer ı neyse o da o layırı alsın mesela bir 5 gen olan alanımız olsun layerıde oda 1 olsun ben bu 5 gen alanın içine bir blok eklediğimde oda 1 layerına taşımış olsun bu mümkün mü arkadaşlar...

06.01.2012 07:10    

ehya
Bu isteğinizin lisp ile alakası yok. Blok kapalı alana girdiğinde otomatik olarak katmanınn değişmesi için programın kendisinde ekleme yapılmalı. Lisp ile olacak birşey değil...

06.01.2012 08:10    

admin
AutoCAD'in alan ve bölge algılamalarını boundary ve presspull komutlarından iyi bilirim. O kadar uğraştırırki beni çoğu zaman çileden çıkarır. O yüzden böyle bir olayın sağlıklı işlemesi mevcut motorla olasılık dahilinde değil bence. Müşteri isteklerini dinleyip uygulamaya çalışıyorlar zaman zaman belki bu yönde çok talep gelirse ilerde üstünde çalışabilirler.

06.01.2012 08:18    

poli
evet arkadaşlar sizlere çok teşekür ederim yardımlarınız için AutoCAD in bu problemi haletmesi dileğiyle gerçi problem değil ama çok iyi bir yardımcı olur proje aşamasında...

12.01.2012 14:29    

ProhibiT
Bu başlık altında yazılanları ilk günden okumuştum, bir kaç defa cevap yazıp sildim açıkçası. Mehmet hocamın, Aydın hocamın içten mesajlarını da okuyunca, bu konuya bir cevap yazmak şart oldu benim için. 5 gün düşündüm, bu gün yazdım:)

Yazdığım fonksiyon, poli arkadaşımızın isteğini de karşılar diye düşünüyorum. Şu farkla ki, doğrudan alan içine block insert etmek yerine, başka bir yerde insert edilmiş block alan içine taşındığında layer değiştirilebiliyor.

Object Reactor'lerin kendi ayağına basıp tökezlemesi konusuna ilginç bir çözüm buldum sanırım. İki Command Reactor'ün arasına Object Reactor'ü kafes içine aldım. Yazar arkadaşlara yeni ufuklar açabileceği düşüncesiyle açık kod paylaşıyorum. İlgi duyan arkadaşlara detayları ayrıca anlatabilirim.

Önce Fonksiyonun kullanımını anlatan videoyu izlemenizi tavsiye ederim.
174410-falcon.mpg

Sonrada Fonksiyonumuz.
Kod:

;|===========================================================================|
|  Çizim alanının belli bir bölgesini tanımlamak üzere belirlenen PoLyLine  |
|  içine move edilen objelerin Layer'larını ilgili PoLyLine'ın Layer'ına    |
|  çevirir. Reactor'leri devreden çıkarmak için cLr girilmelidir.           |
|         Hazırlayan: M. Şahin Güvercin  13/01/2012   www.autocadokulu.com  |
|___________________________________________________________________________|;
(write-line "Hazırlayan: M. Şahin Güvercin - www.autocadokulu.com")
;|===========================================================================|
|  *** Reactor Temizleme Fonksiyonu ***                                     |
|___________________________________________________________________________|;
(defun c:cLr () (mapcar 'vlr-remove-all '(:VLR-Object-reactor))
  (mapcar 'vlr-remove-all '(:vlr-command-reactor))
  (princ "\n >FaLcon Reactor< Kaldırıldı.")(prin1))
;|===========================================================================|
|  *** Command Reactor - commandWiLLStart Fonksiyonu ***                    |;
(defun WiLLStart (Tetikci TetikLenen /) (setq fLag nil))
;|===========================================================================|
|  *** Object Reactor Fonksiyonu ***                                        |
|___________________________________________________________________________|;
(defun ChToZnLyr (Tetikci TetikLenen eData /)
  (if Tetikci (setq PvT Tetikci fLag T)))
;|===========================================================================|
|  *** Command Reactor - commandEnded Fonksiyonu   ***                      |
|___________________________________________________________________________|;
(defun Ended (Tetikci TetikLenen / StPt xLn m BnD SoLNkt SagNkt)
  (if fLag (progn
      (vla-getboundingbox PvT 'StPt 'EnPt)
      (setq StPt (vlax-safearray->list StPt))
      (entmake (list '(0 . "XLine") '(100 . "AcDbEntity") '(100 . "AcDbXline")
                     (cons 10 StPt) '(11 1.0 0 0)))
      (setq xLn (vlax-ename->vla-object (entlast)) m (sslength BlgSnrObjlr))
      (while (> (setq m (1- m)) -1)
        (setq BnD (vlax-ename->vla-object (ssname BlgSnrObjlr m)))
        (if (not (vlax-erased-p BnD)) (progn
            (setq ints (vlax-variant-value (vla-intersectwith xLn BnD 0)))
            (if (> (vlax-safearray-get-u-bound ints 1) 2)
              (setq ints (vlax-safearray->list ints)) (setq ints nil))
            (if ints (progn (setq SoLNkt nil SagNkt nil o -3)
                (while (< (setq o (+ o 3)) (length ints))
                  (if (<= (nth o ints) (car StPt))
                    (setq SoLNkt T) (setq SagNkt T)))
                (if (and SoLNkt SagNkt) (progn
                  (vlax-put-property PvT 'Layer (vlax-get-property BnD 'Layer))
                    (setq fLag nil m 0) (princ ">FaLcon Reactor<"))
                  (progn (vlax-put-property PvT 'Layer (getvar "CLayer"))
                    (princ ">FaLcon Reactor<"))))))))
      (vla-erase xLn))))
;|===========================================================================|
|  *** Bölge Sınırlarını Belirleme ve Reactor atama (Ana Fonksiyon) ***     |
|___________________________________________________________________________|;
(defun c:FaLcon (/ *error* n Tetikciler)
  (setvar "cmdecho" 0) (command "_.undo" "group") (vl-load-com)
  (defun *error* (er) (command "_.undo" "e") (princ (strcat "\n" er)))
  (princ "\nBölgeleri tanımlayan PoLyLine objelerini seçiniz: ")
  (setq BlgSnrObjlr (ssget (list '(0 . "LwPoLyLine") '(70 . 1)))
        TetikciLer  (ssget "x" (list '(-4 . "<NOT")     '(-4 . "<OR")
            '(0 . "3DSOLID")   '(0 . "REGION") '(0 . "SECTION")   '(0 . "MESH")
            '(-4 . "OR>")      '(-4 . "NOT>"))) n (sslength BlgSnrObjlr))
  (while (> (setq n (1- n)) -1) (ssdel (ssname BlgSnrObjlr n) TetikciLer))
  (setq n (sslength TetikciLer))
  (while (> (setq n (1- n)) -1)
    (vlr-object-reactor (list (vlax-ename->vla-object (ssname TetikciLer n)))
      "Layer Reactor" '((:vlr-modified . ChToZnLyr))))
  (vlr-command-reactor nil
    '((:vlr-commandwillstart . WillStart) (:vlr-commandEnded . Ended)))
  (command "_.undo" "e") (princ "\n >FaLcon Reactor< Etkin.") (prin1))
;|___________________________________________________________________________|;
(princ "\n*** >FaLcon Reactor< ü başlatmak için FaLcon      ***")
(princ "\n*** >FaLcon Reactor< den çıkmak için cLr giriniz. ***")(prin1)


Herkese Kolay Gelsin.

ProhibiT (17.02.2021 11:21 GMT)

12.01.2012 14:47    

ehya
hocam büyüksün :)
söyleyecek başka birşey bulamıyorum :yes

12.01.2012 15:37    

admin
Üstad muhteşem bir iş çıkarmışsın, tebrik ediyorum.
Programlamayı bırakalı 5 yıl oldu neredeyse, beni programlamaya yeniden döndüreceksiniz bu gidişle. :)

12.01.2012 17:51    

ProhibiT
Mehmet hocam, Aydın hocam teşekkür ederim. :) Ben yalnızca bir örnek yazdım. Object Reactor kullanımındaki temel problemlerden birinin çözümünü örnekledim. Benzer mantıkla yazılacak o kadar çok şey var ki...

13.01.2012 07:22    

bonamir
Şahin agbim vediğin bilgiler ve destek sayesinde Autocad de açık olan yerler doluyor.

Silidir ölçülendirmesi benim her gün işime en az yarım saat kazandırıyor ve sıkıcı bir işten kurtardı.

Mükemmelsin gerçekten, Allah razı olsun.

-- Ben senden bişeyler daha rica edeceğim yukarıdaki lisp benim yapmak istediğim ile aynı dene bilecek noktada, ben bir küpte left yazan yere layer seçmeden direk bir blok koyduğumda left layerine gitsin veya top yüzeyine bir blok koyduğumda hemen kendi mevcut yüzeyin layerini alsın dileğim var ama yapamadım ayarlardan.

--Birde silindir çalıştığım için bu silindirlerin eğikliğini yandan bakarak ve açı ölçerle ölçerek yapıyorum.Çok fazla eğik silindir olunca hatada artıyor uğraşta ben bunun formülünü hesapladım.Seninle yaplaşayım. Örnek: Bir silindir 200 boyunda 30 ° eğik bunun eğiğini şu şekilde hesaplıyorum. Üstten bakınca silindirin başlangıç noktası ile bitiş noktası arasını ölçüyorum 100 geliyor.Bende 100/200=0.5 buluyorum.Dik açıların sinüsü sıtandar 60 ° ye eşittir. Yani 100/200=0.5 * 60 =30 dereceyi böyle buluyorum.Buda çok dolaylı bir yol benim için .

Anlatamadığım kısımlar için resim isteyen olursa yollarım.
Burada bu isteklere sesiz kalmayan herkese teşekkürler saygılar.

İstediğim zor bişeyde olabilir yapılmıyorda olabilir.Ben benim için uzun vadede çok kayıp ve hatalara sebep olan açıklarımı yazdım.

13.01.2012 15:38    

ProhibiT
-- ilk sorunuzda, 3DOsnap benzeri bir mantıkla Kübün hangi yüzeyi olduğu algılanacak, ilgili yüzeye göre Layer ataması yapılacak. Left ve Top'tan bahsetmişsiniz ama, bottom, right, front ve de back olmak üzere 6 yüzeyimiz var. Olmaz diye bir şey yok, uğraşmak lazım. Uğraşılacak konunun da kişiye özel olmaması, genel amaçlı olması gerekiyor.

-- ikinci sorunuzda aynı şekilde, olabilir ama ciddi uğraşmak gerek.

Bu arada, açının sinüsü ° olmaz. Eğim: yükseklik/mesafedir. Bunu karşı dik kenar / komşu dik kenar diye de ifade edebiliriz. Yani Tanjant.

Eğim konusunda, 1'e 1 yani 1/1 yani %100 yani 1 değeri zaten 45° dir. Bu bağıntı bile sizi yanıltmasın, 0.5 eğimin açısı 22.5° de değildir.

Belli bir eğimi (örneğinizde 0.5) açı cinsinden hesaplamak için, ArcTanjant fonksiyonu kullanılır. AutoCAD komut satırından (ATan 0.5) girmeniz yeterli. Sonuç 0.463648 Radyan. Bunu derece cinsinden isterseniz, (/ (* (ATan 0.5) 180) pi) girerseniz, 26.5651 bulursunuz. Yani Eğim 0.5 olunca açı 30° veya 22.5° olmuyor 26.5651° oluyor.

17.01.2012 09:15    

ProhibiT
AutoLisp ile ilgilenen arkadaşlarımızın ilgisini çekebilir düşüncesiyle, burada paylaştığım fonksiyonda kullandığım algoritmalardan birinin detaylarından bahsetmek istiyorum. Bir noktanın kapalı bir alan içinde veya dışında olduğunun kontrolü konusunda bir algoritma.

Söz konusu noktadan geçen ve X eksenine paralel (geçici olarak oluşturulan) XLine ile Kapalı alan sınırlarını belirleyen Objenin intersection'ları aranır. İki objenin tüm intersection'larının bulmak için (vla-interserctwith Object1 Object2 0) kullanılır.
- Hiç bir intersection yok ise nokta alanın dışındadır.
- 2 veya daha fazla intersection var fakat bu intersection noktalarının X koordinatlarının tümü noktanın X koordinatından Büyük ya da Küçük ise nokta gene alanın dışındadır.
- 2 veya daha fazla intersection var ve bunlardan bazılarının X koordinatları nokta X koordinatından küçük, bazıları da büyük ise nokta alan içindedir.

Şekil üzerinden takip edersek...





- P1 ve P2 noktalarından geçen (X eksenine paralel) XLine ile alan sınırlarını belirleyen objenin intersection noktası yok. Bu durumda P1 ve P2 noktaları alan dışındadır.

- P3 noktasından geçen XLine ile Alan sınırlarını belirleyen objenin 2 tane intersection noktası olmakla birlikte, her ikisinin de X koordinatı P3'ün X koordinatı olan X3 ten büyük olduğundan P3 noktası alan dışındadır.

- P4 noktasından geçen XLine ile Alan sınırlarını belirleyen objenin 2 tane intersection noktası olmakla birlikte, her ikisinin de X koordinatı P4'ün X koordinatı olan X4 ten küçük olduğundan P4 noktası alan dışındadır.

- P5 nokatsından geçen XLine ie Alan sınırlarını belirleyen objenin 2 tane intersection noktası var ve bunlardan birinin X koordinatı x5'ten büyük, diğeri ise küçük olduğuna göre P5 noktası alan içindedir.

Algoritmanın kod içinde nasıl kullanıldığı yukarıdaki FaLcon fonksiyonunda takip edilebilir.
Burada özel bir durumdan bahsetmek gerek. Alan sınırlarını belirleyen objede iç bükeylikler (dar körfezler) var ise, Algoritma hatalı sonuç verebilir.

Kolay gelsin...

ProhibiT (03.02.2013 10:11 GMT)

17.01.2012 13:16    

ehya
hocam çok güzel bir bilgi.. teşekkürler :yes

23.01.2012 10:48    

poli
Tek kelimeyle harika olmuş ellerinize sağlık....

23.01.2012 11:21    

ProhibiT
Objelerin tekil olarak move edilmesi gerekiyor. Bilmiyorum önemli bir eksik sayılır mı? İhtiyaç duyanlar Çoklu Move için uyarlayabilir herhalde :)

27.01.2012 08:04    

bonamir
Herkese selamlar...

Şahin agbi şimdi benim çizimlerim katı model çizimler. Benim bu çizimi Solidworks veya Invertorde yapma olasılığım var ancak süre konusunda onlar bana yardımcı değil..

Autocad in çok büyük avantajları var.Birkere komut satırı var istediğin blok hemn geliyor ki bizim kütüphanemiz çok geniş, bizim yaptığımız işte günde 3 tane ortalama çizim bitiyor imalata veriyoruz.

Ben Autocadde zaman kaybettiğimiz çok büyük bir konuyu sayende atlattım.Silindirleri otomatik ölçülendiriyorum.

Benim silindirlerin kaç derece eğik olduğunu anlamak için yandan bakmam "Angular" yapmam gerekiyor.Bu hem zaman hemde bir oraya bak sonra başka yere yaz hata oluyor.

Bende üstten bakıp başkangıç ve bitiş noktasını belirliyorum.Çıkan ölçüyü silindirin boyuna bölüp 60 ile çarpıyorum.Dereceyi buluyorum ve doğru oluyor.

Benim böyle bir maduriyetim var.Autocad i sayende otomasyona ulaştırdım :)Saygılar.

Yardımcı olsanda olmasanda Allah razı olsun iyilik sever insanlardan.

27.01.2012 14:39    

poli
arkadaşlar işlem poliline kare dikdörgen olunca işliyor yamuk ta işlemiyor

20.06.2012 08:12    

ProhibiT
poli arkadaşımızın mesajını epeyce geç gördüm, üzgünüm. Fonksyion her tür PoLyLine için çalışır, bahsettiğiniz yamuk için de çalışıyor. Hataya sebep olabilecek tek istisnai durumu

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

linkinde algoritmayı açıkladığım mesajımda yazmıştım.

Hazır konuya bakmışken, fonksiyonda bir değişiklik yaptım. Bundan önceki halinde, Tanımlı alanların içine move edilen objeler alan sınırlarının Layer'ına çevriliyor, tanımlı alanların dışına sürüklenen objelerde bir işlem yapılmıyordu. Tanımlı alanların dışına move edilen objelerin Layer'ını Current Layer olarak değiştirecek şekilde düzenledim. Bu hali daha anlamlı oldu.

> 1 <
Copyright © 2004-2022 SQL: 1.976 saniye - Sorgu: 96 - Ortalama: 0.02058 saniye