Aller au contenu

coller parfaitement des points sur une polyligne


doublecriquet

Messages recommandés

Bonjour,

 

Je me retrouve fréquemment confronté à un problème que je n'arrive pas à résoudre et qui me fait perdre beaucoup de temps dans mes conceptions de routes dans Autocad.

 

Je m'explique,

Je travaille régulièrement sur les mêmes projets :

J'importe dans Autocad une route représentée par une polyligne créé par Geomedia 5.2. Geomedia me permet également d'importer dans Autocad, sur 2 calques séparés, des points kilométriques le long de cette route (tous les 1km), 1 calque avec les kp dans un sens, et l'autre dans le sens inverse. Ces kp sont représentés par de simples points, que je transforme dans un second temps en symboles kilométriques grâce à la routine lisp PT-BLC.

Le souci est que l'export "douteux" depuis Geomedia en dwg fait que, bien que quasi-correctement placés, les points ne sont pas parfaitement sur ma polyligne : quand je zoom de très près, certains sont parfois bizarrement juste à côté de la poly mais pas vraiment dessus (ce décalage est très très infime).

 

Je voulais savoir s'il existe une routine permettant de sélectionner tous mes points bien placés et quasiment bien placés en une seule sélection, et permettant de tous les aligner,selon un déplacement perpendiculaire vers cette poly, exactement sur elle ?

 

je ne connais pas grand chose en dev, et en cor moins en LISP, merci à ceux qui pourront m'éclairer...

Lien vers le commentaire
Partager sur d’autres sites

Salut,

quand je zoom de très près, certains sont parfois bizarrement juste à côté de la poly mais pas vraiment dessus

As-tu essayer de faire un regen ?

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Lien vers le commentaire
Partager sur d’autres sites

 

Hello

 

Non je pense que cela provient de la précision de Geomedia qui n'est pas celle d'AutoCAD !

 

Donc il faudrait une routine AutoLisp/V-Lisp qui projette en ortho tous les points sélectionnés sur la polyligne sélectionnée avec par sécurité une question relative à la distance maximum de projection !

 

Le Decapode

 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Merci pour vos réponse.

 

REGEN ne fait rien.

 

Je suis de l'avis du crabe, je pense effectivement qu'il s'agit d'une imprécision de Geomedia.

 

Pour plus de clarté, voici mon soucis en illustré :

 

Sur la première image (zoom éloigné), on peut voir/croire que les points sont placés correctement sur la polyligne

 

Sur la seconde image (zoom très proche d'un point), on peut facilement constater l'imprécision (infime, mais certes présente quand même)

 

http://images4.hiboox.com/vignettes/4208/b706be0abf44e8d31a1ba0cb2b1b1681.jpg

http://www.hiboox.fr/go/images/informatique/kp-polyligne-1,b706be0abf44e8d31a1ba0cb2b1b1681.jpg.html

 

http://images2.hiboox.com/vignettes/4208/2e6a985021c53e355dc1bb7aff602b7c.jpg

http://www.hiboox.fr/go/images/informatique/kp-polyligne-2,2e6a985021c53e355dc1bb7aff602b7c.jpg.html

 

PS : Merci au passage à lili... pour ce lien hiboox, site d'hébergment d'images gratuit et simplissime

 

[Edité le 15/10/2008 par doublecriquet]

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

dans un premier temps ce sont des Pk et non des Kp.

A premiere vue l'illustration ci-dessus, il semble que la polyligne soit lissée !!!

Peut on connaitre la distance de l'imprécision ? Peut etre qu'elle est insignifiante ?

Autrement si tu veux je dois avoir un lisp qui permet de projeter des points sur une polyligne (une de bonuscad)

 

@plus

 

LB

 

PS: je doute que la precision de covadis soit incorrecte.

Lien vers le commentaire
Partager sur d’autres sites

Merci lovecraft et didier pour vos réponses.

 

kp, c'est en anglais, je travaille dans une entreprise internationale.

Désolé, je sais bien que CADXP est français, mais comme on utilise chez nous en général plus le terme kp pour "kilometer point" que pk pour "point kilométrique", j'espère que vous comprendrez...

 

lovecraft,

la polyligne n'est pas lissée, c'est l'effet d'éloignement du zoom sur la photo qui donne cette impression.

On ne peut pas connaitre la distance de l'imprécision, étant donné qu'elle diffère pour chaque point, la plupart d'entre eux sont même bien placés. Vu qu'il y a plusieurs centaines de kms sur chacune de mes routes, je vais pas m'amuser à calculer la distance de l'imprécision pour chacun des points.

Le lisp de bonuscad que tu proposes, qui permet de projeter des points sur une polyligne, m'intéresse beaucoup, je crois que ça pourrait être une solution intéressante.

 

Didier,

pourrais-tu developper ton idée d'intersection stp ? Qu'est ce que je fais une fois que j'ai des centaines d'intersections sur ma route ? Y'a un lisp qui existe pour insérer automatiquement des points ou des blocs à toutes les intersections ?

 

Juste une question, connaitriez vous le coût approximatif de covadis ? Car il faudrait que j'en parle à mon responsable.On travaille dans le câble sous-marin, et on pensait plutôt investir dans Autochart développé par wishsoftware. Qqun connait ?

 

 

 

 

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Ta demande est très similaire à celle que tu avais faite ici

 

Il était facile d'adapter la précédente réponse, tu aurais presque pu t'y coller... ;)

 

Enfin voici ce que l'on pourrait faire d'après le code précédent:

 

(defun c:rabat_pt ( / js n pojs vla_po vla_obj pt)
 (princ "\nSélectionner les points à rabattre. ")
 (setq js (ssget '((0 . "POINT"))) n -1)
 (cond
   (js
     (vl-load-com)
     (princ "\nSélectionner l'objet curviligne où les points seront rabattus. ")
     (while
       (null
         (setq pojs
           (ssget "_+.:E:S" 
             (list
               (cons 0 "*POLYLINE,LINE,ARC,CIRCLE,ELLIPSE,SPLINE")
               (cons -4 "[b]<[/b]NOT")
                 (cons -4 "&") (cons 70 112)
               (cons -4 "NOT>")
             )
           )
         )
       )
     )
     (setq vla_po (vlax-ename->vla-object (ssname pojs 0)))
     (repeat (sslength js)
       (setq
         vla_obj (vlax-ename->vla-object (ssname js (setq n (1+ n))))
         pt (vlax-curve-getClosestPointTo vla_po (vlax-get vla_obj 'Coordinates))
       )
       (vlax-put vla_obj 'Coordinates pt)
     )
   ) 
 )
 (prin1)
)

 

Cela m'a pris 5 mn d'adaptation :casstet:

 

[Edité le 15/10/2008 par bonuscad]

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Un petit LISP, l'utilisateur, spécifie la longueur maximale au delà de laquelle les points ne sont pas déplacés, sélectionne la polyligne puis les points (ou Entrée pour "tous").

 

;; PtOnPline (gile)
;; Replace les points sur la polyligne

(defun c:PtOnCurve (/ dist curve pts coord)
 (vl-load-com)
 (if
   (and
     (setq dist (getdist "\nSpécifiez la longueur maximale: "))
     (setq curve (car (entsel "\nSélectionnez la polyligne: ")))
     (IsCurveObject curve)
     (princ "\nSélectionnez les points ou [b]: ")
     (or (ssget '((0 . "POINT")))
  (ssget "_X"
	 (list '(0 . "POINT") (cons 410 (getvar "CTAB")))
  )
     )
   )
    (progn
      (vlax-for pt (setq pts (vla-get-ActiveSelectionSet
			(vla-get-ActiveDocument
			  (vlax-get-acad-object)
			)
		      )
	    )
 (setq coord (vlax-get pt 'Coordinates))
 (if (and
       (not (equal
	      (setq nea (vlax-curve-getClosestPointTo curve coord))
	      pt
	      1e-9
	    )
       )
       (	     )
   (vlax-put pt 'Coordinates nea)
 )
      )
      (vla-delete pts)
    )
 )
 (princ)
)

;; IsCurveObject
;; Evalue si un objet (ename ou vla-object) est un "CurveObject"

(defun IsCurveObject (obj)
 (and
   (or	(= (type obj) 'VLA-OBJECT)
(setq obj (vlax-ename->vla-object obj))
   )
   (member (vla-get-ObjectName obj)
    '("AcDbArc"		  "AcDbCircle"
      "AcDbEllipse"	  "AcDbLine"
      "AcDbPolyline"	  "AcDb2dPolyline"
      "AcDb3dPolyline"	  "AcDbSpline"
     )
   )
 )
) 

 

Doublé par bonuscad...

[Edité le 15/10/2008 par (gile)][Edité le 15/10/2008 par (gile)][Edité le 16/10/2008 par (gile)]

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

Lien vers le commentaire
Partager sur d’autres sites

 

Hello

 

Je viens de tester sur MAP 2006 en 2D ta routine Gilles, elle fonctionne bien :)

 

Par contre avec le meme DWG de test sur MAP 2008 !

 

Commande: ptonpline

 

Spécifiez la longueur maximale: 30

 

Sélectionnez la polyligne: ; erreur: no function definition:

VLAX-ENAME->VLA-OBJECT

 

Cette erreur est générée AVANT la sélection des points !!

 

La polyligne est en 2D (Z=0) et tous les points (Z=0) sauf UN sont à moins de 30 mètres

 

Le Decapode "chieur"

 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Re,

 

J'ai modifié le code pour qu'il fonctionne avec tout type d'objet curviligne (comme celui de bonuscad).

 

 

Le problème du filtre des objets curvilignes se pose presque à chaque fois qu'on utilise les fonction vlax-curve-*.

Dans la routine ci dessus, j'utilise (car (entsel ...) et une petite routine qui évalue si l'objet sélectionné est bien un CurveObject .

Bonuscad, de son côté, utilise (ssget "_+.:E:S" ...) avec un filtre de calque. et cette routine me fait penser que l'utilisation du code DXF 100 (plus fin que le code 0 sur les polylignes) dans le filtre permettrait d'éviter l'utilisation d'opérateurs logiques dans ce filtre :

 

(ssget '((100 . "AcDbArc,AcDbCircle,AcDbEllipse,AcDbLine,AcDbPolyline,AcDb2dPolyline,AcDb3dPolyline,AcDbSpline"))) 

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

Lien vers le commentaire
Partager sur d’autres sites

salut,

 

merci bonuscad et gile pour vos routines, je me retrouve désormais avec 2 super outils face à mon problème !!! excelllent !

 

dans mon domaine, et à mon niveau , la routine de bonuscad "rabat_pt" correspond un peu plus, car plus simple et directe par rapport à ma demande.

en fait, je ne vois pas trop à quoi sert la "sécurité" "spécifie la longueur maximale au delà de laquelle les points ne sont pas déplacés" sur la routine de gile "PtOnCurve" ? puisque le but final est que les pts se déplacent sur la poly et rien d'autre, comme c'est le cas sur la routine de bonuscad.... Même si le résultat est le même au final avec les 2 routines !

 

en tous cas, encore merci, car contrairement à ce que tu penses bonuscad, jamais je n'aurais pu faire la modif moi même de la routine "multi_align_text", ou en tous les cas certainement pas en 5min, mais plutôt en 5 jours de recherche et d'autoformation.... j'y viendrai un jour !

 

a bientôt

Lien vers le commentaire
Partager sur d’autres sites

je ne vois pas trop à quoi sert la "sécurité" "spécifie la longueur maximale au delà de laquelle les points ne sont pas déplacés" sur la routine de gile "PtOnCurve" ?

 

Cette "sécurité" répond à la demande de lecrabe et une à utilisation plus générale de la routine.

Par exemple, le dessin pourrait contenir plusieurs polylignes et différentes entités point à "recoller" sur chacune d'elles.

PtOnCurve permet alors 2 façons de procéder : soit on sélectionne les points par rapport à une polyligne (ou autre objet curviligne) soit on sélectionne tous les points (avec Entrée, Espace ou clic droit) et c'est la distance de "sécurité" qui filtrera les points à recoller.

Avec cette deuxième méthode, le traitement (exécution de la routine) risque d'être un peu plus long, mais demandera certainement beaucoup moins de temps qu'une sélection par polygone faite par l'utilisateur.

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

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

Bonjour à tous!!

 

J'aurai une petite requête à faire, ressemblant à ce qui est demandé ici.

 

J'ai des points alignés à projeter sur une polyligne. Mais ces points ne doivent pas être projetés sur le point le plus proche de la polyligne!

 

Ils doivent être renvoyés parfaitement verticalement sur celle-ci..

 

Y a-t-il une modification possible à faire sur un des LISP présentés ici?

 

Merci pour votre partage en tout cas!!

 

 

Filipe

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Voilà

 

;; PtOnCurveY (gile)
;; Déplace parallèlement à l'axe Y les points sur la courbe

(defun c:PtOnCurveY (/ space dist curve pts coord line)
 (vl-load-com)
 (or *acdoc*
     (setq *acdoc* (vla-get-ActiveDocument (vlax-get-acad-object)))
 )
 (setq	space (if (= (getvar "CVPORT") 1)
	(vla-get-PaperSpace *acdoc*)
	(vla-get-ModelSpace *acdoc*)
      )
 )
 (if
   (and
     (setq dist (getdist "\nSpécifiez la longueur maximale: "))
     (setq curve (car (entsel "\nSélectionnez la courbe: ")))
     (setq curve (vlax-ename->vla-object curve))
     (IsCurveObject curve)
     (princ "\nSélectionnez les points ou : ")
     (or (ssget '((0 . "POINT")))
  (ssget "_X"
	 (list '(0 . "POINT") (cons 410 (getvar "CTAB")))
  )
     )
   )
    (vlax-for pt (setq	pts (vla-get-ActiveSelectionSet
		      (vla-get-ActiveDocument
			(vlax-get-acad-object)
		      )
		    )
	  )
      (setq coord (vlax-get pt 'Coordinates))
      (setq line
      (vla-addLine
	space
	(vlax-3d-point
	  (list (car coord) (- (cadr coord) dist) (caddr coord))
	)
	(vlax-3d-point
	  (list (car coord) (+ (cadr coord) dist) (caddr coord))
	)
      )
      )
      (if
 (setq int (vlax-invoke curve 'IntersectWith line acExtendNone))
  (vlax-put pt
	    'Coordinates
	    (list (car int) (cadr int) (caddr int))
  )
      )
      (vla-delete line)
    )
 )
 (princ)
)


;; IsCurveObject
;; Evalue si un objet (ename ou vla-object) est un "CurveObject"

(defun IsCurveObject (obj)
 (and
   (or	(= (type obj) 'VLA-OBJECT)
(setq obj (vlax-ename->vla-object obj))
   )
   (member (vla-get-ObjectName obj)
    '("AcDbArc"		  "AcDbCircle"
      "AcDbEllipse"	  "AcDbLine"
      "AcDbPolyline"	  "AcDb2dPolyline"
      "AcDb3dPolyline"	  "AcDbSpline"
     )
   )
 )
) 

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

Lien vers le commentaire
Partager sur d’autres sites

Désolé de continuer sur ce topic, mais n'auraiez vous rien de similaire pour des BLOCS ou des groupes de TEXTE à la place des points (toujours paralèllement à l'axe Y) ?

 

J'ai cherché sur le forum, mais je dois ne pas utiliser les bons termes pour la recherche, je ne trouve rien de concluant.. :(

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Ce code fonctionne avec les points, blocs, textes et textes multiligne.

 

;; PtOnCurveY (gile)
;; Déplace parallèlement à l'axe Y les points, blocs textes sélectionnés sur la courbe

(defun c:MoveOnCurveY (/ space dist curve pts coord line)
 (vl-load-com)
 (or *acdoc*
     (setq *acdoc* (vla-get-ActiveDocument (vlax-get-acad-object)))
 )
 (setq	space (if (= (getvar "CVPORT") 1)
	(vla-get-PaperSpace *acdoc*)
	(vla-get-ModelSpace *acdoc*)
      )
 )
 (if
   (and
     (setq dist (getdist "\nSpécifiez la longueur maximale: "))
     (setq curve (car (entsel "\nSélectionnez la courbe: ")))
     (setq curve (vlax-ename->vla-object curve))
     (IsCurveObject curve)
     (princ "\nSélectionnez les points, blocs ou textes: ")
     (ssget '((0 . "POINT,INSERT,MTEXT,TEXT")))
   )
    (vlax-for pt (setq	pts (vla-get-ActiveSelectionSet
		      (vla-get-ActiveDocument
			(vlax-get-acad-object)
		      )
		    )
	  )
      (if (= (vla-get-ObjectName pt) "AcDbPoint")
 (setq coord (vlax-get pt 'Coordinates))
 (setq coord (vlax-get pt 'InsertionPoint))
      )
      (setq line
      (vla-addLine
	space
	(vlax-3d-point
	  (list (car coord) (- (cadr coord) dist) (caddr coord))
	)
	(vlax-3d-point
	  (list (car coord) (+ (cadr coord) dist) (caddr coord))
	)
      )
      )
      (if
 (setq int (vlax-invoke curve 'IntersectWith line acExtendNone))
  (vlax-put pt
	    (if (= (vla-get-ObjectName pt) "AcDbPoint")
 'Coordinates
 'InsertionPoint
      )
	    (list (car int) (cadr int) (caddr int))
  )
      )
      (vla-delete line)
    )
 )
 (princ)
)


;; IsCurveObject
;; Evalue si un objet (ename ou vla-object) est un "CurveObject"

(defun IsCurveObject (obj)
 (and
   (or	(= (type obj) 'VLA-OBJECT)
(setq obj (vlax-ename->vla-object obj))
   )
   (member (vla-get-ObjectName obj)
    '("AcDbArc"		  "AcDbCircle"
      "AcDbEllipse"	  "AcDbLine"
      "AcDbPolyline"	  "AcDb2dPolyline"
      "AcDb3dPolyline"	  "AcDb2dSpline"
     )
   )
 )
) 

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é