Schlangentext automatisch erstellen

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Schlangentext automatisch erstellen

und woher diese ganze Idee?

von skraszewski » Di, 01.11.2005 20:14

Ja, die Idee einen Schlangentext automatisch zu erstellen, ist eigentlich nur in Bezuug auf die Verwirklichung deren in der Writer-Umgebung von mir.

Solche Aufgaben zu automatisieren ist der Grundgedanke von ZARB. (http://www.zarb.de) Leider wird das Programm kommerziel vertrieben, erstens und zweitens, wird dazu natürlich M$ W*** verlangt. Viele Sachen dort sind einfach dumm und unnützlich, einige dagegen ziemlich interessant. Es wäre vielleich nicht verkehrt, solche Werkzeuge für OOO Writer zu entwickeln.

Wie ich vorher geschrieben habe, habe ich noch nie mit Basic in OOO zu tun gehabt, sehe aber nach einem Tag, den ich der Materie gewidmet habe, dass das alles wunderbar geht und machbar ist.

Kennst du vielleich ein Buch zo OOO Basic, das du mir empfehlen könntest (am Sonntag fliege ich für 2 Wochen nach Stuttgart und könnte es mir kaufen, wenn es mich nicht in den finanziellen Ruin treiben würde). Ehrlich gesagt sind die Beschreibungen in den Quellen ein bißchen kompliziert und für einen, der sich damit noch nie auseinandergesetzt hat, unüberschaubar. Besonders die Anordnung von verschiedenen Eigenschaften in den Diensten, die ganzen Reihen sun.com.style.Char..... bereiten am Anfang riesengroßes Kopfzerbrechen und alles scheint auf den ersten Blick irgendwie chaotisch und unlogisch geordnet zu sein. Vielleich klingt das für solchen Profi, wie du, ein wenig naiv, so ist es aber.

Z.B. habe ich bis jetzt nicht gefunden, wie man den Absatz zentrieren kann. Vielleicht suche ich ganz einfach auf eine falsche Art und Weise?
Es gibt zwar so was, wie .AdjParagraph oder Ähnliches, wie das zu verwenden ist, habe ich nicht herausgefunden. Deswegen diese Frage nach einem guten Buch.

Beste Grüße
s.kraszewski

Umlaute verschwinden

von skraszewski » Di, 01.11.2005 19:48

Hallo,

Dies hier:

Code: Alles auswählen

Do 
i = i + 1 
teil = Left(gesamt, i) 
if ASC(Right(teil,1)) < 97 OR ASC(Right(teil,1)) > 122 Then 
gesamt = Left(teil, LEN(teil)-1) & RIGHT(gesamt, LEN(gesamt)-i) 
End If 
Loop While LEN(gesamt) > i
ist eine sehr elegante Lösung. Das Problem ist aber, dass da abgesehen von Interpunktionszeichen und Leerstellen auch alle nationalen diakritischen Zeichen, wie etwa Umlaute im Deutschen, mitverschwinden.

Kann man da in diesem If die zu erfüllende Bedingung durch ein AND und Right(teil,1)<> ... ergänzen? Die Nummern stammen aus der üblichen ASCI-Zeichen-Tabelle, oder?

s.kraszewski

von Stephan » Mo, 31.10.2005 23:59

Naja, ich habe wenig Zeit ist ein bißchen sehr "Beta" ... markiere etwas Text und laß das Laufen:

Code: Alles auswählen

Sub Schlangentext 
Dim Dok as Object 
Dim Cursor as Object 
Dim x As Integer 
Dim zm As Integer 
Dim I As Long 
Dim Replace As Object 
Dim zeichen(6) As String 
Dim nichts(6) As String 

ViewCursor=ThisComponent.GetCurrentController. ViewCursor
Laenge = LEN(ViewCursor.String)

gesamt = ViewCursor.String
gesamt = LCASE(gesamt)
i = 0

Do
i = i + 1
teil = Left(gesamt, i)
if ASC(Right(teil,1)) < 97 OR ASC(Right(teil,1)) > 122 Then
gesamt = Left(teil, LEN(teil)-1) & RIGHT(gesamt, LEN(gesamt)-i)
End If
Loop While LEN(gesamt) > i

ViewCursor.String = gesamt
ViewCursor.CharFontName = "Arial" 
ViewCursor.CharHeight = 20
ViewCursor.CharKerning = 300
 
ViewCursor.goRight(LEN(gesamt),False)
ViewCursor.goLEFT(LEN(gesamt),False)
'exit sub
x = -100 

do 
ViewCursor.goRight(1,True) 
ViewCursor.CharEscapement = x 
ViewCursor.goRight(1,False) 
ViewCursor.goLeft(1,False) 

Select Case x
	Case -100 
		zm = 10 
	Case -90
		zm = 10 
	Case -80  
		zm = 40 
	Case -40  
		zm = 60 
	Case 20  
		zm = 30 
	Case 50  
		zm = 25 
	Case 75  
		zm = 25 
	Case 100  
		zm = -24 
	Case 76  
		zm = -24 
	Case 52  
		zm = -33 
	Case 19  
		zm = -60 
	Case -41  
		zm = -40 
	Case -81  
		zm = -10 
	Case -91  
		zm = -9 
End Select
x = x + zm 
j = j + 1 
Loop While j < LEN(gesamt)

End Sub
Macht noch nicht Alles aber ein bißchen mehr.


Gruß
Stephan

Mit Mühe, aber doch irgendetwas hergezaubert.

von skraszewski » Mo, 31.10.2005 17:54

Hallo.

den ganzen Tag als Laie rumgebastelt und habe nach vielem Herumstöbern folgendes gebastelt:

Code: Alles auswählen

rem variablen
Sub Schlangentext
Dim Dok as Object
Dim Cursor as Object
Dim x As Integer
Dim zm As Integer
Dim I As Long
Dim Replace As Object
Dim zeichen(6) As String
Dim nichts(6) As String

Dok = StarDesktop.CurrentComponent
Cursor = Dok.Text.createTextCursor()

Cursor.goToStartOfParagraph(False)
rem die Zahl der Zeichen in der Zeile auf 60 begrenzen
Cursor.goRight(60,False)
Dok.Text.insertControlCharacter(Cursor, _
com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, False)

rem Text formatieren
Cursor.goToEndOfParagraph(True)
Cursor.CharFontName = "Arial"
Cursor.goToStart(Fals)
Cursor.goToEnd(True)
Cursor.CharHeight = 20
Cursor.goToStart(Fals)
Cursor.goToEnd(True)

rem hier geht es aber nicht, wollte es horizontal zentrieren
Cursor.ParaAdjust="Center"
Cursor.goToStart(Fals)

rem unerwünschte Zeichen ersetzen

zeichen() = Array(".", ",", "?", "!", _
":", ";", " ")
nichts() = Array("", "", "", "", "", "", "")

Replace = Dok.createReplaceDescriptor

For I = 0 To 6
Replace.SearchString = zeichen(I)
Replace.ReplaceString = nichts(I)
Dok.replaceAll(Replace)
Next I

rem Zeichenhöhe verändern

x = -100

do
cursor.goRight(1,True)
cursor.CharEscapement = x
cursor.goRight(1,False)
cursor.goLeft(1,False)

if x = -100 then
zm = 10
end if
if x = -90 then
zm = 10
end if
if x = -80 then
zm = 40
end if
if x = -40 then
zm = 60
end if
if x = 20 then
zm = 30
end if
if x = 50 then
zm = 25
end if
if x = 75 then
zm = 25
end if
if x = 100 then
zm = -24
end if
if x = 76 then
zm = -24
end if
if x = 52 then
zm = -33
end if
if x = 19 then
zm = -60
end if
if x = -41 then
zm = -40
end if
if x = -81 then
zm = -10
end if
if x = -91 then
zm = -9
end if

x = x + zm

Loop

rem Hier will es aber nicht zu Ende gehen, sondern es arbeitet weiter

End Sub
Abgesehen von den Fehlern auf die ich im Code hinweise, möchte ich noch

- dass die Zeichen als gesperrt und weiter voneinander entfern stehen, als bei den Standardeinstellungen, weiß aber nicht, wo man dass einstellen kann :-(

- dass sich all die Automatisierungen nur auf den mit der Maus markierten Text beziehen, wurde zuvor kein Textabschnitt markiert, sollte ein Hinweis diesbezüglich erfolgen.

- diese Beschrenkung der Zeichenzahl pro Zeile sollte auf den gesammten markierten Text erfolgen, hier habe ich noch keine Ahnung


Wie auch immer, heute habe ich das Ding zum ersten mal gesehen und schon was gemacht. Ist bestimmt kein Meisterstück, aber es fängt schon an, wie gewünscht zu funktionieren.

Wenn du mal Zeit hättest kurz in den Code reinzuschauen, wäre ich für jeden Hinweis dankbar.

Und natürlich herzlichen Dank für die bisherige Hilfe
s.kraszewski

von Stephan » Mo, 31.10.2005 17:26

Wie sollte das gehen? Kommt hier diese Enumeration zum Einsatz, oder eher die Möglichkeiten, die der TextCursor bietet?


Naja, das ist doch aber simpel. Ich kann Dir nicht sagen was nun insgesamt der allerbeste Weg ist, in dem Sinne das es ja auch ginge die Zeichen erst hoch tief zu stellen und dann die Leerzeichen zu entfernen oder Beides parallel zu tun.
Ich hatte vorgeschlagen erst alle Leerzeichen und Satzzeichen zu entfernen und alle Buchstaben klein zu machen, dann steht das im Prinzip ein sehr langes Wort was nur aus Kleinbuchstaben besteht, naja und dann Cursor vor den ersten Buchstaben setzen und dann beginnen, also etwa:

*einen Buchstaben nach rechts und markieren

Code: Alles auswählen

Cursor.goRight(1, True)
somit umfasst Cursor.String jetzt nur den ersten Buchstaben

*nun hoch oder tief stellen

*dann Markierung entfernen

Code: Alles auswählen

Cursor.goleft(1, True)
*zweiten markieren

Code: Alles auswählen

Cursor.goRight(1, False)
Cursor.goRight(1, True)
damit umfasst Cursor.String nur den zweiten Buchstaben

*nun hoch oder tiefstellen

und so weiter...

Da eine Schleife draus machen und das wars.



Gruß
Stephan

zeichenweise iterieren??

von skraszewski » Mo, 31.10.2005 12:49

Hallo,

mit dem automatischen Einstellen von Höhe eines Zeichen bin ich fertig geworden. Ich stolpere aber immer nocht über diese Notwendigkeit von einem Zeichen zum anderen wanderen zu müssen. Wie sollte das gehen? Kommt hier diese Enumeration zum Einsatz, oder eher die Möglichkeiten, die der TextCursor bietet?

Danke im Voraus für die Geduld :-)
skraszewski

von Stephan » So, 30.10.2005 21:02

Im Speziellen:

http://api.openoffice.org/docs/Develope ... t/Text.htm

dort Kap. 7.3.2

und:

http://api.openoffice.org/docs/common/r ... rties.html

zum Glück schrieb ich relativierend:
Die sollte .CharEscapementHeight heißen
Wenn ich jetzt kurz schaue heißt die wohl nur .CharEscapement


Gruß
Stephan

Bitte um einen zusätzlichen Hinweis

von skraszewski » So, 30.10.2005 20:15

Hallo,

ich bin's wieder. Wo kann ich Näheres zu solchen Sachen wie dieses
".CharEscapementHeight" nachlesen?

Ich bastle nämlich an diesem verdammten Makro und weiß nicht so richtig, wie ich einem Zeichen dieses Attribut "höher als normal" zuweisen kann.

Danke für jeden Hinweis.
(ein Germanist und kein Programmierer) skraszewski

Schangentext

von skraszewski » So, 30.10.2005 08:50

Hallo,

vielen Dank für Deine Mühe, was ich wollte war kein kommpleter Code, sondern ehe Hinweise, wie das zu meistern wäre. Ich will dieses Programmieren einfach für mich selbst lernen, da es sehr brauchbar, nützlich und interessant ist, wie es aber scheint, ist für mich mich eigentlich nicht der Aufbau vom eigentlichen Code schwierig, da ich in dem was Du geschrieben hast, das Meiste gut verstehe, sondern, mir fehlt noch das Gespür für die ganze Philosophie der Sprache. Ich habe schon Dutzende von Seiten gelesen, die Beschreibungen sind aber irgendwie so, dass ich bis jetzt z.B. keine Ahnung habe, was abgesehen von sub und Variablen, noch alles so am Anfang stehen muss. Das weitere Problem ist die Sprache: solche Wörte wie Objekt, Methode, Dienst sind für den Anfänger schwierig zu verstehen in dem Kontext. Um so mehr, dass Deutsch nicht meine Muttersprache ist.

Mit Deinen Hinweisen werde ich das Problem nochmals angehen. Sollte das mit Erfolg enden, gebe ich Dir sicherlich Bescheid und schickce den ausgearbeiteten Code zu.

Grüße
skarzsweski

von Stephan » Sa, 29.10.2005 22:31

Doch, doch das geht schon, ich fürchte nur Du willst den kompletten Code und ich habe keine Zeit, ich kommentiere mal etwas:

0.
Zuerst müßte man wissen wo der Text ist, ist es der einzige Text im Dokument, oder der gerade markierte oder so ähnlich.
Davon abgeleitet den Text in eine Variable lesen.
1. Leerstellen und Interpunktionszeichen zwischen den einzelnen Wörtern im Satz entfernen,
Leerstellen ginge leicht, da Du aber Interpunktionszeichen auch brauchst mußtDu das über eine Schleifen machen, im Prinzip:

Code: Alles auswählen

text = "Dein Text"
x=0
Do
	x = x+1
	teil = Left(text, x)
	If Right(teil,1) = " " OR "." Then 'oder Sonstiges 
	teil = LEFT(teil, LEN(teil)-1)
	text = teil & RIGHT(text, LEN(text)-x)
Loop While LEN(text) < x
2. alle Buchstaben klein schreiben,

Code: Alles auswählen

text = LCASE(text)
Diesen Text in das Dokument zurückschreiben, abhängig von der Situation gemäß 0, naja es ist wohl immer der Inhalt des Textcursors .String
3. jedes Zeichen um 5 % höher stellen, als sein Vorgänger, nachdem die obere Grenze erreicht worden ist, zeichenweise nach unten gehen, so, dass ein Schlangenlinie entsteht.


Den Cursor an den Anfang des Textes bringen und zeichenweise interieren und immer die Eigenschaft für die Höhenversetzung um 5% erhöhen bis Maximum und wieder verringen. Die sollte .CharEscapementHeight heißen, aber nagele mich jetzt nicht fest.

So in etwa sollte das gehen.
Bestes Material wäre zunächst wohl: http://docs.sun.com/db/doc/817-3924?l=de
in diesem PDF Kapitel 6


Gruß
Stephan

????

von skraszewski » Sa, 29.10.2005 20:28

Ist so was zu kompliziert und zeitraubend oder überhaupt nicht machbar?

Schlangentext automatisch erstellen

von skraszewski » Fr, 28.10.2005 20:51

Hallo allerseits,

ich habe so eine Idee zum Einsatz von Writer im Fremdsprachenunterricht, weiß aber nich so richtig, wie mann dies mit Hilfe von einem Makro automatisieren könnte. Im Endeffekt sollte aus einem Satz oder kurzen Text eine Schlangenlinie entstehen. Folgende Vorgänge könnte man automatisieren:

1. Leerstellen und Interpunktionszeichen zwischen den einzelnen Wörtern im Satz entfernen,
2. alle Buchstaben klein schreiben,
3. jedes Zeichen um 5 % höher stellen, als sein Vorgänger, nachdem die obere Grenze erreicht worden ist, zeichenweise nach unten gehen, so, dass ein Schlangenlinie entsteht.

Ich würde gerne so was schreiben, hab in diversen Handbüchern zum StarBasis-Programieren einiges gelesen, es ist für den Anfänger aber eher schwierig.

Wie sollte man vorgehen?

Beste Grüße
s.kraszewski

Nach oben