Zum Inhalt springen

Tabelle - Objektliste mit Objekten auf Ebene mit Tag "x"


hölzli

Empfohlene Beiträge

Hallo

 

Herzlich willkommen im Forum

 

Du kannst ein benutzerdefiniertes Suchscript erstellen, dass alle Ebenen durchgeht, überprüft ob der Tag vorhanden ist und die Ebenen deiner Objektliste hinzufügt. Wie genau das Hinzufügen zur Liste im Detail funktioniert kann ich dir leider nicht sagen. Der Rest ist nicht so eine grosse Sache.

Freundliche Grüsse

 

Manuel Roth

_________________________________________________
Vectorworks 2022 SP3 | Architektur | Windows 10

Link zu diesem Kommentar

Guten Morgen Manuel Roth

 

Besten Dank für die schnelle Antwort. Leider komme ich nicht weiter. Beim Suchskript habe ich doch die gleiche Auswahlmöglichkeiten wie im Filter der Objektliste (Tabelle). Ich kann hier leider keine Option finden, um meine Konstruktionsebenen gem. "Tag" zu filtern bezw. auszuwählen.

Übersehe ich da etwas?

 

Ich möchte dies in der Vorlage verwenden, um aufgrund von mit Datenbanken verknüpften Objekten eine Stückliste zu erstellen. Über die Tags kann dann Zentral verwaltet werden, welche Ebenen für die Stückliste relevant sind und welche nicht (z.B. Konstruktionsstudien, Ebenen für den Export usw.).

Vectorworks 2022 interiorcad |  Windows11

Link zu diesem Kommentar

Irgendwo tief in der Hilfe vergraben findest du das hier:

Zitat

DesignSeries00070.png DatenbankDurchScript(ScriptName; Parameter1; Parameter2;...)

Verwendet ein Script, um die Inhalte einer Objektfilter-Zeile und ihrer Unterzeilen zu bestimmen. Wird das angegebene VectorScript- oder Python-Skript ausgeführt, übergibt es die Parameter, die dem Skript­namen folgen, an das Skript und erwartet, dass es eine Liste von Ob­jekten zurückgibt, die dann als Unterzeilen in der Reihenfolge verwen­det werden, in der sie vom Skript empfangen werden. Ein optionaler Parameter vor dem Skriptnamen gibt den Ordnerpfad des Skripts in­nerhalb der Vectorworks-Installation an. Eine Liste der Ordnerpfad­werte finden Sie hier in der entwicklerorientierten Dokumentation (In­ternetzugang erforderlich):

developer.vectorworks.net/index.php/VS:GetFolderPath

Weitere Informationen finden Sie ab hier.

 

Das heisst, du könntes ein Script erstellen, welches dir die Objekte zusammenstelle. Nach was für Kritereien bist du völlig frei.

 

Freundliche Grüsse

 

Manuel Roth

_________________________________________________
Vectorworks 2022 SP3 | Architektur | Windows 10

Link zu diesem Kommentar
  • 2 Wochen später...

Ich hab es nun endlich geschafft, mit einem Python-Script die Auwahl auf die Ebenen zu legen, aus welchen ich anschliessend die Objekte, welche mit einer Datenbank verknüpft sind, auflisten möchte.

 

Nun blicke ich jedoch nicht durch, wie ich das Script zu erstellen habe, damit ich in der Tabelle alle Objekte, welche mit der Datenbank "DB_Platten" verknüpft sind aufgelistet bekomme. Ich habe nach Beispielen gesucht, aber irgendwie blicke ich da noch nicht durch.

Lay1 = vs.FLayer() #Handle zum ersten Layer
anz = vs.NumLayers() #Anzahl Layer im Dokument

#Erstelle Liste mit allen Layern im Dokument
ListLay = [Lay1] #Handles zu Layer
for i in range(anz-1):
	ListLay.append(vs.NextLayer(ListLay[i]))


# alle Layernamen als Text (für Kontrolle)
text = '' #Variable zu Layernamen
for i in range(len(ListLay)):
	text += str(vs.GetLName(ListLay[i])) + vs.Chr(13)
#vs.CreateText(text)


#Erstelle Liste mit allen Layern, in welchen der Tag "Stk" vorkommt
ListLayTag = []
Stk = 'Stk' #die If-Schlaufe funktioniert nur mit Variable
for i in range(len(ListLay)):
	Tag = vs.GetObjectTags(ListLay[i])
	if Stk in str(Tag):
		ListLayTag.append(ListLay[i])

#alle Layernamen mit Tag "Stk" (für Kontrolle)
textMitTag = ''

for i in range(len(ListLayTag)):
	textMitTag += str(vs.GetLName(ListLayTag[i])) + vs.Chr(13)
	
vs.CreateText(textMitTag)

 

Vectorworks 2022 interiorcad |  Windows11

Link zu diesem Kommentar

Schönes Script und vorallem die Komentierung ist richtig genial.

 

Ich habe es noch ein wenig gekürzt und den Teil mit dem Suchen der Objekte hinzugefügt.

#MRoth 20201103
#on the base of a script by hölzli

#Layer mit Tag dem Kriterienstring hinzufügen
Lay = vs.FLayer() #Handle zum ersten Layer
crit = ""

for i in range(vs.NumLayers()):
	#Check if tag on layer
	b, Tag = vs.GetObjectTags(Lay)
	if Tag == None:
		pass
	elif 'Stk' in list(Tag): #Wenn ja am Kritereienstring hinzufügen
		crit = crit + "|(L='" + vs.GetLName(Lay) + "')"
	
	#Nächster Layer
	Lay = vs.NextLayer(Lay)

#Objekte suchen und an Tabelle übergeben
if crit != "":
	crit = "((NOTINDLVP & NOTINREFDLVP & (" + crit[1:] + ") & (R IN ['DB_Platten'])))" #Kriterienstring beenden

	vs.ForEachObject(vs.WSScript_AddHandle, crit) #Objekte an Tabelle übergeben

 

  • Like 2

Freundliche Grüsse

 

Manuel Roth

_________________________________________________
Vectorworks 2022 SP3 | Architektur | Windows 10

Link zu diesem Kommentar

Ich habs nun geschafft, das Script so zu erstellen, dass ich meine insgesamt 4 Datenbanken meiner Meinung nach ziemlich Elegant in Tabellen erfasst bekomme.

 

Nun habe ich jedoch ein weiteres Problem:

wenn ich zu viele Ebenen aufgelistet erhalten möchte, wird nicht der ganze Text, welcher das Script erzeugt, erfasst. Somit erhalte ich diese Fehlermeldung:

image.thumb.png.7f076d9ec9281e1653ca7801612b4c2c.png

 

Ich vermute, dass es eine Zeichenlänge-Beschränkung gibt. Da ich in diesem Beispiel 13 Konstruktionsebenen (Werkzeichnung 1, Werkzeichnung 2, usw.) verwende könnte dies gut sein.

 

Lässt sich dies irgendwie umgehen, oder bleibt lediglich die Verwendung von kürzeren Namen?

 

Die Scripts sehen übrigens so aus:

Als "Basis"

#MRoth 20201103
#on the base of a script by hölzli

#Layer mit Tag dem Kriterienstring hinzufügen
Lay = vs.FLayer() #Handle zum ersten Layer
crit = ""

for i in range(vs.NumLayers()):
	#Check if tag on layer
	b, Tag = vs.GetObjectTags(Lay)
	if Tag == None:
		pass
	elif 'Stk' in list(Tag): #Wenn ja am Kriterienstring hinzufügen
		crit = crit + "|(L='" + vs.GetLName(Lay) + "')"
	
	#Nächster Layer
	Lay = vs.NextLayer(Lay)

und zur Auswahl der jeweiligen Datenbank je ein Script wie dieses:

#gim 2020-11-09
#übernommen aus MRoth 20201103
#Skript zur Ebenenauswahl via Tag Ausführen
vs.PythonExecute(str(vs.GetScriptResource('Ebenenauswahl')[1]))

#welche Datenbank soll hier verwendet werden
DB = 'DB_Artikel'

#Objekte DB_Bleche suchen und an Tabelle übergeben
if crit != "":
	crit = "((INSYMBOL & INOBJECT & INVIEWPORT & (" + crit[1:] + ") & (R IN [" + DB + "])))" #Kriterienstring beenden

	vs.ForEachObject(vs.WSScript_AddHandle, crit) #Objekte an Tabelle übergeben

 

Vectorworks 2022 interiorcad |  Windows11

Link zu diesem Kommentar

OK. Was ich zuerst prüfen würde, ist ob wirklich alle Klammern geschlossen sind. Gib dir dafür den fertigen String mit vs.AlrtDialog aus.

 

Ansonsten scheint der Kriterienstring wirklich eine maximale Länge zu haben. In diesem Fall musst du dein Script ein wenig umbauen.

1. Anstelle mit den getagten Ebenen einen String zu erstellen, machst du eine Liste.

2. Beim Kriterienstring verwendest nur noch die Datenbank als Kriterium. Die Ebene lässt du weg.

3. Damit du trotzdem nach den Ebenen filtern kannst, geht die direkte Übergabe vie vs.WSScript_AddHandle nicht mehr. Füge stattdessen eine eigene Funktion am Anfang des Scripts ein.

Die Funktion könnte in etwa so aussehen.

def AddObject(h):
	if vs.GetLayer(h) in Layerlist:
    	vs.WSScript_AddHandle(h)

...

if crit != "":
	crit = "((INSYMBOL & INOBJECT & INVIEWPORT & (R IN [" + DB + "])))" #Kriterienstring beenden

	vs.ForEachObject(AddObject, crit) #Objekte an Tabelle übergeben

Ist ungetestet und wahrscheinlich habe ich irgendetwas vergessen. Aber als Anhaltspunkt sollte es funktionieren.

 

Warum teilst du dein Script in zwei Teile? Wäre es nicht einfacher, immer das selbe Script zu verwenden und die Datenbank, nach der Gesucht werden soll per Parameter an das Script zu übergeben. Als Funktion dafür sollte WSScript_GetPrmStr funktionieren.

Wenn du das Script nun als .py-Datei im Arbeitsgruppenordner ablegst, kannst du es aus jedem Dokument aufrufen (Siehe Zitat oben) ohne das Script an sich importieren zu müssen. Und da die Auswahl der DB über den Parameter geschieht, brauchst du nicht einmal ein Script im aktuellen Dokument um die DB festzulegen.

Selbst habe ich diese Idee noch nie ausgeführ. Aber eigentlich sollte es funktionieren.

  • Like 1

Freundliche Grüsse

 

Manuel Roth

_________________________________________________
Vectorworks 2022 SP3 | Architektur | Windows 10

Link zu diesem Kommentar
vor 7 Minuten schrieb Manuel Roth:

OK. Was ich zuerst prüfen würde, ist ob wirklich alle Klammern geschlossen sind. Gib dir dafür den fertigen String mit vs.AlrtDialog aus.

Das habe ich insofern überprüft, dass es wunderbar funktioniert, wenn ich weniger Ebenen tagge.

 

Ich habe nun das Script nach bestem Wissen und Gewissen erstellt:

#hölzli 2020-11-09 V2
#basierend auf MRoth 20201103

def AddObject(h):
	if vs.GetLayer(h) in RLay:
		vs.WSScript_AddHandle(h)

#welche Datenbank soll verwendet werden
DB = vs.WSScript_GetPrmStr(0) #erster Parameter definiert Datenbankname

#Layer mit Tag Filtern
Lay = vs.FLayer() #Handle zum ersten Layer
RLay = [] #Liste mit Layern mit dem Ausgewählten Tag

#Liste für Ebenen erstellen
for i in range(vs.NumLayers()):
	#Check if tag on layer
	b, Tag = vs.GetObjectTags(Lay)
	if Tag == None:
		pass
	elif 'Stk' in list(Tag): #Wenn ja, der Liste hinzufügen
		RLay.append(Lay)
	
	#Nächster Layer
	Lay = vs.NextLayer(Lay)
	

#Objekte aus Datenbank suchen und an Tabelle übergeben
crit = "((INSYMBOL & INOBJECT & INVIEWPORT & (R IN [" + DB + "])))" #Kriterienstring

vs.ForEachObject(AddObject, crit) #Objekte an Tabelle übergeben
#((INOBJECT & INVIEWPORT & (L='Werkzeichnung7') & (R IN ['DB_Artikel'])))

es funktioniert soweit ganz gut, ABER leider werden nun die Objekte, welche in einem Symbol liegen nicht angezeigt, trotz dem String INSYMBOL. Gibt es möglicherweise eine Einschränkung bei der Funktion vs.ForEachObject?

 

Die letzte Zeile diente mir zum überprüfen. Mit Rechter Maustaste, Kriterium wählte ich dies aus um meine Auswahl zu prüfen. Im Fenster "Filter" wurden mir 8 Objekte angezeigt, jedoch erscheinen in der Tabelle lediglich zwei.

image.png.8ed771a9b5833c2fab5b9abbdd3f4e9f.png 

image.png.a69308778263516d5cb1e2ed36fb9b6e.png

 

Das Scripten macht tatsächlich Spass, sogar wenn man noch so in den Anfängen steckt wie ich ?

 

Besten Dank schon für die grossartige Unterstützung @Manuel Roth!

 

Vectorworks 2022 interiorcad |  Windows11

Link zu diesem Kommentar

Auf dem Fahrrad (Arbeitsweg) kam ich auf die Idee, eine zusätzliche Schlaufe laufen zu lassen pro ausgewählte Ebene.

Folgendes Script funktioniert nun nach meinen ersten Tests gemäss meinen Vorstellungen.

#hölzli 2020-11-12
#basierend auf MRoth 20201103

def AddObject(h):
	vs.WSScript_AddHandle(h)

#welche Datenbank soll verwendet werden
DB = vs.WSScript_GetPrmStr(0) #erster Parameter definiert Datenbankname

#Layer mit Tag Filtern
Lay = vs.FLayer() #Handle zum ersten Layer
RLay = [] #Liste mit Layern mit dem Ausgewählten Tag

#Liste für Ebenen erstellen
for i in range(vs.NumLayers()):
	#Check if tag on layer
	b, Tag = vs.GetObjectTags(Lay)
	if Tag == None:
		pass
	elif 'Stk' in list(Tag): #Wenn ja, der Liste hinzufügen
		RLay.append(Lay)
	
	#Nächster Layer
	Lay = vs.NextLayer(Lay)
	

#Objekte aus Datenbank suchen und an Tabelle übergeben
for i in range(len(RLay)):
	Ebene = vs.GetLName(RLay[i])
	crit = "((INSYMBOL & INOBJECT & INVIEWPORT & (L='" + Ebene + "') & (R IN [" + DB + "])))" #Kriterienstring
	vs.ForEachObject(AddObject, crit) #Objekte an Tabelle übergeben

 

  • Like 1

Vectorworks 2022 interiorcad |  Windows11

Link zu diesem Kommentar

Gute Idee, jede Ebene separat laufen zu lassen. In diesem Fall müsstest du nicht einmal mehr eine eigene Funktion schreiben, sondern könntest an ForEachObject direkt die Funktion WSScript_AddHandle übergeben. Wie in der ersten Variante.

 

Ich denke, dass das Problem bei den Objekten im Symbol ist, dass diese Objekte nicht einer bestimmten Ebene zugeordnet sind, sondern dem Symbol. Der Handle zum Objekt im Symbol ist der selbe, egal auf welcher Ebene die Symbolinstanz liegt.

 

Hat die Idee mit dem .py-Dokument funktioniert? Wenn ja könntest du die Tabellenformel teilen, die du verwendet hast um das Script auszuführen.

Freundliche Grüsse

 

Manuel Roth

_________________________________________________
Vectorworks 2022 SP3 | Architektur | Windows 10

Link zu diesem Kommentar
vor 3 Minuten schrieb Manuel Roth:

Gute Idee, jede Ebene separat laufen zu lassen. In diesem Fall müsstest du nicht einmal mehr eine eigene Funktion schreiben, sondern könntest an ForEachObject direkt die Funktion WSScript_AddHandle übergeben. Wie in der ersten Variante.

stimmt, die Funktion wird eigentlich überflüssig.

 

vor 3 Minuten schrieb Manuel Roth:

Hat die Idee mit dem .py-Dokument funktioniert? Wenn ja könntest du die Tabellenformel teilen, die du verwendet hast um das Script auszuführen.

Ich hab dies noch gar nicht getestet, da ich dieses Skript lieber direkt in mein Vorgabedokument und die Bibliothek lege. Somit bin ich Ortsunabhängig, falls ich mal an einem Arbeitsplatz (zu hause) etwas ändern möchte, wo ich leider nicht Vollzugriff aufs System habe.

 

Für mich ist dieses Skript vorerst als voll funktionsfähig abgeschlossen und und ich widme mich dem nächsten der Unzähligen Umsetzungswünsche ?

Sollte ich in der Praxisanwendung nochmals Änderungen daran als notwendig erachten, melde ich mich hier wieder.

  • Like 1

Vectorworks 2022 interiorcad |  Windows11

Link zu diesem Kommentar
  • 1 Jahr später...

Nachdem ich dieses Script nun lange problemlos angewendet habe ist mit VW22 ein Phänomen aufgetreten:

Wenn ich meine Tabelle, welche durch das Skript erzeugt wurde Zusammenfassen möchte, erscheint immer das als erstes gezeichnete Objekt IMMER einzeln, es wird also nicht zusammengefasst.

 

Ist das ein Bug von VW und/oder kann ich das irgendwie umgehen @Manuel Roth?

 

image.thumb.png.31caaabbb6f31e1b552ea17089ef7b25.png

Tabelle Zusammenfassen_2022-04-17.vwx

Vectorworks 2022 interiorcad |  Windows11

Link zu diesem Kommentar

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
      23,5Tsd
    • Beiträge insgesamt
      120,8Tsd
×
×
  • Neu erstellen...