Buchstabenbreite auslesen [VBA]
#1
Hallo Experten!

Ich bin 31, Anwendungsentwickler in der metallverarbeitetenden Industrie und entwickle unter anderem VBA-Tools für CorelDraw X5 die bei der Layouterstellung unserer Produkte helfen. Oft habe ich durch eigene Recherchen die Hürden des widerlichen VBA's überwunden, diesmal jedoch habe ich keine Chance und hoffe, jemand kann mir eine Idee bescheren...

In unserem Betrieb wird ein Lasermarkierer eingesetzt, der die Oberfläche von Edelstahlflächen an-graviert. Dieses ältere Gerät kann jedoch Linien unter 0.16 mm nicht verarbeiten. Aus diesem Grund muss ich die Funktionalität meiner Tools erweitern - eine Überprüfung soll stattfinden, bevor die Verarbeitung beginnen kann. Für Elemente wie Kurven und Linien ist das kein Problem - muss ich doch lediglich die Eigenschaft "Shape.Outline" auslesen. Mein Problem bezieht sich jedoch auf Text bzw. Buchstaben. Ist der Text zu klein, können einzelne Buchstabenelemente ja durchaus zu klein für das Gerät sein. Gibt es eine Möglichkeit, die entsprechende Buchstabenbreite eines einzelnen Buchstaben auszulesen? Oder die Breite der Buchstabenlinien?

Freundliche Grüße aus Hamburg
Zitieren
#2
Hallo JP,

willkommen im Forum!

Du kannst mit CQL einen ShapeRange erstellen, der alle Objekte mit einer Linienbreite unter 0.16 mm enthält (inkl. Text):

Code:
Sub unter16()
    Dim s As Shape
    Dim zuDünn As ShapeRange
    Set zuDünn = ActivePage.Shapes.FindShapes(Query:="@outline.width < {.16 mm}")
    
    For Each s In zuDünn
        s.Outline.Color.RGBAssign 255, 0, 0
    Next
End Sub

Die For Each-Schleife in diesem widerlichen VBA-Code färbt alle zu dünnen Linien rot. Objekte ohne Umriss kann man so natürlich nicht sehen.
Wie Dir die Breite eines Buchstaben bei dem Problem helfen könnte, habe ich nicht verstanden.

Viele Grüße nach Hamburg

Koter
Zitieren
#3
Hallo koter,

die Outlines lese ich bereits aus - für Elemente mit Linienstärke habe ich kein Problem. Nun kann es ja aber sein, dass ein Buchstaben insgesamt dünner als 0.16 mm ist - also nicht nur ein eventueller Rand, sondern der ganze Buchstabe, oder der mittlere Strich eines "T"s. Denn der Laser kann natürlich nicht nur Linien unter dieser Stärke lasern, sondern auch alle anderen Elemente, die zu klein sind. Über einen Shape "MyText.SizeWidth" kann ich natürlich nicht gehen, da dies ja die Breite des gesamten Textes ausliest. Deshalb wollte ich auf einzelne Buchstaben zugreifen - aber wie macht man das? Hast Du eine Idee hierzu?
Zitieren
#4
Hallo JP,

Zitat:...Deshalb wollte ich auf einzelne Buchstaben zugreifen - aber wie macht man das? Hast Du eine Idee hierzu?

um auf die einzelnen Buchstaben zuzugreifen, könnte man sie auf eine temporäre Ebene kopieren und sie in Kurven konvertieren. Aber wenn du nicht die Konturen sondern die Fläche zwischen ihnen auswerten willst, wird es schwierig:

[Bild: clipboard01hrkex.jpg]

Ich kann mir nicht vorstellen, dass mein Grips ausreicht, um einen Algorithmus zu ersinnen, der zuverlässig die engsten stellen in jedem Buchstaben oder einer sonstigen Form findet und vermisst. Ich werde mir noch mal Gedanken darüber machen, komme aber wahrscheinlich erst am Wochenende dazu.

Gruß

Koter
Zitieren
#5
Sagen wir mal, dass mit den engsten Stellen eines Buchstabens sei etwas übertrieben - mir würde es bereits reichen, die gesamte Breite des Buchstabens herauszufinden. Aber die Syntax um die Eigenschaft Text ist so verwirrend:

Gegeben ist ein Textobjekt "MyShape". Es enthält den Text "ABC". Ich möchte die Breite des Buchstaben "B" ermitteln.

MyShape.Text.Story.Range(2, 2).SizeWidth -> gibt es nicht Sad
Zitieren
#6
Hallo JP,
Zitat:Gegeben ist ein Textobjekt "MyShape". Es enthält den Text "ABC". Ich möchte die Breite des Buchstaben "B" ermitteln.

wie ich oben schon erwähnt habe, mit einer temporären Ebene oder einfach mit einem temporären, in Kurven konvertierten Objekt:

Code:
Sub BBreite()
    Dim TXT As Shape, TempS As Shape
    Dim Breite As Double
    Set TXT = ActiveLayer.Shapes("MyShape")
    Set TempS = TXT.Duplicate
    TempS.Text.Story = TXT.Text.Story.Characters(2)
    TempS.ConvertToCurves
    Breite = TempS.SizeWidth
    Debug.Print Breite
    TempS.Delete
End Sub

Nur aus Neugier: Wie kannst Du aus der Breite des ganzen Zeichens die schmalsten Elemente desselben ermitteln?

Gruß

Koter
Zitieren
#7
Also hat Corel tatsächlich keine eigene Zugriffsvariante für Buchstabenbreiten, es muss getrickst werden Sad

Ich werde Deine Idee mal ausprobieren, insbesondere performance-technisch bei vielen Buchstaben. Vielen Dank dafür!

Natürlich ist die Buchstabenbreite nur ein lockerer Ansatz, aber es ist besser als der jetzige Zustand, nämlich nichts - ich könnte ein paar Alphabete mit verschiedenen Schriften lasern, um herauszufinden, wo es Probleme gibt und diese Werte dann verwenden, um die Überprüfung durchzuführen.

EDIT: Da kommt mir eine Idee. Ich könnte doch für jedes Textfeld eine Kopie erzeugen, den Text dieses Feldes durch ein kleines L ersetzen, in Kurven konvertieren und die Breite auslesen. Dann erhalte ich eine ungefähre Ahnung davon, wie dick die Linien der Schrift sind - oder?
Zitieren
#8
Hallo JP,

Zitat:...den Text dieses Feldes durch ein kleines L ersetzen, in Kurven konvertieren und die Breite auslesen. Dann erhalte ich eine ungefähre Ahnung davon, wie dick die Linien der Schrift sind - oder?

Das mag ja bei einer Grotesk mit geringer Strichstärkenvariation noch klappen, bei einer Antiqua oder einer dicktengleichen Schrift wird es aber in den meisten Fällen scheitern. Denk nur einmal an die untere Serife beim kleinen L, die gehört ja auch zur Breite.

Gruß

Koter
Zitieren
#9
Stimmt, die Serifen habe ich völlig vergessen, obwohl unsere Kunden eigentlich fast schmucklose Schriften verwenden, da wir Typenschilder produzieren.

Aber: Das Problem hat sich erledigt - warum? Ich habe gestern noch ein paar Tests mit dem Lasergerät gemacht und festgestellt, dass der Schriften mit einer Linienstärke unter 1.6 mm sehr wohl lasert - wenn diese als Kurven konvertiert sind. Es scheint, als habe das Gerät nur Probleme mit Linien-Objekten. Nach meiner Verwunderung erstellte ich eine Datei, in der ich ein kleines "L" und daneben eine Linie mit exakt der selben Stärke anlegte. Das L wird gelastert, die Linie nicht. Und für Linien habe ich die Überprüfung ja bereits programmiert. Von daher bin ich glücklich Smile

Trotzdem vielen Dank für Deine Mühe!
Zitieren



Möglicherweise verwandte Themen...
Thema Verfasser Antworten Ansichten Letzter Beitrag
  Corel VBA Text aus Grafiktext auslesen Gexi 4 1.992 07.11.2014, 16:24
Letzter Beitrag: Gexi
  Dateiname der importierten Grafik auslesen Hamu72 5 2.780 07.11.2014, 09:29
Letzter Beitrag: Gexi
  Farbnamen der Objekte Auslesen X5 Sunny_co 4 1.168 04.11.2014, 14:35
Letzter Beitrag: norre