Files
2025-01-16 11:56:46 +01:00

423 lines
13 KiB
VB.net

Imports EgtUILib.EgtInterface
Public Class PartSolidM
#Region "FIELDS & PROPERTIES"
Private m_PartId As Integer = -1
Public ReadOnly Property PartId As Integer
Get
Return m_PartId
End Get
End Property
Private m_SurfId As Integer = -1
Public ReadOnly Property SurfId As Integer
Get
Return m_SurfId
End Get
End Property
Private m_TextureName As String = String.Empty
Public ReadOnly Property TextureName As String
Get
Return m_TextureName
End Get
End Property
Private m_PartSolidId As Integer = -1
Public Property PartSolidId As Integer
Get
If m_PartSolidId = GDB_ID.NULL Then
EgtGetInfo(PartId, CHILD, m_PartSolidId)
End If
Return m_PartSolidId
End Get
Set(value As Integer)
m_PartSolidId = value
Dim nSolidL As Integer = EgtGetFirstNameInGroup(m_PartSolidId, SOLID)
m_SolidId = EgtGetFirstInGroup(nSolidL)
End Set
End Property
Private m_SolidId As Integer = -1
Public Property SolidId As Integer
Get
If m_SolidId = GDB_ID.NULL Then
EgtGetInfo(PartId, MYSOLIDSURF, m_SolidId)
End If
Return m_SolidId
End Get
Set(value As Integer)
m_SolidId = value
m_PartSolidId = EgtGetParent(EgtGetParent(m_SolidId))
End Set
End Property
Private m_bbSolid As New BBox3d
Public Property bbSolid As BBox3d
Get
EgtGetBBoxGlob(m_SolidId, 0, m_bbSolid)
Return m_bbSolid
End Get
Set(value As BBox3d)
m_bbSolid = value
End Set
End Property
Private m_nIdLineAxisRotate As Integer = -1
Public Property nIdLineAxisRotate As Integer
Get
Return m_nIdLineAxisRotate
End Get
Set(value As Integer)
m_nIdLineAxisRotate = value
End Set
End Property
Private m_nIdLineFirst As Integer = -1
Public Property nIdLineFirst As Integer
Get
Return m_nIdLineFirst
End Get
Set(value As Integer)
m_nIdLineFirst = value
End Set
End Property
Private m_nIdLineSecond As Integer = -1
Public Property nIdLineSecond As Integer
Get
Return m_nIdLineSecond
End Get
Set(value As Integer)
m_nIdLineSecond = value
End Set
End Property
Public Function IsPaired() As Boolean
Dim sPaired As String = String.Empty
EgtGetInfo(PartId, PAIRED, sPaired)
' se trovo una virgola allora ho
Dim nIndex = sPaired.IndexOf(",")
If nIndex = -1 Then
Return False
Else
Return True
End If
End Function
Private m_nGroupCode As Integer = 0
Public Property nGroupCode As Integer
Get
Return m_nGroupCode
End Get
Set(value As Integer)
If value = -1 Then Return
m_nGroupCode = value
EgtSetInfo(PartId, GROUP, value)
End Set
End Property
Private m_nIdSurfFirst As Integer = -1
Public Property nIdSurfFirst As Integer
Get
Return m_nIdSurfFirst
End Get
Set(value As Integer)
m_nIdSurfFirst = value
End Set
End Property
Private m_nIdSurfSecond As Integer = -1
Public Property nIdSurfSecond As Integer
Get
Return m_nIdSurfSecond
End Get
Set(value As Integer)
m_nIdSurfSecond = value
End Set
End Property
Private m_vtNormFirst As New Vector3d
Public Property vtNormFirst As Vector3d
Get
Return m_vtNormFirst
End Get
Set(value As Vector3d)
m_vtNormFirst = value
End Set
End Property
Private m_vtNormSecond As New Vector3d
Public Property vtNormSecond As Vector3d
Get
Return m_vtNormSecond
End Get
Set(value As Vector3d)
m_vtNormSecond = value
End Set
End Property
Private m_TernaId As Integer = -1
Public Property TernaId As Integer
Get
Return m_TernaId
End Get
Set(value As Integer)
m_TernaId = value
End Set
End Property
Private m_vtDrag As New Vector3d
Public Property vtDrag As Vector3d
Get
Return m_vtDrag
End Get
Set(value As Vector3d)
m_vtDrag = value
End Set
End Property
Private m_nLayTempId As Integer = -1
#End Region ' Fields & Properties
#Region "CONSTRUCTOR"
Sub New(nId As Integer)
' salvo il riferimento della VeinMatchingWindow
Dim nPartId As Integer = -1
' se serve recupero il parent e poi capisco se è il Part o il SOLIDpart
If Not EgtIsPart(nId) Then
nPartId = EgtGetParent(EgtGetParent(nId))
Else
nPartId = nId
End If
Dim sName As String = String.Empty
EgtGetName(nPartId, sName)
If sName = SOLID.ToUpper() Then
' salvo i dati del part solid
m_PartSolidId = nPartId
Dim nSolidL As Integer = EgtGetFirstNameInGroup(nPartId, SURFACE)
Dim nSolidId As Integer = EgtGetFirstInGroup(nSolidL)
While EgtGetType(nSolidId) <> GDB_TY.SRF_MESH And nSolidId <> GDB_ID.NULL
nSolidId = EgtGetNext(nSolidId)
End While
m_SolidId = nSolidId
' recupero i dati del part
EgtGetInfo(nPartId, PARENT, m_PartId)
Dim nSurfL As Integer = EgtGetFirstNameInGroup(nPartId, REGION)
Dim nSurfId As Integer = EgtGetFirstInGroup(nSurfL)
While EgtGetType(nSurfId) <> GDB_TY.SRF_FRGN And nSurfId <> GDB_ID.NULL
nSurfId = EgtGetNext(nSurfId)
End While
m_SurfId = nSurfId
Else
' salvo i dati del part
m_PartId = nPartId
Dim nSurfL As Integer = EgtGetFirstNameInGroup(nPartId, REGION)
Dim nSurfId As Integer = EgtGetFirstInGroup(nSurfL)
While EgtGetType(nSurfId) <> GDB_TY.SRF_FRGN And nSurfId <> GDB_ID.NULL
nSurfId = EgtGetNext(nSurfId)
End While
m_SurfId = nSurfId
' recupero i dati del part solid
EgtGetInfo(nPartId, CHILD, m_PartSolidId)
Dim nSolidL As Integer = EgtGetFirstNameInGroup(m_PartSolidId, SURFACE)
Dim nSolidId As Integer = EgtGetFirstInGroup(nSolidL)
While EgtGetType(nSolidId) <> GDB_TY.SRF_MESH And nSolidId <> GDB_ID.NULL
nSolidId = EgtGetNext(nSolidId)
End While
m_SolidId = nSolidId
End If
'recupero il layer temp nel Part del solid
m_nLayTempId = EgtGetFirstNameInGroup(PartSolidId, TEMP)
' recupero o creo le informazioni di accoppiamento
Dim sPaired As String = String.Empty
EgtGetInfo(m_PartId, PAIRED, sPaired)
' se ho solo un numero nel paired lo aggiorno con l'id effettivo del pezzo
Dim vPaired As Array = sPaired.Split(CChar(","))
If sPaired = "" Or vPaired.Length = 1 Then
SolidManagerM.UpdatePairInfoSingle(PartId, PartId.ToString, 0)
End If
End Sub
#End Region ' Constructor
#Region "METHODS"
Public Sub SelectSinglePart()
If EgtIsSelectedObj(m_PartId) Then Return
Dim bOk As Boolean = EgtSelectObj(m_PartId)
Dim bOk1 As Boolean = EgtSelectObj(m_PartSolidId)
End Sub
Public Sub SelectPart()
If IsSelected() Then Return
Dim lPair As List(Of Integer) = SolidManagerM.PairList(PartId)
For Each nId As Integer In lPair
Dim PartSolidSel As PartSolidM = SolidManagerM.GetPartSolid(nId)
PartSolidSel.SelectSinglePart()
Next
' importo la terna per il gumball come temporanea
If Not EgtInsertFile(Map.refMainWindowVM.MainWindowM.sVein3DDir & "\" & TERNA_FILENAME) Then Return
m_TernaId = EgtGetLastPart()
EgtSetInfo(PartId, TERNA, m_TernaId)
EgtSetName(m_TernaId, TERNA)
EgtSetLevel(m_TernaId, GDB_LV.TEMP)
'creo gli assi per la rotazione e li nascondo
Dim vtMove As Vector3d = Center() - New Point3d(0, 0, 0)
Dim Lay_X As Integer = EgtCreateGroup(TernaId)
Dim Line_X As Integer = EgtCreateLine(Lay_X, New Point3d(-(100 + bbSolid.DimX / 2), 0, 0), New Point3d(100 + bbSolid.DimX / 2, 0, 0), GDB_RT.GLOB)
EgtSetColor(Line_X, New Color3d(255, 0, 0))
EgtSetName(Lay_X, AXISX)
EgtSetStatus(Lay_X, GDB_ST.OFF)
Dim Lay_Y As Integer = EgtCreateGroup(TernaId)
Dim Line_Y As Integer = EgtCreateLine(Lay_Y, New Point3d(0, -(100 + bbSolid.DimY / 2), 0), New Point3d(0, 100 + bbSolid.DimY / 2, 0), GDB_RT.GLOB)
EgtSetColor(Line_Y, New Color3d(0, 255, 0))
EgtSetName(Lay_Y, AXISY)
EgtSetStatus(Lay_Y, GDB_ST.OFF)
Dim Lay_Z As Integer = EgtCreateGroup(TernaId)
Dim Line_Z As Integer = EgtCreateLine(Lay_Z, New Point3d(0, 0, -(200 + bbSolid.DimZ / 2)), New Point3d(0, 0, 200 + bbSolid.DimZ / 2), GDB_RT.GLOB)
EgtSetColor(Line_Z, New Color3d(0, 0, 255))
EgtSetName(Lay_Z, AXISZ)
EgtSetStatus(Lay_Z, GDB_ST.OFF)
EgtMove(m_TernaId, vtMove)
''''''GESTIONE DELLA TERNA SE HO PIù OPZIONI: GLOBALE, LOCALE, ETC..
'If RefVMW.RefType.SelectedItem.Equals("Global") Then
' ' sono già a posto
' EgtMove(m_TernaId, vtMove)
'ElseIf RefVMW.RefType.SelectedItem.Equals("Local") Then
' ' devo orientare la terna con asse z come la normale della superficie principale e asse x come la dimensione principale di quella faccia
' Dim ptCenter As Point3d = Center()
' Dim vtNorm As New Vector3d
' EgtSurfFrNormVersor(SurfId, GDB_RT.GLOB, vtNorm)
' Dim nCount As Integer = 0
' Dim nExtLoopId As Integer = EgtExtractSurfFrChunkLoops(SurfId, 0, m_nLayTempId, nCount)
' Dim frFrameLoc As New Frame3d
' EgtCurveMinAreaRectangleXY(nExtLoopId, GDB_RT.LOC, frFrameLoc)
' EgtErase(nExtLoopId)
' Dim frFrameSolid As New Frame3d
' EgtGetGroupGlobFrame(PartSolidId, frFrameSolid)
' frFrameSolid.ChangeOrigin(Center())
' 'frFrameSolid.ChangeOrigin(New Point3d())
' frFrameLoc.ToGlob(frFrameSolid)
' EgtChangeGroupFrame(m_TernaId, frFrameLoc)
'End If
End Sub
Public Sub DeselectSinglePart()
EgtDeselectObj(m_PartId)
EgtDeselectObj(m_PartSolidId)
' cancello la terna e resetto l'id
EgtErase(m_TernaId)
EgtSetInfo(PartId, TERNA, "")
ResetData()
m_TernaId = -1
End Sub
Public Sub DeselectPart()
Dim lPair As List(Of Integer) = SolidManagerM.PairList(PartId)
For Each nId As Integer In lPair
Dim PartSolidSel As PartSolidM = SolidManagerM.GetPartSolid(nId)
PartSolidSel.DeselectSinglePart()
Next
End Sub
Public Sub Mark()
EgtSetMark(m_nIdLineAxisRotate)
EgtSetMark(m_nIdLineFirst)
EgtSetMark(m_nIdLineSecond)
End Sub
Public Sub ResetMark()
EgtResetMark(m_nIdLineAxisRotate)
EgtResetMark(m_nIdLineFirst)
EgtResetMark(m_nIdLineSecond)
End Sub
Public Sub ShowAxis()
EgtSetStatus(EgtGetFirstNameInGroup(TernaId, AXISX), GDB_ST.ON_)
EgtSetStatus(EgtGetFirstNameInGroup(TernaId, AXISY), GDB_ST.ON_)
EgtSetStatus(EgtGetFirstNameInGroup(TernaId, AXISZ), GDB_ST.ON_)
End Sub
Public Sub HideAxis()
EgtSetStatus(EgtGetFirstNameInGroup(TernaId, AXISX), GDB_ST.OFF)
EgtSetStatus(EgtGetFirstNameInGroup(TernaId, AXISY), GDB_ST.OFF)
EgtSetStatus(EgtGetFirstNameInGroup(TernaId, AXISZ), GDB_ST.OFF)
End Sub
Public Function Center() As Point3d
Dim ptCen As New Point3d
If SolidId <> GDB_ID.NULL Then
EgtCentroid(SolidId, GDB_ID.ROOT, ptCen)
ElseIf SurfId <> GDB_ID.NULL Then
EgtCentroid(SurfId, GDB_ID.ROOT, ptCen)
Else
Dim nLoopLay As Integer = EgtGetFirstNameInGroup(PartId, "OutLoop")
Dim nLoopId As Integer = EgtGetFirstInGroup(nLoopLay)
EgtStartPoint(nLoopId, GDB_ID.ROOT, ptCen)
End If
Return ptCen
End Function
Public Sub ResetData()
ResetMark()
m_nIdLineAxisRotate = -1
m_nIdLineFirst = -1
m_nIdLineSecond = -1
m_vtNormFirst = New Vector3d
m_vtNormSecond = New Vector3d
m_nIdSurfFirst = -1
m_nIdSurfSecond = -1
End Sub
Public Function GetLineInfo(nInfo As Integer) As String
Dim sAnswer As String = String.Empty
Select Case nInfo
Case 0
Dim dLen As Double = 0
EgtCurveLength(m_nIdLineFirst, dLen)
'sAnswer = LenToString(dLen, 2) & "mm"
sAnswer = dLen.ToString & MILLIMETER
Case 1
Dim vtDir As New Vector3d
EgtStartVector(m_nIdLineFirst, GDB_ID.ROOT, vtDir)
sAnswer = vtDir.ToString
Case 2
Dim ptStart As New Point3d
EgtStartPoint(m_nIdLineFirst, GDB_ID.ROOT, ptStart)
sAnswer = ptStart.ToString
Case 3
Dim ptEnd As New Point3d
EgtEndPoint(m_nIdLineFirst, GDB_ID.ROOT, ptEnd)
sAnswer = ptEnd.ToString
End Select
Return sAnswer
End Function
Public Sub MakeTransparent()
EgtSetAlpha(SolidId, 70)
End Sub
Public Sub MakeOpaque()
EgtSetAlpha(SolidId, 100)
End Sub
Public Function IsSelected() As Boolean
Return EgtIsSelectedObj(PartId)
End Function
#End Region ' Methods
End Class