lecrabe Posté(e) le 20 mai 2007 Posté(e) le 20 mai 2007 Hello Voici un autre challenge (ou Routine Lisp à développer) que je ne sais pas résoudre ... Soit N polylignes 2D closes ou pas (d'au moins 3 sommets) : LWPOL , POL et Lissées ou Pas, Splinées ou Pas ... Sélection de ces N polylignes et reconstruction de toutes les polylignes nécessaires (en changeant le sens avec la routine R_PLINE de Gilles) pour CELLES qui tournent dans le sens des aiguilles de montre ! En clair je veux que toutes mes polylignes soient dans le sens TRIGONOMETRIQUE ! Routine R_PLINE.LSP de (gile)http://www.cadxp.com/modules.php?op=modload&name=XForum&file=viewthread&tid=10953#pid Merci d'avance de vos solutions ...Le Decapode Autodesk Expert Elite Team
(gile) Posté(e) le 20 mai 2007 Posté(e) le 20 mai 2007 Salut, J'ai filtré pour ne sélectionner que les poly 2d et lwpoly fermées, parceque je ne comprends pas bien comment parles de sens trigo ou horaire avec des objets ouverts ou des polylignes 3d (en plus comme j'utilise le décalage pour tester le sens de rotation ça ne peut fonctionner qu'en 2d). EDIT : en plus des polylignes fermées, sont traitées celles dont le point de départ et le point de fin sont confondus. Supprimer les espaces après les ;; Sens-Trigo Met dans le sens trigonométrique toutes les polylignes fermées sélectionnées (defun c:sens-trigo (/ ss n obj1 obj2) (vl-load-com) (if (setq ss (ssget '((0 . "*POLYLINE") (-4 . " (-4 . "&") (70 . 120) (-4 . "NOT>") ) ) ) (repeat (setq n (sslength ss)) (setq obj1 (vlax-ename->vla-object (ssname ss (setq n (1- n))))) (if (or (= (vla-get-closed obj1) :vlax-true) (equal (vlax-curve-getStartPoint obj1) (vlax-curve-getEndPoint obj1) 1e-9 ) ) (progn (setq obj2 (vlax-invoke obj1 'Offset 1)) (if ( (reverse_pline (vlax-vla-object->ename obj1)) ) (mapcar 'vla-delete obj2) ) ) ) ) (princ) ) ;; Inverse l'ordre de sommets d'une lwpolyligne, d'une polyligne 2D ou 3D (defun reverse_pline (ent / e_lst vtx v_lst p_lst l_vtx) (setq e_lst (entget ent)) (cond ((= (cdr (assoc 0 e_lst)) "POLYLINE") (setq vtx (entnext ent)) (while (= (cdr (assoc 0 (entget vtx))) "VERTEX") (setq v_lst (cons (entget vtx) v_lst) vtx (entnext vtx) ) ) ) ((= (cdr (assoc 0 e_lst)) "LWPOLYLINE") (setq p_lst (vl-remove-if-not '(lambda (x) (member (car x) '(10 40 41 42)) ) e_lst ) e_lst (vl-remove-if '(lambda (x) (member x p_lst) ) e_lst ) ) (while p_lst (setq v_lst (cons (list (car p_lst) (cadr p_lst) (caddr p_lst) (cadddr p_lst)) v_lst ) p_lst (member (assoc 10 (cdr p_lst)) (cdr p_lst)) ) ) ) ) (setq l_vtx (last v_lst) l_vtx (subst (cons 40 (cdr (assoc 41 (car v_lst)))) (assoc 40 l_vtx) l_vtx ) l_vtx (subst (cons 41 (cdr (assoc 40 (car v_lst)))) (assoc 41 l_vtx) l_vtx ) l_vtx (subst (cons 42 (- (cdr (assoc 42 (car v_lst))))) (assoc 42 l_vtx) l_vtx ) ) (setq v_lst (mapcar '(lambda (x y) (setq x (subst (cons 40 (cdr (assoc 41 y))) (assoc 40 x) x) x (subst (cons 41 (cdr (assoc 40 y))) (assoc 41 x) x) x (subst (cons 42 (- (cdr (assoc 42 y)))) (assoc 42 x) x) ) ) v_lst (cdr v_lst) ) ) (if (= (logand 1 (cdr (assoc 70 e_lst))) 1) (setq v_lst (append (list l_vtx) v_lst)) (setq v_lst (append v_lst (list l_vtx))) ) (cond ((= (cdr (assoc 0 e_lst)) "POLYLINE") (mapcar 'entmake (append (list e_lst) v_lst (list (entget vtx))) ) (entdel ent) ) ((= (cdr (assoc 0 e_lst)) "LWPOLYLINE") (setq e_lst (append e_lst (apply 'append v_lst))) (entmod e_lst) ) ) ) [Edité le 21/5/2007 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
lecrabe Posté(e) le 5 juillet 2007 Auteur Posté(e) le 5 juillet 2007 Hello Gilles Sorry mais je n'ai pas pu tester plus tot ! :exclam: SENS-TRIGO.LSP fonctionne BIEN sur toutes les versions d'AutoCAD 2002 - 2008 :) Comme toujours c IMPEC !! :D Le Decapode remerciant & "tournant dans le bon sens" PS: Question subsidiaire pour l'assistance ! Pourquoi ai je besoin de polylignes closes dessinées dans le sens trigo ? Autodesk Expert Elite Team
bonuscad Posté(e) le 5 juillet 2007 Posté(e) le 5 juillet 2007 Pourquoi ai je besoin de polylignes closes dessinées dans le sens trigo ? Ben, on se le demande.... :P Dis moi, comment fais tu si ta polyligne fait un "8" ? :casstet: Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
lecrabe Posté(e) le 6 juillet 2007 Auteur Posté(e) le 6 juillet 2007 Hello Gilles Qq réponses ... 1) Je suppose que la polyligne n'est pas trop tarabiscoté (donc pas de 8 ou papillon) :) 2) Pourquoi avoir des polylignes closes dans le sens trigo ? Parce que dans le monde du SIG/cartographie, je suis de temps en temps amené à exporter la géométrie (Comprenez les polylignes closes) des parcelles, batiments, etc ... vers Oracle Spatial / Locator Et si APRES on désire utiliser les fonctions topologiques d'Oracle Spatial / Locator sur des polygones clos, il faut qu'ils soient dans le sens TRIGO ! Bien sur, il est possible par un programme PL/SQL "adéquat" sous Oracle de remettre dans le sens trigo les polygones ! Mais c'est quand mieux si à la base, les polylignes sont OK dans AutoCAD ! :cool: Le Decapode (remerciant) Autodesk Expert Elite Team
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