Aller au contenu

Jonidre des polylignes 3D par reconaissance des contacts


Messages recommandés

Posté(e)

Bonjour à tous,

 

 

Voila j'ai AutoCAD Map2008

 

mon sujet

 

j'ai deux séries de polylignes 3d plus ou moins parallèles représentant des bordes de routes.

 

ces polylignes sont parfaitement jointives .

 

n'existe-il pas une fonction pour joindre les polylignes 3D, de telle façon qu'en sélectionnant les deux polylignes extrêmes des deux séries le logiciel reconnaissent toutes les autres polylignes en contact et réalise directement de proche en proche la jonction jusqu'au deux autres extrémités de mes bords de routes?

 

Si d'aventure quelqu'un a une solution.

Thierry Garré

 

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

Posté(e)

Oupss !!!

 

J'avais lu un peu vite, Join3dPoly nécessite de sélectionner toutes les polylignes. Je vais essayer de faire quelque chose qui corresponde mieux à ta demande.

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

Posté(e)

Voilà,

 

Il suffit de sélectionner une polyligne 3d (pas forcément à une extrémité) et toutes celles qui sont en contact par leur extrémité sont jointes.

La poly finale prend les propriétés de celle qui a été sélectionnée. Le sens de la poly peut changer (mais on peut l'inverser avec R_Pline)

 

PS : ce LISP risque de ne pas fonctionner avec les version antérieures à 2007 :

; erreur: une exception s'est produite: 0xC0000005 (Violation d'accès)

; avertissement: fonction unwind ignorée erreur inconnue

Cette erreur semble due au fait que ces versions ne supportent pas l'ajout ou la suppression simultanée de plusieurs sommets.

 

;; AUTOJOIN (gile)
;; Unit toutes les polylignes 3d jointives à la polyligne 3d sélectionnée

(defun c:autojoin (/ ent pl1 lst1 pt ss pl2 lst2)
 (vl-load-com)
 (or *acad* (setq *acad* (vlax-get-acad-object)))
 (or *acdoc* (setq *acdoc* (vla-get-ActiveDocument *acad*)))
 (if (and (setq
     ent (car
	   (entsel "\nSélectionnez une polyligne 3d: ")
	 )
   )
   (setq pl1 (vlax-ename->vla-object ent))
   (= (vla-get-ObjectName pl1) "AcDb3dPolyline")
   (= (vla-get-Closed pl1) :vlax-false)
   (setq lst1 (3d-coord->pt-lst (vlax-get pl1 'Coordinates)))
   (setq pt (last lst1))
     )
   (progn
     (vla-StartUndoMark *acdoc*)
     (vla-ZoomExtents *acad*)
     (while
(and
  (or
    (and
      (setq ss (ssget "_C"
		      (trans pt 0 1)
		      (trans pt 0 1)
		      '((0 . "POLYLINE") (70 . 8))
	       )
      )
      (setq ss (ssdel ent ss))
      (= 1 (sslength ss))
    )
    (and
      (not (vlax-put pl1
		     'Coordinates
		     (apply 'append (setq lst1 (reverse lst1)))
	   )
      )
      (setq pt (last lst1))
      (setq ss (ssget "_C"
		      (trans pt 0 1)
		      (trans pt 0 1)
		      '((0 . "POLYLINE") (70 . 8))
	       )
      )
      (setq ss (ssdel ent ss))
      (= 1 (sslength ss))
    )
  )
  (setq pl2 (vlax-ename->vla-object (ssname ss 0)))
  (setq lst2 (3d-coord->pt-lst (vlax-get pl2 'Coordinates)))
  (or (equal pt (car lst2) 1e-9)
      (and (setq lst2 (reverse lst2)) (equal pt (car lst2) 1e-9))
  )
)
 (vlax-put pl1
	   'Coordinates
	   (apply 'append (setq lst1 (append lst1 (cdr lst2))))
 )
 (entupd ent)
 (vla-delete pl2)
 (setq pt (last lst2))
     )
     (vla-ZoomPrevious *acad*)
     (vla-EndUndoMark *acdoc*)
   )
 )
 (princ)
)

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

[Edité le 13/4/2008 par (gile)]

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

Posté(e)

Merci Gile c'est exactement ce que je souhaitai.

 

[Edité le 13/4/2008 par thierry.garré]

Thierry Garré

 

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

  • 5 ans après...
Posté(e)

hello

damned! je ne peux aps joindre mes polylignes... pour une raison assez simple les PL 3D ne sont aps jointives... bon en même temps il faut aller la chercher loin la différence : huit chiffres après la virgule

savez comment je peux faire en sorte que le lisp tourne (en sachant que l'arrondi qui se fait n' aucune importance - qui travaille avec 8 chiffres après la virgule?)

...

en cherchant un peu j'ai trouve un lisp de bonuscad pour arrondir les valuers et pouvoir faire mes belles poly3D

http://cadxp.com/topic/7280-arrondir-les-coordonnees/page__view__findpost__p__35829

Phil

Projeteur Revit Indépendant - traitement des eaux/CVC

Posté(e)

Salut,

 

non, ce n'était vraiment pas loin.

 

Dans l'expression :

          (or (equal pt (car lst2) 1e-9)
             (and (setq lst2 (reverse lst2)) (equal pt (car lst2) 1e-9))
         )

remplace 1e-9 par 1e-7 ou 1e-7. c'est la tolérance dans la comparision (9, 7 ou 6 chiffres après la virgule).

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

Posté(e)

Bonjour,

 

Personnellement, quand j'ai des soucis d'arrondi infime de coordonnées, je fait un wbloc des objets à arrondir, puis un export (enregistrer sous) DXF et dans les options je spécifie X décimales (par ex 6) ainsi toutes les coordonnées sont arrondies à 6 décimales. On ferme le DXF, puis on le ré-ouvre et je ré-importe dans mon dessin. Et hop tout fonctionne.

 

Olivier

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é