Aller au contenu

recherche lisp


autospeed

Messages recommandés

Bonjour ,

je recherche un lisp qui permettrait la fonction suivante.

on clique sur un texte puis sur une ligne ou une polyligne et le texte se positionne a une distance prédéfinie de la ligne ou de la polyligne.

Est ce que cela existe déja ?

 

>cliquez sur le texte

>cliquez sur la ligne ou la polyligne

> ecart ( valeur )

 

phil http://www.autospeed.biz

 

Auteur du logiciel Autospeed

Auteur de la théorie du site www.kheops.biz

Auteur de nombreux livres

Lien vers le commentaire
Partager sur d’autres sites

coucou,

 

début de réponse...

(setq enttexte (car (entsel "\nTexte\n")))

(redraw enttexte 3)

(setq entligne (car (entsel "\nLigne\n")))

 

(if (= "LINE" (cdr (assoc 0 (entget entligne))))

(setq dir1 (cons 50

(angle (cdr (assoc 10 (entget entligne)))

(cdr (assoc 11 (entget entligne)))

)

)

)

(progn

(alert

"Ce n'est pas une LIGNE\nIndiquez la Direction par deux points"

)

p1 (getpoint "\npremier point")

p2 (getpoint p1 "\ndeuxième point")

dir1

(cons 50 (angle p1 p2))

)

)

(setq dirtexte (assoc 50 (entget enttexte)))

(setq ent1 (subst dir1 dirtexte (entget enttexte)))

(entmod ent1)

(command "_move" enttexte "" (trans (cdr(assoc 10 (entget enttexte))) 0 1) pause "")

 

amicalement

Lien vers le commentaire
Partager sur d’autres sites

Une autre ébauche à creuser...

 

Cette fonction accepte tout objet curviligne pour l'alignement.

 

((lambda ( / js obj_txt pt1 pt2 bdx mid_text ent obj_curv pt_sel param deriv alpha)
(princ "\nChoix du texte à aligner: ")
(while (not (setq js (ssget "_+.:E:S" '((0 . "*TEXT"))))))
(setq obj_txt (vlax-ename->vla-object (ssname js 0)))
(vlax-invoke-method
	obj_txt
	'GetBoundingBox
	'pt1
	'pt2
)
(setq bdx
	(mapcar
		'vlax-safearray->list
		(list pt1 pt2)
	)
)
(setq mid_text (mapcar '* (mapcar '+ (car bdx) (cadr bdx)) '(0.5 0.5 0.5)))
(while (not (setq js (entsel "\nAligner le texte sur: "))))
(setq ent (car js) obj_curv (vlax-ename->vla-object ent))
(cond
	((member
		(vlax-get-property obj_curv 'ObjectName)
		'("AcDbLine" "AcDbXline" "AcDbPolyline" "AcDb2dPolyline" "AcDbSpline" "AcDbEllipse" "AcDbArc" "AcDbCircle")
	 )
		(setq
			pt_sel (vlax-curve-getClosestPointTo obj_curv (trans (cadr js) 1 0))
			param (vlax-curve-getparamatpoint obj_curv pt_sel)
			deriv (vlax-curve-getfirstderiv obj_curv param)
			alpha (atan (cadr deriv) (car deriv))
		)
		(vlax-invoke-method
			obj_txt
			'Move
			(vlax-3d-point mid_text)
			(vlax-3d-point pt_sel)
		)
		(vlax-put-property obj_txt 'Rotation alpha)
		(princ "\n< Espace > ou [Click+gauche] pour tourner de 90°/< Entrée > ou [Click+droit] pour finir!.")
		(while (and (not (member (setq key (grread nil 4 0)) '((2 13)))) (/= (car key) 25))
			(setq alpha (rem (+ (/ pi 2.0) alpha) (* 2 pi)))
			(vlax-put-property obj_txt 'Rotation alpha)
		)
	)
	(T
		(princ "\nL'objet ne peut servir de référence d'alignement")
	)
)
(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

en fait , j'ai deja un lisp qui permet d'aligner le texte par rapport a un objet mais il n'y a pas de parametre permettant de regler la distance entre le point d'insertion du texte et le point cliqué sur la ligne ou la polyligne.

(defun atxerr (ch)
(cond
((eq ch "Function cancelled") nil)
((eq ch "quit / exit abort") nil)
((eq ch "console break") nil)
(T (princ ch))
)
(setvar "cmdecho" 1)
(setvar "angdir" old_adir)
(setvar "angbase" old_abase)
(setvar "osmode" old_osmd)
(setq *error* olderr)
(princ)
)
(defun near_vertex_arr (obj / obj dxf_obj obj_vlax pt_sel par pt_first pt_snd i bulge e_next)
(setq dxf_obj (entget (car obj)))
(vl-load-com)
(setq
obj_vlax (vlax-ename->vla-object (car obj))
pt_sel (vlax-curve-getClosestPointTo obj_vlax (trans (osnap (cadr obj) "_near") 1 0))
par (vlax-curve-getParamAtPoint obj_vlax pt_sel)
pt_first (trans (vlax-curve-getPointAtParam obj_vlax (fix par)) 0 1)
pt_snd (trans (vlax-curve-getPointAtParam obj_vlax (1+ (fix par))) 0 1)
i 0
)
(cond
((eq (cdr (assoc 0 dxf_obj)) "LWPOLYLINE")
(while (or (/= (caar dxf_obj) 42) (if (< i (fix par)) (setq i (1+ i))))
(setq bulge (cdadr dxf_obj) dxf_obj (cdr dxf_obj))
)
)
(T
(setq e_next (entnext (car obj)))
(repeat (fix par) (setq e_next (entnext e_next)))
(setq bulge (cdr (assoc 42 (entget e_next))))
)
)
(list pt_first pt_snd bulge)
)
(defun c:alt ( / olderr old_abase old_adir e_txt dxf_txt e_seg ent dxf_ent typent l_2pt dxf_11 x_alpha)
(setq old_osmd (getvar "osmode") old_abase (getvar "angbase") old_adir (getvar "angdir"))
(setvar "osmode" 0)
(setvar "angbase" 0)
(setvar "angdir" 0)
(setvar "cmdecho" 0)
(setq olderr *error* *error* atxerr)
(while (null (setq e_txt (entsel "\nChoix du texte a aligner: "))))
(cond
((or
(and
(= (setq typent (cdr (assoc 0 (setq dxf_txt (entget (car e_txt)))))) "TEXT")
(not (member (assoc 72 dxf_txt) '((72 . 3) (72 . 5))))
)
(= typent "MTEXT")
)
(while (null (setq e_seg (entsel "\nAligner le texte sur le segment --> "))))
(setq typent (cdr (assoc 0 (setq dxf_ent (entget (car e_seg))))))
(cond
((or (eq typent "XLINE") (eq typent "RAY"))
(setq dxf_11 (cdr (assoc 11 dxf_ent)))
(setq x_alpha (atan (/ (cadr dxf_11) (car dxf_11))))
(grdraw (trans (cdr (assoc 10 dxf_ent)) 0 1) (polar (trans (cdr (assoc 10 dxf_ent)) 0 1) x_alpha (distance (getvar "vsmin") (getvar "vsmax"))) -1 1)
)
((eq typent "LINE")
(setq x_alpha (angle (cdr (assoc 10 dxf_ent)) (cdr (assoc 11 dxf_ent))))
(grdraw (trans (cdr (assoc 10 dxf_ent)) 0 1) (trans (cdr (assoc 11 dxf_ent)) 0 1) -1 1)
)
((or (eq typent "LWPOLYLINE")
(and
(eq typent "POLYLINE")
(zerop (boole 1 118 (cdr (assoc 70 dxf_ent))))
)
)
(setq l_2pt (near_vertex_arr e_seg))
(grdraw (car l_2pt) (cadr l_2pt) -1 1)
(if (zerop (caddr l_2pt))
(setq x_alpha (angle (trans (car l_2pt) 1 0) (trans (cadr l_2pt) 1 0)))
(progn (setq x_alpha nil) (princ "\nNe peut obtenir un angle depuis ce type d'objet!"))
)
)
(T
(princ "\nNe peut obtenir un angle depuis ce type d'objet!")
(redraw)
)
)
(cond
(x_alpha
(entmod (subst (cons 50 x_alpha) (assoc 50 dxf_txt) dxf_txt))
(princ "\n ou [Click+gauche] pour tourner de 90°/ ou [Click+droit] pour finir!.")
(while (and (not (member (setq key (grread nil 4 0)) '((2 13)))) (/= (car key) 25))
(setq x_alpha (+ (/ pi 2.0) x_alpha))
(entmod (subst (cons 50 x_alpha) (assoc 50 dxf_txt) dxf_txt))
)
(redraw)
)
)
)
(T (princ "\nCe n'est pas du texte, ou alors il est fixé ou aligné!"))
)
(setvar "angdir" old_adir)
(setvar "angbase" old_abase)
(setvar "osmode" old_osmd)
(setq *error* olderr)
(setvar "cmdecho" 1)
(princ)
)

 

Auteur du logiciel Autospeed

Auteur de la théorie du site www.kheops.biz

Auteur de nombreux livres

Lien vers le commentaire
Partager sur d’autres sites

en fait , j'ai deja un lisp

Je le reconnais..... :exclam:

 

toujours aussi "spécial" autospeed,

 

Il est vrai que pour quelqu'un qui propose souvent d'utiliser son logiciel, je suis surpris qu'il n'arrive pas a développer ceci.

 

Mais bon si ça peut intéresser d'autres personnes, j'ai fait un "mix" de ma première proposition et de la routine rééditeé par Autospeed.

 

Cette routine va donc vous permettre d'aligner-replacer un Texte ou MultiTexte en pointant un objet curviligne. Si celui-ci est courbe c'est la tangente au point de sélection qui sera prise. Le point de sélection sert aussi de référence pour replacer le texte par rapport à son centre d'encombrement (bounding-box). La valeur de décalage équivaut automatiquement à la demi-hauteur du texte sélectionné.

 

Une fois placé vous serez amenez à supprimer l'une des deux solutions (à droite ou à gauche de l'objet) par déplacement du curseur et validation, puis vous pourrez tournez le texte de 90° sur un tour complet par rapport à son centre.

 

Le lisp align_text.lsp

 

J'ai observé que si les grips (poignées) n'avaient jamais été utilisées, bien que fonctionnant, la sur-brillance et les grips ne ce voient pas. Donc pour remédier à ce problème utilisez au moins une fois les grips avant utilisation de la routine.

Ce problème à déjà été évoqué dans le forum, pas de solution à ce jour. :(

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

Bonjour , pour repondre à ta question , je suis le concepteur d'Autospeed et non son programmeur car je ne connais rien au lisp.

On est deux auteurs . Je recherche cette routine pour un ami projeteur qui fait du VDR.

Merci pour le code , ça va surement le dépanner

Auteur du logiciel Autospeed

Auteur de la théorie du site www.kheops.biz

Auteur de nombreux livres

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é