LElemurien Posté(e) le 28 mars 2020 Posté(e) le 28 mars 2020 Bonjour à tous,Je voulais savoir si il était possible de modifier ce LISP que maître Gile à réalisé : ;; Affiche dans des champs les dimensions du solide primitif sélectionné ;; Version française uniquement(defun c:CHAMPSOLIDE (/ ent solidType str) (vl-load-com) (while (not (and (setq ent (car (entsel "\nSélectionnez un solide (primitive uniquement): "))) (= (cdr (assoc 0 (entget ent))) "3DSOLID") (not (vl-catch-all-error-p (setq solidType (vl-catch-all-apply 'getpropertyvalue (list ent "SolidType"))) ) ) (member solidType '("Boîte" "Cylindre" "Cône" "Sphère" "Pyramide" "Biseau" "Tore")) ) ) (prompt "\nSélection non valide.") ) (setq id (vla-GetObjectIdString (vla-get-Utility (vla-get-ActiveDocument (vlax-get-acad-object) ) ) (vlax-ename->vla-object ent) 0 ) str (cond ((= solidType "Boîte") (strcat "Longueur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).Length \\f \"%lu6\">%" "\\PLargeur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).Width \\f \"%lu6\">%" "\\PHauteur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).Height \\f \"%lu6\">%" ) ) ((= solidType "Cylindre") (if (zerop (getpropertyvalue (car (entsel)) "Elliptical")) (strcat "Rayon = %<\\AcObjProp Object(%<\\_ObjId " id ">%).Radius \\f \"%lu6\">%" "\\PHauteur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).Height \\f \"%lu6\">%" ) (strcat "Grand rayon = %<\\AcObjProp Object(%<\\_ObjId " id ">%).MajorRadius \\f \"%lu6\">%" "\\PPetit rayon = %<\\AcObjProp Object(%<\\_ObjId " id ">%).MinorRadius \\f \"%lu6\">%" "\\PHauteur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).Height \\f \"%lu6\">%" ) ) ) ((= solidType "Cône") (if (zerop (getpropertyvalue (car (entsel)) "Elliptical")) (strcat "Rayon de base = %<\\AcObjProp Object(%<\\_ObjId " id ">%).BaseRadius \\f \"%lu6\">%" "\\PRayon supérieur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).TopRadius \\f \"%lu6\">%" "\\PHauteur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).Height \\f \"%lu6\">%" ) (strcat "Grand rayon de base = %<\\AcObjProp Object(%<\\_ObjId " id ">%).BaseMajorRadius \\f \"%lu6\">%" "\\PPetit rayon de base = %<\\AcObjProp Object(%<\\_ObjId " id ">%).BaseMinorRadius \\f \"%lu6\">%" "\\PGrand rayon supérieur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).TopMajorRadius \\f \"%lu6\">%" "\\PPetit rayon supérieur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).TopMinorRadius \\f \"%lu6\">%" "\\PHauteur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).Height \\f \"%lu6\">%" ) ) ) ((= solidType "Sphère") (strcat "Rayon = %<\\AcObjProp Object(%<\\_ObjId " id ">%).Radius \\f \"%lu6\">%" ) ) ((= solidType "Pyramide") (strcat "Côtés = %<\\AcObjProp Object(%<\\_ObjId " id ">%).Sides >%" "\\PRayon de base = %<\\AcObjProp Object(%<\\_ObjId " id ">%).BaseRadius \\f \"%lu6\">%" "\\PRayon supérieur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).TopRadius \\f \"%lu6\">%" "\\PHauteur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).Height \\f \"%lu6\">%" ) ) ((= solidType "Biseau") (strcat "Longueur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).Length \\f \"%lu6\">%" "\\PLargeur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).Width \\f \"%lu6\">%" "\\PHauteur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).Height \\f \"%lu6\">%" ) ) ((= solidType "Tore") (strcat "Rayon de tore = %<\\AcObjProp Object(%<\\_ObjId " id ">%).TorusRadius \\f \"%lu6\">%" "\\PRayon de tube = %<\\AcObjProp Object(%<\\_ObjId " id ">%).TubeRadius \\f \"%lu6\">%" ) ) ) ) (vl-cmdf "_.mtext" pause "_width" 0.0 str "") (princ) ) Comme il est indiqué au début du code il sert à insérer des propriétés d'un solide primitif dans un champ en le sélectionnant. Mon souci dans ma pratique c'est que je sélectionne d'abord le solide avant d'appuyer sur l'icône que j'ai créer avec le LISP et du coup cela ne fonctionne pas. Il faut que j'appuie sur mon icône et que je sélectionne ensuite le solide pour que cela marche. Donc m'a question est la suivante : peut on modifier le LISP pour que si je sélectionne un solide et qu'ensuite j'appuie sur mon icône cela fonctionne? Merci pour vos pistes. Bon week-end et bon courage à tous!
Luna Posté(e) le 8 avril 2020 Posté(e) le 8 avril 2020 Chalut ! Pour qu'une commande/fonction puisse prendre en compte une pré-sélection tu peux essayer de regarder du côté de (last (ssgetfirst)). Cela te retourne un jeu de sélection si des entités sont actuellement sélectionnées (sous réserve que la variable PICKFIRST soit définie à 1), nil sinon. Auquel cas, je pourrais te proposer la forme suivante : (defun c:CHAMPSOLIDE (/ ent solidType str) (vl-load-com) (if (not (and (setq ent (last (ssgetfirst))) (= (sslength ent) 1) (= (cdr (assoc 0 (entget (setq ent (ssname ent 0))))) "3DSOLID" ) (not (vl-catch-all-error-p (setq SolidType (vl-catch-all-apply 'getpropertyvalue (list ent "SolidType") ) ) ) ) (member solidType '("Boîte" "Cylindre" "Cône" "Sphère" "Pyramide" "Biseau" "Tore" ) ) ) ) (while (not (and (setq ent (car (entsel "\nSélectionnez un solide (primitive uniquement): " ) ) ) (= (cdr (assoc 0 (entget ent))) "3DSOLID") (not (vl-catch-all-error-p (setq solidType (vl-catch-all-apply 'getpropertyvalue (list ent "SolidType") ) ) ) ) (member solidType '("Boîte" "Cylindre" "Cône" "Sphère" "Pyramide" "Biseau" "Tore" ) ) ) ) (prompt "\nSélection non valide.") ) ) (setq id (vla-GetObjectIdString (vla-get-Utility (vla-get-ActiveDocument (vlax-get-acad-object)) ) (vlax-ename->vla-object ent) 0 ) str (cond ((= solidType "Boîte") (strcat "Longueur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).Length \\f \"%lu6\">%" "\\PLargeur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).Width \\f \"%lu6\">%" "\\PHauteur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).Height \\f \"%lu6\">%" ) ) ((= solidType "Cylindre") (if (zerop (getpropertyvalue (car (entsel)) "Elliptical")) (strcat "Rayon = %<\\AcObjProp Object(%<\\_ObjId " id ">%).Radius \\f \"%lu6\">%" "\\PHauteur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).Height \\f \"%lu6\">%" ) (strcat "Grand rayon = %<\\AcObjProp Object(%<\\_ObjId " id ">%).MajorRadius \\f \"%lu6\">%" "\\PPetit rayon = %<\\AcObjProp Object(%<\\_ObjId " id ">%).MinorRadius \\f \"%lu6\">%" "\\PHauteur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).Height \\f \"%lu6\">%" ) ) ) ((= solidType "Cône") (if (zerop (getpropertyvalue (car (entsel)) "Elliptical")) (strcat "Rayon de base = %<\\AcObjProp Object(%<\\_ObjId " id ">%).BaseRadius \\f \"%lu6\">%" "\\PRayon supérieur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).TopRadius \\f \"%lu6\">%" "\\PHauteur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).Height \\f \"%lu6\">%" ) (strcat "Grand rayon de base = %<\\AcObjProp Object(%<\\_ObjId " id ">%).BaseMajorRadius \\f \"%lu6\">%" "\\PPetit rayon de base = %<\\AcObjProp Object(%<\\_ObjId " id ">%).BaseMinorRadius \\f \"%lu6\">%" "\\PGrand rayon supérieur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).TopMajorRadius \\f \"%lu6\">%" "\\PPetit rayon supérieur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).TopMinorRadius \\f \"%lu6\">%" "\\PHauteur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).Height \\f \"%lu6\">%") ) ) ((= solidType "Sphère") (strcat "Rayon = %<\\AcObjProp Object(%<\\_ObjId " id ">%).Radius \\f \"%lu6\">%" ) ) ((= solidType "Pyramide") (strcat "Côtés = %<\\AcObjProp Object(%<\\_ObjId " id ">%).Sides >%" "\\PRayon de base = %<\\AcObjProp Object(%<\\_ObjId " id ">%).BaseRadius \\f \"%lu6\">%" "\\PRayon supérieur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).TopRadius \\f \"%lu6\">%" "\\PHauteur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).Height \\f \"%lu6\">%" ) ) ((= solidType "Biseau") (strcat "Longueur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).Length \\f \"%lu6\">%" "\\PLargeur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).Width \\f \"%lu6\">%" "\\PHauteur = %<\\AcObjProp Object(%<\\_ObjId " id ">%).Height \\f \"%lu6\">%" ) ) ((= solidType "Tore") (strcat "Rayon de tore = %<\\AcObjProp Object(%<\\_ObjId " id ">%).TorusRadius \\f \"%lu6\">%" "\\PRayon de tube = %<\\AcObjProp Object(%<\\_ObjId " id ">%).TubeRadius \\f \"%lu6\">%" ) ) ) ) (vl-cmdf "_.mtext" pause "_width" 0.0 str "") (princ) ) Non testé mais cela devrait vérifier l'existence d'une pré-sélection, et effectue les mêmes vérifications que la sélection prévue par (gile) ainsi que le fait qu'il n'y ait qu'un unique objet dans le jeu de sélection.En revanche, si ta demande requiert de prendre en compte un jeu de sélection (contenant plusieurs objets) cela va modifier le programme davantage ! En espérant avoir répondu à tes attentes :) Bisous,Luna
LElemurien Posté(e) le 8 avril 2020 Auteur Posté(e) le 8 avril 2020 Pour qu'une commande/fonction puisse prendre en compte une pré-sélection tu peux essayer de regarder du côté de (last (ssgetfirst)). Cela te retourne un jeu de sélection si des entités sont actuellement sélectionnées (sous réserve que la variable PICKFIRST soit définie à 1), nil sinon. Non testé mais cela devrait vérifier l'existence d'une pré-sélection, et effectue les mêmes vérifications que la sélection prévue par (gile) ainsi que le fait qu'il n'y ait qu'un unique objet dans le jeu de sélection.En revanche, si ta demande requiert de prendre en compte un jeu de sélection (contenant plusieurs objets) cela va modifier le programme davantage ! En espérant avoir répondu à tes attentes :) Bisous,Luna Merci pour ton aide! Je regarde tout ça dans la journée Bonne journée
LElemurien Posté(e) le 8 avril 2020 Auteur Posté(e) le 8 avril 2020 En fait je viens de faire le test aussitôt. J'ai bien vérifié la variable pickfirst et j'ai sélectionné qu'un solide 3D de type "boîte" Malheureusement cela ne fonctionne pas chez moi. Voilà ce que j'obtiens : Merci de votre aide! Je vais essayer d'approfondir la chose dans ces prochains jours. Bonne journée et bon courage à tous!
Luna Posté(e) le 8 avril 2020 Posté(e) le 8 avril 2020 Ah vouih pardon !!! C'est ma faute, j'avais au départ ajouté une variable nommée jsel pour faire la différence entre le nom de l'entité et le jeu de sélection, mais j'avais moyen de ne pas le faire, du coup j'ai corrigé le code mais j'ai oublié de remplacer le "jsel" par "ent" pour la ligne (= (sslength jsel) 1) Le code est corrigé au-dessus ;) ça devrait être mieux en théorie :3 Bisous,Luna
LElemurien Posté(e) le 8 avril 2020 Auteur Posté(e) le 8 avril 2020 Ah vouih pardon !!! C'est ma faute, j'avais au départ ajouté une variable nommée jsel pour faire la différence entre le nom de l'entité et le jeu de sélection, mais j'avais moyen de ne pas le faire, du coup j'ai corrigé le code mais j'ai oublié de remplacer le "jsel" par "ent" pour la ligne (= (sslength jsel) 1) Le code est corrigé au-dessus ;) ça devrait être mieux en théorie :3 Bisous,Luna Effectivement cela fonctionne bien comme cela. Mais malheureusement mon souci n'est pas régler pour autant (peut-être impossible à régler!?). Cela fonctionne bien pour un solide de type "boîte" qui n'a pas été modifié, mais moi dans mon cas j'apporte des modifications à mon solide (Précision que je n'avais pas apporté au départ et qui change tout apparemment). Pour être un peu plus précis lorsque je créer une boîte, j'active la fonction "enregistrement" (fonction qui se trouve dans la palette des propriétés puis tout en bas dans "historique du solide" et enfin "historique"), ce qui me permet d'enregistrer des modifications que j'effectue sur mon solide. Ensuite le solide devient un solide 3D et plus un solide de type boîte. Donc dans les faits je fais un Ctrl + sélection du solide 3D modifié ce qui me donne accès à mon solide de type "boîte" d'origine et enfin j'active la fonction "Champsolide" mais dans ce cas là cela ne fonctionne pas cela m'indique : J'avoue que c'est peut-être compliqué à régler le problème voir impossible!? Merci en tout cas de votre aide
(gile) Posté(e) le 8 avril 2020 Posté(e) le 8 avril 2020 Il est bien précisé ici que le code ne fonctionne qu'avec les solides "primitifs".L'analyse des autres solides est bien plus complexe (quand elle est possible) et ne saurait en aucun cas être affectée à un champ. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
LElemurien Posté(e) le 8 avril 2020 Auteur Posté(e) le 8 avril 2020 Il est bien précisé ici que le code ne fonctionne qu'avec les solides "primitifs".L'analyse des autres solides est bien plus complexe (quand elle est possible) et ne saurait en aucun cas être affectée à un champ. Bonjour et merci (Gile)! Mais comme indiqué et montré sur la photo quand je sélectionne en faisant Ctrl + séléction du solide j'ai bien accès à mon solide primitif. Je suppose que même si je sélectionne le solide primitif, j'imagine qu'il prend en compte le solide 3D et non le solide primitif ? Dommage cela aurait été bien pratique
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