3 messages in org.openoffice.fr.progRe: [prog] Soustraction de secteurs c...
FromSent OnAttachments
Agnès SimonetJan 12, 2005 11:31 am 
Bernard MarcellyJan 14, 2005 7:11 am 
Agnès SimonetJan 14, 2005 10:05 am 
Actions with this message:
Paste this link in email or IM:
Paste this link in email or IM:
Atom feed for this thread
Paste this URL into your reader:
Subject:Re: [prog] Soustraction de secteurs circulairesActions...
From:Bernard Marcelly (marc@club-internet.fr)
Date:Jan 14, 2005 7:11:31 am
List:org.openoffice.fr.prog

Le 2005-01-12 20:32, Agnès Simonet a écrit :

Bonjour,

J'ai un problème que je n'arrive pas à résoudre. Par macro (voir ci-dessous), je trace un premier secteur de cercle puis un second plus petit et avec un angle au centre plus ouvert. Ensuite je les soustrait. Tout va bien sauf si les positions des 2 secteurs sont telles qu'ils aient le même centre. Dans ce cas j'obtiens une forme combinée et le résultat est très différent de celui escompté.

Je crois d'ailleurs que la macro n'y est pour rien puisque je peux reproduire le problème en dessinant à la main.

Bonjour Agnès, Félicitations pour la macro, elle est très correcte. Tu as apparemment trouvé une bogue, assez tordue. Tu peux évidemment créer un rapport IssueZilla, mais tu risques d'attendre pour la correction... Comme tu l'as vu, un décalage de 1/100 de mm du centrage suffit à la contourner. Si c'est pour toi une approximation inacceptable, j'ai trouvé une autre solution : - créer un anneau complet avec deux disques concentriques et une soustraction, - ajouter une section de même centre et la soustraire à l'anneau.

À noter : la section doit être suffisament plus grande, sinon on observe des traits parasites, peut-être dûs aux calculs qui doivent être finalement convertis en valeurs entières.

Ci-dessous la traduction en macro, j'ai utilisé un sous-programme pour créer les cercles plus facilement. Bonne journée Bernard

Option Explicit

Sub AnneauPartiel Dim Doc As Object , Control As Object Dim Frame As Object, LaPage As Object Dim GrandCercle As Object,PetitCercle As Object Dim Anneau As Object, Camembert As Object Dim Collection As Object Dim Dispatcher As Object Dim arg() As new com.sun.star.beans.PropertyValue '------------- 'quelques objets de référence '------------- Doc = ThisComponent ' document model Control = Doc.getCurrentController() Frame = Control.getFrame() LaPage = Control.CurrentPage '------ 'dessin '------ const ptX = 7000, ptY = 7000 GrandCercle = creerDisque(Doc, ptX, ptY, 4000) LaPage.add(GrandCercle) PetitCercle = creerDisque(Doc, ptX, ptY, 2000) LaPage.add(PetitCercle) 'place les formes dans une collection Collection = createUnoService("com.sun.star.drawing.ShapeCollection") Collection.add(GrandCercle) Collection.add(PetitCercle) Control.Select(Collection) 'sélectionne la collection 'soustrait les 2 formes pour obtenir un anneau Dispatcher = createUnoService( "com.sun.star.frame.DispatchHelper" ) Dispatcher.executeDispatch( Frame, ".uno:Substract", "", 0, arg()) Collection.dispose ' libérer l'objet collection ' ici l'anneau est le seul objet sélectionné Anneau = doc.CurrentSelection(0) ' créer un camembert avec le même centre et un peu plus grand Camembert = creerDisque(Doc, ptX, ptY, 4100) Camembert.CircleKind = com.sun.star.drawing.CircleKind.SECTION Camembert.CircleStartAngle = 4500 Camembert.CircleEndAngle = -4500 LaPage.add(Camembert) ' place l'anneau et le camembert dans une autre collection Collection = createUnoService("com.sun.star.drawing.ShapeCollection") Collection.add(Anneau) Collection.add(Camembert) Control.Select(Collection) 'soustrait les 2 formes pour obtenir une fraction d'anneau Dispatcher.executeDispatch( Frame, ".uno:Substract", "", 0, arg()) End Sub

' crée un objet disque positionné par son centre Function creerDisque(leDocument As Object, _ centreX As Long, centreY As Long, diametre As Long) As Object Dim tailleForme As New com.sun.star.awt.Size Dim positionForme As New com.sun.star.awt.Point Dim cercle As Object

cercle = leDocument.createInstance("com.sun.star.drawing.EllipseShape") tailleForme.Width = diametre tailleForme.Height = diametre positionForme.x = centreX - diametre\2 positionForme.y = centreY - diametre\2 cercle.Size = tailleForme cercle.Position = positionForme creerDisque = cercle End Function