adi.p Posté(e) le 16 septembre 2014 Posté(e) le 16 septembre 2014 Bonjour à tous, je me lance dans un premier projet LISP qui consiste à dessiner une polyligne composé de 4 point décalé de 10cm entre 2 points opposés représentant une ouverture (porte, fenêtre, escalier...) ensuite une hachure remplie l'intérieur. Mon LISP ne gère pas encore les différentes position des 2 points donnés au début car je veux régler mon premier problème en premier. Pour faire fonctionner mon LISP, j'ai choisi le point BAS-GAUCHE et HAUT-DROITE d'un rectangle. Mon problème est que si je donne mes 2 points proche du 0,0,0 le LISP fonctionne, par contre si je m'éloigne... Le LISP ne dessine que 2 traits l'un sur l'autre. Quelqu'un aurait une idée? (setq p1 0 p2 0 a 0 b 0 c 0 d 0) (setq p1 (getpoint "\nPremier point")) (setq p2 (getcorner p1 "\nDeuxième point")) (setq a (list (+ (car p1) 10) (- (cadr p2) 10))) (setq b (list (- (car p2) 10) (- (cadr p2) 10))) (setq c (list (+ (car a) 15) (- (cadr a) 15))) (setq d (list (+ (car p1) 10) (+ (cadr p1) 10))) (if (not (tblsearch "LAYER" "0_ouverture")) (progn (command "_layer" "_new" "0_ouverture" "") (command "_layer" "_color" 251 "0_ouverture" "") ) ) (setvar "clayer" "0_ouverture") (command "_pline" a b c d "c") (command "_hatch" "SOLID" (entlast) "") D'avance merci pour votre aide
VDH-Bruno Posté(e) le 16 septembre 2014 Posté(e) le 16 septembre 2014 Bonjour et bienvenue Mon problème est que si je donne mes 2 points proche du 0,0,0 le LISP fonctionne, par contre si je m'éloigne... Le LISP ne dessine que 2 traits l'un sur l'autre. Tu as très certainement un conflit avec l’accroche objet, c.a.d. lors de la saisie au clavier des coordonnées AutoCAD privilégie l’accroche objet plutôt que la coordonnée spécifié lorsqu’il a le choix... (Cas d'un zoom éloigné) Pour remédier à cela 3 possibilités : I – Dans les Options d’environnement dans les préférences utilisateurs donner la priorité à la saisie clavier(OSNAPCOORD=1) plutôt que saisie clavier, script exceptés qui est le réglage par défault sous AutoCAD. II – En mémorisant et en désactivant l’accroche objet (OSMODE =0) au début du programme et en restituant à sa valeur initiale en sortie de programme, par la suite avec cette méthode il peut être judicieux de s’intéresser à la gestion d’erreurs . III – Sinon dans ton appel à la fonction command faire précéder toute tes saisies par l’instruction _none (aucun), comme ceci :(command "_pline" "_none" a "_none" b "_none" c "_none" d "c") En espérant avoir été complet sur le sujetCordialement Bruno(Ps: en lisp il n'est pas nécessaire d'initialisé les variables) 1 Apprendre => Prendre => Rendre
adi.p Posté(e) le 16 septembre 2014 Auteur Posté(e) le 16 septembre 2014 C'est PARFAIT! :) Merci beaucoup pour cette réponse rapide et complète!Je vais bosser sur ce LISP et le posterai si ça peut aider quelqu'un. Par contre, je ne comprend pas bien ton conseil sur la gestion d'erreur de la méthode. Tu parles de ta possibilité n° 2 avec l'OSMODE?Car le code n'est pas terminé (je voulais déjà pouvoir résoudre ce facheux soucis avant de continuer). Je dois encore adapter mon code pour tester la position des 2 points donnés et adapter le dessin en conséquence. [EDIT: j'ai compris ce que tu voulais dire... Si mon lisp plante, je perd la configuration de mes accrochages :blink: ] Le code mis à jour: (setq OSN (GETVAR "OSMODE")) (setvar "OSMODE" 0) (setq p1 (getpoint "\nPremier point")) (setq p2 (getcorner p1 "\nDeuxième point")) (setq a (list (+ (car p1) 10) (- (cadr p2) 10))) (setq b (list (- (car p2) 10) (- (cadr p2) 10))) (setq c (list (+ (car a) 15) (- (cadr a) 15))) (setq d (list (+ (car p1) 10) (+ (cadr p1) 10))) (if (not (tblsearch "LAYER" "0_ouverture")) (progn (command "_layer" "_new" "0_ouverture" "") (command "_layer" "_color" 251 "0_ouverture" "") ) ) (setvar "clayer" "0_ouverture") (command "_pline" a b c d "c") (command "_hatch" "SOLID" (entlast) "") (setvar "OSMODE" OSN)
VDH-Bruno Posté(e) le 16 septembre 2014 Posté(e) le 16 septembre 2014 [EDIT: j'ai compris ce que tu voulais dire... Si mon lisp plante, je perd la configuration de mes accrochages :blink: ] Oui, ou en faisant échap, je n’ai volontairement pas développé ce sujet de peur que tu te disperse.. Une fois que ton code te donnera satisfaction, je t’ai rapidement filtré 2, 3 liens sur ce forum. Liens qui devraient te permettre d’avancer sur cette question si tu es intéressé. http://cadxp.com/topic/35020-fonction-error/page__view__findpost__p__190094http://cadxp.com/topic/30869-fonctionne-malgres-lerreur/page__view__findpost__p__167177http://cadxp.com/topic/28642-arguments-et-variables/page__view__findpost__p__156100 A+ Apprendre => Prendre => Rendre
adi.p Posté(e) le 17 septembre 2014 Auteur Posté(e) le 17 septembre 2014 Merci beaucoup pour tes précieux conseils VDH-Bruno. J'ai mis à jour mon code, si ça peut aider quelqu'un je le met à disposition. ;Gestion de l accrochage aux objets (defun c:tremie ( / p1 p2 BG HD a b c d *error*) ; ####################################### ; ######### GESTION DES ERREURS ######### ; Sauvegarder les variables AutoCAD (defun svgvar () (setq cc (getvar "clayer") cmd (getvar "cmdecho") osm (getvar "osmode") cec (getvar "cecolor") ) ) ; Restaurer les variables AutoCAD (defun resvar () (setvar "clayer" cc) (setvar "cmdecho" cmd) (setvar "osmode" osm) (setvar "cecolor" cec) ) ; Redéfinition de la fonction *error* (defun *error* (msg) (princ (strcat "\nErreur: " msg)) ; renvoie un msg d erreur (resvar) ; Restore les variables AutoCAD (princ) ; Quitte silencieusement ) ; ######### GESTION DES ERREURS ######### ; ####################################### (svgvar) ;sauvegarde var AutoCAD ;Intéractions utilisateur (setq p1 (getpoint "\nPremier point")) (setq p2 (getcorner p1 "\nDeuxième point")) (setvar "OSMODE" 0) ;désactive l accrochage aux objets ; Position des coins ; *c1 *c2 ; ; *c3 *c4 (cond ((and (< (car p1) (car p2)) (> (cadr p1) (cadr p2))) ;p1 = c1 & p2 = c4 (setq c3 (list (car p1) (cadr p2))) (setq c2 (list (car p2) (cadr p1))) ) ((and (> (car p1) (car p2)) (> (cadr p1) (cadr p2))) ;p1 = c2 & p2 = c4 (setq c3 p2) (setq c2 p1) ) ((and (> (car p1) (car p2)) (< (cadr p1) (cadr p2))) ;p1 = c4 & p2 = c1 (setq c3 (list (car p2) (cadr p1))) (setq c2 (list (car p1) (cadr p2))) ) ((and (< (car p1) (car p2)) (< (cadr p1) (cadr p2))) ;p1 = c3 & p2 = c2 (setq c3 p1) (setq c2 p2) ) ( (*error* ("Erreur de condition")) ) ) ;Calcul des points abcd qui forment la polyligne de la trémie (setq a (list (+ (car c3) 10) (- (cadr c2) 10))) (setq b (list (- (car c2) 10) (- (cadr c2) 10))) (setq c (list (+ (car a) 15) (- (cadr a) 15))) (setq d (list (+ (car c3) 10) (+ (cadr c3) 10))) ;Création du calque 0_ouverture si non existant (if (not (tblsearch "LAYER" "0_ouverture")) (progn (command "_layer" "_new" "0_ouverture" "") (command "_layer" "_color" 251 "0_ouverture" "") ) ) ;Choix du calque 0_ouverture (setvar "clayer" "0_ouverture") ;Dessin et hachure de la trémie (command "_pline" a b c d "c") (command "_hatch" "SOLID" (entlast) "") ;Réinitialisation des variables autocad (resvar) (princ) )
bonuscad Posté(e) le 17 septembre 2014 Posté(e) le 17 septembre 2014 C'est bien, ça fonctionne Une remarque sur les cond pour obtenir tes 4 coins, ceci me semblerai plus simple (setq c1 (list (min (car p1) (car p2)) (max (cadr p1) (cadr p2))) c2 (list (max (car p1) (car p2)) (max (cadr p1) (cadr p2))) c3 (list (min (car p1) (car p2)) (min (cadr p1) (cadr p2))) c4 (list (max (car p1) (car p2)) (min (cadr p1) (cadr p2))) ) pense à utiliser la fonction (initget) avec les bits de contrôle qui vont bien, juste avant l'usage de (getxxxx)Regarde l'aide pour plus d'info. Si on veut utiliser ton code dans un SCU pivoté, c'est pas vraiment ça, au niveau visuel (la fonction getcorner est ennuyeuse dans ce cas; le rectangle est symbolisé depuis le SCG) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Bred Posté(e) le 1 octobre 2014 Posté(e) le 1 octobre 2014 Bonjour,Attention, cela ne fonctionne pas selon la taille de la trémie (ou l'echelle de dessin en EO). Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
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