Aller au contenu

Messages recommandés

Posté(e)

Bonjour à tous,

Je souhaite ajouter de façon automatique une flèche à l'extrémité de polylignes.

 

Ces polylignes symbolisent des flèches de rattachement de parcelles que l'on peut trouver sur le cadastre, j'en ai + de 65 000.

 

Z'auriez une idée pour me dépanner ?

Créer un nouveau style de ligne ?

Merci

Posté(e)

Une routine que j'ai proposé sur un forum US.

 

Il te faudra faire au préalable un bloc qui représentera la flèche aux extrémités de la polyligne.

 

(defun c:blk2end ( / obj dxf_obj obj_vlax pt1_start pt2_start par pt1_end pt2_end dxf_210)
(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
)
)
(while (not (setq obj (entsel "\nSelect a polyline: "))))
(cond
	((or (eq (cdr (assoc 0 (setq dxf_obj (entget (car obj))))) "LWPOLYLINE")
		(and
			(eq (cdr (assoc 0 dxf_obj)) "POLYLINE")
			(zerop (boole 1 112 (cdr (assoc 70 dxf_obj))))
		)
	)
		(vl-load-com)
		(setq
			obj_vlax (vlax-ename->vla-object (car obj))
			pt1_start (vlax-curve-getStartPoint obj_vlax)
			pt1_end (vlax-curve-getEndPoint obj_vlax)
			par (vlax-curve-getParamAtPoint obj_vlax pt1_end)
		)
		(cond
			((not (zerop par))
				(setq
					pt2_start (vlax-curve-getPointAtParam obj_vlax 1)
					pt2_end (vlax-curve-getPointAtParam obj_vlax (1- par))
				)
				(while (not (tblsearch "BLOCK" (setq name_blk (getstring "\nName of block: " T))))
					(princ "\n ** incorrect name block! **")
				)
				(foreach n (list (list pt1_start pt2_start) (list pt1_end pt2_end))
					(setq dxf_210 (z_dir (car n) (cadr n)))
					(entmake
						(list
							(cons 0 "INSERT")
							(cons 100 "AcDbEntity")
							(assoc 67 dxf_obj)
							(assoc 410 dxf_obj)
							(cons 8 (getvar "CLAYER"))
							(cons 100 "AcDbBlockReference")
							(cons 2 name_blk)
							(cons 10 (trans (car n) 0 dxf_210))
							(cons 50 (angle (trans (car n) 0 dxf_210) (trans (cadr n) 0 dxf_210)))
							(cons 210 dxf_210)
						)
					)
				)
			)
		)
	)
	(T
		(princ "\nIsn't 2Dpolyline avalaible for this function!")
	)
)
(prin1)
)

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

Posté(e)

Bonjour,

Impressionnant, merci beaucoup pour la réponse.

Malheureusement, je me suis trompé de forum, je ne possède que la version 2006 light

Je ne pense pas que je pourrai executer le scipt

Si ce n'est pas trop abuser est-ce qu'une ame charitable pourrait me faire le traitement ?

 

 

[Edité le 21/8/2007 par schpount]

Posté(e)

ICI

 

J'ai mis en rouge les entités non traitées (lignes), seule les polyignes ont été modifiées pour recontruire les flèches identique à un rappel de cotation.

Le bloc utilisé s'appelle "BLK2END".

 

NB: J'ai modifié un peu la routine pour ton dessin (bloc à une seule extrémité et traitement sur l'ensemble des polyligne au lieu d'une séléction 1 par 1)

 

Y reste plus qu'a convaincre ton "Boss" pour une version pleine. Car ce genre de traitement est aisée avec un peu de programmation.

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

Posté(e)

Bonjour,

Je reviens de congé et que vois-je ?

C'est magnifique, un GRAND MERCI !!

As-tu la version définitive du script pour ma futur aquisition d'Autocad 2006 ?

;-)

Posté(e)

Le voici modifié, il fonctionne avec un bloc prédéfini à l'avance et qui se nomme BLK2END.

 

(defun c:blk2end ( / js n name_blk obj dxf_obj obj_vlax pt1_start pt2_start par pt1_end pt2_end dxf_210)
(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
)
)
(setq js (ssget "_x" '((0 . "LWPOLYLINE"))) n -1 name_blk "blk2end")
(repeat (sslength js)
(setq obj (ssname js (setq n (1+ n))))
(cond
	((or (eq (cdr (assoc 0 (setq dxf_obj (entget obj)))) "LWPOLYLINE")
		(and
			(eq (cdr (assoc 0 dxf_obj)) "POLYLINE")
			(zerop (boole 1 112 (cdr (assoc 70 dxf_obj))))
		)
	)
		(vl-load-com)
		(setq
			obj_vlax (vlax-ename->vla-object obj)
			pt1_start (vlax-curve-getStartPoint obj_vlax)
			pt1_end (vlax-curve-getEndPoint obj_vlax)
			par (vlax-curve-getParamAtPoint obj_vlax pt1_end)
		)
		(cond
			((not (zerop par))
				(setq
					pt2_start (vlax-curve-getPointAtParam obj_vlax 1)
					pt2_end (vlax-curve-getPointAtParam obj_vlax (1- par))
				)
				(foreach n (list (list pt1_start pt2_start) )
					(setq dxf_210 (z_dir (car n) (cadr n)))
					(entmake
						(list
							(cons 0 "INSERT")
							(cons 100 "AcDbEntity")
							(assoc 67 dxf_obj)
							(assoc 410 dxf_obj)
							(cons 8 (getvar "CLAYER"))
							(cons 100 "AcDbBlockReference")
							(cons 2 name_blk)
							(cons 10 (trans (car n) 0 dxf_210))
							(cons 50 (angle (trans (car n) 0 dxf_210) (trans (cadr n) 0 dxf_210)))
							(cons 210 dxf_210)
						)
					)
				)
			)
		)
	)
	(T
		(princ "\nIsn't 2Dpolyline avalaible for this function!")
	)
)
)
(prin1)
)

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

  • 9 mois après...
Posté(e)

Bonjour,

Cette année encore j'aurais besoin d'utiliser le script ci-dessus, nous venons d'acquérir Autocad 2007 mais malheureusement, je n'arrive pas à le faire fonctionner, je créé pourtant bien le "blk2end".

Puis ensuite sous Outils/charger le script lisp...

 

Si ce n'est pas trop abuser, est-il possible d'avoir la procédure détaillée sous Autocad 2007 :

- comment lancer le script lisp

- faut-il appeler le block avant

- à quel moment faut-il charger mes polylignes

- ...

 

Merci

 

P.S: Mon fichier de polyligne est à télécharger ici : (777 ko)

http://www.laille-petanque.fr/index.php?option=com_remository&Itemid=100&func=download&id=5&chk=4e54fa978d189caaed89e9fc63bf354f

Posté(e)

Après avoir Ouvert ton fichier avec tes polylignes, Ouvrir/charger le lisp blk2end

si le lisp est bien charger tu verra apparaitre sur la ligne de commande C:BLK2END

(touche F2)

Tu pourras donc taper au clavier blk2end dans la ligne de commande AutoCAD pour lancer le lisp.

 

 

Dessinateur AutoCAD, Modeleur BIM, consultant informatique logiciels métier

Lenovo ThinkStation P330 i9 9900K 32Gb RAM 512 SSD + 1To

GstarCAD, Fisa-CAD, Revit, FisaBIM CVC, Microsoft Office

 

PlaquetteDeplianteMars2024.pdf

Posté(e)

je créé pourtant bien le "blk2end".

 

Oui, mais si celui-ci est créer en externe (fichier DWG), il faut qu'il soit dans le même dossier, ou dans un dossier de recherche, pour qu'Autocad puisse le trouver.

 

Tu peux aussi rajouter ces lignes (avant (defun z_dir (p1 p2 / ) )

avec ceci, si le bloc n'existe pas, il sera créé en interne et constituera le bloc par défaut (tu n'auras pas le choix de la forme de représentation)

Donc si tu veux une forme précise, il te faut définir (de préférence en interne) ton bloc BLK2END AVANT d'utiliser la routine.

 

(if (not (tblsearch "BLOCK" "BLK2END"))
(foreach n
'(
(
(0 . "BLOCK")
(8 . "0")
(2 . "BLK2END")
(70 . 0)
(8 . "0")
(62 . 0)
(6 . "ByBlock")
(370 . -2)
(10 0.0 0.0 0.0)
)
(
(0 . "LWPOLYLINE")
(100 . "AcDbEntity")
(67 . 0)
(410 . "Model")
(8 . "0")
(62 . 0)
(6 . "ByBlock")
(370 . -2)
(100 . "AcDbPolyline")
(90 . 2)
(70 . 0)
(38 . 0.0)
(39 . 0.0)
(10 0.0 0.0)
(40 . 0.0)
(41 . 1.5)
(42 . 0.0)
(10 2.5 0.0)
(40 . 1.5)
(41 . 1.5)
(42 . 0.0)
(210 0.0 0.0 1.0)
)
(
(0 . "ENDBLK")
(8 . "0")
(62 . 0)
(6 . "ByBlock")
(370 . -2)
)
)
(entmake n)
)
) 

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é