arcuce Posté(e) le 21 octobre 2010 Posté(e) le 21 octobre 2010 bonjour ,j'ai comme presenté dans l'image ci-dessous une polyligne et deux blocs un qui represente une fleche l'autre qui me donne le diametre ce que je voudrais c'est parcourir la polyligne pour trouver "si il y est" le bloc qui me donne le diametre, l'autre bloc n'est pas importanthttp://nsa23.casimages.com/img/2010/10/21/101021081953320121.png
(gile) Posté(e) le 21 octobre 2010 Posté(e) le 21 octobre 2010 Salut, Avec une sélection par trajet : (ssget "_F" liste_sommets ...) et la liste des sommets de la polyligne (coordonnées SCU courant) si le bloc est biensur la polyligne et que celle-ci ne contient que des segments droits. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
arcuce Posté(e) le 21 octobre 2010 Auteur Posté(e) le 21 octobre 2010 pour le moment je fais ca : (defun getdiam (ent) (setq entComp (entget ent) p1 (cdr (assoc 10 entComp)) p2 (cdr (assoc 11 entComp)) ) (setq objects (ssget "_F" (list p1 p2))) ) mais il me retourne l'erreur suivante : "erreur: liste de points incorrecte"mes variables contienent:ent = entComp = ((-1 . ) (0 . "LWPOLYLINE") (5 . "3F0A") (102 . "{ACAD_XDICTIONARY") (360 . ) (102 . "}") (330 . ) (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbPolyline") (90 . 2) (70 . 128) (43 . 0.0) (38 . 0.0) (39 . 0.0) ( 10 874899.0 160848.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (10 874863.0 160867.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (210 0.0 0.0 1.0))p1 = (874863.0 160867.0)p2 = nil edit :oups je vien de voir pourquoi : p2 (cdr (assoc 11 entComp))mais alors commend recuperer le (10 874863.0 160867.0) [Edité le 21/10/2010 par arcuce]
(gile) Posté(e) le 21 octobre 2010 Posté(e) le 21 octobre 2010 Les sommets d'une polyligne optimisée (LWPOLYLINE) correspondent aux code 10 (une entrée par sommet) de la liste DXF de cette polyligne. Il sont exprimés en coordonnées SCO (le SCO de la polylignes est égal au SCG si le plan de la polyigne est parallèle au plan du SCG) Pour récupérer ces sommets (sujet maintes fois abordé) tu peux utiliser la "célèbre" expression :(mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget ent))) ou utiliser une fonction générique qui retourne toutes les entrées d'un même code de groupe d'une liste d'association ; cette routine est généralement appelée massoc, une recherche sur CADxp avec ce mot devrait te permettre d'en trouver plusieurs versions, voici la mienne : (defun massoc (key alst) (if (setq alst (member (assoc key alst) alst)) (cons (cdar alst) (massoc key (cdr alst))) ) ) Il est ensuite plus prudent de transformer ces points en coordonnées SCU courant au cas où celui-ci serait différent du SCG au moment où est lancée la routine. Il est aussi préférable de faire un filtre de sélection pour ne sélectionner que le bloc concerné (remplacer "NomDuBloc" par le vrai nom du bloc entre guillemets). (setq pts_lst (mapcar '(lambda (x) (trans x ent 1)) (massoc 10 (entget ent)))) (setq objects (ssget "_F" pts_lst '((0 . "INSERT") (2 . "NomDuBloc")))) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
arcuce Posté(e) le 21 octobre 2010 Auteur Posté(e) le 21 octobre 2010 merci beaucoup ca faitsexactement ce que je devais faire encore une fois merci
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