Aller au contenu

Texte suivant un objet curviligne


bonuscad

Messages recommandés

Les Express Tools permettent bien d'écrire en rond, mais seulement sur un arc ou un cercle.

 

Il y a bien CURVETEXT sur CadXp, mais se sont des modules ARX et il n'y a pas de modules pour les versions récentes. :(

 

Donc un bout de code (je l'ai fait au plus simple pour limiter la taille) qui permet de faire cela.

 

PS: Le texte est toujours écrit à gauche du sens de parcours de l'objet.

 

(vl-load-com)
(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 draw_pt (pt / pt1 pt2 pt3 pt4)
(setq
	rap (/ (getvar "viewsize") 100)
	pt1 (list (+ (car pt) rap) (+ (cadr pt) rap) (caddr pt))
	pt2 (list (+ (car pt) rap) (- (cadr pt) rap) (caddr pt))
	pt3 (list (- (car pt) rap) (- (cadr pt) rap) (caddr pt))
	pt4 (list (- (car pt) rap) (+ (cadr pt) rap) (caddr pt))
)
(grdraw pt pt1 -1)
(grdraw pt pt2 -1)
(grdraw pt pt3 -1)
(grdraw pt pt4 -1)
)
(defun c:text_curv ( / js dxf_obj PatObj EndDist StartPoint Endpoint tmp tmp0 txt_size str_txt nt part_dist lst_pt next_dist deriv ang dxf_210)
(princ "\nSélectionnez un objet curviligne.")
(while
	(null
		(setq js
			(ssget "_+.:E:S"
				(list
					'(0 . "*LINE,ARC,CIRCLE,ELLIPSE")
					(cons 67 (if (eq (getvar "CVPORT") 1) 1 0))
					(cons 410 (if (eq (getvar "CVPORT") 1) (getvar "CTAB") "Model"))
					'(-4 . "[b]<[/b]AND")
						'(-4 . "[b]<[/b]NOT")
							'(0 . "MLINE")
						'(-4 . "NOT>")
						'(-4 . "[b]<[/b]NOT")
							'(-4 . "&")
							'(70 . 112)
						'(-4 . "NOT>")
					'(-4 . "AND>")
				)
			)
		)
	)
	(princ "\nCe n'est pas un objet curviligne valable pour cette fonction!")
)
(setq dxf_obj (entget (ssname js 0)))
(setq PathObj (vlax-ename->vla-object (ssname js 0)))
(setq EndDist (vlax-curve-getDistAtParam PathObj (vlax-curve-getEndParam PathObj)) StartPoint nil EndPoint nil)
(draw_pt (trans (vlax-curve-getPointAtDist PathObj 0.0) 0 1))
(princ "\nDonnez l'origine du texte")
(while (= 5 (car (setq tmp (grread t 5 1))))
	(cond
		((= 5 (car tmp))
			(if StartPoint (progn (draw_pt (trans StartPoint 0 1)) (grdraw (trans StartPoint 0 1) tmp0 -1)))
			(setq StartPoint (vlax-curve-getClosestPointTo PathObj (trans (cadr tmp) 1 0)) tmp0 (cadr tmp))
			(draw_pt (trans StartPoint 0 1))
			(grdraw (trans StartPoint 0 1) (cadr tmp) -1)
		)
		(T (princ "\nArrêt anormal de la commande "))
	)
)
(setq StartPoint (vlax-curve-getClosestPointTo PathObj (setq InsPoint (trans (cadr tmp) 1 0))))
(princ "\nDonnez la fin du texte")
(while (= 5 (car (setq tmp (grread t 5 1))))
	(cond
		((= 5 (car tmp))
			(if EndPoint (progn (draw_pt (trans EndPoint 0 1)) (grdraw (trans EndPoint 0 1) tmp0 -1)))
			(setq EndPoint (vlax-curve-getClosestPointTo PathObj (trans (cadr tmp) 1 0)) tmp0 (cadr tmp))
			(draw_pt (trans EndPoint 0 1))
			(grdraw (trans EndPoint 0 1) (cadr tmp) -1)
		)
		(T (princ "\nArrêt anormal de la commande "))
	)
)
(setq EndPoint (vlax-curve-getClosestPointTo PathObj (trans (cadr tmp) 1 0)))
(initget 6)
(setq txt_size (getdist (trans InsPoint 0 1) (strcat "\nHauteur du texte? [b]<[/b]" (rtos (getvar "TEXTSIZE")) ">: ")))
(if (not txt_size) (setq txt_size (getvar "TEXTSIZE")))
(setq str_txt (getstring "\nEntrez le texte: " T) nt 0 lst_pt nil)
(setq part_dist (* (/ (- (vlax-curve-getDistAtPoint PathObj EndPoint) (vlax-curve-getDistAtPoint PathObj StartPoint)) (strlen str_txt)) 0.5))
(setq next_dist (+ (vlax-curve-getDistAtPoint PathObj StartPoint) part_dist))
(repeat (strlen str_txt)
	(setq deriv (vlax-curve-getFirstDeriv PathObj (vlax-curve-getparamatpoint PathObj (setq pt (vlax-curve-getPointAtDist PathObj next_dist)))))
	(setq ang (atan (cadr deriv) (car deriv)))
	(if (> (vlax-curve-getDistAtPoint PathObj StartPoint) (vlax-curve-getDistAtPoint PathObj EndPoint))
		(setq lst_pt (cons (list (polar pt (- ang (* pi 0.5)) (distance StartPoint InsPoint)) (+ pi ang)) lst_pt))
		(setq lst_pt (cons (list (polar pt (+ ang (* pi 0.5)) (distance StartPoint InsPoint)) ang) lst_pt))
	)
	(setq next_dist (+ next_dist (* 2 part_dist)))
)
(foreach n (reverse lst_pt)
	(setq
		dxf_210 (z_dir (car n) (polar (car n) (cadr n) (* 0.1 part_dist)))
	)
	(entmake
		(list
			'(0 . "TEXT")
			'(100 . "AcDbEntity")
			(assoc 67 dxf_obj)
			(assoc 410 dxf_obj)
			(cons 8 (getvar "CLAYER"))
			'(100 . "AcDbText")
			(cons 10 (trans (car n) 0 dxf_210))
			(cons 40 txt_size)
			(cons 1 (substr str_txt (setq nt (1+ nt)) 1))
			(cons 50 (cadr n))
			'(41 . 1.0)
			'(51 . 0.0)
			(cons 7 (getvar "TEXTSTYLE"))
			'(71 . 0)
			'(72 . 1)
			(cons 11 (trans (car n) 0 dxf_210))
			(cons 210 dxf_210)
			'(100 . "AcDbText")
			'(73 . 0)
		)
	)
)
(vlax-release-object PathObj)
(redraw)
(prin1)
)

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

Lien vers le commentaire
Partager sur d’autres sites

 

Hello Gilles - Sorry Hello Bonuscad

 

Je viens de tester sur AutoCAD 2008 : c TIP-TOP !! :)

mais bien sur je vais émettre qq critiques / suggestions ! :P

 

Sinon à quoi servirait Mr LeCrabe / Decapode !?

 

Tests réalisés sur:

- Arc, Cercle

- Polyligne 2D close ou non, Lissée ou non, Splinée ou Non

- Ellipse vraie, Ellipse fausse (PELLIPSE=1)

- Spline

- 3DPolyligne

 

=== Suggestions ===

 

- Poser la question de la distance de décalage ...

 

- Poser la question: faire un groupe (Oui/Non) des N textes générés

 

Mille mercis, Le Decapode "impressionné comme d'hab"

 

 

 

[Edité le 12/11/2007 par lecrabe]

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Ho Grand Décapode "bigleux" ! ;)

 

Hello Gilles
Moi c'est bonuscad

 

- Poser la question de la distance de décalage ...

 

En fait lors de la position 1er point de départ en dynamique, la position du curseur renseigne sur la distance de décalage à appliquer.

 

Poser la question: faire un groupe (Oui/Non) des N textes générés

Ca j'y ai songé, je voulais même faire un groupe anonyme d'office, de même que de faire un groupe d'annulation.

 

Des suggestions peuvent être multiples (point de justification des texte, dessus/dessous, orientation forcée, boite dialogue et j'en passe.

 

J'ai bien dit que j'avais fais au plus simple. :P

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

Lien vers le commentaire
Partager sur d’autres sites

SORRY

 

Il n'y a pas de quoi..., je n'en suis aucunement vexé.

Il faut dire que Gilles est tellement présent sur le site, que c'est normal qu'on soit habitué à ses propositions. ;)

 

En tout cas MERCI à tous de vos félicitations.

 

Mais le code comporte des bugs si on ne se tient pas dans des scu parrallèles au SCG, mais bon du texte est généralement en 2D...

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

Lien vers le commentaire
Partager sur d’autres sites

Salut BonusCAd, et bravo pour cette routine !

 

Petite question : Est-il possible de faire la même chose en autolisp ?

Attention, je ne te demande pas si tu peux le faire, mais juste si c'est possible... Parce qu'elle m'intéresse, cette routine, mais sous BricsCAD, lpas de Vlisp !

 

 

Voilà. Si c'est possible, j'essaierai de m'y coller !

 

Merci.

A bientot.

Matt.

"Chacun compte pour un, et nul ne compte pour plus d'un."

Lien vers le commentaire
Partager sur d’autres sites

Salut Matt666,

 

Tout d'abords "BrisCAD" tourne sous Linux? C'est bien ça!

J'ai un vieux PC (Celeron), ou j'ai installé un "Ubuntu" pour découvrir le monde Linux.

Si j'ai la possibilité d'y faire tourner Briscad et que celui-ci comprends le lisp, cela peut m'intéresser de découvrir ce logiciel.

Merci de ton avis à un néophyte de linux ;)

 

Autrement pour répondre à ta question, c'est possible.

 

La méthode simple que j'adopterais pour faire court, mais pas gracieux du tout.

 

faire d'abord un groupe d'annulation

créer un bloc d'un nom loufoque constitué simplement d'un point.

faire couper la section qui servira de support au texte (NB; pour les cercle ça va coincer !?!)

STOCKER le nom de la DERNIERE entité.

demander les divers paramètres

diviser le segment par le nombre de caractère contenu dans la chaine de texte avec le bloc de nom loufoque en ALIGNANT avec l'objet.

remonter jusqu' à la borne par des (entlast)

récupérer le point d'insertion et l'angle de rotation du bloc par un (entget)

faire un (entdel (entlast)) et continuer la boucle jusqu'à l'entité marquée.

executer le groupe d'annulation

avec les infos essentielles récoltées mettre en place les caractères un par un

 

voilà en gros la démarche, c'est ce que j'aurais fais des années en arrière sur une version 12 DOS :P

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

Lien vers le commentaire
Partager sur d’autres sites

Salut bonuscad !

Merci pour ta réponse !!

 

Tout d'abord BricsCAD a une version Linux, effectivement, mais elle est plus largement utilisée sous windows. C'est un moteur Intellicad comme intelliplus, jetcad, et tous les clones d'autocad (en gros).

 

Je crois que le logiciel (gratuit, évidemment - Vive Linux :) ) pour linux est ArcCAD, mais je ne m'en pas (encore !) servi.

 

qqs précisions :

faire couper la section qui servira de support au texte (NB; pour les cercle ça va coincer !?!)

Ca veut bien dire de trouver l'arc de support du texte, c'est ça ?

 

Sinon je vois le principe.. Ce n'est pas une routine évidente, et puis lorsqu'on passe d'un texte simple en texte curviligne, ce même texte n'est plus modifiable.. Il faut créer une autre routine qui réassemble le texte...

 

Mais ça me parait possible !

 

Merci bonuscad, et bon courage avec ArcCAD ! Je vais l'installer aussi, pour voir..

 

A bientot !

Matt.

"Chacun compte pour un, et nul ne compte pour plus d'un."

Lien vers le commentaire
Partager sur d’autres sites

Bonsoir,

 

L'éclaircissement de mon propos:

 

La commande coupure en 1 point ne fonctionne pas sur un cercle (pour Autocad un arc de 360° n'est pas valide).

Donc si tu veux pouvoir traiter les cercles pour avoir le point départ et de fin du texte à placer, il faudra un traitement spécial pour celui-ci (ne pas exécuter une coupure en 1 point , mais soit une coupure normale, ou soit une création d'arc basé sur le cercle par exemple) pour pouvoir diviser l'arc .

 

Merci bonuscad, et bon courage avec ArcCAD !

Merci pour tes précisions, je vais regardé les possibilité de ce Soft et surtout s'il est personnalisable à l'aide du lisp.

 

 

 

Il faut créer une autre routine qui réassemble le texte...

 

Mais ça me parait possible !

 

Oui; avec des réacteurs ou alors plus compliqué avec les handles de tous les textes individuel et des xdatas associés à chacun.

Briscad n'a peut être pas ces dernières possibilités évoquées.

 

A voir...

Bon courage pour l"adaptation.

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

Lien vers le commentaire
Partager sur d’autres sites

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é