LUDWIG Posté(e) le 28 novembre 2010 Posté(e) le 28 novembre 2010 Bonjour, J'ai un tableau que j'essayes de mettre en forme en faisant des fusions de cellules, mais je n'arrive pas au résultat escompté (certainement parque la référence x y d'une cellule fusionnée n'existe plus). Mon code (setq tbl (vlax-ename->vla-object (entlast))) (setq A 2) (while (not (= A (+ 2 (length listtab)))); "(+ 2 (length listtab))" est le nombre de ligne (setq B 0) (while (not (<= 6 B)) (If (= (vlax-variant-value (vla-getcellvalue tbl A B))(vlax-variant-value (vla-getcellvalue tbl (+ A 1) B))) (progn (vla-mergecells tbl A (+ A 1) B B);fusion cellule (setq B (+ 1 B)) );fin de progn (setq A (+ 1 A));condition not );fin de if );fin de while );fin de while Voici mon tableau de base :http://img813.imageshack.us/img813/4842/81896045.png Voici le résultat auquel je souhaiterais arrivé :http://img27.imageshack.us/img27/7732/11179306.png Voici le résultat auquel j'arrive :http://img823.imageshack.us/img823/5978/40308041.png Quelqu'un pourrait-il me guider ? Autocad 2021 - Revit 2022 - Windows 10
Patrick_35 Posté(e) le 29 novembre 2010 Posté(e) le 29 novembre 2010 Salut Le plus simple est que tu nous donnes tes listes qui permettent de générer le tableau. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 29 novembre 2010 Posté(e) le 29 novembre 2010 Salut, (setq col -1) (repeat 3 (setq col (1+ col) row 2 next 3 ) (repeat (- (vla-get-Rows tbl) 3) (if (= (vlax-variant-value (vla-getcellvalue tbl row col)) (vlax-variant-value (vla-getcellvalue tbl next col)) ) (progn (vla-mergecells tbl row next col col) (setq next (1+ next)) ) (setq row next next (1+ row) ) ) ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 29 novembre 2010 Posté(e) le 29 novembre 2010 Un petit peu plus rapide : (setq col -1) (repeat 3 (setq col (1+ col) row 2 next 3 ) (repeat (- (vla-get-Rows tbl) 3) (if (= (vlax-variant-value (vla-GetCellValue tbl row col)) (vlax-variant-value (vla-GetCellValue tbl next col)) ) (setq next (1+ next)) (progn (vla-MergeCells tbl row (1- next) col col) (setq row next next (1+ row) ) ) ) ) (vla-MergeCells tbl row (1- next) col col) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
LUDWIG Posté(e) le 29 novembre 2010 Auteur Posté(e) le 29 novembre 2010 Merci pour vos réponses. La liste : (("SARRAT_CLOISONS_VERTICALES" "cloison" 80.0 2700.0 67 208.04) ("SARRAT_CLOISONS_VERTICALES" "cloison" 120.0 2910.0 8 26.78) ("SARRAT_CLOISONS_VERTICALES" "doublage" 40.0 2700.0 61 189.41) ("SARRAT_CLOISONS_VERTICALES" "doublage" 60.0 2700.0 2 6.22) ("SARRAT_CLOISONS_VERTICALES" "doublage" 60.0 3770.0 20 86.72) ("SARRAT_CLOISONS_VERTICALES" "doublage" 80.0 2700.0 11 34.16) ("SARRAT_CLOISONS_PLAFONDS" "cloison" 80.0 2000.0 2.0 4.6) ("SARRAT_CLOISONS_PLAFONDS" "cloison" 80.0 3959.0 6 27.32) ("SARRAT_CLOISONS_PLAFONDS" "cloison" 120.0 2397.0 2 5.52)) Le tableau dwg non mis en forme :http://www.cijoint.fr/cjlink.php?file=cj201011/cij59PmjqD.zip (gile), merci pour le code, je vais l'étudier. Il ne me revoit pas exactement ce que je voudrais : la cellule avec la valeur "80" ne devrait pas fusionner avec la précédente, car les valeurs des 1ere et 2èmes colonnes ne sont pas égales ("sarrat_cloisons_plafond" et "sarrat_cloisons_verticales" et "doublage" et "cloison").http://img225.imageshack.us/img225/889/sanstitrecu.png Question subsidiaire : ou trouve t'on une liste des fonctions accessibles via VLA-... ? Je me souviens l'avoir trouver dans l'aide vba quand le vba était encore fourni avec autocad. Autocad 2021 - Revit 2022 - Windows 10
LUDWIG Posté(e) le 29 novembre 2010 Auteur Posté(e) le 29 novembre 2010 (setq col -1) (repeat 3 (setq col (1+ col) row 2 next 3 ) (repeat (- (vla-get-Rows tbl) 3) (if (= (vlax-variant-value (vla-GetCellValue tbl row col)) (vlax-variant-value (vla-GetCellValue tbl next col)) ) (setq next (1+ next)) (progn (vla-MergeCells tbl row (1- next) col col) [b]; ici, je ne comprends pas pourquoi on fusionne quand la condition est fausse[/b] pourtant ça marche (setq row next next (1+ row) ) ) ) ) (vla-MergeCells tbl row (1- next) col col) ) [Edité le 29/11/2010 par LUDWIG] Autocad 2021 - Revit 2022 - Windows 10
(gile) Posté(e) le 29 novembre 2010 Posté(e) le 29 novembre 2010 ici, je ne comprends pas pourquoi on fusionne quand la condition est fausse pourtant ça marche C'est une astuce pour ne pas fusionner les cellules une par une mais pour fusionner en une seule fois toutes les cellules ayant la même valeur.Tant que la condition est vraie, on ne fait qu'incrémenter next, donc quand la condition est fausse, next a la valeur de l'index de la première rangée où la valeur de la cellule a changé et (1- next) est l'index de la dernière cellule à fusionner. De toutes façons, ce code comme celui d'avant ne répondent pas à ta demande puisqu'ils traitent chaque colonne indépendamment.En fait, si je comprends bien, ce que tu voudrais ressemble à une structure en arborescence, donc je ne vois pas d'autres moyens que de passer par une fonction récursive qui traite les colonnes suivantes en fonction des résultats de la colonne précédente. EDIT: réparation d'un bug noté par LUDWIG ;; Arguments ;; tbl : le tableau (vla-object) ;; row : index de la rangée de départ (indexé sur 0) ;; maxr : index de la dernière rangée à traiter (indexé sur 0) ;; col : index de la colonne de départ (indexé sur 0) ;; maxc : index de la dernière colonne à traiter (indexé sur 0) (defun gc:TableAsTree (tbl row maxr col maxc / next) (setq next (1+ row)) (if (and ( (progn (while (and (= (vlax-variant-value (vla-GetCellValue tbl row col)) (vlax-variant-value (vla-GetCellValue tbl next col)) ) ( ) (setq next (1+ next)) ) (if ( (progn (vla-MergeCells tbl row (1- next) col col) (gc:TableAsTree tbl row (1- next) (1+ col) maxc) ) ) (gc:TableAsTree tbl next maxr col maxc) ) ) ) Pour utiliser la fonction :(gc:TableAsTree tbl 2 (1- (vla-get-Rows tbl)) 0 (1- (vla-get-Columns tbl))) ou trouve t'on une liste des fonctions accessibles via VLA-... ? Je me souviens l'avoir trouver dans l'aide vba quand le vba était encore fourni avec autocad. Si tu as la chance d'avoir encore une version antérieure à 2011, dans l'aide aux développeurs > ActiveX and VBA Reference.Sinon, C'est dans le fichier acadauto.chm (Dossier Help du répertoire d'installation d'AutoCAD). Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
LUDWIG Posté(e) le 29 novembre 2010 Auteur Posté(e) le 29 novembre 2010 Merci BEAUCOUP pour ton aide. C'est une astuce pour ne pas fusionner les cellules une par une mais pour fusionner en une seule fois toutes les cellules ayant la même valeur.Compris ! En fait, si je comprends bien, ce que tu voudrais ressemble à une structure en arborescenceTu as trouvé le mot juste, "arborescence".En fait au début je pensais traiter ma liste directement "en arboresence", mais je me suis renu compte que ça aurait été très compliqué de remplir le tableau. ( ("SARRAT_CLOISONS_VERTICALES" ("cloison" (80.0 (2700.0 (67 208.04) (10 425.25) ) (2910.0 (8 26.78) ) (120.0 etc je ne vois pas d'autres moyens que de passer par une fonction récursive qui traite les colonnes suivantes en fonction des résultats de la colonne précédente. Je savais que ça n'était pas simple, et j'aurais pu peut-être utiliser des if imbriqués sur 3 niveaux (si épaisseur L =épaisseur L-1 ET si type L = type L-1 ET si calque L = calque L-1 alors fusion) Si tu as la chance d'avoir encore une version antérieure à 2011, dans l'aide aux développeurs > ActiveX and VBA Reference.Sinon, C'est dans le fichier acadauto.chm (Dossier Help du répertoire d'installation d'AutoCAD). Tu veux dire que le fichier acadauto.chm d'autocad 2011 contient l'aide du vba ? Autocad 2021 - Revit 2022 - Windows 10
(gile) Posté(e) le 29 novembre 2010 Posté(e) le 29 novembre 2010 Tu veux dire que le fichier acadauto.chm d'autocad 2011 contient l'aide du vba ? Non, toute l'aide concernant VBA (donc COM/ActiveX qui est pourtant utilisable avec tous les langages de programmation supportés par AutoCAD : Visual LISP, .NET et ObjectARX/C++) a été supprimée de l'aide 2011 :mad: Ce que je voulais dire c'est que tu peux peut-être récupérer ce fichier sur un poste ayant encore une version antérieure installée, sinon je peux te l'envoyer (passe moi un MP). Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
LUDWIG Posté(e) le 29 novembre 2010 Auteur Posté(e) le 29 novembre 2010 Je dois avoir ça sur mon poste, j'y ai autocad 2007 à 2011 (faudrait peut être que je fasse le ménage). Merki ! Autocad 2021 - Revit 2022 - Windows 10
(gile) Posté(e) le 29 novembre 2010 Posté(e) le 29 novembre 2010 Chez moi, j'ai créé un raccourci sur le bureau qui pointe vers le fichier acad_dev.chm d'un AutoCAD Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 30 novembre 2010 Posté(e) le 30 novembre 2010 Salut Avec un peu de retard, mais une solution un peu simple et itérative (setq lst '( ("SARRAT_CLOISONS_VERTICALES" "cloison" 80.0 2700.0 67 208.04) ("SARRAT_CLOISONS_VERTICALES" "cloison" 120.0 2910.0 8 26.78) ("SARRAT_CLOISONS_VERTICALES" "doublage" 40.0 2700.0 61 189.41) ("SARRAT_CLOISONS_VERTICALES" "doublage" 60.0 2700.0 2 6.22) ("SARRAT_CLOISONS_VERTICALES" "doublage" 60.0 3770.0 20 86.72) ("SARRAT_CLOISONS_VERTICALES" "doublage" 80.0 2700.0 11 34.16) ("SARRAT_CLOISONS_PLAFONDS" "cloison" 80.0 2000.0 2.0 4.6) ("SARRAT_CLOISONS_PLAFONDS" "cloison" 80.0 3959.0 6 27.32) ("SARRAT_CLOISONS_PLAFONDS" "cloison" 120.0 2397.0 2 5.52) ) de1 2 de2 2 de3 2 lig 2 ) (setq tbl (vlax-ename->vla-object (car (entsel)))) (while (setq tab (nth (- lig 2) lst)) (setq sui (nth (1- lig) lst)) (if (or (/= (car tab) (car sui)) (/= (cadr tab) (cadr sui)) (/= (caddr tab) (caddr sui)) ) (progn (or (eq de3 lig) (vla-mergecells tbl de3 lig 2 2)) (setq de3 (1+ lig)) ) ) (if (or (/= (car tab) (car sui)) (/= (cadr tab) (cadr sui)) ) (progn (or (eq de2 lig) (vla-mergecells tbl de2 lig 1 1)) (setq de2 (1+ lig)) ) ) (if (/= (car tab) (car sui)) (progn (or (eq de1 lig) (vla-mergecells tbl de1 lig 0 0)) (setq de1 (1+ lig)) ) ) (setq lig (1+ lig)) ) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 1 décembre 2010 Posté(e) le 1 décembre 2010 Salut, Effectivement, une solution itérative est possible puisqu'on connait le niveau maximum d'imbrication (3, dans le code de Patrick_35 mais on aurait pu choisir le nombre total de colonnes). Ce sujet m'a donné une idée pour un challenge. 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