Aller au contenu

polylignes 3D en solides


Messages recommandés

Posté(e)

Bonjour

 

je me permets de recopier le message que j'ai posté sur le forum Débuter en lips

sachant que j'ai aussi Covadis et Autocad

 

voila je n'y connais absolument rien en lips, mais j'aimerai savoir si ces scripts sont réalisables.. et si oui pourait on m'aider pour les réaliser?

 

donc j'ai dans mon fichier des miliers de polylignes 3D que j'aimerai transformer en solide

(ce sont en fait des éléments récupérés sur une base SIG)

 

j'ai donc des polylignes 3D non fermées avec des points en Z différents (pour la polyligne A les points Z sont tous différents, pareil pour la polyligne B, C...)

 

j'aimerai dans un premier temps pouvoir remettre tous les points Z au point le plus haut de la polyligne A, faire la meme chose pour la polyligne B, et faire la meme chose pour la polyligne C...)

 

et dans un 2eme temps pouvoir extruder en négatif (donc vers le bas) toutes ces polylignes en solide avec comme référence leurs points Z respectifs

 

j'espere n'avoir pas été trop confus

 

merci beaucoup

 

Johan

Posté(e)

coucou

 

je me doutais qu'il fallait passer par du Lips

 

donc si cela est possible, on peut commencer par remettre tous les points Z au point le plus haut de la polyligne A, faire la meme chose pour la polyligne B, et faire la meme chose pour la polyligne C...) sachant que ce sont des polylignes 3D non fermées avec des points en Z différents (pour la polyligne A les points Z sont tous différents, pareil pour la polyligne B, C...)

 

merci

 

Johan

 

désolé pour ma gourmandise, mais c'est d'utilité public (je bosse dans l'administration et personne ne s'y connait en lips)

 

 

[Edité le 31/3/2009 par johanjohan33]

Posté(e)

Salut,

 

Pour "aplatir" des polylignes 3d à la plus haute altitude.

Après, je me demande bien comment tu compte faire pour générer un solide à partir d'objets ouverts ?

 

;;; ProjectToMaxAlt
;;; Aplatit une polyligne 3d sur la plus haute altitude

(defun FlattenToMaxAlt (3dpoly / pts alt)
 (setq	pts (3d-coord->pt-lst (vlax-get 3dPoly 'Coordinates))
alt (apply 'max (mapcar 'caddr pts))
pts (mapcar '(lambda (p) (list (car p) (cadr p) alt)) pts)
 )
 (vlax-put 3dPoly 'Coordinates (apply 'append pts))
)

;;; 3d-coord->pt-lst
;;; Convertit une liste de coordonnées 3D en liste de points

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

;;; FTMA Commande

(defun c:FTMA (/ *error* doc ss del)
 (vl-load-com)
 (defun *error* (msg)
   (and (/= msg "Fonction annulée")
 (princ (strcat "\nErreur: " msg))
   )
   (and ss (vla-delete ss))
   (vla-EndUndoMark doc)
   (princ)
 )
 (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
 (if (ssget '((0 . "POLYLINE") (-4 . "&") (70 . 8)))
   (progn
     (vla-StartUndoMark doc)
     (initget "Oui Non")
     (if
(= (getkword "\nSupprimer les objets source ? [Oui/Non] : ")
   "Oui"
)
 (setq del T)
     )
     (vlax-for	p (setq ss (vla-get-ActiveSelectionSet doc))
(vl-catch-all-apply
  'FlattenToMaxAlt
  (list	(if del
	  p
	  (vla-copy p)
	)
  )
)
     )
     (vla-delete ss)
     (vla-EndUndoMark doc)
   )
 )
 (princ)
)

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

Posté(e)

salut,

 

merci beaucoup

 

je vais essayer le script, quand j'aurai réussi à l'exécuter

(j'arrive à le charger mais pas à l'éxécuter

je vais trouver, ça doit pas etre trop compliqué :cool: ça au moins.. )

 

pour de ce qui est de la polyligne fermée, je vais essayer en passant par la méthode dur

en les forçant à se fermer en les sélectionnant tous, et a priori cela devrai marcher

ensuite utilser un script pour tous les extruder à partir de leur points Z respectifs

j'ai vu qu'il y avait ici des scripts pouvant le faire, je vais essayer de voir si j'arrive à en faire marcher un :D

je te tiens au courant pour la suite

 

encore merci

Johan

 

[Edité le 1/4/2009 par johanjohan33]

Posté(e)

salut

 

ayé avec la commande FTMA ça marche nikel chrome

fantastique!

et en sélectionnant les polylignes non fermées en les fermant dans le panneau propriété on peut les extruder

 

me manque plus le script pour les extruder en négatif à partir de leur point Z respectif

 

encore merci

tu vas faire des heureux, c'est sur!

 

Johan

Posté(e)

Re,

 

Tu peux essayer celui-là, il devrait fonctionner tant que la polyligne plane générée n'a pas d'auto-intersection.

 

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

;;; TOTO Commande

(defun c:toto (/ *error* doc ss pts alt)
 (vl-load-com)
 (defun *error* (msg)
   (and (/= msg "Fonction annulée")
 (princ (strcat "\nErreur: " msg))
   )
   (and ss (vla-delete ss))
   (vla-EndUndoMark doc)
   (princ)
 )
 (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
 (if (ssget '((0 . "POLYLINE") (-4 . "&") (70 . 8)))
   (progn
     (vla-StartUndoMark doc)
     (setq mspace (vla-get-ModelSpace doc))
     (vlax-for	p (setq ss (vla-get-ActiveSelectionSet doc))
(setq pts (3d-coord->pt-lst (vlax-get p 'Coordinates))
      alt (apply 'max (mapcar 'caddr pts))
      pts (mapcar '(lambda (p) (list (car p) (cadr p))) pts)
      pl  (vlax-invoke
	    mspace
	    'addLightWeightPolyline
	    (apply 'append pts)
	  )
)
(vla-put-elevation pl alt)
(vla-put-Closed pl :vlax-true)
(vl-catch-all-apply
  '(lambda ()
     (setq reg (vlax-invoke mspace 'addRegion (list pl))
	   sol (vla-addExtrudedSolid mspace (car reg) (- alt) 0.0)
     )
     (vla-delete (car reg))
   )
)
(vla-delete pl)
     )
     (vla-delete ss)
     (vla-EndUndoMark doc)
   )
 )
 (princ)
)

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

Posté(e)

yes!

 

ça marche nikel

exactement ce que j'avais besoin

il est vrai que j'avais quelques polylignes où il y avait une auto-intersection et l'extrusion ne marche pas

 

merci beaucoup beaucoup

 

johan

Posté(e)

 

Hello Gilles

 

Super cette routine pour projeter des polylignes 3D à l'Altitude Z MAX ! :)

 

Mais SVP j'aimerais bien avoir le choix : Altitude MAX ou MIN !

 

Idem pour l'Extrusion ...Quoique !?

 

Le Decapode

 

Autodesk Expert Elite Team

Posté(e)

Salut,

 

Choix de l'altitude : maXimum, miNimum ou moYenne.

Extrusion Oui, Non

Suppression de la polyligne plane si DELOBJ > 0

 

(defun c:toto (/ *error* doc opt ss pts alt)
 (vl-load-com)
 (defun *error* (msg)
   (and (/= msg "Fonction annulée")
 (princ (strcat "\nErreur: " msg))
   )
   (and ss (vla-delete ss))
   (vla-EndUndoMark doc)
   (princ)
 )
 (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
 (if (ssget '((0 . "POLYLINE") (-4 . "&") (70 . 8)))
   (progn
     (vla-StartUndoMark doc)
     (initget "maXimum miNimum moYenne")
     (or (setq	opt
	 (getkword
	   "\Altitude de la polyligne plane [maXimum/miNimum/moYenne] : "
	 )
  )
  (setq opt "moYenne")
     )
     (initget "Oui Non")
     (or (setq	ext
	 (getkword "\nExtruder les polylignes ? [Oui/Non] : ")
  )
  (setq ext "Oui")
     )
     (setq mspace (vla-get-ModelSpace doc))
     (vlax-for	p (setq ss (vla-get-ActiveSelectionSet doc))
(setq pts (3d-coord->pt-lst (vlax-get p 'Coordinates))
      alt (cond
	    ((= opt "maXimum")
	     (apply 'max (mapcar 'caddr pts))
	    )
	    ((= opt "miNimum")
	     (apply 'min (mapcar 'caddr pts))
	    )
	    (T (/ (apply '+ (mapcar 'caddr pts)) (length pts)))
	  )
      pts (mapcar '(lambda (p) (list (car p) (cadr p))) pts)
      pl  (vlax-invoke
	    mspace
	    'addLightWeightPolyline
	    (apply 'append pts)
	  )
)
(vla-put-elevation pl alt)
(vla-put-Closed pl (vla-get-Closed p))
(if (= ext "Oui")
  (progn
    (vla-put-Closed pl :vlax-true)
    (vl-catch-all-apply
      '(lambda ()
	 (setq reg (vlax-invoke mspace 'addRegion (list pl))
	       sol (vla-addExtrudedSolid
		     mspace
		     (car reg)
		     (- alt)
		     0.0
		   )
	 )
	 (vla-delete (car reg))
       )
    )
    (or (zerop (getvar "DELOBJ")) (vla-delete pl))
  )
)
     )
     (vla-delete ss)
     (vla-EndUndoMark doc)
   )
 )
 (princ)
)

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

Posté(e)

héllo Gilles

 

y aurait il un moyen de faire le meme dernier script mais en supprimant (ou en le demandant) les polylignes d'origines avec le choix du max min et moyenne des points Z (cela peut etre pratique c'est vrai), et en demandant ensuite l'extrusion ?

 

merci beaucoup

 

Johan

 

Posté(e)
(defun c:toto (/ *error* doc opt ext del mspace ss pts alt pl)
 (vl-load-com)
 (defun *error* (msg)
   (and (/= msg "Fonction annulée")
 (princ (strcat "\nErreur: " msg))
   )
   (and ss (vla-delete ss))
   (vla-EndUndoMark doc)
   (princ)
 )
 (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
 (if (ssget '((0 . "POLYLINE") (-4 . "&") (70 . 8)))
   (progn
     (vla-StartUndoMark doc)
     (initget "maXimum miNimum moYenne")
     (or (setq	opt
	 (getkword
	   "\Altitude de la polyligne plane [maXimum/miNimum/moYenne] : "
	 )
  )
  (setq opt "moYenne")
     )
     (initget "Oui Non")
     (or (setq	ext
	 (getkword "\nExtruder les polylignes ? [Oui/Non] : ")
  )
  (setq ext "Oui")
     )
     (initget "Oui Non")
     (or (setq	del
	 (getkword "\nSupprimer la polyligne 3d source ? [Oui/Non] : ")
  )
  (setq del "Non")
     )
     (setq mspace (vla-get-ModelSpace doc))
     (vlax-for	p (setq ss (vla-get-ActiveSelectionSet doc))
(setq pts (3d-coord->pt-lst (vlax-get p 'Coordinates))
      alt (cond
	    ((= opt "maXimum")
	     (apply 'max (mapcar 'caddr pts))
	    )
	    ((= opt "miNimum")
	     (apply 'min (mapcar 'caddr pts))
	    )
	    (T (/ (apply '+ (mapcar 'caddr pts)) (length pts)))
	  )
      pts (mapcar '(lambda (p) (list (car p) (cadr p))) pts)
      pl  (vlax-invoke
	    mspace
	    'addLightWeightPolyline
	    (apply 'append pts)
	  )
)
(vla-put-elevation pl alt)
(vla-put-Closed pl (vla-get-Closed p))
(if (= ext "Oui")
  (progn
    (vla-put-Closed pl :vlax-true)
    (vl-catch-all-apply
      '(lambda ()
	 (setq reg (vlax-invoke mspace 'addRegion (list pl))
	       sol (vla-addExtrudedSolid
		     mspace
		     (car reg)
		     (- alt)
		     0.0
		   )
	 )
	 (vla-delete (car reg))
       )
    )
    (or (zerop (getvar "DELOBJ")) (vla-delete pl))
  )
)
(if (= del "Oui")
  (vla-delete p)
)
     )
     (vla-delete ss)
     (vla-EndUndoMark doc)
   )
 )
 (princ)
)

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

Posté(e)

 

Hello Gilles

 

Je ne vois pas la différence REELLE entre les 2 derniers TOTOs !

 

Est ce simplement pour éviter de jouer avec DELOBJ = 0 ou = 1 ?

 

Merci d'avance, sinon ca marche bien !

 

Le Decapode

 

 

 

 

 

Autodesk Expert Elite Team

Posté(e)

Salut,

 

J'ai essayé de répondre à la dernière demande de johanjohan33.

 

Comment ça fonctionne :

 

Pour chaque polyligne 3d sélectionnée :

- création d'une lwpolyligne à l'altitude spécifiée

- si "Extruder les polylignes ?" = Oui :

. -tentative de création d'une région (passage nécessaire en vlisp)

. -extrusion de la région (si elle a bien été crée : pas d'auto-intersection)

. -suppression de la région

. - suppression de la lwpolyligne en fonction de la valeur de delobj

- si "Supprimer la polyligne 3d source ?" = Oui : suppression de la polyligne 3d.

 

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

  • 2 semaines après...
Posté(e)

Bonjour,

 

avec Covadis on peut le faire aussi, s'il n'y a pas de chevauchement entre les polylignes 3D.

 

1. Créer un MNT à partir de toutes les polylignes 3D

2. Convertir les polylignes 3D en poly 2D à Z=0 (Covadis 3D / Gestion des poly3D / Convertir en 2D)

3. Fermer toutes les poly 2D (Covadis edition / polylignes / modifier Clore)

4. Avec le module Volet paysager, traiter des ilots : MNT de référence = MNT créé en 1er, calques des contour d'ilot = calque des poly 2D fermées, position altimétrique de l'ilot, au choix ZHaut, Zbas ou Zmoyen. Cette fonction génère un MNT horizontal de chaque poly2D au Z spécifié

5. Transformation ACIS => transformaton d'un MNT en objet solide 3D, indiquer 0 comme altitude de référence.

 

Support Technique Covadis

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é