-
Compteur de contenus
1 113 -
Inscription
-
Dernière visite
-
Jours gagnés
42
Type de contenu
Profils
Forums
Calendrier
Blogs
Tout ce qui a été posté par Luna
-
Je n'étais pas sûre donc j'ai préféré ne rien dire plutôt que de dire des bêtises mais c'est bien ce qu'il me semblait...Si tu veux écrire des programmes pour des versions LT, il faudrait se tourner plutôt sur des scripts ou le langage DIESEL (il me semble qu'il est compatible avec les versions LT). En revanche, je ne sais plus si les versions LT possèdent les mêmes commandes qu'une version full ou bien si leur nombre est limité (je confonds sûrement avec les Viewers)... Peut-être essaye de voir avec la commande FILTRE (à vérifier s'il y a moyen de ne pas passer par la Boîte de Dialogue) ou SELECTSIMILAR dans ce cas. Mais en effet c'est bien de s'en rendre compte le plus tôt possible que ton programme doit être compatible avec les versions LT. Bon courage !
-
Coucou, Je ne connais rien en VBA mais j'avoue ne vraiment pas comprendre l'intérêt de filtrer les objets uniquement en post-sélection.... Au vu de l'exemple de @(gile), je dirais que les possibilité de filtre sont similaires aux filtres (ssget). Autrement dit, on est vraiment pas limité dans le filtrage de la sélection !! Il arrive assez souvent que l'on soit obligé de faire un second filtrage plus spécifique dans une boucle, mais rien n'empêche de réduire le nombre d'objets à traiter...Il y a une très grande différence entre devoir traiter 150 000 objets ou seulement 150 si les filtres sont bien définis... Ici, tu veux sélectionner tous les blocs de même nom et appartenant au même étage. Il est tout-à-fait possible de réaliser cette sélection en filtrant la sélection du premier coup...Le seul élément qui pose problème ici, c'est le mot "bloc". Car les blocs dynamiques ne possède pas leur EffectiveName directement dans la liste DXF donc il y a besoin d'une boucle de post-sélection, mais si tu ne voulais t'occuper que de blocs standards, tu n'aurais même pas besoin de faire une boucle théoriquement. Donc chat me chiffonne un peu d'entendre dire que les filtres de sélection sont très limités, car c'est faux. Mais bon après il ne s'agit là que d'un simple conseil, pour éviter d'avoir un programme qui tourne pendant 2h :3 Bisous, Luna
-
Coucou, Je n'ai pas de connaissance VBA, mais en LISP ce doit être le même principe. Pour commencer, le code DXF 2 pour une référence de bloc correspond au nom de la référence (donc pour un bloc standard c'est le nom de la définition de bloc, mais pour un bloc dynamique c'est "*U..."). Autrement dit, il n'y a pas de possibilité (du moins en LISP) de filtrer un bloc dynamique au moment de la sélection via le nom de la définition (car ce nom n'apparaît pas dans la liste DXF). Donc on applique le filtre de sélection en post-sélection via une boucle. Pour cela, il suffit de filtrer la sélection sur le nom de la définition de bloc et on ajoute la chaîne "`*U*" pour sélectionner toutes les références dynamiques. Puis dans une boucle on vérifie chaque entité sélectionnée via la propriété "EffectiveName" (en visual, donc VBA) ou "BlockTableRecord/Name" (en LISP via (getpropertyvalue)). Donc je pense que ce que tu recherches, c'est la propriété EffectiveName mais je ne sais pas si tu peux filtrer ta sélection directement sur cette propriété ou bien si tu dois également faire une boucle pour affiner la sélection. Et dernière chose, il faut savoir que les entités RESEAUX (Array) sont également définies comme des blocs dynamiques sauf qu'elles ne possèdent pas de propriétés EffectiveName (elles ne sont pas rattachées à une définition de bloc connue), donc en LISP il faut également vérifier que le bloc dynamique n'est pas un réseau sous peine d'avoir une erreur lors de la vérification du nom du bloc dynamique. Evidemment, cette méthode de post-sélection est très ennuyeuse car plus le .dwg contient de blocs dynamiques et plus le traitement pour filtrer les blocs dynamiques est long car on est obligé de sélectionner toutes les références de blocs dynamiques. EDIT: @(gile) a été encore une fois plus rapide et concis ! :3 Bisous, Luna
-
Coucou, Je ne connais rien à ces fonctions mais avec la doc que BonusCAD a trouvé, on peut essayer de décortiquer un peu plus le programme : (afm_highlight_init) ;; This function initializes the Highlighting functionality and clears any previously cached query restrictions. ;; This function should be the first function called as part of the highlighting function sequence. ;; -> Obligatoire (AfmHighltQueryClear 0 "AR_USAGE-TEST") ;; Clears existing highlighting, query text, and/or highlighting legend from the drawing. ;; nWhich is an integer that specifies which items to clear. ;; 0 clears Highlighting, Query Text, and Legend, 1 cleas Highlighting and Query Text only, 2 clears Legend only. ;; strLayer gives the layer on which Highlighting and Query Text should be cleared. ;; -> Je suppose que c'est cette fonction qui supprime les hachures précédemment créées, empêchant ainsi d'effectuer le programme avec plusieurs ;; type de locaux appartenant au même calque. (AfmHighltQuerySetOwner "rmtype") ;; These methods set the owner and assigned tables for the by-owner query. These owner and assigned table settings are independent of the current view setting. ;; All asset symbols associated with assigned records, which are assigned to the same owner, will be highlighted with the same pattern. ;; The owner should have a field designated with an ARCHIBUS Type of "Hpattern AutoCAD" to store the description of the hatch pattern for each owner. ;; You can edit these hatch patterns in an ARCHIBUS grid by selecting the cell and calling up a dialog. ;; -> Reste inchangé (AfmHighltQuerySetAssigned "rm") ;; -> Idem que pour (AfmHightltQuerySetOwner) (AfmHighltQuerySetFIlter (list (list "rmtype.rm_type" "SINGLE OFFICE"))) ;; This function appends restrictions to be applied when the AfmHighlightQueryByOwner function is called. Any number of restrictions can be included in ;; the list as a single setting, or this function can be called multiple times prior to calling the AfmHighltQueryByOwner method. For more information ;; regarding Filter Syntax, see the section on Filter Syntax. Both the AfmViewSetSqlRest and AfmHighltQuerySetFilter methods provide the same ;; functionality. ;; -> Ne peut être séparée de la fonction (AfmHightlightQueryByOwner). Je n'ai pas trouvé la section Filter Syntax. Quelques possibilités (comme évoquées par BonusCAD) sont : ;; (AfmHighltQuerySetFIlter (list (list "rmtype.rm_type" "SINGLE OFFICE") (list "rmtype.rm_type" "MEETING ROOM"))) ;; ou ;; (AfmHighltQuerySetFIlter (list (list "rmtype.rm_type" "SINGLE OFFICE"))) ;; (AfmHighltQueryByOwnerEx "AR_USAGE-TEST" 50 nil nil 'T) ;; (AfmHighltQuerySetFIlter (list (list "rmtype.rm_type" "MEETING ROOM"))) ;; (AfmHighltQueryByOwnerEx "AR_USAGE-TEST" 50 nil nil 'T) (AfmHighltQueryByOwnerEx "AR_USAGE-TEST" 50 nil nil 'T) ;; -> L'aide pour cette fonction est bien trop floue pour bien comprendre son fonctionnement... (afm_highlight_done) Le plus gros soucis, c'est que c'est délicat de trouver une solution sans vraiment pouvoir tester... Essaye donc de retirer la fonction de QueryClear pour pouvoir éviter la suppression des hachures existantes sur le calque. Peut-être que le problème vient de là...Tu as deux versions ci-dessous : (defun c:USAGES () (afm_highlight_init) ; (AfmHighltQueryClear 0 "AR_USAGE-TEST") (AfmHighltQuerySetOwner "rmtype") (AfmHighltQuerySetAssigned "rm") (AfmHighltQuerySetFIlter (list (list "rmtype.rm_type" "SINGLE OFFICE"))) (AfmHighltQueryByOwnerEx "AR_USAGE-TEST" 50 nil nil 'T) (AfmHighltQuerySetFIlter (list (list "rmtype.rm_type" "MEETING ROOM"))) (AfmHighltQueryByOwnerEx "AR_USAGE-TEST" 50 nil nil 'T) (afm_highlight_done) (princ) ) ;; ou (defun c:USAGES () (afm_highlight_init) ; (AfmHighltQueryClear 0 "AR_USAGE-TEST") (AfmHighltQuerySetOwner "rmtype") (AfmHighltQuerySetAssigned "rm") (AfmHighltQuerySetFIlter (list (list "rmtype.rm_type" "SINGLE OFFICE") (list "rmtype.rm_type" "MEETING ROOM"))) (AfmHighltQueryByOwnerEx "AR_USAGE-TEST" 50 nil nil 'T) (afm_highlight_done) (princ) ) Bisous, Luna
-
Il y a 10 types de personnes dans le monde : celles qui comptent en binaire et les autres
Luna a répondu à un(e) sujet de (gile) dans Débuter en LISP
Coucou, J'ai une petite question concernant l'utilisation des flags de certaines fonctions. Certaines fonction AutoLISP utilise les bits comme arguments pour permettre la combinaison de plusieurs fonctionnalité en fonction d'une unique valeur numérique. Par exemple ci-dessous la fonction (initget) : Signature (initget [bits] [keywords]) bits Type: Integer A bit-coded that allows or disallows certain types of user input. The bits can be added together in any combination to form a value between 0 and 255. If no bits argument is supplied, zero (no conditions) is assumed. The bit values are as follows: 1 (bit 0) -- Prevents the user from responding to the request by entering only Enter. 2 (bit 1) -- Prevents the user from responding to the request by entering zero. 4 (bit 2) -- Prevents the user from responding to the request by entering a negative value. 8 (bit 3) -- Allows the user to enter a point outside the current drawing limits. This condition applies to the next user-input function even if the AutoCAD LIMCHECK system variable is currently set. 16 (bit 4) -- (Not currently used.) 32 (bit 5) -- Uses dashed lines when drawing a rubber-band line or box. For those functions with which the user can specify a point by selecting a location in the drawing area, this bit value causes the rubber-band line or box to be dashed instead of solid. (Some display drivers use a distinctive color instead of dashed lines.) If the AutoCAD POPUPS system variable is 0, AutoCAD ignores this bit. 64 (bit 6) -- Prohibits input of a Z coordinate to the getdist function; lets an application ensure that this function returns a 2D distance. 128 (bit 7) -- Allows arbitrary input as if it is a keyword, first honoring any other control bits and listed keywords. This bit takes precedence over bit 0; if bits 7 and 0 are set and the user presses Enter, a null string is returned. 256 (bit 😎 -- Give direct distance input precedence over arbitrary input. For external applications, arbitrary input is given precedence over direct distance input by default. Set this bit if you wish to force AutoCAD to evaluate user input as direct distance input. Note that legal point input from the keyboard always takes precedence over either direct distance or arbitrary input. 512 (bit 9) -- If set before a call to getpoint or getcorner, a temporary UCS will be established when the cursor crosses over the edge of a planar face of a solid. The temporary UCS is reset when the cursor moves off of a face. It is dynamically re-established when the cursor moves over a different face. After the point is acquired, the dynamic UCS is reset to the current UCS. This functionality is not enabled for non-planar faces such as the side of a cylinder. 1024 (bit 10) -- When calling getdist, getangle, getorient, getpoint, or getcorner, you may not want the distance, angle, orient, point, or corner to be influenced by ortho, polar, or otracking in the Z direction. Setting this bit before calls to any of these functions will temporarily disable ortho, polar, and otracking in the Z direction. This is useful when you create 2D entities such as a polyline, arc, or circle, or when you use the AutoCAD ARRAY command, which creates only a 2D array. In 2D-only commands it can be confusing and error-prone to allow 3D points to be entered using ortho Z, polar Z, or otrack Z. Note: Future versions of AutoLISP may use additional initget control bits, so avoid setting bits that are not listed here. Donc j'ai compris que l'utilisation de (logand) permet de déterminer si oui ou non un bit a été défini. Par exemple si l'on spécifie bit = 35 alors on aura : (logand 35 1) returns 1. (logand 35 2) returns 2. (logand 35 4) returns 0. (logand 35 8) returns 0. (logand 35 16) returns 0. (logand 35 32) returns 32. (logand 35 64) returns 0. (logand 35 128) returns 0. (logand 35 256) returns 0. (logand 35 512) returns 0. (logand 35 1024) returns 0. Mais du coup si on souhaite appliquer l'utilisation de bits comme argument, un (cond) ne peut pas faire l'affaire car il s'arrêterait à partir du bit 0 sans exécuter les bits 1 et 5 (comme (or) car fonctionnement similaire). La fonction (and) pourrait fonctionner, mais cela nécessite l'écriture en dur de chaque valeur donc pas optimal. Bref existe-t-il une fonction native relative à ce fonctionnement ou bien faut-il en développer une ? J'avais commencer à développer une fonction pour repérer les bits présents dans un nombre entier positif avant de me rendre compte que (logand) permettait justement de les détecter...donc je préfères vérifier qu'AutoLISP ne fourni pas de fonction pour cette gestion d'arguments un peu particulier avant de me lancer dans la programmation de ma fonction ^^" Bisous, Luna -
Bon, Pour commencer il est écrit noir sur blanc "Utilisez les commandes REGEN ou REGNTOUT pour mettre à jour les échelles de type de ligne dans chaque fenêtre." dans l'aide d'AutoCAD que je t'ai fourni concernant la variable PSLTSCALE. Autrement dit, cette action de REGNTOUT est propre à la variable PSLTSCALE, mais ce n'est en aucun cas le cas pour la totalité des variables !!!! Un exemple tout simple : tu définis la variable "CLAYER" à "0", le changement de calque est instantané, pas besoin de REGNTOUT >w< Pareil, si tu définis la variable "CTAB" sur "Objet", le changement d'onglet se fait directement, pas de REGEN ou REGNTOUT !!! Donc à la question "Existe-t-il un moyen pour que lorsqu'une variable est modifiée, elle se fasse directement sans avoir besoin de RGT ?", la réponse est clairement non, car ce problème n'existe pas en réalité. C'est le fonctionnement propre à la variable PSLTSCALE (pas de chances pour toi, tu as eu un soucis avec celle-ci et pas une autre). Ensuite, qu'est-ce que la commande air ? Veux-tu parler de la commande airE ? Auquel cas je peux comprendre qu'une rotation du SCU n'est pas logique... Si on touche au SCU, il faut (je pense) connaître la variable UCSFOLLOW. Lors d'un changement de SCU, si UCSFOLLOW est à 1 (= actif) alors la rotation du dessin et un zoom étendu se fait automatiquement, permettant d'avoir constamment le curseur aligné aussi bien horizontalement que verticalement. Si UCSFOLLOW est à 0, alors cette rotation+zoom étendu ne se fait pas, le curseur s'aligne donc sur le nouveau SCU mais le dessin ne subit aucune "rotation" (même si ce n'est pas vraiment une rotation, mais un changement de base). Sans plus d'explications, il sera difficile de t'aider. Je te suggère de demander à ton collègue de bureau de t'expliquer comment bien définir ton espace de travail et les quelques variables et/ou commandes que tu DOIS connaître, car j'ai l'impression que tu débutes vraiment sur AutoCAD. On peut t'aider dans un problème précis, mais on ne peut pas non plus te former, il existe de nombreuses formations pour débuter sur AutoCAD et les collègues AutoCADiens pourront également t'apporter bien plus d'aides que nous (dans la limites de leurs compétences). En espérant avoir répondu à quelques unes de tes questions... Bisous, Luna
-
Comme je l'ai expliqué précédemment, la variable PSLTSCALE dépend de la présentation ou l'on se trouve, donc si tu modifies la variable pour la "Présentation1" par exemple, la "Présentation2" ne sera pas modifiée. Donc si tu penses à définir cette variable correctement avant de créer 150 présentations, tant mieux, mais si tu t'en rends compte trop tard, tu devrais modifier cette variable manuellement sur chaque présentations (ce qui peut être très long selon le nombre de présentations que tu as). Ainsi ce programme permet d'homogénéiser la valeur de cette variable pour qu'elle soit la même sur toutes tes présentations ! La fonction que je t'ai donné permet donc de choisir entre 0 ou 1 pour la valeur globale de PSLTSCALE (tu peux donc soit écrire 0 ou 1, ou bien choisir l'option "0" ou "1") et si tu ne réponds rien (donc une validation à vide, via ENTER ou SPACE) cela équivaut à choisir la valeur 0. Ci-dessous l'aide concernant PSLTSCALE : Gère la mise à l'échelle du type de ligne des objets affichés dans les fenêtres de l'espace papier. Type: Entier Enregistré dans: Dessin Valeur initiale : 1 L'échelle du type de ligne pour les types de ligne discontinus peut être définie de façon à dépendre de l'échelle d'agrandissement de chaque fenêtre de présentation, ou de manière uniforme en fonction de l'échelle générale de l'espace papier. Différents onglets de présentation peuvent avoir des paramètres différents pour PSLTSCALE. Valeur Description 0 Aucune mise à l'échelle particulière du type de ligne. La longueur des tirets dépend des unités de dessin de l'espace (objet ou papier) dans lequel les objets sont créés. Mise à l'échelle effectuée par le facteur LTSCALE général. 1 La mise à l'échelle du type de ligne dépend de celle de la fenêtre. Si TILEMODE a pour valeur 0, la longueur des tirets est définie en fonction des unités de dessin de l'espace papier, même pour les objets de l'espace objet. Dans ce mode, les fenêtres peuvent être agrandies différemment et néanmoins afficher des types de ligne identiques. Pour un type de ligne particulier, la longueur des tirets dans une fenêtre est identique à celle des tirets dans l'espace papier. Vous pouvez toujours gérer la longueur des tirets à l'aide de LTSCALE. Lorsque vous modifiez PSLTSCALE ou que vous utilisez une commande comme ZOOM en définissant PSLTSCALE sur 1, les objets présents dans les fenêtres ne sont pas régénérés automatiquement à l'aide de la nouvelle échelle de type de ligne. Utilisez les commandes REGEN ou REGNTOUT pour mettre à jour les échelles de type de ligne dans chaque fenêtre. Concernant la REGENALL, normalement le changement de présentation équivaut à un REGENALL (perso je n'ai jamais eu de soucis de mon côté avec cette commande). Si besoin je peux l'y intégrer, tout comme je peux te fournir la commande sous format .lsp pour que tu n'es qu'à charger le fichier dans ton dessin et saisir le nom de la commande :3 Bisous, Luna
-
Coucou, En effet, il te manquait quelques bases ^^" Essaye ceci pour commencer : ((lambda (/ *error* InitLayout layout-list acet lay Value Nb) (defun *error* (msg) (if acet (setq acet (acet-ui-progress)) ) (princ) ) (setq InitLayout (getvar "CTAB") Nb 0 ) (initget "0 1") (if (or (null (setq Value (getint "\nQuelle valeur souhaitez-vous affecter à la variable système \"PSLTSCALE\" [0/1] <0> : "))) (and (/= Value 0) (/= Value 1))) (setq Value 0) ) (setq layout-list (layoutlist) acet (acet-ui-progress "PSLTSCALECUSTOM en cours d'exécution :" (length layout-list)) i 0 ) (foreach lay layout-list (setvar "CTAB" lay) (if (= (getvar "PSLTSCALE") Value) (setq Nb (1+ Nb)) ) (acet-ui-progress (setq i (1+ i))) (setvar "PSLTSCALE" Value) ) (setq acet (acet-ui-progress)) (setvar "CTAB" InitLayout) (prompt (strcat "\nLa variable système \"PSLTSCALE\" est désormais définie à " (itoa Value) " sur la totalité des présentations du fichier \"" (getvar "DWGNAME") "\"." "\n" (itoa Nb) " / " (itoa (length layout-list)) " présentation(s) possédaient déjà la variable \"PSLTSCALE\" à " (itoa Value) ".\n" ) ) )) Tu fais un copier/coller de l'ensemble du code dans ta ligne de commande et tu fais ENTER (chat lancera le code), tu appuis une seconde fois ENTER (pour définir la valeur à 0 par défaut). Si aucun changement significatifs alors tu peux essayer cette solutions ci : Issu du fabuleux recueil de @rebcao ! Voici les liens si tu souhaites le consulter (un CTRL+F te permettra de rechercher des chaînes de caractères pour aller plus vite) : - TOP QUIZ des galères AutoCAD (rebcao) - Variables systèmes AutoCAD 20XX (rebcao) Bisous, Luna
-
Coucou, Je n'arrive pas à comprendre cette ligne...A quoi correspond ce (defun) et surtout, à quel endroit s'arrête-il ? Autrement, cela semble tout-à-fait remarquable, je regarderais chat en détails lorsque j'aurais un peu plus de temps :3 Merci du partage !! ♥w♥ Bisous, Luna
-
Sélectionner des blocs dynamiques en fonction de leurs paramètres
Luna a répondu à un(e) sujet de rrobert dans AutoCAD 2020-2024
Coucou, J'ai une fonction qui peut éventuellement correspondre à ta demande @rrobert, mais il s'agit d'une fonction et non d'une commande donc si tu n'as pas de connaissances en LISP, cela ne te sera d'aucune utilité malheureusement...(Je n'ai pas la possibilité de choisir les blocs ayant la visibilité "Douche" et l'attribut "Longueur" à 90cm, mais il suffit d'effectuer le filtre sur la visibilité dans un premier temps et ensuite sur l'attribut dans un second temps) Il s'agit de la fonction (Select-filter) < c'est un lien vers le sujet ^^ >, ce n'est pas la toute dernière version, plus complète, car je dois encore la retravailler un peu. Si cela ne correspond pas à tes besoins je pourrais essayer de voir pour créer une commande pour te simplifier son utilisation :3 J'ai essayé de détailler un peu son fonctionnement dans mon dernier post, mais le plus gros des explications sont dans le fichier .lsp en commentaires (enfin dans le code visible dans le post du coup ^^"). Donc un exemple d'utilisation pour ton cas c'est d'écrire en ligne de commande : (select-filter "DYN" '("*") '("_X") '(("*" . "Douche")) T) > Permet de sélectionner tous les blocs, peut importe leur nom, dans l'ensemble du dessin et dont la visibilité, peut importe son nom à pour valeur "Douche". Renvoie les quantitatifs des blocs selon leur valeurs de propriétés dynamiques. (select-filter "DYN" '("*") '("_X") '(("*" . "Douche")) T) ;; puis (select-filter "ATT" '("*") nil '(("Longueur" . "90 cm")) T) > Permet de sélectionner dans un premier temps les blocs ayant une propriété dynamique équivalente à "Douche", puis de sélectionner uniquement les blocs ayant un attribut nommé "Longueur" et de valeur "90 cm". Il est possible de faire cela car la fonction rend la sélection filtrée active (donc comme pour PICKFIRST = 1, tu peux réutiliser cette sélection filtrée dans d'autres commande, ou bien cette même fonction). (select-filter "DYN" '("*") '("_X") '(("*" . "Sans diamètre") ("Longueur" . 1.20)) T) > Permet de sélectionner tous les blocs ayant une propriété dynamique ayant pour valeur "Sans diamètre" ou ayant une propriété dynamique nommé "Longueur" et de valeur 1.20 (pour1,20m). EDIT : cela fait parti des modifications que je dois corriger pour avoir un AND et non un OR sur les propriétés/valeurs (voire la possibilité d'avoir le choix) donc à ce stade, il faudra faire comme pour la visibilité + attribut, en deux étapes !^^" Si cela ne te convient pas, alors je verrais si je peux en faire une commande pour faciliter son utilisation (sous forme de fonction, il ne faut surtout pas oublier les parenthèses !!!) Bisous, Luna- 5 réponses
-
- autocad2021
- bloc
-
(et 3 en plus)
Étiqueté avec :
-
Effacer élements après "copier les propriétés"
Luna a répondu à un(e) sujet de yusukens82 dans Débuter en LISP
Coucou, Je pense justement que tu es au bon endroit :3 Et cela montre également que copier partiellement ne permet pas d'apprendre 😉 Si tu as envie d'apprendre, alors je n'aurais aucun soucis à te guider et te donner quelques bases, comme par exemple les déclarations de variables et les différents types d'atomes ou listes. Tu comprendrais plus facilement que 'ss' est une variable, et que si cette dernière n'est déclarée nulle part, alors c'est qu'elle n'existe pas (appelée nil en AutoLISP, le contraire T signifiant que quelque chose "existe"). Pour être honnête, je doute fortement que se soit une bonne idée de faire du LISP sans en maîtriser les bases...Cela conduira forcément à des problèmes et les bases sont abordables à quiconque veut bien se donner la peine d'écouter 🙂 Donc si jamais tu as des questions, tu es au bon endroit et je te suggères ces liens qui sont fait pour apprendre, quelque soit le niveau de chacun : - Da-Code (Site de didier) - Introduction AutoLISP (Site de (gile)) Ce sont d'excellentes références (en français) qui permettent de maîtriser les bases très rapidement. Après libre à toi de grapiller des bouts de codes, mais avec les bases, c'est mieux ^^" PS : ce n'est pas un reproche mais un simple conseil avisé 😉 Bisous, Luna -
Effacer élements après "copier les propriétés"
Luna a répondu à un(e) sujet de yusukens82 dans Débuter en LISP
Coucou, Petite correction @Maxime063, l'option ":S" ne permet pas de ne sélectionner qu'une seule entité !! Elle permet qu'une seule sélection, mais l'utilisateur peut utiliser n'importe quel mode de sélection !! Donc si on fait une sélection en capture par exemple, il est tout à fait possible de sélectionner plusieurs entités !! Si tu veux conserver un fonctionnement similaire à la fonction (entsel), il s'agit de l'addition des méthodes ".+", ":E" et ":S" s'écrivant ainsi "_+.:E:S". Cette écriture permet de simuler un (entsel), bien que dans cette situation, (entsel) serait probablement préférable car on peut afficher un message :3 Pour info : - "+." permet d'afficher le curseur en mode sélection d'objet (le petit carré) - ":E" permet de n'autoriser que la sélection des objets se trouvant sous le curseur - ":S" permet de n'autoriser qu'une seule sélection, quelque soit le mode de sélection choisi (capture, fenêtre, objet, ...) - "_" permet de s'assurer que la version des modes de sélection utilisés se font en anglais, quelque soit la langue d'AutoCAD (format international) Après je n'avais pas donner de réponse directement car je m'inquiètes de la déclaration de sa variable 'ss' qui ne semble pas avoir été déclarée dans sa commande (ni définie localement)...Donc je voulais essayer de corriger cela pour qu'il ne fasse pas d'erreurs les prochaines fois ^^" Bisous, Luna -
Effacer élements après "copier les propriétés"
Luna a répondu à un(e) sujet de yusukens82 dans Débuter en LISP
Coucou, Pour cela j'ai quelques questions : à quoi correspond ss ? Quand et comment as-tu déclarer cette variable ? Si je comprends bien, tu as un objet source et un objet cible, et une fois que tu as effectué la commande "_MATCHPROP" sur l'objet cible depuis l'objet source, tu veux supprimer l'objet source ? Bisous, Luna -
♥w♥ J'en déduis donc que j'aurais dû aller plus loin que 4 niveaux finalement ! >w< Quand j'avais regardé, j'étais bien arrivé à retrouver les XRECORD depuis le dictionnaire ACLYDICTIONARY, mais en regardant ces XRECORD, je tournais en boucle...Donc mon soucis était simplement de ne pas avoir continué plus loin...? Bon donc chat veut dire qu'il va falloir que je retravaille mon (explore-dxf) pour avoir la possibilité de ne pas afficher les doublons pour alléger le fichier d'export (sinon les boucles prennent 80% du fichier et chat devient vite illisible ^^") En tous cas, merci beaucoup à vous deux, j'y vois déjà un peu plus clair et je vais voir ce que je peux apprendre pour gérer ces filtres de propriétés de ma plume :3 Bisous, Luna
-
Coucou, J'ai un soucis que je n'arrive pas à comprendre. Sur l'image ci-dessous, j'ai créer une liste de filtres de propriétés ("000-SITE", "100-IMPLANTATION", "300-RESAUX SECS" et "Actifs" ainsi que "Inactifs" dans la rubrique "100-IMPLANTATION") : J'aimerais voir s'il est possible de modifier, créer, ou supprimer ces filtres de propriétés de manière automatique (donc en LISP pour ne pas avoir à créer cette liste manuellement à chaque fois, ou simplement pour la mettre à jour). Pour chat, rien de bien compliqué, on peut accéder à cette liste via la ligne suivante : (dictsearch (cdr (assoc 360 (entget (cdr (assoc 330 (entget (tblobjname "LAYER" "0"))))))) "ACAD_LAYERFILTERS") ;; On commence par récupérer l'entité correspondant au calque "0" (via (tblobjname)) puis en passant respectivement ;; par les codes 330 et 360 on peut récupérer la liste de dictionnaires concernant les Calques (enfin je crois) ;; Puis on récupère les informations contenues dans le dictionnaires nommé "ACAD_LAYERFILTERS" ;; Ci-dessous le résultat avant le (dictsearch) : Explore DXF in progress from "DICTIONARY" (<Nom d'entité: c376a1e0>) : | (-1 . <Nom d'entité: c376a1e0>) | (0 . "DICTIONARY") | (330 . <Nom d'entité: c376c020>) | (5 . "18E") | (100 . "AcDbDictionary") | (280 . 1) | (281 . 1) | (3 . "ACAD_LAYERFILTERS") | (360 . <Nom d'entité: 3810b1c0>) | (3 . "ACAD_LAYERSTATES") | (360 . <Nom d'entité: c376a1f0>) | (3 . "ACLYDICTIONARY") | (360 . <Nom d'entité: 3810b1b0>) | End of exploration... ;; Ci-dessous le résultat après le (dictsearch) : Explore DXF in progress from "DICTIONARY" (<Nom d'entité: 3810b1c0>) : | (-1 . <Nom d'entité: 3810b1c0>) | (0 . "DICTIONARY") | (5 . "AF4C") | (102 . "{ACAD_REACTORS") | (330 . <Nom d'entité: c376a1e0>) | (102 . "}") | (330 . <Nom d'entité: c376a1e0>) | (100 . "AcDbDictionary") | (280 . 0) | (281 . 1) | (3 . "000-SITE") | (350 . <Nom d'entité: 3810b250>) | (3 . "100-IMPLANTATION") | (350 . <Nom d'entité: 3810b1e0>) | (3 . "300-RESEAUX SECS") | (350 . <Nom d'entité: 3810b230>) | (3 . "Actifs") | (350 . <Nom d'entité: 3810b2b0>) | End of exploration... On peut ensuite récupérer les propriétés du filtre en accédant aux codes 350 (bien que leur construction ne soit pas très simple à gérer et je n'ai pas dresser la correspondance des valeurs du code 70 par rapport aux propriétés, mais passons). Donc cela semble relativement simple de prime abords ! Cependant, mon soucis vient du fait que le filtre "Inactifs"...n'existe pas... J'ai eu beau creuser un peu plus, je n'arrive pas à le faire apparaître, or si AutoCAD est en mesure de l'afficher, il doit forcément exister quelque part...donc je ne sais pas bien comment accéder aux filtres de propriétés "subalternes" finalement ! Ci-dessous un petit aperçu de la structuration des listes (ne faites pas attention à la numérotation, je n'ai pas encore corrigé ce soucis sur ma fonction d'exploration...) : Explore DXF in progress from "DICTIONARY" (<Nom d'entité: 3810b1c0>) : | (-1 . <Nom d'entité: 3810b1c0>) | (0 . "DICTIONARY") | (5 . "AF4C") | (102 . "{ACAD_REACTORS") | (330 . <Nom d'entité: c376a1e0>) | (102 . "}") | (330 . <Nom d'entité: c376a1e0>) | (100 . "AcDbDictionary") | (280 . 0) | (281 . 1) | (3 . "000-SITE") | (350 . <Nom d'entité: 3810b250>) | (3 . "100-IMPLANTATION") | (350 . <Nom d'entité: 3810b1e0>) | (3 . "300-RESEAUX SECS") | (350 . <Nom d'entité: 3810b230>) | (3 . "Actifs") | (350 . <Nom d'entité: 3810b2b0>) | 1. "DICTIONARY" (<Nom d'entité: c376a1e0>) at 330 code, from "DICTIONARY" object : | (-1 . <Nom d'entité: c376a1e0>) | (0 . "DICTIONARY") | (330 . <Nom d'entité: c376c020>) | (5 . "18E") | (100 . "AcDbDictionary") | (280 . 1) | (281 . 1) | (3 . "ACAD_LAYERFILTERS") | (360 . <Nom d'entité: 3810b1c0>) | (3 . "ACAD_LAYERSTATES") | (360 . <Nom d'entité: c376a1f0>) | (3 . "ACLYDICTIONARY") | (360 . <Nom d'entité: 3810b1b0>) | 2. "DICTIONARY" (<Nom d'entité: c376a1e0>) at 330 code, from "DICTIONARY" object : | (-1 . <Nom d'entité: c376a1e0>) | (0 . "DICTIONARY") | (330 . <Nom d'entité: c376c020>) | (5 . "18E") | (100 . "AcDbDictionary") | (280 . 1) | (281 . 1) | (3 . "ACAD_LAYERFILTERS") | (360 . <Nom d'entité: 3810b1c0>) | (3 . "ACAD_LAYERSTATES") | (360 . <Nom d'entité: c376a1f0>) | (3 . "ACLYDICTIONARY") | (360 . <Nom d'entité: 3810b1b0>) | 3. "XRECORD" (<Nom d'entité: 3810b250>) at 350 code, from "DICTIONARY" object : | (-1 . <Nom d'entité: 3810b250>) | (0 . "XRECORD") | (5 . "AF55") | (102 . "{ACAD_REACTORS") | (330 . <Nom d'entité: 3810b1c0>) | (102 . "}") | (330 . <Nom d'entité: 3810b1c0>) | (100 . "AcDbXrecord") | (280 . 1) | (1 . "000-SITE") | (1 . "0,Calque#*,UBS-000-*") | (1 . "*") | (1 . "*") | (70 . 0) | (1 . "*") | (1 . "*") | 4. "XRECORD" (<Nom d'entité: 3810b1e0>) at 350 code, from "DICTIONARY" object : | (-1 . <Nom d'entité: 3810b1e0>) | (0 . "XRECORD") | (5 . "AF4E") | (102 . "{ACAD_REACTORS") | (330 . <Nom d'entité: 3810b1c0>) | (102 . "}") | (330 . <Nom d'entité: 3810b1c0>) | (100 . "AcDbXrecord") | (280 . 1) | (1 . "100-IMPLANTATION") | (1 . "0,Calque#*,UBS-100-*") | (1 . "*") | (1 . "*") | (70 . 0) | (1 . "*") | (1 . "*") | 5. "XRECORD" (<Nom d'entité: 3810b230>) at 350 code, from "DICTIONARY" object : | (-1 . <Nom d'entité: 3810b230>) | (0 . "XRECORD") | (5 . "AF53") | (102 . "{ACAD_REACTORS") | (330 . <Nom d'entité: 3810b1c0>) | (102 . "}") | (330 . <Nom d'entité: 3810b1c0>) | (100 . "AcDbXrecord") | (280 . 1) | (1 . "300-RESEAUX SECS") | (1 . "0,Calque#*,UBS-300-*") | (1 . "*") | (1 . "*") | (70 . 0) | (1 . "*") | (1 . "*") | 6. "XRECORD" (<Nom d'entité: 3810b2b0>) at 350 code, from "DICTIONARY" object : | (-1 . <Nom d'entité: 3810b2b0>) | (0 . "XRECORD") | (5 . "AF5B") | (102 . "{ACAD_REACTORS") | (330 . <Nom d'entité: 3810b1c0>) | (102 . "}") | (330 . <Nom d'entité: 3810b1c0>) | (100 . "AcDbXrecord") | (280 . 1) | (1 . "Actifs") | (1 . "*") | (1 . "*") | (1 . "*") | (70 . 48) | (1 . "*") | (1 . "*") | End of exploration... Mais on voit bien qu'on tourne en boucle... (les codes 350 renvoient au Dictionnaire "ACAD_LAYERFILTERS" donc on ne peut pas aller plus loin) et je suis allé jusqu'à 4 niveaux sur les codes 330 360 et 350 et bien que le dictionnaire "ACLYDICTIONARY" permet lui aussi d'atteindre la liste des filtres de propriétés (la construction de la liste est différente cependant) : (-1 . <Nom d'entité: 3810b1d0>) (0 . "XRECORD") (5 . "AF4D") (102 . "{ACAD_XDICTIONARY") (360 . <Nom d'entité: 3810b1f0>) (102 . "}") (102 . "{ACAD_REACTORS") (330 . <Nom d'entité: 3810b1b0>) (102 . "}") (330 . <Nom d'entité: 3810b1b0>) (100 . "AcDbXrecord") (280 . 1) (1 . "AcLyLayerFilter") (90 . 1) (300 . "100-IMPLANTATION") (301 . "NAME==\"UBS-100-*\" OR NAME==\"0\" OR NAME==\"Calque#*\"") Je n'ai ici aussi que les 4 filtres de propriété principaux, mais le filtre nommé "Inactifs" n'apparaît pas... Bref, chat fait beaucoup de texte pour pas grand chose et je m'en excuse, mais si jamais quelqu'un s'est déjà attardé sur le sujet des filtres de propriétés et la manière d'avoir la liste complète (et pas uniquement les principaux), je ne suis pas contre quelques explications ! ^^" Pour la partie modification/création/suppression je verrais de mon côté comment je peux gérer cette histoire (surtout si les informations sont présentes dans 2 dictionnaires différents, les liaisons risquent d'être complexes). Merci d'avance ! Luna
-
Exécuter une fonction avec ses arguments?
Luna a répondu à un(e) sujet de rrobert dans LISP et Visual LISP
Coucou, Je veux bien comprendre que le LISP permet de gagner en rapidité, mais il ne permet pas d'aller plus vite qu'AutoCAD ! Il faut te poser la question suivante : qu'est-ce que tu y gagnes à t'épargner une saisie ENTER au clavier ? On ne parle pas de rapidité ou de gain de temps...Sachant que de toutes façons tu devras valider ton choix, il y aura de toutes manières une validation par la touche ENTER (ou SPACE), donc tu n'as pas de déplacements "intempestifs" supplémentaires à réaliser avec ta demande...Donc tu vas gagner, disons 0.5s... Combien d'étages dois-tu copier par jour pour rendre ce gain de 0.5s rentable à devoir créer un programme intelligent (car AutoCAD n'a aucune idée du nombre d'étages dans ton fichier...) donc il te faudrait un programme pour créer un nombre n de programme...!!! C'est faisable mais n'oublies pas Tu débutes, donc commence par maîtriser les bases avant de vouloir créer une IA qui t'épargnes 0.5s... On commence déjà à essayer de gagner plusieurs minutes, ou dizaines de secondes avant de vouloir grappiller "accessoirement" des dizièmes de secondes... Pardonnes-moi si je peux paraître aggressive, mais je pense que tu ne saisis pas qu'elles sont les limites d'AutoCAD...Rechercher la perfection, c'est bien, mais encore faut-il se satisfaire des résultats et savoir s'arrêter. Il n'est pas possible de demander à ce qu'AutoCAD lance des commandes sans aucune validation ou saisie clavier/souris... Donc je pense que tu peux te satisfaire d'avoir créer un programme qui s'exécute avec 4 saisies claviers (petite anecdote, si tu veux vraiment être dans l'optimisation, pourquoi nommer la commande "+" alors que cette touche est très éloignée d'une touche clavier de validation ?!) ! Bisous, Luna -
Coucou @rrobert, Je pense que l'erreur vient simplement que ta question est assez mal posée, se traduisant par une demande complexe qui, en réalité est très simple... J'avoue ne pas voir une très grande différence entre ton sujet sur la commande PAN et celui-ci... La méthode est strictement la même sauf que la macro ne doit pas utiliser la commande PAN mais la commande COPIER... >w< Donc à moins que tes explications manquent de clarté, je pense que tu as toutes les réponses d'ores et déjà... Bisous, Luna
-
Coucou, Je suis probablement hors sujet mais sait-on jamais : la variable PSLTSCALE est définie indépendamment pour chaque présentation. Donc si les valeurs 0 et 1 dont tu parles correspondent bien à la même présentation qui ne fonctionne pas alors en effet, les conversions d'unité entre ton espace objet et ton espace papier peuvent jouer comme le dit didier. Bisous, Luna
-
Oki ! Pas de soucis :3 J'ai un peu tendance à répondre sans réfléchir parfois ^^' Bisous, Luna
-
Coucou, Si tu veux modifier la distance entre tes cotations et ta polyligne, il s'agit de cette ligne : pt_dim (polar pt_sel alpha (* 2.0 (getvar "DIMTXT"))) La distance est ici définie à 2 fois la hauteur du texte de cotation (correspondant à la variable système "DIMTXT"). Si jamais tu désires modifier cette valeur, plusieurs solutions s'offrent à toi en fonction de tes compétences en AutoLISP : - Modifier la valeur manuellement en ligne de code (pas la meilleure solution mais reste fonctionnelle) ;; Remplacer donc (* 2.0 (getvar "DIMTXT")) par n'importe qu'elle valeur numérique souhaitée - Définir cette valeur en début de programme via une variable et la modifier dans l'IDE (defun c:Dim_PolyArc (... htxt) ;; Ajout de la variable htxt dans la liste de déclaration des variables locales (setq htxt (* 2.0 (getvar "DIMTXT"))) ;; Ajout de la ligne de définition de la distance cotation/polyligne en début de programme ... ;; Le reste du programme reste inchangé pt_dim (polar pt_sel alpha htxt) ;; Modification de la ligne concernant la définition du point d'insertion de la cotation ) - Définir cette variable par le biais d'une question utilisateur (similaire à la solution ci-dessus) (defun c:Dim_PolyArc (... htxt) ;; Ajout de la variable htxt dans la liste de déclaration des variables locales (if (null (setq htxt (getreal (strcat "\nDistance entre la polyligne et la ligne de cotation <" (* 2.0 (getvar "DIMTXT")) "> : "))) ;; Ajout d'une question utilisateur avec la valeur de BonusCAD par défaut (setq htxt (* 2.0 (getvar "DIMTXT"))) ;; Affectation de la valeur par défaut si aucune saisie utilisateur ) ;; Ajout de la ligne de définition de la distance cotation/polyligne en début de programme ... ;; Le reste du programme reste inchangé pt_dim (polar pt_sel alpha htxt) ;; Modification de la ligne concernant la définition du point d'insertion de la cotation ) Encore une fois, tout se passe dans la définition du point d'insertion de la cotation (nommé 'pt_dim') et il s'agit de l'angle 'alpha' qui permet de définir cette insertion. alpha (- (atan (cadr deriv) (car deriv)) (* pi 0.5)) ;; Dans le sens de lecture de la polyligne, la cotation sera placée ici à droite de cette dernière (tout dépends du sens de création de la polyligne !) ;; Il est possible de la placer à gauche en spécifiant non pas (* pi 0.5) mais (* pi -0.5), afin d'ajouter un quart de tour à l'angle du segment Si je ne dit pas de bêtises, cela devrait pouvoir fonctionner au besoin. Il est également possible d'inverser une polyligne par un clic droit > Polyligne > Inverser :3 J'espère avoir répondu à toutes tes questions @drault ! Et merci à BonusCAD !! ♥ Bisous, Luna
-
Coucou, Si j'ai bien compris la demande, il s'agirait d'un programme permettant la création automatique d'objets de cotation (prendre le style courant par défaut ?) tout du long d'une polyligne. La définition des données utilisateurs doit à priori se faire via une boîte de dialogue (DCL) ayant les mêmes questions que l'image ci dessus mais en y ajoutant 2 questions supplémentaires concernant l'annotativité de l'objet (comment sommes-nous gérer cette option ? Un oui/non ? La liste des échelles à prendre en compte ?) ainsi que la distance (perpendiculaire ?) de la ligne de cotation par rapport à l'objet polyligne. Le but serais donc de coter une (plusieurs ?!) polyligne automatiquement en ayant quelques options concernant les cotations avant la création de ces dernières. Cependant j'ai encore quelques zones floues : - comment le programme doit-il gérer les segments courbes ? Faut-il les coter ou bien les ignorer ? - je ne vois pas qu'est-ce que tu as besoin / à quoi tu t'attends concernant l'option d'annotativité ? Ne serait-ce pas plus simple de conserver la sélection de l'ensemble des cotations à la fin de la commande et que tu gères ce point directement via la palette des propriétés ? (car je suppose qu'il faut spécifier une liste d'échelle pour cette annotativité et pas une simple question oui/non...) - La cotation angulaire 90° sur ton exemple doit-elle également être crée par le programme ou bien tu n'as besoin que des cotations linéaires ? Bisous, Luna
-
[Résolu] - Copier dans une liste les 5 dernières entités
Luna a répondu à un(e) sujet de LElemurien dans Débuter en LISP
Vouih, je n'étais pas sûre de l'ordre chronologique concernant la fonction (entnext) donc je voulais vérifier chat avant de raconter des bêtises mais en effet (entnext) est une solution idéale pour conserver l'utilisation des (command) ! ;3 Bisous, Luna -
[Résolu] - Copier dans une liste les 5 dernières entités
Luna a répondu à un(e) sujet de LElemurien dans Débuter en LISP
Coucou, L'une des solutions pourrait également être de ne pas utiliser la commande "COPY" mais de passer par (entmakex) dans une boucle :3 Comme chat tu n'auras aucune difficultés pour créer ta liste peut importe le nombre d'objets. Bisous, Luna -
Détecter une touche clavier en diesel
Luna a répondu à un(e) sujet de rrobert dans Personnalisation, macros, DIESEL
Coucou, Si on s'en tient à l'aide AutoCAD : DIESEL Functions Reference Status retrieval, computation, and display are performed by DIESEL functions. All functions have a limit of 10 parameters, including the function name itself. Function Description/Example + (addition) Returns the sum of the numbers val1 , val2 , …, val9 . $(+, val1 [, val2, …, val9]) If the current thickness is set to 5, the following DIESEL string returns 15. $(+, $(getvar, thickness), 10) - (subtraction) Returns the result of subtracting the numbers val2 through val9 from val1 . $(-, val1 [, val2 , …, val9]) * (multiplication) Returns the result of multiplying the numbers val1 , val2 , …, val9 . $(*, val1 [, val2, …, val9]) / (division) Returns the result of dividing the number val1 by val2 , …, val9 . $(/, val1 [, val2, …, val9]) = (equal to) If the numbers val1 and val2 are equal, the string returns 1; otherwise, it returns 0. $(=, val1, val2) < (less Than) If the number val1 is less than val2 , the string returns 1; otherwise, it returns 0. $(<, val1, val2) The following expression gets the current value of HPANG; if the value is less than the value stored in the system variable USERR1, it returns 1. If the value 10.0 is stored in USERR1 and the current setting of HPANG is 15.5, the following string returns 0. $(<, $(getvar, hpang), $(getvar, userr1)) > (greater Than) If the number val1 is greater than val2 , the string returns 1; otherwise, it returns 0. $(>, val1, val2) != (not Equal to) If the numbers val1 and val2 are not equal, the string returns 1; otherwise, it returns 0. $(!=, val1, val2) <= (less Than or Equal to) If the number val1 is less than or equal to val2 , the string returns 1; otherwise, it returns 0. $(<=, val1, val2) >= (greater Than or Equal to) If the number val1 is greater than or equal to val2 , the string returns 1; otherwise, it returns 0. $(>=, val1, val2) and Returns the bitwise logical AND of the integers val1 through val9 . $(and, val1 [, val2,…, val9]) angtos Returns the angular value in the format and precision specified. $(angtos, value [, mode, precision]) Edits the given value as an angle in the format specified by the mode and precision as defined for the analogous AutoLISP function. If mode and precisionare omitted, it uses the current values chosen by the UNITS command. Note: AutoLISP is not available in AutoCAD LT. The following mode values can be applied: 0, for Degrees 1, for Degrees/Minutes/Seconds 2, for Grads 3, for Radians 4, for Surveyor's Units Edtime Returns a formatted date and time based on a given picture. $(edtime, time, picture) Edits the Julian date given by time (obtained, for example, from $(getvar,date) according to the given picture ). The picture consists of format phrases replaced by specific representations of the date and time. Characters not interpretable as format phrases are copied literally into the result of $(edtime) . Format phrases are defined as shown in the following table. For example, assume that the date and time are Saturday, 5 September 1998 4:53:17.506 the corresponding format phrases and output examples for edtime are as follows: D - 5 DD - 05 DDD - Sat DDDD - Saturday M - 9 MO - 09 MON - Sep MONTH - September YY - 98 YYYY - 1998 H - 4 HH - 04 MM - 53 SS - 17 MSEC - 506 AM/PM - AM am/pm - am A/P - A a/p - a Enter the entire AM/PM phrase as shown in the preceding table; if AM is used alone, the A will be read literally and the M will return the current month. If any AM/PM phrases appear in the picture, the H and HH phrases edit the time according to the 12-hour civil clock (12:00-12:59 1:00-11:59) instead of the 24-hour clock (00:00-23:59). The following example uses the date and time from the preceding table. Notice that the comma must be enclosed in quotation marks because it is read as an argument separator. $(edtime, $(getvar,date), DDD"," DD MON YYYY - H:MMam/pm) It returns the following: Sat, 5 Sep 1998 - 4:53am If time is 0, the time and date at the moment that the outermost macro was executed is used. This avoids lengthy and time-consuming multiple calls on$(getvar,date) and guarantees that strings composed with multiple $(edtime) macros all use the same time. eq If the strings val1 and val2 are identical, the string returns 1; otherwise, it returns 0. $(eq, val1, val2) The following expression gets the name of the current layer; if the name matches the string value stored in the USERS1 (USERS1-5) system variable, it returns 1. Assume the string "PART12" is stored in USERS1 and the current layer is the same. Note: The USERS1-5 system variables are not available in AutoCAD LT. $(eq, $(getvar, users1), $(getvar, clayer)) It returns the following: 1 Eval Passes the string str to the DIESEL evaluator and returns the result of evaluating it. $(eval, str) fix Truncates the real number value to an integer by discarding any fractional part. $(fix, value) Getenv Returns the value of the environment variable varname . $(getenv, varname) If no variable with that name is defined, it returns the null string. Getvar Returns the value of the system variable with the given varname . $(getvar, varname) if Conditionally evaluates expressions. $(if, expr, dotrue [, dofalse]) If expr is nonzero, it evaluates and returns dotrue . Otherwise, it evaluates and returns dofalse . Note that the branch not chosen by expr is not evaluated. Index Returns the specified member of a comma-delimited string. $(index, which, string) Assumes that the string argument contains one or more values delimited by the macro argument separator character, the comma. The which argument selects one of these values to be extracted, with the first item numbered 0. This function is most frequently used to extract X, Y, or Z coordinate values from point coordinates returned by $(getvar). Applications can use this function to retrieve values stored as comma-delimited strings from the USERS1-5 system variables. Note: The USERS1-5 system variables are not available in AutoCAD LT. nth Evaluates and returns the argument selected by which . $(nth, which, arg0 [, arg1,…, arg7]) If which is 0, nth returns arg0 , and so on. Note the difference between $(nth) and $(index) ; $(nth) returns one of a series of arguments to the function, while $(index) extracts a value from a comma-delimited string passed as a single argument. Arguments not selected by which are not evaluated. or Returns the bitwise logical OR of the integers val1 through val9 . $(or, val1 [, val2,…, val9]) Rtos Returns the real value in the format and precision specified. $(rtos, value [, mode, precision]) Edits the given value as a real number in the format specified by mode and precision. If mode and precision are omitted, it uses the current values selected with the UNITS command. Strlen Returns the length of string in characters. $(strlen, string) Substr Returns the substring of string , starting at character start and extending for length characters. $(substr, string, start [, length]) Characters in the string are numbered from 1. If length is omitted, it returns the entire remaining length of the string. Upper Returns the string converted to uppercase according to the rules of the current locale. $(upper, string) xor Returns the bitwise logical XOR of the integers val1 through val9 . $(xor, val1 [, val2,…, val9]) Je ne vois rien qui puisse "lire" les saisies relatives au clavier, souris, etc... En LISP tu as bien entendu la fonction (grread) qui permet cela, mais c'est du LISP donc non fonctionnel sur les versions LT par exemple. grread (AutoLISP) Reads values from any of the AutoCAD input devices Supported Platforms: Windows and Mac OS Signature (grread [track] [allkeys [curtype]]) track Type: T or nil If supplied and not nil, this argument enables the return of coordinates from a pointing device as it is moved. allkeys Type: Integer Code that tells grread what functions to perform. The allkeys bit code values can be added together for combined functionality. The following values can be specified: 1(bit 0) -- Return drag mode coordinates. If this bit is set and the user moves the pointing device instead of selecting a button or pressing a key, grread returns a list where the first member is a type 5 and the second member is the (X,Y) coordinates of the current pointing device (mouse or digitizer) location. This is how AutoCAD implements dragging. 2 (bit 1) -- Return all key values, including function and cursor key codes, and do not move the cursor when the user presses a cursor key. 4 (bit 2) -- Use the value passed in the curtype argument to control the cursor display. 8 (bit 3) -- Do not display the error: console break message when the user presses Esc. curtype An integer indicating the type of cursor to be displayed. The allkeys value for bit 2 must be set for the curtype values to take effect. The curtype argument affects only the cursor type during the current grreadfunction call. You can specify one of the following values for curtype: 0 -- Display the normal crosshairs. 1 -- Do not display a cursor (no crosshairs). 2 -- Display the object-selection “target” cursor. Return Values Type: List The grread function returns a list whose first element is a code specifying the type of input. The second element of the list is either an integer or a point, depending on the type of input. The return values are listed in the following table: grread return values First element Second element Value Type of input Value Description 2 Keyboard input varies Character code 3 Selected point 3D point Point coordinates 4 Screen/pull-down menu item (from pointing device) 0 to 999 1001 to 1999 2001 to 2999 3001 to 3999 … and so on, to 16001 to 16999 Screen menu box no. POP1 menu box no. POP2 menu box no. POP3 menu box no. ... and so on, to POP16 menu box no. 5 Pointing device (returned only if tracking is enabled) 3D point Drag mode coordinate 6 BUTTONS menu item 0 to 999 1000 to 1999 2000 to 2999 3000 to 3999 BUTTONS1 menu button no. BUTTONS2 menu button no. BUTTONS3 menu button no. BUTTONS4 menu button no. 7 TABLET1 menu item 0 to 32767 Digitized box no. 8 TABLET2 menu item 0 to 32767 Digitized box no. 9 TABLET3 menu item 0 to 32767 Digitized box no. 10 TABLET4 menu item 0 to 32767 Digitized box no. 11 AUX menu item 0 to 999 1000 to 1999 2000 to 2999 3000 to 3999 AUX1 menu button no. AUX2 menu button no. AUX3 menu button no. AUX4 menu button no. Note: SHORTCUTMENU must be set to a value of 0. 12 Pointer button (follows a type 6 or type 11 return) 3D point Point coordinates 25 Pointer secondary button 0 or greater Screen coordinate value along the X axis Note: SHORTCUTMENU must be set to a value greater than 0. Remarks Only specialized AutoLISP routines need this function. Most input to AutoLISP should be obtained through the various getXXX functions. Entering Esc while a grread is active aborts the AutoLISP program with a keyboard break (unless the allkeys argument has disallowed this). Any other input is passed directly to grread, giving the application complete control over the input devices. If the user presses the pointer button within a screen menu or pull-down menu box, grread returns a type 6 or type 11 code, but in a subsequent call, it does not return a type 12 code: the type 12 code follows type 6 or type 11 only when the pointer button is pressed while it is in the drawing area. It is important to clear the code 12 data from the buffer before attempting another operation with a pointer button or an auxiliary button. To accomplish this, perform a nested grread like this: (setq code_12 (grread (setq code (grread)))) This sequence captures the value of the code 12 list as streaming input from the device. Donc pour répondre à ta question, je dirais que non, il faudrait forcément passer par du LISP (ou autre langage permettant d'accéder au device input). PS : Bon sang ce que j'aime cette mise à jour de CADxp, on peut copier/coller l'aide AutoCAD directement dans le message, avec le formatage qui suit ♥w♥. Bisous, Luna -
Peut-on créer sa propre variable Autocad?
Luna a répondu à un(e) sujet de rrobert dans AutoCAD 2020-2024
Coucou, Je ne sais pas si cela peut t'aider mais...il y a la variable MODEMACRO (permet d'afficher une chaîne de caractère dans la ligne d'état, en bas à droite) et si besoin, les expressions DIESEL fonctionnent également. Donc je pense que tu peux simplement enregistrer la valeur numérique de ton espacement dans cette variable (et elle sera affichée donc tu peux facilement savoir qu'elle valeur elle a) et récupérer la valeur de la variable dans ta macro :3 Mais en effet LeCrabe a la solution idéale xD Bisous, Luna
