Aller au contenu

RACCORD EN 3D


Invité jojo78

Messages recommandés

Invité jojo78
Posté(e)

Bonjour,

Je travail avec autocad 2011 version complète.

J'ai dessiné un réseau de chauffage en 3D sur 3 niveaux.

Je ne suis pas experte en 3D, j'ai découvert un peu au fur et à mesure.

Voilà comment j'ai procédé, j'ai 1 fichier par niveau où j'ai dessiné mes réseau en 2D.

J'ai ouvert un nouveau fichier pour créer ma 3D. J'y ai inséré chaque fichiers des niveaux en Xref que j'ai positionner avec le z différent pour qu'ils se superpose.

J'ai créer mes tuyau en dessinant un cercle et en utilisant la commande balayage pour obtenir un cylindre.

 

Seulement le raccord entre un cylindre horizontal et verticale n'est pas très jolie.

Je n'arrive pas à trouver la commande qui permet de faire un raccord en angle droit ou en arrondi?

J'ai fait beaucoup d'essai et je me suis vraiment casser la tête, j'espère trouver quelqu'un qui puisse m'aider.

Merci :(

Invité jojo78
Posté(e)

tu vas peut être me traiter de blonde, mais je ne sais pas ce que c'est le LISP

Posté(e)

Bonjour,

 

J'ai créer mes tuyau en dessinant un cercle et en utilisant la commande balayage pour obtenir un cylindre

Si tu obtiens un cylindre, ça voudrait dire que la trajectoire de balayage est une ligne ?

 

Je pense que tu devrais commencer par dessiner l'axe de ton tuyau sous la forme d'une polyligne 3D.

Tu pourras ensuite:

- faire un balayage d'un cercle suivant cette trajectoire pour obtenir un tuyau avec des angles droits "propres"

- ou utiliser le LISP de (gile) pour créer des coudes sur la polylige 3d avant de faire le balayage.

Posté(e)

tu vas peut être me traiter de blonde, mais je ne sais pas ce que c'est le LISP

 

AutoLISP est un langage de programmation intégré à AutoCAD qui permet donc d'écrire des programmes pour automatiser certaines taches.

 

Pour utiliser un programme LISP, il faut le charger dans le dessin et lancer la commande qui y est définie.

De plus amples explications dans ce sujet.

 

Dans ton cas, tu copies tout le code dans le bloc-note, tu l'enregistres sous 3dPolyFillet.lsp (bien mettre l'extension .lsp), tu le charges dans AutoCAD et tu lances la commande : 3dpolyfillet.

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

Invité jojo78
Posté(e)

c'est quoi le code à copier dans le bloc-note et ou faut il l'enregistrer pour pouvoir le charger dans Autocad

Posté(e)

Quand tu cliques sur le lien 3dPolyFillet sur cette page, suivant comment est paramétré ton navigateur, soit il te propose directement d'enregistrer le fichier, soit il t'affiche le code dans un nouvel onglet.

 

Tu peux enregistrer le fichier où tu veux sur ton poste, mais l'enregistrer dans un répertoire des chemins de support d'AutoCAD peut simplifier certaines choses par la suite. C'est quand tu le chargeras dans le dessin (avec APPLOAD par exemple) qu'il faudra parcourir ton poste jusqu'au fichier.

 

Encore une fois, de larges explications sont données dans ce sujet.

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

Invité jojo78
Posté(e)

OK

Je rencontre un autre problème, je suis au travail et la page qui devrait s'afficher lorsque je vais sur le lien 3dPolyFillet est verrouiller.

 

Aïe aïe restriction informatique de la boite sont dur avec moi.

Va falloir que je leurs demande de me débloquer cela.

 

En tout cas merci de ta patience

Invité jojo78
Posté(e)

Bloquer aussi

 

Font chi.. l'informatique :mad:

Posté(e)

On va faire simple, copie tout ce qui est sur fond de papier perforé (sans oublier une parenthèse), colle le dans le bloc-note et enregistre le sous 3dPolyFillet.lsp.

 

;;; 3dPolyFillet -Gilles Chanteau- 21/01/07 -Version 1.5-
;;; Crée un "raccord" sur les polylignes 3D (succession de segments)

(defun c:3dPolyFillet (/	   3dPolyFillet_err	   closest_vertices
	       MakeFillet  ModSp       cnt	   prec
	       rad	   ent1	       ent2	   vxlst
	       plst	   param       obj
	      )
 (vl-load-com)
 (or *acad* (setq *acad* (vlax-get-acad-object)))
 (or *acdoc* (setq *acdoc* (vla-get-ActiveDocument *acad*)))

;;;*************************************************************;;;

 (defun 3dPolyFillet_err (msg)
   (if	(= msg "Fonction annulée")
     (princ)
     (princ (strcat "\nErreur: " msg))
   )
   (vla-EndUndoMark *acdoc*)
   (setq *error* m:err
  m:err	nil
   )
   (princ)
 )

;;;*************************************************************;;;

 (defun closest_vertices (obj pt / par)
   (if	(setq par (vlax-curve-getParamAtPoint obj pt))
     (list (vlax-curve-getPointAtParam obj (fix par))
    (vlax-curve-getPointAtParam obj (1+ (fix par)))
     )
   )
 )

;;;*************************************************************;;;

 (defun MakeFillet (obj   par1	 par2  /     pts1  pts2	 som   p1    p2
	     ptlst norm	 pt0   pt1   pt2   pt3	 pt4   cen   ang
	     inc   n	 vlst  nb1   nb2
	    )
   (if	(and
  (setq pts1 (closest_vertices obj par1))
  (setq pts2 (closest_vertices obj par2))
)
     (progn
(setq som (inters (car pts1) (cadr pts1) (car pts2) (cadr pts2) nil))
(if som
  (if
    (or	(equal (car pts1) som 1e-9)
	(equal (cadr pts1) som 1e-9)
	(and
	  (		     (vlax-curve-getParamAtPoint obj (car pts2))
	  )
	  (equal (vec1 (car pts1) (cadr pts1))
		 (vec1 (car pts1) som)
		 1e-9
	  )
	)
	(and
	  (		     (vlax-curve-getParamAtPoint obj (car pts1))
	  )
	  (equal (vec1 (cadr pts1) (car pts1))
		 (vec1 (cadr pts1) som)
		 1e-9
	  )
	)
    )
     (progn
       (if (		 (setq p1 (cadr pts1)
	       p2 (car pts2)
	 )
	 (setq p1 (car pts1)
	       p2 (cadr pts2)
	 )
       )
       (if (= rad 0)
	 (setq ptlst (list som))
	 (progn
	   (setq norm (norm_3pts som p2 p1)
		 pt0  (trans som 0 norm)
		 pt1  (trans p1 0 norm)
		 pt2  (trans p2 0 norm)
		 cen  (inters
			(polar pt0 (- (angle pt0 pt1) (/ pi 2)) rad)
			(polar pt1 (- (angle pt0 pt1) (/ pi 2)) rad)
			(polar pt0 (+ (angle pt0 pt2) (/ pi 2)) rad)
			(polar pt2 (+ (angle pt0 pt2) (/ pi 2)) rad)
			nil
		      )
		 pt3  (polar cen (- (angle pt1 pt0) (/ pi 2)) rad)
		 pt4  (polar cen (+ (angle pt2 pt0) (/ pi 2)) rad)
		 ang  (- (angle cen pt4) (angle cen pt3))
	   )
	   (if
	     (and (inters pt0 pt1 cen pt3 T) (inters pt0 pt2 cen pt4 T))
	      (progn
		(if (minusp ang)
		  (setq ang (+ (* 2 pi) ang))
		)
		(setq inc (/ ang prec)
		      n	  0
		)
		(repeat	(1+ prec)
		  (setq	ptlst (cons
				(polar cen (- (angle cen pt4) (* inc n)) rad)
				ptlst
			      )
			n     (1+ n)
		  )
		)
		(setq
		  ptlst	(mapcar	(function (lambda (p) (trans p norm 0)))
				ptlst
			)
		)
	      )
	   )
	 )
       )
       (setq vlst (3d-coord->pt-lst (vlax-get obj 'Coordinates)))
       (if ptlst
	 (progn
	   (setq nb1 (vl-position p1 vlst)
		 nb2 (vl-position p2 vlst)
	   )
	   (if (= (vla-get-closed obj) :vlax-true)
	     (cond
	       ((and (equal p1 (car vlst))
		     (equal p2 (cadr (reverse vlst)))
		)
		(setq
		  vlst
		   (append (sublist vlst 0 (1+ nb2)) (reverse ptlst))
		)
	       )
	       ((and (equal p1 (cadr (reverse vlst)))
		     (equal p2 (car vlst))
		)
		(setq vlst (append (sublist vlst 0 (1+ nb1)) ptlst))
	       )
	       ((and (equal p1 (cadr vlst))
		     (equal p2 (last vlst))
		)
		(setq
		  vlst
		   (append (reverse ptlst) (sublist vlst nb1 nil))
		)
	       )
	       ((and (equal p1 (last vlst))
		     (equal p2 (cadr vlst))
		)
		(setq vlst (append ptlst (sublist vlst nb2 nil))
		)
	       )
	       (T
		(if (			  (setq	vlst (append (sublist vlst 0 (1+ nb1))
				     ptlst
				     (sublist vlst nb2 nil)
			     )
		  )
		  (setq	vlst (append (sublist vlst 0 (1+ nb2))
				     (reverse ptlst)
				     (sublist vlst nb1 nil)
			     )
		  )
		)
	       )
	     )
	     (if (equal (car vlst) (last vlst) 1e-9)
	       (cond
		 ((and (equal p1 (cadr vlst))
		       (equal p2 (cadr (reverse vlst)))
		  )
		  (setq	vlst (append (sublist vlst 1 nb2)
				     (reverse ptlst)
				     (list (cadr vlst))
			     )
		  )
		 )
		 ((and (equal p1 (cadr (reverse vlst)))
		       (equal p2 (cadr vlst))
		  )
		  (setq	vlst (append (sublist vlst 1 nb1)
				     ptlst
				     (list (cadr vlst))
			     )
		  )
		 )
	       )
	       (if (			 (setq vlst (append (sublist vlst 0 (1+ nb1))
				    ptlst
				    (sublist vlst nb2 nil)
			    )
		 )
		 (setq vlst (append (sublist vlst 0 (1+ nb2))
				    (reverse ptlst)
				    (sublist vlst nb1 nil)
			    )
		 )
	       )
	     )
	   )
	   (vlax-put obj 'Coordinates (apply 'append vlst))
	 )
	 (prompt "\nLe rayon spécifié est trop grand.")
       )
     )
     (prompt "\nLes segments sont divergents.")
  )
  (prompt "\nLes segments ne sont pas concourants.")
)
     )
     (prompt "\nLe rayon spécifié est trop grand.")
   )
 )

;;;*************************************************************;;;

 (setq ModSp (vla-get-ModelSpace *acdoc*))
 (setq	m:err	*error*
*error*	3dPolyFillet_err
 )
 (vla-StartUndoMark *acdoc*)

 ;; Saisie des données
 (if (not (vlax-ldata-get "3dFillet" "Prec"))
   (vlax-ldata-put "3dFillet" "Prec" 20)
 )
 (if (not (vlax-ldata-get "3dFillet" "Rad"))
   (vlax-ldata-put "3dFillet" "Rad" 10.0)
 )
 (prompt (strcat "\nParamètres courants.\tSegments: "
	  (itoa (vlax-ldata-get "3dFillet" "Prec"))
	  "\tRayon: "
	  (rtos (vlax-ldata-get "3dFillet" "Rad"))
  )
 )
 (setq cnt 1)
 (while (= 1 cnt)
   (initget 1 "Segments Rayon")
   (setq ent1
   (entsel
     "\nSélectionnez le premier segment ou [segments/Rayon]: "
   )
   )
   (cond
     ((not ent1)
      (prompt "\nAucun objet sélectionné.")
     )
     ((= ent1 "Segments")
      (initget 6)
      (if (setq prec
	  (getint
	    (strcat "\nSpécifiez le nombre de segments pour les arcs 			    (itoa (vlax-ldata-get "3dFillet" "Prec"))
		    ">: "
	    )
	  )
   )
 (vlax-ldata-put "3dFillet" "Prec" prec)
      )
     )
     ((= ent1 "Rayon")
      (initget 4)
      (if (setq rad
	  (getdist
	    (strcat "\nSpécifiez le rayon 			    (rtos (vlax-ldata-get "3dFillet" "Rad"))
		    ">: "
	    )
	  )
   )
 (vlax-ldata-put "3dFillet" "Rad" rad)
      )
     )
     ((and
 (= (cdr (assoc 0 (entget (car ent1)))) "POLYLINE")
 (= (logand 8 (cdr (assoc 70 (entget (car ent1))))) 8)
      )
      (setq cnt 0)
     )
     (T
      (prompt "\nL'objet sélectionné n'est pas une polyligne 3D.")
     )
   )
 )
 (setq	prec (vlax-ldata-get "3dFillet" "Prec")
rad  (vlax-ldata-get "3dFillet" "Rad")
 )
 (while (not ent2)
   (initget 1 "Tous")
   (setq ent2 (entsel "\nSélectionnez le deuxième segment ou [Tous]: "))
   (if	(not (or (= ent2 "Tous") (eq (car ent1) (car ent2))))
     (progn
(prompt
  "\nLe segment sélectionné n'est pas sur le même objet"
)
(setq ent2 nil)
     )
   )
 )
 (setq obj (vlax-ename->vla-object (car ent1)))
 (if (= ent2 "Tous")
   (progn
     (setq vxlst (3d-coord->pt-lst (vlax-get obj 'Coordinates))
    param 0.5
     )
     (repeat (if (= (vla-get-closed obj) :vlax-true)
	(length vxlst)
	(1- (length vxlst))
      )
(setq plst  (append plst (list (vlax-curve-getPointAtParam obj param)))
      param (1+ param)
)
     )
     (if (or (= (vla-get-closed obj) :vlax-true)
      (equal (car vxlst) (last vxlst) 1e-9)
  )
(setq plst (cons (last plst) plst))
     )
     (setq cnt 0)
     (repeat (1- (length plst))
(MakeFillet
  obj
  (nth cnt plst)
  (nth (setq cnt (1+ cnt)) plst)
)
     )
   )
   (MakeFillet
     obj
     (trans (osnap (cadr ent1) "_nea") 1 0)
     (trans (osnap (cadr ent2) "_nea") 1 0)
   )
 )
 (vla-EndUndoMark *acdoc*)
 (setq	*error*	m:err
m:err nil
 )
 (princ)
)

;;;*************************************************************;;;
;;;*********************** SOUS ROUTINES ***********************;;;


;;;*************************************************************;;;

;;; VEC1 Retourne le vecteur normé (1 unité) de p1 à p2

(defun vec1 (p1 p2)
 ((lambda (d)
    (if (not (zerop d))
      (mapcar (function (lambda (x1 x2) (/ (- x2 x1) d))) p1 p2)
    )
  )
   (distance p1 p2)
 )
)

;; VUNIT
;; Retourne le vecteur unitaire d'un vecteur
;;
;; Argument : un vecteur

(defun vunit (v)
 ((lambda (l)
    (if (/= 0 l)
      (mapcar (function (lambda (x) (/ x l))) v)
    )
  )
   (distance '(0 0 0) v)
 )
)

;; V^V
;; Retourne le produit vectoriel (vecteur) de deux vecteurs
;;
;; Arguments : deux vecteurs

(defun v^v (v1 v2)
 (list	(- (* (cadr v1) (caddr v2)) (* (caddr v1) (cadr v2)))
(- (* (caddr v1) (car v2)) (* (car v1) (caddr v2)))
(- (* (car v1) (cadr v2)) (* (cadr v1) (car v2)))
 )
)

;;;*************************************************************;;;

;;;*************************************************************;;;

;; NORM_3PTS
;; Retourne le vecteur normal du plan défini par 3 points
;;
;; Arguments : trois points

(defun norm_3pts (p0 p1 p2)
 (vunit (v^v (mapcar '- p1 p0) (mapcar '- p2 p0)))
)

;;;*************************************************************;;;

;;; 3d-coord->pt-lst Convertit une liste de coordonnées 3D en liste de points
;;; (3d-coord->pt-lst '(1.0 2.0 3.0 4.0 5.0 6.0)) -> ((1.0 2.0 3.0) (4.0 5.0 6.0))

(defun 3d-coord->pt-lst	(lst)
 (if lst
   (cons (list (car lst) (cadr lst) (caddr lst))
  (3d-coord->pt-lst (cdddr lst))
   )
 )
)

;;;*************************************************************;;;

;;; SUBLIST Retourne une sous-liste
;;;
;;; Arguments
;;; lst : une liste
;;; start : l'index de départ de la sous liste (premier élément = 0)
;;; leng : la longueur (nombre d'éléments) de la sous-liste (ou nil)
;;;
;;; Exemples :
;;; (sublist '(1 2 3 4 5 6) 2 2) -> (3 4)
;;; (sublist '(1 2 3 4 5 6) 2 nil) -> (3 4 5 6)

(defun sublist (lst start leng / n r)
 (if (or (not leng) (    (setq leng (- (length lst) start))
 )
 (setq n (+ start leng))
 (repeat leng
   (setq r (cons (nth (setq n (1- n)) lst) r))
 )
)

;;;*************************************************************;;;

;;; BUTLAST Liste sans le dernier élément

(defun butlast (lst)
 (reverse (cdr (reverse lst)))
)

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

Invité jojo78
Posté(e)

Le lien google de bryce a fonctinner, j'ai enregistrer le fichier .lsp dans le dossier SUPPORT de Autodesck.

J'ai chargé dans Autocad, mais je n'arrive pas à m'en servir sur mon dessin.

 

Je dessine deux polyligne 3D, une horizontal et une verticale, j'applique la commande 3dPolyFillet, mais quand je sélectionne le deuxième segment, il me répond :" le segment sélectionné n'est pas sur le même objet"

 

Je ne comprend pas ce que ça veut dire

Posté(e)

Ça veut dire que le second segment sélectionné n'est pas sur la même polyligne 3d que le premier.

 

Il faut que tu dessines une seule polyligne 3d par tuyau.

Ensuite, tu lances la commande, puis tu peux modifier les les paramètres courants (rayon et nombre de segments par arc) et sélectionner les segments 2 par 2 (ou tous).

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

Invité jojo78
Posté(e)

Ok j'ai 1 polyligne en 3d.

Comment détermine t on le rayon du raccord??

 

Maintenant j'ai fait mes réseau de tuyau avec des cylindre, puis je les joindre pour faire des raccord??

Posté(e)

Comme toutes les commandes AutoCAD, il faut que tu lises les invites en ligne de commande (ou saisie dynamique).

Si au lieu de sélectionner le premier segment tu entre R, tu pourras changer le rayon, si tu entes S tu pourras changer le nombre de segments par arc et si au lieu de sélectionner le second segment, tu entre T, un 'raccord' est créé à chaque sommet.

 

http://gile.pagesperso-orange.fr/3pf_noir.gif

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

Invité jojo78
Posté(e)

:laugh: :laugh: :laugh: :laugh: :laugh:

Génial, j'ai un jolie tuyau qui ressemble à une paille.

 

Mais mon curseur a disparu dans mon espace objet, je peux aller sur les icones, mais sur l'espace de travaille je n'ai plus rien.

 

C'est normale??????

 

Moi j'avais fais tous les réseaux en cylindres, peut on les joindres les un au autre ou dois je tout redessiner???????

Posté(e)

Mais mon curseur a disparu dans mon espace objet, je peux aller sur les icones, mais sur l'espace de travaille je n'ai plus rien.

 

C'est normale??????

Non, ce n'est pas normal.

 

Moi j'avais fais tous les réseaux en cylindres, peut on les joindres les un au autre ou dois je tout redessiner???????

3dPolyFillet ne fonctionne que sur les polylignes 3d. La procédure est, dans l'ordre :

- dessiner la polyligne 3d

- faire les raccords

- extruder ou balayer le profil suivant le chemin de la polyligne

 

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

Invité jojo78
Posté(e)

Bon ben je suis bonne pour tout redessiner :mad2:

 

Ca me fera de l'entraînnement

 

Et encore merci d'avoir aussi bien expliqué

Posté(e)

Bonsoir,

 

j'ai remarqué ce BUG, de temps en temps AutoCAD se prend le pied dans le tapis entre la couleur NOIR/BLANC !!!!!

 

J'ai pris l'habitude de mettre la couleur de mon curseur en MAGENTA....

 

Tiens est-ce que la 2012 permet de manière natif de créer des RACCORDS sur une polyligne 3D ?! Il serait temps...

 

Christian

Formateur, Consultant Expert AutoCAD, REVIT MEP, INVENTOR, télécharger , des Outils AutoCAD...

cad123 @ wanadoo.fr (enlever les espaces de part et d'autre de @)

  • 3 mois après...
Posté(e)

Bonjour

 

Voila j'essaye d'utiliser le raccord 3D mais sa m'affiche l'erreur suivante:

 

Erreur: impossible de trouver l'ID de l'objet: #

 

Se qui m'énerve le plus c'est que sur l'ordi de mon collègues de travail sa marche parfaitement on peut même s'en servir pour les coudes des tubes 3d et il me nargues en permanence.

 

Bref un petit coup de main ne serait pas de refus merci d'avance!

Posté(e)

Salut,

 

Difficile de répondre avec aussi peu d'informations.

 

Essaye toujours de télécharger ou copier le LISP à nouveau et de le recharger, mais vu le type d'erreur, je pencherais plus pour un problème venant d'AutoCAD que du LISP.

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é