jcouaknine Posté(e) le 11 mars 2014 Posté(e) le 11 mars 2014 Bonjour, Toujours debutant en lip, J aurai besoin d un lisp pour ecrire la valeur de la surface d une polyligne avec deux chiffres apres la virgule ,et ce, apres avoir clique sur la polyligne. (PS : je ne souhaite pas passer par les champs...) Merci d avance pour votre aide...
Goldorak44 Posté(e) le 11 mars 2014 Posté(e) le 11 mars 2014 Salut, pour t'aider à réaliser ton lisp, voici quelques pistes : - Sélection de la polyligne : entsel- Transformation en objet : (vlax-ename->vla-object car (entsel))- Utilise la fonction (vlax-dump-object "nomdelobjet" T) pour connaitre les propriétées de ta polyligne. Ainsi tu trouvera l'élément donnant l'aire. - récupère cette valeur avec : (vla-get ....)- ensuite tu insère un MTEXT dans lequel tu injecte l'aire obtenue- tu laisse la main à l'utilisateur lors de la commande "MOVE" pour qu'il place le texte ou bon lui semble. N'hésite à poster des bouts de ton code pour que l'on t'aide si tu rencontre des difficultées. ;) PIRO CharlesDeveloppeur Revit, RV/RA - Formateur RevitPIRO CIE
capde06 Posté(e) le 11 mars 2014 Posté(e) le 11 mars 2014 yoplus haut c'est pour du visual lispmaintenant si tu veux le faire en lip (comme tu dis) il faut- lancer la command "aire" sur ta polylign- récupérer la valeur surface dans la variable "area"- après l’insérer dans texte- pour les 2 chiffres apres la virgule voir la fonction (rtos (getvar "area") 2 2)dans les 2 cas fait ton prog apres il y aura toujours quelqu'un pour d'aiderte le donner tout cuit ne te fera pas progresserbon courage Vous fîtes ce que vous pûtes et vous m'épatâtes !!!!
annec Posté(e) le 13 mars 2014 Posté(e) le 13 mars 2014 voilà ce que j'ai, mais c'est 1 chiffre après la virgule, je pense qi'il n'y a pas grand chose à changer pour 2 chiffres, mais je fais moi aussi par tatonnement. bon courage ps, il faut que le style de texte ait une hauteurSURF.LSP
DenisHen Posté(e) le 13 mars 2014 Posté(e) le 13 mars 2014 Salut à tous, Pour 2 décimales, je pense qu'il faut changer cette ligne (setq a (rtos (/ c 10000) 2 1)) par celle-ci(setq a (rtos (/ c 10000) 2 2)) Et je pense aussi qu'il faut éviter de nommer ton LiSP "S", car cette commande est un alias à Style... Denis... Windows 11 / AutoCAD 2024 Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net). Davantage d'avantages, avantagent davantage (Bobby Lapointe). La connaissance s'accroît quand on la partage (Socrate). Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)
Goldorak44 Posté(e) le 13 mars 2014 Posté(e) le 13 mars 2014 Salut, c'est un bon début mais perfectible !! (defun c:s () (princ "\nChoix d'une polyligne:") (setq s (ssget)) (command "_area" "e" s) (setq c (getvar "area")) (setq a (rtos (/ c 10000) 2 1)) (setq b (strcat a "m2")) (princ "\n POSITION ET ANGLE DU TEXTE \n") (command "texte" pause pause B) ;(setq x (entlast)) ;(PRINC "\n POSITION DU TEXTE \n") ;(command "deplacer" x "" "0,0" pause) (princ "\n TRAITEMENT TERMINE \n") ) (defun c:s ()Comme l'a dis denis au dessus, S comme lettre c'est pas top. SURF c'est mieux.Il est également préférable de déclarer tes variables comme ceci :(defun c:SURF ( / s c a b x) (princ "\nChoix d'une polyligne:") (setq s (ssget)) Pour la sélection d'une polyligne, tu peux faire comme ceci :(setq s (entsel "\nSélectionner une polyligne: ")) Pour la précision, Denis t'a répondu ! Sinon, pour les commandes, utilise les commandes internationales. Pour les connaitres utilise cette syntaxe (getcname "commande")Donc pour "texte", ce sera "_TEXT" et pour deplacer "_MOVE". La fin de ton prog est améliorable mais c'est surtout une question de préférence ! PIRO CharlesDeveloppeur Revit, RV/RA - Formateur RevitPIRO CIE
bonuscad Posté(e) le 14 mars 2014 Posté(e) le 14 mars 2014 Ces derniers jours une connaissance (pas virtuelle) m'a demandé un coup de main pour lui écrire un lisp sur des longueurs cumulées de polyligne. Je lui ai pondu ça, si ça peut vous donner des idées... (vl-load-com) (defun c:cumul_length ( / js n ename l_cumul ent_text dxf_ent key) (princ "\nSélectionner les polylignes pour avoir le cumul.") (or (setq js (ssget "_I" '((0 . "*POLYLINE") (-4 . "<NOT") (-4 . "&") (70 . 112) (-4 . "NOT>")))) (setq js (ssget "_P" '((0 . "*POLYLINE") (-4 . "<NOT") (-4 . "&") (70 . 112) (-4 . "NOT>")))) ) (cond (js (sssetfirst nil js) (initget "Existant Nouveau _Existent New") (if (eq (getkword "\nTraiter jeu de sélection [Existant/Nouveau] <Existant>: ") "New") (progn (sssetfirst nil nil) (setq js (ssadd) js (ssget '((0 . "*POLYLINE") (-4 . "<NOT") (-4 . "&") (70 . 112) (-4 . "NOT>"))))) ) ) (T (setq js (ssget '((0 . "*POLYLINE") (-4 . "<NOT") (-4 . "&") (70 . 112) (-4 . "NOT>")))) ) ) (cond (js (setq l_cumul 0.0) (repeat (setq n (sslength js)) (setq ename (vlax-ename->vla-object (ssname js (setq n (1- n))))) (if (vlax-property-available-p ename 'Length) (setq l_cumul (+ (vlax-get ename 'Length) l_cumul)) ) ) (princ (strcat "\nLe total cumulé des polylignes sélectionnées est de " (rtos l_cumul))) (setq ent_text (entmakex (list (cons 0 "MTEXT") (cons 100 "AcDbEntity") (cons 100 "AcDbMText") (cons 1 (strcat (rtos l_cumul 2 2) " cm")) (cons 10 (trans (getvar "VIEWCTR") 0 1)) (cons 40 (getvar "TEXTSIZE")) (cons 50 (- 0 (getvar "VIEWTWIST"))) (cons 7 (getvar "TEXTSTYLE")) (cons 71 7) (cons 72 5) ) ) dxf_ent (entget ent_text) ) (while (and (setq key (grread T 4 0)) (/= (car key) 3)) (cond ((eq (car key) 5) (setq dxf_ent (subst (cons 10 (trans (cadr key) 1 0)) (assoc 10 dxf_ent) dxf_ent)) (entmod dxf_ent) ) ) ) ) ) (prin1) ) De mon coté j'ai voulu essayer une version avec des repères multiple, la voilà.. (vl-load-com) (defun c:cumul_length ( / js n ename l_cumul l_pt nb) (princ "\nSélectionner les polylignes pour avoir le cumul.") (or (setq js (ssget "_I" '((0 . "*POLYLINE") (-4 . "<NOT") (-4 . "&") (70 . 112) (-4 . "NOT>")))) (setq js (ssget "_P" '((0 . "*POLYLINE") (-4 . "<NOT") (-4 . "&") (70 . 112) (-4 . "NOT>")))) ) (cond (js (sssetfirst nil js) (initget "Existant Nouveau _Existent New") (if (eq (getkword "\nTraiter jeu de sélection [Existant/Nouveau] <Existant>: ") "New") (progn (sssetfirst nil nil) (setq js (ssadd) js (ssget '((0 . "*POLYLINE") (-4 . "<NOT") (-4 . "&") (70 . 112) (-4 . "NOT>"))))) ) ) (T (setq js (ssget '( (0 . "*POLYLINE") (-4 . "<NOT") (-4 . "&") (70 . 112) (-4 . "NOT>") ) ) ) ) ) (cond (js (setq l_cumul 0.0 l_pt nil tmp_l '()) (repeat (setq n (sslength js)) (setq ename (vlax-ename->vla-object (ssname js (setq n (1- n))))) (if (vlax-property-available-p ename 'Length) (setq l_cumul (+ (vlax-get ename 'Length) l_cumul) l_pt (cons (vlax-curve-GetpointAtParam ename (* 0.5 (vlax-curve-getEndParam ename))) l_pt) ) ) ) (princ (strcat "\nLe total cumulé des polylignes sélectionnées est de " (rtos l_cumul))) (entmake (append (list '(0 . "MULTILEADER") '(100 . "AcDbEntity") '(100 . "AcDbMLeader") '(300 . "CONTEXT_DATA{") '(40 . 1.0) '(41 . 4.0) '(140 . 4.0) '(145 . 2.0) '(174 . 1) '(175 . 6) '(176 . 2) '(177 . 0) '(290 . 1) (cons 304 (rtos l_cumul)) '(11 0.0 0.0 1.0) '(13 1.0 0.0 0.0) '(42 . 0.0) '(43 . 0.0) '(44 . 0.0) '(45 . 1.0) '(170 . 1) '(90 . -1073741824) '(171 . 3) '(172 . 5) '(91 . -1073741824) '(141 . 0.0) '(92 . 15726992) '(291 . 0) '(292 . 0) '(173 . 0) '(293 . 0) '(142 . 0.0) '(143 . 0.0) '(294 . 0) '(295 . 0) '(296 . 0) '(110 122.689 121.446 0.0) '(111 1.0 0.0 0.0) '(112 0.0 1.0 0.0) '(297 . 0) '(302 . "LEADER{") '(290 . 1) '(291 . 1) (cons 10 (list (/ (apply '+ (mapcar 'car l_pt)) (setq nb (length l_pt))) (/ (apply '+ (mapcar 'cadr l_pt)) nb))) '(11 -1.0 0.0 0.0) '(90 . 0) '(40 . 18.4914) ) (repeat nb (setq tmp_l (append '((304 . "LEADER_LINE{")) (list (cons 10 (nth (setq nb (1- nb)) l_pt))) (list (cons 91 nb)) '((305 . "}")) tmp_l ) ) ) (list '(303 . "}") '(301 . "}") '(90 . 279680) '(170 . 1) '(91 . -1056964608) '(171 . -2) '(290 . 1) '(291 . 1) '(41 . 0.36) '(42 . 4.0) '(172 . 2) '(173 . 1) '(95 . 6) '(174 . 1) '(175 . 2) '(92 . -1056964608) '(292 . 0) '(93 . -1056964608) '(10 1.0 1.0 1.0) '(43 . 0.0) '(176 . 0) '(293 . 0) '(294 . 0) '(178 . 0) '(179 . 3) '(45 . 1.0) ) ) ) (sssetfirst nil (ssadd (entlast))) ) ) (prin1) ) Pour cette dernière le repère est grippé, il suffit d'activé une poignée sur le texte pour pouvoir la déplacer et que les ligne de repères suivent. Amusez vous ! Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
lecrabe Posté(e) le 14 mars 2014 Posté(e) le 14 mars 2014 Hello Bruno Merci pour la communaute et BON retablissement ! et avec 2 micro-modifs j'en ai derive la version pour les Aires/Surfaces ... Bye, lecrabe Autodesk Expert Elite Team
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