Aller au contenu

Elun

Membres
  • Compteur de contenus

    36
  • Inscription

  • Dernière visite

  • Jours gagnés

    3

Tout ce qui a été posté par Elun

  1. Merci beaucoup pour ta réponse ! Décidément les listes DXF sont pleines de surprises !!! La méthode fonctionne parfaitement ;p J'avais une autre question cependant : concernant la commande -SUPCALQUE, je ne vois pas d'autres moyen d'invoquer la commande dans une boucle pour lui spécifier le nom de chaque calque un par un. Or je sais qu'un appel de commande "ralenti" un peu le processus. Donc avons-nous moyen (au même titre que la commande SUPCALQUE, qui en choisissant l'option "Nommer" fait apparaître une listbox avec sélection multiple des calques) de rentrer une liste de calque ? J'ai remarqué que l'on pouvait en faisant n fois (n, le nombre de calque) la saisie : "N" "nomcalque1" "N" "Nomcalque2" ... "N" "Nomcalquen". Or une boucle ne permet pas de renvoyer deux valeurs (ici "N" et "nomcalquei"). J'avais déjà utilisé une méthode pour valider n fois une certaines commande tant qu'elle pose des questions (avec la variable système "CMDACTIVE") mais ici, cela ne semble pas fonctionner non plus. En soit le programme fonctionne très bien autrement mais il est vrai que cela peut être amélioré du point de vue du temps d'exécution. Et encore merci pour ta réponse GEGEMATIC ! Elun
  2. Oui le rtos te renvoie une valeur en notation décimale, mais impossible d'utiliser des fonctions mathématiques avec un string. Si l'on fais (atof (rtos 6.52724e+006 2 3)), il renvoie 6.52724e+006 et non 6527240.000. Je n'ai pas vraiment eu le temps de voir une méthode depuis mon dernier message sur ce post mais je pense que la seule solution à ce jour reste la fonction (equal fuzz). Je n'ai pas eu d'erreur de lecture de coordonnées en rentrant ça. Après pour en revenir à ton problème Inc, si tu souhaites uniquement écrire un fichier texte avec ces coordonnées (sans manipulations) le (rtos) sera bon en effet mais si tu as besoin d'effectuer des opérations sur tes exports, ça risque d'être plus délicat. Elun
  3. Salut ! Je me permet de répondre à ton post étant donné que j'ai le même problème que toi. Le souci vient en effet des nombres trop élevés. AutoCAD utilise donc la notation scientifique pour le transfert des données car les calculs se font en 64bits. Je te met le lien vers les réponses qu'on pu m'apporter bonuscad et (gile) sur mon post : http://cadxp.com/topic/48425-coordonnees-dun-point-via-entget/ En espérant que ça puisse t'aider un peu ^^
  4. Bonjour à tous, J'ai un petit souci sur un de mes programmes. Je ne sais pas vraiment comment m'y prendre pour récupérer la liste des calques visibles dans une VIEWPORT (sélectionnée par l'utilisateur via (entsel) par exemple). Dans mon programme actuel, je récupère la liste des calques gelés (en général) et je passe cette liste pour la commande -SUPCALQUE. Le but de la manip' c'est lorsqu'on travaille sur des fichiers et que l'on souhaite purger un dessin pour un prestataire, on conserve généralement les données présentes dans un plan particulier. Pour le moment j'ai trouvé la combine de créer un filtre de propriété en rendant la VIEWPORT active basé sur le gel des calques dans la fenêtre, dégeler tous les calques (hors X-ref), puis geler tous les calques appartenant au filtre de propriété. Suite à cette manip' ma commande fonctionne mais c'est un peu triste de ne pas automatiser le processus. Je n'ai pas trouvé de résultats concluant dans les propriétés de la VIEWPORT mais j'avoue commencer à peine le visual lisp donc je m'en tiens aux routines basiques ^^' Donc si vous avez des idées sur une méthode, cela m'aiderait beaucoup :P Elun
  5. Elun

    Code DXF Personnalisés

    Tout ceci est fort passionnant !!! Je vais mettre un moment avant de maîtriser un peu ces différentes méthodes mais je pense que les réacteurs d’événements seraient le plus adapté à mon problème (si on bouge un bloc, le câble qui lui est lié devrait suivre en toute logique) mais probablement le plus complexe du point de vue du code ! (surtout au vue de mon niveau actuel ^^') Je pense que je vais commencer déjà à me familiariser avec toutes ces méthodes pour bien cerner leur fonctionnement (et leurs limites) avant de me lancer dans mon projet. Je vous remercie pour vos retours en tout cas !! Elun
  6. Elun

    Code DXF Personnalisés

    Bonjour, Merci pour vos réponses, je vais étudier les différents liens que vous m'avez conseillé dès à présent ;p @Olivier Eckmann : Je me suis déjà penché sur les ID des entités (code DXF 5) qui sont permanents (contrairement au code DXF -2) mais malheureusement je ne vois pas bien comment lier les ID de plusieurs entité en fonction d'un identifiant sans créer de fichier (.txt, .xls, ...) pour y stocker les liens en dur dans le PC. Or je ne souhaite pas créer de fichier temporaire (ou semi-temporaire) pour ce genre de programme. Je me rends compte qu'un programme comme celui-ci ne se situe pas vraiment dans les "débuts" du LISP mais j'ai pensé (peut-être à tort) que cet histoire de code DXF pourrait s'apparenter à un problème de débutant. Elun
  7. Bonjour, Je me pose cette question farfelue : est-il possible de modifier la liste DXF d'une entité en ajoutant un code DXF custom ? En gros j'aimerais identifier des entités de manière permanente (même si on ferme/ouvre le dessin/AutoCAD) car ce sont des entités qui ont un numéro d'identification propre et unique et ne peuvent donc pas exister en double. Le but final du programme que je projette est de raccorder de manière automatique des équipements électriques entre eux, dans un ordre précis et chaque câbles et équipement élec' doit être unique et identifiable facilement via un numéro. J'ai déjà essayé d'affecter un code DXF "non existant" à une entité (via entmod) mais il rejette la requête. Or je ne peut pas vraiment "lier" un texte, un bloc et/ou une polyligne entre eux en fonction de leur numéro (non existant pour autoCAD) entre plusieurs session de travail... Il faudrait que si je supprime par exemple un équipement élec', les câbles qui lui sont associés soient supprimés également. Bref, c'est une question tordue et je galère un peu à l'expliquer... En espérant que vous aurez compris ! Bien à vous
  8. Elun

    Ajuster lignes croisées

    Malheureusement, il n'existe pas vraiment de solution simple pour définir qu'une partie de la polyligne est horizontale et passe par un point spécifié par l'utilisateur. Il n'est pas possible de récupérer l'angle d'un segment de polyligne par rapport au SCU/SCG sans passer par du lisp complexe. Je viens de regarder d'ailleurs de passer par (dumpallpropertiesvalue) mais aucune ligne ne semble correspondre à l'angle d'un segment... (question à part, pour ceux qui utilise la fonction (getpropertyvalue), comment on accède aux propriétés des ItemX qui correspondent aux points de la polyligne ? j'ai eu beau chercher, je n'ai reçu que des "demandes ADS erronée"...) Pour en revenir à nos moutons, à chaque fois que l'on souhaite automatiser encore un peu plus un programme (même simple), il faut forcément ajouter des lignes de codes (parfois imbuvables) pour que ça fonctionne. Je me demande si pour ton problème il n'y aurait pas moyen de "tricher" un peu... Essaye avec ça pour voir : (defun c:cut ( / p cir) (while (setq p (getpoint "\nCliquer sur une intersection : ")) (command "_circle" p pause) (setq cir (entlast)) (setq p (list (+ (car p) 0.001) (cadr p) (caddr p))) (command "_trim" cir "" p "") (entdel cir) ) (princ) ) Il ne s'agit là que d'un test car il est fort probable que ce programme rencontre des erreurs et il ne prend pas vraiment en compte les petits ajustements d'un dessin, mais disons que ça peut servir de base sans modifier complètement ton programme ou devoir créer un programme complexe. Il rencontrera une erreur si la ligne horizontale ne dépasse pas l'intersection de 1mm dans le sens positif de l'axe x ou si la ligne en question n'est pas parfaitement horizontale. En espérant que cela puisse t'aider dans tes recherches. :P
  9. Elun

    Ajuster lignes croisées

    Salut, Petite question : la commande CUT doit-elle couper les deux lignes qui se croisent ou une seule uniquement ? Ensuite concernant la commande _TRIM prend en compte l'ordre de tracé (et non l'ordre de création des lignes) donc tu peux jouer là dessus si besoin avant de lancer la commande _TRIM. En revanche, si les deux lignes doivent être coupées par la commande CUT, il suffit de lancer une seconde fois la commande _TRIM (ne prend pas en compte le fait qu'il peut y avoir N lignes passant par cette intersection) Si le but est de choisir la ligne que tu souhaites couper, le plus simple serait de faire une pause dans la commande _TRIM de mon point de vue. En espérant t'avoir aidé :P
  10. Bonjour PHILPHIL, Ce code me semble fort intéressant ! En revanche, les tableaux devant être mis à jour ne peuvent pas avoir plus de 10 colonnes (et s'ils en ont moins, doit-on alors entrer une largeur de colonne de 0 pour toutes celles qui n'existe pas ?), cela ne risque-t-il pas de créer des erreurs ? Etant donné que tu créer un fichier DCL temporaire, il pourrait être intéressant de créer une boîte de dialogue adapté au tableau que l'on souhaite modifier. :P Loin de moi l'idée de critiquer ce magnifique code, car je pense m'en inspirer fortement pour mes prochains développements !! ^^ Bravo à toi (et (gile) bien évidemment) :D
  11. Bonjour, Je doute que cela existe, sur les forums anglais, il font souvent mention d'une option "filter" pour la commande "._-layer" mais cela ne semble pas d'actualité (en tout cas sur mon AutoCAD 2019). Mais tu peux essayer de voir déjà avec ces deux forums ainsi que le lisp de (gile), que je n'ai testé donc je ne sais pas s'il pourra t'aider. https://forums.augi.com/showthread.php?97438-Can-I-create-frequently-used-layer-filters-in-LISP&p=952247&viewfull=1#post952247 (il y le .lsp de (gile) dans sa réponse) Je n'ai pas pu dl le fichier .lsp, probablement que les délais ont expirés : https://www.cadtutor.net/forum/topic/32881-layer-group-filter/ En espérant que cela t'aidera un peu dans tes recherches, mais à mon avis, tu ne dois pas être le premier à te creuser les méninges pour un sujet comme celui-là ;p Elun,
  12. Merci à vous tous, Je vais essayer de creuser un peu plus pour trouver une méthode qui puisse gérer les imprécisions sans trop de problème. A ce stade, la version avec (equal) me semble pas mal mais pas forcément applicable à toutes les sauces ;p Il reste encore du boulot en effet de ce côté là mais à tout problème existe une solution ,) Encore merci à vous !
  13. Ok, merci pour ces réponses en un temps record ! Donc si je comprend bien, la seule méthode que l'on ait à ce jour c'est de prendre les coordonnées "arrondies", et non "exactes" (via (equal+fuzz) ou (atoi (rtos)) par exemple) ? Autrement, en passant par la méthode , AutoCAD serait-il capable de l'associer au point de la polyligne ? Pour ma part, j'évite à tout prix les commandes de zoom dans mes lisp en raison du temps d'exécution, j'ai tendance à favoriser les (sssetfirst) pour la visibilité des jeu de sélection filtrés. En tout cas merci beaucoup, je vais travailler là-dessus en espérant trouver une solution viable ;p
  14. Merci pour ta réponse, J'avoue n'avoir pas vraiment d'exemple très précis sur ce que je veux faire. C'est notamment pour des bouts de code lorsque je travaille. Par exemple j'ai une fonction qui me récupère la liste des coordonnées de chaque points d'une polyligne sélectionnée. Et si je souhaite utiliser cette polyligne comme tracé de capture pour un (ssget), la sélection est vide. Le soucis dans cette démarche c'est que déplacer un dessin géo-référencé, c'est tendancieusement long. Après ce n'est qu'un exemple parmi tant d'autres, j'utilise assez souvent ces sélections via les polylignes ou par exemple si je souhaite évaluer lorsqu'un point appartient à une polyligne.
  15. Bonjour, J'ai remarqué à plusieurs reprises que sur certains DWG (notamment lorsqu'on travaille sur des fichiers géo-référencés) les coordonnées des points que l'on récupère via la fonction (entget) sont notées en notation scientifique (voir les codes DXF 10) : Je travaille pourtant en unités métriques et non en notation scientifique. Or si je récupère les coordonnées telles quelles et que je les utilise ailleurs (un (ssget) par exemple), AutoCAD me retourne une erreur ou ne sélectionne rien. Malheureusement je ne vois pas comment contourner cette simplification d'écriture de la part d'AutoCAD. Si vous avez une idée, je suis preneur ;p PS : Je préfère éviter de passer par du Visual LISP pour le moment si possible.
  16. Thank you !!! That's perfect ;p
  17. Bonjour, J'essaye actuellement de faire un programme qui utilise la commande "_-HATCH" (c'est pour cela que je me permet de poster un msg dans ce sujet similaire au lieu d'en ouvrir un autre), cependant j'ai un souci : lors du premier lancement de mon programme AutoCAD me renvoie le message d'erreur donc je suppose que c'est lors de l'appel de la commande "_-HATCH" car c'est la seule ligne où je spécifie une couleur. Mais si je relance le programme une seconde fois, aucun problème et mon programme fonctionne parfaitement... Je dois créer des hachures vertes (3) et des hachures rouges (10), j'ai également essayé en passant par les coUleurs vraies, soit vert (0,255,0) et rouge (255,0,0). Votre aide me sera précieuse :P Désolé Hydro8, mais je ne suis pas en mesure de t'aider pour ton problème...
  18. Salut, Je suis justement en train de travailler sur des keyword permettant d'annuler une opération. La commande Annuler en soit fonctionne plutôt bien mais elle se contente uniquement de faire un retour sur les appels de (command), ici ça correspond à l'insertion du texte. En revanche, l'ensemble de tes variables, elles, conservent leurs valeurs actuelles sans reprendre la valeur précédente. Si jamais tu n'as pas besoin de faire un retour arrière sur la valeur de tes variables, pas trop de soucis à priori, autrement, je suis passé par la construction d'un liste avec l'historique des valeurs. En d'autres termes, si je choisi "annuler", je conserve le (cdr historique) et réaffecte les valeurs du (car historique) aux variables concernées) J'avais commencé par ce prog pour mes recherches (c'est bancal et plutôt lourd en terme d'écriture mais j'en suis qu'au début de mes recherches, donc si quelqu'un à des idées à proposer, je suis preneur !!!) : (defun c:RSD (/ *error* Option TypeR TypeR_Tmp Diam Diam_Tmp Pente Pente_Tmp Pt_ref Fe Last_Pt Dist Ang Text_Pt Diff_Fe Coeff_Unit u List_Pt) (defun *error* (msg) (reinit) (princ msg) ) (init) (if (not (tblsearch "LAYER" "00-RESEAU")) (command "_LAYER" "N" "00-RESEAU" "CO" "160" "00-RESEAU" "TL" "CONTINUOUS" "00-RESEAU" "") ) (command "_LAYER" "CH" "00-RESEAU" "") (setvar "CECOLOR" "DUCALQUE") (setq TypeR (getstring "\nVeuillez renseigner le type de réseau : ") Diam (getint "\nVeuillez renseigner le diamètre (en mm) : ") Pente (getreal "\nVeuillez renseigner la pente (en %) : ") Pt_ref (getpoint "\nVeuillez renseigner le point de référence : ") Fe (getreal "\nVeuillez renseigner le niveau NGF du fil d'eau (en m) : ") Last_Pt Pt_ref ; Color 5 List_Pt (cons (cons Pt_ref Fe) List_Pt) ) ; (VerifCalq (strcat "00-RESEAU " TypeR) Color "CONTINUOUS") (command "_-INSERT" "Etiquette" Pt_ref 1 1 0 TypeR (strcat "\330 : " (itoa Diam)) (strcat "Fe : " (if (>= Fe 0) "+") (rtos Fe 2 2) " NGF")) (while (/= Option "Quitter") (initget 128 "Type Diamètre Pente annUler Quitter") (if (null (setq Option (getpoint "\nSpécifier le point d'insertion suivant ou modifier les paramètres [Type de réseau/Diamètre canalisation/Pente/annUler] <ENTER pour Quitter> : "))) (setq Option "Quitter") (cond ((= Option "Type") (if (/= (setq TypeR_Tmp (getstring (strcat "\nVeuillez renseigner le type de réseau <" (princ TypeR) "> : "))) "") (setq TypeR TypeR_Tmp) ) ; (if (= Color 6) ; (setq Color 1) ; (setq Color (1+ Color)) ; ) ; (VerifCalq (strcat "00-RESEAU " TypeR) Color "CONTINUOUS") ) ((= Option "Diamètre") (if (setq Diam_Tmp (getint (strcat "\nVeuillez renseigner le diamètre (en mm) <" (princ (itoa Diam)) "> : "))) (setq Diam Diam_Tmp) ) ) ((= Option "Pente") (if (setq Pente_Tmp (getreal (strcat "\nVeuillez renseigner la pente (en %) <" (princ (rtos Pente 2 1)) "> : "))) (setq Pente Pente_Tmp) ) ) ((= Option "annUler") (if (> (length List_Pt) 1) (progn (command "ANNULER" "R") (setq List_Pt (vl-remove (car List_Pt) List_Pt) Last_Pt (caar List_Pt) Fe (cdr (car List_Pt)) ) ) (prompt "\nImpossible d'annuler l'implantation du point de référence.\nSi vous souhaitez tout de même le supprimer : Quitter la commande et relancer le programme RSD après avoir supprimé l'étiquette.\n") ) ) ((= (type Option) 'LIST) (command "_UNDO" "M") (setq Dist (distance Last_Pt Option) Ang (/ (* (angle Last_Pt Option) 180.0) pi) Diff_Fe (/ (/ (* Pente Dist) 100.0) Coeff_Unit) Fe (- Fe Diff_Fe) List_Pt (cons (cons Option Fe) List_Pt) ) (command "_-INSERT" "Etiquette" Option 1 1 0 TypeR (strcat "\330 : " (itoa Diam)) (strcat "Fe : " (if (>= Fe 0) "+") (rtos Fe 2 2) " NGF")) (command "_-TEXT" "J" "BC" "m2p" Last_Pt Option (* 0.2 Coeff_Unit) Ang (strcat "\330" (itoa Diam) " - " (rtos Pente 2 1) "%" " - Lg. " (rtos (/ Dist Coeff_Unit) 2 2) " m")) (setq Last_Pt Option) ) ) ) ) (reinit) ) Bon ici, j'ai dû placer des balises de recall pour la commande ANNULER en raison du double appel à la fonction (command) devant être annuler en une fois. En espérant avoir été utile.
  19. Ah merci beaucoup pour cette précision, je ne connaissait pas la méthode des getstring pour avoir une chaîne de caractères avec des espaces (à vrai dire je n'ai encore pas eu besoin des getstring car je créé peu de commandes, plus fan des fonctions :P). Cordialement
  20. Et juste pour la petite précision si tu as un nom de bloc qui possède des espaces, il faut ajouter des " au début et à la fin du nom, sinon AutoCAD comprendra la touche espace comme la touche de validation. Par exemple, si ton bloc s'appelle plan de coupe, lors de la saisie du nom il faudra écrire "plan de coupe" sinon autocad cherchera le bloc "plan". De plus, tu n'est pas obligé de respecter les majuscules/minuscules pour le nom du bloc. Voilà voilà. Après il s'agit d'un possibilité pas forcément une solution à tout les cas de figures ;p
  21. Bonjour, Pour pouvoir sélectionner plusieurs polylignes à la fois, il faut passer par un jeu de sélection. Pour ça on utilise la fonction (ssget). Ici, puisque l'on veut uniquement sélectionner les polylignes, il peut être intéressant de filtrer la sélection faite par l'utilisateur pour ne conserver que les polylignes. Ensuite on parcours le jeu de sélection (composé d'une ou plusieurs polylignes) grâce à une boucle (repeat ou while). Voici ton code modifié (non testé) : (defun c:blp(/ n nom jsel i) (if (setq nom (getstring "\nNom du bloc : ")) (if (tblsearch "block" nom) (progn (princ "\nSélection des polylignes") (setq jsel (ssget (list (cons 0 "LWPOLYLINE"))) i 0 ) (repeat (sslength jsel) (foreach n (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget (ssname jsel i)))) (entmake (list (cons 0 "INSERT") (cons 2 nom) (cons 10 n) (cons 41 1) ; facteur echelle X = 1 (cons 42 1) ; facteur echelle Y = 1 (cons 43 1) ; facteur echelle Z = 1 (cons 50 0) ; angle de rotation = 0 )) ) (setq i (1+ i)) ) ) (princ (strcat "\nBloc " nom " inconnu")) ) ) (princ) ) Si tu as besoin d'explications sur le pourquoi du comment, n'hésite pas.
  22. Bonjour, Pour avoir la liste de l'ensemble des propriétés en lien avec les fonctions (setpropertyvalue) et (getpropertyvalue) j'utilise très souvent (dumpallproperties (car (entsel))) dans la barre de commande d'AutoCAD qui renvoie dans ton historique la liste de toutes les propriétés propres à l'élément sélectionné. Elles sont triées par ordre alphabétique et le type de valeur associé (notamment utile pour (setpropertyvalue)) est précisé entre parenthèses. En espérant que ça puisse t'aider.
  23. Elun

    Barre de progression

    Bonjour, J'ai un programme qui est long en terme d'exécution et je souhaiterais savoir si quelqu'un a déjà étudié/recherché la création d'une barre de progression (ou chargement). Ce qu'il se passe c'est que j'ai un incrément qui augmente de 1 à chaque passage de la boucle donc j'avais commencé par chercher avec ceci, me permettant de remplir une image via un pourcentage (par rapport à un maximum définissant l'arrêt de la boucle) : Code LISP pour remplir l'image à chaque appel de la fonction (Progress) avec TimeCount la variable servant de compteur et TimeOut étant la valeur maximum de la boucle. (defun Progress () (start_image "ProgBar") (fill_image 0 0 (/ (* TimeCount fill_X) TimeOut) fill_Y 92) (end_image) (set_tile "Error" (strcat (itoa TimeCount) " / " (itoa TimeOut))) ) Code DCL correspondant à la BDL qui doit simplement afficher la barre au lancement du programme et disparaître lorsque la barre arrive à 100%. MAJCALQUE_ProgressBar: dialog { fixed_width = true ; label = "Barre de progression - commande MAJCALQUE" ; key = "ProgressBar" ; : text { label = "La commande MAJCALQUE est en cours d'exécution, veuillez patienter SVP." ; alignment = centered ; } : image { key = "ProgBar" ; fixed_width = 100 ; height = 2 ; } : row { : errtile { key = "Error" ; label = "" ; width = 30 ; alignment = centered ; } } : row { : button { key = "OK" ; label = "OK" ; } : button { key = "Cancel" ; label = "Annuler" ; is_cancel = true ; } } } Le problème de l'utilisation du langage DCL est qu'une boîte de dialogue possède obligatoirement un bouton OK Cancel (pas possible d'avoir une fenêtre simple sans boutons et uniquement une image). Or le but de la manoeuvre c'est que l'utilisateur n'est pas besoin d'appuyer sur un bouton pour lancer la barre de progression (je fais apparaître cette fenêtre normalement 5 fois au cours du programme). Je me souviens avoir chercher également du côté de la barre de commande mais je n'ai plus les bout de codes que j'avais testé. Donc si vous avez une idée de la manière dont on pourrait s'y prendre pour afficher une barre de progression sous autocad sans intervention de l'utilisateur, je vous en serait très reconnaissant.
  24. Elun

    Liste d'attributs de bloc

    Salut, J'arrive sûrement après la guerre mais j'ai une fonction nommée (Get-att-list) qui devrait correspondre à ce que tu cherches. Ce qu'il faut savoir, c'est que tu ne peux pas obtenir le nom de l'étiquette d'un attribut avec uniquement des fonctions AutoLisp (du moins à ma connaissance), il faut passer par le langage Visual Lisp. La fonction (Get-att-list) requiert uniquement un nom d'entité et renvoie des messages d'erreur si le type de l'objet renseigné comme argument n'est pas un nom d'entité ou si le type d'objet évalué n'est pas un bloc (car si c'est pas un bloc, ya pas d'attributs :P). ; Récupère une liste de paires pointées de l'ensemble des attributs du bloc spécifié en argument et de leur valeur correspondantes : ;--- La fonction (Get-att-list) possède 1 arguments ;--- e_name correspond au nom de l'entité ciblée ;--- Renvoie une liste de paires pointées composées chacunes du nom de l'attribut et de sa valeur (ex : (("CODEPROJET" "C2244") ("N°_DESSIN" "1030 -") ("TITRE_2" "CALEPINAGE DES MODULES PV")) ) (defun Get-att-list (e_name / Att VLA-B Att_List) (if (= (type e_name) 'ENAME) (if (= (cdr (assoc 0 (entget e_name))) "INSERT") (progn (setq VLA-B (vlax-ename->vla-object e_name)) (setq Att_List (mapcar '(lambda (att) (cons (vla-get-tagstring att) (vla-get-textstring att))) (vlax-invoke VLA-B 'getattributes))) (if Att_List Att_List (prompt "\nAucun attribut n'a été trouvé pour ce bloc.\n") ) ) (prompt (strcat "\nErreur : Le nom d'entité spécifié ne fait pas référence à un bloc." "\nIl fait référence à : " (cdr (assoc 0 (entget e_name))) ".\n" ) ) ) (prompt (strcat "\nErreur : La valeur entrée en argument de la fonction est incorrecte." "\nL'argument attend un nom d'entité de la forme : \"<Nom d'entité: b71b140>\", du type \"ENAME\"." " La valeur que vous avez saisie est du type : " (vl-symbol-name (type e_name)) ".\n" ) ) ) ) Si tu as besoin d'explication sur le fonctionnement parce que tu aimerais comprendre (et apprendre) n'hésites pas.
  25. Elun

    ROUTINE LISP

    Bonjour, Je sais que cela ne correspond pas parfaitement à ta demande, mais ce code m'a permis de modifier le calque des sous-entités composant chaque définition de bloc en spécifiant l'ancien calque (1er argument) et le nouveau (2nd argument). Le 3ème argument permet juste d'afficher ou non le résultat dans la barre de commande (doit être égal à "prompt" pour fonctionner). (defun BlockEntity_Layer (search replace Display / Bloc_name_List Bloc_name Bloc_Data EntB EntB_DXF) (setq Bloc_name_List (flt_tbl "BLOCK" "*") Ent_Obj 0 ) (if (not Nb_Obj) (setq Nb_Obj 0)) (if (= Display "prompt") (setq Bloc_List nil)) (foreach Bloc_name Bloc_name_List (setq Bloc_Data (tblsearch "BLOCK" Bloc_name) EntB (cdr (assoc -2 Bloc_Data)) EntB_DXF (entget EntB) ) (if (wcmatch (cdr (assoc 8 EntB_DXF)) search) (progn (setq EntB_DXF (subst (cons 8 replace) (assoc 8 EntB_DXF) EntB_DXF)) (entmod EntB_DXF) (entupd EntB) (setq Nb_Obj (1+ Nb_Obj) Ent_Obj (1+ Ent_Obj) Bloc_List (cons (cdr (assoc 2 Bloc_Data)) Bloc_List) ) ) ) (while (setq EntB (entnext EntB)) (setq EntB_DXF (entget EntB)) (if (wcmatch (cdr (assoc 8 EntB_DXF)) search) (progn (setq EntB_DXF (subst (cons 8 replace) (assoc 8 EntB_DXF) EntB_DXF)) (entmod EntB_DXF) (entupd EntB) (setq Nb_Obj (1+ Nb_Obj) Ent_Obj (1+ Ent_Obj) Bloc_List (cons (cdr (assoc 2 Bloc_Data)) Bloc_List) ) ) ) ) ) (if (= Display "prompt") (prompt (strcat "\nLa fonction BlockEntity_Layer a trouvé " (itoa Ent_Obj) " objets sur le calque " "\"" search "\"" ", remplacé par le calque " "\"" replace "\"" "." "\n" "\nVoici la liste des blocs ayant été modifié (les blocs dynamiques apparaîssent sous la forme \"*U###\" ou \"*D###\") :" (if Bloc_List (DXF_List Bloc_List "\n - " "left" "Tri" "") "") "\n" ) ) ) ) C'est encore un peu bancal et comme l'a spécifié BonusCad, les types de lignes "BYLAYER" ne sont pas sélectionnable par un filtre de sélection donc il reste encore du taf ;p Pour le reste des objets de la base de données (obtenus avec (ssget "_X")) j'utilise la commande "_CHPROP" applicable à un jeu de sélection (donc simple d'utilisation) et d'ici tu devrais pouvoir modifier le type de ligne (même s'il s'agit du type "BYLAYER"). Cependant, pour une routine de ce genre, le plus simple reste encore de modifier les propriétés des calques, auquel cas, en sélectionnant l'objet, il faut récupérer le nom de son calque et vérifier si son type de ligne est forcé ou non. Si le type de ligne (assoc 6) retourne nil, alors il faut modifier le type de ligne du calque nommé (on peut accéder aux propriétés du calque grâce à la fonction (tblsearch "LAYER" nomcalque)). Après je suis débutant donc je commencerais par là, sans savoir si ce chemin mènera à un échec cuisant ou une victoire écrasante ^^
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité