02.05.2012 14:36    

onderyener
Otomatik alan ve çevre ölçüsü hesaplayıp yazma: Seçilen LwPolyline objelerinin alanı ve çevresi geometrik merkezine Field olarak yazılır

Elimde bir projede yaklaşık 5000 adet polyline var. Bunların hepsinin alanı ve çevresini yazdırmam lazım. Sadece alanı yazıdran bir lisp buldum ama ayrı ayrı alan ve çevrelerini hesaplayıp ortalarına yazdıracak bir lisp var mı acaba?

Teşekkürler

admin (25.09.2017 20:01 GMT)

03.05.2012 06:40    

ProhibiT
Kod:

;|===========================================================================|;
;| pLaC: PoLyLine ALan Çevre                                                 |;
;| Seçilen LwPolyline objelerinin Alanı ve Çevresi, geometrik merkezine,     |;
;| Field olarak yazılır. Yazı Yüksekliği olarak TextSize, ondalık basamak    |;
;| sayısı olarak Luprec değişkenlerinin değeri alınır.                       |;
;|          Hayırlayan: M. Şahin Güvercin - www.autocadokulu.com             |;
;|---------------------------------------------------------------------------|;
(defun c:pLaC (/ *error* pLns Fob n PvT vLo oID x y z PnT m TxH pR pA pC)
  (setvar "cmdecho" 0) (command "_.undo" "group") (vl-load-com)
  (defun *error* (/ er) (princ (strcat "\n" er)) (command "_.undo" "e")(prin1))
  (if (not oFc) (setq oFc 1))
  (setq FaC (getreal (strcat "\nÇizim Birimi/Hesap Birimi <"(rtos oFc)">: ")))
  (if (not FaC) (setq Fac oFc) (setq oFc FaC))
  (princ "\nAlanı ve Çevresi yazılacak LwPolyline objelerini seçiniz: ")
  (setq pLns (ssget (list (cons 0 "LwPoLyLine")))
        Fob (ssadd) n (sslength pLns))
  (while (not (minusp (setq n (1- n))))
    (setq PvT (ssname pLns n) vLo (vlax-ename->vla-object PvT)
          oID (itoa (vla-get-ObjectID vLo)) x 0 y 0 z (getvar "elevation")
          PnT (vlax-safearray->list (vlax-variant-value
                (vlax-get-property vLo 'Coordinates))) m (length PnT))
    (while (not (minusp (setq m (- m 2))))
      (setq x (+ x (nth m PnT)) y (+ y (nth (1+ m) PnT))))
    (setq x (/ x (/ (length PnT) 2)) y (/ y (/ (length PnT) 2))
          TxH (getvar "TextSize") pR (getvar "Luprec")
          pA (polar (list x y z) (/ pi 2.0) (* 0.833333 TxH))
          pC (polar (list x y z) (* pi 1.5) (* 0.833333 TxH)))
    (entmake (list (cons 0 "Text") (cons 10 pA) (cons 40 TxH)
                   (cons 1 (strcat "%<\\AcObjProp Object(%<\\_ObjId " oID
                                   ">%).Area \\f \"%lu2%pr" (itoa pR)
                                   "%ps[A=,]%ct8["(rtos(* FaC FaC)2 8)"]\">%"))
                 (cons 50 0.0) (cons 72 1) (cons 11 pA))) (ssadd (entlast) Fob)
    (entmake (list (cons 0 "Text") (cons 10 pC) (cons 40 TxH)
                   (cons 1 (strcat "%<\\AcObjProp.16.2 Object(%<\\_ObjId " oID
                                   ">%).Length \\f \"%lu2%pr" (itoa pR)
                                   "%ps[C=,]%ct8[" (rtos FaC 2 8) "]\">%"))
                (cons 50 0.0) (cons 72 1) (cons 11 pC))) (ssadd (entlast) Fob))
  (command "_.UpdateFieLd" Fob "") (command "_.undo" "e") (prin1))

ProhibiT (15.06.2012 19:24 GMT)

03.05.2012 13:10    

onderyener
teşekkür ederim çok işime yaradı

15.06.2012 08:33    

slayerist
Merhabalar,

Bugün araştırırken kodu yine bu sitede buldum.
Bulunan alan ve çevre santimetre/santimetrekare cinsinden yazdırılıyor.
m2/mtül ve yüzde basamaklı olaarak yazdırmak için örn: 5,36 m2 8,08 mtül için yardımcı olabilir misiniz?

Şimdiden teşekkür ederim
Saygılar,

15.06.2012 10:27    

ProhibiT
Kod'un başlangıcındaki Comment satırlarında açıklandığı gibi; Bu fonksiyon santimetre ya da metre gibi birimlerle ilgilenmez. Yazı Yüksekliği ve Ondalık basamak sayısının nasıl kontrol edileceği, zaten açıklanmış.

Bahsettiğiniz gibi santimetre/santimetrekare gibi bir değer hesaplamaz yazdırmaz. Fonksiyon "Drawing Unit" ve "Drawing Unit Kare" birimlerinde değerleri hesaplar ve field'lere atar. Bunun içindir ki, yanına bir birim yazdırmadık.

Doğru soru; "Santimetre biriminde çizdim, metre biriminde yazdırmak istiyorum." şeklinde olmalıydı.
Cevap ta; "Fonksiyonun amaçları arasında böyle birim transformasyonu yoktur." olurdu.

Milimetre çizip, sonuçları dekametre cinsinden almak isteyen bir arkadaşımız çıkarsa, olur ya Kilometre çizip sonuçları desimetre cinsinden, hatta inch/feet çizip metrik birimde, ya da tam tersi sonuç isteyen olursa ne yapacağız. Her özel durum için fonksiyonun yeniden yazılmasını istemek pek insaflı olmaz herhalde. Fonksiyona çizilen ve yazılacak ölçü birimleriyle ilgili sorular ve girdiler eklemek, bunların çevrimiyle ilgili kodları uzatmak ta, böyle basit fonksiyonların amacını aşar herhalde. :)

15.06.2012 12:19    

slayerist
Açıklamalarınız ve bilgilendirmeniz için teşekkür ederim :)

15.06.2012 19:19    

ProhibiT
Bu gün yazdığım mesajı okurken, biraz aceleyle yazdığımı farkettim. Öncelikle bunun için kusuruma bakmayın lutfen. :)
Fonksiyonun koduna bir ilave yaptım, "Cizim Birimi / Hesap Birimi" şeklinde bir orantı girerek, başlangıçta bana uzun bir işlemmiş gibi gelen problemi çözme yoluna gittim. Bu oran sorulduğunda, sizin örneğinizde olduğu gibi Santimetre çizilip sonuçların Metre biriminde yazdırılacağını düşünürsek, 1cm / (1m=100cm) yani 1 / 100 = 0.01 mantığıyla 0.01 girerseniz istediğiniz birimde yazdırmış olacaksınız. Aynı mantığı kullanarak her türlü birim çevirme işlemini yapabilirsiniz. Karışıklığa sebep olmamak için fonksiyonu yeniden yüklemedim, mevcut halini güncelledim. Yukarıdan alıp kullanabilirsiniz.

Kolay gelsin

27.06.2012 08:29    

emelgr
Merhabalar,

Forumda çok yeni olduğumdan eğer acemice bir soru soruyorsam kusuruma bakmayın lütfen ama ben yazdığınız kod üzerinden lisp dosyamı olusturup autocade tanıttım. Fakat bir türlü doğru komutu bulamadım. Listenin sonunda 'command' karsılığında yazan şeyleri değişik kombinasyonlar halinde uygulamama ve forumda geniş çaplı araştırma yapmama rağmen herhangi bir sonuç elde edemedim. nasıl çalıştıracağımı açıklayabilirseniz çok sevinirim. Olası cevap için şimdiden teşekkür ederim.

Kolay gelsin.

27.06.2012 09:11    

Travaci
çalıştırmak için pLaC

27.06.2012 09:45    

mantık85
Merhabalar,
Kod çok işime yaradı benimde, çok teşekkürler. Ama sorum var; alan içine alan ve çevreyi dolgulu yazıyor, bunu değiştirmemiz mümkün müdür? yazı rengi tek tek seçmeden değiştirilebilir mi? teşekkürler.

27.06.2012 10:45    

Travaci
Dolgulu olmasının sebebi yazıların field özelliği olmasındandır yanı alanını çıkardığınız objenın boyutuyla bı oynama yaptıgınızda regen dediğiniz halde yenı alan otomatik olarak yazılacaktır.Bu dolgular çıktıda gözükmüyor, hayır ben hıc gormek ıstemıorum dıosanız komut satırına FIELDDISPLAY enter 0 enter. Yazıları ise toplu halde quick selet komutuyla seçip değiştirebilirsiniz.

27.06.2012 12:35    

emelgr
Mükemmel! Çok teşekkürler.

27.06.2012 14:42    

mantık85
Çok güzel oldu, çok teşekkür ederim

15.03.2013 13:40    

alfaoz
teşekkürler emeği geçenlere...

16.03.2013 09:28    

map23
ilave rica
sayın hocam bu lisp de alanları çeviriyor ve toplamını yazıyor. ilave olarak şunu yapabilirmiyiz acaba.
layer tabakalarına göre ayırıp toplayabilirmi acaba mesela 1 kesitte farklı 5-6 tane kadar değişik alanı istenen kapalı alanlar var bunları tabakalarına göre kayıtlarını yaptıktan sonra tüm alanları seçtiğimizde a tabakasındaki alanları a1 alanları diye bi tabakaya yada a tabakasına oluşturabilirmiyiz.iyi çalışmalar...

16.03.2013 11:24    

map23
İlave rica;
Sayın hocam, bu lisp de alanları çeviriyor ve toplamını yazıyor. İlave olarak şunu yapabilir miyiz acaba?
Layer'larına göre ayırıp toplayabilir mi? Mesela 1 kesitte farklı 5-6 tane kadar değişik alanı istenen kapalı alanlar var bunları tabakalarına göre kayıtlarını yaptıktan sonra tüm alanları seçtiğimizde a tabakasındaki alanları a1 alanları diye bi tabakaya yada a tabakasına oluşturabilir miyiz. İyi çalışmalar.

Merhaba Şahin hocam, yukarıda bahsettiğim olayı bu Lisp içinde uygulanabilir hale getirebilirseniz daha da güzel olur zannımca. Yine sizin ter akıtıp emeğinizi ortaya koyduğunuz çok güzel bir çalışma:

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

ProhibiT (16.03.2013 11:44 GMT)

16.03.2013 11:56    

ProhibiT
Öncelikle sizlerden bir ricam var. Başka bir yerden aldığınız kodları foruma paste etmeyiniz. Bir Fonksiyon koduna atıf yapacaksanız, linkini vermek daha doğru olur. Aksi halde sitemizde kargaşaya sebep oluyoruz. Üstelik code braketi içine almadığınız kodlarda yanlışlıklar oluyor. Bu anlamda mesajınızı düzenlemek zorunda kaldım.

Buna benzer istekleri fonksiyon koduna eklersek, genel olma özelliğini kaybeder. Yazana da eziyet olur. Buna gerek var mı? Fonksiyonu Filter ile kullanarak belli bir Layer'daki objeler seçilebilir. Ya da, başka bir Lisp fonksiyon (mesela SeLLyr gibi) kullanarak istenilen seçimler yapılabilir.

Kolay gelsin.

16.03.2013 13:39    

alfaoz
prohibit hocam bu lisp ile ilgili bir sorum var. Yanlış hatırlamıyorsam daha önce komutu çalıştırdığımda seçtiğim texte göre yazıyı yazıyordu ancak şimdi seçili texti değiştirsem bile hep aynı formatta yapıyor. Belkide ben yanlış bi şeyler yapıyorum. Bu kısmını açıklayabilir misiniz? Komut çalıştırıldığında yazılan yazının karakteristik özelliği (yazı karakteri, yüksekliği gibi) nasıl ayarlanıyor...

16.03.2013 20:54    

ProhibiT
Fonksiyonun başında, "Yazı Yüksekliği olarak TextSize, ondalık basamak sayısı olarak Luprec değişkenlerinin değeri alınır." diye net olarak açıklanmış. O an geçerli Text Style'ın kullanıldığı da zaten belli.

16.03.2013 21:51    

alfaoz
sn prohibit yazılanı okuma ve okuduğumu anlama kabiliyetine sahibim. Benim sorduğum bi sorunla ilgiliydi sizin dediğiniz şekilde olmamasına sebep olan bir sorun ancak ya ben sorunumu net anlatamadım ya da sizde bende olan kabiliyet yok. Bana sorarsanız ben sorunumu net olarak anlattım.

Copyright © 2004-2022 SQL: 1.934 saniye - Sorgu: 101 - Ortalama: 0.01915 saniye