Insertions de bloc

Insertions de bloc

Kevin_Megel
Mentor Mentor
2 130 Visites
24 Réponses
Message 1 sur 25

Insertions de bloc

Kevin_Megel
Mentor
Mentor

Bonjour a tous,

 

comme la sugéré Patrick, j'ouvre un nouveau sujet, pour un lisp. Et je vais tenté d'être le plus claire possible. Cela fait suite au lisp sur la cration automatique des baie.

 

Le besoin : Ajouter des blocs a l'insertion de bloc particulié.

 

Lorsque l'on créer une baie 19" pour de l'audio visuel on a besoin parfois d'avoir entre certain element des plaques de ventilation.

 

Je cherche donc dans un premier temps lorsque j'insert le bloc A, B, C,... etc. une plaque de ventilation s'insert automatiquement au dessus de celui ci, tout en nous permettant la possibilité de la supprimé a tout moment.

 

Par la suite, j'aimerais pouvoir décliné ça avec d'autres types de materiel et d'autres types de plaques ( j'insert un bloc et automatiquement plusieur plaques s'insert aussi, avoir le choix de plusieur possibilité de plaques ect...)

 

Donc on revient au début :

 

1 - J'insert certain bloc, préalablement définit

2 - un autre bloc s'insert au dessus de celui si a une position définit par rappost au point d'insertion du premier bloc

 

 

Je rapelle, que je suis néophite au language lisp (même si j'ai quelque notions) et que je me suis embrouillé la tête tout seul en voulant faire trop compliqué.

 

Si le code marche, on verra pour le faire évoluer.

 

D'avance Merci.

 

Megeon

 

 

 

 

Kevin Megel
Ce post vous a été utile ? N'hésitez pas à aimer ce post.
Ce post a-t-il répondu à votre question ? Cliquez sur le bouton Accepter la solution.

EESignature

Je suis un simple utilisateur, je ne travaille pas pour Autodesk

0 J'aime
Solutions acceptées (3)
2 131 Visites
24 Réponses
Replies (24)
Message 2 sur 25

x-all
Advocate
Advocate

et si tu fesais un bloc qui contient ton 1er bloc et ton second bloc au dessus. tu exploses ce bloc et tu te retrouves avec tes 2 blocs prèt à être déplacés...

 

parce que vu d'ici, en lisp ça demande pas mal de taff, une liste déroulante pour le choix du bloc, des vérifications (ce bloc est il présent dans le dessin) ect...

peut etre je dis ça car je suis moi même pas fortiche en lisp, mais il me semble qu'avec une palette d'outil dédiée ce serai beaucoup plus simple...

 

en parlant de ça, connais tu les possibilités des palettes d'outil? car une bibliothèque sur une palette d'outil c'est le top pour poser des blocs à la chaine, il suffit de piocher dedant et donc ça devient plus fastidieux d'inserer un bloc double et de l'exploser que de poser un bloc pluis un autre s'il est nécéssaire.

 

 

0 J'aime
Message 3 sur 25

Kevin_Megel
Mentor
Mentor

je connais les palette outils mais ça ne rentre pas dans se que je veux faire, car j'ai pas un bloc a faire mais un certain nombre ! 

Kevin Megel
Ce post vous a été utile ? N'hésitez pas à aimer ce post.
Ce post a-t-il répondu à votre question ? Cliquez sur le bouton Accepter la solution.

EESignature

Je suis un simple utilisateur, je ne travaille pas pour Autodesk

0 J'aime
Message 4 sur 25

patrick_35
Collaborator
Collaborator

Salut

 

Un 1er jet

 

(defun c:mins(/ ajout ent nom rep)
  (defun ajout(bloc / att blo)
    (or (tblsearch "block" blo) ; Tester si le bloc existe dans le dessin
      (setq blo (findfile (strcat blo ".dwg"))) ; Sinon, le rechercher dans les chemins de recherche
    )
    (and blo
      (progn
	(setq att (getvar "attreq"))
	(setvar "attreq" 0)
	(command "_.insert" blo (cdr (assoc 10 ent)) (cdr (assoc 41 ent)) (cdr (assoc 42 ent)) (* 180.0 (/ (cdr (assoc 50 ent)) pi)))
	(setvar "attreq" att)
      )
    )
  )

  (setq rep (getstring T "\nEntrez le nom du bloc : ")) ; On verra plus tard pour une boite de dialogue
  (or (tblsearch "block" rep) ; Tester si le bloc existe dans le dessin
    (setq rep (findfile (strcat rep ".dwg"))) ; Sinon, le rechercher dans les chemins de recherche
  )
  (and rep ; Bloc trouvé
    (progn
      (command "_.insert" rep pause pause pause)
      (setq ent (entget (entlast)))
      (if (vl-string-search ".dwg" rep)
	(setq nom (strcase (vl-filename-base rep)))
	(setq nom (strcase rep))
      )
      (cond
	((vl-position nom '("NOM1" "NOM2" "NOM3"))
	  (ajout "NOM4")
	)
	((vl-position nom '("NOM5" "NOM6" "NOM7"))
	  (ajout "NOM8")
	  (ajout "NOM9")
	)
      )
    )
  )
  (princ)
)

@+

 

Message 5 sur 25

Kevin_Megel
Mentor
Mentor

hello patrick, deja merci, par contre, apres un premier essai, j'ajoute bien le premier bloc, par contre le second ne s'ajoute pas ! d'ailleur, il ne faut pas un point d'insertion pour le second bloc ( ou ça se passe avec le clic de la souris ? )

Kevin Megel
Ce post vous a été utile ? N'hésitez pas à aimer ce post.
Ce post a-t-il répondu à votre question ? Cliquez sur le bouton Accepter la solution.

EESignature

Je suis un simple utilisateur, je ne travaille pas pour Autodesk

0 J'aime
Message 6 sur 25

patrick_35
Collaborator
Collaborator

L'idée est de récupérer les valeurs du bloc inséré (position, facteur d'échelle, rotation)

Le (setq ent (entget (entlast))) récupère les codes dxf du bloc inséré

Dans la fonction ajout tu as :

(command "_.insert" blo (cdr (assoc 10 ent)) (cdr (assoc 41 ent)) (cdr (assoc 42 ent)) (* 180.0 (/ (cdr (assoc 50 ent)) pi)))


blo -> Nom du bloc à insérer
(cdr (assoc 10 ent)) -> Position du 1er bloc
(cdr (assoc 41 ent)) -> Facteur d'échelle X du 1er bloc
(cdr (assoc 42 ent)) -> Facteur d'échelle Y du 1er bloc
(* 180.0 (/ (cdr (assoc 50 ent)) pi) -> Angle de rotation du 1er bloc (formule pour convertir les radians en degrés)

@+

0 J'aime
Message 7 sur 25

Kevin_Megel
Mentor
Mentor

d'accord, mais pourquoi, le second bloc ne s'insert pas alors ?

Kevin Megel
Ce post vous a été utile ? N'hésitez pas à aimer ce post.
Ce post a-t-il répondu à votre question ? Cliquez sur le bouton Accepter la solution.

EESignature

Je suis un simple utilisateur, je ne travaille pas pour Autodesk

0 J'aime
Message 8 sur 25

patrick_35
Collaborator
Collaborator

J'ai testé avant de mettre le code à disposition.

 

C'est qu'il n'existe pas dans le dessin et qu'il n'est pas dans les chemins de recherche d'autocad. Peut-être une faute de frappe ?

 

Maintenant, si tu regardes le code de plus près

(tblsearch "block" blo) -> Si la réponse est nil, le bloc n'est pas dans le dessin, Avec la fonction or, je passe à l'argument suivant qui est la recherche du bloc en tant que fichier.
(setq blo (findfile (strcat blo ".dwg"))) -> Rechercher le bloc dans les chemins de recherche d'autocad -> Si nil, non trouvé
(and blo -> Bloc trouvé car non nil, alors je lance la procédure d'insertion

@+

0 J'aime
Message 9 sur 25

Kevin_Megel
Mentor
Mentor

ok je viens de regarder, pas de faute de frappe, et le bloc est bien dans le dessin....

 

je me doute que tu as testé avant, bon je regarde si je me prend pas comme un manche pour l'insertion du bloc

 

 

j'ai des attributs dans le bloc ça ne viendrait pas de la par hasard ?

 

Kevin Megel
Ce post vous a été utile ? N'hésitez pas à aimer ce post.
Ce post a-t-il répondu à votre question ? Cliquez sur le bouton Accepter la solution.

EESignature

Je suis un simple utilisateur, je ne travaille pas pour Autodesk

0 J'aime
Message 10 sur 25

patrick_35
Collaborator
Collaborator

Non car je redéfinis la variable ATTREQ avant l'insertion.

 

@+

0 J'aime
Message 11 sur 25

Kevin_Megel
Mentor
Mentor

ok ben la je ne vois pas....

Kevin Megel
Ce post vous a été utile ? N'hésitez pas à aimer ce post.
Ce post a-t-il répondu à votre question ? Cliquez sur le bouton Accepter la solution.

EESignature

Je suis un simple utilisateur, je ne travaille pas pour Autodesk

0 J'aime
Message 12 sur 25

patrick_35
Collaborator
Collaborator

Tu m'envois à mon adresse un exemple avec le code modifié pour que je regarde

 

@+

0 J'aime
Message 13 sur 25

Kevin_Megel
Mentor
Mentor

ok c'est fait

Kevin Megel
Ce post vous a été utile ? N'hésitez pas à aimer ce post.
Ce post a-t-il répondu à votre question ? Cliquez sur le bouton Accepter la solution.

EESignature

Je suis un simple utilisateur, je ne travaille pas pour Autodesk

0 J'aime
Message 14 sur 25

patrick_35
Collaborator
Collaborator

J'ai trouvé 3 problèmes

1) Dans les tests avec les (vl-position ...) tous les noms des blocs doivent être en majuscules (tu as pas exemple ...4x4 au lieu de 4X4)
2) Erreur de ma part dans le nom de la variable local bloc qui doit être blo dans la fonction ajout
3) Comme tu as des blocs avec des échelles uniformes, il ne faut pas le code dxf 42 pour l'insertion

La fonction ajout modifié

  (defun ajout(blo / att blo)
    (or (tblsearch "block" blo) ; Tester si le bloc existe dans le dessin
      (setq blo (findfile (strcat blo ".dwg"))) ; Sinon, le rechercher dans les chemins de recherche
    )
    (and blo
      (progn
	(setq att (getvar "attreq"))
	(setvar "attreq" 0)
	(command "_.insert" blo (cdr (assoc 10 ent)) (cdr (assoc 41 ent)) (* 180.0 (/ (cdr (assoc 50 ent)) pi)))
	(setvar "attreq" att)
      )
    )
  )


@+

Message 15 sur 25

Kevin_Megel
Mentor
Mentor

hourra, il ne reste plus qu'a ajouté une distance entre les 2 points d'insertions des blocs

 

EDIT: pour la seconde condition, ça ne marche pas (pour le BIM)

Kevin Megel
Ce post vous a été utile ? N'hésitez pas à aimer ce post.
Ce post a-t-il répondu à votre question ? Cliquez sur le bouton Accepter la solution.

EESignature

Je suis un simple utilisateur, je ne travaille pas pour Autodesk

0 J'aime
Message 16 sur 25

patrick_35
Collaborator
Collaborator
Solution acceptée

Donc, tu as des blocs uniforme et d'autres pas.

 

Le code modifié

(defun c:mins(/ ajout ent nom rep scale)

  (defun scale (blo) ; Un peu de vlisp (on ne se refait pas) car je n'ai pas trouvé le code dxf correspondant
    (eq (vla-get-blockscaling
	  (vla-item
	    (vla-get-blocks
	      (vla-get-activedocument
		(vlax-get-acad-object)
	      )
	    )
	    (if (vl-string-search ".dwg" blo)
	      (vl-filename-base blo)
	      blo
	    )
	  )
	)
	1
    )
  )

  (defun ajout(blo / att blo)
    (or (tblsearch "block" blo) ; Tester si le bloc existe dans le dessin
      (setq blo (findfile (strcat blo ".dwg"))) ; Sinon, le rechercher dans les chemins de recherche
    )
    (and blo
      (progn
	(setq att (getvar "attreq"))
	(setvar "attreq" 0)
	(if (scale blo)
	  (command "_.insert" blo (cdr (assoc 10 ent)) (cdr (assoc 41 ent)) (* 180.0 (/ (cdr (assoc 50 ent)) pi)))
	  (command "_.insert" blo (cdr (assoc 10 ent)) (cdr (assoc 41 ent)) (cdr (assoc 42 ent)) (* 180.0 (/ (cdr (assoc 50 ent)) pi)))
	)
	(setvar "attreq" att)
      )
    )
  )

  (setq rep (getstring T "\nEntrez le nom du bloc : ")) ; On verra plus tard pour une boite de dialogue
  (or (tblsearch "block" rep) ; Tester si le bloc existe dans le dessin
    (setq rep (findfile (strcat rep ".dwg"))) ; Sinon, le rechercher dans les chemins de recherche
  )
  (and rep ; Bloc trouvé
    (progn
      (if (scale rep)
        (command "_.insert" rep pause pause pause)
        (command "_.insert" rep pause pause pause pause)
      )
      (setq ent (entget (entlast)))
      (if (vl-string-search ".dwg" rep)
	(setq nom (strcase (vl-filename-base rep)))
	(setq nom (strcase rep))
      )
      (cond
	((vl-position nom '("NXAMP4X4" "NXAMP4X1" "LA8"))
	  (ajout "plaqueventil")
	)
	((vl-position nom '("BIM"))
	  (ajout "PLAQUEDEPROTECTION")
	  (ajout "2U")
	)
      )
    )
  )
  (princ)
)

@+

Message 17 sur 25

Kevin_Megel
Mentor
Mentor

que veux tu dire par bloc uniforme ?

 

 

et merci

Kevin Megel
Ce post vous a été utile ? N'hésitez pas à aimer ce post.
Ce post a-t-il répondu à votre question ? Cliquez sur le bouton Accepter la solution.

EESignature

Je suis un simple utilisateur, je ne travaille pas pour Autodesk

0 J'aime
Message 18 sur 25

patrick_35
Collaborator
Collaborator

Quand un bloc est uniforme, tu n'as pas besoin de renseigner le facteur d'échelle y du bloc car facteur_echelle_y = facteur_echelle_x et facteur_echelle_z = facteur_echelle_x

@+

Message 19 sur 25

Kevin_Megel
Mentor
Mentor

ok d'accor merci,

 

sinon ça insert leou les bloc sur le bloc initial comment faire en sorte que ça prenne le point initial +x valeur sur un axe ? (dit moi que c'est possible jsute apres la ligne (ajout "nombloc")

 

 

Kevin Megel
Ce post vous a été utile ? N'hésitez pas à aimer ce post.
Ce post a-t-il répondu à votre question ? Cliquez sur le bouton Accepter la solution.

EESignature

Je suis un simple utilisateur, je ne travaille pas pour Autodesk

0 J'aime
Message 20 sur 25

patrick_35
Collaborator
Collaborator
Solution acceptée

Tu peux très bien déplacer le dernier élément

(command "_.move" (entlast) "" "0,0,0" "10,10,0")

@+