Visual LISP: Yay üzerindeki noktaların kirişe dik izdüşümlerini almak
![]() |
Yazar | Muharrem Koçyiğit |
| Mesleği | Makine Teknikeri | |
| AutoCAD, AutoLISP, Visual LISP | ||
| Prosteel Uzmanı | ||
Tüm Visual Lisp sürümleri
Merhaba arkadaşlar,
Bugünkü konumuz bir okuyucumuzun (Naim Yılmaz bey) AutoCAD günlüğünden istediği yardımı sizlerle paylaşmak istedik. En azından sizlerinde ilginizi çeker diyoruz, ve konuya başlıyoruz. Dikkat ettiyseniz yazdığım her kod’da fonksiyonların ismini ve kullanıcıyla olan irtibatı, mesajları İngilizce olarak yazmaya özen gösteriyorum. Bu benim ne kadar ‘gâvurlaşdığımın’ göstergesi olarak algılamayın
. Yazdığımız konuların Daily AutoCAD sitesinde ingilizce olarak sunulduğunu sizler de bilmektesiniz. Böylelikle Lisp programları ve burada gösterilen şekiller ek bir iş olmadan uluslararası bir platformda sunulabilir. İngilizceyi bende tam bilmiyorum, aralarında tek tük yanlışlar olabilir.
Arkadaşımızın yazmak istediği program, bir yay (ARC) nesnesini AutoCAD’de bulunuan MEASURE komutuyla eşit aralıklala bölmek (Şekil.1). Gösterilen nesnenin üzerine noktalar (POINT) komut AutoCAD tarafından kendiliğinden dağıtılır. Buraya kadar Naim bey hatasız kendi başına yazabilmiş. Noktaların miktarın nasıl belirlenir ve yaya bağlantılı olan kirişin üzerine dikey çizgiler (90°) nasıl çizilir (Şekil 2.4) sizlere anlatmaya çalışacağım.
Bir Kirişi çizmek için kullanıcıdan başlangıç ve bitiş nokatsı istenilmesie gerek yok. Bunu yayın özelliğinde bulunan vla-get-StartPoint ve vla-get-EndPoint komutuyla öğreniyor ve sp, ep değişkeninde saklıyoruz (Kod.2)
NOT: Sistem değiskeni PDMOE=35 ve PDSIZE=0 (sıfır) ayarını kontrol edin. Noktalar belirgin bir şekilde ekranda gözükmeye bilir.
_MEASURE komutu kullanılmadan önce AutoCAD veritabanına en son aktarılan nesne belirlenilir (utl:entity:get:last) ve o nesneden sonra eklenilen nesneler bir seçim seti olarak (utl:entity:next) fonksiyounda istenilir (Kod.2 mavi oklar).
Kirişin üzerinde kesişen pp noktaları CAL_OrthoProjectPointToLine fonksiyonu sayesinde (Kod.3) öğrenebilirsiniz (Kırmızı, kalın olarak yazılan fonksiyonlar
“KM-Lib.VLX” kütüphanesinde bulunmakta ve matematiksel işlemler bulundurmakta).
Ondan sonrası basit, vla-AddLine komutuyla dikey çizgiler oluşturulur.
![]() |
![]() |
| Şekil 1 - Ekranda herhangi bir yayı gösterin (ARC nesnesi) |
Şekil 2 - _MEASURE komutuyla oluşturulan sabit aralıklı noktalar (POINT) ve yaya baglantılı bir kiriş. |
![]() |
![]() |
| Şekil 3 - Noktanın merkezi px‘den kirişe dikey çizgiler oluşturuyoruz. Kesiş noktası pp‘yi hesaplamak bu işin püf noktası !!! |
Şekil 4 - Program en son buna benzer bir görüntü sunar. İşimize yaramayan POINT nesneleri silinmiş bulunmakta. |
Command: KM_Measure
>> Makro: "KM_Measure" programed by M. Koçyiğit
>> Please select ARC to measure:(Eşit aralıklara bölmek istediğiniz yayı (ARC) seçin)
>> Specify length of segment <5>: 10(hangi büyüklükte bölmek
istediğinizi bir sayı olarak girin )
>> 13 POINTS are exist ....
Ana Fonksiyon C:KM_Measure kullanıcıdan bir yayın (ARC) seçilmesini ister (Kod.1) ve alt fonksiyon olan Mea-Execute‘ye iletir (Kod.2). Her Ana fonksiyonda olduğu gibi burdada bir *Error* fonksiyonunu bulunduğunu AutoCAD’e belirtildi. Olabilecek herhangi bir hatayı Mea-Error alt fonksiyonu bizlere bildirir.
![]() |
Kod.1 - Ana (main) Fonksiyon “C:KM_MEASURE“ |
![]() |
Kod.2 - Alt Fonksiyon “Mea-Execute“ |
![]() |
Kod.3 - Alt Fonksiyon “Mea-Draw-Each-Point“ |
Mea-GetCurrentSpace fonksiyonun görevi Kod.4) kullanıcının bulunduğu çizim alanını belirlemek. Sizlerinde bildiği Model (Modelspace) alanından hariç birde Layout (Paperspace) alanı (Pafta) bulunmakta. AutoCAD’ın birde multi document yani birden çok dosya açma özelliğine sahip olduğunu katarsak bu işlemin ne kadar gerekli olduğunu anlarız. Aksi taktirde VisualLISP istediğiniz nesneyi başka yere çizer. Fonksiyonumuz geri dönüş değeri (return value) VLA-OBJECT olarak verir.
Örnek olarak sunacak olursak:
#<VLA-OBJECT IAcadModelSpace2 0ea1dabc> (Modelspace)
#<VLA-OBJECT IAcadPaperSpace2 0e708e64> (Paperspace)
![]() |
Kod.4 - Alt Fonksiyon “Mea-GetCurrentSpace“ |
Programda kullanılan Visual-Lisp komutları:
vl-load-com
vlax-get-ACAD-Object
vla-get-ActiveDocument
vla-get-ActiveSpace
vla-get-ModelSpace
vla-get-PaperSpace
vlax-ename->vla-object, vlax-vla-object->ename
vla-get-ObjectName
vla-AddLine
vla-get-Coordinates, vlax-3d-point
vla-get-StartPoint, vla-get-EndPoint
vl-CmdF
Kolay gelsin
(Sorularınızı, yorumlarınızı bekliyoruz!)
İlgili Dosyalar: Measure.rar
Technorati Tags: AutoCAD, Visual LISP, measure
İlgili Yazılar: AutoLISP dersi
Rastgele bir yazı










3 April 2007, Tuesday 8:56
Eline sağlık abi sen bu işi biliyosun
3 April 2007, Tuesday 9:49
teşekkürler.
anlatım güzel olmuş.
merak ettim
resimleri hangi programla düzenlediniz?
kodları resim olarak vermişsiniz kopyalamasınlar diye mi?
3 April 2007, Tuesday 15:45
Begendiğinize sevindim, yorumlarınız için ikinizede teşekkür ederim.
Snagit programıyla güzel calışmalar elde etmek mümkün (http://www.techsmith.com/download/trials.asp)
Lisp kodunu görmek için linke tıklamanız yeterli –>
(İlgili Dosyalar: Measure.rar)
Not: Genelde gizli tutmak istediğim islemleri (alt fonksiyonları) .VLX ekinde bulunan Kütüphanelerde bulunduruyorum.
22 September 2007, Saturday 0:38
Muharrem ağabey ellerine sağlık, çok güzel hazırlamışsın. Ben de şu sıralar AutoLISP e merak saldım