Share

Script27_ColorMeshWithAnalysisResults.lua

-- Lua example for Autodesk Netfabb 2021.1

-- Runs physics packing

PhysicsTimestep = {
    [0] = 0.005,
    [1] = 0.010,
    [2] = 0.015,
    [3] = 0.025,
    [4] = 0.040,
    [5] = 0.075,
    [6] = 0.100
}

PhysicsVoxels = {
    [0] = 200000,
    [1] = 150000,
    [2] = 100000,
    [3] = 75000,
    [4] = 50000,
    [5] = 25000,
    [6] = 10000
}

PhysicsDistance = {
    [0] = 0.0,
    [1] = 0.5,
    [2] = 1.0,
    [3] = 1.5,
    [4] = 2.0,
    [5] = 2.5,
    [6] = 3.0,
    [7] = 3.5,
    [8] = 4.0,
    [9] = 4.5,
    [10] = 5.0
}

dialog_arrangeparts = application:createdialog()
dialog_arrangeparts.caption = "Physics packing"
dialog_arrangeparts.translatecaption = false

dialog_arrangeparts_timestep = dialog_arrangeparts:adddropdown()
dialog_arrangeparts_timestep.captionwidth = 150
dialog_arrangeparts_timestep.caption = "Time step"
dialog_arrangeparts_timestep.translatecaption = false

for i = 0, table.getn(PhysicsTimestep) do
    dialog_arrangeparts_timestep:additem(tostring(PhysicsTimestep[i]), i, i, false)
end

dialog_arrangeparts_voxels = dialog_arrangeparts:adddropdown()
dialog_arrangeparts_voxels.captionwidth = 150
dialog_arrangeparts_voxels.caption = "Voxels"
dialog_arrangeparts_voxels.translatecaption = false

for i = 0, table.getn(PhysicsVoxels) do
    dialog_arrangeparts_voxels:additem(tostring(PhysicsVoxels[i]), i, i, false)
end

dialog_arrangeparts_partdistance = dialog_arrangeparts:adddropdown()
dialog_arrangeparts_partdistance.captionwidth = 150
dialog_arrangeparts_partdistance.caption = "FORM_DEFAULT_PHYSICSPACKING_PARTDISTANCE"

for i = 0, table.getn(PhysicsDistance) do
    dialog_arrangeparts_partdistance:additem(string.format("%.1f", PhysicsDistance[i]) .. " mm", i, i, false)
end

dialog_arrangeparts_itemrotation = dialog_arrangeparts:adddropdown()
dialog_arrangeparts_itemrotation.captionwidth = 150
dialog_arrangeparts_itemrotation.caption = "FORM_DEFAULT_PHYSICSPACKING_ROTATION"

dialog_arrangeparts_itemrotation:additem("FORM_DEFAULT_PHYSICSPACKING_ROTATION_ARBITRARY", 0, 0)
dialog_arrangeparts_itemrotation:additem("FORM_DEFAULT_PHYSICSPACKING_ROTATION_ZONLY", 1, 1)
dialog_arrangeparts_itemrotation:additem("FORM_DEFAULT_PHYSICSPACKING_ROTATION_NONE", 2, 2)

dialog_arrangeparts_walldistancexy = dialog_arrangeparts:adddropdown()
dialog_arrangeparts_walldistancexy.caption = "FORM_DEFAULT_PHYSICSPACKING_BORDERSPACINGXY"
dialog_arrangeparts_walldistancexy.captionwidth = 150

for i = 0, table.getn(PhysicsDistance) do
    dialog_arrangeparts_walldistancexy:additem(string.format("%.1f", PhysicsDistance[i]) .. " mm", i, i, false)
end

dialog_arrangeparts_walldistancez = dialog_arrangeparts:adddropdown()
dialog_arrangeparts_walldistancez.caption = "FORM_DEFAULT_PHYSICSPACKING_BORDERSPACINGZ"
dialog_arrangeparts_walldistancez.captionwidth = 150

for i = 0, table.getn(PhysicsDistance) do
    dialog_arrangeparts_walldistancez:additem(string.format("%.1f", PhysicsDistance[i]) .. " mm", i, i, false)
end

dialog_arrangeparts_onlyselected = dialog_arrangeparts:addcheckbox()
dialog_arrangeparts_onlyselected.caption = "FORM_DEFAULT_MODELINFO_SELECTEDPARTS"

function dialog_partarrange_onokclick()
    local TimeStep = PhysicsTimestep[tonumber(dialog_arrangeparts_timestep.selecteditem)]
    local Voxels = PhysicsVoxels[tonumber(dialog_arrangeparts_voxels.selecteditem)]

    local PartDistance = PhysicsDistance[dialog_arrangeparts_partdistance.selecteditem]
    local BorderSpaceXY = PhysicsDistance[dialog_arrangeparts_walldistancexy.selecteditem]
    local BorderSpaceZ = PhysicsDistance[dialog_arrangeparts_walldistancez.selecteditem]
    local ItemRotation = dialog_arrangeparts_itemrotation.selecteditem
    local Packer = netfabbtrayhandler:gettray(0):createpacker(netfabbtrayhandler:gettray(0).packingid_physics)

    Packer.timestep = TimeStep
    Packer.minimaldistance = PartDistance
    Packer.itemrotation = ItemRotation
    Packer.onlyselected = false
    Packer.onlyselected = dialog_arrangeparts_onlyselected.checked
    Packer.borderspacingxy = BorderSpaceXY
    Packer.borderspacingz = BorderSpaceZ

    Packer:pack()

    Packer:release()

    dialog_arrangeparts:close(true)
end

function dialog_partarrange_oncancelclick()
    dialog_arrangeparts:close(false)
end

splitter = dialog_arrangeparts:addsplitter()

splitter:settoleft()
button = splitter:addbutton()
button.caption = "GENERAL_OK"
button.onclick = "dialog_partarrange_onokclick"

splitter:settoright()
button = splitter:addbutton()
button.caption = "GENERAL_CANCEL"
button.onclick = "dialog_partarrange_oncancelclick"

dialog_arrangeparts:show()

Was this information helpful?