Automatisation Baie 19"

Automatisation Baie 19"

Kevin_Megel
Mentor Mentor
5 454 Visites
117 Réponses
Message 1 sur 118

Automatisation Baie 19"

Kevin_Megel
Mentor
Mentor

Hello la communauté, je vous solicite surtout pouyr avoir des informations,

 

dans le cadre de mon travail, je suis parfois amené a dessiner des baie 19" (ou rack 19") avec l'instalation du materiel dedans. et il y a plusieur taille possible qui se compte en nombre de U (42U 24 U ect...)

Mon objectifs est de pouvoir lorque j'ai mis tout mon materiel de selectionné et de posser directement la baie adequoite. et evité de compté le nombre de U pour choisir la baie.

bref j'aimerais faire

-Pose du materiel

-Selection de celui ci

-Calcule automatique du nombre de U

-Choix automatique de la baie.

 

Est ce que c'est possible de programme un tel truc ? Avec mes compétence actuel ?

Il y a bien sur des taille standard donc serait il possible de créer des fourchette, par exemple entre 37 et 42 U ça selectione automatiquement une baie 42U ?

 

Je ne sais pas si j'ai été claire, si il y a des question n'hesitez 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
Solutions acceptées (2)
5 455 Visites
117 Réponses
Replies (117)
Message 101 sur 118

patrick_35
Collaborator
Collaborator

Salut

La fonction vl-position permet de rechercher la position d'un élément dans une liste.
Par exemple (vl-position 4 '(1 2 5 6 8 4 9 2 0)) retourne 5.
Un autre exemple (vl-position 3 '(1 2 5 6 8 4 9 2 0)) retourne nil.
Cela fonctionne aussi pour du texte, donc pour le nom des blocs.
On peut utiliser la fonction member qui aura le même résultat, mais si le résultat retourné est une longue liste, cela ralentir le lisp.
L'intérêt d'utiliser cette fonction de cette manière est de tester si un élément existe dans une liste et éviter une grande quantité de or
Donc, quand je vois un test sur un nom avec une liste qui ne contient qu'un élément, on peut simplifier avec un égal, sauf si le lisp peut évoluer et que l'on se garde une marge de manœuvre pour la suite (c'est à dire ajouter des éléments)
Pour ton besoin, je pense qu'il faut d'abord raisonner en liste à insérer et quels sont les éléments qui doivent y adhérer.

Par exemple

(cond
  ((vl-position nom_bloc '("toto1" "toto2" "toto3"))
    (setq lst '("ele1" "ele2")
  )
  ((eq nom_bloc "toto4")
    (setq lst '("ele3" "ele4")
  )
  ((vl-position nom_bloc '("toto5" "toto6" "toto7"))
    (setq lst '("ele5" "ele5")
  )
)


ou encore

(cond
  ((vl-position nom_bloc '("toto1" "toto2" "toto3"))
    (if (eq nom_bloc "toto1")
      (setq lst '("ele1" "ele2"))
      (setq lst '("ele1" "ele3"))
    )
  )
  ((eq nom_bloc "toto4")
    (setq lst '("ele3" "ele4"))
  )
  ((vl-position nom_bloc '("toto5" "toto6" "toto7"))
    (setq lst '("ele5" "ele6"))
  )
)


Et ensuite pour finir

(repeat bloc1 lst
  (setq ma_variable (vla-insertblock (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
                     (vlax-3d-point (getvar "lastpoint"))
                     bloc1
                     ....
  )
)


Maintenant, si chaque bloc à une position, tu peux faire

(cond
  ((vl-position nom_bloc '("toto1" "toto2" "toto3"))
    (setq lst '(("ele1" (10.0 10.0 0.0)) ("ele2" (20.0 20.0 0.0))))
  )
  ((eq nom_bloc "toto4")
    (setq lst '(("ele3" (30.0 30.0 0.0)) ("ele4" (40.0 40.0 0.0))))
  )
  ((vl-position nom_bloc '("toto5" "toto6" "toto7"))
    (setq lst '(("ele5" (50.0 50.0 0.0)) ("ele5" (60.0 60.0 0.0)))) ; 2 fois "ele5", mais pas à la même position.
  )
)
(repeat bloc1 lst
  (setq ma_variable (vla-insertblock (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
                     (vlax-3d-point (cadr bloc1))
                     (car bloc1)
                     ....
  )
)


@+

0 J'aime
Message 102 sur 118

Kevin_Megel
Mentor
Mentor

merci patrick j'etudirais ça, et oui je part sur le principe que le lisp evoluera. par contre chaque element a une position par rapport a l'element que l'on  insert !

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 103 sur 118

patrick_35
Collaborator
Collaborator

Alors si chaque bloc a une position précice, tu peux te créer une table de référence (facilement modifiable ensuite)
Par exemple

(setq ma_table '(("ele1" (10.0 10.0 0.0)) ("ele2" (20.0 20.0 0.0)) ("ele3" (30.0 30.0 0.0)) ("ele4" (40.0 40.0 0.0))))


Et pour retrouver la position de "ele2"

(cadr (assoc "ele2" ma_table))

@+

0 J'aime
Message 104 sur 118

Kevin_Megel
Mentor
Mentor

je definit donc mes positions par rapport au point d'insertion dans la table ! et je rapellerait l'element lorsque je définirait le point d'insertion ! c'est ça ?

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 105 sur 118

patrick_35
Collaborator
Collaborator

Ben oui. C'est ce que l'on peut appeler une base de données.

 

@+

0 J'aime
Message 106 sur 118

Kevin_Megel
Mentor
Mentor

Et est ce que avec cette table je peux définir deux fois le même element a deux position diférente ?  comme dans ton exemple précédents avec "ele5"

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 107 sur 118

patrick_35
Collaborator
Collaborator
Salut C'est ta base de données. Tu peux très bien avoir une liste dans une liste, comme pour les dxf. Le tout, c'est de savoir ensuite la gérer. @+
0 J'aime
Message 108 sur 118

Kevin_Megel
Mentor
Mentor

Une liste dans une liste, à ce rithme la je m'arretereais plus  ^^ Smiley très heureux

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 109 sur 118

patrick_35
Collaborator
Collaborator

Si tu regardes bien l'exemple dans le message 101, c'est ce que tu as.

@+

0 J'aime
Message 110 sur 118

Kevin_Megel
Mentor
Mentor

ok, bon j'aio des info dans tout les sens, il  va falloir que je recentre tout ça, et que j'ecrive ce que je veux faire avec ce code ( les idées viennent au fur et a mesure des lignes de code que vous me donnez)

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 111 sur 118

Kevin_Megel
Mentor
Mentor

En regrouppant les infos à droit et à gauche, et en rassemblant le tout pour commencer à construir le code, je me suis demandé si au lieu d'une table donnant pour chaque element un position, il est possible d'avoir une table jsute de position, que l'on rappelerait pour l'insertion d'un element !

 

par exemple

pos1 10.0 10.0 10.0

pos2 20.0 20.0 20.0

pos3 30.0 30.0 30.0

ect....

 

et pour le premier element (ele1) on rapelle soit la pos1, ou la pos2 Ect....

 

J'ai une impression de réflechir a haute voix....

 

ça donnerait

 

(setq ma_table' ((pos1 (10.0 10.0 10.0)) (pos2 (20.0 20.0 20.0)) (pos3 (30.0 30.0 30.0)) ...))

et on rappelertait avec

 

(cadr (assoc pos1 ma_table))

?

 

 

dans cette partie ????

 

 

(and ele1
    (setq ma_variable (vla-insertblock    (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
            (vlax-3d-point (getvar "lastpoint"))
            ele1
            (vlax-put ma_variable "insertionpoint" '(cadr(assoc pos1 ma_table))
            (vla-get-xscalefactor ent)
            (vla-get-yscalefactor ent)
            (vla-get-zscalefactor ent)
            (vla-get-rotation ent)

 

 

Je dois dire qu'avec tout ça je me suis un peux pomé (pourtant en regardant de loin le code à l'aire simple)

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 112 sur 118

patrick_35
Collaborator
Collaborator

Après correction

(setq ma_table' (("pos1" (10.0 10.0 10.0)) ("pos2" (20.0 20.0 20.0)) ("pos3" (30.0 30.0 30.0)) ...))
(vlax-3d-point (cadr (assoc pos1 ma_table)))

@+

0 J'aime
Message 113 sur 118

Kevin_Megel
Mentor
Mentor

Merci Patrick,

 

je pense arrivé au bout de ce code, et il me reste a definir le nom des blocs, et a faire intervenir le la boite de dialogue

 

et voici le code !!!! pas taper si soucis svp !!!

 

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;                                                                ;;
;;                                                                ;;
;; Lors d'une insertion de certain bloc, on insert d'autres blocs ;;
;;                                                                ;;
;;                                                                ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defun patrick:ajouter_object (rea obj / ent nom ma_variable ma_table lst1 lst2 nom nom1 nom2 nom3 nom4)
  (setq ent (vlax-ename->vla-object (last obj)))
  (and	(eq (vla-get-objectname ent) "AcDbBlockReference")

	
;; 1) Si insertion bloc A;B;C, on insert le bloc a ;;


(cond
	  ((vl-position (vla-get-effectivename ent) '("MON_BLOC_DE_REFERENCE1" "MON_BLOC_DE_REFERENCE2" "MON_BLOC_DE_REFERENCE3"))
	    (setq nom "ele4")
	  )
(and nom
    (vla-insertblock	(vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
			(vlax-3d-point (cadr (assoc pos1 ma_table)))
			nom
			(vla-get-xscalefactor ent)
			(vla-get-yscalefactor ent)
			(vla-get-zscalefactor ent)
			(vla-get-rotation ent)
      )
 )
	  

;; 2) Si insertion bloc D;E;F, on insert les bloc a;b;b ou a;c (choix opérateur voir "4)") ;;


	  
	  ((vl-position (vla-get-effectivename ent) '("MON_BLOC_DE_REFERENCE4" "MON_BLOC_DE_REFERENCE5" "MON_BLOC_DE_REFERENCE6"))
	    (vl-position (vla-get-effectivename ent) '("lst1" "lst2"))
	   )
	  );;Fin de condition

	(setq lst1 ("nom1" "nom2" "nom3"))
	(setq lst2 ("nom1" "nom4"))
	(setq nom1 "ele1")
	(setq nom2 "ele2")
	(setq nom3 "ele2")
	(setq nom4 "ele3")
	(and nom1
    (vla-insertblock	(vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
			(vlax-3d-point (cadr (assoc pos1 ma_table)))
			nom1
			(vla-get-xscalefactor ent)
			(vla-get-yscalefactor ent)
			(vla-get-zscalefactor ent)
			(vla-get-rotation ent)
      )
 )
	(and nom2
    (vla-insertblock	(vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
			(vlax-3d-point (cadr (assoc pos1 ma_table)))
			nom2
			(vla-get-xscalefactor ent)
			(vla-get-yscalefactor ent)
			(vla-get-zscalefactor ent)
			(vla-get-rotation ent)
      )
 )
	(and nom3
    (vla-insertblock	(vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
			(vlax-3d-point (cadr (assoc pos3 ma_table)))
			nom3
			(vla-get-xscalefactor ent)
			(vla-get-yscalefactor ent)
			(vla-get-zscalefactor ent)
			(vla-get-rotation ent)
      )
 )
	(and nom4
    (vla-insertblock	(vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
			(vlax-3d-point (cadr (assoc pos1 ma_table)))
			nom4
			(vla-get-xscalefactor ent)
			(vla-get-yscalefactor ent)
			(vla-get-zscalefactor ent)
			(vla-get-rotation ent)
      )
 )
)

;; 3) Liste des position possible ;;



(setq ma_table '(("pos1" (0.0 44.45 0.0)) ("pos2" (0.0 88.9 0.0)) ("pos3" (0.0 133.35 0.0))))
	
  )


;; 4) Boite de dialogue pour choix multiple ;;



(defun Selection_Bloc (/ Dcl_Id% Return# List1@ Value1$)
  (princ "\nSelection_Bloc")(princ)
  ; Set Default Variables
  (if (not *MyMultiLists@);Unique global variable name to store dialog info
    (setq *MyMultiLists@ (list nil "" ""))
  );if
  (setq Value1$ (nth 1 *MyMultiLists@)
        List1@ (list "BIM + 1 Plaque de protection + 2x1U" "BIM + 1 Plaque de protection+1x2U")
  );setq
  ; Load Dialog
  (setq Dcl_Id% (load_dialog "SelectionBloc.dcl"))
  (new_dialog "Selectionbloc" Dcl_Id%)
  ; Set Dialog Initial Settings
  (set_tile "Title" " Selection d'un Bloc")
  (set_tile_list "List1" List1@ Value1$);*Included
  ; Dialog Actions
  (action_tile "List1" "(set_list_value \"List1@\" \"Value1$\")");*Included
  (setq Return# (start_dialog))
  ; Unload Dialog
  (setq *MyMultiLists@ (list nil Value1$))
  
 ; Dialog Actions
  (action_tile "accept" "(done_dialog 1)");You can change the default Return#
  (action_tile "cancel" "(done_dialog 0)")
  (setq Return# (start_dialog))
  ; Unload Dialog
  (unload_dialog Dcl_Id%)
  (princ "\n")(princ Return#);Optional
  (princ)
)

(defun set_tile_list (KeyName$ ListName@ Selected / Item)
  (start_list KeyName$ 3)
  (mapcar 'add_list ListName@)
  (end_list)
  (foreach Item (if (listp Selected) Selected (list Selected))
   (if (member Item ListName@)
     (set_tile KeyName$ (itoa (- (length ListName@) (length (member Item ListName@)))))
   );if
  );foreach
);defun set_tile_list


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;                                                                ;;
;;                       Fin du Programme                         ;;
;;                                                                ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 Edit: Hum si je laisse le C: au defun du programme selection bloc  je purrais pas le rappeler

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 114 sur 118

Kevin_Megel
Mentor
Mentor

j'ai commencer une phase de texte, j'ai donc testé cette partie

 

(defun patrick:ajouter_object (rea obj / ent nom ma_table nom)
  (setq ent (vlax-ename->vla-object (last obj)))
  (and	(eq (vla-get-objectname ent) "AcDbBlockReference")
(cond
	  ((vl-position (vla-get-effectivename ent) '("NXAMP4x4" "NXAMP4x1" "LA8" "LA4X" "LABPLM10000"))
	    (setq nom "plaqueventil")
	  )
(and nom
    (vla-insertblock	(vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
			(vlax-3d-point (cadr (assoc pos1 ma_table)))
			nom
			(vla-get-xscalefactor ent)
			(vla-get-yscalefactor ent)
			(vla-get-zscalefactor ent)
			(vla-get-rotation ent)
      )
 )
	  )
	)
  (setq ma_table '(("pos1" (0.0 44.45 0.0)) ("pos2" (0.0 88.9 0.0)) ("pos3" (0.0 133.35 0.0))))
  (princ)
  )

 

pour au moin avoir cette partie, le temps de finir le reste

 

j'ai testé dans le Visual Lisp : j'ai rien eu de particulier

j'ai testé dans Autocad : il me met rien de particulier

 

je test la lisp, et la rien ne marche

 

j'ai ajouter tout les bloc depuis le desing center, mais rien n'y fait j'ai pas la petite plaque qui s'ajoute au dessu de premier bloc

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 115 sur 118

patrick_35
Collaborator
Collaborator
Salut 1) Ta variable ma_table doit-être définie en dehors de la fonction du réacteur et avant de lancer le réacteur 2) Dans la liste de ma_table, tu dois retrouver au moins (et logiquement plus) les noms de blocs que tu as définis dans le réacteur. @+
0 J'aime
Message 116 sur 118

Kevin_Megel
Mentor
Mentor

ok merci !

 

Bon je clos le sujet, Finalemet queqlue soit le language je m'en sort pas, on va arrêter les frais !!! j'ai du suffisament énerver tout le monde avec mes questions !

 

Aller a plus

 

Sujet clos !

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 117 sur 118

Kevin_Megel
Mentor
Mentor

bon bon bon, je voulais vraiment arrêter l'apprentissage du code, et tout laisser tombé, mais j'ai vraiment besoin de ce programme, et en plus ça me rend dingue de ne pas finr ce que j'ai commencé,

 

j'ai pris quelque vacance aussi hstoir de faire un RAZ.

 

donc on reprend !

 

Première question, et je me dit que j'aurais du commencé par la ! comment on reconnais un reacteur ?

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 118 sur 118

patrick_35
Collaborator
Collaborator

Salut

Pour moi, la 1ère question serait d'avoir un CDC (cahier des charges) avec un grafcet si possible afin de poser le problème.
On a abordé trop de sujets à mon gout pour s'y retrouver et pour un néophyte, ce n'est pas une mince affaire.


Donc, tu indiques clairement le besoin, le résultat à obtenir et les éléments que tu as.


A partir de là, on commence à définir un lisp, quelque chose de simple que l'on fera évoluer au fur et à mesure des besoins.


Commence déjà avec un nouveau sujet.

@+

0 J'aime