Aller au contenu

Calques imbriqués dans des blocs


rrobert

Messages recommandés

Bonjour, 

 

J'ai des vieux calques qui sont imbriqués dans des vieux blocs que j'utilise encore.

J'aimerai supprimer ces calques car ils ont été remplacés par des nouveaux, mais ils sont utilisés dans des blocs créés il y a longtemps et je ne sais plus quels objets de quels blocs sont sur ces vieux calques.

 

Existe-t-il un moyen de savoir dans quels objets/blocs un calque est utilisé?

Ou un moyen de changer de calque tous les objets du dessin, y compris ceux qui sont dans des blocs.

 

Merci pour vos réponses,

 

Rémi

Lien vers le commentaire
Partager sur d’autres sites

hello

pas d'idée pour savoir quel calque est utilisé où mais la fonction FUSCALQUES doit pouvoir te rendre des services...

++

Phil

PS : les rêgles de l'art voudraient que tous les objets d'un bloc soit sur le calque 0 avec des caractéristiques égales à dubloc

  • Upvote 1

Projeteur Revit Indépendant - traitement des eaux/CVC

Lien vers le commentaire
Partager sur d’autres sites

Je prends bonne note et essaierai dès que possible.

 

Bien d'accord pour le 0, c'est ce que je fais pour tous mes blocs "simples".

 

Seulement j'ai certains blocs plus complexes où j'imbrique davantage d'éléments dessus afin de gagner du temps.

 

Ainsi un bloc pourra contenir une chaudière (calque chaudière), une attente électrique (calque elec), des départs EFS, ECS, chauffage, ainsi qu'une indication de texte (calque texte).

 

Je n'ai donc qu'une opération à réaliser pour copier tous ces éléments sur mon plan, et lorsque je le souhaite, je gèle les calques voulus pour faire disparaitre les éléments indésirables, notamment dans les fenêtre de présentation.

 

Du coup ça implique d'avoir un calque pour le bloc, et dans le bloc chaque objet a son propre calque.

 

Rémi

Lien vers le commentaire
Partager sur d’autres sites

Salut,

Tu peux essayer ce LISP (commande : REMPLCALQUE).

;;; GetLayer (gile) 03/11/07
;;; Retourne le nom du calque entré ou choisi par l'utilisateur 
;;; dans une liste déroulante de la boite de dialogue ou en sélectionnant
;;; un objet à l'écran.
;;; Argument : le titre (string) ou nil (défaut : "Choisir un calque")

(defun getlayer	(titre / lay lst tmp file what_next dcl_id nom)
  (while (setq lay (tblnext "LAYER" (not lay)))
    (setq lst (cons (cdr (assoc 2 lay)) lst))
  )
  (setq	lst  (acad_strlsort lst)
	tmp  (vl-filename-mktemp "Tmp.dcl")
	file (open tmp "w")
  )
  (write-line
    (strcat
      "getlayer:dialog{label="
      (cond (titre (vl-prin1-to-string titre))
	    ("\"Choisir un calque\"")
      )
      ";initial_focus=\"tp\";
      :boxed_column{:row{
      :column{:text{label=\"Sélectionner un objet\";alignment=left;}}
      :column{:button{label=\">>\";key=\"obj\";alignment=right;fixed_width=true;}
      spacer;}}
      :edit_box{key=\"tp\";edit_width=25;allow_accept=true;}
      :popup_list{key=\"lay\";edit_width=25;}
      spacer;}ok_cancel;}"
    )
    file
  )
  (close file)
  (setq dcl_id (load_dialog tmp))
  (setq what_next 2)
  (while (>= what_next 2)
    (if	(not (new_dialog "getlayer" dcl_id))
      (exit)
    )
    (start_list "lay")
    (mapcar 'add_list lst)
    (end_list)
    (or	nom
	(setq nom (vlax-ldata-get "getLayer" "n"))
	(setq nom (vlax-ldata-put "getLayer" "n" "0"))
    )
    (if	(member nom lst)
      (set_tile	"lay"
		(itoa (- (length lst) (length (member nom lst))))
      )
      (set_tile "lay" "0")
    )
    (set_tile "tp" nom)
    (action_tile "obj" "(done_dialog 3)")
    (action_tile "tp" "(setq nom $value)")
    (action_tile
      "lay"
      (strcat
	"(if (or (= $reason 1) (= $reason 4))"
	"(progn"
	"(setq nom (nth (atoi $value) lst))"
	"(set_tile \"tp\" (nth (atoi $value) lst))"
	"(mode_tile \"tp\" 2)))"
       )
    )
    (action_tile
      "accept"
      (strcat
	"(if (tblsearch \"LAYER\" nom)"
	"(progn (done_dialog 1)"
	"(vlax-ldata-put \"getLayer\" \"n\" nom))"
	"(progn"
	"(alert (strcat \"Le calque \" nom \" est introuvable.\"))"
	"(setq nom nil) (set_tile \"tp\" (vlax-ldata-get \"getLayer\" \"n\"))"
	"(mode_tile \"tp\" 2)))"
       )
    )
    (setq what_next (start_dialog))
    (cond
      ((= what_next 3)
       (if (setq nom (car (entsel)))
	 (setq nom (cdr (assoc 8 (entget nom))))
	 (setq nom nil)
       )
      )
      ((= what_next 0)
       (setq nom nil)
      )
    )
  )
  (unload_dialog dcl_id)
  (vl-file-delete tmp)
  nom
)

(vl-load-com)
(or *acad* (setq *acad* (vlax-get-acad-object)))
(or *acdoc* (setq *acdoc* (vla-get-ActiveDocument *acad*)))
(or *blocks* (setq *blocks* (vla-get-Blocks *acdoc*)))

;; REMPLCALQUE
;; Remplace l'ancien calque par le nouveau pour tous les objets du dessin.
(defun c:REMPLCALQUE (/ *error* old new)
  (defun *error* (msg)
    (and msg
	 (/= msg "Fonction annulée")
	 (prompt (strcat "\nErreur: " msg))
    )
    (vla-EndUndoMark *acdoc*)
    (princ)
  )
  (if
    (and
      (setq old (getLayer "Ancien calque"))
      (setq new (getLayer "Nouveau calque"))
      (/= old new)
    )
     (progn
       (vla-StartUndoMark *acdoc*)
       (vlax-for b *blocks*
	 (vlax-for o b
	   (if (= (vla-get-Layer o) old)
	     (vla-put-layer o new)
	   )
	 )
       )
       (vla-regen *acdoc* acActiveViewport)
       (*error* nil)
     )
  )
)

 

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Coucou,

 

La commande FUSCALQUE fonctionne parfaitement bien en effet ce qui permet par exemple de passer les anciens calques sur les récents ou bien de les fusionner sur le calque "0". Il existe une méthode beaucoup plus..."bourrine" mais avec une perte de données : SUPCALQUE. A utiliser avec précaution car cette commande supprime définitivement le calque, peu importe ce qu'il y a dessus. Donc si le but c'est de supprimer un calque (et donc les objets situés dessus), c'est parfait ! Sinon, FUSCALQUE permet de "sauvegarder" les éventuels objets sur un autre calque. Mais aucunes de ces méthodes permettent d'aller à la pêche aux informations malheureusement donc si tu veux faire un traitement manuel des objets pour soit les sauvegarder dans un autre calque, soit les supprimer, il faudra créer un programme :3

3 choix possibles donc :

1°) Supprimer définitivement un calque et ses occupants (purge complète) -> SUPCALQUE

2°) Supprimer définitivement un calque en sauvegardant ses occupants sur un autre -> FUSCALQUE

3°) Repérer les occupants d'un calque pour traitement manuel -> (à créer)

4°) La réponse D ^^

Je te laisse faire ton choix :3

 

Bisous,

Luna

Lien vers le commentaire
Partager sur d’autres sites

37 minutes ago, Olivier Eckmann said:

Bonjour,

 

Il me semble que depuis AutoCAD 2020, la commande purger à évoluer pour afficher (onglet "non purgeable") la raison de "non purgeabilité" d'un objet (par exemple un calque) en indiquant où il est utilisé (dans un bloc par ex).

 

Olivier

 

Mon Dieu c'est magique !!

J'étais sur LT2016 depuis longtemps, ça a vraiment du bon les nouvelles versions...

J'ai retrouvé le bloc coupable en 2 secondes, mille mercis Olivier !

 

 

 

Merci Luna, je vais FUSCALQUES car je souhaite garder mes éléments.

Mais je garde SUPCALQUE sous le coude 😉

 

 

10 minutes ago, Luna said:

Coucou,

 

La commande FUSCALQUE fonctionne parfaitement bien en effet ce qui permet par exemple de passer les anciens calques sur les récents ou bien de les fusionner sur le calque "0". Il existe une méthode beaucoup plus..."bourrine" mais avec une perte de données : SUPCALQUE. A utiliser avec précaution car cette commande supprime définitivement le calque, peu importe ce qu'il y a dessus. Donc si le but c'est de supprimer un calque (et donc les objets situés dessus), c'est parfait ! Sinon, FUSCALQUE permet de "sauvegarder" les éventuels objets sur un autre calque. Mais aucunes de ces méthodes permettent d'aller à la pêche aux informations malheureusement donc si tu veux faire un traitement manuel des objets pour soit les sauvegarder dans un autre calque, soit les supprimer, il faudra créer un programme :3

3 choix possibles donc :

1°) Supprimer définitivement un calque et ses occupants (purge complète) -> SUPCALQUE

2°) Supprimer définitivement un calque en sauvegardant ses occupants sur un autre -> FUSCALQUE

3°) Repérer les occupants d'un calque pour traitement manuel -> (à créer)

4°) La réponse D ^^

Je te laisse faire ton choix :3

 

Bisous,

Luna

 

 

Merci du Lisp GILE, je t'avoue que je vais m'en tenir à la purge pour le moment.

 

Bonne journée à toutes et à tous,

 

Rémi

 

 

Lien vers le commentaire
Partager sur d’autres sites

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • 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é