From dfeef807836fb249fa6989111aec83c5b81670c1 Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Wed, 17 Jul 2019 16:19:39 +0000 Subject: [PATCH] OmagOFFICE 2.1g4 : - correzioni a gestione angolo da colore (non verificava se curva poteva avere angolo di fianco). --- My Project/AssemblyInfo.vb | 4 +- SideEntityControl/SideEntityControlVM.vb | 148 +++++++++++------------ 2 files changed, 71 insertions(+), 81 deletions(-) diff --git a/My Project/AssemblyInfo.vb b/My Project/AssemblyInfo.vb index f65d331..ccf4066 100644 --- a/My Project/AssemblyInfo.vb +++ b/My Project/AssemblyInfo.vb @@ -69,5 +69,5 @@ Imports System.Windows ' by using the '*' as shown below: ' - - + + diff --git a/SideEntityControl/SideEntityControlVM.vb b/SideEntityControl/SideEntityControlVM.vb index 712e62a..344dad7 100644 --- a/SideEntityControl/SideEntityControlVM.vb +++ b/SideEntityControl/SideEntityControlVM.vb @@ -354,45 +354,30 @@ Public Class SideEntityControlVM EgtSetColor(TextLayer, New Color3d(0, 0, 0)) End If - Dim LastLine As Integer = EgtGetLastInGroup(LoopId) + Dim PrevLine As Integer = EgtGetLastInGroup(LoopId) Dim CurrLine As Integer = EgtGetFirstInGroup(LoopId) - Dim NextLine As Integer = EgtGetNext(CurrLine) ' Creo indice per numerare le entità in ImportPage Dim nEntityIndex As Integer = 1 ' Ciclo che verifica se possibile inclinare la linea corrente fino alla penultima - While NextLine <> GDB_ID.NULL + While CurrLine <> GDB_ID.NULL + Dim NextLine As Integer = EgtGetNext(CurrLine) + If NextLine = GDB_ID.NULL Then NextLine = EgtGetFirstInGroup( LoopId) If m_Mode = ModeOpt.SIDEANGLE Then - If VerifyIsSideAnglePossible(LastLine, CurrLine, NextLine) Then + If VerifyIsSideAnglePossible(PrevLine, CurrLine, NextLine) Then ' Aggiungo il lato alla lista di quelli inclinabili e ne azzero l'inclinazione AddSideAngle(CurrLine, TextLayer, dBBoxRad, nEntityIndex) nEntityIndex += 1 End If Else - If VerifyIsSideDripPossible(LastLine, CurrLine, NextLine) Then + If VerifyIsSideDripPossible(PrevLine, CurrLine, NextLine) Then ' Aggiungo il lato alla lista di quelli su cui è possibile mettere il gocciolatoio AddDripSide(CurrLine, TextLayer, dBBoxRad, nEntityIndex) nEntityIndex += 1 End If End If - LastLine = CurrLine - CurrLine = NextLine - NextLine = EgtGetNext(CurrLine) + PrevLine = CurrLine + CurrLine = EgtGetNext(CurrLine) End While - ' Verifico ultima linea - NextLine = EgtGetFirstInGroup(LoopId) - If m_Mode = ModeOpt.SIDEANGLE Then - If VerifyIsSideAnglePossible(LastLine, CurrLine, NextLine) Then - ' Aggiungo il lato alla lista di quelli inclinabili e ne azzero l'inclinazione - AddSideAngle(CurrLine, TextLayer, dBBoxRad, nEntityIndex) - nEntityIndex += 1 - End If - Else - If VerifyIsSideDripPossible(LastLine, CurrLine, NextLine) Then - ' Aggiungo il lato alla lista di quelli su cui è possibile mettere il gocciolatoio - AddDripSide(CurrLine, TextLayer, dBBoxRad, nEntityIndex) - nEntityIndex += 1 - End If - End If ' Se non ci sono lati su cui operare, messaggio utente If LoopId <> GDB_ID.NULL Then @@ -443,61 +428,6 @@ Public Class SideEntityControlVM 'End If End Sub - ' Funzione che verifica se la linea corrente è inclinabile in base al tipo della precedente e successiva - Private Function VerifyIsSideAnglePossible(LastLine As Integer, CurrLine As Integer, NextLine As Integer) As Boolean - ' Verifico se CurrLine è una linea - If EgtGetType(CurrLine) <> GDB_TY.CRV_LINE Then - Return False - End If - - ' Verifico se curva precedente mi permette di inclinare - Dim bLastOk As Boolean = False - If EgtGetType(LastLine) = GDB_TY.CRV_LINE Then - bLastOk = True - ElseIf EgtGetType(LastLine) = GDB_TY.CRV_ARC Then - ' Ricavo direzione finale linea precedente - Dim vtLastEnd As Vector3d - EgtEndVector(LastLine, vtLastEnd) - ' Ricavo direzione iniziale linea corrente - Dim vtCurrStart As Vector3d - EgtStartVector(CurrLine, vtCurrStart) - ' Confronto direzioni per vedere se sono tangenti - ' calcolo differenza dei vettori - Dim vtDiff As Vector3d = vtLastEnd - vtCurrStart - ' verifico che sia nulla o quasi - bLastOk = Not vtDiff.IsSmall() - Else - EgtOutLog("Error in Compo Outloop: found an entity that is not a line or a arc") - End If - - ' Verifico se curva successiva mi permette di inclinare - Dim bNextOk As Boolean = False - If EgtGetType(NextLine) = GDB_TY.CRV_LINE Then - bNextOk = True - ElseIf EgtGetType(NextLine) = GDB_TY.CRV_ARC Then - ' Ricavo direzione finale linea corrente - Dim vtCurrEnd As Vector3d - EgtEndVector(CurrLine, vtCurrEnd) - ' Ricavo direzione iniziale linea successiva - Dim vtNextStart As Vector3d - EgtStartVector(NextLine, vtNextStart) - ' Confronto direzioni per vedere se sono tangenti - ' calcolo differenza dei vettori - Dim vtDiff As Vector3d = vtCurrEnd - vtNextStart - ' verifico che sia nulla o quasi - bNextOk = Not vtDiff.IsSmall() - Else - EgtOutLog("Error in Compo Outloop: found an entity that is not a line or a arc") - End If - - ' Se entrambe me lo permettono restituisco vero - If bLastOk And bNextOk Then - Return True - End If - Return False - - End Function - ' Funzione che verifica se alla linea corrente è associabile un canalino Private Function VerifyIsSideDripPossible(LastLine As Integer, CurrLine As Integer, NextLine As Integer) As Boolean ' Verifico se CurrLine è una linea @@ -860,6 +790,62 @@ Public Class SideEntityControlVM End While End Sub + ' Funzione che verifica se la linea corrente è inclinabile in base al tipo della precedente e successiva + Shared Function VerifyIsSideAnglePossible(LastLine As Integer, CurrLine As Integer, NextLine As Integer) As Boolean + ' Verifico se CurrLine è una linea + If EgtGetType(CurrLine) <> GDB_TY.CRV_LINE Then + Return False + End If + + ' Delta angolare limite per tangenza + Const DELTA_ANG_TG As Double = 5.0 + + ' Verifico se curva precedente mi permette di inclinare + Dim bLastOk As Boolean = False + If EgtGetType(LastLine) = GDB_TY.CRV_LINE Then + bLastOk = True + ElseIf EgtGetType(LastLine) = GDB_TY.CRV_ARC Then + ' Ricavo direzione finale linea precedente + Dim vtLastEnd As Vector3d + EgtEndVector(LastLine, vtLastEnd) + ' Ricavo direzione iniziale linea corrente + Dim vtCurrStart As Vector3d + EgtStartVector(CurrLine, vtCurrStart) + ' Confronto direzioni per vedere se sono tangenti + Dim dAngDeg As Double = GetAngle( vtLastEnd, vtCurrStart) + ' verifico se l'angolo è significativo + bLastOk = ( dAngDeg > DELTA_ANG_TG) + Else + EgtOutLog("Error in Compo Outloop: found an entity that is not a line or a arc") + End If + + ' Verifico se curva successiva mi permette di inclinare + Dim bNextOk As Boolean = False + If EgtGetType(NextLine) = GDB_TY.CRV_LINE Then + bNextOk = True + ElseIf EgtGetType(NextLine) = GDB_TY.CRV_ARC Then + ' Ricavo direzione finale linea corrente + Dim vtCurrEnd As Vector3d + EgtEndVector(CurrLine, vtCurrEnd) + ' Ricavo direzione iniziale linea successiva + Dim vtNextStart As Vector3d + EgtStartVector(NextLine, vtNextStart) + ' Confronto direzioni per vedere se sono tangenti + Dim dAngDeg As Double = GetAngle( vtCurrEnd, vtNextStart) + ' verifico se l'angolo è significativo + bNextOk = ( dAngDeg > DELTA_ANG_TG) + Else + EgtOutLog("Error in Compo Outloop: found an entity that is not a line or a arc") + End If + + ' Se entrambe me lo permettono restituisco vero + If bLastOk And bNextOk Then + Return True + End If + Return False + + End Function + Shared Function AdjustAsTrfParSides( PartId As Integer) As Boolean ' Recupero il loop esterno Dim LoopId As Integer = EgtGetFirstNameInGroup(PartId, NAME_OUTLOOP) @@ -956,9 +942,12 @@ Public Class SideEntityControlVM Dim LoopId As Integer = EgtGetFirstNameInGroup(PartId, NAME_OUTLOOP) While LoopId <> GDB_ID.NULL ' Ciclo sulle curve + Dim PrevId As Integer = EgtGetLastInGroup( LoopId) Dim EntId As Integer = EgtGetFirstInGroup( LoopId) While EntId <> GDB_ID.NULL - If EgtGetType(EntId) = GDB_TY.CRV_LINE Then + Dim NextId As Integer = EgtGetNext( EntId) + If NextId = GDB_ID.NULL Then NextId = EgtGetFirstInGroup( LoopId) + If VerifyIsSideAnglePossible( PrevId, EntId, NextId) Then Dim colEnt As Color3d If EgtGetColor( EntId, colEnt) Then Dim dAng As Double @@ -970,6 +959,7 @@ Public Class SideEntityControlVM End If End If End If + PrevId = EntId EntId = EgtGetNext( EntId) End While If bOutLoop then