eric45 Posté(e) le 22 novembre 2009 Posté(e) le 22 novembre 2009 Bonjour à tous, J'aimerais savoir s'il est possible de modifier des Z affichés dans un fichier de dessin, en enlevant une certaine valeur et ce pour tous ces Z. Par exemple, si j'enlève 0.26 à tous ces Z, pour un Z affiché "104.26" j'aimerais qu'il soit transformé en "104.00". J'aimerais éviter de les modifier un par un, existe t-il un moyen de faire cela ? Merci d'avance pour vos réponses.
didier Posté(e) le 22 novembre 2009 Posté(e) le 22 novembre 2009 bonjour pour te répondre il faut en savoir plus pour commencer, ces "valeurs" Z affichées sont des textes ou des attributs ? amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
eric45 Posté(e) le 22 novembre 2009 Auteur Posté(e) le 22 novembre 2009 Bonjour Didier, En fait ce sont juste des textes, qui indiquent la valeur Z du point à côté. J'ai déplacé ces points en les sélectionnant et en les déplaçant avec "deplacer3d", puis en tapant "@0,0,0.26", et je dois maintenant corriger les textes. Merci d'avance
didier Posté(e) le 22 novembre 2009 Posté(e) le 22 novembre 2009 coucou OK reste connecté je vais t'écrire un lisp qui va te faire çà. à tout de suite... amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
eric45 Posté(e) le 22 novembre 2009 Auteur Posté(e) le 22 novembre 2009 Super, mais ça peut attendre Didier, on est dimanche, tu as sûrement mieux à faire aujourd'hui, en tout cas un grand merci d'avance! Bon courage @ +
didier Posté(e) le 22 novembre 2009 Posté(e) le 22 novembre 2009 coucou voilà, demandé c'est livré ... ne te tracasse pas, je suis en train de faire du lisp et tu m'as donné une bonne occase de récréation. je t'ai fait çà : c'est du vite fait dons il n'y a pas de contrôle d'entitéstu me dis si çà te convient et on développe. (defun c:eric45()(setq entpoint (car(entsel "\sélection du point...\n")) enttexte (car(entsel "\sélection du texte...\n")) valeurdep (getreal "\nValeur du déplacement en Z\nnégatif pour descendre\n") point1 (cdr(assoc 10 (entget entpoint))) ) (setq tempo1 (subst (cons 10 (list (car point1)(cadr point1)(+ (caddr point1) valeurdep))) (assoc 10 (entget entpoint)) (entget entpoint) ) ) (entmod tempo1)(entupd entpoint) (setq tempo2 (subst (cons 1 (rtos (caddr (cdr(assoc 10 (entget entpoint)))) 2 2)) (assoc 1 (entget enttexte)) (entget enttexte) ) ) (entmod tempo2)(entupd enttexte)) amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
eric45 Posté(e) le 22 novembre 2009 Auteur Posté(e) le 22 novembre 2009 coucou Didier J'ai essayé le lisp, mais cela ne marche pas, (ou j'ai dû faire une fausse manip?) J'ai enregistré ton listing sous un nom, j'ai chargé le programme, et taper "eric45" dans la ligne de commande. J'ai aussi essayé de faire un copier-coller du listing à l'invite de commandes, mais même résultat.. J'ai bien un petit carré au bout du curseur comme pour sélectionner un objet, aussi je sélectionne un des textes, je fais "entrée", mais rien... Je dois sûrement mal m'y prendre, mais en tout cas merci de ton aide, @ + Eric
eric45 Posté(e) le 22 novembre 2009 Auteur Posté(e) le 22 novembre 2009 Oups! Bon et ben en fait c'était bien une fausse manip, j'ai basculé en mode "autocad classique" (j'étais en "dessin 2d et annotations"), et là tout marche nickel, mais je ne peux faire qu'un seul point à la fois, y a t-il un moyen de le faire en une seule fois? Pour info, le point et le texte sont sur le même calque, je ne peux sélectionner l'un ou l'autre qu'avec "sélection rapide". Encore merci Eric
lecrabe Posté(e) le 23 novembre 2009 Posté(e) le 23 novembre 2009 Hello Voici une autre routine qui permet d'ajouter une valeur numerique reelle a un TEXT/MTEXT, donc on peut aussi bien "ajouter que soustraire", il suffit de donner une valeur negative ! Attention elle ne traite que le debut numerique du contenu du texte ! Elle ne modifie pas les textes selectionnes mais elle ecrit de nouveaux textes ! Ce qui est legerement different de ta demande mais tres pratique pour conserver les anciennes valeurs ! :) Je ne sais plus qui a ecrit cette routine ... :casstet: Le Decapode ;; Routine ADD_TXT.LSP ;; Creation de nouveaux textes depuis des textes NUMERIQUEs existants ;; et ajout/soustraction d'une valeur numerique = xx.xx / -yy.yy ;; soit sur un calque EXISTANT (Nouveau si necessaire) ;; soit sur le calque COURANT ;; Fonctionne en principe sur les TEXT & MTEXT de type numerique ;; Taper au clavier ADD_TXT - Version 1.2 = OK (defun c:ADD_TXT (/ COEF N-VAL SEL X L LST-ENT) (vl-load-com) (setq sel nil) (while (not sel) (setq sel (ssget '((0 . "*TEXT"))))) (initget 1) (setq coef (getreal "\n Valeur numerique a ajouter/soustraire : ")) (setq sauvelayer (getvar "Clayer")) (setq L (getstring T "\n Nom du Calque EXISTANT pour creer les textes ou ENTREE pour calque COURANT : ")) (if (equal L "") (setq L (getvar "Clayer"))) ;; -- INUTILE -- Creation si necessaire du calque L ;; (if (equal L "") (setq L (getvar "Clayer")) (command "_-LAYER" "_M" L "") ) ;; -- INUTILE -- because entake cree le calque si necessaire ;; (if (not (tblobjname "LAYER" L)) ;; (vla-add (vla-get-Layers (vla-get-ActiveDocument (vlax-get-acad-object))) L) ;; ) (repeat (setq x (sslength sel)) (setq N-val (+ coef (atof (cdr (assoc 1 (entget (ssname sel (setq x (1- x)))))))) lst-ent (cdr (subst (cons 1 (rtos N-val)) (assoc 1 (entget (ssname sel x))) (entget (ssname sel x)))) lst-ent (subst (cons 8 L) (assoc 8 (entget (ssname sel x))) lst-ent)) (entmake lst-ent) ) ;; -- INUTILE -- Retour sur le calque courant ;; (command "_-LAYER" "_M" sauvelayer "") (princ) ) [Edité le 23/11/2009 par lecrabe] Autodesk Expert Elite Team
didier Posté(e) le 23 novembre 2009 Posté(e) le 23 novembre 2009 coucou bien sûr qu'on peut tout faire en une foisamis il s'agit à chaque fois d'une routine "spécialisée" car je n'ai pas moyen de savoir sit tu peux isoleret donc traiter en même temps tous les textes en imaginant que tous les textes d'un calque doivent être traitésil suffira de rajouter un filtre dans la sélection mais j'ai fait point par point car je ne connais pas ton fichierni tes obligations le lisp est interressant dans ce cas car il y aurait dix mille textesque ce serait traité en quelques secondes... je suis revenu au boulot mais si j'ai le temps je te corrige le code. amicalement [Edité le 23/11/2009 par didier] Éternel débutant... Mon site perso : Programmer dans AutoCAD
didier Posté(e) le 23 novembre 2009 Posté(e) le 23 novembre 2009 Coucou voici donc, à partir de ma proposition initialeun traitement de toutes les entités à savoir : il te faut isoler pour faire deux captures, des points puis des texteset désormais le texte ne sera plus à l'altitude du point lui correspondant mais aura une nouvelle valeur qui sera l'originale plus ou moins la valeur de déplacement ne sachant pas de quoi tu disposes comme fichier, fais-y attention. (defun c:eric45() (setq valeurdep (getreal "\nValeur du déplacement en Z\nnégatif pour descendre\n")) (setq JeuPoints (ssget '((0 . "POINT"))) JeuTexte (ssget '((0 . "TEXT"))) n 0) (repeat (sslength jeupoints) (setq entpoint (ssname jeupoints n) point1 (cdr(assoc 10 (entget entpoint))) tempo1 (subst(cons 10 (list (car point1)(cadr point1)(+ (caddr point1) valeurdep)))(assoc 10 (entget entpoint))(entget entpoint))) (entmod tempo1) (entupd entpoint) (setq n (1+ n)) ) (setq n 0) (repeat (sslength JeuTexte) (setq enttexte (ssname JeuTexte n) valtexte2 (+ (atof(cdr(assoc 1 (entget enttexte))))valeurdep) ) (setq tempo2(subst (cons 1 (rtos valtexte2 2 2))(assoc 1 (entget enttexte)) (entget enttexte))) (entmod tempo2) (entupd enttexte) (setq n (1+ n)) ) ) amicalement [Edité le 23/11/2009 par didier] Éternel débutant... Mon site perso : Programmer dans AutoCAD
eric45 Posté(e) le 23 novembre 2009 Auteur Posté(e) le 23 novembre 2009 Salut, Désolé de répondre que maintenant, j'étais sur le terrain toute la journée, mais merci , je vais essayer de retour au bureau, et je ferais les essais sur une copie de ce fichier.Petite question au passage, faut-il avoir des bases en programmation pour écrire du lisp? Existe t-il des cours, ou des livres (du style: le lisp pour les nuls)? Merci encore, Eric
(gile) Posté(e) le 23 novembre 2009 Posté(e) le 23 novembre 2009 Petite question au passage, faut-il avoir des bases en programmation pour écrire du lisp? Non, je dirais plutôt qu'à l'inverse, le LISP est un bon moyen d'aborder la programmation.La syntaxe est simple et c'est un langage de très haut niveau.Par contre, pour programmer un logiciel comme AutoCAD, il est impératif de (très) bien connaître le logiciel. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant