Aller au contenu

Sens des polylignes : Routine SVP


lecrabe

Messages recommandés

 

Hello

 

Je cherche une routine Lisp ou V-Lisp qui traiterait les polylignes de la façon suivante :

 

1) Question : Flèche du sens ou Flèche Début-Fin (Défaut = Flèche du Sens)

 

2) Puis Sélection classique (ou tout) des polylignes à traiter

 

3) Enfin Traitement et création automatique sur le calque courant

des blocs/symboles sur les polylignes ...

 

Si mode "Flèche de sens" alors on dessine un bloc/symbole (Nom="FLECHE_1")

au milieu de CHAQUE segment ou Arc de polyligne (Echelle = 1, Rotation = ce qu'il faut)

 

Si trop chiant de traiter les arcs, on ne traite pas !!!

 

Si mode "Flèche Début-Fin" alors on dessine un bloc au Départ (Extrémité) de la polyligne (Nom = "FLECHE_DEB") et on dessine aussi un autre bloc à la Fin (Extrémité) de la polyligne (Nom = "FLECHE_FIN") - Echelle = 1, Rotation = ce qu'il faut

et donc RIEN du tout sur les autres segments

 

Que la polyligne soit close ou non, on traite ...

 

Merci d'avance de votre aide car je n'ai pas trouvé de routine aussi "souple"

Fonctionnement si possible depuis AutoCAD 2004 jusqu'à 2009 !

 

Le Decapode

 

 

 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

(defun c:senspoly (/ space opt ss par)
 (vl-load-com)
 (or *acdoc*
     (setq *acdoc* (vla-get-ActiveDocument (vlax-get-acad-object)))
 )
 (setq	space (if (= 1 (getvar "CVPORT"))
	(vla-get-PaperSpace *acdoc*)
	(vla-get-ModelSpace *acdoc*)
      )
 )
 (cond
   ((not (tblsearch "BLOCK" "fleche_1"))
    (princ "\nLe bloc \"Fleche_1\" n'existe pas dans le dessin."
    )
   )
   ((not (tblsearch "BLOCK" "fleche_deb"))
    (princ
      "\nLe bloc \"Fleche_deb\" n'existe pas dans le dessin."
    )
   )
   ((not (tblsearch "BLOCK" "fleche_fin"))
    (princ
      "\nLe bloc \"Fleche_fin\" n'existe pas dans le dessin."
    )
   )
   (T
    (initget "Tous les segments Extrémités")
    (if (not (setq opt
	     (getkword
	       "\nChoisissez une option [Tous les segments/Extrémités] : "
	     )
      )
 )
      (setq opt "Tous")
    )
    (princ "\nSélectionnez les polylignes ou : ")
    (or (setq ss
	(ssget (list '(0 . "LWPOLYLINE") (cons 410 (getvar "CTAB")))
	)
 )
 (setq ss
	(ssget "_X"
	       (list '(0 . "LWPOLYLINE") (cons 410 (getvar "CTAB")))
	)
 )
    )
    (if ss
      (progn
 (vla-StartUndoMark *acdoc*)
 (vlax-for pl (setq ss (vla-get-ActiveSelectionSet *acdoc*))
   (setq par (vlax-curve-getEndParam pl))
   (if (= opt "Tous")
     (while (	       (setq par (- par 0.5))
       (vla-InsertBlock
	 space
	 (vlax-3d-point
	   (vlax-curve-getPointAtParam pl par)
	 )
	 "fleche_1"
	 1.0
	 1.0
	 1.0
	 (angle	'(0.0 0.0 0.0)
		(vlax-curve-getFirstDeriv pl par)
	 )
       )
       (setq par (- par 0.5))
     )
     (progn
       (vla-InsertBlock
	 space
	 (vlax-3d-point
	   (vlax-curve-getPointAtParam pl par)
	 )
	 "fleche_fin"
	 1.0
	 1.0
	 1.0
	 (angle	'(0.0 0.0 0.0)
		(vlax-curve-getFirstDeriv pl (- par 1e-9))
	 )
       )
       (vla-InsertBlock
	 space
	 (vlax-3d-point
	   (vlax-curve-getPointAtParam pl 0)
	 )
	 "fleche_deb"
	 1.0
	 1.0
	 1.0
	 (angle	'(0.0 0.0 0.0)
		(vlax-curve-getFirstDeriv pl 0)
	 )
       )
     )
   )
 )
 (vla-delete ss)
 (vla-EndUndoMark *acdoc*)
      )
    )
   )
 )
 (princ)
) 

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

Lien vers le commentaire
Partager sur d’autres sites

 

Hello

 

Je confirme l'erreur avec AutoCAD 2006 & 2008 ! :o

 

Sachant que Gilles a une version 2007, je pense qu'il y a un vrai probleme !! :casstet:

 

Sinon cette version de la routine ne semble pas utiliser les 2 noms de blocs spéciaux :

FLECHE_DEB & FLECHE_FIN

dans le cas où lon désire simplement un bloc au point de départ et un bloc au point final

 

Si la polyligne est close, les 2 blocs sont voisins !!

 

Le Decapode

 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

 

Hello

 

En 2008 c OK :)

 

En 2004, ca marche avec des polylignes Non Closes !

 

mais en 2004 avec des polylignes closes :

 

Commande: senspoly

Choisissez une option [Tous les segments/Extrémités] : e

Sélectionnez les polylignes ou :

Choix des objets: Spécifiez le coin opposé: 8 trouvé(s)

2 ont été filtrés.

Choix des objets:

; erreur: type d'argument incorrect: point 2D/3D: nil

Commande:

 

Sinon SVP je sollicite toujours les 2 noms de bloc : FLECHE_DEB & FLECHE_FIN

en mode "Extrémités"

 

Merci d'avance Gilles, ta routine est super !

Le Decapode

 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

 

Hello

 

Le probleme avec les polylignes closes est similaire sur AutoCAD 2004 ET AutoCAD 2006

 

( Mes polylignes ne contiennent que des segments )

 

Si la polyligne est non close mais que le dernier vertex est accroché au 1er vertex :

aucun souci, ça fonctionne !

 

Le Decapode

 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

J'ai ajouté le traitement pour les blocs "fleche_deb" et fleche_fin".

 

Je ne comprends pas bien pourquoi ça ne fonctionne pas avec les polylignes closes sur les versions

vlax-curve-getEndParam ne doit pas retourner la même chose ?!

 

Je vais essayer de contourner le problème.

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

Lien vers le commentaire
Partager sur d’autres sites

 

Hello Gilles

 

Je viens de tester ta nouvelle version, c impeccable sur toutes versions >= 2007

avec des polyligness closes ou non :)

 

Sur versions 2004/2005/2006, on ne traite que les polylignes Non Closes !! :o

 

Comme d'hab, c TIP-TOP, Mille mercis, Le Decapode "patient"

 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Patrice,

 

pourrais tu faire un petit test sur un rectangle (AutoCAD 2006 ou inférieur):

 

1 Est-ce que l'expression suivante retourne bien 4.0 ?

(vlax-curve-getEndParam (car (entsel))) 

 

2 Si oui, que retourne l'expression suivante:

((lambda (pl)
  (equal (vlax-curve-getPointAtParam
    pl
    (vlax-curve-getEndParam pl)
  )
  (vlax-curve-getPointAtParam pl 0)
  )
)
 (car (entsel))
) 

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

Lien vers le commentaire
Partager sur d’autres sites

 

Hello Gilles

 

1) 4.0

Commande: (vlax-curve-getEndParam (car (entsel)))

Choix de l'objet: 4.0

 

2) T

Commande: ((lambda (pl)

((_> (equal (vlax-curve-getPointAtParam

((((_> pl

((((_> (vlax-curve-getEndParam pl)

((((_> )

(((_> (vlax-curve-getPointAtParam pl 0)

(((_> )

((_> )

(_> (car (entsel))

(_> )

 

Choix de l'objet: T

 

Je crains que cette 2eme reponse ne te convienne pas du tout !?

 

Le Decapode "interrogatif"

 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Merci pour le retour,

 

Je crains que cette 2eme reponse ne te convienne pas du tout !?

 

Si si, tout est normal, les "paramètres" des polylignes sont entiers au niveau de chaque sommet, le premier sommet ayant un paramètre 0.0, le second 1.0 etc... Si la polyligne est fermée le dernier paramètre (EndParam) est égal à n+1 pour une polyligne à n sommets et le point à ce paramètre est donc le point de départ de la polyligne.

 

Le problème ne vient donc pas de là.

Il pourrait venir de la façon dont est arrondie la valeur de EndParam (par), ce qui pourrait générer une erreur quand on cherche la dérivée à ce paramètre (qui permet de trouver l'angle de la tangente à ce point) :

(vlax-curve-getFirstDerive pl par)

 

J'ai modifié le code pour "déplacer" le paramètre dont on cherche la tangente à un milliardième de la longueur du segment vers l'intérieur de la polyligne.

 

Merci de me dire si c'est suffisant.

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é