[Writer][Macro] Déterminer la position d'une formule mathématique dans un document, par macro.

Bonjour à tous,
Comme le titre l'indique, j'aimerais déterminer ou récupérer la position d'une formule mathématiques dans un document. En effet, l'objectif est de la remplacer par une chaine de caractère compréhensible pour Latex. J'essaie avec le curseur visible, mais ça ne marche pas (voir le code ci-dessous).
Par avance, désolé si je ne suis pas sur la bonne liste.
Cordialement,
O.J.

Voici ou j'en suis :
Sub analysedocpourlatex
     monDocument=ThisComponent
     monTexte=monDocument.Text
     oCurrentController = ThisComponent.getCurrentController()
     oTextDocument = oCurrentController.Model
     oEmbeddedObjects = oTextDocument.EmbeddedObjects
     nEndIndex = oEmbeddedObjects.Count-1
     curseurvisible=oCurrentController.ViewCursor
     for nIndex=0 to nEndIndex
         oMathObject = oEmbeddedObjects.getByIndex(nIndex)
         oModel = oMathObject.Model
         if (not isNull(oModel)) then
             if(not isEmpty(oModel)) then
                 if oModel.supportsService("com.sun.star.formula.FormulaProperties") Then
                     monDocument.CurrentController.Select(oModel)
                     textformule=oModel.Formula
                 End if
             End If
End If
Next nIndex
End Sub

Bonjour

Olivier Jaccomard wrote

Comme le titre l'indique, j'aimerais déterminer ou récupérer la position
d'une formule mathématiques dans un document. En effet, l'objectif est
de la remplacer par une chaine de caractère compréhensible pour Latex.

Je ne suis pas sûr de bien comprendre : si l'objectif est de modifier la
formule il n'est pas nécessaire de passer par sa position.

Le code suivant remplace par exemple le texte des formules par le mot
"latex".

Sub ModificationFormule
dim oDoc as object, oOle as object, dispatcher as object

oDoc = thiscomponent

for each oOle in oDoc.EmbeddedObjects
  if oOle.Component.supportsService("com.sun.star.formula.FormulaProperties")
then
    oOle.model.setPropertyValue("Formula", "latex")
  end if
next oOle

' Force la mise a jour de l'ecran par la repagination
oDoc = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(oDoc, ".uno:Repaginate", "", 0, Array())

msgbox "Terminé", 64, "Traitement des formules"
End Sub

Bonjour

Olivier Jaccomard wrote

Comme le titre l'indique, j'aimerais déterminer ou récupérer la position
d'une formule mathématiques dans un document. En effet, l'objectif est
de la remplacer par une chaine de caractère compréhensible pour Latex.

Je ne suis pas sûr de bien comprendre : si l'objectif est de modifier la
formule il n'est pas nécessaire de passer par sa position.

Le code suivant remplace par exemple le texte des formules par le mot
"latex".

Sub ModificationFormule
dim oDoc as object, oOle as object, dispatcher as object

oDoc = thiscomponent

for each oOle in oDoc.EmbeddedObjects
  if oOle.Component.supportsService("com.sun.star.formula.FormulaProperties")
then
    oOle.model.setPropertyValue("Formula", "latex")
  end if
next oOle

' Force la mise a jour de l'ecran par la repagination
oDoc = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(oDoc, ".uno:Repaginate", "", 0, Array())

msgbox "Terminé", 64, "Traitement des formules"
End Sub

Bonjour,
merci, déjà, de se pencher sur le problème.
L'idée est bonne, mais, le souci, en utilisant setPropertyValue, est que la nature de l'objet ne change pas. Du coup, si je veux, à partir de ce fichier odt, générer un fichier txt (ou finalement tex), j'aurais un toujours un objet math incompatible avec ce format.
Il faut donc, il me semble, que je repère absolument la position de l'objet dans le texte.
Cordialement,
O.J.

Bonjour

Olivier Jaccomard wrote

si je veux, à partir de ce fichier odt, générer un fichier txt
(ou finalement tex), j'aurais un toujours un objet math
incompatible avec ce format.

J'avais prévenu que je n'avais pas bien compris :slight_smile:

L'exemple suivant reprend le texte de la formule dans
le texte puis supprime l'objet. Si tu ne veux que récupérer
le texte de la formule sans supprimer l'objet il suffit de
commenter la ligne "dispose".

Nota: exemple vite fait, sans test donc... faire des copies
et des tests :slight_smile:

Sub ModificationFormule
dim oDoc as object, oOle as object, dispatcher as object

oDoc = thiscomponent

for each oOle in oDoc.EmbeddedObjects
        if
oOle.Component.supportsService("com.sun.star.formula.FormulaProperties")
then
      oOle.anchor.setString(oOle.model.Formula)
      oOle.dispose
        end if
next oOle

' Force la mise a jour de l'ecran par la repagination
oDoc = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(oDoc, ".uno:Repaginate", "", 0, Array())

msgbox "Terminé", 64, "Traitement des formules"

End Sub

Cordialement

Bonjour

Olivier Jaccomard wrote

si je veux, à partir de ce fichier odt, générer un fichier txt
(ou finalement tex), j'aurais un toujours un objet math
incompatible avec ce format.

J'avais prévenu que je n'avais pas bien compris :slight_smile:

L'exemple suivant reprend le texte de la formule dans
le texte puis supprime l'objet. Si tu ne veux que récupérer
le texte de la formule sans supprimer l'objet il suffit de
commenter la ligne "dispose".

Nota: exemple vite fait, sans test donc... faire des copies
et des tests :slight_smile:

Sub ModificationFormule
dim oDoc as object, oOle as object, dispatcher as object

oDoc = thiscomponent

for each oOle in oDoc.EmbeddedObjects
         if
oOle.Component.supportsService("com.sun.star.formula.FormulaProperties")
then
      oOle.anchor.setString(oOle.model.Formula)
      oOle.dispose
         end if
next oOle

' Force la mise a jour de l'ecran par la repagination
oDoc = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(oDoc, ".uno:Repaginate", "", 0, Array())

msgbox "Terminé", 64, "Traitement des formules"

End Sub

Cordialement

C'est parfait ! Je n'avais effectivement pas pensé à ce paramètre d'ancre.
Merci beaucoup pour votre aide.
Cordialement,
O.J.