对不起,我不明白你的意思。你想详细说明一下吗?
BigAl所说的是正确的,你没有重新发明已经存在的东西,但如果你没有访问它的权限,其他工具不能满足你的需要,那么编写自己的模块是唯一的出路。在这方面,我认为如果可以的话,这里有足够多的人愿意提供帮助。 很高兴见到你,泰克
我认为你可以做任何你感兴趣的事情。
这只是严格选择更有价值的东西的另一个角度。
但两者都有资格,这取决于你自己的需要。和倾向。
因此,比格尔的建议当然是公平的,如果绿蜂有兴趣以最少的努力(时间和金钱)获得特定的结果,他会遵循它。
如果GreenBee有兴趣开发一段VBA代码,以加深他在该特定方向上的对象/方法管理知识,并将其用于进一步的需要,他会选择自己开发一些代码。
在我明确支持的后一种情况下,这个论坛的人肯定会提供很大帮助。
最后,与比格尔和你的观点(我相信这里也有许多其他人的观点)相比,我的“(并因此获得负面论坛数字)”既是对我先验非实用主义观点的自我讽刺评论,也是一种确认我最初立场的方式,尽管随后出现了“嘘声”。
希望这样做
再见 我必须承认RICVBA有道理。我的目的是看看在写一段代码时我能把我的知识(不是那么广博)推到多大程度,同时也要加快我的工作过程。
这是代码。我承认这可能会让人困惑,但这只是一个过程中的版本。用户输入两个变量,即道路宽度和横截面之间的距离,然后在屏幕上依次选择道路的第一个点、最后一个点和它们之间的所有路段。
Private Sub CommandButton1_Click()
Dim SOS As AcadSelectionSet
Dim objSS As AcadSelectionSet
Dim PopLin As AcadLine
Dim Kruzic As AcadCircle
Dim objent As AcadEntity
Dim Pravac As AcadLine
Dim PrKrivina As AcadLWPolyline
Dim Luk As AcadArc
Dim Rluk, Alfa As Double
Dim L, Lpravac, Lprkriv, Lluk, Lostatak As Double
Dim PocToc As Variant
Dim ZadToc As Variant
Dim PrvaTocka(0 To 2) As Double
Dim DrugaTocka(0 To 2) As Double
Dim RazProf, SirCest As Double
Dim Krug As AcadCircle
Dim sjeciste As Variant
Dim sjeciste2 As Variant
Dim BrProfila, i, n As Integer
Dim PlusMinus As Boolean
Dim Rpoplin As Double
Dim pi As Double
Dim linija, linija1, linija2 As AcadLine
Dim BrojacProfila As Integer
Dim SredisnjaTockaLuka As Variant
Dim BrPomaka, brojX As Integer
Dim kolicnik As Double
Dim PomocnaTocka1(0 To 2) As Double
Dim PomocnaTocka2(0 To 2) As Double
Dim BrTocakaPlinea, Kocnica, LostatakPrKr As Integer
Dim Lpomocni As Double
Dim KoorNaopakePrKr() As Double
UserForm1.hide
pi = 3.14159265358979
RazProf = txtRazProf.Value
SirCest = txtSirCest.Value
Rpoplin = SirCest * 2
PocToc = ThisDrawing.Utility.GetPoint(, "Odaberite pocetnu tocku trase")
ZadToc = ThisDrawing.Utility.GetPoint(, "Odaberite zadnju tocku trase")
For Each SOS In ThisDrawing.SelectionSets
If SOS.Name = "MySS" Then
ThisDrawing.SelectionSets("MySS").Delete
Exit For
End If
Next
ThisDrawing.SelectionSets.Add ("MySS")
Set objSS = ThisDrawing.SelectionSets("MySS")
objSS.SelectOnScreen
If objSS.Count < 1 Then Exit Sub
i = 0
L = 0
Lostatak = 0
PlusMinus = False
'********GLAVNI DIO PROGRAMA********
For Each objent In objSS
Select Case objent.ObjectName
'<<<<<PRAVAC>>>>>
Case "AcDbLine"
Set Pravac = objent
PlusMinus = False
L = L + Pravac.Length
'Ako pravac nije prvi element trase
If Abs(DrugaTocka(0) - Pravac.StartPoint(0)) < 0.000001 And Abs(DrugaTocka(1) - Pravac.StartPoint(1)) < 0.000001 _
And PrvaTocka(0) <> Pravac.EndPoint(0) And PrvaTocka(1) <> Pravac.EndPoint(1) Then
PrvaTocka(0) = DrugaTocka(0)
PrvaTocka(1) = DrugaTocka(1)
PrvaTocka(2) = DrugaTocka(2)
DrugaTocka(0) = Pravac.EndPoint(0)
DrugaTocka(1) = Pravac.EndPoint(1)
DrugaTocka(2) = Pravac.EndPoint(2)
PlusMinus = True
End If
If Abs(DrugaTocka(0) - Pravac.EndPoint(0)) < 0.000001 And Abs(DrugaTocka(1) - Pravac.EndPoint(1)) < 0.000001 _
And PrvaTocka(0) <> Pravac.StartPoint(0) And PrvaTocka(1) <> Pravac.StartPoint(1) Then
PrvaTocka(0) = DrugaTocka(0)
PrvaTocka(1) = DrugaTocka(1)
PrvaTocka(2) = DrugaTocka(2)
DrugaTocka(0) = Pravac.StartPoint(0)
DrugaTocka(1) = Pravac.StartPoint(1)
DrugaTocka(2) = Pravac.StartPoint(2)
PlusMinus = True
End If
If PlusMinus = True Then
If Pravac.Length > Lostatak Then
BrProfila = (Pravac.Length - Lostatak) \ RazProf
kolicnik = (Pravac.Length - Lostatak) / RazProf
If BrProfila > kolicnik Then
BrProfila = BrProfila - 1
End If
For i = 1 To BrProfila
'Za sve ostale profile
Set Krug = ThisDrawing.ModelSpace.AddCircle _
(PrvaTocka, (RazProf * (i - 1) + Lostatak))
sjeciste = Pravac.IntersectWith(Krug, acExtendNone)
Set Kruzic = ThisDrawing.ModelSpace.AddCircle(sjeciste, SirCest / 3.5)
Krug.Delete
Set Krug = ThisDrawing.ModelSpace.AddCircle _
(PrvaTocka, (RazProf * (i - 1) + Lostatak + Rpoplin))
sjeciste = Pravac.IntersectWith(Krug, acExtendNone)
Set linija = ThisDrawing.ModelSpace.AddLine(Kruzic.Center, sjeciste)
linija.Rotate Kruzic.Center, pi / 2
Set PopLin = ThisDrawing.ModelSpace.AddLine(linija.EndPoint, Kruzic.Center)
linija.Delete
PopLin.Mirror DrugaTocka, PrvaTocka
Krug.Delete
Next
'Za predzadnji profil na pravcu
Set Krug = ThisDrawing.ModelSpace.AddCircle _
(DrugaTocka, (Pravac.Length - RazProf * BrProfila - Lostatak))
sjeciste = Pravac.IntersectWith(Krug, acExtendNone)
Set Kruzic = ThisDrawing.ModelSpace.AddCircle(sjeciste, SirCest / 3.5)
Krug.Delete
Set linija = ThisDrawing.ModelSpace.AddLine(DrugaTocka, sjeciste)
If Pravac.Length > (linija.Length + Rpoplin) Then
Set Krug = ThisDrawing.ModelSpace.AddCircle(DrugaTocka, (linija.Length + Rpoplin))
linija.Delete
sjeciste2 = Pravac.IntersectWith(Krug, acExtendNone)
Krug.Delete
Set PopLin = ThisDrawing.ModelSpace.AddLine(sjeciste2, sjeciste)
PopLin.Rotate sjeciste, pi / 2
PopLin.Mirror PrvaTocka, DrugaTocka
Else
linija.Delete
Set linija = ThisDrawing.ModelSpace.AddLine(PrvaTocka, DrugaTocka)
linija.Rotate sjeciste, pi / 2
linija.Move linija.StartPoint, sjeciste
BrPomaka = (Rpoplin) \ Pravac.Length
kolicnik = (Rpoplin) / Pravac.Length
If BrPomaka < kolicnik Then
For i = 1 To BrPomaka
linija.Move linija.StartPoint, linija.EndPoint
Next
Else
For i = 1 To (BrPomaka - 1)
linija.Move linija.StartPoint, linija.EndPoint
Next
End If
Set Krug = ThisDrawing.ModelSpace.AddCircle(sjeciste, Rpoplin)
sjeciste2 = linija.IntersectWith(Krug, acExtendNone)
Krug.Delete
linija.Delete
Set PopLin = ThisDrawing.ModelSpace.AddLine(sjeciste2, sjeciste)
PopLin.Mirror PrvaTocka, DrugaTocka
End If
Lostatak = RazProf - (Pravac.Length - (BrProfila * RazProf) - Lostatak)
'Ako je pravac zadnji element trase
If DrugaTocka(0) = ZadToc(0) And DrugaTocka(1) = ZadToc(1) Then
Set Krug = ThisDrawing.ModelSpace.AddCircle(DrugaTocka, Rpoplin)
sjeciste = Pravac.IntersectWith(Krug, acExtendNone)
Set Kruzic = ThisDrawing.ModelSpace.AddCircle(DrugaTocka, SirCest / 3.5)
Krug.Delete
Set linija = ThisDrawing.ModelSpace.AddLine(sjeciste, DrugaTocka)
linija.Rotate DrugaTocka, pi / 2
Set PopLin = ThisDrawing.ModelSpace.AddLine(linija.StartPoint, DrugaTocka)
linija.Delete
PopLin.Mirror DrugaTocka, PrvaTocka
End If
'Ako je duljina pravca manja od Lostatak
Else
Lostatak = Lostatak - Pravac.Length
'Ako je pravac zadnji element trase
If DrugaTocka(0) = ZadToc(0) And DrugaTocka(1) = ZadToc(1) Then
Set Krug = ThisDrawing.ModelSpace.AddCircle(DrugaTocka, Rpoplin)
sjeciste = Pravac.IntersectWith(Krug, acExtendNone)
Set Kruzic = ThisDrawing.ModelSpace.AddCircle(DrugaTocka, SirCest / 3.5)
Krug.Delete
Set linija = ThisDrawing.ModelSpace.AddLine(sjeciste, DrugaTocka)
linija.Rotate DrugaTocka, pi / 2
Set PopLin = ThisDrawing.ModelSpace.AddLine(linija.StartPoint, DrugaTocka)
linija.Delete
PopLin.Mirror DrugaTocka, PrvaTocka
End If
End If
PlusMinus = False
End If
'Ako je pravac prvi element trase
If (Pravac.StartPoint(0) = PocToc(0)) And (Pravac.StartPoint(1) = PocToc(1)) Then
PrvaTocka(0) = PocToc(0)
PrvaTocka(1) = PocToc(1)
PrvaTocka(2) = PocToc(2)
DrugaTocka(0) = Pravac.EndPoint(0)
DrugaTocka(1) = Pravac.EndPoint(1)
DrugaTocka(2) = Pravac.EndPoint(2)
PlusMinus = True
End If
If (Pravac.EndPoint(0) = PocToc(0)) And (Pravac.EndPoint(1) = PocToc(1)) Then
PrvaTocka(0) = PocToc(0)
PrvaTocka(1) = PocToc(1)
PrvaTocka(2) = PocToc(2)
DrugaTocka(0) = Pravac.StartPoint(0)
DrugaTocka(1) = Pravac.StartPoint(1)
DrugaTocka(2) = Pravac.StartPoint(2)
PlusMinus = True
End If
If PlusMinus = True Then
'Za prvi profil na pravcu
Set Krug = ThisDrawing.ModelSpace.AddCircle(PrvaTocka, Rpoplin)
sjeciste = Pravac.IntersectWith(Krug, acExtendNone)
Set Kruzic = ThisDrawing.ModelSpace.AddCircle(PrvaTocka, SirCest / 3.5)
Krug.Delete
Set linija = ThisDrawing.ModelSpace.AddLine(sjeciste, PrvaTocka)
linija.Rotate PrvaTocka, pi / 2
Set PopLin = ThisDrawing.ModelSpace.AddLine(linija.StartPoint, PrvaTocka)
linija.Delete
PopLin.Mirror DrugaTocka, PrvaTocka
'Provjeriti je li razmak profila manji od duljine pravca
If Pravac.Length > RazProf Then
Set Krug = ThisDrawing.ModelSpace.AddCircle(PrvaTocka, Rpoplin)
sjeciste = Pravac.IntersectWith(Krug, acExtendNone)
Set Kruzic = ThisDrawing.ModelSpace.AddCircle(PrvaTocka, SirCest / 3.5)
Krug.Delete
Set linija = ThisDrawing.ModelSpace.AddLine(sjeciste, PrvaTocka)
linija.Rotate PrvaTocka, pi / 2
Set PopLin = ThisDrawing.ModelSpace.AddLine(linija.StartPoint, PrvaTocka)
linija.Delete
PopLin.Mirror DrugaTocka, PrvaTocka
BrProfila = Pravac.Length \ RazProf
kolicnik = Pravac.Length / RazProf
If BrProfila > kolicnik Then
BrProfila = BrProfila - 1
End If
For i = 1 To BrProfila
Set Krug = ThisDrawing.ModelSpace.AddCircle(PrvaTocka, RazProf * i)
sjeciste = Pravac.IntersectWith(Krug, acExtendNone)
Set Kruzic = ThisDrawing.ModelSpace.AddCircle(sjeciste, SirCest / 3.5)
Krug.Delete
Set Krug = ThisDrawing.ModelSpace.AddCircle(PrvaTocka, RazProf * i - Rpoplin)
sjeciste = Pravac.IntersectWith(Krug, acExtendNone)
Set linija = ThisDrawing.ModelSpace.AddLine(Kruzic.Center, sjeciste)
linija.Rotate Kruzic.Center, pi / 2
Set PopLin = ThisDrawing.ModelSpace.AddLine(linija.EndPoint, Kruzic.Center)
linija.Delete
PopLin.Mirror DrugaTocka, PrvaTocka
Krug.Delete
Next
Lostatak = RazProf - (Pravac.Length - ((i - 1) * RazProf))
'Ako je pravac zadnji element trase
If DrugaTocka(0) = ZadToc(0) And DrugaTocka(1) = ZadToc(1) Then
Set Krug = ThisDrawing.ModelSpace.AddCircle(DrugaTocka, Rpoplin)
sjeciste = Pravac.IntersectWith(Krug, acExtendNone)
Set Kruzic = ThisDrawing.ModelSpace.AddCircle(DrugaTocka, SirCest / 3.5)
Krug.Delete
Set linija = ThisDrawing.ModelSpace.AddLine(sjeciste, DrugaTocka)
linija.Rotate DrugaTocka, pi / 2
Set PopLin = ThisDrawing.ModelSpace.AddLine(linija.StartPoint, DrugaTocka)
linija.Delete
PopLin.Mirror DrugaTocka, PrvaTocka
End If
'Ako je duljina pravca manja od razmaka profila
Else
'Ako je pravac zadnji element trase
If DrugaTocka(0) = ZadToc(0) And DrugaTocka(1) = ZadToc(1) Then
Set Krug = ThisDrawing.ModelSpace.AddCircle(DrugaTocka, Rpoplin)
sjeciste = Pravac.IntersectWith(Krug, acExtendNone)
Set Kruzic = ThisDrawing.ModelSpace.AddCircle(DrugaTocka, SirCest / 3.5)
Krug.Delete
Set linija = ThisDrawing.ModelSpace.AddLine(sjeciste, DrugaTocka)
linija.Rotate DrugaTocka, pi / 2
Set PopLin = ThisDrawing.ModelSpace.AddLine(linija.StartPoint, DrugaTocka)
linija.Delete
PopLin.Mirror DrugaTocka, PrvaTocka
End If
Lostatak = RazProf - Pravac.Length
End If
End If
'<<<<<PRIJELAZNA KRIVINA>>>>>
Case "AcDbPolyline"
Set PrKrivina = objent
BrTocakaPlinea = UBound(PrKrivina.Coordinates)
ReDim KoorNaopakePrKr(BrTocakaPlinea)
L = L + PrKrivina.Length
LostatakPrKr = Lostatak
'Ako prijelazna krivina nije prvi element trase
If Abs(DrugaTocka(0) - PrKrivina.Coordinates(0)) < 0.00001 And _
Abs(DrugaTocka(1) - PrKrivina.Coordinates(1)) < 0.00001 And _
PrKrivina.Coordinates(BrTocakaPlinea - 1) <> PrvaTocka(0) And _
PrKrivina.Coordinates(BrTocakaPlinea) <> PrvaTocka(1) Then
PrvaTocka(0) = PrKrivina.Coordinates(0)
PrvaTocka(1) = PrKrivina.Coordinates(1)
PrvaTocka(2) = 0
DrugaTocka(0) = PrKrivina.Coordinates(BrTocakaPlinea - 1)
DrugaTocka(1) = PrKrivina.Coordinates(BrTocakaPlinea)
DrugaTocka(2) = 0
PlusMinus = True
End If
If Abs(DrugaTocka(0) - PrKrivina.Coordinates(BrTocakaPlinea - 1)) < 0.00001 And _
Abs(DrugaTocka(1) - PrKrivina.Coordinates(BrTocakaPlinea)) < 0.00001 And _
PrKrivina.Coordinates(0) <> PrvaTocka(0) And _
PrKrivina.Coordinates(1) <> PrvaTocka(1) Then
For i = 0 To BrTocakaPlinea Step 2
KoorNaopakePrKr(i) = PrKrivina.Coordinates(BrTocakaPlinea - i - 1)
KoorNaopakePrKr(i + 1) = PrKrivina.Coordinates(BrTocakaPlinea - i)
Next
PrKrivina.Delete
Set PrKrivina = ThisDrawing.ModelSpace.AddLightWeightPolyline(KoorNaopakePrKr)
PrvaTocka(0) = PrKrivina.Coordinates(0)
PrvaTocka(1) = PrKrivina.Coordinates(1)
PrvaTocka(2) = 0
DrugaTocka(0) = PrKrivina.Coordinates(BrTocakaPlinea - 1)
DrugaTocka(1) = PrKrivina.Coordinates(BrTocakaPlinea)
DrugaTocka(2) = 0
PlusMinus = True
End If
If PlusMinus = True Then
'Prva tocka prijelazne krivine
PomocnaTocka1(0) = PrKrivina.Coordinates(2)
PomocnaTocka1(1) = PrKrivina.Coordinates(3)
PomocnaTocka1(2) = 0
Set linija1 = ThisDrawing.ModelSpace.AddLine(PrvaTocka, PomocnaTocka1)
Set linija2 = ThisDrawing.ModelSpace.AddLine(PrvaTocka, PomocnaTocka1)
linija1.Rotate PrvaTocka, pi / 2
linija2.Rotate PrvaTocka, 3 * pi / 2
BrPomaka = (Rpoplin) \ linija1.Length
kolicnik = (Rpoplin) / linija1.Length
If BrPomaka < kolicnik Then
For i = 1 To BrPomaka
linija1.Move linija1.StartPoint, linija1.EndPoint
linija2.Move linija2.StartPoint, linija2.EndPoint
Next
Else
For i = 1 To (BrPomaka - 1)
linija1.Move linija1.StartPoint, linija1.EndPoint
linija2.Move linija2.StartPoint, linija2.EndPoint
Next
End If
Set Krug = ThisDrawing.ModelSpace.AddCircle(PrvaTocka, Rpoplin)
sjeciste = linija1.IntersectWith(Krug, acExtendNone)
sjeciste2 = linija2.IntersectWith(Krug, acExtendNone)
Krug.Delete
linija1.Delete
linija2.Delete
Set PopLin = ThisDrawing.ModelSpace.AddLine(sjeciste, sjeciste2)
Set Kruzic = ThisDrawing.ModelSpace.AddCircle(PrvaTocka, SirCest / 3.5)
'Ostali profili na prijelaznoj krivini
brojX = 0
Lpomocni = 0
If PrKrivina.Length > LostatakPrKr Then
BrProfila = (PrKrivina.Length - LostatakPrKr) \ RazProf
kolicnik = (PrKrivina.Length - LostatakPrKr) / RazProf
If BrProfila > kolicnik Then
BrProfila = BrProfila - 1
End If
For i = 1 To BrProfila + 1
If i < 2 Or i = 2 Then
Kocnica = i - 1
Else
Kocnica = Kocnica
End If
LostatakPrKr = LostatakPrKr + RazProf * Kocnica
Do
PomocnaTocka1(0) = PrKrivina.Coordinates(brojX)
PomocnaTocka1(1) = PrKrivina.Coordinates(brojX + 1)
PomocnaTocka1(2) = 0
PomocnaTocka2(0) = PrKrivina.Coordinates(brojX + 2)
PomocnaTocka2(1) = PrKrivina.Coordinates(brojX + 3)
PomocnaTocka2(2) = 0
brojX = brojX + 2
Set linija1 = ThisDrawing.ModelSpace.AddLine(PomocnaTocka1, PomocnaTocka2)
Lpomocni = Lpomocni + linija1.Length
If Lpomocni < LostatakPrKr Then
linija1.Delete
End If
Loop While Lpomocni < LostatakPrKr
Set Krug = ThisDrawing.ModelSpace.AddCircle(PomocnaTocka2, (Lpomocni - LostatakPrKr))
sjeciste = linija1.IntersectWith(Krug, acExtendNone)
Set Kruzic = ThisDrawing.ModelSpace.AddCircle(sjeciste, SirCest / 3.5)
linija1.Delete
Krug.Delete
Set linija1 = ThisDrawing.ModelSpace.AddLine(PomocnaTocka1, sjeciste)
Set linija2 = ThisDrawing.ModelSpace.AddLine(PomocnaTocka1, sjeciste)
linija1.Rotate sjeciste, pi / 2
linija2.Rotate sjeciste, 3 * pi / 2
BrPomaka = (Rpoplin) \ linija1.Length
kolicnik = (Rpoplin) / linija1.Length
If BrPomaka < kolicnik Then
For n = 1 To BrPomaka
linija1.Move linija1.EndPoint, linija1.StartPoint
linija2.Move linija2.EndPoint, linija2.StartPoint
Next
Else
For n = 1 To (BrPomaka - 1)
linija1.Move linija1.EndPoint, linija1.StartPoint
linija2.Move linija2.EndPoint, linija2.StartPoint
Next
End If
Set Krug = ThisDrawing.ModelSpace.AddCircle(sjeciste, Rpoplin)
sjeciste = linija1.IntersectWith(Krug, acExtendNone)
sjeciste2 = linija2.IntersectWith(Krug, acExtendNone)
Krug.Delete
linija1.Delete
linija2.Delete
Set PopLin = ThisDrawing.ModelSpace.AddLine(sjeciste, sjeciste2)
Next
Lostatak = RazProf - (PrKrivina.Length - Lostatak - BrProfila * RazProf)
Else
Lostatak = Lostatak - PrKrivina.Length
End If
'Ako je prijelazna krivina zadnji element trase
If DrugaTocka(0) = ZadToc(0) And DrugaTocka(1) = ZadToc(1) Then
PomocnaTocka1(0) = PrKrivina.Coordinates(BrTocakaPlinea - 3)
PomocnaTocka1(1) = PrKrivina.Coordinates(BrTocakaPlinea - 2)
PomocnaTocka1(2) = 0
Set linija1 = ThisDrawing.ModelSpace.AddLine(PomocnaTocka1, DrugaTocka)
Set linija2 = ThisDrawing.ModelSpace.AddLine(PomocnaTocka1, DrugaTocka)
linija1.Rotate DrugaTocka, pi / 2
linija2.Rotate DrugaTocka, 3 * pi / 2
BrPomaka = (Rpoplin) \ linija1.Length
kolicnik = (Rpoplin) / linija1.Length
If BrPomaka < kolicnik Then
For n = 1 To BrPomaka
linija1.Move linija1.EndPoint, linija1.StartPoint
linija2.Move linija2.EndPoint, linija2.StartPoint
Next
Else
For n = 1 To (BrPomaka - 1)
linija1.Move linija1.EndPoint, linija1.StartPoint
linija2.Move linija2.EndPoint, linija2.StartPoint
Next
End If
Set Krug = ThisDrawing.ModelSpace.AddCircle(DrugaTocka, Rpoplin)
sjeciste = linija1.IntersectWith(Krug, acExtendNone)
sjeciste2 = linija2.IntersectWith(Krug, acExtendNone)
Krug.Delete
linija1.Delete
linija2.Delete
Set PopLin = ThisDrawing.ModelSpace.AddLine(sjeciste, sjeciste2)
Set Kruzic = ThisDrawing.ModelSpace.AddCircle(DrugaTocka, SirCest / 3.5)
End If
End If
'<<<<<KRUZNI LUK>>>>>
Case "AcDbArc"
Set Luk = objent
L = L + Luk.ArcLength
Lluk = Luk.ArcLength
Rluk = Luk.Radius
PlusMinus = False
'Ako luk nije prvi element trase
'Ako je startpoint luka jednak drugoj tocki
If Abs(Luk.StartPoint(0) - DrugaTocka(0)) < 0.000001 And Abs(Luk.StartPoint(1) - DrugaTocka(1)) < 0.000001 _
And Luk.EndPoint(0) <> PrvaTocka(0) And Luk.EndPoint(1) <> PrvaTocka(1) Then
PrvaTocka(0) = Luk.StartPoint(0)
PrvaTocka(1) = Luk.StartPoint(1)
PrvaTocka(2) = Luk.StartPoint(2)
DrugaTocka(0) = Luk.EndPoint(0)
DrugaTocka(1) = Luk.EndPoint(1)
DrugaTocka(2) = Luk.EndPoint(2)
PlusMinus = True
End If
'Ako je endpoint luka jednak drugoj tocki
If Abs(Luk.EndPoint(0) - DrugaTocka(0)) < 0.000001 And Abs(Luk.EndPoint(1) - DrugaTocka(1)) < 0.000001 _
And Luk.StartPoint(0) <> PrvaTocka(0) And Luk.StartPoint(1) <> PrvaTocka(1) Then
PrvaTocka(0) = Luk.EndPoint(0)
PrvaTocka(1) = Luk.EndPoint(1)
PrvaTocka(2) = Luk.EndPoint(2)
DrugaTocka(0) = Luk.StartPoint(0)
DrugaTocka(1) = Luk.StartPoint(1)
DrugaTocka(2) = Luk.StartPoint(2)
PlusMinus = True
End If
If PlusMinus = True Then
'pocetna tocka luka
Set linija1 = ThisDrawing.ModelSpace.AddLine(PrvaTocka, Luk.Center)
Set Krug = ThisDrawing.ModelSpace.AddCircle(PrvaTocka, Rpoplin)
sjeciste = linija1.IntersectWith(Krug, acExtendNone)
Krug.Delete
linija1.Delete
Set linija1 = ThisDrawing.ModelSpace.AddLine(PrvaTocka, sjeciste)
Set linija2 = ThisDrawing.ModelSpace.AddLine(linija1.EndPoint, PrvaTocka)
linija2.Move linija2.StartPoint, PrvaTocka
Set PopLin = ThisDrawing.ModelSpace.AddLine(linija1.EndPoint, linija2.EndPoint)
Set Kruzic = ThisDrawing.ModelSpace.AddCircle(PrvaTocka, SirCest / 3.5)
linija1.Delete
linija2.Delete
'sredisnja tocka luka
Set linija1 = ThisDrawing.ModelSpace.AddLine(PrvaTocka, DrugaTocka)
Set Krug = ThisDrawing.ModelSpace.AddCircle(PrvaTocka, (linija1.Length / 2))
sjeciste = linija1.IntersectWith(Krug, acExtendNone)
Krug.Delete
linija1.Rotate sjeciste, pi / 2
SredisnjaTockaLuka = linija1.IntersectWith(Luk, acExtendNone)
linija1.Delete
Set Krug = ThisDrawing.ModelSpace.AddCircle(SredisnjaTockaLuka, Rpoplin)
Set linija1 = ThisDrawing.ModelSpace.AddLine(SredisnjaTockaLuka, Luk.Center)
sjeciste = linija1.IntersectWith(Krug, acExtendNone)
If UBound(sjeciste) = -1 Then
linija1.Move SredisnjaTockaLuka, Luk.Center
sjeciste = linija1.IntersectWith(Luk, acExtendNone)
End If
Krug.Delete
linija1.Delete
Set linija2 = ThisDrawing.ModelSpace.AddLine(SredisnjaTockaLuka, sjeciste)
linija2.Copy
linija2.Move sjeciste, SredisnjaTockaLuka
Set PopLin = ThisDrawing.ModelSpace.AddLine(linija2.StartPoint, sjeciste)
linija2.Delete
Set Kruzic = ThisDrawing.ModelSpace.AddCircle(SredisnjaTockaLuka, SirCest / 3.5)
'------>Ostali profili na luku
'Ako je luk duzi od razmaka profila
n = 0
If Lluk > Lostatak Then
BrProfila = (Lluk - Lostatak) \ RazProf
kolicnik = (Lluk - Lostatak) / RazProf
If BrProfila > kolicnik Then
BrProfila = BrProfila - 1
End If
For i = 1 To (BrProfila + 1)
Alfa = (Lostatak + n) / Rluk
Set linija1 = ThisDrawing.ModelSpace.AddLine(Luk.Center, PrvaTocka)
linija1.Rotate Luk.Center, Alfa
sjeciste2 = linija1.IntersectWith(Luk, acExtendNone)
If UBound(sjeciste2) = -1 Then
Alfa = -1 * Alfa
linija1.Rotate Luk.Center, (2 * Alfa)
sjeciste2 = linija1.IntersectWith(Luk, acExtendNone)
End If
Set Krug = ThisDrawing.ModelSpace.AddCircle(sjeciste2, Rpoplin)
sjeciste = Krug.IntersectWith(linija1, acExtendNone)
linija1.Delete
Krug.Delete
Set linija2 = ThisDrawing.ModelSpace.AddLine(sjeciste2, sjeciste)
linija2.Copy
linija2.Move sjeciste, sjeciste2
Set linija1 = ThisDrawing.ModelSpace.AddLine(sjeciste2, sjeciste)
Set PopLin = ThisDrawing.ModelSpace.AddLine(linija2.StartPoint, linija1.EndPoint)
linija1.Delete
linija2.Delete
Set Kruzic = ThisDrawing.ModelSpace.AddCircle(sjeciste2, SirCest / 3.5)
n = n + RazProf
Next
Lostatak = RazProf - (Luk.ArcLength - Lostatak - BrProfila * RazProf)
Else
Lostatak = Lostatak - Luk.ArcLength
End If
'Provjeriti da li je luk zadnji element trase
If Abs(DrugaTocka(0) - ZadToc(0)) < 0.00001 And Abs(DrugaTocka(1) - ZadToc(1)) < 0.00001 Then
Set linija1 = ThisDrawing.ModelSpace.AddLine(DrugaTocka, Luk.Center)
Set Krug = ThisDrawing.ModelSpace.AddCircle(DrugaTocka, Rpoplin)
sjeciste = linija1.IntersectWith(Krug, acExtendNone)
Krug.Delete
linija1.Delete
Set PopLin = ThisDrawing.ModelSpace.AddLine(DrugaTocka, sjeciste)
PopLin.Copy
PopLin.Move sjeciste, DrugaTocka
Set Kruzic = ThisDrawing.ModelSpace.AddCircle(DrugaTocka, SirCest / 3.5)
End If
PlusMinus = False
End If
'Provjeriti da li je luk prvi element trase
'Ako je prva tocka trase jednaka startpointu luka
If Luk.StartPoint(0) = PocToc(0) And Luk.StartPoint(1) = PocToc(1) Then
PrvaTocka(0) = Luk.StartPoint(0)
PrvaTocka(1) = Luk.StartPoint(1)
PrvaTocka(2) = Luk.StartPoint(2)
DrugaTocka(0) = Luk.EndPoint(0)
DrugaTocka(1) = Luk.EndPoint(1)
DrugaTocka(2) = Luk.EndPoint(2)
PlusMinus = True
End If
'Ako je prva tocka trase jednaka endpointu luka
If Luk.EndPoint(0) = PocToc(0) And Luk.EndPoint(1) = PocToc(1) Then
PrvaTocka(0) = Luk.EndPoint(0)
PrvaTocka(1) = Luk.EndPoint(1)
PrvaTocka(2) = Luk.EndPoint(2)
DrugaTocka(0) = Luk.StartPoint(0)
DrugaTocka(1) = Luk.StartPoint(1)
DrugaTocka(2) = Luk.StartPoint(2)
PlusMinus = True
End If
If PlusMinus = True Then
'pocetna tocka luka
Set linija1 = ThisDrawing.ModelSpace.AddLine(PrvaTocka, Luk.Center)
Set Krug = ThisDrawing.ModelSpace.AddCircle(PrvaTocka, Rpoplin)
sjeciste = linija1.IntersectWith(Krug, acExtendNone)
Krug.Delete
linija1.Delete
Set linija1 = ThisDrawing.ModelSpace.AddLine(PrvaTocka, sjeciste)
Set linija2 = ThisDrawing.ModelSpace.AddLine(linija1.EndPoint, PrvaTocka)
linija2.Move linija2.StartPoint, PrvaTocka
Set PopLin = ThisDrawing.ModelSpace.AddLine(linija1.EndPoint, linija2.EndPoint)
Set Kruzic = ThisDrawing.ModelSpace.AddCircle(PrvaTocka, SirCest / 3.5)
linija1.Delete
linija2.Delete
'sredisnja tocka luka
Set linija1 = ThisDrawing.ModelSpace.AddLine(PrvaTocka, DrugaTocka)
Set Krug = ThisDrawing.ModelSpace.AddCircle(PrvaTocka, (linija1.Length / 2))
sjeciste = linija1.IntersectWith(Krug, acExtendNone)
Krug.Delete
linija1.Rotate sjeciste, pi / 2
SredisnjaTockaLuka = linija1.IntersectWith(Luk, acExtendNone)
linija1.Delete
Set Krug = ThisDrawing.ModelSpace.AddCircle(SredisnjaTockaLuka, Rpoplin)
Set linija1 = ThisDrawing.ModelSpace.AddLine(SredisnjaTockaLuka, Luk.Center)
sjeciste = linija1.IntersectWith(Krug, acExtendNone)
If UBound(sjeciste) = -1 Then
linija1.Move SredisnjaTockaLuka, Luk.Center
sjeciste = linija1.IntersectWith(Luk, acExtendNone)
End If
Krug.Delete
linija1.Delete
Set linija2 = ThisDrawing.ModelSpace.AddLine(SredisnjaTockaLuka, sjeciste)
linija2.Copy
linija2.Move sjeciste, SredisnjaTockaLuka
Set PopLin = ThisDrawing.ModelSpace.AddLine(linija2.StartPoint, sjeciste)
linija2.Delete
Set Kruzic = ThisDrawing.ModelSpace.AddCircle(SredisnjaTockaLuka, SirCest / 3.5)
'------>Ostali profili na luku
'Ako je luk duzi od razmaka profila
n = 0
If Lluk > Lostatak Then
BrProfila = (Lluk - Lostatak) \ RazProf
kolicnik = (Lluk - Lostatak) / RazProf
If BrProfila > kolicnik Then
BrProfila = BrProfila - 1
End If
For i = 1 To (BrProfila + 1)
Alfa = (Lostatak + n) / Rluk
Set linija1 = ThisDrawing.ModelSpace.AddLine(Luk.Center, PrvaTocka)
linija1.Rotate Luk.Center, Alfa
sjeciste2 = linija1.IntersectWith(Luk, acExtendNone)
If UBound(sjeciste2) = -1 Then
Alfa = -1 * Alfa
linija1.Rotate Luk.Center, (2 * Alfa)
sjeciste2 = linija1.IntersectWith(Luk, acExtendNone)
End If
Set Krug = ThisDrawing.ModelSpace.AddCircle(sjeciste2, Rpoplin)
sjeciste = Krug.IntersectWith(linija1, acExtendNone)
linija1.Delete
Krug.Delete
Set linija2 = ThisDrawing.ModelSpace.AddLine(sjeciste2, sjeciste)
linija2.Copy
linija2.Move sjeciste, sjeciste2
Set linija1 = ThisDrawing.ModelSpace.AddLine(sjeciste2, sjeciste)
Set PopLin = ThisDrawing.ModelSpace.AddLine(linija2.StartPoint, linija1.EndPoint)
linija1.Delete
linija2.Delete
Set Kruzic = ThisDrawing.ModelSpace.AddCircle(sjeciste2, SirCest / 3.5)
n = n + RazProf
Next
Lostatak = RazProf - (Luk.ArcLength - Lostatak - BrProfila * RazProf)
Else
Lostatak = Lostatak - Luk.ArcLength
End If
'Provjeriti da li je luk zadnji element trase
If Abs(DrugaTocka(0) - ZadToc(0)) < 0.00001 And Abs(DrugaTocka(1) - ZadToc(1)) < 0.00001 Then
Set linija1 = ThisDrawing.ModelSpace.AddLine(DrugaTocka, Luk.Center)
Set Krug = ThisDrawing.ModelSpace.AddCircle(DrugaTocka, Rpoplin)
sjeciste = linija1.IntersectWith(Krug, acExtendNone)
Krug.Delete
linija1.Delete
Set PopLin = ThisDrawing.ModelSpace.AddLine(DrugaTocka, sjeciste)
PopLin.Copy
PopLin.Move sjeciste, DrugaTocka
Set Kruzic = ThisDrawing.ModelSpace.AddCircle(DrugaTocka, SirCest / 3.5)
End If
End If
End Select
Next
End Sub 我知道它又长又乱,所以如果你们没有时间玩的话,我会理解的。
再见 我自找的!这段代码非常简洁,因为它是用您的母语术语编写的,但如果您附加一个示例dwg(可能是您遇到问题的dwg),我会尝试一下。
再见 我完全理解。这需要付出很大的努力才能让它变得有意义,我真的非常感谢你的帮助。
道路由直线、多段线和圆弧段组成。
这些评论是用克罗地亚语写的,如果你想翻译其中一些术语的话,这会有所帮助。然而,变量名没有多大意义,因为它们大多数是缩写。
再次感谢。
路图纸 大声思考。。。VBA是否具有Visual LISP的vlax曲线*函数的等效项?
页:
1
[2]