doublecriquet Posté(e) le 8 juillet 2008 Posté(e) le 8 juillet 2008 Bonjour, Tout d'abord "Un grand bravo" et merci à tous les membres actifs de ce site, qui regorge de trésors et de petites fonctions très utiles. :D Je suis débutant en Autocad, je ne connais pas la programmation, alors peut-être que ma question va paraitre simplisme ou idiote, ou peut-être pas. Ça serait sympa si l'un d'entre vous pouvait me dire si c'est réalisable ou non, et comment ? Je souhaiterais aligner de manière automatique une série de blocs identiques perpendiculairement le long d'une polyligne (par exemple des "symboles kilométriques" représentés par des blocs le long d'une route représentée par un polyligne en 2D). En effet, la route fait plusieurs milliers de kms, et ce serait long de faire une rotation de chaque bloc un par un à la main à l'aide des poignées... En fait, mes symboles kilométriques sont déjà correctement placés sur la polyligne (en remplaçant des points présents sur la polyligne par des wblocs de manière automatique à l'aide d'un petit LISP que j'ai trouvé sur ce site) le problème est que l'angle d'insertion automatique de ce LISP est 0, alors que je souhaiterais que ces blocs soient perpendiculaires le long de la polyligne. Existe t-il un LISP ou une autre fonction permettant de sélectionner tous les blocs (symboles kilométriques) d'un seul coup sur le dessin et de leur faire faire une rotation indépendante automatique le long de la polyligne ? :casstet: [Edité le 8/7/2008 par doublecriquet]
lili2006 Posté(e) le 8 juillet 2008 Posté(e) le 8 juillet 2008 Bonjour à toutes et tous, Bienvenu doublecriquet, As-tu testé avec la commande [surligneur] "_find" [/surligneur]et la palette des propriétés pour changer l'angle ? Cela devrait suffir je pense,... Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
PHILPHIL Posté(e) le 8 juillet 2008 Posté(e) le 8 juillet 2008 salut une auttre solution dans ton fichier de base qui te sert de bloctu tournes l'attribut de 90 degres dans le sens horaire ou trigo a toi de voiret tu le rappel en remplacement des tes milliers de bloccomme tes blocs sont déja en place avec une certaines rotation ils seront tous tournés de 90 degres sinon quel LISP as tu utilisé ?il est peut etre modifiable pour faire en sorte de demander l'angle par rapport a la polyligne au point d'insertion ce qui pourrait servir a d'autres phil [Edité le 8/7/2008 par PHILPHIL] FREELANCE Autodesk Architecture 2025 sous windows 11 64 REVIT 24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal
doublecriquet Posté(e) le 8 juillet 2008 Auteur Posté(e) le 8 juillet 2008 ... Merci pour vos réponses super rapides ! :) ...Mais je crois que j'ai mal formulé ma demande : je souhaiterais que les blocs soient perpendiculaires aux différentes pentes de la polyligne 2D et non à 90°sur le dessin (ces blocs doivent donc avoir tous au final une rotation différente en fonction de la pente de la polyligne sur laquelle ils sont placés). Il faudrait donc qu'il y ait un calcul automatique des pentes de la polyligne (séparée sur un calque différent) pour qu'ils s'orientent perpendiculairement par rapport à chaque pente de cette polyligne. PHILPHIL, Pour l'insertion automatique des blocs en remplacement des points, j'ai utilisé le LISP "pt-blc" , mais ils se placent avec une rotation = 0 : ;;; Remplace Nodal par Bloc demandé : (defun c:pt-blc (/ sel i nb)(vl-load-com)(princ "\n Choix des points :")(or (setq sel (ssget '((0 . "POINT"))))(setq sel (ssget "_X" '((0 . "POINT")))))(setq nb (getstring T (strcat "\n Entrez le nom du bloc <"(getvar "INSNAME")">:")))(if (equal nb "") (setq nb (getvar "INSNAME"))) (repeat (setq i (sslength sel))(command "_insert" nb (cdr (assoc 10 (entget (ssname sel (setq i (1- i))))))1 1 0)(vla-delete (vlax-ename->vla-object (ssname sel i))))(princ (strcat "\n " (rtos (sslength sel)) " Points remplacé par Bloc "(getvar "INSNAME")""))(princ)) ;;;Remplace Bloc Selectionné par Nodal(defun c:bloc-pt (/ sel i)(vl-load-com)(princ "\n Choix des Blocs :")(or (setq sel (ssget '((0 . "INSERT"))))(setq sel (ssget "_X" '((0 . "INSERT"))))) (repeat (setq i (sslength sel))(command "_point" (cdr (assoc 10 (entget (ssname sel (setq i (1- i)))))))(vla-delete (vlax-ename->vla-object (ssname sel i))))(princ (strcat "\n " (rtos (sslength sel)) " Blocs remplacé par Point."))(princ)) Il ne manquerait donc plus que chaque bloc effectue une rotation auto pour être perpendiculaire à la pente de la polyligne. Auriez-vous une petite idée ? :)
(gile) Posté(e) le 8 juillet 2008 Posté(e) le 8 juillet 2008 Salut, Si j'ai bien compris la demande, pas besoin de LISP. Essaye la commande MESURER (_MEASURE) option "Bloc" et répondre "Oui" à l'invite "Aligner le bloc avec l'objet ?" À toi d'orienter ta définition de bloc pour qu'il soit "perpendiculaire" à l'objet (polyligne). Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
PHILPHIL Posté(e) le 9 juillet 2008 Posté(e) le 9 juillet 2008 hello heuuuu c'est pas ce que j'avais suggere deja ??de modifier le fichier servant de bloc ?? phil [Edité le 9/7/2008 par PHILPHIL] FREELANCE Autodesk Architecture 2025 sous windows 11 64 REVIT 24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal
doublecriquet Posté(e) le 9 juillet 2008 Auteur Posté(e) le 9 juillet 2008 Salut, Merci à tous pour vos réponses. gile, tu as trouvé la fonction exact que je cherchais, la fonction "MESURER" combiné aux blocs qui permet de les aligner perpendiculairement sur la polyligne. :D Parfois j'ai aussi d'autres symboles à placer de la même manière (perpendiculairement à la polyligne), mais leur placement n'est pas régulier comme les symboles kilométriques. J'ai leurs coordonnées xy. Pour l'instant je place ces points avec un script, puis avec le LISP que j'ai décrit plus haut, je remplace par des blocs qui se positionnent bien au point d'insertion, mais avec une rotation = 0 , et non perpendiculairement à la polyligne comme je le voudrais. Y-a-t-il une méthode (peut-être un LISP là pour le coup ?) pour ces symboles "non réguliers" où je ne peux pas utiliser la fonction "MESURER" ?
bonuscad Posté(e) le 9 juillet 2008 Posté(e) le 9 juillet 2008 Y-a-t-il une méthode (peut-être un LISP là pour le coup ?) pour ces symboles "non réguliers" où je ne peux pas utiliser la fonction "MESURER" ? Une proposition vite faite, devrait bien fonctionner pour des blocs sans attributs. ((lambda ( / js dxf_cod n js_lw obj dxf_ent pt pt_cl deriv alpha) (princ "\nSélectionnez un bloc modèle pour obtenir son nom.") (while (null (setq js (ssget "_+.:E:S" (list '(0 . "INSERT") (cons 67 (if (eq (getvar "CVPORT") 1) 1 0)) (cons 410 (if (eq (getvar "CVPORT") 1) (getvar "CTAB") "Model")) ) ) ) ) (princ "\nCe n'est pas un bloc!") ) (setq dxf_cod (entget (ssname js 0))) (princ (strcat "\nSélectionnez par une fenetre filtrée les blocs " (cdr (assoc 2 dxf_cod)) " : ")) (setq js (ssget (list (assoc 0 dxf_cod) (assoc 2 dxf_cod) (assoc 8 dxf_cod) (assoc 67 dxf_cod) (assoc 410 dxf_cod))) n -1 ) (princ "\nSélectionnez une polyligne où aligner les blocs.") (while (null (setq js_lw (ssget "_+.:E:S" (list '(0 . "*POLYLINE") (cons 67 (if (eq (getvar "CVPORT") 1) 1 0)) (cons 410 (if (eq (getvar "CVPORT") 1) (getvar "CTAB") "Model")) ) ) ) ) ) (vl-load-com) (setq obj (vlax-ename->vla-object (ssname js_lw 0))) (repeat (sslength js) (setq dxf_ent (entget (ssname js (setq n (1+ n)))) pt (cdr (assoc 10 dxf_ent)) pt_cl (vlax-curve-getClosestPointTo obj pt T) deriv (vlax-curve-getFirstDeriv obj (vlax-curve-getParamAtPoint obj pt_cl)) alpha (atan (cadr deriv) (car deriv)) dxf_ent (subst (cons 50 alpha) (assoc 50 dxf_ent) dxf_ent) ) (entmod dxf_ent) (entupd (cdar dxf_ent)) ) (prin1) )) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
doublecriquet Posté(e) le 9 juillet 2008 Auteur Posté(e) le 9 juillet 2008 ... Ca fonctionne du feu de Dieu !!! C'est parfaitement ce que je cherchais dès le début ! Merci bonuscad, tu m'a renversé sur le tatami en moins de 2 !! :P A tout hasard, est-il possible de faire le même genre de routine pour des éléments de texte (tous différents) à la place des blocs ?
lili2006 Posté(e) le 9 juillet 2008 Posté(e) le 9 juillet 2008 Re, le même genre de routine pour des éléments de texte Je me sers souvent de ce lisp (désolé, je ne me rapelle pas l'auteur, mais je ne pense pas que ce soit glané sur ce site,..) Commande : align_text (defun c:align_text ( / ss1 obj_txt ss2 obj_curv pt_sel param deriv alpha pt1 pt2 bdx mid_text delta obj_cpy pt1 pt2 key e_sel) (princ "\nChoix du texte à aligner: ") (while (not (setq ss1 (ssget "_+.:E:S" '((0 . "*TEXT")))))) (setq obj_txt (vlax-ename->vla-object (ssname ss1 0))) (while (not (setq ss2 (entsel "\nAligner le texte sur: ")))) (setq obj_curv (vlax-ename->vla-object (car ss2))) (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 ss2) 1 0)) param (vlax-curve-getparamatpoint obj_curv pt_sel) deriv (vlax-curve-getfirstderiv obj_curv param) alpha (atan (cadr deriv) (car deriv)) ) (vlax-put-property obj_txt 'Rotation alpha) (vlax-invoke-method obj_txt 'GetBoundingBox 'pt1 'pt2 ) (setq bdx (mapcar 'vlax-safearray->list (list pt1 pt2)) mid_text (mapcar '* (mapcar '+ (car bdx) (cadr bdx)) '(0.5 0.5 0.5)) obj_cpy (vlax-invoke-method obj_txt 'Copy) ) (if (eq (vlax-get-property obj_txt 'ObjectName) "AcDbText") (setq delta (vlax-get-property obj_txt 'Height)) (setq delta (cdr (assoc 43 (entget (ssname ss1 0))))) ) (vlax-invoke-method obj_txt 'Move (vlax-3d-point mid_text) (vlax-3d-point (setq pt1 (polar pt_sel (+ alpha (/ pi 2)) delta))) ) (vlax-invoke-method obj_cpy 'Move (vlax-3d-point mid_text) (vlax-3d-point (setq pt2 (polar pt_sel (- alpha (/ pi 2)) delta))) ) (setq ss2 (ssadd) ss2 (ssadd (vlax-vla-object->ename obj_cpy) ss2)) (if (zerop (getvar "PICKFIRST")) (setvar "PICKFIRST" 1)) (if (and ss1 ss2 (= 0 (getvar "CMDACTIVE"))) (progn (sssetfirst nil ss2) (princ "\n pour choix effacement; /[Espace]/Click+droit pour finir!.") (while (and (not (member (setq key (grread T 4 2)) '((2 13) (2 32)))) (/= (car key) 25)) (cond ((eq (car key) 5) (if ( (sssetfirst nil ss1) (sssetfirst nil ss2) ) ) ) ) ) ) (setq e_sel (ssname (cadr (ssgetfirst)) 0)) (if (eq e_sel (ssname ss1 0)) (setq obj_txt (vlax-ename->vla-object (ssname ss2 0)) pt_sel pt2) (setq obj_txt (vlax-ename->vla-object (ssname ss1 0)) pt_sel pt1) ) (entdel e_sel) (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)) (vlax-invoke-method obj_txt 'Rotate (vlax-3d-point pt_sel) (/ pi 2.0) ) ) ) (T (princ "\nL'objet ne peut servir de référence d'alignement") ) ) (prin1) ) Pas mal bonuscad ! Et il est ou cette fois ton "defun c:align_bloc", par exemple ?!. Cela m'intéresse de conserver ce code. Merci d'avance. Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
bonuscad Posté(e) le 9 juillet 2008 Posté(e) le 9 juillet 2008 Je me sers souvent de ce lisp (désolé, je ne me rapelle pas l'auteur, mais je ne pense pas que ce soit glané sur ce site,..) Commande : align_text Sur ma page , mais aussi sur cadxp !D'ailleurs il y avait une variante pour les blocs demandé par Kallain. Et il est ou cette fois ton "defun c:align_bloc", par exemple ?!. Je me sers souvent de lambda quand je fais une version test, ou que je ne sais pas quoi mettre comme nom de fonction. Je rappelle que lon peut remplacer sans aucun souci((lambda ( / ....) ......)) par(defun c:CEQUONVEUT ( / ....).....)pour en faire une fonction permanente à l'inverse de lambda qui est une fonction anonyme qui ne peut se lancer qu'une seule fois.Ne pas omettre cependant d'enlever une paire de parenthèses appariées qui se trouve avec lambda. Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
lili2006 Posté(e) le 10 juillet 2008 Posté(e) le 10 juillet 2008 Bonjour à toutes et tous, Sur ma page , mais aussi sur cadxp ! Milles excuses de ne pas t'avoir reconnu !!! (Faut dire le "defun c:CEQUONVEUT " est en début de lisp,...???!!! ) Encore un outil super génial au passage, ... Je rappelle que lon peut remplacer sans aucun souci,..... Merci pour cette piqure de rappel, je m'le note quelque part,...!) @+, Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
doublecriquet Posté(e) le 10 juillet 2008 Auteur Posté(e) le 10 juillet 2008 Salut, Merci à tous, je suis comblé ! mon travail va avancé vite vite grâce à votre aide ! ! ! Merci lili2006 pour Align_Text, encore une routine qui va me (presque) changer la vie ! Merci bonuscad pour le LISP "CEQUONVEUT" (<acronym class=dict title=) et le petit tuto de remplacement du lambda par defun, ça à pas l'air, mais pour quelqu'un qui ne connait pas le LISP, ça change bcp de chose... Merci Gile pour l'explication de MESURER avec des blocs ! Merci Philphil de ton aide Bref Merci, Merci, et encore Merci a vous tous et au super esprit d'entraide qui règne sur ce site !!:D:D:D
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