autospeed Posté(e) le 7 juin 2007 Posté(e) le 7 juin 2007 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 AutospeedAuteur de la théorie du site www.kheops.bizAuteur de nombreux livres
didier Posté(e) le 7 juin 2007 Posté(e) le 7 juin 2007 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 Éternel débutant... Mon site perso : Programmer dans AutoCAD
bonuscad Posté(e) le 7 juin 2007 Posté(e) le 7 juin 2007 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
autospeed Posté(e) le 8 juin 2007 Auteur Posté(e) le 8 juin 2007 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 AutospeedAuteur de la théorie du site www.kheops.bizAuteur de nombreux livres
didier Posté(e) le 8 juin 2007 Posté(e) le 8 juin 2007 coucou, Le sujet est clos, ou faut il continuer à chercher ? toujours aussi "spécial" autospeed, ;) ;) amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
bonuscad Posté(e) le 11 juin 2007 Posté(e) le 11 juin 2007 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
autospeed Posté(e) le 12 juin 2007 Auteur Posté(e) le 12 juin 2007 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 AutospeedAuteur de la théorie du site www.kheops.bizAuteur de nombreux livres
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant