Aller au contenu

vins13007

Membres
  • Compteur de contenus

    28
  • Inscription

  • Dernière visite

vins13007's Achievements

Newbie

Newbie (1/14)

  • First Post Rare
  • Collaborator Rare
  • Conversation Starter Rare
  • Week One Done Rare
  • One Month Later Rare

Recent Badges

0

Réputation sur la communauté

  1. 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,
  2. 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
  3. 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.
  4. 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,
  5. Bonjour à tous, Est ce que l'un de vous connaitrai une technique en étant dans l'espace présentation pour récupérer toutes les lignes et les éléments de l'espace objet histoire d'avoir tout de sélectionnable. Je voudrai que ce que j'ai à l'écran, pouvoir le récupérer tel quel et le copier dans l'espace objet d'un autre dessin. Merci à vous,
  6. Je vais regarder, merci ;). Ha oui je pensais pas que c'était dépassé. Par contre si quelqu'un peut me dire si c'est jouable de copier un .cuix existant et de le placer dans un fichier spécifique en lisp ?
  7. Bonjour messieurs, J'ai encore besoin de vous car je cherche, je cherche, je trouve pas et peut être même que ce que je veux faire n'est pas réalisable comme je le conçois, il faut peut être le faire différemment. Je sais que vous serez de bon conseil. J'ai environ 20 Autocad à paramétrer et j'aurai besoin de pouvoir tout paramétrer automatiquement pour obtenir un interface utilisateur par défaut avec 2 espaces de travail déjà prédéfini (voir image ci-dessous) car j'ai beaucoup de novice et faut que je paramètre tout. J'ai trouvé un lisp pour charger mon fichier de profil .arg qui arrive mais pas tout le temps à mettre mes barres en place comme je le veux mais je sais bien que je suis obligé d'avoir mon propre fichier principal perso pour avoir mon espace de travail comme je le souhaite. Déjà grâce au profil tout est paramétré. (defun c:setup_utilisateur (/ profile2import profilename proprefs) (vl-load-com) (setq profile2import "Y:\\POLE-ETUDES\\TRAVAIL\\Pôle contrôle-commande\\0-DAO\\AUTOCAD\\Programmation\\Profil_SEP.arg" profilename "Profil_SEP" proprefs (vla-get-profiles (vla-get-preferences (vlax-get-acad-object))) ) (vla-importprofile proprefs profilename profile2import :vlax-true) (vla-put-activeprofile proprefs profilename) (princ) ) Est t'il possible donc de charger un lisp qui s'exécuterait sans avoir a taper de commande (lever ce c:setup_utilisateur), récupérerait un fichier acad_perso.cuix dans un dossier réseau et le copierait en local la ou se trouve déjà le AutoCAD.cuix. Ensuite on pourrait ajouter la fonction ci-dessus qui définirait quel .cuix principal utiliser grâce au profil déjà parametré. Je bloc vraiment avec ce .cuix :/. Et j'ai essaye de ruser en gardant par défaut le AutoCAD.cuix principal et en mettant un acad_perso.cuix paramétré dans fichier d'entreprise mais ça rajoute les barres que j'avais choisi de garder donc je me retrouve avec des doublons et j'ai vu sur le net que j'étais pas le seul. Au final je rajoute rien dessus mis a part des barres que je veux pas qu'on touche. Merci d'avance
  8. Pas mal du tout, je savais même pas que c'était possible donc déjà suis content d'avoir vu une autre façon de faire et je vais regarder pour arriver à comprendre le positionnement :) Merci didier
  9. Pfff ça m'énerve de voir ça, centrer du texte ils savent pas faire mais rajouter des blocs vide y a pas de soucis. Meri beaucoup patrick ;)
  10. Ha mais c'est quoi ces schémas boiteux que je dois traiter, effectivement sur un nouveau dessin pas de problème tout part au point 0.0.0, j'ai même essayé de coller mon schéma dans un nouveau dessin et il va se mettre en 0.0.0 et le 3 est pile ou il faut. Mais dans le dessin d'origine, il ne bouge pas :/. Je vous l'envoie en ZIP pour que vous puissiez regarder. Merci patrick test.zip
  11. Ha d'accord, c'est bien ce qui me semblait mais je n'arrivais pas à placer le point ou je voulais. Je vous remercie pour votre solution mais celle de patrick est plus facile à gérer pour moi car je suis débutant et on y est presque. Manque plus qu'à faire marcher le déplacement du dessin. Si je fais cette démarche auprès de vous c'est parce que j'ai dejà eu la demande et je pourrai réutiliser cette fonction régulièrement.
  12. Bonjour Patrick, Non moi il ne déplace pas le dessin :( (je suis bien sur autocad 2013) par contre il insert bien le texte au point demandé et grâce à cons 8 j'ai réussi à le mettre sur le calque que je voulais. Je n'ai que un seul dessin par fichier donc ta solution convient très bien
  13. Bonjour messieurs :), Je viens d'essayer vos lisp merci de votre aide. @Didier - J'ai lancé le lisp et j'arrive bien à insérer un 3 dans la grille mais pas exactement ou je le souhaite. par contre je suis curieux de savoir votre démarche car je comprends pas en fonction de quoi vous placez le texte avec (6.95679 -4.79129 0.0). - Vous me parlez d'un .batch, c'est pour automatiser la commande ? @Patrick_35 - J'arrive à insérer le texte exactement comme il faut grâce à ce lisp en modifiant les coordonnés et la taille du texte. Le point d'insertion était bien spécifie et l'avantage c'est que je peux le modifier pour un autre usage :D. - Est-il possible avant de placer le texte de déplacer l'ensemble du schéma pour mettre le point en bas à gauche du cadre en 0,0,0 comme ça le 3 se positionnera correctement dans la grille ? - Comment faire pour écrire le "3" avec votre lisp dans un autre calque que "0" déjà existant dans le schéma ? Le calque souhaité est "TEXTE" Avant tout, je veux pas abuser, c'est déjà très gentil de votre part :) (defun c:m00(/ bas bd doc ele hg lst sel) (setq doc (vla-get-activedocument (vlax-get-acad-object))) (vla-startundomark doc) (and (ssget "x") (progn (vlax-for ele (setq sel (vla-get-activeselectionset doc)) (or (vl-catch-all-error-p (vl-catch-all-apply 'vla-getboundingbox (list ele 'bd 'hg))) (setq lst (cons (vlax-safearray->list bd) lst)) ) ) (setq bas (apply 'mapcar (cons 'min lst))) (vlax-for ele sel (vla-move ele (vlax-3d-point bas) (vlax-3d-point '(0.0 0.0 0.0))) ) (vla-delete sel) (entmake (list (cons 0 "TEXT") (cons 1 "3") (cons 10 '(113.1027 11.2090 0.0)) (cons 40 1.4063) ) ) ) ) (vla-endundomark doc) (princ) )
  14. Merci à tous pour votre implication, je test tout ça dès la première heure demain en arrivant au travail :) Bonne soirée à tous
  15. A toi de bien positionner le texte @+ Merci patrick, j'ai essayé en mettant la taille du texte mais ça me met : "; erreur; groupe DXF incorrect: (40)
×
×
  • 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é