Handle/update the checked state of a menu item

Thanks! I was missing the step of storing an attribute for each independent variable and doing something in the event handler to change the menu items from checked to unchecked. Your samples allowed me to get my first custom context menu working! It’s good enough for what I was hoping to accomplish. Thank you again for all of your help!

Below is the code that worked for me. Note: Rhino 6, (6.7.18190.21071, 07/09/2018). GH python component in SDK mode.

from ghpythonlib.componentbase import executingcomponent as component
from System.Windows.Forms import ToolStripSeparator
import Grasshopper, GhPython
import System
import Rhino
import rhinoscriptsyntax as rs
import math
import fractions

class decFtConverter(component):
    def __init__(self):
        super(decFtConverter,self).__init__()
        self.factor = 1
        self.checked1 = False
        self.checked2 = False
        self.checked3 = False
    
    def RunScript(self,decIn):
        if self.factor == 1: 
            ftIn = decIn
            self.Message = "Make a Choice"
        else: ftIn = self.feet_inches(decIn)
        return ftIn
        
    def feet_inches(self,decimal):
        tol = round(decimal * self.factor)
        b = math.modf(tol / self.factor)
        feet = int(b[1] // 12)
        inch = int(b[1] % 12)
        fract = fractions.Fraction(b[0])
        if fract == 0:
            fract = ""
        fi= str(feet)+"'- "+str(inch)+" "+str(fract)+'"'
        return fi

    def AppendAdditionalMenuItems(self, items):
        try: #always everything inside try
            #context menu item 1
            component.AppendAdditionalMenuItems(self, items)
            image = None
            items.Items.Add(ToolStripSeparator())
            item = items.Items.Add("Round to 1/2", image, self.OnClicked1)
            item.ToolTipText = "Round 1/2";
            item.Name = "2";
            item.Checked = self.checked1
            #context menu item 2
            item = items.Items.Add("Round to 1/4", image, self.OnClicked2)
            item.ToolTipText = "Round 1/4 ";
            item.Name = "4";
            item.Checked = self.checked2
            #context menu item 3
            item = items.Items.Add("Round to 1/8", image, self.OnClicked3)
            item.ToolTipText = "Round 1/8";
            item.Name = "8";
            item.Checked = self.checked3
        except Exception, ex:
            System.Windows.Forms.MessageBox.Show(str(ex))
            
    def OnClicked1(self, index, value):
        try: #always everything inside try
            self.checked1 = not self.checked1
            self.checked2 = False
            self.checked3 = False
            self.factor = int(index.Name)
            self.Message = (index.ToolTipText)
            self.ExpireSolution(True)
        except Exception, ex:
            System.Windows.Forms.MessageBox.Show(str(ex))
    
    def OnClicked2(self, index, value):
        try: #always everything inside try
            self.checked2 = not self.checked2
            self.checked1 = False
            self.checked3 = False
            self.factor = int(index.Name)
            self.Message = (index.ToolTipText)
            self.ExpireSolution(True)
        except Exception, ex:
            System.Windows.Forms.MessageBox.Show(str(ex))
            
    def OnClicked3(self, index, value):
        try: #always everything inside try
            self.checked3 = not self.checked3
            self.checked1 = False
            self.checked2 = False
            self.factor = int(index.Name)
            self.Message = (index.ToolTipText)
            self.ExpireSolution(True)
        except Exception, ex:
            System.Windows.Forms.MessageBox.Show(str(ex))

References:
converter function from here: Dimensions help - python
initial samples and discussions here: Button and context menu options on component through GhPython

GHPy_SDKMode_contextMenu.gh (5.9 KB)

4 Likes