Aller au contenu

Transformation d'une polyligne en bloc.


Messages recommandés

Posté(e)

Bonjour à tous.

 

Voilà, aujourd'hui, je cherche à sélectionner une polyligne dans l'EO pour en faire une fenêtre dans l'EP.

 

J'ai trouvé plusieurs postes qui pourraient me convenir (après bidouilles) mais ils fonctionnent tous selon un bloc et non une polyligne.

 

Ma question est donc : Comment faire un bloc depuis une polyligne ?

 

Si quelqu'un a une solution, une idée, un conseil... Je suis preneur...

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)

Posté(e)

Hello Denis

 

Par sur de bien comprendre ton besoin !?

 

Voir la Routine VLisp de Brice realisee pour moi ...

 

Bye, lecrabe

 


;; Je ne me suis pas non plus amuse a chercher le centre de gravite des polylignes et splines pour l'instant  

;; Cree un bloc pour chaque objet ferme (polyligne, region, cercle, spline) selectionne 
;; Demande de lecrabe sur http://www.cadxp.com/modules.php?op=modload&name=XForum&file=viewthread&tid=31981
;; Brice Studer, mars 2011 - Version 1.20 corrigee (Polylignes lourdes + Polylignes 3D + MPolygons) 
;; brice@creao.fr - http://www.creao.fr/uploads/lisp/o2bl2.lsp puis o2bl3.lsp
;; Routine O2BL renommee en POL2BL
;;
;; Limitations : Regions avec Z <> ZERO = non traitees


;; (defun c:O2BL      (/ bname numlen *error* obj acdoc ms blks blk ss ent ent2 count errcount errflag lay pref pt lst pt2 i nbname)
  (defun c:POL2BL   (/ bname numlen *error* obj acdoc ms blks blk ss ent ent2 count errcount errflag lay pref pt lst pt2 i nbname)

;
;~~~~~~~ CONFIG ~~~~~~~~~~~
(setq bname "BL_")    ; préfixe du nom des blocs créés
(setq numlen 5)         ; nombre de chiffres de la numérotation, nil pour auto (ex.: si nil, BL_12 ; si 4, BL_0012)
;~~~~~~~ FIN CONFIG ~~~~~~~~~~~

(vl-load-com)
;~~~~~~~ SOUS-FONCTIONS ~~~~~~~~~~~
(defun ZeroPad (str len)
; string en entrée, string en sortie "paddée" avec des 0
; len : nombre de caractères final, nil sort une chaîne identique à celle passée en argument
(if len 
	(while (< (strlen str) len)
		(setq str (strcat "0" str))
		str
	)
	str
)
)

(defun gc:VariantToLispData (var)
; par (gile)
 (cond
   ((= (type var) 'variant)
    (gc:VariantToLispData (vlax-variant-value var)))
   ((= (type var) 'safearray)
    (mapcar 'gc:VariantToLispData (vlax-safearray->list var))
   )
   (T var)
 )
)
;~~~~~~~ FIN SOUS-FONCTIONS ~~~~~~~~~~~

(setq	obj (vlax-get-acad-object)
	acdoc (vla-get-ActiveDocument obj)
	ms (vla-get-modelspace acdoc)
	blks (vla-get-blocks acdoc)
)

(defun *error* (msg)
(and msg
	(or
		(member (strcase msg) '("FUNCTION CANCELLED" "QUIT / EXIT ABORT" "FONCTION ANNULEE" "QUITTER / SORTIR ABANDON"))
		(princ (strcat "\nErreur : " msg))
	)
)
(if ss (vla-delete ss))
(vla-endundomark acdoc)
(princ)
)

(vla-startundomark acdoc)

(if (setq	ss	(ssget '( (-4 . "<OR")
						(0 . "CIRCLE")
						(-4 . "<AND") (0 . "*POLYLINE") (-4 . "&") (70 . 1) (-4 . "AND>")
						(0 . "REGION")
						(-4 . "<AND") (0 . "SPLINE") (-4 . "&") (70 . 1) (-4 . "AND>")
						(0 . "MPOLYGON")
				(-4 . "OR>"))
		)
)
(progn
	(initget "Courant Origine")
	(setq lay (getkword "\nCalque pour Insertion des blocs [Courant/Origine] <Courant> : "))
	(if (not lay) (setq lay "Courant"))
	(setq pref (getstring "\nPrefixe de numerotation (Entree pour aucun) : "))
	(if (not pref) (setq pref ""))
	(setq ss (vla-get-activeselectionset acdoc))
	(setq count 0)
	(setq errcount 0)
	(setq i 1)
	(vlax-for ent ss
		(cond
			((= (vla-get-objectname ent) "AcDbRegion")
				(if
					(not
						(vl-catch-all-error-p
							(setq pt (vl-catch-all-apply 'vla-get-centroid (list ent)))
						)
					)
					(progn
						(setq errflag nil)
						(setq pt (vlax-3d-point (gc:VariantToLispData pt)))
					)
					(progn
						(setq errflag T)
						(setq errcount (1+ errcount))
					)
				)
			)
			((= (vla-get-objectname ent) "AcDbCircle")
				(setq pt (vlax-3d-point (gc:VariantToLispData (vla-get-center ent))))
				(setq errflag nil)
			)
			((= (vla-get-objectname ent) "AcDb3dPolyline")
				(setq pt (vlax-3d-point (gc:VariantToLispData (vla-get-coordinate ent 0))))
				(setq errflag nil)
			)
			((or
				(= (vla-get-objectname ent) "AcDbPolyline")
				(= (vla-get-objectname ent) "AcDb2dPolyline")
			)
				(setq pt (gc:VariantToLispData (vla-get-coordinate ent 0)))
				(setq pt (vlax-3D-point (list (car pt) (cadr pt) (vla-get-elevation ent))))
				(setq errflag nil)
			)
			((= (vla-get-objectname ent) "AcDbSpline")
				(setq lst (gc:VariantToLispData (vla-get-controlpoints ent)))
				(setq pt (vlax-3d-point (list (car lst) (cadr lst) (caddr lst))))
				(setq errflag nil)
			)
			((= (vla-get-objectname ent) "AcDbMPolygon")
				(setq pt (cdr (assoc 11 (entget (vlax-vla-object->ename ent)))))
				(setq pt (vlax-3D-point (list (car pt) (cadr pt) (vla-get-elevation ent))))
				(setq errflag nil)
			)
		)
		(if (not errflag)
			(progn
				(while
					(tblsearch "BLOCK" (strcat bname pref (zeropad (itoa i) numlen)))
					(setq i (1+ i))
				)
				(setq blk (vla-add blks pt (setq nbname (strcat bname pref (zeropad (itoa i) numlen)))) )
				(vla-put-layer (setq ent2 (vla-copy ent)) "0")
				(vla-copyobjects acdoc (vlax-safearray-fill (vlax-make-safearray  vlax-vbObject (cons 0 0)) (list ent2)) blk)
				(setq blk (vla-insertblock ms pt nbname 1 1 1 0))
				(if (= lay "Origine")(vla-put-layer blk (vla-get-layer ent)))
				(vla-delete ent2)
				(setq count (1+ count))
			)
		); if not errflag
	);vlax-for ent
	(princ (strcat "\n" (itoa errcount) " objets ignores. "  ))
	(princ (strcat "\n" (itoa count)     " blocs crees. "     ))
);progn if ss
);if ss

(*error* nil)
);

;; (princ "\nCommande à utiliser: O2BL")
  (princ "\nCommande à utiliser: POL2BL")

(princ)

Autodesk Expert Elite Team

Posté(e)

Salut,

 

Si je comprends bien, tu voudrais "sélectionner une polyligne dans l'EO pour en faire une fenêtre dans l'EP" et, parce que tu as trouvé des routines qui transforment un bloc en fenêtre flottante, tu cherches maintenant à transformer une polyligne en bloc.

 

C'est un peu comme si tu voulais aller de Paris à Marseille et que, parce que tu as trouvé un truc pour aller de Florence à Marseille, tu cherches maintenant comment faire de Paris à Florence.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Hello

 

+1 avec Gilles !

 

Merci Gilles pour ta bonne lecture de la demande de Denis ! J'étais un peu trop "scotché" sur la TV pour un Truc "Marseillais"...

 

Bonne Journee a Tous, Bye, lecrabe

Autodesk Expert Elite Team

Posté(e)

Bonjour à tous, et merci pour votre aide.

 

@lecrabe : la routine de Brice est hyper compliquée pour moi, mais je vais tenter de la comprendre pour l'adapter à mes besoins.

 

@(gile) : oui, c'est exactement ça (en plus, je ne suis jamais allé à Florence), comme je n'ai rien trouvé pour faire ce que je voulais (sélection d'une polyligne en EO -> création d'une fenêtre en EP), j'ai pensé que c'était plus facile en transformant cette polyligne en bloc puis de créer une fenêtre dans l'EP. Sinon, d'autres l'auraient fait avant moi... Mais si tu as mieux, je suis toujours preneur...

 

Merci encore pour vos réponses...

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)

Posté(e)

Bonjour,

 

le plus simple si j'ai tout compris:

- sélection de la polyligne en EO

- calcul de l'emprise X,Y min et X,Y Max

- passage en EP

- dessin d'une fmult rectangulaire selon dimensions emprise et fonction de l'échelle souhaitée

- entrée en EO (à l'intérieur de la fenêtre)

- zoom centre sur le centre de l'emprise

- zoom ...XP selon échelle

- chspace et sélection de la poly

- retour en EP et utilisation de la poly comme contour de délim de la fenêtre rectangulaire.

 

Olivier

Posté(e)

Bonjour Olivier, et merci pour ton aide.

 

Je vais essayer de suivre ta méthode, mais ce n'est pas gagné...

 

Encore merci...

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)

Posté(e)

Coucou

 

Encore une fois ta question ne comporte pas tous les éléments susceptibles de te fournir une réponse

On t'en préviens à chaque fois et à chaque fois tu nous promets de faire des efforts

Et nous, comme on est des gentils garçons, à chaque fois on cherche à t'aider mais c'est fatigant, admets-le.

 

Essaie de découper par phases comme si tu devais faire "à la main" ce que tu veux "programmer"

  • je prends une polyligne en EO
  • je la copie
  • je passe en EP
  • je dépose la polyligne copiée
  • et .... là tu ne nous dis plus rien...

Une fois la polyligne copiée COMMENT vas-tu faire le zoom XP par exemple ?

 

Je te donne une piste de recherche sachant que tu ne nous donnes pas ton code en l'état ce qui est encore plus dur pour t'aider :

 

(setvar "tilemode" 1)
(setq ent (car (entsel "\nChoix de la polyligne\n")))
(command "_.copybase" "0,0" ent "")
(setvar "tilemode" 0)
(command "_.pasteclip" "0,0")

 

Amicalement

 

 

Posté(e)

Salut didier, et merci pour ton aide.

 

Je ne vois pas ce que j'ai mal exprimé :

...je cherche à sélectionner une polyligne dans l'EO pour en faire une fenêtre dans l'EP.

Je croyais que c'était claire, mais apparemment je me suis trompé... :huh:

Encore une fois ta question ne comporte pas tous les éléments susceptibles de te fournir une réponse

On t'en préviens à chaque fois et à chaque fois tu nous promets de faire des efforts

Et nous, comme on est des gentils garçons, à chaque fois on cherche à t'aider mais c'est fatigant, admets-le.

Si tu crois que c'est volontaire... :blink:

 

Pour l’instant je progresse dans la méthode que m'a proposée Olivier.

 

Actuellement, je sélectionne la polyligne, je repère ses sommets (j'ai donc les deux longueurs du rectangle grace aux coordonnées des sommets de cette polyligne) et je sauvegarde une vue (avec ces coordonnées), je passe en EP, j'en suis là pour l'instant.

 

La prochaine étape est de créer une fenêtre rectangulaire qui correspond aux longueurs et l'échelle souhaitée.

 

Ensuite, j'activerais la fenêtre créée et je rappellerais la vue sauvegardée...

 

Est-je plus explicite ?

 

Je ne poste pas mon code car il est encore trop "brouillon".

 

Je croyais avoir le temps de le faire aujourd'hui, mais ça va attendre ce soir...

 

Encore merci pour ton aide...

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)

Posté(e)

Coucou

 

Ce qui est nécessaire de connaître et que tu n'as pas encore exprimé c'est :

Que faire de la polyligne transformée en "viewport" ?

Et surtout :

Quelle dimensions doit-elle avoir ?

Ça ne peut pas être la polyligne initiale, il faut y applique un facteur d'échelle, de 0.001 par exemple si tu es en mm en EP et en m en EO

Je ne pense pas que ce que je t'ai proposé soit une impasse il faut creuser plus profond et surtout y appliquer ce que je viens de te demander

 

Posté(e)

Que faire de la polyligne transformée en "viewport" ?

Je n'en sais encore rien, mais un copier/coller de la polyligne me semble inutile dans ce que m'a proposé Olivier. Et elle fera doublon avec la fenêtre.

 

Quelle dimensions doit-elle avoir ?

Je pense surtout à créer une fenêtre (viewport) aux mêmes proportion que la polyligne avec un coef selon l'échelle. Une fois activée, je n'aurais plus qu'à rappeler la vue enregistrée.

 

Ça ne peut pas être la polyligne initiale...

Entièrement d'accord.

 

Je ne pense pas que ce que je t'ai proposé soit une impasse...

Mon problème est que je ne sais pas quoi faire de la polyligne une fois collée dans l'EP.

 

Et je pense que ce que j'ai commencé (méthode d'Olivier) correspond plus à mes moyens.

 

Je te remercie encore pour ton aide, ton idée reste bonne, mais est hors de mes compétences.

 

Et bon week-end à tous... ;)

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)

Posté(e)

Salut

 

Avec le lisp PRE, tu devrais trouver ton bonheur.

A partir d'un cartouche, j'extrais les coordonnées (boundingbox) et je créé la fenêtre en EP.

Tu peux extrapoler pour ta polyligne.

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Salut Patrick_35 et merci pour ce code, je regarde ça...

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)

Posté(e)

Salut à tous...

 

Patrick_35, après maintes et maintes relecture de ton code, il s'avère bien au dessus de mes compétences... :o

 

Je vais rester sur la méthode d'Olivier, qui elle, reste à ma portée... :huh:

 

Par contre, ton lisp ONG.LSP m'aide beaucoup...

 

Merci encore... ;)

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)

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é