Aller au contenu

Messages recommandés

Posté(e)

Bonsoir a tous,

 

voila, je voudrais faire une selection a l'aide de ssget sur des entites d un certain type de ligne ou dont le type de ligne est ducalque et le type du calque est celui recherché.

un exemple sera certainement plus causant:

 

je veux selectionner tous les entités dont le type de ligne (tdl) est "AXES" ainsi que celles qui ont pour tdl "DUCALQUE" et dont ce meme calque a pour tdl "AXES".

 

Si qq'un a compris mon charabbia et a une solution a m'apporter, merci d'avance.

a+

 

Posté(e)

bonjour Draven

Il est possible de faire ce que tu souhaites avec un filtre élaboré

et la commande ssget, mais il va falloir jongler avec les "AND" et les "OR".

si tu débutes en Lisp, tu va comprendre plus aisément ce que je t' ai écrit :

 

 (defun choixdraven ()
   ;initialisation du compteur
 (setq compteur 0)
   ;création d'un jeu de sélection vide
 (setq jeusel (ssadd))
   ;extraction de la première entité du fichier
   ;même si elle sdans un calque gelé
 (setq ent (entnext))
   ;début d'une boucle : tant qu'il y a des entités
 (while ent
   ;premier test :
   ;si l'entité est dans le calque "axes"
   ;et que c'est une ligne
   ;et qu'elle est type de ligne "DUCALQUE"
   ;je l'ajoute au jeu de sélection
   ;on avance non ?
   (if
     (and
(= "axes" (cdr (assoc 8 (entget ent))))
(= "LINE" (cdr (assoc 0 (entget ent))))
(= nil (cdr (assoc 6 (entget ent))))
     ) ;_ Fin de and
      (ssadd ent jeusel)
   ) ;_ Fin de if
   ;deuxième test :
   ;et que c'est une ligne
   ;et qu'elle est type de ligne "AXES"
   ;je l'ajoute au jeu de sélection
   ;j'ai bien compris ?
   (if
     (and
(= "LINE" (cdr (assoc 0 (entget ent))))
(= "AXES" (cdr (assoc 6 (entget ent))))
     ) ;_ Fin de and
      (ssadd ent jeusel)
   ) ;_ Fin de if
   ; choix de l'entité suivante et ainsi de suite
   ;jusqu'à plus soif
   (setq ent (entnext ent))
   ; à chaque passage d'entité le compteur s'incrémente de 1
   (setq compteur (+ 1 compteur))
 ) ;_ Fin de while
   ; affichage d'un message qui te dira combien d'entités correspondent à tes choix
 (alert (strcat (rtos (sslength jeusel) 2 0)
	 " Entités sélectionnées sur un total de : "
	 (rtos compteur 2 0)
 ) ;_ Fin de strcat
 ) ;_ Fin de alert
) ;_ Fin de defun

ben voilà une soultion, comme à bien des problèmes la solution n'est pas unique,

mais en avoir au moins une est utile

amicalement

Posté(e)

slt,

j'ai etudié ton lisp didier, et malheureusement cela ne me convient pas:

en fait je veux faire un tri sur une selection faite .

mais ce tri comporte plusieurs type de lignes et je ne connais pas a l avance les calques

sur lesquels je vais chercher.

c pourkoi j avais commencer mon lispe ainsi:

 

 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun c:yo ()
(if
(setq selection (ssget '((0 . "ARC,LINE,*POLYLINE,CIRCLE,ELLIPSE,SPLINE")))); je selectionne les entites
(progn
;;;a partir de la, je voudrais creer 2 listes
(setq l_iso (ssadd));une dont le type de ligne des entites est : axes et cache et continuous etc et ducalque si le type de ligne du calque est axes ou cache ou etc..
(setq l_plo (ssadd));et une autre dont le type de ligne des entites est : toto et tata et titi etc et ducalque si le type de ligne du calque est toto ou tata ou etc..
;----------------------------------------------------------------------------------------
(setq i 0)
(setq n (sslength selection))
(while (< i n);boucle tant ke i < n
  (setq ent (ssname selection i));definit "ent" comme la ième entité de la selection "selection"
  (cond
   ((= "AXES" (cdr (assoc 6 (entget ent)))) (ssadd ent l_iso))
   ((= "CACHE" (cdr (assoc 6 (entget ent)))) (ssadd ent l_iso))
   ((= "Continuous" (cdr (assoc 6 (entget ent)))) (ssadd ent l_iso))
  );fin de cond
  (setq i (1+ i))
);fin de while
;----------------------------------------------------------------------------------------
(setq j 0)
(setq m (sslength selection))
(while (< j m);boucle tant ke j < m
  (setq en (ssname selection j));definit "ent" comme la jème entité de la selection "selection"
  (cond
   ((= "toto" (cdr (assoc 6 (entget en)))) (ssadd en l_plo))
   ((= "tata" (cdr (assoc 6 (entget en)))) (ssadd en l_plo))
   ((= "titi" (cdr (assoc 6 (entget en)))) (ssadd en l_plo))
  );fin de cond
  (setq j (1+ j))
);fin de while
;-----------------------------------------------------------------------------------------
(if l_iso
  (command "_change" l_iso "" "_pr" "_c" "2" "")
);fin de if
(if l_plo
 (command "_change" l_plo "" "_pr" "_c" "3" "")
);fin de if
;;;(alert (strcat (rtos (sslength selection) 2 0) " Entités traitées"))
);fin de progn
(alert " Aucune entité valable sélectionnée ")
);fin de if
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

mais c la que je bloque, je ne vois pas comment ajouter les entités dont le type de ligne

est ducalque tout en les separant separant bien en 2 listes.

 

donc si qqun a une petite idee...

Posté(e)

oui ca j avais compris mon probleme venait du fait ke je ne voulais pas prendre toutes les entites dont le lype de ligne etait "ducaque" mais celle de certains calques seulement

sans connaitre les calques auparavant.

 

g reussi avec un tblnext et des bidouilles, g plus qu a essayer de comprendre le mapcar

et ca devrait le faire (je crierais au secour si je n y arrive pas :D )

 

en tout cas merci pour votre aide

 

voici tout meme ma routine pour trouver les calques dont le type de ligne m'interresse, si vous voulez y jetez un coup d'oeil .

 

 (defun tdl_lay (/ a a1 b )
(setq iso_tdl_lay '())
(setq a 1)
(while
(setq a1 (tblnext "layer" a))
(setq a nil)
(if
 (or
  (= (cdr (assoc 6 a1)) "AXES")
  (= (cdr (assoc 6 a1)) "CACHE")
  (= (cdr (assoc 6 a1)) "Continuous")
 );fin de or
 (progn (setq b (cdr (assoc 2 a1))) (setq iso_tdl_lay (append iso_tdl_lay (list b))))
);fin de if
);fin de while
);fin

 

@+

Posté(e)

bonjour Draven

Voici un exemple de ce qu'on peut extraire en cliquant sur une entité

c'est utile quand le calque de cette entité est inconnu.

 ;choix d'une entité
(setq Ent(car(entsel"\nChoix d'une Entité\n")))

;création de la liste des renseignements
(setq ListeEnt(entget ent))

;type d'entité
(setq TypeEnt (cdr(assoc 0 ListeEnt)))

;calque de l'entité
(setq CalqueEnt (cdr(assoc 8 ListeEnt)))

;couleur de l'entité
;ATTENTION si l'entité n'est pas couleur DUCALQUE
;AutoLisp retourne un entier, donc rtos...
(setq CoulEnt (cdr(assoc 62 ListeEnt)))
(if ( = nil CoulEnt)(setq CoulEnt "DuCalque")
   (setq CoulEnt (rtos CoulEnt 2 0)))

;type de la ligne
(setq TypeLigne (cdr(assoc 6 ListeEnt)))

;si nil c'est DUCALQUE
(if ( = nil TypeLigne)(setq TypeLigne "DuCalque"))

;affichage des réponses
(alert (strcat "Type de l'Entité selectionnée  :" TypeEnt
       "\n Calque : " CalqueEnt
       "\n Couleur : " CoulEnt
       "\n Type de Ligne : " TypeLigne))

voilà pour compléter ...

ciao

Posté(e)

ca y est g reussi !

moi aussi je n est pas du etre assez clair dans la formulation de mon probleme:

ce que je voulais c 'etait à partir d'un jeu de selection (ssget) creer deux liste d entité:

1 avec comme type de ligne axes et cache et/ou ducalque si le type de celui-ci etait axes ou cache,

et 1 avec les types de ligne continuous et pointille et/ou ducalque si le type de celui-ci etait continuous ou pointillé.

donc voila comment g fait:

 

 ;;----------obtention de tous les calques dont le type de ligne m'interresse--------------
(defun tdl_lay (/ a a1 b c)
(setq iso_tdl_lay '())
(setq bbl_tdl_lay '())
(setq a 1)
(while
(setq a1 (tblnext "layer" a))
(setq a nil)
(if
 (or
  (= (cdr (assoc 6 a1)) "AXES")
  (= (cdr (assoc 6 a1)) "CACHE")
 );fin de or
 (progn (setq b (cdr (assoc 2 a1))) (setq iso_tdl_lay (append iso_tdl_lay (list b))))
);fin de if
(if
 (or
  (= (cdr (assoc 6 a1)) "Continuous")
  (= (cdr (assoc 6 a1)) "POINTILLE")
 );fin de or
 (progn (setq c (cdr (assoc 2 a1))) (setq bbl_tdl_lay (append bbl_tdl_lay (list c))))
);fin de if
);fin de while
);fin
;;--------------------recherche des entites-----------------------------------------
(defun c:yo ()
(tdl_lay)
(if
(setq selection (ssget '((0 . "ARC,LINE,*POLYLINE,CIRCLE,ELLIPSE,SPLINE")))) 
(progn
(setq l_iso (ssadd))
(setq l_bbl (ssadd))
;----------------------------------------------------------------------------------------
(setq i 0)
(setq n (sslength selection))
(while (< i n);boucle tant ke i < n
(setq ent (ssname selection i))
(if
(or
(= (cdr (assoc 6 (entget ent))) "AXES")
(= (cdr (assoc 6 (entget ent))) "CACHE")
(and (= (cdr (assoc 6 (entget ent))) nil) (member (cdr (assoc 8 (entget ent))) iso_tdl_lay) )
);fin de or
(ssadd ent l_iso)
);fin de if
(if
(or
(= (cdr (assoc 6 (entget ent))) "Continuous")
(= (cdr (assoc 6 (entget ent))) "POINTILLE")
(and (= (cdr (assoc 6 (entget ent))) nil) (member (cdr (assoc 8 (entget ent)))
bbl_tdl_lay) )
);fin de or
(ssadd ent l_bbl)
);fin de if
(setq i (1+ i))
);fin de while
;-----------------------------------------------------------------------------------------
(setq nb_l_iso (sslength l_iso))
(setq nb_l_bbl (sslength l_bbl))
(setq nb_ent_traitees (+ nb_l_iso nb_l_bbl))
(if (/= nb_l_iso 0)
  (command "_change" l_iso "" "_pr" "_c" "2" "")
);fin de if
(if (/= nb_l_bbl 0)
 (command "_change" l_bbl "" "_pr" "_c" "3" "")
);fin de if
(alert (strcat (rtos nb_ent_traitées 2 0) " Entités sélectionnées sur un total de : " (rtos n 2 0)))
);fin de progn
(alert " Aucune entité valable sélectionnée ")
);fin de if
)
;;------------------------------------fin----------------------------------------------

 

C un peu lent mais ca marche, donc si qqun peux me dire si un mapcar accelererait le processus, surtout si on rajoute des types de lignes, et si si oui si on pouvait faire un petit cours sur le mapcar, ca serait vraiment genial.

 

@+

 

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é