Aller au contenu

nettoyage de polylignes 3D


Messages recommandés

Posté(e)

Bonjour,

 

c'est encore moi.

 

je cherche un moyen pour supprimer les sommets alignés sur des polylignes 3D, en tenant compte de l'alignement des vecteurs en 3D.

 

le top serai de pouvoir donner une tolérance sur l'alignement des vecteurs...

 

 

j'ai cherché dans les outils de nettoyage de dessin de Map , (généraliser les polylignes) mais le résultat est un peu trops aléatoire....

 

 

merci de vos lumières

Thierry Garré

 

Géorail-Covadis-Autopiste-Autocad-Autocad Map-Infraworks 360- Navisworks -Recap

Posté(e)

As-tu testé OVERKILL des Express, il fait ce boulot sur les polys2D alors peut-être sur les 3D ?

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Posté(e)

Merci Tramber.

 

je n'ai pas encore teté OVERKILL (je v'ai tout de même tester)

 

mais j'ai trouvé une solution entre temps avec Covadis...

Thierry Garré

 

Géorail-Covadis-Autopiste-Autocad-Autocad Map-Infraworks 360- Navisworks -Recap

Posté(e)

au clavier:

 

cnivsimplification3d

 

on indique le rayon "d'un tube"

 

tout les sommets intermédaires contenu dans le tube seront supprimés.

 

actuellement la selection se fait polyligne par polyligne.

 

je crois savoir qu'en V10 la selection devrai pouvoir se faire par calque

Thierry Garré

 

Géorail-Covadis-Autopiste-Autocad-Autocad Map-Infraworks 360- Navisworks -Recap

Posté(e)

Salut,

 

J'avais fait un LISP pour une demande semblable, je l'ai un peu remanié, si ça peut être utile.

 

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

;;; ACOS Retourne l'arc cosinus du nombre, en radians

(defun acos (num)
 (cond
   ((equal num 1 1e-9) 0.0)
   ((equal num -1 1e-9) pi)
   ((     (atan (sqrt (- 1 (expt num 2))) num)
   )
 )
)

;;; ANGLE_3PTS Retourne l'angle (radians) défini par son sommet et deux points
;;; L'angle retourné est toujours positif et inférieur à pi radians.

(defun angle_3pts (som p1 p2)
 ((lambda (d1 d2 d3)
    (if (and (       (ACOS (/	(+ (* d1 d1) (* d2 d2) (- (* d3 d3)))
	(* 2 d1 d2)
     )
      )
    )
  )
   (distance som p1)
   (distance som p2)
   (distance p1 p2)
 )
)

(defun c:clean_3dpoly (/ acdoc pl tol old new v1 v2)
 (vl-load-com)
 (if
   (and
     (setq pl (car (entsel "\nSélectionnez une polyligne 3d: ")))
     (setq pl (vlax-ename->vla-object pl))
     (= (vla-get-ObjectName pl) "AcDb3dPolyline")
     (or (setq	tol
	 (getangle
	   "\nSpécifiez l'angle de tolérance : "
	 )
  )
  (setq tol 0.0)
     )
   )
    (progn
      (vla-StartUndomark
 (vla-get-ActiveDocument (vlax-get-acad-object))
      )
      (setq old (3d-coord->pt-lst (vlax-get pl 'Coordinates)))
      (and (= (vla-get-Closed pl) :vlax-true)
    (setq old (append old (list (car old))))
      )
      (setq new (list (car old))
     old (cdr old)
      )
      (while (cadr old)
 (setq v1 (mapcar '- (car old) (car new))
       v2 (mapcar '- (cadr old) (car old))
 )
 (if (or (equal '(0 0 0) v1 1e-9)
	 (equal '(0 0 0) v2 1e-9)
	 (	     )
   (setq old (cdr old))
   (setq new (cons (car old) new)
	 old (cdr old)
   )
 )
      )
      (and (= (vla-get-Closed pl) :vlax-true)
    (setq old (list (car old)))
      )
      (vlax-put pl
	 'Coordinates
	 (apply 'append (append (reverse new) old))
      )
      (vla-EndUndomark
 (vla-get-ActiveDocument (vlax-get-acad-object))
      )
    )
 )
 (princ)
) 

[Edité le 14/9/2007 par (gile)]

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

Posté(e)

 

Hello Gilles

 

C quoi l'angle que tu demandes en tolérance !?

 

Il décrit (A mon sens) un cone en 3D dans lequel les sommets 3D intermédiaires sont éliminés ?

 

Merci d'avance de tes précisions ...

 

Le Decapode

 

Autodesk Expert Elite Team

Posté(e)

Salut lecrabe,

 

On peut effectivement voir ça comme ça. L'axe du cone serait la droite du sommet n au sommet n+2, si le sommet n+1 est dans le cone, il est supprimé.

 

Mais après avoir lu que Covadis fonctionne avec un "cylindre" je vais voir si je peux faire quelque chose dans ce sens.

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

Posté(e)

La version "cylindre".

 

La tolérance est la distance entre la droite de "sommet n" à "sommet n+2" et "sommet n+1" en deçà de laquelle "sommet n+1" sera supprimé.

 

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

;;; ACOS Retourne l'arc cosinus du nombre, en radians

(defun acos (num)
 (cond
   ((equal num 1 1e-9) 0.0)
   ((equal num -1 1e-9) pi)
   ((     (atan (sqrt (- 1 (expt num 2))) num)
   )
 )
)

(defun c:clean_3dpoly (/ acdoc pl tol old new d1 d2 d3)
 (vl-load-com)
 (if
   (and
     (setq pl (car (entsel "\nSélectionnez une polyligne 3d: ")))
     (setq pl (vlax-ename->vla-object pl))
     (= (vla-get-ObjectName pl) "AcDb3dPolyline")
     (or (setq	tol
	 (getdist
	   "\nSpécifiez la tolérance : "
	 )
  )
  (setq tol 1e-9)
     )
   )
    (progn
      (vla-StartUndomark
 (vla-get-ActiveDocument (vlax-get-acad-object))
      )
      (setq old (3d-coord->pt-lst (vlax-get pl 'Coordinates)))
      (and (= (vla-get-Closed pl) :vlax-true)
    (setq old (append old (list (car old))))
      )
      (setq new (list (car old))
     old (cdr old)
      )
      (while (cadr old)
 (setq d1 (distance (car new) (car old))
       d2 (distance (car new) (cadr old))
       d3 (distance (car old) (cadr old))
 )
 (if (or
       (	       (	       (		     (sin (acos	(/ (+ (* d1 d1) (* d2 d2) (- (* d3 d3)))
			   (* 2 d1 d2)
			)
		  )
	     )
	  )
	  tol
       )
     )
   (setq new (cons (car old) new)
	 old (cdr old)
   )
   (setq old (cdr old))
 )
      )
      (and (= (vla-get-Closed pl) :vlax-true)
    (setq old (list (car old)))
      )
      (vlax-put pl
	 'Coordinates
	 (apply 'append (append (reverse new) old))
      )
      (vla-EndUndomark
 (vla-get-ActiveDocument (vlax-get-acad-object))
      )
    )
 )
 (princ)
) 

 

PS : j'avais oublié de joindre la routine ACOS au LISP précédent, c'est réparé.

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é