Aller au contenu

donner des propriétées a un bloc lors de son insertion


baberise

Messages recommandés

bonjour à tous,

 

J'aimerais savoir si quelqu'un pourrai m'expliquer comment donner des propriétées à un bloc par rapport à son point d'insertion.

Je m'explique:

En faite je voudrais que quand j'insert mon bloc, et que celui ci se trouve dans ma polylignes celui si hérite des propriétés du calque de cette zone et si il est hors de la polylignes celui ci hériter des propriétés du calques hors zones.

J'espère mettre fait comprendre Merci, d'avance[Edité le 2/9/2008 par baberise][Edité le 3/9/2008 par baberise]

Voici un exemple j'espere qu'il sera compréhensif

http://keepi.free.fr/12204366414.jpeg[Edité le 3/9/2008 par baberise][Edité le 3/9/2008 par baberise][Edité le 3/9/2008 par baberise][Edité le 3/9/2008 par baberise]

 

[Edité le 3/9/2008 par baberise]

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Essayes ce qui suit directement en ligne de commande, pour voir si c'est vraiment ce que tu attends et si ça fonctionne.

 

((lambda ( / e_last pt_ins dxf_ent js dxf_blk)
(command "_.insert"
	(while (not (zerop (getvar "cmdactive")))
		(command pause)
	)
)
(setq
	e_last (entlast)
	pt_ins (getvar "LASTPOINT")
)
(command "_.-boundary" "_advanced" "_boundary" "_new" (ssget "_X" '((0 . "LWPOLYLINE"))) "" "_object" "_polyline" "" pt_ins "")
(if (not (eq (entlast) e_last))
	(progn
		(setq dxf_ent (entget (entlast)))
		(setq js (ssget "_F" (mapcar '(lambda (x) (trans x 0 1)) (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) dxf_ent))) '((0 . "LWPOLYLINE"))))
		(ssdel (entlast) js)
		(entdel (entlast))
		(setq dxf_ent (entget (ssname js 0)) dxf_blk (entget e_last))
		(entmod (subst (assoc 8 dxf_ent) (assoc 8 dxf_blk) dxf_blk))
	)
)
(prin1)
))

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

Lien vers le commentaire
Partager sur d’autres sites

Merci Bonuscad,

mais je ne comprend pas trop comment je fais pour utiliser ton ptit programme.

Est ce que je dois le charger en t'en que lisp, est ce que je dois modifier certaine ligne par rapport a ma config de bloc?[Edité le 4/9/2008 par baberise]

 

En faite c bon j'ai reussi a executer ta ligne de commande, et c'est presque se que je voulais.

Le probleme c'est qu'il faut lancer cette ligne apres chaque insertion or moi j'ai plusieur bloc deja inserer de nom different avec plusieurs polylignes (c vrai je ne l'avez pas dit au debut dsl)

grosso modo voici mon projet j'ai 3 calques: zc1; zf1; zf2 qui ont chacun une polyligne a leur noms (les propriétés de cette polyligne ne doivent pas bouger) ensuite viens mes blocs qui eux sont implanter un peux partout.

http://keepi.free.fr/12205198278.jpeg

 

[Edité le 4/9/2008 par baberise]

Lien vers le commentaire
Partager sur d’autres sites

Bonjour

 

Pour faire bien, il faudrait jouer avec les réacteurs.

Je n'ai pas le temps et si le coeur en dit à quelqu'un, c'est l'occasion ou jamais.

 

Sinon, je me suis fais il y a quelques temps ce petit bout de lisp qui rend courant le calque, couleur, epaisseur, etc... depuis un objet sélectionné à l'écran.

Même le style de cote, de texte est repris.

 

;;;=================================================================
;;;
;;; DEF V1.00
;;;
;;; Mettre par défaut les couleurs, calques, etc... depuis une entité
;;;
;;; Copyright (C) Patrick_35
;;;
;;;=================================================================

(defun c:def(/ doc ent)
 (if (setq ent (entsel))
   (progn
     (setq ent (entget (car ent))
    doc (vla-get-activedocument (vlax-get-acad-object))
     )
     (vla-startundomark doc)
     (setvar "clayer" (cdr (assoc 8 ent)))
     (if (cdr (assoc 6 ent))
(setvar "celtype" (cdr (assoc 6 ent)))
(setvar "celtype" "bylayer")
     )
     (if (cdr (assoc 62 ent))
(setvar "cecolor" (itoa (cdr (assoc 62 ent))))
(setvar "cecolor" "bylayer")
     )
     (if (cdr (assoc 370 ent))
(setvar "celweight" (cdr (assoc 370 ent)))
(setvar "celweight" -1)
     )
     (and (eq (cdr (assoc 0 ent)) "DIMENSION")
(vla-put-activedimstyle doc (vla-item (vla-get-dimstyles doc) (cdr (assoc 3 ent))))
     )
     (and (vl-string-search "TEXT" (cdr (assoc 0 ent)))
(vla-put-activetextstyle doc (vla-item (vla-get-textstyles doc) (cdr (assoc 7 ent))))
     )
     (vla-endundomark doc)
     (princ "\nValeurs par défauts du dessin reprises depuis l'objet sélectionné.")
   )
 )
 (princ)
)

(setq nom_lisp "DEF")
(if (/= app nil)
 (if (= (strcase (substr app (1+ (- (strlen app) (strlen nom_lisp))) (strlen nom_lisp))) nom_lisp)
   (princ (strcat "..." nom_lisp " chargé."))
   (princ (strcat "\n" nom_lisp ".LSP Chargé.....Tapez " nom_lisp " pour l'éxecuter.")))
 (princ (strcat "\n" nom_lisp ".LSP Chargé......Tapez " nom_lisp " pour l'éxecuter.")))
(setq nom_lisp nil)
(princ)

 

@+

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

Lien vers le commentaire
Partager sur d’autres sites

C'est intercepter un évènement pour y inclure sa propre action.

Pour ton besoin, d'intervenir avant la fin de la commande d'insertion pour détecter si ton bloc est dans la poly afin de prendre ses propriétés pour les appliquer au bloc en cours d'insertion, sinon, laisser celles par défaut.

 

@+

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

Lien vers le commentaire
Partager sur d’autres sites

j'ai plusieurs blocs [surligneur]déjà[/surligneur] inserés de nom différent, avec plusieurs polylignes

 

Dans le titre du sujet c'était "lors de son insertion" :casstet:

 

3 calques: zc1; zf1; zf2 qui ont chacun une polyligne

 

Donc avec ces infos supplémentaires, ceci devrait suffire

 

(defun c:ins_change ( / js n dxf_bound js_obj nb dxf_ent)
(setq js (ssget "_X" '((0 . "LWPOLYLINE") (8 . "zc1,zf1,zf2"))) n -1)
(cond
	(js
		(repeat (sslength js)
			(setq dxf_bound (entget (setq name_bound (ssname js (setq n (1+ n))))))
			(setq js_obj (ssget "_CP" (mapcar '(lambda (x) (trans x 0 1)) (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) dxf_bound))) '((0 . "INSERT"))))
			(ssdel name_bound js_obj)
			(cond
				(js_obj
					(setq nb -1)
					(repeat (sslength js_obj)
						(setq dxf_ent (entget (ssname js_obj (setq nb (1+ nb)))))
						(entmod (subst (assoc 8 dxf_bound) (assoc 8 dxf_ent) dxf_ent))
					)
				)
			)
		)
	)
)
(prin1)
)

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

Lien vers le commentaire
Partager sur d’autres sites

Merci bonuscad, ton lisp commence a ressembler a se que je recherche, Mais il y a toujours un ptit probleme.

Je m'explique dans mon 2eme exemple mon rectangle ZC1 englobe ZF1 & ZF2 en utilisant ton lisp celui-ci ne prend pas en compte ZF1 & ZF2, en gros si mon bloc est dans ZF1 il prend les propriétés de ZC1 alors que moi je voudrais qu'il prenne les propriété de ZF1. Idem pour le cas avec ZF2.

 

Encore merci,

Lien vers le commentaire
Partager sur d’autres sites

Salut

 

Même remarque que Bonus.

 

Pour l'utilisation du lisp que j'ai donné, tu le lances, choisis la poly, les valeurs par défauts changent et tu fais tes insertions.

 

ps : c'est pour de l'incendie ;)

 

@+

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

Lien vers le commentaire
Partager sur d’autres sites

Avec une légère modif, comme ceci (emploi de foreach avec une liste pour ordre de priorité):

 

(defun c:ins_change ( / js n dxf_bound js_obj nb dxf_ent)
(foreach el '("zc1" "zf1" "zf2")
(setq js (ssget "_X" (list '(0 . "LWPOLYLINE") (cons 8 el))) n -1)
(cond
(js
(repeat (sslength js)
(setq dxf_bound (entget (setq name_bound (ssname js (setq n (1+ n))))))
(setq js_obj (ssget "_CP" (mapcar '(lambda (x) (trans x 0 1)) (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) dxf_bound))) '((0 . "INSERT"))))
(ssdel name_bound js_obj)
(cond
(js_obj
(setq nb -1)
(repeat (sslength js_obj)
(setq dxf_ent (entget (ssname js_obj (setq nb (1+ nb)))))
(entmod (subst (assoc 8 dxf_bound) (assoc 8 dxf_ent) dxf_ent))
)
)
)
)
)
)
)
(prin1)
)

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

Lien vers le commentaire
Partager sur d’autres sites

Hello,

 

J'ai lu rapidement ce post. Une fosi dans un lisp, pour savoir si un objet est dans un polyligne, (Gile) faisait partir une demie-droite de cet objet, si elle interceptait une fois la polyligne en question, cela voulais dire que le point de départ est dans le périmètre de la polyligne, s'il coupe deux fois ou zéro, il est à l'extérieur.

 

Si je retrouve le post je vous le donne.

"La ligne droite est le plus court chemin entre deux points, à condition que les deux points soient bien en face l'un de l'autre" P. Desproges.

Lien vers le commentaire
Partager sur d’autres sites

Petite rectifie ton lisp etait tellement bien pour moi qu'il a fallu que mon responsable me demande plus, j'explique le cas:

 

En faite il faudrait que dans le lisp celui-ci n'ai pas de calque figer dans la ligne

(foreach el '("zc" "zf1" "zf2")

car au niveau des calques ZF la numérotation peux varier en gros de 0à999

(voir aussi les calques ZC mais pour cela on les oublient).

De plus il me demande si cela est possible que lorsque mon bloc se situe dans le calque ZC on y ajout un texte du style "mettre dans VTP" a coté du bloc concerné. Et pour finir il faudrait que j'impose le bloc concerné à la commande par exemple "MDNA".

 

Encore merci pour toutes vos infos.

 

PS: y a t il un moyen pour lancer la commande du lisp au moment d'un enregistrement ou d'une fermeture.

 

[Edité le 5/9/2008 par baberise]

Lien vers le commentaire
Partager sur d’autres sites

Re

 

Oui patrick comment l'a tu su

Il m'arrive d'en faire.

 

(foreach el '("zc" "zf1" "zf2")

A condition que tes calques commencent par ZC et ZF, remplace par

(foreach el '("zc*" "zf*")

 

De plus il me demande si cela est possible que lorsque mon bloc se situe dans le calque ZC on y ajout un texte du style "mettre dans VTP" a coté du bloc concerné

Tout est possible en lisp. Je sais qu'on peut ajouter des annotations.

 

Et pour finir il faudrait que j'impose le bloc concerné à la commande par exemple "MDNA".

C'est à dire ?

 

PS: y a t il un moyen pour lancer la commande du lisp au moment d'un enregistrement ou d'une fermeture.

Regarde ici

 

@+

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

Lien vers le commentaire
Partager sur d’autres sites

il a fallu que mon responsable me demande plus

 

Ben moi aussi je vais demander plus (volontier un p'tit chèque) :D

 

Profites-en pour te faire payer une initiation/formation au lisp, maintenant qu'il perçoit les avantages de petits développements.

 

Si tu sais bien argumenter, il va vite saisir l'avantage que tu sois formé.

 

 

Fonces !!! T'as tout à gagner aussi, des atouts à négocier dans le futur.

 

Heu! moi, j'ai rien à gagner :(

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

Lien vers le commentaire
Partager sur d’autres sites

Merci, Bonuscad & patrick, vous information mon été très utile,

 

Ben moi aussi je vais demander plus (volontier un p'tit chèque)

 

Profites-en pour te faire payer une initiation/formation au lisp, maintenant qu'il perçoit les avantages de petits développements.

 

Si tu sais bien argumenter, il va vite saisir l'avantage que tu sois formé.

 

 

Fonces !!! T'as tout à gagner aussi, des atouts à négocier dans le futur.

 

Heu! moi, j'ai rien à gagner

c'est vrai que tu as raison mais je suis nouveaux dans ma boite et je ne peux pas me permettre de demander des formation comme sa, il faut déja que je m'impose dans le BE et ensuite je m'y pencherai.Encore merci Bonuscad

 

Lien vers le commentaire
Partager sur d’autres sites

bonjour à tous,

 

j'essaye de comprendre le lisp mais je n'y arrive pas, serait il possible de me commenter les lignes de se lisp cela pourra peut etre m'aider pour y ajouter ma petite touche pour les fonctions que je veux rajouter

merci

 

 

(defun c:ins_change ( / js n dxf_bound js_obj nb dxf_ent)

(foreach el '("zc1" "zf1" "zf2")

(setq js (ssget "_X" (list '(0 . "LWPOLYLINE") (cons 8 el))) n -1)

(cond

(js

(repeat (sslength js)

(setq dxf_bound (entget (setq name_bound (ssname js (setq n (1+ n))))))

(setq js_obj (ssget "_CP" (mapcar '(lambda (x) (trans x 0 1)) (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) dxf_bound))) '((0 . "INSERT"))))

(ssdel name_bound js_obj)

(cond

(js_obj

(setq nb -1)

(repeat (sslength js_obj)

(setq dxf_ent (entget (ssname js_obj (setq nb (1+ nb)))))

(entmod (subst (assoc 8 dxf_bound) (assoc 8 dxf_ent) dxf_ent))

)

)

)

)

)

)

)

(prin1)

)

 

[Edité le 16/9/2008 par baberise]

Lien vers le commentaire
Partager sur d’autres sites

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é