Machsupport Forum
Mach Discussion => VB and the development of wizards => Topic started by: Aaron P. on April 06, 2023, 06:06:23 PM
-
I'm trying to create a single file that lets me make whatever parts I need. It's mostly working in that I can call a G-code subroutine, but if I try to call multiple subroutines it does not work as expected. It will run the last subroutine the number of times of the total number of subroutines. For example, if I tell it to run the MakeD20.tap and the MakeD12.tap it will run the MakeD12.tap twice. Any help would be much appreciated.
The code:
'====== Dice Vending Machine ======
'M301
'Last edited 4/6/2023 by Aaron Potts
Sub Main
'Last argument for Dialog is not asigning an id, it is specifying the
'function that will handle interactions with the dialog elements.
Begin Dialog DiceVendingMachine 200, 150, "Dice Vending Machine v1.0", .DialogHandler
OKButton 10, 130, 40, 15, .ok
CancelButton 152, 130, 40, 15, .cancel
OptionGroup .diceChoiceGroup
OptionButton 20, 10, 40, 10, "Full Poly", .fullPoly
OptionButton 75, 10, 50, 10, "Poly, No D6", .polyNoD6
CheckBox 140, 10, 40, 10, "Custom", .custom
GroupBox 10, 30, 180, 90, "Custom Run:", .customGroup
CheckBox 40, 45, 40, 10, "D20", .d20Check
Text 90, 45, 40, 10, "How Many?", .d20Text
TextBox 135, 45, 20, 10, .d20Qty
CheckBox 40, 57, 40, 10, "D12", .d12Check
Text 90, 57, 40, 10, "How Many?", .d12Text
TextBox 135, 57, 20, 10, .d12Qty
CheckBox 40, 69, 40, 10, "D10", .d10Check
Text 90, 69, 40, 10, "How Many?", .d10Text
TextBox 135, 69, 20, 10, .d10Qty
CheckBox 40, 81, 40, 10, "D8", .d8Check
Text 90, 81, 40, 10, "How Many?", .d8Text
TextBox 135, 81, 20, 10, .d8Qty
CheckBox 40, 93, 40, 10, "D6", .d6Check
Text 90, 93, 40, 10, "How Many?", .d6Text
TextBox 135, 93, 20, 10, .d6Qty
CheckBox 40, 105, 40, 10, "D4", .d4Check
Text 90, 105, 40, 10, "How Many?", .d4Text
TextBox 135, 105, 20, 10, .d4Qty
End Dialog
'Initialize a dialog object.
Dim DVM As DiceVendingMachine
'Store the value returned from the dialog:
'-1 = OK
'0 = Cancel
buttonPressed = Dialog(DVM) 'This line is necessary.
If DVM.diceChoiceGroup = 0 And DVM.custom = 0 Then
Code "M98 (Automated Dice Set 4D6 Rotary.TAP)"
End If
If DVM.diceChoiceGroup = 1 And DVM.custom = 0 Then
Code "M98 (Automated Dice Set No D6.TAP)"
End If
If DVM.d20Check = 1 And DVM.custom = 1 Then
Code "M98 (Make D20.tap) L" & DVM.d20Qty
End If
If DVM.d12Check = 1 And DVM.custom = 1 Then
Code "M98 (Make D12.tap) L" & DVM.d12Qty
End If
If DVM.d10Check = 1 And DVM.custom = 1 Then
Code "M98 (Make D10.tap) L" & DVM.d10Qty
End If
If DVM.d8Check = 1 And DVM.custom = 1 Then
Code "M98 (Make D8.tap) L" & DVM.d8Qty
End If
If DVM.d6Check = 1 And DVM.custom = 1 Then
Code "M98 (Make D6.tap) L" & DVM.d6Qty
End If
If DVM.d4Check = 1 And DVM.custom = 1 Then
Code "M98 (Make D4.tap) L" & DVM.d4Qty
End If
End Sub
'A function is required to control visibility of dialog elements.
Function DialogHandler(ControlID$, Action%, SuppValue%)
'Toggle visibility of custom dice elements.
Select Case Action%
Case 1 'Action% = 1 when the dialog is first called.
DlgEnable "customGroup", 0
DlgVisible "d20Check", 0
DlgVisible "d20Text", 0
DlgVisible "d20Qty", 0
DlgEnable "d20Text", 0
DlgEnable "d20Qty", 0
DlgVisible "d12Check", 0
DlgVisible "d12Text", 0
DlgVisible "d12Qty", 0
DlgEnable "d12Text", 0
DlgEnable "d12Qty", 0
DlgVisible "d10Check", 0
DlgVisible "d10Text", 0
DlgVisible "d10Qty", 0
DlgEnable "d10Text", 0
DlgEnable "d10Qty", 0
DlgVisible "d8Check", 0
DlgVisible "d8Text", 0
DlgVisible "d8Qty", 0
DlgEnable "d8Text", 0
DlgEnable "d8Qty", 0
DlgVisible "d6Check", 0
DlgVisible "d6Text", 0
DlgVisible "d6Qty", 0
DlgEnable "d6Text", 0
DlgEnable "d6Qty", 0
DlgVisible "d4Check", 0
DlgVisible "d4Text", 0
DlgVisible "d4Qty", 0
DlgEnable "d4Text", 0
DlgEnable "d4Qty", 0
Case 2 'Action% = 2 anytime there is an interaction with an element other than a TextBox or ComboBox.
If ControlID$ = "custom" Then
'If no 0 or 1 after, then toggles elements.
DlgEnable "fullPoly"
DlgEnable "polyNoD6"
DlgEnable "customGroup"
DlgVisible "d20Check"
DlgVisible "d20Text"
DlgVisible "d20Qty"
DlgVisible "d12Check"
DlgVisible "d12Text"
DlgVisible "d12Qty"
DlgVisible "d10Check"
DlgVisible "d10Text"
DlgVisible "d10Qty"
DlgVisible "d8Check"
DlgVisible "d8Text"
DlgVisible "d8Qty"
DlgVisible "d6Check"
DlgVisible "d6Text"
DlgVisible "d6Qty"
DlgVisible "d4Check"
DlgVisible "d4Text"
DlgVisible "d4Qty"
End If
If ControlID$ = "d20Check" Then
DlgEnable "d20Text"
DlgEnable "d20Qty"
End If
If ControlID$ = "d12Check" Then
DlgEnable "d12Text"
DlgEnable "d12Qty"
End If
If ControlID$ = "d10Check" Then
DlgEnable "d10Text"
DlgEnable "d10Qty"
End If
If ControlID$ = "d8Check" Then
DlgEnable "d8Text"
DlgEnable "d8Qty"
End If
If ControlID$ = "d6Check" Then
DlgEnable "d6Text"
DlgEnable "d6Qty"
End If
If ControlID$ = "d4Check" Then
DlgEnable "d4Text"
DlgEnable "d4Qty"
End If
If ControlID$ = "ok" Then
Exit Function 'By default, OK buton doesn't do anything.
End If
End Select
End Function
-
you can try to use the teachfile for this (not tested!!):
'====== Dice Vending Machine ======
'M301
'Last edited 4/6/2023 by Aaron Potts
Sub Main
'Last argument for Dialog is not asigning an id, it is specifying the
'function that will handle interactions with the dialog elements.
Begin Dialog DiceVendingMachine 200, 150, "Dice Vending Machine v1.0", .DialogHandler
OKButton 10, 130, 40, 15, .ok
CancelButton 152, 130, 40, 15, .cancel
OptionGroup .diceChoiceGroup
OptionButton 20, 10, 40, 10, "Full Poly", .fullPoly
OptionButton 75, 10, 50, 10, "Poly, No D6", .polyNoD6
CheckBox 140, 10, 40, 10, "Custom", .custom
GroupBox 10, 30, 180, 90, "Custom Run:", .customGroup
CheckBox 40, 45, 40, 10, "D20", .d20Check
Text 90, 45, 40, 10, "How Many?", .d20Text
TextBox 135, 45, 20, 10, .d20Qty
CheckBox 40, 57, 40, 10, "D12", .d12Check
Text 90, 57, 40, 10, "How Many?", .d12Text
TextBox 135, 57, 20, 10, .d12Qty
CheckBox 40, 69, 40, 10, "D10", .d10Check
Text 90, 69, 40, 10, "How Many?", .d10Text
TextBox 135, 69, 20, 10, .d10Qty
CheckBox 40, 81, 40, 10, "D8", .d8Check
Text 90, 81, 40, 10, "How Many?", .d8Text
TextBox 135, 81, 20, 10, .d8Qty
CheckBox 40, 93, 40, 10, "D6", .d6Check
Text 90, 93, 40, 10, "How Many?", .d6Text
TextBox 135, 93, 20, 10, .d6Qty
CheckBox 40, 105, 40, 10, "D4", .d4Check
Text 90, 105, 40, 10, "How Many?", .d4Text
TextBox 135, 105, 20, 10, .d4Qty
End Dialog
'Initialize a dialog object.
Dim DVM As DiceVendingMachine
'Store the value returned from the dialog:
'-1 = OK
'0 = Cancel
buttonPressed = Dialog(DVM) 'This line is necessary.
'Create a new Teach File in Mach3\Gcode
MyTeachFile = "TeachMe.nc"
Err = OpenTeachFile(MyTeachFile)
If Err <> 0 Then
If DVM.diceChoiceGroup = 0 And DVM.custom = 0 Then
Code "M98 (Automated Dice Set 4D6 Rotary.TAP)"
End If
If DVM.diceChoiceGroup = 1 And DVM.custom = 0 Then
Code "M98 (Automated Dice Set No D6.TAP)"
End If
If DVM.d20Check = 1 And DVM.custom = 1 Then
Code "M98 (Make D20.tap) L" & DVM.d20Qty
End If
If DVM.d12Check = 1 And DVM.custom = 1 Then
Code "M98 (Make D12.tap) L" & DVM.d12Qty
End If
If DVM.d10Check = 1 And DVM.custom = 1 Then
Code "M98 (Make D10.tap) L" & DVM.d10Qty
End If
If DVM.d8Check = 1 And DVM.custom = 1 Then
Code "M98 (Make D8.tap) L" & DVM.d8Qty
End If
If DVM.d6Check = 1 And DVM.custom = 1 Then
Code "M98 (Make D6.tap) L" & DVM.d6Qty
End If
If DVM.d4Check = 1 And DVM.custom = 1 Then
Code "M98 (Make D4.tap) L" & DVM.d4Qty
End If
'Close the Teach file
Code "M30"
CloseTeachFile()
'Now load the teach file for execution
Call LoadTeachFile()
Else
'OpenTeachFile failed
Message "Unable to open Teach File"
End If
End Sub
'A function is required to control visibility of dialog elements.
Function DialogHandler(ControlID$, Action%, SuppValue%)
'Toggle visibility of custom dice elements.
Select Case Action%
Case 1 'Action% = 1 when the dialog is first called.
DlgEnable "customGroup", 0
DlgVisible "d20Check", 0
DlgVisible "d20Text", 0
DlgVisible "d20Qty", 0
DlgEnable "d20Text", 0
DlgEnable "d20Qty", 0
DlgVisible "d12Check", 0
DlgVisible "d12Text", 0
DlgVisible "d12Qty", 0
DlgEnable "d12Text", 0
DlgEnable "d12Qty", 0
DlgVisible "d10Check", 0
DlgVisible "d10Text", 0
DlgVisible "d10Qty", 0
DlgEnable "d10Text", 0
DlgEnable "d10Qty", 0
DlgVisible "d8Check", 0
DlgVisible "d8Text", 0
DlgVisible "d8Qty", 0
DlgEnable "d8Text", 0
DlgEnable "d8Qty", 0
DlgVisible "d6Check", 0
DlgVisible "d6Text", 0
DlgVisible "d6Qty", 0
DlgEnable "d6Text", 0
DlgEnable "d6Qty", 0
DlgVisible "d4Check", 0
DlgVisible "d4Text", 0
DlgVisible "d4Qty", 0
DlgEnable "d4Text", 0
DlgEnable "d4Qty", 0
Case 2 'Action% = 2 anytime there is an interaction with an element other than a TextBox or ComboBox.
If ControlID$ = "custom" Then
'If no 0 or 1 after, then toggles elements.
DlgEnable "fullPoly"
DlgEnable "polyNoD6"
DlgEnable "customGroup"
DlgVisible "d20Check"
DlgVisible "d20Text"
DlgVisible "d20Qty"
DlgVisible "d12Check"
DlgVisible "d12Text"
DlgVisible "d12Qty"
DlgVisible "d10Check"
DlgVisible "d10Text"
DlgVisible "d10Qty"
DlgVisible "d8Check"
DlgVisible "d8Text"
DlgVisible "d8Qty"
DlgVisible "d6Check"
DlgVisible "d6Text"
DlgVisible "d6Qty"
DlgVisible "d4Check"
DlgVisible "d4Text"
DlgVisible "d4Qty"
End If
If ControlID$ = "d20Check" Then
DlgEnable "d20Text"
DlgEnable "d20Qty"
End If
If ControlID$ = "d12Check" Then
DlgEnable "d12Text"
DlgEnable "d12Qty"
End If
If ControlID$ = "d10Check" Then
DlgEnable "d10Text"
DlgEnable "d10Qty"
End If
If ControlID$ = "d8Check" Then
DlgEnable "d8Text"
DlgEnable "d8Qty"
End If
If ControlID$ = "d6Check" Then
DlgEnable "d6Text"
DlgEnable "d6Qty"
End If
If ControlID$ = "d4Check" Then
DlgEnable "d4Text"
DlgEnable "d4Qty"
End If
If ControlID$ = "ok" Then
Exit Function 'By default, OK buton doesn't do anything.
End If
End Select
End Function
-
TPS, thank you for your help! I was not able to get a teach file working, but it started me in the right direction.
For future searchers, here's the VBScript I was able to get working with Mach3 on Windows 10 to run multiple G-code subroutines:
'Just an easy place to put the file path:
customSubroutine = "C:\Mach3\Subroutines\Make Custom.tap"
'Creates a new file or overwrites an existing file.
Open customSubroutine For Output As #1
'Each Print statement writes a new line to the file:
Print #1, "%" '<-- Subroutine boilerplate.
Print #1, "M98 (SomeSubroutine.tap)"
Print #1, "M98 (SomeOtherSubroutine.tap)"
Print #1, "M99" '<-- Subroutine boilerplate.
Print #1, "%" '<-- Subroutine boilerplate.
'Close the file:
Close #1
'Call the new subroutine file:
Code "M98 (Make Custom.tap)"