Aller au contenu

1er projet LISP - Dessin trémie


adi.p

Messages recommandés

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

Lien vers le commentaire
Partager sur d’autres sites

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 sujet

Cordialement Bruno

(Ps: en lisp il n'est pas nécessaire d'initialisé les variables)

  • Upvote 1

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

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)

Lien vers le commentaire
Partager sur d’autres sites

[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__190094

http://cadxp.com/topic/30869-fonctionne-malgres-lerreur/page__view__findpost__p__167177

http://cadxp.com/topic/28642-arguments-et-variables/page__view__findpost__p__156100

 

A+

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

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)
)

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines aprè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 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é