Overblog
Editer l'article Suivre ce blog Administration + Créer mon blog
14 juin 2012 4 14 /06 /juin /2012 17:53
Petits outils pour utiliser Open Office avec Autocad

J’ai commencé à utiliser Open Office dès la version 1.

J’avais une version complète de Ms office,  mais l’installer était tellement long - et à l’époque je changeais souvent de config – avec des codes à rallonge à entrer pour chaque module, que j’ai pris l’habitude d’utiliser oOo.

De là, la frustration lorsque l’on n’a pas Excel, et que l’on voit passer des outils en lisp pour utiliser Excel avec Autocad.

J’ai donc essayé de créer une bibliothèque équivalente à celles utilisant Excel pour  oOo.

Ces premiers efforts  datent de 2007, et depuis 2008, rien de nouveau n’a été fait.

J’espère relancer la machine en exhumant ce vieux sujet …

 

Problématique

Le premier écueil rencontré, c’était d’ouvrir un document vierge oOo depuis Autocad.

Puis de paramétrer ce document.

Cela n’a pas été chose facile, malgré l’aide du site kalitech.

Ensuite j’ai eu besoin de piloter l’ouverture de fichiers  xls, ods et csv existant depuis Autocad.

Les fichiers csv sont très utiles puisqu’on peut le générer directement avec un Write-line.

Limitations

Il n’y a aujourd’hui que 4 routines :

acad2oOOsCalc Qui ouvre une feuille de calcul vierge OOo en utilisant l'API OOo pour VB

 setOOoProp pour paramétrer les propriétés d'un objet de l'API OOo en VB

OpenCsvWithoOOsCalc Pour ouvrir une feuille de calcul au format csv spécifiée en utilisant l'API OOo pour VB

 

OpenSpreadSheetWithoOOsCalc Pour ouvrir une feuille de calcul spécifiée en utilisant l'API OOo pour VB / feuille

Prérequis:

Que PowerClic  soit installé et fonctionnel, pour avoir accès aux fonctions « pw_ »

 

 

Instructions d’utilisations
Discussions et sites de référence :

 

http://cadxp.com/index.php?/topic/15105-connexion-autocad-excel/page__st__20

http://www.kalitech.fr/clients/doc/VB_APIOOo_fr.html

 

 

Début du code ci-dessous

 

;******************************************************************************
;§/openoffice/ Ouvrir une feuille de calcul vierge OOo en utilisant l'API OOo pour VB / none
;;site web de réference :
;;http://www.kalitech.fr/clients/doc/VB_APIOOo_fr.html
;
(defun acad2oOOsCalc ( / Oprop openPar)
;;;Set serviceManager = CreateObject("com.sun.star.serviceManager")
(setq serviceManager
     (vlax-create-object "com.sun.star.serviceManager")
)
;;;Set Desktop = serviceManager.createInstance("com.sun.star.frame.Desktop")
(setq Desktop (vlax-invoke-method
         serviceManager
         'createInstance
         "com.sun.star.frame.Desktop"
        )
)


;;;LoadParams:=VarArrayCreate([0,-1],varVariant);
(setq openPar (vlax-make-safearray vlax-vbVariant '(0 . 2)))

;;;'On appelle la fonction setOOoProp définie précédemment pour récupérer la structure
;;; Set OpenPar(0) = setOOoProp("ReadOnly", True)

;(setq Oprop (setOOoProp "ReadOnly" :vlax-true))
(setq Oprop (setOOoProp "ReadOnly" :vlax-false))
(vlax-safearray-put-element openPar 0 Oprop)
;;; Set OpenPar(1) = setOOoProp("Password", "secret")
(setq Oprop (setOOoProp "Password" "secret"))
(vlax-safearray-put-element openPar 1 Oprop)

;;; Set OpenPar(2) = setOOoProp("Hidden", False)
(setq Oprop (setOOoProp "Hidden" :vlax-false))
(vlax-safearray-put-element openPar 2 Oprop)

;;;Set DocumentoOOo = Desktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, openPar)

(Setq DocumentoOOo
     (vlax-invoke-method
     Desktop   'loadComponentFromURL
     "private:factory/scalc"   "_blank"
     0         openPar
     )
)
)


;******************************************************************************
;§/openoffice/ Paramétrer les propriétés d'un objet de l'API OOo en VB / cName uValue
;; Certaines propriétés d'objet de l'API OOo sont du type structure.
;;Pour des raisons liées à l'implémentation du pont UNO-Automation
;;(cf http://api.openoffice.org/docs/DevelopersGuide/ProfUNO/ProfUNO.htm#1+4+4+5+3+Usage+of+Types),
;;on ne peut passer directement une structure VB en argument d'une fonction de l'API OOo. A partir de VB,
;;il faut donc utiliser une fonction particulière de l'API (Bridge_GetStruct)
;;pour accéder aux structures et pouvoir ensuite passer cette structure à la fonction OOo

(defun setOOoProp (cName uValue / oSM oPropertyValue)

;;;Function setOOoProp(cName, uValue) As Object
;;;
;;; Dim oPropertyValue As Object
;;; Dim oSM As Object
;;; 
;;; Set oSM = CreateObject("com.sun.star.ServiceManager")
(setq oSM (vlax-create-object "com.sun.star.serviceManager"))
;;; Set oPropertyValue = oSM.Bridge_GetStruct("com.sun.star.beans.PropertyValue")

(Setq oPropertyValue
     (vlax-invoke-method
     oSM
     'Bridge_GetStruct
     "com.sun.star.beans.PropertyValue"
     )
)

;;; oPropertyValue.Name = cName
(vlax-put-property oPropertyValue 'Name cName)

;;; oPropertyValue.Value = uValue
(vlax-put-property oPropertyValue 'Value uValue)
;;;
;;; Set setOOoProp = oPropertyValue
;;;
;;;End Function
oPropertyValue
)


;******************************************************************************
;§/openoffice/ Ouvrir une feuille de calcul au format csv spécifiée en utilisant l'API OOo pour VB / feuille
;;site web de réference :
;;http://www.kalitech.fr/clients/doc/VB_APIOOo_fr.html
;
(defun OpenCsvWithoOOsCalc ( feuille / Oprop openPar)
(if (not feuille)
(setq feuille (getfiled "Feuille de calcul à charger : " (getvar "dwgprefix") "csv" 0) )
)
(setq feuille (strcat "file:///" (pw_slashit feuille )))
;;;Set serviceManager = CreateObject("com.sun.star.serviceManager")
(setq serviceManager
     (vlax-create-object "com.sun.star.serviceManager")
)
;;Set Desktop = serviceManager.createInstance("com.sun.star.frame.Desktop")
(setq Desktop (vlax-invoke-method
         serviceManager
         'createInstance
         "com.sun.star.frame.Desktop"
        )
)


;;;LoadParams:=VarArrayCreate([0,-1],varVariant);
(setq openPar (vlax-make-safearray vlax-vbVariant '(0 . 2)))

;;;'On appelle la fonction setOOoProp définie précédemment pour récupérer la structure
;;; Set OpenPar(0) = setOOoProp("ReadOnly", True)

;;; ;(setq Oprop (setOOoProp "ReadOnly" :vlax-true))
(setq Oprop (setOOoProp "ReadOnly" :vlax-false))
(vlax-safearray-put-element openPar 0 Oprop)

;;;;;; Set OpenPar(2) = setOOoProp("Hidden", False)
(setq Oprop (setOOoProp "Hidden" :vlax-false))
(vlax-safearray-put-element openPar 1 Oprop)

;;; - * - *
;; attention, ce qui suit est primordial pour ouvrir du csv avec openoffice:


;;;Dim oPropertyValue(0) As New com.sun.star.beans.PropertyValue
;;;oPropertyValue(0).Name = "FilterOptions"
;;;oPropertyValue(0).Value = "44"
;;;
;;;oDoc = starDeskTop.loadComponentFromURL( oUrl, "_blank", 0, oPropertyValue )

(setq Oprop (setOOoProp "FilterOptions" "44"));_ 44 pour , car (ascii ",") = 44
;;; (setq Oprop (setOOoProp "FilterOptions" "59"));_59 pour ;

(vlax-safearray-put-element openPar 2 Oprop)


;;; ;;;mFileProperties(0).Name = "FilterName"
;;; ;;;mFileProperties(0).Value = "scalc: Text - txt - csv (StarCalc)"
;;; (setq Oprop (setOOoProp "FilterName" "scalc: Text - txt - csv (StarCalc)"))
;;; (vlax-safearray-put-element openPar 3 Oprop)
;;;



;;;Set DocumentoOOo = Desktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, openPar)

(Setq DocumentoOOo
     (vlax-invoke-method
     Desktop   'loadComponentFromURL
     feuille  "_blank"
     0         openPar
     )
)
)

;******************************************************************************
;§/openoffice/ Ouvrir une feuille de calcul spécifiée en utilisant l'API OOo pour VB / feuille
;;site web de réference :
;;http://www.kalitech.fr/clients/doc/VB_APIOOo_fr.html
;
(defun OpenSpreadSheetWithoOOsCalc ( feuille / Oprop openPar)
(if (not feuille)
(setq feuille (getfiled "Feuille de calcul à charger : " (getvar "dwgprefix") "ods;xls" 0) )
)
(setq feuille (strcat "file:///" (pw_slashit feuille )))


;;;Set serviceManager = CreateObject("com.sun.star.serviceManager")
(setq serviceManager
     (vlax-create-object "com.sun.star.serviceManager")
)
;;Set Desktop = serviceManager.createInstance("com.sun.star.frame.Desktop")
(setq Desktop (vlax-invoke-method
         serviceManager
         'createInstance
         "com.sun.star.frame.Desktop"
        )
)


;;;LoadParams:=VarArrayCreate([0,-1],varVariant);
(setq openPar (vlax-make-safearray vlax-vbVariant '(0 . 1)))

;;;'On appelle la fonction setOOoProp définie précédemment pour récupérer la structure
;;; Set OpenPar(0) = setOOoProp("ReadOnly", True)

;;; ;(setq Oprop (setOOoProp "ReadOnly" :vlax-true))
(setq Oprop (setOOoProp "ReadOnly" :vlax-false))

(vlax-safearray-put-element openPar 0 Oprop)
;;;;;; Set OpenPar(1) = setOOoProp("Password", "secret")
;;; (setq Oprop (setOOoProp "Password" "secret"))
;;; (vlax-safearray-put-element openPar 1 Oprop)

;;;;;; Set OpenPar(2) = setOOoProp("Hidden", False)
(setq Oprop (setOOoProp "Hidden" :vlax-false))
(vlax-safearray-put-element openPar 1 Oprop)

;;;Set DocumentoOOo = Desktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, openPar)

(Setq DocumentoOOo
     (vlax-invoke-method
     Desktop   'loadComponentFromURL
     feuille  "_blank"
     0         openPar
     )
)
)
 

g-eaux

 

 

 

 

Partager cet article
Repost0

commentaires