KevM Posté(e) le 26 octobre 2023 Posté(e) le 26 octobre 2023 Bonjour, Je me permet de vous demander de l'aide, car je connais des solutions pour attribuer un Z à un bloc / point à partir d'un attribut / TXT, mais je n'arrive pas à faire fonctionner ces solutions pour un bloc dynamique (inversion et position) les différents lisp que j'ai sous la mains TOPOALT / ALTZ / ... ne fonctionne que lorsque je n'ai pas d'élément dynamique dans le bloc. Savez vous si un bloc est un objet différent d'un bloc dynamique ? Si c'est le cas quelle entrée faut il changer dans le lisp pour qu'il prenne en compte le bloc dynamique. Merci d'avance pour votre aide Bonne journée Cote alti.dwg
(gile) Posté(e) le 26 octobre 2023 Posté(e) le 26 octobre 2023 Salut, Je suppute que ton problème est un problème de sélection avec le nom du bloc (sinon, il n'y a aucune raison de ne pas pouvoir avoir un Z différent de 0 avec le bloc attaché). Quand on modifie un propriété dynamique d'un bloc, AutoCAD génère une nouvelle définition de bloc "anonyme" (nom de bloc commençant par "*U") donc si on filtre une sélection avec le nom de bloc "TCPOINT", on ne sélectionnera que les blocs dont aucune propriété dynamique n'a été modifiée. Tu devrais poster le code que tu utilises pour qu'on puisse éventuellement le modifier. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
OlivierR Posté(e) le 26 octobre 2023 Posté(e) le 26 octobre 2023 Bonjour KevM, Oui un bloc est différent d'un bloc dynamique. Le nom n'est pas enregistré de la même manière. Si tu poste ton lisp nous pourrons t'aider. Olivier
KevM Posté(e) le 26 octobre 2023 Auteur Posté(e) le 26 octobre 2023 Merci pour vos retours ultra rapide. Voici les deux lisp que j'ai essayé, je suis vraiment novice en lisp, même si j'arrive parfois à lire et bidouiller pour le modifier, je ne sais pas lequel serait le plus approprié pour la plupart des cas. LISP TOPOALT (defun c:TOPOALT (/ jsel i name n ALT pt) (and (or (setq jsel (ssget "_I" '((0 . "INSERT") (2 . "TCPOINT") (66 . 1)))) (setq jsel (ssget '((0 . "INSERT") (2 . "TCPOINT") (66 . 1)))) (setq jsel (ssget "_X" '((0 . "INSERT") (2 . "TCPOINT") (66 . 1)))) ) (repeat (setq n 0 i (sslength jsel)) (setq name (ssname jsel (setq i (1- i))) pt (cdr (assoc 10 (entget name))) ALT (atof (getpropertyvalue name "ALT")) ) (if (entmod (subst (cons 10 (list (car pt) (cadr pt) ALT)) (assoc 10 (entget name)) (entget name) ) ) (setq n (1+ n)) n ) ) (princ (strcat "\nUn total de " (itoa n) "/" (itoa (sslength jsel)) " blocs TCPOINT ont été modifié avec succès")) ) (princ) ) J'ai essayé également celui -ci (defun c:PTALT (/ ss i blk pt) (if (setq ss (ssget "_X" '((0 . "INSERT") (2 . "TCPOINT") (410 . "Model")))) (repeat (setq i (sslength ss)) (setq blk (ssname ss (setq i (1- i))) pt (getpropertyvalue blk "Position") ) (setpropertyvalue blk "Position" (list (car pt) (cadr pt) (atof (getpropertyvalue blk "ALT")))) ) ) (command-s "_attsync" "_name" "TCPOINT") (princ) )
KevM Posté(e) le 26 octobre 2023 Auteur Posté(e) le 26 octobre 2023 il y a 36 minutes, (gile) a dit : Quand on modifie un propriété dynamique d'un bloc, AutoCAD génère une nouvelle définition de bloc "anonyme" (nom de bloc commençant par "*U") donc si on filtre une sélection avec le nom de bloc "TCPOINT", on ne sélectionnera que les blocs dont aucune propriété dynamique n'a été modifiée. Oui j'ai déjà rencontré ce cas de figure comprenant que ça venait des blocs dynamiques, mais par exemple je viens de tester en copiant plusieurs fois le bloc TCPOINT non modifié et modifié, les blocs conservent le nom du bloc ne change pas et reste TCPOINT, je n'ai pas d'apparition de nom de bloc "*U". Sais tu à quelle moment cela se produit ou avec quelle action ?
(gile) Posté(e) le 26 octobre 2023 Posté(e) le 26 octobre 2023 La palette des propriétés affiche le nom "effectif" du bloc. Si tu entres l'expression suivante en ligne de commande et que tu sélectionnes un bloc, tu verras son nom tel qu'enregistré dans les données DXF du fichier. (cdr (assoc 2 (entget (car (entsel))))) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
KevM Posté(e) le 26 octobre 2023 Auteur Posté(e) le 26 octobre 2023 Oui effectivement je viens de tester, il arrive à conserver le nom dans les outils / propriétés/ sélection / insert /... mais à un ID différent en réalité. Du coup il faudrait que je trouve un lisp qui prend en compte une sélection et non le nom d'un bloc comme les deux ci dessus
(gile) Posté(e) le 26 octobre 2023 Posté(e) le 26 octobre 2023 (defun c:PTALT (/ ss i blk pt alt) (if (setq ss (ssget "_X" '((0 . "INSERT") (2 . "TCPOINT,`*U*") (410 . "Model")) ) ) (repeat (setq i (sslength ss)) (setq blk (ssname ss (setq i (1- i)))) (if (and (= (getpropertyvalue blk "BlockTableRecord/Name") "TCPOINT") (setq alt (distof (getpropertyvalue blk "ALT"))) (setq pt (getpropertyvalue blk "Position")) ) (setpropertyvalue blk "Position" (list (car pt) (cadr pt) alt)) ) ) ) (command-s "_attsync" "_name" "TCPOINT") (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
KevM Posté(e) le 27 octobre 2023 Auteur Posté(e) le 27 octobre 2023 Salut Gile merci beaucoup pour ce lisp, Si j'analyse bien il suffisait juste d'ajouter à la ligne 3 parenthèse 2 un séparateur virgule suivi ' et finit par étoile pour prendre en compte toute les instances commençant par *U, en revanche je ne saisi pas quelle est la fonction ' ? Ca voudrait dire que je pourrai ajouter plusieurs noms de blocs dans ce lisp, juste en ajoutant les noms de blocs, bien évidemment il faudrait qu'il est tous un attribut alt.
KevM Posté(e) le 27 octobre 2023 Auteur Posté(e) le 27 octobre 2023 il y a 35 minutes, KevM a dit : Ca voudrait dire que je pourrai ajouter plusieurs noms de blocs dans ce lisp, juste en ajoutant les noms de blocs, bien évidemment il faudrait qu'il est tous un attribut alt. Ah bah non finalement J'ai essayé d'aller plus loin et essayer de comprendre comment tout ça fonctionne un peu J'ai testé ça, mais je crois que je me suis senti pousser des ailes 😅 (defun c:PTALT (/ ss i blk pt alt) (if (setq ss (ssget "_X" '((0 . "INSERT") (2 . "TCPOINT 500,TCPOINT 200,`*U*") (410 . "Model")) ) ) (repeat (setq i (sslength ss)) (setq blk (ssname ss (setq i (1- i)))) (if (and (= (getpropertyvalue blk "BlockTableRecord/Name") "TCPOINT 500,TCPOINT 200") (setq alt (distof (getpropertyvalue blk "ALT"))) (setq pt (getpropertyvalue blk "Position")) ) (setpropertyvalue blk "Position" (list (car pt) (cadr pt) alt)) ) ) ) (command-s "_attsync" "_name" "TCPOINT 500, TCPOINT 200") (princ) )
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