-
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
-
Detection portrait/paysage dans presentation.
Luna a répondu à un(e) sujet de phil 54 dans Débuter en LISP
Coucou, La fonction (LM:ssboundingbox) répond mot pour mot à ta demande Mais question n°1 : as-tu la moindre connaissance en LISP ? Si oui alors l'argument de cette fonction est un jeu de sélection, sinon cela va être plus délicat de te donner des pistes de recherches et il serait alors plus rapide de te fournir des programmes tout fait... Ensuite je rebondis sur ce que tu dis Dans ce cas-ci, comment espères-tu déterminer si la présentation est en paysage ou en portrait ? N'est-ce pas le traceur qui détermine cette info ? Si ce n'est pas le cas à chaque fois, alors concentre toi sur ma première piste de recherche (sélection des entités de la présentation et détermination des coins inférieurs gauche et supérieur droit du contour rectangulaire de ton jeu de sélection), sinon l'autre méthode est aussi faisable (mais il s'agit de DEUX méthodes DIFFERENTES !!) Bisous, Luna -
@didier, J'allais poster un code rapide mais je vois que tu as été plus efficace xD Je sais que la demande est récurrente mais il ne faudrait pas non plus que les nouveaux utilisateurs d'AutoCAD prennent l'habitude de quémander un programme LISP sans apprendre à maîtriser dans un premier temps l'outil de base qu'est AutoCAD... C'est pour cela que j'ai insisté sur l'extraction de données, car cela devrait finalement être la première réponse même si la programmation le permet ! Un fois le fichier .dxe créé pour un type d'extraction, il suffit d'utiliser toujours ce même fichier et l'extraction de données ne prend pas trop longtemps à se faire (certes cela peut être un chouilla plus long que par un programme spécifique à ce problème mais bon)... Parce qu'après on se retrouve à devoir pondre des variantes pour chaque utilisateurs parce que le programme est trop spécifique... Mais peut-être que je suis simplement fatiguée ^^" Bisous, Luna
-
Alors, Le fichier de gabarit c'est toi qui le créer justement en faisant une extraction de donnée. Donc la première fois, tu n'auras pas de fichier .dxe donc tu fais juste "Créer un fichier" et tu places ton nouveau fichier .dxe à un emplacement défini avec un nom défini. Les fois d'après, il te suffira de sélectionner ce fichier pour réaliser tes extractions de données Excel concernant les hachures 🙂 Ensuite, tu sélectionnes tes objets (je te suggère d'isoler tes objets HACHURE pour éviter de sélectionner autre chose, ou d'utiliser la commande 'FILTRE, avec l'apostrophe pour l'appeler en transparence) puis tu fais Suivant. Ensuite tu choisis le type d'objets que tu veux (donc si jamais tu n'as pas filtrer ta sélection, tu peux le faire à ce moment là) et ensuite tu définis les propriétés que tu désires. Donc pour toi, c'est le calque et la surface. Enfin, tu choisis le format de ton tableau, si tu veux grouper les objets identiques, etc... puis tu choisis d'extraire dans un fichier externe... Bref, utilise l'aide AutoCAD concernant cet outils !! Bisous, Luna
-
Je maintiens mon idée concernant l'extraction de données honnêtement... Il est évidemment possible de faire cela par programmation, mais bon...Autant chercher l'existant et si chat n'existe pas, alors on passe par de la programmation >n< Bisous, Luna
-
Coucou, Qu'est-ce qu'un "listing des hachures d'un DWG" ?!! Je suggère un simple SELECTSIMILAR avec uniquement la propriété "Nom" dans les paramètres de la commande pour sélectionner toutes tes hachures de ton espace Objet. Puis tu fais une extraction des données (en suivant l'assistant d'extraction de données) pour extraire les colonnes dont tu as besoin (Calque, Couleur, Surface, ...) et cela va te créer un fichier .csv ou .xls... Sinon, il va falloir être un peu plus précis dans la demande pour comprendre s'il y a besoin de plus ou non... Bisous, Luna
-
Detection portrait/paysage dans presentation.
Luna a répondu à un(e) sujet de phil 54 dans Débuter en LISP
Coucou, Pour rejoindre les propositions de didier, je te suggère la fonction (LM:ssboundingbox) de LeeMac >>ici<< en lien avec ton souhait de récupérer le contour de tes objets sur chaque présentation pour récupérer la diagonale et l'exploiter. Cela retourne les coordonnées de la diagonale (en bas à gauche et en haut à droite dans mes souvenirs) à partir d'un jeu de sélection. Tu peux également essayer de traiter la propriété CanonicalMediaName, obtenue via (vlax-get VLA-OBJECT 'CanonicalMediaName) avec VLA-OBJECT correspondant au nom d'entité VLISP de ta présentation que tu peux obtenir avec (vlax-for layout (vla-get-Layouts (vla-get-ActiveDocument (vlax-get-acad-object))) (setq lst (cons (cons (vla-get-Name layout) layout) lst)) ) (reverse lst) Avec la ligne (vlax-for) ci-dessus tu vas obtenir un truc du genre (("Model" . #<VLA-OBJECT IAcadLayout 0000024e41f79ff8>) ("Présentation1" . #<VLA-OBJECT IAcadLayout 0000024e41f7a088>) ("Présentation2" . #<VLA-OBJECT IAcadLayout 0000024e41f78cd8>)) Donc il s'agit d'une liste d'association où tu peux aller récupérer le VLA-OBJECT de ta présentation en recherchant son nom (via les fonctions (cdr) et (assoc) ). La ligne juste au dessus, permet d'obtenir ceci par exemple : "ISO_full_bleed_A4_(297.00_x_210.00_MM)" Ainsi (si le nom des formats d'impression sont bien faits) tu peux récupérer les valeurs entre parenthèses pour connaître ton format de papier car c'est toujours la longueur horizontale x verticale 🙂 Bisous, Luna -
Generer les contours de hachures automatiquement dans le calque des hachures
Luna a répondu à un(e) sujet de JVC dans AutoCAD 2020-2024
Alors... Comme je l'ai dit...Mon programme nécessite la sélection d'une seule et unique entité en premier lieu afin de récupérer le nom du calque (parce que le programme a besoin du nom du calque pour l'affecter aux contours qui devront être créés !!). Et ensuite, tu peux sélectionner TOUTES les hachures qui appartiennent à ce calque (pas juste une seule !!). De plus, la seconde sélection est filtrée, donc tu peux y aller en mode gros bourrin et sélectionner tous tes objets de ton dessin, seul les hachures qui sont sur le calque que tu as spécifié juste avant seront sélectionnées !! Donc grosso merdo l'idée c'est tu cliques une première fois sur 1 hachure que tu veux traiter, puis tu sélectionnes ton dessin entier 😉 Et ensuite, chat aussi je l'ai dit...mon programme n'est qu'un simple résumé de ce que j'ai dit précédemment par rapport à la commande HATCHGENERATEBOUNDARY, c'est-à-dire que les nouveaux contours restent sélectionnés à la fin donc il suffit juste de modifier le calque une seule fois pour le jeu de sélection... Bisous, Luna -
Generer les contours de hachures automatiquement dans le calque des hachures
Luna a répondu à un(e) sujet de JVC dans AutoCAD 2020-2024
La commande HATCHGENERATEBOUNDARY garde en sélection l'ensemble des contours nouvellement créés... As-tu bien essayé tout ce que j'ai proposé ? Quel est le soucis précisément ? Bisous, Luna -
Generer les contours de hachures automatiquement dans le calque des hachures
Luna a répondu à un(e) sujet de JVC dans AutoCAD 2020-2024
Coucou, Pourquoi ne pas simplement faire un SELECTSIMILAR sur les hachures (avec au minimum les paramètres de "Calque" et "Nom d'objet" cochés), puis de lancer la commande HATCHGENERATEBOUNDARY en ligne de commande ce qui va générer un contour pour chacune des hachures sélectionnées (PICKFIRST=1 évidemment !) et les conserver dans le jeu de sélection courant. Il suffit donc ensuite de modifier le calque associé pour ces nouveaux objets via la palette des propriétés 🙂 Sinon on peut résumer cela avec ce petit LISP : (defun c:HGBL (/ layer jsel) (and (setq layer (cdr (assoc 8 (entget (car (entsel "\nSélectionner un objet du calque souhaité : ")))))) (setq jsel (ssget (list '(0 . "HATCH") (cons 8 layer)))) (null (command-s "_HATCHGENERATEBOUNDARY" jsel "")) (setq jsel (ssget "_I")) (null (command-s "_CHPROP" jsel "" "_Layer" layer "")) ) (princ) ) Il est basique donc il ne permet pas de gérer pour chaque hachure la génération d'un contour avec le bon calque, il permet de gérer un seul calque mais sur un ensemble d'objets. Donc si tu ne veux pas te prendre la tête, tu lances la commande MULTIPLE, puis tu donnes le nom de la commande que tu veux répéter (HGBL donc) et ainsi la commande va tourner en boucle jusqu'à ce que tu appuies sur ECHAP. Concernant la commande HGBL (HatchGenerateBoundaryLayer), la première question requiert de sélectionner une entité (sans filtre) pour récupérer le nom du calque qui sera défini pour les nouveaux contours de hachures et pour filtrer la sélection des hachures sur ce calque uniquement. La seconde question requiert de sélectionner autant d'entités que tu souhaites, en prenant en compte la présélection et en filtrant la sélection pour ne conserver que les hachures appartenant au calque spécifié précédemment. Ensuite le programme va générer les contours pour l'ensemble des hachures et modifier la propriété de Calque des objets nouvellement créés pour les mettre dans le même calque que les hachures sélectionnées. Bisous, Luna -
@didier, tu t'en occupes ? 😉 Donc si je comprends bien, le but est de déplacer chaque pièce non pas d'une distance équivalente de la position initiale mais de N fois la distance spécifiée en fonction de la position des objets dans le jeu de sélection, right ? Donc le premier objet du jeu de sélection sera à 0 x Distance et le dernier objet N du jeu de sélection sera à N x Distance ? Bisous, Luna
-
Juste pour être sûre de bien comprendre... Lors de tes essais, tu modifies une définition de bloc pour lui ajouter des définitions d'attributs puis.....tu utilises le LISP sur ces blocs ? As-tu fait un ATTSYNC avant d'utiliser mon programme, pour mettre à jour la modification/suppression/ajout des attributs ? Sinon, serait-il possible de mettre un .dwg sur lequel tu rencontres ce soucis pour que j'essaie de voir si j'ai le même soucis ? Bisous, Luna
-
Regarde déjà les LISPs de Patrick_35 ainsi que les LISPs de (gile). Tu devrais déjà en avoir plus qu'il n'en faut ! Sinon tu peux essayer de regarder sur le site de LeeMac (en anglais !) si tu n'en as pas suffisamment.. Bisous, Luna
-
Coucou, Si je comprend à peu près le code, je dirais que tu as besoin d'un fichier DCL (il n'est pas créé par le programme LISP). Donc quand tu dis que veux-tu dire par là ? As-tu fais un copié/collé du code du post précédent ou bien as-tu cliqué sur le lien du premier post pour télécharger le ZIP présent sur le site ? Car si c'est la première option, je te suggère de télécharger le ZIP qui doit très certainement contenir le fichier LISP ainsi que les fichiers DCL nécessaires au bon fonctionnement du programme ! Bisous, Luna
-
Réassocier Champ d'un attribut d'un bloc A à un attribut d'un bloc B
Luna a répondu à un(e) sujet de Chr1s dans AutoCAD 2020-2024
Coucou, Je ne comprends pas sur quel critère le programme doit se baser pour associer un bloc bleu avec un bloc rouge ? Si tu as 1000 blocs bleus et 1000 blocs rouges, comment savoir qui va avec qui ? Car si on considère ton edit Ce n'est pas simplement j'associe un bloc bleu à un bloc rouge au pif... Bisous, Luna -
Coucou, Il va falloir donner un peu plus d'explications car à ce stade, je ne comprends pas où on peut gagner du temps par rapport à la commande déplacer... Parce que sinon l'exercice peut se faire directement via un (command) >_< Bisous, Luna
-
Conversion des champs en textes
Luna a répondu à un(e) sujet de Fraid dans Pour aller plus loin en LISP
euhh......bah vui, c'est exactement de chat que l'on discutait hier ^^" Chat me semblait clair en l'écrivant xD Par contre j'y comprends plus rien...en créant un nouveau bloc avec des attributs constants, cette fois-ci je peux savoir via la référence de bloc si les attributs sont constants ou non... >n< Et ce, que la valeur de l'attribut soit un simple texte ou bien un champ dynamique ...donc il doit y avoir une explication logique et raisonnée, mais là comme chat j'ai un peu du mal à la voir Bisous, Luna -
Geler calque dans plusieurs fenêtres / présentations
Luna a répondu à un(e) sujet de Kilian336 dans LISP et Visual LISP
Coucou, Là comme chat, je pourrais te proposer de regarder le LISP de feu Patrick_35 -> GEF sur ce >>post<< Je ne l'utilise pas suffisamment pour t'aider à l'utiliser comme tu le désires mais de souvenirs, il devrait correspondre à ton besoin 😉 Bisous, Luna -
Conversion des champs en textes
Luna a répondu à un(e) sujet de Fraid dans Pour aller plus loin en LISP
Et bien alors il suffit d'utiliser la méthode Visual pour récupérer la liste des objets : (defun GetBlock (search filter / doc col blk lst tmp) (setq doc (vla-get-ActiveDocument (vlax-get-acad-object))) (vlax-for col (vlax-get doc 'Blocks) (if (wcmatch (strcase (vlax-get col 'Name)) (strcase search)) (progn (setq tmp nil) (vlax-for blk col (if (wcmatch (strcase (vlax-get blk 'ObjectName)) (strcase filter)) (setq tmp (cons blk tmp)) ) ) (setq lst (cons (cons (vlax-get col 'Name) tmp) lst)) ) ) ) lst ) Avec 'search' une chaîne de caractère correspondant au nom du bloc recherchée (recherche relative via (wcmatch)) et 'filter' une chaîne de caractères correspondant au nom des sous-entités que l'on désire lister. Ci-dessous un exemple d'utilisation : (GetBlock "BlockNameTest" "AcDbAttributeDefinition") ; returns : (("BlockNameTest" #<VLA-OBJECT IAcadAttribute 000001dec91219d8> #<VLA-OBJECT IAcadAttribute 000001dec9124058> #<VLA-OBJECT IAcadAttribute 000001dec9121b98>)) et si après tu peux faire ce que tu veux : (mapcar '(lambda (a) (cons (vla-get-TagString a) (vla-get-Constant a))) (apply 'append (mapcar 'cdr (GetBlock "BlockName" "*Attribute*")))) ; returns : (("QTEMODULES" . :vlax-false) ("TYPEMODULE" . :vlax-true) ("REFINTERNE" . :vlax-false)) En théorie, chat respecte ton besoin d'être en Visual LISP, right ? Pour ce qui est des tableaux, j'avoue que le domaine est encore un peu trop obscur pour moi >w< Bisous, Luna -
Conversion des champs en textes
Luna a répondu à un(e) sujet de Fraid dans Pour aller plus loin en LISP
Coucou, J'ai l'impression que la propriété "Constant" n'est pas récupérable depuis les objets ATTRIB (issus d'une référence de bloc) car la valeur est toujours 0 (= :vlax-false). En revanche, la valeur est différente en passant par les objets ATTDEF (issus d'une définition de bloc) ! Donc pour palier à ton problème, tu vas devoir récupérer la définition de bloc via (tblobjname), créer une boucle pour récupérer la liste des attributs via (entnext), correspondant du coup aux objets ATTDEF et non ATTRIB. Et seulement avec ces objets, tu pourras vérifier l'équation (= (vla-get-Constant att) :vlax-false) J'avoue être assez perplexe devant cette subtilité et je n'ai pas vraiment vérifié si cela est propre à la propriété "Constant" des attributs ou bien si l'ensemble des propriétés "Divers" sont comme cela... Bisous, Luna -
Coucou, J'ai corrigé mon erreur sur le LISP pour n'avoir désormais qu'une seule insertion de texte. Ensuite, je n'ai pas super bien compris ta nouvelle demande mais comme je l'ai dit, le programme fonctionne avec autant d'attribut que souhaité donc tu peux essayer en définissant la liste (list "PUISSANCE" "DEBIT" "PUISSANCE_chaud" "PUISSANCE_froid" "DEBIT_chaud" "DEBIT_froid") (encore une fois, c'est à titre d'exemple, donc il te suffit de remplacer par tes attributs à toi !) Et comme chat le programme fera le calcul en additionnant uniquement les "PUISSANCE" entre-elles, les "PUISSANCE_chaud" entre-elles, les "PUISSANCE_froid" entre-elles, etc... Bisous, Luna
-
Coucou, Pour ta première demande, @Curlygoth a suggérer une idée fonctionnelle, bien qu'il ait fait une faute de frappe ^^" Il voulait sûrement parler de la propriété invisible sur les définitions d'ATTRIBUT. Pour cela tu vas dans ton éditeur de bloc, tu sélectionnes (ou créé) tes deux attributs correspondant à la puissance et au débit et dans le panneau des propriétés, tu devrais avoir en bas la propriété "Invisible" -> Définir sur "Oui". Pour la seconde, ne sachant pas précisément ce qu'est une "étiquette", je peux te proposer ceci en attendant (un .dwg d'exemple permettrait de mieux cerner la demande en fonction de la configuration de tes objets) : (defun c:SumAtt (/ param bname jsel i name vnam att lst pt) (setq param (list "PUISSANCE" "DEBIT") ; Liste des noms d'attribut bname "*" ; Liste des noms de blocs (séparer les noms par des virgules, sans espaces !) ) (if (setq jsel (ssget (list '(0 . "INSERT") '(66 . 1) (cons 2 bname)))) (progn (repeat (setq i (sslength jsel)) (and (setq name (ssname jsel (setq i (1- i)))) (setq vnam (vlax-ename->vla-object name)) (vlax-property-available-p vnam 'EffectiveName) (wcmatch (strcase (vla-get-EffectiveName vnam)) (strcase bname)) (setq att (mapcar '(lambda (a) (cons (vla-get-tagstring a) (vla-get-textstring a))) (vlax-invoke vnam 'getAttributes))) (setq att (vl-remove-if-not '(lambda (a) (member (strcase (car a)) (mapcar 'strcase param))) att)) (mapcar '(lambda (a / s v) (setq s (strcase (car a))) (setq v (cond ((distof (cdr a))) (0.0))) (setq lst (if (assoc s lst) (subst (cons s (+ (cdr (assoc s lst)) v)) (assoc s lst) lst ) (append lst (list (cons s v))) ) ) ) att ) ) ) (setq pt (getpoint "\nPoint d'insertion :")) (entmakex (list '(0 . "MTEXT") '(100 . "AcDbEntity") '(100 . "AcDbMText") (cons 10 pt) (cons 1 (apply 'strcat (mapcar '(lambda (x) (strcat (car x) " = " (rtos (cdr x) 2 2) "\\P")) lst))) ) ) ) ) (princ) ) Les noms d'attribut sont purement arbitraire, c'est à toi de mettre le nom qui convient en remplaçant uniquement les mots (bien conserver les guillemets "" !). Le programme ne tient pas compte des majuscules normalement, et si besoin tu peux avoir plus de 2 attributs car c'est une liste (donc si tu spécifies 5 attributs, il fera la somme pour chacun des 5 attributs). Tu peux également modifier le nom dans BNAME, qui correspond au nom de ton bloc, si jamais tu veux filtrer efficacement la sélection des blocs. N'ayant pas de .dwg sous la main, je ne peux pas le tester... Bisous, Luna
-
[Résolu] Dessiner des lignes avec "recouvrement"
Luna a répondu à un(e) sujet de DenisHen dans Débuter en LISP
@(gile), je suis parfaitement d'accord avec toi ! Personnellement je ne toucherai aucunement à (polymake) sauf que contrairement à moi, @DenisHen semble avoir des difficultés sur la compréhension de mon programme donc pour lui éviter de devoir modifier la fonction récursive, j'ai préféré lui suggérer la modification de (polymake) qui est plus simple en terme de compréhension. Mais vui clairement, c'est plus naturel de conserver (polymake) avec le retour du nom d'entité pour faire les ajouts en utilisant le retour de la fonction (en plus avec les (progn), cela ne devrait pas poser de soucis pour rajouter des expressions)... Bref @DenisHen, fait au plus simple pour toi, on ne jugera pas ! Et lorsque tu te sentiras suffisamment à l'aise tu pourras commencer à faire les choses plus proprement 😉 Bisous, Luna -
[Résolu] Dessiner des lignes avec "recouvrement"
Luna a répondu à un(e) sujet de DenisHen dans Débuter en LISP
Je suis assez perplexe, je pensais mes explications suffisamment claires et j'ai simplifié au maximum certaines choses...notamment (polymake). Donc si tu as la moindre modification sur les polylignes nouvellement crées, il te suffit de modifier (polymake). Or (polymake) ne fait pas appel à de la récursivité ou bien des (mapcar) et (lambda). C'est un simple (entmakex) dont je te suggère d'aller voir ce que cela retourne et tu verras que ce que tu cherches à faire n'est franchement pas plus compliqué que ce que j'ai envoyé plus tôt (ajout du (setq) devant (entmakex)) et ensuite tu fais toutes modifs désirées... Je reconnais que par correspondance le message peut parfois ne pas passer correctement, mais en théorie j'ai vraiment fait au plus simple pour justement te simplifier la vie sur certains domaines. S'il y a des modifications de valeurs entre chaque création de polyligne, alors vui je veux bien reconnaître que cela n'est pas forcément très simple mais pour cela, il suffit de m'expliquer ce que tu souhaites, en totalité, et je pourrais t'aiguiller voire modifier le programme pour toi. C'est vraiment très gentil de me considérer ainsi mais, la relève est loin d'être assurée >w< mais connaissances sont encore assez maigrichonnes et ma bibliothèque de fonctions/commandes n'en ai encore qu'à ses débuts ^-^ Mais chat me réchauffe le cœur de voir que mes interventions sont appréciées :3 Bisous, Luna -
[Résolu] Dessiner des lignes avec "recouvrement"
Luna a répondu à un(e) sujet de DenisHen dans Débuter en LISP
Ohhh oki doki je comprend parfaitement 🙂 Et bien j'avais un peu prévu le coup avec (polymake) étant donné que j'ai utilisé (entmakex) et non (entmake), donc (polymake) renvoie le nom d'entité de la polyligne nouvellement crée 😉 De plus j'ai épuré au max la fonction (polymake) mais si jamais tu veux ajouter des propriétés DXF en plus lors de la création de la polyligne, tu peux ! Par exemple définir un calque, une couleur forcée, un type de ligne, etc... (utilise l'Aide d'AutoCAD concernant les "LWPOLYLINE (DXF)") Donc si tu le souhaites, tu peux modifier directement la fonction (polymake) comme suit par exemple : (defun polymake (plist / ent) (setq ent (entmakex (append (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline") (cons 90 (length plist)) ) (mapcar '(lambda (p) (cons 10 p)) plist) ) ) ) (vlax-ldata-put ent "MetreHaHo" MetreHaHo) ) Et comme chat pas besoin de modifier la fonction (foo) si jamais c'est trop complexe, après si jamais tu as besoin de faire d'autres choses, il suffit de les ajouter juste après les (polymake), tu as des (progn) donc tu peux rajouter autant d'actions que tu souhaites (il faut juste pas modifier les variables utilisée par la fonction (foo)) 😉 Bisous, Luna -
[Résolu] Dessiner des lignes avec "recouvrement"
Luna a répondu à un(e) sujet de DenisHen dans Débuter en LISP
Et bien explique-moi en quoi tu dois pouvoir l'adapter du coup 😉 Normalement j'ai fait en sorte qu'il soit facilement utilisable dans un autre programme... Je pourrais t'y aider Bisous, Luna
