bonuscad Posté(e) le 29 juillet 2008 Posté(e) le 29 juillet 2008 Bonjour, J'ai un problème (Autocad 2008) sur le filtrage de ssget.Je voudrais ABSOLUMENT le résoudre car il m'entrave pour mener à bien mes requêtes. Si j'applique le code suivant, une sélection correspondante est bien effectuée avec "Nom de l'application" et "Etiquette chaine à trouver" sur les polylignes optimisées. (ssget "_X" (list(cons 0 "LWPOLYLINE")(list -3(list"Nom de l'application"(cons 1002 "{")(cons 1000 "Etiquette chaine à trouver")(cons 1002 "}"))))) Par contre si je change (cons 0 "LWPOLYLINE") par (cons 0 "POLYLINE") ce filtre ne fonctionne plus alors que les entités correspondantes existent bel et bien (polyligne 3D).Pour qu'il fonctionne, je suis obligé de supprimer les codes 1002 1000 et 1002, mais bien sur cela ne m'arrange PAS DU TOUT car mas sélection n'est plus ciblée :mad: Peut être que ce non-fonctionnement est dut aux entités VERTEX qui suivent (mais je ne pensent pas car le filtre avec seulement le nom de l'application fonctionne)Je ne sais comment tourner mon filtre pour qu'il fonctionne, car je ne comprends pas ce qui se passe.Si quelqu'un a une idée, il serait mon sauveur car mes requête sont ESSENTIELLES pour la gestion et l'exploitation de mes données étendues.Je dois normalement passer à la version 2009 courant septembre. Si ce style de filtrage fonctionne sous cette version, cela me rassurera beaucoup.Revoir complètement mes Xdata flanquerait par terre tout mon travail effectué depuis plus d'un an. :( Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
bseb67 Posté(e) le 29 juillet 2008 Posté(e) le 29 juillet 2008 Salut bonuscad, Je voudrai bien t'aider, mais déjà je ne sais pas comment dessiner une polyline,la lwpolyline oui. Si tu me dis comment, je veux bien aussi me pencher sur le problème. Pour la 2009, je ne sais pas. Je l'ai installé sans licence donc pour 30j, j'ai abandonné au bout de 4,trop lourde, les lisps sont plus lent, pour moi c'est devenue une grosse bou.. [Edité le 29/7/2008 par bseb67] Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
(gile) Posté(e) le 29 juillet 2008 Posté(e) le 29 juillet 2008 Salut, Ça ne fonctionne pas non plus sur les poly 2d ou 3d avec A2007. Tu peux toujours filtrer sur le nom de l'application, et vider ensuite du jeu de sélection, les entités qui n'ont pas la donnée voulue. ((lambda (/ ss n ent) (if (setq ss (ssget "_X" '((0 . "*POLYLINE") (-3 ("Nom de l'application"))))) (repeat (setq n (sslength ss)) (setq ent (ssname ss (setq n (1- n)))) (or (member '(1000 . "Etiquette chaine à trouver") (cadr (assoc -3 (entget ent '("Nom de l'application")))) ) (ssdel ent ss) ) ) ) ss ) ) [Edité le 29/7/2008 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Serge Posté(e) le 29 juillet 2008 Posté(e) le 29 juillet 2008 Bruno, Je ne sais pas ce qui est fait mais voici un bout de code. Il t'aidera peut-être à savoir où ça accroche. Le code fonctionne bien avec des LINE, POLYLINE (AcDb2dPolyline), LWPOLYLINE (AcDbPolyline), 3DPoly (soit POLYLINE - AcDb3dPolyline) et même des surfaces maillées (POLYLINE - "AcDbPolygonMesh") (defun c:SetXdata ( / appName exdata filtre Global i lastent n obj objGet ss ) ;; Insère des données étendues aux objets spécifiés par le filtre ;; Fonctionne en complément de c:GetXdata (setq appName "Nom de l'application") (setq Global t) ; Pour le comportement du ssget: nil pour demander, sinon tout le dessin (setq filtre (list (cons 0 "*polyline,line"))) (if (not (tblsearch "appid" appName)) (regapp appName)) (and (setq ss (if Global (ssget "_x" filtre) (ssget filtre))) (setq n (sslength ss)) (setq i 0) (while (< i n) (setq obj (ssname ss i)) (setq objGet (entget obj (list appName))) (setq exdata (append (list appName) (list (cons 1002 "{")) (list (cons 1000 (strcat "Étiquette chaine à trouver : Handle = " (cdr (assoc 5 objGet))))) (list (cons 1002 "}")) )) (setq exdata (list (list -3 exdata))) (setq objGet (append objGet exdata)) (entmod objGet) (entupd obj) (setq i (1+ i)) ) ) (princ) ) (defun c:GetXdata ( / appName etiquette exdata filtre Global i n obj objGet ss ) ;; Lit des données étendues aux objets spécifiés par le filtre ;; et imprime la valeur de l'étiquette. ;; Fonctionne en complément de c:SetXdata (setq appName "Nom de l'application") (setq Global nil) ; Pour le comportement du ssget: nil pour demander, sinon tout le dessin (setq filtre (list (cons 0 "*polyline,line") (list -3 (list appName)))) (and (setq ss (if Global (ssget "_x" filtre) (ssget filtre))) (setq n (sslength ss)) (setq i 0) (while (< i n) (setq obj (ssname ss i)) (setq objGet (entget obj (list appName))) (setq exdata (cdadr (assoc -3 objGet))) (setq etiquette (cdr (assoc 1000 exdata))) (princ (strcat "\nÉtiquette: " etiquette)) (setq i (1+ i)) ) ) (princ) ) Serge
zebulon_ Posté(e) le 29 juillet 2008 Posté(e) le 29 juillet 2008 Bonjour, pour les xdata, je fais comme (gille). Par contre, pour me simplifier la tâche au niveau de l'écriture, j'utilise la bibliothèque de fonctions mise à disposition par Didier-AD ici, où il a déjà été amplement remercié pour cela par quelques uns ici présents.Cela évite de se taper des (cadr (assoc -3... à n'en plus finir et permet de gérer les xdata de façon fonctionnelle. AmicalementVincent 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)
bonuscad Posté(e) le 29 juillet 2008 Auteur Posté(e) le 29 juillet 2008 (gile) a tout fait cerné mon problème, et sa proposition est effectivement un palliatif à cette situation de filtrage.J'essayerais demain concrètement sur mon fichier de données qui est extrêmement lourd pour voir si cela réagit de façon convenable. En effet dans ce cas le jeu de sélection concernera l'intégralité de mon dessin (donc la procédure risque d'être beaucoup plus longue). J'aurais préféré un filtre logique pour répondre à ce "bug" de filtrage sur des POLYLINE. Donc merci, j'ai la bouée mais suis pas encore sauvé !!! ;) suite demain. Serge j'ai bien essayé ta proposition qui a fonctionné correctement, mais ne m'a pas permis de relever d'anomalie sur le filtrage. :( Un petit bonjour en passant à notre ami Québécois de retour depuis peu sur le site. ;) (il me manquait ce petit bonhomme de neige) Zebulon, les fichiers de Didier-AD sont très bien, mais ne répondent pas à mon problème de filtrage. (Excellente démo pour montrer les possibilités des Xdatas) bseb67, tu peux obtenir une P0LYLIGNE en dessinant soit une POLY3D ou en appliquant un Lissage avec PEDIT sur une LWPOLYLINE (Utilise la commande LISTE avant et après pour t'en persuader) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
(gile) Posté(e) le 29 juillet 2008 Posté(e) le 29 juillet 2008 bseb67, tu peux obtenir une P0LYLIGNE en dessinant soit une POLY3D ou en appliquant un Lissage avec PEDIT sur une LWPOLYLINE (Utilise la commande LISTE avant et après pour t'en persuader) Ou encore, en mettant la variable système PLINETYPE à 0, la commande POLYLIGN crée des polylignes 2d au lieu de lwpolylignes. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
bonuscad Posté(e) le 30 juillet 2008 Auteur Posté(e) le 30 juillet 2008 Hé bien en situation réelle, le palliatif est tout à fait correct. Le temps de réponse est en fait sensiblement égale à l'application du filtre sur les LWPOLYLINE. Solution adoptée car non pénalisante, merci (gile) de ta proposition. NB: Attention à la variable PLINETYPE car celle-ci conserve sa dernière valeur. Donc se répercute sur tous les dessins et non pas que sur le dessin en cours. Pour le 2D les LWPOLYLINES sont plus avantageuses que les anciennes POLYLINES en terme de définition dans le dessin (requiert moins d'espace de stockage, taille du dessin moins importante)Je dirais donc variable à oublier, sauf pour compatibilité d'ancien programmes, c'est pour cela que je ne l'avais pas mentionné. C'est bien quand même de savoir qu'elle existe... Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
zebulon_ Posté(e) le 30 juillet 2008 Posté(e) le 30 juillet 2008 Zebulon, les fichiers de Didier-AD sont très bien, mais ne répondent pas à mon problème de filtrage ça j'en étais bien conscient et c'est pour ça que je disais plus haut que la solution de (Gile) étais la bonne. C'était juste que les fonctions de Didier-AD permettent de se servir des xdata sans trop s'embêter en écrivant le code lisp. AmicalementVincent 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)
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