Invité ingoenius Posté(e) le 26 décembre 2008 Posté(e) le 26 décembre 2008 Bonjour, et bonne fêtes a vous tous. Dans la conception d'un script je dois insérer plusieurs fois le mémé bloc, mais avec des orientations et échelles différentes, seulement je connais pas la fonction pour insérer un bloc avec un angle de rotation sur un autre axe que l' axe Z ;-( J'avais essayer en insérant le bloc, ensuite changement de scu rotation du bloc et rétablissement du scu originale, mais dans le passage les coordonnes des point ce déplacent avec le scu et comme système me semble un peu trop compliquée, Existe une façon d'insérer un bloc avec ces paramètre de rotation pour chaque (axe du bloc par rapport au scu courant)? ici le type de fonction que j'aimerai réussir a finaliser ;; Fonction insert evoluee (defun BL (P Size_X Size_Y Size_Z Rot_X Rot_Y Rot_Z) (setvar "osmode" 0) (setq BL "nom_du_bloc") (command "_-insert" BL P "_XYZ" Size_X Size_Y Size_Z Rot_X Rot_Y Rot_Z) (princ) ) ;;;fine insert bloc Merci
(gile) Posté(e) le 26 décembre 2008 Posté(e) le 26 décembre 2008 Salut, as-tu regardé ins3d sur cette page et aussi, ce sujet ? Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Invité ingoenius Posté(e) le 26 décembre 2008 Posté(e) le 26 décembre 2008 merci j'ai regardé la routine, mais il me semblait qu'il existait un code dxf pour gérer la rotation du bloc dans son espace avec son propre scu, on verra cela l'année prochaine maintenant ;-) A+ @gile J'ai vu que tu fais des decors, le lisp que je suis en trai de fair pourrait t'interesser ici la premiere partie ATT pour fonctionner il faut mettre dans le parcour de recherche de AutoCAD, un bloc nomme cubase qui est un cube de 1 x 1 x 1 (moi je travaille en metres) le point d'insertion de ce bloc est le coin au sol (vus par la vue top le coin en haut a gauche) ensuite le script cad2 cree un cadre en tasseaux plus le panneaux devant, ensuite je voudrias ajouter des "mouchoirs" triangulaires et le debit des tasseaux ;Solo CADRE (setq DTR (/ PI 180)) ;fattore di moltiplicazione x gradi verso radianti pi é Pi greco! (setq DESTRA (* 0 DTR)) ;traduzione del comando polar (setq SINISTRA (* 180 DTR)) ;traduzione del comando polar (setq SU (* 90 DTR)) ;traduzione del comando polar (setq GIU (* 270 DTR)) ;traduzione del comando polar (setq DIAG (* 45 DTR)) ;traduzione del comando polar ;TAILLE TASSEAUX (setq Dim_X 0.03) ;face tasseau (setq Dim_Y 0.06) ;epesseur tasseau (setq ENT 1.3) ;espace maximale entre tasseaux du panneaux? ;; Creo la funzione Cub (defun Cub (P Dim_X Dim_Y Dim_Z) (setvar "osmode" 0) (setq Blocco "cubase") (command "_-insert" Blocco P "_XYZ" Dim_X Dim_Y Dim_Z "0") (setvar "osmode" 3) (princ) ) ;;;fine inserzione cubase ;; Creo la funzione mouchoir ;(defun mou (P mou_X mou_Y mou_Z Rot) ;(setvar "osmode" 0) ;(setq Blocco "mouchoir") ;(command "_-insert" Blocco P "_XYZ" mou_X mou_Y mou_Z Rot) ;(setvar "osmode" 3) ;(princ) ;) ;;;fine inserzione mouchoir ;; Creo la funzione Cadre ;(defun Cadre (P0 Lar_Pann Dim_Z) (defun c:Cad2() (command "_layer" "ET" "Tasseau" "");creation nouveau calque (setq colore 1);ROUGE (command "_-layer" "co" colore "" "" "" );layer colore indicato (setvar "osmode" 0) (setq Lar_Pann (getreal "\nLarghezza Pannello? :")) ;Larghezza Pannello (setq Dim_Z (getreal "\nAltezza Pannello? :")) ;Altezza Pannello ;(setq Lar_Pann 3) ;(setq Dim_Z 3) (setq ET 1.3) ;parametre entre tasseaux ou pas (setq K1 (if (> Lar_Pann 2.0) 2 4)) ;se lar pann é piu grande di 2 (setq K2 (if (> Dim_Z 2.0) 8 16)) ;se altezza é piu grande di 2 (setq Key (+ K1 K2)) ;valore univoco per le condizioni ;(setq Lar_Pann (getreal "\nLarghezza Pannello? :")) ;Larghezza Pannello ;(setq Dim_Z (getreal "\nAltezza Pannello? :")) ;Altezza Pannello (setq Dim_ZR ( - Dim_Z(* 2.0 Dim_X))) ;spazio interno Z (setq Dim_XR ( - Lar_Pann(* 2.0 Dim_X))) ;spazio interno X (setq NN ( + 1 (fix(/ Dim_ZR ET)))) ;abbastanza corretto (setq Q (fix (- NN 1.0))) ;quante divisioni verticali (setq NN_R (- Dim_ZR (* Dim_x Q))) ;spazio restante tolti i nuovi tasseaux verticali (setq Cote_N (+ Dim_X(/ NN_R NN ))) ;spostamento verticale per aggiungere la dicisione verticale (setq NN_X ( + 1 (fix(/ Dim_XR ET)))) ;abbastanza corretto (setq Q_X (fix (- NN_X 1.0))) ;quante divisioni orizzontali? (setq NN_RX (- Dim_XR (* Dim_X Q_X))) ;spazio restante tolti i nuovi tasseaux verticali (setq Cote_NX (+ Dim_X(/ NN_RX NN_X ))) ;OK spostamento orizzontale (setvar "osmode" 3) (setq P0(getpoint "\nClick Point? : "));Centro dello schermo ;(setq P0 (list 0.0 0.0 0.0));a decommenter pour debugging script (setq xp0 (car P0)) (setq yp0 (cadr P0)) (setq zp0 (caddr P0)) (setvar "osmode" 0) (setq P1 (polar P0 DESTRA (- Lar_Pann Dim_X ))) (setq xp1 (car P1)) (setq yp1 (cadr P1)) (setq Zp1 (caddr P1)) (Cub P0 Dim_X Dim_Y Dim_Z) ;(mou P0 0.1 0.01 0.1 0) ;(setq triangle (entlast)) ;(command "_UCS" "G" "") ;(command "_UCS" "X" 90.0 "") ;(command "_rotate" triangle "" P0 90) ;(command "_UCS" "G" "") (Cub P1 Dim_X Dim_Y Dim_Z) ;fine due montanti verticali (setq Largh_R (- Lar_Pann(* 2.0 Dim_X))) ;spazio rimannete tra i due montanti verticali (setq P2 (polar P0 DESTRA Dim_X ));pinto inserzione tass basso (Cub P2 Largh_R Dim_Y Dim_X) ;(setq Tass_Base (entlast)) ;nomino l'oggetto (setq xP2 (car P2)) (setq yP2 (cadr P2)) (setq zP2 (caddr P2)) ; (setq zP3 (- (+ zP2 Dim_Z)Dim_X)) (setq P3 (list xP2 yP2 zP3));punto inserzione tass alto (Cub P3 Largh_R Dim_Y Dim_X);inserzione tass alto ;inserzione montanti verticali (setq xP4 (+ XP0 Cote_NX)) (repeat Q_X (setq zP4 ( + zp2 Dim_x)) ;alzo il tassello verticale (setq P4 (list xP4 yP2 zP4)) ;punto inserzione tass alto (Cub P4 Dim_X Dim_Y Dim_ZR) (setq xP4 (+ XP4 Cote_NX)) ) ;fine inserzione montanti verticali ||||| (setq xP5 XP2) (setq yP5 yP2) (setq ZP5 (+ ZP0 Cote_N)) (setq Cote_xx (- Cote_NX Dim_x)) (repeat Q (repeat ( + 1 Q_X) (setq P5 (list xP5 yP5 zP5));punto inserzione tass alto (Cub P5 Cote_XX Dim_Y Dim_X) (setq Xp5 (+ Xp5 Cote_NX )) );fine inserzione montanti orizzontali --------- (setq xP5 XP2) (setq yP5 yP2) (setq ZP5 (+ ZP5 Cote_N)) );fine secondo reepeat ;insertiion panneaux face (command "_layer" "ET" "Panneaux" "");creation nouveau calque (setq colore 9);Gris (command "_-layer" "co" colore "" "" "" );layer colore indicato (setq Ppanel (list xp0 (- yp0 Dim_Y) zp0)) (Cub Ppanel Lar_Pann 0.01 Dim_Z);inserzione tass alto );fine CAD2 [Edité le 26/12/2008 par ingoenius]
(gile) Posté(e) le 26 décembre 2008 Posté(e) le 26 décembre 2008 L'orientation du bloc dans l'espace est décrite par :- son Système de Coordonnées Objet (SCO), lui même déterminé par son axe Z (direction d'extrusion) code DXF 210- son point d'insertion dans ce SCO code dxf 10- sa rotation par rapport à l'axe X du SCO Voir ce sujet. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
chris_mtp Posté(e) le 26 décembre 2008 Posté(e) le 26 décembre 2008 As tu essayé le lisp IXl de patrick qui je pense répond à tes attentes et en plus est très simple d'utilisation ?
Invité ingoenius Posté(e) le 5 janvier 2009 Posté(e) le 5 janvier 2009 Me Revoilà après la pause des fêtes, alors, j'ai cherche a comprendre mieux suite a vos liens, mais j'avoue que pour moi c'est vraiment trop complexe tout cela, par contre la logique y est, il faudrait seulement inverser les calculs du script blend ici la copie mais jy arrive pas, le but comme écrit plu haut est d'insérer n'importe quel bloc avec ces paramétrés d'insertions ces paramétrés doivent etre ceux que l'on peut mesurer dans le scu global ;; Fonction insert evoluee (defun BL (P Size_X Size_Y Size_Z Rot_X Rot_Y Rot_Z) (setvar "osmode" 0) (setq BL "nom_du_bloc") (command "_-insert" BL P "_XYZ" Size_X Size_Y Size_Z Rot_X Rot_Y Rot_Z) (princ) ) ;;;fine insert bloc ;;; ASIN Retourne l'arc sinus du nombre, en radians (defun ASIN (num) (if (<= -1 num 1) (atan num (sqrt (- 1 (expt num 2)))) ) ) ;;; Apply a transformation matrix to a vector by Vladimir Nesterovsky (defun mxv (m v) (mapcar '(lambda (r) (apply '+ (mapcar '* r v))) m) ) (defun C:Blend () ;(defun C:Blend (/ ss n index str obj nome ins rot norm rotvec rotX rotY rotZ rotvec file) (setq SS (ssget (list (cons 0 "insert")))) ;zero é il codice del nome (setq N (sslength SS)) (setq INDEX 0) (setq STR "") ; chaine de caractère vide ;INIZIO DEL REPEAT ------------------------------------ (repeat n ; Répéter pour chaque bloc (setq obj (vlax-ename->vla-object (ssname SS INDEX))) (setq nome (if (vlax-property-available-p obj "EffectiveName") (setq nome (vla-get-EffectiveName obj)) (setq nome (vla-get-Name obj)) ) ) (setq ins (vlax-get obj 'InsertionPoint)) (setq rot (vla-get-Rotation obj)) (setq norm (vlax-get obj 'normal)) ;; calcul de la rotation du vecteur x dans le SCO du bloc (setq rotvec (trans (polar '(0 0 0) rot 1.0) norm 0)) ;; Calcul des rotations subie par le bloc sur Y puis sur Z (setq rotY (- (asin (caddr rotvec)))) ; rotation sur Y (setq rotZ (atan (cadr rotvec) (car rotvec))) ; rotation sur Z ;; Calcul de la rotation inverse subie par le vecteur normal sur Z (setq zvec (mxv (list (list (cos (- rotZ)) (- (sin (- rotZ))) 0) (list (sin (- rotZ)) (cos (- rotZ)) 0) '(0 0 1) ) norm ) ) ;; Calcul de la rotation inverse subie par le vecteur normal sur Y (setq zvec (mxv (list (list (cos (- rotY)) 0 (sin (- rotY))) '(0 1 0) (list (- (sin (- rotY))) 0 (cos (- rotY))) ) zvec ) ) ;; Calcul de la rotation subie par le bloc sur X (setq rotX (- (atan (cadr zvec) (caddr zvec)))) (setq str (strcat str ; ajout à la chaine précédente nome " " (rtos (car ins)) " " (rtos (cadr ins)) " " (rtos (caddr ins)) " " (angtos rotX) " " (angtos rotY) " " (angtos rotZ) " " (rtos (vla-get-XScalefactor obj)) " " (rtos (vla-get-YScalefactor obj)) " " (rtos (vla-get-ZScalefactor obj)) "\n" ; saut de ligne ) ) (setq INDEX (1+ INDEX)) ;pour passer au bloc suivant ) ; fin de repeat (if (setq file (getfiled "Seletionner un fichier" "" "txt" 1)) ;choisir ou créer un fichier (progn (setq file (open file "a")) ; ouvrir lr fichier (princ str file) ; écrire dans le fichier (close file) ; fermer le fichier ) ) (princ) )
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