Aller au contenu

(gile)

Moderateurs
  • Compteur de contenus

    12 247
  • Inscription

  • Dernière visite

  • Jours gagnés

    209

Tout ce qui a été posté par (gile)

  1. Salut, Sans pouvoir répondre précisément à ta question (je n'utilise pas MAP et je reste avec Windows 7), je te recommanderais d'installer Visual Studio 2015 (Comunity Edition est gratuite) dont on est certain qu'elle est aujourd'hui stable avec AutoCAD. Je ne me risquerais pas à utiliser une version release candidate à part pour des tests hors AutoCAD et j'attendrais même avant d'installer la version finale de Visual Studio 2017 que les éventuels problèmes de compatibilité avec AutoCAD soient résolus (pourtant j'ai hâte d'utiliser les nouvelles fonctionnalités de C# 7).
  2. didier, Je confirme, le code de la réponse #11 fonctionne (tout comme celui ci-dessus) à condition qu'on sélectionne bien le bloc "Info20" comme "ancien bloc" et le bloc "Nom_Local_GHdC" comme "nouveau bloc". Le code la réponse #11 devrait effectivement vérifier la validité de l'entité sélectionnée à savoir une référence de bloc ainsi que le nom de ce bloc (ce que fait le code ci-dessus). Si AutoCAD convertit automatiquement les étiquettes en majuscules, on arrive, notamment par programmation à avoir des attributs avec des étiquettes en minuscules accentuées (la preuve avec le bloc "Info20"). On notera que souvent, dans la recherche d'un attribut par étiquette on force les majuscules (avec strcase en LISP) avant la comparaison pour éviter ce genre de problème : (= (strcase att_etiq) "PERIMETRE") Par ailleurs, AutoCAD tolère aussi plusieurs attributs de même étiquette, ce qui, à mon avis, est beaucoup plus problématique... Jbrosteaux, Désolé d'avoir pollué ton sujet avec ces discussions techniques, mais cette discussion est loin d'être sans intérêt pour ceux qui apprennent ou se perfectionnent en LISP.
  3. didier, Pour le bloc source "Info20", l'étiquette est "Périmètre". Pour le bloc cible "Nom_Local_GHdC" l'étiquette est "PERIMETRE". DenisHen, En "Visual LISP", ça donnerait ça: (defun c:COPATTRIB (/ source target aire perim) (vl-load-com) (if (and (setq source (car (entsel "\nSélectionnez le bloc source: "))) (= (vla-get-ObjectName (setq source (vlax-ename->vla-object source))) "AcDbBlockReference") (= (vla-get-EffectiveName source) "Info20") (setq target (car (entsel "\nSélectionnez le bloc cible: "))) (= (vla-get-ObjectName (setq target (vlax-ename->vla-object target))) "AcDbBlockReference") (= (vla-get-EffectiveName target) "Nom_Local_GHdC") ) (progn (foreach att (vlax-invoke source 'GetAttributes) (if (= (vla-get-TagString att) "Aire") (setq aire (vla-get-TextString att)) ) (if (= (vla-get-TagString att) "Périmètre") (setq perim (vla-get-TextString att)) ) ) (foreach att (vlax-invoke target 'GetAttributes) (if (= (vla-get-TagString att) "AIRE") (vla-put-TextString att aire) ) (if (= (vla-get-TagString att) "PERIMETRE") (vla-put-TextString att perim) ) ) ) ) (princ) )
  4. Salut, Ces fonctions ne sont pas ce que l'on a coutume d'appeler fonctions vlisp ou Visual LISP. Ce sont des alternatives aux fonctions Visual LISP arrivées avec AutoCAD MAC 2012 pour palier au fait que l'interface COM/ActiveX est spécifique à Windows (voir ici).
  5. didier, getpropertyvalue est insensible à la casse pour les noms de propriété, mais pas à l'accentuation : il faut bien chercher "Périmètre" ou "PÉRIMÈTRE" et pas "perimetre" ou "PERIMETRE". Avec la méthode "classique" : (= att_etiq "Périmètre"), on fait une comparaison de chaîne qui sera donc forcément sensible à la casse et à l'accentuation. Ceci dit, je suis absolument d'accord pour bannir tout accent et autre caractère spécial dans les noms de calque, de blocs, etc. et utiliser des majuscules (non accentuées bien sûr) pour les étiquettes d'attribut. PS: On va dans le bon sens puisque le nouveau bloc de Jbrosteaux respecte cette "norme".
  6. Tu n'as pas dû tester dans la console de l'éditeur Visual LISP... getpropertyvalue ne prends que deux arguments (le ename de l'objet et le nom de la propriété) et retourne la valeur, que tu aurais dû affecter à une variable. En oubliant vl-catch-all-apply (qu'on peut utiliser plus subtilement ou tout simplement éviter en testant la validité des entrées utilisateur) on peut simplement faire : (setpropertyvalue nouv_bloc "AIRE" (getpropertyvalue ent_bloc "Aire"))
  7. DenisH, Je vois que tu utilises setpropertyvalue pour affecter les valeurs des attributs du nouveau bloc. C'est une bonne idée, c'est la méthode la plus simple. Pourquoi n'utilises-tu pas getpropertyvalue pour récupérer celles des attributs de l'ancien bloc ?
  8. (gile)

    ID dun viewport

    Salut, Le numéro d'identifiant de la fenêtre courante est affiché par la variable système CVPORT et modifier la valeur de cette variable changera la fenêtre courante si la valeur est valide. En espace objet, ce numéro est 2 pour une seule fenêtre incrémenté de 1pour chaque fenêtre ajoutée. En espace papier c'est pareil sachant que le numéro 1 est réservé à l'espace papier lui même.
  9. (gile)

    On the road again

    Have a good trip, Patrick ;)
  10. C'est dans le LISP... PS: je crois que tu confonds "text" (texte simple) et "mtext" (texte multiligne).
  11. Patrick_35, DelVtx permet de supprimer des sommets, en boucle certes, mais c'est toujours deux clics au lieu d'un seul escompté pour supprimer directement un segment. DenisH, C'est une excellente idée d'exercice pour ta formation LISP qui permettrait d'aborder la modification d'entité avec entmod et/ou les fonctions vla-* en passant par les fonctions de traitement des listes.
  12. Salut, S'il s'agit bien de coupe et si on veut utiliser les antiques méthodes de configuration, il vaut mieux regarder du côté de SOLVIEW et SOLDRAW (voir cette petite vidéo). Mais, depuis AutoCAD 2013 il me semble, les commandes VUEBASE, VUECOUPE, VUEDETAIL (_VIEWBASE, _VIEWSECTION, _VIEWDETAIL) issues d'Inventor permettent des choses équivalentes en plus convivial et avec les blocs.
  13. Salut, Il y a quelques temps, j'avais fait ce LISP. Pour que le (m)texte ne "bouge" pas, il faut décocher "Point d'insertion fixe" dans la boite de dialogue.
  14. Ou peut-être simplement en changeant l'unité d'insertion de ton fichier (actuellement INSUNITS est à 1, soit "pouces")...
  15. Salut, Je ne vois rien d'incorrect dans ton LISP si ce n'est que tu arrondis les coordonnées du point d'insertion en les convertissant en chaîne alors que tu peux très bien passer directement le point (liste de nombre) à la fonction command. Le problème vient du facteur d'échelle de conversion d'unité : le bloc d'origine est en pouce, l'unité d'insertion est le mètre d'où un facteur d'unité de 39.3701 affiché dans les propriétés (1 pouce / 0.0254 mètre = 39.3701). Tu peux récupérer cette valeur - soit en Visual LISP avec (vla-get-InsUnitsFactor (vlax-ename->vla-object ent)) - soit avec getpropertyvalue (getpropertyvalue (getpropertyvalue ent "BlockTableRecord") "UnitFactor")ou, plus simplement : (getpropertyvalue ent "BlockTableRecord/UnitFactor") Arrivé à ce niveau, il serait temps d'essayer d'éviter d'utiliser command et d'utiliser plutôt entmake ou entmod (très intéressant dans ce cas).
  16. (gile)

    cotation

    Salut, Je ne vais pas relancer le vieux débat stérile sur l'opportunité de faire des cotations dans l'espace papier (que j'ai défendue face à certains dinosaures), mais je confirme ce dysfonctionnement (bug ?) avec les changement d'échelle depuis la barre d'état. Dans tout les cas, quand on cote en espace papier (et encore une fois, je n'y suis pas opposé, bien au contraire) il faut garder en mémoire la commande COTREGEN (_DIMREGEN) qui permet de réparer ce type de dysfonctionnement.
  17. Salut, l'erreur est due au fait que le LISP ne trouve pas le fichier "DupObjPres.dcl" parce qu'il n'est pas dans répertoire des chemins de recherche (ou que ce fichier ne définit pas de boite de dialog nommés "DupObj", mais ce n'est pas le cas ici). Dans les expressions suivantes, - la première charge le fichier "DupObjPres.dcl", s'il n'est pas trouvé dcl_id aura une valeur négative ; - la seconde initialise la boite de dialogue "DupObj" et retourne nil si dcl_id est négatif ou si "DopObj" n'est pas trouvé dans le fichier (DupObj : dialog ...). Les fonctions (exit) ou (quit) permettent d'arrêter l'exécution du LISP, ce qui génère une erreur LISP dont le message est "quitter / sortir abandon". (setq dcl_id (load_dialog "DupObjPres.dcl")) ... (if (not (new_dialog "DupObj" dcl_id)) (exit))
  18. Salut, La routine writeUTF-8 requiert 2 arguments de type chaîne de caractère (STR) le premier est le texte à écrire dans le fichier, le second, le chemin du fichier. Le texte que je donnais dans l'exemple n'est qu'un exemple. Il n'est pas du tout nécessaire de l'intégrer. Si tu veux que le contenu de ton fichier soit : "Mon nom est : " Tu fais : (setq Variable1 "Kiki") (if (setq file (getfiled "Créer un fichier" "" "xml" 1)) (writeUTF-8 (strcat "Mon nom est : " variable1) file ) )
  19. Salut, Je pensais l'avoir déjà publiée ici mais je ne la retrouve pas. La routine ci-dessous affiche dynamiquement la longueur restante (restrictions : plus d’accrochages aux objets et uniquement des segments droits). ;; PLL ;; Dessine un polyligne de longueur limitée (defun c:PLL (/ *error* drawSegment drawPline makePline color segLen cursor loop points input result maxPt dist ) ;; redéfinition locale de la fonction *error* (defun *error* (msg) (and msg (/= msg "Fonction annulée") (prompt (strcat "\nErreur: " msg)) ) (grtext) (redraw) (princ) ) ;; affichage temporaire des segments déjà spécifiés (defun drawPline (points) (mapcar '(lambda (p1 p2) (grdraw p1 p2 color)) points (cdr points) ) ) ;; mise à jour du point extreme et affichage temporaire du dernier segment (defun drawSegment (basePt dragPt segLen) (setq maxPt (polar basePt (angle basePt dragPt) segLen)) (if (< (distance basePt dragPt) segLen) (progn (grdraw basePt dragPt -1) (grdraw dragPt maxPt 8 1) ) (grdraw basePt maxPt -1) ) ) ;; création de la polyligne (defun makePline (points / ucszdir) (setq ucszdir (trans '(0 0 1) 1 0 T)) (entmakex (append (list (cons 0 "LWPOLYLINE") (cons 100 "AcDbEntity") (cons 100 "AcDbPolyline") (cons 90 (length points)) (cons 70 0) (cons 38 (caddr (trans '(0 0 0) 1 ucszdir))) (cons 210 ucszdir) ) (mapcar '(lambda (p) (cons 10 (trans p 1 ucszdir))) points ) ) ) ) ;; fonction principale (sssetfirst nil nil) (or (numberp *PlineMaxLength*) (setq *PlineMaxLength* 5000.0)) ;_ valeur par défaut initiale (setq color (cdr (assoc 62 (tblsearch "layer" (getvar 'clayer))))) (if (and (or (and (setq segLen (getdist (strcat "\nSpécifiez la longueur maximale <" (rtos *PlineMaxLength*) ">: ") ) ) (setq *PlineMaxLength* segLen) ) (setq segLen *PlineMaxLength*) ) (setq basePt (getpoint "\nSpécifiez le premier point: ")) (setq points (cons basePt points) input "" loop T ) ) (progn (prompt (strcat "\nCliquez le point suivant (longueur restante : " (rtos seglen) "): ")) (while (and (setq result (grread T 12 0)) loop) (cond ;; mise à jour en fonction de la position du curseur ((= (car result) 5) (setq cursor (cadr result)) (redraw) (drawPline points) (drawSegment (car points) cursor segLen) ) ;; clic gauche ((= 3 (car result)) (setq dist (distance (car points) cursor)) (if (< dist segLen) (progn (setq points (cons cursor points) segLen (- segLen dist) ) (prompt (strcat "\nCliquez le point suivant ou validez (longueur restante : " (rtos seglen) "): ")) ) (progn (makePline (cons maxPt points)) (setq loop nil) ) ) ) ;; validation ((or (equal result '(2 13)) ;_ Entrée (equal result '(2 32)) ;_ Espace (= (car result) 25) ;_ clic droit ) (makePline points) (setq loop nil) ) ) ) ) ) (*error* nil) )
  20. (gile)

    selectionpreview

    Salut, Si tu es sûr que c'est la commande APPTIRER qui pose problème (je n'ai pas ce souci), tu peux éviter les réacteurs en redéfinissant la commande. La commande NONDEF (_UNDEFINE) permet de supprimer la définition d'une commande, et on peut définir une commande du même nom en LISP. On peut toujours accéder à la commande native en faisant précéder le nom de la commande par un point. ;; Rendre "non définie" la commande _PRESSPULL (APPTIRER) (command "_.undefine" "_presspull") ;; Redéfinir la commande PRESSPULL (defun c:presspull (/ prev) (setq prev (getvar 'selectionpreview)) (vl-catch-all-apply '(lambda () (command "_.PRESSPULL") ; appel de la commande native (while (< 0 (getvar 'cmdactive)) (command pause) ) ) ) (setvar 'selectionpreview prev) (princ) ) ;; Redéfinir la commande française (defun c:apptirer () (c:presspull))
  21. Salut, Je pense que le problème vient de l'appel de la commande en LISP qui limite le nombre de caractères à 128 caractères imprimables. Une solution de contournement est d'utiliser command pour dessiner une ligne de repère multiple avec un texte vide et de le remplir ensuite avec entmod. ;; on récupère l'identifiant de la dernière entité (setq lastEnt (entlast)) ;; on lance la commande (command "_.mleader" "_head" pause pause "" "") ;; si la commande a abouti, la dernière entité est différente de lastEnt (if (/= lastEnt (entlast)) (entmod (subst (cons 304 (strcat "xxxxxxxxxxxxxxxxxxxx" "\nxxxxxxxxxxxxxxxxxxxx" "\nxxxxxxxxxxxxxxxxxxxx" "\nxxxxxxxxxxxxxxxxxxxx" "\nxxxxxxxxxxxxxxxxxxxx" "\nxxxxxxxxxxxxxxxxxxxx" "\nxxxxxxxxxxxxxxxxxxxx" "\nxxxxxxxxxxxxxxxxxxxx" "\nxxxxxxxxxxxxxxxxxxxx" "\nxxxxxxxxxxxxxxxxxxxx" ) ) '(304 . "") (entget (entlast)) ) ) )
  22. Oui. DATAEXTRACTION est le "nom global" (qui fonctionne aussi sans underscore) de la commande française EXTRACTDONNEES. L'extraction de données a remplacé l'ancienne extraction d'attributs (limitée à ce type de données) et d'ailleurs, l'ancienne commande EXTATTBE lance aussi la même boite de dialogue.
  23. (gile)

    Gestion des erreurs

    Tu pourras aussi le faire avec celui que j'ai donné à condition de mettre en commentaire la ligne : (/= (strcase oldName) "STANDARD") Mais tu verras que dans les deux cas, il ne s'agit pas à proprement parler d'un renommage mais plutôt d'une copie puisque le style Standard sera automatiquement recréé par AutoCAD à la réouverture du dessin ou après un CONTROLE.
  24. (gile)

    Gestion des erreurs

    Re, Attention, que ce soit avec entmod, vla-put-Name ou setpropertyvalue, on peut avoir l'impression d'avoir renommé le style Standard, mais il suffit d'enregistrer (ou de faire un contrôle) pour que le style Standard réapparaisse.
×
×
  • 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é