Aller au contenu

Ecrire du txt parallelement à une ligne tracé ..


Messages recommandés

Posté(e)

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:

 

Posté(e)

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 .....

 

Posté(e)

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

Posté(e)

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

 

./__\.
(.°=°.)
Posté(e)

(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

Posté(e)

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)

Posté(e)

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

Posté(e)

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 ....

Posté(e)

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

Posté(e)

bonjour

moi je cherche la meme chose que le lisp de kallain mais en prenant une polyligne pour l'orientation

à la maniere du scu de l'objet

ou une solution pour le modifié(je suis novice)

merci

Posté(e)

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

Posté(e)

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]

Posté(e)

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

Posté(e)

Pourquoi pas 128 (PLINEGEN ?).

 

Et saurais-tu expliquer un peu la fonction boole ?

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Posté(e)

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)
)

Posté(e)

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 à CadXP.

Posté(e)

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=defaut

1=polyligne ou maille (direction M) fermée

2=sommets de lissage ajoutés

4=sommets de spline ajoutés

8=poly3D

16=maille3D

32=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 = 137

Ce 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

Posté(e)

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

 

./__\.
(.°=°.)
Posté(e)

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

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité