Aller au contenu

Inserer un bloc dans un bloc


Messages recommandés

Posté(e)

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 ?

 

Posté(e)

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

Posté(e)

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]

Posté(e)

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

 

./__\.
(.°=°.)

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • 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é