Aller au contenu

Prolonger/Ajuster une ligne3D sur un plan de coupe


Messages recommandés

Posté(e)

Si vous avez besoin de prolonger/ajuster une ligne en 3D sur une face de solide ou tout autre plan de coupe défini par 3 points, essayez ceci :

 

(defun c:int_3d ( / js nw_ucs dxf_ent dxf_10 dxf_11 p10_2d p11_2d p_int)
(princ "\nSélectionner la ligne à Prolonger/Ajuster à un plan de coupe: ")
(while (null (setq js (ssget "_:S"  '((0 . "LINE")))))
	(princ "\nSélection vide ou ce n'est pas une ligne!")
)
(initget "Nouveau Courant _New Current")
(setq nw_ucs (getkword "\nUtiliser SCU [Nouveau/Courant] < Courant > : "))
(if (eq nw_ucs "New")
	(command "_.ucs" "_3point" pause pause pause)
)
(setq
	dxf_ent (entget (ssname js 0))
	dxf_10 (trans (cdr (assoc 10 dxf_ent)) 0 1)
	dxf_11 (trans (cdr (assoc 11 dxf_ent)) 0 1)
	p10_2d (list (car dxf_10) (cadr dxf_10) 0.0)
	p11_2d (list (car dxf_11) (cadr dxf_11) 0.0)
	p_int (inters p10_2d p11_2d dxf_10 dxf_11 nil)
)
(cond
	(p_int
		(if (> (distance p_int p11_2d) (distance p_int p10_2d))
			(entmod (subst (cons 10 (trans p_int 1 0)) (assoc 10 dxf_ent) dxf_ent))
			(entmod (subst (cons 11 (trans p_int 1 0)) (assoc 11 dxf_ent) dxf_ent))
		)
	)
	(T
		(princ "\nLigne parrallèle au plan de coupe!")
	)
)
(if (eq nw_ucs "New")
	(command "_.ucs" "_previous")
)
(prin1)
)

 

Bien que j'ai essayé de tester dans plusieurs cas de figure, il ce peut que dans certain cas cela ne fonctionne pas. A voir....

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Malin le coup des coordonnées 3D/2D ;)

 

Moi, j'aurais bêtement utilisé la calculatrice géométrique.

 

On peut aussi, avec (entsel) au lieu de (ssget) récupérer un point pour spécifier le côté à ajuster.

 

;;; EXTRIM3D Ajuste ou prolonge une ligne à un plan

(defun c:extrim3d (/ ext_mod ent pick dxf_ent p1 p2 p3 p4 p5 cut p_int)

 (vl-load-com)

 ;; EXT_MOD Modifier une extrémité de la ligne
 (defun ext_mod (code)
   (entmod (subst (cons code (trans p_int 1 0))
	   (assoc code dxf_ent)
	   dxf_ent
    )
   )
 )

 ;; Charger la calculatrice
 (if (not (member "geomcal.arx" (arx)))
   (arxload "geomcal")
 )

 ;; Sélectionner le plan de coupe
 (initget "XY YZ ZX 3points")
 (setq	p3
 (getpoint
   "\nSpécifiez le premier point du plan de coupe ou [XY/YZ/ZX/3points]  : "
 )
 )
 (cond
   ((or (null p3) (= p3 "3points"))
    (initget 1)
    (setq p3 (getpoint "\nPremier point: "))
   )
 )
 (cond
   ((listp p3)
    (setq p4 p3
   p5 p3
    )
    (while (equal p3 p4 1e-9)
      (initget 1)
      (setq p4 (getpoint p3 "\nSecond point: "))
    )
    (while (or	(equal p3 p5 1e-9)
	(equal p4 p5 1e-9)
	(linearp (list p3 p4 p5))
    )
      (initget 1)
      (setq p5 (getpoint p3 "\nTroisième point: "))
    )
   )
   (T
    (setq cut (getpoint
	 (strcat
	   "\nSpécifiez un point sur le plan "
	   p3
	   " : "
	 )
       )
    )
    (if (null cut)
      (setq cut '(0 0 0))
    )
    (cond
      ((= p3 "XY")
(setq p3 (list 0 0 (caddr cut))
      p4 (list 1 0 (caddr cut))
      p5 (list 0 1 (caddr cut))
)
      )
      ((= p3 "YZ")
(setq p3 (list (car cut) 0 0)
      p4 (list (car cut) 1 0)
      p5 (list (car cut) 0 1)
)
      )
      ((= p3 "ZX")
(setq p3 (list 0 (cadr cut) 0)
      p4 (list 0 (cadr cut) 1)
      p5 (list 1 (cadr cut) 0)
)
      )
    )
   )
 )

 ;; Sélectionner la ou les lignes
 (while (setq ent
	(entsel
	  "\nSélectionner la ligne à Prolonger/Ajuster au plan de coupe: "
	)
 )
   (cond
     ((= (cdr (assoc 0 (entget (car ent)))) "LINE")
      (vla-startundomark
 (vla-get-activedocument (vlax-get-acad-object))
      )
      (setq pick    (osnap (cadr ent) "_nea")
     ent     (car ent)
     dxf_ent (entget ent)
     p1	     (trans (cdr (assoc 10 dxf_ent)) 0 1)
     p2	     (trans (cdr (assoc 11 dxf_ent)) 0 1)
      )

      ;; Ajuster / Prolonger
      (cond
 ((setq p_int (cal "ilp(p1,p2,p3,p4,p5)"))
  (if (and (		   (	      )
    ;; Ajuster
    (if	(	      (ext_mod 10)
      (ext_mod 11)
    )
    ;; Prolonger
    (if	(		   (distance p_int (cal "plt(p1,p2,0.5)"))
	)
      (if (		(ext_mod 10)
	(ext_mod 11)
      )
      (prompt "\nAucun seuil dans cette direction.")
    )
  )
  (entupd ent)
 )
 (T
  (prompt "\nLigne parallèle au plan de coupe.")
 )
      )
     )
     (T
      (prompt "\nL'objet sélectionné n'est pas une ligne.")
     )
   )
   (vla-endundomark
     (vla-get-activedocument (vlax-get-acad-object))
   )
 )
 (princ)
)

 

[Edité le 3/5/2006 par (gile)]

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

Posté(e)

Une autre façon de faire, ta version a l'avantage de ne pas utiliser de (command)

 

Je suis cependant pas persuadé sur le fait d'utiliser (entsel) pour le point de sélection, mais c'est une affaire de goût ;)

J'ai observé des déplacements de sommets qui me semble pas logique dans l'esprit prolonger/ajuster ou alors des erreurs dans tes conditions....

 

NB: Il y a une paranthèse fermante supplémentaire dans ton code, je l'ai située juste avant la sélection de la ligne, si je n'ais pas fait d'erreur....

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Ooops, il y avait effectivement une paranthèse supplémentaire.

 

J'ai corrigé le code et j'en ai profité pour ajouter deux petites amélioratons : la possibilité d'ajuster ou prolonger plusieurs lignes et d'annuler les actions.

 

Merci Bonus d'avoir testé, de mon côté je ne vois pas dysfonctionnements (peut-être que mes test ne sont pas "objectifs")

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

Posté(e)

Sympa cette version, je préfère ;)

 

je ne vois pas dysfonctionnements

 

Il n'y en a pas, du moins je n'en ais pas trouvé...

Ce que je voulais dire: Lorsque tu utilise la commande prolonger "classique" et que la sélection se situe sur la partie opposée, Autocad te dit qu'il n'y a pas de seuil dans cette direction.

 

Hors ta routine, elle, déplace le sommet opposé et tu obtiens la ligne "complémentaire".

 

Voilà c'est tout, ce n'est pas génant, mais ça ne respecte pas la logique dont on a l'habitude. :exclam:

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Effectivement, je n'ai pas pensé à çà.

 

Comme il n'y a qu'un seul plan de coupe, je ne me suis pas préoccupé du côté de la ligne sélectionné en cas de prolongation.

 

Je corrige pour un fonctionnement plus semblable à la logique habituelle.

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

Posté(e)

Une nouvelle amélioration : la possibilité de spécifier un point pour spécifier un plan parallèle aux plans XY, XZ, et YZ (comme dans la commande _slice/section).

 

J'édite le code ci-dessus

 

 

Et une nouvelle version qui reprend l'astuce de Bonuscad (points 3D et leur projections sur le plan de coupe) mais sans changement de SCU ni utilisation de la calculatrice. Cette version utilise les routines de calcul angulaire et vectoriel définies ici. Les routines PROJ_PT, VEC1, ANGLE_3D, NORM_3D,LINEARP et ASIN doivent être chargées (c'est ce type de petites fonctions, qui sont amenées à être utilisées dans d'autres routines, qui peuvent être rassemblées dans un fichier "Perso_utils.lsp" chargé systématiquement).

 

;;; ELEV retourne l'élévation point pt par rapport au plan défini par p1 p2 p3

(defun elev (pt p1 p2 p3)
 (* (cos (angle_3pts p1 (mapcar '+ p1 (norm_3pts p1 p2 p3)) pt))
    (distance p1 pt)
 )
)

;;; PROJ_PT Retourne les coordonnées de la projection orthogonale du point pt
;;; sur le plan défini par les points p1 p2 p3.

(defun proj_pt (pt p1 p2 p3)
 (mapcar '-
  pt
  (mapcar '(lambda (x) (* x (elev pt p1 p2 p3)))
	  (norm_3pts p1 p2 p3)
  )
 )
)


;;; C:INT_3D Ajuste ou prolonge un ligne au plan spécifié
;;; NOTA : ELEV, PROJ_PT, ANGLE_3PTS, NORM_3PTS, VEC1, LINEARP et ASIN doivent être chargés

(defun c:int_3d	(/ ext_mod ent pick dxf_ent p1 p2 p3 p4 p5 cut p_int)

 ;; EXT_MOD Modifier une extrémité
 (defun ext_mod (code)
   (entmod (subst (cons code (trans p_int 1 0))
	   (assoc code dxf_ent)
	   dxf_ent
    )
   )
 )

 ;; Sélectionner le plan de coupe
 (initget "XY XZ YZ 3points")
 (setq	p3
 (getpoint
   "\nSpécifiez le premier point du plan de coupe ou [XY/XZ/YZ/3points]  : "
 )
 )
 (cond
   ((or (null p3) (= p3 "3points"))
    (initget 1)
    (setq p3 (getpoint "\nPremier point: "))
   )
 )
 (cond
   ((= (type p3) 'STR)
    (if (null
   (setq cut (getpoint
	       (strcat
		 "\nSpécifiez un point sur le plan "
		 p3
		 " : "
	       )
	     )
   )
 )
      (setq cut '(0 0 0))
    )
    (cond
      ((= p3 "XY")
(setq p3 (list 0 0 (caddr cut))
      p4 (list 1 0 (caddr cut))
      p5 (list 0 1 (caddr cut))
)
      )
      ((= p3 "XZ")
(setq p3 (list 0 (cadr cut) 0)
      p4 (list 1 (cadr cut) 0)
      p5 (list 0 (cadr cut) 1)
)
      )
      ((= p3 "YZ")
(setq p3 (list (car cut) 0 0)
      p4 (list (car cut) 1 0)
      p5 (list (car cut) 0 1)
)
      )
    )
    )
    (T
      (initget 1)
      (setq p4 (getpoint p3 "\nSecond point: "))
      (initget 1)
      (setq p5 (getpoint p3 "\nTroisième point: "))
    )
   )

   ;; Sélectionner la ou les lignes
   (while
    (setq ent
    (entsel
      "\nSélectionner la ligne à Prolonger/Ajuster au plan de coupe: "
    )
    )
    (cond
      ((= (cdr (assoc 0 (entget (car ent)))) "LINE")
(command "_regen")
(setq pick    (osnap (cadr ent) "_nea")
      ent     (car ent)
      dxf_ent (entget ent)
      p1      (trans (cdr (assoc 10 dxf_ent)) 0 1)
      p2      (trans (cdr (assoc 11 dxf_ent)) 0 1)
)

;; Ajuster / Prolonger
(cond
  ((setq p_int (inters p1
		       p2
		       (proj_pt p1 p3 p4 p5)
		       (proj_pt p2 p3 p4 p5)
		       nil
	       )
   )
   (if (	     ;; Ajuster
     (if (	       (ext_mod 10)
       (ext_mod 11)
     )
     ;; Prolonger
     (if (		    (distance p_int (mapcar '(lambda (x1 x2) (/ (+ x1 x2) 2)) p1 p2))
	 )
       (if (		 (ext_mod 10)
	 (ext_mod 11)
       )
       (prompt "\nAucun seuil dans cette direction.")
     )
   )
   (entupd ent)
  )
  (T
   (prompt "\nLigne parallèle au plan de coupe.")
  )
)
      )
      (T
(prompt "\nL'objet sélectionné n'est pas une ligne.")
      )
    )
   )
   (princ)
 ) 

 

[Edité le 2/4/2006 par (gile)]

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

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é