Elemente ausserhalb Kurve per VBA löschen
#9
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.

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
[-] 1 Benutzer bedankt sich bei koter für diesen Beitrag:
  • Sfassbender
Zitieren



Nachrichten in diesem Thema
RE: Elemente ausserhalb Kurve per VBA löschen - von koter - 02.10.2020, 10:34

Möglicherweise verwandte Themen...
Thema Verfasser Antworten Ansichten Letzter Beitrag
  Mini-Objekte innerhalb einer Gruppe fassen und löschen migo 10 1.124 27.03.2024, 09:35
Letzter Beitrag: Boerni
  Elemente außerhalb Zeichenfläche weg hansknall 2 375 04.07.2023, 19:31
Letzter Beitrag: hansknall
  Fonts löschen Reserl 11 2.991 05.12.2020, 16:14
Letzter Beitrag: Reserl
  Vektorgrafik nach virtuellen Segmente löschen nicht brauchbar zum plotten Mecky 3 1.608 25.08.2020, 11:05
Letzter Beitrag: Mecky
  Erstellte Zweifarbenmuster löschen LuGa 7 2.394 22.05.2020, 00:28
Letzter Beitrag: Unkraut
  2018: mehrere Seiten löschen mtemp 3 1.850 09.10.2019, 15:09
Letzter Beitrag: mtemp
  Objektstile löschen wdreinheim 9 3.443 13.03.2019, 22:06
Letzter Beitrag: koter
  Doppelte Konturen erkenn und löschen view2lord 25 9.989 15.01.2019, 12:32
Letzter Beitrag: Unkraut
  Aus mehreren gestückelten Linien eine Kurve erstellen bengchui 1 1.849 08.10.2018, 11:54
Letzter Beitrag: norre
  Kurve aus Koordinaten erstellen nowa 9 3.003 25.12.2016, 12:11
Letzter Beitrag: nowa