Compare commits

...

275 Commits

Author SHA1 Message Date
andrea.villa 94e0ba559b Merge remote-tracking branch 'origin/develop' 2025-09-18 11:32:51 +02:00
andrea.villa 2bde93681f update version e log 2025-09-18 11:32:28 +02:00
andrea.villa bc467fc784 In PanelSaw migliorata gestione scrittura dati. Dato F7 uniformato a F1 e F2. Versione funzionante, testata in macchina. 2025-09-18 11:30:16 +02:00
andrea.villa fc5071a9ae In PanelSaw, tolto debug 2025-09-17 15:50:54 +02:00
andrea.villa 036c782671 - Aggiunto campo descrizione su pezzo
- Aggiunto materiale su Master-Panel
- Possibilità di indicare il numero di caratteri di un campo
2025-09-17 15:49:54 +02:00
luca.mazzoleni 5a6ac3ac8d - in PanelSaw rimossa l'estensione dal nome della cutting list generata 2025-09-16 17:08:17 +02:00
luca.mazzoleni 234692545d Merge branch 'master' into develop 2025-09-16 12:27:47 +02:00
luca.mazzoleni 17d411e5c2 update compile 2025-09-16 12:27:35 +02:00
luca.mazzoleni 4b0334ab65 Merge tag '2.7i1' into develop
2.7i1
2025-09-16 12:24:47 +02:00
luca.mazzoleni b6f025266d Merge branch 'release/2.7i1' 2025-09-16 12:24:34 +02:00
luca.mazzoleni c91b58b6a1 update version e log 2025-09-16 12:24:19 +02:00
luca.mazzoleni 533a8e9f1f Merge branch 'PanelSawCuttingListExport' into develop 2025-09-16 12:08:43 +02:00
luca.mazzoleni 8d26b20ce4 - in NestProcess modifiche per leggere la modalità di nesting e le sezionatrici per cui esportare da WallData 2025-09-11 12:37:07 +02:00
luca.mazzoleni dbf668863a - NestProcess modificata per riflettere nuovi FLAg da BeamWall
- in PanelSaw modificato il nome del file esportato
2025-09-08 18:14:37 +02:00
luca.mazzoleni 5b45aee1f2 - in NestProcess, per nesting tipo cabinet si chiama la fliprot prima di nestare;
- in PanelSaw si gestisce il caso in cui il materiale sia vuoto
2025-09-08 15:39:28 +02:00
luca.mazzoleni 2b94531281 - in PanelSaw si costruisce il file esportato in formato Cutty
- in NestProcess si chiama la PanelSaw formato Cutty (test)
2025-09-08 11:43:38 +02:00
luca.mazzoleni ed0e726391 - in panel saw si scrive una cutlist per ogni combinazione unica di materiale e spessore 2025-09-04 17:18:52 +02:00
luca.mazzoleni 14d726ffae - modifiche parziali per creazione cutting list per Casadei 2025-09-04 09:13:58 +02:00
luca.mazzoleni 9dc093e16b - in NestProcess modifiche per ruotare il pezzo in caso di presenza fori orizzontali D50 2025-08-29 18:19:42 +02:00
luca.mazzoleni 7775fa75fc - modificato nesting semplice per cabinet. Ora si assegna il nome del PDN del pezzo. Se presenti multipli, si aggiunge il contatore del multiplo al PDN. 2025-08-28 14:44:41 +02:00
luca.mazzoleni a449af35d9 - in NestProcess implementato nesting semplice per cabinet, un pezzo per grezzo 2025-08-25 18:06:02 +02:00
luca.mazzoleni 83432e36f4 Merge tag '2.7h1' into develop
2.7h1
2025-08-06 11:20:07 +02:00
luca.mazzoleni 740d244d87 Merge branch 'release/2.7h1' 2025-08-06 11:19:58 +02:00
luca.mazzoleni 3e7b1dc0fd update log e version 2025-08-06 11:19:41 +02:00
luca.mazzoleni 10e5d79412 - in LapJoint MakeMoreFaces migliorata scelta sidemill vs catena vs svuotatura 2025-08-06 11:18:05 +02:00
luca.mazzoleni 97e204fbb1 Merge tag '2.7g3' into develop
2.7g3
2025-07-24 15:49:12 +02:00
luca.mazzoleni 74daefd044 Merge branch 'release/2.7g3' 2025-07-24 15:49:05 +02:00
luca.mazzoleni a92d22e526 - update log e versione 2025-07-24 15:48:56 +02:00
luca.mazzoleni 099b159aae - in Lapjoint corretto step in caso due facce verso l'alto 2025-07-24 14:32:38 +02:00
luca.mazzoleni 76624de1a5 Merge branch 'master' into develop 2025-07-17 17:37:33 +02:00
Dario Sassi e15a833158 DataWall 2.7g2 :
- aggiunta gestione origine e offset da questa che non fanno riprocessare l'intero grezzo (ma solo aggiornare)
- corretta BatchProcess per nome file anche se da non riprocessare.
2025-07-17 17:24:09 +02:00
luca.mazzoleni 9046099e35 Merge tag '2.7g1' into develop
2.7g1
2025-07-09 13:07:35 +02:00
luca.mazzoleni 8f36025b64 Merge branch 'release/2.7g1' 2025-07-09 13:07:28 +02:00
luca.mazzoleni 0bec7ba4a5 - update version e log 2025-07-09 13:07:07 +02:00
luca.mazzoleni 95346a26d7 - correzione a FreeContour.GetEdgeToMachineFromVector 2025-07-04 09:46:23 +02:00
luca.mazzoleni e59ca27cdf update versione minima 2025-06-26 12:44:21 +02:00
luca.mazzoleni 10c44c7f82 - in FreeContour si usa EdgesFaceUse per scegliere con più precisione in lato; manca gestione completa in caso di lavorazione con geometrie multiple (al momento si può passare un lato solo) 2025-06-26 11:17:00 +02:00
luca.mazzoleni b2adfc098b Merge tag '2.7f2' into develop
2.7f2
2025-06-06 11:04:01 +02:00
luca.mazzoleni ec1eddf909 Merge branch 'release/2.7f2' 2025-06-06 11:03:53 +02:00
luca.mazzoleni dfeb8c38dd update vresion e log 2025-06-06 11:03:43 +02:00
luca.mazzoleni a6b72d13cd - in LapJoint migliorie a svuotature 2025-06-06 11:02:09 +02:00
luca.mazzoleni c58a9e7912 Merge tag '2.7f1' into develop
2.7f1
2025-06-05 10:26:25 +02:00
luca.mazzoleni a13dcbccf9 Merge branch 'release/2.7f1' 2025-06-05 10:26:17 +02:00
luca.mazzoleni 437682ab7a update version e log 2025-06-05 10:25:44 +02:00
andrea.villa a7d6363228 In BatchProcess, anche se non è da riprocessare, si setta come nota sul MachGroup il nome del codice CNC da utilizzare 2025-05-05 08:06:48 +02:00
luca.mazzoleni b452a9ad99 - modifiche a DoubleCut per contemplare più casi 2025-04-29 15:06:00 +02:00
luca.mazzoleni 4fc7110885 - per cabinet, gestita forzatura freecontour di fresa per macchine senza lama (costante WallData FORCE_MILL_CONTOUR) 2025-04-22 16:27:52 +02:00
luca.mazzoleni f07e0d4afd Merge tag '2.7d1' into develop
2.7d1
2025-04-14 15:17:01 +02:00
luca.mazzoleni 29c1eaed0c Merge branch 'release/2.7d1' 2025-04-14 15:16:55 +02:00
luca.mazzoleni 6cf29a3a06 update log e version 2025-04-14 15:16:01 +02:00
luca.mazzoleni 0f84937c6f - in LapJoint.ClassifyFlip correzione per caso con 4 facce 2025-04-10 14:22:30 +02:00
luca.mazzoleni d8af5b3989 update log 2025-03-21 15:15:45 +01:00
luca.mazzoleni b8ee911ed5 - in WProcessLapJoint.MakeTwoFaces prevista (al momento solo doublecut) Q06 per forzare lama 2025-03-21 15:14:11 +01:00
luca.mazzoleni 95006f4cce Merge tag '2.7b1' into develop
2.7b1
2025-03-03 09:35:31 +01:00
luca.mazzoleni 0b78227c6b Merge branch 'release/2.7b1' 2025-03-03 09:35:21 +01:00
luca.mazzoleni b6dd9a096a - update log e version 2025-03-03 09:34:59 +01:00
luca.mazzoleni 2b67b00d2e Merge branch 'feature/MultiDrillForCabinet' into develop 2025-03-03 09:32:27 +01:00
luca.mazzoleni f434c70f22 - correzioni a forature multiple 2025-02-14 17:24:16 +01:00
luca.mazzoleni 221162ce9d correzione in forature 2025-02-14 11:10:31 +01:00
luca.mazzoleni f48b40d633 - correzioni a MultiDrill 2025-02-13 15:06:48 +01:00
luca.mazzoleni 0388dbdc0f - in MultiDrill piccole correzioni 2025-02-12 11:19:23 +01:00
luca.mazzoleni a27566031b - modifiche varie per gestione MultiDrill, al momento per Cabinet 2025-02-11 18:46:10 +01:00
luca.mazzoleni 36ddc182f9 Merge tag '2.7a2' into develop
2.7a2
2025-01-23 10:43:32 +01:00
luca.mazzoleni cb473692dd Merge branch 'release/2.7a2' 2025-01-23 10:43:22 +01:00
luca.mazzoleni 3e805545f0 update version 2025-01-23 10:43:09 +01:00
luca.mazzoleni 611ab1cb12 update log 2025-01-23 10:42:43 +01:00
luca.mazzoleni 6fda7f818f - in BatchProcess UpdateAuxData corretto un problema che portava a rotazioni errate dei pezzi in vista Ts7
- Correzioni a squadratura
2025-01-23 10:40:23 +01:00
luca.mazzoleni d4c94d9e8a Merge tag '2.7a1' into develop
2.7a1
2025-01-21 09:58:19 +01:00
luca.mazzoleni 612b73e2e9 Merge branch 'release/2.7a1' 2025-01-21 09:58:11 +01:00
luca.mazzoleni d82802bd10 update version e log 2025-01-21 09:54:00 +01:00
luca.mazzoleni 00d5f929bb - in BatchProcess (Ts7) aggiunta scrittura id progetto e produzione in Btm 2025-01-21 09:52:29 +01:00
luca.mazzoleni 8c30535a69 Merge tag '2.6l1' into develop
2.6l1
2024-12-11 14:36:20 +01:00
luca.mazzoleni 5d5eb3f5cc Merge branch 'release/2.6l1' 2024-12-11 14:35:59 +01:00
luca.mazzoleni e3faec9d5d - update log e version 2024-12-11 14:35:12 +01:00
luca.mazzoleni e844d761f9 - in LapJoint -> CalcInterference ora si usano le stesse funzioni della FreeContour 2024-12-02 18:11:47 +01:00
luca.mazzoleni 6a86f7798e - in FreeContour eLapJoint ->CleanCorner si scrivono ora TASKID e CUTID per riportare le collisioni sulla feature specifica 2024-12-02 11:47:48 +01:00
luca.mazzoleni 6a6a194df6 - in LapJoint modifica al calcolo feature passante per gorge 2024-11-29 17:52:11 +01:00
luca.mazzoleni dcd600af01 - in LapJoint correzioni varie 2024-11-29 17:21:17 +01:00
luca.mazzoleni 854fafddf2 Merge tag '2.6k3' into develop
2.6k3
2024-11-27 17:45:13 +01:00
luca.mazzoleni ef6cbc35df Merge branch 'hotfix/2.6k3' 2024-11-27 17:44:49 +01:00
luca.mazzoleni 2887591da4 update version e log 2024-11-27 17:44:41 +01:00
luca.mazzoleni 3d75344652 Merge branch 'develop' into hotfix/2.6k2 2024-11-27 17:42:25 +01:00
luca.mazzoleni 1952c937b0 - in LapJoint -> MakeSideGrooveByMill corretto e modificato calcolo leadin/out perpendicolare 2024-11-27 17:41:23 +01:00
luca.mazzoleni 99baaa6320 Merge tag 'NestingSilhouetteTolerance' into develop
2.6k2
2024-11-19 12:20:13 +01:00
luca.mazzoleni 3ac752861b Merge branch 'hotfix/NestingSilhouetteTolerance' 2024-11-19 12:19:52 +01:00
luca.mazzoleni d690906180 - in NestProcess tolleranza silhouette riportata al valore pre modifiche DLL 2024-11-19 12:19:27 +01:00
luca.mazzoleni 1bf70aaf27 Merge branch 'master' into develop 2024-11-15 18:12:01 +01:00
luca.mazzoleni e5a2a7e5a9 - modificato compile per contemplare Squaring.lua 2024-11-15 18:05:38 +01:00
luca.mazzoleni b726fbc2cc Merge tag '2.6k1' into develop
2.6k1
2024-11-14 15:22:29 +01:00
luca.mazzoleni 0771665282 Merge branch 'release/2.6k1' 2024-11-14 15:21:43 +01:00
luca.mazzoleni 6ba42d19e9 update version e log 2024-11-14 15:21:12 +01:00
luca.mazzoleni 374021ad13 - in NestProcess corretta creazione outline che in precedenza funzionava (modificata la gestione tolleranza nella funzione EgtGetSurfTmSilhouette con aggiornamenti DLL recenti) 2024-11-14 14:49:36 +01:00
luca.mazzoleni dfe405f3b0 - in NestProcess corretta indentazione 2024-11-13 17:17:12 +01:00
andrea.villa bd7885d245 Se feature taglio, si controlla solo interferenza altri pezzi e non lunghezza minima 2024-11-08 12:32:31 +01:00
luca.mazzoleni 1c19c48e55 Merge branch 'SquaringMasterPanel' into develop 2024-11-04 16:57:12 +01:00
luca.mazzoleni 9a40887d05 Merge branch 'develop' into SquaringMasterPanel 2024-11-04 15:40:23 +01:00
luca.mazzoleni 02e1bc7881 Merge branch 'master' into develop 2024-11-04 15:40:12 +01:00
luca.mazzoleni 5791bea4b5 in Squaring modifiche a lettura parametri utensili 2024-11-04 15:35:15 +01:00
andrea.villa 5b39d1a4ac Update Version 2024-11-04 15:23:04 +01:00
andrea.villa 62e00e8854 Update Version e Log 2024-11-04 15:22:35 +01:00
andrea.villa 349f0cb879 Merge branch 'hotfix/SideGrooveBladeLimitWidth' 2024-11-04 15:19:12 +01:00
andrea.villa a53a6f3e63 Modificato limite dimensione tasca per utilizzo lama come SideGroove 2024-11-04 15:18:45 +01:00
luca.mazzoleni 4f2ffec3ab - in Squaring migliorie varie
- aggiunta rimozione lavorazioni fuori dall'area di squadratura
- in WallExec squadratura suddivisa prima e dopo le altre lavorazioni
- in FreeContour aggiunta funzione IsFaceOutsideSquaring per evitare di lavorare le facce che finiscono fuori dall'area di squadratura
2024-10-31 16:04:15 +01:00
luca.mazzoleni b1dd887899 - in Squaring implementata modalità ShrinkToParts; manca la rimozione delle lavorazioni fuori dall'area squadrata 2024-10-29 17:38:31 +01:00
luca.mazzoleni b325ebcd32 - in MachiningLib aggiunta funzione GetMachiningSteps per il calcolo degli stepdi lavorazione
- in Squaring aggiunti step verticali con lavorazioni aggiuntive
- in WallExec gestito default per parametro di squadratura TOOL
2024-10-29 13:14:00 +01:00
luca.mazzoleni f17411326b Merge branch 'develop' into SquaringMasterPanel 2024-10-29 09:17:58 +01:00
luca.mazzoleni 4752ffcfb4 Merge tag '2.6j1' into develop
release
2024-10-29 09:16:42 +01:00
luca.mazzoleni dbf17d942c Merge branch 'release/2.6j1' 2024-10-29 09:16:33 +01:00
luca.mazzoleni 72020a8874 update version e log 2024-10-29 09:16:24 +01:00
luca.mazzoleni 5d422b6edc - in NestProcess corretta rotazione in caso di flip deciso da nesting 2024-10-29 09:10:57 +01:00
luca.mazzoleni d2b3c32b61 - in Squaring aggiunt creazione lavorazione al momento e settaggio parametri
- in Squaring gestito allungamento e attacco verticale per contemplare overmaterial e altezza pezzo
2024-10-29 09:09:19 +01:00
luca.mazzoleni b4b3df0f5e - in Squaring modifiche a GetTools e CreateGeometry per contemplare tutti i casi specifici 2024-10-23 12:13:39 +02:00
luca.mazzoleni fdd114a8cd - in WallExec -> squadratura aggiunta funzione AddSquaring che verifica e aggiunge la squadratura in base al caso specifico
- in Squaring aggiunte funzioni per ricerca e controllo correttezza utensili in base al caso specifico
2024-10-21 12:43:28 +02:00
luca.mazzoleni d5e47c06fa Merge branch 'develop' into SquaringMasterPanel 2024-10-16 17:22:58 +02:00
luca.mazzoleni abc61f53ba - in nesting e flipRotate correzioni a rotazione pezzi 2024-10-16 17:01:45 +02:00
luca.mazzoleni 6e7c4ffda1 - modifiche parziali a squadratura per contemplare casi in doppio 2024-10-16 16:59:17 +02:00
luca.mazzoleni bfaa85bbf2 - in squadratura aggiunta gestione truciolatore e ritorno errori 2024-10-14 14:26:58 +02:00
luca.mazzoleni 5c9e199c5a - in squadratura aggiunta gestione della direzione di percorrenza delle geometrie in base a rotazione utensile e riferimento; altri miglioramenti 2024-10-11 11:36:24 +02:00
luca.mazzoleni 09127ce576 - in WallExec aggiunta squadratura, da completare 2024-10-09 18:09:02 +02:00
luca.mazzoleni 87cd31bef7 Merge branch 'develop' into SquaringMasterPanel 2024-09-30 12:38:22 +02:00
luca.mazzoleni 32fdaf5096 Merge tag '2.6i2' into develop
release
2024-09-30 12:29:49 +02:00
luca.mazzoleni 2ea09e3ebc Merge branch 'release/2.6i2' 2024-09-30 12:29:34 +02:00
luca.mazzoleni ce8072ad1b update version e log 2024-09-30 12:29:23 +02:00
luca.mazzoleni 896c0296a4 Merge branch 'develop' into SquaringMasterPanel 2024-09-25 12:35:10 +02:00
luca.mazzoleni 88fd8d525c Merge branch 'master' into develop 2024-09-25 12:34:57 +02:00
luca.mazzoleni 01c5037d77 update version e log 2024-09-25 12:33:03 +02:00
luca.mazzoleni 34e7befc10 Merge remote-tracking branch 'origin/master' into develop 2024-09-10 15:13:35 +02:00
Emmanuele Sassi 846d96b967 - correzione in lettura array per cambio dll di lettura 2024-09-10 09:09:51 +02:00
luca.mazzoleni cfd3379c98 Merge branch 'develop' of https://gitlab.steamware.net/egaltech/DataWall into develop 2024-09-02 10:52:47 +02:00
andrea.villa 6f06755539 Aggiunta nota altezza sottopezzo, per pareti a layer 2024-08-30 09:13:33 +02:00
andrea.villa a0af959c9f Merge remote-tracking branch 'origin/master' into develop 2024-08-30 09:13:20 +02:00
luca.mazzoleni f397b66e26 Merge branch 'master' into develop 2024-08-28 10:12:53 +02:00
luca.mazzoleni 31782b904e Merge commit '93fe741f8439bf0abf51c0ab2e086e07fc77a58d' 2024-08-28 10:11:38 +02:00
luca.mazzoleni 93fe741f84 update log e version 2024-08-28 10:11:26 +02:00
luca.mazzoleni ba2158a909 - in FreeContour corretto caso in cui si chiedevano informazioni sulla faccia non presenti 2024-08-28 10:09:40 +02:00
Dario Sassi 6e0758218c Aggiunto controllo licenza/chiave per abilitazione generazione PartProgram. 2024-08-21 11:52:59 +02:00
luca.mazzoleni 401108ce56 Merge branch 'master' into develop 2024-08-20 16:53:05 +02:00
luca.mazzoleni b7973541e4 update log 2024-08-20 16:52:11 +02:00
Dario Sassi bf1e9065ae Wall 2.6h1 :
- aggiunti nuovi parametri alla chiamata della funzione GetChainSawStartAngs da WallData della macchina.
2024-08-20 14:43:45 +02:00
luca.mazzoleni 1faa9e2075 Merge branch 'master' into develop 2024-08-19 16:11:51 +02:00
Dario Sassi ceef5b78f3 Merge commit '66e2bd6e45d6990a8b30ecf39791437618ca85cd' 2024-08-19 15:04:00 +02:00
luca.mazzoleni 66e2bd6e45 - in Collect analisi facce limitata a feature che ne hanno meno di 50 2024-08-09 12:40:59 +02:00
andrea.villa 0508f12673 In ProcessLapJoint, se fresa Side trovata ma non applicabile, si considera come se non trovata 2024-08-09 11:46:43 +02:00
luca.mazzoleni 2bbfe1f3ce Merge branch 'master' into develop 2024-07-19 18:13:35 +02:00
luca.mazzoleni 4a67fdeeff Merge branch 'develop' 2024-07-19 18:13:18 +02:00
luca.mazzoleni 1c86ed925a in BatchProcess e BatchProcessNew bToRecalc forzato se flag 3 o 4 2024-07-19 18:13:07 +02:00
luca.mazzoleni 3f8540b3df Merge tag '2.6g1' into develop
i
2024-07-17 15:51:11 +02:00
luca.mazzoleni c92327641c Merge branch 'release/2.6g1' 2024-07-17 15:50:55 +02:00
luca.mazzoleni 499e49f4f6 - update log e version
- piccola modifica in ProcessDrill
2024-07-17 15:50:41 +02:00
luca.mazzoleni 099e81cbfd - in ProcessDrill aggiunti, se foro verticale passante, riduzione affondamento di 5 mm sostituito con tab.
Attualmente limite dal diametro di 200 mm, da verificare
2024-07-17 11:25:17 +02:00
luca.mazzoleni 0f38de8f58 Merge branch 'DefaultRawNoExtraWidth' into develop 2024-06-27 16:39:42 +02:00
luca.mazzoleni d5e30baf06 - ulteriori correzioni per DEFAULT_RAW_NO_EXTRA_WIDTH 2024-06-27 16:38:45 +02:00
luca.mazzoleni 4531434e79 - correzioni a DEFAULT_RAW_NO_EXTRA_WIDTH 2024-06-27 15:50:24 +02:00
luca.mazzoleni e56074f662 modifiche ulteriori per parametro DEFAULT_RAW_NO_EXTRA_WIDTH 2024-06-27 14:56:37 +02:00
luca.mazzoleni 5866566ebe - in BatchProcess, in caso di DEFAULT_RAW_NO_EXTRA_WIDTH, azzerati eventuali PosX e PosZ in arrivo sul pezzo 2024-06-24 09:57:21 +02:00
luca.mazzoleni c4272d917e Merge tag '2.6f1' into develop
a
2024-06-21 12:23:02 +02:00
luca.mazzoleni 52a10eeb9f Merge branch 'release/2.6f1' 2024-06-21 12:22:51 +02:00
luca.mazzoleni 1d5689c007 update log e versione 2024-06-21 12:22:36 +02:00
luca.mazzoleni f402590534 - in BatchProcess e BatchProcessNew aggiunto DEFAULT_RAW_NO_EXTRA_WIDTH per eliminare il sovramateriale grezzo in vista 2024-06-18 15:17:15 +02:00
luca.mazzoleni b3289195f4 Merge branch 'master' into develop 2024-05-24 15:36:24 +02:00
luca.mazzoleni f0a07554b2 update log 2024-05-24 15:36:15 +02:00
luca.mazzoleni 1ed45a8569 Merge branch 'develop' 2024-05-24 15:33:56 +02:00
luca.mazzoleni 43482f5a6d - in LapJoint se non si trova una lavorazione di tipo side si cerca una pocketing 2024-05-24 15:33:36 +02:00
luca.mazzoleni e66831d223 Merge branch 'develop' 2024-05-24 12:09:05 +02:00
luca.mazzoleni 548bc7bc6c - ora per verificare se la gerenazione è abilitata si controlla il valore NoPartProgram nella sezione Mach del file ini del Cam5; se 0 o non esiste tutto è come prima 2024-05-24 12:08:42 +02:00
luca.mazzoleni 3f7a2c016d Merge tag '2.6e2' into develop
release
2024-05-24 11:21:02 +02:00
luca.mazzoleni 3763338bb3 Merge branch 'release/2.6e2' 2024-05-24 11:20:54 +02:00
luca.mazzoleni 767acf2579 update log e version 2024-05-24 11:20:23 +02:00
luca.mazzoleni 4da70c0d3c - ora se la licenza non è abilitata alla generazione questa fase si salta invece di restituire errore bloccante 2024-05-24 11:17:16 +02:00
luca.mazzoleni d939e07fd3 - piccole correzioni LapJoint e DoubleCut per errori cliente Belga 2024-05-24 10:44:28 +02:00
luca.mazzoleni 67bf77fe19 Merge tag '2.6e1' into develop
release
2024-05-03 12:16:12 +02:00
luca.mazzoleni 384d72eb13 Merge branch 'release/2.6e1' 2024-05-03 12:15:42 +02:00
luca.mazzoleni 22541cfc9b update log e version 2024-05-03 12:15:21 +02:00
luca.mazzoleni 1dac9716e7 Merge branch 'master' into develop 2024-05-03 12:13:11 +02:00
Dario Sassi 68464cf5b1 DataWall :
- correzione per assegnazione a SawCut di flag passante (bIsThrough).
2024-05-03 11:31:53 +02:00
luca.mazzoleni 78bf456326 Merge tag '2.6c3' into develop
release
2024-03-26 18:12:23 +01:00
luca.mazzoleni cb4d597369 Merge branch 'release/2.6c3' 2024-03-26 18:12:00 +01:00
luca.mazzoleni 7bcd159db0 - in processSawCut si ignora verso vettore se taglio passante 2024-03-26 18:11:21 +01:00
luca.mazzoleni abed970b7a Merge remote-tracking branch 'origin/master' into develop 2024-03-26 14:54:34 +01:00
Dario Sassi 96760ac284 DataWall :
- tolte info di debug anche in compilazione automatica su commit.
2024-03-25 09:10:57 +01:00
Dario Sassi 392040f8d6 DataWall 2.6c2 :
- modifica per richiamare le nuove funzioni di Test interferenza solidi superfici nel controllo validità lavorazione pulizia spigoli interni
- in compilazione vengono eliminate le info di degìbug.
2024-03-25 09:08:24 +01:00
luca.mazzoleni 56dc61a9d6 Merge branch 'master' into develop 2024-03-12 14:16:37 +01:00
luca.mazzoleni ea5e62222c Merge branch 'develop' 2024-03-12 14:15:27 +01:00
luca.mazzoleni 3b098e1541 - update yml per rimuovere simboli di debug da compilazione 2024-03-12 14:15:14 +01:00
luca.mazzoleni 354cbe85b9 Merge tag '2.6b2' into develop
2.6b2
2024-02-21 15:23:10 +01:00
luca.mazzoleni 25779abb81 Merge branch 'release/2.6b2' 2024-02-21 15:20:05 +01:00
luca.mazzoleni 1a4baaf1be update log 2024-02-21 15:19:37 +01:00
luca.mazzoleni 20fccb24af correzione a lettura Delta X Y Z da btl 2024-02-21 15:11:08 +01:00
luca.mazzoleni aa94102b28 Merge branch 'master' into develop 2024-02-21 13:15:51 +01:00
Dario Sassi a2d89cd98d DataWall 2.6b2 :
- aggiunta gestione spostamento pannello rispetto a origine da dato BTL di TS3v7.
2024-02-20 19:32:53 +01:00
luca.mazzoleni 6e2e976675 Merge branch 'develop' 2024-02-20 09:20:53 +01:00
luca.mazzoleni db5ae17d63 update log e version 2024-02-20 09:20:30 +01:00
luca.mazzoleni 3e9da2724b In BatchProcess tolleranza su altezza pannello in grezzo portata a 0.1 mm 2024-02-20 09:17:56 +01:00
luca.mazzoleni a1946a4a41 in LapJoint piccola correzione ai casi in cui si utilizza il SIDESTEP 2024-02-20 09:07:55 +01:00
luca.mazzoleni 87cb7480be Merge branch 'master' into develop 2023-12-21 10:46:43 +01:00
luca.mazzoleni 9563735770 Merge branch 'develop' 2023-12-21 10:46:30 +01:00
luca.mazzoleni d1218915f7 update log e versione 2023-12-21 10:45:13 +01:00
luca.mazzoleni 19c7a54aa7 Merge tag '2.5l2' into develop
Finish Release: 2.5l2
2023-12-21 10:38:16 +01:00
luca.mazzoleni 7bbed3cb8a Merge branch 'release/2.5l2' 2023-12-21 10:38:15 +01:00
luca.mazzoleni 25f599a1fa -In FreeContour -> MakeByPocket corretto un bug che provocava la cancellazione della feature dopo averla lavorata 2023-12-21 10:37:10 +01:00
luca.mazzoleni c0970c52ff Merge branch 'master' into develop 2023-12-20 17:58:31 +01:00
luca.mazzoleni 61590f611d corretto problema mancata compilazione (file placeholder in bin non creato) 2023-12-20 17:57:32 +01:00
luca.mazzoleni f8011493f2 Merge tag '2.5l1' into develop
Finish Release: 2.5l1
2023-12-13 17:09:08 +01:00
luca.mazzoleni a76bd31fe4 Merge branch 'release/2.5l1' 2023-12-13 17:09:08 +01:00
luca.mazzoleni 07a80248dc update log e version 2023-12-13 17:07:52 +01:00
luca.mazzoleni 89838c6f28 -In FreeContour -> MakeByPocket aggiunta la possibilità di svuotare tasche passanti
-In FreeContour -> MakeByPocket in tasche speciali cliente 90480029 forzato step unico
2023-12-13 16:57:30 +01:00
luca.mazzoleni 764c80824a modifiche a WallExec, WallLib, FeatureTopology per allineamento Topology con Beam 2023-12-11 11:27:54 +01:00
luca.mazzoleni 37da3ba714 Merge branch 'master' into develop 2023-12-07 16:20:19 +01:00
Dario Sassi a1a74390c0 Merge commit 'c04e97a01dd857fa36fe8918abf2ad73d93d5469' 2023-11-16 18:15:10 +01:00
luca.mazzoleni c04e97a01d Fresature a salire estese a groove cieche 2023-11-16 09:39:33 +01:00
luca.mazzoleni 111c541f8b Merge branch 'release/2.5k1' 2023-11-14 18:58:19 +01:00
luca.mazzoleni 760563e0f8 Merge tag '2.5k1' into develop
Finish Release: 2.5k1
2023-11-14 18:58:19 +01:00
luca.mazzoleni 15c80a8628 update log e versione 2023-11-14 18:54:46 +01:00
luca.mazzoleni 29a2ec8bae aggiunta commenti 2023-11-14 18:50:06 +01:00
luca.mazzoleni e1d58a1d70 Merge branch 'feature/MirroredMachinings' into develop 2023-11-14 18:16:35 +01:00
luca.mazzoleni da7d2a7159 - in WallExec aggiunte al sorting le lavorazioni PreSideMill che vengono sempre fatte prima delle SideMill
- LapJoint -> MakeSideGrooveByMill, se rabbet doppio uno verso l'alto e uno verso il basso, aggiunto step extra iniziale per ripulire la lamina che potrebbe rimanere nella rabbet che guarda in alto.
2023-11-13 18:18:48 +01:00
luca.mazzoleni d1ca35e29d correzione minore in WallExec -> SetMirroredFeatures 2023-11-10 15:11:28 +01:00
luca.mazzoleni e92ba3e740 - In WallExec doppio disattivato se side e la lavorazione mirror è troppo distante dal grezzo. 2023-11-10 11:48:06 +01:00
luca.mazzoleni a84fb0608f - varie modifiche, principalmente a MachiningLib e LapJoint, che migliorano il funzionamento delle tasche, anche in doppio. 2023-11-09 18:17:17 +01:00
luca.mazzoleni f9bb10bf6e - in LapJoint -> FindPocketing le lavorazioni con attacco speciale (rampa molto lunga e step basso) ignorano il flag per escludere le frese che non lavorano di testa. 2023-10-31 18:47:38 +01:00
luca.mazzoleni fea5cfd8ed - In LapJoint -> VerifyPocket, se topologia pocket, forzata ricerca fresa che possa lavorare di testa. 2023-10-31 17:25:20 +01:00
luca.mazzoleni 31172238d8 - In LpJoint -> IsToolDoubleOk permessa una lunghezza inferiore di 5.5mm dell'utensile secondario rispetto al principale 2023-10-31 16:41:10 +01:00
luca.mazzoleni f29816c693 - In LapJoint -> VerifyPocket, per tasche in doppio forzata ricerca fresa che possa lavorare di testa.
- In MachiningLib -> FindPocketing aggiunto parametro per poter escludere le frese che non lavorano di testa.
- In WallExec -> SetMirroredFeatures permesso il doppio per groove con specchiata non sul fianco se settate per essere lavorate come pocket.
2023-10-30 18:22:04 +01:00
luca.mazzoleni 164e0474fa Merge branch 'develop' into feature/MirroredMachinings 2023-10-23 14:57:55 +02:00
luca.mazzoleni 732e6c0390 Merge tag '2.5j3' into develop
Finish Release: 2.5j3
2023-10-23 13:18:21 +02:00
luca.mazzoleni 5340c6a92c - update del compile per includere topology 2023-10-19 18:10:45 +02:00
luca.mazzoleni 9edd6aec23 - nella ricerca lavorazione da usare controllo di utensile attivo sostituito con controllo utensile presente nel setup corrente 2023-10-19 09:54:01 +02:00
luca.mazzoleni 7c67b24b37 Merge branch 'develop' into feature/MirroredMachinings 2023-10-19 09:33:14 +02:00
luca.mazzoleni 64ca535056 Merge branch 'develop' into feature/MirroredMachinings 2023-10-16 10:07:19 +02:00
luca.mazzoleni 3b998e5fba Merge remote-tracking branch 'origin/master' into feature/MirroredMachinings 2023-10-02 14:41:09 +02:00
luca.mazzoleni 47ec893959 - piccole correzioni bug 2023-09-28 16:36:43 +02:00
luca.mazzoleni 79e97c9e1f - migliorata WallLib -> Is3EdgesApprox 2023-09-28 09:26:38 +02:00
luca.mazzoleni 18ae1a71cc Merge branch 'develop' into feature/MirroredMachinings 2023-09-28 09:23:46 +02:00
luca.mazzoleni 007288b9c9 Merge branch 'develop' into feature/MirroredMachinings 2023-09-27 12:00:37 +02:00
luca.mazzoleni efc9a89bf5 Merge branch 'develop' into feature/MirroredMachinings 2023-09-21 17:04:54 +02:00
luca.mazzoleni eca052bd67 Merge branch 'develop' into feature/MirroredMachinings 2023-09-21 16:10:49 +02:00
luca.mazzoleni 8b999fad88 Merge branch 'develop' into feature/MirroredMachinings 2023-09-20 10:33:27 +02:00
luca.mazzoleni 11b6a8716e Merge branch 'develop' into feature/MirroredMachinings 2023-09-19 18:35:17 +02:00
luca.mazzoleni 4bcf2c8068 Merge branch 'develop' into feature/MirroredMachinings 2023-09-19 10:25:52 +02:00
luca.mazzoleni 93f9df0d5f Merge branch 'develop' into feature/MirroredMachinings 2023-09-13 08:54:17 +02:00
luca.mazzoleni 9f014c70f7 - lievi correzioni 2023-09-11 09:56:22 +02:00
luca.mazzoleni b2fdd27130 in WallExec -> SetMirroredOperations ora si controlla che la lavorazione non sia vuota prima di aggiungerla alla lista delle plausibili per doppio 2023-09-07 17:03:12 +02:00
luca.mazzoleni 6a2a87b91f - la Topology tunnel chiuso diventa pocket
- piccole correzioni alla raccolta features in doppio in WallExec
- correzione in LApJoint per evitare di lavorare groove completamente affondate nel grezzo
2023-09-07 12:23:27 +02:00
luca.mazzoleni 61e5ce6359 - aggiunta costante if WD.DOUBLE_HEAD_MILLCORNER per attivazione puliture in doppio 2023-09-05 16:14:05 +02:00
luca.mazzoleni fa276949a2 - in WallExec completata ricerca e esecuzione di fresature in doppio da percorso specchiato
- in WMachiningLib resa globale la funzione IsToolDoubleOk
- piccole correzioni
2023-09-04 17:56:07 +02:00
luca.mazzoleni d24a86bcdd - aggiunta ricerca e esecuzione di fresature in doppio da percorso specchiato
- piccole correzioni
2023-08-30 18:21:10 +02:00
luca.mazzoleni 5524fbf0cb - spostate funzioni per verifica lavorazione adatta a doppio in MachiningLib
- aggiunte (commentate per ora) prime righe per riconoscimento percorsi fresature da specchiare
2023-08-30 12:09:08 +02:00
luca.mazzoleni afb33aa7c6 - in WallLib -> GetProcessDistanceToNearestParts piccole correzioni al calcolo del solido della parte
- in LapJoint -> MakeByPocketing migliorata la scelta utensile e la forzatura tasca chiusa nel caso di parti vicine
2023-08-29 13:12:34 +02:00
luca.mazzoleni 924313a0ea - alcune correzioni 2023-08-24 18:40:00 +02:00
luca.mazzoleni 9d812ab33a - in LapJoint -> MakeByPocketing, se doppio, escludo ottimizzazioni e forzo attacco interno perchè la tasca specchiata potrebbe essere nel mezzo del pannello 2023-08-24 17:08:39 +02:00
luca.mazzoleni 3c7c22ae7c - in WallLib aggiunta la funzione GetProcessDistanceToRawPart
- alcune correzioni in WallExec
2023-08-24 16:05:42 +02:00
luca.mazzoleni b9c9cc5167 - in WallExec -> Collect viene ora calcolata e scritta in Proc la distanza dalle parti vicine, nelle direzioni Y+/Y-/X+/X-, tramite la funzione GetProcessDistanceToNearestParts da WallLib
- in WallExec -> SetMirroredFeatures semplificato il calcolo di IsFeatureOnEdge
- in LapJoint -> IsMachiningDamagingOtherParts eliminata la verifica di overlap nelle singole direzioni (ora già calcolata nel Collect)
2023-08-24 09:53:18 +02:00
luca.mazzoleni 756d58b3e4 - piccole correzioni a WallExec
- in LapJoint -> MakeByPocketing aggiunta forzatura tasche chiuse se la lavorazione potrebbe danneggiare  i pezzi limitrofi
2023-08-23 12:24:45 +02:00
luca.mazzoleni 4a5c213de6 - refactoring di SetMirroredMachinings
- da definire cosa specchiare se feature non sul bordo
2023-08-11 18:51:02 +02:00
luca.mazzoleni d0cecd6a0d - in WallLib -> affectedFaces modificata tolleranza
- in WallExec introduzione costanti distinte per tolleranze ricerca tasche e fori in doppio
- altre piccole migliorie
2023-08-10 16:54:02 +02:00
luca.mazzoleni 3326f8ef4e - corretto id geometria per disattivazione fori
- massima distanza dal bordo pannello portata a 200 mm
- migliorie stilistiche
2023-08-09 18:25:32 +02:00
luca.mazzoleni 5e6dfe320f - aggiunta gestione in doppio di forature e groove passanti (rivolte verso Z+)
- lieve correzione a check utensile doppio
- aggiunto interasse minimo per lavorazioni in doppio
2023-08-09 17:16:47 +02:00
luca.mazzoleni a4c3b74434 Merge branch 'develop' into feature/MirroredMachinings 2023-08-08 08:56:19 +02:00
luca.mazzoleni 46a299b83d Merge branch 'develop' into feature/MirroredMachinings 2023-08-07 17:13:10 +02:00
luca.mazzoleni e6bd4e7e94 piccola correzione a WallExec 2023-08-07 10:53:35 +02:00
luca.mazzoleni 5ff950015e - a WallExec aggiunta rimozione operazioni se legate a lavorazioni specchiate
- modifiche varie per forzare sideGroove in caso la lavorazione principale sia una tasca cieca che guarda in alto
- modificata MakeMoreFaces per contemplare lavorazioni in doppio
2023-08-04 18:57:04 +02:00
luca.mazzoleni 57ed0d934f Merge branch 'develop' into feature/MirroredMachinings 2023-08-03 16:33:02 +02:00
luca.mazzoleni 5b5ce504b1 - qualche piccola modifica a WallExec
- in LapJoint (MakeTwoFaces e altri make, manca MakeMoreFaces) implementata parzialmente gestione doppio
- in MachiningLib aggiunta la possibilità di forzare una testa per milling e pocketing
2023-07-14 19:02:13 +02:00
luca.mazzoleni f2027d03a3 feature/MirroredMachinings:
- implementato riconoscimento tasche sul fianco (e relativa specchiata) da fare in doppio; funzionanti, da testare
- piccoli ritocchi a AffectedFaces e Topology
2023-07-12 18:35:36 +02:00
luca.mazzoleni 5ee62cfee2 commenti funzioni e piccoli fix 2023-07-10 09:51:08 +02:00
luca.mazzoleni 3ca0ab1692 - altri piccoli miglioramenti legati al riconoscimento topologia 2023-07-07 18:07:11 +02:00
luca.mazzoleni 51e1425921 Merge branch 'develop' into feature/MirroredMachinings 2023-07-06 15:32:50 +02:00
luca.mazzoleni b0abe6d088 - alcune correzioni a Topology
- aggiunto riconoscimento topologie fino a 5 lati (da testare)
2023-07-06 15:32:40 +02:00
luca.mazzoleni be49385bb0 - riconoscimento bevel e rabbet funzionanti; da testare 2023-07-05 18:38:17 +02:00
luca.mazzoleni 4e079f6708 completamento parziale della funzione per recuperare le facce parallele alla parte 2023-07-04 11:22:03 +02:00
luca.mazzoleni 6550ddd456 altre aggiunte a WFeatureTopology 2023-06-30 09:54:33 +02:00
luca.mazzoleni 68ad658bc5 Merge branch 'develop' into feature/MirroredMachinings 2023-06-28 12:59:28 +02:00
luca.mazzoleni 5bb7fdd634 - aggiunta libreria WFeatureTopology per il riconoscimento topologico delle feature (da completare)
- spostate alcune funzioni da FreeContour a WallLib
2023-06-28 11:32:48 +02:00
luca.mazzoleni 30c449bfad Merge branch 'develop' into feature/MirroredMachinings 2023-06-20 09:43:00 +02:00
luca.mazzoleni 1236d196ba - TestElleShape 3 e 4 spostati in WallLib
- a DoubleCut aggiunto riconoscimento della sola L011
- in WallLib aggiunta funzione GetProcessAffectedFaces che restituisce le facce del grezzo interessate dalla feature
- in WallExec aggiunte alle Proc informazioni sulle facce della feature
- alcune modifiche iniziali per Mirror
2023-06-20 09:35:25 +02:00
21 changed files with 3711 additions and 708 deletions
+1
View File
@@ -20,3 +20,4 @@
/bin/LuaLibs/*.lua
/bin/Images/*.png
.vscode/settings.json
bin/Images/.placeholder
+4 -4
View File
@@ -24,14 +24,14 @@ variables:
$FileList = Get-ChildItem("*.lua")
ForEach ($File in $FileList) {
$FileName = Split-Path $File -leaf
lua54 -o bin\$FileName $FileName
echo "lua54 -o bin\$FileName $FileName"
lua54 -o bin\$FileName -s $FileName
echo "lua54 -o bin\$FileName -s $FileName"
}
$FileList = Get-ChildItem("LuaLibs\*.lua")
ForEach ($File in $FileList) {
$FileName = Split-Path $File -leaf
lua54 -o bin\LuaLibs\$FileName LuaLibs\$FileName
echo "lua54 -o bin\LuaLibs\$FileName LuaLibs\$FileName"
lua54 -o bin\LuaLibs\$FileName -s LuaLibs\$FileName
echo "lua54 -o bin\LuaLibs\$FileName -s LuaLibs\$FileName"
}
# helper copia SORGENTI verso cartella di rete X:\ dei SORGENTI
+67 -7
View File
@@ -1,4 +1,4 @@
-- BatchProcess.lua by Egaltech s.r.l. 2023/04/17
-- BatchProcess.lua by Egaltech s.r.l. 2025/07/17
-- Gestione calcolo batch disposizione e lavorazioni per Pareti
-- 2020/07/24 Nuvola di punti riferita allo Zero Tavola.
-- 2020/10/28 Corretto spostamento pezzi per rotazioni (0 o 180) e inversioni( 0, 90, 180, o 270).
@@ -14,6 +14,7 @@
-- 2022/05/02 Consentito allargamento area disponibile per grezzi su tavola da WallData.
-- 2023/04/09 Aggiunta gestione flag per taglio feature con outline (da WD.CUT_WITH_OUTLINE).
-- 2023/04/17 Aggiunta gestione flag per rotazione grezzo di 180deg (da WD.RAWPART_ROT).
-- 2024/02/20 Tolleranza su altezza pannello in grezzo portata a 0.1 mm.
-- Intestazioni
require( 'EgtBase')
@@ -91,13 +92,49 @@ end
-- Funzione per aggiornare dati ausiliari
local function UpdateAuxData( sAuxFile)
local bModif = false
local BtlInfoId = EgtGetFirstNameInGroup( GDB_ID.ROOT, 'BtlInfo') or GDB_ID.NULL
-- Se definito PROJID, aggiorno
local sProjId = EgtGetStringFromIni( 'AuxData', 'PROJID', '', sAuxFile)
if sProjId ~= '' then
EgtSetInfo( BtlInfoId, 'PROJECTNUMBER', sProjId)
bModif = true
end
-- Se definito PRODID, aggiorno
local sProdId = EgtGetStringFromIni( 'AuxData', 'PRODID', '', sAuxFile)
if sProdId ~= '' then
EgtSetInfo( BtlInfoId, 'PRODID', sProdId)
bModif = true
end
-- Se definito LOAD90, aggiorno
local sLoad90 = EgtGetStringFromIni( 'AuxData', 'LOAD90', '', sAuxFile)
if sLoad90 ~= '' then
local BtlInfoId = EgtGetFirstNameInGroup( GDB_ID.ROOT, 'BtlInfo') or GDB_ID.NULL
EgtSetInfo( BtlInfoId, 'LOAD90', sLoad90)
bModif = true
end
-- Se definito REFPOS, aggiorno
local sRefPos = EgtGetStringFromIni( 'AuxData', 'REFPOS', '', sAuxFile)
if sRefPos ~= '' then
EgtSetInfo( BtlInfoId, 'REFPOS', sRefPos)
bModif = true
end
-- Se definito PANELDELTAX, aggiorno
local sPanelDeltaX = EgtGetStringFromIni( 'AuxData', 'PANELDELTAX', '', sAuxFile)
if sPanelDeltaX ~= '' then
EgtSetInfo( BtlInfoId, 'PANELDELTAX', sPanelDeltaX)
bModif = true
end
-- Se definito PANELDELTAY, aggiorno
local sPanelDeltaY = EgtGetStringFromIni( 'AuxData', 'PANELDELTAY', '', sAuxFile)
if sPanelDeltaY ~= '' then
EgtSetInfo( BtlInfoId, 'PANELDELTAY', sPanelDeltaY)
bModif = true
end
-- Se definito PANELDELTAZ, aggiorno
local sPanelDeltaZ = EgtGetStringFromIni( 'AuxData', 'PANELDELTAZ', '', sAuxFile)
if sPanelDeltaZ ~= '' then
EgtSetInfo( BtlInfoId, 'PANELDELTAZ', sPanelDeltaZ)
bModif = true
end
return bModif
end
@@ -138,7 +175,6 @@ end
-- Carico le librerie
_G.package.loaded.WallExec = nil
local WE = require( 'WallExec')
--local BL = require( 'BeamLib')
-- Carico i dati globali
local WD = require( 'WallData')
@@ -232,6 +268,9 @@ if bToProcess then
end
else
dExtraW = 10
if WD.DEFAULT_RAW_NO_EXTRA_WIDTH then
dExtraW = 0
end
dRawW = dRawW + dExtraW
end
end
@@ -276,6 +315,11 @@ if bToProcess then
-- Ne recupero la posizione
for i = 1, #vWall do
local PosX = EgtGetInfo( vWall[i].Id, 'POSX', 'd')
local PosZ = EgtGetInfo( vWall[i].Id, 'POSZ', 'd')
if bProj and WD.DEFAULT_RAW_NO_EXTRA_WIDTH and #vWall == 1 then
PosX = 0
PosZ = 0
end
vWall[i].PosX = PosX + min( dExtraL, 1200)
if WD.USE_POSY then
local PosY = EgtGetInfo( vWall[i].Id, 'POSY', 'd')
@@ -283,7 +327,6 @@ if bToProcess then
else
vWall[i].PosY = 0
end
local PosZ = EgtGetInfo( vWall[i].Id, 'POSZ', 'd')
vWall[i].PosZ = PosZ + dExtraW / 2
end
@@ -348,7 +391,7 @@ if bToProcess then
local vWallErr = {}
for i = 2, #vWall do
local dDimH = vWall[i].Box:getDimZ() + vWall[i].PosY
if abs( dDimH - dRawH) > 10 * GEO.EPS_SMALL then
if abs( dDimH - dRawH) > 100 * GEO.EPS_SMALL then
table.insert( vWallErr, i)
end
end
@@ -364,6 +407,12 @@ if bToProcess then
PostErrView( WALL.ERR, WALL.MSG)
return
end
-- se impostato flag apposito, in vista il grezzo è uguale al pezzo
if bProj and WD.DEFAULT_RAW_NO_EXTRA_WIDTH and #vWall == 1 then
dRawL = vWall[1].Box:getDimX()
dRawW = vWall[1].Box:getDimY()
end
-- Verifico dimensioni massime grezzo
if dRawL > WD.MAX_LENGTH + 10 * GEO.EPS_SMALL or dRawW > WD.MAX_WIDTH + 10 * GEO.EPS_SMALL or dRawH > WD.MAX_HEIGHT + 10 * GEO.EPS_SMALL then
@@ -494,10 +543,20 @@ else
end
-- Aggiorno eventuali dati ausiliari
UpdateAuxData( sBtmFile)
-- Anche se non è da riprocessare, imposto nome file CN.
-- Se file TS7 importato da altro PC, 'WALL.FILE' è cambiato da un PC all'altro. Di conseguenza si deve aggiornare nome file che si andrà a generare.
local _, sName, _ = EgtSplitPath( WALL.FILE)
EgtSetInfo( EgtGetLastMachGroup(), 'NcName', sName .. '.cnc')
-- Passo in modalità lavora
EgtSetCurrMachGroup( EgtGetLastMachGroup())
-- Aggiorno posizione del grezzo
if WE.MoveRaw() then
bToRecalc = true
end
-- Se necessario eseguo aggiornamento con ricalcolo delle lavorazioni
if bToRecalc then
if bToRecalc or WALL.FLAG == 3 or WALL.FLAG == 4 then
EgtOutLog( ' +++ Recalculating all dispositions and machinings >>>')
EgtImportSetup()
EgtApplyAllMachinings()
@@ -561,7 +620,8 @@ if ( WALL.FLAG == 0 and ( bToProcess or bToRecalc)) or WALL.FLAG == 3 or WALL.F
end
-- *** Genero programma CN *** ( se richiesto)
if WALL.FLAG == 0 or WALL.FLAG == 4 then
local bIsGenerationEnabled = ( EgtVerifyKeyOption( 110) == false)
if bIsGenerationEnabled and ( WALL.FLAG == 0 or WALL.FLAG == 4) then
EgtOutLog( ' +++ Generating NC part program >>>')
local sInfo = 'EgtCAM5' .. EgtIf( EgtIs64bit(), ' 64bit', '')
if EgtGetExeVersion then
+11 -6
View File
@@ -275,11 +275,15 @@ if bToProcess then
dMinY = ( WD.MINRAWY_HOR_DRILL or 2800)
end
-- Assegno dimensioni del pannello
dPanelLen = vWall[1].Box:getDimX() + 20
dPanelWidth = math.max( vWall[1].Box:getDimY() + 20, dMinY)
local dExtraW = 10
if WD.DEFAULT_RAW_NO_EXTRA_WIDTH then
dExtraW = 0
end
dPanelLen = vWall[1].Box:getDimX() + 2 * dExtraW
dPanelWidth = math.max( vWall[1].Box:getDimY() + 2 * dExtraW, dMinY)
-- Assegno posizione prima ed unica parete
vWall[1].PosX = 10
vWall[1].PosZ = 10
vWall[1].PosX = dExtraW
vWall[1].PosZ = dExtraW
vWall[1].Rot = 0
vWall[1].Flip = 0
end
@@ -545,7 +549,7 @@ else
-- Passo in modalità lavora
EgtSetCurrMachGroup( EgtGetLastMachGroup())
-- Se necessario eseguo aggiornamento con setup corrente e ricalcolo delle lavorazioni
if bToRecalc then
if bToRecalc or WALL.FLAG == 3 or WALL.FLAG == 4 then
EgtOutLog( ' +++ Recalculating all dispositions and machinings >>>')
EgtImportSetup()
EgtApplyAllMachinings()
@@ -609,7 +613,8 @@ if ( WALL.FLAG == 0 and ( bToProcess or bToRecalc)) or WALL.FLAG == 3 or WALL.F
end
-- *** Genero programma CN *** ( se richiesto)
if WALL.FLAG == 0 or WALL.FLAG == 4 then
local bIsGenerationEnabled = ( EgtVerifyKeyOption( 110) == false)
if bIsGenerationEnabled and ( WALL.FLAG == 0 or WALL.FLAG == 4) then
EgtOutLog( ' +++ Generating NC part program >>>')
local sInfo = 'EgtCAM5' .. EgtIf( EgtIs64bit(), ' 64bit', '')
if EgtGetExeVersion then
+27 -25
View File
@@ -1,30 +1,32 @@
REM Compilazione degli script Wall Egaltech 2023.09.26
REM Compilazione degli script Wall Egaltech 2024.03.24
REM Per togliere info di debug aggiungere flag -s prima del nome del file di input
REM Compilazione 32 e 64 bit
\EgtProg\Dll32\luac54 -o bin\LuaLibs\WallExec.lua LuaLibs\WallExec.lua
\EgtProg\Dll32\luac54 -o bin\LuaLibs\WallLib.lua LuaLibs\WallLib.lua
\EgtProg\Dll32\luac54 -o bin\LuaLibs\WMachiningLib.lua LuaLibs\WMachiningLib.lua
\EgtProg\Dll32\luac54 -o bin\LuaLibs\WProcessCut.lua LuaLibs\WProcessCut.lua
\EgtProg\Dll32\luac54 -o bin\LuaLibs\WProcessDoubleCut.lua LuaLibs\WProcessDoubleCut.lua
\EgtProg\Dll32\luac54 -o bin\LuaLibs\WProcessDrill.lua LuaLibs\WProcessDrill.lua
\EgtProg\Dll32\luac54 -o bin\LuaLibs\WProcessDtMortise.lua LuaLibs\WProcessDtMortise.lua
REM \EgtProg\Dll32\luac54 -o bin\LuaLibs\WFeatureTopology.lua LuaLibs\WFeatureTopology.lua
\EgtProg\Dll32\luac54 -o bin\LuaLibs\WProcessFreeContour.lua LuaLibs\WProcessFreeContour.lua
\EgtProg\Dll32\luac54 -o bin\LuaLibs\WProcessLapJoint.lua LuaLibs\WProcessLapJoint.lua
\EgtProg\Dll32\luac54 -o bin\LuaLibs\WProcessMark.lua LuaLibs\WProcessMark.lua
\EgtProg\Dll32\luac54 -o bin\LuaLibs\WProcessMortise.lua LuaLibs\WProcessMortise.lua
\EgtProg\Dll32\luac54 -o bin\LuaLibs\WProcessSawCut.lua LuaLibs\WProcessSawCut.lua
\EgtProg\Dll32\luac54 -o bin\LuaLibs\WProcessText.lua LuaLibs\WProcessText.lua
\EgtProg\Dll32\luac54 -o bin\LuaLibs\WProcessVariant.lua LuaLibs\WProcessVariant.lua
\EgtProg\Dll32\luac54 -o bin\BatchProcess.lua BatchProcess.lua
\EgtProg\Dll32\luac54 -o bin\BatchProcessNew.lua BatchProcessNew.lua
\EgtProg\Dll32\luac54 -o bin\GetWallData.lua GetWallData.lua
\EgtProg\Dll32\luac54 -o bin\NestFlipAndRotate.lua NestFlipAndRotate.lua
\EgtProg\Dll32\luac54 -o bin\NestProcess.lua NestProcess.lua
\EgtProg\Dll32\luac54 -o bin\Overturn.lua Overturn.lua
\EgtProg\Dll32\luac54 -o bin\Process.lua Process.lua
\EgtProg\Dll32\luac54 -o bin\Rotate.lua Rotate.lua
\EgtProg\Dll32\luac54 -o bin\Version.lua Version.lua
\EgtProg\Dll32\luac54 -o bin\LuaLibs\PanelSaw.lua -s LuaLibs\PanelSaw.lua
\EgtProg\Dll32\luac54 -o bin\LuaLibs\Squaring.lua -s LuaLibs\Squaring.lua
\EgtProg\Dll32\luac54 -o bin\LuaLibs\WallExec.lua -s LuaLibs\WallExec.lua
\EgtProg\Dll32\luac54 -o bin\LuaLibs\WallLib.lua -s LuaLibs\WallLib.lua
\EgtProg\Dll32\luac54 -o bin\LuaLibs\WMachiningLib.lua -s LuaLibs\WMachiningLib.lua
\EgtProg\Dll32\luac54 -o bin\LuaLibs\WProcessCut.lua -s LuaLibs\WProcessCut.lua
\EgtProg\Dll32\luac54 -o bin\LuaLibs\WProcessDoubleCut.lua -s LuaLibs\WProcessDoubleCut.lua
\EgtProg\Dll32\luac54 -o bin\LuaLibs\WProcessDrill.lua -s LuaLibs\WProcessDrill.lua
\EgtProg\Dll32\luac54 -o bin\LuaLibs\WProcessDtMortise.lua -s LuaLibs\WProcessDtMortise.lua
\EgtProg\Dll32\luac54 -o bin\LuaLibs\WFeatureTopology.lua -s LuaLibs\WFeatureTopology.lua
\EgtProg\Dll32\luac54 -o bin\LuaLibs\WProcessFreeContour.lua -s LuaLibs\WProcessFreeContour.lua
\EgtProg\Dll32\luac54 -o bin\LuaLibs\WProcessLapJoint.lua -s LuaLibs\WProcessLapJoint.lua
\EgtProg\Dll32\luac54 -o bin\LuaLibs\WProcessMark.lua -s LuaLibs\WProcessMark.lua
\EgtProg\Dll32\luac54 -o bin\LuaLibs\WProcessMortise.lua -s LuaLibs\WProcessMortise.lua
\EgtProg\Dll32\luac54 -o bin\LuaLibs\WProcessSawCut.lua -s LuaLibs\WProcessSawCut.lua
\EgtProg\Dll32\luac54 -o bin\LuaLibs\WProcessText.lua -s LuaLibs\WProcessText.lua
\EgtProg\Dll32\luac54 -o bin\LuaLibs\WProcessVariant.lua -s LuaLibs\WProcessVariant.lua
\EgtProg\Dll32\luac54 -o bin\BatchProcess.lua -s BatchProcess.lua
\EgtProg\Dll32\luac54 -o bin\BatchProcessNew.lua -s BatchProcessNew.lua
\EgtProg\Dll32\luac54 -o bin\GetWallData.lua -s GetWallData.lua
\EgtProg\Dll32\luac54 -o bin\NestFlipAndRotate.lua -s NestFlipAndRotate.lua
\EgtProg\Dll32\luac54 -o bin\NestProcess.lua -s NestProcess.lua
\EgtProg\Dll32\luac54 -o bin\Overturn.lua -s Overturn.lua
\EgtProg\Dll32\luac54 -o bin\Process.lua -s Process.lua
\EgtProg\Dll32\luac54 -o bin\Rotate.lua -s Rotate.lua
\EgtProg\Dll32\luac54 -o bin\Version.lua -s Version.lua
+367
View File
@@ -0,0 +1,367 @@
-- PanelSaw.lua by Egalware s.r.l. 2025/09/02
-- Creazione lista taglio e/o programmi di taglio per sezionatrici
-- Intestazioni
require( 'EgtBase')
EgtEnableDebug( false)
local PanelSaw = {}
local function GetPanelList()
local PanelList = {}
local idMachGroup = EgtGetFirstMachGroup()
local nMachGroupCount = EgtGetMachGroupCount()
-- nessun MachGroup ossia nessun pannello: si esce subito
if ( not idMachGroup) or ( nMachGroupCount == 0) then
return nil
end
-- per ogni MachGroup si estraggono le informazioni del pannello
for i = 1, nMachGroupCount do
local vPartInfo = EgtSplitString( EgtGetInfo( idMachGroup, 'PART1', 's'))
local idPart = vPartInfo[1]
table.insert( PanelList, {})
PanelList[i].dLength = EgtGetInfo( idMachGroup, 'PANELLEN', 'd')
PanelList[i].dWidth = EgtGetInfo( idMachGroup, 'PANELWIDTH', 'd')
PanelList[i].dThickness = EgtGetInfo( idMachGroup, 'PANELHEIGHT', 'd')
PanelList[i].sMaterialFullName = EgtGetInfo( idMachGroup, 'MATERIAL', 's') or '0000-MATERIAL'
local vMaterialInfo = EgtSplitString( PanelList[i].sMaterialFullName, '-')
PanelList[i].idMaterial = vMaterialInfo[1]
PanelList[i].idProd = EgtGetInfo( idMachGroup, 'PRODID', 'i')
PanelList[i].idPatt = EgtGetInfo( idMachGroup, 'PATTID', 'i')
PanelList[i].nPdn = EgtGetInfo( idPart, 'PDN', 'i')
PanelList[i].sName = EgtGetInfo( idPart, 'NAM', 's')
PanelList[i].sDescription = ''
-- in questa modalità ogni MachGroup è 1 pezzo, non esistono multipli
-- TODO valutare se raggruppare i pannelli uguali per la cutting list
PanelList[i].nQuantity = 1
-- TODO aggiungere labeling, edgebanding, graindirection, ...
idMachGroup = EgtGetNextMachGroup( idMachGroup)
end
return PanelList
end
local function GetSheetList()
local SheetList = {
{
dLength = 2800,
dWidth = 2070,
dThickness = 8,
sMaterial = ''
},
{
dLength = 2800,
dWidth = 2070,
dThickness = 18,
sMaterial = ''
}
}
return SheetList
end
local function GetProjectInfo()
local ProjectInfo = {}
local idBtlInfo = EgtGetFirstNameInGroup( GDB_ID.ROOT, 'BtlInfo') or GDB_ID.NULL
ProjectInfo.sProjectName = EgtGetInfo( idBtlInfo, 'PROJECTNAME', 's') or ''
return ProjectInfo
end
local function GetFormattedLine( ValuesList, ValuesPlaceholders, FieldFixLength)
local sLine = ''
local Values = ValuesList
local nPos = 1 -- posizione partenza linea
for j, Value in ipairs( Values) do
local Placeholder = ValuesPlaceholders[j]
local sFormatted = string.format( Placeholder, Value)
-- se il campo ha lunghezza fissa, si aggiungono spazi
if FieldFixLength and FieldFixLength[j] then
local sFieldLength = FieldFixLength[j]
-- troncamento se troppo lungo
if #sFormatted > sFieldLength then
sFormatted = string.sub( sFormatted, 1, sFieldLength)
end
sFormatted = sFormatted .. string.rep(" ", sFieldLength - #sFormatted)
end
sLine = sLine .. sFormatted
nPos = nPos + #sFormatted
-- Aggiungi spazio solo se non è l'ultimo campo
if j < #Values then
sLine = sLine .. " "
nPos = nPos + 1
end
end
return sLine
end
local function BuildCuttingList_Cutty( PanelList, SheetList, ProjectInfo)
local Lines = {}
local F0 = {
Header = { 'F0'},
HeaderPlaceholders = { '%s'},
Values = { ' 7.70', '210700', '150300'},
ValuesPlaceholders = { '%s', '%s', '%s'}
}
local F0b = {
Header = { 'F0b', '""', '""', '""', '""'},
HeaderPlaceholders = { '%s', '%s', '%s', '%s', '%s'}
}
local F1 = {
Header = { 'F1', PanelList[1].dThickness, 0, 0, 0},
HeaderPlaceholders = { '%s', '%.3f', '%.3f', '%.3f', '%.3f'},
ValuesList = {},
ValuesPlaceholders = { '%.3f', '%.3f', '%d', '%d', '%d', '%d', '%s', '%d', '%.3f', '%d', '%d', '%d', '%d'},
FieldFixLength = { [6] = 29, [7] = 50}
}
for i = 1, #SheetList do
F1.ValuesList[i] = { SheetList[i].dLength, SheetList[i].dWidth, 99, 200, 1, 1, SheetList[i].sMaterial, 0, 1, 0, 0, 0, 0}
end
local F2 = {
Header = { 'F2', 0, 0, 0},
HeaderPlaceholders = { '%s', '%d', '%d', '%d'},
ValuesList = {},
ValuesPlaceholders = { '%.3f', '%.3f', '%d', '%d', '%d', '%d', '%d', '%s', '%d', '%d', '%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%.3f', '%d', '%d', '%d', '%.3f', '%.3f'},
FieldFixLength = { [8] = 20, [13] = 50, [23] = 85}
}
for i = 1, #PanelList do
F2.ValuesList[i] = { PanelList[i].dLength, PanelList[i].dWidth, PanelList[i].nQuantity, 0, 0, 0, 0, PanelList[i].nPdn, 0, 0, 0, 0, PanelList[i].sDescription, 0, 0, 0, 0, 1, 0, 1500, 0, 0, 0, 0, 0}
end
local F7 = {
Header = { 'F7', 3052, 0},
HeaderPlaceholders = { '%s', '%s', '%d'},
ValuesList = {
{ 218, 436},
{ 167, 669},
{ 204, 408},
{ 204, 204},
{ 204, 204},
{ 209, 209},
{ 167, 167},
{ 213, 213},
{ 229, 229},
{ 164, 164},
{ 150, 150}
},
ValuesPlaceholders = { '%s', '%s'}
}
local F7b = {
Header = { 'F7b', 0, 0, 0, 0},
HeaderPlaceholders = { '%s', '%.3f', '%.3f', '%.3f', '%.3f'},
Values = {},
ValuesPlaceholders = {}
}
local F8 = {
Header = { 'F8', 0, 0, 20, 20, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
HeaderPlaceholders = { '%s', '%.3f', '%.3f', '%d', '%d', '%d', '%d', '%.3f', '%d', '%d', '%d', '%d', '%d', '%d', '%.3f', '%d', '%d', '%d', '%d', '%d', '%d', '%.3f', '%.3f', '%.3f'}
}
local F9 = {
Header = { 'F9', 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4.3, 0, 0, 0, 2, 0, 2450, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
HeaderPlaceholders = { '%s', '%d', '%.3f', '%d', '%.3f', '%.3f', '%.3f', '%.3f', '%.3f', '%d', '%d', '%.3f', '%d', '%d', '%d', '%d', '%.3f', '%.3f', '%d', '%d', '%.3f', '%.3f', '%.3f', '%.3f', '%d', '%d', '%.3f', '%.3f'}
}
local F3 = {
Header = { 'F3'},
HeaderPlaceholders = { '%s'}
}
local E0 = {
Header = { 'E0'},
HeaderPlaceholders = { '%s'}
}
-- F0
table.insert( Lines, string.format( table.concat( F0.HeaderPlaceholders, ' '), table.unpack( F0.Header)))
table.insert( Lines, string.format( table.concat( F0.ValuesPlaceholders, ' '), table.unpack( F0.Values)))
-- linea vuota
table.insert( Lines, '')
-- F0b
table.insert( Lines, string.format( table.concat( F0b.HeaderPlaceholders, ' '), table.unpack( F0b.Header)))
-- linea vuota
table.insert( Lines, '')
-- F1 - sheets
table.insert( Lines, string.format( table.concat( F1.HeaderPlaceholders, ' '), table.unpack( F1.Header)))
for i = 1, #F1.ValuesList do
local sLine = GetFormattedLine( F1.ValuesList[i], F1.ValuesPlaceholders, F1.FieldFixLength)
table.insert( Lines, sLine)
end
-- linea vuota
table.insert( Lines, '')
-- F2 - panels
table.insert( Lines, string.format( table.concat( F2.HeaderPlaceholders, ' '), table.unpack( F2.Header)))
for i = 1, #F2.ValuesList do
local sLine = GetFormattedLine( F2.ValuesList[i], F2.ValuesPlaceholders, F2.FieldFixLength)
table.insert( Lines, sLine)
end
-- linea vuota
table.insert( Lines, '')
-- F7
table.insert( Lines, string.format( table.concat( F7.HeaderPlaceholders, ' '), table.unpack( F7.Header)))
for i = 1, #F7.ValuesList do
local sLine = GetFormattedLine( F7.ValuesList[i], F7.ValuesPlaceholders, F7.FieldFixLength)
table.insert( Lines, sLine)
end
-- linea vuota
table.insert( Lines, '')
-- F7b
table.insert( Lines, string.format( table.concat( F7b.HeaderPlaceholders, ' '), table.unpack( F7b.Header)))
-- linea vuota
table.insert( Lines, '')
-- F8
table.insert( Lines, string.format( table.concat( F8.HeaderPlaceholders, ' '), table.unpack( F8.Header)))
-- linea vuota
table.insert( Lines, '')
-- F9
table.insert( Lines, string.format( table.concat( F9.HeaderPlaceholders, ' '), table.unpack( F9.Header)))
-- linea vuota
table.insert( Lines, '')
-- F3
table.insert ( Lines, string.format( table.concat( F3.HeaderPlaceholders, ' '), table.unpack( F3.Header)))
-- E0
table.insert( Lines, string.format( table.concat( E0.HeaderPlaceholders, ' '), table.unpack( E0.Header)))
-- linea vuota
table.insert( Lines, '')
return Lines
end
local function BuildCuttingList( PanelList, sOutputType)
local LinesToWrite = {}
local SheetList = GetSheetList()
local ProjectInfo = GetProjectInfo()
local dRequiredThickness = PanelList[1].dThickness
-- solo gli sheets dello spessore corretto vanno considerati
local ActualSheetList = {}
for i = 1, #SheetList do
if abs( SheetList[i].dThickness - dRequiredThickness) < 10 * GEO.EPS_SMALL then
ActualSheetList[#ActualSheetList+1] = {
dLength = SheetList[i].dLength,
dWidth = SheetList[i].dWidth,
dThickness = SheetList[i].dThickness,
sMaterial = SheetList[i].sMaterial
}
end
end
-- Casadei
if sOutputType == 'CUTTY' then
LinesToWrite = BuildCuttingList_Cutty( PanelList, ActualSheetList, ProjectInfo)
-- Homag Optimat
elseif sOutputType == 'HOMAG' then
end
return LinesToWrite
end
-- restituisce i pannelli raggruppati per coppia materiale-spessore univoca
local function GroupByMaterial( PanelList)
local PanelsGroupedByMaterial = {}
for i = 1, #PanelList do
local idMaterial = PanelList[i].idMaterial
local dMaterialThickness = PanelList[i].dThickness
-- si crea una chiave unica dalla coppia
local key = idMaterial .. "_" .. tostring( dMaterialThickness)
-- se la chiave non esiste già nella tabella, si crea
if not PanelsGroupedByMaterial[key] then
PanelsGroupedByMaterial[key] = {}
end
-- aggiunta del pezzo corrente al gruppo chiave corrispondente
table.insert( PanelsGroupedByMaterial[key], PanelList[i])
end
return PanelsGroupedByMaterial
end
function PanelSaw.GenerateCuttingList( sOutputType)
local PanelList = GetPanelList()
local PanelsGroupedByMaterial = GroupByMaterial( PanelList)
for key, PanelListSingleMaterial in pairs( PanelsGroupedByMaterial) do
-- path in cui scrivere i file
local sCurrentNgePath, sCurrentNgeName = EgtSplitPath( EgtGetCurrFilePath())
if sOutputType then
-- costruzione lista istruzioni
local LinesToWrite = BuildCuttingList( PanelListSingleMaterial, sOutputType)
-- scrittura file
local sFilename = sCurrentNgePath .. 'CutList-' .. sCurrentNgeName .. '-' .. key .. '-' .. sOutputType
sFilename = sFilename:gsub( '%.', '_')
local hFile, nFileErr = io.open( sFilename, 'w')
if not hFile then
EgtOutLog( 'Error creating cutting list : IO error ' .. tostring( nFileErr))
return false
end
hFile:write( table.concat( LinesToWrite, "\n"))
hFile:close()
-- se nessun tipo si deve scrivere un json semplice
else
end
end
return
end
return PanelSaw
+494
View File
@@ -0,0 +1,494 @@
-- Squaring.lua by Egaltech s.r.l. 2024/10/15
-- Libreria squadratura pareti
-- Tabella per definizione modulo
local Squaring = {}
-- Include
require( 'EgtBase')
EgtOutLog( ' Squaring started', 1)
-- Dati
local WD = require( 'WallData')
local WM = require( 'WMachiningLib')
-------------------------------------------------------------------------------------------------------------
local function IsToolOk( Tool, dRawPartHeight)
local bIsToolOk = false
local bToolExists = false
local bToolCanReachDepth = false
local dMaxOvermaterial = 0
if type( WD.SQUARING_MAX_OVERMATERIAL) == "number" then
dMaxOvermaterial = WD.SQUARING_MAX_OVERMATERIAL
end
bToolExists = ( next( Tool) ~= nil)
if bToolExists then
if Tool.nType == MCH_TY.MILL_NOTIP then
bToolCanReachDepth = ( Tool.dThickness > dMaxOvermaterial - 10 * GEO.EPS_SMALL)
and ( Tool.dSideDepth > dRawPartHeight - 10 * GEO.EPS_SMALL)
else
bToolCanReachDepth = Tool.dMaxDepth > dRawPartHeight - 10 * GEO.EPS_SMALL
end
end
bIsToolOk = bToolExists and bToolCanReachDepth
return bIsToolOk
end
-------------------------------------------------------------------------------------------------------------
function Squaring.GetTools()
-- TODO vedere se questo valore è coerente sulle diverse macchine
local dHeadEncumberance = 130
local Tool = {}
local SquaringTools = {}
SquaringTools.Blade = {}
SquaringTools.Diskmill = {}
SquaringTools.Mill = {}
SquaringTools.Blade.H1 = {}
SquaringTools.Blade.H2 = {}
SquaringTools.Blade.H7 = {}
SquaringTools.Diskmill.H1 = {}
SquaringTools.Diskmill.H7 = {}
SquaringTools.Mill.H1 = {}
SquaringTools.Mill.H7 = {}
Tool.sName = EgtTdbGetFirstTool( MCH_TF.SAWBLADE + MCH_TF.MILL + MCH_TF.MORTISE)
while Tool.sName ~= '' do
EgtTdbSetCurrTool( Tool.sName)
local bIsToolLoadedOnSetup = EgtFindToolInCurrSetup( Tool.sName)
local bIsSquaringTool = EgtTdbGetCurrToolValInNotes( MCH_TP.USERNOTES, 'SQUARING', 'b') or false
Tool.nType = EgtTdbGetCurrToolParam( MCH_TP.TYPE)
Tool.dDiameter = EgtTdbGetCurrToolParam( MCH_TP.DIAM)
Tool.dMaxMaterial = EgtTdbGetCurrToolParam( MCH_TP.MAXMAT)
Tool.dThickness = EgtIf( ( Tool.nType == MCH_TY.SAW_FLAT or Tool.nType == MCH_TY.SAW_STD), EgtTdbGetCurrToolParam( MCH_TP.THICK), Tool.dMaxMaterial)
Tool.dMaxDepth = EgtTdbGetCurrToolMaxDepth() or Tool.dMaxMaterial
Tool.sHead = EgtTdbGetCurrToolParam( MCH_TP.HEAD)
Tool.bIsCcw = EgtTdbGetCurrToolParam( MCH_TP.SPEED) < 0
Tool.dFeed = EgtTdbGetCurrToolParam( MCH_TP.FEED)
Tool.dStartFeed = EgtTdbGetCurrToolParam( MCH_TP.STARTFEED)
Tool.dEndFeed = EgtTdbGetCurrToolParam( MCH_TP.ENDFEED)
Tool.dTipFeed = EgtTdbGetCurrToolParam( MCH_TP.TIPFEED)
Tool.dMinFeed = EgtTdbGetCurrToolParam( MCH_TP.MINFEED)
Tool.dStep = EgtTdbGetCurrToolValInNotes( MCH_TP.USERNOTES, 'STEP', 'd') or EgtIf( ( Tool.nType == MCH_TY.SAW_FLAT or Tool.nType == MCH_TY.SAW_STD), ( Tool.dDiameter / 3), ( Tool.dMaxMaterial / 3))
Tool.dSideStep = EgtTdbGetCurrToolValInNotes( MCH_TP.USERNOTES, 'SIDESTEP', 'd') or ( Tool.dDiameter / 3)
Tool.dSideDepth = Tool.dDiameter / 2 - dHeadEncumberance
if bIsToolLoadedOnSetup and Tool.nType and bIsSquaringTool then
-- lame
if Tool.nType == MCH_TY.SAW_FLAT or Tool.nType == MCH_TY.SAW_STD then
SquaringTools.Blade[Tool.sHead] = Tool
Tool.bIsPathCw = Tool.bIsCcw
Tool.dSideStep = Tool.dStep
Tool.dStep = Tool.dThickness
-- frese standard
elseif Tool.nType == MCH_TY.MILL_STD then
SquaringTools.Mill[Tool.sHead] = Tool
Tool.bIsPathCw = not Tool.bIsCcw
-- truciolatori
elseif Tool.nType == MCH_TY.MILL_NOTIP then
SquaringTools.Diskmill[Tool.sHead] = Tool
Tool.bIsPathCw = Tool.bIsCcw
end
end
Tool = {}
Tool.sName = EgtTdbGetNextTool( MCH_TF.SAWBLADE + MCH_TF.MILL + MCH_TF.MORTISE)
end
return SquaringTools
end
-------------------------------------------------------------------------------------------------------------
function Squaring.AreToolsOk( sSquaringTool, SquaringTools, dRawPartHeight)
local bAreToolsOk = false
if sSquaringTool == 'DoubleDiskmill' then
bAreToolsOk = ( IsToolOk( SquaringTools.Blade.H2, dRawPartHeight)
and IsToolOk( SquaringTools.Diskmill.H1, dRawPartHeight)
and IsToolOk( SquaringTools.Diskmill.H7, dRawPartHeight))
elseif sSquaringTool == 'DoubleDiskmillAndBlade' then
bAreToolsOk = ( IsToolOk( SquaringTools.Blade.H2, dRawPartHeight)
and ( IsToolOk( SquaringTools.Diskmill.H1, dRawPartHeight) or IsToolOk( SquaringTools.Diskmill.H7, dRawPartHeight)))
elseif sSquaringTool == 'DoubleBlade' then
bAreToolsOk = ( IsToolOk( SquaringTools.Blade.H2, dRawPartHeight)
and ( IsToolOk( SquaringTools.Blade.H1, dRawPartHeight) or IsToolOk( SquaringTools.Blade.H7, dRawPartHeight)))
elseif sSquaringTool == 'Diskmill' then
bAreToolsOk = IsToolOk( SquaringTools.Diskmill.H1, dRawPartHeight) or IsToolOk( SquaringTools.Diskmill.H7, dRawPartHeight)
elseif sSquaringTool == 'Blade' then
bAreToolsOk = IsToolOk( SquaringTools.Blade.H2, dRawPartHeight)
elseif sSquaringTool == 'DoubleMill' then
bAreToolsOk = IsToolOk( SquaringTools.Mill.H1, dRawPartHeight) and IsToolOk( SquaringTools.Mill.H7, dRawPartHeight)
elseif sSquaringTool == 'Mill' then
bAreToolsOk = IsToolOk( SquaringTools.Mill.H1, dRawPartHeight) or IsToolOk( SquaringTools.Mill.H7, dRawPartHeight)
else
error( 'Squaring Tool not recognized')
end
return bAreToolsOk
end
-------------------------------------------------------------------------------------------------------------
function Squaring.CalculateParameters( sSquaringTool, SquaringTools, RawPart, vPart)
local SquaringParameters = {}
local sOrigCorner = EgtGetInfo( RawPart.nId, 'ORIGCORNER')
local bShrinkToParts = ( WD.SQUARING_TYPE == 2)
local bSquaringStartsOnReference = ( type( WD.SQUARING_STARTS_ON_REFERENCE) == "boolean") and ( WD.SQUARING_STARTS_ON_REFERENCE == true)
local dOffsetXY = 0
local dExtendZ = 0
if type( WD.SQUARING_OFFSET_XY) == "number" and ( WD.SQUARING_TYPE < 2) then
dOffsetXY = WD.SQUARING_OFFSET_XY
end
if type( WD.SQUARING_EXTEND_Z) == "number" then
dExtendZ = WD.SQUARING_EXTEND_Z
end
local Front = { sSide = 'Front'}
local Right = { sSide = 'Right'}
local Back = { sSide = 'Back'}
local Left = { sSide = 'Left'}
local b3Squaring = BBox3d( RawPart.b3)
-- se squadratura sui pezzi invece che sul master panel, si costruisce il box minimo che contiene tutti i pezzi
if bShrinkToParts then
b3Squaring = BBox3d( vPart[1].Box:getCenter())
for i = 1, #vPart do
b3Squaring:Add( vPart[i].Box)
end
end
local dDimX = b3Squaring:getDimX()
local dDimY = b3Squaring:getDimY()
local pt1 = b3Squaring:getMin() + Point3d( -dOffsetXY, -dOffsetXY, -dExtendZ)
local pt2 = pt1 + Point3d( dDimX + 2 * dOffsetXY, 0, 0)
local pt3 = pt2 + Point3d( 0, dDimY + 2 * dOffsetXY,0 )
local pt4 = pt3 + Point3d( -dDimX - 2 * dOffsetXY, 0, 0)
b3Squaring:Add( pt1)
b3Squaring:Add( pt2)
b3Squaring:Add( pt3)
b3Squaring:Add( pt4)
Front.nId = EgtLine( RawPart.nId, pt1, pt2, GDB_RT.GLOB)
Right.nId = EgtLine( RawPart.nId, pt2, pt3, GDB_RT.GLOB)
Back.nId = EgtLine( RawPart.nId, pt3, pt4, GDB_RT.GLOB)
Left.nId = EgtLine( RawPart.nId, pt4, pt1, GDB_RT.GLOB)
if not ( sSquaringTool == 'DoubleMill') and not ( sSquaringTool == 'Mill') then
EgtModifyCurveExtrusion( Front.nId, -Y_AX(), GDB_RT.GLOB)
EgtModifyCurveExtrusion( Right.nId, X_AX(), GDB_RT.GLOB)
EgtModifyCurveExtrusion( Back.nId, Y_AX(), GDB_RT.GLOB)
EgtModifyCurveExtrusion( Left.nId, -X_AX(), GDB_RT.GLOB)
end
EgtSetName( Front.nId, 'SquaringGeometry')
EgtSetName( Right.nId, 'SquaringGeometry')
EgtSetName( Back.nId, 'SquaringGeometry')
EgtSetName( Left.nId, 'SquaringGeometry')
-- in base al caso si assegna l'utensile al lato
if sSquaringTool == 'DoubleDiskmill' then
Left.Tool = SquaringTools.Diskmill.H1
Right.Tool = SquaringTools.Blade.H2
Front.Tool = SquaringTools.Diskmill.H1
Front.ToolDouble = SquaringTools.Diskmill.H7
Front.sSide = 'Front+Back'
elseif sSquaringTool == 'DoubleDiskmillAndBlade' then
Left.Tool = SquaringTools.Diskmill.H1 or SquaringTools.Diskmill.H7
Right.Tool = SquaringTools.Blade.H2
Front.Tool = SquaringTools.Blade.H2
Front.ToolDouble = SquaringTools.Diskmill.H1 or SquaringTools.Diskmill.H7
Front.sSide = 'Front+Back'
elseif sSquaringTool == 'DoubleBlade' then
Left.Tool = SquaringTools.Blade.H2
Right.Tool = SquaringTools.Blade.H2
Front.Tool = SquaringTools.Blade.H2
Front.ToolDouble = SquaringTools.Blade.H1 or SquaringTools.Blade.H7
Front.sSide = 'Front+Back'
elseif sSquaringTool == 'Diskmill' then
Left.Tool = SquaringTools.Diskmill.H1 or SquaringTools.Diskmill.H7
Back.Tool = SquaringTools.Diskmill.H1 or SquaringTools.Diskmill.H7
Right.Tool = SquaringTools.Blade.H2
Front.Tool = SquaringTools.Diskmill.H1 or SquaringTools.Diskmill.H7
elseif sSquaringTool == 'Blade' then
Left.Tool = SquaringTools.Blade.H2
Back.Tool = SquaringTools.Blade.H2
Right.Tool = SquaringTools.Blade.H2
Front.Tool = SquaringTools.Blade.H2
elseif sSquaringTool == 'DoubleMill' then
Left.Tool = SquaringTools.Mill.H1
Right.Tool = SquaringTools.Mill.H1
Front.Tool = SquaringTools.Mill.H1
Front.ToolDouble = SquaringTools.Mill.H7
Front.sSide = 'Front+Back'
elseif sSquaringTool == 'Mill' then
Left.Tool = SquaringTools.Mill.H1 or SquaringTools.Mill.H7
Back.Tool = SquaringTools.Mill.H1 or SquaringTools.Mill.H7
Right.Tool = SquaringTools.Mill.H1 or SquaringTools.Mill.H7
Front.Tool = SquaringTools.Mill.H1 or SquaringTools.Mill.H7
end
-- l'ordinamento delle linee dipende dal verso di percorrenza e, se attivato, dal riferimento utilizzato
-- con doppio l'ordine cambia
-- lato lungo lavorato in doppio
if not Back.Tool then
for i = 1, 3 do
SquaringParameters[i] = {}
end
if Front.Tool.bIsPathCw then
if bSquaringStartsOnReference and ( sOrigCorner == 'BL' or sOrigCorner == 'BM') then
SquaringParameters[1] = Front
SquaringParameters[2] = Left
SquaringParameters[3] = Right
elseif bSquaringStartsOnReference and ( sOrigCorner == 'TR' or sOrigCorner == 'TN') then
SquaringParameters[1] = Right
SquaringParameters[2] = Front
SquaringParameters[3] = Left
elseif bSquaringStartsOnReference and ( sOrigCorner == 'BR' or sOrigCorner == 'BN') then
SquaringParameters[1] = Right
SquaringParameters[2] = Front
SquaringParameters[3] = Left
elseif bSquaringStartsOnReference and ( sOrigCorner == 'TL' or sOrigCorner == 'TM') then
SquaringParameters[1] = Left
SquaringParameters[2] = Front
SquaringParameters[3] = Right
else
SquaringParameters[1] = Right
SquaringParameters[2] = Front
SquaringParameters[3] = Left
end
else
if bSquaringStartsOnReference and ( sOrigCorner == 'BL' or sOrigCorner == 'BM') then
SquaringParameters[1] = Left
SquaringParameters[2] = Front
SquaringParameters[3] = Right
elseif bSquaringStartsOnReference and ( sOrigCorner == 'TR' or sOrigCorner == 'TN') then
SquaringParameters[1] = Front
SquaringParameters[2] = Right
SquaringParameters[3] = Left
elseif bSquaringStartsOnReference and ( sOrigCorner == 'BR' or sOrigCorner == 'BN') then
SquaringParameters[1] = Front
SquaringParameters[2] = Right
SquaringParameters[3] = Left
elseif bSquaringStartsOnReference and ( sOrigCorner == 'TL' or sOrigCorner == 'TM') then
SquaringParameters[1] = Left
SquaringParameters[2] = Front
SquaringParameters[3] = Right
else
SquaringParameters[1] = Left
SquaringParameters[2] = Front
SquaringParameters[3] = Right
end
end
-- doppio non attivo
else
for i = 1, 4 do
SquaringParameters[i] = {}
end
if Front.Tool.bIsPathCw then
if bSquaringStartsOnReference and ( sOrigCorner == 'BL' or sOrigCorner == 'BM') then
SquaringParameters[1] = Front
SquaringParameters[2] = Left
SquaringParameters[3] = Back
SquaringParameters[4] = Right
elseif bSquaringStartsOnReference and ( sOrigCorner == 'TR' or sOrigCorner == 'TN') then
SquaringParameters[1] = Back
SquaringParameters[2] = Right
SquaringParameters[3] = Front
SquaringParameters[4] = Left
elseif bSquaringStartsOnReference and ( sOrigCorner == 'BR' or sOrigCorner == 'BN') then
SquaringParameters[1] = Right
SquaringParameters[2] = Front
SquaringParameters[3] = Left
SquaringParameters[4] = Back
else
SquaringParameters[1] = Left
SquaringParameters[2] = Back
SquaringParameters[3] = Right
SquaringParameters[4] = Front
end
else
if bSquaringStartsOnReference and ( sOrigCorner == 'TL' or sOrigCorner == 'TM') then
SquaringParameters[1] = Back
SquaringParameters[2] = Left
SquaringParameters[3] = Front
SquaringParameters[4] = Right
elseif bSquaringStartsOnReference and ( sOrigCorner == 'TR' or sOrigCorner == 'TN') then
SquaringParameters[1] = Right
SquaringParameters[2] = Back
SquaringParameters[3] = Left
SquaringParameters[4] = Front
elseif bSquaringStartsOnReference and ( sOrigCorner == 'BR' or sOrigCorner == 'BN') then
SquaringParameters[1] = Front
SquaringParameters[2] = Right
SquaringParameters[3] = Back
SquaringParameters[4] = Left
else
SquaringParameters[1] = Left
SquaringParameters[2] = Front
SquaringParameters[3] = Right
SquaringParameters[4] = Back
end
end
end
return SquaringParameters, b3Squaring
end
-------------------------------------------------------------------------------------------------------------
function Squaring.AddMachinings( SquaringParameters, b3Squaring, nFirstOperationId)
local nNotOkCount = 0
local sMsgTotal = ''
local dSquaringHeight = b3Squaring:getDimZ()
local dExtendPath = 0
local dMaxOvermaterial = 0
if type( WD.SQUARING_MAX_OVERMATERIAL) == "number" then
dMaxOvermaterial = WD.SQUARING_MAX_OVERMATERIAL
end
local bUseZigZagStep = ( type( WD.SQUARING_USE_ZIGZAG) == "boolean") and ( WD.SQUARING_USE_ZIGZAG == true)
for i = 1, #SquaringParameters do
local dToolRadius = SquaringParameters[i].Tool.dDiameter / 2
local vtExtr = EgtCurveExtrusion( SquaringParameters[i].nId, GDB_RT.GLOB)
local bIsVerticalMilling = false
if AreSameVectorApprox( vtExtr, Z_AX()) then
bIsVerticalMilling = true
end
-- calcolo step laterale
local MachiningSteps = { nCount = 1, dStep = 0}
if not bIsVerticalMilling then
MachiningSteps = WM.GetMachiningSteps( dSquaringHeight, SquaringParameters[i].Tool.dSideStep)
end
for j = 1, MachiningSteps.nCount do
local nOperationId = EgtCreateMachining( 'SQUARING_' .. SquaringParameters[i].sSide, MCH_OY.MILLING, SquaringParameters[i].Tool.sName)
-- geometria
EgtSetMachiningGeometry( SquaringParameters[i].nId)
-- profondità di lavoro
EgtSetMachiningParam( MCH_MP.DEPTH_STR, 0)
-- workside e inversione
if SquaringParameters[i].Tool.bIsPathCw then
if SquaringParameters[i].Tool.nType == MCH_TY.MILL_STD then
EgtSetMachiningParam( MCH_MP.WORKSIDE, MCH_MILL_WS.LEFT)
else
EgtSetMachiningParam( MCH_MP.WORKSIDE, MCH_MILL_WS.RIGHT)
end
EgtSetMachiningParam( MCH_MP.INVERT, true)
else
if SquaringParameters[i].Tool.nType == MCH_TY.MILL_STD then
EgtSetMachiningParam( MCH_MP.WORKSIDE, MCH_MILL_WS.RIGHT)
else
EgtSetMachiningParam( MCH_MP.WORKSIDE, MCH_MILL_WS.LEFT)
end
EgtSetMachiningParam( MCH_MP.INVERT, false)
end
-- distanza di sicurezza
if bIsVerticalMilling then
EgtSetMachiningParam( MCH_MP.STARTPOS, WD.CUT_SIC + dSquaringHeight)
else
EgtSetMachiningParam( MCH_MP.STARTPOS, WD.CUT_SIC)
end
-- overlap
EgtSetMachiningParam( MCH_MP.OVERL, 0)
-- tipo di step
if bIsVerticalMilling and bUseZigZagStep then
EgtSetMachiningParam( MCH_MP.STEPTYPE, MCH_MILL_ST.ZIGZAG)
else
EgtSetMachiningParam( MCH_MP.STEPTYPE, MCH_MILL_ST.ONEWAY)
end
-- step
if bIsVerticalMilling then
EgtSetMachiningParam( MCH_MP.STEP, SquaringParameters[i].Tool.dStep)
else
EgtSetMachiningParam( MCH_MP.STEP, 0)
end
-- offset radiale
local dRadialOffset = 0
if not bIsVerticalMilling then
dRadialOffset = ( MachiningSteps.nCount - j) * MachiningSteps.dStep
end
EgtSetMachiningParam( MCH_MP.OFFSR, dRadialOffset)
-- offset longitudinale
EgtSetMachiningParam( MCH_MP.OFFSL, 0)
-- inversione utensile
EgtSetMachiningParam( MCH_MP.TOOLINVERT, false)
-- faceuse
EgtSetMachiningParam( MCH_MP.FACEUSE, MCH_MILL_FU.NONE)
-- angoli suggeriti
EgtSetMachiningParam( MCH_MP.INITANGS, '')
-- asse bloccato
EgtSetMachiningParam( MCH_MP.BLOCKEDAXIS, '')
-- SCC
EgtSetMachiningParam( MCH_MP.SCC, MCH_SCC.NONE)
-- calcolo estensione percorso
if bIsVerticalMilling then
-- per utensili che lavorano di fianco, si deve partire fuori dall'altezza del grezzo
dExtendPath = dMaxOvermaterial + dToolRadius + WD.COLL_SIC
else
-- si calcola l'impronta utensile per uscire quanto basta a garantire il maxOvermaterial, con una distanza di sicurezza
dExtendPath = dMaxOvermaterial + WD.COLL_SIC + dToolRadius - ( dToolRadius - sqrt( dToolRadius * dToolRadius - ( ( dToolRadius - dSquaringHeight) * ( dToolRadius - dSquaringHeight))))
end
-- approccio
EgtSetMachiningParam( MCH_MP.LEADINTYPE, MCH_MILL_LI.LINEAR)
EgtSetMachiningParam( MCH_MP.STARTADDLEN, dExtendPath)
EgtSetMachiningParam( MCH_MP.LITANG, 0)
if bIsVerticalMilling then
EgtSetMachiningParam( MCH_MP.LIPERP, 0)
else
-- per utensili che lavorano di fianco, si deve partire fuori dall'altezza del grezzo
EgtSetMachiningParam( MCH_MP.LIPERP, WD.CUT_SIC + dSquaringHeight)
end
EgtSetMachiningParam( MCH_MP.LIELEV, 0)
EgtSetMachiningParam( MCH_MP.LICOMPLEN, 0)
-- retrazione
EgtSetMachiningParam( MCH_MP.LEADOUTTYPE, MCH_MILL_LO.LINEAR)
EgtSetMachiningParam( MCH_MP.ENDADDLEN, dExtendPath)
EgtSetMachiningParam( MCH_MP.LOTANG, 0)
if bIsVerticalMilling then
EgtSetMachiningParam( MCH_MP.LOPERP, 0)
else
-- per utensili che lavorano di fianco, si deve partire fuori dall'altezza del grezzo
EgtSetMachiningParam( MCH_MP.LOPERP, WD.CUT_SIC + dSquaringHeight)
end
EgtSetMachiningParam( MCH_MP.LOELEV, 0)
EgtSetMachiningParam( MCH_MP.LOCOMPLEN, 0)
-- note utente
local sUserNotes = ''
sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES)
if SquaringParameters[i].ToolDouble then
local dYMirrorAx
local b3Tab = EgtGetTableArea()
dYMirrorAx = b3Squaring:getCenter():getY() - b3Tab:getMin():getY()
sUserNotes = EgtSetValInNotes( sUserNotes, 'DOUBLE', 2)
sUserNotes = EgtSetValInNotes( sUserNotes, 'MirrorAx', dYMirrorAx)
sUserNotes = EgtSetValInNotes( sUserNotes, 'TOOLDOUBLE', SquaringParameters[i].ToolDouble.sName)
end
if not bIsVerticalMilling then
sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', 0)
end
EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes)
local bOk = EgtApplyMachining( true, false)
-- la squadratura va sempre prima delle eventuali altre lavorazioni
if nFirstOperationId then
EgtRelocateGlob( nOperationId, nFirstOperationId, GDB_IN.BEFORE)
end
if not bOk then
local _, sMsg = EgtGetLastMachMgrError()
nNotOkCount = nNotOkCount + 1
sMsgTotal = sMsgTotal ..'\n' .. ( sMsg or '')
end
end
end
return ( nNotOkCount < 1), sMsgTotal
end
-------------------------------------------------------------------------------------------------------------
function Squaring.AddScrapRemoval( nFirstOperationId)
-- pulizia sfridi alla prima lavorazione dopo la squadratura
EgtSetCurrMachining( nFirstOperationId)
local sMachiningNotes = EgtGetMachiningParam( MCH_MP.USERNOTES)
sMachiningNotes = sMachiningNotes .. 'ScrapRemove=1;'
EgtSetMachiningParam( MCH_MP.USERNOTES, sMachiningNotes)
end
-------------------------------------------------------------------------------------------------------------
return Squaring
+253
View File
@@ -0,0 +1,253 @@
-- WFeatureTopology.lua by Egaltech s.r.l. 2023/06/23
-- Libreria per classificazione topologica feature pareti
-- 2023/12/11 Modifiche varie per allineamento con Beam.
-- Tabella per definizione modulo
local WFeatureTopology = {}
-- Include
require( 'EgtBase')
-- Carico le librerie
local WL = require( 'WallLib')
EgtOutLog( ' WFeatureTopology started', 1)
---------------------------------------------------------------------
-- restituisce la matrice delle adiacenze di Proc dove i e j sono le facce e a(ij) è l'angolo tra di esse; 0 se nessuna adiacenza
local function GetAdjacencyMatrix( Proc)
local vAdj = {}
for i = 1, Proc.Fct do
vAdj[i] = {}
for j = 1, Proc.Fct do
if i == j then
vAdj[i][j] = 0
else
_, _, _, vAdj[i][j] = EgtSurfTmFacetsContact( Proc.Id, i - 1, j - 1, GDB_ID.ROOT)
if not vAdj[i][j] then vAdj[i][j] = 0 end
end
j = j + 1
end
i = i + 1
end
return vAdj
end
---------------------------------------------------------------------
-- restituisce gli id delle facce di Proc che hanno il numero di adiacenze nAdj
function WFeatureTopology.GetFacesWithGivenAdjacencyNumber( Proc, nAdj)
local vAdj = GetAdjacencyMatrix( Proc)
local vFacesWithGivenAdj = {}
for i = 1, Proc.Fct do
local nAdjCount = 0
for j = 1, Proc.Fct do
if vAdj[i][j] and vAdj[i][j] ~= 0 then
nAdjCount = nAdjCount + 1
end
end
if nAdjCount == nAdj then
table.insert( vFacesWithGivenAdj, i - 1)
end
end
return vFacesWithGivenAdj
end
---------------------------------------------------------------------
-- restituisce true se Proc ha tutti gli angoli concavi (bAllConcave) e, nei casi in cui ha senso, se questi sono esattamente 90 deg (bAllRight)
local function AreAllAnglesConcaveOrRight( Proc)
local vAdj = GetAdjacencyMatrix( Proc)
local bAllConcave, bAllRight = true, true
for i = 1, Proc.Fct do
for j = 1, Proc.Fct do
-- se trovo un angolo convesso restituisco falso e esco subito
if vAdj[i][j] and vAdj[i][j] > 0 then
bAllConcave = false
bAllRight = false
break
elseif vAdj[i][j] and vAdj[i][j] ~= 0 and vAdj[i][j] + 90 > 500 * GEO.EPS_ANG_SMALL then
bAllRight = false
end
end
end
-- se 1 faccia oppure 2 facce con angolo convesso non ha senso ritornare valori per bAllRight
if Proc.Fct < 2 or ( Proc.Fct == 2 and vAdj[1][2] > 0) then
return bAllConcave
else
return bAllConcave, bAllRight
end
end
---------------------------------------------------------------------
-- restituisce true se almeno una delle dimensioni della feature è maggiore o uguale ad una delle dimensioni principali del pezzo (tolleranza 1 mm)
local function IsAnyDimensionLongAsPart( Proc)
local bResult = false
local nBoxSolidId = EgtGetFirstNameInGroup( Proc.PartId or GDB_ID.NULL, 'Box')
local b3Solid = EgtGetBBoxGlob( nBoxSolidId, GDB_BB.STANDARD)
if Proc.Box:getDimX() > b3Solid:getDimX() - 1000 * GEO.EPS_SMALL or
Proc.Box:getDimY() > b3Solid:getDimY() - 1000 * GEO.EPS_SMALL or
Proc.Box:getDimZ() > b3Solid:getDimZ() - 1000 * GEO.EPS_SMALL then
bResult = true
end
return bResult
end
---------------------------------------------------------------------
-- retituisce un vettore con gli indici (0 based) delle facce triangolari (o quasi) di Proc
local function GetTriangularFaces( Proc)
local vTriangularFaces = {}
for i = 1, Proc.Fct do
if WL.Is3EdgesApprox( Proc, i - 1) then
table.insert( vTriangularFaces, i - 1)
end
end
return vTriangularFaces
end
---------------------------------------------------------------------
-- restituisce un vettore contenente gli indici delle facce di Proc parallele ad una delle direzioni principali; il check varia in base alla famiglia topologica
local function GetFacesParallelToPart( Proc, sFamily, bIsThrough)
local vFacesParallelToPart = {}
for i = 0, Proc.Fct - 1 do
local vtN = EgtSurfTmFacetNormVersor( Proc.Id, i, GDB_ID.ROOT)
if sFamily == 'Rabbet' or sFamily == 'Bevel' or sFamily == 'DoubleBevel' or sFamily == 'Strip' or sFamily == 'Tunnel' or ( sFamily == 'Groove' and bIsThrough) then
local vTriangularFaces = GetTriangularFaces( Proc)
local bIsTriangularFace = false
-- verifico se la faccia è triangolare
for j = 1, #vTriangularFaces do
if i == vTriangularFaces[j] then
bIsTriangularFace = true
end
end
-- se faccia triangolare deve avere la normale parallela ad una direzione principale
if bIsTriangularFace then
if AreSameOrOppositeVectorApprox( vtN, X_AX()) or AreSameOrOppositeVectorApprox( vtN, Y_AX()) or AreSameOrOppositeVectorApprox( vtN, Z_AX()) then
table.insert( vFacesParallelToPart, i)
end
-- altrimenti deve avere una componente della normale nulla
else
if abs( vtN:getX()) < 10 * GEO.EPS_SMALL or abs( vtN:getY()) < 10 * GEO.EPS_SMALL or abs( vtN:getZ()) < 10 * GEO.EPS_SMALL then
table.insert( vFacesParallelToPart, i)
end
end
else
-- la normale deve essere parallela ad una direzione principale
if AreSameOrOppositeVectorApprox( vtN, X_AX()) or AreSameOrOppositeVectorApprox( vtN, Y_AX()) or AreSameOrOppositeVectorApprox( vtN, Z_AX()) then
table.insert( vFacesParallelToPart, i)
end
end
end
return vFacesParallelToPart
end
---------------------------------------------------------------------
-- restituisce una stringa con il nome esteso della topologia della feature
-- *famiglia-passante-angoli tutti concavi a 90deg-facce tutte parallele alle dimensioni principali-numero di facce*
local function GetTopologyLongName( sFamily, bIsThrough, bAllRightAngles, bIsParallel, nNumberOfFaces)
-- feature passante o cieca
local sThrough = '_'
if bIsThrough ~= nil then sThrough = EgtIf( bIsThrough, 'Through', 'Blind') end
-- tutti gli angoli della feature sono retti oppure no
local sAllRightAngles = '_'
if bAllRightAngles ~= nil then sAllRightAngles = EgtIf( bAllRightAngles, 'RightAngles', 'NotRightAngles') end
-- tutte le dimensioni della feature sono parallele agli assi principali del pezzo oppure no
local sParallel = '_'
if bIsParallel ~= nil then sParallel = EgtIf( bIsParallel, 'Parallel', 'NotParallel') end
local sLongName = sFamily .. '-' .. sThrough .. '-' .. sAllRightAngles .. '-' .. sParallel .. '-' .. nNumberOfFaces
return sLongName
end
---------------------------------------------------------------------
-- riconosce se Proc è una delle topologie standard e, in caso positivo, ne scrive le caratteristiche in campi specifici della Proc stessa restituendo true
function WFeatureTopology.Classify( Proc, b3Raw)
if not Proc.AffectedFaces then Proc.AffectedFaces = WL.GetProcessAffectedFaces( Proc) end
if not Proc.Box or Proc.Box:isEmpty() then
return false
end
local bRecognized = false
local sFamily
local bIsThrough
local bAllRightAngles
local bIsParallel
local sLongName = ''
-- SE NON HA TUTTE LE FACCE PIANE RITORNARE NIL!!
local bAllAnglesConcave
bAllAnglesConcave, bAllRightAngles = AreAllAnglesConcaveOrRight( Proc)
local vTriangularFaces = GetTriangularFaces( Proc)
local bIsAnyDimensionLongAsPart = IsAnyDimensionLongAsPart( Proc)
local vFacesWithOneAdj = WFeatureTopology.GetFacesWithGivenAdjacencyNumber( Proc, 1)
local vFacesWithTwoAdj = WFeatureTopology.GetFacesWithGivenAdjacencyNumber( Proc, 2)
local vFacesWithThreeAdj = WFeatureTopology.GetFacesWithGivenAdjacencyNumber( Proc, 3)
local vFacesWithFourAdj = WFeatureTopology.GetFacesWithGivenAdjacencyNumber( Proc, 4)
local dRawW, dRawH, dRawL = b3Raw:getDimY(), b3Raw:getDimZ(), b3Raw:getDimX()
local bIsFeatureCuttingEntireSection = WL.IsFeatureCuttingEntireSection( Proc.Box, dRawW, dRawH, dRawL)
if Proc.IsOutline then
sFamily = 'OUTLINE'
elseif Proc.Prc == 40 then
sFamily = 'DRILLING'
elseif Proc.Fct == 1 and bIsAnyDimensionLongAsPart and bIsFeatureCuttingEntireSection then
sFamily = 'Cut'
bIsThrough = true
elseif Proc.Fct == 1 and bIsAnyDimensionLongAsPart then
sFamily = 'Bevel'
bIsThrough = true
elseif Proc.Fct == 2 and bAllAnglesConcave and #vTriangularFaces == 1 then
sFamily = 'Bevel'
bIsThrough = false
elseif Proc.Fct == 2 and bAllAnglesConcave and ( Proc.AffectedFaces.Left or Proc.AffectedFaces.Right) and ( Proc.AffectedFaces.Front or Proc.AffectedFaces.Back) then
sFamily = 'Rabbet'
bIsThrough = true
elseif Proc.Fct == 2 and bAllAnglesConcave then
sFamily = 'Groove'
bIsThrough = true
elseif Proc.Fct == 2 and not bAllAnglesConcave and bIsAnyDimensionLongAsPart then
sFamily = 'DoubleBevel'
bIsThrough = true
elseif Proc.Fct == 3 and bAllAnglesConcave and #vFacesWithTwoAdj == 1 and #vTriangularFaces == 2 then
sFamily = 'Bevel'
bIsThrough = false
elseif Proc.Fct == 3 and bAllAnglesConcave and #vFacesWithTwoAdj == 1 and bIsAnyDimensionLongAsPart then
sFamily = 'Groove'
bIsThrough = true
elseif Proc.Fct == 3 and bAllAnglesConcave and #vFacesWithTwoAdj == 3 then
sFamily = 'Groove'
bIsThrough = false
elseif Proc.Fct == 4 and bAllAnglesConcave and #vFacesWithThreeAdj == 2 then
sFamily = 'Groove'
bIsThrough = false
elseif Proc.Fct == 4 and bAllAnglesConcave and #vFacesWithTwoAdj == 4 and bIsAnyDimensionLongAsPart then
sFamily = 'Tunnel'
bIsThrough = true
elseif Proc.Fct >= 4 and #vFacesWithOneAdj == 2 and bIsAnyDimensionLongAsPart then
sFamily = 'Strip'
bIsThrough = true
elseif Proc.Fct == 5 and bAllAnglesConcave and #vFacesWithFourAdj == 1 then
sFamily = 'Pocket'
bIsThrough = false
end
local vFacesParallelToPart = GetFacesParallelToPart( Proc, sFamily, bIsThrough)
bIsParallel = ( #vFacesParallelToPart == Proc.Fct)
if sFamily == 'OUTLINE' or sFamily == 'DRILLING' then
Proc.Topology = sFamily
Proc.TopologyLongName = sFamily
bRecognized = true
elseif sFamily then
sLongName = GetTopologyLongName( sFamily, bIsThrough, bAllRightAngles, bIsParallel, Proc.Fct)
Proc.Topology, Proc.IsThrough, Proc.AllRightAngles, Proc.IsParallel, Proc.TopologyLongName = sFamily, bIsThrough, bAllRightAngles, bIsParallel, sLongName
bRecognized = true
else
Proc.Topology = 'OTHER'
Proc.TopologyLongName = 'OTHER'
end
return bRecognized
end
-------------------------------------------------------------------------------------------------------------
return WFeatureTopology
+116 -11
View File
@@ -3,8 +3,8 @@
-- 2023/03/09 Piccola correzione alla SideDepth in FindMilling
-- In FindMilling aggiunta gestione spessore e massimo materiale nel caso di lam
-- 2023/05/25 Aggiunta funzione AddMachining che incapsula EgtAddMachining trascrivendo le priorità btl dalle feature alle lavorazioni.
-- 2023/06/07 Alla funzione AddMachining aggiunta la scrittura dell'info ISOUTLINE alle lavorazioni.
-- 2023/10/18 In SetCurrMachiningAndTool sostituito controllo di utensile attivo con controllo utensile nel setup corrente.
-- 2023/11/14 Modifiche sostanziali per l'aggiunta delle lavorazioni in doppio e per il miglioramento nella gestione delle tasche.
-- Tabella per definizione modulo
local WMachiningLib = {}
@@ -56,7 +56,7 @@ function WMachiningLib.FindCutting( sType, dDepth, nTool_ID)
end
---------------------------------------------------------------------
function WMachiningLib.FindMilling( sType, dDepth, sTuuid, nTool_ID, dMaxDiam, dMaxMat, bTipFeed, dMinSideElev)
function WMachiningLib.FindMilling( sType, dDepth, sTuuid, nTool_ID, dMaxDiam, dMaxMat, bTipFeed, dMinSideElev, sHead)
for i = 1, #Millings do
local Milling = Millings[i]
if Milling.On and Milling.Type == sType and SetCurrMachiningAndTool( Milling.Name) then
@@ -70,6 +70,7 @@ function WMachiningLib.FindMilling( sType, dDepth, sTuuid, nTool_ID, dMaxDiam, d
local dTTipFeed = EgtTdbGetCurrToolParam( MCH_TP.TIPFEED)
local dTMaxDepthOnSide = EgtIf( bIsBlade, EgtTdbGetCurrToolParam( MCH_TP.MAXMAT), min( EgtTdbGetCurrToolValInNotes( MCH_TP.USERNOTES, 'SIDEDEPTH', 'd') or 999, 0.5 * ( dTDiam - dTDiamTh)))
local nMyTool_ID = EgtTdbGetCurrToolValInNotes( MCH_TP.USERNOTES, 'Tool_ID', 'i')
local sMyHead = EgtTdbGetCurrToolParam( MCH_TP.HEAD)
if nMchType == MCH_MY.MILLING and
( not sTuuid or sTuuid == sMyTuuid) and
( not dDepth or dTMaxDepth > dDepth - GEO.EPS_SMALL) and
@@ -77,7 +78,8 @@ function WMachiningLib.FindMilling( sType, dDepth, sTuuid, nTool_ID, dMaxDiam, d
( not dMaxMat or dTMaxMat < dMaxMat + GEO.EPS_SMALL) and
( not bTipFeed or dTTipFeed > 1) and
( not dMinSideElev or dTMaxDepthOnSide > dMinSideElev - GEO.EPS_SMALL) and
( not nTool_ID or nTool_ID == 0 or nTool_ID == nMyTool_ID) then
( not nTool_ID or nTool_ID == 0 or nTool_ID == nMyTool_ID) and
( not sHead or sHead == sMyHead) then
return Milling.Name, dTMaxDepth, dTMaxMat, dTDiam
end
end
@@ -100,18 +102,32 @@ function WMachiningLib.FindNailing( nType)
end
---------------------------------------------------------------------
function WMachiningLib.FindPocketing( sType, dMaxDiam, dDepth, nTool_ID)
function WMachiningLib.FindPocketing( sType, dMaxDiam, dDepth, nTool_ID, sHead, bExcludeNoTipFeed, dDistanceToNearestPart)
if not dMaxDiam then dMaxDiam = 999 end
for i = 1, #Pocketings do
local Pocketing = Pocketings[i]
if Pocketing.On and Pocketing.Type == sType and SetCurrMachiningAndTool( Pocketing.Name) then
local nMchType = EgtMdbGetCurrMachiningParam( MCH_MP.TYPE)
local dTDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM)
local dTMaxDepth = EgtIf( WD.MILL_MAX_DEPTH_AS_MAT, EgtTdbGetCurrToolParam( MCH_TP.MAXMAT), EgtTdbGetCurrToolMaxDepth())
local nMyTool_ID = EgtTdbGetCurrToolValInNotes( MCH_TP.USERNOTES, 'Tool_ID', 'i')
local nMyTool_ID = EgtTdbGetCurrToolValInNotes( MCH_TP.USERNOTES, 'Tool_ID', 'i')
local sMyHead = EgtTdbGetCurrToolParam( MCH_TP.HEAD)
local bHasTipFeed = ( EgtTdbGetCurrToolParam( MCH_TP.TIPFEED) ~= 0)
-- attacco con rampa molto lunga e step basso, utilizzabile anche con frese che non lavorano di testa
local bIsSpecialLeadIn = ( EgtMdbGetCurrMachiningParam( MCH_MP.LEADINTYPE) == MCH_POCK_LI.ZIGZAG or MCH_POCK_LI.HELIX) and
( ( EgtMdbGetCurrMachiningParam( MCH_MP.LITANG) or 0) > dTDiam - 1 - 10 * GEO.EPS_SMALL) and
( ( EgtMdbGetCurrMachiningParam( MCH_MP.LIELEV) or 999) <= 2)
local bIsSpiralOut = EgtMdbGetCurrMachiningParam( MCH_MP.SUBTYPE) == MCH_POCK_SUB.SPIRALOUT
-- se ho un altro pezzo troppo vicino riduco il diametro massimo utensile
if dDistanceToNearestPart then
dMaxDiam = min( dMaxDiam, EgtIf( bIsSpiralOut, dDistanceToNearestPart * 2 + 5, dDistanceToNearestPart + 5))
end
if nMchType == MCH_MY.POCKETING and
( not dMaxDiam or dTDiam < dMaxDiam + GEO.EPS_SMALL) and
( not dDepth or dTMaxDepth > dDepth - GEO.EPS_SMALL) and
( not nTool_ID or nTool_ID == 0 or nTool_ID == nMyTool_ID) then
( not nTool_ID or nTool_ID == 0 or nTool_ID == nMyTool_ID) and
( not sHead or sHead == sMyHead) and
( not bExcludeNoTipFeed or bHasTipFeed or bIsSpecialLeadIn) then
return Pocketing.Name, dTDiam, dTMaxDepth
end
end
@@ -132,18 +148,27 @@ function WMachiningLib.FindSawing( sType)
end
---------------------------------------------------------------------
function WMachiningLib.FindDrilling( dDiam, dDepth, sHead, bOnlyPockets)
function WMachiningLib.FindDrilling( dDiam, dDepth, sHead, bOnlyPockets, bUseMultiDrill, DrillingsToAvoid)
if bOnlyPockets == nil or not bOnlyPockets then
-- ricerca sulle forature, dal diametro maggiore al minore
for i = #Drillings, 1, -1 do
local Drilling = Drillings[i]
if Drilling.On and Drilling.Type == 'Drill' and SetCurrMachiningAndTool( Drilling.Name) then
if Drilling.On and EgtIf( bUseMultiDrill, Drilling.Type == 'MultiDrill', Drilling.Type == 'Drill') and SetCurrMachiningAndTool( Drilling.Name) then
local bIsToAvoid = false
if DrillingsToAvoid then
for j = 1, #DrillingsToAvoid do
if Drilling.Name == DrillingsToAvoid[j] then
bIsToAvoid = true
end
end
end
local nMchType = EgtMdbGetCurrMachiningParam( MCH_MP.TYPE)
local dTDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM)
local dTMaxMat = EgtTdbGetCurrToolParam( MCH_TP.MAXMAT)
local sMyHead = EgtTdbGetCurrToolParam( MCH_TP.HEAD)
if nMchType == MCH_MY.DRILLING and
dTDiam < dDiam + 10 * GEO.EPS_SMALL and dTDiam > dDiam - WD.DRILL_TOL - 10 * GEO.EPS_SMALL and
( not bIsToAvoid) and
( not dDiam or ( dTDiam < dDiam + 10 * GEO.EPS_SMALL and dTDiam > dDiam - WD.DRILL_TOL - 10 * GEO.EPS_SMALL)) and
( not dDepth or dTMaxMat > dDepth - GEO.EPS_SMALL) and
(( not sHead and sMyHead ~= 'H5' and sMyHead ~= 'H6') or sHead == sMyHead) then
return Drilling.Name, Drilling.Type, dTMaxMat
@@ -151,16 +176,29 @@ function WMachiningLib.FindDrilling( dDiam, dDepth, sHead, bOnlyPockets)
end
end
end
-- se MultiDrill non si prova il DrillPocket
if bUseMultiDrill then
return
end
-- ricerca sulle svuotature, dal diametro maggiore al minore
for i = #Drillings, 1, -1 do
local Drilling = Drillings[i]
if Drilling.On and Drilling.Type == 'Pocket' and SetCurrMachiningAndTool( Drilling.Name) then
local bIsToAvoid = false
if DrillingsToAvoid then
for j = 1, #DrillingsToAvoid do
if Drilling.Name == DrillingsToAvoid[j] then
bIsToAvoid = true
end
end
end
local nMchType = EgtMdbGetCurrMachiningParam( MCH_MP.TYPE)
local dTDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM)
local dTMaxDepth = EgtIf( WD.MILL_MAX_DEPTH_AS_MAT, EgtTdbGetCurrToolParam( MCH_TP.MAXMAT), EgtTdbGetCurrToolMaxDepth())
local sMyHead = EgtTdbGetCurrToolParam( MCH_TP.HEAD)
if nMchType == MCH_MY.POCKETING and
dTDiam < dDiam - 10 * GEO.EPS_SMALL and
( not bIsToAvoid) and
( not dDiam or ( dTDiam < dDiam - 10 * GEO.EPS_SMALL)) and
( not dDepth or dTMaxDepth > dDepth - GEO.EPS_SMALL) and
( ( not sHead and sMyHead ~= 'H5' and sMyHead ~= 'H6') or sHead == sMyHead) then
return Drilling.Name, Drilling.Type, dTMaxDepth
@@ -183,8 +221,8 @@ function WMachiningLib.FindSurfacing( sType)
end
end
-- incapsulo EgtAddMachining e trascrivo alcune informazioni utili nelle note dell'operazione
---------------------------------------------------------------------
-- incapsulo EgtAddMachining e trascrivo alcune informazioni utili nelle note dell'operazione
function WMachiningLib.AddMachining( Proc, sName, sMachining)
local nMchId, sFinalName = EgtAddMachining( sName, sMachining)
if type( Proc) == 'table' then
@@ -195,5 +233,72 @@ function WMachiningLib.AddMachining( Proc, sName, sMachining)
return nMchId, sFinalName
end
---------------------------------------------------------------------
-- verifica se utensile sToolMasterName e gemello sToolDoubleName sono compatibili con la specchiatura
function WMachiningLib.IsToolDoubleOk( sToolMasterName, sToolDoubleName)
local bIsToolDoubleOk = false
-- dimensioni utensile master
EgtTdbSetCurrTool( sToolMasterName)
local bIsBlade = ( EgtTdbGetCurrToolParam( MCH_TP.TYPE) & MCH_TF.SAWBLADE ~= 0) or false
local dTMaxMat = EgtIf( bIsBlade, EgtTdbGetCurrToolParam( MCH_TP.THICK), EgtTdbGetCurrToolParam( MCH_TP.MAXMAT))
local dTMaxDepth = EgtIf( WD.MILL_MAX_DEPTH_AS_MAT, dTMaxMat, EgtTdbGetCurrToolMaxDepth())
local dTDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM)
local dTDiamTh = EgtTdbGetCurrToolThDiam() or 0
local bHasTipFeed = EgtTdbGetCurrToolParam( MCH_TP.TIPFEED) ~= 0
local dTMaxDepthOnSide = EgtIf( bIsBlade, EgtTdbGetCurrToolParam( MCH_TP.MAXMAT), min( EgtTdbGetCurrToolValInNotes( MCH_TP.USERNOTES, 'SIDEDEPTH', 'd') or 999, 0.5 * ( dTDiam - dTDiamTh)))
local bIsPrimaryHead = EgtTdbGetCurrToolParam( MCH_TP.HEAD) == 'H1'
-- dimensioni utensile double
EgtTdbSetCurrTool( sToolDoubleName)
local bIsBladeDouble = ( EgtTdbGetCurrToolParam( MCH_TP.TYPE) & MCH_TF.SAWBLADE ~= 0) or false
local dTMaxMatDouble = EgtIf( bIsBladeDouble, EgtTdbGetCurrToolParam( MCH_TP.THICK), EgtTdbGetCurrToolParam( MCH_TP.MAXMAT))
local dTMaxDepthDouble = EgtIf( WD.MILL_MAX_DEPTH_AS_MAT, dTMaxMatDouble, EgtTdbGetCurrToolMaxDepth())
local dTDiamDouble = EgtTdbGetCurrToolParam( MCH_TP.DIAM)
local dTDiamThDouble = EgtTdbGetCurrToolThDiam() or 0
local bHasTipFeedDouble = EgtTdbGetCurrToolParam( MCH_TP.TIPFEED) ~= 0
local dTMaxDepthOnSideDouble = EgtIf( bIsBladeDouble, EgtTdbGetCurrToolParam( MCH_TP.MAXMAT), min( EgtTdbGetCurrToolValInNotes( MCH_TP.USERNOTES, 'SIDEDEPTH', 'd') or 999, 0.5 * ( dTDiamDouble - dTDiamThDouble)))
-- controllo che siano uguali ( permetto una leggera differenza di lunghezza)
local dMaxLengthDifference = 6.5
bIsToolDoubleOk = bIsPrimaryHead and
( bIsBlade == bIsBladeDouble) and
( dTMaxMatDouble > dTMaxMat - 100 * GEO.EPS_SMALL) and
( dTMaxDepthDouble > dTMaxDepth - dMaxLengthDifference) and
( abs( dTDiam - dTDiamDouble) < 100 * GEO.EPS_SMALL) and
( abs( dTDiamTh - dTDiamThDouble) < 100 * GEO.EPS_SMALL) and
( bHasTipFeed == bHasTipFeedDouble) and
( abs( dTMaxDepthOnSide - dTMaxDepthOnSideDouble) < GEO.EPS_SMALL) and
EgtFindToolInCurrSetup( sToolDoubleName)
return bIsToolDoubleOk
end
---------------------------------------------------------------------
-- verifica se la lavorazione sMachining è adatta alla specchiatura
function WMachiningLib.IsMachiningOkForDouble( sMachining)
local bDoubleOk = false
if sMachining and EgtMdbSetCurrMachining( sMachining) then
-- recupero l'utensile della lavorazione
local sToolMasterName = EgtMdbGetCurrMachiningParam( MCH_MP.TOOL)
if EgtTdbSetCurrTool( sToolMasterName or '') then
-- cerco eventuale utensile in doppio
local sToolDoubleName = EgtTdbGetCurrToolValInNotes( MCH_TP.USERNOTES, 'DOUBLE', 's')
if sToolDoubleName and EgtTdbSetCurrTool( sToolDoubleName) then
bDoubleOk = WMachiningLib.IsToolDoubleOk( sToolMasterName, sToolDoubleName)
end
end
end
return bDoubleOk
end
-------------------------------------------------------------------------------------------------------------
function WMachiningLib.GetMachiningSteps( dMachiningDepth, dStep)
local MachiningSteps = {}
MachiningSteps.dStep = 0
MachiningSteps.nCount = ceil( ( dMachiningDepth - 10 * GEO.EPS_SMALL) / dStep)
if MachiningSteps.nCount > 1 then
MachiningSteps.dStep = ( dMachiningDepth - dStep) / ( MachiningSteps.nCount - 1)
end
return MachiningSteps
end
-------------------------------------------------------------------------------------------------------------
return WMachiningLib
+15 -6
View File
@@ -1,6 +1,7 @@
-- WProcessDoubleCut.lua by Egaltech s.r.l. 2023/04/17
-- Gestione calcolo doppi tagli di lama per Pareti
-- 2023/04/17 Quando si chiama LapJoint si trasforma il Gruppo da 1 a 3 e da 2 a 4.
-- 2023/11/14 Aggiunta funzione IdentifyStrict per il riconoscimento della sola feature L011.
-- Tabella per definizione modulo
local WPDC = {}
@@ -24,19 +25,28 @@ function WPDC.Identify( Proc)
( Proc.Grp == 0 and Proc.Prc == 12))
end
---------------------------------------------------------------------
-- Riconoscimento della sola feature L011
function WPDC.IdentifyStrict( Proc)
return ( Proc.Grp == 1 or Proc.Grp == 2) and Proc.Prc == 11
end
---------------------------------------------------------------------
-- Classificazione della feature
function WPDC.Classify( Proc, b3Raw)
-- se una faccia, uso la classificazione dei tagli singoli
if Proc.Fct == 1 then return Cut.Classify( Proc, b3Raw) end
-- se più di due facce non si fa
if Proc.Fct > 2 then return false end
-- dati delle facce
-- se due facce si verifica solamente se le facce non sono troppo orientate verso il basso (per due facce unite sul lato lungo il check è fatto nella LapJoint)
local vtN = {}
vtN[1] = EgtSurfTmFacetNormVersor( Proc.Id, 0, GDB_ID.ROOT)
vtN[2] = EgtSurfTmFacetNormVersor( Proc.Id, 1, GDB_ID.ROOT)
-- verifico se è lavorabile da sopra o di fianco
return ( vtN[1]:getZ() >= - 0.01 or vtN[2]:getZ() >= - 0.01)
local bIsMachinable = ( vtN[1]:getZ() >= ( WD.CUT_VZ_MIN or - 0.5)) and ( vtN[2]:getZ() >= ( WD.CUT_VZ_MIN or - 0.5))
return bIsMachinable
end
----------------------------------------------------------------------
@@ -59,9 +69,8 @@ function WPDC.Make( Proc, nRawId, b3Raw)
-- se singola faccia, passo a quella lavorazione
if Proc.Fct == 1 then return Cut.Make( Proc, nRawId, b3Raw) end
-- altrimenti due facce e passo alla LapJoint
local LapProc = { PartId = Proc.PartId, Id = Proc.Id, Grp = Proc.Grp + 2, Prc = Proc.Prc, Box = Proc.Box, Fct = Proc.Fct, Flg = Proc.Flg,
Diam = Proc.Diam, Fcs = Proc.Fcs, Fce = Proc.Fce, CutId = Proc.CutId, TaskId = Proc.TaskId}
return LapJoint.Make( LapProc, nRawId, b3Raw)
Proc.Grp = Proc.Grp + 2
return LapJoint.Make( Proc, nRawId, b3Raw)
end
---------------------------------------------------------------------
+237 -49
View File
@@ -9,6 +9,7 @@
-- 2022/02/22 ES Aggiunta gestione prefori.
-- 2022/03/08 DS Vanno accettati fori orizzontali sul bordo anche senza foratori orizzontali speciali.
-- 2023/05/25 Funzioni EgtAddMachining sostituite da WM.AddMachining in modo da trascrivere le priorità da btl alle lavorazioni.
-- 2023/11/14 Aggiunta gestione forature in doppio.
-- Tabella per definizione modulo
local WPD = {}
@@ -26,6 +27,9 @@ local WM = require( 'WMachiningLib')
-- Parametri Q
local sContourOnly = 'Q01' -- 0=no, 1=si
-- Per forature MultiDrill, lista lavorazioni già provate
local TriedDrillings = {}
---------------------------------------------------------------------
-- Riconoscimento della feature
@@ -55,7 +59,7 @@ end
---------------------------------------------------------------------
-- Classificazione della feature
function WPD.Classify( Proc, b3Raw)
function WPD.Classify( Proc, b3Raw, bUseMultiDrill)
-- recupero e verifico l'entità foro
local AuxId = EgtGetInfo( Proc.Id, 'AUXID', 'i') or 0
@@ -74,6 +78,10 @@ function WPD.Classify( Proc, b3Raw)
-- è lavorabile se non troppo inclinato
return ( abs( vtExtr:getZ()) >= WD.DRILL_VZ_MIN)
end
-- multiforatore (cabinet)
if bUseMultiDrill then
return true
end
-- se con direzione asse Y e macchina con foratore orizzontale del giusto diametro
if WD.HOR_DRILL_DIAM and abs( dDiam - WD.HOR_DRILL_DIAM) < WD.DRILL_TOL and AreSameOrOppositeVectorApprox( vtExtr, Y_AX()) then
return true
@@ -156,6 +164,41 @@ function WPD.RotateClassify( Proc)
end
end
---------------------------------------------------------------------
local function IsToolDoubleOk( sToolMasterName, sToolDoubleName)
local bIsToolDoubleOk = false
-- dimensioni utensile master
EgtTdbSetCurrTool( sToolMasterName)
local dTMaxMat = EgtTdbGetCurrToolParam( MCH_TP.MAXMAT)
local dTDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM)
-- dimensioni utensile double
EgtTdbSetCurrTool( sToolDoubleName)
local dTMaxMatDouble = EgtTdbGetCurrToolParam( MCH_TP.MAXMAT)
local dTDiamDouble = EgtTdbGetCurrToolParam( MCH_TP.DIAM)
-- controllo che siano uguali
bIsToolDoubleOk = ( dTMaxMatDouble > dTMaxMat - 100 * GEO.EPS_SMALL) and
( abs( dTDiam - dTDiamDouble) < 100 * GEO.EPS_SMALL) and
EgtFindToolInCurrSetup( sToolDoubleName)
return bIsToolDoubleOk
end
---------------------------------------------------------------------
local function IsMachiningOkForDouble( sMachining)
local bDoubleOk = false
if sMachining and EgtMdbSetCurrMachining( sMachining) then
-- recupero l'utensile della lavorazione
local sToolMasterName = EgtMdbGetCurrMachiningParam( MCH_MP.TOOL)
if EgtTdbSetCurrTool( sToolMasterName or '') then
-- cerco eventuale utensile in doppio
local sToolDoubleName = EgtTdbGetCurrToolValInNotes( MCH_TP.USERNOTES, 'DOUBLE', 's')
if sToolDoubleName and EgtTdbSetCurrTool( sToolDoubleName) then
bDoubleOk = IsToolDoubleOk( sToolMasterName, sToolDoubleName)
end
end
end
return bDoubleOk
end
---------------------------------------------------------------------
local function IsHorizLongDrill( Proc)
-- recupero e verifico l'entità foro
@@ -219,7 +262,7 @@ end
---------------------------------------------------------------------
-- Applicazione della lavorazione
function WPD.Make( Proc, nRawId, b3Raw)
function WPD.Make( Proc, nRawId, b3Raw, bUseMultiDrill, DrillingsToAvoid)
-- recupero e verifico l'entità foro
local AuxId = EgtGetInfo( Proc.Id, 'AUXID', 'i') or 0
if AuxId then AuxId = AuxId + Proc.Id end
@@ -236,7 +279,7 @@ function WPD.Make( Proc, nRawId, b3Raw)
local bOpen = ( Proc.Fcs ~= 0 and Proc.Fce ~= 0)
-- verifico che il foro non sia fattibile solo da sotto
local bToInvert = ( vtExtr:getZ() < -0.1)
if bToInvert and ( not bOpen or Proc.Flg ~= 1) then
if bToInvert and ( not bOpen or Proc.Flg > 1) then
local sErr = 'Error : drilling from bottom impossible'
EgtOutLog( sErr)
return false, sErr
@@ -263,46 +306,74 @@ function WPD.Make( Proc, nRawId, b3Raw)
end
end
end
local sDrilling, nType = WM.FindDrilling( dDiam, dLen, sHead)
if not sDrilling then
sDrilling, nType = WM.FindDrilling( dDiam, nil, sHead)
end
if sHead and not sDrilling then
sDrilling, nType = WM.FindDrilling( dDiam, dLen)
local sDrilling, nType
if bUseMultiDrill then
sDrilling, nType = WM.FindDrilling( nil, nil, nil, nil, true, TriedDrillings)
if not sDrilling then
sDrilling, nType = WM.FindDrilling( dDiam)
return false
end
else
local bUseDLenToFindDrilling = true
sDrilling, nType = WM.FindDrilling( dDiam, dLen, sHead)
if not sDrilling then
bUseDLenToFindDrilling = false
sDrilling, nType = WM.FindDrilling( dDiam, nil, sHead)
end
-- se Proc è settata per essere specchiata cerco la lavorazione adatta e verifico possa essere effettivamente specchiata
if Proc.Double and Proc.Double == 2 then
local sDrillingBackup = sDrilling
sDrilling = WM.FindDrilling( dDiam, EgtIf( bUseDLenToFindDrilling, dLen, nil), 'H1')
if not IsMachiningOkForDouble( sDrilling) then
Proc.Double = 0
sDrilling = sDrillingBackup
end
end
if sHead and not sDrilling then
sDrilling, nType = WM.FindDrilling( dDiam, dLen)
if not sDrilling then
sDrilling, nType = WM.FindDrilling( dDiam)
end
if sDrilling then sHead = '' end
end
if sDrilling then sHead = '' end
end
local bAngledContourDrill = false
local nAngledContourDrillId = GDB_ID.NULL
local dReduceDepth = 0
local bUseTabs = false
-- se trovata svuotatura, verifico se richiesta invece contornatura
if nType == 'Pocket' then
-- recupero eventuale flag per fare sola contornatura
local nContourOnly = ( EgtGetInfo( Proc.Id, sContourOnly, 'i') or 0)
if nContourOnly == 1 then
-- imposto riduzione profondita' per evitare distacco pezzo interno
dReduceDepth = 5
-- se inclinato e passante
if abs( vtExtr:getZ()) >= WD.DRILL_VZ_MIN and abs( vtExtr:getZ()) < 0.999 and Proc.Fcs > 0 and Proc.Fce > 0 then
-- gruppo ausiliario per preforo
local nAddGrpId = WL.GetAddGroup( Proc.PartId)
-- ricavo contorno inferiore della superficie
local nAngledCircleId, nAngledCircleCnt = EgtExtractSurfTmLoops( Proc.Id, nAddGrpId)
local dMinZ = 10000
local nMinCircleId = GDB_ID.NULL
for Circleindex = 1, nAngledCircleCnt do
local b3Circle = EgtGetBBoxGlob( nAngledCircleId + Circleindex -1, GDB_BB.EXACT)
if b3Circle:getMin():getZ() < dMinZ then
nMinCircleId = nAngledCircleId + Circleindex -1
-- se passante
if Proc.Fcs > 0 and Proc.Fce > 0 then
-- se inclinato
if abs( vtExtr:getZ()) >= WD.DRILL_VZ_MIN and abs( vtExtr:getZ()) < 0.999 then
-- gruppo ausiliario per preforo
local nAddGrpId = WL.GetAddGroup( Proc.PartId)
-- ricavo contorno inferiore della superficie
local nAngledCircleId, nAngledCircleCnt = EgtExtractSurfTmLoops( Proc.Id, nAddGrpId)
local dMinZ = 10000
local nMinCircleId = GDB_ID.NULL
for Circleindex = 1, nAngledCircleCnt do
local b3Circle = EgtGetBBoxGlob( nAngledCircleId + Circleindex -1, GDB_BB.EXACT)
if b3Circle:getMin():getZ() < dMinZ then
nMinCircleId = nAngledCircleId + Circleindex -1
end
end
-- estrudo
EgtModifyCurveExtrusion( nMinCircleId, vtExtr, GDB_RT.GLOB)
EgtModifyCurveThickness( nMinCircleId, dLen)
bAngledContourDrill = true
nAngledContourDrillId = nMinCircleId
-- se non inclinato e abbastanza grande uso i tab
-- TODO se si risolve il problema dei tabs non funzionanti sotto ai 200 mm rimuovere il check sul diametro
elseif dDiam > 100 - 10 * GEO.EPS_SMALL then
bUseTabs = true
-- se non inclinato e piccolo non arrivo sul fondo
else
dReduceDepth = 5
end
-- estrudo
EgtModifyCurveExtrusion( nMinCircleId, vtExtr, GDB_RT.GLOB)
EgtModifyCurveThickness( nMinCircleId, dLen)
bAngledContourDrill = true
nAngledContourDrillId = nMinCircleId
end
sDrilling = WM.FindMilling( 'FreeContour', dLen, nil, nil, nil, nil, true)
if sDrilling then
@@ -390,11 +461,29 @@ function WPD.Make( Proc, nRawId, b3Raw)
-- aggiungo geometria
if bAngledContourDrill then
EgtSetMachiningGeometry( nAngledContourDrillId)
elseif bUseMultiDrill then
if Proc.SkippedGeometries and #Proc.SkippedGeometries > 0 then
EgtSetMachiningGeometry( Proc.SkippedGeometries)
else
local HolesGeometries = {}
-- aggiungo foro principale
table.insert( HolesGeometries, { AuxId, -1})
-- aggiungo eventuali altre geometrie connesse
if Proc.OtherGeometries and #Proc.OtherGeometries > 0 then
for i = 1, #Proc.OtherGeometries do
-- recupero geometria da lavorare
local OtherAuxId = Proc.OtherGeometries[i].Id + EgtGetInfo( Proc.OtherGeometries[i].Id, 'AUXID', 'i')
local Geometry = { OtherAuxId, -1}
table.insert( HolesGeometries, Geometry)
end
end
EgtSetMachiningGeometry( HolesGeometries)
end
else
EgtSetMachiningGeometry( {{ AuxId, -1}})
end
-- eventuale inversione
if nType == 'Drill' then
if nType == 'Drill' or nType == 'MultiDrill' then
EgtSetMachiningParam( MCH_MP.INVERT, bToInvert)
else
EgtSetMachiningParam( MCH_MP.TOOLINVERT, bToInvert)
@@ -432,7 +521,9 @@ function WPD.Make( Proc, nRawId, b3Raw)
end
-- imposto posizione braccio porta testa
local nSCC = MCH_SCC.ADIR_ZP
if AreSameOrOppositeVectorApprox( vtExtr, Z_AX()) then
if bUseMultiDrill then
nSCC = MCH_SCC.ADIR_NEAR
elseif AreSameOrOppositeVectorApprox( vtExtr, Z_AX()) then
nSCC = MCH_SCC.ADIR_YP
end
EgtSetMachiningParam( MCH_MP.SCC, nSCC)
@@ -446,37 +537,134 @@ function WPD.Make( Proc, nRawId, b3Raw)
EgtOutLog( sMyWarn .. ' (process ' .. tostring( Proc.Id) .. ')')
end
end
EgtSetMachiningParam( MCH_MP.DEPTH, dDepth)
-- Note utente
local sUserNotes = ''
if bUseMultiDrill then
local sDepth = 'TH'
EgtSetMachiningParam( MCH_MP.DEPTH_STR, sDepth)
else
EgtSetMachiningParam( MCH_MP.DEPTH, dDepth)
end
-- leggo eventuali note esistenti della lavorazione
local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES)
-- se foratura o svuotatura, dichiarazione nessuna generazione sfridi per Vmill
if nType == 'Drill' or nType == 'Pocket' then
sUserNotes = 'VMRS=0;'
sUserNotes = EgtSetValInNotes( sUserNotes, 'VMRS', 0)
end
-- se foratura
if nType == 'Drill' then
-- aggiungo alle note massima elevazione (coincide con affondamento)
sUserNotes = sUserNotes .. 'MaxElev=' .. EgtNumToString( dDepth, 1) .. ';'
sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( dDepth, 1))
-- se foro passante, aggiungo questa qualifica alle note
if bOpen then
sUserNotes = sUserNotes .. 'Open=1;'
sUserNotes = EgtSetValInNotes( sUserNotes, 'Open', 1)
end
end
-- se lavorazione in doppio aggiungo le rispettive note
if Proc.Double and Proc.Double == 2 then
sUserNotes = EgtSetValInNotes( sUserNotes, 'DOUBLE', Proc.Double)
sUserNotes = EgtSetValInNotes( sUserNotes, 'MirrorAx', Proc.MirrorAx)
end
EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes)
if bUseTabs then
local dStep = EgtGetMachiningParam( MCH_MP.STEP)
EgtSetMachiningParam( MCH_MP.STEPTYPE, MCH_MILL_ST.ONEWAY)
EgtSetMachiningParam( MCH_MP.LEAVETAB, true)
EgtSetMachiningParam( MCH_MP.TABHEIGHT, EgtClamp( dStep, 0.15 * dDepth, 0.25 * dDepth ))
EgtSetMachiningParam( MCH_MP.TABLEN, EgtClamp( 2 * dDiamT, 0.1 * dDiam, 0.2 * dDiam ))
EgtSetMachiningParam( MCH_MP.TABANGLE, 45)
EgtSetMachiningParam( MCH_MP.TABDIST, 100)
EgtSetMachiningParam( MCH_MP.TABMIN, 3)
EgtSetMachiningParam( MCH_MP.TABMAX, 3)
end
-- eseguo
if not EgtApplyMachining( true, false) then
local _, sErr = EgtGetLastMachMgrError()
EgtSetOperationMode( nMchId, false)
return false, sErr
else
local _, sWarn = EgtGetMachMgrWarning( 0)
if EgtIsMachiningEmpty() then
EgtSetOperationMode( nMchId, false)
return false, sWarn
else
sMyWarn = (sMyWarn or sWarn)
local bOk = EgtApplyMachining( true, false)
-- in caso di fori raggruppati vengono restituiti gli eventuali fori saltati
local SkippedGeometries = {}
SkippedGeometries = EgtGetMachiningSkippedGeometry()
local sMsgMaster
if bUseMultiDrill and SkippedGeometries and #SkippedGeometries > 0 then
if ( Proc.SkippedGeometries and ( #SkippedGeometries == #Proc.SkippedGeometries))
or ( Proc.OtherGeometries and ( #SkippedGeometries == #Proc.OtherGeometries + 1))
or ( not Proc.OtherGeometries and #SkippedGeometries == 1) then
EgtRemoveOperation( nMchId)
end
Proc.SkippedGeometries = SkippedGeometries
table.insert( TriedDrillings, sDrilling)
-- per provare tutte le MultiDrill disponibili si passano quelle già fatte come lavorazioni da ignorare
bOk = WPD.Make( Proc, nRawId, b3Raw, true, TriedDrillings)
-- non trovata lavorazione, si prova con le lavorazioni singole
if not bOk then
local bOkMaster = true
for i = #Proc.SkippedGeometries, 1, -1 do
local sErr
if Proc.OtherGeometries then
for j = 1, #Proc.OtherGeometries do
local AuxIdOtherGeometry = EgtGetInfo( Proc.OtherGeometries[j].Id, 'AUXID', 'i') or 0
if AuxIdOtherGeometry then AuxIdOtherGeometry = AuxIdOtherGeometry + Proc.OtherGeometries[j].Id end
if Proc.SkippedGeometries[i][1] == AuxIdOtherGeometry then
bOk, sErr = WPD.Make( Proc.OtherGeometries[j], nRawId, b3Raw, false)
if bOk then
Proc.OtherGeometries[j].bOk = true
else
Proc.OtherGeometries[j].bOk = false
end
Proc.OtherGeometries[j].sMsg = sErr
break
end
end
-- se nelle altre geometrie non è stato trovato, potrebbe essere la principale
local AuxIdProc = EgtGetInfo( Proc.Id, 'AUXID', 'i') or 0
if AuxIdProc then AuxIdProc = AuxIdProc + Proc.Id end
if Proc.SkippedGeometries[i][1] == AuxIdProc then
bOk, sErr = WPD.Make( Proc, nRawId, b3Raw, false)
if not bOk then
bOkMaster = false
end
sMsgMaster = sErr
end
-- se non ci sono altre geometrie quella da fare è sicuramente la Proc principale
else
bOk, sErr = WPD.Make( Proc, nRawId, b3Raw, false)
if not bOk then
bOkMaster = false
end
sMsgMaster = sErr
end
if bOk then
table.remove( Proc.SkippedGeometries, i)
end
end
bOk = bOkMaster
end
end
-- se presenti geometrie aggiuntive, aggiunta informazioni per output statistiche
if Proc.OtherGeometries and #Proc.OtherGeometries > 0 then
for i = 1, #Proc.OtherGeometries do
if Proc.OtherGeometries[i].bOk == nil then
Proc.OtherGeometries[i].bOk = true
Proc.OtherGeometries[i].sMsg = ''
end
end
end
if not bUseMultiDrill then
if not bOk then
local _, sErr = EgtGetLastMachMgrError()
EgtSetOperationMode( nMchId, false)
return false, sErr
else
local _, sWarn = EgtGetMachMgrWarning( 0)
if EgtIsMachiningEmpty() then
EgtSetOperationMode( nMchId, false)
return false, sWarn
else
sMyWarn = (sMyWarn or sWarn)
end
end
else
return bOk, sMsgMaster
end
-- se preforo inclinato impostato, inclinazione oltre limite impostato e foro non orizzontale
if WD.PREDRILL_DIAM and WD.PREDRILL_DIAM > 0 and vtExtr:getZ() < ( WD.PREDRILL_MINANGLE or 0.707) and vtExtr:getZ() > 0.1 then
-- gruppo ausiliario per preforo
+185 -140
View File
@@ -1,4 +1,4 @@
-- ProcessFreeContour.lua by Egaltech s.r.l. 2023/10/02
-- ProcessFreeContour.lua by Egaltech s.r.l. 2024/03/24
-- Gestione calcolo profilo libero per Pareti
-- 2021/11/15 Penna e chiodature sono sempre riportate sulla faccia sopra anche se nel progetto sono sotto.
-- 2021/12/10 In taglio con lama aggiunta gestione SCC per testa Gearbox.
@@ -25,6 +25,10 @@
-- 2023/09/21 In MakeByMill modificato SCC per correggere caso con lama su testa fresa.
-- 2023/09/26 In Is3EdgesApprox aggiunta cancellazione dei loop temporanei.
-- 2023/10/02 Correzione a MakeCustomPath per calcolare correttamente puliture spigoli di tipo 2 (Clean 30) e 3 (Gola di Scarico).
-- 2023/11/14 Spostamento di alcune funzioni in WallLib.
-- Aggiunta dei FreeContour in doppio.
-- 2023/12/13 In MakeByPocket aggiunta la possibilità di svuotare tasche passanti.
-- 2024/03/24 Sostituite funzioni di Collision Detection (EgtCDe*) con quelle di verifica interferenza (EgtTest*).
-- Tabella per definizione modulo
local WPF = {}
@@ -155,64 +159,6 @@ function WPF.FlipClassify( Proc, b3Raw)
return nFlip0, nFlip1
end
---------------------------------------------------------------------
local function TestElleShape3( nIdGeom, nNumFacet)
-- valida solo nel caso di tre facce
if nNumFacet ~= 3 then return false end
-- determino se L con una faccia terminale o U con tre facce
local bIsL = true
for i = 1, 3 do
local vFacAdj = EgtSurfTmFacetAdjacencies( nIdGeom, i - 1)[1]
-- le conto
local nCount = 0
for j = 1, #vFacAdj do
if vFacAdj[j] >= 0 then
nCount = nCount + 1
end
end
if nCount == 1 then
bIsL = false
break
end
end
return bIsL
end
---------------------------------------------------------------------
local function TestElleShape4( nIdGeom, nNumFacet)
-- valida solo nel caso di quattro facce
if nNumFacet ~= 4 then return false end
-- determino se L con due facce terminali o O
local nFac3Adj = 0
local dMinArea3 = GEO.INFINITO * GEO.INFINITO
local dMaxArea2 = 0
for i = 1, 4 do
local vFacAdj = EgtSurfTmFacetAdjacencies( nIdGeom, i - 1)[1]
-- le conto
local nCount = 0
for j = 1, #vFacAdj do
if vFacAdj[j] >= 0 then
nCount = nCount + 1
end
end
local _, dH, dV = EgtSurfTmFacetMinAreaRectangle( nIdGeom, i - 1, GDB_ID.ROOT)
local dArea = dH * dV
if nCount == 2 then
dMaxArea2 = max( dMaxArea2, dArea)
elseif nCount == 3 then
dMinArea3 = min( dMinArea3, dArea)
nFac3Adj = nFac3Adj + 1
end
end
if nFac3Adj ~= 2 then return false end
-- verifico se L profonda oppure lunga
if dMinArea3 < dMaxArea2 then
return 1
else
return 2
end
end
---------------------------------------------------------------------
local function VerifyCornerType( Proc)
-- Verifico il tipo di lavorazione su angolo :
@@ -229,6 +175,22 @@ local function IsPointOnRawLongEdges( ptCen, b3Raw)
return ( abs( ptCen:getY() - b3Raw:getMin():getY()) < 0.1 or abs( ptCen:getY() - b3Raw:getMax():getY()) < 0.1)
end
---------------------------------------------------------------------
local function IsFaceOutsideSquaring( Proc, Face, b3Squaring)
-- faccia esterna al box di squadratura
if b3Squaring then
local b3SquaringReduced = BBox3d( b3Squaring)
b3SquaringReduced:expand( -0.1)
local b3Face = EgtSurfTmGetFacetBBoxGlob( Proc.Id, Face.Fac, GDB_BB.STANDARD)
if not OverlapsXY( b3SquaringReduced, b3Face) then
EgtOutLog( 'Proc ' .. Proc.Id .. ': skipped face ' .. Face.Fac .. ' outside squaring' )
return true
end
else
return false
end
end
---------------------------------------------------------------------
local function GetOtherRegions( nPartId)
local vOthers = {}
@@ -442,9 +404,12 @@ local function GetFacesData( Proc, bOpposite, bCalclForBlade, dToolDiam, dToolMa
dLen = dLen - EgtIf( bCalclForBlade, dWhisk, 0)
nType = nType + 2
end
-- se lunghezza non significativa, non va inserito il taglio
if dLen < MIN_LEN_CUT then
nType = 4
-- se feature taglio esteremità o longitudinale ed è 1 faccia, non controllo lunghezza minima. Si controlla solo interferenza altri pezzi
if not( Proc.Prc == 10 and Proc.Fct == 1) then
-- se lunghezza non significativa, non va inserito il taglio
if dLen < MIN_LEN_CUT then
nType = 4
end
end
-- numero dei lati
local nEdges = #(EgtSurfTmFacetAdjacencies( nNewProc, i - 1)[1])
@@ -754,18 +719,17 @@ end
---------------------------------------------------------------------
local function CalcInterference( nNewProc, vtExtr, ptCentr, dDiam1, dDiam2,
dTall1, dTall2, dDiam3, dTall3)
local ptCentrGrid1 = ptCentr + ( vtExtr * 0.01)
local frOriTool = Frame3d( ptCentrGrid1, vtExtr)
local bColl1 = EgtCDeConeSolid( frOriTool, dDiam1/2, dDiam2/2, dTall1, nNewProc, 0, GDB_RT.GLOB)
local bColl1 = EgtTestConeSurface( frOriTool, dDiam1/2, dDiam2/2, dTall1, nNewProc, 0, GDB_RT.GLOB)
if bColl1 then return true end
local ptCentrGrid2 = ptCentr + ( vtExtr * ( dTall1 + 0.01))
frOriTool = Frame3d( ptCentrGrid2, vtExtr)
local bColl2 = EgtCDeCylSolid( frOriTool, dDiam2/2, (dTall2-dTall1), nNewProc, 0, GDB_RT.GLOB)
local bColl2 = EgtTestCylSurface( frOriTool, dDiam2/2, (dTall2-dTall1), nNewProc, 0, GDB_RT.GLOB)
if bColl2 then return true end
local ptCentrGrid3 = ptCentr + ( vtExtr * ( dTall2 + 0.01))
frOriTool = Frame3d( ptCentrGrid3, vtExtr)
local bColl3 = EgtCDeCylSolid( frOriTool, dDiam3/2, (dTall3-dTall2), nNewProc, 0, GDB_RT.GLOB)
local bColl3 = EgtTestCylSurface( frOriTool, dDiam3/2, (dTall3-dTall2), nNewProc, 0, GDB_RT.GLOB)
if bColl3 then return true end
-- restituisco risultato controllo collisioni
return false
@@ -797,6 +761,27 @@ local function MakeLocalSurf( ptP1, ptP2, ptP3, nAddGrpId)
return nFaceId
end
---------------------------------------------------------------------
local function GetEdgeToMachineFromVector( nSurfId, nFacet, vtOrtho)
local _, EdgesEgt = EgtSurfTmGetFacetOutlineInfo( nSurfId, nFacet, GDB_ID.ROOT)
local nEdgeIndMax = 0
local dMaxComp = - GEO.INFINITO
for i = 1, #EdgesEgt do
local vtN = EdgesEgt[i].Norm
if EdgesEgt[i].Open then
vtN = -vtN
end
local dComp = vtN * vtOrtho
if dComp > dMaxComp then
nEdgeIndMax = i -1
dMaxComp = dComp
end
end
return nEdgeIndMax
end
---------------------------------------------------------------------
local function AddMillCornerMachining( nPartId, nNewProc, nFacInd, tFacAdj, nTypeConeCut, nAddGrpId,
dToolDiam, dThick, sMilling, dOffsAng, dDepthMach,
@@ -813,9 +798,9 @@ local function AddMillCornerMachining( nPartId, nNewProc, nFacInd, tFacAdj, nTyp
-- creo superfice locale o esco
local nSurfToAdd = MakeLocalSurf( tFacAdj[7], tFacAdj[8], tFacAdj[9], nAddGrpId)
if nSurfToAdd then
local nFacCntPre = EgtSurfTmFacetCount( nNewProc)
local nFacCntPre = EgtSurfTmFacetCount( nNewProc.Id)
-- creo copia del percorso principale e gli aggiungo la nuova faccia
nNewProcLoc = EgtCopyGlob( nNewProc, nAddGrpId)
nNewProcLoc = EgtCopyGlob( nNewProc.Id, nAddGrpId)
nNewProcLoc = EgtSurfTmBySewing( nAddGrpId, {nNewProcLoc,nSurfToAdd} , true)
-- riordino le facce
ReorderFacesFromTab( nNewProcLoc, vFace)
@@ -826,7 +811,7 @@ local function AddMillCornerMachining( nPartId, nNewProc, nFacInd, tFacAdj, nTyp
return true, ''
end
else
nNewProcLoc = nNewProc
nNewProcLoc = nNewProc.Id
end
-- prendo il primo versore
local _, vtN1 = EgtSurfTmFacetCenter( nNewProcLoc, nFacInd, GDB_ID.ROOT)
@@ -883,7 +868,7 @@ local function AddMillCornerMachining( nPartId, nNewProc, nFacInd, tFacAdj, nTyp
vtCheck:rotate( Z_AX(), dOffsAng)
end
-- controllo se c'è collisione con le facce della superfice
if nTypeConeCut == 1 and CalcInterference( nNewProc, vtCheck, tFacAdj[nIdEndPoint] + Point3d( 0, 0, -dDepthMach), dDiam1, dDiam2,
if nTypeConeCut == 1 and CalcInterference( nNewProc.Id, vtCheck, tFacAdj[nIdEndPoint] + Point3d( 0, 0, -dDepthMach), dDiam1, dDiam2,
dTall1, dTall2, dDiam3, dTall3) then
local sErr = 'Collision detect from clean corner tool and surface'
EgtOutLog( sErr)
@@ -980,6 +965,8 @@ local function AddMillCornerMachining( nPartId, nNewProc, nFacInd, tFacAdj, nTyp
-- trasformo in percorso
if #pAuxId > 0 then
AuxId = EgtCurveCompo( nAddGrpId, pAuxId, true)
EgtSetInfo( AuxId, 'TASKID', nNewProc.TaskId)
EgtSetInfo( AuxId, 'CUTID', nNewProc.CutId)
end
-- se non c'é il percorso do errore
if not AuxId then
@@ -994,8 +981,8 @@ local function AddMillCornerMachining( nPartId, nNewProc, nFacInd, tFacAdj, nTyp
EgtRotate( AuxId, tFacAdj[nIdEndPoint], Z_AX(), dOffsAng, GDB_RT.GLOB)
end
-- inserisco la lavorazione
local sName = 'Clean_' .. ( EgtGetName( nNewProc) or tostring( nNewProc))
local nMchId = WM.AddMachining( nNewProc, sName, sMilling)
local sName = 'Clean_' .. ( EgtGetName( nNewProc.Id) or tostring( nNewProc.Id))
local nMchId = WM.AddMachining( nNewProc.Id, sName, sMilling)
if not nMchId then
local sErr = 'Error adding machining ' .. sName .. '-' .. sMilling
EgtOutLog( sErr)
@@ -1088,26 +1075,26 @@ local function AddMillCorner( nTypeConeCut, vFace, Proc, nRawId, b3Raw,
-- verifico se ciclo chiuso
local bClosed = ( abs( vFace[1].PrevAng) > 0.1)
-- copio la feature nel layer di appoggio
local nNewProc
local nNewProc = { CutId = Proc.CutId, TaskId = Proc.TaskId}
if nMasterNewProc then
nNewProc = nMasterNewProc
nNewProc.Id = nMasterNewProc
else
nNewProc = EgtCopyGlob( Proc.Id, nAddGrpId) or GDB_ID.NULL
nNewProc.Id = EgtCopyGlob( Proc.Id, nAddGrpId) or GDB_ID.NULL
end
local nFacCnt = EgtSurfTmFacetCount( nNewProc)
local nFacCnt = EgtSurfTmFacetCount( nNewProc.Id)
local nFacInd, dDepth, nSurfInt
local bMakeLocSurf
-- RIMUOVERE
if false and nFacCnt <= 4 then
-- recupero profondità e faccia di fondo
_, _, dDepth, _, _, nSurfInt = GetTunnelDimension( nNewProc, Proc.PartId, nAddGrpId, bClosed)
_, _, dDepth, _, _, nSurfInt = GetTunnelDimension( nNewProc.Id, Proc.PartId, nAddGrpId, bClosed)
if nSurfInt then
-- aggiungo la faccia di fondo appena calcolata
nNewProc = EgtSurfTmBySewing( nAddGrpId, { nNewProc, nSurfInt}, true)
nNewProc.Id = EgtSurfTmBySewing( nAddGrpId, { nNewProc.Id, nSurfInt}, true)
-- riordino le facce
ReorderFacesFromTab( nNewProc, vFace)
ReorderFacesFromTab( nNewProc.Id, vFace)
-- aggiorno numero di facce e assegno indice di quella di fondo (sempre ultima)
nFacCnt = EgtSurfTmFacetCount( nNewProc)
nFacCnt = EgtSurfTmFacetCount( nNewProc.Id)
nFacInd = nFacCnt - 1
else
return true
@@ -1155,7 +1142,7 @@ local function AddMillCorner( nTypeConeCut, vFace, Proc, nRawId, b3Raw,
ptLoc2 = vFace[k].PPrev
end
-- ricavo i punti e l'angolo interno
local _, ptP1, ptP2, dAng = EgtSurfTmFacetsContact( nNewProc, nFace1, nFace2, GDB_ID.ROOT)
local _, ptP1, ptP2, dAng = EgtSurfTmFacetsContact( nNewProc.Id, nFace1, nFace2, GDB_ID.ROOT)
-- se punti validi e angolo è interno e non è quasi piatto e >= 90 creo istanza
local tFacAdj = {}
if ptP1 and ptP2 and dAng < 0 and dAng < -6 and dAng > EgtIf( nTypeConeCut == 1, -(90 + 10 * GEO.EPS_SMALL), -(180-dAngleSmall + 10 * GEO.EPS_SMALL)) then
@@ -1193,8 +1180,8 @@ local function AddMillCorner( nTypeConeCut, vFace, Proc, nRawId, b3Raw,
i = i + 1
end
-- cancello la copia della superfice
if nNewProc then
EgtErase( nNewProc)
if nNewProc.Id then
EgtErase( nNewProc.Id)
end
return true
end
@@ -1212,35 +1199,6 @@ local function GetMaxDepth( vtNz, dMillDiam, dDiamTh, dMaxDepth, dFreeLen)
end
end
---------------------------------------------------------------------
-- Funzione per determinare se la faccia ha lati molto corti (trascurabili) ed è quindi approssimabile ad una 3 facce
local function Is3EdgesApprox( Proc, nFacet, nAddGrpId)
nAddGrpId = nAddGrpId or WL.GetAddGroup( Proc.PartId)
-- recupero il contorno della faccia
local nContourId, nContourCnt = EgtExtractSurfTmFacetLoops( Proc.Id, nFacet, nAddGrpId)
if not nContourId then return false end
EgtMergeCurvesInCurveCompo( nContourId)
-- recupero il numero di lati del contorno
local _, nEntityCount = EgtCurveDomain( nContourId)
if not nEntityCount then return false end
-- se sono già tre, ho finito
if nEntityCount == 3 then return true end
-- rimuovo i lati molto corti dal conteggio totale
local nEdges = nEntityCount
for i = 1, nEntityCount do
local dLength = EgtCurveCompoLength( nContourId, i - 1)
if dLength < 15 then nEdges = nEdges - 1 end
end
-- verifico il numero significativo di lati
local bResult = ( nEdges == 3)
-- cancello tutti i contorni appena creati
EgtErase( EgtTableFill( nContourId, nContourCnt))
if bResult then
EgtOutLog( 'FreeContour : Face with ' .. tostring( nEntityCount) .. ' edges skipped (approx 3 edges)')
end
return bResult
end
---------------------------------------------------------------------
local function AddMillings( sMilling, vFace, Proc, nRawId, b3Raw, nConeCut, nAddGrpId)
-- flag per fresature non passanti
@@ -1263,7 +1221,7 @@ local function AddMillings( sMilling, vFace, Proc, nRawId, b3Raw, nConeCut, nAdd
end
-- verifico se le facce hanno alcuni lati molto corti e possono quindi essere approssimate a 3 lati
for currentFace = 1, #vFace do
if Is3EdgesApprox( Proc, vFace[currentFace].Fac, nAddGrpId) then
if WL.Is3EdgesApprox( Proc, vFace[currentFace].Fac, nAddGrpId) then
vFace[currentFace].Is3EdgesApprox = true
end
end
@@ -1359,6 +1317,11 @@ local function AddMillings( sMilling, vFace, Proc, nRawId, b3Raw, nConeCut, nAdd
EgtSetMachiningParam( MCH_MP.INVERT, false)
-- assegno utilizzo faccia
EgtSetMachiningParam( MCH_MP.FACEUSE, MCH_MILL_FU.PARAL_DOWN)
local nEdgeFaceUse = GetEdgeToMachineFromVector( Proc.Id, vFace[i].Fac, Z_AX())
if nEdgeFaceUse then
local sNoteEdgeFaceUse = 'EdgesFaceUse=' .. EgtNumToString( nEdgeFaceUse) .. ';'
EgtSetMachiningParam( MCH_MP.USERNOTES, sNoteEdgeFaceUse)
end
-- assegno affondamento
EgtSetMachiningParam( MCH_MP.DEPTH, dDepth)
-- assegno lato di lavoro
@@ -1369,6 +1332,8 @@ local function AddMillings( sMilling, vFace, Proc, nRawId, b3Raw, nConeCut, nAdd
nSCC = EgtIf( abs( vFace[i].Norm:getX()) > abs( vFace[i].Norm:getY()), MCH_SCC.ADIR_XP, MCH_SCC.ADIR_YP)
end
EgtSetMachiningParam( MCH_MP.SCC, nSCC)
-- scrivo nell'operazione il vettore normale alla superfice che servirà per il doppio
EgtSetInfo( nMchId or GDB_ID.NULL, 'NORM_SUM', vFace[i].Norm)
-- eseguo
if not EgtApplyMachining( true, false) then
local _, sErr = EgtGetLastMachMgrError()
@@ -1510,6 +1475,13 @@ local function AddMillings( sMilling, vFace, Proc, nRawId, b3Raw, nConeCut, nAdd
EgtSetMachiningParam( MCH_MP.INVERT, false)
-- assegno utilizzo faccia
EgtSetMachiningParam( MCH_MP.FACEUSE, MCH_MILL_FU.PARAL_DOWN)
if #vGeom == 1 then
local nEdgeFaceUse = GetEdgeToMachineFromVector( Proc.Id, vGeom[1][2], Z_AX())
if nEdgeFaceUse then
local sNoteEdgeFaceUse = 'EdgesFaceUse=' .. EgtNumToString( nEdgeFaceUse) .. ';'
EgtSetMachiningParam( MCH_MP.USERNOTES, sNoteEdgeFaceUse)
end
end
-- assegno affondamento
EgtSetMachiningParam( MCH_MP.DEPTH, dDepth)
-- assegno lato di lavoro
@@ -1534,6 +1506,13 @@ local function AddMillings( sMilling, vFace, Proc, nRawId, b3Raw, nConeCut, nAdd
EgtSetMachiningParam( MCH_MP.INVERT, false)
-- assegno utilizzo faccia
EgtSetMachiningParam( MCH_MP.FACEUSE, MCH_MILL_FU.PARAL_DOWN)
if #vGeom == 1 then
local nEdgeFaceUse = GetEdgeToMachineFromVector( Proc.Id, vGeom[1][2], Z_AX())
if nEdgeFaceUse then
local sNoteEdgeFaceUse = 'EdgesFaceUse=' .. EgtNumToString( nEdgeFaceUse) .. ';'
EgtSetMachiningParam( MCH_MP.USERNOTES, sNoteEdgeFaceUse)
end
end
-- assegno affondamento
-- EgtSetMachiningParam( MCH_MP.DEPTH, dDepth)
if bNotThrou then
@@ -1566,6 +1545,15 @@ local function AddMillings( sMilling, vFace, Proc, nRawId, b3Raw, nConeCut, nAdd
-- posizione braccio porta testa
EgtSetMachiningParam( MCH_MP.SCC, MCH_SCC.ADIR_XP)
end
--scrivo nell'operazione il vettore somma delle normali alle superfici che servirà per il doppio
local vtNSum = Vector3d( 0, 0, 0)
if Proc.Face and #Proc.Face > 0 then
for iGeom = 1, #vGeom do
local nFace = vGeom[iGeom][2]
vtNSum = vtNSum + Proc.Face[ nFace + 1].VtN
end
end
EgtSetInfo( nMchId or GDB_ID.NULL, 'NORM_SUM', vtNSum)
-- eseguo
if not EgtApplyMachining( true, false) then
local _, sErr = EgtGetLastMachMgrError()
@@ -1618,6 +1606,11 @@ local function AddMillings( sMilling, vFace, Proc, nRawId, b3Raw, nConeCut, nAdd
EgtSetMachiningParam( MCH_MP.INVERT, false)
-- assegno utilizzo faccia
EgtSetMachiningParam( MCH_MP.FACEUSE, MCH_MILL_FU.PARAL_DOWN)
local nEdgeFaceUse = GetEdgeToMachineFromVector( Proc.Id, vFace[i].Fac, Z_AX())
if nEdgeFaceUse then
local sNoteEdgeFaceUse = 'EdgesFaceUse=' .. EgtNumToString( nEdgeFaceUse) .. ';'
EgtSetMachiningParam( MCH_MP.USERNOTES, sNoteEdgeFaceUse)
end
-- assegno affondamento
EgtSetMachiningParam( MCH_MP.DEPTH, dDepth)
-- assegno lato di lavoro
@@ -1628,6 +1621,8 @@ local function AddMillings( sMilling, vFace, Proc, nRawId, b3Raw, nConeCut, nAdd
nSCC = EgtIf( abs( vFace[i].Norm:getX()) > abs( vFace[i].Norm:getY()), MCH_SCC.ADIR_XP, MCH_SCC.ADIR_YP)
end
EgtSetMachiningParam( MCH_MP.SCC, nSCC)
-- scrivo nell'operazione il vettore normale alla superfice che servirà per il doppio
EgtSetInfo( nMchId or GDB_ID.NULL, 'NORM_SUM', vFace[i].Norm)
-- eseguo
if not EgtApplyMachining( true, false) then
local _, sErr = EgtGetLastMachMgrError()
@@ -1776,13 +1771,13 @@ local function AddSawings( sSawing, vFace, Proc, nRawId, b3Raw)
end
---------------------------------------------------------------------
local function AddCuts( sCutting, vFace, Proc, nRawId, b3Raw, dSawThick)
local function AddCuts( sCutting, vFace, Proc, nRawId, b3Raw, dSawThick, b3Squaring)
-- verifico se ciclo chiuso
local bClosed = ( abs( vFace[1].PrevAng) > 0.1)
-- ciclo di inserimento dei tagli sulle facce del contorno in esame
for i = 1, #vFace do
-- verifico se faccia da saltare, perchè macchina travi e faccia su bordo longitudinale esterno già finito
local bToSkip = ( WD.BEAM_MACHINE and IsPointOnRawLongEdges( vFace[i].Cen, b3Raw))
-- verifico se faccia da saltare, perchè macchina travi e faccia su bordo longitudinale esterno già finito oppure se faccia fuori dal box di squadratura
local bToSkip = ( WD.BEAM_MACHINE and IsPointOnRawLongEdges( vFace[i].Cen, b3Raw)) or IsFaceOutsideSquaring( Proc, vFace[i], b3Squaring)
-- se non è faccia da saltare, inserisco il taglio di lama
if not bToSkip and vFace[i].Type ~= 4 then
-- indice del successivo
@@ -1912,7 +1907,7 @@ local function AddCuts( sCutting, vFace, Proc, nRawId, b3Raw, dSawThick)
end
---------------------------------------------------------------------
local function MakeByCut( Proc, nRawId, b3Raw)
local function MakeByCut( Proc, nRawId, b3Raw, b3Squaring)
local sWarn = ''
-- ingombro del pezzo
local Ls = EgtGetFirstNameInGroup( Proc.PartId, 'Box')
@@ -1958,9 +1953,9 @@ local function MakeByCut( Proc, nRawId, b3Raw)
-- gruppo ausiliario
local nAddGrpId = WL.GetAddGroup( Proc.PartId)
-- recupero i dati di tutte le facce
local vFace, dMaxWidth, nNewProc = GetFacesData( Proc, bOpposite, true, dSawDiam, dSawMaxDepth, dSawThick, nAddGrpId, b3Raw, nil)
local vFace, dMaxWidth, nNewProc = GetFacesData( Proc, bOpposite, true, dSawDiam, dSawMaxDepth, dSawThick, nAddGrpId, b3Raw)
-- inserimento dei tagli di lama
local bCtOk, sCtErr = AddCuts( sCutting, vFace, Proc, nRawId, b3Raw, dSawThick)
local bCtOk, sCtErr = AddCuts( sCutting, vFace, Proc, nRawId, b3Raw, dSawThick, b3Squaring)
if not bCtOk then return bCtOk, sCtErr end
-- se richiesta solo lama, esco
local nCntType = EgtGetInfo( Proc.Id, 'CNT_TYPE', 'i') or 0
@@ -2172,9 +2167,15 @@ local function MakeByMill( Proc, nRawId, b3Raw)
EgtSetMachiningParam( MCH_MP.WORKSIDE, MCH_MILL_WS.LEFT)
elseif ( Proc.Grp == 3 and bToolInv) or ( Proc.Grp == 4 and not bToolInv) then
EgtSetMachiningParam( MCH_MP.WORKSIDE, MCH_MILL_WS.RIGHT)
elseif ( Proc.Grp == 1 or Proc.Grp == 2) then
if bToolInv then
EgtSetMachiningParam( MCH_MP.WORKSIDE, MCH_MILL_WS.LEFT)
else
EgtSetMachiningParam( MCH_MP.WORKSIDE, MCH_MILL_WS.RIGHT)
end
end
-- se lamatura affondata speciale, setto attacco e stacco al centro
-- se lamatura affondata speciale (cliente 90480029), setto attacco e stacco al centro
local bIsRecessedCounterBore = ( Proc.Box:getMax():getZ() < b3Raw:getMax():getZ() + 10 * GEO.EPS_SMALL) and
( nTool_ID == WD.RECESSED_COUNTERBORE_TOOLID or 0) and
( EgtCurveIsACircle( AuxId))
@@ -2194,12 +2195,16 @@ local function MakeByMill( Proc, nRawId, b3Raw)
EgtSetMachiningParam( MCH_MP.LOELEV, 0)
-- imposto step
local dMaxMat = EgtTdbGetCurrToolParam( MCH_TP.MAXMAT) or 0
local dStep = EgtGetMachiningParam( MCH_MP.STEP)
if dStep < GEO.EPS_SMALL then dStep = 0.75 * dMaxMat end
local nStep = ceil( ( dDepth - dMaxMat) / dStep)
dStep = max( ( dDepth - dMaxMat) / max( nStep, 1), 0)
local dMaxElev = max( ( nStep + 1) * dStep - GEO.EPS_SMALL, 0)
EgtSetMachiningParam( MCH_MP.STEP, dStep)
--
-- su richiesta del cliente 90480029 si usa sempre step unico a prescindere dalla geometria
--
-- local dStep = EgtGetMachiningParam( MCH_MP.STEP)
-- if dStep < GEO.EPS_SMALL then dStep = 0.75 * dMaxMat end
-- local nStep = ceil( ( dDepth - dMaxMat) / dStep)
-- dStep = max( ( dDepth - dMaxMat) / max( nStep, 1), 0)
-- local dMaxElev = max( ( nStep + 1) * dStep - GEO.EPS_SMALL, 0)
EgtSetMachiningParam( MCH_MP.STEP, dMaxMat)
local dMaxElev = dMaxMat
-- imposto elevazione e forzo attacco dal lato aperto
EgtSetMachiningParam( MCH_MP.USERNOTES, 'MaxElev=' .. EgtNumToString( dMaxElev, 1) .. ';OutRaw=3;')
end
@@ -2424,6 +2429,7 @@ end
---------------------------------------------------------------------
local function MakeByPocket( Proc, nRawId, b3Raw)
-- recupero e verifico l'entità curva
local nAddGrpId = WL.GetAddGroup( Proc.PartId)
local bOpposite = false
local AuxId = EgtGetInfo( Proc.Id, 'AUXID', 'i') or 0
local vtExtr
@@ -2456,11 +2462,48 @@ local function MakeByPocket( Proc, nRawId, b3Raw)
break
end
end
if not nFacet then
return MakeByMill( Proc, nRawId, b3Raw)
-- se tasca verticale si permette la svuotatura anche se passante, lavorando la faccia di fondo aggiunta
local nProcTmWithAddedBottomSurfaceId
if not nFacet and not bPocketBotface and Proc.AffectedFaces.Top and Proc.AffectedFaces.Bottom and AreSameOrOppositeVectorApprox( vtExtr, Z_AX()) then
local nFirstLoopId, nLoopsCount = EgtExtractSurfTmLoops( Proc.Id, nAddGrpId)
local dMinZ = GEO.INFINITO
local nBottomLoopId = GDB_ID.NULL
for i = 1, nLoopsCount do
local nCurrentLoopId = nFirstLoopId + i - 1
local b3Loop = EgtGetBBoxGlob( nCurrentLoopId, GDB_BB.STANDARD)
local dCurrentZ = b3Loop:getMin():getZ()
if dCurrentZ < dMinZ then
dMinZ = dCurrentZ
nBottomLoopId = nCurrentLoopId
end
end
local nAddedBottomSurface = EgtSurfTmByFlatContour( nAddGrpId, nBottomLoopId)
local vtNAddedBottomSurface = EgtSurfTmFacetNormVersor( nAddedBottomSurface, 0)
if AreOppositeVectorApprox( vtNAddedBottomSurface, Z_AX()) then EgtInvertSurf( nAddedBottomSurface) end
nProcTmWithAddedBottomSurfaceId = EgtSurfTmBySewing( nAddGrpId, { nAddedBottomSurface, Proc.Id}, false)
if nProcTmWithAddedBottomSurfaceId then
-- ricerco la faccia di fondo della trimesh (gli id potrebbero essere cambiati)
for i = 1, Proc.Fct do
local vtN = EgtSurfTmFacetNormVersor( nProcTmWithAddedBottomSurfaceId, i-1, GDB_ID.ROOT)
if abs( vtN * vtExtr) > 0.99 then
nFacet = i - 1
break
end
end
end
-- elimino le geometrie che non servono più
for i = 1, nLoopsCount do
EgtErase( nFirstLoopId + i - 1)
end
EgtErase( nAddedBottomSurface)
end
if not nFacet then
return MakeByMill( Proc, nRawId, b3Raw, b3Squaring)
end
-- se ho creato la faccia di fondo utilizzo quella
local nSurfId = nProcTmWithAddedBottomSurfaceId or Proc.Id
-- se la faccia di fondo ha confini aperti, devo lavorarla direttamente
local vAdj = EgtSurfTmFacetAdjacencies( Proc.Id, nFacet)[1] or {}
local vAdj = EgtSurfTmFacetAdjacencies( nSurfId, nFacet)[1] or {}
for i = 1, #vAdj do
if vAdj[i] == - 1 then
bPocketBotface = true
@@ -2471,16 +2514,15 @@ local function MakeByPocket( Proc, nRawId, b3Raw)
local dDepth = EgtIf( bPocketBotface, 0, abs( EgtCurveThickness( AuxId)))
local dOriDepth = dDepth
-- dati della faccia di fondo
local _, dH, dV = EgtSurfTmFacetMinAreaRectangle( Proc.Id, nFacet, GDB_ID.ROOT)
local _, dH, dV = EgtSurfTmFacetMinAreaRectangle( nSurfId, nFacet, GDB_ID.ROOT)
local dDiam = min( dH, dV)
local dElev = WL.GetFaceElevation( Proc.Id, nFacet, nRawId)
local dElev = WL.GetFaceElevation( nSurfId, nFacet, nRawId)
-- gruppo ausiliario
local nAddGrpId = WL.GetAddGroup( Proc.PartId)
local nNewProc, nNumFacet = RemoveBottomFaceAndReorder( Proc, nAddGrpId, nFacet)
-- se ho forma a L
local bIsL = ( nNumFacet == 2 or TestElleShape3( nNewProc, nNumFacet) or TestElleShape4( nNewProc, nNumFacet) == 2)
local bIsL = ( nNumFacet == 2 or WL.TestElleShape3( nNewProc, nNumFacet) or WL.TestElleShape4( nNewProc, nNumFacet) == 2)
-- verifico se U
local bIsU = ( nNumFacet == 3 and not TestElleShape3( nNewProc, nNumFacet))
local bIsU = ( nNumFacet == 3 and not WL.TestElleShape3( nNewProc, nNumFacet))
local dMiddleFacetLength = 0
if bIsU then
local _, dH2, dV2 = EgtSurfTmFacetMinAreaRectangle( nNewProc, 1, GDB_ID.ROOT)
@@ -2514,7 +2556,7 @@ local function MakeByPocket( Proc, nRawId, b3Raw)
end
end
-- inserisco la lavorazione di svuotatura
local sName = 'Pock_' .. ( EgtGetName( Proc.Id) or tostring( Proc.Id))
local sName = 'Pock_' .. ( EgtGetName( nSurfId) or tostring( nSurfId))
local nMchFId = WM.AddMachining( Proc, sName, sPocketing)
if not nMchFId then
local sErr = 'Error adding machining ' .. sName .. '-' .. sPocketing
@@ -2524,7 +2566,7 @@ local function MakeByPocket( Proc, nRawId, b3Raw)
EgtSetInfo( nMchFId, 'Part', Proc.PartId)
-- aggiungo geometria
if bPocketBotface then
EgtSetMachiningGeometry( {{ Proc.Id, nFacet}})
EgtSetMachiningGeometry( {{ nSurfId, nFacet}})
else
EgtSetMachiningGeometry( {{ AuxId, -1}})
end
@@ -2557,7 +2599,7 @@ local function MakeByPocket( Proc, nRawId, b3Raw)
local bAppOk = EgtApplyMachining( true, false)
if not bAppOk and not bPocketBotface then
bPocketBotface = true
EgtSetMachiningGeometry( {{ Proc.Id, nFacet}})
EgtSetMachiningGeometry( {{ nSurfId, nFacet}})
dDepth = 0
local dThElev = dThDiam / 2 * sqrt( vtExtr:getX() * vtExtr:getX() + vtExtr:getY() * vtExtr:getY())
if dElev + dThElev > dMaxDepth + 10 * GEO.EPS_SMALL then
@@ -2589,7 +2631,7 @@ local function MakeByPocket( Proc, nRawId, b3Raw)
else
EgtErase( nNewProc)
if nConeCut == 1 then
local sErr = 'Clean corner 60° not applid because thickness: ' .. EgtNumToString( dThick, 2) ..
local sErr = 'Clean corner 60° not applied because thickness: ' .. EgtNumToString( dThick, 2) ..
' is bigger than parameter MAX_CLEAN_CRN60: ' .. EgtNumToString( WD.MAX_CLEAN_CRN60 , 2)
EgtOutLog( sErr)
elseif nConeCut == 2 then
@@ -2603,7 +2645,7 @@ end
---------------------------------------------------------------------
-- Applicazione della lavorazione
function WPF.Make( Proc, nRawId, b3Raw, vNLO)
function WPF.Make( Proc, nRawId, b3Raw, vNLO, b3Squaring)
-- recupero la tipologia (contorno o tasca)
local bPocket = ( EgtGetInfo( Proc.Id, 'PCKT', 'i') == 1)
-- se svuotatura
@@ -2615,6 +2657,9 @@ function WPF.Make( Proc, nRawId, b3Raw, vNLO)
ReorderFaces( Proc.Id, EgtSurfTmFacetCount( Proc.Id))
-- recupero il tipo di lavorazione
local nCntType = EgtGetInfo( Proc.Id, 'CNT_TYPE', 'i') or 0
if WD.FORCE_MILL_CONTOUR == true then
nCntType = 2
end
-- se fresatura
if nCntType == 2 then
return MakeByMill( Proc, nRawId, b3Raw)
@@ -2626,7 +2671,7 @@ function WPF.Make( Proc, nRawId, b3Raw, vNLO)
return MakeByNail( Proc, nRawId, b3Raw, vNLO)
-- altrimenti, taglio con lama e pulizia angoli con fresa
else
return MakeByCut( Proc, nRawId, b3Raw)
return MakeByCut( Proc, nRawId, b3Raw, b3Squaring)
end
end
end
File diff suppressed because it is too large Load Diff
+5 -1
View File
@@ -29,7 +29,11 @@ function WPSC.Classify( Proc, b3Raw)
if not AuxId then return false end
AuxId = AuxId + Proc.Id
local vtDir = EgtSV( AuxId, GDB_ID.ROOT)
return ( vtDir:getZ() > 0.5)
local vtDirZ = vtDir:getZ()
if Proc.IsThrough then
vtDirZ = abs( vtDir:getZ())
end
return ( vtDirZ > 0.5)
end
----------------------------------------------------------------------
+748 -55
View File
@@ -1,10 +1,15 @@
-- WallExec.lua by Egaltech s.r.l. 2023/10/16
-- WallExec.lua by Egaltech s.r.l. 2024/02/20
-- Libreria esecuzione lavorazioni per Pareti
-- 2023/05/25 Aggiunto ordinamento in base a priorità da btl.
-- 2023/06/07 Nel caso di outline con priorità aggiunta la rimozione degli sfridi nella lavorazione successiva.
-- 2023/06/27 Aggiunte origini TN e BN.
-- 2023/07/04 Se c'è funzione di macchina WD.GetOrigCorner si lascia scegliere posizione default a questa impostando 0 se non c'è 'REFPOS'.
-- 2023/10/16 Aggiunta gestione Aree vietate (LockOut) per chiodature.
-- 2023/11/14 Modifiche sostanziali per l'aggiunta delle lavorazioni in doppio.
-- In Collect aggiunto il recupero preliminare di varie informazioni sulla feature.
-- 2023/12/11 In ClassifyTopology si passa ora anche l'Id del grezzo (allineamento Topology con Beam).
-- 2024/02/20 Aggiunta gestione DeltaX/Y/Z del pannello dall'origine da BTL.
-- 2024/08/30 Aggiunta nota altezza sottopezzo, per pareti a layer
-- Tabella per definizione modulo
local WallExec = {}
@@ -25,6 +30,7 @@ if WALL and WALL.NESTINGCORNERBL then WD.NESTING_CORNER = 'BL' end
-- Carico le librerie
_G.package.loaded.WMachiningLib = nil
_G.package.loaded.WallLib = nil
_G.package.loaded.WFeatureTopology = nil
_G.package.loaded.WProcessCut = nil
_G.package.loaded.WProcessDoubleCut = nil
_G.package.loaded.WProcessSawCut = nil
@@ -38,6 +44,8 @@ _G.package.loaded.WProcessFreeContour = nil
_G.package.loaded.WProcessVariant = nil
local WM = require( 'WMachiningLib')
local WL = require( 'WallLib')
local Topology = require( 'WFeatureTopology')
local Squaring = require( 'Squaring')
local Cut = require( 'WProcessCut')
local DoubleCut = require( 'WProcessDoubleCut')
local SawCut = require( 'WProcessSawCut')
@@ -50,9 +58,58 @@ local Text = require( 'WProcessText')
local FreeContour = require( 'WProcessFreeContour')
local Variant = require( 'WProcessVariant')
-------------------------------------------------------------------------------------------------------------
-- *** Inserimento delle pareti nel pannello ***
-------------------------------------------------------------------------------------------------------------
local function GetRawOrigAndDeltas()
-- Area tavola
local b3Tab = EgtGetTableArea()
-- Calcolo posizione estremo di riferimento della tavola rispetto a sua origine in BL
local sOrigCorner = WD.ORIG_CORNER or 'BR'
local BtlInfoId = EgtGetFirstNameInGroup( GDB_ID.ROOT, 'BtlInfo') or GDB_ID.NULL
if WD.GetOrigCorner then
sOrigCorner = WD.GetOrigCorner( EgtGetInfo( BtlInfoId, 'REFPOS', 'i') or 0)
end
-- offset da interfaccia
local dDeltaXFromBtl = EgtGetInfo( BtlInfoId, 'PANELDELTAY', 'd') or 0
local dDeltaYFromBtl = EgtGetInfo( BtlInfoId, 'PANELDELTAX', 'd') or 0
local dDeltaZFromBtl = EgtGetInfo( BtlInfoId, 'PANELDELTAZ', 'd') or 0
-- se da interfaccia arriva un valore > 0 si usa quello, altrimenti si legge da WallData (default 0)
local DeltaX = EgtIf( dDeltaXFromBtl > 0, dDeltaXFromBtl, WD.DELTA_X or 0)
local DeltaY = EgtIf( dDeltaYFromBtl > 0, dDeltaYFromBtl, WD.DELTA_Y or 0)
local DeltaZ = EgtIf( dDeltaZFromBtl > 0, dDeltaZFromBtl, WD.DELTA_Z or 0)
local nCorner
local OrigOnTab
if sOrigCorner == 'TL' then
nCorner = MCH_CR.TL
OrigOnTab = Point3d( 0 + abs( DeltaX), b3Tab:getDimY() - abs( DeltaY), DeltaZ)
elseif sOrigCorner == 'BL' then
nCorner = MCH_CR.BL
OrigOnTab = Point3d( 0 + abs( DeltaX), abs( DeltaY), DeltaZ)
elseif sOrigCorner == 'TR' then
nCorner = MCH_CR.TR
OrigOnTab = Point3d( b3Tab:getDimX() - abs( DeltaX), b3Tab:getDimY() - abs( DeltaY), DeltaZ)
elseif sOrigCorner == 'BR' then
nCorner = MCH_CR.BR
OrigOnTab = Point3d( b3Tab:getDimX() - abs( DeltaX), abs( DeltaY), DeltaZ)
elseif sOrigCorner == 'TM' then
nCorner = MCH_CR.TR
OrigOnTab = Point3d( WD.MID_REF - abs( DeltaX), b3Tab:getDimY() - abs( DeltaY), DeltaZ)
elseif sOrigCorner == 'BM' then
nCorner = MCH_CR.BR
OrigOnTab = Point3d( WD.MID_REF - abs( DeltaX), abs( DeltaY), DeltaZ)
elseif sOrigCorner == 'TN' then
nCorner = MCH_CR.TL
OrigOnTab = Point3d( WD.NEW_REF + abs( DeltaX), b3Tab:getDimY() - abs( DeltaY), DeltaZ)
elseif sOrigCorner == 'BN' then
nCorner = MCH_CR.BL
OrigOnTab = Point3d( WD.NEW_REF + abs( DeltaX), abs( DeltaY), DeltaZ)
end
return sOrigCorner, nCorner, OrigOnTab
end
-------------------------------------------------------------------------------------------------------------
function WallExec.ProcessWalls( dRawL, dRawW, dRawH, vWall, bMachGroupOk, bNewProcess, nRawOutlineId)
@@ -69,40 +126,8 @@ function WallExec.ProcessWalls( dRawL, dRawW, dRawH, vWall, bMachGroupOk, bNewPr
-- Impostazione della tavola
EgtSetTable( 'Tab')
-- Area tavola
local b3Tab = EgtGetTableArea()
-- Calcolo posizione estremo di riferimento della tavola rispetto a sua origine in BL
local OrigOnTab
local nCorner
local sOrigCorner = WD.ORIG_CORNER or 'BR'
if WD.GetOrigCorner then
sOrigCorner = WD.GetOrigCorner( EgtGetInfo( EgtGetFirstNameInGroup( GDB_ID.ROOT, 'BtlInfo') or GDB_ID.NULL, 'REFPOS', 'i') or 0)
end
if sOrigCorner == 'TL' then
nCorner = MCH_CR.TL
OrigOnTab = Point3d( 0 + abs( WD.DELTA_X or 0), b3Tab:getDimY() - abs( WD.DELTA_Y or 0), ( WD.DELTA_Z or 0))
elseif sOrigCorner == 'BL' then
nCorner = MCH_CR.BL
OrigOnTab = Point3d( 0 + abs( WD.DELTA_X or 0), abs( WD.DELTA_Y or 0), ( WD.DELTA_Z or 0))
elseif sOrigCorner == 'TR' then
nCorner = MCH_CR.TR
OrigOnTab = Point3d( b3Tab:getDimX() - abs( WD.DELTA_X or 0), b3Tab:getDimY() - abs( WD.DELTA_Y or 0), ( WD.DELTA_Z or 0))
elseif sOrigCorner == 'BR' then
nCorner = MCH_CR.BR
OrigOnTab = Point3d( b3Tab:getDimX() - abs( WD.DELTA_X or 0), abs( WD.DELTA_Y or 0), ( WD.DELTA_Z or 0))
elseif sOrigCorner == 'TM' then
nCorner = MCH_CR.TR
OrigOnTab = Point3d( WD.MID_REF - abs( WD.DELTA_X or 0), b3Tab:getDimY() - abs( WD.DELTA_Y or 0), ( WD.DELTA_Z or 0))
elseif sOrigCorner == 'BM' then
nCorner = MCH_CR.BR
OrigOnTab = Point3d( WD.MID_REF - abs( WD.DELTA_X or 0), abs( WD.DELTA_Y or 0), ( WD.DELTA_Z or 0))
elseif sOrigCorner == 'TN' then
nCorner = MCH_CR.TL
OrigOnTab = Point3d( WD.NEW_REF + abs( WD.DELTA_X or 0), b3Tab:getDimY() - abs( WD.DELTA_Y or 0), ( WD.DELTA_Z or 0))
elseif sOrigCorner == 'BN' then
nCorner = MCH_CR.BL
OrigOnTab = Point3d( WD.NEW_REF + abs( WD.DELTA_X or 0), abs( WD.DELTA_Y or 0), ( WD.DELTA_Z or 0))
end
-- Recupero dati posizionamento grezzo
local sOrigCorner, nCorner, OrigOnTab = GetRawOrigAndDeltas()
-- Impostazione dell'attrezzaggio di default
EgtImportSetup()
-- Impostazione eventuale allargamento area disponibile per grezzo
@@ -115,6 +140,7 @@ function WallExec.ProcessWalls( dRawL, dRawW, dRawH, vWall, bMachGroupOk, bNewPr
nRaw = EgtAddRawPart( Point3d( 0, 0, 0), dRawL, dRawW, dRawH, WD.RAWCOL)
end
EgtMoveToCornerRawPart( nRaw, OrigOnTab, nCorner)
EgtSetInfo( nRaw, 'ORIGCORNER', sOrigCorner)
EgtSetInfo( nRaw, 'ORD', 1)
-- Inserimento dei pezzi nel grezzo
for i = 1, #vWall do
@@ -149,6 +175,7 @@ function WallExec.ProcessWalls( dRawL, dRawW, dRawH, vWall, bMachGroupOk, bNewPr
end
else
local dPosH = EgtIf( vWall[i].PosY < 0.1, ( dRawH - PartHeight) / 2, vWall[i].PosY)
EgtSetInfo( nRaw, 'SUBPIECE', dPosH)
ptPos = Point3d( dRawL - vWall[i].PosX - PartLen, vWall[i].PosZ, dPosH) + vtOffs
end
EgtAddPartToRawPart( Pz, ptPos, nRaw)
@@ -156,10 +183,27 @@ function WallExec.ProcessWalls( dRawL, dRawW, dRawH, vWall, bMachGroupOk, bNewPr
return true
end
-------------------------------------------------------------------------------------------------------------
function WallExec.MoveRaw()
-- Recupero dati posizionamento grezzo
local sOrigCorner, nCorner, OrigOnTab = GetRawOrigAndDeltas()
-- Recupero identificativo del grezzo
local nRaw = EgtGetFirstRawPart() or GDB_ID.NULL
-- Posizione iniziale del centro grezzo
local ptOriCen = EgtGetRawPartCenter( nRaw)
-- Sposto il grezzo
EgtMoveToCornerRawPart( nRaw, OrigOnTab, nCorner)
EgtSetInfo( nRaw, 'ORIGCORNER', sOrigCorner)
-- Posizione finale del centro grezzo
local ptNewCen = EgtGetRawPartCenter( nRaw)
-- Restituisco flag di movimento
return not AreSamePointApprox( ptOriCen, ptNewCen)
end
-------------------------------------------------------------------------------------------------------------
-- *** Inserimento delle lavorazioni nelle pareti ***
-------------------------------------------------------------------------------------------------------------
function WallExec.CollectFeatures( PartId, b3Raw)
function WallExec.CollectFeatures( PartId, b3Raw, b3Squaring)
-- recupero le feature
local vProc = {}
local LayerId = {}
@@ -191,8 +235,31 @@ function WallExec.CollectFeatures( PartId, b3Raw)
Proc.TaskId = nTaskId
Proc.Box = EgtGetBBoxGlob( ProcId, GDB_BB.STANDARD)
Proc.IsOutline = ( Proc.Prc == 251 or Proc.Prc == 252)
if b3Raw then
-- recupero l'elenco delle facce della parte interessate dalla feature
Proc.AffectedFaces = WL.GetProcessAffectedFaces( Proc)
-- recupero le distanze tra la feature e le altre parti più vicine
Proc.DistanceToNearestParts = WL.GetProcessDistanceToNearestParts( Proc)
-- recupero le distanze tra la feature e il grezzo
Proc.DistanceToRawPart = WL.GetProcessDistanceToRawPart( Proc, b3Raw)
-- recupero informazioni sulle facce della feature
Proc.Face = {}
if Proc.Fct < 50 then
for i = 1, Proc.Fct do
Proc.Face[i] = { Id = i - 1, VtN = EgtSurfTmFacetNormVersor( Proc.Id, i - 1, GDB_ID.ROOT ), Elevation = WL.GetFaceElevation( Proc.Id, i - 1, PartId)}
end
end
end
if Proc.Box and not Proc.Box:isEmpty() then
table.insert( vProc, Proc)
-- se squadratura sui pezzi, si annullano le lavorazioni esterne al box di squadratura
if b3Squaring then
local b3SquaringReduced = BBox3d( b3Squaring)
b3SquaringReduced:expand( -0.1)
if not OverlapsXY( Proc.Box, b3SquaringReduced) then
Proc.Flag = 0
end
end
-- se foro
if Drill.Identify( Proc) then
-- assegno diametro e facce di ingresso e uscita (dati tabelle sempre per riferimento)
@@ -261,7 +328,8 @@ local function ClassifyFeatures( vProc, b3Raw)
if not bOk then Proc.Flg = 0 end
-- se foratura
elseif Drill.Identify( Proc) then
local bOk = Drill.Classify( Proc, b3Raw)
local bUseMultiDrill = WD.USE_MULTI_DRILL or false
local bOk = Drill.Classify( Proc, b3Raw, bUseMultiDrill)
if not bOk then Proc.Flg = 0 end
-- se mortasatura
elseif Mortise.Identify( Proc) then
@@ -291,20 +359,34 @@ local function ClassifyFeatures( vProc, b3Raw)
end
end
-------------------------------------------------------------------------------------------------------------
local function ClassifyTopology( vProc, nRawId)
local b3Raw = EgtGetRawPartBBox( nRawId)
local nRecognized = 0
for i = 1, #vProc do
local Proc = vProc[i]
if Topology.Classify( Proc, b3Raw) then
nRecognized = nRecognized + 1
end
end
return nRecognized
end
-------------------------------------------------------------------------------------------------------------
local function PrintFeatures( vProc)
EgtOutLog( ' *** Feature List ***')
for i = 1, #vProc do
local Proc = vProc[i]
local sOut = string.format( 'Part=%3d Proc=%3d Grp=%1d Prc=%3d TC=%2d/%d Flg=%2d Lo=%d Fcse=%1d,%1d Diam=%.2f Fct=%2d Dbl=%2d Dlt=%.1f Box=%s',
local sOut = string.format( 'Part=%3d Proc=%3d Grp=%1d Prc=%3d TC=%2d/%d Flg=%2d Lo=%d Fcse=%1d,%1d Diam=%.2f Fct=%2d Dbl=%2d Dlt=%.1f Box=%s TopoName=%s',
Proc.PartId, Proc.Id, Proc.Grp, Proc.Prc, Proc.TaskId, Proc.CutId,
Proc.Flg, EgtIf( Proc.LockOut, 1, 0), Proc.Fcs, Proc.Fce, Proc.Diam, Proc.Fct, Proc.Double or 0, Proc.Delta or 0, tostring( Proc.Box))
Proc.Flg, EgtIf( Proc.LockOut, 1, 0), Proc.Fcs, Proc.Fce, Proc.Diam, Proc.Fct, Proc.Double or 0, Proc.Delta or 0, tostring( Proc.Box), Proc.TopologyLongName or '')
EgtOutLog( sOut)
end
end
-------------------------------------------------------------------------------------------------------------
local function AddFeatureMachining( Proc, nRawId, b3Raw, vNLO)
local function AddFeatureMachining( Proc, nRawId, b3Raw, vNLO, b3Squaring)
local bOk = true
local sErr = ''
EgtOutLog( ' * Process ' .. tostring( Proc.Id) .. ' *', 1)
@@ -327,7 +409,8 @@ local function AddFeatureMachining( Proc, nRawId, b3Raw, vNLO)
-- se foratura ( 3/4-040-X)
elseif Drill.Identify( Proc) then
-- esecuzione foratura
bOk, sErr = Drill.Make( Proc, nRawId, b3Raw)
local bUseMultiDrill = WD.USE_MULTI_DRILL or false
bOk, sErr = Drill.Make( Proc, nRawId, b3Raw, bUseMultiDrill)
-- se mortasatura (3/4-050-X) o similari
elseif Mortise.Identify( Proc) then
-- esecuzione mortasatura
@@ -347,7 +430,7 @@ local function AddFeatureMachining( Proc, nRawId, b3Raw, vNLO)
-- se contorno libero, outline o apertura ( 0/3/4-250/251/252-X)
elseif FreeContour.Identify( Proc) then
-- esecuzione contorno libero
bOk, sErr = FreeContour.Make( Proc, nRawId, b3Raw, vNLO)
bOk, sErr = FreeContour.Make( Proc, nRawId, b3Raw, vNLO, b3Squaring)
-- se feature custom (Variant)
elseif Variant.Identify( Proc) then
-- esecuzione
@@ -480,7 +563,7 @@ local function SortMach( nPhase, PrevMch, nPartId, nType, StartNames, bExistName
end
if bByTool then
function ToolCompare(a,b)
local function ToolCompare(a,b)
if a.ToolType < b.ToolType then
return true
elseif a.ToolType == b.ToolType then
@@ -523,7 +606,7 @@ local function SortMach( nPhase, PrevMch, nPartId, nType, StartNames, bExistName
end
end
table.sort(TabCut, ToolCompare)
table.sort( TabCut, ToolCompare)
-- table.sort(TabCut, function(a,b) return a.ToolType < b.ToolType and a.ToolDiam > b.ToolDiam and a.Tool < b.Tool end)
local SupportTabCut = {}
local nPrevTUUID = 0
@@ -579,6 +662,8 @@ local function SortMachinings( nPhase, PrevMch, nPartId, nPriority)
PrevMch = SortMach( nPhase, PrevMch, nPartId, MCH_MY.SURFFINISHING, nil, nil, 'MOVE_AFTER', false, nil, nil, nil, nPriority)
-- Fresature per gole
PrevMch = SortMach( nPhase, PrevMch, nPartId, MCH_OY.MILLING, { 'Gorge_'}, true, 'MOVE_AFTER', false, nil, nil, nil, nPriority)
-- Fresature da fare prima delle SideMill
PrevMch = SortMach( nPhase, PrevMch, nPartId, MCH_OY.MILLING, { 'PreSideMill_'}, true, 'MOVE_AFTER', false, false, true, true, nPriority)
-- Fresature che sono rifiniture di spigoli
PrevMch = SortMach( nPhase, PrevMch, nPartId, MCH_OY.MILLING, { 'SideMill_'}, true, 'MOVE_AFTER', false, false, true, true, nPriority)
-- Fresature che sono puliture di spigoli
@@ -589,6 +674,8 @@ local function SortMachinings( nPhase, PrevMch, nPartId, nPriority)
PrevMch = SortMach( nPhase, PrevMch, nPartId, MCH_OY.SAWING, nil, nil, nil, nil, nil, nil, nil, nPriority)
-- Qui rimozione sfridi (se ci sono lavorazioni successive)
if not nPriority then
-- Fresature da fare prima delle SideMill
PrevMch = SortMach( nPhase, PrevMch, nPartId, MCH_OY.MILLING, { 'PreSideMill_'}, true, 'MOVE_AFTER', true, false, true, true)
-- Fresature dei lapjoint che necessitano di gorge
PrevMch = SortMach( nPhase, PrevMch, nPartId, MCH_OY.MILLING, { 'SideMill_'}, true, 'MOVE_AFTER', true, false, true, true)
-- Tagli con sega a catena che vanno fatti dopo i tagli con lama
@@ -607,7 +694,7 @@ end
-------------------------------------------------------------------------------------------------------------
-- setto la rimozione sfridi dopo le lavorazioni di outline
function InsertScrapRemoval( nPhase)
local function InsertScrapRemoval( nPhase)
local nCurrentOperationId = EgtGetNextOperation( EgtGetPhaseDisposition( nPhase))
local nActiveMachiningId = EgtGetCurrMachining()
while nCurrentOperationId do
@@ -626,6 +713,492 @@ function InsertScrapRemoval( nPhase)
EgtSetCurrMachining( nActiveMachiningId or GDB_ID.NULL)
end
-------------------------------------------------------------------------------------------------------------
-- funzione per l'ordinamento delle features in doppio da accoppiare
-- ordinate prima in base alla X e poi alla Y
local function SortFeaturesForMirror( Proc1, Proc2)
-- tolleranza di ricerca
local TOL = EgtIf( Proc1.TopologyLongName == 'DRILLING', WD.DOUBLE_HEAD_DRILLING_TOLERANCE or 0.1 , WD.DOUBLE_HEAD_POCKET_TOLERANCE or 0.5)
-- recupero i centri dei box lungo X e Y
local Proc1X = Proc1.Box:getCenter():getX()
local Proc1Y = Proc1.Box:getCenter():getY()
local Proc2X = Proc2.Box:getCenter():getX()
local Proc2Y = Proc2.Box:getCenter():getY()
-- confronto per ordinamento
if Proc1X < Proc2X - TOL then
return true
elseif abs( Proc1X - Proc2X) < TOL then
if Proc1Y < Proc2Y - TOL then
return true
end
end
end
-------------------------------------------------------------------------------------------------------------
-- funzione per l'ordinamento delle operazioni in doppio da accoppiare
-- ordinate prima in base alla X e poi alla Y
local function SortOperationsForMirror( nOper1, nOper2)
-- tolleranza di ricerca
local TOL = 0.1
-- recupero il box della prima operazione
local nClId1 = EgtGetFirstNameInGroup( nOper1, 'CL')
local ptMin1 = EgtGetInfo( nClId1, 'MMIN', 'p')
local ptMax1 = EgtGetInfo( nClId1, 'MMAX', 'p')
local b3Oper1 = BBox3d( ptMin1, ptMax1)
-- recupero il box delle seconda operazione
local nClId2 = EgtGetFirstNameInGroup( nOper2, 'CL')
local ptMin2 = EgtGetInfo( nClId2, 'MMIN', 'p')
local ptMax2 = EgtGetInfo( nClId2, 'MMAX', 'p')
local b3Oper2 = BBox3d( ptMin2, ptMax2)
-- recupero i centri dei box lungo X e Y
local dOper1X = b3Oper1:getCenter():getX()
local dOper1Y = b3Oper1:getCenter():getY()
local dOper2X = b3Oper2:getCenter():getX()
local dOper2Y = b3Oper2:getCenter():getY()
-- confronto per ordinamento
if dOper1X < dOper2X - TOL then
return true
elseif abs( dOper1X - dOper2X) < TOL then
if dOper1Y < dOper2Y - TOL then
return true
end
end
end
-------------------------------------------------------------------------------------------------------------
-- Controlla in vProc la presenza di feature da lavorare in doppio e, se trovate, ne setta i parametri
local function SetMirroredFeatures( vProc, b3Raw)
-- interasse minimo
local dMinimumDistanceMirroredFeatures = 780
-- inizializzazione array tasche e forature
local vPockets = {}
local vDrillings = {}
-- raccolgo le feature compatibili con doppio
for i = 1, #vProc do
local Proc = vProc[i]
if Proc.Flg ~= 0 then
-- raccolgo le tasche compatibili
if WD.DOUBLE_HEAD_POCKET and
(
( Proc.TopologyLongName == 'Rabbet-Through-RightAngles-Parallel-2' and Proc.AffectedFaces.Left and Proc.AffectedFaces.Right) or
( Proc.TopologyLongName == 'Groove-Through-RightAngles-Parallel-3' and ( not Proc.AffectedFaces.Bottom and Proc.AffectedFaces.Left and Proc.AffectedFaces.Right)) or
( Proc.TopologyLongName == 'Groove-Blind-RightAngles-Parallel-3') or
( Proc.TopologyLongName == 'Groove-Blind-RightAngles-Parallel-4') or
( Proc.TopologyLongName == 'Pocket-Blind-RightAngles-Parallel-5' and not Proc.AffectedFaces.Bottom)
) then
table.insert( vPockets, Proc)
-- raccolgo i fori verticali e aperti verso Z+
elseif WD.DOUBLE_HEAD_DRILLING and Proc.TopologyLongName == 'DRILLING' then
-- recupero e verifico la geometria del foro
local AuxId = EgtGetInfo( Proc.Id, 'AUXID', 'i') or 0
if AuxId then AuxId = AuxId + Proc.Id end
if not AuxId or EgtGetType( AuxId) ~= GDB_TY.CRV_ARC then
return false
end
local vtExtr = EgtCurveExtrusion( AuxId, GDB_RT.GLOB)
if Proc.AffectedFaces.Top and AreSameOrOppositeVectorApprox( vtExtr, Z_AX()) then
table.insert( vDrillings, Proc)
end
end
end
end
-- ordinamento delle feature raccolte secondo X e poi Y crescente
table.sort( vPockets, SortFeaturesForMirror)
table.sort( vDrillings, SortFeaturesForMirror)
-- accoppio le tasche
local nCurrentPocket = 1
while nCurrentPocket <= #vPockets do
local Proc = vPockets[nCurrentPocket]
if Proc.Flg ~= 0 then
local b3Proc = EgtGetBBoxGlob( Proc.Id, GDB_BB.STANDARD)
-- cerco evenutale specchiata
local nCurrentMirrorPocket = nCurrentPocket + 1
while nCurrentMirrorPocket <= #vPockets do
local ProcMirror = vPockets[nCurrentMirrorPocket]
local b3ProcMirror = EgtGetBBoxGlob( ProcMirror.Id, GDB_BB.STANDARD)
-- feature non disattivata e diversa da nCurrentPocket
local bIsMirrorIdOk = ( Proc.Id ~= ProcMirror.Id and ProcMirror.Flg ~= 0)
-- feature mirror della stessa classe topologica
local bIsMirrorTopologyOk = ( Proc.TopologyLongName == ProcMirror.TopologyLongName)
-- determino se di fianco o in mezzo al singolo pannello
local bLapVsTop = Proc.AffectedFaces.Front and
(
Proc.TopologyLongName == 'Rabbet-Through-RightAngles-Parallel-2' or
Proc.TopologyLongName == 'Groove-Through-RightAngles-Parallel-3' or
Proc.TopologyLongName == 'Groove-Blind-RightAngles-Parallel-3' or
Proc.TopologyLongName == 'Groove-Blind-RightAngles-Parallel-4' or
Proc.TopologyLongName == 'Pocket-Blind-RightAngles-Parallel-5'
)
-- se di fianco, determino se è l'ultima parte prima della fine del grezzo
local bIsFeatureOnEdge, bIsMirrorFeatureOnEdge = false, false
if bLapVsTop then
bIsFeatureOnEdge = Proc.DistanceToNearestParts.Front > b3Raw:getDimY()
bIsMirrorFeatureOnEdge = ProcMirror.DistanceToNearestParts.Back > b3Raw:getDimY()
end
-- se di fianco, si sceglie se le feature sono compatibili con il doppio e nel caso che tipo di lavorazione fare
-- -1: no doppio, 0: nessuna preferenza, 1: pocket, 2: side (scambio faccia principale)
local nDoubleType = 0
local bAllowSideOnMirror = ( ProcMirror.DistanceToRawPart.Back - Proc.DistanceToRawPart.Front < 1 + 10 * GEO.EPS_SMALL) or ( not WD.SIDEMILL_BEFORE and ( not Proc.AffectedFaces.Top or not ProcMirror.AffectedFaces.Top))
if bLapVsTop and ( Proc.AffectedFaces.Top or Proc.AffectedFaces.Bottom) then
-- side
if bIsFeatureOnEdge and bIsMirrorFeatureOnEdge then
if not ( Proc.AffectedFaces.Top and ProcMirror.AffectedFaces.Top) then
nDoubleType = 2
end
-- no doppio
elseif Proc.AffectedFaces.Bottom or ProcMirror.AffectedFaces.Bottom then
nDoubleType = -1
-- tasca
else
nDoubleType = 1
end
end
-- corrispondenza nella posizione delle feature. Se di fianco il lato master è sempre quello verso l'operatore, se sopra nessun vincolo
local bIsMirrorSideOk = ( bLapVsTop and ProcMirror.AffectedFaces.Back and bIsFeatureOnEdge and bIsMirrorFeatureOnEdge and bAllowSideOnMirror) or
Proc.TopologyLongName == 'Groove-Through-RightAngles-Parallel-3' and Proc.AffectedFaces.Top and ProcMirror.AffectedFaces.Top or
Proc.TopologyLongName == 'Groove-Blind-RightAngles-Parallel-4' and Proc.AffectedFaces.Top and Proc.AffectedFaces.Left and ProcMirror.AffectedFaces.Top and ProcMirror.AffectedFaces.Left or
Proc.TopologyLongName == 'Groove-Blind-RightAngles-Parallel-4' and Proc.AffectedFaces.Top and Proc.AffectedFaces.Right and ProcMirror.AffectedFaces.Top and ProcMirror.AffectedFaces.Right or
Proc.TopologyLongName == 'Pocket-Blind-RightAngles-Parallel-5' and Proc.AffectedFaces.Top and ProcMirror.AffectedFaces.Top
-- box delle stesse dimensioni
local bIsMirrorFeatureSameDimension = abs( b3Proc:getDimX() - b3ProcMirror:getDimX()) < ( WD.DOUBLE_HEAD_POCKET_TOLERANCE or 0.5) and
abs( b3Proc:getDimY() - b3ProcMirror:getDimY()) < ( WD.DOUBLE_HEAD_POCKET_TOLERANCE or 0.5) and
abs( b3Proc:getDimZ() - b3ProcMirror:getDimZ()) < ( WD.DOUBLE_HEAD_POCKET_TOLERANCE or 0.5)
-- box allineati in X
local bIsMirrorBoxXAligned = abs( Proc.Box:getCenter():getX() - ProcMirror.Box:getCenter():getX()) < ( WD.DOUBLE_HEAD_POCKET_TOLERANCE or 0.5)
-- box che non si intersecano
local bIsNotMirrorBoxOverlapping = not OverlapsXY( b3Proc, b3ProcMirror)
-- distanza minima tra le feature
local dYMinDistance = max( b3Proc:getMin():getY(), b3ProcMirror:getMin():getY()) - min( b3Proc:getMax():getY(), b3ProcMirror:getMax():getY())
local bIsMirrorFeatureDistanceOk = dYMinDistance > dMinimumDistanceMirroredFeatures + 10 * GEO.EPS_SMALL
-- se tutte vere le condizioni, calcolo i parametri da passare alle lavorazioni
if nDoubleType > -1 and bIsMirrorIdOk and bIsMirrorTopologyOk and bIsMirrorSideOk and bIsMirrorFeatureSameDimension and bIsMirrorBoxXAligned and bIsNotMirrorBoxOverlapping and bIsMirrorFeatureDistanceOk then
local dYMirrorAx
local b3Tab = EgtGetTableArea()
local ptOnMirrorAx = ( Proc.Box:getCenter() + ProcMirror.Box:getCenter()) / 2
dYMirrorAx = ptOnMirrorAx:getY() - b3Tab:getMin():getY()
local dDeltaZ = ProcMirror.Box:getMax():getZ() - Proc.Box:getMax():getZ()
-- forzo side o pocket, se necessario
if nDoubleType == 1 then
EgtSetInfo( Proc.Id, 'PCKT', 1)
EgtSetInfo( ProcMirror.Id, 'PCKT', 1)
elseif nDoubleType == 2 then
Proc.Stype = 2
ProcMirror.Stype = 2
end
-- scrivo i parametri nella lavorazione
-- 2: specchiatura in Y
Proc.Double = 2
Proc.Mirror = ProcMirror
-- posizione Y dell'asse di specchiatura
Proc.MirrorAx = dYMirrorAx
-- Offset Z tra le feature
Proc.MirrorDeltaZ = dDeltaZ
-- rimuovo dalla lista le pocket già assegnate
local ProcMirrorOldId = ProcMirror.Id
table.remove( vPockets, nCurrentPocket)
-- avendo rimosso un elemento dall'array, potrebbe essere cambiato l'elemento nCurrentMirrorPocket
if nCurrentMirrorPocket > #vPockets or ( vPockets[nCurrentMirrorPocket].Id ~= ProcMirrorOldId) then nCurrentMirrorPocket = nCurrentMirrorPocket - 1 end
table.remove( vPockets, nCurrentMirrorPocket)
nCurrentPocket = 0
break
end
nCurrentMirrorPocket = nCurrentMirrorPocket + 1
end
end
nCurrentPocket = nCurrentPocket + 1
end
-- accoppio le forature
local nCurrentDrilling = 1
while nCurrentDrilling <= #vDrillings do
local Proc = vDrillings[nCurrentDrilling]
if Proc.Flg ~= 0 then
local b3Proc = EgtGetBBoxGlob( Proc.Id, GDB_BB.STANDARD)
-- cerco evenutale specchiata
local nCurrentMirrorDrilling = nCurrentDrilling + 1
while nCurrentMirrorDrilling <= #vDrillings do
local ProcMirror = vDrillings[nCurrentMirrorDrilling]
local b3ProcMirror = EgtGetBBoxGlob( ProcMirror.Id, GDB_BB.STANDARD)
-- feature non disattivata e diversa da nCurrentDrilling
local bIsMirrorIdOk = ( Proc.Id ~= ProcMirror.Id and ProcMirror.Flg ~= 0)
-- box delle stesse dimensioni
local bIsMirrorFeatureSameDimension = abs( b3Proc:getDimX() - b3ProcMirror:getDimX()) < ( WD.DOUBLE_HEAD_DRILLING_TOLERANCE or 0.1) and
abs( b3Proc:getDimY() - b3ProcMirror:getDimY()) < ( WD.DOUBLE_HEAD_DRILLING_TOLERANCE or 0.1) and
abs( b3Proc:getDimZ() - b3ProcMirror:getDimZ()) < ( WD.DOUBLE_HEAD_DRILLING_TOLERANCE or 0.1)
-- box allineati in X
local bIsMirrorBoxXAligned = abs( Proc.Box:getCenter():getX() - ProcMirror.Box:getCenter():getX()) < ( WD.DOUBLE_HEAD_DRILLING_TOLERANCE or 0.1)
-- box che non si intersecano
local bIsNotMirrorBoxOverlapping = not OverlapsXY( b3Proc, b3ProcMirror)
-- distanza minima tra le feature
local dYMinDistance = max( b3Proc:getMin():getY(), b3ProcMirror:getMin():getY()) - min( b3Proc:getMax():getY(), b3ProcMirror:getMax():getY())
local bIsMirrorFeatureDistanceOk = dYMinDistance > dMinimumDistanceMirroredFeatures + 10 * GEO.EPS_SMALL
-- se tutte vere le condizioni, calcolo i parametri da passare alle lavorazioni
if bIsMirrorIdOk and bIsMirrorFeatureSameDimension and bIsMirrorBoxXAligned and bIsNotMirrorBoxOverlapping and bIsMirrorFeatureDistanceOk then
local dYMirrorAx
local b3Tab = EgtGetTableArea()
local ptOnMirrorAx = ( Proc.Box:getCenter() + ProcMirror.Box:getCenter()) / 2
dYMirrorAx = ptOnMirrorAx:getY() - b3Tab:getMin():getY()
-- scrivo i parametri nella lavorazione
-- 2: specchiatura in Y
Proc.Double = 2
Proc.Mirror = ProcMirror
-- posizione Y dell'asse di specchiatura
Proc.MirrorAx = dYMirrorAx
-- rimuovo dalla lista le forature già assegnate
local ProcMirrorOldId = ProcMirror.Id
table.remove( vDrillings, nCurrentDrilling)
-- avendo rimosso un elemento dall'array, potrebbe essere cambiato l'elemento nCurrentMirrorDrilling
if nCurrentMirrorDrilling > #vDrillings or ( vDrillings[nCurrentMirrorDrilling].Id ~= ProcMirrorOldId) then nCurrentMirrorDrilling = nCurrentMirrorDrilling - 1 end
table.remove( vDrillings, nCurrentMirrorDrilling)
nCurrentDrilling = 0
break
end
nCurrentMirrorDrilling = nCurrentMirrorDrilling + 1
end
end
nCurrentDrilling = nCurrentDrilling + 1
end
end
-------------------------------------------------------------------------------------------------------------
-- verifico e imposto le fresature da specchiare
local function SetMirroredOperations()
-- interasse minimo
local dMinimumDistanceMirroredOperations = 780
-- inzializzazione array
local vMillings = {}
-- raccolgo le fresature non già fatte in doppio
if WD.DOUBLE_HEAD_MILLCORNER then
local nOperId = EgtGetNextOperation( EgtGetPhaseDisposition( 1))
while nOperId do
EgtSetCurrMachining( nOperId)
local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES)
local bIsDouble = ( EgtGetValInNotes( sUserNotes, 'DOUBLE', 'i') or 0) > 0
if EgtGetOperationMode( nOperId) and not EgtIsMachiningEmpty( nOperId) and not bIsDouble and EgtGetOperationType( nOperId) == MCH_OY.MILLING then
table.insert( vMillings, nOperId)
end
nOperId = EgtGetNextOperation( nOperId)
end
end
-- ordinamento delle operazioni raccolte secondo X e poi Y crescente
table.sort( vMillings, SortOperationsForMirror)
-- accoppio le fresature
local nCurrentMilling = 1
while nCurrentMilling <= #vMillings do
local nOperIdMaster = vMillings[nCurrentMilling]
EgtSetCurrMachining( nOperIdMaster)
local sMachining = EgtGetMachiningParam( MCH_MP.NAME, 's')
local nClId = EgtGetFirstNameInGroup( nOperIdMaster, 'CL')
local nPathId = EgtGetFirstInGroup( nClId or GDB_ID.NULL)
-- vettore direzione utensile e somma normali facce per lavorazione master
local vtTool = EgtGetInfo( nPathId, 'EXTR', 'v')
local vtNormSum = EgtGetInfo( nOperIdMaster, 'NORM_SUM', 'v')
local ptMin = EgtGetInfo( nClId, 'MMIN', 'p')
local ptMax = EgtGetInfo( nClId, 'MMAX', 'p')
-- box percorso lavorazione master
local b3Operation = BBox3d( ptMin, ptMax)
-- lavorazione master adatta alla specchiatura
local bIsMachiningOk = WM.IsMachiningOkForDouble( sMachining)
if bIsMachiningOk then
-- recupero la distanza tra centro di rotazione e punta dell'utensile per aumentare o ridurre l'interasse minimo
local dTipToPivot, dTipToPivotDouble = 999, 999
local dToolMasterTotLength, dToolMasterTotLengthDouble = 999, 999
local sToolMasterName = ''
if EgtMdbSetCurrMachining( sMachining) then
-- recupero l'utensile della lavorazione e il suo doppio
sToolMasterName = EgtMdbGetCurrMachiningParam( MCH_MP.TOOL)
if EgtTdbSetCurrTool( sToolMasterName or '') then
dToolMasterTotLength = EgtTdbGetCurrToolParam( MCH_TP.TOTLEN) or dToolMasterTotLength
local sToolDoubleName = EgtTdbGetCurrToolValInNotes( MCH_TP.USERNOTES, 'DOUBLE', 's')
if sToolDoubleName and EgtTdbSetCurrTool( sToolDoubleName) then
dToolMasterTotLengthDouble = EgtTdbGetCurrToolParam( MCH_TP.TOTLEN) or dToolMasterTotLengthDouble
end
end
end
if WD.HEAD_PIVOT_MAIN and WD.HEAD_PIVOT_SECONDARY then
dTipToPivot = dToolMasterTotLength + WD.HEAD_PIVOT_MAIN
dTipToPivotDouble = dToolMasterTotLengthDouble + WD.HEAD_PIVOT_SECONDARY
else
local sOut = 'Error : HEAD_PIVOT_MAIN or HEAD_PIVOT_SECONDARY missing in WallData'
return false, sOut
end
-- cerco eventuale specchiata
local nCurrentMirrorMilling = nCurrentMilling + 1
while nCurrentMirrorMilling <= #vMillings do
local nOperIdMirror = vMillings[nCurrentMirrorMilling]
EgtSetCurrMachining( nOperIdMirror)
local nClIdMirror = EgtGetFirstNameInGroup( nOperIdMirror, 'CL')
local nPathIdMirror = EgtGetFirstInGroup( nClIdMirror or GDB_ID.NULL)
-- vettore direzione utensile e somma normali facce per lavorazione mirror
local vtToolMirror = EgtGetInfo( nPathIdMirror, 'EXTR', 'v')
local vtNormSumMirror = EgtGetInfo( nOperIdMirror, 'NORM_SUM', 'v')
local ptMinMirror = EgtGetInfo( nClIdMirror, 'MMIN', 'p')
local ptMaxMirror = EgtGetInfo( nClIdMirror, 'MMAX', 'p')
-- box percorso lavorazione mirror
local b3OperationMirror = BBox3d( ptMinMirror, ptMaxMirror)
-- utensile originale lavorazione specchiata
local sOriginalMirrorToolName = EgtGetMachiningParam( MCH_MP.TOOL)
local bIsOriginalMirrorToolSameSize = WM.IsToolDoubleOk( sToolMasterName, sOriginalMirrorToolName)
-- lavorazione mirror adatta alla specchiatura
local bIsMirrorMachiningOk = nOperIdMaster ~= nOperIdMirror
-- lavorazione master più a sinistra
local bIsMirrorSideOk = ( b3OperationMirror:getCenter():getY() - b3Operation:getCenter():getY()) > ( WD.DOUBLE_HEAD_POCKET_TOLERANCE or 0.5)
-- box delle stesse dimensioni
local bIsMirrorOperationSameDimension = abs( b3Operation:getDimX() - b3OperationMirror:getDimX()) < ( WD.DOUBLE_HEAD_POCKET_TOLERANCE or 0.5) and
abs( b3Operation:getDimY() - b3OperationMirror:getDimY()) < ( WD.DOUBLE_HEAD_POCKET_TOLERANCE or 0.5) and
abs( b3Operation:getDimZ() - b3OperationMirror:getDimZ()) < ( WD.DOUBLE_HEAD_POCKET_TOLERANCE or 0.5)
-- box allineati in X
local bIsMirrorBoxXAligned = abs( b3Operation:getCenter():getX() - b3OperationMirror:getCenter():getX()) < ( WD.DOUBLE_HEAD_POCKET_TOLERANCE or 0.5) and
abs( b3Operation:getCenter():getX() - b3OperationMirror:getCenter():getX()) < ( WD.DOUBLE_HEAD_POCKET_TOLERANCE or 0.5)
-- box che non si intersecano
local bIsNotMirrorBoxOverlapping = not OverlapsXY( b3Operation, b3OperationMirror)
-- distanza minima tra le feature
local dTipToPivotProjectionOnY = dTipToPivot * vtTool:getY()
local dTipToPivotProjectionOnYDouble = dTipToPivotDouble * vtToolMirror:getY()
local dYMinDistance = max( b3Operation:getMin():getY(), b3OperationMirror:getMin():getY()) - min( b3Operation:getMax():getY(), b3OperationMirror:getMax():getY())
local bIsMirrorOperationDistanceOk = dYMinDistance > dMinimumDistanceMirroredOperations + dTipToPivotProjectionOnY - dTipToPivotProjectionOnYDouble + 10 * GEO.EPS_SMALL
-- vettori utensile e somma normali facce specchiati
local vtToolMirrored = Vector3d( vtTool)
vtToolMirrored:mirror( Y_AX())
local bIsMirrorVectorOk = false
if AreSameVectorApprox( vtToolMirrored, vtToolMirror) then
if AreSameVectorApprox(vtTool, vtToolMirror) then
if vtNormSum and vtNormSumMirror then
local vtNormSumMirrored = Vector3d( vtNormSum)
vtNormSumMirrored:mirror( Y_AX())
bIsMirrorVectorOk = AreSameVectorApprox( vtNormSumMirrored, vtNormSumMirror)
end
else
bIsMirrorVectorOk = true
end
end
-- se condizioni corrette, scrivo le note e cancello la specchiata
if bIsOriginalMirrorToolSameSize and bIsMirrorMachiningOk and bIsMirrorSideOk and bIsMirrorOperationSameDimension and bIsMirrorBoxXAligned and bIsNotMirrorBoxOverlapping and bIsMirrorOperationDistanceOk and bIsMirrorVectorOk then
-- calcolo asse di specchiatura
local dYMirrorAx
local b3Tab = EgtGetTableArea()
local ptOnMirrorAx = ( b3Operation:getCenter() + b3OperationMirror:getCenter()) / 2
dYMirrorAx = ptOnMirrorAx:getY() - b3Tab:getMin():getY()
EgtSetCurrMachining( nOperIdMaster)
-- leggo note esistenti
local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES)
-- aggiungo note per doppio
sUserNotes = EgtSetValInNotes( sUserNotes, 'DOUBLE', 2)
sUserNotes = EgtSetValInNotes( sUserNotes, 'MirrorAx', dYMirrorAx)
-- scrivo le note della lavorazione
EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes)
-- cancello l'operazione specchiata
EgtRemoveOperation( nOperIdMirror)
-- rimuovo dalla lista le fresature già assegnate
local nCurrentMirrorMillingOldId = nCurrentMirrorMilling
table.remove( vMillings, nCurrentMilling)
-- avendo rimosso un elemento dall'array, potrebbe essere cambiato l'elemento nCurrentMirrorPocket
if nCurrentMirrorMilling > #vMillings or ( vMillings[nCurrentMirrorMilling] ~= nCurrentMirrorMillingOldId) then nCurrentMirrorMilling = nCurrentMirrorMilling - 1 end
table.remove( vMillings, nCurrentMirrorMilling)
nCurrentMilling = 0
break
end
nCurrentMirrorMilling = nCurrentMirrorMilling + 1
end
end
nCurrentMilling = nCurrentMilling + 1
end
end
-------------------------------------------------------------------------------------------------------------
local function GetFeatureInfoAndDependency( vProc)
-- ciclo tutte le feature
for i = 1, #vProc do
local Proc = vProc[i]
-- controllo la feature con tutte le altre per recuperare le dipendenze
for j = 1, #vProc do
local ProcB = vProc[j]
-- se non è la stessa feature
if Proc.Id ~= ProcB.Id then
-- raggruppamento fori per eventuale Multidrill
if WD.USE_MULTI_DRILL and Drill.Identify( Proc) and Proc.Flg ~= 0 and Drill.Identify( ProcB) and ProcB.Flg ~= 0 then
if not Proc.OtherGeometries then
Proc.OtherGeometries = {}
end
table.insert( Proc.OtherGeometries, ProcB)
ProcB.Flg = 0
ProcB.bGrouped = true
end
end
end
end
end
-------------------------------------------------------------------------------------------------------------
local function CalculateSquaring( sSquaringTool, RawPart, vPart)
local dRawPartHeight = RawPart.b3:getDimZ()
local bOk
local sMsg = ''
local SquaringTools = {}
local SquaringParameters = {}
local b3Squaring
SquaringTools = Squaring.GetTools()
bOk = Squaring.AreToolsOk( sSquaringTool, SquaringTools, dRawPartHeight)
if not bOk then
sMsg = 'Squaring failed: cannot find matching tools'
return false, {}, nil, sMsg
end
SquaringParameters, b3Squaring = Squaring.CalculateParameters( sSquaringTool, SquaringTools, RawPart, vPart)
if not SquaringParameters or next( SquaringParameters) == nil then
sMsg = 'Squaring failed: cannot calculate parameters'
return false, {}, nil, sMsg
end
return true, SquaringParameters, b3Squaring, sMsg
end
-------------------------------------------------------------------------------------------------------------
local function AddSquaring( SquaringParameters, b3Squaring)
local nFirstOperationId = EgtGetNextOperation( EgtGetPhaseDisposition( 1))
local bOk
local sMsg = ''
local OperationsId = {}
bOk, sMsg, OperationsId = Squaring.AddMachinings( SquaringParameters, b3Squaring, nFirstOperationId)
if not bOk then
for i = 1, #OperationsId do
EgtRemoveOperation( i)
end
sMsg = 'Squaring failed: cannot apply machinings'
return false, sMsg
end
-- se presenti altre lavorazioni, prima di queste va eseguita la pulizia sfridi
if nFirstOperationId then
Squaring.AddScrapRemoval( nFirstOperationId)
end
return true, sMsg
end
-------------------------------------------------------------------------------------------------------------
local function AddFeatureStats( Stats, bOk, sMsg, nCutId, nTaskId)
if not bOk then
table.insert( Stats, {Err=1, Msg=sMsg, Rot=0, CutId = nCutId, TaskId = nTaskId})
elseif sMsg and #sMsg > 0 then
table.insert( Stats, {Err=-1, Msg=sMsg, Rot=0, CutId = nCutId, TaskId = nTaskId})
else
table.insert( Stats, {Err=0, Msg='', Rot=0, CutId = nCutId, TaskId = nTaskId})
end
return Stats
end
-------------------------------------------------------------------------------------------------------------
function WallExec.ProcessFeatures()
-- errori e stato
@@ -643,13 +1216,64 @@ function WallExec.ProcessFeatures()
table.insert( vPart, {Id=nPartId, Box=b3Solid})
nPartId = EgtGetNextPartInRawPart( nPartId)
end
-- calcolo i parametri della squadratura, se richiesta
local SquaringParameters = {}
local b3Squaring
if WD.SQUARING_TYPE and WD.SQUARING_TYPE > 0 then
local RawPart = { nId = nRawId, b3 = b3Raw}
local bOk, sMsg
if type( WD.SQUARING_TOOL) ~= "number" then
WD.SQUARING_TOOL = 0
end
if WD.SQUARING_TOOL == 0 or WD.SQUARING_TOOL == 1 then
bOk, SquaringParameters, b3Squaring, sMsg = CalculateSquaring( 'DoubleDiskmill', RawPart, vPart)
end
if not bOk and ( WD.SQUARING_TOOL == 0 or WD.SQUARING_TOOL == 2) then
-- attualmente non gestito, va modificata la configurazione macchina e non si sa se sia gestito in macchina (PLC)
bOk = false
sMsg = 'Squaring not possible : double blade + diskmill not supported'
--SquaringParameters, b3Squaring, sMsg = CalculateSquaring( 'DoubleDiskmillAndBlade', RawPart)
end
if not bOk and ( WD.SQUARING_TOOL == 0 or WD.SQUARING_TOOL == 3) then
bOk, SquaringParameters, b3Squaring, sMsg = CalculateSquaring( 'DoubleBlade', RawPart, vPart)
end
if not bOk and ( WD.SQUARING_TOOL == 0 or WD.SQUARING_TOOL == 4) then
bOk, SquaringParameters, b3Squaring, sMsg = CalculateSquaring( 'Diskmill', RawPart, vPart)
end
if not bOk and ( WD.SQUARING_TOOL == 0 or WD.SQUARING_TOOL == 5) then
bOk, SquaringParameters, b3Squaring, sMsg = CalculateSquaring( 'Blade', RawPart, vPart)
end
if not bOk and ( WD.SQUARING_TOOL == 0 or WD.SQUARING_TOOL == 6) then
bOk, SquaringParameters, b3Squaring, sMsg = CalculateSquaring( 'DoubleMill', RawPart, vPart)
end
if not bOk and ( WD.SQUARING_TOOL == 0 or WD.SQUARING_TOOL == 7) then
bOk, SquaringParameters, b3Squaring, sMsg = CalculateSquaring( 'Mill', RawPart, vPart)
end
-- TODO sostituire con funzione
if not bOk then
nTotErr = nTotErr + 1
table.insert( Stats, {Err=1, Msg=sMsg, Rot=0, CutId=0, TaskId=0})
elseif sMsg and #sMsg > 0 then
table.insert( Stats, {Err=-1, Msg=sMsg, Rot=0, CutId=0, TaskId=0})
else
table.insert( Stats, {Err=0, Msg='', Rot=0, CutId=0, TaskId=0})
end
end
-- raccolgo l'elenco delle feature da lavorare, ciclando sui pezzi
local vProc = {}
for i = 1, #vPart do
-- recupero le feature di lavorazione della parete
local vPartProc = WallExec.CollectFeatures( vPart[i].Id, b3Raw)
local vPartProc = WallExec.CollectFeatures( vPart[i].Id, b3Raw, b3Squaring)
vProc = EgtJoinTables( vProc, vPartProc)
end
-- recupero informazioni ausiliarie feature e dipendenze tra feature stesse
GetFeatureInfoAndDependency( vProc)
-- classifico topologicamente le feature
ClassifyTopology( vProc, nRawId)
-- classifico le feature
ClassifyFeatures( vProc, b3Raw)
-- recupero l'elenco delle aree vietate alle chiodature
@@ -659,6 +1283,9 @@ function WallExec.ProcessFeatures()
if #vNLO == 0 and WD.FindFeaturesInDouble then
WD.FindFeaturesInDouble( vProc, b3Raw)
end
SetMirroredFeatures( vProc, b3Raw)
-- debug
if EgtGetDebugLevel() >= 1 then
PrintFeatures( vProc)
@@ -669,21 +1296,74 @@ function WallExec.ProcessFeatures()
-- creo la lavorazione
local Proc = vProc[i]
if Proc.Flg ~= 0 then
local bOk, sMsg = AddFeatureMachining( Proc, nRawId, b3Raw, vNLO)
local bOk, sMsg = AddFeatureMachining( Proc, nRawId, b3Raw, vNLO, b3Squaring)
if not bOk then
nTotErr = nTotErr + 1
table.insert( Stats, {Err=1, Msg=sMsg, Rot=0, CutId=Proc.CutId, TaskId=Proc.TaskId})
elseif sMsg and #sMsg > 0 then
table.insert( Stats, {Err=-1, Msg=sMsg, Rot=0, CutId=Proc.CutId, TaskId=Proc.TaskId})
else
table.insert( Stats, {Err=0, Msg='', Rot=0, CutId=Proc.CutId, TaskId=Proc.TaskId})
end
elseif not Proc.Double and not Proc.LockOut then
-- output statistiche feature
Stats = AddFeatureStats( Stats, bOk, sMsg, Proc.CutId, Proc.TaskId)
-- output statistiche in caso di più feature lavorate nella stessa Proc
if Proc.OtherGeometries and #Proc.OtherGeometries > 0 then
for j = 1, #Proc.OtherGeometries do
Stats = AddFeatureStats( Stats, Proc.OtherGeometries[j].bOk, Proc.OtherGeometries[j].sMsg, Proc.OtherGeometries[j].CutId, Proc.OtherGeometries[j].TaskId)
if not Proc.OtherGeometries[j].bOk then
nTotErr = nTotErr + 1
end
end
end
elseif not Proc.Double and not Proc.LockOut and not Proc.bGrouped then
local sMsg = 'Feature not machinable by orientation'
table.insert( Stats, {Err=1, Msg=sMsg, Rot=0, CutId=Proc.CutId, TaskId=Proc.TaskId})
end
end
EgtOutLog( ' *** End AddMachinings ***', 1)
-- setto quali sono le lavorazioni da disattivare perchè specchiate di lavorazioni in doppio
local vProcToDisable = {}
for i = 1, #vProc do
local Proc = vProc[i]
if Proc.Double and Proc.Double > 0 then
for j = 1, #vProc do
local ProcMirror = vProc[j]
if Proc.Mirror.Id == ProcMirror.Id then
-- per i fori l'operazione si basa sulla geometria ausiliaria
if Proc.TopologyLongName == 'DRILLING' then
local AuxId = EgtGetInfo( ProcMirror.Id, 'AUXID', 'i') or 0
if AuxId then AuxId = AuxId + ProcMirror.Id end
table.insert( vProcToDisable, AuxId)
-- per tutte le altre lavorazioni si usa la geometria della feature
else
table.insert( vProcToDisable, ProcMirror.Id)
end
end
end
end
end
-- cancello le operazioni legate a lavorazioni specchiate
local nOperId = EgtGetNextOperation( EgtGetPhaseDisposition( 1))
while nOperId do
EgtSetCurrMachining( nOperId)
local nOperationProcIds = EgtGetMachiningGeometry()
local nCurrentOperId = nOperId
if #nOperationProcIds > 0 then
local nOperationProcId = nOperationProcIds[1][1]
for i = 1, #vProcToDisable do
local ProcId = vProcToDisable[i]
if nOperationProcId == ProcId then
nOperId = EgtGetNextOperation( nOperId)
EgtRemoveOperation( nCurrentOperId)
break
end
end
end
if nCurrentOperId == nOperId then
nOperId = EgtGetNextOperation( nOperId)
end
end
SetMirroredOperations()
-- se macchina pareti
if not WD.BEAM_MACHINE then
-- riordino le lavorazioni tra tutti i pezzi
@@ -695,7 +1375,7 @@ function WallExec.ProcessFeatures()
local nGetPriorityFromBtl = WD.BTL_PRIORITY or 0
if nGetPriorityFromBtl > 0 then
local vPriority = {}
local nOperId = EgtGetNextOperation( PrevMch)
nOperId = EgtGetNextOperation( PrevMch)
local nCurrentPriorityId = 1
while nOperId do
local nPriority = EgtGetInfo( nOperId or GDB_ID.NULL, 'PRIORITY', 'i')
@@ -722,7 +1402,20 @@ function WallExec.ProcessFeatures()
end
-- ordinamento standard
SortMachinings( nPhase, PrevMch)
-- squadratura, se richiesta
if SquaringParameters and next( SquaringParameters) ~= nil then
local bOk, sMsg = AddSquaring( SquaringParameters, b3Squaring)
-- TODO sostituire con funzione
if not bOk then
nTotErr = nTotErr + 1
table.insert( Stats, {Err=1, Msg=sMsg, Rot=0, CutId=0, TaskId=0})
elseif sMsg and #sMsg > 0 then
table.insert( Stats, {Err=-1, Msg=sMsg, Rot=0, CutId=0, TaskId=0})
else
table.insert( Stats, {Err=0, Msg='', Rot=0, CutId=0, TaskId=0})
end
end
-- Aggiornamento finale di tutto
if nGetPriorityFromBtl > 0 then
InsertScrapRemoval( nPhase)
+218 -1
View File
@@ -1,5 +1,8 @@
-- WallLib.lua by Egaltech s.r.l. 2023/10/16
-- Libreria globale per Pareti
-- 2023/06/26 Spostata qui Is3EdgesApprox da FreeContour. Ora cerca autonomamente il gruppo se non viene passato.
-- 2023/11/14 Aggiunte funzioni GetProcessAffectedFaces, GetProcessDistanceToNearestParts, GetProcessDistanceToRawPart.
-- 2023/12/11 Aggiunta funzione IsFeatureCuttingEntireSection (allineamento Topology con Beam).
-- Tabella per definizione modulo
local WallLib = {}
@@ -316,6 +319,213 @@ function WallLib.GetNearestOrthoOpposite( vtRef, vtNorm)
return nil
end
---------------------------------------------------------------------
function WallLib.TestElleShape3( nIdGeom, nNumFacet)
-- valida solo nel caso di tre facce
if nNumFacet ~= 3 then return false end
-- determino se L con una faccia terminale o U con tre facce
local bIsL = true
for i = 1, 3 do
local vFacAdj = EgtSurfTmFacetAdjacencies( nIdGeom, i - 1)[1]
-- le conto
local nCount = 0
for j = 1, #vFacAdj do
if vFacAdj[j] >= 0 then
nCount = nCount + 1
end
end
if nCount == 1 then
bIsL = false
break
end
end
return bIsL
end
---------------------------------------------------------------------
function WallLib.TestElleShape4( nIdGeom, nNumFacet)
-- valida solo nel caso di quattro facce
if nNumFacet ~= 4 then return false end
-- determino se L con due facce terminali o O
local nFac3Adj = 0
local dMinArea3 = GEO.INFINITO * GEO.INFINITO
local dMaxArea2 = 0
for i = 1, 4 do
local vFacAdj = EgtSurfTmFacetAdjacencies( nIdGeom, i - 1)[1]
-- le conto
local nCount = 0
for j = 1, #vFacAdj do
if vFacAdj[j] >= 0 then
nCount = nCount + 1
end
end
local _, dH, dV = EgtSurfTmFacetMinAreaRectangle( nIdGeom, i - 1, GDB_ID.ROOT)
local dArea = dH * dV
if nCount == 2 then
dMaxArea2 = max( dMaxArea2, dArea)
elseif nCount == 3 then
dMinArea3 = min( dMinArea3, dArea)
nFac3Adj = nFac3Adj + 1
end
end
if nFac3Adj ~= 2 then return false end
-- verifico se L profonda oppure lunga
if dMinArea3 < dMaxArea2 then
return 1
else
return 2
end
end
---------------------------------------------------------------------
-- Funzione per determinare se la faccia ha lati molto corti (trascurabili) ed è quindi approssimabile ad una 3 facce
function WallLib.Is3EdgesApprox( Proc, nFacet, nAddGrpId)
nAddGrpId = nAddGrpId or WallLib.GetAddGroup( Proc.PartId)
-- recupero il contorno della faccia
local nContourId, nContourCnt = EgtExtractSurfTmFacetLoops( Proc.Id, nFacet, nAddGrpId)
if not nContourId then return false end
EgtMergeCurvesInCurveCompo( nContourId)
-- recupero il numero di lati del contorno
local _, nEntityCount = EgtCurveDomain( nContourId)
if not nEntityCount then return false end
-- se sono già tre, ho finito
if nEntityCount == 3 then return true end
-- rimuovo i lati molto corti dal conteggio totale
local nEdges = nEntityCount
for i = 1, nEntityCount do
local dLength = EgtCurveCompoLength( nContourId, i - 1)
if dLength < 15 then nEdges = nEdges - 1 end
end
-- verifico il numero significativo di lati
local bResult = ( nEdges == 3)
-- cancello tutti i contorni appena creati
EgtErase( EgtTableFill( nContourId, nContourCnt))
if bResult then
EgtOutLog( 'FreeContour : Face with ' .. tostring( nEntityCount) .. ' edges skipped (approx 3 edges)')
end
return bResult
end
-------------------------------------------------------------------------------------------------------------
-- restituisce le facce della parte interessate dalla feature Proc
function WallLib.GetProcessAffectedFaces( Proc)
local nBoxSolidId = EgtGetFirstNameInGroup( Proc.PartId or GDB_ID.NULL, 'Box')
local b3Part = EgtGetBBoxGlob( nBoxSolidId, GDB_BB.STANDARD)
local vtFacesAffected = { Top = false, Bottom = false, Front = false, Back = false, Left = false, Right = false}
if Proc.Box and not Proc.Box:isEmpty() then
if Proc.Box:getMax():getZ() > b3Part:getMax():getZ() - 500 * GEO.EPS_SMALL then
vtFacesAffected.Top = true
end
if Proc.Box:getMin():getZ() < b3Part:getMin():getZ() + 500 * GEO.EPS_SMALL then
vtFacesAffected.Bottom = true
end
if Proc.Box:getMin():getY() < b3Part:getMin():getY() + 500 * GEO.EPS_SMALL then
vtFacesAffected.Front = true
end
if Proc.Box:getMax():getY() > b3Part:getMax():getY() - 500 * GEO.EPS_SMALL then
vtFacesAffected.Back = true
end
if Proc.Box:getMin():getX() < b3Part:getMin():getX() + 500 * GEO.EPS_SMALL then
vtFacesAffected.Left = true
end
if Proc.Box:getMax():getX() > b3Part:getMax():getX() - 500 * GEO.EPS_SMALL then
vtFacesAffected.Right = true
end
end
return vtFacesAffected
end
-------------------------------------------------------------------------------------------------------------
-- restituisce le distanze XY tra la feature Proc e le altre parti più vicine, secondo le direzioni Y-/Y+/X-/X+
function WallLib.GetProcessDistanceToNearestParts( Proc)
local b3Proc = Proc.Box
local ptMinProc = b3Proc:getMin()
local ptMaxProc = b3Proc:getMax()
local vtDistances = { Front = 0, Back = 0, Left = 0, Right = 0}
if Proc.AffectedFaces.Front then
vtDistances.Front = GEO.INFINITO
end
if Proc.AffectedFaces.Back then
vtDistances.Back = GEO.INFINITO
end
if Proc.AffectedFaces.Left then
vtDistances.Left = GEO.INFINITO
end
if Proc.AffectedFaces.Right then
vtDistances.Right = GEO.INFINITO
end
local nRawId = EgtGetFirstRawPart()
local nPartId = EgtGetFirstPartInRawPart( nRawId)
while nPartId do
if Proc.PartId ~= nPartId then
local nBoxSolidId = EgtGetFirstNameInGroup( nPartId, 'Box')
local b3Solid = EgtGetBBoxGlob( nBoxSolidId or GDB_ID.NULL, GDB_BB.STANDARD)
b3Solid:expand( - 10 * GEO.EPS_SMALL)
local ptMinPart = b3Solid:getMin()
local ptMaxPart = b3Solid:getMax()
if Proc.AffectedFaces.Front then
if OverlapsXY( b3Proc, b3Solid) then
vtDistances.Front = 0
elseif OverlapsX( b3Proc, b3Solid) then
if ptMaxPart:getY() < ptMinProc:getY() + 100 * GEO.EPS_SMALL then
vtDistances.Front = min( vtDistances.Front, max( 0, ptMinProc:getY() - ptMaxPart:getY()))
end
end
end
if Proc.AffectedFaces.Back then
if OverlapsXY( b3Proc, b3Solid) then
vtDistances.Back = 0
elseif OverlapsX( b3Proc, b3Solid) then
if ptMaxProc:getY() < ptMinPart:getY() + 100 * GEO.EPS_SMALL then
vtDistances.Back = min( vtDistances.Back, max( 0, ptMinPart:getY() - ptMaxProc:getY()))
end
end
end
if Proc.AffectedFaces.Left then
if OverlapsXY( b3Proc, b3Solid) then
vtDistances.Left = 0
elseif OverlapsY( b3Proc, b3Solid) then
if ptMaxPart:getX() < ptMinProc:getX() + 100 * GEO.EPS_SMALL then
vtDistances.Left = min( vtDistances.Left, max( 0, ptMinProc:getX() - ptMaxPart:getX()))
end
end
end
if Proc.AffectedFaces.Right then
if OverlapsXY( b3Proc, b3Solid) then
vtDistances.Right = 0
elseif OverlapsY( b3Proc, b3Solid) then
if ptMaxProc:getX() < ptMinPart:getX() + 100 * GEO.EPS_SMALL then
vtDistances.Right = min( vtDistances.Right, max( 0, ptMinPart:getX() - ptMaxProc:getX()))
end
end
end
end
nPartId = EgtGetNextPartInRawPart( nPartId)
end
return vtDistances
end
-------------------------------------------------------------------------------------------------------------
-- restituisce le distanze XY tra la feature Proc e il termine del grezzo, secondo le direzioni Y-/Y+/X-/X+
function WallLib.GetProcessDistanceToRawPart( Proc, b3Raw)
local b3Proc = Proc.Box
local ptMinProc = b3Proc:getMin()
local ptMaxProc = b3Proc:getMax()
local ptMinRaw = b3Raw:getMin()
local ptMaxRaw = b3Raw:getMax()
local vtDistances = { Front = GEO.INFINITO, Back = GEO.INFINITO, Left = GEO.INFINITO, Right = GEO.INFINITO}
if EnclosesXY( b3Raw, b3Proc) then
vtDistances.Front = max( 0, ptMinProc:getY() - ptMinRaw:getY())
vtDistances.Back = max( 0, ptMaxRaw:getY() - ptMaxProc:getY())
vtDistances.Left = max( 0, ptMinProc:getX() - ptMinRaw:getX())
vtDistances.Right = max( 0, ptMaxRaw:getX() - ptMaxProc:getX())
end
return vtDistances
end
-------------------------------------------------------------------------------------------------------------
function WallLib.GetNailLockOutAreas( vProc)
local vNLO = {}
@@ -325,7 +535,7 @@ function WallLib.GetNailLockOutAreas( vProc)
if AuxId then AuxId = AuxId + vProc[i].Id end
if AuxId then
local nAddGrpId = WallLib.GetAddGroup( vProc[i].PartId)
local nSfrId = EgtSurfFlatRegion( nAddGrpId, {AuxId})
local nSfrId = EgtSurfFlatRegion( nAddGrpId, {AuxId})
if nSfrId then
table.insert( vNLO, nSfrId)
end
@@ -335,5 +545,12 @@ function WallLib.GetNailLockOutAreas( vProc)
return vNLO
end
-------------------------------------------------------------------------------------------------------------
-- restituisce vero se la feature con box b3Proc taglia l'intera sezione della parete, rappresentata dalle sue dimensioni W, H e L
function WallLib.IsFeatureCuttingEntireSection( b3Proc, dRawW, dRawH, dRawL)
return ( ( ( abs( b3Proc:getDimY() - dRawW) < 10 * GEO.EPS_SMALL or b3Proc:getDimY() > dRawW) or ( abs( b3Proc:getDimX() - dRawL) < 10 * GEO.EPS_SMALL or b3Proc:getDimX() > dRawL)) and (abs(b3Proc:getDimZ() - dRawH) < 10 * GEO.EPS_SMALL or b3Proc:getDimZ() > dRawH))
end
-------------------------------------------------------------------------------------------------------------
return WallLib
+2 -2
View File
@@ -157,9 +157,9 @@ local bManualRot = EgtGetInfo( NFAR.PARTID, "MANUALROT", 'b')
-- FLIP
local FlipFeatureStates, bLapJoints = ClassifyFlip( vPartProc, b3Part)
local bFlip
if not bManualFlip then
local bFlip
-- analizzo stati flip delle feature
local nFlip0Min = 100
local nFlip0Cnt = 0
@@ -440,7 +440,7 @@ if not bManualRot then
-- setto info nel pezzo
if nRotate > 0 then
local nPartRot = EgtGetInfo( NFAR.PARTID, "ROTATED", 'i') or 0
local nTotRot = nPartRot - nRotate
local nTotRot = nPartRot - EgtIf( bFlip, -nRotate, nRotate)
nTotRot = EgtIf( nTotRot < 0, nTotRot + 360, nTotRot)
EgtSetInfo( NFAR.PARTID, "ROTATED", nTotRot)
EgtSetInfo( NFAR.PARTID, "FLIPROTMODIFIED", 1)
+176 -48
View File
@@ -18,13 +18,14 @@ NEST.MACH_AREA_USE_OTHER_DIAM = 1 -- 0
NEST.MACH_AREA_OTHER_DIAM = 200
NEST.MACH_AREA_IGNORE_3rdFACE = 1 -- 0
if NEST.FLAG ~= 11 then
local sLog = 'NestProcess : ' .. NEST.FILE .. ', ' .. NEST.MACHINE .. ', ' .. LEN[1] .. ', ' .. WIDTH[1]
EgtOutLog( sLog)
local sLog = 'NestProcess : ' .. NEST.FILE .. ', ' .. NEST.MACHINE .. ', ' .. LEN["1"] .. ', ' .. WIDTH["1"]
EgtOutLog( sLog)
-- Cancello file di log specifico
local sLogFile = EgtChangePathExtension( NEST.FILE, '.txt')
EgtEraseFile( sLogFile)
-- Cancello file di log specifico
local sLogFile = EgtChangePathExtension( NEST.FILE, '.txt')
EgtEraseFile( sLogFile)
end
-- Imposto direttorio libreria specializzata per Travi
EgtAddToPackagePath( NEST.BASEDIR .. '\\LuaLibs\\?.lua')
@@ -56,6 +57,8 @@ _G.package.loaded.WProcessDoubleCut = nil
local DoubleCut = require( 'WProcessDoubleCut')
_G.package.loaded.WProcessFreeContour = nil
local FreeContour = require( 'WProcessFreeContour')
_G.package.loaded.PanelSaw = nil
local PanelSaw = require( 'PanelSaw')
-- Carico i dati globali
local WD = require( 'WallData')
@@ -65,6 +68,7 @@ local s_dSideMillDiamDown = WD.SIDEMILL_DIAM_DOWN or 350
local s_dSideMillDiamUp = WD.SIDEMILL_DIAM_UP or 65
local s_dHorDrillLen = WD.HOR_DRILL_LEN or 1780
local s_dHorDrillDiam = WD.HOR_DRILL_DIAM or 35
local s_dHorDrillDiam5Axes = WD.HOR_DRILL_DIAM_5AX or 0
local s_sOrigCorner = WD.ORIG_CORNER or 'TL'
local s_dIntRulli = WD.INTRULLI or 1200
local s_dMinRawYHorDrill = WD.MINRAWY_HOR_DRILL or 2800
@@ -535,7 +539,7 @@ local function ClassifyDrillsOnLateralFaces( nPartId, dMinSheetWidth)
if not AuxId or EgtGetType( AuxId) ~= GDB_TY.CRV_ARC then break end
-- verifico se diametro compatibile con la punta
local dDiam = 2 * EgtArcRadius( AuxId)
if abs( dDiam - s_dHorDrillDiam) < WD.DRILL_TOL + GEO.EPS_SMALL then
if ( abs( dDiam - s_dHorDrillDiam5Axes) < WD.DRILL_TOL + GEO.EPS_SMALL) or ( abs( dDiam - s_dHorDrillDiam) < WD.DRILL_TOL + GEO.EPS_SMALL) then
local ptDrill = EgtCP( AuxId, GDB_RT.GLOB)
local dLen = abs( EgtCurveThickness( AuxId))
local bLong = dLen > s_dHorDrillLen - 1
@@ -1128,9 +1132,10 @@ local function ClassifyAngles( nPartId, RawPart, sRefOrig, bLockedRot, dMinSheet
if nRotate >= 360 then
nRotate = nRotate - 360
end
if nRotate > 0 then
if nRotate > 0 then
local bPartFlip = ( ( EgtGetInfo( nPartId, "INVERTED", 'i') or 0) == 180)
local nPartRot = EgtGetInfo( nPartId, "ROTATED", 'i') or 0
local nTotRot = nPartRot - nRotate
local nTotRot = nPartRot - EgtIf( bPartFlip, -nRotate, nRotate)
nTotRot = EgtIf( nTotRot < 0, nTotRot + 360, nTotRot)
EgtSetInfo( nPartId, "ROTATED", nTotRot)
EgtSetInfo( nPartId, "MODIFIEDFORNEST", 1)
@@ -1325,8 +1330,9 @@ local function ComputeRestrictedZones( RawParts)
bOnOppositeSide = true
-- aggiorno le info di rotazione
if res.nRotate > 0 then
local bPartFlip = ( ( EgtGetInfo( AngleClassification[nInd].PartId, "INVERTED", 'i') or 0) == 180)
local nPartRot = EgtGetInfo( AngleClassification[nInd].PartId, "ROTATED", 'i') or 0
local nTotRot = nPartRot - res.nRotate
local nTotRot = nPartRot - EgtIf( bPartFlip, -res.nRotate, res.nRotate)
nTotRot = EgtIf( nTotRot < 0, nTotRot + 360, nTotRot)
EgtSetInfo( AngleClassification[nInd].PartId, "ROTATED", nTotRot)
EgtSetInfo( AngleClassification[nInd].PartId, "MODIFIEDFORNEST", 1)
@@ -1507,7 +1513,6 @@ local function AddParts(RawParts, vPartsDoneManually)
bRotNest = false
elseif EgtExistsInfo( nPartId, "NestRot") then
nStepRotNest = EgtGetInfo( nPartId, "NestStepRot", 'i')
nRotate = EgtGetInfo( nPartId, "NestRot", 'i')
bRotNest = EgtGetInfo( nPartId, "NestAllowRot", 'b')
-- verifico se rotazione è valida (pezzo è contenuto nel grezzo)
local bValidRotationInRaw = b3Part:getDimX() < RawParts[1].Len - 2 * NEST.KERF + GEO.EPS_SMALL and b3Part:getDimY() < dRawMaxWidth - 2 * NEST.KERF + GEO.EPS_SMALL
@@ -1628,7 +1633,7 @@ local function AddParts(RawParts, vPartsDoneManually)
if bOnEdge or bOnAngle then
local nBoxLayerId = EgtGetFirstNameInGroup( nPartId, "Box")
local nBoxId = EgtGetFirstNameInGroup( nBoxLayerId, "Box")
local b3Part = EgtGetBBoxGlob(nBoxId, GDB_BB.STANDARD)
local b3Part = EgtGetBBoxGlob(nBoxId, GDB_BB.STANDARD)
-- punto di riferimento sul pezzo
local ptRef
@@ -1682,6 +1687,124 @@ NEST.ERR = 0
-- resetto gruppo di lavorazione corrente
EgtResetCurrMachGroup()
-- modalità nesting utile per cabinet: un grezzo per ogni pezzo, pezzo centrato nel grezzo. Il grezzo non viene preso da magazzino ma creato ad hoc, con un dato sovramateriale.
-- il numero del MachGroup deve coincidere con il PDN del pezzo originale
if NEST.FLAG ~= 11 and WD.ENABLE_SIMPLE_NESTING then
-- sovramateriale richiesto
local dOverMaterial = max( 0, NEST.KERF or 2)
-- inizializzazione parametri per creazione grezzo tramite BatchProcessNew
_G.WALL = {}
WALL.FILE = NEST.FILE
WALL.MACHINE = NEST.MACHINE
WALL.BASEDIR = NEST.BASEDIR
WALL.FLAG = 6 -- CREATE_PANEL
WALL.NESTING_REF = 'BL'
-- si ricrea la lista pezzi ordinata
local PartList = {}
local nPartCounter = 0
for nPartId, nCount in pairs( PART) do
nPartCounter = nPartCounter + 1
PartList[nPartCounter] = {}
PartList[nPartCounter].nId = nPartId
PartList[nPartCounter].nCount = nCount
PartList[nPartCounter].nPdn = EgtGetInfo( nPartId, "PDN", 'i')
PartList[nPartCounter].bAddCounterToNaming = false
-- se presente un pezzo con multipli il PDN sarà seguito da un contatore
if nCount > 1 then
PartList[nPartCounter].bAddCounterToNaming = true
end
end
-- si riordina in base al PDN
table.sort( PartList, function(a, b) return tonumber( a.nPdn) < tonumber( b.nPdn) end)
-- per ogni singolo pezzo si chiama la fliprot per avere la migliore orientazione
-- si creano duplo e machgroup e si settano le note opportune per poi creare i grezzi richiamando la BatchProcessNew (flag 6)
for i = 1, #PartList do
local nPartId = PartList[i].nId
local nPartCount = PartList[i].nCount
local nPdn = PartList[i].nPdn
local bAddCounterToNaming = PartList[i].bAddCounterToNaming
-- si ruotano e invertono i pezzi per avere la migliore posizione di lavorazione
_G.NFAR = {}
NFAR.ERR = 0
NFAR.MSG = ''
NFAR.PARTID = nPartId
NFAR.BASEDIR = NEST.BASEDIR
dofile( NEST.BASEDIR .. "\\NestFlipAndRotate.lua")
-- informazioni dalla parte originale
-- box e relative dimensioni
local nBoxLayerId = EgtGetFirstNameInGroup( nPartId, "Box")
local nBoxId = EgtGetFirstNameInGroup( nBoxLayerId, "Box")
local b3Part = EgtGetBBoxGlob( nBoxId, GDB_BB.STANDARD)
-- inversione e rotazione
local nPartFlip = EgtGetInfo( nPartId, "INVERTED", 'i') or 0
local nPartRotation = EgtGetInfo( nPartId, "ROTATED", 'i') or 0
-- dimensioni grezzo, considerando sovramateriale
local dRawLength = b3Part:getDimX() + 2 * dOverMaterial
local dRawWidth = b3Part:getDimY() + 2 * dOverMaterial
for j = 1, nPartCount do
-- creazione gruppo di lavoro
local sMachGroupName = nPdn
if bAddCounterToNaming then
sMachGroupName = nPdn .. '_' .. string.format("%02d", j)
end
local nMachGroupId = EgtAddMachGroup( sMachGroupName)
if not nMachGroupId then
EgtOutLog( "Errore: MachGroup " .. nPdn .. " già presente")
EgtOutBox( 'Error : MachGroup ' .. nPdn .. ' already existing', 'Nesting failed')
NEST.ERR = 2
return
end
-- settaggio note in gruppo di lavoro
EgtSetInfo( nMachGroupId, "PANELLEN", dRawLength)
EgtSetInfo( nMachGroupId, "PANELWIDTH", dRawWidth)
EgtSetInfo( nMachGroupId, "MATERIAL", NEST.MATERIAL)
EgtSetInfo( nMachGroupId, "PRODID", NEST.PRODID)
EgtSetInfo( nMachGroupId, "PATTID", nMachGroupId)
-- creazione duplo
local nPartDuploId = EgtDuploNew( nPartId)
-- settaggio note in duplo
EgtSetInfo( nMachGroupId, "PART" .. 1, nPartDuploId .. "," .. EgtNumToString( dOverMaterial) .. "," .. EgtNumToString( dOverMaterial) .. "," .. 0 .."," .. 0)
EgtSetInfo( nPartDuploId, "POSY", dOverMaterial)
EgtSetInfo( nPartDuploId, "POSX", dOverMaterial)
EgtSetInfo( nPartDuploId, "FLIP", nPartFlip)
EgtSetInfo( nPartDuploId, "ROT", nPartRotation)
-- creazione grezzi tramite BatchProcessNew
EgtSetCurrMachGroup( nMachGroupId)
EgtSetInfo( nMachGroupId, "UPDATEUI", 1)
dofile( NEST.BASEDIR .. "\\BatchProcessNew.lua")
end
end
EgtProcessEvents( 200 + 100, 0)
EgtResetCurrMachGroup()
EgtOutLog( ' +++ NestProcess completed')
EgtOutLog( ' +++ Generating Cutting List')
return
elseif NEST.FLAG == 11 then
local vCuttingListType = EgtSplitString( WD.PANELSAW_TYPE)
for i = 1, #vCuttingListType do
local sCuttingListType = vCuttingListType[i]
PanelSaw.GenerateCuttingList( sCuttingListType)
end
return
end
-- inizio nesting automatico
EgtAutoNestStart()
@@ -1690,7 +1813,7 @@ local RawParts = {}
-- creo tabella dei grezzi
for sIndex, dLen in pairs( LEN) do
RawParts[tonumber(sIndex)] = { Len = dLen}
end
end
for sIndex, dWidth in pairs( WIDTH) do
RawParts[tonumber(sIndex)].Width = dWidth
end
@@ -1806,40 +1929,39 @@ if bNestingOk then
end
end
-- aggiungo pezzi nestati a mano
nPartCount = 0
for nInd = 1, #vDoneManually do
if vDoneManually[nInd].SheetId == nId then
vDoneManually[nInd].Done = 1
for nInd2 = 1, #(vDoneManually[nInd].Parts) do
nPartCount = nPartCount + 1
local nPartDuploId = EgtDuploNew( vDoneManually[nInd].Parts[nInd2].Id)
-- aggiungo le curve corrispondenti alle aree di lavorazione del pezzo
local sToolOutlines = EgtGetInfo( vDoneManually[nInd].Parts[nInd2].Id, "ToolOutlines", 's')
if sToolOutlines then
-- recupero o creo il gruppo per gli outlines
local nToolOutlinesGrp = EgtGetFirstNameInGroup( nPartDuploId, "ToolOutlines")
if not nToolOutlinesGrp then
nToolOutlinesGrp = EgtGroup( nPartDuploId)
EgtSetName( nToolOutlinesGrp, "ToolOutlines")
EgtSetStatus( nToolOutlinesGrp, GDB_ST.ON)
end
for str in string.gmatch(sToolOutlines, "([^"..",".."]+)") do
EgtCopyGlob( tonumber(str), nToolOutlinesGrp)
-- aggiungo pezzi nestati a mano
nPartCount = 0
for nInd = 1, #vDoneManually do
if vDoneManually[nInd].SheetId == nId then
vDoneManually[nInd].Done = 1
for nInd2 = 1, #(vDoneManually[nInd].Parts) do
nPartCount = nPartCount + 1
local nPartDuploId = EgtDuploNew( vDoneManually[nInd].Parts[nInd2].Id)
-- aggiungo le curve corrispondenti alle aree di lavorazione del pezzo
local sToolOutlines = EgtGetInfo( vDoneManually[nInd].Parts[nInd2].Id, "ToolOutlines", 's')
if sToolOutlines then
-- recupero o creo il gruppo per gli outlines
local nToolOutlinesGrp = EgtGetFirstNameInGroup( nPartDuploId, "ToolOutlines")
if not nToolOutlinesGrp then
nToolOutlinesGrp = EgtGroup( nPartDuploId)
EgtSetName( nToolOutlinesGrp, "ToolOutlines")
EgtSetStatus( nToolOutlinesGrp, GDB_ST.ON)
end
for str in string.gmatch(sToolOutlines, "([^"..",".."]+)") do
EgtCopyGlob( tonumber(str), nToolOutlinesGrp)
end
end
-- applico flip, rotazione e traslazione pezzo e box da nesting
EgtSetInfo( nMachGroup, "PART" .. nPartCount, nPartDuploId .. "," .. EgtNumToString( vDoneManually[nInd].Parts[nInd2].posX, 3) .. "," .. EgtNumToString( vDoneManually[nInd].Parts[nInd2].posY, 3) .. "," .. 0 .."," .. 0)
EgtSetInfo( nPartDuploId, "POSX", vDoneManually[nInd].Parts[nInd2].posX)
EgtSetInfo( nPartDuploId, "POSY", vDoneManually[nInd].Parts[nInd2].posY)
end
-- applico flip, rotazione e traslazione pezzo e box da nesting
EgtSetInfo( nMachGroup, "PART" .. nPartCount, nPartDuploId .. "," .. EgtNumToString( vDoneManually[nInd].Parts[nInd2].posX, 3) .. "," .. EgtNumToString( vDoneManually[nInd].Parts[nInd2].posY, 3) .. "," .. 0 .."," .. 0)
EgtSetInfo( nPartDuploId, "POSX", vDoneManually[nInd].Parts[nInd2].posX)
EgtSetInfo( nPartDuploId, "POSY", vDoneManually[nInd].Parts[nInd2].posY)
end
end
end
end
-- altrimenti pezzo
else
@@ -1884,15 +2006,21 @@ if bNestingOk then
EgtSetInfo( nPartDuploId, "POSX", ptPos:getX() + dXCorr)
EgtSetInfo( nPartDuploId, "POSY", ptPos:getY() + dYCorr)
local nPartRot = EgtGetInfo( nId, "ROTATED", 'i') or 0
local nTotRot = dAngRot - nPartRot
nTotRot = EgtIf( nTotRot < 0, nTotRot + 360, nTotRot)
EgtSetInfo( nPartDuploId, "ROT", nTotRot)
local nPartFlip = EgtGetInfo( nId, "INVERTED", 'i')
local nPartFlip = EgtGetInfo( nId, "INVERTED", 'i') or 0
nPartFlip = EgtIf( nPartFlip == 180, 1, 0)
local nTotFlip = EgtIf( nPartFlip ~= nFlag, 180, 0)
EgtSetInfo( nPartDuploId, "FLIP", nTotFlip)
local bPartFlip = ( nTotFlip == 180)
local nPartRot = EgtGetInfo( nId, "ROTATED", 'i') or 0
local nTotRot = nPartRot - EgtIf( bPartFlip, -dAngRot, dAngRot)
if nTotRot < 0 then
nTotRot = nTotRot + 360
elseif nTotRot >= 360 then
nTotRot = nTotRot - 360
end
EgtSetInfo( nPartDuploId, "ROT", nTotRot)
end
end
end
+120
View File
@@ -1,5 +1,125 @@
==== Wall Update Log ====
Versione 2.7i2 (18/09/2025)
- Modif : in PanelSaw gestione campi a lunghezza fissa
Versione 2.7i1 (16/09/2025)
- Added : per cabinet aggiunta esportazione cutting list e modalità nesting semplice
Versione 2.7h1 (06/08/2025)
- Modif : in LapJoint migliorata scelta lavorazione in caso di feature piccola
Versione 2.7g3 (24/07/2025)
- Fixed : in Lapjoint corretto step in caso due facce verso l'alto
Versione 2.7g2 (17/07/2025)
- Added : aggiunta gestione origine e offset da questa che non fanno riprocessare l'intero grezzo (ma solo aggiornare)
- Fixed : corretta BatchProcess per nome file anche se da non riprocessare.
Versione 2.7g1 (09/07/2025)
- Fixed : in FreeContour corretta scelta del lato da lavorare in caso si abbiano lati inclinati
Versione 2.7f2 (06/06/2025)
- Fixed : in Lapjoint migliorie alle svuotature
Versione 2.7f1 (05/06/2025)
- Added : gestita forzatura freecontour di fresa per macchine senza lama (costante WallData FORCE_MILL_CONTOUR)
- Modif : migliorata DoubleCut
- Fixed : corretta BatchProcess per caso in cui il nome del file cnc generato non era corretto
Versione 2.7d1 (14/04/2025)
- Added : in DoubleCut aggiunta Q06 per forzare utilizzo lama
Versione 2.7b1 (03/03/2025)
- Added : gestione multidrill
Versione 2.7a2 (23/01/2025)
- Fixed : in Ts7 corretto un problema che portava a rotazioni errate, introdotto con 2.7a1
- Fixed : in squadratura piccole correzioni
Versione 2.7a1 (21/01/2025)
- Modif : in Ts7 aggiunta scrittura id progetto e produzione in Btm
Versione 2.6l1 (11/12/2024)
- Modif : modificato il calcolo feature passante per gorge
- Modif : in pulizia spigoli si riporta correttamente la collisione sulla feature specifica
- Fixed : in pulizia spigoli correzioni varie
- Fixed : in LapJoint correzioni varie
Versione 2.6k3 (27/11/2024)
- Modif : migliorato calcolo approccio e retrazione in Sidemill/Sidegroove
Versione 2.6k2 (19/11/2024)
- Modif : in Nesting riportata allo stato precedente la tolleranza posizionamento pannelli sul bordo
Versione 2.6k1 (14/11/2024)
- Added : aggiunta squadratura master panel
- Modif : L010 si inseriscono con lama anche se il percorso è breve
- Fixed : in Nesting corretto errore in posizionamento pannelli che devono stare necessariamente sul bordo della tavola
Versione 2.6j2 (04/11/2024)
- Modif : Modificato limite dimensione tasca per utilizzo lama come SideGroove
Versione 2.6j1 (29/10/2024)
- Fixed : in Nesting e Flip/Rot corretto problema in rotazione pezzi che causava ribaltamenti non voluti nella copia grezzo
Versione 2.6i2 (30/09/2024)
- Modif : aggiunta nota altezza sottopezzo, per pareti a layer
Versione 2.6i1 (25/09/2024)
- Fixed : in NestProcess correzione in lettura array per cambio dll di lettura
Versione 2.6h2 (28/08/2024)
- Modif : Aggiunto controllo licenza/chiave per abilitazione generazione PartProgram
- Fixed : in FreeContour corretto caso in cui si chiedevano informazioni sulla faccia non presenti.
Versione 2.6h1 (20/08/2024)
- Modif : in LapJoint, se fresa Side trovata ma non applicabile, si considera come se non trovata
- Modif : in Collect analisi facce limitata a feature che ne hanno meno di 50
- Modif : aggiunti nuovi parametri alla chiamata della funzione GetChainSawStartAngs da WallData della macchina
Versione 2.6g2 (19/07/2024)
- Modif : in BatchProcess e BatchProcessNew si forza ricalcolo ogni volta che si è in situazione di CHECK o CHECK + GENERATE
Versione 2.6g1 (17/07/2024)
- Modif : in ProcessDrill, se foro verticale passante e diametro inferiore a 100 mm, riduzione affondamento di 5 mm sostituito con tab
- Fixed : correzioni a utilizzo DEFAULT_RAW_NO_EXTRA_WIDTH
Versione 2.6f1 (21/06/2024)
- Added : in BatchProcess e BatchProcessNew aggiunto DEFAULT_RAW_NO_EXTRA_WIDTH per eliminare il sovramateriale grezzo in vista
Versione 2.6e2 (24/05/2024)
- Modif : in LapJoint se non si trova una lavorazione di tipo side si cerca una pocketing
- Fixed : in BatchProcessNew se generazione non abilitata si salta questa fase invece di restituire errore
- Fixed : piccoli errori in LapJoint e DoubleCut.
Versione 2.6e1 (03/03/5/2024)
- Fixed : correzione per assegnazione a SawCut di flag passante (bIsThrough).
Versione 2.6c3 (26/03/2024)
- Modif : modifica per richiamare le nuove funzioni di Test interferenza solidi superfici nel controllo validità lavorazione pulizia spigoli interni
- Modif : in compilazione vengono eliminate le info di debug
- Fixed : in processSawCut si ignora verso vettore se taglio passante.
Versione 2.6b2 (21/02/2024)
- Added : aggiunta gestione spostamento pannello rispetto a origine da dato BTL di TS3v7.
Versione 2.6b1 (20/02/2024)
- Modif : In BatchProcess tolleranza su altezza pannello in grezzo portata a 0.1 mm
- Fixed : in LapJoint piccola correzione ai casi in cui si utilizza il SIDESTEP.
Versione 2.5l2 (21/12/2023)
- Fixed : in FreeContour -> MakeByPocket corretto un bug che provocava la cancellazione della feature dopo averla lavorata
Versione 2.5l1 (13/12/2023)
- Modif : modifiche a WallExec, WallLib, FeatureTopology per allineamento Topology con Beam
- Modif : in FreeContour -> MakeByPocket aggiunta la possibilità di svuotare tasche passanti
- Modif : in FreeContour -> MakeByPocket in tasche speciali cliente 90480029 forzato step unico
Versione 2.5k1 (14/11/2023)
- Added : aggiunte lavorazioni in doppio.
- Modif : miglioramenti vari alla lavorazione tasche, in particolare in presenza di pezzi vicini.
Versione 2.5j3 (23/10/2023)
- Added : aggiunta gestione aree vietate per chiodature (LockOut for Nail)
- Modif : in FreeContour conversione automatica di facce non fattibili con lama per limiti di orientamento in facce da fare con fresa.
+3 -3
View File
@@ -1,6 +1,6 @@
-- Version.lua by Egalware s.r.l. 2023/10/11
-- Version.lua by Egalware s.r.l. 2025/07/17
-- Gestione della versione di Wall
NAME = 'Wall'
VERSION = '2.5j3'
MIN_EXE = '2.5b3'
VERSION = '2.7i2'
MIN_EXE = '2.7f2'
View File