Aller au contenu

Messages recommandés

Posté(e)

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

Posté(e)

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

Posté(e)

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

Posté(e)

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

Posté(e)

(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

Posté(e)

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

Posté(e)

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 arborescence

Tu 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

Posté(e)

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

Posté(e)

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

Posté(e)

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

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

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é