A COM szerver beüzemelése Python használatával

A Python segítségével lehet modelleket építeni az AXISVM-ben, elemzéseket futtatni és eredményeket lekérdezni. Ebben a cikkben az AXISVM COM szerver beállításához szükséges lépéseket mutatjuk be. A Python v3.10 64-bites verzióját használjuk. Más verziók vagy programozási nyelvek is használhatók. A Python alapértelmezett szerkesztőjét (IDLE) használjuk, de ugyanazok a lépések más szerkesztőkben, például a Visual Studio Code-ban vagy a Pycharmban is követhetők. Az AXISVM X6 64 bites programot használják. Ugyanezek a lépések más verziók esetében is követhetők, néhány változtatással, amint azt a cikk későbbi részében bemutatjuk. Fontos megemlíteni, hogy az AXISVM szoftver és a Python verziójának egyeznie kell, 32 vagy 64 bitesnek kell lennie. Az AXISVM COM szerver sikeres beállításához az alábbi öt lépést kell követni: 

  • A comtypes csomag telepítése
  • Az AXISVM COM szerver ‘Major’ és ‘Minor’ verziójának azonosítása
  • Az interop modul létrehozása Pythonban
  • Az AXISVM interop modul importálása
  • Az AXISVM indítása a COM szerveren keresztül

A comtypes csomag telepítése #

A Python és a pip csomagtelepítő telepítése után telepítenünk kell a comtypes csomagot. Ezzel a csomaggal meghívhatjuk és implementálhatjuk az AXISVM COM szerver interfészeit. A comtypes csomag telepítéséhez egy parancsot kell végrehajtani a parancssorban, ahogy az alábbi képen látható. Successfully installed comtypes-version jelenik meg, ha a csomag sikeresen települt. A comtypes legalább 1.1.4-es verzióját ajánlott telepíteni, mivel alacsonyabb verzióknál hibák jelentkezhetnek.

pip install comtypes













Az AXISVM COM szerver ‘Major’ és ‘Minor’ verziójának azonosítása #

Meg kell határoznunk a COM szerver fő (major) és mellék (minor) verzióját. Ezeket később az interop modul létrehozásakor fogjuk használni. Ez lehetővé teszi a Python számára, hogy lássa az AXISVM COM szerveren elérhető interfészeket. A következő lépéseket kell követnünk a „major” és „minor” verziók azonosításához: 

  • Lépünk az AXISVM telepítési mappájába.
  • Megkeressük az Interop.AxisVM.FW4.dll fájlt.
  • Kattintsunk a jobb egérgombbal rá, a megnyíló menüben kattintsunk a Tulajdonságok parancson.
  • Átváltunk a Részletek (Details) fülre.

Ahogy az alábbi ablakban látható, a Fájlverzió (File Version) a verziószámot mutatja, ahol az első pont előtti számok a fő (major) verziót, az utána következő számok pedig a mellék (minor) verziót jelölik. Ebben a példában a főverzió (major) a 16, a mellékverzió (minor) pedig a 100.
























Az interop modul létrehozása Pythonban #

A comtypes csomag segítségével létrehozzuk a COM szerver interop modulját, hogy a Python azonosítani tudja a COM szerverben elérhető interfészeket, tulajdonságokat és metódusokat. Az alábbi kódrészlet az interop modul létrehozását bemutatja. Először a comtypes és a comtypes.client fájlokat kell importálni. Ezután a major_version és minor_version változókat feltöltjük az előző lépésben kapott major és minor verziókkal. Az AxVM_GUID az AXISVM COM szerver egyedi azonosítója, amelyet nem szabad megváltoztatni. A comtypes.GUID(AxVM_GUID) függvény megkapja a COM szerver könyvtárát (Type Library). Az AX_APP_PROGID a fő interfész AxisVM.AxisVMApplication nevét tartalmazza. A GetModulefüggvény létrehozza az interop modult. Ha sikeresen végrehajtotta, a létrehozott modul a comtypes csomag könyvtárában lesz.

				
					#import comtypes and comtypes.client
import comtypes
import comtypes.client as cc
import sys
from time import sleep
# Generate interop module for AxisVM API
# IMPORTANT NOTE: 32 bit python can generate module for 32bit AxisVM and 64bit for 64 bit COM server.
# AxisVM COM version
major_version = 16
minor_version = 100
# GUID of the AxisVM type library
AxVM_GUID = "{0AA46C32-04EF-46E3-B0E4-D2DA28D0AB08}"
# Name of the main interface.
AX_APP_PROGID = 'AxisVM.AxisVMApplication'
# generate python module 
tlb_id = comtypes.GUID(AxVM_GUID) 
try:
  cc.GetModule((tlb_id, major_version, minor_version))
  print("AxisVM module file generated")
except:
  print("""AxiVM module generation error ! \nAxisVM and Python must be on same platform (32/64 bit) !""")

				
			

Az AXISVM interop modul importálása #

Az interop modul létrehozása után a modult be kell importálni a programba, hogy a python használhassa az AXISVM COM szerver interfészeit. A modul importálásához a következő kódot kell végrehajtani, a MajorVersion és MinorVersion értékeket a korábban kapott Major és Minor verzió értékekkel kell megváltoztatni.

				
					import comtypes.gen._0AA46C32_04EF_46E3_B0E4_D2DA28D0AB08_0_MajorVersion_MinorVersion as ax
				
			
Itt a MajorVersion 16, a MinorVersion pedig 100. Az alábbi kódrészlet azt mutatja, hogyan lehet a modult major és minor verziókkal importálni.
				
					# importing the interop module.
try:
    import comtypes.gen._0AA46C32_04EF_46E3_B0E4_D2DA28D0AB08_0_16_100 as ax
    print("AxiVM module imported!")
except:
    print("AxiVM module import error !")

				
			

Az AXISVM indítása a COM szerveren keresztül #

A CreateObject(args) függvényt az AxisVM.AxisVMApplication fő interfész objektumának létrehozására használjuk, ahogy az alábbi kódrészlet 5. sorában látható. A létrehozott objektum az axApp változóba kerül tárolásra. Az objektum létrehozása után az AXISVM nem vezérelhető, amíg a program teljesen be nem töltődik. Ezért egy while ciklus segítségével ellenőrizzük, hogy az AXISVM betöltődött-e az axApp.Loaded segítségével, ahogy az alábbi kódrészlet 25. sorában látható. Ha az AXISVM nincs betöltve, akkor a programunkat 100ms-ra alvó állapotba helyezzük. Amikor az AXISVM teljesen betöltődött, elkezdhetjük a tulajdonságok beállítását és a függvények hívását, például láthatóvá tesszük az axApp.Visible tulajdonság használatával, ahogy a 12. sorban látható, vagy az axApp.CloseOnLastReleased, hogy megakadályozzuk az AXISVM bezárását a programunk végrehajtása után, ahogy a 13. sorban látható. Az összes függvény és interfész elérhető az AXISVM COM kézikönyvben

				
					# starting AxisVM            
def StartAxisVM(): 
    axApp = None
    try:
        axApp = cc.CreateObject('AxisVM.AxisVMApplication', comtypes.CLSCTX_ALL,None,ax.IAxisVMApplication) #create the AxisVM.AxisVMApplication
        print("AxiVM object created")
    except:
        print("error creating the object!")
        sys.exit()
    if not axApp is None:
        if WaitForAxisVM_loaded(axApp):
            axApp.Visible = ax.lbTrue # AxisVM starts hidden, so make it visible  
            axApp.CloseOnLastReleased = ax.lbFalse # Do not close AxisVM after this code
            axApp.AskCloseOnLastReleased = ax.lbTrue # Ask whether close AxisVM after this code  
            axApp.AskSaveOnLastReleased = ax.lbTrue      
            return axApp
    if axApp is None:
        print("AxisVM start error !")
        exit()

# check if AxisVM is loaded
def WaitForAxisVM_loaded(axApp):
    # wait until AxisVM is loaded
    try:
        while not(axApp.Loaded == ax.lbTrue): 
            sleep(0.1) # wait 100 ms
            print("waiting")
        return True    
    except:
        return False

StartAxisVM()

				
			

Az AXISVM futtatásához szükséges parancsfájl letölthető innen.

További információk az AXISVM COM kézikönyvben találhatók.