lecrabe Posté(e) le 28 octobre 2008 Partager Posté(e) le 28 octobre 2008 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 fautet 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 More sharing options...
(gile) Posté(e) le 28 octobre 2008 Partager Posté(e) le 28 octobre 2008 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 More sharing options...
lecrabe Posté(e) le 28 octobre 2008 Auteur Partager Posté(e) le 28 octobre 2008 Hello Avec AutoCAD 2004, j'ai l'erreur :Commande: senspoly; erreur: Le serveur ActiveX a renvoyé l'erreur: nom inconnu: ActiveSelectionSet Je vais tester avec des AutoCAD plus recents ... Le Decapode Autodesk Expert Elite Team Lien vers le commentaire Partager sur d’autres sites More sharing options...
thry0 Posté(e) le 28 octobre 2008 Partager Posté(e) le 28 octobre 2008 Bjr, Pareil pour une 2006 ... Lien vers le commentaire Partager sur d’autres sites More sharing options...
lecrabe Posté(e) le 28 octobre 2008 Auteur Partager Posté(e) le 28 octobre 2008 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_FINdans 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 More sharing options...
(gile) Posté(e) le 28 octobre 2008 Partager Posté(e) le 28 octobre 2008 Oupss !!! Une faute(s) de frappe : ActiveSelectionSet au lieu de ActiveDocument (*acdoc* est définie au démarrage chez moi, c'est pourquoi je n'ai pas remarqué) J'ai corrigé le code. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD Lien vers le commentaire Partager sur d’autres sites More sharing options...
lecrabe Posté(e) le 28 octobre 2008 Auteur Partager Posté(e) le 28 octobre 2008 Hello En 2008 c OK :) En 2004, ca marche avec des polylignes Non Closes ! mais en 2004 avec des polylignes closes : Commande: senspolyChoisissez une option [Tous les segments/Extrémités] : eSé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: nilCommande: Sinon SVP je sollicite toujours les 2 noms de bloc : FLECHE_DEB & FLECHE_FINen 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 More sharing options...
lecrabe Posté(e) le 28 octobre 2008 Auteur Partager Posté(e) le 28 octobre 2008 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 More sharing options...
(gile) Posté(e) le 28 octobre 2008 Partager Posté(e) le 28 octobre 2008 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 More sharing options...
lecrabe Posté(e) le 28 octobre 2008 Auteur Partager Posté(e) le 28 octobre 2008 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 More sharing options...
(gile) Posté(e) le 28 octobre 2008 Partager Posté(e) le 28 octobre 2008 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 More sharing options...
lecrabe Posté(e) le 28 octobre 2008 Auteur Partager Posté(e) le 28 octobre 2008 Hello Gilles 1) 4.0Commande: (vlax-curve-getEndParam (car (entsel)))Choix de l'objet: 4.0 2) TCommande: ((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 More sharing options...
(gile) Posté(e) le 28 octobre 2008 Partager Posté(e) le 28 octobre 2008 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 More sharing options...
lecrabe Posté(e) le 28 octobre 2008 Auteur Partager Posté(e) le 28 octobre 2008 Hello Gilles C OK sur AutoCAD 2006 et aussi sur AutoCAD 2009 ! :) :D Donc je garde la toute dernière version quelque soit l'AutoCAD !? Le Decapode "frétillant" Autodesk Expert Elite Team Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant