[GME-commit] GMESRC/SDK/DispatchSDK/Python GMEComComponent.py,NONE,1.1 Generator.py,NONE,1.1 PyGME.py,NONE,1.1 SelfRegistration.py,NONE,1.1 addon.xml,NONE,1.1 interpreter.xml,NONE,1.1 ReferenceInterpreter.py,1.7,NONE

gme-commit at list.isis.vanderbilt.edu gme-commit at list.isis.vanderbilt.edu
Thu Feb 16 23:23:56 CST 2006


Update of /project/gme-repository/GMESRC/SDK/DispatchSDK/Python
In directory escher:/tmp/cvs-serv19282/Python

Added Files:
	GMEComComponent.py Generator.py PyGME.py SelfRegistration.py 
	addon.xml interpreter.xml 
Removed Files:
	ReferenceInterpreter.py 
Log Message:
Updated Python interpreter framework (contributed by Larry)

CVS User: Peter Volgyesi, ISIS (volgy)

--- NEW FILE: interpreter.xml ---
<?xml version="1.0" encoding="UTF-8"?>
<component name="MyPython" version="1.0" type="Interpreter" paradigm="MetaGME">
    <iconpath value="Icons\pygme.ico" />
    <tooltip value="My Python Interpreter" />
</component>

--- NEW FILE: PyGME.py ---
# GME Python Component Framework
# (c) 2002-2006 ISIS, Vanderbilt University

import os.path, sys

# detect registration options
register = False
for arg in sys.argv:
    if arg.startswith('-register'):
        register = True
        sarg = arg.split('=')
        registry = len(sarg) == 2 and sarg[1] == 'system' and 2 or 1
        sys.argv.remove(arg)
        break
    
# detect specification file
if len(sys.argv) > 1:
    specPath = len(sys.argv) > 1 and os.path.split(sys.argv[1])[1] or 'component.xml'
    spath = os.path.split(sys.argv[1])
    gpath = os.path.split(sys.argv[0])
    genPath = os.path.splitdrive(sys.argv[1])[0] and spath[0] or \
              spath[0] and os.path.join(gpath[0], spath[0]) or gpath[0]
else:
    specPath = 'component.xml'
    genPath = os.path.split(sys.argv[0])[0]

# initialize specification dictionary
import pythoncom
specDict = {'tooltip' : '', 'iconpath' : '', 'clsid' : str(pythoncom.CreateGuid())}

# parse specification
from xml.dom.minidom import parse, Element
specXML = parse(os.path.join(genPath, specPath))
de = specXML.documentElement
for attr in ('name', 'version', 'type', 'paradigm'):
    specDict[attr] = getattr(de.attributes.get(attr), 'value', None)
    if specDict[attr] is None:
        print "Attribute '%s' is missing from 'component' tag."
    if attr == 'type' and specDict[attr] and specDict[attr] not in ('Interpreter', 'Addon'):
        print "Unrecognized component type.  Must be either 'Interpreter' or 'Addon'."
        specDict[attr] = None
if None in specDict.values():
    print "Component generation terminated due to specification errors."
else:
    # optional specifications
    if specDict['type'] == 'Interpreter':
        for c in de.childNodes:
            if isinstance(c, Element):
                specDict[c.nodeName] = getattr(c.attributes.get('value'), 'value', None)
        
        if specDict.get('iconpath'):
            spath = os.path.split(specDict['iconpath'])
            iconBase = os.path.splitdrive(specDict['iconpath'])[0] and spath[0] or \
                       spath[0] and os.path.join(genPath, spath[0]) or genPath
            specDict['iconpath'] = spath[1]
        else:
            iconBase = ''
    
    # generate component
    from Generator import InterpreterTemplate, AddonTemplate
    f = file(os.path.join(genPath, "%s.py" % specDict['name']), "w")
    f.write((specDict['type'] == 'Interpreter' and InterpreterTemplate or AddonTemplate) % specDict)
    f.close()
    
    # optionally, register component with COM and GME
    if register:
        if genPath not in sys.path:
            sys.path.insert(0, genPath)
        mod = __import__(specDict['name'])
        comp = getattr(mod, specDict['name'])
        comp.RegisterSelf(registry, specDict['type'] == 'Interpreter' and iconBase or '')

--- NEW FILE: GMEComComponent.py ---
# GME Python Component Framework
# (c) 2002-2006 ISIS, Vanderbilt University

import os.path, time

import win32com
from win32com.client import gencache
import winerror

gme_connection_string_prefix='MGA='

class GMEComComponent(object):

    # The following properties should be set for every GME interpreter
    # ----------------------------------------------------------------

    # Component specific parts for COM registration (you must change these values)
    _comname_ = "MyComponent"
    _comp_version_ = "1.0"
    _reg_clsid_ = "{2F841BDF-5EB3-4041-A66A-58A3B9EC3EA1}"
    
    # Boilerplate code for COM registration (same for all component, just copy & paste)
    _reg_desc_ = _comname_
    _reg_progid_ = "MGA.PythonInterpreter.%s" % _comname_
    _reg_verprogid_ = "MGA.PythonInterpreter.%s.%s" % (_comname_, _comp_version_)
    _reg_class_spec_ = "%s.%s" % (__module__, _comname_)

    try:
        mga  = gencache.EnsureModule("{270B4F86-B17C-11D3-9AD1-00AA00B6FE26}", 0, 1, 0)
        meta = gencache.EnsureModule("{0ADEEC71-D83A-11D3-B36B-005004D38590}", 0, 1, 0)
    except Exception,e:
        raise Exception("An error occured during GME Python component initialization.\n%s" % e)
     
    # Component specific parts for GME registration (uncomment and/or change)
    _component_type_ = mga.constants.COMPONENTTYPE_INTERPRETER
    #_reg_iconfile_ = "iconfile.ico"
    #_tooltip_ = "Python GME Component"
    _paradigm_ = 'MyParadigm'

    # ----------------------------------------------------------------
    # Boilerplate code for the invokes (same for all component, get them by inheritance)
    # ----------------------------------------------------------------
    componentParameters = {}
    InteractiveMode = 1
    _public_methods_ = ['Enable', 'Initialize', 'Invoke', 'GetComponentParameter', 'SetComponentParameter', 'ObjectsInvokeEx', 'InvokeEx']
    _public_attrs_ = ['InteractiveMode','ComponentName', 'ComponentType', 'Paradigm', 'ComponentProgID', 'Version']
    # ----------------------------------------------------------------

    def __init__(self):
        try:
            self.ComponentName = self._reg_desc_ 
            self.ComponentProgID = self._reg_progid_
            self.ComponentType = self._component_type_
            self.Paradigm = self._paradigm_
            mgautil = gencache.EnsureModule("{461F30AE-3BF0-11D4-B3F0-005004D38590}", 0, 1, 0)
            self.Version = mgautil.constants.MgaInterfaceVersion_Current

        except Exception,e:
            raise Exception("An error occured during GME Python component initialization.\n%s" % e)
        return None

    def Enable(self, b):
        pass

    def Initialize(self, project):
        pass
        
    def Invoke(self, project, sel, param):
        pass

    def GetComponentParameter(self, paramname):
        if paramname in self.componentParameters:
            return self.componentParameters[paramname]
        else:
            return winerror.S_OK

    def Logger(self, message, msgtype=1):
        # see GME.idl 'msgtype_enum' for definition of msgtype codes
        # message is (oddly enough) HTML
        if message:
            try:
                message = "%s %s" % (time.asctime(), message)
                client = self.project.GetClientByName("GME.Application")
                gme = client.OLEServer
                gme.ConsoleMessage(message, msgtype)
                import win32gui
                win32gui.PumpWaitingMessages()
            except:
                pass

    def SetComponentParameter(self, paramname, newval):
        self.componentParameters[paramname] = newval

    def ObjectsInvokeEx(self, project, currentobj, selectedobjs, param):
        pass

    def InvokeEx(self, project, currentobj=None, selectedobjs=None, param=None):
        try:
            self.project = self.mga.IMgaProject(project)
            self.project_path = os.path.dirname(str(self.project.ProjectConnStr[len(gme_connection_string_prefix):]))
        except Exception, e:
            raise Exception("An error occured during component execution.\n%s" % e)
        return winerror.S_OK

    def RegisterSelf(self, systemwide, icon_path=""):
        import SelfRegistration
        print '\n%s\n%s' % (self._reg_progid_, '-'*32)
        SelfRegistration.registerAsCOMComponent(self, icon_path)
        SelfRegistration.registerAsGMEComponent(self, systemwide, icon_path, self._component_type_)

    RegisterSelf = classmethod(RegisterSelf)
    
    def UnregisterSelf(self, systemwide):
        import SelfRegistration
        print '\n%s\n%s' % (self._reg_progid_, '-'*32)
        SelfRegistration.unregisterAsCOMComponent(self)
        SelfRegistration.unregisterAsGMEComponent(self, systemwide)

    UnregisterSelf=classmethod(UnregisterSelf)

--- NEW FILE: addon.xml ---
<?xml version="1.0" encoding="UTF-8"?>
<component name="MyPythonAddon" version="1.0" type="Addon" paradigm="MetaGME">
</component>

--- ReferenceInterpreter.py DELETED ---

--- NEW FILE: Generator.py ---
# GME Python Component Framework
# (c) 2002-2006 ISIS, Vanderbilt University

InterpreterTemplate = """\
from GMEComComponent import GMEComComponent

class %(name)s(GMEComComponent):

	# Component specific parts for COM registration
	_comname_ = "%(name)s"
	_comp_version_ = "%(version)s"
	_reg_clsid_ = "%(clsid)s"
	_reg_iconfile_ = "%(iconpath)s"
	
	_reg_desc_ = _comname_
	_reg_progid_ = "MGA.PythonInterpreter.%(name)s"
	_reg_verprogid_ = "MGA.PythonInterpreter.%(name)s.%(version)s"
	_reg_class_spec_ = "%%s.%%s" %% (__module__, _comname_)

	# Component specific parts for GME registration
	_tooltip_ = "%(tooltip)s"
	_paradigm_ = "%(paradigm)s"

	def InvokeEx(self, project, currentobj, selectedobjs, param):
		super(self.__class__, self).InvokeEx(project)
		aborted = False
		try:
			self.project.BeginTransaction(self.project.CreateTerritory(None, None, None))
			currentobj = currentobj and self.mga.IMgaModel(currentobj)

			# component work goes here
			self.Logger("Python component: %%s" %% self._comname_)
		finally:
			if not aborted:
				self.project.CommitTransaction()
"""

AddonTemplate = """\
from GMEComComponent import GMEComComponent
import winerror
from win32com.server.util import wrap

class %(name)s(GMEComComponent):

	_typelib_guid_ = '{270B4F86-B17C-11D3-9AD1-00AA00B6FE26}'
	_typelib_version = 1,0
	_com_interfaces_ = ['IMgaEventSink']

	# Component specific parts for COM registration
	_comname_ = "%(name)s"
	_comp_version_ = "%(version)s"
	_reg_clsid_ = "%(clsid)s"
	
	_reg_desc_ = _comname_
	_reg_progid_ = "MGA.PythonAddon.%%s" %% _comname_
	_reg_verprogid_ = "MGA.PythonAddon.%%s.%%s" %% (_comname_, _comp_version_)
	_reg_class_spec_ = "%%s.%%s" %% (__module__, _comname_)

	# Component specific parts for GME registration
	_component_type_ = GMEComComponent.mga.constants.COMPONENTTYPE_ADDON
	_paradigm_ = "%(paradigm)s"

	def Initialize(self, project):
		self.Project = self.mga.IMgaProject(project)
		addon = self.Project.CreateAddOn(wrap(self))
		self.Addon = self.mga.IMgaAddOn(addon)
		# Set this mask to the object events for which the Addon requires notification
		# Constants are defined in Mga.idl
		self.Addon.EventMask = self.mga.constants.OBJEVENT_CREATED + \\
							   self.mga.constants.OBJEVENT_LOSTCHILD + \\
							   self.mga.constants.OBJEVENT_ATTR + \\
							   self.mga.constants.OBJEVENT_PROPERTIES + \\
							   self.mga.constants.OBJEVENT_CLOSEMODEL + \\
							   self.mga.constants.OBJEVENT_REGISTRY

	def GlobalEvent(self, event):
		# Example processing
		# Constants are defined in Mga.idl
		#try:
		#	if event == self.mga.constants.GLOBALEVENT_OPEN_PROJECT:
		#		pass
		#	elif event == self.mga.constants.GLOBALEVENT_CLOSE_PROJECT:
		#		pass
		#except Exception, e:
		#	pass
		return winerror.S_OK

	def ObjectEvent(self, obj, mask, v):
		# Example processing
		# Constants are defined in Mga.idl
		#try:
		#	obj = self.mga.IMgaFCO(obj)
		#	if mask & self.mga.constants.OBJEVENT_CREATED:
		#		pass
		#	if mask & self.mga.constants.OBJEVENT_LOSTCHILD:
		#		pass
		#	if mask & self.mga.constants.OBJEVENT_ATTR:
		#		pass
		#except Exception, e:
		#	pass
		return winerror.S_OK
"""

--- NEW FILE: SelfRegistration.py ---
# GME Python Component Framework
# (c) 2002-2006 ISIS, Vanderbilt University

import win32com.server.register
import win32com.client
import pythoncom
import os.path

def registerAsCOMComponent(component, icon_path="", debugging=None):
    try:
        win32com.client.Dispatch(component._reg_progid_)
    except pythoncom.com_error, e:
        pass
    else:
        print "Already registered. Cleanup first."
        unregisterAsCOMComponent(component)

    print "Registering as a COM component...",

    if debugging == 1:
        dispatcherSpec = "win32com.server.dispatcher.DispatcherWin32trace"
        options = {'Debugging':'1'}
    else:
        dispatcherSpec = None
        options = {'Debugging':'0'}
    try:
        win32com.server.register.RegisterServer (clsid = component._reg_clsid_
                                                ,pythonInstString = component._reg_class_spec_
                                                ,desc = component._reg_desc_
                                                ,progID = component._reg_progid_
                                                ,verProgID = component._reg_verprogid_
                                                ,defIcon = hasattr(component, '_reg_iconfile_') and os.path.join(icon_path, component._reg_iconfile_) or None
                                                ,other = options
                                                ,dispatcher = dispatcherSpec
                                                )
    except Exception, e:
        raise Exception("Error while registering component:\n%s" % e)
    print "Done"

def unregisterAsCOMComponent(component):
    print "Unregistering the COM component...",
    try:
        win32com.server.register.UnregisterServer(clsid=component._reg_clsid_
                                                  ,progID=component._reg_progid_
                                                  ,verProgID=component._reg_verprogid_
                                                  )
        print "Done"                    
    except Exception, e:
        raise Exception("Error while unregistering component:\n" % e)
  
def registerAsGMEComponent(component, systemwide, icon_path="", type=None):
    registrar = win32com.client.Dispatch("Mga.MgaRegistrar")

    try:
        registrar.QueryComponent(component._reg_progid_, None, None, systemwide)
    except pythoncom.com_error, (hr, desc, exc, argErr) :
        if exc[1] == 'GME':
            pass
        else:
            raise
    else:
        print "Already registered. Cleanup first."
        unregisterAsGMEComponent(component, systemwide)

    print "Registering as a GME Component...",
    if type is None:
        type = component.mga.constants.COMPONENTTYPE_INTERPRETER
    registrar.RegisterComponent(component._reg_progid_,
                                type,
                                component._reg_desc_,
                                systemwide)
    registrar.Associate(progid = component._reg_progid_,
                        paradigm = component._paradigm_,
                        mode = systemwide)
    if hasattr(component,'_reg_iconfile_'):
        registrar.SetComponentExtraInfo(mode = systemwide,
                                        progid = component._reg_progid_,
                                        name = 'Icon',
                                        arg3 = os.path.join(icon_path, component._reg_iconfile_))
    if hasattr(component,'_tooltip_'):
        registrar.SetComponentExtraInfo(mode = systemwide,
                                        progid = component._reg_progid_,
                                        name = 'Tooltip',
                                        arg3 = component._tooltip_)
    print "Done"

def unregisterAsGMEComponent(component, systemwide):
    print "Unregistering the GME Interpreter...",
    registrar = win32com.client.Dispatch("Mga.MgaRegistrar")
    registrar.Disassociate(progid = component._reg_progid_,
                           paradigm = component._paradigm_,
                           mode = systemwide)

    registrar.UnregisterComponent(progid = component._reg_progid_,
                                  mode = systemwide)
    print "Done"




More information about the GME-commit mailing list