Jump to content

hölzli

Mitglieder
  • Gesamte Inhalte

    19
  • Benutzer seit

  • Letzter Besuch

Reputation in der Community

3 Neutral

Über hölzli

  • Rang
    Mitglied

Persönliche Informationen

  • Anwendungsbereich
    Schreinerei/Innenausbau
  • Land
    Schweiz
  • Ich bin
    Gewerblicher Anwender

Letzte Besucher des Profils

83 Profilaufrufe
  1. Werden die Daten, welche ausgewertet werden innerhalb der Klasse möglicherweise im "pycache" zwischengespeichert? C:\Users\USERNAME\AppData\Roaming\Nemetschek\Vectorworks\2020\Plug-Ins\Marionette\__pycache__ Falls ja, weiss jemand, ob es möglich ist, die entsprechende Instanz dieses Nodes mit dem Ausgeführten Skript zu unterdrücken oder zu löschen, damit wieder neu berechnet werden muss? Im Prinzip ja absolut ineffizient was die Geschwindigkeit angeht, aber für gewisse Situationen könnte dies ja durchaus hilfreich sein 🙂 Auf jeden Fall werden die Daten ja berechnet und müssen dann auch gespeichert werden. Wenn man den Ort kennt, gibt es vielleicht ja auch eine Möglichkeit, dies zu ändern? Interessanterweise wird eine Änderung in der Tabelle zwar im Popup nicht angezeigt, ein neuer Wert wird jedoch im Output ausgegeben. Das Skript wird also sehr wohl ausgeführt, jedoch ohne Einfluss auf die Liste, welche für das Dropdown verwendet wird.
  2. Haha, "...dann kam einer, der wusste das nicht und hat es gemacht" 🙂 Dein Script funktioniert soweit ja wunderbar. Das Weglassen vom .value war mein Fehler, weshalb ich durch" try and error" auf den Versuch mit dem Einfügen VOR @Marionette.NodeDefinition kam und dachte, eine Lösung gefunden zu haben. Es scheint, dass der Code in Class Params nur beim Einfügen eines Nodes oder der Bearbeitung aktualisiert wird.
  3. Nach meinem Verständnis ist ja SetDescription lediglich für die Beschreibung relevant, also ist der "Wert" dort der anzuzeigende Text, beim Klicken auf "Beschreibung.
  4. Ich möchte gerne ein Marionette Node erstellen, welches "dynamisch" die Werte aus einer Tabelle zur Auswahl stellt und die entsprechenden Werte aus den jeweiligen Spalten wiedergibt. Die Auswahl funktioniert soweit, dass im Popup die richtigen Werte stehen. Beim Ausführen erhalte ich jedoch eine Meldung, dass ein Name nicht definiert ist - genau der Name, welcher jedoch für die Auswahl ja zu funktionieren scheint 😞 Wie kann ich ein Script so ausführen lassen, dass die Namen sowohl in der Nodedefinition wie auch in der Ausführung verfügbar sind? Inhalt des Nodes: #gim2020-11-19 #Modified April 2017 #Script zur Auswahl der Tabelle und der Werte tabname = 'Spot Standard' #Name der Tabelle tab = vs.GetObject(tabname) #Handle zur Tabelle (numRows, numColumns) = vs.GetWSRowColumnCount(tab) #Zählt die Anzahl Zeilen und Spalten def frange(x, y, jump): #x entspricht der Startzeile in der Tabelle, y der letzten Zeile, jump ist die Schrittgrösse while x - y <= .000001: yield x x += jump list = [] list = [n for n in frange(2, numRows, 1)] #erstellt eine Liste, welche Zeilen aus der Tabelle ausgewählt werden sollen Artikelbeschriebe = [] Artikelnummern = [] for i in range(len(list)): Artikelbeschriebe.append(vs.GetWSCellFormulaN(tab, list[i], 1)) #Die Beschriebe sind in der ersten Spalte Artikelnummern.append(vs.GetWSCellFormulaN(tab, list[i], 2)) #Die Nummern sind in der zweiten Spalte @Marionette.NodeDefinition class Params(metaclass = Marionette.OrderedClass): #APPEARANCE #Name this = Marionette.Node( 'Popup' ) this.SetDescription('This node demonstrates the use of a Popup OIP control. The values returned by this node will be integers based on your selection starting with 0 for the first option and increasing by 1 for consecutive options.') #Input Ports #OIP Controls input = Marionette.OIPControl( 'Popup', Marionette.WidgetType.Popup, 0, Artikelbeschriebe) input.SetDescription('an OIP control representing the options designated within the script editor') #Output Ports outputs = Marionette.PortOut('sArtikel') outputs.SetDescription('Artikelbeschrieb') outputn = Marionette.PortOut('nArtikel') outputn.SetDescription('Artikelnummer') #BEHAVIOR def RunNode(self): #inputs pass input = self.Params.input.value #Integer der Auswahl Artb = self.Params.Artikelbeschriebe.value Artn = self.Params.Artikelnummern.value #script outputs = Artb[input] outputn = Artn[input] #outputs self.Params.outputs.value = outputs self.Params.outputn.value = outputn Die Tabelle sowie das Popup im OIP: und die ernüchternde Fehlermeldung: Popup mit Werten aus Tabelle_2020-11-19.vwx
  5. Guten Tag Antonio Besten Dank für den Hinweis. Dieses Thema ist übrigens von mir, ich heisse im englischsprachigen Forum einfach Gregi - frag mich nicht warum ich mich da nicht für einheitliche Logins entschieden habe 🙂 Mein Wunsch ist, dass ich die Koordinatenfelder sehe, jedoch nur diejenigen, welche auch variabel sein sollen...
  6. Ich versuche eigentlich primär, innerhalb Marionette den "ControlPoint3D" so zu modifizieren, dass ich entweder eine bis zwei Achsen "blockiere", also statisch festlege, scheitere aber. Leider finde ich keinerlei Angaben, wie Marionette.CreateControlPointCoord3D(self.Handle, x, y, z) oder vs.Mrntte_ControlPoint(nodeHandle, coordX, coordY, coordZ, False) #3D vs.Mrntte_ControlPoint(nodeHandle, coordX, coordY, 0, True) #2D Funktionieren. Mein Hauptproblem ist, dass z.B. "coordY" IMMER direkt auf die zweite Variable aus "class Params" zugreift, auch wenn ich dort einen absoluten Wert eingebe. Wenn es für Marionette ein OIP-Widget-Type geben würde, welcher nichts anzeigt (auch keine Separator-Linie) dann hätte ich beinahe einen Lösungsansatz gefunden: def RunNode(self): #inputs x = self.Params.x.value y = self.Params.y.value = 100 #Diesen Wert möchte ich aber Restlos aus dem OIP entfernen z = self.Params.z.value = 100 #Diesen Wert möchte ich aber Restlos aus dem OIP entfernen #script appMajor, appMinor, appMaint, platform = vs.GetVersion() units = vs.GetPrefReal(150) pioHandle = vs.Handle(Marionette.parametric_handle) if pioHandle != vs.Handle(0): if appMajor >=24: Marionette.CreateControlPointCoord3D(self.Handle, x, y, z) units = vs.GetPrefReal(150) x = x/units y = y/units z = z/units else: x = x/units y = y/units z = z/units else: x = x/units y = y/units z = z/units #outputs self.Params.pt.value = (x, y, z)
  7. Nun ja, mir gehts genau darum "sowohl als auch" zu erreichen. Aktuell habe ich diverse PIOs erstellt. in der Praxis zeigt sich jedoch, dass das Einfügen und auf die richtige Grösse setzen ziemlich aufwändig wäre. Dies ginge mit Modifikationspunkten deutlich intuitiver. Da es aber oft auch vorkommt, dass ein Wert fix ist, oder um einen fixen Wert korrigiert werden soll, ist die Eingabe über die OIP deutlich komfortabler - besonders wenn ich mehrere Objekte um den gleichen Wert verändern möchte.
  8. stimmt, die Funktion wird eigentlich überflüssig. 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.
  9. 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
  10. 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. 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!
  11. 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: 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
  12. Besten Dank für den Input. Erste Versuche konnte ich bereits machen. für 3D Objekte habe ich aber noch nicht viel gefunden. Liege ich richtig in der Annahme, dass ich dafür wohl einzelne solche Plugins erstellen muss, welche ich dann in den Scripts abrufen und positionieren kann? Ich merke, dass ich da ein je länger je grösseres Feld aufmache - interessant!
  13. Wow, das ist super genial! Herzlichen Dank! Somit habe ich immerhin mein erstes Script (zumindest im Grundstein) erstellt. Herzlichen Dank für die Hilfe. Das erfüllt exakt meine Vorstellung.
  14. Hallo zusammen Ich möchte für meine PIOs, welche ich mit Marionette erstellt habe gerne Modifikationspunkte erstellen. Grundsätzlich wäre dies ja über "ControlPoint" als 2D oder 3D einfach möglich. Allerdings wünsche ich nur Modifikationspunkte welche jeweils nur EINE Achse bearbeiten. Ähnlich wie die mittleren Modifikationspunkte z.B. bei einem Rechteck: Damit möchte ich z.B. ein Rohr lediglich in die Länge ziehen, der Modifikationspunkt bleibt dabei immer auf seiner Flucht und in der Infopalette möchte ich auch lediglich EIN Feld (Länge) angezeigt bekommen. Alle meine Versuche bei der Bearbeitung des Nodes sind gescheitert. Ich konnte auch noch keine Informationen finden, wie ein solcher Punkt mit Python erzeugt werden kann. Bin um jede Hilfe dankbar.
  15. Wie würde denn ein solches Skript aussehen? Oder wo finde ich die benötigten Informationen? Über Appendix und Function Reference wurde ich nicht schlau - bin aber auch nicht wirklich erprobt in VectorScript/PythonScript. Ich denke, die Basis (Auswahl von Klassen mit Tags) könnte ich ganz ähnlich für meinen Wunsch bezüglich Konstruktionsebenen anwenden?.
×
×
  • Neu erstellen...