bonuscad Posté(e) le 7 septembre 2006 Posté(e) le 7 septembre 2006 Ayant répondu sur un forum US pour effectuer une mesure avec un attribut incrémenté.Je reposte ici pour ceux qui ne fréquente pas ces forums et que ça pourrait interesser. Gile pourrait aussi améliorer son diviser/mesurer-3D pour inclure cette possibilité, car l'optique est similaire ( c'est juste une idée ;) ) NB: Le code se charge de créer le bloc avec attribut. L'échelle du texte d'attribut s'adapte à la longueur donnée comme incrémentation. (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 . "simplex.shx") (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 '((0 . "POINT") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbPoint") (10 0.0 0.0 0.0) (210 0.0 0.0 1.0) (50 . 0.0)) ) (entmake '( (0 . "ATTDEF") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbText") (10 0.05 0.1 0.0) (40 . 0.1) (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:blk-att_measure ( / js dxf_obj obj_vlax pt_start pt_end total_dist partial_dist lst_pt increment_dist sv_luprec sv_dzin ang dxf_210) (princ "\nSélectionner un objet curviligne à mesurer/diviser: ") (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 "[b]<[/b]NOT") (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)) ) (initget "Mesurer Diviser _Measure Divide") (if (eq (getkword (strcat "\n[Mesurer/Diviser] l'objet d'une longueur de " (rtos total_dist) "? [b]<[/b]M>: ")) "Divide") (progn (initget 7) (setq partial_dist (getint "\nEntrez le nombre de segments: ") partial_dist (/ total_dist partial_dist) ) ) (progn (initget 7) (setq partial_dist (getdist "\nSpécifiez la longueur du segment: ")) ) ) (cond ((> total_dist partial_dist) (make_blk_measure) (setq lst_pt (list pt_start) increment_dist partial_dist sv_luprec (getvar "LUPREC") sv_dzin (getvar "DIMZIN") ) (setvar "CMDECHO" 1) (setvar "DIMZIN" 0) (command "_.luprec" pause) (while ([b]<[/b] 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))) ) (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 (* 0.1 partial_dist)) (cons 1 (rtos (vlax-curve-getDistAtPoint obj_vlax n))) (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) ) L'amélioration concerne l'orientation de l'attribut par rapport à l'objet curviligne, le choix de la police a utiliser pour celui-ci, ainsi que la possibilité de faire une incrémentation soit numérique, soit alphabétique avec un pas d'incrémentation pour les valeurs numériques.La routine est influencée par les variables PDMODE, PDSIZE et DIMPOST. Donc l'aspect peut être différent suivant l'état de ces variables. (DimPost = préfixe et/ou suffixe ajouté à l'attribut)Je vous laisse découvrir les possibilités plus en détail en l'essayant! [Edité le 20/9/2008 par bonuscad] Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
(gile) Posté(e) le 7 septembre 2006 Posté(e) le 7 septembre 2006 Encore un joli coup pour ta rentrée ;) L'échelle du texte d'attribut s'adapte à la longueur donnée comme incrémentation. Ça, c'est une bonne idée, mais pour le point, peut-être eut il mieux valu laisser l'échelle à 1.0 pour ceux qui ne paramètrent pas PDMODE à 0. avec PDMODE à 34 et (cons 41 (* 0.1 partial_dist)) (cons 42 (* 0.1 partial_dist)) (cons 43 (* 0.1 partial_dist)) http://xs106.xs.to/xs106/06364/measure1.PNG.xs.jpg en remettant les échelles à 1.0(cons 41 1.0) (cons 42 1.0) (cons 43 1.0) http://xs106.xs.to/xs106/06364/measure2.PNG.xs.jpg Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
bonuscad Posté(e) le 7 septembre 2006 Auteur Posté(e) le 7 septembre 2006 Encore un joli coup pour ta rentrée Merci. ;) Je pense pas que ce soit PDMODE qui pose problème, mais plutôt PDSIZE. Une valeur négative se fera par rapport à la vue écran, une valeur positive se fera par rapport aux unités dessin. A mon avis la valeur positive est souhaitable, personellement j'utillise ce mode de PDSIZE, mais chacun peut l'ajuster selon son désir, comme PDMODE d'ailleurs. Cela est tellement simple à modifier dans la boite de dialogue "Style des points" qu'il est inutile de paraméter celle-ci dans une routine à mon avis... Les facteurs d'échelle dont tu parles ont plutôt une incidence sur la taille du texte de l'attribut. Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
(gile) Posté(e) le 8 septembre 2006 Posté(e) le 8 septembre 2006 Re, Effectivement, j'utilise une valeur négative pour PDSIZE (taille par raport à l'écran) ce qui me permet, après un regen, de ne pas avoir des points immenses ou invisibles lors des changements de zoom. Les facteurs d'échelle dont tu parles ont plutôt une incidence sur la taille du texte de l'attribut. Il me semble qu'on peut laisser un facteur d'échelle de 1.0 pour les X,Y et Z à l'insertion du bloc :(entmake '((0 . "INSERT") ...(41 . 1.0) (42 . 1.0) (43 . 1.0) ...)) et jouer uniquement sur la hauteur de texte de l'attribut : (entmake '((0 . "ATTRIB") ... (cons 40 (* 0.1 partial_dist)) ...)). C'est comme ça que j'ai fait dans la modif proposée pour Diviser/Mesurer 3D (en vlisp). Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
bonuscad Posté(e) le 12 septembre 2006 Auteur Posté(e) le 12 septembre 2006 Alméliorations apportées et possibilités augmentées.Voir le message d'entête Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
(gile) Posté(e) le 13 septembre 2006 Posté(e) le 13 septembre 2006 Salut, J'ai un peu testé, et j'ai eu un problème avec le filtre de sélection. Ça vient du code 67, je pense qu'il est préférable de tester la variable cvport avec 1 (espace papier) parce que s'il y a plusieurs fenêtres dans l'espace objet cvport peut être à 2, 3, 4, etc... J'ai donc remplacé cette partie dans le filtre de sélection par : (cons 67 (if (eq (getvar "CVPORT") 1) 1 0 ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
bonuscad Posté(e) le 13 septembre 2006 Auteur Posté(e) le 13 septembre 2006 Merci pour la remarque ;) effectivement la selection ne peut se faire. Comme ta proposition ne vas non plus, je pense que la solution est de bêtement enlever ou mettre en remarque le code 67 et 410, car ça fonctionne très bien sans. :P Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
(gile) Posté(e) le 14 septembre 2006 Posté(e) le 14 septembre 2006 Comme ta proposition ne vas non plus Pourrais-tu préciser s'il te plait, je me sers d'un test semblable pour définir l'espace actif dans des routines en vlisp : (setq Space (if (= (getvar "CVPORT") 1) (vla-get-PaperSpace (vla-get-activedocument (vlax-get-acad-object)) ) (vla-get-ModelSpace (vla-get-activedocument (vlax-get-acad-object)) ) )) Y aurait-il quelque chose qui m'ait échappé ? Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
bonuscad Posté(e) le 14 septembre 2006 Auteur Posté(e) le 14 septembre 2006 Comme ta proposition ne vas non plus Désolé pour ma réponse hative, en fait cela fonctionne si j'applique le même test pour le code 410 (while (not (setq js (ssget "_+.:E:S" (list (cons 0 "*POLYLINE,LINE,ARC,CIRCLE,ELLIPSE,SPLINE") (cons 67 (if (eq (getvar "CVPORT") 1) 1 0)) (cons 410 (if (eq (getvar "CVPORT") 1) (getvar "CTAB") "Model")) (cons -4 "< NOT") (cons -4 "&") (cons 70 112) (cons -4 "NOT>") ) ) ) ) (princ "\nCe n'est pas un objet curviligne valable pour cette fonction!") ) Fonctionne dans toutes les fenêtres :P Pour ssget avec cette option, la définition de ces codes n'est pas utile car cela fonctionne à l'identique sans définition de ceux-ci, par contre avec l'option "_X" cela peut être utile pour d'autre cas donc, encore merci pour le rectificatif ;) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
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