lecrabe Posté(e) le 29 mars 2007 Posté(e) le 29 mars 2007 Hello Je desiré "re-créer" un fichier PAT depuis une hachure associative AutoCAD existante dans un dessin mais donc realisée sur un poste qui avaient de beaux motifs de hachures ... :) Je suis presque "sur" que cette question avait déjà été traitée sur CADXP :cool: MAIS malgré mes recherches je n'ai pas trouvé !? Je désire un Lisp si possible opérationnel sur toutes les versionsn d'AutoCAD (2000-2007) ou sinon au minimum 2004-2007 ... :exclam: Le Decapode "fatigué" Autodesk Expert Elite Team
lecrabe Posté(e) le 2 avril 2007 Auteur Posté(e) le 2 avril 2007 Hello Boys & Girls Le Decapode désire une réponse même négative ... Je ne sais toujours pas si il est possible de récupérer un motif de hachurage depuis un DWG !? Merci d'avance de vos infos ! Le Decapode "patient" Autodesk Expert Elite Team
(gile) Posté(e) le 2 avril 2007 Posté(e) le 2 avril 2007 Salut, Je ne m'aventurerais sûrement pas à dire que c'est impossible, mais je ne vois pas comment faire. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
bonuscad Posté(e) le 2 avril 2007 Posté(e) le 2 avril 2007 Au patient Décapode... Je croyais avoir déjà poster ce lisp (assez ancien déjà) sur Cadxp, mais pas retrouvé.Je poste donc, en précisant (d'aprés mes souvenirs) que la définition du code PAT restitué n'est pas forcément identique à l'original (si la hachure n'a pas été faite dans le SCG ou SCU parallèle) mais donne un motif de même apparence.Tu peux essayer voir si cela te convient, il te suffira de faire un copier-coller du résultat dans la fenêtre de commande texte d'autocad dans un fichier PAT au nom identique du modèle relevé, si cela fonctionne.... Que Gilles me pardonne mes matrices de transformation, car ces lisp sont ancien et je ne me suis pas repenché dessus. L'utilisation de ce genre de lisp étant trés ponctuel et occasionnelle, une fois qu'on a récupérer le motif, il n'a plus trop d'intérêt. (defun ex_xform (xpt matrix v / ex ey ez m1 m2 m3 m4 wx wy wz) (setq ex (car xpt) ey (cadr xpt) ez (caddr xpt) m1 (nth 0 matrix) m2 (nth 1 matrix) m3 (nth 2 matrix) wx (+ (* (car m1) ex) (* (car m2) ey) (* (car m3) ez) ) wy (+ (* (cadr m1) ex) (* (cadr m2) ey) (* (cadr m3) ez) ) wz (+ (* (caddr m1) ex) (* (caddr m2) ey) (* (caddr m3) ez) ) ) (if (not v) (setq m4 (nth 3 matrix) wx (+ wx (car m4)) wy (+ wy (cadr m4)) wz (+ wz (caddr m4)) ) ) (list wx wy wz) ) (defun v_matr (dpt alphax alphay alphaz echx echy echz / ) (list (list (* echx (cos alphaz) (cos alphay)) (- (sin alphaz)) (sin alphay) (car dpt) ) (list (sin alphaz) (* echy (cos alphaz) (cos alphax)) (- (sin alphax)) (cadr dpt) ) (list (- (sin alphay)) (sin alphax) (* echz (cos alphax) (cos alphay)) (caddr dpt) ) ; (list 0.0 0.0 1.0 0.0) (list 0.0 0.0 0.0 1.0) ) ) (defun transpts (apt matrix) (list (+ (* (car (nth 0 matrix)) (car apt)) (* (car (nth 1 matrix)) (cadr apt)) (* (car (nth 2 matrix)) (caddr apt)) (cadddr (nth 0 matrix)) ) (+ (* (cadr (nth 0 matrix)) (car apt)) (* (cadr (nth 1 matrix)) (cadr apt)) (* (cadr (nth 2 matrix)) (caddr apt)) (cadddr (nth 1 matrix)) ) (+ (* (caddr (nth 0 matrix)) (car apt)) (* (caddr (nth 1 matrix)) (cadr apt)) (* (caddr (nth 2 matrix)) (caddr apt)) (cadddr (nth 2 matrix)) ) ) ) (defun c:model_hatch ( / zindim dec_prec ent ent_dxf nam_pat user_angle user_scale nbr_line dxf_line ang_motif n first_op transform pt_trans dlt_x dlt_y) (setvar "cmdecho" 0) (while (not (setq ent (entsel "\nChoix de la Hachure modèle: ")))) (initget 4) (setq dec_prec (getint "\nNombres de décimales a afficher ?<8>: ") ent_dxf (entget (car ent)) zindim (getvar "dimzin")) (if (not dec_prec) (setq dec_prec 8)) (setvar "dimzin" 12) (cond ((eq (cdr (assoc 0 ent_dxf)) "HATCH") (setq nam_pat (strcat "\n*" (cdr (assoc 2 ent_dxf))) user_angle (cdr (assoc 52 ent_dxf)) user_scale (cdr (assoc 41 ent_dxf)) nbr_line (cdr (assoc 78 ent_dxf)) dxf_line '() first_op T ) (while (/= (caar ent_dxf) 53) (setq ent_dxf (cdr ent_dxf)) ) (textscr) (princ nam_pat) (repeat nbr_line (repeat 5 (setq dxf_line (cons (cdar ent_dxf) dxf_line) ent_dxf (cdr ent_dxf)) (if (eq (caar ent_dxf) 79) (progn (setq n (cdar ent_dxf) ent_dxf (cdr ent_dxf) dxf_line (cons nil dxf_line)) (repeat n (setq dxf_line (cons (* (/ 1.0 user_scale) (cdar ent_dxf)) dxf_line) ent_dxf (cdr ent_dxf)) ) ) ) ) (setq dxf_line (reverse dxf_line) ang_motif (car dxf_line) dxf_line (cdr dxf_line)) (princ (strcat "\n" (angtos (- ang_motif user_angle) 0 dec_prec))) (repeat (- (length dxf_line) (1+ n)) (cond ((not (car dxf_line)) (setq dxf_line (cdr dxf_line)) (while dxf_line (princ (strcat "," (rtos (car dxf_line) 2 dec_prec))) (setq dxf_line (cdr dxf_line)) ) ) (T (if first_op (setq transform (v_matr '(0.0 0.0 0.0) 0.0 0.0 user_angle 1.0 1.0 1.0) first_op nil) (setq transform (v_matr '(0.0 0.0 0.0) 0.0 0.0 ang_motif 1.0 1.0 1.0)) ) (setq pt_trans (transpts (list (* (/ 1.0 user_scale) (car dxf_line)) (* (/ 1.0 user_scale) (cadr dxf_line)) 0.0) transform) dlt_x (car pt_trans) dlt_y (cadr pt_trans) dxf_line (cons dlt_x (cons dlt_y (cddr dxf_line))) ) (princ (strcat "," (rtos (car dxf_line) 2 dec_prec) "," (rtos (cadr dxf_line) 2 dec_prec))) (setq dxf_line (cddr dxf_line)) ) ) ) (setq dxf_line '() first_op T) ) ) (T (prompt "\nEntité n'est pas une hachure.")) ) (setvar "dimzin" zindim) (setvar "cmdecho" 1) (prin1) ) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
(gile) Posté(e) le 3 avril 2007 Posté(e) le 3 avril 2007 Chapeau bas ! On voit là l'oeuvre d'un grand maitre du LISP ! Respect absolu ! Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
lecrabe Posté(e) le 4 avril 2007 Auteur Posté(e) le 4 avril 2007 Hello Oh Grand Merci Suprème Pharaon du Lisp / V_Lisp Ta routine est OK et opérationnelle avec AutoCAD 2002 / 2004 / 2005 / 2006 / 2007 :) :D :cool: Ton humble serviteur "décapodique" ! Autodesk Expert Elite Team
(gile) Posté(e) le 4 avril 2007 Posté(e) le 4 avril 2007 Que Gilles me pardonne mes matrices de transformation, car ces lisp sont ancien et je ne me suis pas repenché dessus. Tu es tout pardonné, si tant est que je sois habilité à accorder le pardon. Ton LISP est vraiment super ! Je me suis quand même amusé à regarder si on pouvait simplifier quelque chose du côté des matrices. - Tout d'abord, la routine "ex_xform" doit être un reliquat de la construction du LISP, elle ne sert pas dans ce LISP. - La routine "v_matr" retourne un matrice de transformation 4x4 où l'échelle est 1.0 et le déplacement nul (0.0 0.0 0.0). Je pense qu'une simple matrice de rotation 3x3 est suffisante. - La routine "transpts" est l'application d'une matrice transposée à un vecteur, ce qui peut s'écrire avec les merveilles de Doug Wilson et Vladimir Nesterovsky :(mxv (trp matrice) vecteur). Edit : Une matrice de transformation 3x3 transposée est en fait la matrice de la transformation inverse. Dans le cas présent : la rotation inverse, soit la rotation par 2pi - angle, ou plus simplement - angle. La routine trp : ;; transpose une matrice Doug Wilson(defun trp (m) (apply 'mapcar (cons 'list m))) n'est plus nécessaire. ;; Apply a transformation matrix to a vector by Vladimir Nesterovsky (defun mxv (m v) (mapcar '(lambda (r) (apply '+ (mapcar '* r v))) m) ) ;; Matrice de rotation de dimension 3 (defun 3x3RotMatrix (ang) (list (list (cos ang) (- (sin ang)) 0) (list (sin ang) (cos ang) 0) '(0 0 1) ) ) ;;;**************************************************************************;;; (defun c:model_hatch (/ zindim dec_prec ent ent_dxf nam_pat user_angle user_scale nbr_line dxf_line ang_motif n first_op transform pt_trans ) (while (not (setq ent (entsel "\nChoix de la Hachure modèle: "))) ) (initget 4) (setq dec_prec (getint "\nNombres de décimales a afficher ? : ") ent_dxf (entget (car ent)) zindim (getvar "dimzin") ) (if (not dec_prec) (setq dec_prec 8) ) (setvar "dimzin" 8) (cond ((eq (cdr (assoc 0 ent_dxf)) "HATCH") (setq nam_pat (strcat "\n*" (cdr (assoc 2 ent_dxf))) user_angle (cdr (assoc 52 ent_dxf)) user_scale (cdr (assoc 41 ent_dxf)) nbr_line (cdr (assoc 78 ent_dxf)) dxf_line '() first_op T ) (setq ent_dxf (member (assoc 53 ent_dxf) ent_dxf)) (setq descr nam_pat) (repeat nbr_line (repeat 5 (setq dxf_line (cons (cdar ent_dxf) dxf_line) ent_dxf (cdr ent_dxf) ) (if (eq (caar ent_dxf) 79) (progn (setq n (cdar ent_dxf) ent_dxf (cdr ent_dxf) dxf_line (cons nil dxf_line) ) (repeat n (setq dxf_line (cons (* (/ 1.0 user_scale) (cdar ent_dxf)) dxf_line ) ent_dxf (cdr ent_dxf) ) ) ) ) ) (setq dxf_line (reverse dxf_line) ang_motif (car dxf_line) dxf_line (cdr dxf_line) ) (setq descr (strcat descr "\n" (angtos (- ang_motif user_angle) 0 dec_prec) ) ) (repeat (- (length dxf_line) (1+ n)) (cond ((not (car dxf_line)) (setq dxf_line (cdr dxf_line)) (while dxf_line (setq descr (strcat descr "," (rtos (car dxf_line) 2 dec_prec) ) ) (setq dxf_line (cdr dxf_line)) ) ) (T [color=#3333FF](if first_op (setq transform (3x3RotMatrix (- user_angle)) first_op nil ) (setq transform (3x3RotMatrix (- ang_motif))) ) (setq pt_trans (mxv transform (list (* (/ 1.0 user_scale) (car dxf_line)) (* (/ 1.0 user_scale) (cadr dxf_line)) 0.0 ) ) )[/color] (setq descr (strcat descr "," (rtos (car pt_trans) 2 dec_prec) "," (rtos (cadr pt_trans) 2 dec_prec) ) ) (setq dxf_line (cddr dxf_line)) ) ) ) (setq dxf_line '() first_op T ) ) (textscr) (princ descr) (initget "Oui Non") (if (and (= (getkword "\nEnregistrer dans un fichier ? [Oui/Non] : " ) "Oui" ) (setq file (getfiled "Créez ou sélectionnez un fichier" (if (= (getvar "measurement") 1) (findfile "acadiso.pat") (findfile "acad.pat") ) "pat" 33 ) ) ) (progn (setq file (open file "a")) (princ (strcat (substr descr 2) "\n") file) (close file) ) ) (graphscr) ) (T (prompt "\nEntité n'est pas une hachure.")) ) (setvar "dimzin" zindim) (prin1) ) [Edité le 5/4/2007 par (gile)] [Edité le 6/4/2007 par (gile)] 1 Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 5 avril 2007 Posté(e) le 5 avril 2007 J'ai ajouté la possibilité d'enregistrer le motif dans un fichier *.PAT, à créer ou à ajouter à un fichier existant. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Zeberb Posté(e) le 12 juillet 2018 Posté(e) le 12 juillet 2018 Salut à tous! Quelqu'un s'est-il déjà intéressé à la possibilité d'exporter plusieurs hachures vers un ou plusieurs fichier(s) .pat en une manoeuvre? Meilleures salutations,Bertrand
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