Aller au contenu

Luna

Membres
  • Compteur de contenus

    1 113
  • Inscription

  • Dernière visite

  • Jours gagnés

    42

Tout ce qui a été posté par Luna

  1. Parce que la rotation est effectuée par la commande ROTATION si le bloc possède des attributs, autrement on modifie la liste DXF de l'entité pour appliquer la rotation sans utiliser de (command), car l'utilisation de cette fonction ralenti considérablement le temps d'exécution du programme ! Le code que je t'ai fourni, comme je l'ai précisé, est non testé car écrit à la va-vite en 2min. Donc forcément je ne me suis pas amusé à prévoir tous les cas de figures comme je ferais dans des programmes plus complexes. Bisous, Luna
  2. Oki, je viens de tester sur ton .dwg et.....bah le soucis ne vient pas de moi !! C'est ton .dwg qui a un soucis mais je n'arrive pas à comprendre la raison. En clair dans un fichier vierge, j'ai (si le format est un grade, degrés, radians, ...) (angtof "0") 0.0 Mais sur ton fichier j'ai (angtof "0") 1.5708 donc à cause de ce décalage d'un demi pi, cela fausse les rotations bien évidemment.... Je viens potentiellement de trouver une explication : NORTHDIRECTION ! Est-ce une variable système qui te parle ? Si oui, je ne peux rien y faire car je penser pouvoir faire (setq r (angtof (vl-princ-to-string r) (getvar "AUNITS"))) (+ r (getvar "NORTHDIRECTION")) mais malheureusement, peut importe la valeur de NORTHDIRECTION (si on lance la commande associée en tant qu'utilisateur) la ligne (getvar "NORTHDIRECTION") renvoie toujours 0.0 ! Donc je ne peux pas y faire grand chose pour prendre en compte cela, car cette variable influe directement la liste DXF des entités (par rapport à la palette des propriétés). Autrement, pour ce qui est du bloc rouge, le programme fonctionne mais je n'avais pas prévu les blocs avec attributs donc il faut rajouter un ATTSYNC pour les blocs Bisous, Luna
  3. Peux-tu me fournir un .dwg d'exemple dans lequel cela ne fonctionne pas...car mathématiquement parlant, je suis perplexe >n< Ensuite, pour ta demande il suffit de faire moins, moi je propose un programme qui puisse être utile à tous ^^" Donc pour supprimer la question, il suffit de remplacer (if (null (setq r (getreal "\nValeur ajoutée pour la rotation <200> : "))) (setq r 200) ) par (setq r 200) et c'est tout... Voir plus proprement (pour conserver la possibilité si jamais) en rajoutant uniquement un point-virgule sur la ligne 1 et 3 (pour conserver la 2 uniquement) : ; (if (null (setq r (getreal "\nValeur ajoutée pour la rotation <200> : "))) (setq r 200) ; ) Bisous, Luna
  4. Je viens de tester rapidement (avec AUNITS en degrés décimaux et aussi en grades) et chat fonctionne très bien chez moi... J'ai mis 200 comme valeur par défaut (à supposer que AUNITS = 2 (grades), et si AUNITS = 0 (degrés décimaux) il faut mettre 180. Et le (ssget) sans méthode spécifiée permet la pré-sélection si tu as PICKFIRST = 1. Donc si tu sélectionnes tes blocs en amont, le programme posera la question de la rotation puis utilisera ta pré-sélection directement. De plus tu as un filtre actif sur la sélection/pré-sélection pour que seuls les blocs soient considérés. En tout cas, j'ai pas de soucis de mon côté >w< As-tu essayé les programmes proposés par @lecrabe pour voir si cela te convient mieux éventuellement ? Bisous, Luna
  5. Coucou, Essaye ceci (non testé) : (defun c:RBx (/ r jsel i name entl rot) (if (null (setq r (getreal "\nValeur ajoutée pour la rotation <200> : "))) (setq r 200) ) (and (setq jsel (ssget '((0 . "INSERT")))) (repeat (setq i (sslength jsel)) (setq name (ssname jsel (setq i (1- i))) entl (entget name) rot (cdr (assoc 50 entl)) ) (entmod (subst (cons 50 (+ rot (angtof (vl-princ-to-string r) (getvar "AUNITS")))) (assoc 50 entl) entl)) ) ) (princ) ) Edit: Ou tout simplement les routines de Gile, précieusement conservées dans la bibliothèque de @lecrabe 😉 Bisous, Luna
  6. Coucou, As-tu essayé sur un fichier vierge ? J'ai souvenir d'un sujet similaire ici : Peut-être as-tu le même soucis (le fichier est la source du problème) ? Je suis également tombée sur ce >>sujet<< qui semble confirmer la logique que le problème provienne du fichier et non de l'ordinateur. Peut-être tenter la solution du WBLOC si possible. Dommage que je ne trouve pas plus d'explication sur la raison précise de cette erreur, car cela permettrait de corriger le soucis plus précisément et de ne pas être confronter à ce bug de nouveau. Bisous, Luna
  7. Coucou, Je remarque que les spams continuent d'affluer régulièrement et désormais sous des pseudos différents à chaque fois mais en plus de cela, ils peuvent créer des sujets ?! Je pensais que le statut d'invité était légèrement différent que celui d'un membre... Si les invités possèdent les droits de répondre dans un sujet et de créer des sujets, quelle différence y a-t-il exactement par rapport aux membres ? Ne peut-on pas, au vu de l'activité quotidienne sur le forum, faire en sorte que le statut invité correspondent à un utilisateur n'ayant que des droits de read-only ? Car finalement 99% des messages postés sur le forum par un statut invité correspond à des spams. Il me semble que certains forums fonctionnent également comme ceci (seuls les membres inscrits peuvent poster un message sur le forum), probablement pour limiter au maximum ces problèmes de spam intempestif. En tout cas, bon courage à toute l'équipe de modos qui nettoie tous ces messages polluant le forum et bon courage à @Cadmin qui cherche une solution plus viable à long terme ! Bisous, Luna
  8. Luna

    Cotation

    au plaisir 😉
  9. Luna

    Cotation

    Coucou, Dans la palette des propriétés de tes cotations, essaye de voir du côté des unités alternatives peut-être. En affectant par exemple un facteur d'échelle correspondant à la pente de ta toiture, cela permettra d'avoir la cotation avec la mesure projeté (vue en plan) et la mesure réelle (vue en coupe). Je l'utilise dans temps à l'autre lorsque deux valeurs numériques dépendent l'une de l'autre mais que je souhaite qu'une seule ligne de cotation. Bisous, Luna
  10. Coucou, Je présume que c'est ici que tu aimerais que ton calcul fonctionne (mais ce n'est actuellement pas le cas), n'est-ce pas ? 129 ;; boite dialogue du volume 130 (setq vol (* aire atrib_04)) 131 ;(if (not (setq vol (geta07 "8/11. volume de la pièce"))) 132 ; (setq vol "") 133 ;) Si je comprends bien le programme, ta variable 'atrib_04' est une chaîne de caractères standard tandis que ta variable 'aire' correspond à l'expression d'un champ dynamique. Autrement dit, il faut que ta variable 'vol' soit elle aussi un champ dynamique ! Donc ce n'est pas une simple multiplication entre 2 attributs malheureusement. Il s'agit en plus de cela d'un champ dynamique devant faire la multiplication entre un nombre et un autre champ dynamique correspondant à la propriété d'un objet. J'ai regardé vite fait sur AutoCAD le résultat d'un tel champ : %<\AcExpr (56*%<\_FldPtr 1915583967872>%) \f "%lu2">% Avec '56*' correspondant à une valeur fixe au pif que j'ai rentré pour la multiplication et donc '%<\_FldPtr 1915583967872>%' correspondant au champ dynamique faisant appel à la propriété de ta polyligne. Je n'ai malheureusement jamais vraiment étudié cette partie là concernant les champs dynamique donc j'avoue ne pas savoir comment récupérer l'ID d'un autre champ dynamique. Peut-être que @(gile) a plus d'infos à ce sujet mais s'il ne l'a pas fait dans son programme originel, c'est certainement pour une bonne raison ! Bisous, Luna
  11. En effet, j'ai oublié de préciser qu'il s'agit d'un nom temporaire... C'est à toi de renommer la fonction selon tes envies/habitudes (car le nom d'une fonction peut sembler logique pour quelqu'un et complètement aberrant pour quelqu'un d'autre) ou bien il faut déclarer tes fonctions localement comme l'explique (gile) ! A vrai dire, c'est également un soucis de flemmardise de ne pas vouloir réfléchir à un nom pour une fonction développée à la va vite, et je m'en excuse. Une chose est sûre en tous cas, à chaque fois que je développe une fonction dont je ne trouve pas de nom pertinent (et qui n'a d'utilité que pour un unique programme), j'ai souvent à les appeler (foo) voire (f). Mais bien évidemment dans 100% des cas, ces fonctions sont déclarées localement ! Bisous, Luna
  12. Luna

    rendre un calque actif

    Coucou, Essaye simplement de sortir ton (setvar) de ton (if), car si je comprends bien la démarche, si ton calque existe > le définir courant ; si ton calque n'existe pas > le créer + le définir courant... Donc au final l'action de "définir courant" est commune aux deux cas de figure :3 Bisous, Luna
  13. Coucou, Il faut passer par un réacteur d'événements, mise à part chat je ne vois pas bien comment....Est-ce à la fermeture d'AutoCAD ou bien du dessin ? Car je vois difficilement comment vérifier qu'il s'agit de la fermeture d'AutoCAD à moins de checker pour chaque fermeture de dessin le nombre de dessins restant ouverts... Bisous, Luna
  14. Je viens de m'apercevoir que je me suis trompé sur Val=-15 donc renvoie "-012"... >w< Pour la fonction foo, j'ai remarqué que sur les forums anglophones les fonctions étaient toujours nommées ainsi. Je suppose que l'explication vient de là : In the US (as Wikipedia says) "foo" and "bar" are common placeholders in computer programming. They are often used as the names of unimportant variables. They've been used since the early 1960s. They come from the combination "foobar", another meaningless term used since the 1960s in computing. Du coup chat me semble parfaitement logique d'utiliser cette dénomination lorsque le nom de la fonction importe peu... Bisous, Luna
  15. Coucou, J'ai trouvé ce sujet qui semble compiler un bon nombre de solutions différentes, à voir si cela peut t'aider également : Bisous, Luna
  16. Question, si tu as Val=-15 qu'obtiens-tu ? ^^" car si je comprends bien ton code, tu devrais obtenir "-012", right ? Ce que suggère @JPhil c'est de simplifier ton code en ajoutant le signe "-" uniquement après, évitant le premier (if) en utilisant la fonction (abs) ! Quelque chose comme ceci devrais fonctionner par exemple : (defun foo (num i / str lng) (setq str (itoa (abs num))) (setq lng (strlen str)) (repeat (- i lng) (setq str (strcat "0" str))) (if (minusp num) (strcat "-" str) str ) ) Avec num correspondant au nombre que tu veux (donc par exemple Val, ici 20) et i le nombre de chiffres significatifs (indique le nombre de "0" à placer au début si nécessaire) Donc pour l'exemple ci-dessus : _$ (foo 20 2) "20" _$ (foo -5 2) "-05" _$ (foo -5 0) "-5" _$ (foo 3 2) "03" _$ (foo 20 3) "020" Évidemment, tes exemples utilisent uniquement des valeurs fixes, donc si on veut étendre le jeu aux nombres décimaux on peut faire cela plutôt : (defun foo2 (num i / str lng) (setq str (vl-princ-to-string (abs num))) (setq lng (strlen (itoa (fix (abs num))))) (repeat (- i lng) (setq str (strcat "0" str))) (if (minusp num) (strcat "-" str) str ) ) NB: Dans ce genre de cas, je préfère utiliser (vl-princ-to-string) au lieu de (rtos) car elle n'est pas influencée par la valeur de DIMZIN contrairement à (rtos), pouvant ainsi renvoyer une chaîne de caractères ne correspondant pas exactement au nombre renseigné au départ. On pourrait également renforcer le programme en vérifiant que l'argument num est bien un nombre (entier ou décimal) en utilisant la fonction (numberp). Bisous, Luna
  17. Coucou, Dans le dessin ci-dessus, il n'y a pas d'îlots donc pas de soucis 😉 Ce serait le cas en revanche si aucune cloison n'était reliée au mur au centre du P et que la sortie était justement située sur le mur au centre du P. Mais l'exercice à l'air intéressant ! Peut-être un peu complexe dès le début (gestion des bulges pour les arcs) mais au moins il y a un peu de challenge ^^ Je me pencherais probablement dessus dans les jours à venir, le temps d'étudier une méthode qui me convient bien :3 Faut-il prévoir également prévoir un décalage vis-à-vis des cloisons/murs pour le tracé du chemin de résolution ou bien il se contente de prendre le tracé des cloisons/murs ? Si oui, cela signifie qu'une variante pourrait être étudiée visant à simplifier le tracé du chemin de résolution lorsqu'il fait du backtracking xD (je m'égare un peu trop, désolée...) Bisous, Luna
  18. Coucou, De souvenir, la version 2023 permet justement d'insérer un tableau avec un champ dynamique permettant d'afficher le nombre d'objet situés dans une aire. Le seul soucis vient donc de la "légende existante" puisqu'AutoCAD créé un nouveau tableau à chaque fois. Cependant, n'y a-t-il pas moyen de copier le code du champ dynamique qu'AutoCAD créé pour ensuite l'utiliser dans le texte/tableau souhaité ? Je n'ai pas testé mais cela peut éventuellement fonctionner, à voir. Bisous, Luna
  19. Ben en théorie, les variables enregistrées dans le profil utilisateur sont définie ainsi parce que chacun ne travaille pas de la même façon ! Pour l'exemple, OSMODE et OSNAP sont des variables que je modifie uniquement de manière locale pour le fonctionnement d'un programme et où je réaffecte leur valeur initiale à la fin, parce que je ne vais aucunement imposer à une autre personne que moi d'utiliser telle valeur d'OSMODE ! C'est pour respecter les méthodes de travail de chacun. Après évidemment, tu peux utiliser un fichier LISP pour réaffecter certaines variables à des valeurs par défaut mais dans ces cas-là, je passerai par une variable environnement servant de clé si on veut forcer l'utilisation des valeurs par défaut des variables ou si on laisse l'utilisateur gérer sa tambouille. Une variable environnement du genre VAROVERRIDE égale à 0 ou 1 avec un fichier LISP dans ce style-ci. (or (getenv "VAROVERRIDE") (setenv "VAROVERRIDE" "0") ) (if (= 1 (getenv "VAROVERRIDE")) (progn (setvar "OSMODE" 1) ... ) ) (defun c:VAROVERRIDE (/ vor val) (setq vor (getenv "VAROVERRIDE")) (initget "0 1") (or (setq val (getkword (strcat "\nSpécifier une nouvelle valeur pour VAROVERRIDE [0/1] <" vor "> : "))) (setq val vor) ) (setenv "VAROVERRIDE" val) ) Comme cela, si la personne refuse qu'on touche à ses variables, il lui suffit de mettre VAROVERRIDE = 0 et il n'y aura pas de soucis, sinon si elle préfère ne pas avoir à s'en occuper et utiliser plutôt les valeurs par défaut à l'ouverture du dessin (rien ne l'empêche de les modifier ensuite au cours de la session), elle met VAROVERRIDE = 1. Comme c'est des variables environnement, la valeur est enregistrée dans Windows donc si elle est conservée entre chaque dessin et sessions d'AutoCAD. Bisous, Luna
  20. C'est en effet beaucoup plus clair...je n'avais pas du tout compris chat.. Pour le coup, il faudrait passer par de la programmation mais je n'ai pas le temps de m'en occuper en ce moment..désolée. Bisous, Luna
  21. Coucou @DenisHen, J'avoue être perplexe...parles-tu des fonctions (getvar) et (setvar) permettant respectivement de récupérer la valeur d'une variable AutoCAD ou de définir une nouvelle valeur pour une variable AutoCAD (si elle n'est pas en lecture seule). Ou bien parles-tu d'autre chose ? Car pourquoi "stocker" des variables d'AutoCAD alors qu'AutoCAD le fait déjà pour toi...? Qu'entends-tu exactement par "stocker des variables" ? Bisous, Luna
  22. Et pourquoi ne pas simplement faire : (defun c:DH_TestInitGet ( / Choix) (while (/= Choix "Quitter") (initget "Saisie Épaisseur Type Niveau Quitter") (setq Choix (getkword "\nChoix de l'option [Saisie/Épaisseur/Type/Niveau/Quitter] <Quitter> : ")) (cond ((= Choix "Saisie") (princ "\nChoix : Saisie")) ((= Choix "Épaisseur") (princ "\nChoix : Épaisseur")) ((= Choix "Type") (princ "\nChoix : Type")) ((= Choix "Niveau") (princ "\nChoix : Niveau")) (T (setq Choix "Quitter")) ) ;_ Fin de cond ) ;_ Fin de while (princ) ) ;_ Fin de defun J'ai plus l'habitude d'utiliser une variable booléenne différente de mon (getkword) pour mettre fin à la boucle : (defun c:DH_TestInitGet ( / break Choix) (while (not break) (initget "Saisie Épaisseur Type Niveau") (setq Choix (getkword "\nChoix de l'option [Saisie/Épaisseur/Type/Niveau] <Quitter> : ")) (cond ((= Choix "Saisie") (princ "\nChoix : Saisie")) ((= Choix "Épaisseur") (princ "\nChoix : Épaisseur")) ((= Choix "Type") (princ "\nChoix : Type")) ((= Choix "Niveau") (princ "\nChoix : Niveau")) ((null choix) (setq break T)) ) ;_ Fin de cond ) ;_ Fin de while (princ) ) ;_ Fin de defun Mais l'utilisation d'un type différent n'est pas nécessaire...Je pense surtout que tu as eut l'idée de faire une différenciation via le type mais ce n'est pas nécessaire... Une autre variante, plus logique serait d'avoir le (getkword) comme condition : (defun c:DH_TestInitGet ( / Choix) (while (progn (initget "Saisie Épaisseur Type Niveau") (setq Choix (getkword "\nChoix de l'option [Saisie/Épaisseur/Type/Niveau] <Quitter> : ")) ) (cond ((= Choix "Saisie") (princ "\nChoix : Saisie")) ((= Choix "Épaisseur") (princ "\nChoix : Épaisseur")) ((= Choix "Type") (princ "\nChoix : Type")) ((= Choix "Niveau") (princ "\nChoix : Niveau")) ) ;_ Fin de cond ) ;_ Fin de while (princ) ) ;_ Fin de defun Bisous, Luna
  23. Coucou, As-tu essayé d'utiliser GILE_INCR ? Dispo >>ici<< Bisous, Luna
  24. Qu'entends-tu par là exactement ?
  25. Coucou, Sans LISP, difficile de remplir les colonnes automatiquement, cependant avec un champ dynamique, tu peux essayer de voir du côté des expressions DIESEL et notamment de la fonction $(substr) permettant ainsi de découper une chaîne de caractères. Cependant, il faut pour cela que chaque chaînes de caractères possèdent les mêmes dimensions...(à minima pour le début !) Il y a probablement d'autres méthodes mais je ne les connais pas, désolée.. Bisous, Luna
×
×
  • 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é