Aller au contenu

Permuter face 3d


fradiqueluis

Messages recommandés

Bonjour à tous, je voulais avant tout remercier la contribution de chaque personne. Car je sais que beaucoup d'entre vous apportent leurs aides sur leurs temps libre. Donc un Grand Merci.

 

Alors je m'explique, je suis à la recherche d'un lisp qui pourrait me permettre de permuter des face 3d d'un MNT.

C'est une fonction existante dans covadis, pour ceux qui connaissent le produit.

 

J'espère que quelqu'un à une solution pour moi. Merci

Lien vers le commentaire
Partager sur d’autres sites

Vous posez des questions sur Civil 3D ou AutoCAD?

Je voulais savoir, vous spécifiez deux objet 3dfase ou est un objet ayant 4 sommets?

 

en:

 

You ask about Civil 3d or Autocad?

I wanted to know, you specify two 3dfase object or one object having 4 different points?

 

ps. this google translate :(

Evgeniy

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Tu peux essayer ça (bien que, normalement, la méthode Delaunay optimise la triangulation).

L'utilisateur sélectionne l'arrête commune aux deux faces à permuter.

La sélection (un seul clic) doit contenir deux et seulement deux faces. ces faces doivent être triangulaires et avoir une arrête commune (deux sommets communs confondus) sinon le programme affiche un message d'erreur.

 

;; SWAP3DFACES
;; Permute les deux faces 3d dont l'arrête commune est sélectionnée
(defun c:swap3dfaces (/	getVertices getVertices	getTriangle entmodFace
	      ss elst1	elst2 pts1 pts2	inter p1 p2)
 (vl-load-com)

 (defun isVertex (x) (member (car x) '(10 11 12 13)))

 (defun getVertices (elst)
   (mapcar 'cdr (vl-remove-if-not 'isVertex elst))
 )

 (defun getTriangle (pts)
   (if	(= 3 (length (setq pts (gc:distinct pts))))
     (if (gc:clockwise (car pts) (cadr pts) (caddr pts))
(reverse pts)
pts
     )
   )
 )

 (defun entmodFace (elst pts)
   (entmod
     (append
(vl-remove-if 'isVertex elst)
(list
  (cons 10 (car pts))
  (cons 11 (cadr pts))
  (cons 12 (caddr pts))
  (cons 13 (caddr pts))
)
     )
   )
 )

 (if ; <- remplacer par while pour une commande répétitive
   (and
     (setq ss (ssget "_:E:S" '((0 . "3DFACE"))))
     (= 2 (sslength ss))
   )
    (if
      (and
 (setq pts1 (getTriangle
	      (getVertices (setq elst1 (entget (ssname ss 0))))
	    )
 )
 (setq pts2 (getTriangle
	      (getVertices (setq elst2 (entget (ssname ss 1))))
	    )
 )
      )
(if (= 2 (length (setq inter (gc:intersect pts1 pts2))))
  (progn
    (vla-StartUndoMark
      (vla-get-Activedocument (vlax-get-acad-object))
    )
    (setq p1 (car (gc:substract pts1 inter))
	  p2 (car (gc:substract pts2 inter))
    )
    (if	(gc:clockwise p1 p2 (car inter))
      (setq pts1 (list (car inter) p2 p1)
	    pts2 (list p1 p2 (cadr inter))
      )
      (setq pts1 (list p1 p2 (car inter))
	    pts2 (list (cadr inter) p2 p1)
      )
    )
    (entmodFace elst1 pts1)
    (entmodFace elst2 pts2)
    (vla-EndUndoMark
      (vla-get-Activedocument (vlax-get-acad-object))
    )
  )
  (princ
    "\nL'arrête sélectionnée n'est pas commune aux deux faces"
  )
)
(princ "\nFace(s) non tiangulaire(s)")
    )
    (princ "\nSéléction non valide")
 )
 (princ)
)


;; gc:Clockwise
;; Evalue si les points p1 p2 et p3 tournent dans le sens horaire
;;
;; Arguments
;; p1, p2, p3 trois points 2d figurant un triangle dans le plan XY
(defun gc:Clockwise (p1 p2 p3)
 (<
   (- (* (- (car p2) (car p1)) (- (cadr p3) (cadr p2)))
      (* (- (cadr p2) (cadr p1)) (- (car p3) (car p2)))
   )
   1e12
 )
)

;; gc:distinct
;; Suprime tous les doublons d'une liste
;;
;; Argument
;; l : une liste
(defun gc:distinct (l)
 (if l
   (cons (car l) (gc:distinct (vl-remove (car l) l)))
 )
)

;; gc:intersect
;; Retourne la liste des éléments communs à l1 et l2
;;
;; Arguments
;; l1 : une liste
;; l2 : une liste
(defun gc:intersect (l1 l2)
 (if l1
   (if	(member (car l1) l2)
     (cons (car l1) (gc:intersect (cdr l1) l2))
     (gc:intersect (cdr l1) l2)
   )
 )
)

;; gc:substract
;; Retourne une liste contenant les éléments appartenant exclusivement à l1
;;
;; Arguments
;; l1 : une liste
;; l2 : une liste
(defun gc:substract (l1 l2)
 (if l1
   (if	(member (car l1) l2)
     (gc:substract (cdr l1) l2)
     (cons (car l1) (gc:substract (cdr l1) l2))
   )
 )
)

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

Lien vers le commentaire
Partager sur d’autres sites

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é