BIGC-ROMU Posté(e) le 26 mars 2009 Posté(e) le 26 mars 2009 Bonjour à tous, J'ai éssayé de me lancer dans le lispet j'ai un problème "d'argument" dans mon premier lisp Le lisp doit exploser toutes les polylignes de ma selection... ;;; Explose les polylignes (defun c:eaa (/js i1 ent lent typent) (setq js (ssget)) (setq i1 0) (repeat (sslength js) (setq ent (ssname js i1)) (setq lent (entget ent)) (setq typent (cdr (assoc 0 lent))) (if (= typent "LWPOLYLINE") (command "_explode" ent) ) (setq i1 (+ 1 i1)) ) (princ) ) - Ou est l'erreur?
capde06 Posté(e) le 26 mars 2009 Posté(e) le 26 mars 2009 fait plutot comme ca (defun c:eaa (/ js i1 ent lent typent) (setq js (ssget '((0 . "LWPOLYLINE")))) (setq i1 0) (repeat (sslength js) (setq ent (ssname js i1)) (command "_explode" ent) (setq i1 (+ 1 i1)) ) (princ)) l'erreur est la (/ js i1 ent lent typent) bon (/js i1 ent lent typent) pas bon Vous fîtes ce que vous pûtes et vous m'épatâtes !!!!
Arcasdk Posté(e) le 26 mars 2009 Posté(e) le 26 mars 2009 Coucou pour répondre à ta question..... ton erreur vient de ta première ligne de commande (defun c:eaa ([surligneur]/js[/surligneur] i1 ent lent typent) Tu n'as pas mis d'espace entre "/" et "js" Voilà [Edité le 26/3/2009 par Arcasdk] <IMG SRC=http://peronfrederic.free.fr/banniere.jpg></IMG> <a href=www.formu-lan.net>www.FormuLan.net</a>
BIGC-ROMU Posté(e) le 26 mars 2009 Auteur Posté(e) le 26 mars 2009 Ok, c'est pas gagné... Un espace la honte... (setq js (ssget '((0 . "LWPOLYLINE")))) cela me permet d'avoir directement que des polylignes dans js, à retenir. Mais je voudrais aller un peu plus loin.Je voudrais à partir de js créer 2 jeux de selection.- un avec que les polylignes- un avec que des cotes pivotées. est ce que s'est possible?
bseb67 Posté(e) le 26 mars 2009 Posté(e) le 26 mars 2009 Tout d'abord félicitation, ce mettre au lisp quand on ne connait pasc'est un peu déroutant, surtout toutes les parenthèses. Bon je rajoute mon petit grain pour ta fonction en t'expliquant les modifications: (defun c:eaa( / js i1 ent) (setq js (ssget) i1 0) (and js (repeat (sslength js) (if (= (cdr (assoc 0 (entget (setq ent (ssname js i1))))) "LWPOLYLINE") (command "_explode" ent) ) (setq i1 (1+ i1)) ) ) (princ) ) Mes modifications:- (setq ...) suivi d'un autre (setq ...) peuvent être remplacés par un seul => légèrement plus rapide- le sslength plante si js vaut nil => d'où le (and js- lent et typent ne sont pas nécessaire si tu ne fais rien avec => d'où le (setq ent dans le test du if- la fonction (1+ est plus rapide (aussi) que (+ 1 ...) Voilà, a+ ;) Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
bseb67 Posté(e) le 26 mars 2009 Posté(e) le 26 mars 2009 Ok, c'est pas gagné... Un espace la honte... (setq js (ssget '((0 . "LWPOLYLINE")))) cela me permet d'avoir directement que des polylignes dans js, à retenir. Mais je voudrais aller un peu plus loin.Je voudrais à partir de js créer 2 jeux de selection.- un avec que les polylignes- un avec que des cotes pivotées. est ce que s'est possible? Tu veux faire:- un jspoly et un jscotpiv?- une sélection contenant les deux? Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
BIGC-ROMU Posté(e) le 26 mars 2009 Auteur Posté(e) le 26 mars 2009 - (setq ...) suivi d'un autre (setq ...) peuvent être remplacés par un seul => légèrement plus rapideOK - le sslength plante si js vaut nil => d'où le (and js OK mais à quoi sert and à part d'éviter de faire planter sslenght? - lent et typent ne sont pas nécessaire si tu ne fais rien avec => d'où le (setq ent dans le test du if Je préfére encore tous détailler ligne par ligne, afin de me faciliter la lecture du lisp, plus tard peut être... - la fonction (1+ est plus rapide (aussi) que (+ 1 ...) OK Tu veux faire:- un jspoly et un jscotpiv?- une sélection contenant les deux? Un jspoly et un jscotpiv à partir de js. Un avec les 2 m'interesse aussi... Merci de l'aide... [Edité le 26/3/2009 par BIGC-ROMU]
bseb67 Posté(e) le 26 mars 2009 Posté(e) le 26 mars 2009 Re, La fonction and effectue tous les tests jusqu'à arriver à un test faux.Donc (and js (repeat...)) est équivalent à:(and (/= js nil) (repeat..)) => ce qui fait que si js vaut nil le and s'arrête, sinon on effectue le repeat. Ensuite, pour avoir les poly et cotes pivotées dans une seule sélection: (setq js (ssget '((-4 . "")))) une cote pivotée à dans son code DXF 100 "AcDbRotatedDimension"Et comme tu veux attraper soit une poly soit une cote pivotée j'ai mis un " maintenant si tu veux créer deux jeux de sélection en filtrant un autre il faut:1) faire la première sélection2) (setq jspoly (ssadd) jscotpiv (ssadd)) => créer deux sélections vides jspoly et jscotpiv3) le repeat dans lequel tu testes si (0 . "LWPOLYLINE") => (ssadd ent jspoly)si (100 . "AcDbRotatedDimension") => (ssadd ent jscotpiv) [Edité le 26/3/2009 par bseb67] Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
BIGC-ROMU Posté(e) le 27 mars 2009 Auteur Posté(e) le 27 mars 2009 Salut, maintenant si tu veux créer deux jeux de sélection en filtrant un autre il faut:1) faire la première sélection2) (setq jspoly (ssadd) jscotpiv (ssadd)) => créer deux sélections vides jspoly et jscotpiv3) le repeat dans lequel tu testes si (0 . "LWPOLYLINE") => (ssadd ent jspoly)si (100 . "AcDbRotatedDimension") => (ssadd ent jscotpiv) ça marche nikel! J'ai un problème avec le DXF des cotes, car on trouve plusieur fois le code de groupe 100 mais avec des descriptions différents. Comment savoir extraire la bonne description avec assoc? Je souhaite exploser d'un coup toutes les entités d'un jeu de selection, j'ai essayé apply et mapcar mais ça ne marche pas, est ce que j'utilise les bonnes fonctions?
Arcasdk Posté(e) le 27 mars 2009 Posté(e) le 27 mars 2009 Coucou, tu as ce site là pour savoir à quoi correspond les codes DXF. C'est rangé par type d'entités. http://www.autodesk.com/techpubs/autocad/acad2000/dxf/entities_section.htm <IMG SRC=http://peronfrederic.free.fr/banniere.jpg></IMG> <a href=www.formu-lan.net>www.FormuLan.net</a>
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