Files
OmagCUT/SideAngleUc.xaml.vb
T
Dario Sassi 910f347beb OmagCUT :
- aggiunta gestione angoli di fianco con tallone (bisello)
- ora angolo verso esterno mantiene dimensione totale del pezzo.
2018-09-24 08:08:03 +00:00

1126 lines
44 KiB
VB.net

Imports EgtUILib
Public Class SideAngleUC
Public Enum ModeOpt As Integer
SIDEANGLE = 0
DRIP = 1
End Enum
' Variabile che indica se sono in sideangle o drip
Friend m_Mode As ModeOpt
' Riferimento alla MainWindow
Private m_MainWindow As MainWindow = DirectCast(Application.Current.MainWindow, MainWindow)
' Riferimento alla pagina che ha aperto SideAngleUC
Private m_CallingPage As MainWindow.Pages
' Massimo angolo di lato ammesso
Private Const STD_MAXSIDEANG As Double = 50.0
Private Const MAX_MAXSIDEANG As Double = 75.0
Private m_dMaxSideAng As Double = STD_MAXSIDEANG
' Lista di tutte le entità inclinabili presenti nel progetto
Friend m_SideAngleEntityList As New List(Of SideAngleEntity)
Friend m_DripEntityList As New List(Of DripEntity)
Friend m_dDripOffset As Double = 10
Friend m_dDripDepth As Double = 10
Friend m_dDripShort As Double = 0
Private Sub SideAngleUC_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
' Imposto riferimenti ad altre pagine
m_CallingPage = m_MainWindow.m_ActivePage
' Leggo da Ini il massimo angolo di fianco ammesso
m_dMaxSideAng = GetPrivateProfileDouble(S_SIDES, K_MAXSIDEANGLE, STD_MAXSIDEANG, m_MainWindow.GetIniFile())
If m_dMaxSideAng > MAX_MAXSIDEANG Then m_dMaxSideAng = MAX_MAXSIDEANG
' Imposto messaggi
If m_Mode = ModeOpt.SIDEANGLE Then
Parameter1TxBl.Text = EgtMsg(MSG_IMPORTPAGEUC + 10) ' Offset
Parameter2TxBl.Text = EgtMsg(MSG_IMPORTPAGEUC + 11) ' Affondamento
Parameter3TxBl.Text = EgtMsg(MSG_IMPORTPAGEUC + 12) ' Accorciamento
End If
If m_CallingPage = MainWindow.Pages.Draw Then
' Imposto questa come pagina correntemente visualizzata nella drawpage
m_MainWindow.m_DrawPageUC.m_ActiveComponentPage = DrawPageUC.Pages.SideAngle
' Imposto contesto corrente
EgtSetCurrentContext(m_MainWindow.m_DrawPageUC.DrawScene.GetCtx())
ElseIf m_CallingPage = MainWindow.Pages.Import Then
' Imposto contesto corrente
EgtSetCurrentContext(m_MainWindow.m_ImportPageUC.ImportScene.GetCtx())
End If
' Inizializzo
DeleteSideAngle()
' Inizializzo lati per angoli (ne compilo la lista e aggiungo la scritta nel disegno)
InitSides()
' Aggiorno testi nel disegno
RefreshSideAngleText()
' Aggiorno check e valori
RefreshCheckAndValue()
' Gestisco visualizzazione dei parametri
If m_Mode = ModeOpt.SIDEANGLE Then
For Index As Integer = 1 To 10
GetChBxFromIndex(Index).Visibility = Windows.Visibility.Collapsed
Next
Parameter1TxBl.Visibility = Windows.Visibility.Hidden
Parameter1TxBx.Visibility = Windows.Visibility.Hidden
Parameter2TxBl.Visibility = Windows.Visibility.Hidden
Parameter2TxBx.Visibility = Windows.Visibility.Hidden
Parameter3TxBl.Visibility = Windows.Visibility.Hidden
Parameter3TxBx.Visibility = Windows.Visibility.Hidden
Else
For Index As Integer = 1 To 10
GetAngleTxBxFromIndex(Index).Visibility = Windows.Visibility.Collapsed
GetHeelTxBxFromIndex(Index).Visibility = Windows.Visibility.Collapsed
Next
Parameter1TxBl.Visibility = Windows.Visibility.Visible
Parameter1TxBx.Visibility = Windows.Visibility.Visible
Parameter2TxBl.Visibility = Windows.Visibility.Visible
Parameter2TxBx.Visibility = Windows.Visibility.Visible
Parameter3TxBl.Visibility = Windows.Visibility.Visible
Parameter3TxBx.Visibility = Windows.Visibility.Visible
End If
' Gestisco Checkbox e nomi in base al numero di lati inclinabili
TxBlChBxView()
' Aggiorno valori
If m_Mode = ModeOpt.DRIP Then
m_dDripOffset = GetPrivateProfileDouble(S_SIDES, K_DRIPOFFSET, 20, m_MainWindow.GetIniFile())
m_dDripDepth = GetPrivateProfileDouble(S_SIDES, K_DRIPDEPTH, 10, m_MainWindow.GetIniFile())
m_dDripShort = GetPrivateProfileDouble(S_SIDES, K_DRIPSHORT, 0, m_MainWindow.GetIniFile())
Parameter1TxBx.Text = LenToString(m_dDripOffset, 3)
Parameter2TxBx.Text = LenToString(m_dDripDepth, 3)
Parameter3TxBx.Text = LenToString(m_dDripShort, 3)
End If
' Aggiorno visualizzazione
If m_CallingPage = MainWindow.Pages.Draw Then
EgtZoom(ZM.ALL)
Else
EgtDraw()
End If
End Sub
Private Sub TxBlChBxView()
' Numero di lati da visualizzare
Dim nCount As Integer = If(m_Mode = ModeOpt.SIDEANGLE,
m_SideAngleEntityList.Count(), m_DripEntityList.Count())
' Lati nascosti
For Index As Integer = 1 To 10 - nCount
If m_Mode = ModeOpt.SIDEANGLE Then
GetAngleTxBxFromIndex(Index).Visibility = Windows.Visibility.Hidden
GetHeelTxBxFromIndex(Index).Visibility = Windows.Visibility.Hidden
Else
GetChBxFromIndex(Index).Visibility = Windows.Visibility.Hidden
End If
GetTxBlFromIndex(Index).Visibility = Windows.Visibility.Hidden
Next
' Lati visibili
Dim TxBlIndex As Integer = 1
For Index As Integer = 10 - nCount + 1 To 10
If m_Mode = ModeOpt.SIDEANGLE Then
GetAngleTxBxFromIndex(Index).Visibility = Windows.Visibility.Visible
GetHeelTxBxFromIndex(Index).Visibility = Windows.Visibility.Visible
Else
GetChBxFromIndex(Index).Visibility = Windows.Visibility.Visible
End If
GetTxBlFromIndex(Index).Text = If(m_Mode = ModeOpt.SIDEANGLE,
m_SideAngleEntityList(TxBlIndex - 1).sEntityName,
m_DripEntityList(TxBlIndex - 1).sEntityName)
GetTxBlFromIndex(Index).Visibility = Windows.Visibility.Visible
TxBlIndex += 1
Next
End Sub
Private Function GetChBxFromIndex(Index As Integer) As CheckBox
Select Case Index
Case 1
Return A1
Case 2
Return A2
Case 3
Return A3
Case 4
Return A4
Case 5
Return A5
Case 6
Return A6
Case 7
Return A7
Case 8
Return A8
Case 9
Return A9
Case Else
Return A10
End Select
End Function
Private Function GetAngleTxBxFromIndex(Index As Integer) As EgtWPFLib.EgtTextBox
Select Case Index
Case 1
Return A1TxBx
Case 2
Return A2TxBx
Case 3
Return A3TxBx
Case 4
Return A4TxBx
Case 5
Return A5TxBx
Case 6
Return A6TxBx
Case 7
Return A7TxBx
Case 8
Return A8TxBx
Case 9
Return A9TxBx
Case Else
Return A10TxBx
End Select
End Function
Private Function GetHeelTxBxFromIndex(Index As Integer) As EgtWPFLib.EgtTextBox
Select Case Index
Case 1
Return H1TxBx
Case 2
Return H2TxBx
Case 3
Return H3TxBx
Case 4
Return H4TxBx
Case 5
Return H5TxBx
Case 6
Return H6TxBx
Case 7
Return H7TxBx
Case 8
Return H8TxBx
Case 9
Return H9TxBx
Case Else
Return H10TxBx
End Select
End Function
Private Function GetTxBlFromIndex(Index As Integer) As TextBlock
Select Case Index
Case 1
Return Entity1
Case 2
Return Entity2
Case 3
Return Entity3
Case 4
Return Entity4
Case 5
Return Entity5
Case 6
Return Entity6
Case 7
Return Entity7
Case 8
Return Entity8
Case 9
Return Entity9
Case Else
Return Entity10
End Select
End Function
Private Sub SideAngleUC_Unloaded(sender As Object, e As RoutedEventArgs) Handles Me.Unloaded
If m_CallingPage = MainWindow.Pages.Draw Then
' Ricavo nome pezzo
Dim PartId As Integer = EgtGetFirstInGroup(GDB_ID.ROOT)
' Svuoto layer in cui sono presenti i testi con le inclinazioni dei lati
If m_Mode = ModeOpt.SIDEANGLE Then
EgtEmptyGroup(EgtGetFirstNameInGroup(PartId, SIDE_ANGLE_LAYER))
Else
EgtEmptyGroup(EgtGetFirstNameInGroup(PartId, SIDE_ANGLE_LAYER))
End If
ElseIf m_CallingPage = MainWindow.Pages.Import Then
' Nessuna azione necessaria
End If
If m_Mode = ModeOpt.DRIP Then
WritePrivateProfileString(S_SIDES, K_DRIPOFFSET, DoubleToString(m_dDripOffset, 3), m_MainWindow.GetIniFile())
WritePrivateProfileString(S_SIDES, K_DRIPDEPTH, DoubleToString(m_dDripDepth, 3), m_MainWindow.GetIniFile())
WritePrivateProfileString(S_SIDES, K_DRIPSHORT, DoubleToString(m_dDripShort, 3), m_MainWindow.GetIniFile())
End If
EgtDraw()
End Sub
Private Sub RefreshCheckAndValue()
For EntityIndex = 1 To m_SideAngleEntityList.Count
Dim Entity As SideAngleEntity = m_SideAngleEntityList(EntityIndex - 1)
' Creo testo con angolo di inclinazione e dimensione tallone
Dim nTxBxIndex As Integer = 10 - m_SideAngleEntityList.Count + EntityIndex
GetAngleTxBxFromIndex(nTxBxIndex).Text = DoubleToString(Entity.dSideAngle, 1)
GetHeelTxBxFromIndex(nTxBxIndex).Text = LenToString(Entity.dSideHeel, 1)
Next
End Sub
Private Sub RefreshSideAngleText()
Dim PartId As Integer = GDB_ID.NULL
Dim LoopId As Integer = GDB_ID.NULL
If m_CallingPage = MainWindow.Pages.Draw Then
' Imposto contesto corrente
EgtSetCurrentContext(m_MainWindow.m_DrawPageUC.DrawScene.GetCtx())
' Ricavo nome primo pezzo
PartId = If(m_MainWindow.m_DrawPageUC.SelectedLayer <> GDB_ID.NULL, EgtGetFirstPart(), GDB_ID.NULL)
' Recupero nome layer con geometria di contorno (esterno o interno) del pezzo
LoopId = m_MainWindow.m_DrawPageUC.SelectedLayer
ElseIf m_CallingPage = MainWindow.Pages.Import Then
' Imposto contesto corrente
EgtSetCurrentContext(m_MainWindow.m_ImportPageUC.ImportScene.GetCtx())
' Recupero nome pezzo
PartId = m_MainWindow.m_ImportPageUC.SelectedPart
' Recupero nome layer con geometria di contorno (esterno o interno) del pezzo
LoopId = m_MainWindow.m_ImportPageUC.SelectedLayer
End If
' Calcolo dimensione ingombro Loop
Dim ptMin, ptMax As Point3d
EgtGetBBoxGlob(LoopId, GDB_BB.STANDARD, ptMin, ptMax)
Dim dBBoxRad As Double = 0.5 * Point3d.DistXY(ptMin, ptMax)
' Preparo layer con testi inclinazioni (svuotandolo o creandolo)
Dim TextLayer As Integer = EgtGetFirstNameInGroup(PartId, SIDE_ANGLE_LAYER)
If TextLayer <> GDB_ID.NULL Then
EgtEmptyGroup(TextLayer)
ElseIf PartId <> GDB_ID.NULL Then
TextLayer = EgtCreateGroup(PartId)
EgtSetName(TextLayer, SIDE_ANGLE_LAYER)
EgtSetColor(TextLayer, New Color3d(0, 0, 0))
End If
' Se modalità angoli di inclinazione...
If m_Mode = ModeOpt.SIDEANGLE Then
' Per ogni entità, creo testo con nome e angolo di inclinazione
For Each Entity In m_SideAngleEntityList
Dim sText As String = Entity.sEntityName & " = " & DoubleToString(Entity.dSideAngle, 1) & "°"
If Entity.dSideHeel > 10 * EPS_SMALL Then sText += "; " & LenToString(Entity.dSideHeel, 1)
AddTextToLine(sText, Entity.nTextId, Entity.nGeomId, 20, dBBoxRad, True)
Next
' Altrimenti modalità gocciolatoio
Else
' Per ogni entità creo testo con nome
For Each Entity In m_DripEntityList
AddTextToLine(Entity.sEntityName, Entity.nTextId, Entity.nGeomId, 20, dBBoxRad, True)
Next
' Creo le geometrie dei gocciolatoi
CreateDripGeom(PartId)
End If
' Aggiorno visualizzazione
EgtDraw()
End Sub
Private Sub InitSides()
Dim PartId As Integer = GDB_ID.NULL
Dim LoopId As Integer = GDB_ID.NULL
If m_CallingPage = MainWindow.Pages.Draw Then
' Imposto contesto corrente
EgtSetCurrentContext(m_MainWindow.m_DrawPageUC.DrawScene.GetCtx())
' Ricavo nome primo pezzo e lo sistemo
PartId = If(m_MainWindow.m_DrawPageUC.SelectedLayer <> GDB_ID.NULL, EgtGetFirstPart(), GDB_ID.NULL)
' Recupero nome layer con geometria di contorno (esterno o interno) del pezzo
LoopId = m_MainWindow.m_DrawPageUC.SelectedLayer
Else
' Imposto contesto corrente
EgtSetCurrentContext(m_MainWindow.m_ImportPageUC.ImportScene.GetCtx())
' Recupero nome pezzo
PartId = m_MainWindow.m_ImportPageUC.SelectedPart
' Recupero nome layer con geometria di contorno (esterno o interno) del pezzo
LoopId = m_MainWindow.m_ImportPageUC.SelectedLayer
End If
' Calcolo dimensione ingombro Loop
Dim ptMin, ptMax As Point3d
EgtGetBBoxGlob(LoopId, GDB_BB.STANDARD, ptMin, ptMax)
Dim dBBoxRad As Double = 0.5 * Point3d.DistXY(ptMin, ptMax)
' Creo layer per testi se non esiste già
Dim TextLayer As Integer = EgtGetFirstNameInGroup(PartId, SIDE_ANGLE_LAYER)
If TextLayer = GDB_ID.NULL And PartId <> GDB_ID.NULL Then
TextLayer = EgtCreateGroup(PartId)
EgtSetName(TextLayer, SIDE_ANGLE_LAYER)
EgtSetColor(TextLayer, New Color3d(0, 0, 0))
End If
Dim LastLine 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
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
LastLine = CurrLine
CurrLine = NextLine
NextLine = 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
If (m_Mode = ModeOpt.SIDEANGLE And m_SideAngleEntityList.Count() = 0) Or
(m_Mode = ModeOpt.DRIP And m_DripEntityList.Count() = 0) Then
If m_CallingPage = MainWindow.Pages.Draw Then
m_MainWindow.m_DrawPageUC.MessageTxBx.Text = EgtMsg(MSG_DRAWPAGEUC + 7) ' Non ci sono lati modificabili
m_MainWindow.m_DrawPageUC.MessageBrd.Background = Application.Current.FindResource("OmagCut_Yellow")
Else
m_MainWindow.m_ImportPageUC.MessageTxBx.Text = EgtMsg(MSG_DRAWPAGEUC + 7) ' Non ci sono lati modificabili
m_MainWindow.m_ImportPageUC.MessageBrd.Background = Application.Current.FindResource("OmagCut_Yellow")
End If
Else
If m_CallingPage = MainWindow.Pages.Draw Then
m_MainWindow.m_DrawPageUC.MessageTxBx.Text = ""
m_MainWindow.m_DrawPageUC.MessageBrd.Background = Brushes.Transparent
Else
m_MainWindow.m_ImportPageUC.MessageTxBx.Text = ""
m_MainWindow.m_ImportPageUC.MessageBrd.Background = Brushes.Transparent
End If
End If
End If
' Aggiorno interfaccia
If m_Mode = ModeOpt.DRIP Then
For Each Entity In m_DripEntityList
If Entity.bHaveDrip Then
Dim nI As Integer = 0
StringToInt(Entity.sEntityName.Substring(1), nI)
CheckSide(nI)
End If
Next
End If
End Sub
'Funzione che checka i lati
Private Sub CheckSide(nIndex As Integer)
' Seleziono checkbox
If m_Mode = ModeOpt.DRIP Then
GetChBxFromIndex(10 - (m_DripEntityList.Count - nIndex)).IsChecked = True
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
If EgtGetType(CurrLine) <> GDB_TY.CRV_LINE Then
Return False
End If
Return True
End Function
' Funzione che gestisce le operazioni sull'entità da inclinare
Private Sub AddSideAngle(CurrLine As Integer, TextLayer As Integer, dBBoxRad As Double, nEntityIndex As Integer)
' Imposto nome del lato
EgtSetName(CurrLine, "A" & nEntityIndex.ToString())
' Ricavo angolo dell'entità
Dim dSideAngleVal As Double
If Not EgtGetInfo(CurrLine, INFO_SIDE_ANGLE, dSideAngleVal) Then dSideAngleVal = 0
' Ricavo tallone dell'entità
Dim dSideHeelVal As Double
If Not EgtGetInfo(CurrLine, INFO_HEEL, dSideHeelVal) Then dSideHeelVal = 0
' Aggiungo entità all'elenco di quelle inclinabili
Dim sEntityName As String = String.Empty
EgtGetName(CurrLine, sEntityName)
m_SideAngleEntityList.Add(New SideAngleEntity(CurrLine, sEntityName, TextLayer, dSideAngleVal, dSideHeelVal))
' Creo testo con angolo di inclinazione ed eventuale tallone
Dim sText As String = sEntityName & " = " & DoubleToString(dSideAngleVal, 1) & "°"
If dSideHeelVal > 10 * EPS_SMALL Then sText += "; " & LenToString(dSideHeelVal, 1)
AddTextToLine(sText, TextLayer, CurrLine, 20, dBBoxRad, True)
End Sub
' Funzione che gestisce le operazioni sull'entità con gocciolatoio
Private Sub AddDripSide(CurrLine As Integer, TextLayer As Integer, dBBoxRad As Double, nEntityIndex As Integer)
' Imposto nome del lato
EgtSetName(CurrLine, "A" & nEntityIndex.ToString())
' Ricavo info dell'entità
Dim bHaveDripVal As Boolean
If Not EgtGetInfo(CurrLine, INFO_HAVE_DRIP, bHaveDripVal) Then bHaveDripVal = False
' Aggiungo entità all'elenco di quelle che possono avere il gocciolatoio
Dim sEntityName As String = String.Empty
EgtGetName(CurrLine, sEntityName)
m_DripEntityList.Add(New DripEntity(CurrLine, sEntityName, TextLayer, bHaveDripVal))
' Creo testo con nome lato
AddTextToLine(sEntityName, TextLayer, CurrLine, 20, dBBoxRad, True)
End Sub
' Funzione che dato un segmento e una distanza, scrive il testo centrato alla sua sinistra (destra se bTextExt)
Friend Shared Function AddTextToLine(sText As String, TextLayer As Integer, CurrLine As Integer, dDistance As Double,
dBBoxRad As Double, bTextExt As Boolean, Optional bRot As Boolean = False) As Integer
' Calcolo altezza testo
Dim dH As Double = 0.05 * dBBoxRad
' Creo testo
Dim nText As Integer = EgtCreateTextAdv(TextLayer, Point3d.ORIG(), 0, sText, "", 500, False, dH, 1, 0, INS_POS.MC)
' Calcolo posizionamento
' BBox del testo e suo centro
Dim ptMinBBox As Point3d
Dim ptMaxBBox As Point3d
EgtGetBBox(nText, GDB_BB.STANDARD, ptMinBBox, ptMaxBBox)
Dim ptMidBBox As Point3d
ptMidBBox = Point3d.Media(ptMinBBox, ptMaxBBox)
' estremi della CurrLine
Dim ptLineStart As Point3d
EgtStartPoint(CurrLine, nText, ptLineStart)
Dim ptLineEnd As Point3d
EgtEndPoint(CurrLine, nText, ptLineEnd)
' versore della CurrLine
Dim vtCurrLine As Vector3d = ptLineEnd - ptLineStart
vtCurrLine.Normalize()
' versore perpendicolare alla CurrLine che punta verso il testo
Dim vtOrtoLine As New Vector3d(vtCurrLine)
If bTextExt Then
vtOrtoLine.Rotate(Vector3d.Z_AX(), -90)
Else
vtOrtoLine.Rotate(Vector3d.Z_AX(), 90)
End If
' eventuale rotazione del testo
Dim dRotAng As Double = 0
If bRot Then
dRotAng = Math.Atan2(vtCurrLine.y, vtCurrLine.x) * 180 / Math.PI
Dim dSpecRotAng = dRotAng
If dSpecRotAng > 91 Then
dSpecRotAng -= 180
ElseIf dSpecRotAng < -89 Then
dSpecRotAng += 180
End If
EgtRotate(nText, Point3d.ORIG(), Vector3d.Z_AX(), dSpecRotAng)
End If
' vettore dal centro del BBox all'estremo più vicino
Dim vtptExtptMC As Vector3d
If bRot Then
vtptExtptMC = New Vector3d(0, ptMidBBox.y - ptMinBBox.y, 0)
vtptExtptMC.Rotate(Vector3d.Z_AX(), dRotAng)
Else
If bTextExt Then
If vtCurrLine.x > 0 Then
If vtCurrLine.y > 0 Then
vtptExtptMC = ptMidBBox - New Point3d(ptMinBBox.x, ptMaxBBox.y, 0)
Else
vtptExtptMC = ptMidBBox - ptMaxBBox
End If
Else
If vtCurrLine.y > 0 Then
vtptExtptMC = ptMidBBox - ptMinBBox
Else
vtptExtptMC = ptMidBBox - New Point3d(ptMaxBBox.x, ptMinBBox.y, 0)
End If
End If
Else
If vtCurrLine.x > 0 Then
If vtCurrLine.y > 0 Then
vtptExtptMC = ptMidBBox - New Point3d(ptMaxBBox.x, ptMinBBox.y, 0)
Else
vtptExtptMC = ptMidBBox - ptMinBBox
End If
Else
If vtCurrLine.y > 0 Then
vtptExtptMC = ptMidBBox - ptMaxBBox
Else
vtptExtptMC = ptMidBBox - New Point3d(ptMinBBox.x, ptMaxBBox.y, 0)
End If
End If
End If
End If
' Calcolo il centro del testo
Dim ptTextMC As Point3d = Point3d.Media(ptLineStart, ptLineEnd) + vtOrtoLine * (dDistance + (vtOrtoLine * vtptExtptMC))
EgtMove(nText, (ptTextMC - Point3d.ORIG()))
Return nText
End Function
' Funzione che crea le geometrie dei gocciolatoi
Friend Sub CreateDripGeom(nPartId As Integer)
' Recupero Id layer di contorno esterno
Dim nOutLoopId = EgtGetFirstNameInGroup(nPartId, NAME_OUTLOOP)
' Preparo layer con geometria gocciolatoi (svuotandolo o creandolo)
Dim DripLayer As Integer = EgtGetFirstNameInGroup(nPartId, NAME_DRIPCUT)
If DripLayer <> GDB_ID.NULL Then
EgtEmptyGroup(DripLayer)
Else
DripLayer = EgtCreateGroup(nPartId)
EgtSetName(DripLayer, NAME_DRIPCUT)
End If
' Per ogni entità con gocciolatoio, ne inserisco una copia nel layer
Dim vSelId As New List(Of Integer)
For Each Entity In m_DripEntityList
If Entity.bHaveDrip Then
Dim nSouId As Integer = EgtGetFirstNameInGroup(nOutLoopId, Entity.sEntityName)
Dim nNewId As Integer = EgtCopyGlob(nSouId, DripLayer)
EgtSetName(nNewId, Entity.sEntityName)
vSelId.Add(nNewId)
End If
Next
' Eseguo eventuali accorciamenti iniziali e finali
Dim nCrvId As Integer = EgtGetFirstInGroup(DripLayer)
While nCrvId <> GDB_ID.NULL
If m_dDripShort > EPS_SMALL Then
Dim dLen As Double
EgtCurveLength(nCrvId, dLen)
EgtTrimCurveEndAtLen(nCrvId, dLen - m_dDripShort)
EgtTrimCurveStartAtLen(nCrvId, m_dDripShort)
End If
nCrvId = EgtGetNext(nCrvId)
End While
' Concateno le curve
EgtCreateCurveCompoByReorder(DripLayer, vSelId.Count(), vSelId.ToArray(), New Point3d(), True)
' Eseguo offset dei risultati
nCrvId = EgtGetFirstInGroup(DripLayer)
While nCrvId <> GDB_ID.NULL
EgtOffsetCurve(nCrvId, -m_dDripOffset, OFF_TYPE.EXTEND)
nCrvId = EgtGetNext(nCrvId)
End While
' Esplodo nelle curve componenti
Dim bAngle As Integer = False
nCrvId = EgtGetFirstInGroup(DripLayer)
While nCrvId <> GDB_ID.NULL
Dim nNextCrvId = EgtGetNext(nCrvId)
Dim nCount As Integer
EgtExplodeCurveCompo(nCrvId, nCount)
If nCount > 0 Then bAngle = True
nCrvId = nNextCrvId
End While
' Assegno colore e attributi
nCrvId = EgtGetFirstInGroup(DripLayer)
While nCrvId <> GDB_ID.NULL
EgtSetColor(nCrvId, New Color3d(255, 165, 0))
EgtSetInfo(nCrvId, INFO_DEPTH, m_dDripDepth)
If (bAngle And m_dDripShort > -EPS_SMALL) Or m_dDripShort > EPS_SMALL Then EgtSetInfo(nCrvId, INFO_STRICT, "1")
nCrvId = EgtGetNext(nCrvId)
End While
End Sub
Private Sub SideCheck_Click(sender As Object, e As RoutedEventArgs) Handles A1.Click, A2.Click, A3.Click, A4.Click, A5.Click, A6.Click, A7.Click, A8.Click, A9.Click, A10.Click
Dim CurrCheckBox As CheckBox = e.Source
If m_Mode = ModeOpt.DRIP Then
' Recupero stato entità
Dim bVal As Boolean = CurrCheckBox.IsChecked()
' Converto nome checkbox in nome elemento tenendo conto dello slittamento verso il basso
Dim nCurrSide As Integer = m_DripEntityList.Count() - (10 - CInt(CurrCheckBox.Name.Substring(1)))
Dim sCurrSide As String = m_DripEntityList(nCurrSide - 1).sEntityName
' Modifico info gocciolatoi
ModifyDrip(sCurrSide, bVal)
' Aggiorno tutti i testi e le geometrie
RefreshSideAngleText()
End If
End Sub
Private Sub A1TxBx_EgtClosed(sender As Object, e As EventArgs) Handles A1TxBx.EgtClosed
SetSideAngleFromTxBx(1, A1TxBx)
End Sub
Private Sub H1TxBx_EgtClosed(sender As Object, e As EventArgs) Handles H1TxBx.EgtClosed
SetSideHeelFromTxBx(1, H1TxBx)
End Sub
Private Sub A2TxBx_EgtClosed(sender As Object, e As EventArgs) Handles A2TxBx.EgtClosed
SetSideAngleFromTxBx(2, A2TxBx)
End Sub
Private Sub H2TxBx_EgtClosed(sender As Object, e As EventArgs) Handles H2TxBx.EgtClosed
SetSideHeelFromTxBx(2, H2TxBx)
End Sub
Private Sub A3TxBx_EgtClosed(sender As Object, e As EventArgs) Handles A3TxBx.EgtClosed
SetSideAngleFromTxBx(3, A3TxBx)
End Sub
Private Sub H3TxBx_EgtClosed(sender As Object, e As EventArgs) Handles H3TxBx.EgtClosed
SetSideHeelFromTxBx(3, H3TxBx)
End Sub
Private Sub A4TxBx_EgtClosed(sender As Object, e As EventArgs) Handles A4TxBx.EgtClosed
SetSideAngleFromTxBx(4, A4TxBx)
End Sub
Private Sub H4TxBx_EgtClosed(sender As Object, e As EventArgs) Handles H4TxBx.EgtClosed
SetSideHeelFromTxBx(4, H4TxBx)
End Sub
Private Sub A5TxBx_EgtClosed(sender As Object, e As EventArgs) Handles A5TxBx.EgtClosed
SetSideAngleFromTxBx(5, A5TxBx)
End Sub
Private Sub H5TxBx_EgtClosed(sender As Object, e As EventArgs) Handles H5TxBx.EgtClosed
SetSideHeelFromTxBx(5, H5TxBx)
End Sub
Private Sub A6TxBx_EgtClosed(sender As Object, e As EventArgs) Handles A6TxBx.EgtClosed
SetSideAngleFromTxBx(6, A6TxBx)
End Sub
Private Sub H6TxBx_EgtClosed(sender As Object, e As EventArgs) Handles H6TxBx.EgtClosed
SetSideHeelFromTxBx(6, H6TxBx)
End Sub
Private Sub A7TxBx_EgtClosed(sender As Object, e As EventArgs) Handles A7TxBx.EgtClosed
SetSideAngleFromTxBx(7, A7TxBx)
End Sub
Private Sub H7TxBx_EgtClosed(sender As Object, e As EventArgs) Handles H7TxBx.EgtClosed
SetSideHeelFromTxBx(7, H7TxBx)
End Sub
Private Sub A8TxBx_EgtClosed(sender As Object, e As EventArgs) Handles A8TxBx.EgtClosed
SetSideAngleFromTxBx(8, A8TxBx)
End Sub
Private Sub H8TxBx_EgtClosed(sender As Object, e As EventArgs) Handles H8TxBx.EgtClosed
SetSideHeelFromTxBx(8, H8TxBx)
End Sub
Private Sub A9TxBx_EgtClosed(sender As Object, e As EventArgs) Handles A9TxBx.EgtClosed
SetSideAngleFromTxBx(9, A9TxBx)
End Sub
Private Sub H9TxBx_EgtClosed(sender As Object, e As EventArgs) Handles H9TxBx.EgtClosed
SetSideHeelFromTxBx(9, H9TxBx)
End Sub
Private Sub A10TxBx_EgtClosed(sender As Object, e As EventArgs) Handles A10TxBx.EgtClosed
SetSideAngleFromTxBx(10, A10TxBx)
End Sub
Private Sub H10TxBx_EgtClosed(sender As Object, e As EventArgs) Handles H10TxBx.EgtClosed
SetSideHeelFromTxBx(10, H10TxBx)
End Sub
Private Sub SetSideAngleFromTxBx(SideIndex As Integer, AngleTxBx As EgtWPFLib.EgtTextBox)
' Nuovo angolo di inclinazione
Dim dSideAngle As Double
StringToDouble(AngleTxBx.Text, dSideAngle)
' Verifico stia nei limiti
If dSideAngle < -m_dMaxSideAng Then
dSideAngle = -m_dMaxSideAng
AngleTxBx.Text = DoubleToString(dSideAngle, 2)
ElseIf dSideAngle > m_dMaxSideAng Then
dSideAngle = m_dMaxSideAng
AngleTxBx.Text = DoubleToString(dSideAngle, 2)
End If
' Converto nome checkbox in nome elemento tenendo conto dello slittamento verso il basso
Dim nCurrSide As Integer = m_SideAngleEntityList.Count() - (10 - SideIndex)
Dim sCurrSide As String = m_SideAngleEntityList(nCurrSide - 1).sEntityName
' Lo modifico nella geometria e nella lista inclinazioni
ModifySideAngle(sCurrSide, dSideAngle)
' Aggiorno tutti i testi
RefreshSideAngleText()
End Sub
' Funzione che modifica l'inclinazione di un lato
Friend Function ModifySideAngle(sEntityName As String, dSideAngle As Double) As Boolean
' Ricavo CurrEntity dal nome
Dim CurrEntity As SideAngleEntity = SideAngleEntity.FindEntity(sEntityName)
If IsNothing(CurrEntity) Then
EgtOutLog("Error in side angle definition: selected line not found in SideAngleList")
Return False
End If
' Scrivo nuovo angolo nelle info
If dSideAngle <> 0 Then
EgtSetInfo(CurrEntity.nGeomId, INFO_SIDE_ANGLE, dSideAngle)
' Cancello inclinazione nell'apposito campo info
Else
EgtRemoveInfo(CurrEntity.nGeomId, INFO_SIDE_ANGLE)
End If
' Aggiorno lista entità con nuova inclinazione
CurrEntity.dSideAngle = dSideAngle
Return True
End Function
Private Sub SetSideHeelFromTxBx(SideIndex As Integer, HeelTxBx As EgtWPFLib.EgtTextBox)
' Nuovo tallone
Dim dSideHeel As Double
StringToLen(HeelTxBx.Text, dSideHeel)
' Verifico stia nei limiti
If dSideHeel < 0 Then
dSideHeel = 0
HeelTxBx.Text = "0"
End If
' Converto nome checkbox in nome elemento tenendo conto dello slittamento verso il basso
Dim nCurrSide As Integer = m_SideAngleEntityList.Count() - (10 - SideIndex)
Dim sCurrSide As String = m_SideAngleEntityList(nCurrSide - 1).sEntityName
' Lo modifico nella geometria e nella lista inclinazioni
ModifySideHeel(sCurrSide, dSideHeel)
' Aggiorno tutti i testi
RefreshSideAngleText()
End Sub
' Funzione che modifica il tallone di un lato
Friend Function ModifySideHeel(sEntityName As String, dSideHeel As Double) As Boolean
' Ricavo CurrEntity dal nome
Dim CurrEntity As SideAngleEntity = SideAngleEntity.FindEntity(sEntityName)
If IsNothing(CurrEntity) Then
EgtOutLog("Error in side angle definition: selected line not found in SideAngleList")
Return False
End If
' Scrivo nuovo tallone nelle info
If dSideHeel > 10 * EPS_SMALL Then
EgtSetInfo(CurrEntity.nGeomId, INFO_HEEL, dSideHeel)
' Cancello inclinazione nell'apposito campo info
Else
EgtRemoveInfo(CurrEntity.nGeomId, INFO_HEEL)
End If
' Aggiorno lista entità con nuova inclinazione
CurrEntity.dSideHeel = dSideHeel
Return True
End Function
' Funzione che modifica l'eventuale canalino di un lato
Friend Function ModifyDrip(sEntityName As String, bVal As Boolean) As Boolean
' Ricavo CurrEntity dal nome
Dim CurrEntity As DripEntity = DripEntity.FindEntity(sEntityName)
If IsNothing(CurrEntity) Then
EgtOutLog("Error in drip definition: selected line not found in DripEntity")
Return False
End If
' Scrivo nuovo angolo nelle info
If bVal Then
EgtSetInfo(CurrEntity.nGeomId, INFO_HAVE_DRIP, "1")
' Cancello inclinazione nell'apposito campo info
Else
EgtRemoveInfo(CurrEntity.nGeomId, INFO_HAVE_DRIP)
End If
' Aggiorno lista entità con nuova inclinazione
CurrEntity.bHaveDrip = bVal
Return True
End Function
Friend Sub DeleteSideAngle()
' Cancello lista lati inclinati
If m_Mode = ModeOpt.SIDEANGLE Then
m_SideAngleEntityList.Clear()
' Annullo tutti i testi
For Index As Integer = 1 To 10
GetAngleTxBxFromIndex(Index).Text = String.Empty
GetHeelTxBxFromIndex(Index).Text = String.Empty
Next
Else
m_DripEntityList.Clear()
' Annullo tutti i CheckBox
For Index As Integer = 1 To 10
GetChBxFromIndex(Index).IsChecked = False
Next
End If
End Sub
Private Sub Parameter1TxBx_EgtClosed(sender As Object, e As EventArgs) Handles Parameter1TxBx.EgtClosed
If m_Mode = ModeOpt.DRIP Then
' Recupero il valore
StringToDouble(Parameter1TxBx.Text, m_dDripOffset)
' Creo le geometrie dei gocciolatoi
RefreshSideAngleText()
End If
End Sub
Private Sub Parameter2TxBx_EgtClosed(sender As Object, e As EventArgs) Handles Parameter2TxBx.EgtClosed
If m_Mode = ModeOpt.DRIP Then
' Recupero il valore
StringToDouble(Parameter2TxBx.Text, m_dDripDepth)
' Creo le geometrie dei gocciolatoi
RefreshSideAngleText()
End If
End Sub
Private Sub Parameter3TxBx_EgtClosed(sender As Object, e As EventArgs) Handles Parameter3TxBx.EgtClosed
If m_Mode = ModeOpt.DRIP Then
' Recupero il valore
StringToDouble(Parameter3TxBx.Text, m_dDripShort)
' Creo le geometrie dei gocciolatoi
RefreshSideAngleText()
End If
End Sub
Friend Sub WriteSideAngleForNest(nCtx As Integer)
' Imposto contesto corrente
EgtSetCurrentContext(nCtx)
Dim PartId As Integer = EgtGetFirstPart()
While PartId <> GDB_ID.NULL
' Elimino eventuale precedente layer per testi
EgtErase(EgtGetFirstNameInGroup(PartId, SIDE_ANGLE_LAYER))
' Creo layer per testi nesting
Dim TextLayId As Integer = EgtCreateGroup(PartId)
EgtSetName(TextLayId, SIDE_ANGLE_LAYER)
EgtSetColor(TextLayId, New Color3d(0, 0, 128))
' Opero su geometria esterna pezzo
WriteSideAngleOnLoop(EgtGetFirstNameInGroup(PartId, NAME_OUTLOOP), TextLayId)
' Ciclo su geometria interna pezzo
Dim LoopId As Integer = EgtGetFirstNameInGroup(PartId, NAME_INLOOP)
While LoopId <> GDB_ID.NULL
WriteSideAngleOnLoop(LoopId, TextLayId)
LoopId = EgtGetNextName(LoopId, NAME_INLOOP)
End While
PartId = EgtGetNextPart(PartId)
End While
End Sub
Private Function WriteSideAngleOnLoop(LoopId As Integer, TextLayId As Integer) As Boolean
' Verifiche
If LoopId = GDB_ID.NULL Or TextLayId = GDB_ID.NULL Then Return False
' Calcolo dimensione ingombro Loop
Dim ptMin, ptMax As Point3d
EgtGetBBoxGlob(LoopId, GDB_BB.STANDARD, ptMin, ptMax)
Dim dBBoxRad As Double = 0.5 * Point3d.DistXY(ptMin, ptMax)
' Ciclo sulle linee di contorno, se hanno info con inclinazione aggiungo testo con angolo
Dim LineId As Integer = EgtGetFirstInGroup(LoopId)
While LineId <> GDB_ID.NULL
Dim dSideAngle As Double = 0
Dim bSA As Boolean = EgtGetInfo(LineId, INFO_SIDE_ANGLE, dSideAngle)
Dim dSideHeel As Double = 0
Dim bSH As Boolean = EgtGetInfo(LineId, INFO_HEEL, dSideHeel)
If Math.Abs(dSideAngle) > EPS_ANG_SMALL Then
' Creo testo con angolo di inclinazione
Dim sText As String = DoubleToString(dSideAngle, 1) & "°"
If dSideHeel > 10 * EPS_SMALL Then sText &= "; " & LenToString(dSideHeel, 1)
AddTextToLine(sText, TextLayId, LineId, 15, dBBoxRad, False, True)
' Imposto angolo originale
EgtSetInfo(LineId, INFO_ORIG_SIDE_ANGLE, dSideAngle)
End If
LineId = EgtGetNext(LineId)
End While
Return True
End Function
Friend Sub ReLoadSideAnglePage()
'SideAngleUC_Unloaded(Me, New RoutedEventArgs)
SideAngleUC_Loaded(Me, New RoutedEventArgs)
End Sub
End Class
Friend Class SideAngleEntity
Private Shared m_MainWindow As MainWindow = DirectCast(Application.Current.MainWindow, MainWindow)
Private m_nGeomId As Integer
Private m_sEntityName As String
Private m_nTextId As Integer
Private m_dSideAngle As Double
Private m_dSideHeel As Double
Public Property nGeomId As Integer
Get
Return m_nGeomId
End Get
Set(value As Integer)
m_nGeomId = value
End Set
End Property
Public ReadOnly Property sEntityName As String
Get
Return m_sEntityName
End Get
End Property
Public ReadOnly Property nTextId As Integer
Get
Return m_nTextId
End Get
End Property
Public Property dSideAngle As Double
Get
Return m_dSideAngle
End Get
Set(value As Double)
m_dSideAngle = value
End Set
End Property
Public Property dSideHeel As Double
Get
Return m_dSideHeel
End Get
Set(value As Double)
m_dSideHeel = value
End Set
End Property
Sub New(nId As Integer, sEntityName As String, nTextId As Integer, dSideAngle As Double, dSideHeel As Double)
m_nGeomId = nId
m_sEntityName = sEntityName
m_nTextId = nTextId
m_dSideAngle = dSideAngle
m_dSideHeel = dSideHeel
End Sub
Friend Shared Function FindEntity(sEntityName As String) As SideAngleEntity
Dim EntityList As List(Of SideAngleEntity) = Nothing
If m_MainWindow.m_ActivePage = MainWindow.Pages.Draw Then
EntityList = m_MainWindow.m_DrawPageUC.m_SideAngleUC.m_SideAngleEntityList
ElseIf m_MainWindow.m_ActivePage = MainWindow.Pages.Import Then
EntityList = m_MainWindow.m_ImportPageUC.m_SideAngleUC.m_SideAngleEntityList
End If
If IsNothing(EntityList) Then
Return Nothing
End If
For Each Entity In EntityList
If Entity.m_sEntityName = sEntityName Then
Return Entity
End If
Next
Return Nothing
End Function
End Class
Friend Class DripEntity
Private Shared m_MainWindow As MainWindow = DirectCast(Application.Current.MainWindow, MainWindow)
Private m_nGeomId As Integer
Private m_sEntityName As String
Private m_nTextId As Integer
Private m_bHaveDrip As Boolean
Public Property nGeomId As Integer
Get
Return m_nGeomId
End Get
Set(value As Integer)
m_nGeomId = value
End Set
End Property
Public ReadOnly Property sEntityName As String
Get
Return m_sEntityName
End Get
End Property
Public ReadOnly Property nTextId As Integer
Get
Return m_nTextId
End Get
End Property
Public Property bHaveDrip As Boolean
Get
Return m_bHaveDrip
End Get
Set(value As Boolean)
m_bHaveDrip = value
End Set
End Property
Sub New(nId As Integer, sEntityName As String, nTextId As Integer, bHaveDrip As Boolean)
m_nGeomId = nId
m_sEntityName = sEntityName
m_nTextId = nTextId
m_bHaveDrip = bHaveDrip
End Sub
Friend Shared Function FindEntity(sEntityName As String) As DripEntity
Dim EntityList As List(Of DripEntity) = Nothing
If m_MainWindow.m_ActivePage = MainWindow.Pages.Draw Then
EntityList = m_MainWindow.m_DrawPageUC.m_SideAngleUC.m_DripEntityList
ElseIf m_MainWindow.m_ActivePage = MainWindow.Pages.Import Then
EntityList = m_MainWindow.m_ImportPageUC.m_SideAngleUC.m_DripEntityList
End If
If IsNothing(EntityList) Then
Return Nothing
End If
For Each Entity In EntityList
If Entity.m_sEntityName = sEntityName Then
Return Entity
End If
Next
Return Nothing
End Function
End Class