source code etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
source code etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

9 Ağustos 2024 Cuma

AutoLisp ile çizimdeki blokları blok adlarıyla DXF dosyaya kaydet

Aşağıdaki AutoLisp dosya çizimdeki tüm bloklar blok adlarıyla DXF uzantılı olarak ayrı ayrı kaydeder.
Kaydedilecek klasör C:\BLOKLAR olarak belirtilmiştir. Klasör yolunu değiştirebilirsiniz.
Kayıt türü DXF olarak belirtilmiştir. Kodlarda uzantıyı DWG olarak değiştirebilirsiniz.

İlgili sayfalar:
; Çizim dosyasındaki bloklari blok adlarıyla ayrı dosyalara kaydeder
; Mesut Akcan
; 09/08/2024
; makcan@gmail.com
; https://mesutakcan.blogspot.com

(vl-load-com)
(defun c:BLOKKAYDET (/ blokadi bloksayisi dosyaadi kbs klasor uzanti)
	(setvar 'cmdecho 0) 
  (setq
		klasor "C:\\BLOKLAR" ; Blokların kaydedileceği klasör
		;Dosya uzantısı
		uzanti ".dxf" ; DWG uzantılı kayıt için alttaki satırı kullanın
		;uzanti ".dwg"
		blokSayisi 0 ; Blok sayısı
		kbs 0 ; Kaydedilen blok sayısı
	)
  ; Klasörün mevcut olup olmadığını kontrol et
  (if (not (vl-file-directory-p klasor))
		; Klasör yoksa çık
		(progn (alert (strcat klasor " klasörü bulunamadı!"))(exit))
	)
	; Model alanındaki her varlık için döngü
  (vlax-for ent (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object)))
		; Eğer varlık bir blok referansı ise,
    (if (eq (strcase (vla-get-ObjectName ent)) "ACDBBLOCKREFERENCE") 
      (progn
				; Blok sayısını bir artır
        (setq blokSayisi (1+ blokSayisi)) 				
				; Blok adını al ve blokAdi değişkenine ata
        (setq blokAdi (vla-get-EffectiveName ent))
				; Blok dosya yolunu ve adını oluştur ve dosyaAdi değişkenine ata
        (setq dosyaAdi (strcat klasor "\\" blokAdi uzanti))
				; Eğer dosya mevcut değilse,
        (if (not (findfile dosyaAdi))
          (progn
						; Bloğu belirlenen dosya adı ile kaydet
						(if (= uzanti ".dxf")
							(command "_.WBLOCK" dosyaAdi "" blokAdi)
							(command "_.WBLOCK" dosyaAdi blokAdi)
						)
						(setq kbs (1+ kbs)) ; Kaydedilen blok sayısını bir artır
					)
         )
       )
     )
   )
	; Sonuç mesajını yazdır
	(alert
		(strcat "Çizimdeki " (itoa blokSayisi) " adet bloktan "
			(itoa kbs) " adedi " klasor
			" klasörüne ayrı dosyalar halinde kaydedildi."
		)
	)
	(setvar 'cmdecho 1) 
  (princ)
)

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.

25 Şubat 2018 Pazar

AutoCAD ile VBA makro kullanımı #2


AutoCAD VBA makro kullanımı hakkında temel bilgileriniz yoksa konuyla ilgili bir önceki yazımı okumanızı tavsiye ederim.

Bir önceki yazıda "VBA kodları ile belirtilen noktaya eksen çizgileri çizen kodları" yazacağımı belirtmiştim.

İşte bu yazıda bunun nasıl yapıldığını göreceğiz.