Aller au contenu

Selection PLINEs par le nombre de Vertex


Messages recommandés

Posté(e)

 

Hello

 

J'ai farfouille dans differents forums sans rien trouver, Sniff ! :o

 

SVP je desire une routine en VLisp ou Lisp qui permette de selectionner / trouver les polylignes (2D ou 3D, splinees ou Non, Lissees ou Non) en fonction du nombre de Vertex utilises pour les dessiner !

 

En fin de routine, on force les Polylignes concernees par une couleur C

 

--- Deroulement de la routine ---

 

1) Parametres

Nombre de Vertex (Defaut=2) : N

Critere de selection = ou = (Defaut =) : =

Choix de la couleur de "forcage" (Defaut=1=Rouge) : C

Selection AutoCAD classique ...

 

2) Traitement

 

3) Resultat :

Total des Polylignes selectionnees = xxx

Nombre de polylignes traitees = yyy

et bien sur les polylignes concernees ont ete forcees par la couleur C

 

Avec les parametres par defaut (N=2, Critere =, Couleur 1 Rouge),

je trouve par exemple les Polylignes composees de 2 vertex seulement !

 

Merci d'avance de votre aide, Le Decapode

 

 

 

Autodesk Expert Elite Team

Posté(e)

Bonjour,

 

Ceci pourrait-il te convenir?

 

(defun c: Pol_Nbr_Vtx ( / jspl n count AcDoc Space nbr exprtest e_col ent_name ename id_obj nbx)
(setq
 jspl
 (ssget
  '((-4 . "    (0 . "*POLYLINE")
   (-4 . "    (-4 . "&") (70 . 112)
   (-4 . "NOT>")
   (-4 . "AND>"))
 )
 n -1
 count 0
)
(cond
 (jspl
  (setq
   AcDoc (vla-get-ActiveDocument (vlax-get-acad-object))
   Space
   (if (eq (getvar "CVPORT") 1)
    (vla-get-PaperSpace AcDoc)
    (vla-get-ModelSpace AcDoc)
   )
  )
  (vla-StartUndoMark AcDoc)
  (initget 6)
  (setq nbr (getint "\nNombre de sommets recherchés pour les polylignes? <2>: "))
  (if (not nbr) (setq nbr 2))
  (initget "= >= <=")
  (setq exprtest (getkword "\nTest d'égalité à appliquer [=/>=/<=]? <=>: "))
  (if (not exprtest) (setq exprtest "="))
  (initget 4)
  (setq e_col (getint "\nForcer à la couleur (0 - 256) <1>: "))
  (if (not e_col) (setq e_col 1))
  (repeat (sslength jspl)
   (setq
    ent_name (ssname jspl (setq n (1+ n)))
    ename (vlax-ename->vla-object ent_name)
    id_obj (vla-get-ObjectName ename)
   )
   (if (eq id_obj "AcDbPolyline")
    (setq nbx (/ (length (vlax-get ename 'Coordinates)) 2))
    (setq nbx (/ (length (vlax-get ename 'Coordinates)) 3))
   )
   (if ((eval (read exprtest)) nbx nbr) (progn (vla-put-Color ename e_col) (setq count (1+ count))))
  )
  (vla-EndUndoMark AcDoc)
  (princ
   (strcat
    "\n" (itoa count) " polylignes ayant un nombre de sommets "  exprtest 
    " à " (itoa nbr) " sur " (itoa (1+ n)) " sélectionnées, ont été forcées à la couleur: " (itoa e_col)
   )
  )
 )
)
(prin1)
)

 

[Edité le 25/11/2009 par bonuscad]

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Hello

 

Merci, je suis en train de tester "TEL QUE" avec MAP 2006 sur des Polylignes 2D classiques

et cela semble bien fonctionner donc j'imagine que cela devrait aller aussi

pour les 3DPOLY et autres joyeusetes !? :P

 

SVP pourrais tu "enrober" cette routine dans un DEFUN nomme Pol_Nbr_Vtx

ainsi cela serait plus pratique et surtout plus propre d'indiquer les variables utilisees

 

Encore MERCI de ta rapidite et de ton efficacite, je vais tester sur MAP 3D 2010 !

 

Le Decapode "trieur de polylignes par le nombre de vertex"

 

 

 

[Edité le 25/11/2009 par lecrabe]

Autodesk Expert Elite Team

Posté(e)

"enrober" cette routine dans un DEFUN nomme Pol_Nbr_Vtx

 

Maintenant que tu m'as donné un nom... j'ai édité le code. ;)

 

Quand je ne sais pas trop quoi inventer je fais une fonction anonyme.

 

En fait tu remplace le corps ((lambda ( / ....) .......)) par un (defun c:ma_fonction ( / ...) ....)

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

 

Hello

 

En fait j'avais deja implemente un DEFUN mais pour les autres utilisateurs de la routine,

c quand meme mieux que ton code soit nickel-chrome (comme d'habitude d'ailleurs) ! :)

 

A propos j'ai teste sur MAP 3D 2010 (toujours avec des PLINEs 2D classiques) et ca fonctionne parfaitement donc cette routine est censee etre operationnelle sur toutes les versions d'AutoCAD depuis la 2006 jusqu'a la 2010 (et sans doute aussi sur la 2004/2005)

 

Encore Merci, Bonne soiree, Le Decapode

 

Autodesk Expert Elite Team

Posté(e)

Bonsoir,

 

je suis un peu plus lent et j'ai pondu ceci

 

(defun c:selpoly (/ AcDoc ss KEY I J e eobj typ coords nbvtx)
 (vl-load-com)
 (setq 
   AcDoc (vla-get-ActiveDocument (vlax-get-acad-object))
 )
 (setq ss (ssget '((0 . "*POLYLINE"))))
 (if ss
   (progn
     (if (not selpolyNB) (setq selpolyNB 2))
     (if (not selpolyCRIT) (setq selpolyCRIT "="))
     (if (not selpolyCOL) (setq selpolyCOL 1))
     (setq KEY "N")
     (while KEY
       (prompt (strcat "\nParamètres courants : NOMBRE SOMMETS " (itoa selpolyNB) ", CRITERE " selpolyCRIT ", COULEUR " (itoa selpolyCOL)))
       (initget "N T C")
       (setq Key (Getkword "\ntraiter les polylignes ou [Nombre de sommets/criTère/Couleur] : "))
       (cond
         ((= KEY "N")
           (setq selpolyNB (getint "\nNombre de sommets : "))
         )
         ((= KEY "C")
            (setq selpolyCOL (acad_colordlg selpolyCOL nil))
         )
         ((= KEY "T")
           (initget "= <= >=")
           (setq selpolyCRIT (getkword "\nCritère [=, <=, >=] <=> "))
           (if (not selpolyCRIT) (setq selpolyCRIT "="))
         )
       )
     ) ;; while
     (setq I 0 J 0)
     (vla-StartUndoMark AcDoc)
     (repeat (sslength ss)
       (setq e (ssname ss I))
       (setq eobj (vlax-ename->vla-object e))
       (setq typ (cdr (assoc 0 (entget e))))
       (setq coords (vlax-get eobj 'coordinates))
       (if (= typ "LWPOLYLINE")
         (setq nbvtx (/ (length coords) 2))
         (setq nbvtx (/ (length coords) 3))
       )        
       (if ((eval (read selpolyCRIT)) nbvtx selpolyNB)
         (progn
           (vla-put-Color eobj selpolyCOL)
           (setq J (+ J 1))
         )
       )
       (setq I (+ I 1))
     ) ;; repeat
     (alert (strcat "Nombre de polylignes sélectionnées : " (itoa (sslength ss)) "\nNombre de polylignes traitées : " (itoa J)))
     (vla-EndUndoMark AcDoc)
   )
 )
 (princ)
) 

 

Cela ressemble à ce qu'à fait Bonuscad. Je voulais juste savoir à quoi correspond le code dxf 70 . 112 (puisque mon ssget est beaucoup plus simpliste, trop sans doute)

 

Amicalement

Vincent

 

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Posté(e)

Salut,

 

Je voulais juste savoir à quoi correspond le code dxf 70 . 112

 

Sous le nom POLYLINE (pas LWPOLYLINE) sont en fait regroupés plusieurs types d'entités :

- polylignes 2d "old style" ("AcDb2dPolyline")

- polylignes 3d ("AcDb3dPolyline")

- surfaces maillées ("AcDbPolygonMesh")

- mailles polyfaces ("AcDbPolyFaceMesh")

 

C'est dans le code de groupe DXF 70 qu'est déterminé le type de polyligne.

112 correspond à 16+32+64 à savoir les codes binaires qui définissent les surfaces maillées et mailles polyface, ces objets seront écartés du filtre de sélection.

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

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é