Aller au contenu

Z sommet polyligne 3D=valeur d\'attribut sélectionné


Messages recommandés

Posté(e)

Bonjour à tous !

 

Je cherche une routine qui permettrait de donner à un sommet d'une polyligne 3D la valeur d'un attribut qu'il suffirait de sélectionner... J'en ai marre de rentrer les valeurs à la main, pour chaque sommet de la polyligne 3D, alors que j'ai déjà saisi cette valeur dans l'attribut !

 

D'avance merci...

 

 

 

Olivier

Posté(e)

(defun c:ppol ()
 (princ "\nd'abord la selection des attribs : ")
 (setq listpts nil ent T)
 (while ent
   (while(/=(progn(setq ent (nentsel))(if ent(cdr(assoc 0(entget (car ent))))"ATTRIB"))"ATTRIB")(setq ent (nentsel)))
   (if ent(progn(setq listpts(append listpts(list(atof(cdr(assoc 1(entget (car ent))))))))(princ listpts)))
   )
 (princ "\nselection d'une poly qui a le même nombre de points que d'attribs selectionnés : ")
 (while(/=(progn(setq ent (nentsel))(if ent(cdr(assoc 0(entget (car ent))))"LWPOLYLINE"))"LWPOLYLINE")(setq ent (nentsel)))
 (if ent
   (progn
     (setq li2(mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget (car ent)))))
     (setq n -1)
     (setq li2(mapcar '(lambda(x)(progn(setq n(1+ n))(append x (list(nth n listpts))))) li2))
     (command "_3dpoly" (foreach p li2 (command p)) (command) )
     )
   )
)

 

Lancer PPOL.

Le principe, c'est de cliquer de des attributs puis cliquer dans le vide et enfin selectionner une poly2D qui comporte au moins le même nombre de points.

Une poly3D est alors générée

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

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

Salut,

 

Ou encore, en m'inspirant d'une routine que j'avais publié sur CadXp "line_xy.lsp", je l'ai juste complété pour obtenir ce qui suit:

(defun ajouz ( / ent dxf_ent typ_ent z)
(while (null ent)
	(setq ent (nentsel "\nChoisir le Texte/Texte Multiligne/Attribut pour obtenir le Z: "))
	(cond
		((not (null ent))
			(setq typ_ent (cdr (assoc 0 (setq dxf_ent (entget (car ent))))))
			(cond
				((member typ_ent '("TEXT" "MTEXT" "ATTRIB"))
					(setq z (read (cdr (assoc 1 dxf_ent))))
					(if (and (/= (type z) 'REAL) (/= (type z) 'INT))
						(progn (setq ent nil) (princ "\nLa valeur du texte ne convient pas!"))
					)
				)
				(T
					(setq ent nil)
					(princ "\nN'est pas un Texte MTexte ou Attribut!")
				)
			)
		)
	)
)
(princ (strcat "\nZ = " (rtos z 2 2)))
z
)
(defun err_plxy (ch)
(cond
	((eq ch "Function cancelled") nil)
	((eq ch "quit / exit abort") nil)
	((eq ch "console break") nil)
	(T (princ ch))
)
(if pt_b (command ""))
(setq *error* olderr)
(setvar "cmdecho" 1)
(princ)
)
(defun c:3dpoly_xy ( / odlerr msg_f msg_n n pt_f pt_n val_z)
(setvar "cmdecho" 0)
(setq olderr *error* *error* err_plxy)
(setq msg_f "\nSpécifiez l'extrémité de la ligne .XY de, ou [annUler]: "
      msg_n "\nSpécifiez l'extrémité de la ligne .XY de, ou [Clore/annUler]: "
      n 0
)
(while (null (setq pt_f (getpoint "\nSpécifiez le point de départ de la polyligne: .XY de ")))
	(princ "\nPoint incorrect.")
)
(setq val_z (ajouz))
(command "_.3dpoly" ".xy" pt_f val_z)
(initget "U ANNUler _Undo UNDO")
(while (and (setq pt_n (getpoint pt_f (if (< n 2) msg_f msg_n))) (/= pt_n "Close"))
	(if (listp pt_n)
		(progn
			(setq val_z (ajouz))
			(command ".xy" pt_n val_z)
			(setq n (1+ n) pt_f pt_n)
		)
		(if (zerop n)
			(princ "\nTous les segments sont déjà annulés.")
			(progn
				(command "_undo")
				(setq n (1- n) pt_f (getvar "lastpoint"))
			)
		)
	)
	(if (< n 1)
		(initget "U ANNUler _Undo UNDO")
		(initget "U ANNUler Clore _Undo UNDO Close")
	)
)
(if (eq pt_n "Close")
	(command "_close")
	(command "")
)
(setq *error* olderr)
(setvar "cmdecho" 1)
(princ)
)

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Merci à tous, j'ai pas posé la question, mais les réponses m'arange vachement !!!!!!!

Thierry Garré

 

Géorail-Covadis-Autopiste-Autocad-Autocad Map-Infraworks 360- Navisworks -Recap

Posté(e)

Juste un petit truc encore : et si la polyligne 3D est déjà créée ?

 

Merci d'avance

 

[surligneur] Oliv35[/surligneur]

Olivier

Posté(e)

Sous cette forme alors

(defun draw_pt (pt / pt1 pt2 pt3 pt4)
(setq
	rap (/ (getvar "viewsize") 50)
	pt1 (list (+ (car pt) rap) (+ (cadr pt) rap))
	pt2 (list (+ (car pt) rap) (- (cadr pt) rap))
	pt3 (list (- (car pt) rap) (- (cadr pt) rap))
	pt4 (list (- (car pt) rap) (+ (cadr pt) rap))
)
(grdraw pt pt1 -1)
(grdraw pt pt2 -1)
(grdraw pt pt3 -1)
(grdraw pt pt4 -1)
)
(defun ajouz ( / ent dxf_ent typ_ent z)
(while (null ent)
	(setq ent (nentsel "\nChoisir le Texte/Texte Multiligne/Attribut pour obtenir le Z: "))
	(cond
		((not (null ent))
			(setq typ_ent (cdr (assoc 0 (setq dxf_ent (entget (car ent))))))
			(cond
				((member typ_ent '("TEXT" "MTEXT" "ATTRIB"))
					(setq z (read (cdr (assoc 1 dxf_ent))))
					(if (and (/= (type z) 'REAL) (/= (type z) 'INT))
						(progn
							(princ "\nLa valeur du texte ne convient pas!")
							(initget 1 "Réessayer _Retry")
							(setq z (getreal "\n[Réessayer]/Entrez une valeur numérique: "))
							(if (eq z "Retry") (setq ent nil))
						)
					)
				)
				(T
					(setq ent nil)
					(princ "\nN'est pas un Texte MTexte ou Attribut!")
				)
			)
		)
	)
)
(princ (strcat "\nZ = " (rtos z 2 2)))
z
)
(defun c:modif-z_3dpol ( / ent l l1 x y)
(while (null (setq ent (entsel "\nChoix de la 3Dpoly dont vous voulez changer le Z: "))))
(setq l (entget (car ent)))
(cond
	((and (= (cdr (assoc 0 l)) "POLYLINE") (eq (logand (cdr (assoc 70 l)) 8) 8))
		(setq l1 (entget (entnext (cdr (assoc -1 l)))))
		(while (/= "SEQEND" (cdr (assoc 0 l1)))
			(setq x (cadr (assoc 10 l1)))
			(setq y (caddr (assoc 10 l1)))
			(draw_pt (trans (list x y) 0 1))
			(entmod (subst (cons 10 (list x y (ajouz))) (assoc 10 l1) l1))
			(draw_pt (trans (list x y) 0 1))
			(setq l1 (entget (entnext (cdr (assoc -1 l1)))))
		)
		(entupd (car ent))
	)
	(T (prompt "\nEntité choisie n'est pas une polyligne 3D."))
)
(prin1)
)

 

NB:Evite les déplacements à l'écran pendant l'utilisation, tu comprendras vite pourquoi!

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

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é