-Olivier- Posté(e) le 13 novembre 2014 Posté(e) le 13 novembre 2014 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
(gile) Posté(e) le 13 novembre 2014 Posté(e) le 13 novembre 2014 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
-Olivier- Posté(e) le 13 novembre 2014 Auteur Posté(e) le 13 novembre 2014 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
lecrabe Posté(e) le 14 novembre 2014 Posté(e) le 14 novembre 2014 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
Goldorak44 Posté(e) le 14 novembre 2014 Posté(e) le 14 novembre 2014 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 CharlesDeveloppeur Revit, RV/RA - Formateur RevitPIRO CIE
-Olivier- Posté(e) le 14 novembre 2014 Auteur Posté(e) le 14 novembre 2014 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
Patrick_35 Posté(e) le 14 novembre 2014 Posté(e) le 14 novembre 2014 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 lstpps : non testé @+ 1 Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
-Olivier- Posté(e) le 14 novembre 2014 Auteur Posté(e) le 14 novembre 2014 Merci Patrick35, Je regarde ça.Je vais encore perdre quelques cheveux mais je veux comprendre comment ça marche. Olivier
VDH-Bruno Posté(e) le 14 novembre 2014 Posté(e) le 14 novembre 2014 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 ;) ) 1 Apprendre => Prendre => Rendre
Patrick_35 Posté(e) le 14 novembre 2014 Posté(e) le 14 novembre 2014 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 ...) @+ 1 Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
VDH-Bruno Posté(e) le 14 novembre 2014 Posté(e) le 14 novembre 2014 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) 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
-Olivier- Posté(e) le 14 novembre 2014 Auteur Posté(e) le 14 novembre 2014 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) 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. :)
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant