Merhaba,
Süper Trim kısaca STrim ;)
STrim.bas dosyası yükledikten sonra STrim Macrosu çalıştırdığınız da
Sizden Kesişen çizgilerin ORTASINDA bir NOKTA göstermeniz istenir.
Örnek olarak resmi inceleyiniz
(STrim uygulamadan önceki durum)
STrim Makrosu çalıştırılıp kesişen çizgilerin ortasında ki
bir noktayı Tıkladığınızda (boş kapalı alan: Hatch alanı şeçermiş gibi)
sonucu aşağıda ki resimde inceleyebilirsiniz.
(STrim uygulandıktan sonra ki durum)
Komutan çıkmadan birden fazla kapalı alan seçebilirsiniz.
Esc, Space, Enter veya Fare Sağtıklandıgında STrim sonlandırılır.
Function SecimPoly(Optional kim As String = "yakala")
Dim fType(0) As Integer, fData(0)
Dim PolySS As AcadSelectionSet
Dim Secili As Integer
On Error Resume Next
Set PolySS = ThisDrawing.SelectionSets("PolySS")
If Err Then Set PolySS = ThisDrawing.SelectionSets.Add("PolySS")
PolySS.Clear
On Error GoTo 0
fType(0) = 0: fData(0) = "LWPOLYLINE"
' Tüm PolyLine ları seç
PolySS.Select acSelectionSetAll, , , fType, fData
' gelen kim değeri yakala ise
If kim = "yakala" Then
' yeni(not: ilginçtir ilk oluyor(0 değeri)) oluşturulan Polyline nın ObjectID ver
SecimPoly = PolySS.Item(0).ObjectID
Else
' kim değeri yakala DEĞİLSE çizimde ki PolyLine miktarını ver
SecimPoly = PolySS.Count
End If
PolySS.Delete
End Function
Private Sub LineCenterTrim()
Dim fType(0) As Integer
Dim fData(0) As Variant
Dim LayerSS As AcadSelectionSet
Dim Secili As Integer
Dim ScaleLine As AcadLine
Dim Sp(0 To 2) As Double
Dim Ep(0 To 2) As Double
Dim Str As ACAD_POINT
On Error Resume Next
Set LayerSS = ThisDrawing.SelectionSets("LayerSS")
If Err Then Set LayerSS = ThisDrawing.SelectionSets.Add("LayerSS")
LayerSS.Clear
fType(0) = 8: fData(0) = "STrimgecici"
' STrimgecici Layerinde ki tüm objeleri seç
LayerSS.Select acSelectionSetAll, , , fType, fData
' Son objeji sil
LayerSS.Item(LayerSS.Count - 1).Delete
' Son obje silindiği için - 2 kadar döngü
For Secili = 0 To LayerSS.Count - 2
' Lineları tek tek yakala
Set ScaleLine = LayerSS.Item(Secili)
' Line ların başlangıç noktası koordinatını öğren
Sp(0) = ScaleLine.StartPoint(0): Sp(1) = ScaleLine.StartPoint(1): Sp(2) = ScaleLine.StartPoint(2)
' Line ları başlangıç noktasından tutarak 0.5 oranında Scale uygula
ScaleLine.ScaleEntity Sp, 0.5
' line ların son nokta koordinatlarını ögren
Ep(0) = ScaleLine.EndPoint(0): Ep(1) = ScaleLine.EndPoint(1): Ep(2) = ScaleLine.EndPoint(2)
' Str olarak hafızaya al
Str = Str & Replace(Ep(0), ",", ".") & "," & Replace(Ep(1), ",", ".") & "," & Replace(Ep(2), ",", ".") & vbCr
' Line ları yok et
LayerSS.Item(Secili).Delete
Next Secili
' Trim uygula tüm objeleri sec sonra Str noktalarını tıkla
ThisDrawing.SendCommand Chr(3) & Chr(3) & "trim" & vbCr & "ALL" & vbCr & vbCr & Str & vbCr
Str = ""
LayerSS.Delete
End Sub
Sub STrim()
' info(at)mentes.com.tr
' ibrahim Yorulmaz - Antalya
' o 532 625 55 66
Dim KacPoly As Integer
Dim KacPoly2 As Integer
Dim oPoly As AcadLWPolyline
Dim oCoords As Variant
On Error Resume Next
Do
' Function SecimPoly le PolyLineları say
KacPoly = SecimPoly("say")
Dim returnPnt As Variant
returnPnt = ThisDrawing.Utility.GetPoint(, "Kesişen çizgilerin ORTASINDA bir NOKTA gösteriniz: ")
If Error = "User input is a keyword" Or Error = "Method 'GetPoint' of object 'IAcadUtility' failed" Then
ThisDrawing.Utility.Prompt "STrim Sonlandırıldı."
ThisDrawing.SendCommand Chr(3) & Chr(3)
Exit Sub
End If
Pnt0 = Replace(returnPnt(0), ",", ".")
Pnt1 = Replace(returnPnt(1), ",", ".")
ThisDrawing.SendCommand Chr(3) & Chr(3) & "-boundary" & vbCr & Pnt0 & "," & Pnt1 & vbCr & vbCr
' Function SecimPoly le PolyLineları say
KacPoly2 = SecimPoly("say")
' eğer cizimde yeni PolyLine yoksa
If KacPoly = KacPoly2 Then
ThisDrawing.Utility.Prompt "Lütfen Kapalı bir alan olduğunu kontrol ediniz. !" & vbCrLf
Else
' yeni oluşturulan Polyline(boundary) ı yakala
' Function SecimPoly("yakala") la yeni oluşturulan Polyline nın ObjectID sini öğren
Set oPoly = ThisDrawing.ObjectIdToObject(SecimPoly("yakala"))
' STrimgecici ismin de yeni Layer oluştur
ThisDrawing.Layers.Add ("STrimgecici")
' Yakalanan PolyLine nın Layerini STrimgecici yap
oPoly.Layer = "STrimgecici"
' Yakalanan PolyLine a Explode uygula (patlat linelar cıksın ortaya)
oPoly.Explode
' Private Sub LineCenterTrim() uygula
' Lineları bul
' ilk noktasından tutarak 0.5 scala yap
' son noktaları bul
' lineları yok et
' Sonnoktalara göre çizime trim uygula
LineCenterTrim
' Oluşturdugumuz STrimgecici Layerini yok et
ThisDrawing.Layers("STrimgecici").Delete
End If
Loop
End Sub
Ekler:
Dosya: STrim.zip
Dosya içeriği: STrim.bas
Kolay gelsin