Aller au contenu

Encore un MESURER avec Attribut


Messages recommandés

Posté(e)

Ayant répondu sur un forum US pour effectuer une mesure avec un attribut incrémenté.

Je reposte ici pour ceux qui ne fréquente pas ces forums et que ça pourrait interesser.

 

Gile pourrait aussi améliorer son diviser/mesurer-3D pour inclure cette possibilité, car l'optique est similaire ( c'est juste une idée ;) )

 

NB: Le code se charge de créer le bloc avec attribut. L'échelle du texte d'attribut s'adapte à la longueur donnée comme incrémentation.

(defun make_blk_measure ( / )
    (if (not (tblsearch "STYLE" "$BLK_MEAS"))
      (entmake	'((0 . "STYLE")
	  (5 . "40")
	  (100 . "AcDbSymbolTableRecord")
	  (100 . "AcDbTextStyleTableRecord")
	  (2 . "$BLK_MEAS")
	  (70 . 0)
	  (40 . 0.0)
	  (41 . 1.0)
	  (50 . 0.0)
	  (71 . 0)
	  (42 . 0.1)
	  (3 . "simplex.shx")
	  (4 . "")
	 )
      )
    )
    (if (not (tblsearch "BLOCK" "BLK_MEASURE_CURVE"))
      (progn
 (entmake
   '((0 . "BLOCK") (8 . "0") (2 . "BLK_MEASURE_CURVE") (70 . 2) (4 . "") (8 . "0") (62 . 0) (6 . "ByBlock") (370 . -2) (10 0.0 0.0 0.0))
 )
 (entmake
   '((0 . "POINT") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbPoint") (10 0.0 0.0 0.0) (210 0.0 0.0 1.0) (50 . 0.0))
 )
 (entmake
  '(
(0 . "ATTDEF")
(100 . "AcDbEntity")
(67 . 0)
(410 . "Model")
(8 . "0")
(100 . "AcDbText")
(10 0.05 0.1 0.0)
(40 . 0.1)
(1 . "0.0")
(50 . 1.570796326794896)
(41 . 1.0)
(51 . 0.0)
(7 . "$BLK_MEAS")
(71 . 0)
(72 . 0)
(11 0.0 0.1 0.0)
(210 0.0 0.0 1.0)
(100 . "AcDbAttributeDefinition")
(3 . "measure")
(2 . "VALUE_MEASURE")
(70 . 0)
(73 . 2)
(74 . 2)
  )
 )
 (entmake '((0 . "ENDBLK") (8 . "0") (8 . "0") (62 . 0) (6 . "ByBlock") (370 . -2)))
      )
   )
)
(defun z_dir (p1 p2 / )
(trans
	'(0.0 1.0 0.0)
	(mapcar
		'(lambda (k)
			(/ k
				(sqrt
					(apply '+
						(mapcar
							'(lambda (x) (* x x))
							(mapcar '- p2 p1)
						)
					)
				)
			)
		)
		(mapcar '- p2 p1)
	)
	0
)
)
(defun c:blk-att_measure ( / js dxf_obj obj_vlax pt_start pt_end total_dist partial_dist lst_pt increment_dist sv_luprec sv_dzin ang dxf_210)
(princ "\nSélectionner un objet curviligne à mesurer/diviser: ")
(while
	(not
		(setq js
			(ssget "_+.:E:S"
				(list
					(cons 0 "*POLYLINE,LINE,ARC,CIRCLE,ELLIPSE,SPLINE")
					(cons 67 (if (eq (getvar "CVPORT") 2) 0 1))
					(cons 410 (if (eq (getvar "CVPORT") 2) "Model" (getvar "CTAB")))
					(cons -4 "[b]<[/b]NOT")
					(cons -4 "&") (cons 70 112)
					(cons -4 "NOT>")
				)
			)
		)
	)
	(princ "\nCe n'est pas un objet curviligne valable pour cette fonction!")
)
(vl-load-com)
(setq
	dxf_obj (entget (ssname js 0))
	obj_vlax (vlax-ename->vla-object (ssname js 0))
	pt_start (vlax-curve-getStartPoint obj_vlax)
	pt_end (vlax-curve-getEndPoint obj_vlax)
	total_dist (vlax-curve-getDistAtParam obj_vlax (vlax-curve-getEndParam obj_vlax))
)
(initget "Mesurer Diviser _Measure Divide")
(if (eq (getkword (strcat "\n[Mesurer/Diviser] l'objet d'une longueur de " (rtos total_dist) "? [b]<[/b]M>: ")) "Divide")
	(progn
		(initget 7)
		(setq
			partial_dist (getint "\nEntrez le nombre de segments: ")
			partial_dist (/ total_dist partial_dist)
		)
	)
	(progn
		(initget 7)
		(setq partial_dist (getdist "\nSpécifiez la longueur du segment: "))
	)
)
(cond
	((> total_dist partial_dist)
		(make_blk_measure)
		(setq
			lst_pt (list pt_start)
			increment_dist partial_dist
			sv_luprec (getvar "LUPREC")
			sv_dzin (getvar "DIMZIN")
		)
		(setvar "CMDECHO" 1)
		(setvar "DIMZIN" 0)
		(command "_.luprec" pause)
		(while ([b]<[/b] increment_dist total_dist)
			(setq
				lst_pt (cons (vlax-curve-getPointAtDist obj_vlax increment_dist) lst_pt)
				increment_dist (+ increment_dist partial_dist)
			)
		)
		(setq lst_pt (reverse (cons pt_end lst_pt)))
		(foreach n lst_pt
			(setq
				ang (angle '(0.0 0.0 0.0) (vlax-curve-getFirstDeriv obj_vlax (vlax-curve-getParamAtPoint obj_vlax n)))
				dxf_210 (z_dir n (polar n ang (* 0.1 partial_dist)))
			)
			(entmake
				(list
					(cons 0 "INSERT")
					(cons 100 "AcDbEntity")
					(assoc 67 dxf_obj)
					(assoc 410 dxf_obj)
					(cons 8 (getvar "CLAYER"))
					(cons 100 "AcDbBlockReference")
					(cons 66 1)
					(cons 2 "BLK_MEASURE_CURVE")
					(cons 10 (trans n 0 dxf_210))
					(cons 41 (* 0.1 partial_dist))
					(cons 42 (* 0.1 partial_dist))
					(cons 43 (* 0.1 partial_dist))
					(cons 50 ang)
					(cons 210 dxf_210)
				)
			)
			(entmake
				(list
					(cons 0 "ATTRIB")
					(cons 100 "AcDbEntity")
					(assoc 67 dxf_obj)
					(assoc 410 dxf_obj)
					(cons 8 (getvar "CLAYER"))
					(cons 100 "AcDbText")
					(cons 10
						(polar
							(polar (trans n 0 dxf_210) (+ (/ pi 2) ang) (* 0.1 partial_dist))
							ang
							(* 0.05 partial_dist)
						)
					)
					(cons 40 (* 0.1 partial_dist))
					(cons 1 (rtos (vlax-curve-getDistAtPoint obj_vlax n)))
					(cons 50 (+ (/ pi 2) ang))
					(cons 41 1.0)
					(cons 51 0.0)
					(cons 7 "$BLK_MEAS")
					(cons 71 0)
					(cons 72 0)
					(cons 11 (polar (trans n 0 dxf_210) (+ (/ pi 2) ang) (* 0.1 partial_dist)))
					(cons 210 dxf_210)
					(cons 100 "AcDbAttribute")
					(cons 2 "VALUE_MEASURE")
					(cons 70 0)
					(cons 73 2)
					(cons 74 2)
				)
			)
			(entmake (list (cons 0 "SEQEND") (cons 8 (getvar "CLAYER")) (cons 62 0) (cons 6 "ByBlock") (cons 370 -2)))
		)
		(setvar "LUPREC" sv_luprec)
		(setvar "DIMZIN" sv_dzin)
	)
	(T (princ "\nLa longueur est trop grande pour l'objet!"))
)
(prin1)
)

 

L'amélioration concerne l'orientation de l'attribut par rapport à l'objet curviligne, le choix de la police a utiliser pour celui-ci, ainsi que la possibilité de faire une incrémentation soit numérique, soit alphabétique avec un pas d'incrémentation pour les valeurs numériques.

La routine est influencée par les variables PDMODE, PDSIZE et DIMPOST. Donc l'aspect peut être différent suivant l'état de ces variables. (DimPost = préfixe et/ou suffixe ajouté à l'attribut)

Je vous laisse découvrir les possibilités plus en détail en l'essayant!

 

 

 

[Edité le 20/9/2008 par bonuscad]

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

Posté(e)

Encore un joli coup pour ta rentrée ;)

 

L'échelle du texte d'attribut s'adapte à la longueur donnée comme incrémentation.

 

Ça, c'est une bonne idée, mais pour le point, peut-être eut il mieux valu laisser l'échelle à 1.0 pour ceux qui ne paramètrent pas PDMODE à 0.

 

avec PDMODE à 34 et

(cons 41 (* 0.1 partial_dist))
(cons 42 (* 0.1 partial_dist))
(cons 43 (* 0.1 partial_dist)) 

 

http://xs106.xs.to/xs106/06364/measure1.PNG.xs.jpg

 

en remettant les échelles à 1.0

(cons 41 1.0)
(cons 42 1.0)
(cons 43 1.0) 

 

http://xs106.xs.to/xs106/06364/measure2.PNG.xs.jpg

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Encore un joli coup pour ta rentrée

 

Merci. ;)

 

 

Je pense pas que ce soit PDMODE qui pose problème, mais plutôt PDSIZE.

 

Une valeur négative se fera par rapport à la vue écran, une valeur positive se fera par rapport aux unités dessin.

 

A mon avis la valeur positive est souhaitable, personellement j'utillise ce mode de PDSIZE, mais chacun peut l'ajuster selon son désir, comme PDMODE d'ailleurs.

 

Cela est tellement simple à modifier dans la boite de dialogue "Style des points" qu'il est inutile de paraméter celle-ci dans une routine à mon avis...

 

Les facteurs d'échelle dont tu parles ont plutôt une incidence sur la taille du texte de l'attribut.

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

Posté(e)

Re,

 

Effectivement, j'utilise une valeur négative pour PDSIZE (taille par raport à l'écran) ce qui me permet, après un regen, de ne pas avoir des points immenses ou invisibles lors des changements de zoom.

 

Les facteurs d'échelle dont tu parles ont plutôt une incidence sur la taille du texte de l'attribut.

 

Il me semble qu'on peut laisser un facteur d'échelle de 1.0 pour les X,Y et Z à l'insertion du bloc :

(entmake '((0 . "INSERT") ...(41 . 1.0) (42 . 1.0) (43 . 1.0) ...))

et jouer uniquement sur la hauteur de texte de l'attribut :

(entmake '((0 . "ATTRIB") ... (cons 40 (* 0.1 partial_dist)) ...)).

 

C'est comme ça que j'ai fait dans la modif proposée pour Diviser/Mesurer 3D (en vlisp).

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Alméliorations apportées et possibilités augmentées.

Voir le message d'entête

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

Posté(e)

Salut,

 

J'ai un peu testé, et j'ai eu un problème avec le filtre de sélection.

 

Ça vient du code 67, je pense qu'il est préférable de tester la variable cvport avec 1 (espace papier) parce que s'il y a plusieurs fenêtres dans l'espace objet cvport peut être à 2, 3, 4, etc...

 

J'ai donc remplacé cette partie dans le filtre de sélection par :

 

(cons 67
		    (if	(eq (getvar "CVPORT") 1)
		      1
		      0
		    )
	      ) 

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Merci pour la remarque ;)

 

effectivement la selection ne peut se faire. Comme ta proposition ne vas non plus, je pense que la solution est de bêtement enlever ou mettre en remarque le code 67 et 410, car ça fonctionne très bien sans. :P

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

Posté(e)

Comme ta proposition ne vas non plus

 

Pourrais-tu préciser s'il te plait, je me sers d'un test semblable pour définir l'espace actif dans des routines en vlisp :

 

(setq Space

(if (= (getvar "CVPORT") 1)

(vla-get-PaperSpace

(vla-get-activedocument (vlax-get-acad-object))

)

(vla-get-ModelSpace

(vla-get-activedocument (vlax-get-acad-object))

)

)

)

 

Y aurait-il quelque chose qui m'ait échappé ?

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Comme ta proposition ne vas non plus

 

Désolé pour ma réponse hative, en fait cela fonctionne si j'applique le même test pour le code 410

 

(while

(not

(setq js

(ssget "_+.:E:S"

(list

(cons 0 "*POLYLINE,LINE,ARC,CIRCLE,ELLIPSE,SPLINE")

(cons 67 (if (eq (getvar "CVPORT") 1) 1 0))

(cons 410 (if (eq (getvar "CVPORT") 1) (getvar "CTAB") "Model"))

(cons -4 "< NOT")

(cons -4 "&") (cons 70 112)

(cons -4 "NOT>")

)

)

)

)

(princ "\nCe n'est pas un objet curviligne valable pour cette fonction!")

)

 

Fonctionne dans toutes les fenêtres :P

 

Pour ssget avec cette option, la définition de ces codes n'est pas utile car cela fonctionne à l'identique sans définition de ceux-ci, par contre avec l'option "_X" cela peut être utile pour d'autre cas donc, encore merci pour le rectificatif ;)

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

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é