petit programme lisp

petit programme lisp

Anonymous
Non applicable
1 796 Visites
3 Réponses
Message 1 sur 4

petit programme lisp

Anonymous
Non applicable

Bonjour à tous

J'ai un petit soucie sur mon programme lisp, je charge un programme qui doit former une clôture avec des plot à chaque segment.

Mais ceci sont petit et n’apparaissent pas a le bonne échelle et je ne comprend pas pourquoi.

Je ms suis lancer dans ce petit programme et j'aimerais bien une aide!!

Merci

 


(defun c:cloture()
    (setvar "cmdecho"0)
    (setvar "osmode" 0)
(command "-calque" "ch" "Chantier" "")
    (setq d (getdist "\nDonner la longueur d'un élément: "))
    (setq p1 (getpoint "\nCliquer le point début de la clôture: "))
    (setq long 0)
     (terpri)(setq rep "O")
    (while (or (= rep "O")(= rep "OUI"))
        (setq p2 (getpoint "\nCliquer le point extrémité de la clôture: "))
        (setq d1 (distance p1 p2))
        (setq long(+ long d1))
        (setq alfa(angle p1 p2))   
        (setq nbre (/ d1 d))
        (command "polylign" p1 "la"  0.02  0.02  p2 "")    
        (setq n (fix nbre))
        (setq n (+ 1 n))
           (repeat n
                 (progn
                       (setq p3 (polar p1 alfa  0.2 ))
                       (command "polylign" p1 "la" 0.2  0.2  p3 "")
                       (setq p1 (polar p1 alfa d))
                 )
           )  
       
        (setq p1 p2)
        (setq rep (strcase(getstring "\nVoulez vous prolonger la cloture (o/n): ")))
    )
      (setq p4 (polar p2 alfa 0.2))
        (command "polylign" p2 "la" 0.2 0.2 p4 "")    
    (command "polylign" p2 "la" 0 0 p2 "")
  (command "_.area" "_o" itm)
(getvar "perimeter")
  (setq reponse (strcat " la longueur est " (rtos long) " mètres"))
(alert reponse)


    (command "redess")
 
 )

MERCI

0 J'aime
Solutions acceptées (1)
1 797 Visites
3 Réponses
Replies (3)
Message 2 sur 4

_gile
Consultant
Consultant
Solution acceptée

Salut,

 

J'ai essayé la routine et je n'ai pas vu le problème que tu évoques, j'ai bien un "plot" après chaque intervalle sous forme d'une polyligne de 0.2 unités de long et 0.2 unités de large.

 

Par contre, si je peux me permettre, j'aurais quelques remarques d'ordre général :

  • il est préférable de prendre l'habitude de déclarer localement les variables ;
  • utiliser le nom de commande "global" (nom anglais précédé d'un tiret bas ou underscore) permet d'éviter les problèmes de compatibilité ;
  • quand un programme modifie les valeurs de variables systèmes (osmode ou cmdecho) il est impératif de leur restaurer leurs valeurs initiales à la fin de la routine ;
  • pour demander une option ("Oui" ou "Non") getkword avec initget permet un meilleurs contrôle que getstring ;
  • on peut spécifier un point de base comme premier argument à getpoint pour avoir une ligne élastique.
  • (command "polylign" p2 "la" 0 0 p2 "") dessine inutilement une polyligne de longueur 0

La routine modifiée suivant les remarques ci-dessus :

 

(defun c:cloture (/ osm echo d long rep p1 p2  p3 p4 d1 alfa nbre n) ; <- déclaration des variables locales
  ;; récupérer les valeurs de variables système
  (setq	osm  (getvar "osmode")
	echo (getvar "cmdecho")
  )
  ;; modifier les valeurs des variables système
  (setvar "osmode" 0)
  (setvar "cmdecho" 0)
  (setvar "clayer" "Chantier")
  (setq d (getdist "\nDonner la longueur d'un élément: "))
  (setq p1 (getpoint "\nCliquer le point début de la clôture: "))
  (setq long 0)
  (terpri)
  (setq rep "Oui")
  (while (= rep "Oui")
    ;; utiliser p1 comme point de base
    (setq p2 (getpoint p1 "\nCliquer le point extrémité de la clôture: "))
    (setq d1 (distance p1 p2))
    (setq long (+ long d1))
    (setq alfa (angle p1 p2))
    (setq nbre (/ d1 d))
    (command "_pline" p1 "_width" 0.02 0.02 p2 "")
    (setq n (fix nbre))
    (setq n (+ 1 n))
    (repeat n
      (progn
	(setq p3 (polar p1 alfa 0.2))
	(command "_pline" p1 "_width" 0.2 0.2 p3 "")
	(setq p1 (polar p1 alfa d))
      )
    )

    (setq p1 p2)
    ;; initialiser les options
    (initget "Oui Non")
    ;; inviter l'utilisateur à choisir une option
    (setq
      rep (getkword "\nVoulez vous prolonger la cloture [Oui/Non] <Non>: ")
    )
  )
  (setq p4 (polar p2 alfa 0.2))
  (command "_pline" p2 "_width" 0.2 0.2 p4 "")
  (setq reponse (strcat " la longueur est " (rtos long) " mètres"))
  (alert reponse)
  (command "_redraw")
  
  ;; restaurer les valeurs des variables système
  (setvar "osmode" osm)
  (setvar "cmdecho" echo)
  (princ)
)

Ne pas hésiter à consulter : Intoduction à AutoLISP (également disponible sur gileCAD et sur Developpez.com).



Gilles Chanteau
Programmation AutoCAD LISP/.NET
GileCAD
GitHub

Message 3 sur 4

Anonymous
Non applicable

Merci super,

Je début en lisp donc j'ai parfois un peu de mal mais j'ai encore une question est il possible de créer des calques par une commande lisp, j'ai compris comment les appeler, les rendre actif ou pas mais je dois charger mon gabarit pour d'autres programme que j'ai lier!!!

 

0 J'aime
Message 4 sur 4

_gile
Consultant
Consultant

Bien sûr que tu peux créer un calque.

 

En appelant la commande CALQUE (_LAYER) il y a toutes les options pour créer un calque.

Tu peux voir ça en lançant la commande dans sa version "ligne de commande", avec un tiret devant le nom de commande -CALQUE ou _-LAYER (ce tiret est inutile en LISP qui utilise par défaut la version ligne de commande). Il suffit ensuite de passer en arguments les mêmes options et leurs valeurs comme arguments dans l'expression LISP.

 

Exemple pour créer un calque nommé "TOTO" de couleur rouge (1) :

 

(command "calque" "nouv" "TOTO" "couleur" 1 "TOTO" "")

ou, mieux avec les noms "globaux" ;

 

 

(command "_layer" "_new" "TOTO" "_color" 1"TOTO" "")

 

Tu peux aussi utiliser l'option Etablir (_make) pour rendre le calque courant et le créer s'il n'existait pas déjà :

(command "_layer" "_make" "TOTO" "_color" 1 "TOTO" "")

Quand tu seras plus aguerrie, tu verras qu'il existe aussi des méthodes pour créer des calques sans appeler de commande...

 



Gilles Chanteau
Programmation AutoCAD LISP/.NET
GileCAD
GitHub

0 J'aime