Script11_PricingDemo.lua
-- Lua example for Autodesk Netfabb 2019.0
-- Demonstrates dialog functionality
-- Calculates prices for all parts in a tray
maindialog = nil
resultdialog = nil
edit_ConversionDownSkinToEuro = nil
edit_ConversionVolumeToEuro = nil
ConversionDownSkinToEuro = 10
ConversionVolumeToEuro = 20
price = 0
partname = ""
function showmaindialog()
local dialog, edit, combobox, splitter, button
dialog = application:createdialog()
dialog.caption = "Calculate price"
dialog.width = 600
dialog.translatecaption = false
maindialog = dialog
edit = dialog:addedit()
edit.caption = "Post-processing hourly rate"
edit.captionwidth = 200
edit.text = "100 Euro"
edit.translate = false
edit = dialog:addedit()
edit.caption = "Build speed"
edit.captionwidth = 200
edit.translate = false
edit.text = "5 cm³/h"
edit = dialog:addedit()
edit.caption = "€/cm² downskin"
edit.captionwidth = 200
edit.translate = false
edit.text = string.format("%.3f", ConversionDownSkinToEuro)
edit_ConversionDownSkinToEuro = edit
edit = dialog:addedit()
edit.caption = "€/cm³ part"
edit.captionwidth = 200
edit.translate = false
edit.text = string.format("%.3f", ConversionVolumeToEuro)
edit_ConversionVolumeToEuro = edit
combobox = dialog:adddropdown()
combobox.caption = "Select option"
combobox.customdraw = true --needs to be enabled for color changes in dropdown
combobox.captionwidth = 200
--combobox.backgroundcolor = '$AAAAAA';
combobox.enabled = true
combobox.translate = false
combobox:additem("Simple part", 1, false, false, 0, "$BF0000")
combobox:additem("Average part", 2, false, false, 0, "$00BF00")
combobox:additem("Difficult part", 3, false, false, 0, "$0000BF")
--Demo for making checkbox with colored font
--splitter = dialog:addsplitter ();
--splitter:settoleft ();
--label = splitter:addlabel ();
--label.caption = "For checkbox";
--label.fontcolor = "$00FF00";
--label.translate = false;
--splitter:settoright ();
--checkbox = splitter:addcheckbox();
splitter = dialog:addsplitter()
splitter:settoleft()
button = splitter:addbutton()
button.caption = "OK"
button.translate = false
button.onclick = "maindialog_ok"
splitter:settoright()
button = splitter:addbutton()
button.caption = "Cancel"
button.translate = false
button.onclick = "maindialog_oncancel"
if dialog:show() then
ConversionDownSkinToEuro = tonumber(edit_ConversionDownSkinToEuro.text)
ConversionVolumeToEuro = tonumber(edit_ConversionVolumeToEuro.text)
return true
end
return false
end
function maindialog_ok()
maindialog:close(true)
end
function maindialog_oncancel()
maindialog:close(false)
end
function resultdialog_ok()
resultdialog:close(true)
end
function resultdialog_oncancel()
resultdialog:close(false)
end
function resultdialog_upload()
url = string.format("http://localhost/newquote/name=%s&price=%.2f", partname, price)
system:shellexecute(url)
end
function showresultdialog(mesh, analyzer, price)
local dialog, edit, combobox, splitter, button
dialog = application:createdialog()
dialog.caption = "Price calculation"
dialog.width = 600
dialog.translatecaption = false
resultdialog = dialog
edit = dialog:addedit()
edit.caption = "Part name"
edit.captionwidth = 200
edit.text = mesh.name
edit.readonly = true
edit.translate = false
partname = mesh.name
outbox = mesh:calcoutbox()
edit = dialog:addedit()
edit.caption = "Size"
edit.captionwidth = 200
edit.text = string.format("%.3f × %.3f × %.3f mm", outbox.sizex, outbox.sizey, outbox.sizez)
edit.readonly = true
edit.translate = false
edit = dialog:addedit()
edit.caption = "Volume"
edit.captionwidth = 200
edit.text = string.format("%.3f cm³", mesh.volume / 1000.0)
edit.readonly = true
edit.translate = false
edit = dialog:addedit()
edit.caption = "Upskin area"
edit.captionwidth = 200
edit.text = string.format("%.3f cm²", analyzer.upskinarea / 100.0)
edit.readonly = true
edit.translate = false
edit = dialog:addedit()
edit.caption = "Downskin area"
edit.captionwidth = 200
edit.text = string.format("%.3f cm²", analyzer.downskinarea / 100.0)
edit.readonly = true
edit.translate = false
edit = dialog:addedit()
edit.caption = "Shadow area"
edit.captionwidth = 200
edit.text = string.format("%.3f cm²", analyzer.shadowarea / 100.0)
edit.readonly = true
edit.translate = false
edit = dialog:addedit()
edit.caption = "Support volume"
edit.captionwidth = 200
edit.text = string.format("%.3f cm³", analyzer.supportvolume / 1000.0)
edit.readonly = true
edit.translate = false
edit = dialog:addedit()
edit.caption = "Price"
edit.captionwidth = 200
edit.text = string.format("%.2f €", price)
edit.readonly = true
edit.translate = false
edit.customcolor = 256 * 255
splitter2 = dialog:addsplitter()
splitter2:settoleft()
button = splitter2:addbutton()
button.caption = "Upload to server"
button.translate = false
button.onclick = "resultdialog_upload"
splitter2:settoright()
splitter = splitter2:addsplitter()
splitter:settoleft()
button = splitter:addbutton()
button.caption = "Next part"
button.translate = false
button.onclick = "resultdialog_ok"
splitter:settoright()
button = splitter:addbutton()
button.caption = "Cancel"
button.translate = false
button.onclick = "resultdialog_oncancel"
return dialog:show()
end
function analysepart(mesh)
local meshobject = mesh.mesh
local analyzer = meshobject:createanalyzer()
analyzer:createupskindownskinanalysis(45, 45, 10, true)
analyzer:createshadowareaanalysis()
analyzer:createsupportvolumeanalysis(45)
price = analyzer.upskinarea / 1000 * ConversionDownSkinToEuro + mesh.volume / 10000 * ConversionVolumeToEuro
return showresultdialog(mesh, analyzer, price)
end
if showmaindialog() then
local root = tray.root -- Iterate meshes in group
for mesh_index = 0, root.meshcount - 1 do
local mesh = root:getmesh(mesh_index)
if not analysepart(mesh) then
return
end
end
else
return
end