Aller au contenu

Insertion de blocs via DCL+Lisp !?!


Guigues

Messages recommandés

Bonjour tout le monde.

 

Je profite de mes congés pour me lancer dans l'apprentissage de la programmation en Lisp + interface avec fichiers DCL.

 

Si qqun peut prendre 2 minutes pour m'expliquer ce qui cloche dans mes tentatives je pourrai continuer l'exercice !

 

Mon but était de lier une boite dcl à un choix entre différents blocs à insérer. Le codage du fichier DCL semble ok mais je bloque dans le fichier Lisp après l'attribution d'une valeur à la variable "choix".

 

Le but est d'insérer le bloc "blocA.dwg" si je choisis le bloc A ou le "blocB.dwg" si je choisis le bloc B....

 

Je débute et je pense que cela se voit !

 

Fichier DCL (B2D.DCL) :

 


B2D : dialog {
     label = "MENU PERSO" ;

   : boxed_radio_column {
     label = "Blocs" ;	

   : radio_button {
     key = "BA" ;
     label = "Bloc A" ;
     value = "1" ;
     }

   : radio_button {
     key = "BB" ;
     label = "Bloc B" ;
     }

     
     }

     ok_cancel ;

     : paragraph {
     : text_part {
     label = "GUIGUES ENVT" ;
     }
     }
     }

 

Fichier LISP (B2D.Lsp) :

 

(defun C:B2D ()

 (setq dcl_id (load_dialog "B2D.dcl"))

 (if (not (new_dialog "B2D" dcl_id))(exit))

	(action_tile "BA" "(setq Choix \"1\")")

	(action_tile "BB" "(setq Choix \"2\")")

	(action_tile "accept" "(done_dialog) (setq userclik T)")

	(action_tile "cancel" "(done_dialog) (setq userclik nil)")

(start_dialog)

(unload_dialog dcl_id)

(If userclick

 (progn

   (If (= choix 1)
     (progn
     (command "-inserer" "BlocA" "1" "1" "0")
   )
 )

   (If (= choix 2)
     (progn
     (command "-inserer" "BlocB" "1" "1" "0")
     )
   )

 )
)

(princ)

)

 

Merci beaucoup (d'avance) à celui qui aura la patience de répondre !

 

P.S : coucou usegomme !

 

[Edité le 14/8/2009 par Guigues]

Lien vers le commentaire
Partager sur d’autres sites

Salut Guigues,

 

l'erreur est dans le (command "-inserer"):

il y a dans l'ordre:

- nom du bloc

- position (point 3D => '(0.0 0.0 0.0) par ex

- échelle X

- échelle Y

- angle de rotation

 

il te manque le point d'insertion,

l'échelle en X et Y ceux sont des réels donc pas de ""

et pour l'angle idem

 

Tous pour lisp, Lisp pour tous!

Avec Revit, cela ne vas trop vite...

Lien vers le commentaire
Partager sur d’autres sites

J'oubliais, tu fais un (setq choix \"X\") => donc choix vaudra "X" et non X

 

pour compléter le lisp, moi je mettrai un cond:

(cond
((= userclick nil)
 	; annulé
)

((= choix "1")
 	(command "-inserer" "BlocA" '(0.0 0.0 0.0) 1 1 0)
)

((= choix "2")
 	(command "-inserer" "BlocB" '(0.0 0.0 0.0) 1 1 0)
)
)

Tous pour lisp, Lisp pour tous!

Avec Revit, cela ne vas trop vite...

Lien vers le commentaire
Partager sur d’autres sites

J'ai "fabriqué" un lisp de "formatage" de plan avec initialisation de variables et insertion de blocs il y a pas mal de temps et j'utilisai la même construction sans probleme !

 

Je reviens sur le soucis de mon lisp ... le chargement du lisp et du DCL se font sans probleme mais lors de l'execution je ne dépasse pas la fermeture du DCL .... la boucle IF > Action = inserer un bloc ne se lance pas....

 

Si la commande "insérer" se lancait, je pense qu'un message d'erreur interviendrait dans le processus.

 

 

 

 

Lien vers le commentaire
Partager sur d’autres sites

J'ai "fabriqué" un lisp de "formatage" de plan avec initialisation de variables et insertion de blocs il y a pas mal de temps et j'utilisai la même construction sans probleme !

 

Je reviens sur le soucis de mon lisp ... le chargement du lisp et du DCL se font sans probleme mais lors de l'execution je ne dépasse pas la fermeture du DCL .... la boucle IF > Action = inserer un bloc ne se lance pas....

 

Si la commande "insérer" se lancait, je pense qu'un message d'erreur interviendrait dans le processus.

 

justement, les deux (if (= choix ...) ) ne marchent pas à cause de la réponse donnée plus haut

Tous pour lisp, Lisp pour tous!

Avec Revit, cela ne vas trop vite...

Lien vers le commentaire
Partager sur d’autres sites

Je suis une quiche :P , il faut inverser le (setq userclick t) et le (done_dialog)

 

car le done_dialog t'éjectes de la dcl et tout le code qui suit dans les " " ne sera pas exécuté

 

et il y a erreur de frappe pour la variable userclick != userclik

 

de plus, il faut initialiser choix au début, car si l'utilisateur ne cliques que sur ok,

choix ne vaut rien ou une valeur non valide

 

[Edité le 14/8/2009 par bseb67]

Tous pour lisp, Lisp pour tous!

Avec Revit, cela ne vas trop vite...

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Là il y a des guillemets :

(action_tile "BA" "(setq Choix \"1\")")

 

Et là il n'y en a pas :

(If (= choix 1)

 

je mettrai plutôt

(If (= choix "1")

Aide au téléchargement du cadastre dgfip-download-helper
Insertion de photos géolocalisées exif https://www.dropbox.com/s/gkf6o9ac2hxen97/exifscr.zip?dl=0
Script correction BUG SPDC V2, propriétaire département 21 et 22 : https://greasyfork.org/scripts/442400-spdcv2/code/SPDCV2.user.js

Lien vers le commentaire
Partager sur d’autres sites

Avec cette syntaxe ça marche :

(defun C:B2D ()
 (setq Choix 1)
 (setq dcl_id (load_dialog "B2D.dcl"))

 (if (not (new_dialog "B2D" dcl_id))(exit))

	(action_tile "BA" "(setq Choix 1)")

	(action_tile "BB" "(setq Choix 2)")

	(action_tile "accept" "(setq userclik T) (done_dialog)")

	(action_tile "cancel" "(setq userclik nil) (done_dialog)")

(start_dialog)

(unload_dialog dcl_id)


(cond
((= userclik nil)
 	; annulé
)

((= choix 1)
 	(command "-inserer" "BlocA" "0,0" 1 1 0)
)

((= choix 2)
 	(command "-inserer" "BlocB" "0,0" 1 1 0)
)
)

(princ)

)

Aide au téléchargement du cadastre dgfip-download-helper
Insertion de photos géolocalisées exif https://www.dropbox.com/s/gkf6o9ac2hxen97/exifscr.zip?dl=0
Script correction BUG SPDC V2, propriétaire département 21 et 22 : https://greasyfork.org/scripts/442400-spdcv2/code/SPDCV2.user.js

Lien vers le commentaire
Partager sur d’autres sites

Guigues,

 

Au delà des corrections faites ci-dessus, tu peux simplifier ton code :

Si tu donnes une clé au contrôle boxed_radio_column, un get_tile sur cette clé retourne la clé du radio_button activé.

Si tu donnes comme clé aux radio_button les noms des blocs tu peux directement attribuer ceux ci à une variable (result).

Il suffit ensuite de faire cette attribution dans une expression action_tile sur le contrôle accept pour récupérer le nom du bloc et contrôler si l'utilisateur a cliqué OK ou Annuler (à condition de déclare la variable result pour qu'elle soit remise à nil à chaque lancement de la routine.

 

Le code DCL :

B2D : dialog {
 label = "MENU PERSO" ;
 : boxed_radio_column {
   label = "Blocs" ;
   key = "bloc" ;
   : radio_button {
     key = "BlocA" ;
     label = "Bloc A" ;
     value = "1" ;
   }
   : radio_button {
     key = "BlocB" ;
     label = "Bloc B" ;
   }
 }
 ok_cancel ;
 : text {
   label = "GUIGUES ENVT" ;
 }
}

 

Le LISP :

(defun C:B2D (/ dcl_id result ins)
 (setq dcl_id (load_dialog "B2D.dcl"))
 (if (not (new_dialog "B2D" dcl_id))
   (exit)
 )
 (action_tile "accept" "(setq result (get_tile\"bloc\")) (done_dialog)")
 (start_dialog)
 (unload_dialog dcl_id)
 (if result
   (if (setq ins (getpoint "\nPoint d'insertion: "))
     (command "_insert" result ins 1 1 0)
   )
 )
 (princ)
)

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

Lien vers le commentaire
Partager sur d’autres sites

Bonjour à toutes et tous,

 

Salut Gilles,

 

J'ai testé vite fait ton lisp réponse précédente.

 

J'ai créé un fichier "BlocA" ainsi qu'un ""BlocB"", l'ensemble dans un dossier des chemins de recherche.

 

AutoCAD me renvoi :

 

Commande: b2d

; erreur: quitter / sortir abandon

Commande:

 

Une idée ?

 

Merci d'avance,

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Il est probable que ce message soit dû au fait que le fichier DCL n'a pas été trouvé (il doit être dans les chemins de recherche.

 

L'expression :

(if (not (new_dialog "B2D" dcl_id))
 (exit)
)

fait quitter le programme si le fichier n'est pas trouvé, ce qui est considéré comme une erreur par AutoCAD (comme un Echap pendant un LISP).

 

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

Lien vers le commentaire
Partager sur d’autres sites

  • 3 semaines après...

Bonjour

 

Je reviens juste d'un déplacement donc une réponse un peu tardive aprés la résolution du probleme par (Gile).

 

Je t'adresse un grand MERCI car primo la démarche est trés simplifiée et du coup beaucoup plus efficace ! et secondo je vais pouvoir coder et finaliser mes petits projets sous autocad

 

 

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é