macroScript gp_proCutAndRelink category:"gp_tools" tooltip:"gp_proCutAndRelink" ( rollout gp_proCutAndRelinkRollout "proCutAndRelink" width:320 height:472 ( listbox lbx_stock "cut those" pos:[8,8] width:150 height:30 listbox lbx_cutters "with those" pos:[168,8] width:144 height:30 button btn_refreshStock "Refresh STOCK" pos:[16,424] width:130 height:16 button btn_refreshCutters "Refresh CUTTERS" pos:[176,424] width:130 height:16 button btn_doCut "Do cut!" pos:[88,448] width:144 height:18 on gp_proCutAndRelinkRollout open do( --arrayDefinition... global gp_stockArr = #() global gp_cutterArr = #() global stockNames = #() global cutterNames = #() global gp_copyCutterArr = #() global gp_systemExeptionArr = #() global gp_invalidStockArr = #() --variables definition... global gp_generalSuccess = true --layer creation... if (LayerManager.getLayerfromName "gp_02_copyStock") == undefined then( LayerManager.newLayerFromName "gp_02_copyStock" ) if (LayerManager.getLayerfromName "gp_02_copyCutter") == undefined then( LayerManager.newLayerFromName "gp_02_copyCutter" ) if (LayerManager.getLayerfromName "gp_02_freshCuts") == undefined then( LayerManager.newLayerFromName "gp_02_freshCuts" ) if (LayerManager.getLayerfromName "gp_03_cutAndRelinked") == undefined then( LayerManager.newLayerFromName "gp_03_cutAndRelinked" local stockNames = #() local cutterNames = #() gp_stockArr = selection as array for s in gp_stockArr do( append stockNames s.name ) lbx_stock.items = stockNames ) ) on btn_refreshStock pressed do( local stockNames = #() local cutterNames = #() gp_stockArr = selection as array for s in gp_stockArr do( if (findItem gp_cutterArr s) !=0 then deleteItem gp_cutterArr (findItem gp_cutterArr s) append stockNames s.name ) for c in gp_cutterArr do( append cutterNames c.name ) lbx_cutters.items = cutterNames lbx_stock.items = stockNames ) on btn_refreshCutters pressed do( local stockNames = #() local cutterNames = #() gp_cutterArr = selection as array for c in gp_cutterArr do ( if (findItem gp_stockArr c) !=0 then deleteItem gp_stockArr (findItem gp_stockArr c) append cutterNames c.name ) for s in gp_stockArr do( append stockNames s.name ) lbx_stock.items = stockNames lbx_Cutters.items = cutterNames ) --copy Cutter Objects Function Def... fn gp_cutterCompoundFN = ( global gp_cutterSuccess = true for i in gp_cutterArr do( gp_cutterMat = i.Material gp_copyCutter = snapshot i hide i gp_copyCutter.name = (i.name + "_gp_copy") gp_copyCutter.Material = gp_cutterMat convertToPoly gp_copyCutter (LayerManager.getLayerFromName "gp_02_copyCutter").addNode gp_copyCutter append gp_copyCutterArr gp_copyCutter ) --create Compund of cutters... global gp_compound = gp_copyCutterArr[1] (LayerManager.getLayerFromName "gp_02_copyCutter").current = true --switchLayers try( proCutter.CreateCutter gp_copyCutterArr 4 true true false true true ProCutter.setPlanarEdgeRemoval gp_compound 2 ) catch( global gp_cutterSuccess = false ) gp_copyCutterArr = #() ) --copy Stock Objects and save parent, wirecolor, size etc Function Def... fn gp_proCutFN gp_arrayToCut = ( for stockObject = 1 to gp_arrayToCut.count do( if (isValidNode gp_arrayToCut[stockObject]) == true then( gp_success = true gp_oriStock = gp_arrayToCut[stockObject] gp_size = length(gp_oriStock.max-gp_oriStock.min) gp_parent = gp_oriStock.parent gp_wirecolor = gp_oriStock.wirecolor gp_stockMat = gp_oriStock.Material gp_copyStock = snapShot gp_oriStock gp_copyStock.name = (gp_oriStock.name +"_gp_copy") gp_copyStock.Material = gp_stockMat convertToPoly gp_copyStock (LayerManager.getLayerfromName "gp_02_copyStock").addNode gp_copyStock --add the stock to the compund... (LayerManager.getLayerfromName "gp_02_freshCuts").current = true --switchLayers if gp_cutterSuccess = true then( try(ProCutter.AddStocks gp_compound #(gp_copyStock) 4 2) catch( append gp_systemExeptionArr gp_oriStock gp_success = false ) ) else( append gp_systemExeptionArr gp_oriStock gp_success = false ) try(completeRedraw()) catch( append gp_systemExeptionArr gp_oriStock gp_success = false ) --check for invalids... (LayerManager.getLayerfromName "gp_02_freshCuts").nodes &gp_freshCuts if gp_freshCuts.count == 0 then gp_success = false else( for freshCut = 1 to gp_freshCuts.count do( convertToPoly gp_freshCuts[freshCut] case of( (gp_size < length(gp_freshCuts[freshCut].max - gp_freshCuts[freshCut].min)): gp_success = false ((polyop.getNumVerts gp_freshCuts[freshCut]) < 4): gp_success = false ((polyop.getOpenEdges gp_freshCuts[freshCut]).isEmpty == false): gp_success = false ) ) ) if gp_success == false then( delete gp_compound gp_cutterCompoundFN() append gp_invalidStockArr gp_oriStock gp_generalSuccess = false for obj = gp_freshCuts.count to 1 by -1 do( delete gp_freshCuts[obj] ) continue ) --when all went good, relink, rename, hide and delete... else( for i in gp_freshCuts do( i.name = uniqueName (gp_oriStock.name + "_cut_") i.wirecolor = gp_wirecolor i.parent = gp_parent centerPivot i resetXForm i convertToPoly i (LayerManager.getLayerFromName "gp_03_cutAndRelinked").addNode i ) hide gp_oriStock ) ) ) ) --onButtonPressed Do... on btn_doCut pressed do( gp_cutterCompoundFN() gp_proCutFN gp_stockArr --ask to run again for objects that gave system exeption... if gp_systemExeptionArr.count != 0 then( if (queryBox "do you want to try again to cut objects that\ngave a systemExeption message?" title:"some problemes...") == true then gp_proCutFN gp_systemExeptionArr ) delete gp_compound gp_arrayToCut = #() gp_cutterArr = #() stockNames = #() cutterNames = #() lbx_stock.items = stockNames lbx_Cutters.items = cutterNames --move objects that do invalids to separate layers... if gp_invalidStockArr.count != 0 then( if (LayerManager.getLayerfromName "gp_04_invalidStock") == undefined then( LayerManager.newLayerFromName "gp_04_invalidStock" ) for i in gp_invalidStockArr do( (LayerManager.getLayerfromName "gp_04_invalidStock").addnode i ) ) --inform user what was done... if gp_generalSuccess == true then( messageBox "all objects cut and relinked without any invalids.\n\nthe CutterObjects have been hidden\n\nplease SAVE and RESTART Max!" ) else( messageBox "operation done!\n\nThe objects with invalid booleans have been restored and moved to the\ngp_invalidStock Layer\n\nthe CutterObjects have been hidden\n\nplease SAVE and RESTART Max!" ) ) on gp_proCutAndRelinkRollout close do( --undefine... gp_cutterMat = gp_systemExeptionArr = gp_copyCutterArr = gp_selArr = gp_invalidStockArr = gp_generalSuccess = gp_oriStock = gp_copyStock = gp_size = gp_parent = gp_wireColor = gp_oriCutter = gp_copyCutter = gp_success = gp_compound = undefined ) ) createdialog gp_proCutAndRelinkRollout )