Aller au contenu

VLISP


LUDWIG

Messages recommandés

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 polylignes

une é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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

Salut

La 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 liste

Le 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 bloc

Le 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 Patrick

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

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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é