CADxp: AUTOMATISATION OBJECT DATA - CADxp

Aller au contenu

  • 2 Pages +
  • 1
  • 2

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

#21 L'utilisateur est hors-ligne   NBAMBOUCAD 

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

Posté 11 avril 2019 - 07:52

Super la procédure marche du tonnerre!

Je te soumets juste une petite amélioration si possible:
Actuellement, les valeurs qui sont renseignés (d'après mes tests et si j'ai un petit peu compris le codage) dans les champs correspondent au caractères se trouvant après le dernier "_" du nom du bloc. Cependant parfois il y a deux caractères (ex: "type_eq_ass_AG" ou "ft_c1") du coup les valeurs renseigné dans les champs sont les deux caractères (ex: respectivement "XXX_TYPE"="AG" ou "XXX_TYPE"="c1".)

Serait -il possible que ce soir uniquement le dernier caractère de la chaîne du nom du bloc qui soit renseigné? (ex: Pour bloc "type_eq_ass_AG" valeur "XXX_TYPE"="G" ou pour ligne "ft_c1" valeur "XXX_TYPE"="1")


Et le tout dernier point serait d'automatiser le remplissage du champ "XXX_ORIENT" des tables OD par la valeur du champs "rotation" des propriétés de l'objet, du champ "XXX_LONG" des tables OD par la valeur du champs "Echelle en X", du champ "XXX_LARG" des tables OD par la valeur du champs "Echelle Y" et ceci pour tous les objets du dessin.
Ah oui et aussi ajouter la valeur "A" au champ "XXX_STAT" des tables OD pour tous les objets du dessin.



Merci d'avance! Image IPB
0

#22 L'utilisateur est hors-ligne   bonuscad 

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

Posté 11 avril 2019 - 11:09

Bon j'ai quelques problèmes...
J'ai appliqué tes souhaits :
pour "type_eq_ass_AG" mais aussi pour "type_eq_ass_MG" (c'est le codage qui a voulu cela)
pour "ft_c1" (aurait-il fallu l'appliquer aussi à "v_c1" ?)
pour "XXX_STAT"pour "XXX_ORIENT" (j'ai mis la valeur en grade comme tes unités employées)

pour "XXX_LONG" et "XXX_LONG": ces champs sont définis comme ENTIER et non en nombre réel.
Donc j'ai récupéré l'échelle en X et Y que j'ai multiplié par 1000 et dont j'ai pris la partie entière, ainsi par exemple 0.645 devient 645.
Malgré cela le champ n'est pas mis à jour, je ne sais pourquoi !...J'ai mis en remarque ";" des lignes (print) dans le code (vers la fin), tu peux enlever le point virgule, comme ça tu verra que la valeur est bonne mais que le champ n'est pas mis à jour pour autant. La table a été mal définie, c'est l'impression que j'aie !

En attendant voilà le nouveau jet:
(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 (wcmatch el "*_STAT")
												(ade_odsetfield ent tbl el 0 "A")
											)
											(if (or (wcmatch el "*_TYPREG") (wcmatch el "*_TYPE") (wcmatch el "*_NATURE"))
												(cond
													((and (eq (cdr (assoc 0 (entget ent))) "INSERT") (setq value (cdr (assoc 2 (entget ent)))))
														(cond
															((member value l_der)
																(if (vl-string-position (ascii "_") value nil T)
																	(ade_odsetfield
																		ent
																		tbl
																		el
																		0
																		(if (> (strlen (substr value (+ 2 (vl-string-position (ascii "_") value nil T)))) 1)
																			(substr value (+ 3 (vl-string-position (ascii "_") value nil T)))
																			(substr value (+ 2 (vl-string-position (ascii "_") value nil T)))
																		)
																	)
																)
															)
															((member value l_0)
																(if (vl-string-position (ascii "_") value nil T)
																	(ade_odsetfield
																		ent
																		tbl
																		el
																		0
																		(if (eq (substr value 1 3) "ft_")
																			(substr value (+ 3 (vl-string-position (ascii "_") value nil T)))
																			(strcat "0" (substr value (+ 2 (vl-string-position (ascii "_") value nil T))))
																		)
																	)
																)
															)
															((member value l_13)
																(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
																(if (eq (substr value 1 3) "ft_")
																	(substr value (+ 3 (vl-string-position (ascii "_") value nil T)))
																	(substr value (+ 2 (vl-string-position (ascii "_") value nil T)))
																)
															)
														)
													)
												)
											)
											(if (or (wcmatch el "*_LONG") (wcmatch el "*_LARG") (wcmatch el "*_ORIENT"))
												(cond
													((eq (cdr (assoc 0 (entget ent))) "INSERT")
														(cond
															((wcmatch el "*_LONG")
;(print (fix (* 1000 (cdr (assoc 41 (entget ent))))))
																(ade_odsetfield ent tbl el 0 (fix (* 1000 (cdr (assoc 41 (entget ent))))))
															)
															((wcmatch el "*_LARG")
;(print (fix (* 1000 (cdr (assoc 42 (entget ent))))))
																(ade_odsetfield ent tbl el 0 (fix (* 1000 (cdr (assoc 42 (entget ent))))))
															)
															((wcmatch el "*_ORIENT")
																(ade_odsetfield ent tbl el 0 (atof (angtos (cdr (assoc 50 (entget ent))))))
															)
														)
													)
												)
											)
										)
									)
								)
							)
						)
					)
				)
			)
		)
	)
	(prin1)
)



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

#23 L'utilisateur est hors-ligne   NBAMBOUCAD 

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

Posté 11 avril 2019 - 13:17

Oui c'est nickel, je n'ai cité que deux exemples mais je voulais bien appliquer juste le dernier caractère à tous les blocs ayant deux caractères après le "_", c'est tout bon pour cette partie du programme!
Tout comme pour "*_STAT" et "*_ORIENT", c'est tout bon!

En regardant dans la table de donnée j'ai vu que le type de donné était "court", d'après le ce que j'ai compris la valeur renseigné doit être de type entier et faire moins de 5 caractères.


De plus, j'ai oublié de te dire qu'il est impératif que les valeurs "*_LONG" et "*_LARG" soient arrondies au cm, est-il possible de transformer un caractère de type réel en caractère de type entier?
Je pense que même si il n'a plus de caractère après le "." un caractère du type réel n'est pas accepté dans ces champs car ils n'acceptent que des caractères du type entier.
Et je n'ai malheureusement pas le droit de modifier la définition des tables.

Voir le messagebonuscad, le 11 avril 2019 - 11:09 , dit :

Bon j'ai quelques problèmes...
J'ai appliqué tes souhaits :
pour "type_eq_ass_AG" mais aussi pour "type_eq_ass_MG" (c'est le codage qui a voulu cela)
pour "ft_c1" (aurait-il fallu l'appliquer aussi à "v_c1" ?)
pour "XXX_STAT"pour "XXX_ORIENT" (j'ai mis la valeur en grade comme tes unités employées)

pour "XXX_LONG" et "XXX_LONG": ces champs sont définis comme ENTIER et non en nombre réel.
Donc j'ai récupéré l'échelle en X et Y que j'ai multiplié par 1000 et dont j'ai pris la partie entière, ainsi par exemple 0.645 devient 645.
Malgré cela le champ n'est pas mis à jour, je ne sais pourquoi !...J'ai mis en remarque ";" des lignes (print) dans le code (vers la fin), tu peux enlever le point virgule, comme ça tu verra que la valeur est bonne mais que le champ n'est pas mis à jour pour autant. La table a été mal définie, c'est l'impression que j'aie !




0

#24 L'utilisateur est hors-ligne   bonuscad 

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

Posté 11 avril 2019 - 14:30

Bon je pense qu'il y a un problème avec tes tables.Avant d'appliquer mon code.
Quand je vais par exemple modifier la table "A_RE" et le champ "ARE_LONG", si je clique sur un autre champ par exemple ARE_ORIENT ; il m'affiche le type Réel, je re-clique sur ARE_LONG ; il m'affiche Réel, je re-clique par exemple sur AUTEUR ; il m'affiche Caractère, je reviens sur ARE_LONG ; il m'affiche Caractère.
En fait il garde le dernier élément cliqué (c'est pas normal)

Si je fixe ARE_LONG en entier et que je clique modifier et pareil sur ARE_LARG. Là effectivement je peut revenir dessus après avoir cliqué sur un autre champ de nature différente, il m'affiche bien entier.Si j'applique alors la routine, elle fonctionne alors pour la table A_RE et les champs ARE_LONG et ARE_LARG, donc il y a bien un problème sur les définitions.
De même quand je lance cette instruction lisp (toujours avant d'avoir appliqué mon code)
(foreach i (caddr (ade_odtabledefn "A_RE")) (print i))


On voit en retour une incohérence:

Citation

(("ColName" . "ARE_LONG") ("ColDesc" . "") ("ColType" . "Integer") ("DefaultVal" . ""))
(("ColName" . "ARE_LARG") ("ColDesc" . "") ("ColType" . "Integer") ("DefaultVal" . ""))
(("ColName" . "ARE_ARRAM") ("ColDesc" . "") ("ColType" . "Integer") ("DefaultVal" . ""))

Ces champs de type entier devrait avoir ("DefaultVal" . 0) et non pas ("DefaultVal" . ""), je pense que le problème vient de là.

Combien de tables sont impactés, je ne sais pas, mais je dirais toutes.Qui a mis en place ces tables?



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

#25 L'utilisateur est hors-ligne   NBAMBOUCAD 

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

Posté 11 avril 2019 - 15:20

Ah oui en effet.
Ils doivent donc forcément avoir une valeur par défaut de .0 pour ne pas être considéré comme nil?
Le champ "OBJECTID" est aussi un entier mais est bien définit avec ("DefaultVal" . 0) il devrait donc avoir la même définition que lui.

Toutes les tables possédant ces champs sont impactés.
Et c'est le client qui définit les tables je vais lui faire part du problème.
Je te tiens au courant, et je t'envoie du bonus ce soir!


Et UN GRAND MERCI pour ce taff énorme!!



Voir le messagebonuscad, le 11 avril 2019 - 14:30 , dit :

Bon je pense qu'il y a un problème avec tes tables.Avant d'appliquer mon code.
Quand je vais par exemple modifier la table "A_RE" et le champ "ARE_LONG", si je clique sur un autre champ par exemple ARE_ORIENT ; il m'affiche le type Réel, je re-clique sur ARE_LONG ; il m'affiche Réel, je re-clique par exemple sur AUTEUR ; il m'affiche Caractère, je reviens sur ARE_LONG ; il m'affiche Caractère.
En fait il garde le dernier élément cliqué (c'est pas normal)

Si je fixe ARE_LONG en entier et que je clique modifier et pareil sur ARE_LARG. Là effectivement je peut revenir dessus après avoir cliqué sur un autre champ de nature différente, il m'affiche bien entier.Si j'applique alors la routine, elle fonctionne alors pour la table A_RE et les champs ARE_LONG et ARE_LARG, donc il y a bien un problème sur les définitions.
De même quand je lance cette instruction lisp (toujours avant d'avoir appliqué mon code)
(foreach i (caddr (ade_odtabledefn "A_RE")) (print i))


On voit en retour une incohérence:

Ces champs de type entier devrait avoir ("DefaultVal" . 0) et non pas ("DefaultVal" . ""), je pense que le problème vient de là.

Combien de tables sont impactés, je ne sais pas, mais je dirais toutes.Qui a mis en place ces tables?




0

#26 L'utilisateur est hors-ligne   bonuscad 

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

Posté 11 avril 2019 - 16:25

Bon on va réparer les "conneries" du client.
A copier-coller directement en ligne de commande dans le dessin à corriger avant d'appliquer la routine NBAMBOUCAD. Ca corrigera toutes les tables. et ensuite la routine NBAMBOUCAD devrait fonctionner correctement.
((lambda ( / val typ nw_val nw_deftab)
	
	(foreach i (ade_odtablelist)
		(setq
			val nil
			typ (mapcar 'caddr (cdaddr (ade_odtabledefn i)))
		)
		(foreach el (mapcar 'cdr typ)
			(cond
				((eq el "Character") (setq nw_val ""))
				((eq el "Real") (setq nw_val 0.0))
				((eq el "Integer") (setq nw_val 0))
			)
			(setq val (cons (cons "DefaultVal" nw_val) val))
		)
		(setq nw_deftab
			(append
				(cons (car (ade_odtabledefn i)) (list (cadr (ade_odtabledefn i))))
				(list
					(cons "Columns"
						(mapcar
							'(lambda (x y z w  / )
								(cons x (cons y (cons z (list w))))
							)
							(mapcar 'car (cdaddr (ade_odtabledefn i)))
							(mapcar 'cadr (cdaddr (ade_odtabledefn i)))
							typ
							(reverse val)
						)
					)
				)
			)
		)
		(ade_odmodifytab nw_deftab)
	)
	(prin1)
))

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

#27 L'utilisateur est hors-ligne   NBAMBOUCAD 

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

Posté 12 avril 2019 - 08:01

Ah super, mais quand j'applique le programme les entiers on ensuite la valeur ("DefaultVal" . 0.0), c'est ce que je constate après avoir fait:
(foreach i (caddr (ade_odtabledefn "A_RE")) (print i))


Une autre chose qui m'était sortie de la tête, tout les points du dessin doivent être dans le même bloc point à la fin du dessin (pendant le traitement du dessin ils ont des blocs points différents ce qui facilite leur identification), et avec un attribut différent en fonction du nom du calque.
Et pour tous les points du dessin leur coordonnée Z doit être associé au champ (du bloc point de substitution) "TAL_COTZ".
Ces processus doivent être réalisé à la fin du dessin et ne doivent donc pas être intégré au code déjà existant (procédure attribution des tables, remplissage attribut, etc..), il faut en créer un nouveau.
Je t'envoie le tableau en MP.

0

#28 L'utilisateur est hors-ligne   bonuscad 

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

Posté 12 avril 2019 - 08:42

Citation

Ah super, mais quand j'applique le programme les entiers on ensuite la valeur ("DefaultVal" . 0.0), c'est ce que je constate après avoir fait:
(foreach i (caddr (ade_odtabledefn "A_RE")) (print i))

Oui en effet, mais cela n'a aucune incidence, si tu passes par par "_adedefdata" c'est bien un entier qui apparaît dans la valeur par défaut. Et si le code fonctionne c'est le principalImage IPB

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

#29 L'utilisateur est hors-ligne   NBAMBOUCAD 

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

Posté 12 avril 2019 - 09:43

Ah d'accord, ouais ça marche tip top.

Ah et j'ai remarqué un petit défaut pour l'attribution des valeurs du champs "*_TYPE", le programme applique les règles d'attribution de la liste "l_der" à toutes les lignes possédant un champ du type "*_TYPE", même ceux ne se trouvant pas dans la liste "l_der".
Pourrait-on limiter cette attribution au seuls éléments de la liste?

Merci!!
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)