14 Temmuz 2023 Cuma

AutoLisp ile nesne uzunluğunu nesne üzerine yazma

AutoCAD kullanıcıları çizimlerde nesnelerin uzunluğunu sıklıkla hesaplama durumunda kalır. Bu işlemi manuel olarak yapmak zaman alıcı ve hata yapmaya açık olabilir. Neyse ki, AutoLISP programlama dili ile bu sürec otomatikleştirilebilir.

Aşağıdaki AutoLisp kodları, AutoCAD'de bir nesnenin uzunluğunu hesaplayıp ve sonucu bir metin nesnesi olarak çizimim üzerine ekler.

Bu kod parçacığı, kullanıcının seçtiği geçerli bir nesnenin uzunluğunu hesaplar ve bu uzunluğu bir metin nesnesi olarak çizime ekler.

; Nesne uzuluğu, nesne üzerinde bir konuma eklenir
; Seçilebilecek geçerli nesneler:
; LINE, POLYLINE, LWPOLYLINE, ARC, CIRCLE, ELLIPSE, SPLINE

; AutoCAD komut satırından UY ya da UZUNLUKYAZ
; girilerek çalıştırılır.

; Düzenleme: Mesut Akcan
; makcan@gmail.com
; mesutakcan.blogspot.com
; 14/07/2023

(vl-load-com)
(defun c:UY()
	(c:UZUNLUKYAZ)
)
(defun c:UZUNLUKYAZ( / aci bpt cb2 cercevegenisligi
										cerceveyuksekligi cpt ent gr mpt
										pib2 pt1 pt2 pt3 pt4 spt tpt
										uzunluk yazicerceve) 
	(if (and
		; Kullanıcıdan nesne seçimi alınır ve ent değişkenine atanır
		; Nesne seçiliyse
		(setq ent (car (entsel "\nUzunluğu alınacak nesne: ")))
		; VE
		; seçili nesne
		; LINE, POLYLINE, LWPOLYLINE, ARC,
		; CIRCLE, ELLIPSE, SPLINE ise
		(member (cdr (assoc 0 (entget ent)))
				'("LINE" "POLYLINE" "LWPOLYLINE"
				  "ARC" "CIRCLE" "ELLIPSE" "SPLINE"))
		)
		(progn
			(setq
				; Seçilen nesnenin uzunluğu hesaplanır ve uzunluk değişkenine atanır
				uzunluk (rtos (vlax-curve-getDistAtParam ent (vlax-curve-getEndParam ent))) 
				; Metin nesnesini ölçer ve metni çevreleyen çerçevenin köşegen koordinatlarını
				; yaziCerceve değişkenine atanır
				yaziCerceve (textbox (list (cons 1 uzunluk) (cons 40 (getvar "TEXTSIZE"))))
				; Yazı çerçevesi yüksekliği hesaplanır ve cerceveYuksekligi değişkenine atanır
				cerceveYuksekligi (- (cadadr yaziCerceve) (cadar yaziCerceve))
				; Yazı çerçevesi genişliği hesaplanır ve cerceveGenisligi değişkenine atanır
				cerceveGenisligi (- (caadr yaziCerceve) (caar yaziCerceve))
			) 
			(princ "\nYazı konumu") 
			; Kullanıcıdan nokta seçimi istenir
			(while (eq 5 (car (setq gr (grread t 5 0)))) 
				(redraw)
				; Seçilen noktanın bir liste olduğu kontrol edilir. Eğer nokta ise
				(if (listp (setq sPt (cadr gr))) 
					(progn
						(setq
							; Seçilen noktaya en yakın nokta
							cPt (vlax-curve-getClosestPointto ent sPt)
							; İki nokta arasındaki açı
							aci (angle cPt sPt)
							; Başlangıç noktası
							bPt (polar cPt aci (/ (getvar "TEXTSIZE") 2.))
							; Bitiş noktası
							tPt (polar bPt aci cerceveYuksekligi)
							; Orta nokta
							mPt (polar bPt aci (/ cerceveYuksekligi 2.))
							pib2 (/ pi 2.) ; pi/2
							cb2 (/ cerceveGenisligi 2.) ; cerceveGenisligi/2
							; Köşe noktaları
							pt1 (polar bPt (+ aci pib2) cb2)
							pt2 (polar bPt (- aci pib2) cb2)
							pt3 (polar tPt (+ aci pib2) cb2)
							pt4 (polar tPt (- aci pib2) cb2)
						)
						; İşaretleyici vektörler çizilir
						(grvecs (list -3 pt1 pt2 pt3 pt4 pt1 pt3 pt2 pt4))
					)
				)
			)
			(if (eq 3 (car gr)) ; Konum belirlendiyse. Fare ile tıklama 
				(progn
					; açı= açı - 90°
					(setq aci (- aci (/ pi 2.)))
					(cond
						; açı 90 - 180 arası ise açı = açı - 180°
						((and (> aci (/ pi 2.)) (<= aci pi)) (setq aci (- aci pi)))
						; açı 180 - 270 arası ise açı = açı + 180°
						((and (> aci pi) (<= aci (* 1.5 pi))) (setq aci (+ aci pi)))
					)
				  ; Yazı oluşturulur ve çizime eklenir
					(YaziYaz mPt uzunluk aci)
					)
			 )
		)
		; Geçersiz bir nesne seçildiyse
		(princ "\nGeçersiz nesne seçildi !")
	)
	(redraw) ; Çizimi yenile
	(princ)
)

(defun YaziYaz (konum yaziMetni yaziAcisi)
	(entmake
		(list
			(cons 0 "TEXT") ; Nesne türü (Text)
			(cons 8 (getvar "CLAYER")) ; Katman adı
			(cons 62 2) ; Renk indeksi. 2=Sarı renk
			(cons 10 konum) ; Yazı konumu (nokta)
			(cons 40 (getvar "TEXTSIZE")) ; Yazı boyutu
			(cons 1 yaziMetni) ; Yazı içeriği
			(cons 50 yaziAcisi) ; Yazı döndürme açısı
			(cons 7 (getvar "TEXTSTYLE")) ; Yazı stili
			(cons 71 0) ; 71: İç hizalama (0: Sol)
			(cons 72 1) ; 72: Dış hizalama (1: Alt)
			(cons 73 2) ; 73: Hizalama tipi (2: Ortala)
			(cons 11 konum) ; 11: İkinci nokta (hizalama için kullanılır)
		)
	)
)

İşleyişi:

  1. Kullanıcıdan bir nesne seçimi alınır ve seçilen nesne doğruluk kontrolü yapılır.
  2. Eğer seçilen nesne geçerli bir nesne ise, uzunluğu hesaplanır ve bir metin nesnesi oluşturulur.
  3. Metin nesnesinin konumu kullanıcıdan alınır.
  4. Metin nesnesi çizime eklenir ve kullanıcıya sonuç gösterilir.

Kullanımı:

Kodları kopyalayıp uzunlukyaz.lsp adında metin dosyasına ekleyip kaydediniz.

AutoLisp dosyayı AutoCAD'e yüklemek için APPLOAD komutunu kullanınız ya da basit olarak uzunlukyaz.lsp dosyasını sürükleyip çizim alanına bırakınız.

AutoCAD ortamında kodu çalıştırmak için "UY" veya "UZUNLUKYAZ" komutunu kullanabilirsiniz.

Ardından, bir nesne seçimi istenecektir. Seçtiğiniz nesnenin uzunluğu hesaplanacak ve çizime bir metin nesnesi olarak eklenecektir.

Seçilebilecek geçerli nesneler: LINE, POLYLINE, LWPOLYLINE, ARC, CIRCLE, ELLIPSE, SPLINE

Hatalar ve Çözümler:

Kod parçacığının geçersiz bir nesne seçimi durumunda kullanıcıyı uyardığını unutmayın. Bu durumda, başka bir nesne seçmek veya geçerli bir nesne seçmek için işlemi tekrarlamak gerekecektir. Ayrıca, kodu çalıştırmadan önce AutoLISP dili ve AutoCAD hakkında temel bir anlayışa sahip olmanız önemlidir.

Sonuç:

AutoLISP'in gücünü kullanarak çizimlerinizi daha verimli hale getirebilir ve iş akışınızı hızlandırabilirsiniz. AutoCAD kullanıcılarının bu kod parçacığını kullanarak zaman ve çaba tasarrufu yapabileceğini umuyoruz. Konu ile ilgili yorumlarınızı aşağıdaki yorum kısmına yazabilirsiniz.

Hiç yorum yok:

Yorum Gönder