02.10.2020, 10:34
(Dieser Beitrag wurde zuletzt bearbeitet: 02.10.2020, 10:52 von koter.
Bearbeitungsgrund: Nachtrag
)
Hallo Stefan,
vielen Dank für die ausführliche Antwort und den Dateianhang!
beim Testen hatte ich die Kontur immer auf einer eigenen Ebene, deshalb wurde sie bei mir nicht gelöscht.
Ich habe das Makro so angepasst, dass die Kontur nicht mehr ausgewählt wird (wenn sie ganz oben liegt).
Die Genauigkeit von „IsOnShape“ hängt seltsamerweise vom Zoom ab. je höher der Zoom desto genauer arbeitet die Methode. Ich habe das Makro so angepasst, dass der Zoom hochgesetzt, die Methode ausgeführt und der Zoom dann zurückgesetzt wird. Wenn die Optimierung eingeschaltet ist, bekommt der User nichts davon mit.
Leider hat Corel die Methode in der Hilfe nicht ausreichend Dokumentiert. Da sie aber im Hilfe-Beispiel zusammen mit „GetUserClick“ verwendet wird, könnte das die Erklärung sein. Je höher der User den Zoom einstellt, desto genauer muss die Methode arbeiten.
Mann kann Natürlich auch andere Methoden verwenden, wenn man den Zoom nicht antasten will.
Beispiel:
Das Makro verwendet die Methode „Trim“.
Man braucht weniger Codezeilen, es dauert aber länger und es können nur geschlossene Konturen verwendet werden.
Die Ellipsen werden in Kurven gewandelt. Wenn es Ellipsen bleiben müssen, kannst Du die Methode also nicht verwenden.
Ich weiß nicht, wo Du das Makro einbauen willst, und wozu es genau dient. Aber vielleicht findet sich ja eine Maßgeschneiderte Lösung für Deinen Zweck.
Dass bei diesem Makro der Koordinatenursprung eine Rolle spielt, halte ich für unwahrscheinlich weil keine absoluten Koordinaten verwendet werden.
Wenn Du annimmst, dass ein Benutzer den Ursprung umstellt, kannst Du Deine Koordinaten ja auf einen Referenzpunkt (z.B den Seitenrand) beziehen, oder den Ursprung mit „DrawingOriginX“ und „DrawingOriginY“ zurücksetzen.
Nachtrag:
Den Ursprung sollte man nach der Bearbeitung wieder auf die Werte des Benutzers zurückstellen. Der Benutzer wird (wahrscheinlich) einen Grund für sein Handeln gehabt haben.
Außerdem wäre es unhöflich Benutzereinstellungen ungefragt zu ändern.
Gruß
Koter
vielen Dank für die ausführliche Antwort und den Dateianhang!
beim Testen hatte ich die Kontur immer auf einer eigenen Ebene, deshalb wurde sie bei mir nicht gelöscht.
Ich habe das Makro so angepasst, dass die Kontur nicht mehr ausgewählt wird (wenn sie ganz oben liegt).
Die Genauigkeit von „IsOnShape“ hängt seltsamerweise vom Zoom ab. je höher der Zoom desto genauer arbeitet die Methode. Ich habe das Makro so angepasst, dass der Zoom hochgesetzt, die Methode ausgeführt und der Zoom dann zurückgesetzt wird. Wenn die Optimierung eingeschaltet ist, bekommt der User nichts davon mit.
Code:
Sub Ellipsenkiller()
Dim S As Shape, spattern As Shape
Dim srhole As New ShapeRange
Dim x As Integer
Dim z As Double, oX As Double, oY As Double, oW As Double, oH As Double
On Error GoTo Ende
Set spattern = ActivePage.Shapes(1)
ActiveDocument.BeginCommandGroup "Ellipsenkiller"
Application.Optimization = True
Call ActiveWindow.ActiveView.GetViewArea(oX, oY, oW, oH)
ActiveWindow.ActiveView.Zoom = 1600
For Each S In ActiveLayer.Shapes.AllExcluding(1)
x = spattern.IsOnShape(S.CenterX, S.CenterY)
If x > 0 Then
If S.DisplayCurve.IntersectsWith(spattern.DisplayCurve) Then
srhole.Add S
End If
Else
srhole.Add S
End If
Next
srhole.Shapes.All.Delete
Ende:
Call ActiveWindow.ActiveView.SetViewArea(oX, oY, oW, oH)
Application.Optimization = False
Application.Windows.Refresh
ActiveDocument.EndCommandGroup
End Sub
Leider hat Corel die Methode in der Hilfe nicht ausreichend Dokumentiert. Da sie aber im Hilfe-Beispiel zusammen mit „GetUserClick“ verwendet wird, könnte das die Erklärung sein. Je höher der User den Zoom einstellt, desto genauer muss die Methode arbeiten.
Mann kann Natürlich auch andere Methoden verwenden, wenn man den Zoom nicht antasten will.
Beispiel:
Code:
Sub Ellipsenkiller2()
Dim s1 As Shape
On Error GoTo Ende
ActiveDocument.BeginCommandGroup "Ellipsenkiller2"
Application.Optimization = True
Set s1 = ActiveLayer.Shapes.AllExcluding(1).Combine.Trim(ActiveLayer.Shapes(1), False, True)
s1.Curve.SubPaths(1).Delete
s1.BreakApart
Ende:
Application.Optimization = False
Application.Windows.Refresh
ActiveDocument.EndCommandGroup
End Sub
Das Makro verwendet die Methode „Trim“.
Man braucht weniger Codezeilen, es dauert aber länger und es können nur geschlossene Konturen verwendet werden.
Die Ellipsen werden in Kurven gewandelt. Wenn es Ellipsen bleiben müssen, kannst Du die Methode also nicht verwenden.
Ich weiß nicht, wo Du das Makro einbauen willst, und wozu es genau dient. Aber vielleicht findet sich ja eine Maßgeschneiderte Lösung für Deinen Zweck.
(30.09.2020, 06:31)Sfassbender schrieb: ...Ich hatte gestern in einer andern Angelegenheit das Problem, das ein Makro, dass eine Range über die x- bzw. y-Koordinaten erstellt seltsame Ergebnisse lieferte. Hier hatte allerdings jemand den Ursprung des Lineals verstellt...
Jetzt frage ich mich, ob das in diesem Fall eine ähnliche Ursache haben könnte. Von wegen Ursprung der xy Koordinaten, Layer, ...
Hättest du dazu noch eine Idee?
Dass bei diesem Makro der Koordinatenursprung eine Rolle spielt, halte ich für unwahrscheinlich weil keine absoluten Koordinaten verwendet werden.
Wenn Du annimmst, dass ein Benutzer den Ursprung umstellt, kannst Du Deine Koordinaten ja auf einen Referenzpunkt (z.B den Seitenrand) beziehen, oder den Ursprung mit „DrawingOriginX“ und „DrawingOriginY“ zurücksetzen.
Nachtrag:
Den Ursprung sollte man nach der Bearbeitung wieder auf die Werte des Benutzers zurückstellen. Der Benutzer wird (wahrscheinlich) einen Grund für sein Handeln gehabt haben.
Außerdem wäre es unhöflich Benutzereinstellungen ungefragt zu ändern.
Gruß
Koter