Aller au contenu

ArrayCount - Comptabiliser les objets dans les RESEAUX


Messages recommandés

Posté(e)

Coucou,

Pour ceux que chat intéresse, je poste ci-dessous une routine permettant de comptabiliser le nombre d'objets présents dans chaque réseaux sélectionnés et d'en faire une rapide synthèse dans l'historique de commandes. Les améliorations évidentes seraient d'insérer un tableau de synthèse composé de champs dynamiques lié aux réseaux mais j'ai préféré faire simple (et court !). Le décompte des objets se base sur le nombre de rangées, colonnes et niveaux des réseaux (rectangulaire, polaire et trajectoire) tout en prenant en compte le nombre d'objets sources et d'objets supprimés (lorsqu'on sélectionne un réseau, puis en maintenant la touche CTRL enfoncée, on sélectionne les références d'un réseau pour ensuite supprimer ces références. Permettant de supprimer des objets dans un réseau sans avoir besoin de le décomposer). Pour ceux ne connaissant pas cette option pour avoir des réseaux en mode gruyère : AutoDesk - Présentation des réseaux (Je n'ai pas osé prendre en compte l'option de remplacer une référence par une autre de manière ponctuelle)
Programme :

(defun c:ARRAYCOUNT (/ Array-Def jsel i n name lst Array ent r c l s ent-list o-list)

	(defun Array-Def (name / get-DXF-value i ent Array-Properties Array-Definition Array-ItemList ItemList ent-lst lst n p)

		(defun get-DXF-value (entlist code n)

			(while 	(and (setq entlist (member (assoc code entlist) entlist))
				     (> (setq n (1- n)) 0)
				)
				(setq entlist (cdr entlist))
			)
			(if (and entlist
				 (= n 0)
			    )
				(cdr (assoc code entlist))
			)

		)

		(if (and (= (cdr (assoc 0 (entget name))) "INSERT")
			 (wcmatch (getpropertyvalue name "Classname") "AcDbAssociative*Array")
		    )
			(progn
				(setq Array-properties (entget (cdr (assoc 330 (entget (cdr (assoc 330 (entget name)))))))
				      Array-ItemList (entget (cdr (assoc 360 Array-Properties)))
				      i (get-DXF-value Array-ItemList 90 4)
				)
				(while (setq Array-ItemList (member '(100 . "AcDbAssocArrayItem") Array-ItemList))
					(setq n (strcat
							(itoa (get-DXF-value Array-ItemList 90 2))
							","
							(itoa (get-DXF-value Array-ItemList 90 3))
							","
							(itoa (get-DXF-value Array-ItemList 90 4))
						)
					      p (cond
							((= (logand (get-DXF-value Array-ItemList 90 5) 1) 1) 0)
							((= (logand (get-DXF-value Array-ItemList 90 5) 8) 8) 1)
						)
					      ItemList (cons (cons n p) ItemList)
					      Array-ItemList (cdr Array-ItemList)
					)
				)
				(setq Array-definition (tblsearch "BLOCK" (cdr (assoc 2 (entget (cdr (assoc -2 (tblsearch "BLOCK" (cdr (assoc 2 (entget name))))))))))
				      ent (cdr (assoc -2 Array-Definition))
				      lst (list	(cons "TotalObject" (apply '+ (mapcar 'cdr ItemList)))
						(cons "ColumnSpacing" (cdr (assoc 40 (member '(1 . "ItemSpacing") Array-Properties))))
						(cons "Columns" (cdr (assoc 90 (cdddr (member '(1 . "Items") Array-Properties)))))
						(cons "RowSpacing" (cdr (assoc 40 (member '(1 . "RowSpacing") Array-Properties))))
						(cons "Rows" (cdr (assoc 90 (cdddr (member '(1 . "Rows") Array-Properties)))))
						(cons "LevelSpacing" (cdr (assoc 40 (member '(1 . "LevelSpacing") Array-Properties))))
						(cons "Levels" (cdr (assoc 90 (cdddr (member '(1 . "Levels") Array-Properties)))))
					  )
				)
				(while ent
					(setq ent-lst (cons ent ent-lst)
					      ent (entnext ent)
					)
				)
				(setq lst (append lst (list (cons 90 (length ent-lst)) (cons 330 ent-lst))))
			)
		)
		lst

	)

	(if (or (setq jsel (ssget "_I" '((0 . "INSERT") (2 . "`*U*"))))
		(setq jsel (ssget '((0 . "INSERT") (2 . "`*U*"))))
	    )
		(progn
			(repeat (setq n 0 i (sslength jsel))
				(setq name (ssname jsel (setq i (1- i))))
				(if (wcmatch (getpropertyvalue name "Classname") "AcDbAssociative*Array")
					(progn
						(setq lst (cons (cons (setq n (1+ n)) (setq Array (Array-Def name))) lst)
						      r (cdr (assoc "Rows" Array))
						      c (cdr (assoc "Columns" Array))
						      l (cdr (assoc "Levels" Array))
						      s (cdr (assoc 90 Array))
						      o-list (cons (list (cdr (assoc "TotalObject" Array)) s) o-list)
						      ent-list (mapcar '(lambda (ent)
										(cond
											((and (= (cdr (assoc 0 (entget ent))) "INSERT")
											      (not (wcmatch (getpropertyvalue ent "Classname") "AcDbAssociative*Array"))
											 )
												(cons (getpropertyvalue ent "BlockTableRecord/Name") (cdr (assoc 8 (entget ent))))
											)
											(t
												(cons (cdr (assoc 0 (entget ent))) (cdr (assoc 8 (entget ent))))
											)
										)
									)
									(cdr (assoc 330 Array))
								)
						)
						(prompt (strcat "\n||==================================================||"
								"\nRéseau n°"
								(itoa n)
								(cond ((wcmatch (getpropertyvalue name "Classname") "AcDbAssociativeRectangularArray") " (Rectangulaire)")
								      ((wcmatch (getpropertyvalue name "Classname") "AcDbAssociativePolarArray") " (Polaire)")
								      ((wcmatch (getpropertyvalue name "Classname") "AcDbAssociativePathArray") " (Trajectoire)")
								      (t "")
								)
								" :"
								"\n     Nombre d'objets total = "
								(itoa (cdr (assoc "TotalObject" Array))) "u / " (itoa (* r c l)) "u"
								"\n     Nombre de rangées = "
								(itoa r) " u"
								" (Espacement = "
								(rtos (cdr (assoc "RowSpacing" Array)) 2 2)
								" m)"
								"\n     Nombre de colonnes = "
								(itoa c) " u"
								" (Espacement = "
								(rtos (cdr (assoc "ColumnSpacing" Array)) 2 2)
								" m)"
								"\n     Nombre de niveaux = "
								(itoa l) " u"
								" (Espacement = "
								(rtos (cdr (assoc "LevelSpacing" Array)) 2 2)
								" m)"
								"\n     Nombre d'objets source = "
								(itoa s) " u"
								"\n  Composition de la source du réseau :"
								(apply 'strcat (mapcar '(lambda (x) (strcat "\n     "
													    (if (not (= 0 (setq ent (- (length ent-list) (length (setq ent-list (vl-remove (car ent-list) ent-list)))))))
														(strcat (itoa ent)
															" \""
															(car x)
															"\" sur le calque \""
															(cdr x)
															"\"."
														)
													    	""
													   )
												    )
											)
										        ent-list
										)
								)
							)
						)
					)
					(ssdel name jsel)
				)
			)
			(prompt (strcat "\n||==================================================||"
					"\nSynthèse des "
					(itoa n)
					" réseaux sélectionnés :"
					"\n     Nombre d'objets total = "
					(itoa (apply '+ (mapcar 'car o-list))) " u"
					"\n     Nombre d'objets global (avec sources) = "
					(itoa (apply '+ (mapcar '(lambda (x) (apply '* x)) o-list))) " u"
					"\nSe référer au détail de chaque réseau pour la répartition des objets et des objets sources."
				)
			)
		)
	)
	(princ)		 

)

Exemple de rendu :

||==================================================||
Réseau n°1 (Rectangulaire) :
     Nombre d'objets total = 297u / 297u
     Nombre de rangées = 9 u (Espacement = 1.64 m)
     Nombre de colonnes = 33 u (Espacement = 1.06 m)
     Nombre de niveaux = 1 u (Espacement = 1 m)
     Nombre d'objets source = 1 u
  Composition de la source du réseau :
     1 "LWPOLYLINE" sur le calque "0".
||==================================================||
Réseau n°2 (Rectangulaire) :
     Nombre d'objets total = 244u / 297u
     Nombre de rangées = 9 u (Espacement = 1.64 m)
     Nombre de colonnes = 33 u (Espacement = 1.06 m)
     Nombre de niveaux = 1 u (Espacement = 1 m)
     Nombre d'objets source = 1 u
  Composition de la source du réseau :
     1 "LWPOLYLINE" sur le calque "0".
||==================================================||
Réseau n°3 (Rectangulaire) :
     Nombre d'objets total = 24u / 24u
     Nombre de rangées = 2 u (Espacement = 1.64 m)
     Nombre de colonnes = 4 u (Espacement = 1.06 m)
     Nombre de niveaux = 3 u (Espacement = 1 m)
     Nombre d'objets source = 1 u
  Composition de la source du réseau :
     1 "LWPOLYLINE" sur le calque "0".
||==================================================||
Réseau n°4 (Rectangulaire) :
     Nombre d'objets total = 8u / 8u
     Nombre de rangées = 2 u (Espacement = 1.64 m)
     Nombre de colonnes = 4 u (Espacement = 1.06 m)
     Nombre de niveaux = 1 u (Espacement = 1 m)
     Nombre d'objets source = 6 u
  Composition de la source du réseau :
     4 "CIRCLE" sur le calque "0".
     2 "CIRCLE" sur le calque "0".
||==================================================||
Réseau n°5 (Rectangulaire) :
     Nombre d'objets total = 8u / 8u
     Nombre de rangées = 2 u (Espacement = 1.64 m)
     Nombre de colonnes = 4 u (Espacement = 1.06 m)
     Nombre de niveaux = 1 u (Espacement = 1 m)
     Nombre d'objets source = 1 u
  Composition de la source du réseau :
     1 "LWPOLYLINE" sur le calque "0".
||==================================================||
Réseau n°6 (Polaire) :
     Nombre d'objets total = 47u / 60u
     Nombre de rangées = 1 u (Espacement = 2.43 m)
     Nombre de colonnes = 60 u (Espacement = 0.1 m)
     Nombre de niveaux = 1 u (Espacement = 1 m)
     Nombre d'objets source = 6 u
  Composition de la source du réseau :
     4 "CIRCLE" sur le calque "0".
     2 "CIRCLE" sur le calque "0".
||==================================================||
Réseau n°7 (Trajectoire) :
     Nombre d'objets total = 74u / 91u
     Nombre de rangées = 1 u (Espacement = 2.35 m)
     Nombre de colonnes = 91 u (Espacement = 2.83 m)
     Nombre de niveaux = 1 u (Espacement = 1 m)
     Nombre d'objets source = 6 u
  Composition de la source du réseau :
     4 "CIRCLE" sur le calque "0".
     2 "CIRCLE" sur le calque "0".
||==================================================||
Synthèse des 7 réseaux sélectionnés :
     Nombre d'objets total = 702 u
     Nombre d'objets global (avec sources) = 1347 u
Se référer au détail de chaque réseau pour la répartition des objets et des objets sources.

Travaillant dans le domaine du photovoltaïque, l'utilisation des réseaux est très courante, d'où la création de cette commande. Bien que assez spécifique, elle peut s'avérer utile pour les utilisateurs de réseaux et les développeurs qui aimeraient un peu mieux comprendre où chercher les infos 🙂 (encore un grand merci à @(gile) pour m'avoir montrer où chercher btw !)

PS : j'ai également une version permettant de faire le décompte des réseaux présents dans des blocs mais j'ai estimé que ces cas étaient assez rares pour justifier son utilisation quotidienne.

Bisous,
Luna

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é