CADxp: AUTOMATISATION OBJECT DATA - CADxp

Aller au contenu

  • 2 Pages +
  • 1
  • 2

AUTOMATISATION OBJECT DATA automatisation attribution et remplissage des object data aux objet

#1 L'utilisateur est hors-ligne   NBAMBOUCAD 

  • Member
  • PipPip
  • Groupe : Membres
  • Messages : 16
  • Inscrit(e) : 08-avril 19

Posté 08 avril 2019 - 15:09

Bonjour,


Dans le cadre d'un projet je dois attribuer une table object data à tous les éléments du dessin en fonction de leur calque. Je cherche une solution automatisé afin d'attribuer les tables d'Objects Data au éléments du dessin autrement que en sélectionnant le différents calques un par un.
N'y connaissant rien en programmation, je vous sollicite afin de trouver des pistes me permettant d'aboutir à ce résultat.


D'autre part, une fois les tables de données objet (Object data) attribués aux différents éléments je désire trouver un moyen assez rapide afin de copier certains attribut des objet dans les champs "Object Data" correspondants.
Par exemple copier la valeur de l'orientation d'un bloc (Valeur Attribut "Rotation") dans le champs OD correspondant (Valeur Attribut "ARE_ORIENT"), comme dans la pièce jointe.

Je fais actuellement à la main ces manipulation et c'est une énorme perte de temps. Je suis preneur de toute solution aussi peu élaboré soit-elle!


Merci d'avance!!
0

#2 L'utilisateur est hors-ligne   bonuscad 

  • ceinture rouge et blanche 8em dan
  • Groupe : Membres
  • Messages : 4655
  • Inscrit(e) : 20-juin 03

Posté 08 avril 2019 - 16:16

Bonjour,

Je te redirige vers le forum de map où un sujet que j'ai initié pourrait t’intéresser.

Propriétés d'objets vers Object Data (OD de Map)

Après pour les attributs de bloc c'est possible, mais je n'ai pas de routine générique à te proposer. Il faudrait un exemple concret (NB: Y a pas de pièces jointes !)


Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
-1

#3 L'utilisateur est hors-ligne   NBAMBOUCAD 

  • Member
  • PipPip
  • Groupe : Membres
  • Messages : 16
  • Inscrit(e) : 08-avril 19

Posté 09 avril 2019 - 07:38

Bonjour,


Merci pour ta réactivité, oui j'ai vu ce sujet avant de créer le miens cependant si j'ai bien compris le sujet que tu avais initié permettait de créer une table Object data directement avec les attribut de l'objet.

Pour ma part ce n'est pas exactement la même problématique. Je m'explique, je possède déjà des tables de données d'Object Data, celles-ci sont créées avec un certain nombre de champs qu'il faut remplir.
Il faut donc attribuer les Tables d'OD aux différents objets des calques avant de pouvoir les remplir.
Ex: les objets du calque "ASS--A_EQ" doivent être associés à la table "A_EQ"(Equipement assainissement). Le suffixe du calque (les 4 derniers caratères) correspond au nom de la Table à leur attribuer.

Voici pour la première partie de ma problématique.
La deuxième partie de la problématique serait donc de copier des attributs des propriétés existantes, dans les tables existantes qui ont été préalablement attribuée aux objets.

Merci d'avance pour toute suggestion!

PS: Je n'arrive malheureusement pas à joindre de fichier "Erreur Le serveur a retourné une erreur durant l'envoi."




Voir le messagebonuscad, le 08 avril 2019 - 16:16 , dit :

Bonjour,

Je te redirige vers le forum de map où un sujet que j'ai initié pourrait t’intéresser.

Propriétés d'objets vers Object Data (OD de Map)

Après pour les attributs de bloc c'est possible, mais je n'ai pas de routine générique à te proposer. Il faudrait un exemple concret (NB: Y a pas de pièces jointes !)

0

#4 L'utilisateur est hors-ligne   lecrabe 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 8320
  • Inscrit(e) : 10-décembre 03
  • LocationLoire (42)

Posté 09 avril 2019 - 08:02

Hello

Deja la routine ZH de Gilles t'aidera beaucoup !

Elle permet le Zoom sur les Entites dont tu donnes le HANDLE ...

Je l'utilise parfois quand AutoCAD signale un probl sur une entite en donnant le HANDLE ...

Merci Gilles, Bye, lecrabe


;;
;; ZH par GC 
;; 
;; Sélectionne les objets présents dans l'espace courant d'après leurs "handle"
;;

(defun c:zh (/ space ss obj hlst olst kw i l)
(vl-load-com)
(or *acdoc*
(setq *acdoc* (vla-get-ActiveDocument (vlax-get-acad-object)))
)
(setq space (vla-get-Block (vla-get-ActiveLayout *acdoc*))
ss (ssadd)
)
(sssetfirst nil nil)
(initget 1)
(setq hlst
(getstring
"\nEntrez les handles à sélectionner séparés par des virgules: "
)
hlst (str2lst hlst ",")
)
(foreach h hlst
(if
(and
(not (vl-catch-all-error-p
(setq obj (vl-catch-all-apply
'vla-HandleToObject
(list *acdoc* h)
)
)
)
)
(equal (vla-ObjectIdToObject *acdoc* (vla-get-OwnerId obj))
space
)
)
(progn
(setq olst (cons obj olst))
(ssadd (vlax-vla-object->ename obj) ss)
)
)
)
(if ss
(progn
(sssetfirst nil nil)
(sssetfirst nil ss)
(setq i -1
l (length olst)
)
(while
(and
(not (initget "Suivant Précédent Tous"))
(or (setq
kw (getkword "Zoom sur [Suivant/Précédent/Tous] <S>: ")
)
(setq kw "Suivant")
)
)
(if (= kw "Suivant")
(setq i (rem (1+ i) l))
(setq i (if (minusp (1- i))
(1- l)
(1- i)
)
)
)
(if (= kw "Tous")
(ZoomObject olst)
(ZoomObject (list (nth i olst)))
)
)
)
)
(princ)
)

;; ZoomObject Effectue un zoom sur les objets contenus dans la liste
;;
;; Argument
;; objlst : une liste de vla-object
;;
;; Variables
;; dir : normale du plan de la vue courante
;; ang : angle de la vue courante
;; 3x3 : matrice de transformation du SCG vers la vue courante (dimension 3)
;; 4x4 : matrice de transformation du SCG vers la vue courante (dimension 4)
;; ptlst : liste des points minimum et maximum des bounding-boxes des objets sélectionnés (SCG)

(defun ZoomObject (objlst / dir ang 3x3 4x4 ptlst)
(vl-load-com)
(setq dir (trans '(0 0 1) 2 0 T)
ang (- (getvar "viewtwist"))
3x3 (mxm (mapcar '(lambda (x) (trans x 0 dir))
'((1 0 0) (0 1 0) (0 0 1))
)
(list (list (cos ang) (- (sin ang)) 0)
(list (sin ang) (cos ang) 0)
'(0 0 1)
)
)
4x4 (append
(mapcar
'(lambda (v o)
(append v (list o))
)
3x3
'(0 0 0)
)
(list '(0 0 0 1))
)
)
(foreach obj objlst
(vla-TransformBy obj (vlax-tmatrix (trp 4x4)))
(vla-getBoundingBox obj 'minpt 'maxpt)
(vla-TransformBy obj (vlax-tmatrix 4x4))
(setq ptlst (cons (vlax-safearray->list minpt)
(cons (vlax-safearray->list maxpt) ptlst)
)
)
)
(vla-ZoomWindow
(vlax-get-acad-object)
(vlax-3d-point (mxv 3x3 (apply 'mapcar (cons 'min ptlst))))
(vlax-3d-point (mxv 3x3 (apply 'mapcar (cons 'max ptlst))))
)
)

;; str2lst
;; Transforme un chaine avec séparateur en liste de chaines
;;
;; Arguments
;; str : la chaine à transformer en liste
;; sep : le séparateur

(defun str2lst (str sep / pos)
(if (setq pos (vl-string-search sep str))
(cons (substr str 1 pos)
(str2lst (substr str (+ (strlen sep) pos 1)) sep)
)
(list str)
)
) 



;; transpose une matrice Doug Wilson

(defun trp (m)
(apply 'mapcar (cons 'list m))
)

;; Apply a transformation matrix to a vector by Vladimir Nesterovsky

(defun mxv (m v)
(mapcar '(lambda (r) (apply '+ (mapcar '* r v))) m)
)

;; Multiply two matrices by Vladimir Nesterovsky

(defun mxm (m q)
(mapcar '(lambda (r) (mxv (trp q) r)) m)
) 

Autodesk Expert Elite Team
0

#5 L'utilisateur est hors-ligne   lecrabe 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 8320
  • Inscrit(e) : 10-décembre 03
  • LocationLoire (42)

Posté 09 avril 2019 - 08:07

Hello

Ensuite si tu as "sur le cote" une entite de reference (ou maitre) - Avec les bonnes tables OD -
Alors la routine COPY_OD d'Autodesk t'aidera aussi !?
Voir le sous-dossier <C:\Program Files\Autodesk\AutoCAD 201X\Map\Sample>

Elle agit comme le Pinceau (Peindre) mais en copiant UNIQUEMENT les tables OD sur les N objets de destination ...

Bye, lecrabe
Autodesk Expert Elite Team
0

#6 L'utilisateur est hors-ligne   NBAMBOUCAD 

  • Member
  • PipPip
  • Groupe : Membres
  • Messages : 16
  • Inscrit(e) : 08-avril 19

Posté 09 avril 2019 - 09:03

Merci LeCrabe,


Pour la sélection d'objet par de problème, j'ai créé un enregistreur d'action, celui:
-Ouvre l'outil sélection par filtre, invite à sélectionner un calque
-Isole les éléments de la sélection
-Ouvre l'outil "Onglet Map - Données et analyses/ Données d'objet/ Associer ou dissocier les objets" qui invite a renseigner la table à attribuer.
Il reste ensuite plus qu'a cliquer sur "Associer aux objets <" et sélectionner les objets préalablement isolé.

Cet enregistreur fait gagner un peu de temps, mais je souhaiterais automatiser l'association d'une table à un calque.
Je pense que le logigramme est le suivant:
[img]https://www.hebergeur-image.com/][IMG]https://www.hebergeur-image.com/upload/83.206.9.201-5cac5145828e4.jpg[/IMG][/URL][/img]





Voir le messagelecrabe, le 09 avril 2019 - 08:02 , dit :

Hello

Deja la routine ZH de Gilles t'aidera beaucoup !

Elle permet le Zoom sur les Entites dont tu donnes le HANDLE ...

Je l'utilise parfois quand AutoCAD signale un probl sur une entite en donnant le HANDLE ...

Merci Gilles, Bye, lecrabe


;;
;; ZH par GC 
;; 
;; Sélectionne les objets présents dans l'espace courant d'après leurs "handle"
;;

(defun c:zh (/ space ss obj hlst olst kw i l)
(vl-load-com)
(or *acdoc*
(setq *acdoc* (vla-get-ActiveDocument (vlax-get-acad-object)))
)
(setq space (vla-get-Block (vla-get-ActiveLayout *acdoc*))
ss (ssadd)
)
(sssetfirst nil nil)
(initget 1)
(setq hlst
(getstring
"\nEntrez les handles à sélectionner séparés par des virgules: "
)
hlst (str2lst hlst ",")
)
(foreach h hlst
(if
(and
(not (vl-catch-all-error-p
(setq obj (vl-catch-all-apply
'vla-HandleToObject
(list *acdoc* h)
)
)
)
)
(equal (vla-ObjectIdToObject *acdoc* (vla-get-OwnerId obj))
space
)
)
(progn
(setq olst (cons obj olst))
(ssadd (vlax-vla-object->ename obj) ss)
)
)
)
(if ss
(progn
(sssetfirst nil nil)
(sssetfirst nil ss)
(setq i -1
l (length olst)
)
(while
(and
(not (initget "Suivant Précédent Tous"))
(or (setq
kw (getkword "Zoom sur [Suivant/Précédent/Tous] <S>: ")
)
(setq kw "Suivant")
)
)
(if (= kw "Suivant")
(setq i (rem (1+ i) l))
(setq i (if (minusp (1- i))
(1- l)
(1- i)
)
)
)
(if (= kw "Tous")
(ZoomObject olst)
(ZoomObject (list (nth i olst)))
)
)
)
)
(princ)
)

;; ZoomObject Effectue un zoom sur les objets contenus dans la liste
;;
;; Argument
;; objlst : une liste de vla-object
;;
;; Variables
;; dir : normale du plan de la vue courante
;; ang : angle de la vue courante
;; 3x3 : matrice de transformation du SCG vers la vue courante (dimension 3)
;; 4x4 : matrice de transformation du SCG vers la vue courante (dimension 4)
;; ptlst : liste des points minimum et maximum des bounding-boxes des objets sélectionnés (SCG)

(defun ZoomObject (objlst / dir ang 3x3 4x4 ptlst)
(vl-load-com)
(setq dir (trans '(0 0 1) 2 0 T)
ang (- (getvar "viewtwist"))
3x3 (mxm (mapcar '(lambda (x) (trans x 0 dir))
'((1 0 0) (0 1 0) (0 0 1))
)
(list (list (cos ang) (- (sin ang)) 0)
(list (sin ang) (cos ang) 0)
'(0 0 1)
)
)
4x4 (append
(mapcar
'(lambda (v o)
(append v (list o))
)
3x3
'(0 0 0)
)
(list '(0 0 0 1))
)
)
(foreach obj objlst
(vla-TransformBy obj (vlax-tmatrix (trp 4x4)))
(vla-getBoundingBox obj 'minpt 'maxpt)
(vla-TransformBy obj (vlax-tmatrix 4x4))
(setq ptlst (cons (vlax-safearray->list minpt)
(cons (vlax-safearray->list maxpt) ptlst)
)
)
)
(vla-ZoomWindow
(vlax-get-acad-object)
(vlax-3d-point (mxv 3x3 (apply 'mapcar (cons 'min ptlst))))
(vlax-3d-point (mxv 3x3 (apply 'mapcar (cons 'max ptlst))))
)
)

;; str2lst
;; Transforme un chaine avec séparateur en liste de chaines
;;
;; Arguments
;; str : la chaine à transformer en liste
;; sep : le séparateur

(defun str2lst (str sep / pos)
(if (setq pos (vl-string-search sep str))
(cons (substr str 1 pos)
(str2lst (substr str (+ (strlen sep) pos 1)) sep)
)
(list str)
)
) 



;; transpose une matrice Doug Wilson

(defun trp (m)
(apply 'mapcar (cons 'list m))
)

;; Apply a transformation matrix to a vector by Vladimir Nesterovsky

(defun mxv (m v)
(mapcar '(lambda (r) (apply '+ (mapcar '* r v))) m)
)

;; Multiply two matrices by Vladimir Nesterovsky

(defun mxm (m q)
(mapcar '(lambda (r) (mxv (trp q) r)) m)
) 





0

#7 L'utilisateur est hors-ligne   NBAMBOUCAD 

  • Member
  • PipPip
  • Groupe : Membres
  • Messages : 16
  • Inscrit(e) : 08-avril 19

Posté 09 avril 2019 - 09:13

Pardon, le dernier URL n'a pas fonctionné en voici un fonctionnel
https://image.noelsh...-par-calque.jpg

Merci !

Voir le messagelecrabe, le 09 avril 2019 - 08:07 , dit :

Hello

Ensuite si tu as "sur le cote" une entite de reference (ou maitre) - Avec les bonnes tables OD -
Alors la routine COPY_OD d'Autodesk t'aidera aussi !?
Voir le sous-dossier <C:\Program Files\Autodesk\AutoCAD 201X\Map\Sample>

Elle agit comme le Pinceau (Peindre) mais en copiant UNIQUEMENT les tables OD sur les N objets de destination ...

Bye, lecrabe

0

#8 L'utilisateur est hors-ligne   bonuscad 

  • ceinture rouge et blanche 8em dan
  • Groupe : Membres
  • Messages : 4655
  • Inscrit(e) : 20-juin 03

Posté 09 avril 2019 - 10:45

Sans pouvoir vraiment tester faute de DWG exemple, essayes ceci pour attribuer les tables.

; str2lst
;; Transforme un chaine avec séparateur en liste de chaines
;;
;; Arguments
;; str : la chaine à transformer en liste
;; sep : le séparateur
;;
;; Exemples
;; (str2lst "a b c" " ") -> ("a" "b" "c")
;; (str2lst "1,2,3" ",") -> ("1" "2" "3")
(defun str2lst (str sep / pos)
	(if (setq pos (vl-string-search sep str))
				(cons (substr str 1 pos)
				(str2lst (substr str (+ (strlen sep) pos 1)) sep)
				)
				(list str)
	)
)
;; ListBox (gile)
;; Boite de dialogue permettant un ou plusieurs choix dans une liste
;;
;; Arguments
;; title : le titre de la boite de dialogue (chaîne)
;; msg ; message (chaîne), "" ou nil pour aucun
;; keylab : une liste d'association du type ((key1 . label1) (key2 . label2) ...)
;; flag : 0 = liste déroulante
;; 1 = liste choix unique
;; 2 = liste choix multipes
;;
;; Retour : la clé de l'option (flag = 0 ou 1) ou la liste des clés des options (flag = 2)
;;
;; Exemple d'utilisation
;; (listbox "Présentation" "Choisir une présentation" (mapcar 'cons (layoutlist) (layoutlist)) 1)

(defun ListBox (title msg keylab flag / tmp file dcl_id choice)
(setq tmp (vl-filename-mktemp "tmp.dcl")
file (open tmp "w")
)
(write-line
(strcat "ListBox:dialog{label=\"" title "\";")
file
)
(if (and msg (/= msg ""))
(write-line (strcat ":text{label=\"" msg "\";}") file)
)
(write-line
(cond
((= 0 flag) "spacer;:popup_list{key=\"lst\";")
((= 1 flag) "spacer;:list_box{key=\"lst\";")
(T "spacer;:list_box{key=\"lst\";multiple_select=true;")
)
file
)
(write-line "}spacer;ok_cancel;}" file)
(close file)
(setq dcl_id (load_dialog tmp))
(if (not (new_dialog "ListBox" dcl_id))
(exit)
)
(start_list "lst")
(mapcar 'add_list (mapcar 'cdr keylab))
(end_list)
(action_tile
"accept"
"(or (= (get_tile \"lst\") \"\")
(if (= 2 flag) (progn
(foreach n (str2lst (get_tile \"lst\") \" \")
(setq choice (cons (nth (atoi n) (mapcar 'car keylab)) choice)))
(setq choice (reverse choice)))
(setq choice (nth (atoi (get_tile \"lst\")) (mapcar 'car keylab)))))
(done_dialog)"
)
(start_dialog)
(unload_dialog dcl_id)
(vl-file-delete tmp)
choice
)
(defun c:NBAMBOUCAD ( / flag l_lay tbl_lay js n ent)
	(setq flag T l_lay nil)
	(while (setq tbl_lay (tblnext "LAYER" flag))
		(setq l_lay (cons (cdr (assoc 2 tbl_lay)) l_lay))
		(setq flag nil)
	)
	(setq l_lay (listbox "Calques du desin" "Choisir un ou plusieurs calques" (mapcar 'cons l_lay l_lay) 2))
	(cond
		(l_lay
			(foreach el l_lay
				(setq js (ssget "_X" (list (cons 8 el) (cons 410 (getvar "CTAB")))))
				(cond
					(js
						(repeat (setq n (sslength js))
							(setq ent (ssname js (setq n (1- n))))
							(if (not (member (substr el (- (strlen el) 3)) (ade_odgettables ent)))
								(ade_odaddrecord ent (substr el (- (strlen el) 3)))
							)
						)
					)
				)
			)
		)
	)
	(prin1)
)

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
0

#9 L'utilisateur est hors-ligne   NBAMBOUCAD 

  • Member
  • PipPip
  • Groupe : Membres
  • Messages : 16
  • Inscrit(e) : 08-avril 19

Posté 09 avril 2019 - 12:46

Merci bonuscad,


J'essaye, cependant le programme ne semble me permettre que de créer une liste.
0

#10 L'utilisateur est hors-ligne   bonuscad 

  • ceinture rouge et blanche 8em dan
  • Groupe : Membres
  • Messages : 4655
  • Inscrit(e) : 20-juin 03

Posté 09 avril 2019 - 22:06

Avec ton fichier exemple, pour moi ça fonctionne.
J'ai quand même fiabilisé le code pour éviter des erreurs de tables inconnues.
(defun c:NBAMBOUCAD ( / flag l_lay tbl_lay js n ent)
	(setq flag T l_lay nil)
	(while (setq tbl_lay (tblnext "LAYER" flag))
		(setq l_lay (cons (cdr (assoc 2 tbl_lay)) l_lay))
		(setq flag nil)
	)
	(setq l_lay (listbox "Calques du desin" "Choisir un ou plusieurs calques" (mapcar 'cons l_lay l_lay) 2))
	(cond
		(l_lay
			(foreach el l_lay
				(setq js (ssget "_X" (list (cons 8 el) (cons 410 (getvar "CTAB")))))
				(cond
					(js
						(repeat (setq n (sslength js))
							(setq ent (ssname js (setq n (1- n))))
							(if
								(and
									(member (substr el (- (strlen el) 3)) (ade_odtablelist))
									(not (member (substr el (- (strlen el) 3)) (ade_odgettables ent)))
								)
								(ade_odaddrecord ent (substr el (- (strlen el) 3)))
							)
						)
					)
				)
			)
		)
	)
	(prin1)
)

Fonction à remplacer, les autres de (gile) sont à conserver comme posté précédemment.

Pour l'utilisation tu sélectionnes dans la liste proposée le/les calques à traiter. Pour un choix multiple maintenir la touche "Ctrl" lors des clics, pour tout sélectionner cliquer sur le 1er élément et avec l'ascenseur aller en bas de la liste et cliquer sur le dernier élément en maintenant la touche "Shift" enfoncé.Une fois la sélection effectuée, valider ET alors les tables de données d'objet seront attribués aux objets, pour peu que les tables existent et correspondent aux critères.
Tu pourra voir que la plupart des bloc ont reçu leur table correspondante avec les valeur de champ par défaut.

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
0

#11 L'utilisateur est hors-ligne   NBAMBOUCAD 

  • Member
  • PipPip
  • Groupe : Membres
  • Messages : 16
  • Inscrit(e) : 08-avril 19

Posté 09 avril 2019 - 22:57

Merci beaucoup Bonuscad,

Je teste ça demain!
0

#12 L'utilisateur est hors-ligne   NBAMBOUCAD 

  • Member
  • PipPip
  • Groupe : Membres
  • Messages : 16
  • Inscrit(e) : 08-avril 19

Posté 10 avril 2019 - 07:41

Nickel merci beaucoup ça marche super!!



Cela m'avait échappe mais il y quelques calques où le suffixe des calques qui correspond au nom de la table n'est pas composé de 4 mais de 5 caractère.
Ex:
Cela marche pour les calques:
- BAT--B_LD qui associe la table B_LD
- MEDIA--I_SU qui associe la table I_SU

Mais ne marche pas pour les calque tel que:
- VOI--I_SIGN qui n'arrive pas à associer la table M_SIGN
- ELEC--E_TRON qui n'arrive pas à associer la table E_TRON

Solution:

Serait-il possible de passer d'une association calque/table correspondant aux 4 derniers caractères à une association correspondant aux caractères se trouvant après les caractère "--" car ces caractères sont toujours présent dans le nom des calques et les caractères suivant "--" correspondent systématiquement au nom de la table associé.

Merci d'avance et merci encore à vous, vous êtes mes sauveurs!!
0

#13 L'utilisateur est hors-ligne   bonuscad 

  • ceinture rouge et blanche 8em dan
  • Groupe : Membres
  • Messages : 4655
  • Inscrit(e) : 20-juin 03

Posté 10 avril 2019 - 09:55

Alors d'après ce que j'ai compris, j'ai simplifié au maximum la procédure:
Ne sélectionne automatiquement que les calques contenant "--" dans leurs noms pour attribuer la table aux objets contenu dans ces calques respectifs. Plus besoin de faire une sélection de calques. Le code se résume à cela:
(defun c:NBAMBOUCAD ( / flag l_lay tbl_lay js n ent find_str)
	(setq flag T l_lay nil)
	(while (setq tbl_lay (tblnext "LAYER" flag))
		(if (wcmatch (cdr (assoc 2 tbl_lay)) "*--*")
			(setq l_lay (cons (cdr (assoc 2 tbl_lay)) l_lay))
		)
		(setq flag nil)
	)
	(cond
		(l_lay
			(foreach el l_lay
				(setq js (ssget "_X" (list (cons 8 el) (cons 410 (getvar "CTAB")))))
				(cond
					(js
						(repeat (setq n (sslength js))
							(setq
								ent (ssname js (setq n (1- n)))
								find_str (substr el (+ 3 (vl-string-search "--" el)))
							)
							(if
								(and
									(member find_str (ade_odtablelist))
									(not (member find_str (ade_odgettables ent)))
								)
								(ade_odaddrecord ent find_str)
							)
						)
					)
				)
			)
		)
	)
	(prin1)
)

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
0

#14 L'utilisateur est hors-ligne   NBAMBOUCAD 

  • Member
  • PipPip
  • Groupe : Membres
  • Messages : 16
  • Inscrit(e) : 08-avril 19

Posté 10 avril 2019 - 10:20

Wahouu, quelle efficacité ça marche nickel!!


Bon j'ai un nouveau défi pour toi Image IPB
Je souhaiterais ensuite automatiser le remplissage de certains champs des object data en fonction du bloc ou du type de ligne.

Je te joins le fichier résumant le différent type de lien à créer:


Ps: Si tu réussi ça envois moi aussi ton compte paypal Image IPB


Voir le messagebonuscad, le 10 avril 2019 - 09:55 , dit :

Alors d'après ce que j'ai compris, j'ai simplifié au maximum la procédure:
Ne sélectionne automatiquement que les calques contenant "--" dans leurs noms pour attribuer la table aux objets contenu dans ces calques respectifs. Plus besoin de faire une sélection de calques. Le code se résume à cela:
(defun c:NBAMBOUCAD ( / flag l_lay tbl_lay js n ent find_str)
	(setq flag T l_lay nil)
	(while (setq tbl_lay (tblnext "LAYER" flag))
		(if (wcmatch (cdr (assoc 2 tbl_lay)) "*--*")
			(setq l_lay (cons (cdr (assoc 2 tbl_lay)) l_lay))
		)
		(setq flag nil)
	)
	(cond
		(l_lay
			(foreach el l_lay
				(setq js (ssget "_X" (list (cons 8 el) (cons 410 (getvar "CTAB")))))
				(cond
					(js
						(repeat (setq n (sslength js))
							(setq
								ent (ssname js (setq n (1- n)))
								find_str (substr el (+ 3 (vl-string-search "--" el)))
							)
							(if
								(and
									(member find_str (ade_odtablelist))
									(not (member find_str (ade_odgettables ent)))
								)
								(ade_odaddrecord ent find_str)
							)
						)
					)
				)
			)
		)
	)
	(prin1)
)


0

#15 L'utilisateur est hors-ligne   NBAMBOUCAD 

  • Member
  • PipPip
  • Groupe : Membres
  • Messages : 16
  • Inscrit(e) : 08-avril 19

Posté 10 avril 2019 - 10:34

Il y avait une petite erreur dans l'ancien fichier, je l'ai modifié, bien prendre la version du message mise à jour.
0

#16 L'utilisateur est hors-ligne   bonuscad 

  • ceinture rouge et blanche 8em dan
  • Groupe : Membres
  • Messages : 4655
  • Inscrit(e) : 20-juin 03

Posté 10 avril 2019 - 15:01

Un peu compliqué ton histoire...
Déjà quand tu dis "dernier caractère du nom du bloc ou ligne"
Pour le nom du bloc je veux bien, mais le nom de la ligne je le pioche où?

De plus j'ai du mal à saisir "dernier caractère" ou "0+dernier caractère" ou encore "13ème caractère", qu'est ce qui me permet de faire le distinguo entre ces 3 possibilités?

Pour l'instant j'en suis rendu là, si tu veux essayer...
(defun c:NBAMBOUCAD ( / flag l_lay tbl_lay js n ent find_str l value)
	(setq flag T l_lay nil)
	(while (setq tbl_lay (tblnext "LAYER" flag))
		(if (wcmatch (cdr (assoc 2 tbl_lay)) "*--*")
			(setq l_lay (cons (cdr (assoc 2 tbl_lay)) l_lay))
		)
		(setq flag nil)
	)
	(cond
		(l_lay
			(foreach el l_lay
				(setq js (ssget "_X" (list (cons 8 el) (cons 410 (getvar "CTAB")))))
				(cond
					(js
						(repeat (setq n (sslength js))
							(setq
								ent (ssname js (setq n (1- n)))
								find_str (substr el (+ 3 (vl-string-search "--" el)))
							)
							(cond
								((and
									(member find_str (ade_odtablelist))
									(not (member find_str (ade_odgettables ent)))
								 )
									(ade_odaddrecord ent find_str)
									(foreach tbl (ade_odgettables ent)
										(setq l (mapcar 'cdar (cdaddr (ade_odtabledefn tbl))))
										(foreach el l
											(if (or (wcmatch el "*_TYPE") (wcmatch el "*_TYPEREG") (wcmatch el "*_NATURE"))
												(if (setq value (cdr (assoc 2 (entget ent))))
													(progn
														(if (vl-string-position (ascii "_") value nil T)
															(setq value (substr value (+ 2 (vl-string-position (ascii "_") value nil T))))
														)
														(ade_odsetfield ent tbl el 0 value)
													)
												)
											)
										)
									)
								)
							)
						)
					)
				)
			)
		)
	)
	(prin1)
)


Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
0

#17 L'utilisateur est hors-ligne   NBAMBOUCAD 

  • Member
  • PipPip
  • Groupe : Membres
  • Messages : 16
  • Inscrit(e) : 08-avril 19

Posté 10 avril 2019 - 15:34

Oui je sais que c'est plutôt galère,

Alors pour le nom de la ligne, on le trouve sous l'onglet "type de ligne" dans les propriétés de la ligne, cependant je ne sais pas si c'est un champ alphanumérique étant donné qu'on trouve aussi la représentation graphique de la ligne dans cet onglet. Je t'envoie un fichier avec des exemples de types de lignes:


C'est là le hic, la valeur de l'attribut dépends du nom du bloc exclusivement, du coup l'une des trois possibilité varie selon le type de bloc, je ne sais pas si il est possible d'entrer tout une liste de nom de bloc pour laquelle tel ou tel possibilité s'applique?

Du coup après test, la procédure marche nickel, cependant elle ne fait pas un filtre par rapport aux calque du document excel, je désirerai attribuer uniquement les bloc de la liste et non pas tous les calques du dessin (même si ceci on des champs "_TYPE" ou "_NATURE" etc..) du coup ceci nous ramène au paragraphe précédent su la liste.
Ou sinon je dissocier les deux procédure puis faire la deuxième en isolant les blocs concerné je pense, tu confirmes?

Tu trouveras dans le fichier dwg exemple des blocs ne se trouvant pas dans la liste, ça sera plus parlant

Merci beaucoup bonuscad, c'est déjà génial d'arriver jusqu'ici!
0

#18 L'utilisateur est hors-ligne   bonuscad 

  • ceinture rouge et blanche 8em dan
  • Groupe : Membres
  • Messages : 4655
  • Inscrit(e) : 20-juin 03

Posté 10 avril 2019 - 20:15

Je commence à être de moins en moins sure de moi avec toute ces conditions particulière à remplir, tente ceci...
(defun c:NBAMBOUCAD ( / l_der l_0 l_13 flag l_lay tbl_lay js n ent find_str l value)
(setq l_der
'(
"type_eq_ass_A"
"type_eq_ass_M"
"type_eq_ass_AG"
"type_eq_ass_MG"
"type_eq_ass_G"
"type_eq_ass_I"
"type_eq_ass_E"
"type_eq_ass_C"
"type_eq_ass_R"
"type_eq_ass_L"
"type_eq_ass_O"
"type_eq_ass_D"
"type_eq_ass_N"
"type_eq_ass_U"
"type_eq_ass_V"
"type_eq_ass_S"
"type_eq_ass_T"
"type_eq_ass_H"
"type_eq_ass_F"
"type_eq_cu_B"
"type_eq_cu_R"
"type_eq_cu_V"
"type_eq_cu_E"
"type_eq_cu_D"
"type_eq_cu_A"
"type_sup_P"
"type_sup_O"
"type_sup_R"
"type_sup_C"
"type_arm_gaz_C"
"type_arm_gaz_A"
"type_arm_gaz_D"
"type_eq_gaz_E"
"type_eq_gaz_V"
"type_eq_gaz_I"
"type_eq_gaz_S"
"type_eq_gaz_T"
"type_eq_gaz_M"
"type_eq_gaz_R"
"type_eq_gaz_O"
"type_eq_gaz_Q"
"type_eq_gaz_N"
"type_eq_gaz_P"
"type_eq_gaz_C"
"type_eq_gaz_B"
"type_arm_rti_B"
"type_arm_rti_L"
"type_arm_rti_A"
"type_arm_rti_F"
"type_arm_rti_T"
"type_arm_rti_M"
"type_poste_rti_C"
"type_poste_rti_P"
"type_poste_rti_O"
"type_poste_rti_D"
"type_poste_rti_T"
"type_poste_rti_M"
"type_sup_P"
"type_sup_O"
"type_sup_R"
"type_sup_C"
"type_ptlum_smuv_C"
"type_ptlum_smuv_L"
"type_ptlum_smuv_B"
"type_ptlum _smuv_P"
"type_acc_eau_I"
"type_acc_eau_E"
"type_acc_eau_C"
"type_acc_eau_D"
"type_acc _eau_B"
"type_point_eau_F"
"type_point_eau_I"
"type_point_eau_N"
"type_point_eau_A"
"type_point_eau_P"
"type_point_eau_L"
"type_zone_eau_U"
"type_zone_eau_S"
"type_zone_eau_R"
"type_zone_eau_P"
"type_zone_eau_T"
"type_zone_eau_C"
"type_zone_eau_H"
"type_reg_ass_N"
"type_reg_ass_C"
"type_reg_ass_R"
"type_reg_ass_S"
)
l_0
'(
"b_b1"
"b_b2"
"b_b3"
"b_b4"
"type_cloture_01"
"type_cloture_02"
"b_p2"
"b_p3"
"type_affl_smuv_01"
"type_affl_smuv_02"
"type_affl_smuv_03"
"type_affl_smuv_04"
"type_pt_obj_01"
"type_pt_obj_02"
"type_pt_obj_99"
"type_aff_smuv_01"
"type_aff_smuv_02"
"type_aff_smuv_03"
"type_gmob_smuv_01"
"type_gmob_smuv_02"
"type_gmob_smuv_03"
"type_gmob_smuv_04"
"type_pmob_smuv_05"
"type_pmob_smuv_06"
"type_pmob_smuv_07"
"type_pmob_smuv_08"
"m_e2"
"m_e1"
"m_e4"
"m_e5"
"type_arr_smuv_01"
"type_arr_smuv_02"
"type_arr_smuv_03"
"type_arr_smuv_05"
"type_arr_smuv_06"
"type_sign_smuv_01"
"type_sign_smuv_02"
"type_sign_smuv_03"
"type_sign_smuv_04"
"type_sign_smuv_05"
"type_sign_smuv_06"
"type_sign_ smuv_07"
"ft_c1"
"ft_c2"
"ft_c3"
"ft_c4"
"ft_f1"
"ft_f2"
"ft_f3"
"ft_f4"
"t_s1"
"t_s2"
"t_s3"
"t_s4"
"ft_t1"
"ft_t2"
"ft_t3"
"ft_t4"
"ft_t5"
"v_la1"
"v_la2"
"v_la3"
"v_c1"
"v_c2"
"v_c3"
)
l_13
'(
"nature_elec_E_TRA"
"nature_elec_C_TRA"
"nature_elec_S_TRA"
"nature_elec_I_TRA"
"nature_elec_A_TRA"
"nature_elec_E_RAC"
"nature_elec_C_RAC"
"nature_elec_S_RAC"
"nature_elec_I_RAC"
"nature_elec_A_RAC"
"nature_elec_E_POS"
"nature_elec_C_POS"
"nature_elec_S_POS"
)
)
	(setq flag T l_lay nil)
	(while (setq tbl_lay (tblnext "LAYER" flag))
		(if (wcmatch (cdr (assoc 2 tbl_lay)) "*--*")
			(setq l_lay (cons (cdr (assoc 2 tbl_lay)) l_lay))
		)
		(setq flag nil)
	)
	(cond
		(l_lay
			(foreach el l_lay
				(setq js (ssget "_X" (list (cons 8 el) (cons 410 (getvar "CTAB")))))
				(cond
					(js
						(repeat (setq n (sslength js))
							(setq
								ent (ssname js (setq n (1- n)))
								find_str (substr el (+ 3 (vl-string-search "--" el)))
							)
							(cond
								((and
									(member find_str (ade_odtablelist))
									(not (member find_str (ade_odgettables ent)))
								 )
									(ade_odaddrecord ent find_str)
									(foreach tbl (ade_odgettables ent)
										(setq l (mapcar 'cdar (cdaddr (ade_odtabledefn tbl))))
										(foreach el l
											(if (or (wcmatch el "*_TYPE") (wcmatch el "*_TYPEREG") (wcmatch el "*_NATURE"))
												(cond
													((and (eq (cdr (assoc 0 (entget ent))) "INSERT") (setq value (cdr (assoc 2 (entget ent)))))
														(cond
															((member value l_der)
																(progn
																	(if (vl-string-position (ascii "_") value nil T)
																		(ade_odsetfield ent tbl el 0 (substr value (+ 2 (vl-string-position (ascii "_") value nil T))))
																	)
																)
															)
															((member value l_0)
																(progn
																	(if (vl-string-position (ascii "_") value nil T)
																		(ade_odsetfield ent tbl el 0 (strcat "0" (substr value (+ 2 (vl-string-position (ascii "_") value nil T)))))
																	)
																)
															)
															((member value l_13)
																(progn
																	(if (substr value 13 1)
																		(ade_odsetfield ent tbl el 0 (substr value 13 1))
																	)
																)
															)
														)
													)
													((and
														(member (cdr (assoc 0 (entget ent))) '("LINE" "ARC" "CIRCLE" "LWPOLYLINE" "POLYLINE" "SPLINE" "ELLIPSE" "SPLINE" "XLINE" "RAY" "MLINE" "MPOLYGON"))
														(setq value (cdr (assoc 6 (entget ent))))
													 )
														(if (vl-string-position (ascii "_") value nil T)
															(ade_odsetfield ent tbl el 0 (substr value (+ 2 (vl-string-position (ascii "_") value nil T))))
														)
													)
												)
											)
										)
									)
								)
							)
						)
					)
				)
			)
		)
	)
	(prin1)
)


Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
0

#19 L'utilisateur est hors-ligne   lecrabe 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 8320
  • Inscrit(e) : 10-décembre 03
  • LocationLoire (42)

Posté 10 avril 2019 - 20:41

Hello Bruno

Ton courage & abnégation m impressionnent !

Surtout que le CDC / CCTP était relativement obscur !
Et qu'il a fallu tirer les vers du nez de Mr NBAMBOUCAD ...

Bonne soirée, Bye, lecrabe
Autodesk Expert Elite Team
0

#20 L'utilisateur est hors-ligne   NBAMBOUCAD 

  • Member
  • PipPip
  • Groupe : Membres
  • Messages : 16
  • Inscrit(e) : 08-avril 19

Posté 10 avril 2019 - 22:04

Je suis moi même impressionné par le dévouement de Bruno, et ne peut que le louer!
Je testes cette œuvre dès demain !
Encore merci

PS: tcheck tes MP
0

Partager ce sujet :


  • 2 Pages +
  • 1
  • 2


Réponse rapide

  

1 utilisateur(s) en train de lire ce sujet
0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)