Makro-Nachhilfe für Funktionen für alle Objekte
#1
Hallo nochmals,

ich werde sicher in den nächsten Jahren noch viel über Makros lernen.
Habe mir auch schon ganz einfache selbst aufgenommen.

Was ich nur gerne wissen würde: Kann ich Funktionen aus CorelDraw auch einfach auf alle Objekte in einem geöffneten Dokument zuordnen?

Ich bräuchte also eine Zeile, wo man alle Objekte auswählt (Strg+A) und diese ausgewählten Objekte dann bearbeitet im Makro, z.B.
- Umriss zuweisen (width= irgendwas und width=0)
- Umrissfarbe zuweisen (z.B. RGB Schwarz 0-0-0)
- mit Form-Tool alle Knoten auswählen ("Alle Knoten auswählen") 
- "Knoten reduzieren"
- "Kurvenglättung" z.B. einen Wert, 10 oder 20
- alle Objekte kopieren und dann auch Objekte einfügen

Bisher ist es so, dass ich ein Makro aufnehme, aber dieses sich dann auf die bestimmten Objekte bezieht, wo ich eben aufgenommen habe. Wenn ich dann ein anderes Dokument mit dem Makro bearbeiten will, geht das natürlich nicht. Ich würde mir gerne entweder aus mehreren Schritten ein Makro bauen oder einzelne Schritte als Schalftläche.

Vielleicht kann man aber Umriss/Füllung und Knoten reduzieren usw. auch nicht global auf alle Objekte anwenden?

Betriebssystem / Grafik-Software: Windows 10, CorelDraw Suite 2023
Zitieren
#2
Hallo Asterix,

(30.06.2024, 15:19)asterix schrieb: Was ich nur gerne wissen würde: Kann ich Funktionen aus CorelDraw auch einfach auf alle Objekte in einem geöffneten Dokument zuordnen?

was meinst Du mit „Funktionen“?
was meinst Du mit „zuordnen“?

(30.06.2024, 15:19)asterix schrieb: ...Ich bräuchte also eine Zeile, wo man alle Objekte auswählt (Strg+A)...

ActivePage.SelectableShapes.All.CreateSelection

Gruß

Koter
Zitieren
#3
Hallo, das Problem für mich als ambitionierten Makro-Laien ist, dass ich aufgenommene Makros sozusagen nicht "verallgemeinern" kann. Ich nehme also ein Makro auf, aber es gilt dann nur genau für die Objekte in dem Dokument.

Ich will aber: Alle Objekte eines Dokuments auswählen (alle, nicht bestimmte) und eine Funktion wie "Knoten reduzieren" anwenden.

Also: Ich öffne ein neues Dokument und erstelle bestimmte Objekte (erstmalig). Dann klicke ich auf ein Makro und das Makro wählt alle Objekte aus und reduziert die Knoten. Oder das Makro glättet die Kurve um bestimmten Wert. Ich brauche aber nicht alles in einem Gesamtmakro, sondern müsste wissen, ob man nach

ActivePage.SelectableShapes.All.CreateSelection

dann die erwähnten Funktionen für alle diese ausgewählte Objekte durchführen kann. Vielleicht geht das aber auch nicht, weil Knoten reduzieren, Kurven glätten und Farbe oder Umrissdicke zuordnen immer nur bestimmten Objekten zugeordnet werden kann.

Ein von mir erratener Code wäre dann z.B.

Code:
ActivePage.SelectableShapes.All.CreateSelection
AllShapes.Smoothing:20

oder
ActivePage.SelectableShapes.All.CreateSelection
AllNodes.in.allShapes.reduce-nodes

oder
ActivePage.SelectableShapes.All.CreateSelection
AllOutlines.color.RGB:0-0-0
AllFills.color.RGB:0-0-0
AllOutlines:width:0


(ich kann gerne diese blöden Beispiele später wieder löschen...)

Außer den erwähnten Funktionen habe ich keinen weiteren Bedarf hier erstmal.

Betriebssystem / Grafik-Software: Windows 10, CorelDraw Suite 2023
Zitieren
#4
Hallo Asterix,

(30.06.2024, 19:04)asterix schrieb: Vielleicht geht das aber auch nicht, weil Knoten reduzieren, Kurven glätten und Farbe oder Umrissdicke zuordnen immer nur bestimmten Objekten zugeordnet werden kann.

Richtig, das geht so nicht.

Die Methode „Knoten reduzieren“ (AutoReduce) ist eine Methode (keine Funktion) des Objekts „NodeRange“.
Du musst sie in einer Schleife bei jedem der Objekte in der Auswahl ausführen:
(Nicht zuweisen, man kann Eigenschaften oder Variablen einen Wert Zuweisen, Methoden werden ausgeführt.)

Code:
Sub KnotenRed()
   ActivePage.SelectableShapes.All.CreateSelection
   For Each s In ActiveSelection.Shapes
       s.Curve.Nodes.All.AutoReduce 0.5
   Next
End Sub

Sollten sich in der Auswahl Objekte befinden, die keine Kurve (das übergeordnete Objekt von NodeRange) haben, kommt es zu einer Fehlermeldung. Rechtecke oder Text wären z.B. solche Objekte.

Gruß

Koter
Zitieren
#5
Hallo und danke - hat geklappt, wenn es auch bei größeren Dateien ggf. etwas Rechenleistung braucht bzw. hängenbleiben könnte.

Dann kann ich deinem "Rahmen" auch Folgendes hinzufügen z.B.

ActiveSelection.Outline.SetProperties Color:=CreateRGBColor(0, 0, 0)
ActiveSelection.Outline.SetProperties Width:=0.1

Scheint auch zu klappen Smile
Wie wäre dann eine Zeile für die Kurvenglättung?

Betriebssystem / Grafik-Software: Windows 10, CorelDraw Suite 2023
Zitieren
#6
Hallo Asterix,

(30.06.2024, 20:11)asterix schrieb: Wie wäre dann eine Zeile für die Kurvenglättung?

Wenn Du es unbedingt in einer Zeile haben willst (Warum auch immer):
For Each s In ActiveSelection.Shapes: s.Curve.Nodes.All.Smoothen 20: Next

Gruß

Koter
Zitieren
#7
Und auch das hat geklappt - wenn es in mehreren Zeilen besser wäre, gerne, aber in einer ging es auch.
Das ist alles, was mir momentan einfällt, und damit kann ich nun sehr gut entweder alle oder nur einzeln ausgewählte Objekte per Makro ändern.

Bezüglich der Knoten reduzieren aber noch die Detailfrage: wenn ich den "Knoten reduzieren"-Button von CorelDraw nutze, dann werde sehr viele Knoten reduziert, aber die Form ändert sich gar nicht (der Kurve), was ich eigentlich auch ganz gut gemacht finde. In dem Makro habe ich nun - eigentlich sinnvoll - einen Wert, den ich einstellen kann. Aber egal, was ich einstelle, entweder es ist zu viel Reduktion (Änderung der Kurve) oder zu wenig (zu viele Knoten bleiben).

Kann es sein, dass die CorelDraw-Reduktion zusätzlich zur Knotenreduktion noch im Hintergrund etwas glättet?
Ich finde sie sehr gut gemacht, eigentlich sogar oft besser als Kurvenglättung.

Daher also die Frage, ob man im Makro einen ganz bestimmten Wert einstellen müsste oder noch etwas Smoothing nachhelfen?

Betriebssystem / Grafik-Software: Windows 10, CorelDraw Suite 2023
Zitieren
#8
Hallo Asterix,

Stelle die PrecisionMargin auf ein Zoll ein, um die selbe Reduktion zu erhalten.

Gruß

Koter
Zitieren
#9
Danke - ich denke, ich muss noch vorher die Knoten zu glatten Knoten (ggf. auch symmetrischen) machen. Wenn ich zuerst die (vielen) spitzen Knoten zu glatten mache und danach das Makro ausführe für Autoreduce, dann sieht es ähnlich aus wie beim CorelDraw-Knoten-Reduzieren, das scheint dort mit dabei zu sein, wenn auch nicht alle Knoten zu glatten gemacht werden. Aber nur "Autoreduce" ist da wohl nicht hinter der Schaltfläche.

Das Ändern des Knotentypen habe ich auch mit Aufnehmen eines Makros versucht, natürlich ohne Erfolg. Abschließend für die Nachhilfestunden würde ich mich daher freuen noch zwei Sachen zu lernen:
- Code, um die ausgewählten Knoten in glatt oder symmetrisch zu ändern
- bei Gelegenheit vielleicht die Korrektur folgenden Codes, der mir aus eine Illustrator-Datei eigentlich sehr schön etwas herauskopiert, aber leider im CDR dann zwei Mal einfügt - ich brauche es nur einmal.
 
Mehr fällt mir dann erstmal nicht ein bzw. ich habe dann ziemlich viel zu bearbeiten in den Dateien.


Code:
Sub opencopy()
    ' Recorded 30.06.2024
    Dim lr1 As Layer
    Set lr1 = ActiveDocument.Pages(1).CreateLayer("Ebene 1")
    ' Recording of this command is not supported
    Dim impopt As StructImportOptions
    Set impopt = CreateStructImportOptions
    impopt.MaintainLayers = True
    Dim impflt As ImportFilter
    Set impflt = lr1.ImportEx("C:\objekt.ai", 1283, impopt)
    impflt.Finish
    Dim s1 As Shape
    Set s1 = ActiveShape
    Dim grp1 As ShapeRange
    Set grp1 = ActiveSelection.UngroupEx
    Dim openopt As StructOpenOptions
    Set openopt = CreateStructOpenOptions
    With openopt.ColorConversionOptions
        .SourceColorProfileList = "sRGB IEC61966-2.1,ISO Coated v2 300% (ECI),Dot Gain 15%"
        .TargetColorProfileList = "sRGB IEC61966-2.1,ISO Coated v2 300% (ECI),Dot Gain 15%"
    End With
    Dim doc1 As Document
    Set doc1 = OpenDocumentEx("C:\objekt.ai", openopt)
    grp1.Copy
    doc1.Close
    Dim pasteopt As StructPasteOptions
    Set pasteopt = CreateStructPasteOptions
    With pasteopt.ColorConversionOptions
        .SourceColorProfileList = "sRGB IEC61966-2.1,ISO Coated v2 300% (ECI),Dot Gain 15%"
        .TargetColorProfileList = "sRGB IEC61966-2.1,ISO Coated v2 300% (ECI),Dot Gain 15%"
    End With
    Dim Paste1 As ShapeRange
    Set Paste1 = ActiveDocument.Pages(1).Layers("Ebene 1").PasteEx(pasteopt)
End Sub

Betriebssystem / Grafik-Software: Windows 10, CorelDraw Suite 2023
Zitieren
#10
Hallo Asterix,

wie sieht denn Dein Code jetzt aus, nachdem Du meinen Vorschlag aus Beitrag 8 umgesetzt hast?

Gruß

Koter
Zitieren



Möglicherweise verwandte Themen...
Thema Verfasser Antworten Ansichten Letzter Beitrag
  alle Objekte eines bestimmten Farbmodells auswählen asterix 16 1.400 08.08.2024, 22:25
Letzter Beitrag: asterix
  Makro selbst aufnehmen Karthagos 17 1.106 04.07.2024, 06:54
Letzter Beitrag: Karthagos
  VBA Objekte ausrichten fremoikaner 12 1.123 06.06.2024, 14:30
Letzter Beitrag: koter
  History (zuletzt geöffnete Objekte) Wild Thinng 1 310 23.05.2024, 17:25
Letzter Beitrag: miss_marple
  Mini-Objekte innerhalb einer Gruppe fassen und löschen migo 10 955 27.03.2024, 09:35
Letzter Beitrag: Boerni
  Objekte positionieren Sandfloh 2 526 23.03.2024, 18:12
Letzter Beitrag: Sandfloh
  Objekte und Punkte verbinden Herbert_M 2 477 05.02.2024, 20:17
Letzter Beitrag: norre
  Makro - Text an Rechteck ausrichten benni313 5 793 31.01.2024, 09:20
Letzter Beitrag: benni313
  2023 Objekte aus Dateimanager auf Arbeitsfläche ziehen ? miniprints 0 450 23.01.2024, 15:17
Letzter Beitrag: miniprints
  Textzeilen in einzelne Text-Objekte aufteilen Karthagos 8 1.258 01.05.2023, 10:34
Letzter Beitrag: Karthagos