Aller au contenu

Retrouver les entités ayant servir pour un champs dynamique dans un tableau


Messages recommandés

Posté(e)

Bonjour,

 

Suite à une demande d'un utilisateur que j'ai trouvé intéressante, j'ai essayé de trouvé une solution.

 

Le problème à la base était de retrouver les entités ayant servir comme champs dynamique dans un tableau.

C'est vrai qu'AutoCad à la base ne permet pas de savoir qu'elle est l'entité qui a servi à créer le champ, ce qui peut être gênant lorsqu'on veut contrôler que l'on a rien oublié concernant le métré qui a été réalisé dans le tableau.

 

Voici donc ce que j'ai fais, la routine est encore fraîche. Ne vous gênez pas a y apporter des modifications pour l’améliorer.

 

Pour le test:

Pour faire un tableau de métré rapidement vous pouvez utiliser Metre2Cell&Field

 

Puis utiliser la routine ci dessous

 

Un problème que je n'ai pas compris, pour le bon fonctionnement il est préférable de faire "Esc" pour annuler la sélection faite par la routine avant de relancer celle ci sur une nouvelle table.

 

(defun c:Obj_link2table ( / js obj nb_rows nb_columns indx_r indx_c js_ sub id_cell field_obj en ent)
 (while (null (setq js (ssget "_:S" '((0 . "ACAD_TABLE"))))))
 (setq
   obj (vlax-ename->vla-object (ssname js 0))
   nb_rows (vla-Get-Rows obj)
   nb_columns (vla-Get-Columns obj)
   indx_r 0 indx_c 0
   js_sub (ssadd)
 )
 (while (<= indx_r (1- nb_rows))
   (if (eq (vla-GetContentType obj indx_r indx_c) 2)
     (cond
       ((numberp (vlax-variant-value (vla-GetCellValue obj indx_r indx_c)))
         (setq
           id_cell (vla-GetFieldId obj indx_r indx_c )
           field_obj (vla-ObjectIDToObject (vla-get-ActiveDocument (vlax-get-acad-object)) id_cell)
           en (cdr (assoc 331 (entget (cdr (assoc 360 (entget (vlax-vla-object->ename field_obj)))))))
         )
         (setq js_sub (ssadd en js_sub))
       )
     )
   )
   (setq indx_c (1+ indx_c))
   (if (> indx_c (1- nb_columns)) (setq indx_r (1+ indx_r) indx_c 0))
 )
 (if js_sub (sssetfirst nil js_sub))
 (prin1)
)

 

Voilà, si d'autres veulent creuser le sujet, je suivrais avec attention leur propositions.

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

  • 11 mois après...
Posté(e)

Bonsoir BonusCAD,

 

Au sujet des noms d’entités composant les FIELD et en voulant confronter mon approche à celles que d’autres ont pu écrire avant moi, je suis tombé sur ce post et me suis arrêté sur la réflexion suivante :

 

Un problème que je n'ai pas compris, pour le bon fonctionnement il est préférable de faire "Esc" pour annuler la sélection faite par la routine avant de relancer celle ci sur une nouvelle table.

 

Tout d’abord tel quel, la routine fonctionne c’est juste un problème d’affichage des grippes dans le cas d’une sélection avant pour t’en convaincre lance un regen pour voir la sélection gripper.

 

Cela vient du fait que lorsque la variable PICKFIRST est à 1, l’appel à la fonction sélection ssget filtre la sélection précèdent (cas de l’option "_:S" entre autres…), préalablement activé au moyen de la fonction sssetfirst alors cette dernière n’affichera plus les sélections suivantes à moins d’une régénération de l’affichage.

 

Pour éviter d’avoir à faire "Esc" pour annuler la sélection active, il faut soit :

  • Régler préalablement la variable PICKFIRST à 0 (pour sélectionner les objets uniquement après le lancement d'une commande).
  • Inserer dans le code un (command) ou un (sssetfirst nil nil) impérativement avant l’appel à la fonction ssget.
  • Régénérer l’affichage à la sortie du code.

 

Amicalement Bruno.

(Ps1 : détail js_sub contient un espace dans la localisation du defun)

(Ps2 : le code échoue si dans une cellule du tableau il y a une formule de champs dynamique)

Apprendre => Prendre => Rendre

Posté(e)

Bonjour Bruno,

 

Merci d'avoir remonter cette discussion ancienne, mais encore d'actualité tout de même...

 

Je prends note de ton observation sur PICKFIRST et l'option _:S de (ssget)

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

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é