vins13007 Posté(e) le 5 juillet 2022 Posté(e) le 5 juillet 2022 Bonjour à tous, Tout d'abord merci encore pour toutes les solutions que vous pouvez nous apporter, c'est toujours un plaisir de trouver des astuces ou des solutions grâce à vous. Je poste aujourd'hui car ce n'est pas faute d'avoir cherché et cherché mais la je bloque. Je communique avec excel afin de lui lancer mes propres fonctions et je souhaite récupérer les résultats de mes variables excel uniquement à l'aide du lisp sans connecter excel à autocad en vba. Je vous voit venir 😉 vous allez me dire connecte excel à autocad et définit ta variable dans autocad directement avec AcadDoc.SendCommand ("(setq selectexcel " & ta-variable & " ) ") mais j'aimerai éviter de faire ça et de façon aléatoire excel ne détecte pas mon autocad d'ouvert donc rien ne marche. Je savais que je pouvais lancer des fonctions excel avec autocad mais je ne savais pas définir de variables en lisp dans excel. J'ai réussi à trouver comment lancer une fonction avec un argument et je pense que ça fera plaisir à plus d'une personne 🙂. (vlax-invoke-method exl "Run" "ma-fonction" (vlax-make-variant "mon-texte" vlax-vbString)) ; Lancer fonction excel avec un argument de type texte Je remercie Didier au passage pour ses infos concernant les variants à consulter sans modération : https://www.da-code.fr/types-de-donnees-vlax/#ANCRE_vlax-make-variant La ou je bloque c'est pour récupérer le résultat de ma fonction dans une variable que j'ai créé sur excel depuis mon lisp On connait les librairies à importer (:methods-prefix "xl-" :properties-prefix "xlp-" :constants-prefix "xlc-") mais je n'arrive pas à trouver d'infos sur les fonctions qu'on peut utiliser avec mis à part les basiques pour récupérer un texte dans une cellule (xlp-get-item xl_classeur "ton-onglet") (xlp-get-range xl_feuille ...). Est ce qu'avec ces librairies la on pourrait récupérer la valeur d'une variable excel ? Je n'ai pas trouvé. J'ai voulu m'intéresser aux possibilités avec vlax-invoke-method et vlax-get-property, je suis certain qu'on peut décortiquer excel avec tout ça mais je ne trouve pas ou peu d'infos sur ce qu'on peut faire avec dans excel. Est-ce qu'à tout hasard un membre de la communauté aurait une liste des propriétés des ces fonctions avec excel car je ne suis pas le seul à chercher ce genre d'infos. (vlax-get-property object property) Merci d'avance, Vincent, Citer
(gile) Posté(e) le 5 juillet 2022 Posté(e) le 5 juillet 2022 Salut, Avec (vlax-get-property object property) tout dépend de ce qu'est object. Dans tous les cas, c'est l'aide pour les références VBA Excel que tu trouveras les listes de propriétés. Si object est l'Application Excel, les propriétés sont listées ici. Si object est un classeur, les propriétés sont listées ici. Si object est une feuille, les propriétés sont listées ici. etc. Citer Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
vins13007 Posté(e) le 5 juillet 2022 Auteur Posté(e) le 5 juillet 2022 Bonjour Giles, Un grand merci pour ta réactivité et ces 3 liens qui vont pouvoir nous aider à mieux analyser ce qu’on peut faire avec Excel. Je vais fouiner ce soir et si je trouve comment récupérer ma variable Excel, je posterai la ligne. A bientôt et au plaisir de te lire. Citer
vins13007 Posté(e) le 6 juillet 2022 Auteur Posté(e) le 6 juillet 2022 Re, Bon j'ai pas réussi à trouver la fonction qui permet de trouver et de lire une variable dans excel. Je pars en congé et je voulais débloquer le problème donc ce que j'ai fait c'est que je lance 2 fonctions excel à l'aide de (vlax-invoke-method exl "Run" "ma-fonction") pour ne pas connecter excel à autocad. La première je trie mon équipement parmi mes 15000 lignes, excel le fait très vite et la deuxième, il me renvoi le numéro de ligne pour que je puisse récupérer les valeurs dans la bonne cellule. Je vous garantie que ça dépote, on est loin de la recherche cellule par cellule d'autocad pour trouver ce qu'on cherche. Si ça peut aider : (defun emplacement_equipements (/ sélection compteur nom-caneco info-liste-entité nom-recherché pt noms-recherchés problèmes nom-fichier-exl nom-dossier exl xl_fichier xl_classeur xl_feuille compteur txtcellule x y z justification-txt rotation-txt selectexcel) (setvar "cmdecho" 0) ;; Création type de ligne (if (not (tblsearch "LTYPE" "DISCONTINU")) (entmake '( (0 . "LTYPE") ; Type d'entité nom du groupe (100 . "AcDbSymbolTableRecord") ; Type d'entité nom de la table primaire (100 . "AcDbLinetypeTableRecord") ; Type d'entité nom de la sous table (2 . "DISCONTINU") ; Nom (70 . 0) (3 . "_ _ _ _ _ _ _") ; Déscription (72 . 65) ; Code d'alignement, valeur toujours 65 (73 . 2) ; Nombre d'éléments (40 . 96.0) ; Longueur total de l'élément (49 . 64.0) ; Longueur tirets, car valeur positive (74 . 0) ; Type d'élément(un par élément). Par défaut est 0 (pas de forme / texte intégré) Les codes suivants sont des valeurs de bits: 2 = chaîne de texte / 4 = forme (49 . -32.0) ; Longueur espace, car valeur négative (74 . 0) ) ) ) ;; Création calque "A SUPPRIMER" (if (not (tblsearch "LAYER" "A SUPPRIMER")) (entmake (list '(0 . "LAYER") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbLayerTableRecord") (cons 2 "A SUPPRIMER") ; Nom calque (cons 70 0) ; 0 on / 1 off (cons 62 1) ; Couleur (cons 6 "DISCONTINU") ; Ligne type ) ) ) (if (setq sélection (ssget '((0 . "insert") (-4 . "<OR") (2 . "TABLEAU*") (2 . "GRILLE*") (2 . "_*") (-4 . "OR>")))) (progn (setq compteur 0) (repeat (sslength sélection) (if (setq nom-caneco (cdr (assoc 360 (entget (ssname sélection compteur))))) (progn (setq info-liste-entité (CANECO-INFO-ENTITE nom-caneco)) (setq nom-recherché (cdr (assoc "NOM" info-liste-entité))) (setq pt (cdr (assoc 10 (entget (ssname sélection compteur))))) ; Pt (x, y, z) x = gauche, droite | y = haut, bas (if (= (substr nom-recherché (strlen nom-recherché)) "-") (setq noms-recherchés (cons (cons (strcat (substr nom-recherché 1 (- (strlen nom-recherché) 1)) "*") pt) noms-recherchés)) (setq noms-recherchés (cons (cons nom-recherché pt) noms-recherchés)) ) ) (progn (setq problèmes (cons "Impossible de récupérer le nom caneco de l'équipement encadré en rouge-barré, il doit être renseigné avec une version caneco 2018" problèmes)) (setq pt (cdr (assoc 10 (entget (ssname sélection compteur))))) ; Pt (x, y, z) x = gauche, droite | y = haut, bas (setq liste-points (list (list (- (car pt) 75) (- (cadr pt) 75) (caddr pt)) (list (- (car pt) 75) (+ (cadr pt) 75) (caddr pt)) (list (+ (car pt) 75) (+ (cadr pt) 75) (caddr pt)) (list (+ (car pt) 75) (- (cadr pt) 75) (caddr pt)) (list (- (car pt) 75) (- (cadr pt) 75) (caddr pt)) (list (+ (car pt) 75) (+ (cadr pt) 75) (caddr pt)) (list (- (car pt) 75) (+ (cadr pt) 75) (caddr pt)) (list (+ (car pt) 75) (- (cadr pt) 75) (caddr pt)))) (entmake (append (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline") (cons 8 "A SUPPRIMER") (cons 70 1) (cons 90 (length liste-points)) ) (mapcar '(lambda (x)(cons 10 x)) liste-points) ) ) (entmod (subst (cons 38 (caddr pt)) (assoc 38 (entget (entlast))) (entget (entlast)))) ) ) (setq compteur (1+ compteur)) ) ;;; (setq noms-recherchés (vl-sort noms-recherchés '(lambda (a b) (< (car a) (car b))))) ; Triage de la liste (if (or (setq nom-fichier-exl (findfile "S:/ESPACE DE TRAVAIL/TECHNIQUE/E_Montage cablage/- Etudes phase 2 [Etat 0]/Plans 2D de cheminement/Plan 2D Caneco/Plan 3D 3.2/_Export maquette 3D/Export maquette complet.xlsm")) ; Inscrit le chemin pour éviter de le chercher (setq nom-fichier-exl (getfiled "Indiquez le chemin du fichier excel Export maquette complet" "S:\\ESPACE DE TRAVAIL\\TECHNIQUE\\E_Montage cablage\\- Etudes phase 2 [Etat 0]\\Plans 2D de cheminement\\Plan 2D Caneco\\Plan 3D 3.2\\_Export maquette 3D\\" "" 8)) ; Si le nom de dossier ou du fichier a changé, il va falloir lui indiquer le chemin ) (progn ;; Gestion excel (if (not (setq exl (vlax-get-or-create-object "Excel.Application"))) ; Trouver l'application (progn (alert " Aucune application excel trouvée\n *** Fin du programme ***") (exit) ) ) (setq xl_fichier (vla-open (vlax-get-property exl "WorkBooks") nom-fichier-exl)) (vla-put-visible exl 0) ; Rendre Excel invisible (if (not *librairie-excel*) ; Importer les librairies pour communiquer avec Excel (progn (if (vlax-import-type-library :tlb-filename "C:\\Program Files\\Microsoft Office\\root\\Office16\\Excel.exe" ; "C:\\Program Files\\Microsoft Office\\root\\Office16\\Excel.exe" ----- "C:\\Program Files (x86)\\Microsoft Office\\root\\Office16\\Excel.exe" :methods-prefix "xl-" :properties-prefix "xlp-" :constants-prefix "xlc-" ) (setq *librairie-excel* T) (progn (alert "Les librairies pour communiquer avec excel n'ont pas pu être importées, vérifier version excel du PC\n\n\t\t *** Fin du programme ***") (exit) ) ) ) ) ;; Choisir la feuille du classeur (setq xl_classeur (vlax-get xl_fichier "Sheets")) (setq xl_feuille (xlp-get-item xl_classeur "Liste filtré")) (setq compteur 0) (repeat (length noms-recherchés) ;; Recherche de l'équipement ;;; (vlax-variant-value (vlax-invoke-method exl "Run" "Filtre" (vlax-make-variant "nom_equipement*" vlax-vbString))) (vlax-invoke-method exl "Run" "Filtre" (vlax-make-variant (car (nth compteur noms-recherchés)) vlax-vbString)) ; Lancer fonction excel avec argument (setq selectexcel (vlax-variant-value (vlax-invoke-method exl "run" "ligne"))) (if (/= selectexcel 0) ; Jo met 0 si pas d'équipement (progn (setq x (vlax-variant-value (xlp-get-value (xlp-get-range xl_feuille (strcat "B" (itoa selectexcel)))))) (setq y (vlax-variant-value (xlp-get-value (xlp-get-range xl_feuille (strcat "C" (itoa selectexcel)))))) (setq z (vlax-variant-value (xlp-get-value (xlp-get-range xl_feuille (strcat "E" (itoa selectexcel)))))) (setq pt (list (cadr (nth compteur noms-recherchés)) (caddr (nth compteur noms-recherchés)) (cadddr (nth compteur noms-recherchés)))) ; Pt (x, y, z) x = gauche, droite | y = haut, bas (entmake (list '(0 . "LINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline") (cons 8 "A SUPPRIMER") (cons 10 pt) (cons 11 (list x y z)) ) ) (setq rotation-txt (atoi (angtos (angle (list x y z) pt)))) (cond ((<= (atoi (angtos (angle (list x y z) pt))) 90) (setq justification-txt 0)(setq rotation-txt (angle (list x y z) pt))) ((<= (atoi (angtos (angle (list x y z) pt))) 180) (setq justification-txt 2) (setq rotation-txt (- (angle (list x y z) pt) 3.14159))) ((<= (atoi (angtos (angle (list x y z) pt))) 270) (setq justification-txt 2) (setq rotation-txt (- (angle (list x y z) pt) 3.14159))) ((<= (atoi (angtos (angle (list x y z) pt))) 360) (setq justification-txt 0) (setq rotation-txt (angle (list x y z) pt))) ) (entmake (list (cons 0 "TEXT") (cons 1 (car (nth compteur noms-recherchés))) ; Contenu texte (cons 8 "A SUPPRIMER") (cons 10 pt) ; Point d'insertion (cons 11 (list x y z)) ; Direction (cons 40 100) ; Hauteur texte (cons 50 rotation-txt) ; Angle de rotation (cons 72 justification-txt) ; Justification du texte gauche 0 ou droite 2 (cons 73 1) ; Justification du texte en bas ) ) (entmod (subst (cons 38 (caddr pt)) (assoc 38 (entget (entlast))) (entget (entlast)))) ) (progn (setq problèmes (cons (strcat (car (nth compteur noms-recherchés)) " ne se trouve pas dans la liste " (substr (car (nth compteur noms-recherchés)) 1 3)) problèmes)) (setq pt (list (cadr (nth compteur noms-recherchés)) (caddr (nth compteur noms-recherchés)) (cadddr (nth compteur noms-recherchés)))) ; Pt (x, y, z) x = gauche, droite | y = haut, bas (setq liste-points (list (list (- (car pt) 75) (- (cadr pt) 75) (caddr pt)) (list (- (car pt) 75) (+ (cadr pt) 75) (caddr pt)) (list (+ (car pt) 75) (+ (cadr pt) 75) (caddr pt)) (list (+ (car pt) 75) (- (cadr pt) 75) (caddr pt)) (list (- (car pt) 75) (- (cadr pt) 75) (caddr pt)) (list (+ (car pt) 75) (+ (cadr pt) 75) (caddr pt)) (list (- (car pt) 75) (+ (cadr pt) 75) (caddr pt)) (list (+ (car pt) 75) (- (cadr pt) 75) (caddr pt)))) (entmake (append (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline") (cons 8 "A SUPPRIMER") (cons 62 2) (cons 70 1) (cons 90 (length liste-points)) ) (mapcar '(lambda (x)(cons 10 x)) liste-points) ) ) (entmod (subst (cons 38 (caddr pt)) (assoc 38 (entget (entlast))) (entget (entlast)))) ) ) (setq compteur (1+ compteur)) ) (vlax-invoke-method (vlax-get-property exl "ActiveWorkbook") "Close" :vlax-False) ; Fermer Excel sans sauvegarder (vlax-release-object exl) ; S'assurer de la fermeture d'excel (not (vlax-object-released-p exl)) (gc) ; Force une récupération de place, ce qui libère de la mémoire inutilisée ) ) (setvar "cmdecho" 1) (princ "CARRES ROUGE = Base caneco à maj // CARRES JAUNE = Pas encore dans la maquette") (princ) ) ) ) Sur excel en créant un module et en ajoutant ces lignes : Option Explicit Sub Filtre(repère As String) Dim derligne As Long derligne = Cells.Find("*", , , , xlByRows, xlPrevious).Row ActiveSheet.Range("$A$1:$A$" & derligne).AutoFilter Field:=1, Criteria1:=repère End Sub Function ligne() As Long Dim boucle1 As Long Dim derligne As Long ligne = 0 derligne = Cells.Find("*", , , , xlByRows, xlPrevious).Row For boucle1 = 2 To derligne If Not Rows(boucle1).Hidden Then ligne = boucle1 Exit Function End If Next boucle1 End Function Je préférai savoir récupérer la valeur d'une variable plus proprement que de faire une fonction pour récupérer une valeur donc je suis toujours preneur de cette info si quelqu'un l'a ;). A bientôt, Vincent Citer
didier Posté(e) le 6 juillet 2022 Posté(e) le 6 juillet 2022 Bonjour @vins13007 Je ne suis pas concerné par ce sujet, mais je tiens à te félicite pour l'échange de la solution trouvée. Merci beaucoup de respecter l'esprit d'échange qui a fait de ce forum ce qu'il est : une mine de solutions dans toutes les directions. Amicalement Citer Éternel débutant... Mon site perso : Programmer dans AutoCAD
vins13007 Posté(e) le 20 juillet 2022 Auteur Posté(e) le 20 juillet 2022 Bonjour @didier Merci pour tes encouragements. C'est nous qui devont vous remercier pour toutes les réponses que vous nous apportées ainsi que pour vos sites ou pages perso. Je ne poste pas beaucoup car souvent je trouve les réponses grâce aux questions déjà posées sur ce forum ou sur internet mais pour le coup le contrôle d'excel par autocad est très peu abordée quand on sort de la récupération d'une info dans une cellule. Je vais continuer à chercher pour ne même plus avoir à faire une fonction excel afin de récupérer le numéro de ligne d'un filtre. Amicalement, Citer
Messages recommandés