Aller au contenu

Problème sur un Lisp de tableau de surface


Messages recommandés

Posté(e)

Bonjour,

 

Je travaille depuis un moment avec ce lisp sans savoir d'où il vient et n'ai jamais eu de problème avec jusqu'à aujourd'hui.

Avec un autre lisp je crée les surfaces de toutes les polylignes fermées sélectionnées et avec celui-ci je fais un tableau qui additionne les surfaces par couleurs.

Je viens cependant de l'utiliser en dehors de se que je fais d'habitude et me rend compte que la commande ne prends pas en compte les surfaces inférieurs a 1m²

 

Je ne suis pas très bon dans ce domaine mais si quelqu'un de plus douée que moi peut me donner une solution ce serait vraiment appréciable.

 

Merci d'avance

couleur surface.lsp

Posté(e)

Salut,

difficile de répondre en ayant pas le lisp précédent pour faire des tests.

Un lisp pas facile à comprendre d'ailleurs, les choix sont bizarres, mais finalement très audacieux ...

je n'ai pas trouvé dans le code de raison, les textes commençant par 0 sont bien pris en compte.

une possibilité, que le lisp précédent génère des ".51" au lieu de "0.51"

a+

Gégé

----------------------------------------------------------------------

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Posté(e)

Hello

 

Sans réfléchir et sans regarder/tester le Lisp, c éventuellement lié à la variable DIMZIM !

Tester avec avec DIMZIN = 0

 

LA SANTE, Bye, lecrabe ... Retraite J12...

Autodesk Expert Elite Team

Posté(e)

Bonjour,

 

Je travaille depuis un moment avec ce lisp sans savoir d'où il vient et n'ai jamais eu de problème avec jusqu'à aujourd'hui.

Avec un autre lisp je crée les surfaces de toutes les polylignes fermées sélectionnées et avec celui-ci je fais un tableau qui additionne les surfaces par couleurs.

Je viens cependant de l'utiliser en dehors de se que je fais d'habitude et me rend compte que la commande ne prends pas en compte les surfaces inférieurs a 1m²

 

Je ne suis pas très bon dans ce domaine mais si quelqu'un de plus douée que moi peut me donner une solution ce serait vraiment appréciable.

 

Merci d'avance

 

J'ai pas testé le lisp, mais je vois l'utilisation de : (rtos total)

Il faut savoir que la fonction (rtos) accepte le mode unité utilisé ET la précision par exemple (rtos total 2 4) -> 2 pour le mode décimal et 4 pour le nombre de décimal désiré.

Si le mode et la précision ne sont pas renseigné, la fonction utilise les valeurs qui sont initialisé dans la commande DDUNITS pour les longueurs.

Donc si ta boite de dialogue affiche 0 pour la précision pour les longueurs les résultats seront arrondis donc 0.41 te renverra 0.

 

Change la valeur de précision dans DDUNITS avant d'utiliser le lisp, ou fixe la variable dans le lisp (setvar "LUPREC" 2)

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Hello

 

Sans réfléchir et sans regarder/tester le Lisp, c éventuellement lié à la variable DIMZIM !

Tester avec avec DIMZIN = 0

 

LA SANTE, Bye, lecrabe ... Retraite J12...

 

Je viens d'essayer mais hélas pas de changements avec cette variable à 0

 

 

J'ai pas testé le lisp, mais je vois l'utilisation de : (rtos total)

Il faut savoir que la fonction (rtos) accepte le mode unité utilisé ET la précision par exemple (rtos total 2 4) -> 2 pour le mode décimal et 4 pour le nombre de décimal désiré.

Si le mode et la précision ne sont pas renseigné, la fonction utilise les valeurs qui sont initialisé dans la commande DDUNITS pour les longueurs.

Donc si ta boite de dialogue affiche 0 pour la précision pour les longueurs les résultats seront arrondis donc 0.41 te renverra 0.

 

Change la valeur de précision dans DDUNITS avant d'utiliser le lisp, ou fixe la variable dans le lisp (setvar "LUPREC" 2)

 

 

J'ai essayer de mettre (rtos total 2 4) mais aussi d'insérer (setvar "LUPREC" 2) au lisp et vérifier ma variable de DDUNITS qui était à 2, même en la passant à 4 cela donne le résultats en photo ci-joint. :(

post-76242-0-77738300-1602495366_thumb.jpg

Posté(e)

Coucou,

 

L'autre solution serait de demander de modifier (rtos total) par (rtos total 2 2) pour afficher 2 chiffres après la virgule (équivalent à l'initialisation de (setvar "LUPREC" 2)) mais sans modifier tes variables systèmes et donc ton espace de travail) :)

 

En effet le problème vient probablement des arrondis automatiques d'AutoCAD à l'affichage. De manière général, il est préférable de toujours écrire (rtos r 2 1) à minima pour être sûre que les valeurs inférieures à 1 n'affichent pas 0.

Le nombre de décimales est défini par le dernier nombre entre parenthèse (donc si tu veux une précision au dixième c'est 1, au centième c'est 2, etc) et le premier 2 correspond à l'expression des unités de longueurs (ici, 2 correspond aux nombres décimaux).

 

Je doute que ta variable total soit faussée par ta variable LUPREC mais si le soucis persiste, il faudra en effet modifier cette variable pour s'assurer du bon fonctionnement de ta commande.

 

Bisous,

Luna

Posté(e)

Si je comprend bien, l'addition des surfaces inférieures à 1 ne compte pas. En clair même si l'ensemble des surfaces bleues une fois additionnées font bien une surface supérieure à 1, la surface totale bleue est comptée comme nulle car toutes les surfaces bleues sont individuellement égales à 1.

C'est bien chat ?

Posté(e)

Si je comprend bien, l'addition des surfaces inférieures à 1 ne compte pas. En clair même si l'ensemble des surfaces bleues une fois additionnées font bien une surface supérieure à 1, la surface totale bleue est comptée comme nulle car toutes les surfaces bleues sont individuellement égales à 1.

C'est bien chat ?

 

Oui Luna c'est bien CA !

Posté(e)

Pourrions-nous avoir ton .dwg d'exemple pour regarder de plus près d'où vient le soucis ?

 

Je pense que le soucis vient essentiellement du fait que tes surfaces inférieures à 1 ne sont pas écrites avec "0" devant la virgule donc potentiellement que ça gêne la lecture (bien que numériquement parlant, 0.41 = .41 mais avec la conversion du texte, je ne saurais dire)

 

Merci

Posté(e)

Salut,

difficile de répondre en ayant pas le lisp précédent pour faire des tests.

Un lisp pas facile à comprendre d'ailleurs, les choix sont bizarres, mais finalement très audacieux ...

je n'ai pas trouvé dans le code de raison, les textes commençant par 0 sont bien pris en compte.

une possibilité, que le lisp précédent génère des ".51" au lieu de "0.51"

a+

Gégé

 

 

Voici le lisp précédent si ça peut aider

Surf.lsp

Posté(e)

Je pense avoir trouvé l'erreur de ton programme :

Dans ton (repeat (sslength ss1)), tu fais une vérification ascii de ton texte pour déterminer si tu à bien un chiffre compris entre 0 et 9. Or la fonction (ascii) ne permet de tester que le premier caractère d'une chaîne, donc ton programme précédent écrit une surface inférieure à 1 sans le 0 initial (".41 m2" au lieu de "0.41 m2"), donc comme le premier caractère n'est pas "0" mais ".", la fonction ascii retourne 46 (et non 48) donc toutes ces surfaces ne sont pas égale à 0, elles sont filtrées et éjectées.

 

Il faut donc corriger le premier programme pour écrire le 0, ou bien modifier le second pour ne pas filtrer selon le tout premier caractère.

 

Bisous,

Luna

Posté(e)

Le soucis est que la fonction (read) va retourner une erreur lorsqu'il va essayer de lire le texte ".41 m2" (c'est d'ailleurs ce qui me posait problème sur ton programme, car il n'avait pas d'erreur sur ces textes) donc le plus simple serait d'ajouter le 0 devant le "." pour qu'il renvoie 0.41 :3

 

Soit tu modifies le premier programme pour qu'il ajoute ce 0, soit il faut modifier le (if (ascii ...)) à la ligne 21 du second programme pour qu'il s'adapte à cette écriture (un (cond) devrait faire le travail à la place du (if) pour ajouter une spécification dans le cas d'un ".")

 

Du coup après vérification, LeCrabe a raison (une fois de plus), il s'agit bien d'un problème en lien avec ta variable DIMZIN (je suppose qu'elle est à 4 ou à 12 ?) qui supprime automatiquement les 0 de début (donc (getvar "AREA") retourne .41 au lieu de 0.41). Je te conseille de forcer cette variable de manière temporaire à 0 dans tes DEUX programmes histoire de ne plus avoir ce soucis :3

Relance les deux programmes avec la bonne valeur et dis-nous si chat fonctionne du coup ^^

 

PS : Une erreur est survenue lorsque j'ai lancé ta commande par rapport à la commande SCU (en début de programme) car l'option "GE" n'était pas reconnue (merci AutoCAD français qui ajoute les accents mais ne sait pas les lire :angry: ) donc peut-être qu'un simple "" pourrait limiter les erreurs (selon la version et la langue d'AutoCAD) puisque l'option "Général" est la valeur par défaut.

 

Bisous,

Luna

Posté(e)

Le soucis est que la fonction (read) va retourner une erreur lorsqu'il va essayer de lire le texte ".41 m2" (c'est d'ailleurs ce qui me posait problème sur ton programme, car il n'avait pas d'erreur sur ces textes) donc le plus simple serait d'ajouter le 0 devant le "." pour qu'il renvoie 0.41 :3

 

Soit tu modifies le premier programme pour qu'il ajoute ce 0, soit il faut modifier le (if (ascii ...)) à la ligne 21 du second programme pour qu'il s'adapte à cette écriture (un (cond) devrait faire le travail à la place du (if) pour ajouter une spécification dans le cas d'un ".")

 

PS : Une erreur est survenue lorsque j'ai lancé ta commande par rapport à la commande SCU (en début de programme) car l'option "GE" n'était pas reconnue (merci AutoCAD français qui ajoute les accents mais ne sait pas les lire :angry: ) donc peut-être qu'un simple "" pourrait limiter les erreurs (selon la version et la langue d'AutoCAD) puisque l'option "Général" est la valeur par défaut.

 

Bisous,

Luna

 

 

Merci beaucoup pour ta réponse luna, Ducoup pour éviter l'erreur je vais mettre un (setvar "dimzin" 0) car comme dit par lecrabe cette variable est la solution du .43 ou 0.43 donc merci a vous ! :)

Posté(e)

Après je me permet juste en terme de programmation, tu pourrais supprimer la moitié de tes variables dans tes programmes ce qui les allègerait beaucoup :3

Cela te permettra de réduire le nombre de lignes, cela pourrait également réduire le temps d'exécution du programme (enfin là c'est plus les utilisation des (command) qui le ralentit un peu) et de faciliter la lecture

 

De plus, pense à bien déclarer la totalité de tes variables comme variables locales (tu n'as aucunement besoin de créer des variables globales dans tes programmes) dans tes fonctions (defun), d'où l'intérêt aussi d'en avoir moins pour ne pas avoir une liste de 150 variables à déclarer ^^"

 

Bisous,

Luna

Posté(e)

Un petit souci avec tes deux lisp (enfin pour moi sous une version 2019)

Dans les deux routines les (command) sont bien internationalisés, SAUF pour SCU (en début et fin de lisp)

 

En effet tu as (command "scu" "ge") et "ge" n'est pas une bonne option qui est "g" en français, mais qui entraine d'autres options...D'ailleurs la vraie option proposée "gé" ne fonctionne pas (bug?)

Donc je propose de changer dans tes 2 lisp:

(command "scu" "ge")

en

(command "_.ucs" "_w")

 

et

(command "scu" "p")

en

(command "_.ucs" "_p")

 

Refais un essai avec cette correction et dis nous si ça va mieux!

 

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Merci beaucoup a vous, et en effet certaines commandes ou variables sont peut-être de trop mais je n'ose pas trop toucher a cela, ma commande s'exécute instantanément. cependant ce lisp date d'une 15ene ou 20ene d'année donc effectivement certains points sont peut-être améliorable.

 

Encore merci :)

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é