gaara Posté(e) le 9 mars 2010 Posté(e) le 9 mars 2010 salutj'ai besoin de votre aide les garsy a t il une methode de poser un objet(point, bloc...) sur une polyline optimisée(succession de polylines et cercles) à une distance que je saisis moi même. ;) [Edité le 9/3/2010 par gaara]
(gile) Posté(e) le 9 mars 2010 Posté(e) le 9 mars 2010 Salut, Ce n'est pas vraiment une réponse "Débuter en LISP" mais j'ai utilisé ce que j'avais fair pour Mes3d. La commande fonctionne comme MESURER mais avec des options plus conviviales et un fonctionnement plus stable en 3d (Option Bloc/Aligner) ;;; ATDIST (gile) ;;; Inère un point ou un bloc sur l'objet curviligne à la distance spécifé (defun c:AtDist (/ *error* ucszdir obj pick long dist nom algn scu nb rest ins_pt deriv1 ) (vl-load-com) ;; DivMesInsert Insère le bloc (ou le point) suivant les options choisies (defun DivMesInsert (/ norm deriv2 ang mat ydir) (if (/= scu "Scu") (cond ((member (vla-get-ObjectName obj) '("AcDbArc" "AcDbCircle" "AcDbEllipse" "AcDbPolyline" "AcDb2dPolyline" ) ) (setq norm (vlax-safearray->list (vlax-variant-value (vla-get-Normal obj)) ) ) ) ((not (member (vla-get-ObjectName obj) '("AcDbLine" "AcDb3dPolyline") ) ) (setq deriv2 (vlax-curve-getSecondDeriv obj ins_par ) ) (setq ang (ang ) ) (if ( (setq norm (norm_3pts '(0 0 0) deriv1 deriv2)) (setq norm (norm_3pts '(0 0 0) deriv2 deriv1)) ) ) ) ) (if nom (progn (if (= scu "Scu") (progn (if (= algn "Non") (setq ang (angle '(0 0 0) (trans (getvar "UCSXDIR") 0 ucszdir) ) ) (setq ang (angle '(0 0 0) (trans deriv1 0 ucszdir)) ) ) (setq mat (mapcar (function (lambda (v) (trans v 0 ucszdir))) (list (list (cos ang) (- (sin ang)) 0) (list (sin ang) (cos ang) 0) '(0 0 1) ) ) ) ) (if (= algn "Non") (setq ydir (norm_3pts '(0 0 0) norm (getvar "ucsxdir")) mat (trp (cons (norm_3Pts '(0 0 0) ydir norm) (cons ydir (cons norm mat) ) ) ) ) (setq mat (trp (list (mapcar (function (lambda (x) (/ x (distance '(0 0 0) deriv1)) ) ) deriv1 ) (norm_3pts '(0 0 0) norm deriv1) norm ) ) ) ) ) (vla-TransformBy (vla-InsertBlock (if (= (getvar "CVPORT") 1) (vla-get-PaperSpace *acdoc*) (vla-get-ModelSpace *acdoc*) ) (vlax-3d-point '(0 0 0)) nom 1 1 1 0 ) (vlax-tmatrix (append (mapcar (function (lambda (v1 v2) (append v1 (list v2)) ) ) mat ins_pt ) (list '(0 0 0 1)) ) ) ) (setvar "INSNAME" (vl-filename-base nom)) ) (vla-addPoint (if (= 1 (getvar 'cvport)) (vla-get-PaperSpace *acdoc*) (vla-get-ModelSpace *acdoc*) ) (vlax-3d-point ins_pt) ) ) ) (or *acad* (setq *acad* (vlax-get-acad-object))) (or *acdoc* (setq *acdoc* (vla-get-ActiveDocument *acad*))) (defun *error* (msg) (if (= msg "Fonction annulée") (princ) (princ (strcat "\nErreur: " msg)) ) (vla-EndUndoMark *acdoc*) (setq *error* m:err m:err nil ) (princ) ) (setq ucszdir (trans '(0 0 1) 1 0 T)) (sssetfirst nil nil) (if (vl-catch-all-error-p (vl-catch-all-apply 'vla-getEntity (list (vla-get-Utility *acdoc*) 'obj 'pick "\nChoix de l'objet à mesurer: " ) ) ) (prompt "*Incorrect*") (progn (if (vl-catch-all-error-p (vl-catch-all-apply 'vlax-curve-getEndParam (list obj)) ) (prompt "\nL'objet ne peut pas être mesuré.*Incorrect*") (progn (setq pick (vlax-curve-getClosestPointToProjection obj (trans (vlax-SafeArray->list pick) 1 0) (mapcar '- (trans (getvar "viewdir") 1 0) (trans '(0 0 0) 1 0) ) ) long (vlax-curve-getDistAtParam obj (vlax-curve-getEndParam obj) ) ) (prompt (strcat "\nLongueur de l'objet: " (rtos long))) (while (and (not (numberp dist)) (not nom)) (if (not (setq dist (getint "\nSpécifiez la longueur du segment ou : " ) ) ) (setq nom (getblock nil)) ) ) (if nom (progn (initget "Oui Non") (setq algn (getkword "\nAligner le bloc avec l'objet ? [Oui/Non] : " ) ) (if (not (member (vla-get-ObjectName obj) '("AcDbLine" "AcDb3dPolyline") ) ) (progn (initget "Objet Scu") (setq scu (getkword "\nPlan de référence pour l'insertion du bloc ? [Objet/Scu] : " ) ) ) (setq scu "Scu") ) (initget 7) (setq dist (getdist "\nSpécifiez la longueur du segment: ") ) ) ) (if ( (prompt "\nL'objet n'est pas assez long.") (progn (if ( (setq dist (- long dist)) ) (vla-StartUndoMark *acdoc*) (setq ins_pt (vlax-curve-getPointAtDist obj dist) ins_par (vlax-curve-getParamAtDist obj dist) deriv1 (vlax-curve-getFirstDeriv obj ins_par) ) (DivMesInsert) (vla-EndUndoMark *acdoc*) ) ) ) ) ) ) (princ) ) ;;; Getblock (gile) 03/11/07 ;;; Retourne le nom du bloc entré ou choisi par l'utilisateur ;;; dans une liste déroulante de la boite de dialogue ou depuis la boite ;;; de dialogue standard d'AutoCAD ;;; Argument : le titre (string) ou nil (défaut : "Choisir un bloc") (defun getblock (titre / bloc n lst tmp file what_next dcl_id nom) (while (setq bloc (tblnext "BLOCK" (not bloc))) (setq lst (cons (cdr (assoc 2 bloc)) lst) ) ) (setq lst (acad_strlsort (vl-remove-if (function (lambda (n) (= (substr n 1 1) "*"))) lst ) ) tmp (vl-filename-mktemp "Tmp.dcl") file (open tmp "w") ) (write-line (strcat "getblock:dialog{label=" (cond (titre (vl-prin1-to-string titre)) ("\"Choisir un bloc\"") ) ";initial_focus=\"bl\";:boxed_column{ :row{:text{label=\"Sélectionner\";alignment=left;} :button{label=\">>\";key=\"sel\";alignment=right;fixed_width=true;}} spacer; :column{:button{label=\"Parcourir...\";key=\"wbl\";alignment=right;fixed_width=true;}} :column{:text{label=\"Nom :\";alignment=left;}} :edit_box{key=\"tp\";edit_width=25;} :popup_list{key=\"bl\";edit_width=25;}spacer;} spacer; ok_cancel;}" ) file ) (close file) (setq dcl_id (load_dialog tmp)) (setq what_next 2) (while (>= what_next 2) (if (not (new_dialog "getblock" dcl_id)) (exit) ) (start_list "bl") (mapcar 'add_list lst) (end_list) (if (setq n (vl-position (strcase (getvar "INSNAME")) (mapcar 'strcase lst) ) ) (setq nom (nth n lst)) (setq nom (car lst) n 0 ) ) (set_tile "bl" (itoa n)) (action_tile "sel" "(done_dialog 5)") (action_tile "bl" "(setq nom (nth (atoi $value) lst))") (action_tile "wbl" "(done_dialog 3)") (action_tile "tp" "(setq nom $value) (done_dialog 4)") (action_tile "accept" "(setq nom (nth (atoi (get_tile \"bl\")) lst)) (done_dialog 1)" ) (setq what_next (start_dialog)) (cond ((= what_next 3) (if (setq nom (getfiled "Sélectionner un fichier" "" "dwg" 0)) (setq what_next 1) (setq what_next 2) ) ) ((= what_next 4) (cond ((not (read nom)) (setq what_next 2) ) ((tblsearch "BLOCK" nom) (setq what_next 1) ) ((findfile (setq nom (strcat nom ".dwg"))) (setq what_next 1) ) (T (alert (strcat "Le fichier \"" nom "\" est introuvable.")) (setq nom nil what_next 2 ) ) ) ) ((= what_next 5) (if (and (setq ent (car (entsel))) (= "INSERT" (cdr (assoc 0 (entget ent)))) ) (setq nom (cdr (assoc 2 (entget ent))) what_next 1 ) (setq what_next 2) ) ) ((= what_next 0) (setq nom nil) ) ) ) (unload_dialog dcl_id) (vl-file-delete tmp) nom ) ;; V^V ;; Retourne le produit vectoriel (vecteur) de deux vecteurs ;; ;; Arguments : deux vecteurs (defun v^v (v1 v2) (list (- (* (cadr v1) (caddr v2)) (* (caddr v1) (cadr v2))) (- (* (caddr v1) (car v2)) (* (car v1) (caddr v2))) (- (* (car v1) (cadr v2)) (* (cadr v1) (car v2))) ) ) ;; VUNIT ;; Retourne le vecteur unitaire d'un vecteur ;; ;; Argument : un vecteur (defun vunit (v) ((lambda (l) (if (/= 0 l) (mapcar (function (lambda (x) (/ x l))) v) ) ) (distance '(0 0 0) v) ) ) ;; NORM_3PTS ;; Retourne le vecteur normal du plan défini par 3 points ;; ;; Arguments : trois points (defun norm_3pts (p0 p1 p2) (vunit (v^v (mapcar '- p1 p0) (mapcar '- p2 p0))) ) ;; transpose une matrice Doug Wilson (defun trp (m) (apply 'mapcar (cons 'list m)) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
gaara Posté(e) le 9 mars 2010 Auteur Posté(e) le 9 mars 2010 merci pour avoir accorde du temps à lire et à repondre à mon sujet, je te suis reconnaissant :present: toutefois quand j'execute le lisp ça me donne le msg suivant: Erreur: no function definition: NORM_3PTS
(gile) Posté(e) le 9 mars 2010 Posté(e) le 9 mars 2010 Oupss !J'avais effectivement oublié de joindre cette routine (et quelques autres)C'est réparer, recopie le LISP. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
gaara Posté(e) le 9 mars 2010 Auteur Posté(e) le 9 mars 2010 merci encoreje vais encore abuser de ta gentillesse: :cool: est ce qu'on ne peut pas apporter une modification au code pour avoir le choix entre : inserer un block à une distance donnée et l'inserer à un à un pas qu on fixe tout en on y ajoutant un text qui s'incremente lui aussi au pas ??: PK40+100 --->PK40+200 je ne sais pas si j etais clair ou pas?? [Edité le 9/3/2010 par gaara]
(gile) Posté(e) le 9 mars 2010 Posté(e) le 9 mars 2010 Si je comprends bien la demande, c(est ce que fait le commande native MESURER ou, avec la même interface que ATDIST, la commande MES3D définie dans le LISP Diviser_Mesurer_3d.lsp sur cette page. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
gaara Posté(e) le 9 mars 2010 Auteur Posté(e) le 9 mars 2010 oui à 90% ça manque seulement le texte qui s'incremente lui aussi au pas choisiexpl: PK00+000 le suivant et PK00+100 puis PK00+200 ...ect :o
gaara Posté(e) le 9 mars 2010 Auteur Posté(e) le 9 mars 2010 merci gile pour ton aide precieuse et pour le temps consacre à ce sujet :present:
bonuscad Posté(e) le 9 mars 2010 Posté(e) le 9 mars 2010 Bonsoir, Regarde cette réponse , elle semble similaire à ta demande. Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
gaara Posté(e) le 10 mars 2010 Auteur Posté(e) le 10 mars 2010 merci pour ta reponse bonuscad, mais quand j execute le lisp ca me donne:PK de départ 0+000 <0.0>: 0 (entrée)La longueur est trop grande pour l'objet! 'sortie) :( un coup de main stp
bonuscad Posté(e) le 10 mars 2010 Posté(e) le 10 mars 2010 La longueur est trop grande pour l'objet! Ton objet a simplement une longueur insuffisante...Si tu travaille en mètres, l'objet doit avoir une longueur minimum de 1000 Le programme place le PK de départ (fixé par tes soins), de fin et les PK intermédiaires tous les 1km. Essayes avec un objet plus long, pour te rendre compte du résultat. Peut être que cela ne te convient pas à ton besoin. Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
gaara Posté(e) le 10 mars 2010 Auteur Posté(e) le 10 mars 2010 OH que si sauf que le pas doit etre 100m au lieu de 1kms'il y a un truc à faire pour modifier le pas :(
bonuscad Posté(e) le 10 mars 2010 Posté(e) le 10 mars 2010 le pas doit etre 100m au lieu de 1km Le code modifié en conséquence (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 . "ARIAL.TTF") (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 (append '((0 . "LINE") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (62 . 0) (6 . "ByBlock") (370 . -2) (100 . "AcDbLine")) (list (list 10 0.0 (/ (- (getvar "TEXTSIZE")) 100.0) 0.0)) (list (list 11 0.0 (/ (getvar "TEXTSIZE") 100.0) 0.0)) '((210 0.0 0.0 1.0)) ) ) (entmake '( (0 . "ATTDEF") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (62 . 0) (6 . "ByBlock") (370 . -2) (100 . "AcDbText") (10 0.05 0.1 0.0) (40 . 1.0) (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:mesure_PK ( / );(js dxf_obj obj_vlax pt_start pt_end total_dist partial_dist ori_dist tmp_var lst_pt increment_dist sv_luprec sv_dzin ang dxf_210 p_fix mantiss) (princ "\nSélectionner un objet curviligne à mesurer: ") (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 " (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)) partial_dist 100.0 ) (setq ori_dist (getreal "\nPK de départ 0+000 <0.0>: ")) (if (not ori_dist) (setq ori_dist 0.0)) (cond ((> total_dist partial_dist) ;(command "_.textsize" (while (not (zerop (getvar "cmdactive"))) (command pause))) (initget 6) (setq tmp_var (getdist (strcat "Entrez une nouvelle valeur pour TEXTSIZE <" (rtos (getvar "TEXTSIZE")) ">: "))) (if (not tmp_var) (setq tmp_var (getvar "TEXTSIZE"))) (setvar "TEXTSIZE" tmp_var) (make_blk_measure) (setq lst_pt (list pt_start) increment_dist (- 100.0 (atoi (substr (rtos ori_dist 2 3) (+ 3 (vl-string-search "." (rtos ori_dist 2 3)))))) sv_luprec (getvar "LUPREC") sv_dzin (getvar "DIMZIN") ) (setvar "CMDECHO" 1) (setvar "DIMZIN" 0) (command "_.luprec" 0) (while (< 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))) p_fix (atoi (rtos (/ (vlax-curve-getDistAtPoint obj_vlax n) 1000.0) 2 3)) mantiss (+ (- (vlax-curve-getDistAtPoint obj_vlax n) (* p_fix 1000.0) ) (atoi (substr (rtos ori_dist 2 3) (+ 2 (vl-string-search "." (rtos ori_dist 2 3))))) ) ) (if (or (equal mantiss 1000.0 1E-3) (> mantiss 1000.0)) (setq p_fix (1+ p_fix) mantiss (- mantiss 1000))) (if (zerop (fix mantiss)) (setq mantiss "000") (setq mantiss (rtos mantiss 2 0))) (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 (getvar "TEXTSIZE")) (cons 1 (strcat "PK " (itoa (+ p_fix (fix ori_dist))) "+" mantiss ) ) (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) ) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
gaara Posté(e) le 10 mars 2010 Auteur Posté(e) le 10 mars 2010 ca donne un msg :Entrez une nouvelle valeur pour TEXTSIZE <3>: 2.5; erreur: type d'argument incorrect: numberp: nil [Edité le 10/3/2010 par gaara]
bonuscad Posté(e) le 10 mars 2010 Posté(e) le 10 mars 2010 Tu as effacé ta demande à savoir:Écrire à 17m de manière parallèle Pour faire cela il suffit de remplacer la partie (entmake) de l'attribut. (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) 17.0);(polar (trans n 0 dxf_210) (+ (/ pi 2) ang) (* 0.1 partial_dist)) ang (* 0.05 partial_dist) ) ) (cons 40 (getvar "TEXTSIZE")) (cons 1 (strcat "PK " (itoa (+ p_fix (fix ori_dist))) "+" mantiss ) ) (cons 50 ang);(cons 50 (+ (/ pi 2) ang)) (cons 41 1.0) (cons 51 0.0) (cons 7 "$BLK_MEAS") (cons 71 0) (cons 72 1) (cons 11 (polar (trans n 0 dxf_210) (+ (/ pi 2) ang) 17.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 0) (cons 74 2) ) ) PS:dans le code précédent j'ai oublié d'enlever le semi-colon (defun c:mesure_PK ( / );(js dxf_obj ....doit être(defun c:mesure_PK ( / js dxf_obj .... Pour ton erreur, je vois pas, peut être lié à mon oubli ci dessus des variable locale Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
gaara Posté(e) le 11 mars 2010 Auteur Posté(e) le 11 mars 2010 super coolca marchait le lisp, :D merci à toi Bonuscad pour ttégalement à gile le chaoline du VLISP. Derniere chose y a t il un doc en français pour apprendre le Vlisp???
bbteddy Posté(e) le 15 mars 2010 Posté(e) le 15 mars 2010 Bonjour,j'arrive un peu tard mais cela ressemble à la commande "diviser" non ? @+
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