Forum de la communauté Allplan

[Question] Fenster Beschriftung mit Verschattung

Balises:
  • Rollladen
  • Jalousie
  • Klappladen
  • Schiebeladen
  • Beschriftungsbild Formel
  • Beschriftungsbild

Morjeeen,

gibt es eine Möglichkeit über ein Beschriftungsbild von einem Fenster SmartPart, die Bezeichnung des Sonnenschutz-SmartParts zu erhalten, die in der gleichen Fensteröffnung eingebaut ist?

Siehe Bild 1, da wo "Verschattung=ja" steht, soll bitte die Bezeichnung des Sonnenschutz-SmartParts stehen...

Danke im voraus

Lg René
http://www.baucon.de

Pièces-jointes (2)

Type: image/jpeg
Téléchargé 122 fois
Size: 174,54 KiB
Type: application/octet-stream
Téléchargé 1265 fois
Size: 2,75 MiB

Show most helpful answer Hide most helpful answer

Die Funktion CHILD in MT_...(CHILD(@498@)) gibt z.B. folgendes zurück: "Fenstermakro,-SmartPart+Sonnenschutz"
Wenn ein Leibungselement da ist, dann ist das Ergebnis dieses:"Brüstung+Fenstermakro,-SmartPart+Fenstermakro,-SmartPart+Sonnenschutz"

Man sieht, die Elemente werden durch "+" getrennt ausgegeben. Warum beim Vorhandensein eines Leibungselementes, das FensterSmartPart doppelt gezählt wird, kann wohl nur Allplan beantworten! Das ist ein Fehler!

Die Funktion CHILD in MT_...(CHILD(@507@)) gibt z.B. folgendes zurück: "Fenster/Rolladen"
Wenn ein Leibungselement da ist, dann ist das Ergebnis dieses:"bruestung3/Fenster/Jalousie"
Man sieht, die Elemente werden durch "/" getrennt ausgegeben.

Mit diesem wissen kann man das Problem nur in einer vbs-funktion lösen.
Dazu in der Datei functions.vbs im \STD folgendes einfügen:

Function get_sun_shade(nam_lst,bez_lst)
   Dim strNames,strName,strBezs,strBez,strRes,strLast

   strRes=""
   strNames=Split(nam_lst,"+")
   strBezs=Split(bez_lst,"/")
   idx=-1
   i = 0
   strLast=""
   For Each strName In strNames
      If strName = "Sonnenschutz" Then
         idx = i
      End If
      If strLast = strName Then

      Else
         i=i+1
      End If
      strLast = strName
   Next
   j = 0
   For Each strBez In strBezs
      If j = idx Then
         strRes = strBez
      End If
      j=j+1
   Next

   get_sun_shade = strRes & "                                   "

End Function

Die vorletzte Zeile der Funktion sieht etwas eigenartig aus:
Wenn man die Leerzeichen aber nicht anfügt, stürzt Allplan ab!
Warum das so ist, müßte Allplan mal herausfinden.
Das ist ebenfalls ein schwerer Fehler!

Die Formel im Beschriftungsbild für den Aufruf der Funktion lautet:
_IF_(MT_Fensterelement(CHILD(@498@))="")get_sun_shade(MT_Fensteröffnung(CHILD(@498@));MT_Fensteröffnung(CHILD(@507@)))_ELSE_get_sun_shade(MT_Fensterelement(CHILD(@498@));MT_Fensterelement(CHILD(@507@)))

Dafür sollte das Format A254 eingestellt sein.

11 - 20 (49)

Bei mir steht im functions.vbs schon das drin...

Function block(liste)
       blanc = InStr(1,liste," ")
	   
	   If blanc > 1 Then
          block = Mid(liste,1,blanc) + vbCr + Mid(liste,blanc+1,Len(liste))
	   Else
          block = liste
       End If		  
End Function	

soll ich darunter das von dir einfach schreiben? Bin dabei gerade echt überfragt

Lg René
http://www.baucon.de

Die Erklärung, was VB-Script ist, liefert Wikipedia.

Leider setzt Allplan immer noch auf diese "tote Sprache", die selbst vom Erfinder Microsoft nicht mehr weiterentwickelt wird.

Wie man an dem Beispiel sieht, kommt man bei einer Formel mit einer Länge von 254 Zeichen sehr schnell an die Grenzen.
Deshalb braucht man auch ein Script, um eine Funktion "auszulagern".

Es wäre absolut notwendig, dass die Script-Sprache des Formel-Editor auf etwas zeitgemäßes umgestellt wird.
Z.b. hat man ja schon seit längerem bei Allplan Python an Bord! Da wäre es doch naheliegend, (auch) Python als Script-Sprache
bei Formeln einzusetzen!

Mein perönliches Must-Have-Feature von Allplan 2021 setzt leider auch noch auf den alten Formel-Editor.
Schade, dass man die Gelegenheit nicht ergriffen hat, da etwas Neues zu machen!
..also muss man weiter mit 254 Zeichen und VBScript "rumhantieren"!

...ja einfach drunter per Copy und Paste einfügen...

Cité par Nemo
_IF_(MT_Fensterelement(CHILD(@498@))="")get_sun_shade(MT_Fensteröffnung(CHILD(@498@));MT_Fensteröffnung(CHILD(@507@)))_ELSE_get_sun_shade(MT_Fensterelement(CHILD(@498@));MT_Fensterelement(CHILD(@507@)))

was hat es mit der @498@ also Objektname auf sich???Ich möcht ja eigentlich nur die Bezeichnung des Sonnenschutz Smartparts. denn wenn ich die Formel eingebe, erscheint dann nichts.
Mache ich irgendwas falsch im Function.VBS ???? (Siehe Anhang)

Möchte das verstehen

Lg René
http://www.baucon.de

Pièces-jointes (1)

Type: image/jpeg
Téléchargé 12 fois
Size: 59,03 KiB

Die Funktion get_sun_shade macht eigentlich nichts anderes, als im Text der Element-Namen "Sonnenchutz" zu suchen,
und dieselbe "Stelle" aus den Bezeichnungs-Namen zu extrahieren.

Eingangs-Werte der Funktion:
Element-Namen nam_lst = "Brüstung+Fenstermakro,-SmartPart+Fenstermakro,-SmartPart+Sonnenschutz"
Element-Bezeichnungen bez_lst = "bruestung3/Fenster/Jalousie"

strNames=Split(nam_lst,"+") 'zerlegt den String in Teile, Trenner ist "+"
strBezs=Split(bez_lst,"/") 'zerlegt den String in Teile, Trenner ist "/"

erste For-Next-Schleife 'sucht nach "Sonnenschutz" in den Teilen, mekrt sich den Index, überpringt gleiche Teile
zwiete For-Next-Schleife 'weist dem Ergebnis-String strRes den Teil aus den Bezeichnungen mit dem gemerkten Index zu

That's it.

Wenn's nicht funktioniert,dann testweise mal

get_sun_shade = nam_lst

oder

get_sun_shade = bez_lst

einfügen.
Dann sollte er die Eingangs-Strings zurückgeben.

..und dann weiter im Code Teile austauschen, bis man weiss, wo etwas fehlt. Man nennt das "debuggen"...

Wichtig:
Für diesen "Stunt" muss man das Fenster-SmartPart beschriften!
Und die functions.vbs schön nach jeder Änderung speichern!

Cité par Nemo

Wenn's nicht funktioniert,dann testweise mal
get_sun_shade = nam_lst
oder
get_sun_shade = bez_lst
einfügen.

Wo denn einfügen?

Function get_sun_shade(nam_lst,bez_lst)
   Dim strNames,strName,strBezs,strBez,strRes,strLast

   strRes=""
   strNames=Split(nam_lst,"+")
   strBezs=Split(bez_lst,"/")
   idx=-1
   i = 0
   strLast=""
   For Each strName In strNames
      If strName = "Sonnenschutz" Then
         idx = i
      End If
      If strLast = strName Then

      Else
         i=i+1
      End If
      strLast = strName
   Next
   j = 0
   For Each strBez In strBezs
      If j = idx Then
         strRes = strBez
      End If
      j=j+1
   Next

   get_sun_shade = nam_lst & "                                   "

End Function

So? ich verstehe nicht ganz was du mit der Aussage meinst, also wo ich es Teilweise einfügen soll

Lg René
http://www.baucon.de

genau so:
get_sun_shade = nam_lst

( & " " ) kannst in diesem Fall weglassen

Aber in der finalen Fassung wieder hinzufügen, sonst stürzt Allplan ab!

Sorry aber irgendwie will es einfach nicht...
unten im Anhang ist unser function.vbs und die Test Fenster mit Allen verschattungen.

Wenn du Zeit und Energie dafür hast, könntest du das machen ? :-(
und das Beschriftungsbild auch.

bin am verzweifeln.
Ich kenne mich leider Null mit Vbs aus...

Lg René
http://www.baucon.de

Pièces-jointes (2)

Type: text/plain
Téléchargé 839 fois
Size: 230,00 B
Type: application/octet-stream
Téléchargé 739 fois
Size: 2,75 MiB

In Deiner function.vbs gibt es keine Function get_sun_shade!

Anbei mein Test-Teilbild, und die Textdateien für Formel und Script.
Damit sollte man es schaffen können...

Pièces-jointes (3)

Type: application/octet-stream
Téléchargé 753 fois
Size: 1,13 MiB
Type: text/plain
Téléchargé 825 fois
Size: 638,00 B
Type: text/plain
Téléchargé 802 fois
Size: 459,00 B

Vielen Dank für deine Bemühung, wenn ich deine NDW Datei ins Projekt rein hole, sieht man alles.
Komisch ist nur, das wenn ich deine function.vbs datei im std\vbs rein kopiere (ohne hinten das von dir geschriebene .txt) und auch ein Beschriftungsbild erstelle mit der gleichen Formel und auf A254, funktioniert es trotzdem nicht, ich weiß leider nicht woran es scheitert

Lg René
http://www.baucon.de

11 - 20 (49)