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
# 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.