cadpolo Posté(e) le 27 février 2006 Posté(e) le 27 février 2006 Salut ... J'ai repris le code d''exemple du chemin gppath...En juste le tracé du contour,donc avec cet exemple on utilise la fonction Angle ...Donc (setq pangle (Angle sp ep)) ;;Angle de la ligne sp ep par rapport a l'axe des X ....Mais je souhaite récupérer cette angle pour l'ajouter au texte (command "texte" pt "ht" "angle" "txt" "" )Si je fais un txt horizontal OK ça marche, mais inclinée Ben la non même en ayant convertit le radian en degré ..... Avez vous un idée ....... Salut :casstet:
Tramber Posté(e) le 27 février 2006 Posté(e) le 27 février 2006 (command "texte" pt "ht" pangle "txt" "" ) Non ? Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
cadpolo Posté(e) le 27 février 2006 Auteur Posté(e) le 27 février 2006 Salut Tramber ....Oui ...PANGLE devrait retourner l'angle à la commande texte , mais ça ne marche...il est vrais que "angle" est faux c'était un exemple .....Toujours est-il pangle renvois effectiment un angle mais la commande texte ne l'exploite pas .....
kallain Posté(e) le 27 février 2006 Posté(e) le 27 février 2006 Trouvé sur (ou grace à) CadXp ;) mais je sais plus où ;LTR.lsp - Selectionner une Ligne et un Texte : Le texte prend la même orientation qur la ligne.(defun C:LTR() ;turn off the system echo (setvar "cmdecho" 0) ;display a message on the command line (princ "\n Selectionner la Ligne.") ;let the user select one entity (if (setq eset(entsel)) (progn ;get the entity name from the entsel command (setq en(car eset)) ;get the DXF group codes of the selected entity (setq enlist(entget en)) ;check to see if a LINE was selected (if(= "LINE" (cdr(assoc 0 enlist))) (progn ;display a message on the command line (princ "\n Selectionner le Texte .") ;let the user select one entity (if(setq eset2(entsel)) (progn ;get the starting point of the line (setq ept1(cdr(assoc 10 enlist))) ;get the end point of the line (setq ept2(cdr(assoc 11 enlist))) ;get the angle from the end points of the line (setq ang1(angle ept1 ept2)) ;get the entity name from the entsel function (setq en2(car eset2)) ;get the DXF Group Codes of the entity (setq enlist2(entget en2)) ;change the angle in the text entities DXF group codes (setq enlist2(subst (cons 50 ang1)(assoc 50 enlist2)enlist2)) ;update the text entity (entmod enlist2) ) ;if the second entity wasn't selected... (princ "\n Select Text Entity Please. Program Aborted.") ) ) ;if the first entity wasn't a line (princ "\n L'entité sélectionnée n'est pas une Ligne. Program Aborted.") ) ) ;if the first entity wasn't selected (princ "\n Nothing selected. Program Aborted.") ) ;reset the system echo (setvar "cmdecho" 1) ;suppress the last echo (princ) ) ;End of Program
Tramber Posté(e) le 27 février 2006 Posté(e) le 27 février 2006 Bien sur, ton angle est en radian il faut le multiplier par 180 et le diviser par PI !Ou changer le controle des unités pour exprimer tes angles en radians, ce que tout le monde adore faire :cool: Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
(gile) Posté(e) le 27 février 2006 Posté(e) le 27 février 2006 (command "texte" pt [surligneur]ht (angtos pangle 0 8)[/surligneur] "txt" "" ) Devrait marcher, angtos retourne l'angle sous forme de chaine (accepté par command) en prenant en compte les variables AUNITS, AUPREC , ANGDIR et ANGBASE. Si ht est une variable (setq), il ne faut pas de guillemets. Pour que ta routine soit plus "universelle" (qu'elle marche pour ceux qui travaillent avec d'autres unité que les degrés) il faudrait écrire (angtos pangle (getvar "AUNITS") 8). [Edité le 27/2/2006 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
zebulon_ Posté(e) le 28 février 2006 Posté(e) le 28 février 2006 Bonjour, je vous suggère l'utilisation de la commande (getangle) au lieu de (angle). Getangle, associé avec angtos, ça marche assez bien. (command "texte" (setq lp (getpoint)) (getdist lp) (angtos (getangle lp)) "texte") ça marche à tous les coups, sauf quand on a changer l'orientation de l'angle 0 (à l'est par défaut, qu'on aurait mis au nord) ou le sens de rotation des angles (mathématique ou horaire) Amicalement Zebulon_ C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
(gile) Posté(e) le 28 février 2006 Posté(e) le 28 février 2006 Petite précision : GETANGLE tient compte des variables ANGDIR et ANGBASE GETORIENT ne tient pas compte de ces variables (toujours 0.0 à l'est et sens trigonmétrique) Sinon, pour d'autres raisons, j'avais commis 2 petits LISP ici (ang2str et str2ang) qui font comme ANGTOS et ANGTOF mais sans tenir compte des variables ci-dessus. (angtos (getorient)) équivaut donc à (ang2str (getangle)) et les deux fonctionnent quelques soient les valeurs de ANGDIR et ANGBASE. Si dans le cas qui nous préoccupe, l'angle est défini dans le LISP sans intervention de l'utilisateur (récupération des valeurs dxf 10 et 11 d'une ligne, par exemple) c'est bien la fonction ANGLE qu'il faut utiliser, et dans ce cas, ANGTOS fonctionne. [Edité le 28/2/2006 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
cadpolo Posté(e) le 28 février 2006 Auteur Posté(e) le 28 février 2006 Salut à vous .....Merci pour ces réponses ....Tramber ...Je croyais qu'autolisp acceptait de des radians ....... c'est une questionn..... De toute les façons je vais eaayer ça et aussi la commande de gile .... C'est vrai qu'il y Getangle, mai comme j'utilise l'angle forme par deux points,parce que je trace une poutre, autant faire un seule manip ........ Merci a tous ....
(gile) Posté(e) le 28 février 2006 Posté(e) le 28 février 2006 Je croyais qu'autolisp acceptait de des radians ....... c'est une questionn..... AutoCAD fait tous les calculs pour les angles en radians, si tu fais : (setq ang (getangle "\nSpécifiez l'angle: ")) Si tu réponds 45 (avec AUNITS = 0, ANGBASE = 0.0 et ANGDIR = 0), la valeur attribuée à ang sera 0.785398 soit pi / 4 radians. Mais quand tu utilises command les valeurs d'angles doivent être exprimées dans les unités courantes, comme quand tu tapes une valeur d'angle à la ligne de commande. D'où l'intérêt de angtos qui traduit une valeur numérique en radians en une chaine de caractères représentant la valeur de l'angle dans le système d'unités courant (à moins de spécifier une valeur de AUNITS différente comme premier argument). (angtos (/ pi 4)) retourne "45.00" (avec AUNITS = 0, AUPREC = 2, ANGBASE = 0.0 et ANGDIR = 0). angtos peut être utilisé directement avec command -sans passer par un (atof (angtos ... ou un (read (angtos ...- parcque command accepte les valeurs numérique aussi bien sous forme de réél ou entier que sous forme de chaine de caractères. Pour reprendre ton exemple : (command "texte" pt ht [surligneur]45.0[/surligneur] "txt" "" ) fonctionne comme : (command "texte" pt ht [surligneur]"45.0"[/surligneur] "txt" "" ) ou comme : (command "texte" pt ht (angtos (/ pi 4) 0 14) "txt" "" ) L'intérêt de spécifier le deuxième argument pour angtos (14 étant le nombre maximal de décimales accepté) est de conserver toute la précision d'AutoCAD. Cet argument nécessite que le premier (unités) soit spécifié, d'où le (getvar "AUNITS") proposé plus haut pour récupérer le type d'unités courant. [Edité le 28/2/2006 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
cadpolo Posté(e) le 1 mars 2006 Auteur Posté(e) le 1 mars 2006 Bien ....Avec tout ça j'ai de quoi réussir Merci
cadpolo Posté(e) le 7 mars 2006 Auteur Posté(e) le 7 mars 2006 Salut .... Bon ça marche ........ Merci à vous ....
ici Posté(e) le 13 mars 2006 Posté(e) le 13 mars 2006 bonjourmoi je cherche la meme chose que le lisp de kallain mais en prenant une polyligne pour l'orientationà la maniere du scu de l'objetou une solution pour le modifié(je suis novice)merci
bonuscad Posté(e) le 13 mars 2006 Posté(e) le 13 mars 2006 Une routine qui va permettre d'aligner après coup un texte ou multitexte sur un segment droit.Ce segment peut être une droite, demi-droite, ligne , segment de polyligne ou LWpolyligne Par un simple clic tu peut ensuite faire tourner ce texte de 90° pour le mettre perpendiculaire au segment (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:Align_text ( / 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) ) [Edité le 16/3/2006 par bonuscad] Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
kallain Posté(e) le 13 mars 2006 Posté(e) le 13 mars 2006 l'essayer c'est l'adopter ;) C'est encore mieux qu'il le dit : rien qu'avec le clic gauche, le texte peut tourner dans les 4 directions. :D [Edité le 13/3/2006 par kallain]
kallain Posté(e) le 13 mars 2006 Posté(e) le 13 mars 2006 Le même pour les blockc, c'est possible ? :) :D
(gile) Posté(e) le 13 mars 2006 Posté(e) le 13 mars 2006 Encore un très joli coup du grand Bonuscad ;) [Edité le 13/3/2006 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
ici Posté(e) le 14 mars 2006 Posté(e) le 14 mars 2006 bonjourje reste sans voieencore merci c'est tout a fait ce que je cherchais
bonuscad Posté(e) le 14 mars 2006 Posté(e) le 14 mars 2006 Le même pour les blockc, c'est possible ? Oui avec peu de changement (defun ainerr (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:Align_insert ( / olderr old_abase old_adir e_ins dxf_ins e_seg ent dxf_ent typent l_2pt dxf_11 x_alpha pt_base) (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* ainerr) (while (null (setq e_ins (entsel "\nChoix du bloc à aligner: ")))) (cond ((= (setq typent (cdr (assoc 0 (setq dxf_ins (entget (car e_ins)))))) "INSERT") (while (null (setq e_seg (entsel "\nAligner le bloc 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 (setq pt_base (trans (cdr (assoc 10 dxf_ins)) (car e_ins) 1)) (command "_.rotate" e_ins "" "_none" pt_base "_none" (polar pt_base (- (cdr (assoc 50 dxf_ins))) 10)) (command "_.rotate" e_ins "" "_none" pt_base "_none" (polar pt_base x_alpha 10)) (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)) (command "_.rotate" e_ins "" "_none" pt_base "_none" (polar pt_base (/ pi 2.0) 10)) ) (redraw) ) ) ) (T (princ "\nCe n'est pas un bloc!")) ) (setvar "angdir" old_adir) (setvar "angbase" old_abase) (setvar "osmode" old_osmd) (setq *error* olderr) (setvar "cmdecho" 1) (princ) ) du grand Bonuscad :red:Ca fait plaisir, mais faut pas exagérer, surtout que je suis sur que c'est encore imparfait, notamment dans les SCU. [Edité le 16/3/2006 par bonuscad] Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Tramber Posté(e) le 14 mars 2006 Posté(e) le 14 mars 2006 Pourquoi pas 128 (PLINEGEN ?). Et saurais-tu expliquer un peu la fonction boole ? Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
cadpolo Posté(e) le 14 mars 2006 Auteur Posté(e) le 14 mars 2006 Salut ....Mon code est de loin aussi balaise que celui de Bonuscad ... Mais celui que j'ai fait répond lus a mes besoins .... Déroulement Je pointes deux point a l'axe d'un mur, il me trace un rectangle et y met du txt ....... Moi étant "" bétonneux """ un section de poutre par ex.... [surligneur] Par contre je l'ai utilisé ce matin il par en vrille il me renvois des coordonnées ........[/surligneur] (defun Annotation () (if (not (tblsearch "LAYER" "_BA_textes")) (command "-calque" "E" "_BA_textes" "CO" "1" "" "") ) (if (not (tblsearch "style" "_AnnotationPP")) (command "-style" "_AnnotationPP" "romans" "0" "1" "0" "N" "N" "N" "") ) ) (defun dtr (a) (* pi (/ a 180.0)) );;;fin de defun (defun rect_util () (setvar "osmode" 2 ) (setq sp (getpoint "\n Point de départ<à l'axe> : ")) ;; Cliqué point de départ (setq ep (getpoint "\n Entrer la Longueur: " sp)) ;;Longueur de l'élément (setvar "osmode" 640 ) (setq width (getdist "\n Entrer la Largeur: ")) ;;Largeur de lélément (setq haut (getint "\n Entrer la Hauteur: ")) ;;Largeur de lélément (setq pangle (angle sp ep)) ;;Retourne l'angle entre sp ep par rapport a X (setq plength (distance sp ep)) ;;Calcul la longueur entre ces deux points (setq angp90 (+ pangle (dtr 90))) ;;Définit un positif et Convertit l'angle 90 en radian (setq angm90 (- pangle (dtr 90))) ;;Définit un négatif et Convertit l'angle 90 en radian ) ;;fin de defun rect_util (defun dess_rect () (command "ligne" sp (setq p2 (polar sp angm90 (/ width 2))) (setq p3 (polar p2 pangle plength)) (setq p4 (polar p3 angp90 width)) (setq p5 (polar p4 (+ pangle (dtr 180)) plength)) "clore" ) ;fin de polylign ) ;;fin de defun dess_rect (defun Annotation_txt () (setq old_osmode (getvar "osmode")) (setvar "osmode" 64 ) (setq txt1 (polar sp pangle (* plength 0.34))) (setq txt2 (polar txt1 angp90 width)) (setq txt3 (polar sp pangle (* plength 0.58))) (setq txt4 (polar txt3 angp90 width)) (setvar "cecolor" "2" ) (command "texte" txt2 "0.16" (angtos pangle 0 8) "PP" "") (setvar "clayer" "_BA_textes" ) (setvar "cecolor" "Ducalque" ) (setq txt_Ann (strcat (itoa(fix (* (* width 10)10))) "x" (itoa haut) "ht")) (command "texte" txt4 "0.12" (angtos pangle 0 8) txt_Ann "") ) (defun c:poutre () (setq old_layer (getvar "clayer")) (rect_util) (if (not (tblsearch "LAYER" "_BA_Poutres")) (command "-calque" "E" "_BA_Poutres" "CO" "3" "" "") ) (setvar "clayer" "_BA_Poutres" ) (setvar "cecolor" "Ducalque" ) (dess_rect) (setvar "clayer" old_layer ) (if (not (tblsearch "LAYER" "_BA_textes")) (command "-calque" "E" "_BA_textes" "CO" "1" "" "") ) (if (not (tblsearch "style" "_AnnotationPP")) (command "-style" "_AnnotationPP" "romans" "0" "1" "0" "N" "N" "N" "") ) (Annotation_txt) )
kallain Posté(e) le 14 mars 2006 Posté(e) le 14 mars 2006 Le même pour les blocks, c'est possible ? Oui avec peu de changement Réponds Bonucad aussi sec. Merci beaucoup :D , encore un bouton de plus à l'écran et une donation là à CadXP.
bonuscad Posté(e) le 14 mars 2006 Posté(e) le 14 mars 2006 Tramber Voici comment je procède pour mes opération booléenne sur les bits.C'est ma méthode, mais je ne sais pas si c'est la meilleure.D'ailleurs ce n'est ni 116 ni 124 mais 118 (je commence à fatiguer) code dxf 70 des polylignes 0=defaut1=polyligne ou maille (direction M) fermée2=sommets de lissage ajoutés4=sommets de spline ajoutés8=poly3D16=maille3D32=maille fermée (direction N)64=maille polyface (pmaille)128=mode de génération type de ligne Total des bits 255 Ce que je veux traiter 0 1 8 128 = 137Ce que je veux écarter 2 4 16 32 64 = 118 exemple:((lambda ( / ) (while (null (setq js (ssget "_:S" '((0 . "*POLYLINE")))))) (setq ent (ssname js 0) dxf_ent (entget ent) ) (if (zerop (boole 1 118 (cdr (assoc 70 dxf_ent))));si le résultat est zéro (princ "\nLe code Dxf-70 ne contient AUCUN bit de ce que je veux écarter");si le résultat est différent de zéro (princ "\nLe code Dxf-70 contient au MOINS un bit de ce que je veux écarter") ) (prin1))) Et puis je viens de voir un gros bug avec la fonction (near_vertex_arr) :j'ai oublié de traiter les arrondis (code 42) pour les polyligne anciennes et la routine par dans une boucle infinie. J'essaye de corriger ça dès que possible Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Tramber Posté(e) le 14 mars 2006 Posté(e) le 14 mars 2006 OK, c'est bon, j'étais resté sur le DXF de LWPOLYLINE et non POLYLINE. Merci pour l'approfondissement sur Boole, car servira à l'occas. J'avais bien compris l'utilité et je vois + clair par rapport à mon 128 et à ta somme de bits ! J'ai déjà utilisé boole mais seulement avec des 0 et des 1. Je tacherai de me parfaire dans son usage. Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
(gile) Posté(e) le 14 mars 2006 Posté(e) le 14 mars 2006 Si çà peut aider, pour connaître les bits dont un entier est la somme, j'avais fait une petit LISP : ;;; BITS_LST Retourne la liste des bits dont un nombre entier est la somme (defun BITS_LST (num / n lst) (setq n 0) (while ( (setq n (1+ n)) ) (while ( (setq n (1- n)) (if (= (logand num (expt 2 n)) (expt 2 n)) (setq lst (cons (expt 2 n) lst)) ) ) lst ) (bits_lst 118) retourne (2 4 16 32 64) J'ai compris il y a peu l'utilisation de bitwise ~ : (zerop (logand 118 (cdr (assoc 70 dxf_ent)))) est équivalent à : (zerop (logand (~ 137) (cdr (assoc 70 dxf_ent)))) Parceque je l'avais comprise avant j'utilise plus volontiers la fonction logand que Boole 1(logand n m) étant l'équivalent de (Boole 1 n m) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
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