bonuscad Posté(e) le 10 décembre 2012 Posté(e) le 10 décembre 2012 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
VDH-Bruno Posté(e) le 12 novembre 2013 Posté(e) le 12 novembre 2013 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
bonuscad Posté(e) le 18 novembre 2013 Auteur Posté(e) le 18 novembre 2013 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
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