LUDWIG Posté(e) le 27 septembre 2005 Posté(e) le 27 septembre 2005 Bonjour, J'essaye de me mettre au Visual Lisp. J'ai modifié ce code là qui supprime tous les points d'un dessin (même dans les blocs) pour faire un programme qui met à toutes les polylignesune épaisseur constante de 0. Mon programme fonction, mais je ne suis pas sûr de comprendre le raisonnemement du code. Si quelqu'un pouvait me le commenter. Merci. (defun c:effpt () (vl-load-com) (setq a (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))) (vlax-for bl a (vlax-for ent bl (if (= (vla-get-objectname ent) "AcDbPoint") (vla-delete ent) ) ) ) (vla-regen (vla-get-activedocument (vlax-get-acad-object)) acActiveViewport) ) Autocad 2021 - Revit 2022 - Windows 10
(gile) Posté(e) le 27 septembre 2005 Posté(e) le 27 septembre 2005 Salut, Je vais essayer, je débute aussi en VisualLISP. (vl-load-com) Charge les fonctions ActiveX (il semble que ce ne soit plus indipensable depuis la version 2004) (setq a (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))) Attribue à "a" la collection de blocs du document actif de l'objet application AutoCAD. (vlax-for bl a(vlax-for ent bl(if (= (vla-get-objectname ent) "AcDbPoint")(vla-delete ent)))) les deux (vlax-for ...) sont des fonctions itératives imbriquées pour soumettre toutes les entités (y compris celles contenues dans les blocs) à la conditionnelle (if ...) et les effacer si la réponse est "True". Un peu comme le ferait un (mapcar ...) pour une liste. (vla-regen (vla-get-activedocument (vlax-get-acad-object)) acActiveViewport) Régénère la fenêtre active du document actif de l'objet application AutoCAD. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
LUDWIG Posté(e) le 28 septembre 2005 Auteur Posté(e) le 28 septembre 2005 Merci (gile) J'avais réussi à trouver dans la doc que vlax-get-acad-object est un pointeur vers l'application autocad et vla-get-activedocument un pointeur vers le document actif, et qu'il faut à chaque fois lancer cette procédure. Mais je ne comprenais pas le vla-get-blocks, vu qu'elle n'est pas directement expliquée dans l'aide. C'est donc la collection de blocs... Maintenant, je ne comprends pas vraiment la syntaxe des 2 vlax-for, même si je comprends le if imbriqué (en gros, si l'objet est un point alors je l'efface). Comment foncionne donc le vlax-for ? Ce qui me gêne, c'est que les arguments qui suivent le vlax-for sont des variables qui valent nil au début. Je me trompe ? Autocad 2021 - Revit 2022 - Windows 10
(gile) Posté(e) le 28 septembre 2005 Posté(e) le 28 septembre 2005 Salut, J'apprends en même temps que toi. L'aide nous dit :(vlax-for symbol collection [expression1 [expression2 ...]]) Le premier argument (bl) est donc un symbole -comme n dans (foreach n ....)- et le second (a) la collection de blocs. L'expression à évaluer est un nouveau vlax-for qui evalue le if pour toutes les entités (ent) de chaque bloc (bl). Il me semble que la comparaison vlax-for / foreach n'est pas trop mauvaise, avec des collections à la place de listes. Je ne comprends pas bien à quel niveau sont les entités "point" non contenues dans les blocs sont évaluées. [Edité le 28/9/2005 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 28 septembre 2005 Posté(e) le 28 septembre 2005 Je ne comprends pas bien à quel niveau sont les entités "point" non contenues dans les blocs sont évaluées J'ai trouvé :P : La collection de blocs du document actif contient 2 blocs spéciaux ModelSpace Collection et PaperSpace Collection qui contiennent toutes les entités des espaces objet et papier. Donc, l'imbrication des deux vlax-for permet d'accéder à toutes les entités contenues dans tous les blocs du document actif (y compris les 2 blocs spéciaux). Sinon, les commandes vla-... ne sont pas documentées dans l'aide à "AutoLISP Functions" mais dans "ActiveX and VBA Reference" sans les préfixe vla- ou vla-get- ou vla-put ... Si tu travailles dans l'éditeur VisualLISP, sélectionner un nom de commande dans la fenêtre active et cliquer sur l'icone avec un "?" dans un phylactère ouvre directement l'aide à la page concernée. En espérant avoir répondu à ta demande. À plus ... [Edité le 28/9/2005 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 28 septembre 2005 Posté(e) le 28 septembre 2005 SalutLa comparaison au niveau du vlax-for et du foreach est excellente pour la compréhension sauf que c'est une table/collection que l'on parcoure et pas une listeLe vla-get-blocks pointe sur la table des blocks, ce qui revient en gros à un (tblnext "block")Faites un (vlax-dump-object (vla-item a 2)) pour trouver les caractéristiques d'un blocLe 2em vlax-for est pour parcourir les entités qui composent le bloc Un exemple en autolisp(setq a (tblnext "block" t)) (while a (setq b (cdr (assoc -2 a)) tot 0) (while b (setq b (entget b) tot (1+ tot)) (setq b (entnext (cdr (assoc -1 b)))) ) (princ (strcat "\nLe bloc " (cdr (assoc 2 a)) " contient " (itoa tot) " entité(s)")) (setq a (tblnext "block")) ) (princ)Le même en vlisp(setq a (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))) (vlax-for bl a (setq tot 0) (vlax-for ent bl (setq tot (1+ tot)) ) (princ (strcat "\nLe bloc " (vla-get-name bl) " contient " (itoa tot) " entité(s)")) ) (princ) ps : le post aurait plus indiqué dans la rubrique vlisp ;) Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
LUDWIG Posté(e) le 28 septembre 2005 Auteur Posté(e) le 28 septembre 2005 Oui c'est vrai, j'aurais dû changer de rubrique. Désolé :exclam: Merci pour la comparaison à Foreach. Je comprends bcp mieux maintenant. J'aivais en tête un "for X to Z" dans lequel aon aurait été obligé de renseigné les 2 arguments. C'est intéressant de considéré que toute entité est inclue dans un bloc (paperspace au minimum). Du coup je comprends impeccablement ce lisp. Je vais pouvoir me lancer à en faire d'autre. Autocad 2021 - Revit 2022 - Windows 10
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