Egyszerű AXISVM plugin készítése

Az AXISVM már önmagában is sok lehetőséget kínál, azonban előfordulhat, hogy szükség van a szoftver képességeinek kibővítésére különböző pluginok létrehozásával. Az AXISVM lehetőséget biztosít arra, hogy minden felhasználó saját igényeinek megfelően alakíthassa a szoftver funkcióit. Ebben a cikkben bemutatjuk a kiegészítők létrehozásának folyamatát és az elvégzendő lépéseket egy egyszerű AXISVM X7 kiegészítő létrehozásához C# programnyelv és Visual Studio 2022 használatával. Hasonló lépések elvégzésével akár más programnyelvek használatával is követhető ez az útmutató.

A példában bemutatott kiegészítő lehetővé teszi a felhasználó számára egy vonal létrehozását az AXISVM-ben, a kezdő és végpontok csomóponti koordinátáinak megadásával. Érdemes megemlíteni, hogy ez csak egy demonstrációs célra készült egyszerű példa, valójában az AXISVM sokkal fejlettebb funkciók bevezetését is lehetővé teszi.

Az AXISVM kiegészítő létrehozásának általános lépései:

Class Library (osztálykönyvtár) projekt létrehozása #

Az új kiegészítő DLL fájlként lesz biztosítva az AXISVM-nek, mert amikor az AXISVM elindul, a Plugins mappában (<AXISVM telepítési mappa>\plugins) és annak alkönyvtáraiban *.DLL fájlokat olvas be. Ehhez egy új C# Class Library-t (.Net Framework) kell létrehozni, az alábbiakban látható módon. Amikor a szerkesztő elkészíti ezt a Class Library-t, egy új DLL jön létre, amely tartalmazza az új kiegészítőt. A Class Library létrehozása után egy, a kiegészítőt tartalmazó új DLL jön létre. 

Fontos megjegyezni, hogy az AXISVM 64 bites verziója (AxisVM_x64.exe) csak 64 bites DLL-eket tud megnyitni, míg az AXISVM 32 bites verziója (AxisVM.exe) csak 32 biteseket.

A következő lépés az új osztálykönyvtár projekt konfigurálása. Az alábbi képen látható módon kell megadni a projekt nevét, helyét és a megoldás nevét. Fontos kiválasztani a megfelelő .Net Framework-öt a későbbiekben importálandó interfészhez, mivel az AXISVM a .Net Frameworks több verzióját is támogatja. Itt a .Net Framework 4.8-as verzióját használjuk.

Az AXISVM Interop és a plugin interface importálása #

Ebben a lépésben hozzá kell adni az AXISVM Interop-ot és a plugin interface-t az osztálykönyvtárhoz. A használt keretrendszertől függően többféle interfész áll rendelkezésre. A .Net framework (4.x) esetében az Interop Interop.AxisVM.FW4.dll és az AxisVMDotNetAddonPluginInterface_v1.0.FW4.dll interfészt kell használni. A két DLL fájl hozzáadásához a következő lépéseket kell követni:

  1. Kattintsunk a jobb gombbal a References-re, és válasszuk a „Add Reference” opciót a menüből. Ez megnyitja a Reference Manager ablakot.
  2. A Reference Manager ablakban kattintsunk a ” Browse ” gombra.
  3. Menjünk az AXISVM telepítési könyvtárába, és válasszuk ki a két DLL fájlt. Ezután kattintsunk az ” Open ” gombra .
  4. Ellenőrizzük, hogy a kiválasztott DLL fájlok mellett lévő jelölőnégyzetek be vannak jelölve.
  5. Végül az „OK” gombra kattintva fejezzük be a folyamatot.

Új osztály és form létrehozása #

Az új AxisVMDotNetAddonPluginInterface_v1.0 interfész lehetővé teszi mind a kiegészítők, mind az addon-ok létrehozását. Az AXISVM X7-ben a kiegészítők a menüsorban érhetők el a „Plugins” menüponton keresztül, míg az addon-ok gombokként jelennek meg az eszköztáron, így a felhasználók kényelmesen hozzáférhetnek az hozzáadott funkciókhoz, ahogy az alábbiakban látható.

Az AXISVM-hez létrehozott összes kiegészítőnek és addon-nak végre kell hajtania az AxisVMDotNetAddonPluginInterface_v1.0 interfész összes metódusát és tulajdonságát.

Az interfész implementálásához a következő lépéseket kell követni:

  1. Biztosítsuk, hogy a DLL fájlok hozzáadódjanak a References-hez.
  2. Hozzunk létre egy új Form-ot a projektben ( jobb gombbal a projekt nevére kattintunk => az ” Add” menüpontból válasszuk a „Form” opciót).
  3. Adjunk hozzá komponenseket a Form-hoz, beleértve egy DataGridView-t és egy gombot.
  4. Hozzunk létre egy új osztályt a projektben ( jobb gombbal a projekt nevére kattintunk => az ” Add” menüpontból válasszuk az „Class” opciót).
  5. Deklaráljuk, hogy az osztály végrehajtja az interfészt, azzal hogy hozzáadjuk a :IAxisVMDotNetAddonPluginInterface_v1_0 részt az osztály nevéhez. Az osztálydeklaráció legyen public class Class1:IAxisVMDotNetAddonPluginInterface_v1_0, ahogyan az alábbi képen látható.

Az interfész összes metódusának és változójának az implementálása #

Az osztálynak implementálnia kell az interfész tulajdonságait és metódusait az új kiegészítő konfigurálásához. Az AXISVM API dokumentációja tartalmazza az összes implementált tulajdonság és metódus részletes leírását, valamint a hozzájuk tartozó használati utasításokat. Ebben a fejezetben csak egy rövid bemutatásra kerül sor. 

A következő lépéseket kell követni a kiegészítő és az addon konfigurálásához az interfész metódusainak implementálásával:

1- Importáljuk a két névteret a létrehozott osztályban.

using AxisVM;

using AxisVMDotNetAddonPluginInterface_v1_0;

2- Az alábbi kódrészlet tartalmát bemásoljuk az osztályba. Ezek a tulajdonságok és metódusok kötelezőek, és minden új kiegészítőben használni kell őket. Minden egyes tulajdonság és metódus felett megjegyzésként egy rövid leírás található, amely kiemeli annak célját és funkcióját.

  • A Plugin_MenuItemTexttulajdonságnak vissza kell adnia a kiegészítő nevét. Itt a neve „NewPlugin”.
  • A Plugin_Init és Addon_Init metódusokat az AXISVM hívja meg, amikor az AXISVM teljesen betöltődik.
  • A Plugin_Execute és Addon_Execute metódusokat az AXISVM hívja meg, amikor a felhasználó rákattint a kiegészítőre vagy az addonra. A fő Form-ot ezen a függvényen belül kell létrehozni és megjeleníteni. 
  • A Plugin_IsMenuItemVisible és Addon_IsItemVisible metódusok meghatározzák, hogy a kiegészítő és az addon látható-e. Az értéküknek 1-nek kell lennie, hogy láthatóak legyenek.

A Plugin_IsMenuItemEnabled és Addon_IsItemEnabled metódusok meghatározzák, hogy a kiegészítő és az addon aktiválva van-e, és a felhasználó rákattinthat-e rájuk. Az aktiváláshoz 1 értéket kell visszaadniuk.

				
					public class Class1:IAxisVMDotNetAddonPluginInterface_v1_0
{
    // Az AxisVM által használt változók
    static private int _AxisVMAddonFormHandle = 0;
    static private int _AxisVMMainFormHandle = 0;
    static private int _AxisVMApplicationHandle = 0;
  
    // A kiegészítő verziója. Ennek 1-nek kell lennie.
    public int Version { get { return 1; } }
    // A kiegészítő alverziója. Ennek 0-nak kell lennie.
    public int SubVersion { get { return 0; } }
    // Az AxisVM által a plugin, addon és alkalmazás kezelőinek hozzárendeléséhez használt tulajdonságok.
    public int AxisVMMainFormHandle { get { return _AxisVMMainFormHandle; } set { _AxisVMMainFormHandle = value; } }
    public int AxisVMApplicationHandle
    {
        get { return _AxisVMApplicationHandle; }
        set { _AxisVMApplicationHandle = value; }
    }

    // Ez a tulajdonság vissza kell adja a kiegészítő nevét, amely megjelenik az AxisVM-ben.
    public string Plugin_MenuItemText { get { return "NewPlugin"; } }
    // A modális AddonPluginnak 1-et, a nem modálisnak pedig 0-t kell visszaadnia.
    public int Plugin_IsModalWindow { get { return 1; } }

    // Az AddonPlugin tippjét (szöveg). A tipp akkor jelenik meg, ha a kurzor az Addon gombon.
    public string Addon_HintText { get { return "NewPlugin"; } }
    // A modális AddonPluginnak 1-et, a nem modálisnak pedig 0-t kell visszaadnia.
    public int Addon_IsModalWindow { get { return 1; } }
    // Meghatározza az AddonPlugin gomb ikonját. Ha nincs adat visszaadva, akkor az alapértelmezett ikon lesz használva.
    public byte[] Addon_IconBitmap { get { return new byte[] { }; ; } }
    // Meghatározza a gomb ikonának áttetsző színét.
    public int Addon_IconBitmapTransparentColor { get { return 0; } }
    // Meghatározza a form azonosítóját, ahol az addon gomb megjelenik.
    // 0 a fő form esetében.
    public int Addon_ButtonPlaceFormId { get { return 0; } }
    // Meghatározza a form lévő fület (lapot), ahol az AddonPlugin gombja lesz.
    // megjelenik.
    // 0 => geometria, 1 => elemek, 2 => terhek, 3 => háló ... 
    public int Addon_ButtonPlaceToolbarId { get { return 1; } }
    // Az AxisVM által a kiegészítő, az addon és az alkalmazás kezelőinek hozzárendeléséhez használt tulajdonságok. 
    public int Addon_FormHandle { get { return _AxisVMAddonFormHandle; } set { _AxisVMAddonFormHandle = value; } }
    
    public void Addon_Deinit(object iAxisVMApp)
    {
        iAxisVMApp = null;
    }
    // Ezt a funkciót az AxisVM hívja meg, amikor a felhasználó az AddonPlugin gombra kattint.
    public int Addon_Execute(object iAxisVMApp)
    {
        return 0;
    }
    
    public string Addon_GetTranslatedHintText(int PrgLang)
    {
        return "NewPlugin";
    }
    // Ezt a függvényt az AxisVM hívja meg, amikor az AxisVM teljesen betöltődött.
    // (az IAxisVMApplication Loaded esemény megtörtént) és a COM szerver elérhető.
    public void Addon_Init(object iAxisVMApp)
    {
    }
    // Az AxisVM meghívja ezt a funkciót, amikor az AddonPlugin gombja megjelenik.
    // Ha 0-t ad vissza, akkor a gomb le lesz tiltva, különben engedélyezve lesz.
    public int Addon_IsItemEnabled(object iAxisVMApp)
    {
        return 1;
    }
    // Az AxisVM meghívja ezt a funkciót, amikor az AddonPlugin gombja megjelenik.
    // Ha 0-t ad vissza, akkor a gomb nem jelenik meg.
    public int Addon_IsItemVisible(object iAxisVMApp)
    {
        return 1;
    }

    public void Plugin_Deinit(object iAxisVMApp)
    {
    }
    // Ezt a funkciót az AxisVM hívja meg, amikor a felhasználó a kiegészítő menüpontra kattint. 
    public int Plugin_Execute(object iAxisVMApp)
    {
        return 0;
    }
    // Ezt a funkciót az AxisVM minden alkalommal meghívja, amikor a program nyelve megváltozik.
    public string Plugin_GetTranslatedMenuItemText(int PrgLang)
    {
        return "NewPlugin";
    }

    public void Plugin_Init(object iAxisVMApp)
    {
    }
    // Ezt a függvényt az AxisVM hívja meg, amikor az AddonPlugin menü megjelenik, hogy
    // meghatározza, hogy a menüpont aktiválható-e vagy sem. 0 a letiltás esetén.
    public int Plugin_IsMenuItemEnabled(object iAxisVMApp)
    {
        return 1;
    }
    // Ezt a függvényt az AxisVM hívja meg, amikor az AddonPlugin menü megjelenik, hogy
    // meghatározza, hogy a menüpont látható-e vagy sem. Rejtett esetén 0.
    public int Plugin_IsMenuItemVisible(object iAxisVMApp)
    {
        return 1;
    }   
}

				
			

3- Másoljuk az osztályba a következő változókat és metódusokat. Ezek a változók és metódusok nem kötelezőek más pluginek számára. Itt az AXISVM API fő interfészének (AxisVMApplication) és az AXISVM futó modelljének (AxisVMModel) globális változóinak definiálására és inicializálására szolgálnak. A ShowPlugInForm függvény a létrehozott Form megjelenítésére szolgál, amikor a felhasználó a kiegészítő vagy az Addon gombra kattint az AXISVM-ben.

				
					// A nyitott modell változója.
IAxisVMModel AxisVMModel;
// Az AxisVM Interop fő interfészének változója.
IAxisVMApplication AxisVMApplication;

private void initializeAxisVMApplication(object iAxisVMApp) {
    AxisVMApplication = (AxisVMApplication)iAxisVMApp;
}

private void initializeAxisVMModel(object iAxisVMApp)
{
    AxisVMModel = AxisVMApplication.Models.Item[1];
}

private void ShowPlugInForm() {
    Form1 form1 = new Form1(AxisVMModel);
    form1.Show();
}

				
			

4- A Plugin_Execute és Addon_Execute metódusokhoz a következő metódushívásokat adjuk hozzá.

				
					initializeAxisVMApplication(iAxisVMApp);
initializeAxisVMModel(iAxisVMApp);
ShowPlugInForm();

				
			

5- Valósítsuk meg a projektet a „Build” opciót a „Build” menüből kiválasztva a Visual Studio-ban, vagy nyomjuk meg a Ctrl+Shift+B billentyűkombinációt.

A DLL fájl másolása az AXISVM Plugins könyvtárba  #

Ha a build sikeres volt, akkor egy DLL fájlt találunk a class library-nek a bin könyvtárában. A DLL fájl megtalálásához az alábbi lépéseket kell követni:

  1. Kattintsunk a jobb gombbal a projekt nevére, és válasszuk az ” Open Folder in File Explorer” opciót. A projekt mappája megnyílik. 
  2. Menjünk a „bin” könyvtárba, majd a „Debug” vagy „Release” mappába (attól függően, hogy milyen konfigurációval dolgozunk a Visual Studio-ban). Az elkészített kiegészítő DLL fájl megtalálható a következő elnevezéssel: „projektnév.dll”. Itt például „NewPlugin.dll”.
  3. Másoljuk a DLL fájlt a plugins mappába az AXISVM telepítési könyvtárában (<AXISVM telepítési mappa>\plugins).

 

Ha minden megfelelően van beállítva, a kiegészítőnek meg kell jelennie az AXISVM Plugins menüjében, és az addonnak pedig a kiválasztott fülön.

A létrehozott kiegészítő végeredménye:

A Visual Studio projekt letölthető innen: 

Lehetséges problémák #

  • A plugin nem töltődik be (nem jelenik meg a Plugins menüben):

A probléma megoldásához a következő módszereket lehet megpróbálni:

  1. Az AXISVM.NET szerver újraregisztrálása: IAxisVMDotNetPluginInterface_v2_3:
    1. !UNREGISTER_DOT_NET_PLUGIN_SERVER_v2.3.BAT fájl futtatása. 
    2. !REGISTER_DOT_NET_PLUGIN_SERVER_v2.3.BAT-ot fájl futtatása. 
    3. !UNREGISTER_DOT_NET_ADDONPLUGIN_SERVER_v1.0.BAT fájl futtatása. 
    4. !REGISTER_DOT_NET_ADDONPLUGIN_SERVER_v1.0.BAT fájl futtatása.
  2. Megfelelő framework verzió beállítása az Advanced compiler settings (Speciális fordítóbeállítások) menüpontban. 
  3. A PluginFinder.dll_ERROR.LOG fájl megvizsgálása: megtalálható az AXISVM mappában a System.IO.FileNotFoundException kivételek naplózásához, és megmutatja, hogy melyik .NET összetevőre van szükség a DLL számára.

Részletes útmutató arról, hogyan lehet a COM szervert használni egy modell és peremfeltételek létrehozásához, terhek alkalmazásához, és az analízisfuttatásához: Egyszerű modell létrehozása AXISVM COM szerveren keresztül