Communauté
AutoCAD – tous produits - Français
Bienvenue sur les forums AutoCAD d’Autodesk. Partagez vos connaissances, posez des questions, et explorez les sujets AutoCAD populaires.
annuler
Affichage des résultats de 
Afficher  uniquement  | Rechercher plutôt 
Vouliez-vous dire : 

création d'un lisp permettant de créer des présentations automatiquement

7 RÉPONSES 7
RÉSOLU
Répondre
Message 1 sur 8
Anonymous
4005 Visites, 7 Réponses

création d'un lisp permettant de créer des présentations automatiquement

bonjour 

je suis actuellement en train de réaliser un lisp permettant de créer des présentations sur autocad automatiquement pour un projet linéaire

pour cela j'insère des blocs (rectangle avec attribut pour nommer les planches)

ces blocs représentent alors la zone visible de la future fenetre d'une présentation.

A chaque bloc inséré se créé une présentation avec sa fenetre par l'intermédiaire d'insertion de gabarit spécifique.

une fenetre se créée alors dans la présentation dans laquel je viens zoomer sur mon bloc(rectangle), remettre à une orientation 0, et zoomer sur le rectangle pour faire correspondre celui ci avec ma fenetre.

 

j'espère avoir été plutot clair..

cependant je n'arrive pas à mettre en place une boucle permettant de récupérer le nom de chaque bloc pour ensuite l'appeler lorsque je zoome dans la fenetre.

 

si quelqu'un peu m'aider ne serait ce qu'un peu cela serait génial..

voici mon lisp détaillé

 

 

(defun c: projet4()

(vl-load-com)

;stockage des variables systèmes qui vont être modifiées

(setq cmd (getvar "cmdecho")
osm (getvar "osmode")
ortho (getvar "orthomode")
attd (getvar "attdia")
)

;modification des variables systèmes
(setvar "cmdecho"1)
(setvar "osmode" 0)
(setvar "orthomode" 0)
(setvar "attdia" 0 )

;saisie du point d'insertion du bloc

(setq pt (getpoint "\nCliquer sur le point d'insertion du bloc rectangle sur l'axe du projet (pt d'insertion situé au milieu du coté gauche du rectangle: "))

; insertion du bloc puis rotation à définir manuellement ou en tapant la valeur grâce au mot "pause" qui donne la main à l'utilisateur

;mise en place d'une variable qui ajoutera 1 à sa valeur

(setq num 1)

;création d'un calque planches encartage

(command "-calque" "e" "planches encartage" "co" 2 "" "")

;commande d'insertion du bloc

(command "inserer" "A0" pt 1 1 pause (strcat "Planche n°" (itoa num)))

;récupération données du bloc

(Setq NomEnt (entlast)) ;nom du précédent objet dessiné

;passage en espace papier

(setvar "tilemode" 0 )

 

;paramétrage de la création des présentations:

(setvar "layoutcreateviewport" 0)

;chargement du gabarit A0 et définir comme présentation courante

(command "_layout" "G" "A0" "PLA0")
(setvar "clayout" "PLA0")

;renommons la présentation

(command "_layout" "R" "PLA0" "Format A0")

;création d'une fenetre dans l'espace d'impression

(command "fmult" "0,0,0" "938,825")

;passage en espace objet dans la fenetre dessinée

(command "espaceo")

;création d'un scu temporaire sur le bloc inséré

(command "scu" "objet" NomEnt )

;recadrage du bloc par rapport à la présentation en définissant le scu créé comme courant

(command "repere" "c")

;zoom sur l'objet dessiné

(command "zoom" "1xp")

; passage en espace papier (sortie de la fenetre)

(command "espacep")

;passage en espace objet

(setvar "tilemode" 1 )

;mise en place d'un cycle(qui ajoute notamment +1 à chaque planche

(while
(setq pt (getpoint "\nPoint d'insertion suivant pour une nouvelle planche (Return pour FIN): "))

(setq num (+ 1 num))

(command "inserer" "A0" pt 1 1 pause (strcat "Planche n°" (itoa num)))

;récupération données du bloc

(Setq NomEnt (entlast)) ;nom du précédent objet dessiné

;choix du bloc suivant

;(setq NomEnt NomEnt)

(setq NomEnt (cons (entlast) NomEnt))

;passage en espace papier

(setvar "tilemode" 0 )

;paramétrage de la création des présentations: 0 pour désactiver la création de fenetre dans une nouvelle présentation

(setvar "layoutcreateviewport" 0)

;chargement du gabarit A0 et définir comme présentation courante

(command "_layout" "G" "A0" "PLA0")
(setvar "clayout" "PLA0")

;renommons la présentation

(command "_layout" "R" "PLA0" "Format A0")

;création d'une fenetre dans l'espace d'impression

(command "fmult" "0,0,0" "938,825")

;passage en espace objet dans la fenetre dessinée

(command "espaceo")

;création d'un scu temporaire sur le bloc inséré

(command "scu" "objet" NomEnt )

;recadrage du bloc par rapport à la présentation en définissant le scu créé comme courant

(command "repere" "c")

;zoom sur l'objet dessiné

(command "zoom" "1xp")

; passage en espace papier (sortie de la fenetre)

(command "espacep")

;passage en espace objet

(setvar "tilemode" 1 )

)

;régénérer

(command "redess")

; remise en état des variables systèmes

(setvar "cmdecho" cmd)
(setvar "osmode" osm)
(setvar "orthomode" ortho)
(setvar "attdia" attd)

)

 

 

merci beaucoup de votre aide

7 RÉPONSES 7
Message 2 sur 8
Anonymous
en réponse à: Anonymous

si quelqu'un pouvait m'aider... c'est un projet de fin d'étude, nous n'avons pas eu beaucoup de cours, je suis bloqué depuis quelque jour..

merci de votre aide.

Message 3 sur 8
_gile
en réponse à: Anonymous

Salut,

 

Première chose, déclare tes variables localement, ça t'évitera des erreurs difficiles à localiser.

par exemple, quand tu fais : (setq NomEnt (cons (entlast) NomEnt)), tu ajoutes le ename de la dernière entité créée à une liste. si la variable NomEnt n'est pas déclarée localement (elle est donc globale) la liste reste en mémoire dans le dessin après que ton LISP ait terminé son exécution, et si tu le relance, la liste continuera de se remplir.

 

De toute façon, l'erreur que je vois vient de là. Dans un premier temps tu affectes à la variable NomEnt un nom d'entité (type ENAME) avec (entlast) puis dans la boucle, tu changes le type de valeur de la variable  avec (cons ...) et en fais une liste (type LIST). Ensuite, tu essayes de te servir de te servir de cette variable avec la commande SCU option Objet qui attend un nom d'entité et pas une liste, ce qui devrait immanquablement provoquer une erreur.

 

Si tu utilises l'éditeur Visual LISP d'AutoCAD, ce que je te recommande fortement, tu peux faire un "pas à pas" soit en évaluant les expressions une par une dans l'éditeur ; soit en plaçant un point d'arrêt dans ton code et en utilisant le "pas à pas" de fonctions de débogage (F8). Ceci te permettra de localiser les erreurs, d'interroger les valeurs de variables et ainsi de corriger tes erreurs.

 

Je te recommande la lecture du document : Introduction à AutoLISP.



Gilles Chanteau
Programmation AutoCAD LISP/.NET
GileCAD
GitHub

Message 4 sur 8
Anonymous
en réponse à: _gile

je te remercie de ton aide pour ces précieux conseils.

 

Message 5 sur 8
Anonymous
en réponse à: Anonymous

ton cours est très utile cependant j'ai un dernier soucis concernant la récupération des noms d'entités.

penses tu qu'il est possible de récupérer les sous entités d'un bloc, je m'explique, mon bloc contient un attribut et deux rectangles.

lorsque je récupère le nom du bloc avec entlast et que je l'appelle lorsque je génère un scu temporaire dans ma fenetre, il vient se placer sur mon point d'insertion du bloc.

j'aimerai si c'est possible récupérer le nom d'un des rectangles pour m'enservir pour le SCU.

peut t'on y arriver avec les fonctions assoc et entnext? 

en récupérant quel code DXF?

 

merci de ton aide

Message 6 sur 8
_gile
en réponse à: Anonymous

Salut,

 

Non, ce n'est pas possible avec entnext. si tu appelles la fonction entnext en lui passant une référence de bloc comme argument, la fonction retourne uniquement les référence d'attribut (si le bloc en a).

 

Il faut bien comprendre qu'une référence de bloc n'est qu'une représentation géométrique de la défintion du bloc. Seule la définition du bloc contient des entités, les références de bloc ne peuvent avoir, comme sous entités, que des références d'attributs.

 

Il y aurait un moyen avec la fonction nentsel ou plutôt avec nentselp. ces fonctions permettent de retrouver l'entité dans la définition du bloc, mais sa suppose de transformer l'entité de la définiton du bloc (définie dans les coordonnées du bloc) avec la matrice de transformation de la référence de bloc (qui est dans la liste retournée par nentselp). Ceci est assez compliqué en AutoLISP (à moins que tu sois à l'aise en transformations linéaires et calcul matriciel) et à peine plus simple avec les fonctions Visual LISP.

 

Mais comme tu connais la géométrie de ton bloc, il est certainement plus facile de partir du point d'insertion du bloc et de déterminer la position des sommets du rectangle en fonction de la rotation du bloc et des éventuelles échelles en X et Y (tu trouves tout ça dans la liste DXF du bloc) :

(setq bloc    (entlast)
      dxfList (entget bloc)
      insPt   (cdr (assoc 10 dxfList))
      scaleX  (cdr (assoc 41 dxfLst))
      scaleY  (cdr (assoc 42 dxfLst))
      rotat   (cdr (assoc 50 dxfList))
)

 Ensuite avec la fonction polar, et les dimensions connues du rectangle dans la définition du bloc c'est assez facile de replacer des points dans l'espace objet.

Par exemple un point qui serait en (12 0 0) dans la défintion du bloc sera en:

(polar insPt rotat (* 12 scaleX))

Un point qui serait en (0 8 0) sera en :

(polar insPt (+ rotat (* pi 2)) (* 8 scaleY))

 



Gilles Chanteau
Programmation AutoCAD LISP/.NET
GileCAD
GitHub

Message 7 sur 8
Anonymous
en réponse à: _gile

merci pour votre aide, j'ai réussi à faire ce que je voulais ainsi qu'une boite de dialogue dcl.

Celle ci fonctionne mais j'essai de mettre un place un test de lancement du programme qui lui ne marche pas.

j'aimerai pouvoir dire que si je lance le programme avec le bouton ok, il ne se lance que si et seulement si j'ai coché les radio-buttons présents dans ma boite de dialogue et m'indiquer par un message d'alert si ce n'est pas le cas.

pour ma part j'ai mis en place trois boxed-column oû  je dois effectuer un choix pour chacune pour pouvoir ensuite  lancer le programme par le bouton ok.

 

pouvez vous m'expliquer par quel procédé puis je y arriver ?

 

merci de votre aide

 

Message 8 sur 8
_gile
en réponse à: Anonymous

Salut,

 

D'après les souvenir que j'ai en DCL, si tu places tes radio_button dans un boxed_radio_column ou un boxed_radio_row, un bouton du conteneur sera coché par défaut (le premier, à moins que tu spécifies la propriété value="1"; pour un autre bouton dans le fichier DCL).

Ceci facilite aussi la façon de récupérer quel bouton a été coché : la propriété value du boxed_radio_column ou du boxed_radio_row contient la clé du radio_button coché.

 

 



Gilles Chanteau
Programmation AutoCAD LISP/.NET
GileCAD
GitHub

Vous n'avez pas trouvé ce que vous recherchiez ? Posez une question à la communauté ou partagez vos connaissances.

Publier dans les forums  

Autodesk Design & Make Report