Aller au contenu

Connexion Autocad excel


GEGEMATIC

Messages recommandés

Salut,

Je recherche un exemple, le plus simple possible, de connexion entre excel et autocad.

L'extraction d'attributs ne m'interresse pas.

ce que je recherche, c'est le moyen de piloter la couleur d'un objet à partir d'une feuille excel.

Je suis un peu perdu par le nombre de possibilités existantes, et j'aimerai savoir laquelle est la plus appropriée.

Je me souviens d'un exemple proposé par Patrick Emin, qui permettait de changer le rayon d'un cercle par excel:

Je ne remets pas la main dessus

des souvenirs ?

----------------------------------------------------------------------

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

Salut,

avec l'aide de Patrick_35 :

 

; Lancer une liaison avec Excel-
(defun lancer_excel (vis / sel)
(setq xl (vlax-get-or-create-object "Excel.Application"))
(setq wks (vlax-get xl 'Workbooks))
(vlax-for sel wks
(setq liste_fichiers_ouvert (append liste_fichiers_ouvert (list (strcase (vlax-get sel 'fullname)))))
)
(if (equal vis 0)
(vla-put-visible xl :vlax-False)
(vla-put-visible xl :vlax-True)
)
)

;;;[b] Ouverture Excel + Nom de feuille puis 1 = visible, 0 = invisible -> (XL-Ouv-Feuill "chemin fichier" "Nom de feuille") -[/b]
(defun [b]XL-Ouv-Feuill[/b] (Chem-fich Nom_feuil vis)
(lancer_excel vis)
(setq xl-fichier (vlax-invoke wks 'open Chem-fich))
(setq xl-classeur (vlax-get xl-fichier 'sheets))
(setq x 1)
(repeat (vlax-get-property xl-classeur 'Count)
(if (equal (vlax-get (vlax-get-property xl-classeur 'item x) 'name)
Nom_feuil)
(setq xl-feuille (vlax-get-property xl-classeur 'item x))
(setq x (+ x 1))
)
)
(vlax-invoke-method xl-feuille 'Activate)
)

;;; [b]Choix Cellule dans Excel - Ecriture Texte -> (XL-Put-Txt-Cell "Texte" "C4") -[/b]
(defun [b]XL-Put-Txt-Cel[/b]l (Txt Cell)
(vlax-put
(vlax-get-property xl-feuille 'range Cell)'value2 Txt)
)

;;; [b]Choix de Cellule dans Excel (liste) - Lire Cellule -> (XL-Get-Val-Cell '("B1" "C4")) -[/b]
;;; -> Retourne liste résultat -
(defun [b]XL-Get-Val-Cell[/b] (lst-Cell / x)
(setq x 0
lst-val nil)
(repeat (length lst-Cell)
(setq lst-val (append lst-val (list (vlax-get (vlax-get-property xl-feuille 'range (nth x lst-Cell)) 'value2)))
x (+ x 1))
)
lst-val
)

;[b] Fermer la liaison avec Excel[/b]
(defun [b]XL-Close[/b] (/ ok sel)
(if (not (member (strcase (vlax-get xl-fichier 'fullname)) liste_fichiers_ouvert))
(vlax-invoke-method xl-fichier 'close :vlax-false)
)
(if liste_fichiers_ouvert
(vla-put-visible xl :vlax-True)
)
(foreach sel (list xl wks xl-fichier xl-classeur xl-feuille)
(vlax-release-object sel)
)
(setq xl nil wks nil xl-fichier nil xl-classeur nil xl-feuille nil)
(gc)(gc)
)
)

 

[Edité le 4/6/2007 par Bred]

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Lien vers le commentaire
Partager sur d’autres sites

Merci de ta réponse, mais ce n'est pas ce que je cherche:

Cette methode concerne un pilotage d'excel par autocad.

on trouve également des exemples d'extraction vers excel, puis de retour du resultat vers Autocad,

mais ce n'est pas ce dont j'ai besoin.

Ce dont j'ai besoin est là:

http://acad.fleming-group.com/index.html

mais le temps me manque pôur l'appliquer spécifiquement à excel, le tester ...

c'est pourquoi j'ai appelé à l'aide, car si qq avait travaillé sur le sujet, j'aurais gagné beaucoup de temps ...

En fait, il y a qq temps, j'ai posé la question de l'export au format Map HTML:

J'ai des cartes thematiques à créer pour une association de lute contre l'incinération (c'est du bénévolat, qui commence à me prendre beaucoup de temps)

Comme personnes n'avait ça, j'ai donc dévelloppé un export Map HTML, et tout ce qui va avec.

Ces cartes sont en fait des polygones, dans lesquels j'ai injecté des données d'objet ADE.

Mais ce syteme est lourd, peu pratique:

car les données que l'on me transmet sont rarement très bien formatées, il y a déjà un gros boulot.

je le fais sous excel, puis je l'intègre sous autocad via la lecture de fichier csv

Pour gagner du temps, (lors des nombreuses corrections...), j'aimerai piloter l'aspect de ma carte directement depuis excel:

je verrai mieux mes données, ça supprimerait des étapes, pour moi ce serait plus simple.

Il y a qq années, patrick Emin avait posté un exemple simple de liaison dynamique excel autocad,

mais je ne le retrouve pas.

Salut,

----------------------------------------------------------------------

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

Dans l'exemple de Patrick emin (s'il nous écoute, il se rappelle peut être ?),

Le lien était dynamique:

Je relie une entité à une ligne de la feuille excel

L'exemple donné était une liaison avec un cercle:

si sous excel je modifiais le rayon du cercle dans la cellule, le cercle était dynamiquement modifié dans autocad:

C'est un lien dynamique

J'ai map 2006, il y a des outils de connexion pour ça, mais je ne suis pas arrivé à les faire fonctionner avec excel

J'ai la tête en marmelade, mais je vais être obligé de mettre les mains dans le cambouis...

 

----------------------------------------------------------------------

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

Je pensais pourtant être clair ...

ce que je recherche, c'est le moyen de piloter la couleur d'un objet à partir d'une feuille excel.

je vais aller voir dans VBA

Reflexion faite, le liens flemming semble ne pas marcher non plus:

ça sert surtout à faire des requêtes SQL depuis une base.

Je vais trouver, mais c'est une galère monstre ...

Merci, A+

Gégé

 

----------------------------------------------------------------------

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

Bon,

J'ai rien trouvé de "magique"

Mais je suis tombé sur tes primitives de liaison excel Autocad (Je m'adresse à Patrick_35)

dès l'instant qu'on peu lire et écrire dans une case excel, je peu bien fair l'effort d'actionner un bouton ->vers excel et un autre <-Vers Autocad ... faut pas charier !!

Mais ça demande un peu de boulot.

Et j'étais parti sur excel, que je n'utilise pas, parceque je pensais qu'il était seul à proposer une liaison dynamique avec Autocad.

Mais ce n'est pas le cas.

Du coup, j'ai vu le boulot de winfield, pour openoffice, et ça me parrait plus interressant de m'impliquer dans un developpement pour OOo

Mais je n'arrive pas à passer le 1er ecceuil, dans ma traduction laborieuse ...

 

 
;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"))

Jusque là, ça va

mais après :

 
;Set DocumentoOOo = Desktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, args)
;LoadParams:=VarArrayCreate([0,-1],varVariant);
(setq args (vlax-make-safearray vlax-vbVariant  '(0 . 1)))
(Setq DocumentoOOo (vlax-invoke-method Desktop 'loadComponentFromURL "private:factory/scalc" "_blank" 0 args))

là ça plante, avec ce message:

"Erreur Automation InterfaceOleWrapper_Impl::Invoke : \r\n[automation

bridge]UnoConversionUtilities::createOleObjectWrapper \r\nThe VARIANT does

not contain an object type! "

 

Dommage, après la porte serait ouverte ...

Des idées ?

Gégé

 

 

----------------------------------------------------------------------

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

J'ai bien compris ta demande, mais c'est le mot dynamique qui me géne. D'ailleurs, ce sujet en parle.

 

dès l'instant qu'on peu lire et écrire dans une case excel, je peu bien fair l'effort d'actionner un bouton ->vers excel et un autre <-Vers Autocad ... faut pas charier !!

C'est ce que donne Bred :P

 

dans ma traduction laborieuse

C'est vrai que ce n'est pas facile, mais chapeau pour le début :)

 

Et d'après la lecture de ce que mets, on dirait que la variable arg doit contenir au moins un élément. Un vlax-safearray-fill ou encore un vlax-safearray-put-element sur la variable arg devait logiquement convenir.

N'ayant pas openoffice, difficile de tester. Peut-être qu'un module vba est intégré ?

Si c'est le cas, ne cherche pas plus loin. un alt+f11 et l'explorateur d'objet devrait te faciliter la vie

Sinon, il reste un (vlax-dump-object Desktop T) qui normalement devrait donner de précieux renseignements

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

J'ai bien compris ta demande, mais c'est le mot dynamique qui me géne. D'ailleurs, ce sujet en parle.

Je finit par penser que l'exemple magique que je crois avoir vu n'est qu'un mirage

maintenant, il doit être réalisable, en utilisant un evennement à l'echelle de window

Je parle un peu dans le flou, mais je pense que ce n'est pas accessible en VBA, ni en lisp, mais seulement avec un langage type VB, .NET ou C

Maintenant on peut faire "comme si", en emulant ce lien:

Coté Autocad, un reacteur qui déclanche une mise à jour d'excel,

et coté Excel, un evenement qui déclanche une mise à jour d'Autocad

 

Sinon, il reste un (vlax-dump-object Desktop T) qui normalement devrait donner de précieux renseignements

Malheureusement, l'Objet Desktop ne reagit pas à vlax-dump-object !

c'est toute la difficulté, on ne peut pas avoir d'info via l'explorateur d'objet:

il faut se réferer à la doc de l'API OOo ...

J'ai re-fait un tour sur les fonctions MAP DBCONNECT:

C'est nul. Archi nul: ça ne gère que les entité BLOC ou TEXTE!

J'entrevois les possibilité d'une liaison entre une simple feuille excel et n'importe quel type d'entité, et je me rends compte que je recherche ça depuis longtemps ...

 

----------------------------------------------------------------------

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

Salut

Je ne suis pas certain que de travailler avec Excel et les réacteurs soit la meilleure solution car cela pose plusieurs problèmes

Je modifie une entité

Appel Excel --> Ouvert/Pas ouvert + Recherche fichier ouvert ou pas + Recherche feuille si existante + Modif cellule + Sauvegarde ? + Fermer Excel ?

Il faut songer que le fichier peut-être modifié manuellement, qu'excel peut-être fermé accidentellement et on est donc obligé de faire ces verifs à chaque fois.

Je pense que cela ralentit énormement le dessin.

C'est comme tu veux, en tout cas, je pourrai t'aider

 

Si tu souhaites travailler avec Excel, tu as LXL qui lit ou écrit du texte dans une cellule et qui travaille avec des attributs. Je pense que la base peut-être là et qu'il ne reste pas grand chose à faire pour l'adapter à tes besoins.

Sinon, je suis prêt aussi à faire l'effort (pour le bénévolat) de voir comment travailler avec openoffice (merci a winfield pour le lien. J'ignorai que c'était un free)

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

Salut

Je ne suis pas certain que de travailler avec Excel et les réacteurs soit la meilleure solution car cela pose plusieurs problèmes

Je ne l'ai évoqué que comme une solution possible, mais pour moi, le jeu n'en vaut pas la chandelle:

trop lourd, trop long, trop de bugs potentiels, et impossible à péréniser, avec des version différentes de 2 logiciels ...

 

Si tu souhaites travailler avec Excel, tu as LXL qui lit ou écrit du texte dans une cellule et qui travaille avec des attributs.

Je l'ai essayé, ça marche bien, mais le gros du programme se concentre sur la problematique du cartouche utilisateur.

 

Donc les primitives que tu as diffusé me suffisent ...

 

Sinon, je suis prêt aussi à faire l'effort (pour le bénévolat) de voir comment travailler avec openoffice (merci a winfield pour le lien. J'ignorai que c'était un free)

@+

Si tu arrive à décoincer le début, après la voie et libre pour adapter les différents programmes disponibles.

Je ne manquerait pas de publier le résultat de mon travail.

mais je ne suis pas arrivé à passer le 1er barage, alors on en lest loin ...

Pour l'instant, je n'envisage pas de développer sur la base d'excel, je préfère OpenOffice, que j'ai lui, sur tous mes postes ...

A+

Gégé

 

 

----------------------------------------------------------------------

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

le gros du programme se concentre sur la problematique du cartouche utilisateur.

Non, le but est de lier des attributs à des cellules Excel. Que ce soit un cartouche ou autre chos.

Pourquoi pas une pîèce avec une nomenclature

 

Si tu arrive à décoincer le début

Je te promet de regarder et d'essayer

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

Grrr....

Moi non plus je n'y arrive pas :mad:

J'ai même tenté de ruser avec

(setq args (vlax-make-safearray vlax-vbVariant '(0 . 0)))
(vlax-safearray-put-element args 0 "")

mais rien n'y fait :(

 

J'ai bien trouvé ceci pour ouvrir un document (writer ou calc, qu'importe. Pour le moment c'est le document vierge qui nous intéresse)

Sub OuvreOOoDoc()

Rem

Rem Charger un document Writer, avec des paramètres d'ouverture (OpenPar)

Rem

Dim oSM, ODesk as Object 'Les objets de base de OOo

Dim OpenPar(2) As Object 'Un tableau VB

 

'Instancie OOo : ces deux lignes sont obligatoires avec VB dans tout code !

Set oSM = CreateObject("com.sun.star.ServiceManager")

Set oDesk = oSM.createInstance("com.sun.star.frame.Desktop")

 

'On appelle la fonction setOOoProp définie précédemment pour récupérer la structure

Set OpenPar(0) = setOOoProp("ReadOnly", True)

Set OpenPar(1) = setOOoProp("Password", "secret")

Set OpenPar(2) = setOOoProp("Hidden", False)

 

'On appelle la fonction OOo loadComponentFromURL, en lui passant en

'dernier paramètre le résultat de la fonction setOOoProp

Set r_doc = oDesk.loadComponentFromURL("file:///c|test.sxw", "_blank", 0, OpenPar)

 

End Sub

Mais pour un document vierge :casstet:

 

Je continue....

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

Le plus simple serait peut être d'utiliser VLAX class, pour exporter vers vba des variables lisp (globales):

document,

feuille,

case x,

case Y,

Valeur,

 

et d'appeleler deux routines VBA (sans arguments), une pour ecrire valeur, l'autre pour lire valeur.

c'est pas très beau, mais ça devrait marcher ...

 

Et il suffit parfois qu'on se décide à contourner un obstacle, la rage au coeur, pour trouver comment le passer, une fois qu'on a vu sa face cachée ...

 

----------------------------------------------------------------------

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

Mais pour un document vierge

 

Je continue....

Essaye

 Dim serviceManager As Object
   Dim Desktop As Object, DocumentoOOo As Object
   Dim args()
   Dim ObjCalc As Object
   
   Set serviceManager = CreateObject("com.sun.star.serviceManager")
   Set Desktop = serviceManager.createInstance("com.sun.star.frame.Desktop")
   Set DocumentoOOo = Desktop.loadComponentFromURL("private:factory/ [surligneur]scalc" [/surligneur] , "_blank", 0, args)
 

 

scalc =tableur

swriter=traitement de texte

....

 

Nous n’ héritons pas de la terre de nos ancêtres.Nous l’empruntons à nos enfants.

Lien vers le commentaire
Partager sur d’autres sites

c'est pas très beau, mais ça devrait marcher ...

Oui, le principal est que cela fonctionne :P

 

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

Merci winfield, mais que je lance le tableur ou le traitement de texte, la procèdure est la même. La difficulté est de passer un tableau vierge en argument, chose que refuse actuelle openoffice :(

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

Tui peux me dire la différence de logique entre

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

et

 Set DocumentoOOo = Desktop.loadComponentFromURL("private:factory/ swriter"  , "_blank", 0, args)

à part de lancer le tableur ou le traitement de texte

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

Dsl, je vois pas où est le problème du code que tu cites plus haut, à part surement une convertion malencontreuse de caractère

Set r_doc =oDesk.loadComponentFromURL("file:///c|test.sxw", "_blank", 0, OpenPar)

faut emplacer le pipe par le classique "c:\"

 

Nous n’ héritons pas de la terre de nos ancêtres.Nous l’empruntons à nos enfants.

Lien vers le commentaire
Partager sur d’autres sites

Bingo !

La voie est libre: le mysterieux args s'appelle maintenant openpar , comme open parametre .

car c'est de ces parametres d'ouvertures que ces veinards de VBAtistes n'ont pas besoin, alors que les vlispiens ne peuvent s'en passer.

 

J'ai laissé en commentaire toutes les lignes VBA dont je me suis inspiré.

 

 
;******************************************************************************
;§/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))
 (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
)


----------------------------------------------------------------------

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité