Support Forum

[Frage] Beschriftungsbild mit Zeilenumbruch

Schlagworte:
  • Allplan2018
  • Beschriftungsbild
  • Zeilenumbruch

Hallo Community,

das ist meine erste Anfrage.
Ich hoffe ihr könnt mir weiterhelfen.

ich habe folgendes Problem, ich muss in Allplan ein Attribut auswerten und in einem Text wiedergeben. Dies kann ich mit Excel-Formeln machen. Allerdings können in Allplan nur 254 Zeichen eingegeben werden. meine entwickelte Formel hat 314 Zeichen und muss somit verkürzt werden.

Das auszulesende Attribut heißt Bauvorhaben = @460@ in meiner Formel ist es A1.
In diesen Attribut steht ein Text, dieser Text muss auf 5 Zeilen mit jeweils maximal 25 Zeichen aufgeteilt werden. In Allplan gibt es leider keine Möglichkeit auf Zwischenschritte zurückzugreifen, daher muss alles in eine Formel. Des Weiteren soll der Zeilenumbruch nicht mitten im Wort geschehen, sondern nach einem Lehrzeichen.

vielen Dank für eure Hilfe.

Mfg Christoph

Beispieltext Für das Attribut (A1):
Max Mustermann GmbH und Co KG Mustermannstadt vertreten durch Herrn Oberbürgermeister Max Musterman.

Formel für Zeile 1:

=WENN(LÄNGE(A1)> WENN(LÄNGE(A1)>25;FINDEN("#";WECHSELN(LINKS(A1;25);" ";"#";LÄNGE(LINKS(A1;25)) -LÄNGE(WECHSELN(LINKS(A1;25);" ";""))));"100");LINKS(A1; WENN(LÄNGE(A1)>25;FINDEN("#"; WECHSELN(LINKS(A1;25);" ";"#";LÄNGE(LINKS(A1;25))-LÄNGE(WECHSELN(LINKS(A1;25);" ";""))));"100")); A1)

alle weiteren Zeilen müssen entsprechendeine neue angepasste Formel erhalten.

Ergebnis:
Max Mustermann GmbH und
Co KG Mustermannstadt
vertreten durch Herrn
Oberbügermeister Max
Mustermann

Hilfreichste Antwort anzeigen Hilfreichste Antwort verbergen

..es gibt eine Datei "function.vbs" im Ordner STD.
Dort könnte man solche "Formeln" als Visual-Basic-Funktion ablegen.
Suche mal nach "function" im Forum...

1 - 10 (27)

Kann mir da wirklich keiner helfen?
das muss doch irgendwie möglich sein.

mfg Christoph

..es gibt eine Datei "function.vbs" im Ordner STD.
Dort könnte man solche "Formeln" als Visual-Basic-Funktion ablegen.
Suche mal nach "function" im Forum...

als Beispiel ist das derzeit die Funktion drinnen, was sicher schon mal ein guter Startpunkt ist.
Achte drauf, dass dein Funktionnsame nicht mit einer anderen Funktion in Excel und allplan kollidiert

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	

Allplan Webentwicklung

Private messages must be private. No support request via Private message.

wenn als VBS... dann reicht eine formel aus.
damit ist das auf jeden fall lösbar.

Namenlos gezeichnet in vollem Bewusstsein - ignorant, in eigen Augen vermutlich höflich, dennoch unhöflichst, unfreundlichst wer einen/viele vermutete - sich von alters erschließende Namen nennt.
[b]

mit VBS kenne ich mich leider nicht aus.

@Marcus die Formel habe ich mir ja schon gebastelt. kann ich die in so ein VBS einfach reinkopieren?
bzw. wie erstelle ich überhaupt ein VBS?

die Formel reinkopieren halte ich für möglich, aber nicht zielführend. Du brauchst sonst ja für jede Zeile eine eigen Formel ..

halte ich nicht für Prickelnd.

DAS nachfolgende (funktioniert in Excel) und muss in die function.vbs Datei im Büro Ordner /STD kopiert werden :

!!!! ACHTUNG .. VORHER eine Kopie der Datei erstellen !!!!!!

Dann kannst du mit
getTextPart ( @460@ , 1 , 25 ) dir die erste Zeile des Attributs holen
getTextPart ( @460@ , 2 , 25 ) dir die zweite Zeile des Attributs holen
usw.
getTextPart ( @460@ , 5 , 25 ) dir die 5. Zeile des Attributs holen

Und: wenn du später statt 25 Zeichen pro Zeile mal 40 Zeichen haben möchtest: geht das ohne zu programmieren mit nur einem Parameter ..

getTextPart ( @460@ , 1 , 40 )
oder zeile 2 dann
getTextPart ( @460@ , 2 , 40 )

kann auf jedes Text Attribut angewendet werden ..

**************************** Anfang Quellcode ************************************

Public Function getTextPart(LongText, Line, maxLength)
' (c) J.Velletti
' connect.allplan.com/de/forum/themen/topic/topics/cad-allgemein-1/beschriftungsbild-mit-zeilenumbruch.html
'
' Ziel: Einen Teilstring aus dem Textwert LongText (= Attribut, andere Zelle etc) zurückliefern.
' Parameter Line sollte > 0 sein.
' maxLength die gewünschte maximale Länge einer Zeile
'
    While Line > 0
        temp = getOneLine(LongText, maxLength)
        ' Falls zeile 2 bzw. 3 etc gesucht ist, die vorherige zeile aus LongString entfernen
        LongText = Trim(Mid(LongText, Len(temp) + 1, 999))
        Line = Line - 1
    Wend

    ' nun den  rückgabewert = name der Function setzen !
    ' dabei das erste ungewollte Leerzeichen entfernen und zur sicherheit auf die maximale Länge bescheinden
    getTextPart = Mid(temp, 1, maxLength)



End Function

Private Function getOneLine(workOn, maxLength)

     a = Split(workOn, " ")
    tempSub = ""
    For Each x In a
        If (Len(tempSub & " " & x) < maxLength) Then
            tempSub = tempSub & " " & x
        End If
    Next
    getOneLine = Mid(tempSub, 2, maxLength)
End Function

**************************** Ende Quellcode ************************************

siehe auch:

Excel VBscript für Dummies.
https://www.dummies.com/software/microsoft-office/excel/how-to-create-custom-excel-functions/

das angehängte Bild 1 zeigt, wie das VBS marcor Fenster , Bild 2 wie die Test Tabelle bei mir in Excel aussieht:

Bild 2:
in A1 steht der Text,
in A4 die Formel : =getTextPart(A1;1;25)
in A5 die Formel : =getTextPart(A1;2;25)
in A6 die Formel : =getTextPart(A1;3;25)
usw ..

Allplan Webentwicklung

Private messages must be private. No support request via Private message.

Anhänge (2)

Typ: image/png
261-mal heruntergeladen
Größe: 147,74 KiB
Typ: image/png
183-mal heruntergeladen
Größe: 50,22 KiB

Alternativ erzeugt diese Funktion gleich einen mehrzeiligen Textblock

Function zeilen(txt,zln)
	
	strRemain = txt
	strResult = ""
	iLen=CInt(zln)
	Do While Len(strRemain) > iLen
	
		pos = InStr(iLen,strRemain," ")
		If pos = 0 Then
		    If Len(strResult) > 0 Then 
			strResult = strResult + vbCr
		    End If
		    strResult = strResult + strRemain
		    strRemain = ""
		Else
		    If Len(strResult) > 0 Then 
			strResult = strResult + vbCr
		    End If
		    strResult = strResult + Mid(strRemain,1,pos)
		    strRemain = Mid(strRemain,pos+1,Len(strRemain))
		End If

	Loop
	
	zeilen = strResult
	
End Function

Formel: zeilen(@attr@;25) ... 25 = min. Zeichenlänge der Zeile

vielen dank für die Hilfe.

mit der Begrenzung auf 25 Zeichen hab ich es in Excel hinbekommen.
bei 40 Zeichen kommt allerdings folgendes raus:

Spalte Formel Ausgabe
A4 =getTextPart(A1;1;40) Max Mustermann GmbH und Co KG durch
A5 =getTextPart(A1;2;40) rmannstadt vertreten durch Herrn Max
A6 =getTextPart(A1;3;40) rbürgermeister Max Mustermann.

und beim einbinden in Allplan brauche ich noch Hilfe.
habe es in der Datei unter Nemdaten\Allplan\Std\VBS\functions.vbs mit dem windows editor gespeichert.
in Allplan gibt er mir aber nichts aus.
woran könnte das liegen?

muss ich da in der registry noch den Pfad angeben? dachte der wäre schon voreingestellt.

mfg Christoph

Meister Jörg hat da einen kleinen Bug drin!
Richtig wäre diese Sub-Function:
(...man beachte das Exit For)

Private Function getOneLine(workOn, maxLength)

     a = Split(workOn, " ")
    tempSub = ""
    For Each x In a
        If (Len(tempSub & " " & x) < maxLength) Then
            tempSub = tempSub & " " & x
        Else
            Exit For
        End If
    Next
    getOneLine = Mid(tempSub, 2, maxLength)
End Function

Was war der Fehler?
Die obige Funktion baut die Zeile schrittweise auf, indem nacheinander alle (mit Leerzeichen getrennten) Teile des Ausgangstextes aneinander gehängt werden, und dabei geprüft wird, ob die maxLength schon erreicht ist. Bei Erreichen bzw. Überschreiten der maxLength wird nicht etwa abgebrochen, sondern fröhlich weiter probiert, bis einer der folgenden Teile noch "rein" passt.
So folgt nach "Max Mustermann GmbH und Co KG" noch "durch", weil "Mustermannstadt" und "vertreten" zu lang sind, und somit übersprungen werden. :-(
Bugfix: Bei Erreichen bzw. Überschreiten der maxLength muss die For-Schleife verlassen werden!

1 - 10 (27)