Aller au contenu

[résolu] editsolide sur tous les objets 3D d'un fichier


cath287

Messages recommandés

Bonjour,

j'ai une série de fichiers corrompus que j'ai besoin de réparer.

En utilisant le "Guide : comment réparer des fichiers AutoCAD corrompus" j'arrive à résoudre la plupart des problèmes en utilisant les commandes :

   -purger

   -controle

   -repcontour

   -editsolide, corps, nettoyer.

Mon souci est qu'il faut que je fasse editsolide sur chaque objet 3D un à un, ce qui prend un temps fou sans parler du risque d'oubli de certains objets.

J'aurais donc voulu faire un lisp à lancer dans mes fichiers corrompus.

Avec mon tout petit niveau en lisp, j'ai bidouillé ça :

 

(defun c:repfich (/)
  (command "controle" "Oui")
  (command "purger" "tout" "" "non")
  (command "purger" "appsenreg" "" "non")
  (command "repcontour"
       (setq jeusel (ssget "_X" '((0 . "3Dsolid"))))
       ""
  )
  (setq n 0)
  (if (setq jeusel (ssget "_X" '((0 . "3Dsolid"))))
    (while (setq ent (ssname jeusel n))
      (setq elst (entget ent))
      (setq n (1+ n))
      (command "editsolide"
           "corps"
           "nettoyer"
           (elst)
           "quitter"
           "quitter"
      )
    )                    ;fin de while
  )                    ;fin de if


)

Ce qui me met comme message : "cdrs supplémentaire dans la paire pointée en entrée"

J'ai besoin de vous pour comprendre ce qui ne va pas et résoudre mon problème svp

Merci

Lien vers le commentaire
Partager sur d’autres sites

Coucou,

Dans un premier temps, as-tu testé ton programme pas à pas pour savoir à quelle ligne précisément tu avais une erreur ?
Ensuite, je pense que le problème vient de

Il y a 17 heures, cath287 a dit :

           (elst)

car cette notation indique l'exécution d'une fonction sans arguments (comme (ssget) par exemple).. Or ici elst n'est pas une fonction mais une liste correspondant au (entget) de l'entité n. Donc la notation correcte serait

 (defun c:repfich (/ jeusel n ent elst)
  (command "controle" "Oui")
  (command "purger" "tout" "" "non")
  (command "purger" "appsenreg" "" "non")
  (command "repcontour"
       (setq jeusel (ssget "_X" '((0 . "3Dsolid"))))
       ""
  )
  (setq n 0)
  (if jeusel
    (while (setq ent (ssname jeusel n))
      (setq elst (entget ent))
      (setq n (1+ n))
      (command "editsolide"
           "corps"
           "nettoyer"
           elst
           "quitter"
           "quitter"
      )
    )                    ;fin de while
  )                    ;fin de if


) 

Je me suis permise de corriger 2-3 petite choses notamment l'ajout des variables locales (sur la ligne du (defun) après le / ) et la suppression du doublon du (ssget) étant donné que tu affectes déjà ce jeu de sélection à la variable jeusel, autant l'utiliser 🙂

Je ne peux que te conseiller également de mettre le nom des commandes et options en international pour éviter tout soucis de traduction des commandes mais également de passer par les commandes avec tirets ("_-PURGE" par exemple) qui sont les commandes sans ouverture de boîte de dialogues (donc tout se fait via ligne de commande, beaucoup plus adapté à de la programmation).

Bisous,
Luna

Lien vers le commentaire
Partager sur d’autres sites

Merci beaucoup pour ta réponse claire et pédagogique.

En testant mon programme, j'avais vu que c'était sur editsolide qu'il y avait un soucis mais sans le comprendre.

J'ai testé avec elst mais ça ne fonctionnait pas, mais j'ai compris qu'il fallait le remplacer par ent. elst ne me sert pas dans ce cas.

(defun c:repfich (/ jeusel n ent)
  (command "controle" "Oui")
  (command "purger" "tout" "" "non")
  (command "purger" "appsenreg" "" "non")
  (command "repcontour"
       (setq jeusel (ssget "_X" '((0 . "3Dsolid"))))
       ""
  )


  (setq n 0)
  (if jeusel
    (while (setq ent (ssname jeusel n))
      (setq n (1+ n))
      (command "editsolide"
           "corps"
           "nettoyer"
           ent
           "quitter"
           "quitter"
      )
    )                    ;fin de while
  )                    ;fin de if


)

Et maintenant ça marche !!! Ca va bien m'aider.

Merci encore

 

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é