Aller au contenu

Modification d'un LISP "CHAMPSOLIDE" de Gilles


LElemurien

Messages recommandés

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!

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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 :8bbf.jpg

 

Merci de votre aide!

 

Je vais essayer d'approfondir la chose dans ces prochains jours.

 

Bonne journée et bon courage à tous!

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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 :

 

 

odsy.jpg

 

 

 

J'avoue que c'est peut-être compliqué à régler le problème voir impossible!?

 

Merci en tout cas de votre aide

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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é