fabcad Posté(e) le 18 février 2010 Posté(e) le 18 février 2010 Bonjour a tous, Comment en Vlisp/AutoLISP, réduire à deux sommets (point 1 et point 2) un ensemble de lwpolylignes qui possèdent plusieurs sommets. Merci d'avance, Bonne journée Fabrice
lecrabe Posté(e) le 18 février 2010 Posté(e) le 18 février 2010 Hello Pour Info je suis interesse par une legere variante de ce "futur" programme qui traite les N polylignes selectionnees : 1) Poser une question avant de traiter ... - soit reduire aux sommets 1 et 2 - soit reduire au 1er sommet et DERNIER sommet Ensuite, si le programme pouvait traiter TOUT type de polyligne, ca serait super : lwpline, pline, 3Dpoly, etc Merci d'avance, Le Decapode (suiveur de Fabcad) Autodesk Expert Elite Team
(gile) Posté(e) le 18 février 2010 Posté(e) le 18 février 2010 Salut, Quid des arcs ? Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
lecrabe Posté(e) le 18 février 2010 Posté(e) le 18 février 2010 Hello Gilles et Fabcad Personnellement, je me moque completement des arcs ou que la polyligne soit lissee ou splinee !Qu'elle soit 2D ou 3D ! Qu'en pense notre ami Fabcad ? Le Decapode Autodesk Expert Elite Team
(gile) Posté(e) le 18 février 2010 Posté(e) le 18 février 2010 Bon, un premier jet. Vu la technique utilisée (vlax-put pl 'Coordinates) il est possible que ça ne fonctionne pas avec les versions antérieures à 2007.Si le premier segment est un arc (lwpolyline ou polyligne 2d simple), le segment résultant récupère le bulge.Si la polyligne est lissée ou splinée, avec l'option Second, le second sommet est celui de la polyligne avant lissage ou splinage. (defun c:PL2SEG (/ *error* opt ss old new rev) (vl-load-com) (defun *error* (msg) (and msg (/= msg "Fonction annulée") (princ (strcat "\nErreur: " msg)) ) (vla-EndUndoMark acdoc) (princ) ) (setq acdoc (vla-get-Activedocument (vlax-get-acad-object))) (initget "Dernier Second") (setq opt (cond ((getkword "\nChoisir une option [Dernier/Second] : ")) ("Dernier") ) ) (if (ssget '((0 . "*POLYLINE") (-4 . " (-4 . "&") (70 . 112) (-4 . "not>") ) ) (progn (vla-StartUndoMark acdoc) (vlax-for pl (setq ss (vla-get-ActiveSelectionSet acdoc)) (setq old (vlax-get pl 'Coordinates)) (if (= (vla-get-ObjectName pl) "AcDbPolyline") (if (= opt "Dernier") (setq rev (reverse old) new (list (car old) (cadr old) (cadr rev) (car rev)) ) (setq new (list (car old) (cadr old) (caddr old) (cadddr old)) ) ) (if (= opt "Dernier") (setq rev (reverse old) new (list (car old) (cadr old) (caddr old) (caddr rev) (cadr rev) (car rev) ) ) (setq new (list (car old) (cadr old) (caddr old) (cadddr old) (nth 4 old) (nth 5 old) ) ) ) ) (vlax-put pl 'Coordinates new) ) (vla-delete ss) (vla-EndUndoMark acdoc) ) ) (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
lecrabe Posté(e) le 18 février 2010 Posté(e) le 18 février 2010 Hello Gilles En effet avec une version 2006, on a une belle erreur :Choix des objets:; erreur: une exception s'est produite: 0xC0000005 (Violation d'accès); avertissement: fonction unwind ignorée erreur inconnue Avec une version 2008 (ou 2007 ou plus), ca marche parfaitement ! :) J'ai teste avec des polylignes 2D fermees ou non, splinees, lissees et aussi avec des 3DPoly ... :P Comme d'hab. ton programme est nickel-chrome !et en plus les polylignes conservent leurs XDATAs et OD (Object Data) de MAP (ou CIVIL) Normal car en fait si j'ai bien compris, tu modifes l'objet d'origine !! ;) Merci, Le Decapode Autodesk Expert Elite Team
fabcad Posté(e) le 18 février 2010 Auteur Posté(e) le 18 février 2010 Hello Gilles Nous sommes sur la même longueur d'ondes mon cher décapode :-)Les arcs sur les lwpolylignes c'est la précision que les logiciels SIG bureautiques ne savent pas faire ! Avec une version 2009, ca fonctionne très bien, Une explication sur (70 . 112) serait la bienvenue, je n'ai pas trouvé cette valeur dans l'aide des codes DXF. C'est le genre d'outils qui dans la production de données d'un SIG diminue le temps de traitement et en plus le fait de conserver l'objet d'origine assure la pérennité des données attributaires. Une personne comme toi chez GéoMAP et le SIG Autodesk se développera de façon exponentielle. Merci, Fabrice le Gallo-breton, [Edité le 19/2/2010 par fabcad]
(gile) Posté(e) le 19 février 2010 Posté(e) le 19 février 2010 Une explication sur (70 . 112) serait la bienvenue, je n'ai pas trouvé cette valeur dans l'aide des codes DXF. Le code de groupe 70 des entités POLYLINE renseigne sur le type de polyligne.Sa valeur est une somme de codes binaires, par exemple :1 indique une polyligne 2d simple fermée4 indique une polyligne 2d splinée131 (1 + 2 + 128) indique une polyligne lissée fermée avec la génération du type de ligne actif.9 (1 + 8) indique une polyligne 3d (8) fermée (1) Il s'agit, avec ce filtre de ne retenir que les polylignes 2d ou 3d quel que soit leur type, autrement dit, d'écarter toute polyligne de type maillage. 112 est la somme des codes binaires qui caractérisent les polylignes de type maille (elles peuvent aussi avoir 1 si elles sont fermées dans la direction M) :16 = Surface maillée 3D.32 = Surface maillée fermée dans la direction N.64 = La polyligne est une maille polyface. Dans le filtre de sélection, l'utilisation de cette somme de codes est liée aux expressions qui l'encadrent :(-4 . "")le (-4 . "&") est un "AND" logique qui retourne "vrai" si un code binaire du groupe 70 de la polyligne est contenu dans 112.(-4 . "&") (70 . 112) est à peu près équivalent à :(/= 0 (logand 112 (cdr (assoc 70 ListeDxfDeLaPolyligne))) Ce qui, encadré par (-4 . "") inverse le résultat soit :(= 0 (logand 112 (cdr (assoc 70 ListeDxfDeLaPolyligne))) Autrement dit en français : le groupe DXF 70 de la polyligne ne doit contenir ni 16, ni 32, ni 64. Une personne comme toi chez GéoMAP et le SIG Autodesk se développera de façon exponentielle. S'ils sont susceptibles de m'embaucher, je suis ouvert à toute proposition... Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
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