Aller au contenu

Dessiner des points sur les vertex


lecrabe

Messages recommandés

 

Hello

 

SVP j'aurais besoin d'une routine qui dessinerait sur le calque courant des points graphiques AutoCAD sur TOUS les vertex des Polylignes (2D ou 3D)

 

Si la polyligne (2D ou 3D) est close, SVP un seul point de départ/arrivée de de la polyligne

 

Merci d'avance de votre aide, Le Decapode

 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Salut,

à tester (vite fait et tordu...)

;;; Met Nodal sur sommet plylignes - par Bred le 27/05/08
(defun c:nod-pl (/ I LST-COORD OB SEL Y R)
 (or (setq sel (ssget '((0 . "VERTEX,*POLYLINE"))))
     (setq sel (ssget "_X" '((0 . "VERTEX,*POLYLINE")))))
 (repeat (setq i (sslength sel))
   (setq ob (vlax-ename->vla-object (ssname sel (setq i (1- i))))
  lst-coord (vlax-safearray->list (vlax-variant-value (vla-get-Coordinates ob))))
   (if (equal (vla-get-Closed ob) :vlax-true)
     (progn
(setq lst-coord (list (car lst-coord) (cadr lst-coord) (caddr lst-coord)))
(if (equal (vla-get-ObjectName ob) "AcDbPolyline")
  (setq lst-coord (list (car lst-coord) (cadr lst-coord))))))
   (setq y 0)
   (if (equal (vla-get-ObjectName ob) "AcDbPolyline")
     (setq r 2)
     (setq r 3))
   (repeat (/ (length lst-coord) r)
     (vla-addpoint
(if (= (getvar "CVPORT") 1)
  (vla-get-PaperSpace (vla-get-ActiveDocument (vlax-get-acad-object)))
  (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object)))
  )
(vlax-3d-point (list (nth y lst-coord)
		     (nth (setq y (1+ y)) lst-coord)
		     (if (equal (vla-get-ObjectName ob) "AcDbPolyline")
		       0.0
		       (nth (setq y (1+ y)) lst-coord)))))
     (setq y (1+ y))
     )
     
   )
 (princ)
)

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

Bonjour à toutes et tous,

 

Marche super bien Bred !

 

J'avais pensé aussi à un lisp de (gile) "ins-vtx " (ou qu'il m'avait aidé à finaliser en rajoutant la possibilité d'utiliser sa BD "Nom du bloc" ). Avant de poster, pensant transformer un point en bloc (ou créer un bloc "point") et retester le lisp, voilà ce que me répond AutoCAD =>

Commande:

Commande: ins-vtx

Choix de l'objet: ; erreur: nombre d'arguments insuffisants

Commande:

 

Il me semble, en plus, que j'avais déjà rencontré ce problème que quelqu'un ici [ (gile) ?]

avait déjà solutionné,..

 

Le code =>

 

(defun c:ins-vtx (/ acdoc space bname ss lay layf n ins)
(vl-load-com)
(setq acdoc (vla-get-activeDocument (vlax-get-acad-object))
space (if (= (getvar "CVPORT") 1)
(vla-get-PaperSpace acdoc)
(vla-get-ModelSpace acdoc)
)
)
(if (setq bname (getblock "Nom du bloc"))
(progn
(if (setq ss (ssget "_X" (list '(0 . "INSERT") (cons 2 bname))))
(setq lay (cdr (assoc 8 (entget (ssname ss 0)))))
)
(if (setq layf (getlayer "Choisir le calque filtre de polylignes"))
(if (ssget "_X" (list '(0 . "*POLYLINE") (cons 8 layf)))
(progn
(vla-startUndoMark acdoc)
(vlax-for pl (vla-get-ActiveSelectionSet acdoc)
(setq n (fix (vlax-curve-getEndParam pl)))
(or (= (vla-get-Closed pl) :vlax-false)
(setq n (1- n))
)
(repeat (1+ n)
(setq ins
(vla-InsertBlock
space
(vlax-3d-point (vlax-curve-getPointAtParam pl n))
bname
1.0
1.0
1.0
0.0
)
)
(if lay
(vla-put-layer ins lay)
)
(setq n (1- n))
)
)
(vla-EndUndoMark acdoc)
)
)
)
)
)
(princ)
)  

 

De mémoire, c'était aussi suite à une demande de lecrabe

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Lien vers le commentaire
Partager sur d’autres sites

Salut Bred

 

Je constate que tu deviens un roi du lisp et une utilisation subtile du ou :)

 

Juste quatre petites remarques si tu le permets ;)

Pour éviter un vlax-ename->vla-object, tu peux utiliser activeselectionset dans un vlax-for ou vlax-map-collection.

Un (vlax-safearray->list (vlax-variant-value (vla-get-Coordinates ob))) peux aussi se traduire en (vlax-get ob 'coordinates)

Regarde la fonction vlax-curve-getpointatparam. Par exemple un (vlax-curve-getpointatparam lst-coord 2) te donnera le 3em sommet de la poly.

Et la dernière est que tu regardes à chaque fois la variable cvport. Stock directement le résultat dans une variable afin d'optimiser la rapidité d'exécution.

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

merci pour tes conseils,

j'avoue avoir taper ce code à la va-vite sans rechercher la finesse... afin de répondre le plus rapidement possible au Crabe... donc je suis allez à ce que je connaissait le mieux.

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

 

Désolé mais la routine "NOD-PL.lsp" dessine simplement un point graphique

au point de départ de chaque polyligne sélectionnée ! :(

 

Hors je désire un point graphique sur CHAQUE vertex/sommet SVP ;)

 

Testé sur AutoCAD/MAP 2005 & 2008 ! :o

 

Mercipour ces débuts de programme ...

 

Dans l'attente de la prochaine marée, Le Decapode

 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Un petit coucou en passant,

 

Bred, pour récupéere les points des sommets des lwpolylignes et polylignes 3d (coordonnées SCG), tu peux utiliser les routines PlinePoints (lwpolyline)et 3d-coord->pt-lst (polylines 3d) que tu trouveras ici, si tu veux aussi traiter le poly 2d (old-style), 3d-coord->pt-lst fonctionne mais il faut les traduire du SCO vers le SCG.

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

Lien vers le commentaire
Partager sur d’autres sites

Re,

 

lecrabe

 

Avec ": [surligneur] nod-pl [/surligneur]" de Bred réponse 1 !

 

 

Sinon, si " [surligneur] ins-vtx [/surligneur]" (réponse 2) marche chez toi, tu peux transformer le style de point qui t'intéresses en bloc et utiliser cette routine. Problème sur les polys fermées, tu seras obligé de le faire "à la main" ! En attendant que tu trouves pourquoi " nod-pl " ne marche pas chez toi,....

 

A au fait, question de vocabulaire, c'est quoi "les vertex" ?

 

Merci d'avance.

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Lien vers le commentaire
Partager sur d’autres sites

 

Hello lili

 

NON NON svp tu regardes bien ton image

et tu verras que si la polyligne est CLOSE (ta polyligne bleue) :(

 

il y a un SEUL et UNIQUE point graphique

qui dessiné à l'origine de la polyligne ! :mad:

 

En espérant une prompte amélioration, Le Decapode "patient" :)

 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Re,

 

Ok !

*

Je pense que bred à compris comme moi alors =>

 

Si la polyligne (2D ou 3D) est close, SVP un seul point de départ/arrivée de de la polyligne

 

Tu voulias surement dire, pas de point double sur le point de départ et d'arrivée de la poly fermé, alors que nous, on a compris [surligneur] qu'un seul point sur le point de départ et d'arrivée[/surligneur] dans le cas d'une poly fermée !! (Je pense que c'est pareil pour bred,...!!)

 

il y a un SEUL et UNIQUE point graphique

qui dessiné à l'origine de la polyligne !

 

Tu peux alors reprendre ma réponse précédente (attention, que j'ai réédité entre temps,...).

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Lien vers le commentaire
Partager sur d’autres sites

 

Hello LILI & BRED

 

OUI absolument, je me suis mal exprimé pour les polylignes je désire un point sur chaque sommet graphique sans AUCUN point en double au départ (pour les polylignes closes)

que l'on pourrait avoir par exemple, si les gens sont revenus "à la main" au point de départ par "Extrémité" puis "Clore" :exclam:

 

Sorry, mon cahier des charges n'était pas assez précis, et Bred m'a fourni une routine qui faisait exactement ce que j'avais demandé et écris ... ;)

 

Le Decapode

 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

(gile) : merci aussi, je connais ces routines, mais je mettais trop de temps à les chercher, et je suis aller au plus vite...

 

Si la polyligne (2D ou 3D) est close, SVP un seul point de départ/arrivée de de la polyligne

Ben ça veux dire qu'un seul point...

je suis bête ou quoi ?

 

u voulias surement dire, pas de point double sur le point de départ et d'arrivée de la poly fermé

Si c'est ça je me suis pris la tête pour rien, parce que c'est plus simple !!!...

:mad:

suffit d'enlever quelques lignes...

;;; Met Nodal sur sommet plylignes - par Bred le 27/05/08
(defun c:nod-pl (/ I LST-COORD OB SEL Y R)
 (or (setq sel (ssget '((0 . "VERTEX,*POLYLINE"))))
     (setq sel (ssget "_X" '((0 . "VERTEX,*POLYLINE")))))
 (repeat (setq i (sslength sel))
   (setq ob (vlax-ename->vla-object (ssname sel (setq i (1- i))))
  lst-coord (vlax-safearray->list (vlax-variant-value (vla-get-Coordinates ob))))
   (setq y 0)
   (if (equal (vla-get-ObjectName ob) "AcDbPolyline")
     (setq r 2)
     (setq r 3))
   (repeat (/ (length lst-coord) r)
     (vla-addpoint
(if (= (getvar "CVPORT") 1)
  (vla-get-PaperSpace (vla-get-ActiveDocument (vlax-get-acad-object)))
  (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object)))
  )
(vlax-3d-point (list (nth y lst-coord)
		     (nth (setq y (1+ y)) lst-coord)
		     (if (equal (vla-get-ObjectName ob) "AcDbPolyline")
		       0.0
		       (nth (setq y (1+ y)) lst-coord)))))
     (setq y (1+ y))
     )
     
   )
 (princ)
)

 

 

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

Re,

 

Pour faire suite à la réponse 15, tu peux peut-être supprimer la ligne

 

  (if (setq bname (getblock "Nom du bloc"))

pour que [surligneur] "ins-vtx"[/surligneur] fonctionne bien chez toi,...

 

OUI absolument, je me suis mal exprimé pour les polylignes

 

Disons pas assez précis ?!! ;)

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Lien vers le commentaire
Partager sur d’autres sites

Salut

 

Toujours sur du nodal

 

(defun c:nod-ins(/ doc ent sel spa)
 (vl-load-com)
 (and (ssget '((0 . "INSERT")))
   (progn
     (setq doc (vla-get-activedocument (vlax-get-acad-object))
    spa (if (eq (getvar "cvport") 1)
	  (vla-get-paperspace doc)
	  (vla-get-modelspace doc)
	)
     )
     (vla-startundomark doc)
     (vlax-for ent (setq sel (vla-get-activeselectionset doc))
(vla-addpoint spa (vla-get-insertionpoint ent))
     )
     (vla-delete sel)
     (vla-endundomark doc)
   )
 )
 (princ)
)

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

Oups je me suis trompé de bouton,

 

Voici une routine que j'avais faite pour moi dans la même optique :

mais qui ne marche pas sur les mpolygones d'AutoCAD MAP.

 

;;;--------------------------------------------------------------------------------------

;;; Fonction Points-sur-sommets-lwpolyligne.LSP Version 1.0

;;; par Fabrice DEMIEL

;;; le 21-07-97

;;;--------------------------------------------------------------------------------------

(defun traite-js (js / nbr c1 e calq-obj)

(setvar "cmdecho" 0)

(setq nbr (sslength js))

(setq i 0)

(while (<= i (- nbr 1))

(setq c1 (ssname js i))

(setq ent (entget c1))

(setq lst-ent (entget c1))

(setq calq-obj (cdr (assoc 8 (entget c1))))

(setq lng-lst (length lst-ent))

(setq j 0)

(while (<= j lng-lst)

(if (= (car (nth j lst-ent)) 10)

(progn

(setq p1 (cdr (nth j lst-ent)))

(entmake (list (cons 0 "POINT")(cons 10 p1)(cons 8 calq-obj)))

);fin progn

);fin if

(setq j (+ j 1))

); fin 2eme while

(prompt (strcat "\r Traitement de " (itoa i) " Objets sur " (itoa nbr) " Objets. "))

(setq i (+ i 1))

); fin 1er while

nil

); fin defun

;;;--------------------------------------------------------------------------------------

; FONCTION MAITRE

(defun c:pts-som-lwp ()

(setvar "cmdecho" 0)

(setq js (ssget))

(traite-js js)

(prompt "\n---COPYRIGHT 03/2007 Par Fabrice DEMIEL---")

nil

);fin c:boucle

;;;--------------------------------------------------------------------------------------

(prompt "\n Pour lancer Tapez : pts-som-lwp ")

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é