Files
EgtCAM5/OptionPanel/MachiningOptionPanel/OperationExpander/DispositionParameterExpander/DispositionUtility.vb
T
Emmanuele Sassi a4b5cd4834 EgtCAM5 :
- Cambiati nomi classi e file.
2018-04-10 17:08:35 +00:00

595 lines
30 KiB
VB.net

Imports EgtUILib
Public NotInheritable Class DispositionUtility
Friend Shared Function GetRawPartRefPoint(nRawPartId As Integer, RawRefPosition As MCH_CR) As Point3d
Dim bboxRawPart As New BBox3d
' recupero il solido del grezzo dal primo elemento selezionato
Dim nRawSolidId As Integer = EgtGetFirstNameInGroup(nRawPartId, RAWSOLID)
' ne calcolo il BBox
EgtGetBBoxGlob(nRawSolidId, GDB_BB.ONLY_VISIBLE, bboxRawPart)
' imposto il riferimento della tavola
Dim ptTableRef As Point3d
EgtGetTableRef(1, ptTableRef)
' calcolo i punti min e max del bbox riferiti alla tavola
Dim ptBBoxRawPartMin As New Point3d(bboxRawPart.Min)
Dim ptBBoxRawPartMax As New Point3d(bboxRawPart.Max)
ptBBoxRawPartMin.ToLoc(New Frame3d(ptTableRef))
ptBBoxRawPartMax.ToLoc(New Frame3d(ptTableRef))
' dal box e dal tipo di punto di riferimento selezionato ricavo le coordinate del punto di riferimento
Dim ptRawRefPoint As Point3d
Select Case RawRefPosition
Case MCH_CR.TL
ptRawRefPoint.x = ptBBoxRawPartMin.x
ptRawRefPoint.y = ptBBoxRawPartMax.y
Case MCH_CR.TR
ptRawRefPoint.x = ptBBoxRawPartMax.x
ptRawRefPoint.y = ptBBoxRawPartMax.y
Case MCH_CR.BL
ptRawRefPoint.x = ptBBoxRawPartMin.x
ptRawRefPoint.y = ptBBoxRawPartMin.y
Case MCH_CR.BR
ptRawRefPoint.x = ptBBoxRawPartMax.x
ptRawRefPoint.y = ptBBoxRawPartMin.y
End Select
ptRawRefPoint.z = ptBBoxRawPartMin.z
Return ptRawRefPoint
End Function
Public Shared Function MoveRawPartPartAndFixture(nMoveId As Integer, vtMove As Vector3d, Optional nCount As Integer = 1) As Boolean
Dim bErrorMoving As Boolean = False
' Muovo gli oggetti selezionati se consentito
If nMoveId = GDB_ID.SEL Then
Dim nSelObjId As Integer = EgtGetFirstSelectedObj()
While nSelObjId <> GDB_ID.NULL
If EgtVerifyFixture(nSelObjId) Then
If Not EgtMoveFixture(nSelObjId, vtMove) Then
bErrorMoving = True
nSelObjId = EgtGetPrevSelectedObj()
While nSelObjId <> GDB_ID.NULL
If EgtVerifyFixture(nSelObjId) Then
EgtMoveFixture(nSelObjId, -vtMove)
Else
EgtMoveRawPart(nSelObjId, -vtMove)
End If
nSelObjId = EgtGetPrevSelectedObj()
End While
Exit While
End If
nSelObjId = EgtGetNextSelectedObj()
Else
If Not EgtMoveRawPart(nSelObjId, vtMove) Then
bErrorMoving = True
nSelObjId = EgtGetPrevSelectedObj()
While nSelObjId <> GDB_ID.NULL
If EgtVerifyFixture(nSelObjId) Then
EgtMoveFixture(nSelObjId, -vtMove)
Else
EgtMoveRawPart(nSelObjId, -vtMove)
End If
nSelObjId = EgtGetPrevSelectedObj()
End While
Exit While
End If
nSelObjId = EgtGetNextSelectedObj()
End If
End While
Else
If EgtVerifyFixture(nMoveId) Then
If Not EgtMoveFixture(nMoveId, vtMove) Then
bErrorMoving = True
End If
Else
If Not EgtMoveRawPart(nMoveId, vtMove) Then
bErrorMoving = True
End If
End If
End If
' Variabile che contiene l'eventuale spostamento correttivo per interferenza con riferimenti
Dim vtRefMove As New Vector3d(Vector3d.NULL)
' Se non ci sono stati errori nel movimento
Dim bErrorVerify As Boolean = False
If Not bErrorMoving Then
' Verifico che gli spostamenti effettuati siano validi
If nMoveId = GDB_ID.SEL Then
Dim nSelObjId As Integer = EgtGetFirstSelectedObj()
While nSelObjId <> GDB_ID.NULL
If Not VerifyRawPartFixturePos(nSelObjId, vtMove, vtRefMove) Then
bErrorVerify = True
Exit While
End If
nSelObjId = EgtGetNextSelectedObj()
End While
Else
If Not VerifyRawPartFixturePos(nMoveId, vtMove, vtRefMove) Then
bErrorVerify = True
End If
'Dim sOut As String = "VerifyRaw : Count=" & nCount & " Err=" & If(bErrorVerify, "1", "0") &
' " Move=" & LenToString(vtMove.x, 3) & "," & LenToString(vtMove.y, 3) &
' " RefMove=" & LenToString(vtRefMove.x, 3) & "," & LenToString(vtRefMove.y, 3)
'EgtOutLog(sOut)
End If
End If
' Se non c'è errore ma necessaria correzione riferimento
If Not bErrorVerify AndAlso Not vtRefMove.IsSmall() Then
' provo a correggere (max 1 prova)
If nCount < 2 Then
bErrorVerify = Not MoveRawPartPartAndFixture(nMoveId, vtRefMove, nCount + 1)
End If
End If
' Se c'è almeno uno spostamento non valido
If bErrorVerify Then
' ripristino la situazione iniziale annullando tutti i movimenti
If nMoveId = GDB_ID.SEL Then
Dim nSelObjId As Integer = EgtGetFirstSelectedObj()
While nSelObjId <> GDB_ID.NULL
If EgtVerifyFixture(nSelObjId) Then
EgtMoveFixture(nSelObjId, -vtMove)
Else
EgtMoveRawPart(nSelObjId, -vtMove)
End If
nSelObjId = EgtGetNextSelectedObj()
End While
Else
If EgtVerifyFixture(nMoveId) Then
EgtMoveFixture(nMoveId, -vtMove)
Else
EgtMoveRawPart(nMoveId, -vtMove)
End If
End If
' ritorno falso
Return False
End If
Return True
End Function
Public Shared Function VerifyRawPartFixturePos(nMovedObjId As Integer, ByRef vtOrigMove As Vector3d, ByRef vtRefMove As Vector3d) As Boolean
' Verifico quale sia il tipo dell'oggetto mosso
If EgtVerifyFixture(nMovedObjId) Then
Return VerifyFixturePosition(nMovedObjId, vtRefMove)
ElseIf EgtVerifyRawPartCurrPhase(nMovedObjId) Then
Return VerifyRawPosition(nMovedObjId, vtOrigMove, vtRefMove)
Else
Return False
End If
End Function
Friend Shared Function VerifyFixturePosition(nMovedFixtureId As Integer, ByRef vtRefMove As Vector3d) As Boolean
' Definisco il box della ventosa mossa
Dim bboxMovedFixture As New BBox3d
EgtGetBBoxGlob(nMovedFixtureId, GDB_BB.ONLY_VISIBLE, bboxMovedFixture)
Dim bboxFixture As New BBox3d
' Ciclo sui sottopezzi correnti per verificare le collisioni con il sottopezzo spostato
Dim nFixtureId As Integer = EgtGetFirstFixture()
While nFixtureId <> GDB_ID.NULL
If EgtVerifyFixture(nFixtureId) AndAlso nFixtureId <> nMovedFixtureId Then
' ne calcolo il BBox
EgtGetBBoxGlob(nFixtureId, GDB_BB.ONLY_VISIBLE, bboxFixture)
' verifico se c'è sovrapposizione
If bboxMovedFixture.OverlapsXY(bboxFixture) Then
' se c'è restituisco falso perchè i sottopezzi non si possono sovrapporre
Return False
End If
End If
nFixtureId = EgtGetNextFixture(nFixtureId)
End While
Return VerifyFixtureWithRaw(nMovedFixtureId, vtRefMove)
End Function
Private Shared Function VerifyFixtureWithRaw(nFixtureId As Integer, ByRef vtRefMove As Vector3d) As Boolean
' Tengo da parte il riferimento della tavola
Dim ptTableRef As Point3d
EgtGetTableRef(1, ptTableRef)
Dim TableFrame As New Frame3d(ptTableRef)
' Definisco il box del sottopezzo mosso
Dim bboxFixture As New BBox3d
EgtGetBBoxGlob(nFixtureId, GDB_BB.ONLY_VISIBLE, bboxFixture)
Dim bboxRawPart As New BBox3d
' Variabile che indica se il riferimento non è in battuta su nessun grezzo
Dim bRefAttachedToRaw As Boolean = False
' Ciclo sui grezzi della fase corrente per verificare le collisioni con il sottopezzo mosso
Dim nRawPartId As Integer = EgtGetFirstRawPart()
While nRawPartId <> GDB_ID.NULL
If EgtVerifyRawPartCurrPhase(nRawPartId) Then
' recupero il solido del grezzo
Dim nRawSolidId As Integer = EgtGetFirstNameInGroup(nRawPartId, RAWSOLID)
' ne calcolo il BBox
EgtGetBBoxGlob(nRawSolidId, GDB_BB.ONLY_VISIBLE, bboxRawPart)
' verifico il tipo di sottopezzo
Select Case FixtureType(nFixtureId)
' se il sottopezzo è una ventosa
Case FIX_TYPE.VACUUM
' verifico se c'è sovrapposizione
If bboxFixture.OverlapsXY(bboxRawPart) Then
' se c'è devo verificare che l'altezza del grezzo sia uguale a quella della ventosa
' recupero altezza ventosa
Dim dFixtureHeight As Double = 0
EgtGetInfo(nFixtureId, "H", dFixtureHeight)
' recupero altezza grezzo riferita alla tavola
Dim dRawPartMin As Point3d = bboxRawPart.Min
dRawPartMin.ToLoc(TableFrame)
' se l'altezza grezzo è minore di quella della ventosa, lo sposto alla stessa altezza
If dRawPartMin.z < dFixtureHeight - EPS_SMALL Then
Dim vtMove As New Vector3d(0, 0, dFixtureHeight - dRawPartMin.z)
EgtMoveRawPart(nRawPartId, vtMove)
' ricalcolo il BBox del solido del grezzo per averlo aggiornato con la nuova Z
EgtGetBBoxGlob(nRawSolidId, GDB_BB.ONLY_VISIBLE, bboxRawPart)
End If
' se non c'è sovrapposizione devo verificare il grezzo con tutti gli altri sottopezzi per sapere se ho tolto l'ultimo e quindi devo abbassarlo
Else
' variabile che contiene la massima altezza delle ventose sottostanti
Dim dMaxFixtureHeight As Double = 0
' Variabile che dice se c'è almeno una ventosa sotto il grezzo
Dim bIsFixtureUnderRawPart As Boolean = False
Dim nOtherFixtureId As Integer = EgtGetFirstFixture()
While nOtherFixtureId <> GDB_ID.NULL
' evito di rifare la verifica sul sottopezzo mosso
If nOtherFixtureId <> nFixtureId Then
' calcolo il BBox del sottopezzo
Dim bboxOtherFixture As New BBox3d
EgtGetBBoxGlob(nOtherFixtureId, GDB_BB.ONLY_VISIBLE, bboxOtherFixture)
If bboxRawPart.OverlapsXY(bboxOtherFixture) Then
bIsFixtureUnderRawPart = True
' recupero altezza ventosa
Dim dOtherFixtureHeight As Double = 0
EgtGetInfo(nFixtureId, "H", dOtherFixtureHeight)
' la confronto con quella massima
If dOtherFixtureHeight > dMaxFixtureHeight Then
dMaxFixtureHeight = dOtherFixtureHeight
End If
End If
End If
nOtherFixtureId = EgtGetNextFixture(nOtherFixtureId)
End While
' recupero altezza grezzo riferita alla tavola
Dim dRawPartMin As Point3d = bboxRawPart.Min
dRawPartMin.ToLoc(TableFrame)
' se non ci sono ventose sotto il grezzo
If Not bIsFixtureUnderRawPart Then
' verifico che il grezzo sia ad altezza tavola
If dRawPartMin.z <> 0 Then
Dim vtMove As New Vector3d(0, 0, -dRawPartMin.z)
EgtMoveRawPart(nRawPartId, vtMove)
End If
Else
' se ci sono verifico che l'altezza del grezzo sia quella della ventosa più alta
If Math.Abs(dRawPartMin.z - dMaxFixtureHeight) > EPS_SMALL Then
Dim vtMove As New Vector3d(0, 0, dMaxFixtureHeight - dRawPartMin.z)
EgtMoveRawPart(nRawPartId, vtMove)
End If
End If
End If
' se il sottopezzo è un riferimento
Case FIX_TYPE.REFERENCE
' verifico se c'è sovrapposizione
If bboxFixture.OverlapsXY(bboxRawPart) Then
' recupero arco del riferimento
Dim arcRefId As Integer = EgtGetFirstNameInGroup(EgtGetFirstNameInGroup(nFixtureId, SOLID), REF_ARC)
' calcolo bbox dell'arco di riferimento
Dim bboxArcRef As New BBox3d
EgtGetBBoxGlob(arcRefId, GDB_BB.STANDARD, bboxArcRef)
' ne faccio l'offset ??
'bboxArcRef.Expand(10)
If bboxRawPart.OverlapsXY(bboxArcRef) Then
' recupero contorno del grezzo
Dim ccompoRawPartOutlineId As Integer = EgtGetFirstNameInGroup(nRawPartId, RAWOUTLINE)
'recupero il raggio dell'arco di riferimento
Dim dArcRadius As Double
EgtArcRadius(arcRefId, dArcRadius)
' faccio copia e offset del contorno grezzo
Dim ccompoRawPartOutlineOffsetId As Integer = EgtCopyGlob(ccompoRawPartOutlineId, ccompoRawPartOutlineId, GDB_POS.AFTER)
EgtOffsetCurve(ccompoRawPartOutlineOffsetId, dArcRadius, OFF_TYPE.FILLET)
' recupero centro dell'arco di riferimento
Dim ptArcCenter As Point3d
EgtCenterPoint(arcRefId, ccompoRawPartOutlineOffsetId, ptArcCenter)
' verifico quale è il punto dell'offset vicino al centro dell'arco di riferimento
Dim dDist As Double
Dim ptMin As Point3d
Dim nSide As Integer
EgtGetMinDistPntSidePointCurve(ptArcCenter, ccompoRawPartOutlineOffsetId, Vector3d.Z_AX, dDist, ptMin, nSide)
' cancello offset
EgtErase(ccompoRawPartOutlineOffsetId)
' calcolo il vettore di spostamento necessario ad allinearli
Dim vtDelta As Vector3d = ptArcCenter - ptMin
vtDelta.z = 0
' se i punti coincidono, esco
If vtDelta.IsSmall() Then
' il grezzo è in battuta sul riferimento
Dim nContactColDisk As Integer = EgtGetFirstNameInGroup(EgtGetFirstNameInGroup(nFixtureId, SOLID), REF_DISK)
EgtSetColor(nContactColDisk, ReferenceContactColGreen)
bRefAttachedToRaw = True
Else
' altrimenti riporto il vettore di correzione
vtRefMove = -vtDelta.Glob(ccompoRawPartOutlineId)
End If
Else
' il grezzo non è in battuta sul riferimento
Dim nContactColDisk As Integer = EgtGetFirstNameInGroup(EgtGetFirstNameInGroup(nFixtureId, SOLID), REF_DISK)
EgtSetColor(nContactColDisk, ReferenceContactColRed)
End If
End If
End Select
End If
nRawPartId = EgtGetNextRawPart(nRawPartId)
End While
' se è un riferimento e non è in battuta sul nessun grezzo
If FixtureType(nFixtureId) = FIX_TYPE.REFERENCE AndAlso Not bRefAttachedToRaw Then
' lo segnalo
Dim nContactColDisk As Integer = EgtGetFirstNameInGroup(EgtGetFirstNameInGroup(nFixtureId, SOLID), REF_DISK)
EgtSetColor(nContactColDisk, ReferenceContactColRed)
End If
Return True
End Function
Private Shared Function VerifyRawPosition(nMovedRawId As Integer, ByRef vtOrigMove As Vector3d, ByRef vtRefMove As Vector3d) As Boolean
' Recupero il solido del grezzo
Dim nMovedRawSolidId As Integer = EgtGetFirstNameInGroup(nMovedRawId, RAWSOLID)
' definisco il box del solido del grezzo
Dim bboxMovedRawPart As New BBox3d
EgtGetBBoxGlob(nMovedRawSolidId, GDB_BB.ONLY_VISIBLE, bboxMovedRawPart)
Dim bboxRawPart As New BBox3d
' Ciclo sui grezzi della fase corrente per verificare le collisioni con il grezzo spostato
Dim nRawPartId As Integer = EgtGetFirstRawPart()
While nRawPartId <> GDB_ID.NULL
If EgtVerifyRawPartCurrPhase(nRawPartId) AndAlso nRawPartId <> nMovedRawId Then
' recupero il solido del grezzo
Dim nRawSolidId As Integer = EgtGetFirstNameInGroup(nRawPartId, RAWSOLID)
' ne calcolo il BBox
EgtGetBBoxGlob(nRawSolidId, GDB_BB.ONLY_VISIBLE, bboxRawPart)
' verifico se c'è sovrapposizione
If bboxMovedRawPart.OverlapsXY(bboxRawPart) Then
' se c'è restituisco falso perchè i grezzi non si possono sovrapporre
Return False
End If
End If
nRawPartId = EgtGetNextRawPart(nRawPartId)
End While
' verifico le interferenze tra il grezzo spostato e le ventose
Return VerifyRawWithFixture(nMovedRawId, vtOrigMove, vtRefMove)
End Function
Private Shared Function VerifyRawWithFixture(nRawId As Integer, ByRef vtOrigMove As Vector3d, ByRef vtRefMove As Vector3d) As Boolean
' Tengo da parte il riferimento della tavola
Dim ptTableRef As Point3d
EgtGetTableRef(1, ptTableRef)
Dim TableFrame As New Frame3d(ptTableRef)
' Recupero il solido del grezzo
Dim nMovedRawSolidId As Integer = EgtGetFirstNameInGroup(nRawId, RAWSOLID)
' definisco il box del solido del grezzo
Dim bboxRawPartId As New BBox3d
EgtGetBBoxGlob(nMovedRawSolidId, GDB_BB.ONLY_VISIBLE, bboxRawPartId)
' Variabile che dice se c'è almeno una ventosa sotto il grezzo
Dim bIsFixtureUnderRawPart As Boolean = False
Dim bboxFixture As New BBox3d
' variabile che contiene la massima altezza delle ventose sottostanti
Dim dMaxFixtureHeight As Double = 0
' recupero altezza grezzo riferita alla tavola
Dim dRawPartMin As Point3d = bboxRawPartId.Min
dRawPartMin.ToLoc(TableFrame)
' Ciclo sui sottopezzi presenti per verificare le collisioni con il grezzo
Dim nFixtureId As Integer = EgtGetFirstFixture()
While nFixtureId <> GDB_ID.NULL
' calcolo il BBox del sottopezzo
EgtGetBBoxGlob(nFixtureId, GDB_BB.ONLY_VISIBLE, bboxFixture)
' verifico se c'è sovrapposizione
If bboxRawPartId.OverlapsXY(bboxFixture) Then
Select Case FixtureType(nFixtureId)
' se il sottopezzo è una ventosa
Case FIX_TYPE.VACUUM
' recupero altezza ventosa
Dim dFixtureHeight As Double = 0
EgtGetInfo(nFixtureId, "H", dFixtureHeight)
' la confronto con quella massima
If dFixtureHeight > dMaxFixtureHeight Then
dMaxFixtureHeight = dFixtureHeight
End If
' se l'altezza grezzo è diversa da quella della ventosa, lo sposto alla stessa altezza
If dRawPartMin.z < dFixtureHeight - EPS_SMALL Then
Dim vtMove As New Vector3d(0, 0, dFixtureHeight - dRawPartMin.z)
EgtMoveRawPart(nRawId, vtMove)
' recupero il solido del grezzo
Dim nRawSolidId As Integer = EgtGetFirstNameInGroup(nRawId, RAWSOLID)
' ricalcolo il BBox del solido del grezzo per averlo aggiornato con la nuova Z
EgtGetBBoxGlob(nRawSolidId, GDB_BB.ONLY_VISIBLE, bboxRawPartId)
dRawPartMin = bboxRawPartId.Min
dRawPartMin.ToLoc(TableFrame)
End If
bIsFixtureUnderRawPart = True
' se il sottopezzo è un riferimento
Case FIX_TYPE.REFERENCE
' recupero arco del riferimento
Dim arcRefId As Integer = EgtGetFirstNameInGroup(EgtGetFirstNameInGroup(nFixtureId, SOLID), REF_ARC)
' calcolo bbox dell'arco di riferimento
Dim bboxArcRef As New BBox3d
EgtGetBBoxGlob(arcRefId, GDB_BB.STANDARD, bboxArcRef)
' ne faccio l'offset ??
'bboxArcRef.Expand(10)
If bboxRawPartId.OverlapsXY(bboxArcRef) Then
' recupero contorno del grezzo
Dim ccompoRawPartOutlineId As Integer = EgtGetFirstNameInGroup(nRawId, RAWOUTLINE)
'recupero il raggio dell'arco di riferimento
Dim dArcRadius As Double
EgtArcRadius(arcRefId, dArcRadius)
' faccio copia e offset del contorno grezzo
Dim ccompoRawPartOutlineOffsetId As Integer = EgtCopyGlob(ccompoRawPartOutlineId, ccompoRawPartOutlineId, GDB_POS.AFTER)
EgtOffsetCurve(ccompoRawPartOutlineOffsetId, dArcRadius, OFF_TYPE.FILLET)
' recupero centro dell'arco di riferimento
Dim ptArcCenter As Point3d
EgtCenterPoint(arcRefId, ccompoRawPartOutlineId, ptArcCenter)
' Creo un segmento avente origine nel centro dell'arco e direzione opposta a quella del movimento
Dim nDistLine As Integer = EgtCreateLinePVL(EgtGetParent(ccompoRawPartOutlineId), ptArcCenter, vtOrigMove.Loc(ccompoRawPartOutlineId), 10000)
' cerco punto di intersezione tra il segmento e l'offset
Dim ptDist As Point3d
If EgtIntersectionPoint(nDistLine, ccompoRawPartOutlineOffsetId, ptArcCenter, ptDist) Then
' calcolo il vettore di spostamento necessario ad allinearli
Dim vtDelta As Vector3d = -(ptDist - ptArcCenter)
vtDelta.z = 0
' se il vettore non è nullo
If vtDelta.IsSmall() Then
' il grezzo è in battuta sul riferimento
Dim nContactColDisk As Integer = EgtGetFirstNameInGroup(EgtGetFirstNameInGroup(nFixtureId, SOLID), REF_DISK)
EgtSetColor(nContactColDisk, ReferenceContactColGreen)
Else
vtDelta = vtDelta.Glob(ccompoRawPartOutlineId)
' il vettore da restituire è nullo, quindi lo inizializzo
If vtRefMove.IsSmall() Then
vtRefMove = vtDelta
' altrimenti lo confronto
Else
' per ogni coordinata devo prendere il massimo in direzione opposta allo spostamento originale
' calcolo il versore nella direzione del movimento
Dim vtMoveVers As New Vector3d(vtOrigMove)
vtMoveVers.Normalize()
If (vtDelta * vtMoveVers) < (vtRefMove * vtMoveVers) Then
vtRefMove = vtDelta
End If
End If
End If
End If
' cancello segmento e offset
EgtErase(nDistLine)
EgtErase(ccompoRawPartOutlineOffsetId)
Else
' il grezzo non è in battuta sul riferimento
Dim nContactColDisk As Integer = EgtGetFirstNameInGroup(EgtGetFirstNameInGroup(nFixtureId, SOLID), REF_DISK)
EgtSetColor(nContactColDisk, ReferenceContactColRed)
End If
End Select
' se non c'è sovrapposizione
ElseIf FixtureType(nFixtureId) = FIX_TYPE.REFERENCE Then
' il grezzo non è in battuta sul riferimento
Dim nContactColDisk As Integer = EgtGetFirstNameInGroup(EgtGetFirstNameInGroup(nFixtureId, SOLID), REF_DISK)
EgtSetColor(nContactColDisk, ReferenceContactColRed)
End If
nFixtureId = EgtGetNextFixture(nFixtureId)
End While
' se non ci sono ventose sotto il grezzo
If Not bIsFixtureUnderRawPart Then
' verifico che il grezzo sia ad altezza tavola
If dRawPartMin.z <> 0 Then
Dim vtMove As New Vector3d(0, 0, -dRawPartMin.z)
EgtMoveRawPart(nRawId, vtMove)
End If
Else
' se ci sono verifico che l'altezza del grezzo sia quella della ventosa più alta
If Math.Abs(dRawPartMin.z - dMaxFixtureHeight) > EPS_SMALL Then
Dim vtMove As New Vector3d(0, 0, dMaxFixtureHeight - dRawPartMin.z)
EgtMoveRawPart(nRawId, vtMove)
End If
End If
Return True
End Function
' Funzione che restituisce il tipo di sottopezzo passatogli
Friend Shared Function FixtureType(nFixtureId As Integer) As FIX_TYPE
Dim sFixtureType As String = String.Empty
EgtGetInfo(nFixtureId, EgtUILib.FIX_TYPE, sFixtureType)
Select Case sFixtureType
Case FIX_VAC
Return FIX_TYPE.VACUUM
Case FIX_REF
Return FIX_TYPE.REFERENCE
Case FIX_VIS
Return FIX_TYPE.VISE
End Select
Return FIX_TYPE.NULL
End Function
Public Enum FIX_TYPE As Integer
NULL = 0
VACUUM = 1
REFERENCE = 2
VISE = 3
End Enum
' Funzione che seleziona i sottopezzi del grezzo passatogli
Friend Shared Sub SelectRawPartFixture(nRawPartId As Integer)
Dim bboxRawPart As New BBox3d
Dim bboxFixture As New BBox3d
' ricavo solido del grezzo
Dim nRawPartSolid As Integer = EgtGetFirstNameInGroup(nRawPartId, RAWSOLID)
' ne ricavo il bbox
EgtGetBBoxGlob(nRawPartSolid, GDB_BB.ONLY_VISIBLE, bboxRawPart)
Dim nFixtureId As Integer = EgtGetFirstFixture()
While nFixtureId <> GDB_ID.NULL
' ricavo il bbox del sottopezzo
EgtGetBBoxGlob(nFixtureId, GDB_BB.ONLY_VISIBLE, bboxFixture)
' verifico se si sovrappongono
If bboxRawPart.OverlapsXY(bboxFixture) Then
' seleziono il sottopezzo
EgtSelectObj(nFixtureId)
End If
nFixtureId = EgtGetNextFixture(nFixtureId)
End While
End Sub
' Funzione che deseleziona i sottopezzi del grezzo passatogli
Friend Shared Sub DeselectRawPartFixture(nRawPartId As Integer)
Dim bboxRawPart As New BBox3d
Dim bboxFixture As New BBox3d
' ricavo solido del grezzo
Dim nRawPartSolid As Integer = EgtGetFirstNameInGroup(nRawPartId, RAWSOLID)
' ne ricavo il bbox
EgtGetBBoxGlob(nRawPartSolid, GDB_BB.ONLY_VISIBLE, bboxRawPart)
Dim nFixtureId As Integer = EgtGetFirstFixture()
While nFixtureId <> GDB_ID.NULL
' ricavo il bbox del sottopezzo
EgtGetBBoxGlob(nFixtureId, GDB_BB.ONLY_VISIBLE, bboxFixture)
' verifico se si sovrappongono
If bboxRawPart.OverlapsXY(bboxFixture) Then
' deseleziono il pezzo
EgtDeselectObj(nFixtureId)
End If
nFixtureId = EgtGetNextFixture(nFixtureId)
End While
End Sub
' Costante che identifica l'informazione contenente il Frame3d originale del pezzo
Private Const ORIG_FRAME As String = "ORIGFRAME"
' Funzione che visualizza i pezzi disponibili e li sposta sotto il grezzo
Friend Shared Sub ShowParts()
' prendo riferimento tavola
' ciclo sui pezzi
Dim nPartId As Integer = EgtGetFirstPart()
While nPartId <> GDB_ID.NULL
' mi faccio dare il riferimento del pezzo prima si spostarlo
Dim frOrigPart As New Frame3d
EgtGetGroupGlobFrame(nPartId, frOrigPart)
' salvo il riferimento originale
EgtSetInfo(nPartId, ORIG_FRAME, frOrigPart)
'
' Attivo la visualizzazione del pezzo mettendolo in modalità standard
EgtSetStatus(nPartId, GDB_ST.ON_)
' prendo il pezzo successivo
nPartId = EgtGetNextPart(nPartId)
End While
EgtDraw()
End Sub
' Funzione che rimette a posto i pezzi
Friend Shared Sub HideParts()
' ciclo sui pezzi
Dim nPartId As Integer = EgtGetFirstPart()
While nPartId <> GDB_ID.NULL
' recupero il riferimento originale
Dim frOrigPart As New Frame3d
EgtGetInfo(nPartId, ORIG_FRAME, frOrigPart)
' lo ripristino
EgtChangeGroupFrame(nPartId, frOrigPart)
' Attivo la visualizzazione del pezzo mettendolo in modalità standard
EgtSetStatus(nPartId, GDB_ST.OFF)
' prendo il pezzo successivo
nPartId = EgtGetNextPart(nPartId)
End While
End Sub
End Class