Fraid Posté(e) le 12 novembre 2010 Posté(e) le 12 novembre 2010 Bonjour, Soit - un dessin contenant un bloc A - un Bloc B situé dans un dossier qui fait partis des chemins de recherches par defaut Comment inserer le bloc B dans le bloc A au pt 0,0 du bloc A Exploser le bloc B et reinitialiser le A ?? Je n'arrive pas a "rentrer" dans le bloc en lisp ? https://github.com/Fraiddd
Fraid Posté(e) le 13 novembre 2010 Auteur Posté(e) le 13 novembre 2010 En fait ma question est plus large que cela. Est il possible de simuler l'editeur de bloc au sein d'un lisp? Je me souviens d'avoir déjà vu au moins un post a ce sujet, mais je ne le retrouve pas. Merci https://github.com/Fraiddd
LUDWIG Posté(e) le 13 novembre 2010 Posté(e) le 13 novembre 2010 Oui, c'est possible.Ci après un lisp de normalisation de bloc. Il est commenté, en l'étudiant, ça te donnera déjà une idée. ;********************************************************************************************************************************************************** ;NORMALISER BLOCS ;********************************************************************************************************************************************************** ;Place les entités constituant chaque blocs sur le calque 0 en couleur DuBloc (defun c:nb (/ i n tot) (setq echoold (getvar "cmdecho")) (setvar "cmdecho" 0) ;(command "-calque" "a" "e" "Normalise" "" "" "") (COMMAND "-calque" "L" "*" "AC" "*" "D" "*" "") (COMMAND "-calque" "E" "0" "") ;Normalisation des blocs dans la table des blocs (if (/= nil (setq i (tblnext "block" t)))(progn ; RECHERCHE LA PREMIERE ENTREE DANS LA TABLE DES BLOCS (setq tot 1) (while i (setq n (cdr (assoc -2 i))) ; SELECTIONNE LA PREMIERE ENTITE QUI COMPOSE LE BLOC (while n (setq n (entget n)) ; RECUPERE LES VALEURS DES ENTITES QUI COMPOSE LE BLOC (if (/= (cdr (assoc 8 n)) "0") (progn (setq n (subst (cons 8 "0") (assoc 8 n) n)) ;SI L'ENTITE N'EST PAS SUR 0, LA DEPLACE SUR 0 (entmod n) ) ;_ Fin de progn ) ;_ Fin de if (if (not (assoc 62 n)) ;SI L'ENTITE N'A PAS LE CODE DXF 62 (=DuCalque), LE CREE ET LUI AFFECTE LA VALEUR 0 (=DuBloc) (setq n (append n (list (cons 62 0))))) (if (/= (cdr (assoc 62 n)) 0) ;SI L'ENTITE N'EST PAS DE COULEUR 0, LA CHANGE EN 0 (=DuBloc) (setq n (subst (cons 62 0) (assoc 62 n) n)) ) ;_ Fin de if (entmod n) (setq n (entnext (cdr (assoc -1 n)))) ;ENTITE SUIVANTE ) ;_ Fin de while (setq i (tblnext "block") tot (1+ tot) ) ;BLOC SUIVANT ) ;_ Fin de while ;Normalisation des étiquettes d'attributs de blocs dans le dessin (car une étiquette peut avoir des valeurs de calque, couleur, etc. différentes de l'attribut) (setq sel (ssget "x" (list (cons 0 "INSERT")))) (setq j 0) (setq nat 0) (while (ssname sel j) (setq n (entget (ssname sel j))) (if (assoc 66 n) (progn (setq i (entget (entnext (cdr (assoc -1 n))))) (while (/= (cdr (assoc 0 i)) "SEQEND") (setq i (subst (cons 8 "0") (assoc 8 i) i)) ; mettre l'attribut sur le calque 0 (if (not (assoc 62 i))(setq i (append i (list (cons 62 0))))) (if (/= (cdr (assoc 62 i)) 0)(setq i (subst (cons 62 0) (assoc 62 i) i))) ; mettre l'attribut en couleur dubloc (entmod i) ; modifier l'entité (entupd (cdr (assoc -1 i))) ; mettre à jour sur l'écran l'entité (setq nat (+ 1 nat)) (setq i (entget (entnext (cdr (assoc -1 i))))) ) ;_ Fin de while ) ;_ Fin de progn ) ;_ Fin de if (setq j (1+ j)) ) ;_ Fin de while ;Résultat ;----------------------------------------------- (princ (strcat "\nTraitement de " (itoa (+ tot nat)) " bloc(s) (" (itoa tot) " dans la table des blocs et " (itoa nat) " étiquette(s) d'attribut(s) de bloc(s) dans le dessin)" ) ;_ Fin de strcat ) ;_ Fin de princ ;(command "-calque" "a" "s" "Normalise" "" "") (command "regen") (setvar "cmdecho" echoold) (graphscr) (princ) ) ) );_ Fin de defun (prompt "\nnb : Normaliser les blocs du dessin (calque 0 - Couleur Dubloc)" ) ;_ Fin de prompt Autocad 2021 - Revit 2022 - Windows 10
Fraid Posté(e) le 13 novembre 2010 Auteur Posté(e) le 13 novembre 2010 Merci Ludwig J'avais déjà exploré les possibilités de TBLNEXT sans pour autant trouvé comment ajouter une entrée dans le dictionnaire. Mais tu m'a persuadé d'y retourné, mais cette fois-ci en traduisant l'aide Autant les partagées sa peut servir a quelqun tblnext Trouve l'élément suivant dans une table de symboles (tblnext table-name rewind]) Lorsque tblnext est utilisé à plusieurs reprises, il revient normalement la prochaine entrée dans la table spécifiée à chaque fois. La fonction tblsearch pouvez définir l'entrée prochaine à récupérer. Si l'argument de rembobinage est présent et n'est pas nul, la table des symboles est rembobinée et la première entrée dans il est récupéré. Arguments table-name Une chaîne qui identifie une table de symboles. Les valeurs valides sont table-name "LAYER", "LTYPE", "VIEW", "STYLE", "BLOCK", "UCS", "APPID", "DIMSTYLE" et "vport". L'argument n'est pas sensible à la casse. rewind Si cet argument est présent et n'est pas nul, la table des symboles est rembobinée et la première entrée y est récupéré. Return Values Si une entrée de table des symboles est trouvée, l'entrée est retourné comme une liste de paires Pointées de codes DXF-type et des valeurs. S'il n'y a pas plus d'entrées dans le tableau, nil est retournée. Les entrées de la table supprimés ne sont jamais retournés. Examples Récupérer la première couche dans la table des symboles: Command: (tblnext "layer" T) ((0 . "LAYER") (2 . "0") (70 . 0) (62 . 7) (6 . "CONTINUOUS")) Les valeurs de retour représentent ce qui suit: (0 . "LAYER") Symbol type (2 . "0") Symbol name (70 . 0) Flags (62 . 7) Color number, negative if off (6 . "CONTINUOUS") Linetype name Notez qu'il n'y a pas de groupe -1. La dernière entrée de retour de chaque table est stockée, et la prochaine est retournée à chaque fois que tblnext convoque cette table. Lorsque vous commencez la numérisation d'une table, assurez-vous de fournir un second argument non-nulle pour rebobiner la table et revenir à la première entrée. Les inscriptions extraites de la table des blocs comprennent un groupe -2 avec le nom de l'entité de la première entité dans la définition de bloc (le cas échéant). Par exemple, la commande suivante obtient des informations concernant un bloc appelé BOX: Command: (tblnext "block") ((0 . "BLOCK") (2 . "BOX") (70 . 0) (10 9.0 2.0 0.0) (-2 . )) Les valeurs de retour représentent ce qui suit: (0 . "BLOCK") Symbol type (2 . "BOX") Symbol name (70 . 0) Flags (10 9.0 2.0 0.0) Origin X,Y,Z (-2 . ) First entity Le nom de l'entité dans le groupe -2 est acceptée par entget et entnext, mais pas par d'autres fonctions d'accès à l'entité. Par exemple, vous ne pouvez pas utiliser ssadd pour le mettre dans un jeu de sélection. En fournissant le nom du groupe -2 entité à entnext, vous pouvez numériser les entités comprenant une définition de bloc; retourne entnext nil après la dernière entité dans la définition de bloc. Si un bloc ne contient pas des entités, le groupe -2 retourné par tblnext est le nom de l'entité de son entité endblk. Du coup j'ai fouillé un peu plus Symbol Tables Les entrées de la table de symboles peuvent aussi être manipulées par les fonctions suivantes: entdel entget entmake entmod handent La fonction tblnext scanne séquentiellement les entrées de la table de symboles, et la fonction tblsearch récupère des entrées spécifiques. Les noms de tables sont spécifiées par les cordes. Les noms valides sont COUCHE, LTYPE, VIEW, STYLE, BLOC, UCS, vport, COtstyle, et APPID. Les deux listes de fonctions renvoient aux codes groupe DXF qui sont similaires aux données de l'entité retournée par entget. Le premier appel à tblnext retourne la première entrée dans la table spécifiée. Les appels suivants qui précisent la même table retourne les entrées successives, à moins que le deuxième argument de tblnext (rembobinage) est non nulle, dans lequel cas tblnext retourne la première entrée à nouveau. Dans l'exemple suivant, la fonction getBlock récupère l'entrée de table de symboles pour le premier bloc (le cas échéant) dans le dessin courant, puis l'affiche sous forme de liste (defun C:GETBLOCK (/ blk ct) (setq blk (tblnext "BLOCK" 1)) ; Obtient la première entrée BLOC. (setq ct 0) ; Sets ct (le compteur) to 0. (textpage) ; Passe à l'écran texte. (princ "\nRésultas de GETBLOCK: ") (repeat (length blk) ; Répète pour le nombre de membres dans la liste. (print (nth ct blk)) ; Répète pour le nombre de membres dans la liste. (setq ct (1+ ct)) ; Incrémente le compteur de 1. ) (princ) ; quitter tranquilement.) Les inscriptions extraites de la table des blocs contiennent un groupe -2 qui contient le nom de la première entité dans la définition de bloc. Si le bloc est vide, c'est le nom de l'entité du bloc ENDBLK, qu'on ne voit jamais sur des blocs occupés. Dans un dessin avec un seul bloc nommés, un appel getBlock affiche ce qui suit. (La valeur du nom varie de session en session.) Résultas de GETBLOCK: (0 . "BLOCK") (2 . "BOX") (70 . 0) (10 9.0 2.0 0.0) (-2 . ) Comme tblnext, le premier argument de tblsearch est une chaîne qui nomme une table, mais le du second argument est une chaîne qui nomme un symbole particulier dans le tableau. Si le symbole est trouvé, tblsearch retourne ses données. Cette fonction a un troisième argument, setnext, que vous pouvez utiliser pour coordonner les opérations avec tblnext. Si setnext est nul, l'appel tblsearch n'a aucun effet sur tblnext, mais si setnext est non-nul, le prochain appel de déclarations tblnext l'entrée de table suite à l'entrée ont été trouvés par tblsearch. L'option setnext est utile lorsque vous manipulez la table des symboles vport, parce que toutes les fenêtres dans une configuration particulière de visualisation ont le même nom (comme * ACTIVE). Si la table des symboles vport est accessible lorsque TileMode est éteint, toutes les modifications n'ont aucun effet visible jusqu'a se que TileMode soit allumé. Ne pas confondre VPORTS, qui est décrit par la table des symboles avec des entités vport l'espace papier fenêtre. Le processus suit toutes les fenêtres dans la configuration 4VIEW: (setq v (tblsearch "VPORT" "4VIEW" T)) ; Trouve la première entrée vport.(while (and v (= (cdr (assoc 2 v)) "4VIEW")) . . ; ... Processus d'entrée ... . (setq v (tblnext "VPORT")) ; Obtient la prochaine entrée vport.) J'ai de quoi m'oocuper ce week end pluvieu .....[Edité le 13/11/2010 par Fraid] [Edité le 13/11/2010 par Fraid] https://github.com/Fraiddd
Tramber Posté(e) le 14 novembre 2010 Posté(e) le 14 novembre 2010 Coucou, (ENTMAKE (list (cons 0 "block") (CONS 2 "bloctotal") (cons 10 '(0 0)) (cons 70 64))) (ENTMAKE (list (CONS 0 "INSERT") (cons 2 "sousbloc") (cons 10 (list 0 0 0)))) (ENTMAKE (list (cons 0 "endblk"))) Je donne une petite réponse (quelques kilomètres plus bas...) avec un bloc imbriqué dans un autre. Sans vérification dansles tables. Avant de passer à vlisp. Il y a longtemps, quand je débutais ,je travaillais avec entmake. Tu verras qu'avec Vlisp, c'est pas mal simple aussi. Conseil : évite de programmer l'édition de bloc dans le dessin comme on le ferait avec un éditeur.de bloc. C'est un coup à se perdre. Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant