Aller au contenu

Mise en page automatisée de solide(s)


renep

Messages recommandés

Bonjour à tous.

Je vous propose un lisp qui automatise la mise en page de solide(s) dont on veut faire les vues de face, dessus et gauche.

 

Un résultat est là sur un modèle de pile de pont.

J'ai utilisé bbox.lsp de (gile) et je l'en remercie

Par contre, le codage est hétérogène (lisp , vlisp, ...) : il ne demande qu'à être amélioré ....

 

les ressources (lsp, dcl et plus)

 

Lien vers le commentaire
Partager sur d’autres sites

Salut et bienvenue,

 

Tout d'abord bravo et merci pour ta générosité.

Ça fait vraiment plaisir de voir quelqu'un débarquer avec quelque chose à offrir !

 

Je n'ai pas encore lu ton code dans le détail, mais je te propose d'ores et déjà de l'alléger un peu avec la routine ci-dessous.

Cette routine demande à l'utilisateur de sélectionner des objets et retourne une liste contenant le point minimum et le point maximum (exprimés en coordonnées SCU courant) de l'emprise des ces objets par rapport au SCU courant.

Les routines WCS2UCSmatrix et UCS2WCSmatrix doivent être chargées.

Elle devrait pouvoir remplacer les routines bboxe et minmax.

Et dans la commande MEP3D remplacer :

(if (setq sel (ssget)) ...)

par

(setq lst (ssbbox) pt1final (car lst) pt2final (cadr lst))

 

;; ssbbox (gile)
;; Retourne les points minimum et maximum (coordonnées SCU)
;; de l'emprise par rapport au SCU courant des objets sélectionnés

(defun ssbbox (/ UCS2WCS WCS2UCS ss minpt maxpt lst)
 (vl-load-com)
 (setq UCS2WCS (UCS2WCSMatrix)
       WCS2UCS (WCS2UCSMatrix)
 )
 (if (ssget)
   (progn
     (vlax-for o (setq ss (vla-get-ActiveSelectionSet
                            (vla-get-ActiveDocument
                              (vlax-get-acad-object)
                            )
                          )
                 )
       (vla-TransformBy o UCS2WCS)
       (vla-getBoundingBox o 'minpt 'maxpt)
       (vla-TransformBy o WCS2UCS)
       (setq lst (cons (vlax-safearray->list minpt)
                       (cons (vlax-safearray->list maxpt) lst)
                 )
       )
     )
     (vla-delete ss)
     (list (apply 'mapcar (cons 'min lst)) (apply 'mapcar (cons 'max lst)))
   )
 )
)

 

À part ça, je vois que trop souvent les variables ne sont pas déclarées et on doit pouvoir remplacer plusieurs (command ...) par leurs équivalents vlisp.

 

Je regarderais plus en détail ton code pour continuer à t'aider à l'améliorer...

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

J'ai fait quelques tests et regardé un peu plus attentivement ton code.

 

Ça marche presque : en A4, les fenêtres sont créées à côté de la feuille.

 

Tu as donc presque fini la partie la plus gratifiante du développement : faire en sorte que ça fonctionne dans des conditions normales (l'utilisateur fait exactement ce que le programma attend de lui.

 

Il te reste encore la partie plus ingrate mais, à mon avis indispensable, d'un développement, envisager touts les cas qui pourraient générer un erreur et bien sûr parer à ces éventualités.

Par exemple, si l'utilisateur, ne donne pas ou donne des valeurs non valide pour l'échelle et les marges, le programme continue et va planter.

 

Ensuite, il est préférable de "faire le ménage". Si le programme modifie l'environnement (modification de variables système, création d'objets graphiques ou non) au delà de ce qu'il est sensé faire, il vaut mieux restaurer les variables systèmes et supprimer les objets désormais inutiles.

Par exemple, tu crées un SCU, un calque et des solides sur ce calque (je ne suis pas sûr que ces derniers soient indispensables). il serait préférable que le programme supprime ces objets dès qu'il n'en a plus besoin.

 

Tu verras aussi qu'on peut redéfinir la fonction *error* pour garantir ce "nettoyage" même si le programme n'aboutit pas (si l'utilisateur fait Echap, par exemple.

 

Je te laisse chercher tout seul, c'est comme ça qu'on apprend. Mais n'hésite pas à poser des questions, Il y aura certainement un membre de CADxp pour te répondre.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

salut et merci (gile) pour tes remarques, encouragements et conseils

je me remet à programmer depuis peu sur Autocad (j'en étais resté au lisp et vba) et je vois quelques avantages au vlisp(accès à l'activex).

Par contre çà fait un nouveau langage à apprendre et l'aide d'Autocad n'est pas très documenté là-dessus.

Où trouver des infos ?

 

sinon, pour revenir au programme, je n'aime pas cette partie que tu me proposes qui est d'envisager touts les cas qui pourraient générer un erreur et bien sûr parer à ces éventualités. Et je me dis que s'il faut rentrer une échelle et que l'utilisateur entre un mot par exemple, et bien tant pis pour lui .... car c'est un logiciel de DAO, pas un jeu ou autre chose

 

une question : est ce utile de changer le format dans le gestionnaire de présentation selon le choix de l'utilisateur ?

(encore faut-il que l'imprimante soit compatible avec ce choix -> on ne peut pas tout prévoir !)

 

Ok pour faire le ménage :

- supprimer les bounding boxes et le calque bbox, mais je trouvais çà un peu pédagogique...

D'ailleurs je n'en ai pas besoin car je n'ai besoin que des points extrèmes

- restaurer les variables systèmes initiales

 

Ok aussi pour ta remarque plus générale sur les variables à déclarer mais çà marche comme çà et le lisp permet çà (pas comme d'autres langages) : ce pas très propre mais plus rapide ...

je fais juste attention quand je passe des paramètres

 

et je regarde pour le A4 (NB: il est prévu en paysage)

 

je me remet à ce code l'année prochaine ;-)

Lien vers le commentaire
Partager sur d’autres sites

Bonjour !

Une version un peu meilleure de mep3d là >>>

Tout n'est pas parfait mais dejà meilleur que la première version (merci pour la contibution de (gile)).

 

nb pour (gile) : je sais pourquoi je ne déclare pas les variables : en période de déboguage, on accède facilement à la valeur de variable par !pt1final par exemple .

Un avantage que je vois au vlisp il me semble c'est l'internationalisation du code.

Le code est un peu lourd malgré tout ....

 

 

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Tout d'abord une remarque d'ordre général concernant la "finition" d'une routine.

Tout dépend de sa destination, si tu écris un LISP pour toi uniquement, le fait qu'il plante ne regarde que toi, par contre, si tu distribue le LISP, à mon avis, tu ne peux te permettre de te dispenser de le rendre le plus "sûr" possible. Donc de résoudre tous les cas où le programme peut planter.

 

S'il peut être intéressant de ne pas déclarer les variable en période de débogage (bien qu'avec les outils de débogage de l'éditeur Visual LISP ce ne soit pas vraiment utile) cette façon de faire peut provoquer des erreurs pas toujours facile à localiser.

Mais quand on publie le code, il faudrait toujours les déclarer parce que tu ne peux pas savoir si l'utilisateur de ton code n'utilise pas aussi des variables globales...

 

Pour l'internationalisation du code, ça peut très bien se faire avec (command ...), il suffit de donner en paramètres les noms internationaux des commandes et de leurs options :

(command "_ucs" "_save" "FACE")

(command "_ucs" "_delete" "FACE")

La fonction LISP getcname traduit les noms de commandes de la version courante en international et vice versa.

Une liste des noms de commandes et options en français et anglais ici.

 

L'intérêt principal de Visual LISP, outre l'éditeur, est l'accès à COM/ActiveX. Certaines propriétés ne sont accessibles que par ce biais (d'autres ne le sont que par AutoLISP et DXF).

D'autre part, vlisp est plus rapide que (command ...) ce qui n'a de réel intérêt que s'il n'y a pas d'intervention de l'utilisateur.

(setq theLayer (vla-item (vla-get-Layers (vla-get-ActiveDocument (vlax-get-acad-object))) "face-HID"))
(vla-put-LineType thelayer "CACHE")

est plus rapide que :

(command "_layer" "_ltype" "CACHE" "face-HID" "")

mais pas plus que :

(setq theLayerDxfList (entget (tblobjname "LAYER" "face-HID")))
(entmod (subst '(6 . "CACHE") (assoc 6 theLayerDxfList) theLayerDxfList))

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Bonjour (gile)

 

D'accord avec ta première remarque concernant la finition : je veux bien essayer de faire une routine diffusable.

Pourrais tu me signaler quels son pour toi les gros manques ou points encore à régler.

 

Ensuite je trouve pas très jolie l'interface vlisp et j'utilise l'éditeur pspad. J'y viendrai un jour peut-être ...

 

Pour l'internationalisation du code, c'est vrai que ça peut très bien se faire avec (command ...) et l'underscore , mais je trouve que le vlisp attaque "plus profond" Autocad comme le vba ou les entmake, entmode etc ...

 

 

Lien vers le commentaire
Partager sur d’autres sites

Pourrais tu me signaler quels son pour toi les gros manques ou points encore à régler.

 

Comme dit plus haut : restaurer l'environnement tel qu'il était avnt le lancement de la commande (déclaration des variables, suppression du SCU nommé, etc.) et surtout, essayer de faire planter la routine (facile, je n'ai eu que des erreurs fatales pendant mes derniers tests) et les corriger (moins facile).

 

Ensuite je trouve pas très jolie l'interface vlisp et j'utilise l'éditeur pspad. J'y viendrai un jour peut-être ...

Libre à toi, mais l'éditeur Visual LISP est beaucoup plus qu'un éditeur de texte amélioré, c'est un IDE (Environnement de Développement Intégré).

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

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é