diff --git a/CadCuts/MoveRawPartPage.xaml.vb b/CadCuts/MoveRawPartPage.xaml.vb index 5ebb949..d4059d2 100644 --- a/CadCuts/MoveRawPartPage.xaml.vb +++ b/CadCuts/MoveRawPartPage.xaml.vb @@ -370,7 +370,19 @@ Public Class MoveRawPartPage VacuumCups.SetWeightInformation(AverageDensity, MaxSinglePlugger, MaxDoublePlugger) VacuumCups.SetRotationForExtraStrokeY(GetPrivateProfileInt(S_MACH_RAWMOVE, K_MACH_ROTATEVACUUMFOREXTRASTROKEY, 0, m_MainWindow.GetMachIniFile()) <> 0) VacuumCups.SetRotationForExtraStrokeX(GetPrivateProfileInt(S_MACH_RAWMOVE, K_MACH_ROTATEVACUUMFOREXTRASTROKEX, 0, m_MainWindow.GetMachIniFile()) <> 0) - If PutVacuumCupsOnRaw(nId, rmData) Then + + Dim bTwoHeadVac As Boolean = False + Dim bPutVacuum As Boolean = False + If EgtGetAxisId("C1") And EgtGetAxisId("C2") Then + bTwoHeadVac = True + End If + + bPutVacuum = PutVacuumCupsOnRaw(nId, rmData) + If Not bPutVacuum And bTwoHeadVac Then + bPutVacuum = PutVacuumCupsOnRaw(nId, rmData) + End If + + If bPutVacuum Then ' Visualizzo le ventose EgtSetStatus(GetVacuumId(), GDB_ST.ON_) ' Aggiorno i dati @@ -392,6 +404,8 @@ Public Class MoveRawPartPage m_CurrProjPage.SetWarningMessage(EgtMsg(MSG_MOVERAWPAGEUC + 2)) 'Pezzo troppo piccolo : non si può muovere End If End If + + End If End If EgtDraw() diff --git a/CadCuts/NestPageUC.xaml.vb b/CadCuts/NestPageUC.xaml.vb index 592a10f..ab41782 100644 --- a/CadCuts/NestPageUC.xaml.vb +++ b/CadCuts/NestPageUC.xaml.vb @@ -2482,8 +2482,11 @@ Public Class NestPageUC Const STORE_LARGH As Double = 6000 Const STORE_DIST As Double = 200 Const STORE_OFFS As Double = 20 + 40 + 20 - Dim dStXmin As Double = b3Tab.Min().x - 0.5 * (STORE_LARGH - b3Tab.DimX()) - Return EgtPackBox(nId, dStXmin, -INFINITO, dStXmin + STORE_LARGH, b3Tab.Min().y - STORE_DIST, STORE_OFFS, False) + Dim dStoreLarg As Double = GetPrivateProfileDouble("Store", "StoreLargh", STORE_LARGH, m_MainWindow.GetMachIniFile()) + Dim dStoreDist As Double = GetPrivateProfileDouble("Store", "StoreDist", STORE_DIST, m_MainWindow.GetMachIniFile()) + Dim dStoreOffs As Double = GetPrivateProfileDouble("Store", "StoreOffs", STORE_OFFS, m_MainWindow.GetMachIniFile()) + Dim dStXmin As Double = b3Tab.Min().x - 0.5 * (dStoreLarg - b3Tab.DimX()) + Return EgtPackBox(nId, dStXmin, -INFINITO, dStXmin + dStoreLarg, b3Tab.Min().y - dStoreDist, dStoreOffs, False) End Function Private Sub RemovePartBtn_Click(sender As Object, e As RoutedEventArgs) Handles RemovePartBtn.Click diff --git a/CadCuts/VacuumCups.vb b/CadCuts/VacuumCups.vb index a078906..56151c8 100644 --- a/CadCuts/VacuumCups.vb +++ b/CadCuts/VacuumCups.vb @@ -31,6 +31,8 @@ Module VacuumCups ' Nome del gruppo temporaneo per le ventose Private Const VACTMP_GRP As String = "VacTmp" + Private sHeadName As String = VACUUM_HEAD + '----------------------------------------------------------------------------------------------- Friend Class RawMoveData @@ -87,17 +89,17 @@ Module VacuumCups Friend Function LoadVacuumCups() As Boolean ' Leggo tipo manipolatore con ventosa m_nVacType = 0 - EgtGetInfo(EgtGetHeadId(VACUUM_HEAD), KEY_VAC_TYPE, m_nVacType) + EgtGetInfo(EgtGetHeadId(sHeadName), KEY_VAC_TYPE, m_nVacType) ' Cancello eventuali vecchie ventose RemoveVacuumCups() ' Identificativo ventose nella macchina - Dim nLayId As Integer = EgtGetFirstNameInGroup(EgtGetHeadId(VACUUM_HEAD), VACUUM_HEAD_LAYOUT) + Dim nLayId As Integer = EgtGetFirstNameInGroup(EgtGetHeadId(sHeadName), VACUUM_HEAD_LAYOUT) If nLayId = GDB_ID.NULL Then Return False ' Identificativo riferimento della testa nella macchina - Dim nT1Id As Integer = EgtGetFirstNameInGroup(EgtGetHeadId(VACUUM_HEAD), HEAD_FIRST_EXIT) + Dim nT1Id As Integer = EgtGetFirstNameInGroup(EgtGetHeadId(sHeadName), HEAD_FIRST_EXIT) If nT1Id = GDB_ID.NULL Then Return False ' imposto la l'uscita della ventosa come fosse l'uscita di un utensile - EgtSetCalcTool("", "H4", 1) + EgtSetCalcTool("", sHeadName, 1) ' Creo gruppo temporaneo in cui copiarli m_nTempId = EgtCreateGroup(GDB_ID.ROOT) If m_nTempId = GDB_ID.NULL Then Return False @@ -107,23 +109,23 @@ Module VacuumCups m_nVacId = EgtCopyGlob(nLayId, m_nTempId) If m_nVacId = GDB_ID.NULL Then Return False ' Angolo di rotazione preferito - EgtGetInfo( m_nVacId, KEY_VACLAY_PREFROT, m_dPreferredRot) + EgtGetInfo(m_nVacId, KEY_VACLAY_PREFROT, m_dPreferredRot) ' Angoli di rotazione preferiti per ventosa in verticale (lungo Y) a sinistra e a destra del centro tavola - EgtGetInfo( m_nVacId, KEY_VACLAY_PREFVROTXMINUS, m_dPrefVertRotXMinus) + EgtGetInfo(m_nVacId, KEY_VACLAY_PREFVROTXMINUS, m_dPrefVertRotXMinus) EgtGetInfo(m_nVacId, KEY_VACLAY_PREFVROTXPLUS, m_dPrefVertRotXPlus) EgtGetInfo(m_nVacId, KEY_VACLAY_PREFVROTYMINUS, m_dPrefVertRotYMinus) EgtGetInfo(m_nVacId, KEY_VACLAY_PREFVROTYPLUS, m_dPrefVertRotYPlus) ' Direzione di riferimento per tagli Drip - EgtGetInfo( m_nVacId, KEY_VACLAY_DRIPREFDIR, m_dDripRefAng) + EgtGetInfo(m_nVacId, KEY_VACLAY_DRIPREFDIR, m_dDripRefAng) ' Nascondo il gruppo ma rendo visibili le curve di contorno delle ventose EgtSetStatus(m_nVacId, GDB_ST.OFF) Dim nId As Integer = EgtGetFirstInGroup(m_nVacId) While nId <> GDB_ID.NULL Select Case EgtGetType(nId) - Case GDB_TY.CRV_LINE, GDB_TY.CRV_ARC, GDB_TY.CRV_BEZ, GDB_TY.CRV_COMPO - EgtSetStatus(nId, GDB_ST.ON_) - Case Else - EgtSetStatus(nId, GDB_ST.OFF) + Case GDB_TY.CRV_LINE, GDB_TY.CRV_ARC, GDB_TY.CRV_BEZ, GDB_TY.CRV_COMPO + EgtSetStatus(nId, GDB_ST.ON_) + Case Else + EgtSetStatus(nId, GDB_ST.OFF) End Select nId = EgtGetNext(nId) End While @@ -152,7 +154,7 @@ Module VacuumCups Friend Function ResetVacuumCups() As Boolean ' Ripristino posizione e rotazione originali Dim frOriRef As New Frame3d - EgtFrame(EgtGetFirstNameInGroup(EgtGetHeadId(VACUUM_HEAD), HEAD_FIRST_EXIT), GDB_ID.ROOT, frOriRef) + EgtFrame(EgtGetFirstNameInGroup(EgtGetHeadId(sHeadName), HEAD_FIRST_EXIT), GDB_ID.ROOT, frOriRef) Dim frCurrRef As New Frame3d EgtFrame(m_nRefId, GDB_ID.ROOT, frCurrRef) EgtMove(m_nVacId, frOriRef.Orig() - frCurrRef.Orig(), GDB_RT.GLOB) @@ -164,10 +166,10 @@ Module VacuumCups Dim nId As Integer = EgtGetFirstInGroup(m_nVacId) While nId <> GDB_ID.NULL Select Case EgtGetType(nId) - Case GDB_TY.CRV_LINE, GDB_TY.CRV_ARC, GDB_TY.CRV_BEZ, GDB_TY.CRV_COMPO - EgtSetStatus(nId, GDB_ST.ON_) - Case Else - EgtSetStatus(nId, GDB_ST.OFF) + Case GDB_TY.CRV_LINE, GDB_TY.CRV_ARC, GDB_TY.CRV_BEZ, GDB_TY.CRV_COMPO + EgtSetStatus(nId, GDB_ST.ON_) + Case Else + EgtSetStatus(nId, GDB_ST.OFF) End Select nId = EgtGetNext(nId) End While @@ -214,7 +216,16 @@ Module VacuumCups ' Eseguo ricerca If FindVacuumCupsOnRaw(nRawId, ptRawCen, b3Kerf, ptKerfCen, nKerfId, nRKerfId, rmData) Then Return True + Else + If sHeadName = VACUUM_HEAD_2 Then + sHeadName = VACUUM_HEAD + Else + sHeadName = VACUUM_HEAD_2 + End If + LoadVacuumCups() + Return False End If + ' In caso di fallimento, provo riducendo con offset la regione di kerf ' (così si simula la proiezione del centro sul MAT - medial axis transform) Dim bOkFind As Boolean = False @@ -241,20 +252,20 @@ Module VacuumCups ' Verifico sia veramente un pezzo If EgtGetRawPartFromPart(nPartId) = GDB_ID.NULL Then Return False ' Cerco la direzione del primo taglio attivo da sotto - Dim nDripLayId As Integer = EgtGetFirstNameInGroup( nPartId, NAME_DRIPCUT) - Dim nDripLineId As Integer = EgtGetFirstInGroup( nDripLayId) + Dim nDripLayId As Integer = EgtGetFirstNameInGroup(nPartId, NAME_DRIPCUT) + Dim nDripLineId As Integer = EgtGetFirstInGroup(nDripLayId) While nDripLineId <> GDB_ID.NULL - Dim nMchId As Integer = EgtGetOperationId( "DripSaw" & nDripLineId.ToString()) + Dim nMchId As Integer = EgtGetOperationId("DripSaw" & nDripLineId.ToString()) Dim nMode As Integer - If EgtGetMode( nMchId, nMode) AndAlso nMode = GDB_MD.STD Then Exit While - nDripLineId = EgtGetNext( nDripLineId) + If EgtGetMode(nMchId, nMode) AndAlso nMode = GDB_MD.STD Then Exit While + nDripLineId = EgtGetNext(nDripLineId) End While Dim vtDir As New Vector3d - if EgtStartVector( nDripLineId, GDB_ID.ROOT, vtDir) Then + If EgtStartVector(nDripLineId, GDB_ID.ROOT, vtDir) Then Dim dLen, dAngV, dAngH As Double - vtDir.ToSpherical( dLen, dAngV, dAngH) + vtDir.ToSpherical(dLen, dAngV, dAngH) Dim dOffsAng = dAngH - m_dDripRefAng - While dOffsAng - m_dPreferredRot >= 90 + While dOffsAng - m_dPreferredRot >= 90 dOffsAng -= 180 End While While dOffsAng - m_dPreferredRot <= -90 @@ -388,7 +399,7 @@ Module VacuumCups Private Function GetVacRotAxisSteps(ByRef vAngRot As List(Of Double)) As Boolean ' Recupero l'asse rotante della testa ventosa - Dim nRotAxId As Integer = EgtGetParent(EgtGetHeadId(VACUUM_HEAD)) + Dim nRotAxId As Integer = EgtGetParent(EgtGetHeadId(sHeadName)) ' Verifico se contiene info con STEPS Dim sSteps As String = "" If Not EgtGetInfo(nRotAxId, KEY_ROTVAC_STEPS, sSteps) Then Return False @@ -493,15 +504,15 @@ Module VacuumCups ' Ordino secondo distanza angolare crescente da direzione di allineamento (modulo 180 deg) Dim dRotRefDeg As Double = dRotAngDeg vAngRot.Sort(Function(P, Q) - Dim dDiffP = Math.Abs( P - dRotRefDeg) - If Math.Abs( dDiffP - 180) < 10 * EPS_ANG_SMALL Then dDiffP = 1 - Dim dDiffQ = Math.Abs( Q - dRotRefDeg) - If Math.Abs( dDiffQ - 180) < 10 * EPS_ANG_SMALL Then dDiffQ = 1 - Return ( dDiffP - dDiffQ) + Dim dDiffP = Math.Abs(P - dRotRefDeg) + If Math.Abs(dDiffP - 180) < 10 * EPS_ANG_SMALL Then dDiffP = 1 + Dim dDiffQ = Math.Abs(Q - dRotRefDeg) + If Math.Abs(dDiffQ - 180) < 10 * EPS_ANG_SMALL Then dDiffQ = 1 + Return (dDiffP - dDiffQ) End Function) ' Annullo la rotazione di allineamento dRotAngDeg = 0 - ' altrimenti in continuo + ' altrimenti in continuo Else ' Assegno più valori di ricerca e conservo angolo di allineamento vAngRot.AddRange({0, +5, -5, +12.5, -12.5, +25, -25, +45, -45}) @@ -548,25 +559,43 @@ Module VacuumCups ' assegnate le posizioni del centro delle ventose e l'angolo di posizionamento orizzontale verifica che la posizione sia raggiungibile Public Function VerifyOutOfStrokes(ptRef As Point3d, dRotAngDeg As Double) As Integer + Dim sAxisName As String = "C" + ' verifico che il nome dell'asse impostato sia corretto + If Not EgtGetAxisId(sAxisName) Then + If sHeadName = VACUUM_HEAD Then + sAxisName = "C1" + Else + sAxisName = "C2" + End If + End If ' Posizione Home dell'asse rotante Dim dCHome As Double - EgtGetAxisHomePos("C", dCHome) + EgtGetAxisHomePos(sAxisName, dCHome) ' Corse dell'asse Dim dCMin As Double - EgtGetAxisMin("C", dCMin) + EgtGetAxisMin(sAxisName, dCMin) Dim dCMax As Double - EgtGetAxisMax("C", dCMax) + EgtGetAxisMax(sAxisName, dCMax) ' Porto l'angolo nel range Dim dRotAngMachDeg As Double = dRotAngDeg + dCHome AdjustAngleInRange(dRotAngMachDeg, dCMin, dCMax) ' Imposto la ventosa come fosse un utensile - EgtSetCalcTool("", "H4", 1) + EgtSetCalcTool("", sHeadName, 1) ' Calcolo gli assi macchina Dim dX, dY, dZ As Double Dim nStat As Integer - EgtGetCalcPositions(ptRef, dRotAngMachDeg, 0, nStat, dX, dY, dZ) - ' Verifico le corse - EgtVerifyOutstroke(dX, dY, dZ, dRotAngMachDeg, 0, nStat) + If EgtGetAxisId("A") Then + ' Asse tavola rotante (movimenti solo con A0) + EgtGetCalcPositions(ptRef, 0, dRotAngMachDeg, nStat, dX, dY, dZ) + ' Verifico le corse + EgtVerifyOutstroke(dX, dY, dZ, 0, dRotAngMachDeg, nStat) + Else + EgtGetCalcPositions(ptRef, dRotAngMachDeg, 0, nStat, dX, dY, dZ) + ' Verifico le corse + EgtVerifyOutstroke(dX, dY, dZ, dRotAngMachDeg, 0, nStat) + End If + + Return nStat End Function @@ -732,7 +761,7 @@ Module VacuumCups rmList.RemoveAt(nInd) nInd = rmList.Count() - 1 End If - ' Se non trovato, lo accodo + ' Se non trovato, lo accodo Else rmList.Add(New RawMoveData(nRawId)) nInd = rmList.Count() - 1 diff --git a/Constants/ConstGen.vb b/Constants/ConstGen.vb index 9e9a5a4..b87b965 100644 --- a/Constants/ConstGen.vb +++ b/Constants/ConstGen.vb @@ -84,6 +84,7 @@ Module ConstGen ' Nome testa con ventose per spostamento pezzi Public Const VACUUM_HEAD As String = "H4" + Public Const VACUUM_HEAD_2 As String = "H104" ' Info tipo ventosa Public Const KEY_VAC_TYPE As String = "VacType" ' Nome gruppo layout in testa con ventose