[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