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