jacobs33 Posté(e) le 10 mai 2007 Posté(e) le 10 mai 2007 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) )
Bred Posté(e) le 10 mai 2007 Posté(e) le 10 mai 2007 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...
jacobs33 Posté(e) le 10 mai 2007 Auteur Posté(e) le 10 mai 2007 Ok tu as tous bontrop 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.
Bred Posté(e) le 10 mai 2007 Posté(e) le 10 mai 2007 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...
jacobs33 Posté(e) le 10 mai 2007 Auteur Posté(e) le 10 mai 2007 Merci pour ce complément d'information.Que je vais mettre en application.
Patrick_35 Posté(e) le 10 mai 2007 Posté(e) le 10 mai 2007 Après un test avec atoms-family, Bred range maintenant ses variables ;) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
jacobs33 Posté(e) le 14 mai 2007 Auteur Posté(e) le 14 mai 2007 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) )
(gile) Posté(e) le 14 mai 2007 Posté(e) le 14 mai 2007 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
jacobs33 Posté(e) le 15 mai 2007 Auteur Posté(e) le 15 mai 2007 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+
jacobs33 Posté(e) le 21 mai 2007 Auteur Posté(e) le 21 mai 2007 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+
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