Aller au contenu

Comment retrouver le chemin ou purger des blocs imbriqués


Messages recommandés

Posté(e)

Bjr,

 

J'ai un gros soucis sur un fichier au niveau d'un bloc cartouche.

Je voudrais remplacer ce bloc cartouche présent dans ce fichier par une nouvelle version de ce même bloc cartouche. Pour cela je dois d'abord purger ce bloc avan tde pouroir le remplacer par le nouveau et c'est là que mon problème commence.

J'ai commencé par effacé tous tout mes blocs cartouche présent dans ce fichier et je n'arrive toujours pas à le pruger car il est toujours présent non pas dans les éléments blocs purgeable mais non purgeable.

comment faire pour tenter de purgence ce bloc apparemment imbriqué.

Merci d'avance de vos lumières

 

Phil

Posté(e)

Bjr,

Encore moi, je viens de trouver un lisp de gile mais je trouve pas le code

 

 ;; gc:PurgeBlock
;; Purge les blocs dont le nom correspond au modèle (insensible à la casse)
;;
;; Argument
;; pat : un modèle pour le nom de bloc, accepte les caractères génériques ("*" pour tous)

(defun gc:PurgeBlock (pat / massoc blk name blst loop)
 (vl-load-com)

 (defun massoc	(code alst)
   (if	(setq alst (member (assoc code alst) alst))
     (cons (cdar alst) (massoc code (cdr alst)))
   )
 )

 (while (setq blk (tblnext "BLOCK" (not blk)))
   (if
     (and
(wcmatch (strcase (setq name (cdr (assoc 2 blk)))) (strcase pat))
(< (cdr (assoc 70 (setq elst (entget (tblobjname "BLOCK" name))))) 4)
     )
     (setq blst (cons (cdr (assoc 330 elst)) blst))
   )
 )
 (setq loop T)
 (while (and loop blst)
   (setq loop nil)
   (foreach b blst
     (or (vl-some 'entget (massoc 331 (entget B)))
(progn
  (setq blk (vlax-ename->vla-object B))
  (vlax-for o blk
    (if	(= (vla-get-ObjectName o) "AcDbBlockReference")
      (vla-Delete o)
    )
  )
  (vla-delete blk)
  (setq blst (vl-remove b blst))
  (setq loop T)
)
     )
   )
 )
) 

Posté(e)

Salut,

 

Si la mise à jour de ton cartouche est un fichier, pourquoi ne pas l'insérer en tant que bloc?

C'est un bloc avec attributs et c'est juste le nom d'un responsable service qui est modifié. il faut donc que je remplace tous mes cartouches des fichiers corrspondants.

Ce bloc cartouche est sur une palette d'outils du service au niveau réseau.

Le lisp que j'ai trouvé de gile semblait m'intéresser mais je ne trouve pas le code mon problème

Posté(e)

Salut,

 

Pour cela je dois d'abord purger ce bloc avan tde pouroir le remplacer par le nouveau

 

Comme le dit Steph_DGA, il est inutile de d'effacer et de purger un bloc pour le remplacer par une nouvelle version.

 

J'ajouterais juste que si ton nouveau cartouche est un bloc dans un autre fichier, il te suffit de le transformer en fichier grâce à la commande wbloc (attention à bien préciser qu'il s'agit d'un bloc sinon tu obtiendras 2 bloc imbriqués l'un dans l'autre).

 

Olivier

 

Ne pas tenir compte de ce poste, nos messages se sont croisés.

Posté(e)

Salut,

 

Comme le dit Steph_DGA, il est inutile de d'effacer et de purger un bloc pour le remplacer par une nouvelle version.

 

J'ajouterais juste que si ton nouveau cartouche est un bloc dans un autre fichier, il te suffit de le transformer en fichier grâce à la commande wbloc (attention à bien préciser qu'il s'agit d'un bloc sinon tu obtiendras 2 bloc imbriqués l'un dans l'autre).

 

Olivier

 

Ne pas tenir compte de ce poste, nos messages se sont croisés.

 

J'ai compris ce que vous m'avez dit mais ce cartouche je n'ai pas accés au fichie rd'origine il est sur un menu de palette spécifique à notre service et créé par une personne et mise en réseau. Quand je veux insérer un carouche dans un fichie rx je fais simplement un gissé collé dedu menu de cette palette tout simplement je n'insére pas un wbloc.

 

Je ne sais pas si je me suis bien expliqué

Posté(e)

J'ai compris ce que vous m'avez dit mais ce cartouche je n'ai pas accés au fichie rd'origine il est sur un menu de palette spécifique à notre service et créé par une personne et mise en réseau. Quand je veux insérer un carouche dans un fichie rx je fais simplement un gissé collé dedu menu de cette palette tout simplement je n'insére pas un wbloc.

 

Je ne sais pas si je me suis bien expliqué

 

Ne pas tenir compte de ce poste, nos messages se sont croisés.

 

Si tu n'as pas accès au fichier d'origine, insère le cartouche dans un fichier vierge puis créé un fichier à l'aide d'un wbloc que tu enregistre. Tu pourras ensuite l'insérer.

 

J'espère que cela te conviens.

 

Sinon qu'entends par code ? -> La commande de lacement du lisp ?

 

Le lisp que j'ai trouvé de gile semblait m'intéresser mais je ne trouve pas le code mon problème
Posté(e)

Si tu n'as pas accès au fichier d'origine, insère le cartouche dans un fichier vierge puis créé un fichier à l'aide d'un wbloc que tu enregistre. Tu pourras ensuite l'insérer.

J'espère que cela te conviens.

Slt, merci de ta réponse, c'est ce que j'ai fait sur le principe mais pas tout à fait à 100%. J'ai ouvert un nouveau fichier vierge dans lequel j'ai fait un glissé-collé de mon nouveau cartouche de ma palette spécifique de mon service. Ensuite j'ai fait un copie-collé de mon cartouche de mon autre fichier sur ce nouveau fichier et sécrse dans la nouvelle version. J'ai renommé le bloc de mon ancien cartouche du fichier d'origine imbriqué qu ej ne peux pas purger et j'ai enfin refait un copie-collé du nouveau cartouche de mon fichier vierge sur mon fichier d'origine. C'es tun peu en fait ce que tu indiques j'ai juste renommé mon bloc de mon fichier d'origine tout simplement. Pas vriament simple mais pas compliqué non plus. Je n'ai pas trouvé d'autres solutions pour l'instant.

 

Sinon qu'entends par code ? -> La commande de lacement du lisp ?

Concernant le code c'est la commande de lancement dont je parlais tout à fait. J'ai le lisp mais je ne trouve pas le code de lancement

Posté(e)

Salut,

 

Sauf erreur de ma part, (je suis débutant en lisp) le programme que tu as est une sous routine utilisée par un autre lisp.

Il manque une entrée de variable (pat) fourni par le programme principal.

 

Je ne suis pas d'un très bon niveau en lisp mais si tu peux mettre le lien vers l'endroit où tu l'a récupéré, il doit possible de complèter le lisp.

 

Avis au lispeur...

Posté(e)

[/url]

Salut,

 

Sauf erreur de ma part, (je suis débutant en lisp) le programme que tu as est une sous routine utilisée par un autre lisp.

Il manque une entrée de variable (pat) fourni par le programme principal.

 

Je ne suis pas d'un très bon niveau en lisp mais si tu peux mettre le lien vers l'endroit où tu l'a récupéré, il doit possible de complèter le lisp.

 

Avis au lispeur...

 

Le sujet ou j'ai trouvé ça est sur le lien

 

http://cadxp.com/index.php?/topic/30738-purge-de-bloc-je-cherche-mon-erreur/

Posté(e)

(gile) à écrit une fonction, elle ne peut s'appeler en ligne de commande qu'avec des parenthèses, en plus celle-ci exige un argument pat qui a priori est une chaine de caractères.

 

Exemple présumé d'appel en ligne de commande (sans avoir testé):

(gc:PurgeBlock "Nombloc")

ou

pat : un modèle pour le nom de bloc, accepte les caractères génériques ("*" pour tous)

(gc:PurgeBlock "*")

ou encore par exemple

(gc:PurgeBlock "Nom????")

pour des nom de bloc commencant par nom et complété par 4 caractères quelconque.

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Merci Bonuscad pour ta contribution.

Voici la routine complètée pour fonctionner en commande lisp classique.

 

;; Commande pub
;; purge le bloc nommé
;; ROUTINE  gc:PurgeBlock par (gile)
;;
;; gc:PurgeBlock 
;; Purge les blocs dont le nom correspond au modèle (insensible à la casse) 
;; 
;; Argument 
;; pat : un modèle pour le nom de bloc, accepte les caractères génériques ("*" pour tous) 

(defun gc:PurgeBlock (pat / massoc blk name blst loop) 
 (vl-load-com) 

 (defun massoc (code alst) 
   (if (setq alst (member (assoc code alst) alst)) 
     (cons (cdar alst) (massoc code (cdr alst))) 
   ) 
 ) 

 (while (setq blk (tblnext "BLOCK" (not blk))) 
   (if 
     (and 
       (wcmatch (strcase (setq name (cdr (assoc 2 blk)))) (strcase pat)) 
       (< (cdr (assoc 70 (setq elst (entget (tblobjname "BLOCK" name))))) 4) 
     ) 
     (setq blst (cons (cdr (assoc 330 elst)) blst)) 
   ) 
 ) 
 (setq loop T) 
 (while (and loop blst) 
   (setq loop nil) 
   (foreach b blst 
     (or (vl-some 'entget (massoc 331 (entget B))) 
       (progn 
         (setq blk (vlax-ename->vla-object B)) 
         (vlax-for o blk 
           (if (= (vla-get-ObjectName o) "AcDbBlockReference") 
             (vla-Delete o) 
           ) 
         ) 
         (vla-delete blk) 
         (setq blst (vl-remove b blst)) 
         (setq loop T) 
       ) 
     ) 
   ) 
 ) 
)


;;; COMMANDE PRINCIPALE
(defun c:pub (/ pat)
 (setq pat (getstring "\nIndiquez le nom du bloc :"))
 (gc:PurgeBlock pat)
 (princ)
 )

Posté(e)

Merci Bonuscad pour ta contribution.

Voici la routine complètée pour fonctionner en commande lisp classique.

 

;; Commande pub
;; purge le bloc nommé
;; ROUTINE  gc:PurgeBlock par (gile)
;;
;; gc:PurgeBlock 
;; Purge les blocs dont le nom correspond au modèle (insensible à la casse) 
;; 
;; Argument 
;; pat : un modèle pour le nom de bloc, accepte les caractères génériques ("*" pour tous) 

(defun gc:PurgeBlock (pat / massoc blk name blst loop) 
 (vl-load-com) 

 (defun massoc (code alst) 
   (if (setq alst (member (assoc code alst) alst)) 
     (cons (cdar alst) (massoc code (cdr alst))) 
   ) 
 ) 

 (while (setq blk (tblnext "BLOCK" (not blk))) 
   (if 
     (and 
       (wcmatch (strcase (setq name (cdr (assoc 2 blk)))) (strcase pat)) 
       (< (cdr (assoc 70 (setq elst (entget (tblobjname "BLOCK" name))))) 4) 
     ) 
     (setq blst (cons (cdr (assoc 330 elst)) blst)) 
   ) 
 ) 
 (setq loop T) 
 (while (and loop blst) 
   (setq loop nil) 
   (foreach b blst 
     (or (vl-some 'entget (massoc 331 (entget B))) 
       (progn 
         (setq blk (vlax-ename->vla-object B)) 
         (vlax-for o blk 
           (if (= (vla-get-ObjectName o) "AcDbBlockReference") 
             (vla-Delete o) 
           ) 
         ) 
         (vla-delete blk) 
         (setq blst (vl-remove b blst)) 
         (setq loop T) 
       ) 
     ) 
   ) 
 ) 
)


;;; COMMANDE PRINCIPALE
(defun c:pub (/ pat)
 (setq pat (getstring "\nIndiquez le nom du bloc :"))
 (gc:PurgeBlock pat)
 (princ)
 )

 

Bjr olivier,

Je vois que tu as travaillé hier soir ((rires forts))

J'ai enregistré et insérée la macros et le code ou commande de fonctionnement "pub" ne marche pas.

Tu as essayé la macros ou pas !

Posté(e)

Bonjour Philous2,

 

Je vois que tu as travaillé hier soir ((rires forts))

 

Euh,... 4 bouts de lignes de code niveau débutant c'est pas très long. :D

 

J'ai testé le lancement et il fonctionne. La commande me purge bien le bloc nommé mais seulement s'il est déjà effacé dans le dessin.

 

Je ne suis pas au niveau pour la routine principale de (gile). Donc pour connaître le fonctionnement réelle de la routine et apporter des modifications, tu devrais poster un message dans la rubrique lisp.

 

Olivier

Posté(e)

Bonjour Philous2,

 

Euh,... 4 bouts de lignes de code niveau débutant c'est pas très long. :D

 

J'ai testé le lancement et il fonctionne. La commande me purge bien le bloc nommé mais seulement s'il est déjà effacé dans le dessin.

 

Je ne suis pas au niveau pour la routine principale de (gile). Donc pour connaître le fonctionnement réelle de la routine et apporter des modifications, tu devrais poster un message dans la rubrique lisp.

 

Olivier

 

C'est exacteemment la routine que j'ai enregistrée et chargée sur mon pc avec la commande de fonctionnement "pub".

Chez moi cela ne fonctionne pas à chaque fois que je rentre la commande de la routine pub réponse commande inconnue

j'ai donc un problème quelque part mais ou ! B)

 

;; Commande pub

;; purge le bloc nommé

;; ROUTINE gc:PurgeBlock par (gile)

;;

;; gc:PurgeBlock

;; Purge les blocs dont le nom correspond au modèle (insensible à la casse)

;;

;; Argument

;; pat : un modèle pour le nom de bloc, accepte les caractères génériques ("*" pour tous)

 

(defun gc:PurgeBlock (pat / massoc blk name blst loop)

(vl-load-com)

 

(defun massoc (code alst)

(if (setq alst (member (assoc code alst) alst))

(cons (cdar alst) (massoc code (cdr alst)))

)

)

 

(while (setq blk (tblnext "BLOCK" (not blk)))

(if

(and

(wcmatch (strcase (setq name (cdr (assoc 2 blk)))) (strcase pat))

(< (cdr (assoc 70 (setq elst (entget (tblobjname "BLOCK" name))))) 4)

)

(setq blst (cons (cdr (assoc 330 elst)) blst))

)

)

(setq loop T)

(while (and loop blst)

(setq loop nil)

(foreach b blst

(or (vl-some 'entget (massoc 331 (entget ))

(progn

(setq blk (vlax-ename->vla-object )

(vlax-for o blk

(if (= (vla-get-ObjectName o) "AcDbBlockReference")

(vla-Delete o)

)

)

(vla-delete blk)

(setq blst (vl-remove b blst))

(setq loop T)

)

)

)

)

)

 

 

;;; COMMANDE PRINCIPALE

(defun c:pub (/ pat)

(setq pat (getstring "\nIndiquez le nom du bloc :"))

(gc:PurgeBlock pat)

(princ)

)

Posté(e)

Oups

Problème de copie sur la routine de (gile). J'ignore comment j'ai pu la faire fonctionner hier soir. :blink:

 

Recopie la routine de gile à la place de celle présente dans la routine ci-dessus et le problème sera réglé.

Posté(e)

Oups

Problème de copie sur la routine de (gile). J'ignore comment j'ai pu la faire fonctionner hier soir. :blink:

 

Recopie la routine de gile à la place de celle présente dans la routine ci-dessus et le problème sera réglé.

mais ca ne marchera pas si tu as ajouté des lignes en plus.

la routine de gile ne fonctionnait pas hier ça ne fonctionnera donc pas à nouveau si je rentre le même chose logique.

Je ne comprend pas trop là j'avoue.

Tu devrais en parler à bonuscad il est bon lui je le connais un peu il pourra donner des conseils voir solution au problème, ok.

A +

Phil

Posté(e)
Recopie la routine de gile

Je parlais de la partie écrite par gile (routine que tu as postée initialement).

Je me suis contenté d'ajouter 3 lignes au début (du blabla) et 6 lignes à la fin (lancement de la routine de (gile).

 

Tu trouveras ci-dessous la routine complète corrigée.

 

;; Commande pub 
;; purge le bloc nommé 
;; ROUTINE gc:PurgeBlock par (gile) 
;; 
;; gc:PurgeBlock 
;; Purge les blocs dont le nom correspond au modèle (insensible à la casse) 
;; 
;; Argument 
;; pat : un modèle pour le nom de bloc, accepte les caractères génériques ("*" pour tous) 

(defun gc:PurgeBlock (pat / massoc blk name blst loop) 
(vl-load-com) 

(defun massoc (code alst) 
(if (setq alst (member (assoc code alst) alst)) 
(cons (cdar alst) (massoc code (cdr alst))) 
) 
) 

(while (setq blk (tblnext "BLOCK" (not blk))) 
(if 
(and 
(wcmatch (strcase (setq name (cdr (assoc 2 blk)))) (strcase pat)) 
(< (cdr (assoc 70 (setq elst (entget (tblobjname "BLOCK" name))))) 4) 
) 
(setq blst (cons (cdr (assoc 330 elst)) blst)) 
) 
) 
(setq loop T) 
(while (and loop blst) 
(setq loop nil) 
(foreach b blst 
(or (vl-some 'entget (massoc 331 (entget B))) 
(progn 
(setq blk (vlax-ename->vla-object B)) 
(vlax-for o blk 
(if (= (vla-get-ObjectName o) "AcDbBlockReference") 
(vla-Delete o) 
) 
) 
(vla-delete blk) 
(setq blst (vl-remove b blst)) 
(setq loop T) 
) 
) 
) 
) 
)



;;; COMMANDE PRINCIPALE 
(defun c:pub (/ pat) 
(setq pat (getstring "\nIndiquez le nom du bloc :")) 
(gc:PurgeBlock pat) 
(princ) 
)

Posté(e)

Je parlais de la partie écrite par gile (routine que tu as postée initialement).

Je me suis contenté d'ajouter 3 lignes au début (du blabla) et 6 lignes à la fin (lancement de la routine de (gile).

 

Tu trouveras ci-dessous la routine complète corrigée.

 

;; Commande pub 
;; purge le bloc nommé 
;; ROUTINE gc:PurgeBlock par (gile) 
;; 
;; gc:PurgeBlock 
;; Purge les blocs dont le nom correspond au modèle (insensible à la casse) 
;; 
;; Argument 
;; pat : un modèle pour le nom de bloc, accepte les caractères génériques ("*" pour tous) 

(defun gc:PurgeBlock (pat / massoc blk name blst loop) 
(vl-load-com) 

(defun massoc (code alst) 
(if (setq alst (member (assoc code alst) alst)) 
(cons (cdar alst) (massoc code (cdr alst))) 
) 
) 

(while (setq blk (tblnext "BLOCK" (not blk))) 
(if 
(and 
(wcmatch (strcase (setq name (cdr (assoc 2 blk)))) (strcase pat)) 
(< (cdr (assoc 70 (setq elst (entget (tblobjname "BLOCK" name))))) 4) 
) 
(setq blst (cons (cdr (assoc 330 elst)) blst)) 
) 
) 
(setq loop T) 
(while (and loop blst) 
(setq loop nil) 
(foreach b blst 
(or (vl-some 'entget (massoc 331 (entget B))) 
(progn 
(setq blk (vlax-ename->vla-object B)) 
(vlax-for o blk 
(if (= (vla-get-ObjectName o) "AcDbBlockReference") 
(vla-Delete o) 
) 
) 
(vla-delete blk) 
(setq blst (vl-remove b blst)) 
(setq loop T) 
) 
) 
) 
) 
)



;;; COMMANDE PRINCIPALE 
(defun c:pub (/ pat) 
(setq pat (getstring "\nIndiquez le nom du bloc :")) 
(gc:PurgeBlock pat) 
(princ) 
)

 

 

Ok je suis en WE ce midi (artt)

je verrai cela mardi prochain en début d esemaine e tje te tiendrai au courant.

Bon am et WE

Phil

Posté(e)

Salut,

 

La routine gc:PurgeBlock permet de purger des blocs d'après leur nom (en acceptant les caractères génériques). Son intérêt est de garantir aussi la purge des blocs imbriqués (à conditions qu'ils ne soient pas référencés bien sûr).

 

La routine peut être appelée depuis une autre fonction LISP (une commande définie en LISP, par exemple, comme l'a fait -Olivier-) ou être utilisée directement depuis la ligne commande à condition d'entrer une expression LISP (avec parenthèses) avec l'argument requis à savoir le nom du bloc à purger ou une chaîne contenant des caractères génériques.

 

(gc:PurgeBlock "cartouche") ; purge le bloc "Cartouche" (s'il n'est pas référencé)

(gc:PurgeBlock "*") ; purge tous les blocs non référencés

(gc:PurgeBlock "NIV*") ; purge tous les blocs non référencés dont le nom commence par "niv" (insensible à la casse)

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é