Zum Inhalt springen

Python: Raumstil-Auswahl (vs.BuildResourceList)


KroVex

Frage

Geschrieben

Salü zusammen,

 

ich habe eine kleine Frage an die Programmierenden:

Kennt jemand einen Ansatz um alle Raumstile im Dokument (nicht nur im Plan eingesetzt) auflisten zu lassen?

Im Dev-Wiki habe ich keine Object- und/oder Folder-ID gefunden, mit welchen ich die Raumstile über vs.BuildResourceList identifizieren könnte.

Mein zweiter Ansatz war zu prüfen, welche Symbole mit der Datenbank 'Space' verknüpft sind - aber wenn ich es richtig beobachtet habe, wird ein Raumstil-Symbol erst nachdem es in den Plan eingesetzt wurde, zu einem Raumstil-Objekt, respektive wird erst dann mit der entsprechenden Datenbank verknüpft.

Dann habe ich noch nach Funktionen gesucht und getestet, wie denn VW erkennt, dass es sich bei diesem Raumstil-Symbol um ein zukünftiges Raumstil-Objekt handelt, leider ohne Erfolg.

Hat jemand eine Idee oder Tipp dazu?

Gruss KroVex


 

 

CADNODE.ch

Unabhängige CAD-Beratung & Support für Planende: persönlich, zuverlässig und pragmatisch – Workflows, die nicht nur gut klingen, sondern auch funktionieren.

Have you tried to turn it off and on again?
Vectorworks | Architektur | macOS/Windows

7 Antworten auf diese Frage

Empfohlene Beiträge

Geschrieben

Eine Möglichkeit wäre, eine Resourceliste mit Symboldefinitionen zu erstellen. Wenn das erste Unterobjekt einer Symboldefinition ein Raumobjekt ist, handelt es sich um einen Raumstil.

  • Like 1

Gruß


Stefan Bender

ComputerWorks GmbH

http://www.computerworks.de

Geschrieben

@Stefan Bender eine Liste aller Resourcen im Zubehörmanager? Wie geht das?

Dann könnte man dann auch den Typ der Resource überprüfen und nur die Namen der Resource in die Listenvariable übernehmen, bei denen es sich um Raumstile handelt, oder?

MacBook Pro 16" - macOS 13 - Ventura - 2,3 GHz 8-Core Intel Core i9, 16GB RAM, AMD Radeon Pro 5500M 8 GB VRAM

Vectorworks 2022 - SP6

Vectorworks 2023 - SP6

Geschrieben

Ich kenne mich mit Vectorscript nicht so aus, aber Krovex schreibt von einer Funktion vs.BuildResourceList, die vermutlich genau das macht (die gleichnamige SDK-Funktion tut es jedenfalls). Dieser Funktion kann man (zumindest in der SDK-Version) auch sagen, nach welchem Resourcentyp man suchen will. Steht mit etwas Glück in der Vectorscriptdokumentation.

Gruß


Stefan Bender

ComputerWorks GmbH

http://www.computerworks.de

Geschrieben
vor 31 Minuten schrieb Stefan Bender:

Wenn das erste Unterobjekt einer Symboldefinition ein Raumobjekt ist

Aber wie prüfe ich, ob ein Objekt explizit ein Raumobjekt ist? Mit vs.GetTypeN bekomme ich nur die "86" für Plugin-Objekt - heisst es werden auch Symbole ausgelesen, welche z.B. ein Datenstempel enthalten. Die Symbol-Unterobjekte nach der Datenbank 'Space' abzusuchen, funktioniert leider auch nicht 😕

@Matteo Mit vs.BuildResourceList(16, 0, '') kannst du dir alle Symbole im Dokument auflisten lassen, wobei die 16 für Symboldefinition steht und die 0 für alle Ordner steht. Respektive könnte man die 0 durch eine spezifische Zahl ersetzen - soweit ich es verstehe, gibt es z.B. gleiche Objekttypen, welche aber je nach Tool/Plugin in unterschiedlichen Ordner strukturiert sind - der Folder dient also zur weiteren Eingrenzung bestimmter Objekte. 

CADNODE.ch

Unabhängige CAD-Beratung & Support für Planende: persönlich, zuverlässig und pragmatisch – Workflows, die nicht nur gut klingen, sondern auch funktionieren.

Have you tried to turn it off and on again?
Vectorworks | Architektur | macOS/Windows

Geschrieben

Leider weiß ich nicht, ob und mit welchen Vectorscriptfunktionen man herausfinden kann, um welches Intelligente Objekt es sich genau handelt. Ich kann nur raten, entweder die Kollegen im Support zu fragen oder die Vectorscript-Dokumentation genau durchzugehen. Alle Intelligenten Objekte haben den Objekttyp 86 ("Intelligentes Objekt"), es gibt aber zumindest im SDK Möglichkeiten, genauere Details herauszufinden. Eventuell (umständlich) kann man auch mit Vectorscript-Methoden die Aux-Liste des Objekts durchsuchen und die Namen der Records analysieren, die am Objekt hängen, zumindest einer davon müßte von der Objektdatenbank stammen, die den Universal Name des Intelligenten Objekts hat.

  • Like 1

Gruß


Stefan Bender

ComputerWorks GmbH

http://www.computerworks.de

Geschrieben

Also genau so wie von Stefan beschrieben funktioniert es.

mit FInSymbolDef() und Next in einer while Schlaufe durchsucht man das Symbol

Beispiel. Wobei das hier jetzt komplizierter ist als nötig weil es noch berücksichtig, dass der Inhalt im Symbol kein Stil ist oder auch Gruppen beinhalten kann.

Ressourcen-Liste iterieren vom Prinzip her:

image.png.a4dccd32afd975b7e519594056995eb4.png


Hier läuft jetzt eine Funktion um den Symbolinhalt zu durchsuchen. Die Schlaufe bricht ab, wenn das erwartete Objekt gefunden wurde. Keine Ahnung ob bei einem Stil das PIO zuerst kommt oder vielleicht ne Gruppe oder sonst was (muss man ausprobieren und logs erzeugen oder Meldungen ausgeben)

image.png.ea0e167e2cbb2f3f20ab5f27db3ab46f.png

Hier die Funktion um alles in einer (Gruppe) zu sammeln. Ist aber nicht rekursiv, sondern hier wird nur die erste Gruppe durchsucht.
image.png.22fdc88b1309a8edb1912ce0841686ba.png

image.png

  • Like 1

Macbook m3 Max 48 GB | Ryzen 3950x 64GB NVIDIA rtx3090

Geschrieben

Vielen Dank @Stefan Bender & @Dominique Corpataux - ich hatte noch einen Denkfehler intus.

Aber das folgende Script funktioniert: erstellt eine Liste aller Symbole und durchsucht deren Unterobjekte, ob jene mit der Datenbank 'Space' verknüpft sind und gibt nur jene aus:

 

import vs

def get_attached_records(symbol_handle):
    record_list = []
    child = vs.FInSymDef(symbol_handle)  # Erstes Unterobjekt abrufen
    while child:  # Durch die Unterobjekte iterieren
        recCount = vs.NumRecords(child)
        for idx in range(1, recCount + 1):
            recObj = vs.GetRecord(child, idx)
            recName = vs.GetName(recObj)
            if recName and recName not in record_list:
                record_list.append(recName)
        child = vs.NextObj(child)  # Nächstes Objekt prüfen
    return record_list  # Gibt eine Liste aller gefundenen Datenbanknamen zurück

def ListAllPluginSymbols():
    resourceList, numItems = vs.BuildResourceList(16, 0, "")
    if numItems == 0:
        vs.Message("Keine Symbole im Dokument vorhanden.")
        return

    infoStr = []
    for i in range(1, numItems + 1):
        symHandle = vs.GetResourceFromList(resourceList, i)
        if symHandle is not None:
            symName = vs.GetName(symHandle)
            attached_records = get_attached_records(symHandle)  # Liste der Datenbanknamen abrufen

            # Nur wenn "Space" in den angehängten Datenbanken enthalten ist, Symbol berücksichtigen:
            if attached_records and "Space" in attached_records:
                record_str = ", ".join(attached_records)
                infoStr.append(f"Symbol: '{symName}' hat verknüpfte Datenbanken: {record_str}")

    # Ergebnis ausgeben
    if infoStr:
        vs.Message("\n\n".join(infoStr))
    else:
        vs.Message("Keine Symbole mit der Datenbank 'Space' gefunden.")

ListAllPluginSymbols()


Gruss KroVex

  • Like 1

CADNODE.ch

Unabhängige CAD-Beratung & Support für Planende: persönlich, zuverlässig und pragmatisch – Workflows, die nicht nur gut klingen, sondern auch funktionieren.

Have you tried to turn it off and on again?
Vectorworks | Architektur | macOS/Windows

Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden
  • Forenstatistik

    • Themen insgesamt
      25,2Tsd
    • Beiträge insgesamt
      130,6Tsd
×
×
  • Neu erstellen...