Тема: Соединить две полилинии
В наличии две полилинии objPoly1 и objPoly2 имеющие общую точку: какой метод VBA отвечает за их объединение, чтобы получить одну полилинию (аналог команды Pedit -> Join).
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → VBA → Соединить две полилинии
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
В наличии две полилинии objPoly1 и objPoly2 имеющие общую точку: какой метод VBA отвечает за их объединение, чтобы получить одну полилинию (аналог команды Pedit -> Join).
В VBA да и в LISP такого метода не существует
тебе нужно создавать новую линию из наборов параметров других линий
таких как цвет, толщина, слой,,,,, координаты, дуги.
Попробуй фичу от мастеров пера
Public Function MeJoinPline(FstPol As AcadLWPolyline, NxtPol As AcadLWPolyline, _ FuzVal as Double) As Boolean Dim FstArr() As Double Dim NxtArr() As Double Dim TmpPnt(0 To 1) As Double Dim FstLen As Long Dim NxtLen As Long Dim VtxCnt As Long Dim FstCnt As Long Dim NxtCnt As Long Dim RevFlg As Boolean Dim RetVal As Boolean With FstPol FstArr = .Coordinates NxtArr = NxtPol.Coordinates FstLen = UBound(FstArr) NxtLen = UBound(NxtArr) '<-Fst<-Nxt If MePointsEqual(FstArr, 1, NxtArr, NxtLen, FuzVal) Then MeReversePline FstPol FstArr = .Coordinates MeReversePline NxtPol NxtArr = NxtPol.Coordinates RevFlg = True RetVal = True '<-FstNxt-> ElseIf MePointsEqual(FstArr, 1, NxtArr, 1, FuzVal) Then MeReversePline FstPol FstArr = .Coordinates RevFlg = True RetVal = True 'Fst-><-Nxt ElseIf MePointsEqual(FstArr, FstLen, NxtArr, NxtLen, FuzVal) Then MeReversePline NxtPol NxtArr = NxtPol.Coordinates RevFlg = False RetVal = True 'Fst->Nxt-> ElseIf MePointsEqual(FstArr, FstLen, NxtArr, 1, FuzVal) Then RevFlg = False RetVal = True Else RetVal = False End If If RetVal Then FstCnt = (FstLen - 1) / 2 NxtCnt = 0 .SetBulge FstCnt, NxtPol.GetBulge(NxtCnt) For VtxCnt = 2 To NxtLen Step 2 FstCnt = FstCnt + 1 NxtCnt = NxtCnt + 1 TmpPnt(0) = NxtArr(VtxCnt) TmpPnt(1) = NxtArr(VtxCnt + 1) .AddVertex FstCnt, TmpPnt .SetBulge FstCnt, NxtPol.GetBulge(NxtCnt) Next VtxCnt .Update NxtPol.Delete If RevFlg Then MeReversePline FstPol End If End With MeJoinPline = RetVal End Function ' ----- Public Function MeReversePline(PolObj As AcadLWPolyline) Dim NewArr() As Double Dim BlgArr() As Double Dim OldArr() As Double Dim SegCnt As Long Dim ArrCnt As Long Dim ArrLen As Long With PolObj OldArr = .Coordinates ArrLen = UBound(OldArr) SegCnt = (ArrLen - 1) / 2 ReDim NewArr(0 To ArrLen) ReDim BlgArr(0 To SegCnt + 1) For ArrCnt = SegCnt To 0 Step -1 BlgArr(ArrCnt) = .GetBulge(SegCnt - ArrCnt) * -1 Next ArrCnt For ArrCnt = ArrLen To 0 Step -2 NewArr(ArrLen - ArrCnt + 1) = OldArr(ArrCnt) NewArr(ArrLen - ArrCnt) = OldArr(ArrCnt - 1) Next ArrCnt .Coordinates = NewArr For ArrCnt = 0 To SegCnt .SetBulge ArrCnt, BlgArr(ArrCnt + 1) Next ArrCnt .Update End With End Function ' ----- Public Function MePointsEqual(FstArr, FstPos As Long, NxtArr, NxtPos As Long, _ FuzVal As Double) As Boolean Dim XcoDst As Double Dim YcoDst As Double XcoDst = FstArr(FstPos - 1) - NxtArr(NxtPos - 1) YcoDst = FstArr(FstPos) - NxtArr(NxtPos) MePointsEqual = (Sqr(XcoDst ^ 2 + YcoDst ^ 2) < FuzVal) End Function
Автор:
--
Juerg Menzi
MENZI ENGINEERING GmbH, Switzerland
http://www.menziengineering.ch
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → VBA → Соединить две полилинии
Форум работает на PunBB, при поддержке Informer Technologies, Inc