Aller au contenu

Messages recommandés

Posté(e)

Bonjour à tous,

J'aurai besoin de modifier le code suivant pour que le programme ne modifi que les blocs de l'espace objet.

 

;;;Commande SHA : supprime les hachures de type solid à l'intérieur des blocs
;;;Par -Olivier- le 18/03/2013
;;;D'après commande DRW de Patrick35 du 06/02/2013
;;;http://cadxp.com/index.php?/topic/37045-faire-passer-les-hachures-en-second-plans-dans-un-bloc/page__p__202861__hl__ordre__fromsearch__1#entry202861
(defun c:sha(/ blo doc ent) 
 (setq doc (vla-get-activedocument (vlax-get-acad-object))) 
 (vla-startundomark doc) 
 (vlax-for blo (vla-get-blocks doc) 
   (and (eq (vla-get-islayout blo) :vlax-false) 
     (vlax-for ent blo 
       (and (and (eq (vla-get-objectname ent) "AcDbHatch")
  	(= (vla-get-patternname ent) "SOLID")
    	) 	
         (vla-delete ent) 
       ) 
     ) 
   ) 
 ) 
 (vla-endundomark doc)
 (vla-regen doc acAllViewports)
 (princ) 
)

 

Si une bonne âme pouvais m'expliquer comment faire...

En grand merci par avance.

 

Olivier

Posté(e)

Salut,

 

Je crains que ce que tu demandes ne soit pas possible.

 

Ce LISP agit sur les définitions de bloc par conséquent, toutes les références, qu'elles soient insérées dans l'espace objet, dans un espace papier ou dans un autre définition de bloc (bloc imbriqué) sont affectées par les modifications faites dans les définitions.

 

Ce que tu demandes serait de supprimer les hachures et les solides 2d uniquement dans les références insérées dans l'espace objet sans affecter celles contenues dans les espaces papier. Ceci est antinomique avec la notion même de bloc AutoCAD qui veut que les blocs insérés dans le dessin ne soient que des références au même groupe d'entités contenues dans la définition du bloc.

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

Posté(e)

Tout d'abord merci pour te réponse.

Je pensais juste qu'il était possible de vérifier qu'une définition de bloc avait une plusieurs références dans l'espace objet.

Du coup est t'il possible de ne pas modifier seulement quelques définitions de blocs dont les noms est indiqués dans le code ?

 

Olivier

Posté(e)

Hello

 

Vu de loin, j'imagine un contournement assez simple (avec une routine Lisp/VLisp):

1) Dans l'espace Objet, une routine qui demande ancien nom de bloc et nouveau nom de bloc

2) Copie des INSERT ancien_bloc vers INSERT nouveau_bloc (Avec les MEMEs : XYZ, ScaleXYZ, calque, style, hauteur, elevation, forcage eventuel : couleur, type de ligne, epaisseur, transparence, etc)

3) Suppression des anciens noms de bloc (de l'onglet Objet)

4) Passage de la routine SHA sur les nouveaux noms de bloc

 

Qu'en pensez vous ?

Bon d'accord, a la sortie : on a DEUX Noms de Bloc !

 

Bye, lecrabe

Autodesk Expert Elite Team

Posté(e)

Je me demande si j'ai bien compris ta demande. Tu souhaite vérifier si le bloc est présent dans l'espace objet ou dans l'espace papier et s'il n'est présent QUE dans l'espace objet alors on modifie sa définition ?

PIRO Charles

Developpeur Revit, RV/RA - Formateur Revit

PIRO CIE

Posté(e)

Je ne l'ai pas précisé au début, mais les blocs que je ne souhaite pas modifier sont présent uniquement dans les présentations.

Donc pas besoin de faire des doublons. Pour le moment je me débrouilles pour lancer la routine dans un fichier à part.

Je peux aussi faire une liste des noms de blocs à ne pas modifier dans le code.

 

Olivier

Posté(e)

Salut

 

Un exemple pour lister les blocs qui sont dans les présentations

(defun lstblpre(/ doc ent lst nom nombl sel)

 (defun nombl(bl)
   (if (vlax-property-available-p bl 'effectivename)
     (vla-get-effectivename bl)
     (vla-get-name bl)
   )
 )

 (setq doc (vla-get-activedocument (vlax-get-acad-object)))
 (and (ssget "x" (list (cons 0 "insert") (cons 67 1)))
   (progn
     (vlax-for ent (setq sel (vla-get-activeselectionset doc))
(or (vl-position (setq nom (nombl ent)) lst)
  (setq lst (cons nom lst))
)
     )
     (vla-delete sel)
   )
 )
 lst
)

 

Et à remplacer dans le lisp

(and (eq (vla-get-islayout blo) :vlax-false) 
 (vlax-for ent blo 
   (and (eq (vla-get-objectname ent) "AcDbHatch")
 (= (vla-get-patternname ent) "SOLID")
     (vla-delete ent) 
   ) 
 ) 
)

 

Par

(or (eq (vla-get-islayout blo) :vlax-true) 
   (vl-position (vla-get-name blo) lst)
 (vlax-for ent blo 
   (and (eq (vla-get-objectname ent) "AcDbHatch")
 (= (vla-get-patternname ent) "SOLID")
     (vla-delete ent) 
   ) 
 ) 
)

 

ps : il reste juste à intégrer dans le lisp la fonction lstblpre (liste blocs présentations) et ranger le résultat de la fonction dans la variable lst

pps : non testé

 

@+

  • Upvote 1

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Bonjour Olivier,

 

Je ne l'ai pas précisé au début, mais les blocs que je ne souhaite pas modifier sont présent uniquement dans les présentations.

 

Visiblement et comme d'habitude Patrick_35 à été le plus rapide..

Je poste quant même ma version qui modifie les définitions de bloc ayant au moins une référence de bloc inséré dans le model objet.

 

;; Suppression des hachures dans les définitions de bloc ayant au moins une référence
;; dans l'espace objet

(defun c:sham (/ doc blo ss bl lst i)
 (setq doc (vla-get-activedocument (vlax-get-acad-object)))
 (vla-startundomark doc)
 (setq blo (vla-get-blocks doc))

 ;; Sélection des références de bloc de l'espace objet
 (setq ss (ssget "X" '((0 . "INSERT") (410 . "Model"))))

 ;; Lister les noms des définitions de bloc issue des références sélectionnés
 (repeat (setq i (sslength ss))
   (and (not (member (setq bl (cdr (assoc 2 (entget (ssname ss (setq i (1- i))))))) lst))
        (setq lst (cons bl lst))
   )
 )

 ;; Adaptation du lisp sha pour fonctionner par Item a lieu d'opérer sur toute la collection
 (foreach x lst
   (vlax-for ent (vla-Item blo x)
     (and (and (eq (vla-get-objectname ent) "AcDbHatch") (= (vla-get-patternname ent) "SOLID"))
          (vla-delete ent)
     )
   )
 )

 (vla-endundomark doc)
 (vla-regen doc acAllViewports)
 (princ)
)

 

Cordialement Bruno

(Ps: Tu devrais perdre moins de cheveux sur cette version ;) )

  • Upvote 1

Apprendre => Prendre => Rendre

Posté(e)

Salut Bruno

 

Je poste quant même ma version qui modifie les définitions de bloc ayant au moins une référence de bloc inséré dans le model objet.

Oui, mais si le bloc est aussi dans une présentation ?

 

(Ps: Tu devrais perdre moins de cheveux sur cette version ;) )

Du moment qu'il ne fini pas comme Vincent Lagaf :D

 

ps : dommage d'avoir deux and qui se suivent ;)

pps : (and (not ...)) = (or ...)

 

@+

  • Upvote 1

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Salut Patrick_35

 

Oui, mais si le bloc est aussi dans une présentation ?

Il sera traité car il existe aussi en model objet, je rappel que ceux qui ne doivent pas être traité son uniquement présent dans les présentations (dixit Olivier) :rolleyes:

 

ps : dommage d'avoir deux and qui se suivent ;)

J'ai honteusement copier-collé, j'avoue… <_<

 

 

pps : (and (not ...)) = (or ...)

+1 Oui et 3 fois oui, totalement d'accord avec ça :D

 

A+

Apprendre => Prendre => Rendre

Posté(e)

Il sera traité car il existe aussi en model objet, je rappel que ceux qui ne doivent pas être traité son uniquement présent dans les présentations (dixit Olivier) :rolleyes:

 

Tout à fait, je vais décortiquer vos différente versions pour voir comment tout cela fonctionne. Je patauge en Vlisp mais je m'accroche. Adieu à ma chevelure de rêve. :(rires forts):

 

Olivier

 

Encore merci à vous 2. :)

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é