Aller au contenu

Messages recommandés

Posté(e)

 

Bonjour à tous,

J'ai trouvé ce lisp de Gile sur ce topic https://cadxp.com/topic/20076-mettre-le-contenu-dun-calque-au-premier-plan/page/2/ qui fonctionne parfaitement, mais j'aimerais l'améliorer pour qu'il cible également les objets situés dans les blocs. Est-ce possible ? Je n'ai pas réussi à créer la boucle pour parcourir tous les blocs sans distinction et mettre les objets situés dans le calque cible au premier plan.

;;; TOP & BOT (gile)
;;; Placer tous les objets du calque de l'objet cible en avant (TOP)
;;; ou en arrière (BOT).
;;;
;;; L'utilisation de la fonction mapcar permet de définir les deux fonctions
;;; dans une seule expression.

(mapcar
 (function
   (lambda (cde fun)
     (eval
(list
  'defun
  cde
  '(/ ent doc sort space ss cnt var)
  '(vl-load-com)
  (list
    'and
    '(setq
      ent
      (car
       (entsel "\nSélectionnez un objet sur le calque cible: ")
      )
     )
    '(setq
      doc
      (vla-get-ActiveDocument (vlax-get-acad-object))
      space
      (if
       (= 1 (getvar 'cvport))
       (vla-get-PaperSpace doc)
       (vla-get-ModelSpace doc)
      )
     )
    '(or
      (not
       (vl-catch-all-error-p
	(setq
	 sort
	 (vl-catch-all-apply
	  'vla-getObject
	  (list
	   (vla-getExtensionDictionary
	    space
	   )
	   "ACAD_SORTENTS"
	  )
	 )
	)
       )
      )
      (setq
       sort
       (vla-addObject
	(vla-getExtensionDictionary
	 space
	)
	"ACAD_SORTENTS"
	"AcDbSortentsTable"
       )
      )
     )
    (list
      'progn
      '(vla-StartUndoMark doc)
      '(setq ss (ssget "_X" (list (assoc 8 (entget ent)))))
      '(setq
	var
	(vlax-make-safearray
	 vlax-vbObject
	 (cons 0 (1- (sslength ss)))
	)
	cnt
	0
       )
      '(vlax-for
	obj
	(setq ss (vla-get-ActiveSelectionSet doc))
	(vlax-safearray-put-element var cnt obj)
	(setq cnt (1+ cnt))
       )
      '(vla-delete ss)
      (list fun 'sort '(vlax-make-variant var))
      '(vla-EndUndoMark doc)
    )
  )
  '(princ)
)
     )
   )
 )
 '(c:top c:bot)
 '(vla-MoveToTop vla-MoveToBottom)
) 

Pouvez-vous m'aiguiller sur la démarche à suivre ?

Je vous remercie d'avance.

 

 

Posté(e)

Salut

les commandes TOP et BOT définies ci-dessous affectent tous les espaces et tous les blocs.

(mapcar
  (function
    (lambda (cde fun)
      (eval
	(list
	  'defun
	  cde
	  '(/ ent doc blocks layer sort lst var)
	  '(vl-load-com)
	  (list
	    'and
	    '(setq
	      ent
	      (car
	       (entsel "\nSélectionnez un objet sur le calque cible: ")
	      )
	     )
	    '(setq
	      doc
	      (vla-get-ActiveDocument (vlax-get-acad-object))
	      blocks
	      (vla-get-Blocks doc)
	      layer
	      (cdr (assoc 8 (entget ent)))
	     )
	    '(not (vla-StartUndoMark doc))
	    (list
	      'vlax-for
	      'b
	      'blocks
	      '(or
		(not
		 (vl-catch-all-error-p
		  (setq
		   sort
		   (vl-catch-all-apply
		    'vla-getObject
		    (list
		     (vla-getExtensionDictionary
		      b
		     )
		     "ACAD_SORTENTS"
		    )
		   )
		  )
		 )
		)
		(setq
		 sort
		 (vla-addObject
		  (vla-getExtensionDictionary
		   b
		  )
		  "ACAD_SORTENTS"
		  "AcDbSortentsTable"
		 )
		)
	       )
	      '(setq lst nil)
	      '(vlax-for
		obj
		b
		(if
		 (= (vla-get-Layer obj) layer)
		 (setq lst (cons obj lst))
		)
	       )
	      (list
		'if
		'lst
		(list
		  fun
		  'sort
		  '(vlax-make-variant
		    (vlax-safearray-fill
		     (vlax-make-safearray
		      vlax-vbObject
		      (cons 0 (1- (length lst)))
		     )
		     lst
		    )
		   )
		)
	      )
	    )
	  )
	  '(vla-EndUndoMark doc)
	  '(vla-regen doc acActiveViewport)
	  '(princ)
	)
      )
    )
  )
  '(c:top c:bot)
  '(vla-MoveToTop vla-MoveToBottom)
)

 

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é