-
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
-
Coucou, Je pense que la première idée d'utiliser la commande NETTOYER peut également être un bon fonctionnement. Un objet NETTOYER permet de cacher l'ensemble du dessin situé en-dessous de ce dernier. Cependant, il est lui-même régit par les propriétés d'arrière-plan/premier plan donc il est possible de créer l'objet NETTOYER et de le placer sur un plan situé entre le plan de la première fenêtre et le plan de la seconde. Permettant ainsi de cacher les objets de la première fenêtre mais de conserver l'affichage de la seconde 🙂 Une fois qu'on a bien compris le fonctionnement de cette commande, cela permet de simplifier grandement les gestions d'arrière-plan et de premier plan dans un dessin, ou même lorsqu'on veut dessiner des objets qui se superposent, il suffit de dessiner les objets se chevauchant et de gérer les notions d'arrière-plan/premier plan via des objets NETTOYER. Bisous, Luna
-
Coucou, Pour ton cas, tu peux utiliser une variable globale afin de conserver la valeur précédente dans un même dessin. Je te propose ceci, tu as une commande supplémentaire (actuellement nommé setA mais tu peux la renommer comme tu veux) pour modifier la valeur de la variable *a*. Si tu lances une commande sans définir *a*, il te faudra spécifier la valeur à la première utilisation, sinon cela prendra la valeur enregistrée. Donc si tu veux changer ta variable, tu as juste à relancer la commande setA et cela modifiera la valeur pour toutes les autres commandes :3 (defun setA (*a*) (if *a* *a* (progn (initget 7 "100") (setq *a* (getdist "\nSpécifier la distance de déplacement [100] :")) ) ) ) (defun c:SetA () (initget 7 "100") (setq *a* (getdist "\nSpécifier la distance de déplacement [100] :")) ) (defun c:C+ (/ ss) (if (or (setq ss (ssget "_I")) (setq ss (ssget)) ) (command-s "_.copy" ss "" "_Displacement" (list 0. (setA *a*))) ) (princ) ) (defun c:C- (/ ss) (if (or (setq ss (ssget "_I")) (setq ss (ssget)) ) (command-s "_.copy" ss "" "_Displacement" (list 0. (- (setA *a*)))) ) (princ) ) (defun c:D+ (/ ss) (if (or (setq ss (ssget "_I")) (setq ss (ssget)) ) (command-s "_.move" ss "" "_Displacement" (list 0. (setA *a*))) ) (princ) ) (defun c:D- (/ ss) (if (or (setq ss (ssget "_I")) (setq ss (ssget)) ) (command-s "_.move" ss "" "_Displacement" (list 0. (- (setA *a*)))) ) (princ) ) (defun c:+ () ;; Se déplace à 100 de+ (command "-pan" "0,0,0" (strcat "0," (rtos (- (setA *a*))) ",0")) (princ) ) (defun c:- () ;; Se déplace à 100 de- (command "-pan" "0,0,0" (strcat "0," (rtos (setA *a*)) ",0")) (princ) ) En espérant que cela corresponde à ton besoin ! PS : Fais tout de même attention avec les variables globales car cela peut très vite semer le chaos si plusieurs programmes utilisent des variables ayant la même dénomination mais une utilité différente. C'est pour cela qu'il est toujours préférable de travailler avec des variables locales et pour les rares fois où une variable globale est nécessaire (dans ton cas par exemple), il est fortement conseillé de nommer cette variable avec des caractères spéciaux pour la différencier des autres variables et ainsi éviter une confusion dans la programmation ! Bisous, Luna
-
Coucou, Tu peux déjà essayer de regarder du côté de la fonction (vl-file-systime) afin d'obtenir la date de la dernière modification. Autrement, pourquoi passer par AutoCAD pour récupérer ces infos ? Ne serait-il pas plus simple d'utiliser un script Windows pour récupérer des données Windows ? ^^" Bisous, Luna
-
Coucou @didier, C'est justement les routines simples et répétitives qui sont les plus utiles au quotidien ! Et c'est justement parce qu'en retrouvant le post d'origine j'ai vu que ta routine n'avait pas reçu les éloges adéquats alors j'ai préféré prendre la peine de te donner un avis positif (parce qu'on le veuille ou non, chat fait toujours plaisir les retours positifs !) 😉 Bisous, Luna
-
Bloc qui bouge en fonction d'une étiquette
Luna a répondu à un(e) sujet de Elo dans AutoCAD 2020-2024
Coucou, Il est tout à fait faisable de modifier les étiquettes à partir des propriétés dynamiques d'un bloc (via un champ dynamique) mais l'inverse n'est pas possible à ma connaissance... Pourquoi dois-tu obligatoirement modifier les étiquettes en premier au lieu des blocs ? Bisous, Luna -
Coucou, J'ai déjà évoqué ce problème dans mon message précédent. J'ai cependant dit des bêtises ^^" En effet si tu as plusieurs références de blocs qui doivent avoir la même valeur d'attributs, il faut cliquer sur la table de propriétés (dans la palette des propriétés) (cf. la ligne surlignée ci-dessous). Cela va ouvrir la table des propriétés et il suffit de cliquer sur la valeur désirée et de dire "OK" pour que tous les attributs se mettent à jour avec la nouvelle valeur. Donc il est tout à fait possible de modifier plusieurs blocs d'un coup directement depuis la palette des propriétés 😉 Il faut simplement faire attention au nom des tables de propriétés de bloc si jamais tu veux avoir un même table de propriétés entre deux définitions de bloc, bien penser à mettre le même nom ! Bisous, Luna
-
Coucou, Pour ce faire j'utilise la routine de LeeMac perso (je ne connaissais pas les routines de (gile) et patrick_35) : http://www.lee-mac.com/changeblockinsertion.html Et j'utilise la commande CBPR. Je n'ai pas eu de soucis jusqu'à présent ! Bisous, Luna
-
Mise à jour d'échelle de blocs dynamiques
Luna a répondu à un(e) sujet de Kilian336 dans Débuter en LISP
Coucou, Les échelles de référence de bloc sont grisées (Y et Z, sauf X) lorsqu'à la création du bloc l'option "Echelle uniforme" est cochée. Je pense que c'est une option qu'il est préférable d'éviter de cocher. La petite particularité c'est qu'en échelle uniforme, un utilisateur lambda ne peut pas modifier les échelles séparément (l'échelle X = Y = Z) mais si on passe par la programmation, il est tout à fait possible de modifier les échelles séparément...Un vrai mystère pour moi ^^" Bisous, Luna -
Coucou, Personnellement je ne travaille pas avec UCSFOLLOW car j'utilise très régulièrement la routine de @didier (merci à toi btw, cette routine est géniale !) (defun c:RP2 (/ h ce) (setvar "CMDECHO" 0) (setq h (getvar "VIEWSIZE")) (setq ce (trans (getvar "VIEWCTR") 1 0)) (command "_PLAN" "") (command "_ZOOM" "C" (trans ce 0 1) h) (princ) ) Honnêtement je trouve l'utilisation d'UCSFOLLOW extrêmement énervante et frustrante car elle manque de logique. AutoCAD ferait mieux de copier le fonctionnement de RP2 pour UCSFOLLOW = 1 car cela ferait bien plus de sens à mes yeux. Donc pour utiliser cette commande il faut bien sûr avoir UCSFOLLOW = 0 et lorsque tu changes de SCU tu cliques/tapes la commande pour conserver ton état de zoom actuel pour "pivoter" le dessin. Bisous, Luna
-
@lalau, En plus de ma réponse ci-dessus, tu peux également créer une visibilité à la place de ton attribut (uniquement dans le cas où tu n'as qu'un seul attribut qui doit correspondre à une liste de valeurs prédéfinies !). L'avantage de la visibilité c'est que tu peux sélectionner plusieurs blocs d'un coup et modifier la visibilité en une seule fois, contrairement aux tables de propriétés (uniquement accessible en cliquant sur la petite flèche, mais tu peux avoir plusieurs tables de propriétés par bloc !) où il faut modifier les blocs un à un. Donc en fonction de tes besoins et de la vitesse d'exécution que tu recherches, tu as plusieurs options. 😉 Si jamais tu as des questions n'hésites pas ! Bisous, Luna
-
Coucou, Donc si je comprends bien tu ne veux pas remplir en automatique un ensemble de blocs avec attributs à partir d'un fichier Excel. Ce que tu veux c'est de pouvoir limiter la valeur d'un attribut à certaines chaînes de caractères ? Si c'est bien cela, il faut créer un table des propriétés de bloc me semble-t-il. Depuis l'éditeur de bloc, tu as dans l'onglet "Actions" la commande "Table des propriétés de bloc". Cela va créer un paramètre (similaire à une poignée de visibilité de bloc) et tu auras un tableau dans lequel tu peux ajouter une colonne correspondant à ton attribut. Tu spécifie la liste de valeurs et tu coches l'option "Les propriétés du bloc doivent correspondre à une rangée de la table" (en bas à gauche). J'espère que cela correspond à ta demande 🙂 Autrement il faudra expliquer plus clairement avec un fichier d'exemple. Bisous, Luna
-
Merci @didier ! Je vais étudier cela 😉 Ce que je comprends moins c'est que je n'ai pas souvenir d'avoir vu trainer une communication concernant une éventuelle update de cette commande donc je ne sais plus si c'est AutoCAD qui déconne, mon programme ou mon cerveau...(voire les 3 !) Bisous, Luna
-
nom de mail de pub dans la liste d'une regle prédéfinie
Luna a répondu à un(e) sujet de PHILPHIL dans Programmer en s'amusant
Soka ! *retourne dans sa grotte, ne maîtrisant que le LISP...mais se demande quand même s'il n'est vraiment pas possible de créer un programme pour Outlook en LISP...* Bisous, Luna -
nom de mail de pub dans la liste d'une regle prédéfinie
Luna a répondu à un(e) sujet de PHILPHIL dans Programmer en s'amusant
Coucou, Cela ne peut-il pas convenir ? Il suffit de créer une règle dont le filtre est basé sur "avec des mots spécifiques dans l'adresse de l'expéditeur" et de l'envoyer soit dans un dossier précis, soit de le supprimer (il suffit d'accéder aux "Options avancées..." de la fenêtre "Créer une règle"). Après bah c'est une règle de traitement des messages donc dès qu'un courrier arrivera dans ta boîte mail dont le nom de l'expéditeur contient "menustreetanalys" il sera déplacé/supprimé. En revanche je ne connais aucun moyen de filtrer 100% des mails publicitaires en définissant la règle qu'une seul fois car l'expéditeur va forcément varier...Donc je dirais que même avec de la programmation, tu devras de toutes façons définir à un moment ou un autre si un expéditeur est considérer comme pub ou nan. Bisous, Luna -
Coucou @didier, Je peux en effet fournir le bout de code problématique ^^" J'avais ce fonctionnement-ci (pour m'éviter de relancer 200 fois la commande à chaque calque) : ... (commmand "_-LAYDEL") (foreach layer layerlist (command "_Name" layer) ) (command "" "_Y") ... Avec 'layerlist' une liste composée du nom des calques devant être supprimés. Honnêtement je n'ai pas compris pourquoi cette commande-ci ne fonctionne pas comme les autres, c'est-à-dire qu'il suffit de concaténer le nom des calques avec une virgule en guise de séparateur... Le fonctionnement de cette commande est supposée être comme suit : Commande: _-LAYDEL Sélectionnez un objet du calque à supprimer ou [Nommer]: n Entrez le nom du calque ou [?]: Calque1 Calques sélectionnés: Calque1. Sélectionnez un objet du calque à supprimer ou [Nommer/annUler]: n Entrez le nom du calque ou [?]: Calque2 Calques sélectionnés: Calque1,Calque2. Sélectionnez un objet du calque à supprimer ou [Nommer/annUler]: n Entrez le nom du calque ou [?]: Calque3 Calques sélectionnés: Calque1,Calque2,Calque3. Sélectionnez un objet du calque à supprimer ou [Nommer/annUler]: ******** AVERTISSEMENT ******** Vous êtes sur le point de supprimer les calques suivants de ce dessin. Calque1 Calque2 Calque3 Voulez-vous continuer? [Oui/Non] <Non>: o Suppression du calque "Calque1". Suppression du calque "Calque2". Suppression du calque "Calque3". 3 calques supprimés. Et je vais vraiment commencer à me nerver parce que ce c** de totoCAD a décidé qu'aujourd'hui la commande fonctionne sur 2022 !!! Grrrrr (alors que la semaine dernière et ce matin nan, et les collègues ont le même soucis) Bon je vais voir ce que je vais faire pour faire en sorte de supporter les erreurs randoms de totoCAD. Pour le contexte, le programme a pour but de créer des fichiers purgés pour pouvoir transmettre les .dwg aux sous-traitants. Donc comme les sous-traitants ne traitent qu'un ensemble de lots précis, la purge des plans correspond finalement à un état de calque défini dans les fenêtres de présentation. Donc je récupère la liste des calques gelés dans une fenêtre et je supprime tous les calques de cette liste. Voili voilou 🙂 Bisous, Luna
-
Encartage - mettre au premier plan un objet dans toutes les présentations
Luna a répondu à un(e) sujet de yann69690 dans LISP et Visual LISP
Coucou, Ah bah @didier a été plus rapide ^^" Mais vui, "EP" et "EO" font simplement référence aux alias des commandes AutoCAD "ESPACEP" et "ESPACEO" (ou "_PSPACE" et "_MSPACE" en anglais). Donc à force d'utiliser ces alias, ils sont rentrés dans le langage courant de tout bon Autocadien qui se respecte 😜 Du coup comme le suggère @lecrabe, mettre un élément sur l'EP le rendra forcément au premier plan étant donné que l'EO est en arrière-plan par rapport à l'EP. Par contre si tu changes l'échelle ou que tu déplaces ton EO, tes objets en EP eux ne bougeront pas... Perso j'utilise simplement l'option "Ordre de tracé" dispo via le clic droit après avoir sélectionner les objets pour modifier l'ordre de tracé et remettre au premier-plan ou en arrière-plan les objets en ayant besoin. Cela aura forcément un impact sur toutes tes présentations étant donné que tu ferais cela depuis l'EO 🙂 Je ne pense pas que de la programmation soit nécessaire pour cela, à moins que je n'ai pas compris ta demande. Bisous, Luna- 20 réponses
-
- encartage
- premier plan
-
(et 2 en plus)
Étiqueté avec :
-
Coucou, Nan je n'ai pas de noms de calques bizarres et mon programme défini le calque courant sur "0" et déverrouille tous les calques..De plus j'ai demandé à mes collègues de tester et le problème est régulier pour les versions 2022. Donc je vais voir si je n'ai pas un moyen de corriger l'utilisation de cette commande pour les versions 2022 mais vu qu'elle semble buggée même en naturelle je pense que je prendrais moins de risque de développer ma propre version de cette commande... Merci pour votre aide en tout cas ! Bisous, Luna
-
Références des plans et mise à jour de block
Luna a répondu à un(e) sujet de Hydro8 dans Débuter en LISP
Coucou, Il est possible de récupérer la date actuelle via la variable système "CDATE". Je me suis créé une fonction pour la récupérer de manière plus lisible : ; Permet de récupérer la date et l'heure au moment de l'exécution sous la forme "XX/XX/XXXX - XX:XX:XX" : ; La fonction (get-date) ne possède aucun argument ;--- Renvoie la date et l'heure sous la forme "JJ/MM/AAAA - HH:MM:SS" (defun Get-Date (/ Date Jour Heure) (setq Date (rtos (getvar "CDATE") 2 6) Jour (strcat (substr Date 7 2) "/" (substr Date 5 2) "/" (substr Date 1 4)) Heure (strcat (substr Date 10 2) ":" (substr Date 12 2) ":" (substr Date 14 2)) Date (strcat Jour " - " Heure) ) ) Ensuite la date est-elle située dans un bloc avec attribut, ou bien dans un texte ? Si c'est un bloc, il suffit de sélectionner tes blocs sur l'ensemble des présentations via un (ssget) filtré (faire attention si ton bloc est dynamique ou non !) pour ensuite modifier l'attribut avec la valeur (substr (get-date) 1 10) En revanche si c'est dans un texte, c'est plus délicat (faisable mais délicat).. Par contre je ne comprends pas dans quelle mesure les plans n'ayant pas changé d'indice ont-ils besoin de changer de date ? Théoriquement seul les plans que l'on imprime ont besoin de changer de date, nan ? Du moins dans mon fonctionnement de travail je ne modifie la date des cartouches que si je dois les imprimer (donc changement d'indice) car comme cela, les plans ayant été imprimé plus tôt et qui sont toujours bon à la date d'aujourd'hui conservent leur date d'impression réelle... Autrement si tu as vraiment la même date dans tous tes plans et qu'elle doit correspondre à la date actuelle, tu peux utiliser un champ dynamique (fonctionne aussi bien dans un texte que dans un attribut) avec la catégorie du champ "Date et heure", tu choisis "Date", et le format de la date qui te convient et du coup ton champ affichera obligatoirement la date d'aujourd'hui. Bisous, Luna -
Coucou, J'ai développé il y a quelques temps un programme LISP qui utilise la commande -SUPCALQUE (équivalent à SUPCALQUE mais sans la boîte de dialogue) et qui fonctionne parfaitement bien sur les versions 2019 d'AutoCAD. Depuis quelques temps (je ne sais pas encore si le problème provient de ma version d'AutoCAD 2022 ou bien d'une variable système), cette commande ne fonctionne plus. Globalement j'ai une liste de calques à supprimer donc mon programme lance la commande -SUPCALQUE, puis utilise l'option "Nommer", "NomDuCalque" en boucle pour donner la liste des calques puis je valide mon choix et hop tous mes calques sont supprimés. Ici rien... Du coup j'ai regardé le fonctionnement de la commande seule et cette fois-ci, je lance la commande, j'utilise l'option "Nommer", "NomDuCalque" et hop la commande prend fin et le calque n'est pas supprimé (tout comme les objets situés sur ce calque). Donc j'ai voulu tester la commande SUPCALQUE afin de vérifier si le bug persiste et lorsque je sélectionne le même calque dans la boîte de dialogue, j'obtiens un message d'erreur AutoCAD me disant "ObjectEnil" (autrement dit que le calque sélectionné n'existe pas) mais le calque existe bel et bien ! Les RGT, fermer/ouvrir AutoCAD, etc ne résolvent pas le soucis. Donc ma question c'est : avez-vous un problème similaire avec cette commande (si jamais il y a des utilisateurs de cette commande) et avec quelle version d'AutoCAD ? Car je préfère être sûre que cela ne fonctionne pas pour cause d'AutoCAD foireux avant de devoir programmer ma propre commande -SUPCALQUE (ce qui sera forcément plus long que la commande native)... Merci d'avance ! Luna
-
Coucou, Dans les autres trucs rigolos c'est lorsqu'on a 2 écrans et que TotoCAD a "un peu" de mal avec la gestion des deux écrans (ou qu'on se retrouve à n'avoir qu'un seul écran), du coup il ouvre ses petites boîtes de dialogues sur un écran imaginaire !! Dans le genre relou c'était pas mal aussi mais après quelques recherche j'ai découvert ALT+SPACE et c'est fabuleux !! Si tu sais qu'une fenêtre est ouverte mais pas sur le bon écran, tu fais ALT+SPACE, flèche du bas et ENTER (pour sélectionner l'option 'DEPLACER') et pouf, la fenêtre est ré-apparue sous le curseur de la souris ! Bref quand on trouve une solution à un problème de merde, bah chat fais du bien ! 🙂 Bisous, Luna
-
Coucou, En lisp j'ai ce programme-ci : (defun vla-collection->list (doc col flag / lst item i) (if (null (vl-catch-all-error-p (setq i 0 col (vl-catch-all-apply 'vlax-get (list (if doc doc (vla-get-activedocument (vlax-get-acad-object))) col))))) (vlax-for item col (setq lst (cons (cons (if (vlax-property-available-p item 'Name) (vla-get-name item) (strcat "Unnamed_" (itoa (setq i (1+ i)))) ) (cond ((= flag 0) (vlax-vla-object->ename item) ) (t item ) ) ) lst ) ) ) ) (reverse lst) ) Donc pour récupérer la liste des types de lignes du dessin actif par exemple, cela s'écrit (vla-collection->list nil 'linetypes 0) ou (vla-collection->list nil 'linetypes 1) L'argument flag est défini ainsi : flag = 0 > Pour chaque paire pointée, la 'key' correspond à la chaîne de caractère correspondant au nom de l'objet (ex. : "Continuous") et la 'value' correspond à l'ename de l'entité (pouvant être obtenu via (tblobjname) par exemple) (ex. : <Nom d'entité: 3b058960>) flag = 1 > Pour chaque paire pointée, la 'key' correspond à la chaîne de caractère correspondant au nom de l'objet (ex. : "Continuous") et la 'value' correspond au VLA-Object de l'entité (ex. : #<VLA-OBJECT IAcadLineType 000001b08be9e4d8>) Donc par exemple : (vla-collection->list nil 'linetypes 0) ;; renvoie (("ByBlock" . <Nom d'entité: 1b8fef76940>) ("ByLayer" . <Nom d'entité: 1b8fef76950>) ("Continuous" . <Nom d'entité: 1b8fef76960>)) ;; et (vla-collection->list nil 'linetypes 1) ;; renvoie (("ByBlock" . #<VLA-OBJECT IAcadLineType 000001b0e08b3328>) ("ByLayer" . #<VLA-OBJECT IAcadLineType 000001b0e08b3568>) ("Continuous" . #<VLA-OBJECT IAcadLineType 000001b0e08b3688>)) Donc comme le programme utilise globalement le Visual LISP pour récupérer ces informations, cela devrait te donner les pistes suffisantes pour y parvenir en VBA 😉 La propriété 'Name' à partir de la collection 'linetypes que tu as déjà parcouru en soit. Bisous, Luna
-
2 blocs différents / 1 seul attribut à changer
Luna a répondu à un(e) sujet de robine dans AutoCAD 2018
Coucou, Si j'ai bien saisi la demande, je pense qu'il est possible d'utiliser des champs dynamiques qui pointe vers les attributs du cartouche. La seule problématique étant la sélection des objets n'appartenant pas au même espace, or ici il me semble que ton cartouche et tes bandeaux ne sont pas sur les mêmes présentations... Pour se faire il est également possible de créer le bandeau dans la même présentation que le cartouche et de le bouger ensuite 😜 Pour la création des champs dynamiques il suffit de choisir le champs "Objet", de sélectionner l'objet (via "Type d'objet") puis de sélectionner l'étiquette d'attribut désirée dans la liste des propriétés (dans le cas d'une référence de bloc, les attributs apparaissent dans la liste des propriétés) 🙂 Mais évidemment la solution proposée par LeCrabe fonctionne également très bien mais il ne me semble pas que les données personnalisée du dessin soient exportables entre deux dessins de manière vanilla (en programmation cela devrait être faisable mais @lecrabe sera plus à-même de trouver un programme existant faisant cela que moi). En revanche il est possible de définir les propriétés de dessins directement dans un gabarit et ainsi tous les dessins créés à partir de ce gabarit auront déjà les propriétés et les champs dynamiques définis (il ne restera donc plus qu'à donner la bonne valeur aux propriétés personnalisées !) 🙂 Bisous, Luna -
Coucou, Pourquoi ne pas utiliser les barres d'outils dans ce cas ? Bisous, Luna
-
Coucou, N'y a-t-il pas moyen d'utiliser la variable système LASTPOINT dans un script (en créant un point temporaire à l'emplacement souhaité via la commande POINT, puis le supprimer et ainsi la variable LASTPOINT aura la position du point créé) ? C'est plus du DIESEL peut-être...^^" Bisous, Luna
-
Il n'y a pas de mise en surbrillance lors d'un filtre ! Cette mise en surbrillance n'est valable que si l'utilisateur doit sélectionner des objets à la mano, auquel cas, seuls les objets dont leur propriétés correspondent au filtre sont mis en surbrillance. Mais si l'on fait une sélection globale, on traite les objets sans surbrillance (à moins qu'on ne veuille afficher l'aperçu du jeu de sélection à la fin) donc c'est beaucoup plus rapide de traiter 2000 objets filtrés plutôt 10 000 objets que l'on filtre ensuite dans une boucle ;3 Bisous, Luna
