Aller au contenu

Messages recommandés

Posté(e)

Salut,

J’ai écrit ce lisp qui permet d’insérer différent bloc en sélectionnent soit un bloc soit une ligne puis j'extrait différent information de cet élément pour insérer le nouveau bloc.

Le tous avec des sous programmes

Mon problème les variables locales garde la valeur précédente.

Peut etre juste un probléme dans la déclaration des variable

(defun c_insext(Coefins Blocinsert01 scale01 scale02 Blocinsert02 scale03)

(defun C:extc01(/ Coefins Blocinsert01 scale01 scale02 Blocinsert02 scale03)

 

PS : Le programme fonctionne bien sans les sous programmes »

 

 

 
;;;----------sous programme------------
(defun c_insext	(Coefins Blocinsert01 scale01 scale02 Blocinsert02 scale03)
;;;  (setq	Ent01 nil
;;;	CarEnt01 nil
;;;	TypeEnt01 nil
;;;	LayEnt01 nil
;;;	nameEnt01 nil
;;;	PtInstEnt01 nil
;;;	scalexInstEnt01	nil
;;;	scaleyInstEnt01	nil
;;;  )
 (setvar "osmode" 219)
 (setvar "autosnap" 29)
 (setq Ent01 (entsel "\nSelectionnez le réseaux:"))
 (setq CarEnt01 (car Ent01))
 (setq TypeEnt01 (cdr (assoc 0 (cdr (entget CarEnt01)))))
 (setq LayEnt01 (cdr (assoc 8 (cdr (entget CarEnt01)))))
 (command "_layer" "ch" layEnt01 "")
 (if (= TypeEnt01 "INSERT")
   (progn (setq nameEnt01 (cdr (assoc 2 (cdr (entget CarEnt01)))))
   (setq PtInstEnt01 (cdr (assoc 10 (cdr (entget CarEnt01)))))
   (setq AngInstEnt01rad (cdr (assoc 50 (cdr (entget CarEnt01)))))
   (setq AngInstEnt01deg (* 180.0 (/ AngInstEnt01rad pi)))
   (setq scalexInstEnt01 (cdr (assoc 41 (cdr (entget CarEnt01)))))
   (setq scaleyInstEnt01 (cdr (assoc 42 (cdr (entget CarEnt01)))))
   (setq PtInstextc01 (polar PtInstEnt01 AngInstEnt01rad Coefins))
   (command "-inserer" Blocinsert01 PtInstextc01 scale01 scale02 AngInstEnt01deg)
   )
   (progn (setq CdrEnt01 (cdr Ent01))
   (setq PtRef01 (osnap (car CdrEnt01) "_mid"))
   (setq PtRef02 (osnap (car CdrEnt01) "_end"))
   (setq PtRef03 (getpoint "\n Indiquer le point opposé:\n"))
   (setq AngInstEnt01rad (angle PtRef01 PtRef02))
   (setq AngInstEnt01deg (* 180.0 (/ AngInstEnt01rad pi)))
   (setq PtInstextc01
	  (list	(/ (+ (car PtRef02) (car PtRef03)) 2)
		(/ (+ (cadr PtRef02) (cadr PtRef03)) 2)
		(/ (+ (caddr PtRef02) (caddr PtRef03)) 2)
	  )
   )
   (setq scalexInstEnt01 (distance PtRef02 PtRef03))
   (setvar "osmode" 0)
   (command "-inserer" Blocinsert02 PtInstextc01 scale03 "" AngInstEnt01deg)
   )
 )
)
;;;-----------INSERTION DES EXTREMITES DE GAINE -----------------
(defun C:extc01	(/ Coefins Blocinsert01 scale01 scale02 Blocinsert02 scale03)
 (c_insext (* 0.8 scalexInstEnt01)
    "EXTC01.DWG"
    scalexInstEnt01
    scalexInstEnt01
    "EXTC01.DWG"
    scalexInstEnt01
 )
)
(defun C:extc02	(/ Coefins Blocinsert01 scale01 scale02 Blocinsert02 scale03)
 (c_insext (* 0.8 scalexInstEnt01)
    "EXTC02.DWG"
    scalexInstEnt01
    scalexInstEnt01
    "EXTC02.DWG"
    scalexInstEnt01
 )
)
(defun C:extr01	(/ Coefins Blocinsert01 scale01 scale02 Blocinsert02 scale03)
 (c_insext 0.25 "EXTR01.DWG" scalexInstEnt01 scaleyInstEnt01 "EXTR01.DWG" scalexInstEnt01)
)
(defun C:extr02	(/ Coefins Blocinsert01 scale01 scale02 Blocinsert02 scale03)
 (c_insext 0.25 "EXTR02.DWG" scalexInstEnt01 scaleyInstEnt01 "EXTR02.DWG" scalexInstEnt01)
)

Posté(e)

Salut,

j'avoues que j'ai du mal à comprendre ton lisp.

A première vu, je pense qu'il y a déjà un problème simplement dans la méthode :

Quand tu lances une commande (ex : extc01), tu lances ton sous programme qui te récupère les variables... MAIS, dans les argument passé à ton sous programme, tu as une variable que tu récupers DANS ce sous programme...

donc si le sous programme n'est pas lancé à vide une fois, rien ne peut fonctionner ...

 

(defun C:extc01 (/ Coefins Blocinsert01 scale01 scale02 Blocinsert02 scale03)
 (c_insext (* 0.8[b] scalexInstEnt01[/b])
    "EXTC01.DWG"
    [b]scalexInstEnt01[/b]
   [b] scalexInstEnt01[/b]
    "EXTC01.DWG"
    [b]scalexInstEnt01[/b]
    )
 )

 

c'est pas simple de corriger là....

 

 

 

 

 

 

 

[Edité le 10/5/2007 par Bred]

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Ok tu as tous bon

trop de varible tues ou pourquoi faire compliqué quand on peu faire simple

 

;;;---SOUS COMMANDE INSERTION DES EXTREMITES DE GAINE -----------
(defun c_insext	(Coefins Blocinsert01 Blocinsert02)
 (setvar "cmdecho" 0)
 (setvar "menuecho" 0)
 (setvar "osmode" 219)
 (setvar "orthomode" 0)
 (setvar "autosnap" 29)
 (setq Ent01 (entsel "\nSelectionnez le réseaux:"))
 (setq CarEnt01 (car Ent01))
 (setq TypeEnt01 (cdr (assoc 0 (cdr (entget CarEnt01)))))
 (setq LayEnt01 (cdr (assoc 8 (cdr (entget CarEnt01)))))
 (command "_layer" "ch" layEnt01 "")
 (if (= TypeEnt01 "INSERT")
   (progn
     (setq nameEnt01 (cdr (assoc 2 (cdr (entget CarEnt01)))))
     (setq PtInstEnt01 (cdr (assoc 10 (cdr (entget CarEnt01)))))
     (setq AngInstEnt01rad (cdr (assoc 50 (cdr (entget CarEnt01)))))
     (setq AngInstEnt01deg (* 180.0 (/ AngInstEnt01rad pi)))
     (setq scalexInstEnt01 (cdr (assoc 41 (cdr (entget CarEnt01)))))
     (setq scaleyInstEnt01 (cdr (assoc 42 (cdr (entget CarEnt01)))))
     (setq PtInstextc01 (polar PtInstEnt01 AngInstEnt01rad (* Coefins scalexInstEnt01)))
     (command "-inserer" Blocinsert01 PtInstextc01 scalexInstEnt01 scalexInstEnt01 AngInstEnt01deg)
   )
   (progn (setq CdrEnt01 (cdr Ent01))
   (setq PtRef01 (osnap (car CdrEnt01) "_mid"))
   (setq PtRef02 (osnap (car CdrEnt01) "_end"))
   (setq PtRef03 (getpoint "\n Indiquer le point opposé:\n"))
   (setq AngInstEnt01rad (angle PtRef01 PtRef02))
   (setq AngInstEnt01deg (* 180.0 (/ AngInstEnt01rad pi)))
   (setq PtInstextc01
	  (list	(/ (+ (car PtRef02) (car PtRef03)) 2)
		(/ (+ (cadr PtRef02) (cadr PtRef03)) 2)
		(/ (+ (caddr PtRef02) (caddr PtRef03)) 2)
	  )
   )
   (setq scalexInstEnt01 (distance PtRef02 PtRef03))
   (setvar "osmode" 0)
   (command "-inserer" Blocinsert02 PtInstextc01 scalexInstEnt01 scalexInstEnt01 AngInstEnt01deg)
   )
 )
)

;;;-----INSERTION DES EXTREMITES DE GAINE ---------------------------------------------------
(defun C:extc01	(/ Coefins Blocinsert01 Blocinsert02)
;;;  (variable_init)
 (c_insext 0.8 "EXTC01.DWG" "EXTC01.DWG")
;;;  (variable_final)
)
(defun C:extc02	(/ Coefins Blocinsert01 Blocinsert02)
;;;  (variable_init)
 (c_insext 0.8 "EXTC02.DWG" "EXTC02.DWG")
;;;  (variable_final)
)
(defun C:extr01	(/ Coefins Blocinsert01 Blocinsert02)
;;;  (variable_init)
 (c_insext 0.25 "EXTR01.DWG" "EXTR01.DWG")
;;;  (variable_final)
)
(defun C:extr02	(/ Coefins Blocinsert01 Blocinsert02)
;;;  (variable_init)
 (c_insext 0.25 "EXTR02.DWG" "EXTR02.DWG")
;;;  (variable_final)
)

 

Merci pour aide.

Posté(e)

Par contre, rapidement :

 

- Tu modifies plein de variable que tu ne réinitialise pas en fin de lisp.

(setvar "cmdecho" 0)
(setvar "menuecho" 0)
(setvar "osmode" 219)
(setvar "orthomode" 0)
(setvar "autosnap" 29)

tu devrais en plus faire une gestion d'erreur...

 

- tu peux éviter ta ribambelle de (setq ... setq ...) en faisant :

(setq nameEnt01 (cdr (assoc 2 (cdr (entget CarEnt01))))
     PtInstEnt01 (cdr (assoc 10 (cdr (entget CarEnt01))))
     AngInstEnt01rad (cdr (assoc 50 (cdr (entget CarEnt01))))
     AngInstEnt01deg (* 180.0 (/ AngInstEnt01rad pi))
     scalexInstEnt01 (cdr (assoc 41 (cdr (entget CarEnt01))))
     scaleyInstEnt01 (cdr (assoc 42 (cdr (entget CarEnt01))))
     PtInstextc01 (polar PtInstEnt01 AngInstEnt01rad (* Coefins scalexInstEnt01)))

 

- n'oublis pas de déclarer maintenant tes variables locales :

(defun c_insext (Coefins Blocinsert01 Blocinsert02 / ANGINSTENT01DEG ANGINSTENT01RAD CARENT01
	 CDRENT01 ENT01 LAYENT01 NAMEENT01 PTINSTENT01 PTINSTEXTC01 PTREF01 PTREF02 PTREF03
	 SCALEXINSTENT01 SCALEYINSTENT01 TYPEENT01)
....

 

- tu devrais faire un (princ) en fin de code afin d'éviter les lignes superflus de fin de code sur la ligne de commande.

 

 

 

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Salut Bred,

 

Avec un peut de retard et un peu plus d'organisation.

Pour les varaible je m'en occupe avec les sous programmes

(variable_init)

(variable_final)

 

Mais peu être est t'il possible d'améliorer la deuxième partie du code.

C'est-à-dire trouver une autre méthode pour déduire PtRef04.

 

PtRef04 étant le point perpendiculaire PtRef03

 

« Ent01 » est une ligne.

PtRef01 Point milieu « Ent01 »

PtRef02 Point extrémité « Ent01 »

PtRef03 Point proche « Ent01 »

 

 
;;;---SOUS COMMANDE INSERTION DES EXTREMITES DE GAINE -----------
(defun c_insext	(Coefins	Blocinsert01   Blocinsert02   /		     Ent01	    CarEnt01	   TypeEnt01
	 LayEnt01	CarEnt01       nameEnt01      PtInstEnt01    AngInstEnt01rad		   AngInstEnt01deg
	 PtInstext	CdrEnt01       PtRef01	      PtRef02	     PtRef03	    scaleInst	   AngInstEnt01deg
	)
 (setvar "cmdecho" 0)
 (setvar "menuecho" 0)
 (setvar "osmode" 219)
 (setvar "orthomode" 0)
 (setvar "autosnap" 29)
 (setq	Ent01	  (entsel "\nSelectionnez le réseaux:")
CarEnt01  (car Ent01)
TypeEnt01 (cdr (assoc 0 (cdr (entget CarEnt01))))
LayEnt01  (cdr (assoc 8 (cdr (entget CarEnt01))))
 )
 (command "_layer" "ch" layEnt01 "")
 (if (= TypeEnt01 "INSERT")
   (progn (setq nameEnt01	 (cdr (assoc 2 (cdr (entget CarEnt01))))
	 PtInstEnt01	 (cdr (assoc 10 (cdr (entget CarEnt01))))
	 AngInstEnt01rad (cdr (assoc 50 (cdr (entget CarEnt01))))
	 AngInstEnt01deg (* 180.0 (/ AngInstEnt01rad pi))
	 scalexInstEnt01 (cdr (assoc 41 (cdr (entget CarEnt01))))
	 scaleyInstEnt01 (cdr (assoc 42 (cdr (entget CarEnt01))))
	 PtInstext	 (polar PtInstEnt01 AngInstEnt01rad (* Coefins scalexInstEnt01))
   )
   (command "-inserer" Blocinsert01 PtInstext scaleyInstEnt01 scaleyInstEnt01 AngInstEnt01deg)
   )
   (progn (setq CdrEnt01	 (cdr Ent01)
	 PtRef01	 (osnap (car CdrEnt01) "_mid")
	 PtRef02	 (osnap (car CdrEnt01) "_end")
	 PtRef03	 (osnap (car CdrEnt01) "_nea")
	 PtRef04	 (getpoint "\n Indiquer le point opposé:\n" PtRef03)
	 AngInstEnt01rad (angle PtRef01 PtRef02)
	 AngInstEnt01deg (* 180.0 (/ AngInstEnt01rad pi))
	 PtInstext	 (list (/ (+ (car PtRef03) (car PtRef04)) 2)
			       (/ (+ (cadr PtRef03) (cadr PtRef04)) 2)
			       (/ (+ (caddr PtRef03) (caddr PtRef04)) 2)
			 )
	 scaleInst	 (distance PtRef03 PtRef04)
   )
   (setvar "osmode" 0)
   (command "-inserer" Blocinsert02 PtInstext scaleInst scaleInst AngInstEnt01deg)
   )
 )
 (princ)
)
;;;------------------------------INSERTION DES EXTREMITES DE GAINE ---------------------------------------------------
(defun C:extc01	(/ Coefins Blocinsert01 Blocinsert02)
 (variable_init)
 (c_insext 0.8 "EXTC01.DWG" "EXTC01.DWG")
 (variable_final)
)
(defun C:extc02	(/ Coefins Blocinsert01 Blocinsert02)
 (variable_init)
 (c_insext 0.8 "EXTC02.DWG" "EXTC02.DWG")
 (variable_final)
)

 

Posté(e)

Salut,

 

Tu peux certainement faire plus concis.

 

Je ne vois pas l'intérêt (dans cette routine en tout cas) de récupérer le calque de la référence de bloc ni son nom : ils ne servent pas dans la suite du code.

 

Par contre tu pourrais définir un (setq ElistEnt1 (entget CarEnt1)) pour éviter de rappeler la fonction entget de nombreuses fois -le cdr est inutile dans : (cdr (entget CarEnt01)).

 

De même, plutôt que définir Cdrent1 puis par trois fois (car Cdrent1) , il vaut mieux faire directement (setq Cadrent1 (cadr Ent1)).

 

Pour calculer le milieu de PtRef03 et PtRef04 tu peux utiliser la fonction mapcar sur les deux points :

(setq PtInstext (mapcar '(lambda (x1 x2) (/ (+ x1 x2) 2.0)) PtRef03 PtRef04))

 

Pour trouver la perpendiculaire à la ligne au point PtRef03, tu peux utiliser :

(setq PtRef04 (polar PtRef03 (+ AngInstEnt01rad (/ pi 2)) scaleInst))

Mais cela suppose qu tu aies récupéré scaleInst avant (avec un getdist par exemple) et cela impose le côté de la perpendiculaire par rapport à la ligne dans le sens trigonométrique.

 

Inutile aussi de déclarer les variables Coefins Blocinsert01 Blocinsert02 dans C:extc01 (de même pour C:extc02) puisqu'elles ne sont pas définies dans ces routines.

 

En espérant que cela t'aide un peu...

 

[Edité le 14/5/2007 par (gile)]

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

Posté(e)

Salut,

 

Merci pour les commentaires.

Pour faire court je vais tester tous ça.

Me réconcilier avec les « car » et « cdr» ….

Réessayer le « getdist » mais j’ai déjà eu des problèmes avec l’orientation finale du bloc.

A+

 

Posté(e)

Salut,

Voila le code fini et allégé...

 

 

 
(defun variable_init ()
 (setq	cmd   (getvar "cmdecho")
mnu   (getvar "menuecho")
osmod (getvar "osmode")
ortho (getvar "orthomode")
 )
 (setvar "cmdecho" 0)
 (setvar "menuecho" 0)
 (setvar "osmode" 0)
 (setvar "orthomode" 0)
)
;;;---------------------------------------------------------------------------------------------
(defun variable_final ()
 (setvar "cmdecho" cmd)
 (setvar "menuecho" mnu)
 (setvar "osmode" osmod)
 (setvar "orthomode" ortho)
)
;;;---SOUS COMMANDE INSERTION DES EXTREMITES DE GAINE -----------
(defun c_insext	(Blocinsert01	Blocinsert02   /	      Ent01	     CarEnt01	    TypeEnt01	   LayEnt01
	 CarEnt01	nameEnt01      Nondubloc      PtInstEnt01    AngInstEnt01rad		   AngInstEnt01deg
	 PtInstext	CdrEnt01       PtRef01	      PtRef02	     PtRef03	    scaleInst	   AngInstEnt01deg
	)
 (setvar "cmdecho" 0)
 (setvar "menuecho" 0)
 (setvar "osmode" 219)
 (setvar "orthomode" 0)
 (setvar "autosnap" 29)
 (setq	Ent01	  (entsel "\nSelectionnez le réseaux:")
CarEnt01  (entget (car Ent01))
TypeEnt01 (cdr (assoc 0 CarEnt01))
LayEnt01  (cdr (assoc 8 CarEnt01))
Nondubloc (cdr (assoc 2 CarEnt01))
 )
 (if (wcmatch LayEnt01 "*-TREM*")
   (progn (command "_layer" "ch" layEnt01 "")
   (if (= TypeEnt01 "INSERT")
     (progn (setq nameEnt01	  (cdr (assoc 2 CarEnt01))
		  PtInstEnt01	  (cdr (assoc 10 CarEnt01))
		  AngInstEnt01rad (cdr (assoc 50 CarEnt01))
		  AngInstEnt01deg (* 180.0 (/ AngInstEnt01rad pi))
		  scalexInstEnt01 (cdr (assoc 41 CarEnt01))
		  scaleyInstEnt01 (cdr (assoc 42 CarEnt01))
	    )
	    (if	(wcmatch Nondubloc "PIQ*")
	      (progn (if (wcmatch Nondubloc "PIQC*")
		       (progn (command "-inserer"
				       (strcat "EXTC" Blocinsert01)
				       (polar PtInstEnt01 AngInstEnt01rad (* 0.8 scalexInstEnt01))
				       scaleyInstEnt01
				       scaleyInstEnt01
				       AngInstEnt01deg
			      )
		       )
		       (progn (command "-inserer"
				       (strcat "EXTR" Blocinsert01)
				       (polar PtInstEnt01 AngInstEnt01rad (* 0.25 scalexInstEnt01))
				       scaleyInstEnt01
				       scaleyInstEnt01
				       AngInstEnt01deg
			      )
		       )
		     )
	      )
	      (alert "Verifier la selection de votre réseaux\n \nPiquage sur gaine le bloc doit ètre")
	    )
     )
     (progn (setq CdrEnt01	  (cdr Ent01)
		  PtRef01	  (osnap (car CdrEnt01) "_mid")
		  PtRef02	  (osnap (car CdrEnt01) "_end")
		  PtRef03	  (osnap (car CdrEnt01) "_nea")
		  PtRef04	  (getpoint "\n Indiquer le point opposé:\n" PtRef03)
		  AngInstEnt01rad (angle PtRef01 PtRef02)
		  AngInstEnt01deg (* 180.0 (/ AngInstEnt01rad pi))
		  PtInstext	  (list	(/ (+ (car PtRef03) (car PtRef04)) 2)
					(/ (+ (cadr PtRef03) (cadr PtRef04)) 2)
					(/ (+ (caddr PtRef03) (caddr PtRef04)) 2)
				  )
		  scaleInst	  (distance PtRef03 PtRef04)
	    )
	    (setvar "osmode" 0)
	    (command "-inserer" Blocinsert02 PtInstext scaleInst scaleInst AngInstEnt01deg)
     )
   )
   )
   (alert "Verifier la selection de votre réseaux\n \nCalque bifilaire le réseaux doit ètre")
 )
 (princ)
)
;;;------------------------------INSERTION DES EXTREMITES DE GAINE ---------------------------------------------------
(defun C:extc01	(/ Blocinsert01 Blocinsert02)
 (variable_init)
 (c_insext "01.DWG" "EXTC01.DWG")
 (variable_final)
)
(defun C:extc02	(/ Blocinsert01 Blocinsert02)
 (variable_init)
 (c_insext "02.DWG" "EXTC02.DWG")
 (variable_final)
)
(defun C:extr01	(/ Blocinsert01 Blocinsert02)
 (variable_init)
 (c_insext "01.DWG" "EXTR01.DWG")
 (variable_final)
)
(defun C:extr02	(/ Blocinsert01 Blocinsert02)
 (variable_init)
 (c_insext "02.DWG" "EXTR02.DWG")
 (variable_final)
)

 

A+

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é