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

28 Nisan 2025 Pazartesi

AutoLISP: Dönüştürme fonksiyonları - 1

AutoLISP ve Visual LISP, teknik çizimlerde otomasyonu kolaylaştıran güçlü araçlar sunarken, farklı veri tipleri arasında dönüşüm yapmayı sağlayan fonksiyonları da içinde barındırır.

Bu dönüşüm işlemleri sayesinde sayılar, metinler, açılar, koordinatlar ve listeler arasında esnek geçişler sağlanabilir. Özellikle kullanıcıdan alınan verilerin işlenmesi, metin tabanlı bilgilerle sayısal verilerin entegre edilmesi veya geometriyle ilgili hesaplamalarda bu fonksiyonlar büyük kolaylık sağlar.

Dönüştürme fonksiyonlarını etkili kullanmak, yazılan kodun daha okunabilir, daha esnek ve daha güçlü olmasını sağlar.

Sayı, Metin ve Karakter Dönüşüm Fonksiyonları

Bu sayfada açıklanan fonksiyonlar:
  • itoa : Tamsayı -> Metin
  • atoi : Metin -> Tamsayı
  • rtos : Reel sayı -> Metin
  • float : Tamsayı -> Reelsayı
  • fix : Reelsayı -> Tamsayı
  • atof : Metin -> Reel sayı
  • distof : Metin -> Reel sayı
  • angtof : Açı -> Reel sayı
  • angtos : Açı -> Metin
  • ascii : Metin -> ASCII kodu
  • chr : ASCII kodu --> Karakter
  • cvunit : Birim dönüştür
  • trans : Koordinat sistemi dönüştür

itoa : Tamsayı -> Metin

itoa, Integer to ASCII kısaltmasıdır. Tamsayıyı (integer) metin (string) formatına dönüştürmek için kullanılır. Genellikle sayısal değerleri ekranda göstermek, dosya işlemlerinde kullanmak veya metin tabanlı işlemler yapmak için gereklidir.

Kullanımı:
(itoa tamsayı)
tamsayı : Dönüştürülecek tamsayı değer. Parametre olarak integer veri türü haricinde bir değer girildiğinde hata oluşur. Reel sayılar için rtos fonksiyonu kullanılmalı ya da reel sayı önce fix fonksiyonu ile tamsayıya dönüştürülmeli.
Dönüş Değeri: Sayının metin karşılığı (string).

Bu fonksiyonun yaptığı işlemin tersi için atoi kullanılır.

Örnekler:
(itoa 123) ; "123" (123 sayısını metne çevirir)
(itoa -45) ; "-45"
(itoa 0) ; "0"
(itoa (/ 10 5)) ; "2"
(itoa (/ 10 3)) ; "3"
(itoa (fix (/ 10 4))) ; "2"
; argüman veri türü hatalı örnekler:
(itoa 3.1415) ; error: bad argument type: fixnump: 3.1415
(itoa "24") ; error: bad argument type: fixnump: "24"
(itoa (/ 10 3.0)) ; error: bad argument type: fixnump: 3.33333

atoi : Metin -> Tamsayı

atoi, ASCII to integer kısaltmasıdır. Sayı içeren metni(string) tamsayıya(integer) dönüştürür.

Kullanımı:
(atoi metin)
metin : String olarak girilen argümandaki sayıyı tamsayıya(integer) dönüştürür. Metin sayı ile başlıyorsa sayı kısmını alır. Sayı ile başlamayan metinler 0 sonucunu verir.

21 Nisan 2025 Pazartesi

AutoLISP: Seçili çizgileri iki uçtan uzat

Bu AutoLISP kodu, AutoCAD ortamında seçilen tüm çizgi (LINE) nesnelerinin her iki ucunu, kullanıcıdan alınan bir uzunluk kadar uzatır.

Komut çalıştırıldığında, kullanıcıdan uzatma miktarı istenir ve ardından çizgi nesneleri seçilmesi beklenir. Seçilen her bir çizginin başlangıç ve bitiş noktaları, çizginin doğrultusuna göre belirtilen mesafe kadar ileri ve geri kaydırılarak çizgi uzatılır.

Böylece, çok sayıda çizginin uçlarını hızlı ve pratik bir şekilde topluca uzatmak mümkün olur. Özellikle mimari ve teknik çizimlerde, çizgi boylarını topluca düzenlemek isteyen kullanıcılar için büyük kolaylık sağlar.

Nasıl yüklenir?

Nasıl çalıştırılır?

Lisp dosyasını yükledikten sonra; AutoCAD komut satırında;
  • UZAT komutunu girin
  • Uzatma miktarını girin. Negatif sayı kısaltma yapar.
  • Uzatılacak çizgileri seçin. Çizgi dışındaki nesneler seçilmeyeceği için seçim kolaydır.
  • Enter ile seçimi sonlandırın.
  • Seçili çizgiler her iki uçtan uzatılacak ve yapılan işlem hakkında bilgi verilecektir.

Program kodu

; Çizgileri her iki uçtan uzatır.
; Uzatma miktarını kullanıcıdan alır.
; Negatif uzatma miktarı kısaltma yapar.

; İlk sürüm : 21/04/2025
; Güncelleme: 03/05/2025

; Mesut Akcan
; makcan@gmail.com
; mesutakcan.blogspot.com
; youtube.com/mesutakcan

(setq ext 3) ; Varsayılan uzatma miktarı
(defun c:UZAT ( / ang n line lc sp ep ss um)
(initget 2) ; Sıfır değerine izin verme
(if (setq um (getreal (strcat "\nUzatma miktarı <" (rtos ext) ">: ")))
	(setq ext um)
)
(if (setq ss (ssget '((0 . "LINE")))) ; Sadece LINE nesnelerini seç
	(progn
		(setq
			lc (sslength ss) ; Seçim setindeki çizgi sayısı
			n 0 ; Döngü sayacı
		) 
		(repeat lc ; Seçim setindeki çizgi sayısı kadar döngü
			(setq
				line (ssname ss n) ; Döngüdeki çizgi
				sp (getpropertyvalue line "StartPoint") ; Başlangıç noktası
				ep (getpropertyvalue line "EndPoint") ; Bitiş noktası
				ang (angle sp ep) ; Çizgi açısı
				n (1+ n) ; Döngü sayacı
			)
			; Başlangıç noktasını ters yöne uzat
			(setpropertyvalue line "StartPoint" (polar sp (+ ang pi) ext))
			; Bitiş noktasını ileri doğru uzat
			(setpropertyvalue line "EndPoint" (polar ep ang ext))
		);repeat
		(princ (strcat "\nToplam " (rtos lc) " çizgi her iki uçtan " (rtos ext) " birim uzatıldı."))
	);progn
	(princ "\nÇizgi seçilmedi.")
);if
(princ)
)

18 Aralık 2024 Çarşamba

AutoLisp: Eksen çiz

Eksen çiz AutoLISP uygulaması ile AutoCAD programında seçilen çember veya yaylara dikey ve yatay eksenler çizilerek işlemleri hızlandırır.

Eksen çiz Autolisp uygulaması dosyası, kurulum ve kullanım hakkında detaylı bilgi için:

Github proje sayfası

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)
)

17 Mayıs 2024 Cuma

QuickBasic - 30: Hata ayıklama-3

3. Mantıksal Hatalar

Mantıksal hatalar (Logic Errors) program kodlarının söz dizimi açısından doğru olmasına rağmen beklenen sonuçları vermemesine neden olan hatalardır. Bu tür hatalar, programın mantığında veya algoritmasında yapılan yanlışlıklar nedeniyle ortaya çıkar. Mantıksal hatalar, genellikle programın çalışması sırasında belirli girdilerle test edilerek ortaya çıkarılır ve düzeltilir, çünkü derleme aşamasında tespit edilemezler. Bu yüzden en tehlikeli hatalardandır.

Mantıksal hataların yaygın örnekleri arasında mantıksal karşılaştırma ifadeleri, döngülerin hatalı kullanımı ve değişkenlerin yanlış değerlerle işlenmesi bulunur.

Örneğin, bir döngünün yanlış bir koşulla çalıştırılması, döngünün beklenenden daha fazla veya daha az çalışmasına neden olabilir. Bu tür hatalar, programın belirli durumlarda yanlış sonuçlar üretmesine, hiç çalışmamasına, kilitlenmesine veya sonsuz döngü üretmesine neden olabilir. Ayrıca, değişkenlerin yanlış şekilde güncellenmesi veya kullanılması, hesaplamaların yanlış sonuçlar vermesine yol açar.

25 Mart 2024 Pazartesi

Word VBA: Belgedeki tüm resimleri aynı boyuta ayarla

Uzun yıllar önce(2015) donanimhaber forum sitesindeki sorulara cevap vermek için Word VBA makroları yazmıştım. Forumda cevap olarak verdiğim kodları gözden geçirip düzenledim ve burada yayınlıyorum.

Soru 1

Diyelim ki 80 sayfalık bir belge var elimizde ve her bir sayfada küçük birer adet resim var. Yani toplam 80 resim. Ben bunların her birini tek tek düzenleyerek sayfanın tamamına yaymadan, toplu ve otomatik olarak sayfanın tamamını kaplayacak şekilde nasıl yayarım?

Cevap 1

Aşağıdaki VBA makroyu kullanabilirsiniz. Alttaki kodlar tüm resimlerin genişliğini 10cm'e ayarlar.
genislik = 10 'cm
satırındaki 10 sayısını değiştirebilirsiniz.

'Mesut Akcan
'mesutakcan.blogspot.com
'Belgedeki tüm resimlerin genişliğini 10 cm'ye ayarlar
'Yükseklik orantılı değişir
Sub GenislikAyarla()
	Dim shp As InlineShape
	Dim genislik As Double
	genislik = 10 'cm
	Application.ScreenUpdating = False
	For Each shp In ActiveDocument.InlineShapes
		With shp
				.LockAspectRatio = msoTrue 'en/boy Orantısı sabit
				'.Height = (.Width / .Height) * CentimetersToPoints(genislik)
				.Width = CentimetersToPoints(genislik)
		End With
		DoEvents
	Next
	Application.ScreenUpdating = True
	MsgBox "İşlem Tamam!"
End Sub

Soru 2

Word VBA makro kodları nasıl çalıştırılır?

Cevap 2

Word programındayken, ALT+F11e bas.
Menüden Insert / Module tıkla. Açılan kod penceresine kodu ekle.
Word programında makro çalıştırmak için ALT+F8e bas makro adını seç. Çalıştır tıkla.

Soru 3

Üstteki makro sadece genişliği değiştiriyor. Ben belgede bulunan tüm resimlerin genişliğini 7, yüksekliğini 5 olarak ayarlamak istiyorum. Bunun için makro var mı?

Cevap 3

Aşağıdaki makroyu kullanabilirsiniz. Eğer orijinal resimleriniz 7x5 oranında değilse sünme olabilir.
'Mesut Akcan
'mesutakcan.blogspot.com
'Belgedeki tüm resimlerin genişliğini 7cm,
'yüksekliğini 5 cm'ye ayarlar
Sub GenislikVeYukseklikAyarla()
	Dim shp As InlineShape
	Dim genislik As Double
	Dim yukseklik As Double
	
	genislik = 7 'cm
	yukseklik = 5 'cm
	
	Application.ScreenUpdating = False
	For Each shp In ActiveDocument.InlineShapes
		With shp
			.LockAspectRatio = msoFalse 'en/boy Orantısı sabit değil
			.Height = CentimetersToPoints(yukseklik)
			.Width = CentimetersToPoints(genislik)
		End With
	Next
	Application.ScreenUpdating = True
	MsgBox "İşlem Tamam!"
End Sub

Soru 4

Bu makroyu çalıştırmada sorunum yok lakin makroyu Word'e kalıcı olarak nasıl ekleriz. Word her açılışında makroyu çalıştırabileyim.

Cevap 4

Word'ü açın. ALT+F11e basın. Ctrl+R ile Project bölmesini açın.
Bu bölmede Normal yazan proje adını seçin.
Menüden Insert / Module tıklayın.
Açılan kod penceresine makro kodunu ekleyin.
Ctrl+S ile kaydedin.

Artık makroyu her dosyaya eklemeye gerek olmadan kullanabilirsiniz.

Soru 5

Verilen kodları değiştirerek kullanmaya çalıştım ama başarılı olamadım.
Word dosyama eklediğim tüm resimlerin 3,47 inç 2,48 inç olmasını istiyorum. Bunun için gereken makro konusunda yardımcı olabilir misiniz?

Cevap 5

Aşağıdaki makro kodunu kullanın.
'Mesut Akcan
'mesutakcan.blogspot.com
'Belgedeki tüm resimlerin genişliğini 3.47 inç,
'yüksekliğini 2.48 inç olarak ayarlar
Sub GenislikVeYukseklikAyarla_2()
	Dim shp As InlineShape
	Dim genislik As Double
	Dim yukseklik As Double
	
	genislik = 3.47 'inç
	yukseklik = 2.48 'inç
	
	Application.ScreenUpdating = False
	For Each shp In ActiveDocument.InlineShapes
		With shp
			.LockAspectRatio = msoFalse 'en/boy Orantısı sabit değil
			.Height = InchesToPoints(yukseklik)
			.Width = InchesToPoints(genislik)
		End With
	Next
	Application.ScreenUpdating = True
	MsgBox "İşlem Tamam!"
End Sub

19 Kasım 2023 Pazar

Excel VBA: Belirtilen aralıktaki çift, tek veya tüm sayıların sayısı

Yayınlama: 4/4/2014
Güncelleme: 19/11/2023
Eğer Excel'de kullanabileceğiniz bir özel fonksiyon olsaydı, "SayiSay" fonksiyonu şu şekilde işlev görebilirdi:

=SayiSay(hücreler; sayiCesidi)

Bu fonksiyon, belirtilen hücre aralığındaki sayıların sayısını belirli bir kriter veya sayı türüne göre sayan bir formül sağlar. "hücreler" parametresi, sayıları içeren hücre aralığını temsil ederken, "sayiCesidi" parametresi ise sayılardan hangi türleri saymak istediğinizi belirler.

Örneğin:

Eğer "sayiCesidi" parametresi 1 olarak belirlenirse, fonksiyon belirtilen hücre aralığındaki tek sayıların sayısını verir.
Eğer "sayiCesidi" parametresi 2 olarak belirlenirse, fonksiyon çift sayıların sayısını verir.
Eğer "sayiCesidi" parametresi belirtilmez veya 0 olarak belirlenirse, fonksiyon hücre aralığındaki tüm sayıların sayısını verir.
Bu örnek formül, belirli bir hücre aralığındaki sayıların çeşidine göre sayım yapmanıza olanak tanıyan özelleştirilmiş bir Excel fonksiyonunu temsil etmektedir. Ancak, bu fonksiyon Excel'in standart fonksiyonları arasında yer almamaktadır, bu nedenle böyle bir fonksiyonu kullanabilmek için aşağıdaki kodlar gibi özel bir VBA (Visual Basic for Applications) makro yazmanız gerekecektir.

Fonksiyonun kullanımı

hücreler olarak: "A1:E4" gibi çok sayıda hücre
sayiCesidi olarak:
Tüm sayılar için 0
Tek sayı için 1
Çift Sayı için 2
girin.

Örnek 1: =SayiSay("A1:E5")
"A1:E5" aralığındaki tüm sayıların sayısını verir.
Örnek 2: =SayiSay("A1:E5";0)
"A1:E5" aralığındaki tüm sayıların sayısını verir.
Örnek 3: =SayiSay("A1:E5";1)
"A1:E5" aralığındaki tek sayıların sayısını verir.
Örnek 4: =SayiSay("A1:E5";2)
"A1:E5" aralığındaki çift sayıların sayısını verir.

Kodları eklemek için:
Excelde ALT+F11'e basın.
Menüden Insert / Module tıklayın.
Aşağıdaki kodları ekleyin
Option Explicit
'Blog sayfam	 : https://mesutakcan.blogSpot.com
'Youtube Kanalım : https://www.youtube.com/mesutakcan
'WhatsApp kanalım: https://www.whatsapp.com/channel/0029Va5h4cQ0LKZLuB9Dpy23
'Telegram kanalım: https://t.me/mesutakcan
Enum eSayiCesidi
	tumSayilar = 0
	tekSayilar = 1
	ciftSayilar = 2
End Enum

Function SayiSay(hucreler As Range, _
	Optional sayiCesidi As eSayiCesidi = tumSayilar) As Long
	
	Dim hucre As Range
	Dim sayiAdedi As Long
	
	' belirtilen tüm hücreler
	For Each hucre In hucreler
		' hücre değeri sayı ise
		If IsNumeric(hucre.Value) Then
			'sayıları say
			If (sayiCesidi = tumSayilar) Or _
				(sayiCesidi = tekSayilar And hucre.Value Mod 2 <> 0) Or _
				(sayiCesidi = ciftSayilar And hucre.Value Mod 2 = 0) Then
					sayiAdedi = sayiAdedi + 1
			End If
		End If
	Next
	
	SayiSay = sayiAdedi
End Function

8 Kasım 2023 Çarşamba

AutoCAD ile VBA Makro Kullanımı #6-3

Yayınlama: 9/4/2020
Güncelleme: 8/11/2023


Slot(oyuk) çizen VBA makro kodları:

31 Ekim 2023 Salı

AutoCAD VBA ile dikdörtgen çiz

AutoCAD ile VBA kullanarak dikdörtgen çizme işlemi oldukça basit ve verimlidir. AutoCAD VBA'yı kullanmak için öncelikle AutoCAD'in yüklü olması ve VBA'ın etkinleştirilmiş olması gerekmektedir.


İşlem basamakları:
  • AutoCAD'i açın.
  • ALT+F11 ile VBA kod editörünü açın.
  • Menüden Insert  / Module tıklayın.
  • Açılan Module1 kod sayfasına aşağıdaki kodları ekleyin.
'Dikdörgen çizen prosedür
'Mesut Akcan
'31/10/2023
'makcan@gmail.com

'Blog sayfam     : https://mesutakcan.blogSpot.com
'Youtube Kanalım : https://www.youtube.com/mesutakcan
'WhatsApp kanalım: https://www.whatsapp.com/channel/0029Va5h4cQ0LKZLuB9Dpy23
'Telegram kanalım: https://t.me/mesutakcan

Public Sub dikDortgenCiz(p As Variant, genislik As Double, yukseklik As Double, _
	Optional dondurmeAcisi As Double = 0, Optional yuvarlatmaYariCapi As Double = 0, _
	Optional polyLine As Boolean = True)
    
    'köşe noktaları. X
	Dim x1 As Double, x2 As Double, x3 As Double, x4 As Double 
    'köşe noktaları. Y
	Dim y1 As Double, y2 As Double, y3 As Double, y4 As Double

	Dim vl As Variant 'vertex listesi
	Dim util As Object 'nesne tanımla
	Dim pl As AcadLWPolyline 'Polyline nesnesi

	Set util = ThisDrawing.Utility 'utility nesnesi
	
	' Köşe noktalarının X değerleri
	x1 = p(0)
	x2 = x1 + yuvarlatmaYariCapi
	x4 = x1 + genislik
	x3 = x4 - yuvarlatmaYariCapi
	
	' Köşe noktalarının Y değerleri
	y1 = p(1)
	y2 = p(1) + yuvarlatmaYariCapi
	y4 = p(1) + yukseklik
	y3 = y4 - yuvarlatmaYariCapi
	
	If yuvarlatmaYariCapi > 0 Then 'dikdörtgen köşelerinde yuvarlatma yapılacaksa
		'vl dizi değişkenine köşe(vertex) noktalarını aktar
		util.CreateTypedArray vl, vbDouble, x2, y1, x3, y1, x4, y2, x4, y3, x3, y4, _
			x2, y4, x1, y3, x1, y2
	Else 'yuvarlatma yapılmayacaksa
		'vl dizi değişkenine vertex noktalarını aktar
		util.CreateTypedArray vl, vbDouble, x1, y1, x4, y1, x4, y4, x1, y4
	End If
	
	'polyline dikdörtgeni çiz
	Set pl = ThisDrawing.ModelSpace.AddLightWeightPolyline(vl)
	pl.Closed = True 'kapalı şekil
	
	'bulge değeri: Tanjant(Yuvarlatlacak vertek noktalarının gördüğü açı / 4)
	'bulge değeri = Tanjant(Açı/4) => Açı=90° => pi/2
	' =Tan(90°/4) => Tan((pi/2)/4) => Tan(pi / 8)
	Const bd As Double = 0.414213562373095  ' Tan(pi / 8)
	
	'dikdörten köşelerinde yuvarlatma yapılacaksa
	If yuvarlatmaYariCapi > 0 Then
		pl.SetBulge 1, bd
		pl.SetBulge 3, bd
		pl.SetBulge 5, bd
		pl.SetBulge 7, bd
	End If

	'dikdörtgen döndürülecekse
	If dondurmeAcisi > 0 Then
		Const pi As Double = 3.14159265358979 'pi sabiti
		pl.Rotate p, dondurmeAcisi * (pi / 180)
	End If

	'Dikdörtgen çizgi ve yay ile çizilecekse çizimi patlat
	If polyLine = False Then pl.Explode
End Sub
Dikdörtgençiz prosedürünü kullanmak için örnek
  • Aşağıdaki kodları ThisDrawing kod sayfasına ekleyin.
  • VBA editöründe çalıştırmak için F5
  • AutoCAD ekranında çalıştırmak için ALT+F8
Sub dikDortgenCizOrnekKullanim()
	n = ThisDrawing.Utility.GetPoint(, "Dikdörtgen sol alt köşe noktası:")
	Call dikDortgenCiz(n, 30, 20)
	Call dikDortgenCiz(n, 50, 30, 5)
	Call dikDortgenCiz(n, 60, 35, 15, 10)
	Call dikDortgenCiz(n, 80, 45, 25, 12, False)
End Sub

29 Ekim 2023 Pazar

VBA'da Erken Bağlama ve Geç Bağlama

VBA (Visual Basic for Applications) Microsoft Office uygulamalarını özelleştirme ve otomasyon için yaygın bir şekilde kullanılan bir araçtır. Ayrıca AutoCAD, SolidWorks gibi programlarda eklenti olarak kullanılmaktadır.

VBA nesnelerle etkileşim kurarken iki farklı bağlama türü kullanılır.

  1. Erken bağlama (Early binding)
  2. Geç bağlama (Late binding).

Bu yazıda, her iki bağlama türünü açıklayacak ve hangi durumda hangi türün kullanılması gerektiğini inceleyeceğiz.

1) Erken Bağlama

Erken bağlama nedir?

Erken bağlama(early binding), VBA kodunun nesnelerin ve metodların türünü ve özelliklerini tasarım zamanında tanımladığı bir bağlama türüdür. Erken bağlama, VBA kodunun daha hızlı çalışmasını sağlar ve daha fazla tür güvenliği sunar. Ayrıca, IntelliSense gibi kod geliştirme araçlarına daha fazla destek sağlar.

Erken bağlamanın avantajları

  • Performans: Erken bağlama, VBA kodunun daha hızlı çalışmasını sağlar. Çünkü nesnelerin ve yöntemlerin türleri tasarım zamanında bilindiği için, derleyici daha iyi optimize edebilir.
  • Tür Güvenliği: Erken bağlama, kodunuzun daha güvenli hale gelmesini sağlar. Çünkü türler ve yöntemler tasarım zamanında belirlendiği için, hatalı türlerle veya eksik yöntemlerle çalışma riski daha düşüktür.
  • Kod Hata Ayıklama: Erken bağlama ile kod hata ayıklamak daha kolaydır. Çünkü nesnelerin ve yöntemlerin türleri belirli olduğu için, hata ayıklayıcı daha fazla yardımcı olabilir.
  • IntelliSense Desteği: Erken bağlama, kod yazarken IntelliSense(akıllı kod tamamlama) gibi kod geliştirme araçlarının kullanımını destekler. Bu, kodunuzu daha hızlı ve hatasız bir şekilde yazmanıza yardımcı olur.
  • Kodun Okunabilirliği: Erken bağlama ile çalışırken, kodunuz daha okunabilir hale gelir. Çünkü nesnelerin ve yöntemlerin türleri ve özellikleri açıkça belirtilir.
  • Referans Yönetimi: Erken bağlama, projenizin referanslarını daha iyi yönetmenizi sağlar. Referansları eklemek ve kaldırmak daha kolaydır.
  • Dokümantasyon Desteği: Erken bağlama, nesnelerin ve yöntemlerin tasarım zamanında belirlendiği için, daha iyi dokümantasyon sağlar. Bu, başkalarının kodunuzu daha iyi anlamasına yardımcı olur.
  • Kodun Daha İyi Anlaşılması: Erken bağlama ile çalışırken, kodun ne yaptığı daha açık bir şekilde anlaşılır. Çünkü türler ve yöntemler adından ve belirli olduklarından, kodun amacı daha belirgin hale gelir.
Erken bağlama, özellikle büyük ve karmaşık projelerde, performans ve güvenlik açısından büyük avantajlar sunar. Ancak, belirli durumların gerektirdiği esneklik ve uyumluluk ihtiyaçlarına göre geç bağlama (late binding) veya karışık bir yaklaşım kullanmak da gerekebilir. Projenizin ihtiyaçlarına ve hedeflerine bağlı olarak doğru bağlama türünü seçmek önemlidir.

Erken bağlamanın dezavantajları

  • Versiyon Uyumsuzluğu: Erken bağlama, belirli bir sürümün nesnelerini ve özelliklerini kullanmayı gerektirir. Bu, uygulamanın daha yeni veya daha eski sürümleri ile uyumsuzluk sorunlarına yol açabilir. Kodunuzu bir sürümden diğerine taşırken düzenlemeler yapmanız gerekebilir.
  • Dosya Boyutu: Erken bağlama kullanırken, projenizin dosya boyutu artabilir. Çünkü erken bağlama referanslarını projenize eklediğinizde, bu referanslar projenizin boyutunu artırabilir. Bu, dosyanın taşınabilirliğini ve paylaşılabilirliğini azaltabilir.
  • Yavaş Geliştirme: Erken bağlama ile çalışırken, IntelliSense gibi kod geliştirme araçları daha iyi çalışsa da, bazı durumlarda daha fazla kod yazma işlemi gerekebilir. Bu, kodunuzu geliştirmenin daha fazla zaman almasına neden olabilir.
  • Referans Yönetimi: Erken bağlama kullanırken, projenize eklediğiniz referansları yönetmek zor olabilir. Özellikle başka bir bilgisayara taşındığında veya farklı bir VBA ortamında çalıştırıldığında referansların eksik veya hatalı olması sorunlara yol açabilir.
  • Esneklik Sorunları: Erken bağlama, projenizin esnekliğini azaltabilir. Eğer uygulamanın veya nesne modelinin belirli bir sürümüne bağlı kalırsanız, yeni özelliklere veya sürümlere uyum sağlama konusunda kısıtlamalarla karşılaşabilirsiniz.
  • Hata Ayıklama: Erken bağlama, hata ayıklamayı bazen zorlaştırabilir. Çünkü nesne türleri ve özellikleri kodun yazıldığı anda belli olur ve çalışma zamanında değiştirilemez. Bu, hataların nedenlerini bulmayı zorlaştırabilir.

Bu dezavantajlar, projenizin gereksinimlerine ve çalışma koşullarına bağlı olarak değişebilir. Erken bağlama ve geç bağlama (late binding) arasında doğru dengeyi bulmak, projenizin ihtiyaçlarına uygun bir şekilde kod yazmanıza yardımcı olabilir.

Erken bağlama kullanımı:

Erken bağlama kullanmak için öncelikle hedef uygulamanın veya nesne modelinin referanslarını eklemeniz gerekir.

14 Ekim 2023 Cumartesi

AutoCAD VBA. Excele veri yaz-3

VBA kodlarıyla ofis programlarına bağlantı kurulabilir ve programla ilgili birçok işlem yaptırılabilir.
AutoCAD VBA'dan Excel'e bağlantı kurulabildiği gibi tersi de mümkündür
Hatta birçok uyumlu Windows programı birbiri ile bağlanıp kodlarla işlemler yapabilir.

Bu videoda AutoCAD VBA ile Excel'e bağlanmayı ve veri aktarmayı göstermeye devam ediyorum.
  • Excele sayfa ekle
  • Excel sayfası silme
  • AutoCAD çizim nesne adlarını Excele yaz
  • AutoCAD çizim alanındaki çizgilerin uzunluklarını ve toplamını Excele yaz
  • Excel dosyasını aç
Videoda kullanılan VBA kodları:
'Mesut Akcan
'https://mesutakcan.blogspot.com
'https://youtube.com/mesutakcan
'makcan@gmail.com

Sub excelDosyaAc2()
	'1. yöntem: Erken bağlanma. Early Binding
	'Tools / References / Microsoft Excel xx.x Object Library ekle

	Dim xla As Excel.Application 'Excel uygulamasını temsil eden nesne
	Dim wb As Excel.Workbook 'Excel çalışma kitabını temsil eden nesne

	Set xla = Excel.Application
	xla.Visible = True  'uygulamayı ekranda göster

	Set wb = xla.Workbooks.Open("c:\test\test2.xlsx") 'dosyayı excel ile aç
End Sub

Sub excelDosyaAc1()
	'1. yöntem: Erken bağlanma. Early Binding
	'Tools / References / Microsoft Excel xx.x Object Library ekle

	Dim xla As Excel.Application 'excel uygulamasını örnek alan nesne oluştur
	Set xla = CreateObject("Excel.Application") 'excel nesnesi oluşturup değişkene aktar
	xla.Visible = True 'ekranda excel nesnesini göster

	Dim dosya As Excel.Workbook 'excel çalışma kitabı nesnesi
	Set dosya = xla.Workbooks.Open("c:\test\test1.xlsx") 'dosyayı excel ile aç
End Sub

Sub exceleYaz6()
	'1. yöntem: Erken bağlanma. Early Binding
	'Tools / References / Microsoft Excel xx.x Object Library ekle

	Dim xla As Excel.Application 'excel uygulamasını örnek alan nesne oluştur
	Set xla = CreateObject("Excel.Application") 'excel nesnesi oluşturup değişkene aktar

	xla.Workbooks.Add 'Yeni dosya oluştur.
	xla.Visible = True 'ekranda excel nesnesini göster
   
	Dim sayfa As Excel.Worksheet 'excel sayfası nesnesi
	Set sayfa = xla.ActiveSheet
	sayfa.Name = "Liste"

	Dim ent As AcadEntity 'AutoCad Varlık

	For Each ent In ThisDrawing.ModelSpace 'Çizim alanındaki tüm varlıklar
		If ent.ObjectName = "AcDbLine" Then
			satir = satir + 1
			uz = ent.Length
			sayfa.Cells(satir, 2) = uz
			toplamUzunluk = toplamUzunluk + uz
		End If
	Next

	sayfa.Cells(satir + 1, 1).Value = "TOPLAM:"
	sayfa.Cells(satir + 1, 2).Value = toplamUzunluk
	sayfa.Cells(satir + 1, 2).Font.color = vbRed

	sayfa.SaveAs "c:\TEST\test2.xlsx" 'Dosyaya kaydet
End Sub

Sub exceleYaz5()
	'1. yöntem: Erken bağlanma. Early Binding
	'Tools / References / Microsoft Excel xx.x Object Library ekle

	Dim xla As Excel.Application 'excel uygulamasını örnek alan nesne oluştur
	Set xla = CreateObject("Excel.Application") 'excel nesnesi oluşturup değişkene aktar

	xla.Workbooks.Add 'Yeni dosya oluştur.
	xla.Visible = True 'ekranda excel nesnesini göster
   
	Dim sayfa As Excel.Worksheet 'excel sayfası nesnesi
	'Son sayfadan sonra ekle
	Set sayfa = xla.Worksheets.Add(After:=xla.Worksheets(xla.Worksheets.Count))
	sayfa.Name = "TEST"

	Dim ent As AcadEntity 'AutoCad Varlık

	For Each ent In ThisDrawing.ModelSpace 'Çizim alanındaki tüm varlıklar
		satir = satir + 1 'satır numarasını 1 arttır
		sayfa.Cells(satir, 1).Value = ent.ObjectName 'hücreye nesne adını yaz
	Next
	sayfa.SaveAs "c:\TEST\test1.xlsx" 'Dosyaya kaydet
End Sub

Sub exceleYaz4()
	'1. yöntem: Erken bağlanma. Early Binding
	'Tools / References / Microsoft Excel xx.x Object Library ekle

	Dim xla As Excel.Application 'excel uygulamasını örnek alan nesne oluştur
	Set xla = CreateObject("Excel.Application") 'excel nesnesi oluşturup değişkene aktar

	xla.Workbooks.Add 'Yeni dosya oluştur.
	xla.Visible = True 'ekranda excel nesnesini göster
   
	Dim sayfa As Excel.Worksheet 'excel sayfası nesnesi
	'Set sayfa = xla.Worksheets.Add(After:=xla.Worksheets(xla.Worksheets.Count)) 'Son sayfadan sonra yeni sayfa ekle

	'2. sayfadan sonra ekle
	Set sayfa = xla.Worksheets.Add(After:=xla.Worksheets(2))
	sayfa.Name = "TEST"

	'TEST sayfasından sonra ekle
	Set sayfa = xla.Worksheets.Add(After:=xla.Worksheets("TEST"))
	sayfa.Name = "DENEME"

	'TEST sayfasından önce ekle
	Set sayfa = xla.Worksheets.Add(Before:=xla.Worksheets("TEST"))
	sayfa.Name = "HESAP"

	sayfa.Delete

	Set sayfa = xla.Worksheets("TEST")
	sayfa.Delete 'sayfa sil

	xla.Worksheets("DENEME").Delete 'sayfa sil
End Sub

Sub exceleYaz3()
	'2. yöntem: Geç bağlanma. Late Binding

	Dim xla As Object 'nesne için değişken tanımla
	Set xla = CreateObject("Excel.Application") 'excel nesnesi oluşturup değişkene aktar
	xla.Visible = True 'ekranda excel nesnesini göster

	Dim wb As Object 'nesne için değişken tanımla
	Set wb = xla.Workbooks.Add 'Yeni dosya oluştur.

	Dim sayfa As Object 'nesne için değişken tanımla
	Set sayfa = wb.Worksheets.Add 'yeni dosya oluştur
	sayfa.Name = "TEST" 'sayfa adını değiştir.
	sayfa.Cells(4, 3) = "Merhaba" 'satır 4, sütun 3'e Merhaba yaz
End Sub

Sub exceleYaz2()
	'1. yöntem: Erken bağlanma. Early Binding
	'Tools / References / Microsoft Excel xx.x Object Library ekle

	Dim xla As Excel.Application 'excel uygulamasını örnek alan nesne oluştur
	Set xla = CreateObject("Excel.Application") 'excel nesnesi oluşturup değişkene aktar
	xla.Workbooks.Add 'Yeni dosya oluştur.
	xla.Visible = True 'ekranda excel nesnesini göster

	'xla.Worksheets.Add 'yeni excel sayfası ekle

	Dim sayfa As Excel.Worksheet 'excel sayfası nesnesi
	Set sayfa = xla.Worksheets.Add 'yeni excel sayfası ekle

	sayfa.Name = "TEST" 'sayfa adını değiştir

	Set sayfa = xla.Worksheets(2) 'excel 2. sayfa
	sayfa.Activate 'sayfayı aktif et

	With sayfa.Range("B3")
		.Value = "Merhaba" 'Satır 3, Sütun 2'ye Merhaba yaz
		.Interior.color = vbRed 'zemin rengi kırmızı
		.Font.color = vbWhite 'yazı rengi beyaz
		.Font.Bold = True 'kalın yazı
		'.Select 'B3 hücresini seç
	End With
End Sub

Sub exceleYaz1()
	'1. yöntem: Erken bağlanma. Early Binding
	'Tools / References / Microsoft Excel xx.x Object Library ekle

	Dim xla As Excel.Application 'excel uygulamasını örnek alan nesne oluştur
	Set xla = CreateObject("Excel.Application") 'excel nesnesi oluşturup değişkene aktar
	xla.Workbooks.Add 'Yeni dosya oluştur.
	xla.Visible = True 'ekranda excel nesnesini göster

	With xla.Application.Range("B3")
		.Value = "Merhaba" 'Satır 3, Sütun 2'ye Merhaba yaz
		.Interior.color = vbRed 'zemin rengi kırmızı
		.Font.color = vbWhite 'yazı rengi beyaz
		.Font.Bold = True 'kalın yazı
		.Select 'B3 hücresini seç
	End With
	xla.Quit 'Exceli kapat
End Sub

12 Ekim 2023 Perşembe

AutoCAD VBA. Excele veri yaz-2


VBA kodlarıyla Microsoft Office programlarına bağlantı kurulabilir ve programla ilgili birçok işlem yaptırılabilir.

AutoCAD VBA'dan Excel'e bağlantı kurulabildiği gibi tersi de mümkündür
Hatta birçok uyumlu Windows programı birbiri ile bağlanıp kodlarla işlemler yapabilir.

Bu videoda AutoCAD VBA ile Excel'e bağlanmayı ve veri aktarmayı göstermeye devam ediyorum.

Excel ile bağlantı kurmak için 2 yöntem var.
1) Erken bağlama. Early Binding
2) Geç bağlama. Late Binding

Yöntemlerin avantaj ve dezavantajları

Erken bağlama:

Avantajları:
  • Çalışması daha hızlıdır.
  • Intellisense(Akıllı kod tamamlama) bağlanan nesnelerde kullanılabildiği için kod yazımı daha kolaydır.
  • Programın başlangıcında tüm değişkenlere değer atama işlemini yapar. Bu nedenle, programın bellek kullanımı artabilir.
Dezavantajları:
  • Referans eklenmelidir. Ekli değilse çalışmaz.

Geç bağlama:

Avantajları:
  • Referans eklemek gerekli değildir. Kullanıcının bir işlem yapması gerekmez.
  • Bellek kullanımı verimlidir.
Dezavantajları:
  • Nesneye bağlanma çalışma zamanında gerçekleştiği için yavaş çalışır.
  • Intellisense(Akıllı kod tamamlama) bağlanan nesnelerde çalışmaz. Bu yüzden kod yazmak zorlaşır.
Videoda kullanılan VBA kodları:
Sub exceleYaz3()
	'2. yöntem: Geç bağlanma. Late Binding
	Dim xla As Object 'nesne için değişken tanımla
	Set xla = CreateObject("Excel.Application") 'excel nesnesi oluşturup değişkene aktar
	xla.Visible = True 'ekranda excel nesnesini göster

	Dim wb As Object 'nesne için değişken tanımla
	Set wb = xla.workbooks.Add 'Yeni dosya oluştur.

	Dim sayfa As Object 'nesne için değişken tanımla
	Set sayfa = wb.worksheets.Add 'yeni dosya oluştur
	sayfa.Name = "TEST" 'sayfa adını değiştir.
	sayfa.cells(4, 3) = "Merhaba" 'satır 4, sütun 3'e Merhaba yaz

End Sub

Sub exceleYaz2()
	'1. yöntem: Erken bağlanma. Early Binding
	'Tools / References / Microsoft Excel xx.x Object Library ekle

	Dim xla As Excel.Application 'excel uygulamasını örnek alan nesne oluştur
	Set xla = CreateObject("Excel.Application") 'excel nesnesi oluşturup değişkene aktar
	xla.workbooks.Add 'Yeni dosya oluştur.
	xla.Visible = True 'ekranda excel nesnesini göster

	'xla.Worksheets.Add 'yeni excel sayfası ekle

	Dim sayfa As Excel.Worksheet 'excel sayfası nesnesi
	Set sayfa = xla.worksheets.Add 'yeni excel sayfası ekle

	sayfa.Name = "TEST" 'sayfa adını değiştir

	Set sayfa = xla.worksheets(2) 'excel 2. sayfa
	sayfa.Activate 'sayfayı aktif et

	With sayfa.Range("B3")
		.Value = "Merhaba" 'Satır 3, Sütun 2'ye Merhaba yaz
		.Interior.color = vbRed 'zemin rengi kırmızı
		.Font.color = vbWhite 'yazı rengi beyaz
		.Font.Bold = True 'kalın yazı
		'.Select 'B3 hücresini seç
	End With

End Sub

Sub exceleYaz1()
	'1. yöntem: Erken bağlanma. Early Binding
	'Tools / References / Microsoft Excel xx.x Object Library ekle

	Dim xla As Excel.Application 'excel uygulamasını örnek alan nesne oluştur
	Set xla = CreateObject("Excel.Application") 'excel nesnesi oluşturup değişkene aktar
	xla.workbooks.Add 'Yeni dosya oluştur.
	xla.Visible = True 'ekranda excel nesnesini göster

	With xla.Application.Range("B3")
		.Value = "Merhaba" 'Satır 3, Sütun 2'ye Merhaba yaz
		.Interior.color = vbRed 'zemin rengi kırmızı
		.Font.color = vbWhite 'yazı rengi beyaz
		.Font.Bold = True 'kalın yazı
		.Select 'B3 hücresini seç
	End With
	xla.Quit 'Exceli kapat
End Sub

11 Ekim 2023 Çarşamba

AutoCAD VBA. Excele veri yaz-1


VBA kodlarıyla Microsoft Office programlarına bağlantı kurulabilir ve programla ilgili birçok işlem yaptırılabilir.
AutoCAD VBA'dan Excel'e bağlantı kurulabildiği gibi tersi de mümkündür.
Hatta birçok uyumlu Windows programı birbiri ile bağlanıp kodlarla işlemler yapabilir.

Bu videoda AutoCAD VBA ile Excel'e bağlanmayı ve veri aktarmayı gösterdim.

Excel ile bağlantı kurmak için 2 yöntem var.
1. yöntem: Referans kullanmak. Erken bağlanma(Early Binding)
2. yöntem: Referans kullanmadan kod ile bağlanma. Geç bağlanma(Late Binding)
İki yöntemin de avantaj ve dezavantajları var.
Bu videoda 1. yöntem ile Excele nasıl bağlanacağı gösterildi.

Videoda kullanılan VBA kodları:
Sub exceleYaz()
	Dim xla As Excel.Application 'excel uygulamasını örnek alan nesne oluştur
	Set xla = CreateObject("Excel.Application") 'excel nesnesi oluşturup değişkene aktar
	xla.Workbooks.Add 'Yeni dosya oluştur.
	xla.Visible = True 'ekranda göster 'excel nesnesini göster
	'xla.Application.Cells(3, 2).Value = "Merhaba" 'Satır 3, Sütun 2'ye Merhaba yaz
	'xla.Application.Range("B3").Value = "Merhaba" 'Satır 3, Sütun 2'ye Merhaba yaz
	With xla.Application.Range("B3")
		.Value = "Merhaba" 'Satır 3, Sütun 2'ye Merhaba yaz
		.Interior.color = vbRed 'zemin rengi kırmızı
		.Font.color = vbWhite 'yazı rengi beyaz
		.Font.Bold = True 'kalın yazı
		.Select 'B3 hücresini seç
	End With
	xla.Quit 'Exceli kapat
End Sub

13 Ağustos 2023 Pazar

Excel VBA: Aktif hücre renklendirme

Excel VBA makrosu kullanarak, Excel tablosundaki aktif hücreleri renklendirerek hücre takibini yapmak  kolaylaştırılabilir.

Bu işlem için aşağıdaki VBA makro kodunu kullanabilirsiniz.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
	'Mesut Akcan
	'13/8/2023
	'mesutakcan.blogspot.com

	'Geri Al (Ctrl + Z) çalışmaz
	Static oncekiHucre As Range, zeminRengi As Long
	' Önceki hücrenin zemin rengini geri yükle
	If Not oncekiHucre Is Nothing Then
		oncekiHucre.Interior.ColorIndex = zeminRengi
	End If
	' Aktif hücre zemin rengini aktar
	zeminRengi = Target.Interior.ColorIndex
	' Aktif hücrenin zemin rengini sarı yap
	Target.Interior.ColorIndex = 6 'sarı renk
	' Aktif hücre bilgilerini aktar
	Set oncekiHucre = Target
End Sub

29 Temmuz 2023 Cumartesi

AutoCAD'e AutoLISP program yükleme ve çalıştırma

İlgili sayfa: Lisp, AutoLisp, VisualLisp nedir?

AutoCAD'e AutoLisp program yükleme

AutoLISP, AutoCAD'ın dahili programlama dilidir ve kullanıcıların özelleştirilmiş komutlar ve rutinler oluşturmalarına imkan sağlar.
AutoLisp dosyası açık kaynak kodlu ise LSP uzantılı olacaktır. Eğer kaynak kodlar derlendi ise FAS veya VLX uzantılı olur.

LSP uzantılı, açık kaynak kodlu AutoLisp programını AutoCAD'e yüklemek için aşağıdaki yöntemlerden birini kullanabilirsiniz.

Örnek olarak AutoLisp ile nesne uzunluğunu nesne üzerine yazma sayfasındaki AutoLisp programının açık kaynak kodunu kullanacağım.

Sayfadaki kodları seçip kopyalayın bir metin editörüne (örneğin Windows Not Defteri uygulaması) yapıştırın. Sonra kodları uzunlukyaz.lsp olarak kaydedin.

1) Sürükle bırak ile yükleme

En basit ve kolay yöntem budur. Dosyayı fare ile sürükleyip AutoCAD çizim alanına bırakın.
Dosyanın güvenli olmayabileceği ile ilgili uyarı penceresi çıkabilir.
Çıkan uyarı penceresinde;
Always Load tıkladığınızda dosya yüklenir ve sonraki yüklemelerinizde bu uyarı bir daha gelmez.
Load Once tıkladığınızda dosya yüklenir ancak sonraki yüklemelerde yine aynı uyarı gelir.
Do Not Load tıklarsanız dosya yüklenmez işlem iptal edilir.
Duruma göre 1. veya 2. buton ile dosyayı yükleyin.
Artık AutoLisp programını çalıştırabilirsiniz.
Bu yöntemle yüklenen AutoLisp program, yalnızca sürüklenip bırakılmış çizim dosyasında çalışır.

18 Temmuz 2023 Salı

AutoCAD ile VBA Makro #7. Dikdörtgen çizimi

AutoCAD VBA makro kodlarıyla dikdörtgen çizen kodlar videolarda açıklandı.
  1. Line ile dikdörtgen


  2. Polyline ile dikdörtgen
  3. Merkez ile dikdörtgen

  4. Paralelkenar

  5. Üç nokta ile dikdörtgen

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 Mart 2023 Cumartesi

QuickBasic - 29: Hata ayıklama-2

Yayınlama: 25 Mart 2023 

2. Çalışma Zamanı Hataları (Run-time Error)

Program kodlarının doğru göründüğü ancak çalıştırılması sırasında karşılaşılan hatalardır. Programcının ele almadığı bir takım aykırı durumlar ortaya çıktığında programın işletim sistemi tarafından kesilmesi ile ortaya çıkar. Bu tip hatalarda hata mesajı çoğunlukla çalışan işletim sisteminin dili ile verilir. Eğer bu tip hataları kullanıcı ele almışsa, program programcının vereceği mesajlarla ve uygun şekilde sonlandırılabilir. Bu tip hataların nerelerde ve hangi şartlarda ortaya çıkabileceğini bazen kestirmek zor olabilir.

Bazı yaygın çalışma zamanı hataları şunlardır:

a) Bellek Hataları:

Bellek hataları, programın belleğe yanlış bir şekilde erişmesi veya belleği yanlış kullanması sonucu oluşur. Bu hatalar, bellek sınırlarının aşılması, bellek sızıntıları veya bellek yönetimi hataları gibi nedenlerden kaynaklanabilir.
Örnek:
DEFINT A-Z
DIM personel(40200)
Bu kodlar çalıştırıldığında Overflow (taşma) hatası oluşturacaktır.
Çünkü QuickBasic dilinde bir dizi değişkenin eleman sayısı, dizi değişken boyutuna bağlı olarak belirlenen sınırların üzerinde olamaz. Bir dizi değişken elaman sayısı da dikkate alınarak bellekte en fazla 64K (65535 bayt) yer kaplayabilir.
INTEGER değişkenin her bir elemanı bellekte 2 bayt yer kapladığı için azami eleman sayısı 65535/2 = 32767
LONG ve SINGLE değişkenin her bir elemanı bellekte 4 bayt yer kapladığı için azami eleman sayısı 65535/4 = 16383
DOUBLE değişkenin her bir elemanı bellekte 8 bayt yer kapladığı için azami eleman sayısı 65535/4 = 8191
Not: Sayıların 1 eksik olmasının sebebi 0 ile başlamasından dolayıdır.
Önceki örnekte INTEGER değişkene 32767'den daha büyük bir değer girildiği için hata oluştu.
Detay için QuickBasic programında Yardım / Contents / Data types ve Yardım / Contents / Limits to QuickBasic / Arrays sayfalarına bakınız.

24 Mart 2023 Cuma

QuickBasic - 28: Hata ayıklama-1

Yayınlama: 18 Ağustos 2022
Güncelleme: 24 Mart 2023

Hata ayıklama (Dubugging)

Programlamada hata nedir?

Programlama sürecinde, yazılan kodların beklenen şekilde çalışmamasına hata denir. Bu hatalar, programın istenmeyen şekilde sonlanması, duraklaması, sonsuz döngüye girmesi, yanlış bir işlem yapması veya yanlış sonuçlar üretmesi gibi istenmeyen durumlarla kendini gösterebilir. Bu hatalar genellikle programlama dilinin doğru bir şekilde kullanılmamasından kaynaklanır ve programcıların kodlarını test etmeleri ve hataları düzeltmeleri gereklidir.

Yazılım geliştirme sürecinde, programcılar tarafından yapılan hatalara genellikle bug(böcek) denir ve bu hatalar, programın beklenen şekilde çalışmamasına neden olabilir. Bu nedenle, programcıların hataları tespit edip düzeltmeleri önemlidir. Bu sürece genellikle hata ayıklama(debugging) adı verilir. Hata ayıklama, programcıların kodlarını inceleyerek hataları tespit etmelerini ve düzeltmelerini sağlar. Bu süreç, yazılımın daha sağlam ve güvenilir hale gelmesine yardımcı olur.

Eniac.jpg

Yazılım hatalarına bug(böcek) denmesinin ilginç bir hikayesi var. İlk bilgisayarlar çok büyük ve karmaşıktı. İçlerinde insanların dahi gezinebileceği kadar genişti ve devre elemanları birbirine kablolarla bağlıydı.

Bu nedenle, bir hata oluştuğunda, mühendisler tüm kablo bağlantılarını kontrol etmek için bilgisayarın içine girerek hatayı tespit etmeye çalışıyorlardı. Bir seferinde, bir hata nedeniyle bilgisayar çalışmadığında, mühendisler bağlantıları kontrol ederken bir böcek fark ettiler.

Böceğin, bilgisayarın içinde oluşturduğu bir kısa devre, hatalı çalışmaya neden oluyordu. Mühendisler böceği temizledi ve hatayı giderdi. O günden beri, yazılım hatalarına bug denmesi yaygınlaştı.

4 Şubat 2023 Cumartesi

QuickBasic Kod Yarışması. Soru 4

TC kimlik numarasının son 2 basamağı kontrol kodlaması içindir. İlk 10 basamaktaki rakamlar ile yapılan algoritmik işlemlerin sonucu ile son 2 basamak karşılaştırılır. Çıkan sonuç algoritmaya uygunsa TC kimlik no doğru değilse yanlıştır.

Soru 4

Kullanıcının girdiği TC kimlik numarasının doğruluğunu kontrol eden QuickBasic program kodlarını yazınız.

TC Kimlik No Doğrulama Algoritması:

Kurallar:

  1. TC kimlik numaraları 11 basamaklı bir sayıdır.
  2. İlk basamak 0 olamaz.
  3. TC kimlik numarası 1. 3. 5. 7. 9. basamaklarının toplamının 7 katından,
    2. 4. 6. 8. basamaklarının toplamını çıkarttığımızda elde ettiğimiz sonucun 10'a bölümünden kalan sayı 10. basamaktaki sayıyı vermelidir.
  4. İlk 10 basamağın toplamından elde edilen sonucun 10'a bölümünden kalan sayı 11. basamaktaki sayıyı vermelidir.
  5. Bu 4 kuraldan biri tutmuyor ise TC kimlik numarası yanlıştır.

Kodlar QuickBasic v4.5 uyumlu olacak.

Hedefler:

  • En kısa kodlama,
  • En az değişken ve fonksiyon kullanma
  • En hızlı çalışan kodu yazma.
Maalesef yarışmanın bir ödülü yok.
Kodlarınızı veya kodlarınızın olduğu sayfa linkini yorum kısmına ekleyiniz.
Hedefe ulaşan en iyi kod ve kod yazarı bu sayfada yayınlanacak.


QuickBasic Ana Sayfa