06.12.2010 11:14    

cngzklc
Arkadaşlar merhaba.
Polyline bir yapılmış bir objeyi seçip List yaptığımda, bana bu objenin alanını (area) ve çevre uzunluğu (perimeter) mm cinsinden gösteriyor.
Benim istediğim seçtiğim polyline'nın ağırlığını almak istiyorum
Ağırlığını almak istediğim malzeme çelik. Yani özgül ağırlığı = 7.85

Formül: area*7.85*kesit*0.000001 = Kg cinsinden ağırlık

Lisp in adı "Kg" olsun.

Lisp'in çalışması;
"Kg" - Enter'a bas
"Objeyi seçiniz" mesajı çıkacak ve polyline objeyi seçip enter'a basacağız.
"Kesit giriniz" mesajı çıkacak ve örneğin biz 20 değerini girip enter'a bastığımızda bize command satırında objenin ağırlığını gösterecek.

Yardımcı olabilirmisiniz.

06.12.2010 12:37    

ProhibiT
Kod:

;;;===========================================;;;
;;;   M. Şahin Güvercin 06/12/2010 - Ankara   ;;;
;;;===========================================;;;
(defun c:Kg (/ ThcK ObjT aRea WeighT)
  (setvar "cmdecho" 0) (command "undo" "group")
  (if (= eThcK nil) (setq ethck 10))
  (setq ThcK (getreal (strcat "\nMalzeme Kalınlığı <" (rtos eThcK) ">: ")))
  (if (= ThcK nil) (setq ThcK eThcK) (setq eThcK ThcK))
  (setq ObjT (ssget ":S" (list (cons 0 "*PoLyLine") (cons 70 1))))
  (if (= ObjT nil) (princ "\nSeçtiğiniz Obje Kapalı bir PoLyLine olmalıdır!"))
  (command "_area" "e" (ssname ObjT 0))
  (setq aRea (getvar "area") WeighT (* aRea 7.85 thck 0.000001))
  (princ (strcat "\n  Ağırlık = " (rtos WeighT 2 3) " Kg."))
  (command "undo" "e")
  (prin1)
)

PoLyLine'ın milimetre biriminde çizildiği kabul edildi, ağırlık Kg. olarak yazıldı.

Kolay gelsin.

06.12.2010 12:47    

SENDUR
eline sağlık hocam güzel bir lisp olmuş

bu lisp biraz değiştirsek 7,85 i biz girsek ( o gene hafızada tutsun:)) bide sadece 1 pline nın alanı değilde seçtiğimiz birkaç pline nın alanı toplayıp ağırlıklarını toplam ağırlığı verse ( t= hepsinde aynı) daha kullanışlı olur mu?

06.12.2010 12:51    

cngzklc
Mehmet Abi
Teşekkür ederim. tam istediğim gibi güzel bir çalışma olmuş.
İyi çalışmalar.

06.12.2010 13:01    

ProhibiT
Olabilir elbette... cngzklc arkadaşımızın istediği sınırlar içinde düşündüm ben :)

Lisp yazar arkadaşlarımızın ilgisini ve dikkatini çeker diye düşündüğüm bir mantık kullandım;
(setq ObjT (ssget ":S" (list (cons 0 "*PoLyLine") (cons 70 1))))
satırında, tek bir obje seçiyoruz ":S",
bu objenin PolyLine veya LwPolyLine olmasını (cons 0 "*PoLyLine")
ve kapalı olmasını (cons 70 1) kontrol ediyoruz.
Bu şartları sağlamayan obje seçiminde, hata mesajı ile çıkıyoruz. Çıkışta Exit kullanmadım ve error trap oluşturmadım.

İşine yaramasına sevindim cngzklc :)

Kolay gelsin...

13.12.2010 17:56    

yazgunesi
Arkdaşlar kilo hesabı konusunda aşağıdaki linkteki lispleri de inceleyebilirsiniz.. :-)



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

18.05.2011 14:16    

sisecam
Merhabalar
lisp te sorun yok düz bir plaka için ağırlığı veriyor fakat merak ettiğim
flanş gibi olsa, yada düz bir plaka içinde delik olsa ve ben bunun ağırlığını bulmak istesem hata veriyor!!

örnek verecek olursak 500mm x 500mm t=20mm tam ortasındada ø100 boşluk.. bu plakanın ağırlığını hesaplarken hata alıyorum ..
benim isteğim bu ve bunun gibi mesela flanş gibi nesneleride bolean komutu kullandıktan sonra içindeki alanın ağırlığını bulmak..

şimdiden çok teşekkürler..

çok enteresandır iş yerinde yaptığımda olmamıştı, evde yapıyorum oluyor.. yarın iş yerinde tekrar deneyeceğim ..

sisecam (19.05.2011 16:48 GMT)

19.05.2011 17:34    

ProhibiT
Fonksiyon yukarıdaki haliyle sizin bahsettiğiniz işlemi yapamaz, bir yanlışlık olsa gerek.
fonksiyon tek bir polyline objesi seçer, aksi halde hata verecektir.

bu durumda sizin kullanabileceğiniz 2 alternatif fonksiyon yazdım.

ilkinde ana objenizi ve içindeki boşlukları seçerek hepsini region haline getirdikten sonra, subtract komutunu kullanarak, dolu region'dan boşluk region(lar)'ı çıkarırsanız elde ettiğiniz region objesini aşağıdaki fonksiyon ile kullanabilirsiniz.
Kod:

;;;===========================================;;;
;;;   M. Şahin Güvercin 19/05/2011 - Ankara   ;;;
;;;===========================================;;;
(defun c:Kg (/ ThcK ObjT aRea WeighT)
  (setvar "cmdecho" 0) (command "undo" "group")
  (if (= eThcK nil) (setq ethck 10))
  (setq ThcK (getreal (strcat "\nMalzeme Kalınlığı <" (rtos eThcK) ">: ")))
  (if (= ThcK nil) (setq ThcK eThcK) (setq eThcK ThcK))
  (setq ObjT (ssget ":S" (list (cons 0 "Region") (cons 70 1))))
  (if ObjT (progn (command "_area" "e" (ssname ObjT 0))
      (setq aRea (getvar "area") WeighT (* aRea 7.85 thck 0.000001))
      (princ (strcat "\n  Ağırlık = " (rtos WeighT 2 3) " Kg."))
      (command "undo" "e"))
    (princ "\nSeçtiğiniz Obje Region olmalıdır!"))
  (command "undo" "e") (prin1)
)


Diğer bir alternatif ise, önce ana objeyi seçtikten sonra, ayrıca boşluk obje(leri) seçebileceğiniz şekilde düzenlenmiş fonksiyon:
Kod:

;;;===========================================;;;
;;;   M. şahin güvercin 19/05/2011 - ankara   ;;;
;;;===========================================;;;
(defun c:kg (/ thck objt area weight)
  (setvar "cmdecho" 0) (command "undo" "group")
  (if (= ethck nil) (setq ethck 10))
  (setq thck (getreal (strcat "\nmalzeme kalınlığı <" (rtos ethck) ">: ")))
  (if (= thck nil) (setq thck ethck) (setq ethck thck))
  (princ "\ndolu objeyi seçiniz:")
  (setq objt0 (ssname (ssget ":s") 0))
  (command "_.Area" "e" objt0) (setq darea (getvar "area"))
  (princ "\nboşluk objelerini seçiniz:")
  (setq objt1 (ssget) l (sslength objt1) n -1 barea 0)
  (while (< (setq n (1+ n)) l)
    (command "_.Area" "e" (ssname objt1 n))
    (setq barea (+ barea (getvar "area"))))
  (setq weight (* (- darea barea) 7.85 thck 0.000001))
  (princ (strcat "\n  ağırlık = " (rtos weight 2 3) " kg."))
  (command "undo" "e") (prin1)
)


Kolay gelsin.

ProhibiT (20.05.2011 08:37 GMT)

20.05.2011 07:03    

sisecam
Öncelikle cevap verdiğiniz için teşekkürler..

enteresandır ki "fonksiyon yukarıdaki haliyle sizin bahsettiğiniz işlemi yapamaz, bir yanlışlık olsa gerek.
fonksiyon tek bir polyline objesi seçer, aksi halde hata verecektir." demişsiniz ama evde 2012 kullanıyorum boşlukları da hesapladı .. ama iş yerinde 2010 kullanıyoruz boşlukları hesaplamıyor ) dediğiniz gibi hata veriyor.

2. alternatif olan önce dolu obje ardından boş obje mantıklı geldi..
ama aşağıdaki hatayı alıyorum..

command:
kg
malzeme kalınlığı <10>:
dolu objeyi seçiniz:
select objects:
boşluk objelerini seçiniz:
select objects: 1 found
select objects:
unknown command "kg". press f1 for help.
ağırlık = 0.758 kg.

sanırım kontrol etme imkanınız olmadı :) ben denedim hata verdikten sonra ağırlık yazmış doğrumudur dedim..
mesela bi dikdörtgen çizip içinde 2 daire çizince sonuç 0.758 kg.
bi dikdörtgen çizip içinde 1 daire çizince sonuç 0.758 kg. gene aynı.. hata mesajından kaynaklanıyor sanırım.


birde bu koda kullanım açısından bi revizyon yapmamız mümkün müdür?
objenin içinde boşluk varsa önce dolu obje ardından boşluk seçip ağırlık bulduk.. fakat objede boşluk yoksa hata alıyorum.. yani tek lisp ile dolu objeyi de boşluk olan objeyi de halletsek

20.05.2011 08:47    

ProhibiT
Bahsettiğimiz alternatif fonksiyonu yazarken basit bir hata yapmışım, command object beklerken selection set aldığı için hata veriyor. yukarıdaki mesajımı düzenleyip hatalı fonksiyonu düzelttim, tekrar alıp kullanabilirsiniz. bu arada, alternatif fonksiyonda, gerek dolu objede, gerekse boşluk objelerinde, bir tek polyline ile sınırlamadım, istediğiniz tür obje mesela circle, ellipse veya spline objelerini de seçebilirsiniz.

Yukarıdaki mesajımı düzenledikten sonra sizin düzenlemenizi gördüm:
Kod:

;;;===========================================;;;
;;;   M. Şahin güvercin 19/05/2011 - ankara   ;;;
;;;===========================================;;;
(defun c:kg (/ thck objt area weight)
  (setvar "cmdecho" 0) (command "undo" "group")
  (if (= ethck nil) (setq ethck 10))
  (setq thck (getreal (strcat "\nmalzeme kalınlığı <" (rtos ethck) ">: ")))
  (if (= thck nil) (setq thck ethck) (setq ethck thck))
  (princ "\ndolu objeyi seçiniz:")
  (setq objt0 (ssname (ssget ":s") 0))
  (command "_.Area" "e" objt0)
  (setq darea (getvar "area") barea 0)
  (princ "\nboşluk objelerini seçiniz:")
  (if (setq objt1 (ssget))
    (progn
      (setq L (sslength objt1) n -1)
      (while (< (setq n (1+ n)) L)
        (command "_.Area" "e" (ssname objt1 n))
        (setq barea (+ barea (getvar "area"))))))
  (setq weight (* (- darea barea) 7.85 thck 0.000001))
  (princ (strcat "\n  ağırlık = " (rtos weight 2 3) " kg."))
  (command "undo" "e") (prin1)
)
Bu haliyle, hem boşluklu hem de boşluksuz işlem yapacaktır. boşluk objelerini seçmeniz istendiğinde enter (veya sağ tuş) ile geçerek, boşluksuz işlem yapabilirsiniz...

kolay gelsin.

ProhibiT (01.07.2011 13:55 GMT)

20.05.2011 11:09    

sisecam
Tek kelime ile tam istediğim gibi ..
harika..
çok teşekkür ederim..
elleriniz dert görmesin..

birde hiç bilmeyen biri olarak bu kodlar da kullanılan dili nasıl öğrenebiliriz.?
bununla ilgili yani defun nedir neye yarar ethck nedir setq nedir.. nasıl kullanılırlar bunları öğrenebileceğim e-book yada siz nasıl öğrendiniz bi yol gösterirseniz çok sevinirim..

iyi çalışmalar.

20.05.2011 18:36    

ProhibiT
Işinizi görmenize sevindim. autolisp öğrenmek için

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

linkindeki ehya hocamızın hazırladığı kitaba göz atarak başlayabilirsiniz. ben nasıl öğrendiğimi anlatmasam daha iyi, ben kötü örneğim :)

kolay gelsin.

21.05.2011 14:23    

sisecam
:)

sizinde nasıl öğrendiğinizi merak ettim şimdi :) ama bahsettiğiniz linkteki ehya hocamın yazdıklarıda başlangıç için iyi geldi bana.. bismillah diyip başlıyorum ..

tekrar teşekkürler..
saygılar ..

13.06.2011 06:00    

cngzklc
Mehmet abi (prohibit) merhaba.
bu konuda farklı bir lispe ihtiyacım var. yardımcı olabilirseniz sevinirim.
bir veya birden fazla katı objenin (3d solid) ağırlığını veren lisp'e ihtiyacım var.
formda arama yaptım fakat bulamadım.
lisp'in çalışması aşağıdaki şekilde olsun.
- 3kg "enter"
- objeyi seçiniz
- ağırlık (sonuç)
burada özgül ağırlık yine 7.85

teşekkür ederim.
iyi çalışmalar.

13.06.2011 07:55    

ProhibiT
Merhaba cngzklc, daha önce böyle bir fonksiyon paylaşmıştık;

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

büyük ihtimalle işinizi görecektir.

13.06.2011 11:21    

cngzklc
Mehmet abi ilgilendiğin için teşekkür ederim. fakat aşağıdaki hatayı veriyor.
select a solid:no function definition: dos_massprops

13.06.2011 13:15    

ProhibiT
Söz konusu linkte verdiğim bağlantıdan doslib eklentileri indirilemiyor sanırım. fonksiyonu ve eklentileri mail olarak gönderdim.

28.06.2011 15:09    

SENDUR
Hocam banada yollaya bilirmisin fonksiyonu ve eklentileri. yada buraya ekleyebilir misin?
saygılar

28.06.2011 16:17    

ProhibiT
Profilinizdeki mail adresinize gönderdim.

01.07.2011 11:23    

SENDUR
Hocam özürl diliyerek bir şey isteyebilir miyim?

bu lispi kulanmaya başladığımdan beri hesap makinesi bana küstü :)

;;;===========================================;;;
;;; m. şahin güvercin 19/05/2011 - ankara ;;;
;;;===========================================;;;
(defun c:kg (/ thck objt area weight)
(setvar "cmdecho" 0) (command "undo" "group")
(if (= ethck nil) (setq ethck 10))
(setq thck (getreal (strcat "\nmalzeme kalınlığı <" (rtos ethck) ">: ")))
(if (= thck nil) (setq thck ethck) (setq ethck thck))
(princ "\ndolu objeyi seçiniz:")
(setq objt0 (ssname (ssget ":s") 0))
(command "_.Area" "e" objt0)
(setq darea (getvar "area") barea 0)
(princ "\nboşluk objelerini seçiniz:")
(if (setq objt1 (ssget))
(progn
(setq l (sslength objt1) n -1)
(while (< (setq n (1+ n)) l)
(command "_.Area" "e" (ssname objt1 n))
(setq barea (+ barea (getvar "area"))))))
(setq weight (* (- darea barea) 7.85 thck 0.000001))
(princ (strcat "\n ağırlık = " (rtos weight 2 3) " kg."))
(command "undo" "e") (prin1)
)

belki biraz lispi değiştirsek (benim için ) daha kullanışlı olacak.
sizden isteğim ilk objeyi seçtikten sonra direk çıkarılacak objeleri seçmemizi istiyor ve sadece bir obje (kapalı pl,region ) seçmemize izin veriyor. hesaplanacak olan alan için birden fazla obje seçbilsek ve enter dediğimizde çıkarılacak objeleri seçsek çok daha kulanışlı olur ( benim için).

saygılar

ProhibiT (01.07.2011 13:51 GMT)

Copyright © 2004-2022 SQL: 1.915 saniye - Sorgu: 99 - Ortalama: 0.01935 saniye