Asystent Python w Microstation 2025, pierwsze próby.

31 lipca tego roku wyszła nowa wersja Microstation, czyli 2025 (25.00.00.119) w której pojawiło się narzędzie zwane Python Asystant, czyli asystent do tworzenia makr w języku Python za pomocą sztucznej inteligencji.
Samo narzędzie do tworzenia makr w Python-ie już istniało w poprzedniej wersji Microstation, natomiast teraz zostało rozbudowano o pomocnika AI.


Funkcja znajduje się na zakładce Utilities w sekcji Drawing:

W głównym oknie edytora Python-a po prawej stronie znajduję się sekcja asystenta:

W górnej części podane przykładowe zapytania, a w dolnej znajduje się pole do składania zapytań. Po wpisaniu i wysłaniu zapytania za pomocą przycisku Send musimy odczekać chwilę aż w górnej części okna pojawi się odpowiedz.

Z reguły asystent podaje kompletny kod, który można szybko skopiować za pomocą przycisku Copy i w kleić w do bieżącego makra. Podany kod zawiera komentarze, które ułatwiają odczytanie i zrozumienie naszego makra. W odpowiedzi na nasze zapytanie asystent również podaje pewien opis dotyczący makra, który zawiera wskazówki odnośnie korzystania.

Druga zakładka w sekcji asystenta zawiera historie naszych zapytań, co czasem bywa bardzo korzystne.

Niby drobiazg, ale jest bardzo przydatny!

Troszkę wyżej znajduje się przycisk New chat, który intuicyjnie wydawało by się tworzy okno nowego czata, ale niestety ta funkcja po prostu wyczyści okno bieżącego zapytania i przewróci go do stanu pierwotnego. Szkoda, możliwość operowania kilkoma zapytaniami bardzo by się przydała.

W razie potrzeby okno asystenta można zamknąć co zwiększa nam okno edytora i pozwała skupić się na tworzeniu lub edycji kodu.

Sprawdźmy zatem jak działa asystent. Napiszemy prosty kod który tworzy kilka nowych modeli typu design 3D w bieżącym pliku, a następnie poprosimy asystenta o pomoc i na końcu porównamy wyniki.

A więc w oknie kodu piszemy prostą funkcję n.p. o nazwie CreateModel, która tworzy model 3D o podanej nazwie:

def CreateModel (mdlName)

następnie stworzymy zmienną, zawierającą nazwy modeli

ModelNames = [„NewDesign_1”, „NewDesign_2”, „NewDesign_3”,]

No i oczywiście funkcję, która utworzy model dla każdej z nazw:

def ExecTask(ModelNames)

Tak będzie wyglądać struktura. Teraz napiszemy treść tych funkcji, a więc zaczniemy od funkcji CreateModel:

na początku chcemy otrzymać obiekt odnośnika do bieżącego modelu:

CurMdl = ISessionMgr.ActiveDgnModelRef

Jeśli się nie udało, zwracamy False

if CurMdl is None:
return False

Potem otrzymujemy dostęp do obiektu bieżącego pliku:

dFile = CurMdl.GetDgnFile()
if dFile is None:
return False

W ostatnim kroku, mając obiekt bieżącego pliku próbujemy sprawdzić czy model o takiej nazwie już istnieje i jeśli nie, to tworzymy go za pomocą metody CreateNewModel naszego obiektu dFile

mId = dFile.FindModelIdByName(mdlName)
if(INVALID_MODELID == mId):
error = MsPyDgnModelStatus()
if dFile.CreateNewModel(error, mdlName, DgnModelType.eNormal, True) is None:
return False

Typ obiektu DgnModelType.eNormal odpowiada modelu typu Design, dla modelu typu Drawing użylibyśmy .eDrawing, a dla arkusza .eSheet.
Ostatni parametr odpowiada za stworzenie 3D (True) lub 2D (False) modelu.

Teraz piszemy funkcję ExecTask, która wywołuje naszą funkcję CreateModel dla każdej nazwy z ModelNames:

def ExecTask(ModelNames):
for name in ModelNames:
CreateModel(name)
print(„Model: ” + name + ” was created successfully”)
return True

No i ostatnim wierszem w naszym programie musimy uruchomić funkcję ExecTask:

ExecTask(ModelNames)

Kompletny kod naszego programu (bez sekcji importu) powinien wyglądać tak:

def CreateModel(mdlName):
CurMdl = ISessionMgr.ActiveDgnModelRef
if CurMdl is None:
return False

dFile = CurMdl.GetDgnFile()
if dFile is None:
return False

mId = dFile.FindModelIdByName(mdlName)
if(INVALID_MODELID == mId):
error = MsPyDgnModelStatus()
if dFile.CreateNewModel(error, mdlName, DgnModelType.eNormal, True) is None:
return False

def ExecTask(ModelNames):
for name in ModelNames:
CreateModel(name)
print(„Model: ” + name + ” was created succesfully „)
return True

ModelNames=[„NewDesign_1”, „NewDesign_2”, „NewDesign_3”,]
ExecTask(ModelNames)

Zapiszemy nasz program, a następnie uruchomimy go (prawym klikiem na nazwie —> Run)

W oknie terminalu powinno pojawić się:

Te kominikaty potwierdzają prawidłowe wykonanie programu. Upewnić się w tym można sprawdzając listę modeli w naszym pliku. Powinno być je więcej o trzy.

Teraz napiszmy zapytanie i porównajmy otrzymany kod z naszym.
A więc zapytanie:
potrzebuję kodu który stworzy mi kilka modeli typu 3D design a nazwach: „NewDesign_1”, „NewDesign_2”, „NewDesign_3”
Odpowiedź (pomijając sekcję importów) ma następujący wygląd:

# Script to create several 3D design models with specified names
def create_3d_design_models(model_names):
    „””
    Creates 3D design models with the given names in the active DGN file.
    :param model_names: List of model names to create.
    :type model_names: list of str
    :return: List of created model objects.
    „””
    created_models = []
    dgnFile = ISessionMgr.GetActiveDgnFile()
    if dgnFile is None:
        print(„Error: No active DGN file.”)
        return []

    for name in model_names:
        # Check if model already exists
        modelId = dgnFile.FindModelIdByName(name)
        if modelId != INVALID_MODELID:
            print(f”Model '{name}’ already exists, skipping.”)
            continue
        error = MsPyDgnModelStatus()
        model = dgnFile.CreateNewModel(error, name, DgnModelType.eNormal, True)  # True = 3D
        if model is not None and error.value == DgnModelStatus.eDGNMODEL_STATUS_Success:
            print(f”Model '{name}’ created successfully.”)
            created_models.append(model)
        else:
            print(f”Failed to create model '{name}’. Error code: {error.value}”)
    return created_models

if __name__ == „__main__”:
    model_names = [„NewDesign_1”, „NewDesign_2”, „NewDesign_3”]
    create_3d_design_models(model_names)

Analizę zostawimy jako temat dla oddzielnego artykułu, natomiast golem okiem widać podobieństwo rozwiązań.
Kod uzupełniony komentarzami i jest klarowny.
Z minusów można dodać, że komentarze są w języku angielskim, mimo że zapytanie było w języku polskim.
Drugim minusem naszym skromnym zdaniem może być czas oczekiwania odpowiedzi. Przy niektórych zapytaniach może to chwilę potrwać, aczkolwiek odpowiedz w większości przypadków jest satysfakcjonująca, więc warto 🙂

Ogólne wrażenie z asystenta jest bardzo pozytywne, czekamy również na coś podobnego dla VBA 😉

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *