Aller au contenu

Luna

Membres
  • Compteur de contenus

    1 113
  • Inscription

  • Dernière visite

  • Jours gagnés

    42

Tout ce qui a été posté par Luna

  1. Salut, Ok je vois un peu mieux, les exports Excel, je n'ai jamais fait donc je ne serais peut être pas en mesure de répondre à cette demande mais pour le reste c'est jouable. Petite précision, si tu extrais les valeurs dans Excel, c-à-d : Donc si je comprend bien on aurait dans la colonne A la distance H (distance entre le point spécifique et sa projection perpendiculaire sur l'axe) puis dans la colonne B la distance D (distance entre le point de référence et la projection perpendiculaire du point spécifique sur l'axe). Doit-on ajouter un référencement pour les points (un nom, un matricule, les coordonnées, ...) ? Si oui, tu parles de "bloc de point" donc est-ce que ces points sont des points à part entière ou bien des blocs de points topo (généralement nommés "TCPOINT" et possédant un attribut "MAT" pour le matricule et "ALT" pour son altitude NGF) ? S'il s'agit de simples point, faudrait-il dans ce cas ajouter un texte sur AutoCAD permettant de faire le lien entre le fichier .xls et le fichier .dwg ? L'axe, est-il une ligne (donc deux sommets et un sens), ou bien une polyligne (donc n sommets et un sens) ? S'il s'agit d'une polyligne, peut-elle avoir des segments courbes et auquel cas, calculer la perpendiculaire sur la zone courbe et non un segment droit ? Les points peuvent-ils être situés en dehors de cet axe, c'est-à-dire peuvent-ils avoir une projection perpendiculaire qui n'appartienne pas à l'axe (et donc il faut projeter l'axe pour le comptabiliser non pas comme un segment mais comme une droite) ? Je sais, ça fait beaucoup de questions, mais c'est plus simple de développer un programme quand on connait toutes les données d'entrée :3 Peut-être qu'un .dwg d'exemple permettrait de faciliter les explications ? :) Bisous, Luna
  2. Salut, Pour commencer, comment doit fonctionner la routine : - doit-on cliquer sur une ligne puis sur le point, ou bien sur 3 points ? - compare-t-on un point par rapport à une ligne, ou bien un point par rapport à un segment (polyligne) ? - doit-il s'opérer pour une unique ligne et un unique point, ou bien un ensemble de lignes par rapport à un unique point, ou bien une unique ligne par rapport à un ensemble de points, ou un ensemble de lignes par rapport à un ensemble de points ? - doit-on considérer la ligne dans son sens de création, ou bien est-ce l'utilisateur qui défini le point de comparaison ? - combien d'intervention utilisateur as-tu besoin 1, 2, 5, ... ? - ce listing, comment souhaites-tu le conserver ? Un fichier .txt, un fichier .xls, un message d'alerte, un message dans l'historique de commande, un texte dans AutoCAD, un bloc avec attribut, ... ? N'ayant pas Covadis, je suis incapable de savoir le type de résultat attendu.. Bisous, Luna
  3. Bonjour, Il s'agit d'un code basique mais fonctionnel pour ce que tu recherches : (defun c:ATTROT (/ name) (while (and (setq name (car (nentsel "\nVeuillez cliquer sur un attribut : "))) (= (cdr (assoc 0 (entget name))) "ATTRIB") ) (entmod (subst (cons 50 (+ (cdr (assoc 50 (entget name))) (/ pi 2.0))) (assoc 50 (entget name)) (entget name))) ) (if name (prompt "\nErreur : L'objet sélectionné n'est pas un attribut") (prompt "\nFin de la commande") ) (princ) ) Bisous, Luna
  4. 0w0 Arigato !! j'aurais de quoi travailler :3 à vrai dire, je connaissais déjà le principe des XDatas et leur intérêt mais je n'ai pour le moment jamais eut le temps d'explorer très loin et donc ma bibliothèque n'est pas très...garnie ^^" Avec tout ça, je pourrais avoir quelques exemples et je devrais enfin pouvoir étudier le langage Visual LISP qui peut être une bonne alternative en fonction des cas :3 Par contre, on s'égare un peu du sujet, mais merci beaucoup en tout cas <3 Bisous, Luna
  5. Ah et bien au moins je saurais à qui m'adresser lorsque j'aurais un peu de temps pour faire un programme de nomenclature élec' avec gestions des XDatas ^^" Bisous, Luna
  6. Ok je comprend mieux maintenant :3 Je ne pensais pas que les réseaux avaient un intérêt pour les plans de ferraillage étant donné que les espacements ne sont pas constant la plupart du temps (ça dépend du ferraillage aussi ^^") donc en effet s'il s'agit de réseaux créés via un programme, il est préférable de créer des XDatas car c'est le plus simple (ça évite de devoir parcourir tous les réseaux à chaque passage pour vérifier les données internes, beaucoup trop long à l'exécution !) Bon courage pour ton programme en tout cas Bisous, Luna
  7. tout dépend du but final de ton programme :3 Je n'ai pas encore eu le temps de me plonger dans les XDatas et dictionnaires donc je ne pourrais pas vraiment t'aider sur ce point mais de ce que j'ai pu en voir, ce n'est pas forcément simple et il faut penser à les mettre à jour si ton objet est modifié. Je sais que les ExpressTools ont une commande pour ajouter et modifier des XDatas donc si on peut accéder à son code, ça pourrait être intéressant de voir son fonctionnement (c'est XDATA et XDLIST je crois) :3 Que cherches-tu à faire exactement avec ces réseaux (si ce n'est pas indiscret) ? Parce que de manière générale les objets sont souvent rangés sur des calques nommés, ils peuvent également avoir des couleurs forcées donc en fonction de l'application de ton programme (un programme général ou plutôt restreint) tu devrais pouvoir te débrouiller sans la gestion des XDatas. Car cela peut aussi poser problème dans le cas où un réseau n'en possède pas, ou bien que les données ne sont pas à jour, bref les risques d'erreurs sont grands surtout si on ne pense pas aux pires scénarios catastrophes ^^" Bisous, Luna
  8. Vincent : C'est justement pour cela que j'ai posté ce code, à vrai dire, ce n'est pas très clair sans les commentaires mais je récupère les entités sources (les entités ayant été utilisées pour la création du réseau) via la liste avec les noms d'entités. Mais pour être plus claire, retourne sur un sujet que tu as justement ouvert et auquel (gile) a répondu à cette question (avec les commentaires) : arrayrect et arrayedit Pour plus de détails, il s'agit de la variable Array-Definition qui récupère la définition du bloc anonyme à l'origine du réseau et donc après c'est comme pour une définition de bloc, il faut créer une boucle pour récupérer toutes les entités (entnext) associées au code DXF -2 de cette définition :3 En fait, (gile) m'a simplement fait remarqué que même si le réseau est un bloc anonyme, la table des blocs contient tout de même une définition de bloc pour le réseau que l'on peut retrouver via le code DXF 2 du réseau (et après c'est un chemin un peu particulier pour retrouver cette définition de bloc originelle) :3 (setq Array-definition (tblsearch "BLOCK" (cdr (assoc 2 (entget (cdr (assoc -2 (tblsearch "BLOCK" (cdr (assoc 2 (entget name))))))))))) Après, en soit, les blocs aussi sont embêtants à leur manière ! Les blocs dynamiques par exemple ne peuvent pas être directement filtrés par leur nom car il est anonymisé (donc différent du nom de la définition) ou les blocs standards possédant des attributs (faire un (entmake) de ces blocs demande une petite gymnastique bien particulière !==" )... Bref, tout est compliqué quand on débute, mais c'est justement en se posant des questions,en fouillant toujours plus profond et en visant toujours plus haut que l'on arrive finalement à réaliser des choses qui nous paraissaient impossible auparavant ! <3 Et puis, sans oublier que, plus on développe de programmes différents (par nous-mêmes), et plus notre bibliothèque de routines LISP grandit avec des fonctions de plus en plus complexes, généralisées et sans erreurs ;3 Alek Justement, ce n'est pas du tout la même chose !! Les caractères n, ", r, e sont des caractères imprimables lorsqu'ils sont utilisés dans des strings (le mot français est trop long à écrire :3). Mais si on ajoute un \ devant ces caractères, alors là on obtient des caractères supplémentaires (et non imprimable pour la plupart). L'utilisation du back-slash permet d'ajouter des caractères spéciaux à un string qui ne peuvent pas être interprété par AutoCAD autrement (exemple, si tu veux imprimer des guillemets, ne pas mettre de \ devant mettra fin à ton string car c'est leur but premier : commencer ou mettre fin à un élément de type 'STR). Le quote inversé quand à lui est utilisable pour les outils de recherches relatives, donc ce ne sont pas de simples strings. Notamment les fonctions (wcmatch), (ssget), ou même dans la palette des calques pour les filtres de propriétés sur le nom ! Ici, ce sont des caractères spéciaux (et donc n'ayant pas pour fonction première d'être lu de manière littérale) qui, à l'aide de la quote inversée, perde leur propriété première pour devenir des caractères imprimables. Par exemple, le caractère * permet de remplacer un string (vide ou non) de longueur inconnu en début, milieu ou fin de chaîne. Or les blocs dynamiques possèdent un * dans leur nom donc on ajoute une quote inversée pour supprimer la fonction première de * est ainsi pouvoir rechercher littéralement ce caractère précis (et donc pas le remplacement d'une chaîne)... En espérant ne pas t'avoir trop perdu...sumimasen.. Bisous, Luna
  9. Vouih il permet de lire le caractère suivant de manière littérale : Wildcard Characters En revanche, il ne me semble pas que le back-slash annule la fonction d'un caractère spécial... Il sert de caractère marqueur pour AutoCAD qui permet de créer des fonctions secondaires pour un simple caractère. En clair c'est plutôt l'inverse, il permet de créer des caractères spéciaux à partir de caractères simples. Bisous (de loin), Luna
  10. Oui bien sûr, le filtre est dans les deux sens, il s'agit là d'un simple exemple, à adapter au besoin :3 Je te suggère dans ce cas de ne conserver que les blocs dynamiques (inutile de s'embêter avec les blocs standards dans le jeu de sélection) avec le filtre (2 . "`*U*") Attention, ne pas oublier le ` (= back fix, quote inversée, apostrophe inversée, accent grave, AltGr+7...) devant l'astérisque autrement ça ne fonctionnera pas de la manière escomptée ;3 Si besoin, voici un programme me permettant de récupérer quelques données sur les réseaux (désolé, je n'ai pas de commentaires pour faciliter la compréhension :S ) : ; Permet de récupérer les propriétés essentielles et succintes d'un réseau : ;--- La fonction (Array-Def) possède 1 argument ;--- name correspond au nom d'entité du réseau étudié ;--- Renvoie une liste de paires pointées constituées comme suit, sinon nil : ; ("AxesAngle" . 0.0) -> l'angle, en radian, entre les axes X et Y du réseau (par défaut : 90°) ; ("RowSpacing" . 0.0) -> la distance entre chaque rangée (suivant l'axe Y du SCO) ; ("Rows" . 1) -> le nombre de rangées ; ("ColumnSpacing" . 0.0) -> la distance entre chaque colonne (suivant l'axe X du SCO) ; ("Columns" . 1) -> le nombre de colonnes ; ("LevelSpacing" . 0.0) -> la distance entre chaque niveau (suivant l'axe Z du SCO) ; ("Levels" . 1) -> le nombre de niveaux ; (90 . 1) -> le nombre d'objets source ; (330 . <Nom d'entité: 483f218b>)-> la liste des entités sources (pouvant être modifiées/étudiées) (defun Array-Def (name / i ent Array-properties Array-definition ent-lst lst) (if (and (= (cdr (assoc 0 (entget name))) "INSERT") (wcmatch (getpropertyvalue name "Classname") "AcDbAssociative*Array") ) (progn (setq Array-properties (entget (cdr (assoc 330 (entget (cdr (assoc 330 (entget name))))))) Array-definition (tblsearch "BLOCK" (cdr (assoc 2 (entget (cdr (assoc -2 (tblsearch "BLOCK" (cdr (assoc 2 (entget name)))))))))) ent (cdr (assoc -2 Array-definition)) lst (list (cons "AxesAngle" (cdr (assoc 40 (member '(1 . "AxesAngle") Array-properties)))) (cons "RowSpacing" (cdr (assoc 40 (member '(1 . "ItemSpacing") Array-properties)))) (cons "Rows" (cdr (assoc 90 (cdddr (member '(1 . "Items") Array-properties))))) (cons "ColumnSpacing" (cdr (assoc 40 (member '(1 . "RowSpacing") Array-properties)))) (cons "Columns" (cdr (assoc 90 (cdddr (member '(1 . "Rows") Array-properties))))) (cons "LevelSpacing" (cdr (assoc 40 (member '(1 . "LevelSpacing") Array-properties)))) (cons "Levels" (cdr (assoc 90 (cdddr (member '(1 . "Levels") Array-properties))))) ) ) (while ent (setq ent-lst (cons ent ent-lst) ent (entnext ent) ) ) (setq lst (append lst (list (cons 90 (length ent-lst)) (cons 330 ent-lst)))) ) ) lst ) ; Permet de compter les objets présents dans les réseaux sélectionnés sans avoir à les exploser : (defun c:ARRAYCOUNT (/ jsel i n name lst Array ent r c l s ent-list o-list) (if (or (setq jsel (ssget "_I" '((0 . "INSERT") (2 . "`*U*")))) (setq jsel (ssget '((0 . "INSERT") (2 . "`*U*")))) ) (progn (repeat (setq n 0 i (sslength jsel)) (setq name (ssname jsel (setq i (1- i)))) (if (wcmatch (getpropertyvalue name "Classname") "AcDbAssociative*Array") (progn (setq lst (cons (cons (setq n (1+ n)) (setq Array (Array-Def name))) lst) r (cdr (assoc "Rows" Array)) c (cdr (assoc "Columns" Array)) l (cdr (assoc "Levels" Array)) s (cdr (assoc 90 Array)) o-list (cons (list r c l s) o-list) ent-list (mapcar '(lambda (ent) (cond ((and (= (cdr (assoc 0 (entget ent))) "INSERT") (not (wcmatch (getpropertyvalue ent "Classname") "AcDbAssociative*Array")) ) (cons (getpropertyvalue ent "BlockTableRecord/Name") (cdr (assoc 8 (entget ent)))) ) (t (cons (cdr (assoc 0 (entget ent))) (cdr (assoc 8 (entget ent)))) ) ) ) (cdr (assoc 330 Array)) ) ) (prompt (strcat "\n||==================================================||" "\nRéseau n°" (itoa n) (cond ((wcmatch (getpropertyvalue name "Classname") "AcDbAssociativeRectangularArray") " (Rectangulaire)") ((wcmatch (getpropertyvalue name "Classname") "AcDbAssociativePolarArray") " (Polaire)") ((wcmatch (getpropertyvalue name "Classname") "AcDbAssociativePathArray") " (Trajectoire)") (t "") ) " :" "\n Nombre d'objets total = " (itoa (* r c l)) " u" "\n Nombre de rangées = " (itoa r) " u" " (Espacement = " (rtos (cdr (assoc "RowSpacing" Array)) 2 2) " m)" "\n Nombre de colonnes = " (itoa c) " u" " (Espacement = " (rtos (cdr (assoc "ColumnSpacing" Array)) 2 2) " m)" "\n Nombre de niveaux = " (itoa l) " u" " (Espacement = " (rtos (cdr (assoc "LevelSpacing" Array)) 2 2) " m)" "\n Nombre d'objets source = " (itoa s) " u" "\n Composition de la source du réseau :" (apply 'strcat (mapcar '(lambda (x) (strcat "\n " (if (not (= 0 (setq ent (- (length ent-list) (length (setq ent-list (vl-remove (car ent-list) ent-list))))))) (strcat (itoa ent) " \"" (car x) "\" sur le calque \"" (cdr x) "\"." ) "" ) ) ) ent-list ) ) ) ) ) (ssdel name jsel) ) ) (prompt (strcat "\n||==================================================||" "\nSynthèse des " (itoa n) " réseaux sélectionnés :" "\n Nombre d'objets total = " (itoa (apply '+ (mapcar '(lambda (x) (apply '* (cdr (reverse x)))) o-list))) " u" "\n Nombre d'objets global (avec sources) = " (itoa (apply '+ (mapcar '(lambda (x) (apply '* x)) o-list))) " u" "\nSe référer au détail de chaque réseau pour la répartition des objets et des objets sources." ) ) ) ) (princ) ) En espérant que cela puisse t'aider, ou même d'autres personnes :3 Bisous (de loin), Luna
  11. Salut, J'ai travaillé sur ce sujet :3 Je n'ai pas de solution pour filtrer les réseaux directement dans l'expression du (ssget) malheureusement, cependant tu peux les filtrer en post-sélection (donc perte de temps en fonction du nombre d'objets dans le jeu de sélection) via leur propriété "ClassName" :3 Pour ma part j'ai ceci pour filtrer les réseaux : (if (setq jsel (ssget '((0 . "INSERT")))) (repeat (setq i (sslength jsel)) (setq name (ssname jsel (setq i (1- i)))) (if (wcmatch (getpropertyvalue name "ClassName") "AcDbAssociative*Array") (ssdel name jsel) ) ) ) Après bien sûr si tu ne traites pas des blocs dynamiques, tu peux filtrer directement dans le (ssget) en excluant les nom de blocs "`*U" de la sélection car un réseau est un bloc dynamique anonyme :3 Bisous (de loin), Luna
  12. Luna

    [RESOLU] Lisp et dcl

    Salut, Bon je t'avoue avoir essayer de lire ton fichier LISP mais j'ai un peu galéré ^^" En revanche concernant l'attribution d'une liste en fonction du radio_button sélectionné, je te suggère ceci (testé de mon côté et fonctionne parfaitement) : ; Hypothèses de départ : ;--- "RD_1" correspond à la key de ton premier radio_button ;--- "RD_2" correspond à la key de ton second radio_button ;--- lst1 correspond à la liste associée à RD_1 ;--- lst2 correspond à la liste associée à RD_2 ;--- "lst" correspond à la key de la liste (pop-up_list ou list_box) (if (not (new_dialog "dim" dcl_id)) (exit) ) (set_tile "RD_1" "1") (start_list "lst") (mapcar 'add_list lst1) ; c'est un raccourci d'écriture par rapport à la boucle while (end_list) (action_tile "RD_1" "(start_list \"lst\") (mapcar 'add_list lst1) (end_list)") (action_tile "RD_2" "(start_list \"lst\") (mapcar 'add_list lst2) (end_list)") ... L'idée est donc de redéfinir la liste nommée "lst" via (start_list) grâce à la fonction (action_tile) pour chaque radio_button (ici pas besoin de redéfinir la valeur des radio_button normalement puisqu'ils sont liés et le font automatiquement, sinon il faudrait ajouter (set_tile "RD_2" \"0\") à la fin de (action_tile) :3) Je te laisse également ces liens vers des postes un peu similaires : dcl inserer une tuile entre deux radio button dcl et lisp desactiver un bouton En espérant que ça puisse t'aider.. Bisous (de loin), Luna
  13. Salut, Je ne pourrais pas vraiment t'aider car ce n'est pas un domaine que je maîtrise mais de quoi as-tu besoin de récupérer ? La liste de toutes les vues de détails et de section, ou bien uniquement la vue courante ? Variable système CVIEWDETAILSTYLE Variable système CVIEWSECTIONSTYLE Sinon, à l'aide de cette commande, tu peux voir qu'il y a un dictionnaire pour les CVIEWDETAILSTYLE et CVIEWSECTIONSTYLE : (defun c:ListDictionaries ( / ed ed1) (prompt "\nDictionaries in current drawing: ") (foreach ed (entget (namedobjdict)) (progn (cond ((= (car ed) 3) (prompt (strcat "\n" (cdr ed)))) ((= (car ed) 350) (progn (foreach ed1 (entget (cdr ed)) (if (= (car ed1) 3) (prompt (strcat "\n " (cdr ed1))) ) ) )) ) ) ) (princ) ) Donc, la réponse est oui, c'est faisable en LISP, mais je n'ai pas les réponses malheureusement :3 tu peux consulter ce topic sur les dictionnaires si tu veux : CADxp - Les dictionnaires Si (gile) passe dans le coin, il sera bien plus efficace et saura mieux t'orienter ! Bisous, Luna
  14. Salut, Si on prend cette partie de code qui correspond à l'insertion de ton bloc issue de la commande INCATT : (if tag (while (setq ins (getpoint "\nSpécifiez le point d'insertion: ")) (vla-put-Textstring (nth tag (vlax-invoke (vla-InsertBlock space (vlax-3d-point (trans ins 1 0)) name scl scl scl rot ) 'getAttributes ) ) (strcat pref val suff) ) (setq val (incsuff val inc 7)) ) ) Il faut tout simplement refaire une définition d'attribut mais pour ça on a besoin du nom de l'attribut donc si on veut faire ça proprement, il faudrait ajouter dans la fenêtre de sélection des attributs ajouter une ligne pour la sélection de l'attribut n°2. Autrement, pour faire au plus court, on va simplement demander d'écrire le nom d'attribut à la mano (le risque d'erreur est grand mais on va procéder par étape pour faire ça proprement) Donc on ajoute une condition pour le second attribut en vérifiant qu'il existe bien dans la liste des attributs : (if (and tag (member (setq tag2 (getstring t "\nVeuillez spécifier le nom du second attribut à définir :")) lst)) ( . . . ) (princ "\nErreur: Nom d'attribut incorrect") ) Suite à ça, il faut relancer la définition d'attribut mais pour le second attribut donc ceci devrait suffire : (if (and tag (member (setq tag2 (getstring t "\nVeuillez spécifier le nom du second attribut à définir :")) lst)) (while (setq ins (getpoint "\nSpécifiez le point d'insertion: ")) (vla-put-Textstring (nth tag (vlax-invoke (setq e (vla-InsertBlock space (vlax-3d-point (trans ins 1 0)) name scl scl scl rot ) ) 'getAttributes ) ) (strcat pref val suff) ) (vla-put-Textstring (nth (vl-position tag2 lst) (vlax-invoke e 'getAttributes)) (getstring t "\nSpécifier la valeur du second attribut : ") ) (setq val (incsuff val inc 7)) ) (princ "\nErreur: Nom d'attribut incorrect") ) Dans un premier ceci devrait fonctionner mais je te conseille de créer une seconde commande INCATT pour conserver le fonctionnement de la commande intact et ainsi utiliser personnellement une seconde version :3 Bisous (de loin), Luna
  15. Oki je vois :3 Pour info les objets sélectionnés via (ssget) sont les objets "premiers" donc pour un bloc, le bloc sera sélectionné mais pas l'ensemble des sous-objets présents dans ce dernier donc pas d'inquiétude à ce niveau là. Si tu souhaites te limiter aux objets en espace objet, il suffit d'ajouter '(410 . "MODEL") à la liste de ton (ssget) pour limiter la sélection à l'espace objet. Vouih je comprend bien, mais une fonction aussi est testable dans AutoCAD, il faut juste penser à utiliser les parenthèses (comme tu le fais dans VLIDE ou l'éditeur que tu utilises). Mais comme je te le dit, si tu n'as pas d'intérêt à utiliser des arguments, il n'y a pas de différences notables entre les deux méthodes (une fonction ne peut pas être "rappelée" via ENTER par contre, il faut utiliser les flèches pour remonter l'historique ^^") Si mes souvenirs sont bons, les types de lignes ont le même principe que la couleur, le code 6 n'est présent que s'il diffère de "DuCalque" donc cela devrait être plutôt simple :3 Bonne chance pour le reste ! ♥ Bisous (de loin), Luna
  16. Salut, En effet j'ai testé rapidement et la suppression du code 62 n'est pas suffisant pour modifier la couleur de l'entité. En revanche, je ne me souviens pas avoir vu de code 420 et 430 (la couleur de mon objet test était "magenta"). Il faut donc bien forcer le code 62 avec la valeur 256 car en faisant ainsi, la fonction (entmod) reconnais la valeur et supprime le code 62 de la liste (et donc probablement un autre code lié à la couleur). Edit : La suppression toute simple suggérée par (gile) ne semble pas non plus fonctionner avec les couleurs RGB et/ou DICT. En revanche (gile) a raison sur le fait que, en fonction de la couleur de l'objet, il faut appliqué une méthode différente. Il faut donc dans un premier temps supprimer les codes 420 et 430 pour ensuite forcer le code 62 sur la valeur 256, autrement, la couleur ne sera pas modifiée...soit : (defun c:tst (/ ss n ent) (if (setq ss (ssget "_A" '((-4 . "!=") (62 . 256)))) (repeat (setq n (sslength ss)) (setq ent (vl-remove-if '(lambda (x) (member (car x) '(420 430))) (entget (ssname ss (setq n (1- n)))))) (entmod (subst '(62 . 256) (assoc 62 ent) ent)) ) ) (princ (strcat "\nUn total de " (itoa (sslength ss)) " objets ont été traités." ) ) (princ) ) Du coup petite question Vincent P. : pourquoi utiliser un ssget "_A" et non "_X" (la méthode "_A" ne prend pas en compte les objets présents sur les calques gelés) car au vu de l'utilisation de cette commande, autant l'appliquer à la totalité du dessin et éviter d'oublier certains objets :3 Après, faut-il que cette commande ne soit effective que sur l'espace objet ou bien sur la totalité du dessin (espace objet + espace papier) ? PS : je me permet une dernière remarque et après je m'arrête ;) Je trouve cela plus simple de programmer étape par étape à l'aide de fonctions et non des commandes (le "c:" au niveau du defun) car tu peux utiliser facilement des arguments et faire appelle aux fonctions de manière plus simple du point de vue de l'écriture. Pour moi une commande est le résultat final de tes recherches, la synthèse de ton travail dans le but d'une utilisation quotidienne, tandis que les recherches et sous-programmes sont des fonctions facilement modulables et faciles d'utilisation. Après ça reste ma façon de faire, il n'y a pas de "manière officielle" ou une seule vérité :3 Bisous (de loin), Luna
  17. Salut, Je remarque notamment que ton erreur ne provient pas de (entmod) car (entmod) s'attend à une liste comme argument, ce que tu as fait. En revanche (entupd) requiert le nom d'entité (d'où l'erreur "lentityp (-1 . <Nom d'entité: 1d374c0b9a0>)"). En effet le (car ent) renvoie bien (-1 . <Nom d'entité: 1d374c0b9a0>) donc essaye de remplacer (entupd (car ent)) par (entupd (cdar ent)) :3 Et par précaution peut-être faire (entupd (cdr (assoc -1 ent))) pour être sûre que même si la liste est dans le désordre (ce qui en théorie n'arrivera jamais) ça ne rate pas ^^ Du coup, j'en profite aussi pour une idée mais non testée : que se passe-t-il si on retire simplement la paire 62 de la liste (et ainsi se rapprocher de l'écriture native d'un objet ayant une couleur DuCalque) ? Bisous (de loin), Luna
  18. Luna

    arrayrect et arrayedit

    Aaahhhh bah vouih bien sûr !!! Je n'avais pas penser que la table des blocs avait tout de même une référence au bloc anonyme... Du coup je n'ai pas osé creuser davantage... Merci beaucoup en tout cas ! Du coup, je viens de regarder vite fait, si on souhaite modifier l'objet (ou les objets) sources du réseau, (entmod) fonctionne sans soucis mais pour mettre à jour de manière visuelle il faut utiliser (entupd) sur le réseau (et non l'objet source) pour faire apparaître les modifications. En tout cas ça va me faciliter grandement mon utilisation des réseaux car j'étais un peu coincée avec l'accessibilité aux données sources de ces derniers ^^" Bisous, Luna
  19. Luna

    arrayrect et arrayedit

    Salut ! J'avais une petite question concernant les Array justement... Depuis quelques temps j'essaye de comprendre la définition de ces entités donc récupérer le nombre de columns, rows, levels, spacing, etc : pas de soucis. Mais par contre, j'ai eut beau creuser toujours plus loin dans les codes DXF de cette entité, je n'ai pas été en mesure de retrouver les objets à l'origine du réseau... Pour la petite explication, ci-joint un fichier .dwg tout con (une ligne mise en réseau via la commande) et un fichier .txt avec l'extract des listes DXF des entités issues des codes 330 et 360. Je ne suis pas aller jusqu'au bout du bout vu que j'ai bien compris que je m'écartais de ce que je recherchais... ^^" WeTransfer (1 fichier .dwg + 1 fichier .txt) Au début j'ai cru que l'Objet n°11 jusqu'à 22 (cf. fichier .txt) correspondaient à ce que je recherchais mais au final, on ne peut rien en tirer de cet "INSERT" et ce n'est pas cohérent que l'objet de départ du réseau se retrouve dans n définition de bloc (il n'y a qu'une seule définition, répétée n fois). Bref j'aimerais savoir s'il existe un moyen de récupérer les objets qui définissent les réseaux et s'il faut passer par du Visual LISP ou uniquement des listes DXF ? Après je n'ai pas chercher à "étendre" les listes DXF en faisant appel au noms des applications via (entget).. Ces objets font finir par me faire devenir chèvre à force de vouloir se faire passer pour des blocs dynamiques sans pour autant l'être à 100% ! OnO (le fait qu'il ne possède pas de définition rend la tâche compliquée...) Bisous, Luna
  20. Luna

    Lisp de Bonuscad

    et bien justement, tu as toute une flopée de routines et donc d'exemples ! ^^" Bisous, Luna
  21. Luna

    Lisp de Bonuscad

    Salut, Si tu as uniquement besoin d'exemple de routines LISP sans avoir de but précis, tu peux toujours regarder les routines de (gile) ou Patrick_35 disponibles sur CADxp directement : https://cadxp.com/topic/11038-lisps-de-patrick-35/ https://cadxp.com/topic/14427-lisps-de-gile/ Ou bien sur le site de Didier également : https://www.da-code.fr/ Tu peux également regarder du côté du site de Lee-Mac (plutôt adepte du langage Visual LISP) : http://www.lee-mac.com/programs.html GEGEMATIC avait également mentionné la stdlib dans ce post qui recueille de nombreuses routines LISP mais à prendre avec des pincettes car très peu adapté pour de l'apprentissage (si tel est ton but). Après si c'est en effet pour de l'apprentissage, le plus efficace c'est clairement coder par toi-même :3 Même si on étudie pendant des années la joconde sans jamais poser le crayon sur une feuille, on en sera toujours au dessin en bonhomme bâtons hihi <3 Après si c'est pour étoffer ta bibliothèque de routine, je pense qu'avec tout ces liens déjà tu auras de quoi faire :3 Bisous, Luna
  22. Luna

    Somme d'attribut trié

    Salut, Je ne me suis pas vraiment penchée sur ton problème donc on va faire ça par étape, si tu veux bien :3 1°) Le lien WeTransfert est expiré, serait-il possible d'en refaire un si possible ? 2°) As-tu des connaissances dans le langage LISP ou pas du tout ? 3°) Si oui, as-tu besoin de pistes de recherches pour t'aider dans l'écriture de ton programme ? Si non, cela signifie que tu as besoin d'un programme fonctionnel tout fait et s'appliquant à ce problème spécifique (ou bien tu as quelques notion te permettant d'étaler l'utilisation de ce programme dans d'autres circonstances ?) 4°) Quel genre de programme as-tu besoin exactement : un minimum d'intervention utilisateur (sélection automatique des blocs car nom unique, pas de pré-sélection des blocs à prendre en compte, ...), un programme esthétique et agréable à utiliser (utilisation de boîte de dialogue pour choisir le nom du bloc, pré-sélection possible de la part de l'utilisateur et possibilité de lancer la commande sur une sélection spécifique ou bien une sélection totale, ...), ou bien quelque chose d'efficace pour une utilisation quotidienne (nom du bloc à entrer à la main, possibilité de conserver le nom comme valeur par défaut pour les prochains lancements, ...) ? 5°) A quel genre de retour as-tu besoin : une liste dans l'historique de commande, une simple fenêtre d'information d'AutoCAD (pas de trace), un fichier .txt, un fichier .xls ? 6°) Quel est le taux de détail dont tu as besoin : A - une liste des attributs "repères" triée avec la longueur totale pour chacun des repères : B - une liste des attributs "repères" triée avec des informations intermédiaires pour la répartition des longueurs pour chacun des repères : C - une liste des attributs "repères" triée avec un résumé (liste A ou B ) à la fin des résultats ainsi que l'ensemble des longueurs pour chaque attribut "repère" Cela me permettra d'avoir une idée un peu plus précise de ce dont tu as besoin exactement et ainsi t'aider au mieux :3 Bisous, Luna
  23. Salut, Il me semble que ces commandes sont disponibles grâce aux ExpressTool :3 Lors de l'installation d'AutoCAD (du moins sur les versions PRO), il est possible de les installer (la case est décochée par défaut) lors de l'installation d'AutoCAD et de ses Add-on... Je te conseille donc, si tu as le temps, de ré-installer ton AutoCAD (en sauvegardant tes fichiers de personnalisation bien sûr) car je n'ai pas souvenir que l'on puisse les installer après coup... (un défaut à mes yeux mais bon...) Vérifie peut-être avant que tu y as accès avant de désinstaller/réinstaller AutoCAD :3 Bisous, Luna
  24. Salut, Si je comprend bien ta demande, tu voudrais pouvoir ouvrir tes fichiers .lsp depuis l'onglet Début, c'est bien ça ? Le même principe que l'historique des fichiers .dwg récents ? Si telle est ta question, un fichier .lsp a besoin d'un fichier .dwg ouvert pour pouvoir s'exécuter (et donc être ouvert via la commande VLIDE par exemple). Ainsi, si uniquement l'onglet début est ouvert (nouvelle session d'AutoCAD), il n'est pas possible d'ouvrir, modifier, exécuter un fichier .lsp donc je doute qu'il existe une méthode pour cela. En revanche, l'éditeur Visual Lisp conserve l'ensemble des fichiers ouverts s'ils n'ont pas été clos lors de la session d'édition précédente (dans le cas d'un affichage en mosaïque du moins). Ainsi je ne saisi pas le sens de ta demande :S Bisous, Luna
  25. Luna

    débutant en LISP

    Salut, Je ne maîtrise pas vraiment le visual LISP malheureusement donc je ne pourrait pas t'écrire des pavés ^^' Regarde de ce côté-ci : http://www.lee-mac.com/attributefunctions.html :3 Bisous, Luna
×
×
  • Créer...

Information importante

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