Aller au contenu

Legende, quantité automatique selon le nom du bloc.


Messages recommandés

Bonjour les gros bras du Dév !

 

il semble impossible de pouvoir automatiser la quantités de bloc dans une cellule d'un tableau pour une légende.

Le "champ" permet de de toruver le nom du bloc, pourquoi ne peux t'il pas trouver le quantité de bloc dans l'objet?

 

 

post-76190-0-47999500-1590568530_thumb.png

 

 

Je suis preneur si vous avez une illumination :)

 

Amicalement votre.

Lien vers le commentaire
Partager sur d’autres sites

  • 2 mois après...

Hello,

 

Alors personnellement je peux te proposer ce qui va suivre.

 

Il faut parcourir le dessin et compter le nombre de fois que tu as ton blocs et enfin remplir ton tableau.

met ça en fonction :

 

tu pourras boucler sur tous tes nom de blocs

ca va te donner des listes

 

 

 

Function NB_BLOC(NOM_BLOC)
For i = 0 To ThisDrawing.ModelSpace.Count - 1
       Set entity = ThisDrawing.ModelSpace.Item(i)
       NOMCALQUE = entity.Layer
       If entity.ObjectName = "AcDbBlockReference" Then
         Set blocref = entity
            if blocref.effectivename = NOM_BLOC then
               cp1 = cp1 + 1
            else
            end if
next i
NB_BLOC = cp1

 

et ensuite la table

 


sub remplir_tableau
...
'Remplir une table en bouclant sur la function
...

   Point = ThisDrawing.Utility.GetPoint(, "Selectionner l'endroit où implanter la table ")
   
   NBLIGNE =  NB_BLOC_TOTAL + 1 'Pour le titre de ton champ)
   NBCOL = 3 'nombre de colonne
   Dim MyModelSpace As AcadModelSpace
   Set MyModelSpace = ThisDrawing.ModelSpace
   Set MT = MyModelSpace.AddTable(Point, NBLIGNE, NBCOL, H_LIGNE, L_COLONNE) 'H_LIGNE Hauteur de la ligne / L_COLONNE la largeur de la colonne
   
  On Error Resume Next
   MT.Layer = "0"
   MT.Layer = Calque
   MT.StyleName = "Standard"
   MT.StyleName = STYLE_TABLE
   On Error GoTo 0

   MT.SetText 0, 0, "TON TITRE"
   MT.SetText 1, 0, "NOM"
   MT.SetText 1, 1, "QTE"
   MT.SetText 1, 1, "BLOC"

'Tu fais une boucle pour remplir le tableau en fonction de ta table:

L = 'ta ligne
C = 'ta colonne

   MT.SetText L,C,VALEUR  'et tu remplis avec les corrdonnées


Lien vers le commentaire
Partager sur d’autres sites

J'avais fait ca, il y a longtemps...

sur une base de tabloblo

 

 


(defun c:tablobloc ()

       ;(/ libloc liidbloc ss col liref ptins tableVL cont row)

 (vl-load-com)
 (setq liblkdescrip nil cont nil libloc nil liref nil)

 (or *acdoc*

     (setq *acdoc* (vla-get-ActiveDocument (vlax-get-acad-object)))

     )

 (prompt "\nSélectionnez les blocs à lister ou <Toute la collection>")

 (or (setq ss (ssget '((0 . "INSERT"))))

     (setq ss	(ssget "_X" '((0 . "INSERT")))

   	col	T

   	)

     )

 (if ss

   (progn

     (vlax-for	x

       (setq

         ss	(vla-get-ActiveSelectionSet *acdoc*)

         )

(or (vlax-property-available-p x 'Path)

   	(setq liref

       (cons

         (if (vlax-property-available-p x 'EffectiveName)

           (vla-get-EffectiveName x)

           (vla-get-Name x)

           )

         liref

         )

  	)

   	)

)

     (vla-delete ss)

     )

   )

 (if col

   (vlax-for i     (vla-get-Blocks *acdoc*)

     (if (and (not (wcmatch (setq name (vla-get-Name i)) "`**,*|*"))

          (= :vlax-false (vla-get-IsXref i))

          )

(setq libloc   (append libloc (list (vla-get-name i)));(vla-get-name i)

     	liidbloc (append liidbloc (list (vla-get-ObjectID i)))
     
     	)

)

     )

   (setq libloc   (remove_doubles liref)
 	
	;liblkdescrip (remove_doubles liblkdescrip)
 	liidbloc (mapcar

         '(lambda (x)

		(vla-get-ObjectID

	  	(vla-item

	    	(vla-get-Blocks *acdoc*)

	    	x

	    	)

	  	)

		)

         libloc

         )

 	)

   )

 (initget 1)

 (setq ptins (trans (getpoint "\nPoint d'insertion: ") 1 0))

 (setq	tableVL	(vla-addtable

  	(vla-get-modelspace

    	(vla-get-activedocument (vlax-get-acad-object))

    	)

  	(vlax-3d-point ptins)

  	(+ 2 1 (length libloc))

  	4  ;3

  	20 ; Hauteur cellule

  	80 ; Largeur cellule

  	)

)

 (vla-put-VertCellMargin tableVL 4.0) ; Marge verticale

 (vla-put-TitleSuppressed tableVL :vlax-false)

 (vla-put-HeaderSuppressed tableVL :vlax-false)

 (vla-setText tableVL 0 0 "Blocs") ; Titre

 (vla-setText tableVL 1 0 "Nom du bloc ") ; Titre colonne 1

 (vla-setText tableVL 1 1 "Description") ; Titre colonne 2

 (vla-setText tableVL 1 2 "Nombre") ; Titre colonne 3

 (vla-setText tableVL 1 3 "Symbole")

 (setq	cont -1

row  1

)

 (repeat (- (vla-get-Rows tableVL) 2)

   (vla-settext

     tableVL

     (setq row (1+ row))

     0

     (setq nombl (nth (setq cont (1+ cont)) libloc))

     )
;;;;;;;;;;;;;;;;;;   	description

   (vla-settext

     tableVL

     row

     1
	
(cdr(assoc 4 (tblsearch "BLOCK" nombl)))
     )

   (vla-settext

     tableVL

     row

     2
     (length (vl-remove-if-not

	'(lambda (n) (= n (nth cont libloc)))

	liref

	)

     	)

     )

   (vla-SetBlockTableRecordId

     tableVL

     row

     3

     (nth cont liidbloc)

     :vlax-true

     )

   (vla-setcellalignment tableVL row 0 5)

   (vla-setcellalignment tableVL row 1 5)

   )

 (princ)

 )






;;; REMOVE_DOUBLES - Suprime tous les doublons d'une liste



(defun REMOVE_DOUBLES (lst)

(if lst

(cons (car lst) (REMOVE_DOUBLES (vl-remove (car lst) lst)))

)

)



 

Vous fîtes ce que vous pûtes

et vous m'épatâtes !!!!

Lien vers le commentaire
Partager sur d’autres sites

Hello

 

Voici une Super Routine "ListBlock" du Grand Maitre Gilles !

 

Je l utilise pour faire des "jolis" quantitatifs et aussi faire des "jolies" legendes (en supprimant la colonne des quantites) ...

 

A ameliorer pour traiter et rentrer dans les Reseaux Associatifs rectangulaire / polaire-circulaire / trajectoire (qui ne sont pas traités) afin de recuperer les vrais noms de blocs utilises ! Et les inclure dans le quantitatif genere ...

 

Ces réseaux associatifs sont en fait des sortes de blocs anonymes, un peu comme les blocs dynamiques...

 

LA SANTE (Stay Safe), Bye, lecrabe "triste"

Automne 2020, la retraite

 


;; 
;; https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/lisp-table/m-p/7822698#M365879
;; 
;; Routine: ListBlock par GC
;; 
;; Table des Blocs : Nom , Nombre , Graphisme du Bloc
;; 
;; 
;; Voir aussi ce sujet par GC :
;; https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/block-in-table/m-p/7827274#M366031
;; 
;; To be clearer, you can set the text height bay row type:
;; Only data rows (bit 1)
;; (vla-SetTextHeight table 1 height)
;; Only title row (bit 2)
;; (vla-SetTextHeight table 2 height)
;; Only header row (bit 4)
;; (vla-SetTextHeight table 1 height)
;; You can also combinate this, e.g. for the entire table (+ 1 2 4):
;; (vla-SetTextHeight table 7 height)
;; 

;;;;; 
;;;;;  Hauteur des Textes dans la Table = 5.0 ;;;;; 
;;;;;  (vla-SetTextHeight table 7 5.0)
;;;;; 


(defun c:ListBlock (/ ss name block blocks insPt table row)
 (vl-load-com)
 (or *acdoc*
     (setq *acdoc* (vla-get-ActiveDocument (vlax-get-acad-object)))
 )
 (or *blocks*
     (setq *blocks* (vla-get-Blocks *acdoc*))
 )

 ;; Select blocks
 (prompt "\nSelect blocks to list or <All>")
 (or (setq ss (ssget '((0 . "INSERT"))))
     (setq ss (ssget "_X" '((0 . "INSERT")))
     )
 )
 (if ss
   (progn

     ;; Build a list of dotted pairs (blockName . numberOfReferences) from the selection set
     (vlax-for	x (setq ss (vla-get-ActiveSelectionSet *acdoc*))
(if (not (vlax-property-available-p x 'Path))
  (setq	name   (vla-get-EffectiveName x)
	blocks (if (setq block (assoc name blocks))
		 (subst (cons name (1+ (cdr block))) block blocks)
		 (cons (cons name 1) blocks)
	       )
  )
)
     )
     (vla-delete ss)

     ;; Prompt for insertion point
     (initget 1)
     (setq insPt (trans (getpoint "\nInsertion point: ") 1 0))

     ;; Create the table
     (setq table (vla-addtable
	    (vla-get-modelspace *acdoc*)
	    (vlax-3d-point insPt)
	    (+ 2 (length blocks)) ; number of rows (including title and header)
	    3			; number of colums
	    20			; cell height
	    80			; row width
	  )
     )
     (vla-put-VertCellMargin table 4.0)
     (vla-put-TitleSuppressed table :vlax-false)
     (vla-put-HeaderSuppressed table :vlax-false)

     ;; Fill the titel and the header
;     (vla-setText table 0 0 "Blocks")
;     (vla-setText table 1 0 "Name")
;     (vla-setText table 1 1 "Count")
;     (vla-setText table 1 2 "Symbol") 

     ;; Textes version Francaise
     (vla-setText table 0 0 "Quantitatif des Blocs")
     (vla-setText table 1 0 "Nom")
     (vla-setText table 1 1 "Nombre")
     (vla-setText table 1 2 "Symbole") 

;;;;; Hauteur des Textes dans la Table = 5.0 ;;;;; 
(vla-SetTextHeight table 7 5.0)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 

     ;; fill the following rows from the list contents
     (setq row 2)
     (foreach item blocks
(vla-settext table row 0 (car item)) ; block name
(vla-settext table row 1 (cdr item)) ; references count
(vla-SetBlockTableRecordId	; block symbol
  table
  row
  2
  (vla-get-ObjectId (vla-Item *blocks* (car item)))
  :vlax-true
)
(setq row (1+ row))
     )
   )
 )
 (princ)
)

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Bonjour les gros bras du Dév !

 

il semble impossible de pouvoir automatiser la quantités de bloc dans une cellule d'un tableau pour une légende.

Le "champ" permet de de toruver le nom du bloc, pourquoi ne peux t'il pas trouver le quantité de bloc dans l'objet?

 

 

post-76190-0-47999500-1590568530_thumb.png

 

 

Je suis preneur si vous avez une illumination :)

 

Amicalement votre.

 

Salut,

Sinon, sans Lisp, tu peux aussi, faire un tableau avec l'extraction de données. Tu pourras le mettre à jour lorsque tu copieras ou ajouteras les blocs que tu souhaites quantifier.

Là, tu as de quoi faire, avec ou sans Lisp wink.gif

Steven________________________________________

Pour le taf; Windows (et ses emmerdes) sinon pas d'AutoCAD.

Pour le perso Linux Mint et pas de problèmes. Mais pas d'AutoCAD.

En rêve; AutoCAD sous Linux.

Lien vers le commentaire
Partager sur d’autres sites

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é