Aller au contenu

LISP Bloc DYNAMIQUE en Z


Messages recommandés

Posté(e)

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

Posté(e)

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

Posté(e)

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)
)

 

Posté(e)
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 ?

Posté(e)

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

Posté(e)

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

Posté(e)
(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

Posté(e)

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.

Posté(e)
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)
)

 

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • 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é