Aller au contenu

Creer fichier PAT depuis une hachure existante


Messages recommandés

Posté(e)

 

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

Posté(e)

 

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

Posté(e)

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

Posté(e)

 

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

Posté(e)

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

  • Like 1

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

  • 11 ans après...
Posté(e)

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

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é